edu.umn.msi.tropix.proteomics.sequest.impl.SequestJobProcessorImpl.java Source code

Java tutorial

Introduction

Here is the source code for edu.umn.msi.tropix.proteomics.sequest.impl.SequestJobProcessorImpl.java

Source

/********************************************************************************
 * Copyright (c) 2009 Regents of the University of Minnesota
 *
 * This Software was written at the Minnesota Supercomputing Institute
 * http://msi.umn.edu
 *
 * All rights reserved. The following statement of license applies
 * only to this file, and and not to the other files distributed with it
 * or derived therefrom.  This file is made available under the terms of
 * the Eclipse Public License v1.0 which accompanies this distribution,
 * and is available at http://www.eclipse.org/legal/epl-v10.html
 *
 * Contributors:
 * Minnesota Supercomputing Institute - initial API and implementation
 *******************************************************************************/

package edu.umn.msi.tropix.proteomics.sequest.impl;

import java.io.File;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.Arrays;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

import com.google.common.base.Function;
import com.google.common.base.Joiner;
import com.google.common.base.Supplier;
import com.google.common.collect.Iterables;

import edu.umn.msi.tropix.common.collect.StringPredicates;
import edu.umn.msi.tropix.common.io.Directories;
import edu.umn.msi.tropix.common.io.FileUtils;
import edu.umn.msi.tropix.common.io.FileUtilsFactory;
import edu.umn.msi.tropix.common.io.IOUtils;
import edu.umn.msi.tropix.common.io.IOUtilsFactory;
import edu.umn.msi.tropix.common.io.InputContext;
import edu.umn.msi.tropix.common.io.TempFileSuppliers;
import edu.umn.msi.tropix.common.io.ZipUtils;
import edu.umn.msi.tropix.common.io.ZipUtilsFactory;
import edu.umn.msi.tropix.common.jobqueue.progress.LineProcessingFileProgressTracker;
import edu.umn.msi.tropix.common.jobqueue.progress.ProgressTrackable;
import edu.umn.msi.tropix.common.jobqueue.progress.ProgressTracker;
import edu.umn.msi.tropix.models.sequest.SequestParameters;
import edu.umn.msi.tropix.proteomics.DTAList;
import edu.umn.msi.tropix.proteomics.DTAListWriter;
import edu.umn.msi.tropix.proteomics.conversion.MzXMLToDTAConverter;
import edu.umn.msi.tropix.proteomics.identification.IdentificationJobProcessorImpl;
import edu.umn.msi.tropix.proteomics.sequest.SequestLineCallback;
import edu.umn.msi.tropix.proteomics.sequest.SequestParameterTranslator;

