Newer
Older
{
return loadRawImages(plate, row, col, channels, createSingleTileIterator(tile));
}
/**
* Has the same effect as {@link #loadImages(String, int, int, int, String[])}, but instead of
* loading raw images loads their segmentation results if available.
*
* @param objectNames The names of the segmentation objects to get the images for
*/
public static Object[][][] loadSegmentationImages(String plate, int row, int col,
final int tile, String[] objectNames)
{
return loadSegmentationImages(plate, row, col, objectNames, createSingleTileIterator(tile));
}
private static ITileNumberIterable createSingleTileIterator(final int tile)
{
return new ITileNumberIterable()
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
{
public void setMaximumNumberOfTiles(int numberOfTiles)
{
if (tile >= numberOfTiles)
{
throw new IllegalArgumentException("Tile number " + tile
+ " is not less than number of tiles " + numberOfTiles + ".");
}
}
public int getMaximumNumberOfTiles()
{
return 1;
}
public Iterator<Integer> iterator()
{
return new Iterator<Integer>()
{
private boolean delivered;
public boolean hasNext()
{
return delivered == false;
}
public Integer next()
{
delivered = true;
return tile;
}
public void remove()
{
throw new UnsupportedOperationException();
}
};
}
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
};
}
/**
* Lists all segmentation objects for the <var>plate</var>.
* <p>
* Matlab example:
*
* <pre>
* % Get the segmentation objects of plate P005 in space SPACE.
* segmentationObjects = OpenBISScreeningML.listSegmentationObjects('/SPACE/P005');
* % How many segmentation objects do we have?
* length(segmentationObjects)
* % What is the name of segmentation objects 1?
* segmentationObjects(1)
* </pre>
*
* @param plate augmented code of the plate
* @return Each row contains information about one segmentation object. Currently the only
* information available is the segmentation object name.
*/
public static Object[][] listSegmentationObjects(String plate)
{
checkLoggedIn();
Plate plateId = getPlate(plate);
final List<ImageDatasetReference> imageDatasets = listSegmentationImageDatasets(plateId);
if (imageDatasets.isEmpty())
{
return new Object[0][];
}
return extractChannels(imageDatasets.get(0));
}
private static Object[][] extractChannels(ImageDatasetReference imageDatasetReference)
{
final List<ImageDatasetMetadata> meta =
openbis.listImageMetadata(Arrays.asList(imageDatasetReference));
if (meta.isEmpty())
{
return new Object[0][];
}
final List<String> channels = getChannelCodes(meta);
Object[][] result = new Object[channels.size()][1];
for (int i = 0; i < result.length; ++i)
{
result[i][0] = channels.get(i);
}
return result;
}
private static Object[][][] loadRawImages(String plate, int row, int col, String[] channels,
ITileNumberIterable tileNumberIterable)
brinn
committed
{
checkLoggedIn();
final Plate plateId = getPlate(plate);
final List<ImageDatasetReference> imageDatasets = listRawImageDatasets(plateId);
return loadImages(plateId, imageDatasets, row, col, channels, tileNumberIterable);
}
private static Object[][][] loadSegmentationImages(String plate, int row, int col,
String[] channels, ITileNumberIterable tileNumberIterable)
{
checkLoggedIn();
final Plate plateId = getPlate(plate);
final List<ImageDatasetReference> imageDatasets = listSegmentationImageDatasets(plateId);
return loadImages(plateId, imageDatasets, row, col, channels, tileNumberIterable);
}
private static Object[][][] loadImages(Plate plate, List<ImageDatasetReference> imageDatasets,
int row, int col, String[] channels, ITileNumberIterable tileNumberIterable)
{
final List<ImageDatasetMetadata> meta = openbis.listImageMetadata(imageDatasets);
if (meta.isEmpty())
{
return new Object[][][]
{ new Object[0][], new Object[0][] };
}
brinn
committed
final List<String> imageChannels;
if (channels == null || channels.length == 0)
{
brinn
committed
} else
{
imageChannels = Arrays.asList(channels);
}
final List<ImageReferenceAndFile> imageReferencesAndFiles =
new ArrayList<ImageReferenceAndFile>(imageDatasets.size());
brinn
committed
final Object[][][] result = new Object[2][][];
tileNumberIterable.setMaximumNumberOfTiles(meta.get(0).getNumberOfTiles());
int numberOfTiles = tileNumberIterable.getMaximumNumberOfTiles();
result[0] = new Object[imageDatasets.size() * imageChannels.size() * numberOfTiles][1];
result[1] = new Object[imageDatasets.size() * imageChannels.size() * numberOfTiles][15];
brinn
committed
int dsIdx = 0;
int resultIdx = 0;
for (ImageDatasetReference ds : imageDatasets)
{
for (String channel : imageChannels)
{
for (Integer tile : tileNumberIterable)
brinn
committed
{
final PlateImageReference ref =
new PlateImageReference(row, col, tile, channel, ds);
final File imageFile = createImageFileName(plate, ref);
imageReferencesAndFiles.add(new ImageReferenceAndFile(ref, imageFile));
brinn
committed
result[0][resultIdx][0] = imageFile.getPath();
PlateIdentifier plateIdentifier = ds.getPlate();
ExperimentIdentifier expIdentifier = ds.getExperimentIdentifier();
brinn
committed
final Object[] annotations =
new Object[]
{ channel, tile,
createPlateWellDescription(plateIdentifier, row, col),
plateIdentifier.getAugmentedCode(),
plateIdentifier.getPermId(),
plateIdentifier.tryGetSpaceCode(),
plateIdentifier.getPlateCode(), row, col,
expIdentifier.getAugmentedCode(),
expIdentifier.getPermId(), expIdentifier.getSpaceCode(),
expIdentifier.getProjectCode(),
expIdentifier.getExperimentCode(), ds.getPermId(), };
brinn
committed
System.arraycopy(annotations, 0, result[1][resultIdx], 0, annotations.length);
resultIdx++;
}
}
dsIdx++;
}
try
{
loadImages(imageReferencesAndFiles);
brinn
committed
} catch (IOException ex)
{
throw new RuntimeException(ex);
}
return result;
}
private static List<ImageDatasetReference> listRawImageDatasets(final Plate plateId)
{
return openbis.listRawImageDatasets(Arrays.asList(plateId));
}
private static List<ImageDatasetReference> listSegmentationImageDatasets(final Plate plateId)
{
return openbis.listSegmentationImageDatasets(Arrays.asList(plateId));
}
brinn
committed
/**
* Saves images for a given list of image references (given by data set code, well position,
* channel and tile) and files.
brinn
committed
*
* @throws IOException when reading images from the server or writing them to the files fails
*/
private static void loadImages(List<ImageReferenceAndFile> imageReferencesAndFiles)
throws IOException
brinn
committed
{
List<PlateImageReference> imageReferences = new ArrayList<PlateImageReference>();
final Map<PlateImageReference, ImageReferenceAndFile> imageRefToFileMap =
new HashMap<PlateImageReference, ImageReferenceAndFile>();
for (ImageReferenceAndFile imageReferenceAndFile : imageReferencesAndFiles)
{
PlateImageReference imageReference = imageReferenceAndFile.getImageReference();
File file = loadedImages.get(imageReference);
if (file == null)
{
imageReferences.add(imageReference);
imageRefToFileMap.put(imageReference, imageReferenceAndFile);
}
}
brinn
committed
try
{
openbis.loadImages(imageReferences, new IImageOutputStreamProvider()
{
public OutputStream getOutputStream(PlateImageReference imageReference)
throws IOException
{
return imageRefToFileMap.get(imageReference).open();
brinn
committed
}
}, false);
brinn
committed
} finally
{
Collection<ImageReferenceAndFile> values = imageRefToFileMap.values();
for (ImageReferenceAndFile imageReferenceAndFile : values)
{
imageReferenceAndFile.close();
PlateImageReference imageReference = imageReferenceAndFile.getImageReference();
loadedImages.put(imageReference, imageReferenceAndFile.getImageFile());
}
brinn
committed
}
}
brinn
committed
private static File createImageFileName(Plate plate, PlateImageReference image)
{
final WellPosition well = image.getWellPosition();
File imageDir = new File(temporarySessionDir, "images");
imageDir.mkdirs();
final File f =
new File(imageDir, "img_" + plate.getPlateCode() + "_" + image.getDatasetCode()
+ "_row" + well.getWellRow() + "_col" + well.getWellColumn() + "_"
+ image.getChannel() + "_tile" + image.getTile() + ".tiff");
f.deleteOnExit();
return f;
brinn
committed
}
brinn
committed
//
// Feature matrix
//
/**
* Returns the feature matrix of all features for all locations in <var>experiment</var> (a
* location is one well position in one feature vector data set) connected to <var>gene</var> in
* <code>[0]</code>, location annotations in <code>[1]</code> and feature annotation in
* <code>[2]</code>.
* <p>
* Matlab example:
*
* <pre>
* % Get feature matrix for experiment /SPACE/PROJ/MYEXP for locations connected to GENENAME
* fmatrix = OpenBISScreeningML.getFeatureMatrix('/SPACE/PROJ/MYEXP', 'GENENAME');
* % Get the feature vector for the second location (assuming that there are at least two locations)
* % of third data set (assuming that there are at least three data sets)
* fmatrix(1,:,2,3)
* % Get the values of the fourth feature for all locations (assuming that there are at least 4 features)
* % of third data set (assuming that there are at least three data sets)
* fmatrix(1,4,:,3)
* % Get code of the fourth feature (assuming that there are at least 4 features)
* fmatrix(3,4)
* % Get the plate-well descriptions for the second location (assuming that there are at least two locations)
* % of third data set (assuming that there are at least three data sets)
* fmatrix(2,2,3,:)
brinn
committed
* </pre>
*
* @param experiment The augmented experiment code
* @param gene The gene code (stored as material code in openBIS, usually it is gene id)
* @return a four dimensional matrix. The first dimension denotes the type in the following
* order: <code>{feature matrix, annotations per location, feature codes}</code>. The
* other dimensions depend on the value of the first dimension:
* <ol>
* <li>feature matrix: 2. dimension is feature vector, 3. dimension is location number,
* 4. dimension is data set number. If for a particular location and a particular data
* set the corresponding feature value does not exists <code>NaN</code> will be returned.
* <li>annotations: 2. dimension is location number, 3. dimension is data set number, 4.
* dimension is location annotations in the following order: <code>{plate well
* description, plate augmented code, plate perm id, plate space code, plate code, row,
* column, experiment augmented code, experiment perm id, experiment space code,
* experiment project code, experiment code, data set code}</code>
* <li>feature codes: 2. dimension is feature codes in alphabetical order. 3. and 4.
* dimension are meaningless (i.e. they have length one)
* </ol>
brinn
committed
*/
public static Object[][][] getFeatureMatrix(String experiment, String gene)
{
return getFeatureMatrix(experiment, gene, (String[]) null);
}
/**
* Returns the feature matrix of the specified features for all locations in
* <var>experiment</var> (a location is one well position in one feature vector data set) in
* <var>experiment</var> connected to <var>gene</var> in <code>[0]</code>, location annotations
* in <code>[1]</code> and feature annotation in <code>[2]</code>.
* <p>
* Matlab example:
*
* <pre>
* % Get feature matrix for features FEATURE1, FEATURE2 and FEATURE3 for
brinn
committed
* % experiment /SPACE/PROJ/MYEXP for locations connected to GENENAME
* fmatrix = OpenBISScreeningML.getFeatureMatrix('/SPACE/PROJ/MYEXP', 'GENENAME', ('FEATURE1','FEATURE2','FEATURE3'));
* % Get the feature vector for the second location (assuming that there are at least two locations)
* % of third data set (assuming that there are at least three data sets)
* fmatrix(1,:,2,3)
* % Get the values of the fourth feature for all locations (assuming that there are at least 4 features)
* % of third data set (assuming that there are at least three data sets)
* fmatrix(1,4,:,3)
* % Get code of the fourth feature (assuming that there are at least 4 features)
* fmatrix(3,4)
* % Get the plate-well descriptions for the second location (assuming that there are at least two locations)
* % of third data set (assuming that there are at least three data sets)
* fmatrix(2,2,3,:)
brinn
committed
* </pre>
*
* @param experiment The augmented experiment code
* @param gene The gene code (stored as material code in openBIS, usually it is gene id)
brinn
committed
* @param features The names of the features to contain the feature matrix
* @return a four dimensional matrix. The first dimension denotes the type in the following
* order: <code>{feature matrix, annotations per location, feature codes}</code>. The
* other dimensions depend on the value of the first dimension:
* <ol>
* <li>feature matrix: 2. dimension is feature vector, 3. dimension is location number,
* 4. dimension is data set number. If for a particular location and a particular data
* set the corresponding feature value does not exists <code>NaN</code> will be returned.
* <li>annotations: 2. dimension is location number, 3. dimension is data set number, 4.
* dimension is location annotations in the following order: <code>{plate well
* description, plate augmented code, plate perm id, plate space code, plate code, row,
* column, experiment augmented code, experiment perm id, experiment space code,
* experiment project code, experiment code, data set code}</code>
* <li>feature codes: 2. dimension is feature codes in alphabetical order. 3. and 4.
* dimension are meaningless (i.e. they have length one)
* </ol>
brinn
committed
*/
public static Object[][][][] getFeatureMatrix(String experiment, String gene, String[] features)
brinn
committed
{
checkLoggedIn();
final ExperimentIdentifier experimentId = experimentCodeToExperimentMap.get(experiment);
if (experimentId == null)
{
throw new RuntimeException("No experiment with that code found.");
}
final List<Plate> experimentPlates = experimentToPlateMap.get(experiment);
if (experimentPlates == null || experimentPlates.isEmpty())
{
return new Object[][][][]
{ new Object[0][][], new Object[0][][], new Object[0][][] };
brinn
committed
}
final List<FeatureVectorWithDescription> featureVectors =
openbis.loadFeaturesForPlateWells(experimentId, new MaterialIdentifier(
MaterialTypeIdentifier.GENE, gene),
(features == null) ? null : Arrays.asList(features));
return getFeatureMatrix(featureVectors);
brinn
committed
}
brinn
committed
/**
* Returns the feature matrix of all features for all locations (a location is one well position
* in one feature vector data set) connected to <var>gene</var> in <code>[0]</code>, location
* annotations in <code>[1]</code> and feature annotation in <code>[2]</code>.
* <p>
* Matlab example:
*
* <pre>
* % Get feature matrix for GENENAME
* fmatrix = OpenBISScreeningML.getFeatureMatrix('GENENAME');
* % Get the feature vector for the second location (assuming that there are at least two locations)
* % of third data set (assuming that there are at least three data sets)
* fmatrix(1,:,2,3)
* % Get the values of the fourth feature for all locations (assuming that there are at least 4 features)
* % of third data set (assuming that there are at least three data sets)
* fmatrix(1,4,:,3)
* % Get code of the fourth feature (assuming that there are at least 4 features)
* fmatrix(3,4)
* % Get the plate-well descriptions for the second location (assuming that there are at least two locations)
* % of third data set (assuming that there are at least three data sets)
* fmatrix(2,2,3,:)
brinn
committed
* </pre>
*
* @param gene The gene code (stored as material code in openBIS, usually it is gene id)
* @return a four dimensional matrix. The first dimension denotes the type in the following
* order: <code>{feature matrix, annotations per location, feature codes}</code>. The
* other dimensions depend on the value of the first dimension:
* <ol>
* <li>feature matrix: 2. dimension is feature vector, 3. dimension is location number,
* 4. dimension is data set number. If for a particular location and a particular data
* set the corresponding feature value does not exists <code>NaN</code> will be returned.
* <li>annotations: 2. dimension is location number, 3. dimension is data set number, 4.
* dimension is location annotations in the following order: <code>{plate well
* description, plate augmented code, plate perm id, plate space code, plate code, row,
* column, experiment augmented code, experiment perm id, experiment space code,
* experiment project code, experiment code, data set code}</code>
* <li>feature codes: 2. dimension is feature codes in alphabetical order. 3. and 4.
* dimension are meaningless (i.e. they have length one)
* </ol>
brinn
committed
*/
public static Object[][][][] getFeatureMatrix(String gene)
brinn
committed
{
return getFeatureMatrix(gene, (String[]) null);
}
/**
* Returns the feature matrix of the specified features for all locations (a location is one
* well position in one feature vector data set) in <var>experiment</var> connected to
* <var>gene</var> in <code>[0]</code>, location annotations in <code>[1]</code> and feature
* annotation in <code>[2]</code>.
* <p>
* Matlab example:
*
* <pre>
* % Get feature matrix for features FEATURE1, FEATURE2 and FEATURE3 for GENENAME
* fmatrix = OpenBISScreeningML.getFeatureMatrix('GENENAME', ('FEATURE1','FEATURE2','FEATURE3'));
* % Get the feature vector for the second location (assuming that there are at least two locations)
* % of third data set (assuming that there are at least three data sets)
* fmatrix(1,:,2,3)
* % Get the values of the fourth feature for all locations (assuming that there are at least 4 features)
* % of third data set (assuming that there are at least three data sets)
* fmatrix(1,4,:,3)
* % Get code of the fourth feature (assuming that there are at least 4 features)
* fmatrix(3,4)
* % Get the plate-well descriptions for the second location (assuming that there are at least two locations)
* % of third data set (assuming that there are at least three data sets)
* fmatrix(2,2,3,:)
brinn
committed
* </pre>
*
* @param gene The gene code (stored as material code in openBIS, usually it is gene id)
brinn
committed
* @param features The names of the features to contain the feature matrix
* @return a four dimensional matrix. The first dimension denotes the type in the following
* order: <code>{feature matrix, annotations per location, feature codes}</code>. The
* other dimensions depend on the value of the first dimension:
* <ol>
* <li>feature matrix: 2. dimension is feature vector, 3. dimension is location number,
* 4. dimension is data set number. If for a particular location and a particular data
* set the corresponding feature value does not exists <code>NaN</code> will be returned.
* <li>annotations: 2. dimension is location number, 3. dimension is data set number, 4.
* dimension is location annotations in the following order: <code>{plate well
* description, plate augmented code, plate perm id, plate space code, plate code, row,
* column, experiment augmented code, experiment perm id, experiment space code,
* experiment project code, experiment code, data set code}</code>
* <li>feature codes: 2. dimension is feature codes in alphabetical order. 3. and 4.
* dimension are meaningless (i.e. they have length one)
* </ol>
brinn
committed
*/
public static Object[][][][] getFeatureMatrix(String gene, String[] features)
brinn
committed
{
checkLoggedIn();
final List<FeatureVectorWithDescription> featureVectors =
openbis.loadFeaturesForPlateWells(new MaterialIdentifier(
MaterialTypeIdentifier.GENE, gene),
(features == null) ? null : Arrays.asList(features));
return getFeatureMatrix(featureVectors);
}
private static Object[][][][] getFeatureMatrix(
final List<FeatureVectorWithDescription> featureVectors)
{
final Object[][][][] result = new Object[3][][][];
brinn
committed
if (featureVectors.isEmpty())
{
return result;
}
List<String> featureCodes = getFeatureCodes(featureVectors);
Map<String, Integer> featureCodeToIndexMap = new HashMap<String, Integer>();
result[2] = new Object[featureCodes.size()][1][1];
for (int i = 0; i < featureCodes.size(); ++i)
brinn
committed
{
String code = featureCodes.get(i);
result[2][i][0][0] = code;
featureCodeToIndexMap.put(code, i);
brinn
committed
}
IndexSet<String> dataSetCodes = new IndexSet<String>();
IndexSet<WellPosition> wellPositions = new IndexSet<WellPosition>();
for (FeatureVectorWithDescription featureVector : featureVectors)
brinn
committed
{
WellPosition wellPosition = featureVector.getWellPosition();
wellPositions.add(wellPosition);
dataSetCodes.add(featureVector.getDatasetWellReference().getDatasetCode());
brinn
committed
}
result[0] =
new Object[featureCodes.size()][wellPositions.size()][dataSetCodes.size()];
result[1] = new Object[wellPositions.size()][dataSetCodes.size()][13];
for (FeatureVectorWithDescription vector : featureVectors)
{
WellPosition wellPosition = vector.getWellPosition();
int wellIndex = wellPositions.getIndex(wellPosition);
int[] featureIndexes = createFeatureIndexes(vector, featureCodeToIndexMap);
FeatureVectorDatasetWellReference dataSetRef = vector.getDatasetWellReference();
int dataSetIndex = dataSetCodes.getIndex(dataSetRef.getDatasetCode());
copyFeatureValuesInto(result, wellIndex, dataSetIndex, featureIndexes, vector);
copyAnnotationsInto(result, wellIndex, dataSetIndex, dataSetRef, vector);
}
return replaceFeatureNullValuesByNaN(result);
brinn
committed
}
/**
* Returns the feature matrix of all available features for all locations (a location is one
* well position in one feature vector data set) of all feature vector data sets of the given
* <var>plate</var> in <code>[0]</code>, location annotations in <code>[1]</code> and feature
* annotation in <code>[2]</code>.
* <p>
* Matlab example:
* <pre>
* % Get feature matrix for PLATECODE
* fmatrix = OpenBISScreeningML.getFeatureMatrixForPlate('PLATECODE');
* % Get the feature vector for the second location (assuming that there are at least two locations)
* % of third data set (assuming that there are at least three data sets)
* fmatrix(1,:,2,3)
* % Get the values of the fourth feature for all locations (assuming that there are at least 4 features)
* % of third data set (assuming that there are at least three data sets)
* fmatrix(1,4,:,3)
* % Get code of the fourth feature (assuming that there are at least 4 features)
* fmatrix(3,4)
* % Get the plate-well descriptions for the second location (assuming that there are at least two locations)
* % of third data set (assuming that there are at least three data sets)
* fmatrix(2,2,3,:)
* @param plate augmented code of the plate for which features should be loaded
* @return a four dimensional matrix. The first dimension denotes the type in the following
* order: <code>{feature matrix, annotations per location, feature codes}</code>. The
* other dimensions depend on the value of the first dimension:
* <ol>
* <li>feature matrix: 2. dimension is feature vector, 3. dimension is location number,
* 4. dimension is data set number. If for a particular location and a particular data
* set the corresponding feature value does not exists <code>NaN</code> will be returned.
* <li>annotations: 2. dimension is location number, 3. dimension is data set number, 4.
* dimension is location annotations in the following order: <code>{plate well
* description, plate augmented code, plate perm id, plate space code, plate code, row,
* column, experiment augmented code, experiment perm id, experiment space code,
* experiment project code, experiment code, data set code}</code>
* <li>feature codes: 2. dimension is feature codes in alphabetical order. 3. and 4.
* dimension are meaningless (i.e. they have length one)
* </ol>
public static Object[][][][] getFeatureMatrixForPlate(String plate)
{
return getFeatureMatrixForPlate(plate, (String[]) null);
}
/**
* Returns the feature matrix of the specified features for all locations (a location is one
* well position in one feature vector data set) of all feature vector data sets of the given
* <var>plate</var> in <code>[0]</code>, location annotations in <code>[1]</code> and feature
* annotation in <code>[2]</code>.
* <p>
* Matlab example:
* <pre>
* % Get feature matrix for features FEATURE1, FEATURE2 and FEATURE3 for PLATECODE
* fmatrix = OpenBISScreeningML.getFeatureMatrixForPlate('PLATECODE', ('FEATURE1','FEATURE2','FEATURE3'));
* % Get the feature vector for the second location (assuming that there are at least two locations)
* % of third data set (assuming that there are at least three data sets)
* fmatrix(1,:,2,3)
* % Get the values of the fourth feature for all locations (assuming that there are at least 4 features)
* % of third data set (assuming that there are at least three data sets)
* fmatrix(1,4,:,3)
* % Get code of the fourth feature (assuming that there are at least 4 features)
* fmatrix(3,4)
* % Get the plate-well descriptions for the second location (assuming that there are at least two locations)
* % of third data set (assuming that there are at least three data sets)
* fmatrix(2,2,3,:)
* @param plate augmented code of the plate for which features should be loaded
* @param features The codes of the features to contain the feature matrix.
* Unknown feature codes will be ignored.
* @return a four dimensional matrix. The first dimension denotes the type in the following
* order: <code>{feature matrix, annotations per location, feature codes}</code>. The
* other dimensions depend on the value of the first dimension:
* <ol>
* <li>feature matrix: 2. dimension is feature vector, 3. dimension is location number,
* 4. dimension is data set number. If for a particular location and a particular data
* set the corresponding feature value does not exists <code>NaN</code> will be returned.
* <li>annotations: 2. dimension is location number, 3. dimension is data set number, 4.
* dimension is location annotations in the following order: <code>{plate well
* description, plate augmented code, plate perm id, plate space code, plate code, row,
* column, experiment augmented code, experiment perm id, experiment space code,
* experiment project code, experiment code, data set code}</code>
* <li>feature codes: 2. dimension is feature codes in alphabetical order. 3. and 4.
* dimension are meaningless (i.e. they have length one)
* </ol>
public static Object[][][][] getFeatureMatrixForPlate(String plate, String[] features)
final List<FeatureVectorDataset> dataSets =
openbis.loadFeaturesForPlates(
Arrays.asList(PlateIdentifier.createFromAugmentedCode(plate)),
(features == null) ? null : Arrays.asList(features));
final Object[][][][] result = new Object[3][][][];
if (dataSets.isEmpty())
List<String> featureCodes = getFeatureCodes(dataSets);
Map<String, Integer> featureCodeToIndexMap = new HashMap<String, Integer>();
result[2] = new Object[featureCodes.size()][1][1];
for (int i = 0; i < featureCodes.size(); ++i)
String code = featureCodes.get(i);
result[2][i][0][0] = code;
featureCodeToIndexMap.put(code, i);
IndexSet<WellPosition> wellPositions = new IndexSet<WellPosition>();
for (FeatureVectorDataset dataSet : dataSets)
List<FeatureVector> featureVectors = dataSet.getFeatureVectors();
for (FeatureVector featureVector : featureVectors)
WellPosition wellPosition = featureVector.getWellPosition();
wellPositions.add(wellPosition);
int numberOfDataSets = dataSets.size();
result[0] =
new Object[featureCodes.size()][wellPositions.size()][numberOfDataSets];
result[1] = new Object[wellPositions.size()][numberOfDataSets][13];
for (int dataSetIndex = 0; dataSetIndex < numberOfDataSets; dataSetIndex++)
1638
1639
1640
1641
1642
1643
1644
1645
1646
1647
1648
1649
1650
1651
1652
1653
1654
1655
1656
1657
1658
1659
1660
1661
1662
1663
1664
1665
1666
1667
1668
FeatureVectorDataset dataSet = dataSets.get(dataSetIndex);
FeatureVectorDatasetReference dataSetRef = dataSet.getDataset();
int[] featureIndexes = createFeatureIndexes(dataSet, featureCodeToIndexMap);
for (FeatureVector vector : dataSet.getFeatureVectors())
{
WellPosition wellPosition = vector.getWellPosition();
int wellIndex = wellPositions.getIndex(wellPosition);
copyFeatureValuesInto(result, wellIndex, dataSetIndex, featureIndexes, vector);
copyAnnotationsInto(result, wellIndex, dataSetIndex, dataSetRef, vector);
}
}
return replaceFeatureNullValuesByNaN(result);
}
private static Object[][][][] replaceFeatureNullValuesByNaN(final Object[][][][] result)
{
Double nan = Double.NaN;
for (int i = 0; i < result[0].length; i++)
{
Object[][] r0i = result[0][i];
for (int j = 0; j < r0i.length; j++)
{
Object[] r0ij = r0i[j];
for (int k = 0; k < r0ij.length; k++)
{
if (r0ij[k] == null)
{
r0ij[k] = nan;
}
}
}
private static int[] createFeatureIndexes(IFeatureCodesProvider dataSet,
Map<String, Integer> featureCodeToIndexMap)
1676
1677
1678
1679
1680
1681
1682
1683
1684
1685
1686
1687
1688
1689
1690
1691
1692
1693
1694
1695
1696
1697
1698
1699
1700
1701
1702
1703
1704
1705
1706
1707
1708
1709
1710
1711
1712
1713
1714
1715
1716
1717
1718
1719
1720
1721
1722
1723
1724
1725
1726
1727
1728
1729
1730
1731
1732
1733
1734
1735
List<String> codes = dataSet.getFeatureCodes();
int[] featureIndexes = new int[codes.size()];
for (int i = 0; i < featureIndexes.length; i++)
{
featureIndexes[i] = featureCodeToIndexMap.get(codes.get(i));
}
return featureIndexes;
}
private static void copyFeatureValuesInto(final Object[][][][] result, int wellIndex,
int dataSetIndex, int[] featureIndexes, FeatureVector vector)
{
List<Object> valueObjects = vector.getValueObjects();
for (int i = 0, n = valueObjects.size(); i < n; i++)
{
int featureIndex = featureIndexes[i];
try
{
Object[][] f = result[0][featureIndex];
Object[] d = f[wellIndex];
d[dataSetIndex] = valueObjects.get(i);
} catch (Exception ex)
{
throw new RuntimeException(featureIndex+"."+wellIndex+"."+dataSetIndex, ex);
}
}
}
private static void copyAnnotationsInto(final Object[][][][] result, int wellIndex,
int dataSetIndex, FeatureVectorDatasetReference dataSetRef, FeatureVector vector)
{
Object[] annotations =
new Object[]
{ createPlateWellDescription(dataSetRef.getPlate(), vector),
dataSetRef.getPlate().getAugmentedCode(),
dataSetRef.getPlate().getPermId(),
dataSetRef.getPlate().tryGetSpaceCode(),
dataSetRef.getPlate().getPlateCode(),
vector.getWellPosition().getWellRow(),
vector.getWellPosition().getWellColumn(),
dataSetRef.getExperimentIdentifier().getAugmentedCode(),
dataSetRef.getExperimentIdentifier().getPermId(),
dataSetRef.getExperimentIdentifier().getSpaceCode(),
dataSetRef.getExperimentIdentifier().getProjectCode(),
dataSetRef.getExperimentIdentifier().getExperimentCode(),
dataSetRef.getDatasetCode(), };
System.arraycopy(annotations, 0, result[1][wellIndex][dataSetIndex], 0, annotations.length);
}
private static List<String> getFeatureCodes(List<? extends IFeatureCodesProvider> dataSets)
{
Set<String> codes = new HashSet<String>();
for (IFeatureCodesProvider featureVectorDataset : dataSets)
{
codes.addAll(featureVectorDataset.getFeatureCodes());
}
List<String> result = new ArrayList<String>(codes);
Collections.sort(result);
return result;
1738
1739
1740
1741
1742
1743
1744
1745
1746
1747
1748
1749
1750
1751
1752
1753
1754
1755
1756
1757
1758
1759
1760
1761
1762
1763
1764
1765
/**
* Returns the gene mapping for the given <var>plateCodes</var> in <code>[0]</code> and location
* annotations in <code>[1]</code>.
* <p>
* One row in the matrix corresponds to one well.
* <p>
* Matlab example:
*
* <pre>
* % Get feature matrix for features FEATURE1, FEATURE2 and FEATURE for PLATECODE
* genes = getGeneMappingForPlate('PLATECODE');
* % Get the plate well location description of the 10th wells
* loc2 = genes(2,10,1)
* % Get the gene ids that are in the 10th well
* geneIds = genes(1,10,:)
* </pre>
*
* @param platesCodes The augmented codes of the plates to get the mapping for
* @return <code>{ gene ids, annotations per well }</code> where <code>gene ids</code> can be 0,
* 1 or more gene ids. <code>annotations per location</code> contain:
* <p>
* <code>{ plate well description, plate augmented code, plate perm id,
* plate space code, plate code, row, column }</code>
*/
public static Object[][][] getGeneMappingForPlates(String[] platesCodes)
{
checkLoggedIn();
final List<PlateWellMaterialMapping> mappingList =
openbis.listPlateMaterialMapping(toPlates(platesCodes), MaterialTypeIdentifier.GENE);
1767
1768
1769
1770
1771
1772
1773
1774
1775
1776
1777
1778
1779
1780
1781
1782
1783
1784
1785
1786
1787
1788
1789
1790
1791
1792
1793
1794
1795
1796
1797
1798
1799
1800
int size = 0;
for (PlateWellMaterialMapping mapping : mappingList)
{
size +=
mapping.getPlateGeometry().getNumberOfRows()
* mapping.getPlateGeometry().getNumberOfColumns();
}
final Object[][][] result = new Object[2][size][];
int resultIdx = 0;
for (PlateWellMaterialMapping mapping : mappingList)
{
for (int row = 1; row <= mapping.getPlateGeometry().getNumberOfRows(); ++row)
{
for (int col = 1; col <= mapping.getPlateGeometry().getNumberOfColumns(); ++col)
{
final List<MaterialIdentifier> genes = mapping.getMaterialsForWell(row, col);
result[0][resultIdx] = new Object[genes.size()];
for (int i = 0; i < genes.size(); ++i)
{
result[0][resultIdx][i] = genes.get(i).getMaterialCode();
}
final PlateIdentifier plate = mapping.getPlateIdentifier();
result[1][resultIdx] =
new Object[]
{ createPlateWellDescription(plate, row, col),
plate.getAugmentedCode(), plate.getPermId(),
plate.tryGetSpaceCode(), plate.getPlateCode(), row, col, };
++resultIdx;
}
}
}
return result;
}
brinn
committed
//
// Helper methods
//
private static List<PlateIdentifier> toPlates(String[] augmentedPlateCodes)
{
final List<PlateIdentifier> result =
new ArrayList<PlateIdentifier>(augmentedPlateCodes.length);
for (String plateCode : augmentedPlateCodes)
{
result.add(PlateIdentifier.createFromAugmentedCode(plateCode));
}
return result;
}
private static Plate getPlate(String augmentedPlateCode)
{
Plate plateIdentifier = plateCodeToPlateMap.get(augmentedPlateCode);
if (plateIdentifier == null)
{
throw new RuntimeException("No plate with that code '" + augmentedPlateCode
+ "' found.");
}
return plateIdentifier;
}
private static String createPlateWellDescription(PlateIdentifier p, FeatureVector f)
{
return createPlateWellDescription(p, f.getWellPosition().getWellRow(), f.getWellPosition()
.getWellColumn());
}
brinn
committed
1833
1834
1835
1836
1837
1838
1839
1840
1841
1842
1843
1844
1845
1846
1847
1848
1849
1850
1851
1852
1853
1854
1855
1856
1857
private static String createPlateWellDescription(PlateIdentifier p, int row, int col)
{
return p.getPlateCode() + ":" + translateRowNumberIntoLetterCode(row) + col;
}
/**
* Translates a row number into letter code. Thus, 1 -> A, 2 -> B, 26 -> Z, 27 -> AA, 28 -> AB,
* etc.
*/
private static String translateRowNumberIntoLetterCode(int rowNumber)
{
int rowIndex = rowNumber - 1;
String code = "";
while (rowIndex >= 0)
{
code = (char) (rowIndex % 26 + 'A') + code;
rowIndex = rowIndex / 26 - 1;
}
return code;
}
private static void checkLoggedIn()
{
if (openbis == null)
{
if (Login.OPENBIS_TOKEN_FILE.exists())
{
BufferedReader br = null;
try
{
br = new BufferedReader(new FileReader(Login.OPENBIS_TOKEN_FILE));
final String token = br.readLine();
br.close();
br = new BufferedReader(new FileReader(Login.OPENBIS_SERVER_URL_FILE));
final String serverUrl = br.readLine();
br.close();
br = null;
IScreeningOpenbisServiceFacade facade =
facadeFactory.tryToCreate(token, serverUrl);
if (facade == null)
{
throw new RuntimeException("Login failed.");
}
init(facade);
1877
1878
1879
1880
1881
1882
1883
1884
1885
1886
1887
1888
1889
1890
1891
1892
1893
1894
1895
1896
1897
1898
1899
1900
} catch (IOException ex)
{
if (openbis == null)
{
throw new RuntimeException("Login failed.", ex);
}
} finally
{
if (br != null)
{
try
{
br.close();
} catch (IOException ex)
{
// Silence this.
}
}
}
}
if (openbis == null)
{
throw new RuntimeException("Not logged in.");
}