diff --git a/screening/source/java/ch/systemsx/cisd/openbis/dss/screening/server/DssServiceRpcScreening.java b/screening/source/java/ch/systemsx/cisd/openbis/dss/screening/server/DssServiceRpcScreening.java index 5ad527f2ec7c01a74a48b901f36ce2bf8e642e51..64a1538ef27d20947e0079bd256efb372d947b5a 100644 --- a/screening/source/java/ch/systemsx/cisd/openbis/dss/screening/server/DssServiceRpcScreening.java +++ b/screening/source/java/ch/systemsx/cisd/openbis/dss/screening/server/DssServiceRpcScreening.java @@ -622,31 +622,36 @@ public class DssServiceRpcScreening extends AbstractDssServiceRpc<IDssServiceRpc for (FeatureTableRow featureTableRow : datasetFeatures.getFeatures()) { WellLocation wellPosition = featureTableRow.getWellLocation(); - double[] values = getFloatFeaturesAsDouble(featureTableRow); - featureVectors.add(new FeatureVector(convert(wellPosition), values)); + featureVectors.add(getFeatureVector(convert(wellPosition), featureTableRow)); } return new FeatureVectorDataset(dataset, datasetFeatures.getFeatureCodes(), datasetFeatures.getFeatureLabels(), featureVectors); } - // TODO 2010-11-29, Tomasz Pylak: allow to access Vocabulary Features in the API - private static double[] getFloatFeaturesAsDouble(FeatureTableRow featureTableRow) + private static FeatureVector getFeatureVector(WellPosition position, FeatureTableRow featureTableRow) { FeatureValue[] featureValues = featureTableRow.getFeatureValues(); double[] doubleValues = new double[featureValues.length]; + String[] vocabularyTerms = new String[featureValues.length]; + boolean[] vocabularyFeatureFlags = new boolean[featureValues.length]; + for (int i = 0; i < featureValues.length; ++i) { FeatureValue featureValue = featureValues[i]; if (featureValue.isFloat()) { doubleValues[i] = featureValue.asFloat(); - } else + } else if (featureValue.isVocabularyTerm()) { - // convert a vocabulary term to NaN + vocabularyFeatureFlags[i] = true; + vocabularyTerms[i] = featureValue.tryAsVocabularyTerm(); doubleValues[i] = Double.NaN; + } else + { + throw new IllegalStateException("Feature can be only either a float or a vocabulary term"); } } - return doubleValues; + return new FeatureVector(position, doubleValues, vocabularyFeatureFlags, vocabularyTerms); } private static WellPosition convert(WellLocation wellPosition) @@ -694,8 +699,9 @@ public class DssServiceRpcScreening extends AbstractDssServiceRpc<IDssServiceRpc private FeatureVectorWithDescription createFeatureVector(FeatureTableRow featureTableRow, final List<String> featureCodes) { + FeatureVector feature = getFeatureVector(featureTableRow.getReference().getWellPosition(), featureTableRow); return new FeatureVectorWithDescription(featureTableRow.getReference(), featureCodes, - getFloatFeaturesAsDouble(featureTableRow)); + feature.getValues()); } @Override diff --git a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/shared/api/v1/dto/FeatureVectorWithDescription.java b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/shared/api/v1/dto/FeatureVectorWithDescription.java index 37db156288bdc1791aef6b13337091d25146584d..49f4e7eca025b6703f44793776a8d143a61bb805 100644 --- a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/shared/api/v1/dto/FeatureVectorWithDescription.java +++ b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/shared/api/v1/dto/FeatureVectorWithDescription.java @@ -32,6 +32,14 @@ public class FeatureVectorWithDescription extends FeatureVector implements IFeat this.featureNames = featureNames; } + public FeatureVectorWithDescription(FeatureVectorDatasetWellReference dataset, + List<String> featureNames, double[] values, boolean[] vocabularyFeatureFlags, String[] vocabularyTerms) + { + super(dataset.getWellPosition(), values, vocabularyFeatureFlags, vocabularyTerms); + this.datasetWellReference = dataset; + this.featureNames = featureNames; + } + /** * Identifier of the dataset and well of this feature vector. */