ubic.gemma.analysis.service.ExpressionDataMatrixServiceImpl.java Source code

Java tutorial

Introduction

Here is the source code for ubic.gemma.analysis.service.ExpressionDataMatrixServiceImpl.java

Source

/*
 * The Gemma project
 * 
 * Copyright (c) 2006 University of British Columbia
 * 
 * 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 ubic.gemma.analysis.service;

import java.util.ArrayList;
import java.util.Collection;
import java.util.HashSet;
import java.util.Map;

import org.apache.commons.lang.ArrayUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import ubic.basecode.dataStructure.matrix.DenseDoubleMatrix;
import ubic.gemma.analysis.preprocess.filter.ExpressionExperimentFilter;
import ubic.gemma.analysis.preprocess.filter.FilterConfig;
import ubic.gemma.datastructure.matrix.ExpressionDataDoubleMatrix;
import ubic.gemma.expression.experiment.service.ExpressionExperimentService;
import ubic.gemma.model.expression.arrayDesign.ArrayDesign;
import ubic.gemma.model.expression.arrayDesign.ArrayDesignService;
import ubic.gemma.model.expression.bioAssayData.ProcessedExpressionDataVector;
import ubic.gemma.model.expression.bioAssayData.ProcessedExpressionDataVectorDao;
import ubic.gemma.model.expression.bioAssayData.ProcessedExpressionDataVectorService;
import ubic.gemma.model.expression.experiment.ExpressionExperiment;
import ubic.gemma.model.genome.Gene;
import cern.colt.list.DoubleArrayList;
import cern.jet.stat.Descriptive;

/**
 * Tools for easily getting data matrices for analysis in a consistent way.
 * 
 * @author keshav
 * @version $Id: ExpressionDataMatrixServiceImpl.java,v 1.5 2012/06/08 16:30:37 paul Exp $
 */
@Component
public class ExpressionDataMatrixServiceImpl implements ExpressionDataMatrixService {

    @Autowired
    private ExpressionExperimentService expressionExperimentService;

    @Autowired
    private ProcessedExpressionDataVectorService processedExpressionDataVectorService;

    @Autowired
    private ArrayDesignService arrayDesignService;

    /*
     * (non-Javadoc)
     * 
     * @see
     * ubic.gemma.analysis.service.ExpressionDataMatrixService#getFilteredMatrix(ubic.gemma.model.expression.experiment
     * .ExpressionExperiment, ubic.gemma.analysis.preprocess.filter.FilterConfig)
     */
    @Override
    public ExpressionDataDoubleMatrix getFilteredMatrix(ExpressionExperiment ee, FilterConfig filterConfig) {
        Collection<ProcessedExpressionDataVector> dataVectors = processedExpressionDataVectorService
                .getProcessedDataVectors(ee);
        return this.getFilteredMatrix(ee, filterConfig, dataVectors);
    }

    /*
     * (non-Javadoc)
     * 
     * @see
     * ubic.gemma.analysis.service.ExpressionDataMatrixService#getFilteredMatrix(ubic.gemma.model.expression.experiment
     * .ExpressionExperiment, ubic.gemma.analysis.preprocess.filter.FilterConfig, java.util.Collection)
     */
    @Override
    public ExpressionDataDoubleMatrix getFilteredMatrix(ExpressionExperiment ee, FilterConfig filterConfig,
            Collection<ProcessedExpressionDataVector> dataVectors) {
        Collection<ArrayDesign> arrayDesignsUsed = expressionExperimentService.getArrayDesignsUsed(ee);
        return getFilteredMatrix(filterConfig, dataVectors, arrayDesignsUsed);
    }

    /**
     * @param filterConfig
     * @param dataVectors
     * @param arrayDesignsUsed
     * @return
     */
    private ExpressionDataDoubleMatrix getFilteredMatrix(FilterConfig filterConfig,
            Collection<ProcessedExpressionDataVector> dataVectors, Collection<ArrayDesign> arrayDesignsUsed) {
        ExpressionExperimentFilter filter = new ExpressionExperimentFilter(arrayDesignsUsed, filterConfig);
        this.processedExpressionDataVectorService.thaw(dataVectors);
        ExpressionDataDoubleMatrix eeDoubleMatrix = filter.getFilteredMatrix(dataVectors);
        return eeDoubleMatrix;
    }

