Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

TASK-5513 Fix the Docker image configuration for OpenCGA analysis #2389

Closed
wants to merge 7 commits into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@
import org.opencb.opencga.catalog.exceptions.CatalogException;
import org.opencb.opencga.catalog.managers.CatalogManager;
import org.opencb.opencga.core.config.Configuration;
import org.opencb.opencga.core.config.ConfigurationUtils;
import org.opencb.opencga.core.exceptions.ToolExecutorException;
import org.opencb.opencga.storage.core.StorageEngineFactory;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@
package org.opencb.opencga.analysis.clinical;

import org.opencb.commons.datastore.core.ObjectMap;
import org.opencb.opencga.analysis.ConfigurationUtils;
import org.opencb.opencga.core.config.ConfigurationUtils;
import org.opencb.opencga.catalog.exceptions.CatalogException;
import org.opencb.opencga.catalog.managers.CatalogManager;
import org.opencb.opencga.core.config.Configuration;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@
import org.opencb.biodata.models.clinical.interpretation.Software;
import org.opencb.commons.datastore.core.Query;
import org.opencb.commons.datastore.core.QueryOptions;
import org.opencb.opencga.analysis.ConfigurationUtils;
import org.opencb.opencga.core.config.ConfigurationUtils;
import org.opencb.opencga.analysis.tools.OpenCgaTool;
import org.opencb.opencga.catalog.exceptions.CatalogException;
import org.opencb.opencga.catalog.managers.CatalogManager;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,8 @@
import org.opencb.opencga.core.common.GitRepositoryState;
import org.opencb.opencga.core.common.JacksonUtils;
import org.opencb.opencga.core.common.TimeUtils;
import org.opencb.opencga.core.config.ConfigurationUtils;
import org.opencb.opencga.core.config.Docker;
import org.opencb.opencga.core.exceptions.ToolException;
import org.opencb.opencga.core.models.clinical.ClinicalAnalysis;
import org.opencb.opencga.core.models.clinical.Interpretation;
Expand Down Expand Up @@ -136,13 +138,21 @@ protected void run() throws ToolException {

protected void saveInterpretation(String studyId, ClinicalAnalysis clinicalAnalysis) throws ToolException, StorageEngineException,
CatalogException, IOException {
// Get Docker image name and version
String dockerImage = ConfigurationUtils.getDockerImage(Docker.EXOMISER_IMAGE_KEY, configuration);
String dockerVersion = "";
String[] split = dockerImage.split(":");
String dockerName = split[0];
if (split.length > 1) {
dockerVersion = split[1];
}
// Interpretation method
InterpretationMethod method = new InterpretationMethod(getId(), GitRepositoryState.getInstance().getBuildVersion(),
GitRepositoryState.getInstance().getCommitId(), Collections.singletonList(
new Software()
.setName("Exomiser")
.setRepository("Docker: " + ExomiserWrapperAnalysisExecutor.DOCKER_IMAGE_NAME)
.setVersion(ExomiserWrapperAnalysisExecutor.DOCKER_IMAGE_VERSION)));
.setRepository("Docker: " + dockerName)
.setVersion(dockerVersion)));

// Analyst
ClinicalAnalyst analyst = clinicalInterpretationManager.getAnalyst(studyId, token);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,12 +28,9 @@
import org.opencb.opencga.core.tools.annotations.ToolParams;
import org.opencb.opencga.core.tools.family.PedigreeGraphAnalysisExecutor;

