Skip to content
Snippets Groups Projects
OpenBISScreeningML.java 51.3 KiB
Newer Older
  • Learn to ignore specific revisions
  • tpylak's avatar
    tpylak committed
            final List<String> featureCodeList = getFeatureCodes(last);
    
            final Object[][][] result = new Object[3][][];
            if (featureVectors.isEmpty())
            {
                return result;
            }
            int numberOfRows = 0;
            for (FeatureVectorDataset fvds : featureVectors)
            {
                numberOfRows += fvds.getFeatureVectors().size();
            }
    
    tpylak's avatar
    tpylak committed
            result[0] = new Object[numberOfRows][featureCodeList.size()];
    
            result[1] = new Object[numberOfRows][13];
            int resultIdx = 0;
            for (FeatureVectorDataset fvds : featureVectors)
            {
                final FeatureVectorDatasetReference datasetRef = fvds.getDataset();
                for (FeatureVector f : fvds.getFeatureVectors())
                {
                    arraycopy(f.getValues(), result[0][resultIdx]);
                    final Object[] annotations =
                            new Object[]
                                { createPlateWellDescription(datasetRef.getPlate(), f),
                                        datasetRef.getPlate().getAugmentedCode(),
                                        datasetRef.getPlate().getPermId(),
                                        datasetRef.getPlate().tryGetSpaceCode(),
                                        datasetRef.getPlate().getPlateCode(),
                                        f.getWellPosition().getWellRow(),
                                        f.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][resultIdx], 0, annotations.length);
                    resultIdx++;
                }
            }
    
    tpylak's avatar
    tpylak committed
            result[2] = new Object[featureCodeList.size()][1];
            for (int i = 0; i < featureCodeList.size(); ++i)
    
    tpylak's avatar
    tpylak committed
                result[2][i][0] = featureCodeList.get(i);
    
    tpylak's avatar
    tpylak committed
        @SuppressWarnings("deprecation")
        private static List<String> getFeatureCodes(FeatureVectorDataset last)
        {
            return last.getFeatureNames();
        }
    
    
        /**
         * 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);
            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;
        }
    
    
        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 void arraycopy(double[] src, Object[] dest)
        {
            for (int i = 0; i < dest.length; ++i)
            {
                dest[i] = src[i];
            }
        }
    
        private static String createPlateWellDescription(FeatureVectorWithDescription f)
        {
            return createPlateWellDescription(f.getDatasetWellReference().getPlate(), f
                    .getWellPosition().getWellRow(), f.getWellPosition().getWellColumn());
        }
    
    
        private static String createPlateWellDescription(PlateIdentifier p, FeatureVector f)
        {
            return createPlateWellDescription(p, f.getWellPosition().getWellRow(), f.getWellPosition()
                    .getWellColumn());
        }
    
    
        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;
                        openbis = ScreeningOpenbisServiceFacadeFactory.tryCreate(token, serverUrl);
                        if (openbis == null)
                        {
                            throw new RuntimeException("Login failed.");
                        }
                        init();
                    } 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.");
                }