Newer
Older
brinn
committed
/*
* Copyright 2010 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.
*/
import java.io.BufferedOutputStream;
import java.io.BufferedReader;
brinn
committed
import java.io.File;
import java.io.FileOutputStream;
import java.io.FileReader;
brinn
committed
import java.io.IOException;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.HashMap;
import java.util.Iterator;
brinn
committed
import java.util.List;
import java.util.Map;
import ch.systemsx.cisd.openbis.dss.client.api.v1.IDataSetDss;
import ch.systemsx.cisd.openbis.dss.generic.shared.api.v1.NewDataSetMetadataDTO;
import ch.systemsx.cisd.openbis.generic.client.cli.Login;
brinn
committed
import ch.systemsx.cisd.openbis.plugin.screening.client.api.v1.IScreeningOpenbisServiceFacade;
import ch.systemsx.cisd.openbis.plugin.screening.client.api.v1.IScreeningOpenbisServiceFacadeFactory;
brinn
committed
import ch.systemsx.cisd.openbis.plugin.screening.client.api.v1.ScreeningOpenbisServiceFacade.IImageOutputStreamProvider;
import ch.systemsx.cisd.openbis.plugin.screening.client.api.v1.ScreeningOpenbisServiceFacadeFactory;
brinn
committed
import ch.systemsx.cisd.openbis.plugin.screening.shared.api.v1.dto.ExperimentIdentifier;
import ch.systemsx.cisd.openbis.plugin.screening.shared.api.v1.dto.FeatureVector;
import ch.systemsx.cisd.openbis.plugin.screening.shared.api.v1.dto.FeatureVectorDataset;
brinn
committed
import ch.systemsx.cisd.openbis.plugin.screening.shared.api.v1.dto.FeatureVectorDatasetReference;
import ch.systemsx.cisd.openbis.plugin.screening.shared.api.v1.dto.FeatureVectorWithDescription;
import ch.systemsx.cisd.openbis.plugin.screening.shared.api.v1.dto.Geometry;
brinn
committed
import ch.systemsx.cisd.openbis.plugin.screening.shared.api.v1.dto.ImageDatasetMetadata;
import ch.systemsx.cisd.openbis.plugin.screening.shared.api.v1.dto.ImageDatasetReference;
import ch.systemsx.cisd.openbis.plugin.screening.shared.api.v1.dto.MaterialIdentifier;
import ch.systemsx.cisd.openbis.plugin.screening.shared.api.v1.dto.MaterialTypeIdentifier;
import ch.systemsx.cisd.openbis.plugin.screening.shared.api.v1.dto.Plate;
import ch.systemsx.cisd.openbis.plugin.screening.shared.api.v1.dto.PlateIdentifier;
import ch.systemsx.cisd.openbis.plugin.screening.shared.api.v1.dto.PlateImageReference;
import ch.systemsx.cisd.openbis.plugin.screening.shared.api.v1.dto.PlateWellMaterialMapping;
import ch.systemsx.cisd.openbis.plugin.screening.shared.api.v1.dto.WellIdentifier;
brinn
committed
import ch.systemsx.cisd.openbis.plugin.screening.shared.api.v1.dto.WellPosition;
/**
* Simple Matlab interface for openBIS for Screening. It is meant to be used in one Matlab session
* at a time, i.e. it is <i>not</i> multi-threading safe.
brinn
committed
* <p>
* While written in Java, the API is idiomatic for Matlab, i.e. values are returned as
* multi-dimensional arrays. For the <code>get...</code> and <code>load...</code> methods the first
* index will contain the actual data, while the second index will contain per-row annotations. For
* <code>getFeatureMatrix</code>, the third index contains per-column annotations. This allows
* simple access with Matlab's slicing operator, see doc of e.g. {@link #getFeatureMatrix(String)}.
* <p>
* A typical Matlab session looks like:
*
* <pre>
* % Add the API jar file to the classpath
* javaaddpath('/home/brinn/matlab/openbis_screening_api-batteries_included.jar')
* % Login to server
* OpenBISScreeningML.login('user', 'secret', 'https://www.infectome.org')
brinn
committed
*
* % ...perform calls on the server...
*
* % Logout to close the session on the server
* OpenBISScreeningML.logout()
brinn
committed
* </pre>
*
* <i>Note: using this login your password will end up in the Matlab command history. An alternative
* that avoids this is to call the {@link ch.systemsx.cisd.openbis.generic.client.cli.Login} class.
* Logging in on the console will grant this class access to the openBIS server.</i>
* <p>
* To learn the API one needs to understand three basic notions: code, augmented code and perm id.
* Space, project, experiment, plate and well have their own <b>code</b>, which is unique only in
* the context of the parent.<br>
* That's why one needs <b>augmented code</b> to point e.g. to one experiment, because two different
* projects can have experiments with the same code.<br>
* Such an augmented code for experiment has a form of "/space-code/project-code/experiment-code".<br>
* For plate it has a form of "/space-code/plate-code" (note that plate code is unique on the space
* level). <br>
* The drawback of an augmented code is that it's not persistent. If someone e.g. moves the
* experiment from one space to the other augmented code of the experiment becomes invalid. That is
* why experiments, plates and datasets have <b>perm id</b> (permament identifier) which never
* change and allow to refer to them with one "magic" identifier, e.g. 20110516124520378-737166.
* </p>
brinn
committed
* @author Bernd Rinn
*/
public class OpenBISScreeningML
brinn
committed
{
private static interface ITileNumberIterable extends Iterable<Integer>
{
public void setMaximumNumberOfTiles(int numberOfTiles);
public int getMaximumNumberOfTiles();
}
private static final class ImageReferenceAndFile
{
private final PlateImageReference imageReference;
private final File imageFile;
private BufferedOutputStream outputStream;
ImageReferenceAndFile(PlateImageReference imageReference, File imageFile)
{
this.imageReference = imageReference;
this.imageFile = imageFile;
}
public PlateImageReference getImageReference()
{
return imageReference;
}
public File getImageFile()
{
return imageFile;
}
public OutputStream open() throws IOException
{
if (outputStream == null)
{
outputStream = new BufferedOutputStream(new FileOutputStream(imageFile));
}
return outputStream;
}
public void close() throws IOException
{
if (outputStream != null)
{
outputStream.close();
}
outputStream = null;
}
}
static final String DATASETS_FOLDER = "openbis_datasets";
private static File temporarySessionDir;
private static Map<PlateImageReference, File> loadedImages;
static IScreeningOpenbisServiceFacadeFactory facadeFactory =
ScreeningOpenbisServiceFacadeFactory.INSTANCE;
brinn
committed
private static IScreeningOpenbisServiceFacade openbis = null;
private static List<ExperimentIdentifier> experiments = null;
private static List<Plate> plates = null;
private static Map<String, List<Plate>> experimentToPlateMap =
new HashMap<String, List<Plate>>();
private static Map<String, ExperimentIdentifier> experimentCodeToExperimentMap =
new HashMap<String, ExperimentIdentifier>();
private static Map<String, Plate> plateCodeToPlateMap = new HashMap<String, Plate>();
private OpenBISScreeningML()
brinn
committed
{
// Not to be constructed.
}
brinn
committed
//
// Versioning
//
/**
* The version of the API.
*/
public static final String VERSION = "1";
brinn
committed
/**
* The required version ("major.minor") of the screening API on the openBIS application server.
brinn
committed
*/
public static final String REQUIRES_OPENBIS_AS_API = "1.7";
brinn
committed
/**
* The required version ("major.minor") of the screening API on the openBIS datastore server.
brinn
committed
*/
public static final String REQUIRES_OPENBIS_DSS_API = "1.1";
private static File dataSetsDir;
Loading
Loading full blame...