@Tool(id = PedigreeGraphAnalysis.ID, resource = Enums.Resource.FAMILY)
@Tool(id = PedigreeGraphAnalysisExecutor.ID, resource = Enums.Resource.FAMILY)
public class PedigreeGraphAnalysis extends OpenCgaToolScopeStudy {

public static final String ID = "pedigree-graph";
public static final String DESCRIPTION = "Compute the family pedigree graph image.";

@ToolParams
private PedigreeGraphAnalysisParams pedigreeParams = new PedigreeGraphAnalysisParams();

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,8 @@
import org.opencb.opencga.catalog.exceptions.CatalogException;
import org.opencb.opencga.catalog.utils.PedigreeGraphUtils;
import org.opencb.opencga.core.api.ParamConstants;
import org.opencb.opencga.core.config.ConfigurationUtils;
import org.opencb.opencga.core.config.Docker;
import org.opencb.opencga.core.exceptions.ToolException;
import org.opencb.opencga.core.models.common.Enums;
import org.opencb.opencga.core.models.family.Family;
Expand Down Expand Up @@ -59,11 +61,12 @@ public List<String> getSteps() {
@Override
protected void run() throws ToolException {
step("pull-docker", () -> {
String dockerImage = ConfigurationUtils.getDockerImage(Docker.OPENCGA_EXT_TOOLS_IMAGE_KEY, configuration);
// Be sure docker is alive and that opencga-ext-tools is downloaded
logger.info("Checking if docker daemon is alive");
DockerUtils.checkDockerDaemonAlive();
logger.info("Pulling docker '{}'", PedigreeGraphUtils.R_DOCKER_IMAGE);
new Command("docker pull " + PedigreeGraphUtils.R_DOCKER_IMAGE).run();
logger.info("Pulling docker '{}'", dockerImage);
new Command("docker pull " + dockerImage).run();
});

step(getId(), () -> {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,31 +16,22 @@

package org.opencb.opencga.analysis.family;

import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
import org.opencb.biodata.models.clinical.Disorder;
import org.opencb.commons.utils.DockerUtils;
import org.opencb.opencga.analysis.StorageToolExecutor;
import org.opencb.opencga.core.config.ConfigurationUtils;
import org.opencb.opencga.catalog.exceptions.CatalogException;
import org.opencb.opencga.catalog.utils.PedigreeGraphUtils;
import org.opencb.opencga.core.common.GitRepositoryState;
import org.opencb.opencga.core.config.Configuration;
import org.opencb.opencga.core.exceptions.ToolException;
import org.opencb.opencga.core.models.individual.Individual;
import org.opencb.opencga.core.tools.annotations.ToolExecutor;
import org.opencb.opencga.core.tools.family.PedigreeGraphAnalysisExecutor;
import org.opencb.opencga.storage.core.exceptions.StorageEngineException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.PrintWriter;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.*;

@ToolExecutor(id="opencga-local", tool = PedigreeGraphAnalysis.ID,
@ToolExecutor(id="opencga-local", tool = PedigreeGraphAnalysisExecutor.ID,
framework = ToolExecutor.Framework.LOCAL, source = ToolExecutor.Source.STORAGE)
public class PedigreeGraphLocalAnalysisExecutor extends PedigreeGraphAnalysisExecutor {

Expand All @@ -51,8 +42,10 @@ public class PedigreeGraphLocalAnalysisExecutor extends PedigreeGraphAnalysisExe
@Override
public void run() throws ToolException, CatalogException, IOException, StorageEngineException {
opencgaHome = Paths.get(getExecutorParams().getString("opencgaHome"));
Configuration configuration = ConfigurationUtils.loadConfiguration(opencgaHome.toAbsolutePath().toString());

// Run R script for fitting signature
PedigreeGraphUtils.createPedigreeGraph(getFamily(), opencgaHome.resolve("analysis/" + PedigreeGraphAnalysis.ID), getOutDir());
PedigreeGraphUtils.createPedigreeGraph(getFamily(), opencgaHome.resolve("analysis/" + PedigreeGraphAnalysisExecutor.ID),
getOutDir(), configuration);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -30,8 +30,9 @@
import org.opencb.opencga.analysis.individual.qc.IndividualQcUtils;
import org.opencb.opencga.analysis.variant.manager.VariantStorageManager;
import org.opencb.opencga.analysis.variant.relatedness.RelatednessAnalysis;
import org.opencb.opencga.analysis.wrappers.plink.PlinkWrapperAnalysisExecutor;
import org.opencb.opencga.catalog.exceptions.CatalogException;
import org.opencb.opencga.core.config.ConfigurationUtils;
import org.opencb.opencga.core.config.Docker;
import org.opencb.opencga.core.exceptions.ToolException;
import org.opencb.opencga.core.models.family.Family;
import org.opencb.opencga.core.models.individual.Individual;
Expand Down Expand Up @@ -117,7 +118,9 @@ public static RelatednessReport compute(String study, Family family, List<String
} catch (IOException e) {
throw new ToolException("Something wrong happened when copying files during the relatedness analysis execution");
}
File outFile = runIBD(FILTERED_BASENAME, freqPath, outDir);
String dockerImage = ConfigurationUtils.getDockerImage(Docker.OPENCGA_EXT_TOOLS_IMAGE_KEY,
storageManager.getCatalogManager().getConfiguration());
File outFile = runIBD(dockerImage, FILTERED_BASENAME, freqPath, outDir);

if (!outFile.exists()) {
throw new ToolException("Something wrong happened executing relatedness analysis");
Expand Down Expand Up @@ -298,7 +301,7 @@ public static void filterFamilyTpedFile(Path tPedPath, Path tPedFilteredPath, Pa
bw.close();
}

private static File runIBD(String basename, Path freqPath, Path outDir) throws ToolException {
private static File runIBD(String dockerImage, String basename, Path freqPath, Path outDir) throws ToolException {
// Input bindings
List<AbstractMap.SimpleEntry<String, String>> inputBindings = new ArrayList<>();
inputBindings.add(new AbstractMap.SimpleEntry<>(freqPath.getParent().toString(), "/input"));
Expand All @@ -311,8 +314,7 @@ private static File runIBD(String basename, Path freqPath, Path outDir) throws T
String plinkParams = "plink1.9 --tfile /output/" + basename + " --genome rel-check --read-freq /input/" + FREQ_FILENAME
+ " --out /output/" + basename;
try {
PlinkWrapperAnalysisExecutor plinkExecutor = new PlinkWrapperAnalysisExecutor();
DockerUtils.run(plinkExecutor.getDockerImageName(), inputBindings, outputBinding, plinkParams, null);
DockerUtils.run(dockerImage, inputBindings, outputBinding, plinkParams, null);
} catch (IOException e) {
throw new ToolException(e);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,12 +24,13 @@
import org.opencb.commons.exec.Command;
import org.opencb.commons.utils.DockerUtils;
import org.opencb.opencga.analysis.variant.manager.VariantStorageManager;
import org.opencb.opencga.analysis.wrappers.plink.PlinkWrapperAnalysisExecutor;
import org.opencb.opencga.catalog.db.api.IndividualDBAdaptor;
import org.opencb.opencga.catalog.db.api.ProjectDBAdaptor;
import org.opencb.opencga.catalog.exceptions.CatalogException;
import org.opencb.opencga.catalog.managers.CatalogManager;
import org.opencb.opencga.catalog.utils.CatalogFqn;
import org.opencb.opencga.core.config.ConfigurationUtils;
import org.opencb.opencga.core.config.Docker;
import org.opencb.opencga.core.exceptions.ToolException;
import org.opencb.opencga.core.models.JwtPayload;
import org.opencb.opencga.core.models.common.InternalStatus;
Expand Down Expand Up @@ -85,7 +86,9 @@ public static void selectMarkers(String basename, String study, List<String> sam

exportData(tpedFile, tfamFile, query, storageManager, token);
if (tpedFile.exists() && tpedFile.length() > 0) {
pruneVariants(basename, outputBinding);
String dockerImage = ConfigurationUtils.getDockerImage(Docker.OPENCGA_EXT_TOOLS_IMAGE_KEY,
storageManager.getCatalogManager().getConfiguration());
pruneVariants(dockerImage, basename, outputBinding);
}

if (!tpedFile.exists() || tpedFile.length() == 0) {
Expand Down Expand Up @@ -362,12 +365,11 @@ private static void exportData(File tpedFile, File tfamFile, Query query, Varian
}
}

private static void pruneVariants(String basename, AbstractMap.SimpleEntry<String, String> outputBinding) throws ToolException {
private static void pruneVariants(String dockerImage, String basename, AbstractMap.SimpleEntry<String, String> outputBinding) throws ToolException {
// Variant pruning using PLINK in docker
String plinkParams = "plink1.9 --tfile /data/output/" + basename + " --indep 50 5 2 --out /data/output/" + basename;
try {
PlinkWrapperAnalysisExecutor plinkExecutor = new PlinkWrapperAnalysisExecutor();
DockerUtils.run(plinkExecutor.getDockerImageName(), null, outputBinding, plinkParams, null);
DockerUtils.run(dockerImage, null, outputBinding, plinkParams, null);
} catch (IOException e) {
throw new ToolException(e);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,6 @@
import org.opencb.biodata.models.core.Region;
import org.opencb.commons.utils.DockerUtils;
import org.opencb.opencga.analysis.alignment.AlignmentStorageManager;
import org.opencb.opencga.analysis.variant.mutationalSignature.MutationalSignatureLocalAnalysisExecutor;
import org.opencb.opencga.core.exceptions.ToolException;
import org.opencb.opencga.core.models.file.File;

Expand Down Expand Up @@ -88,13 +87,13 @@ public static double[] computeRatios(String study, File bwFile, String assembly,
return new double[]{1.0d * means[1] / means[0], 1.0d * means[2] / means[0]};
}

public static java.io.File plot(File inputFile, Path outDir) throws ToolException {
public static java.io.File plot(File inputFile, Path outDir, String dockerImage) throws ToolException {
// Execute R script in docker
AbstractMap.SimpleEntry<String, String> outputBinding = new AbstractMap.SimpleEntry<>(outDir.toAbsolutePath().toString(),
"/data/output");
String rParams = "R CMD Rscript --vanilla /data/input/" + inputFile.getName();
try {
DockerUtils.run(MutationalSignatureLocalAnalysisExecutor.R_DOCKER_IMAGE, null, outputBinding, rParams, null);
DockerUtils.run(dockerImage, null, outputBinding, rParams, null);
} catch (IOException e) {
throw new ToolException(e);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,6 @@
import org.apache.commons.lang3.time.StopWatch;
import org.opencb.commons.datastore.core.Event;
import org.opencb.commons.datastore.core.ObjectMap;
import org.opencb.opencga.analysis.ConfigurationUtils;
import org.opencb.opencga.analysis.variant.manager.VariantStorageManager;
import org.opencb.opencga.catalog.exceptions.CatalogException;
import org.opencb.opencga.catalog.managers.CatalogManager;
Expand All @@ -31,6 +30,7 @@
import org.opencb.opencga.core.common.MemoryUsageMonitor;
import org.opencb.opencga.core.common.TimeUtils;
import org.opencb.opencga.core.config.Configuration;
import org.opencb.opencga.core.config.ConfigurationUtils;
import org.opencb.opencga.core.config.storage.StorageConfiguration;
import org.opencb.opencga.core.exceptions.ToolException;
import org.opencb.opencga.core.models.common.Enums;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -32,8 +32,9 @@
import org.opencb.opencga.analysis.StorageToolExecutor;
import org.opencb.opencga.analysis.variant.manager.VariantStorageManager;
import org.opencb.opencga.catalog.exceptions.CatalogException;
import org.opencb.opencga.core.common.GitRepositoryState;
import org.opencb.opencga.core.common.TimeUtils;
import org.opencb.opencga.core.config.ConfigurationUtils;
import org.opencb.opencga.core.config.Docker;
import org.opencb.opencga.core.exceptions.ToolException;
import org.opencb.opencga.core.exceptions.ToolExecutorException;
import org.opencb.opencga.core.models.variant.CircosAnalysisParams;
Expand All @@ -59,9 +60,8 @@
framework = ToolExecutor.Framework.LOCAL, source = ToolExecutor.Source.STORAGE)
public class CircosLocalAnalysisExecutor extends CircosAnalysisExecutor implements StorageToolExecutor {

public final static String R_DOCKER_IMAGE = "opencb/opencga-ext-tools:"
+ GitRepositoryState.getInstance().getBuildVersion();
private VariantStorageManager storageManager;
private String dockerImage;

private File snvsFile;
private File rearrsFile;
Expand Down Expand Up @@ -96,6 +96,8 @@ public VariantStorageManager getVariantStorageManager() throws ToolExecutorExcep

@Override
public void run() throws ToolException, IOException, CatalogException {
dockerImage = ConfigurationUtils.getDockerImage(Docker.OPENCGA_EXT_TOOLS_IMAGE_KEY,
storageManager.getCatalogManager().getConfiguration());

// Create query
Query query = new Query();
Expand Down Expand Up @@ -160,7 +162,7 @@ public void run() throws ToolException, IOException, CatalogException {
+ " " + getCircosParams().getTitle();

StopWatch stopWatch = StopWatch.createStarted();
String cmdline = DockerUtils.run(R_DOCKER_IMAGE, inputBindings, outputBinding, scriptParams, null);
String cmdline = DockerUtils.run(dockerImage, inputBindings, outputBinding, scriptParams, null);
logger.info("Docker command line: " + cmdline);
logger.info("Execution time: " + TimeUtils.durationToString(stopWatch));
} else {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -34,10 +34,12 @@
import org.opencb.opencga.analysis.StorageToolExecutor;
import org.opencb.opencga.analysis.variant.manager.VariantStorageManager;
import org.opencb.opencga.catalog.exceptions.CatalogException;
import org.opencb.opencga.core.common.GitRepositoryState;
import org.opencb.opencga.core.common.JacksonUtils;
import org.opencb.opencga.core.common.TimeUtils;
import org.opencb.opencga.core.config.ConfigurationUtils;
import org.opencb.opencga.core.config.Docker;
import org.opencb.opencga.core.exceptions.ToolException;
import org.opencb.opencga.core.exceptions.ToolExecutorException;
import org.opencb.opencga.core.tools.annotations.ToolExecutor;
import org.opencb.opencga.core.tools.variant.GenomePlotAnalysisExecutor;
import org.opencb.opencga.storage.core.variant.adaptors.VariantQueryParam;
Expand All @@ -59,9 +61,7 @@
framework = ToolExecutor.Framework.LOCAL, source = ToolExecutor.Source.STORAGE)
public class GenomePlotLocalAnalysisExecutor extends GenomePlotAnalysisExecutor implements StorageToolExecutor {

public final static String R_DOCKER_IMAGE = "opencb/opencga-ext-tools:"
+ GitRepositoryState.getInstance().getBuildVersion();

private String dockerImage;
private GenomePlotConfig plotConfig;

private File snvsFile;
Expand All @@ -79,7 +79,8 @@ public class GenomePlotLocalAnalysisExecutor extends GenomePlotAnalysisExecutor

@Override
public void run() throws ToolException, IOException, CatalogException {

dockerImage = ConfigurationUtils.getDockerImage(Docker.OPENCGA_EXT_TOOLS_IMAGE_KEY,
getVariantStorageManager().getCatalogManager().getConfiguration());
plotConfig = JacksonUtils.getDefaultObjectMapper().readerFor(GenomePlotConfig.class).readValue(getConfigFile());

// Create query
Expand Down Expand Up @@ -145,7 +146,7 @@ public void run() throws ToolException, IOException, CatalogException {
+ " " + plotConfig.getTitle();

StopWatch stopWatch = StopWatch.createStarted();
String cmdline = DockerUtils.run(R_DOCKER_IMAGE, inputBindings, outputBinding, scriptParams, null);
String cmdline = DockerUtils.run(dockerImage, inputBindings, outputBinding, scriptParams, null);
logger.info("Docker command line: " + cmdline);
logger.info("Execution time: " + TimeUtils.durationToString(stopWatch));
} else {
Expand Down
Loading
Loading