public class SequestJobProcessorImpl extends IdentificationJobProcessorImpl<SequestParameters>
        implements ProgressTrackable {
    private static final Log LOG = LogFactory.getLog(SequestJobProcessorImpl.class);
    private static final IOUtils IO_UTILS = IOUtilsFactory.getInstance();
    private static final Supplier<File> TEMP_FILE_SUPPLIER = TempFileSuppliers.getDefaultTempFileSupplier();
    private static final String PARAMS_PATH = "sequest.params";
    private static final String FILES_PATH = "dta_files";
    private DTAListWriter dtaListWriter;
    private MzXMLToDTAConverter mzxmlToDtaConverter;
    private SequestParameterTranslator parameterTranslator;
    private LineProcessingFileProgressTracker sequestProgressTracker;
    private SequestLineCallback sequestLineCallback;
    private final FileUtils fileUtils = FileUtilsFactory.getInstance();
    private ZipUtils zipUtils = ZipUtilsFactory.getInstance();
    private boolean includeParams;
    private boolean includeDta;
    private long allowedDroppedFiles = 0L;

    private void initializeOutputTracker() {
        if (sequestProgressTracker != null) {
            final File stagingDirectoryFile = new File(getStagingDirectory().getAbsolutePath());
            final File parent = stagingDirectoryFile.getParentFile();
            if (parent != null && parent.exists()) {
                final File stdoutFile = new File(getStagingDirectory().getAbsolutePath(), "output_log");
                this.getJobDescription().getJobDescriptionType().setStdout(stdoutFile.getAbsolutePath());
                fileUtils.touch(stdoutFile);
                sequestProgressTracker.setTrackedFile(stdoutFile);
                final int dtaCount = fileUtils.listFiles(stagingDirectoryFile, new String[] { "dta" }, false)
                        .size();
                sequestProgressTracker.setLineCallback(sequestLineCallback);
                sequestLineCallback.setDtaCount(dtaCount);
            }
        }
    }

    private String getSequestDatabaseName() {
        return SequestUtils.sanitizeDatabaseName(super.getDatabaseName());
    }

    @Override
    protected void doPreprocessing() {
        LOG.debug("Attempting to download database file for sequest job");
        getDatabase().get(getStagingDirectory().getOutputContext(getSequestDatabaseName()));

        LOG.debug("About to translate sequest parameters");
        final SequestParameters inputParameters = getParameters();

        final String paramFileContents = parameterTranslator.getSequestParameters(getParameters(),
                Directories.buildAbsolutePath(getStagingDirectory(), getSequestDatabaseName()));
        LOG.debug("About to write sequest parameters to param file ");
        getStagingDirectory().getOutputContext(PARAMS_PATH).put(paramFileContents.getBytes());

        writeDTACollection();
        initializeOutputTracker();
        getJobDescription().getJobDescriptionType().setArgument(
                new String[] { "-P" + Directories.buildAbsolutePath(getStagingDirectory(), PARAMS_PATH),
                        "-R" + Directories.buildAbsolutePath(getStagingDirectory(), FILES_PATH) });
    }

    @Override
    protected void initialize() {
        initializeOutputTracker();
    }

    @Override
    protected void doPostprocessing() {
        if (wasCompletedNormally()) {
            LOG.debug("postprocess called for sequest job created");
            final Iterable<String> resources = getStagingDirectory().getResourceNames(null);
            Iterable<String> outResources = Iterables.filter(resources, StringPredicates.endsWith("out"));
            final Iterable<String> dtaResources = Iterables.filter(resources, StringPredicates.endsWith("dta"));

            final long outNum = Iterables.size(outResources), dtaNum = Iterables.size(dtaResources);

            if (outNum != dtaNum) {
                boolean failJob = false;
                if ((outNum + allowedDroppedFiles) < dtaNum) {
                    failJob = true;
                }
                LOG.warn("Invalid number of output files created -- expected " + dtaNum + " found " + outNum
                        + " failing job? " + failJob);
                if (failJob) {
                    throw new IllegalStateException("Failed to produce the correct number of files.");
                }
            }

            if (includeDta) {
                outResources = Iterables.concat(outResources, dtaResources);
            }
            if (includeParams) {
                outResources = Iterables.concat(outResources, Arrays.asList(PARAMS_PATH));
            }

            final Iterable<InputContext> inputContexts = Iterables.transform(outResources,
                    new Function<String, InputContext>() {
                        public InputContext apply(final String resource) {
                            return getStagingDirectory().getInputContext(resource);
                        }
                    });
            final OutputStream resultsStream = getResourceTracker().newStream();
            try {
                zipUtils.zipContextsToStream(inputContexts, outResources, resultsStream);
            } finally {
                IO_UTILS.closeQuietly(resultsStream);
            }
        }
    }

    private void writeDTACollection() {
        final File mzxmlFile = TEMP_FILE_SUPPLIER.get();
        InputStream mzxmlStream = null;
        try {
            writeMzXML(mzxmlFile);
            LOG.debug("converting mzxml to dta");
            mzxmlStream = fileUtils.getFileInputStream(mzxmlFile);
            final DTAList dtaList = mzxmlToDtaConverter.mzxmlToDTA(mzxmlStream, null);
            LOG.debug("writing dta files");
            final Iterable<String> resources = dtaListWriter.writeFiles(getStagingDirectory(), dtaList);
            getStagingDirectory().getOutputContext(FILES_PATH)
                    .put((Joiner.on(System.getProperty("line.separator")).join(resources)
                            + System.getProperty("line.separator")).getBytes());
        } finally {
            fileUtils.deleteQuietly(mzxmlFile);
            IO_UTILS.closeQuietly(mzxmlStream);
        }
    }

    public void setDTAListWriter(final DTAListWriter dtaListWriter) {
        this.dtaListWriter = dtaListWriter;
    }

    public void setMzXMLToDtaConverter(final MzXMLToDTAConverter mzxmlToDtaConverter) {
        this.mzxmlToDtaConverter = mzxmlToDtaConverter;

    }

    public void setParameterTranslator(final SequestParameterTranslator parameterTranslator) {
        this.parameterTranslator = parameterTranslator;
    }

    public void setZipUtils(final ZipUtils zipUtils) {
        this.zipUtils = zipUtils;
    }

    public void setIncludeParams(final boolean includeParams) {
        this.includeParams = includeParams;
    }

    public void setincludeDta(final boolean includeDta) {
        this.includeDta = includeDta;
    }

    public void setProgressTracker(final LineProcessingFileProgressTracker sequestProgressTracker) {
        this.sequestProgressTracker = sequestProgressTracker;
    }

    public void setSequestLineCallback(final SequestLineCallback sequestLineCallback) {
        this.sequestLineCallback = sequestLineCallback;
    }

    public ProgressTracker getProgressTracker() {
        return sequestProgressTracker;
    }

    public void setAllowedDroppedFiles(final long allowedDroppedFiles) {
        this.allowedDroppedFiles = allowedDroppedFiles;
    }

}