diff --git a/screening/resource/test-data/SimpleImageDropboxTest/1_1_DAPI_Default.png b/screening/resource/test-data/SimpleImageDropboxTest/1_1_DAPI_Default.png new file mode 100644 index 0000000000000000000000000000000000000000..38e8bbd20a411bcd2436fdc3c41b075f920bebb8 Binary files /dev/null and b/screening/resource/test-data/SimpleImageDropboxTest/1_1_DAPI_Default.png differ diff --git a/screening/resource/test-data/SimpleImageDropboxTest/1_1_Merged_Default.png b/screening/resource/test-data/SimpleImageDropboxTest/1_1_Merged_Default.png new file mode 100644 index 0000000000000000000000000000000000000000..c017a3ee60ce2d1ad8f65ef224d6b3992d5e331b Binary files /dev/null and b/screening/resource/test-data/SimpleImageDropboxTest/1_1_Merged_Default.png differ diff --git a/screening/resource/test-data/SimpleImageDropboxTest/1_3_DAPI_CY3_256x191.png b/screening/resource/test-data/SimpleImageDropboxTest/1_3_DAPI_CY3_256x191.png new file mode 100644 index 0000000000000000000000000000000000000000..c118f2bfe6786efd025a885f3e52ec0537dc99b0 Binary files /dev/null and b/screening/resource/test-data/SimpleImageDropboxTest/1_3_DAPI_CY3_256x191.png differ diff --git a/screening/resource/test-data/SimpleImageDropboxTest/PLATE1/PLATE1_A01_01_Cy3.jpg b/screening/resource/test-data/SimpleImageDropboxTest/PLATE1/PLATE1_A01_01_Cy3.jpg new file mode 100755 index 0000000000000000000000000000000000000000..5ed0cb95beb32e230208526a850ba7ecc4b219fd Binary files /dev/null and b/screening/resource/test-data/SimpleImageDropboxTest/PLATE1/PLATE1_A01_01_Cy3.jpg differ diff --git a/screening/resource/test-data/SimpleImageDropboxTest/PLATE1/PLATE1_A01_01_DAPI.jpg b/screening/resource/test-data/SimpleImageDropboxTest/PLATE1/PLATE1_A01_01_DAPI.jpg new file mode 100755 index 0000000000000000000000000000000000000000..e443228f882448234de6fe18bf4f5e87c13ec442 Binary files /dev/null and b/screening/resource/test-data/SimpleImageDropboxTest/PLATE1/PLATE1_A01_01_DAPI.jpg differ diff --git a/screening/resource/test-data/SimpleImageDropboxTest/PLATE1/PLATE1_A01_01_GFP.jpg b/screening/resource/test-data/SimpleImageDropboxTest/PLATE1/PLATE1_A01_01_GFP.jpg new file mode 100755 index 0000000000000000000000000000000000000000..51eb829078b9c95c68fd404916dc0029a1afd035 Binary files /dev/null and b/screening/resource/test-data/SimpleImageDropboxTest/PLATE1/PLATE1_A01_01_GFP.jpg differ diff --git a/screening/resource/test-data/SimpleImageDropboxTest/PLATE1/PLATE1_A01_02_Cy3.jpg b/screening/resource/test-data/SimpleImageDropboxTest/PLATE1/PLATE1_A01_02_Cy3.jpg new file mode 100755 index 0000000000000000000000000000000000000000..a063b41d48675a4a6cf0cc85f11dbff94d450a64 Binary files /dev/null and b/screening/resource/test-data/SimpleImageDropboxTest/PLATE1/PLATE1_A01_02_Cy3.jpg differ diff --git a/screening/resource/test-data/SimpleImageDropboxTest/PLATE1/PLATE1_A01_02_DAPI.jpg b/screening/resource/test-data/SimpleImageDropboxTest/PLATE1/PLATE1_A01_02_DAPI.jpg new file mode 100755 index 0000000000000000000000000000000000000000..d150319c21666f40b6e48808096c3f88c8749d58 Binary files /dev/null and b/screening/resource/test-data/SimpleImageDropboxTest/PLATE1/PLATE1_A01_02_DAPI.jpg differ diff --git a/screening/resource/test-data/SimpleImageDropboxTest/PLATE1/PLATE1_A01_02_GFP.jpg b/screening/resource/test-data/SimpleImageDropboxTest/PLATE1/PLATE1_A01_02_GFP.jpg new file mode 100755 index 0000000000000000000000000000000000000000..3e1443c3ced183528919d464346511743a91fa2d Binary files /dev/null and b/screening/resource/test-data/SimpleImageDropboxTest/PLATE1/PLATE1_A01_02_GFP.jpg differ diff --git a/screening/resource/test-data/SimpleImageDropboxTest/PLATE1/PLATE1_A01_03_Cy3.jpg b/screening/resource/test-data/SimpleImageDropboxTest/PLATE1/PLATE1_A01_03_Cy3.jpg new file mode 100755 index 0000000000000000000000000000000000000000..2b1d50d22997faed0d68174cb6521f6e43e947eb Binary files /dev/null and b/screening/resource/test-data/SimpleImageDropboxTest/PLATE1/PLATE1_A01_03_Cy3.jpg differ diff --git a/screening/resource/test-data/SimpleImageDropboxTest/PLATE1/PLATE1_A01_03_DAPI.jpg b/screening/resource/test-data/SimpleImageDropboxTest/PLATE1/PLATE1_A01_03_DAPI.jpg new file mode 100755 index 0000000000000000000000000000000000000000..1a929ee27f7a6ebae493b6aa48c5b5838ce7be74 Binary files /dev/null and b/screening/resource/test-data/SimpleImageDropboxTest/PLATE1/PLATE1_A01_03_DAPI.jpg differ diff --git a/screening/resource/test-data/SimpleImageDropboxTest/PLATE1/PLATE1_A01_03_GFP.jpg b/screening/resource/test-data/SimpleImageDropboxTest/PLATE1/PLATE1_A01_03_GFP.jpg new file mode 100755 index 0000000000000000000000000000000000000000..1d0a36b1ae5a1e2364acb5a81b8d1646ee9ec880 Binary files /dev/null and b/screening/resource/test-data/SimpleImageDropboxTest/PLATE1/PLATE1_A01_03_GFP.jpg differ diff --git a/screening/resource/test-data/SimpleImageDropboxTest/PLATE1/PLATE1_A01_04_Cy3.jpg b/screening/resource/test-data/SimpleImageDropboxTest/PLATE1/PLATE1_A01_04_Cy3.jpg new file mode 100755 index 0000000000000000000000000000000000000000..2fdf43adb9f6088dcec25443f9fd31b741c99588 Binary files /dev/null and b/screening/resource/test-data/SimpleImageDropboxTest/PLATE1/PLATE1_A01_04_Cy3.jpg differ diff --git a/screening/resource/test-data/SimpleImageDropboxTest/PLATE1/PLATE1_A01_04_DAPI.jpg b/screening/resource/test-data/SimpleImageDropboxTest/PLATE1/PLATE1_A01_04_DAPI.jpg new file mode 100755 index 0000000000000000000000000000000000000000..fc0839c77b2164ba29a898e2ec27ed57d909d8f7 Binary files /dev/null and b/screening/resource/test-data/SimpleImageDropboxTest/PLATE1/PLATE1_A01_04_DAPI.jpg differ diff --git a/screening/resource/test-data/SimpleImageDropboxTest/PLATE1/PLATE1_A01_04_GFP.jpg b/screening/resource/test-data/SimpleImageDropboxTest/PLATE1/PLATE1_A01_04_GFP.jpg new file mode 100755 index 0000000000000000000000000000000000000000..9634af8f73b3b838c90385882431d8289af77c1e Binary files /dev/null and b/screening/resource/test-data/SimpleImageDropboxTest/PLATE1/PLATE1_A01_04_GFP.jpg differ diff --git a/screening/resource/test-data/SimpleImageDropboxTest/PLATE1/PLATE1_A01_05_Cy3.jpg b/screening/resource/test-data/SimpleImageDropboxTest/PLATE1/PLATE1_A01_05_Cy3.jpg new file mode 100755 index 0000000000000000000000000000000000000000..f115cb5caa837bb85547c5504e5ee50b44079d40 Binary files /dev/null and b/screening/resource/test-data/SimpleImageDropboxTest/PLATE1/PLATE1_A01_05_Cy3.jpg differ diff --git a/screening/resource/test-data/SimpleImageDropboxTest/PLATE1/PLATE1_A01_05_DAPI.jpg b/screening/resource/test-data/SimpleImageDropboxTest/PLATE1/PLATE1_A01_05_DAPI.jpg new file mode 100755 index 0000000000000000000000000000000000000000..2c98179049a60b710fee006659070d79b58d0096 Binary files /dev/null and b/screening/resource/test-data/SimpleImageDropboxTest/PLATE1/PLATE1_A01_05_DAPI.jpg differ diff --git a/screening/resource/test-data/SimpleImageDropboxTest/PLATE1/PLATE1_A01_05_GFP.jpg b/screening/resource/test-data/SimpleImageDropboxTest/PLATE1/PLATE1_A01_05_GFP.jpg new file mode 100755 index 0000000000000000000000000000000000000000..3128a5bb435748e2abf9ddaedd0618db2b2d3f47 Binary files /dev/null and b/screening/resource/test-data/SimpleImageDropboxTest/PLATE1/PLATE1_A01_05_GFP.jpg differ diff --git a/screening/resource/test-data/SimpleImageDropboxTest/PLATE1/PLATE1_A01_06_Cy3.jpg b/screening/resource/test-data/SimpleImageDropboxTest/PLATE1/PLATE1_A01_06_Cy3.jpg new file mode 100755 index 0000000000000000000000000000000000000000..c8cad6f59f16d8bffb5309957e1b55443aaca63a Binary files /dev/null and b/screening/resource/test-data/SimpleImageDropboxTest/PLATE1/PLATE1_A01_06_Cy3.jpg differ diff --git a/screening/resource/test-data/SimpleImageDropboxTest/PLATE1/PLATE1_A01_06_DAPI.jpg b/screening/resource/test-data/SimpleImageDropboxTest/PLATE1/PLATE1_A01_06_DAPI.jpg new file mode 100755 index 0000000000000000000000000000000000000000..1e64bf3291bce3140a2933706fd11691e65b3969 Binary files /dev/null and b/screening/resource/test-data/SimpleImageDropboxTest/PLATE1/PLATE1_A01_06_DAPI.jpg differ diff --git a/screening/resource/test-data/SimpleImageDropboxTest/PLATE1/PLATE1_A01_06_GFP.jpg b/screening/resource/test-data/SimpleImageDropboxTest/PLATE1/PLATE1_A01_06_GFP.jpg new file mode 100755 index 0000000000000000000000000000000000000000..d0478cb59f15e8e2b2f5a26b6505d452f2a0b51a Binary files /dev/null and b/screening/resource/test-data/SimpleImageDropboxTest/PLATE1/PLATE1_A01_06_GFP.jpg differ diff --git a/screening/sourceTest/core-plugins/SimpleImageDropboxTest/1/dss/drop-boxes/SimpleImageDropboxTest-drop-box/hcs-dropbox.py b/screening/sourceTest/core-plugins/SimpleImageDropboxTest/1/dss/drop-boxes/SimpleImageDropboxTest-drop-box/hcs-dropbox.py new file mode 100644 index 0000000000000000000000000000000000000000..ff5c73762570f2475ef219dbf644ea84e51618ba --- /dev/null +++ b/screening/sourceTest/core-plugins/SimpleImageDropboxTest/1/dss/drop-boxes/SimpleImageDropboxTest-drop-box/hcs-dropbox.py @@ -0,0 +1,85 @@ +import os +from ch.systemsx.cisd.openbis.dss.etl.dto.api.v1 import SimpleImageDataConfig +from ch.systemsx.cisd.openbis.dss.etl.dto.api.v1 import ImageMetadata +from ch.systemsx.cisd.openbis.plugin.screening.shared.api.v1.dto import Geometry + +SPACE_CODE = "TEST" +PROJECT_CODE = "TEST-PROJECT" +PROJECT_ID = "/%(SPACE_CODE)s/%(PROJECT_CODE)s" % vars() +EXPERIMENT_CODE = "DEMO-EXP-HCS" +EXPERIMENT_ID = "/%(SPACE_CODE)s/%(PROJECT_CODE)s/%(EXPERIMENT_CODE)s" % vars() + +PLATE_CODE = "PLATE1" +PLATE_ID = "/%(SPACE_CODE)s/%(PLATE_CODE)s" % vars() +PLATE_GEOMETRY_PROPERTY_CODE = "$PLATE_GEOMETRY" +PLATE_GEOMETRY = "384_WELLS_16X24" + + +def create_space_if_needed(transaction): + space = transaction.getSpace(SPACE_CODE) + if None == space: + space = transaction.createNewSpace(SPACE_CODE, None) + space.setDescription("A demo space") + +def create_project_if_needed(transaction): + project = transaction.getProject(PROJECT_ID) + if None == project: + create_space_if_needed(transaction) + project = transaction.createNewProject(PROJECT_ID) + project.setDescription("A demo project") + +def create_experiment_if_needed(transaction): + """ Get the specified experiment or register it if necessary """ + exp = transaction.getExperiment(EXPERIMENT_ID) + if None == exp: + create_project_if_needed(transaction) + print 'Creating new experiment : ' + EXPERIMENT_ID + exp = transaction.createNewExperiment(EXPERIMENT_ID, 'SIRNA_HCS') + exp.setPropertyValue('DESCRIPTION', 'A test experiment') + return exp + +def create_plate_if_needed(transaction): + """ Get the specified sample or register it if necessary """ + + samp = transaction.getSample(PLATE_ID) + + if None == samp: + exp = create_experiment_if_needed(transaction) + samp = transaction.createNewSample(PLATE_ID, 'PLATE') + samp.setPropertyValue(PLATE_GEOMETRY_PROPERTY_CODE, PLATE_GEOMETRY) + samp.setExperiment(exp) + + return samp + + +class MyImageDataSetConfig(SimpleImageDataConfig): + def extractImageMetadata(self, imagePath): + + basename = os.path.splitext(imagePath)[0] + (plate, well, tile, channelCode) = basename.split("_") + + image_tokens = ImageMetadata() + image_tokens.well = well + try: + image_tokens.tileNumber = int(tile) + except ValueError: + raise Exception("Cannot parse field number from '" + tile + "' in '" + basename + "' file name.") + + image_tokens.channelCode = channelCode + return image_tokens + + def getTileGeometry(self, imageTokens, maxTileNumber): + return Geometry.createFromRowColDimensions(maxTileNumber / 3, 3) + +def process(transaction): + incoming = transaction.getIncoming() + if incoming.isDirectory(): + imageDataset = MyImageDataSetConfig() + imageDataset.setRawImageDatasetType() + imageDataset.setGenerateThumbnails(True) + imageDataset.setUseImageMagicToGenerateThumbnails(False) + imageDataset.addGeneratedImageRepresentationWithResolution("512x512") + plate = create_plate_if_needed(transaction) + dataset = transaction.createNewImageDataSet(imageDataset, incoming); + dataset.setSample(plate) + transaction.moveFile(incoming.getPath(), dataset); diff --git a/screening/sourceTest/core-plugins/SimpleImageDropboxTest/1/dss/drop-boxes/SimpleImageDropboxTest-drop-box/plugin.properties b/screening/sourceTest/core-plugins/SimpleImageDropboxTest/1/dss/drop-boxes/SimpleImageDropboxTest-drop-box/plugin.properties new file mode 100644 index 0000000000000000000000000000000000000000..50d92e632822afd673a407aced7285cb44b0ffa1 --- /dev/null +++ b/screening/sourceTest/core-plugins/SimpleImageDropboxTest/1/dss/drop-boxes/SimpleImageDropboxTest-drop-box/plugin.properties @@ -0,0 +1,13 @@ +# +# Drop box for HCS data sets +# +# Variables: +# incoming-root-dir +# Path to the directory which contains incoming directories for drop boxes. +incoming-dir = ${root-dir}/incoming-SimpleImageDropboxTest +incoming-data-completeness-condition = auto-detection +top-level-data-set-handler = ch.systemsx.cisd.openbis.dss.etl.jython.v2.JythonPlateDataSetHandlerV2 +script-path = hcs-dropbox.py +storage-processor = ch.systemsx.cisd.openbis.dss.etl.PlateStorageProcessor +storage-processor.data-source = imaging-db +storage-processor.define-channels-per-experiment = false diff --git a/screening/sourceTest/java/ch/systemsx/cisd/openbis/screening/systemtests/AbstractScreeningSystemTestCase.java b/screening/sourceTest/java/ch/systemsx/cisd/openbis/screening/systemtests/AbstractScreeningSystemTestCase.java index 1c92e2390f246a3d67e8fa5e61f6c9a374519e6e..16c95b8b7031a774ea40145f4b27346a465bd071 100644 --- a/screening/sourceTest/java/ch/systemsx/cisd/openbis/screening/systemtests/AbstractScreeningSystemTestCase.java +++ b/screening/sourceTest/java/ch/systemsx/cisd/openbis/screening/systemtests/AbstractScreeningSystemTestCase.java @@ -254,14 +254,14 @@ public abstract class AbstractScreeningSystemTestCase extends SystemTestCase ImageHistogram actualHistogram = ImageHistogram.calculateHistogram(actualImage); String expectedRenderedHistogram = expectedHistogram.renderAsASCIIChart(49, 9); String actualRenderedHistogram = actualHistogram.renderAsASCIIChart(49, 9); - if (expectedHistogram.equals(actualRenderedHistogram)) + if (expectedRenderedHistogram.equals(actualRenderedHistogram)) { return; } // difference can be caused by a value close to discretization border. Thus try another height. expectedRenderedHistogram = expectedHistogram.renderAsASCIIChart(49, 10); actualRenderedHistogram = actualHistogram.renderAsASCIIChart(49, 10); - if (expectedHistogram.equals(actualRenderedHistogram)) + if (expectedRenderedHistogram.equals(actualRenderedHistogram)) { return; } diff --git a/screening/sourceTest/java/ch/systemsx/cisd/openbis/screening/systemtests/SimpleImageDropboxTest.java b/screening/sourceTest/java/ch/systemsx/cisd/openbis/screening/systemtests/SimpleImageDropboxTest.java new file mode 100644 index 0000000000000000000000000000000000000000..d91b9cbd238939cff0e042b6a554a6a41386d71c --- /dev/null +++ b/screening/sourceTest/java/ch/systemsx/cisd/openbis/screening/systemtests/SimpleImageDropboxTest.java @@ -0,0 +1,95 @@ +/* + * Copyright 2014 ETH Zuerich, SIS + * + * 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.screening.systemtests; + +import java.io.File; +import java.io.IOException; +import java.util.List; + +import org.apache.commons.io.FileUtils; +import org.testng.annotations.BeforeTest; +import org.testng.annotations.Test; + +import ch.systemsx.cisd.openbis.generic.shared.basic.TechId; +import ch.systemsx.cisd.openbis.generic.shared.basic.dto.AbstractExternalData; +import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DataSetRelatedEntities; +import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Experiment; +import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ListSampleCriteria; +import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Sample; +import ch.systemsx.cisd.openbis.generic.shared.dto.identifier.ExperimentIdentifier; +import ch.systemsx.cisd.openbis.generic.shared.dto.identifier.ExperimentIdentifierFactory; + +/** + * + * + * @author Franz-Josef Elmer + */ +public class SimpleImageDropboxTest extends AbstractScreeningSystemTestCase +{ + + @BeforeTest + public void dropAnExampleDataSet() throws Exception + { + File exampleDataSet = createTestDataContents(); + moveFileToIncoming(exampleDataSet); + waitUntilDataSetImported(FINISHED_POST_REGISTRATION_CONDITION); + } + + private File createTestDataContents() throws IOException + { + File destination = new File(workingDirectory, "test-data"); + destination.mkdirs(); + FileUtils.copyDirectory(new File(getTestDataFolder(), "PLATE1"), destination); + return destination; + } + + private String getTestDataFolder() + { + return "../screening/resource/test-data/" + getClass().getSimpleName(); + } + + @Override + protected int dataSetImportWaitDurationInSeconds() + { + return 60; + } + + @Test + public void test() throws Exception + { + ExperimentIdentifier identifier = ExperimentIdentifierFactory.parse("/TEST/TEST-PROJECT/DEMO-EXP-HCS"); + Experiment experiment = commonServer.getExperimentInfo(sessionToken, identifier); + ListSampleCriteria sampleCriteria = ListSampleCriteria.createForExperiment(TechId.create(experiment)); + List<Sample> samples = commonServer.listSamples(sessionToken, sampleCriteria); + Sample plate = samples.get(0); + assertEquals("/TEST/PLATE1", plate.getIdentifier()); + assertEquals(1, samples.size()); + List<AbstractExternalData> dataSets2 + = commonServer.listRelatedDataSets(sessionToken, new DataSetRelatedEntities(samples), false); + AbstractExternalData dataSet = dataSets2.get(0); + assertEquals(1, dataSets2.size()); + ImageChecker imageChecker = new ImageChecker(); + imageChecker.check(new File(getTestDataFolder(), "1_1_Merged_Default.png"), + new ImageLoader(dataSet, sessionToken)); + imageChecker.check(new File(getTestDataFolder(), "1_1_DAPI_Default.png"), + new ImageLoader(dataSet, sessionToken).channel("DAPI")); + imageChecker.check(new File(getTestDataFolder(), "1_3_DAPI_CY3_256x191.png"), + new ImageLoader(dataSet, sessionToken).tileColumn(3).channel("DAPI").channel("CY3").mode("thumbnail256x191")); + imageChecker.assertNoFailures(); + } + +}