    /*
     * (non-Javadoc)
     * 
     * @see ubic.gemma.analysis.service.ExpressionDataMatrixService#getFilteredMatrix(java.lang.String,
     * ubic.gemma.analysis.preprocess.filter.FilterConfig, java.util.Collection)
     */
    @Override
    public ExpressionDataDoubleMatrix getFilteredMatrix(String arrayDesignName, FilterConfig filterConfig,
            Collection<ProcessedExpressionDataVector> dataVectors) {
        ArrayDesign ad = arrayDesignService.findByShortName(arrayDesignName);
        if (ad == null) {
            throw new IllegalArgumentException("No platform named '" + arrayDesignName + "'");
        }
        Collection<ArrayDesign> arrayDesignsUsed = new HashSet<ArrayDesign>();
        arrayDesignsUsed.add(ad);
        return this.getFilteredMatrix(filterConfig, dataVectors, arrayDesignsUsed);
    }

    /*
     * (non-Javadoc)
     * 
     * @see
     * ubic.gemma.analysis.service.ExpressionDataMatrixService#getProcessedExpressionDataMatrix(ubic.gemma.model.expression
     * .experiment.ExpressionExperiment)
     */
    @Override
    public ExpressionDataDoubleMatrix getProcessedExpressionDataMatrix(ExpressionExperiment ee) {
        Collection<ProcessedExpressionDataVector> dataVectors = this.processedExpressionDataVectorService
                .getProcessedDataVectors(ee);
        if (dataVectors.isEmpty()) {
            throw new IllegalArgumentException(
                    "There are no ProcessedExpressionDataVectors for " + ee + ", they must be created first");
        }
        this.processedExpressionDataVectorService.thaw(dataVectors);
        return new ExpressionDataDoubleMatrix(dataVectors);
    }

    /*
     * (non-Javadoc)
     * 
     * @see
     * ubic.gemma.analysis.service.ExpressionDataMatrixService#getProcessedExpressionDataVectors(ubic.gemma.model.expression
     * .experiment.ExpressionExperiment)
     */
    @Override
    public Collection<ProcessedExpressionDataVector> getProcessedExpressionDataVectors(ExpressionExperiment ee) {
        Collection<ProcessedExpressionDataVector> dataVectors = this.processedExpressionDataVectorService
                .getProcessedDataVectors(ee); // these are already thawed.
        return dataVectors;
    }

    /*
     * (non-Javadoc)
     * 
     * @see ubic.gemma.analysis.service.ExpressionDataMatrixService#getRankMatrix(java.util.Collection,
     * java.util.Collection, ubic.gemma.model.expression.bioAssayData.ProcessedExpressionDataVectorDao.RankMethod)
     */
    @Override
    public DenseDoubleMatrix<Gene, ExpressionExperiment> getRankMatrix(Collection<Gene> genes,
            Collection<ExpressionExperiment> ees, ProcessedExpressionDataVectorDao.RankMethod method) {
        DenseDoubleMatrix<Gene, ExpressionExperiment> matrix = new DenseDoubleMatrix<Gene, ExpressionExperiment>(
                genes.size(), ees.size());

        Map<ExpressionExperiment, Map<Gene, Collection<Double>>> ranks = processedExpressionDataVectorService
                .getRanks(ees, genes, method);

        matrix.setRowNames(new ArrayList<Gene>(genes));
        matrix.setColumnNames(new ArrayList<ExpressionExperiment>(ees));
        for (int i = 0; i < matrix.rows(); i++) {
            for (int j = 0; j < matrix.columns(); j++) {
                matrix.setByKeys(matrix.getRowName(i), matrix.getColName(j), Double.NaN);
            }
        }

        for (Gene g : matrix.getRowNames()) {
            for (ExpressionExperiment e : matrix.getColNames()) {
                if (ranks.containsKey(e)) {
                    Collection<Double> r = ranks.get(e).get(g);

                    // compute median of collection.
                    Double[] ar = new Double[r.size()];
                    r.toArray(ar);
                    double[] dar = ArrayUtils.toPrimitive(ar);
                    double medianRank = Descriptive.median(new DoubleArrayList(dar));

                    matrix.setByKeys(g, e, medianRank);
                }
            }
        }

        return matrix;
    }

}