From 33ad437bd9f7b00c03da35e4f73c9f8fb4911938 Mon Sep 17 00:00:00 2001 From: Ilia Tulchinsky Date: Mon, 25 Jul 2016 00:34:19 -0400 Subject: [PATCH] Moving to V1 of the API, updating all deps --- lib/alpn-boot-8.1.9.v20160720.jar | Bin 0 -> 54607 bytes pom.xml | 19 +++-- .../cloud/genomics/gatk/common/GA4GHUrl.java | 2 +- .../gatk/common/GenomicsDataSourceBase.java | 30 +++++--- .../gatk/common/GenomicsDataSourceFactory.java | 2 +- .../gatk/common/grpc/GenomicsDataSource.java | 77 ++++++--------------- .../gatk/common/rest/GenomicsDataSource.java | 52 +++++++------- .../genomics/gatk/htsjdk/SamReaderExample.java | 6 +- .../gatk/picard/runner/GA4GHPicardRunner.java | 2 +- src/main/scripts/example.sh | 6 +- src/main/scripts/mark_duplicates.sh | 2 +- src/main/scripts/mark_duplicates_cigar.sh | 2 +- src/main/scripts/run_picard.sh | 11 +-- src/main/scripts/view_sam_file.sh | 2 +- 14 files changed, 97 insertions(+), 116 deletions(-) create mode 100644 lib/alpn-boot-8.1.9.v20160720.jar diff --git a/lib/alpn-boot-8.1.9.v20160720.jar b/lib/alpn-boot-8.1.9.v20160720.jar new file mode 100644 index 0000000000000000000000000000000000000000..817cbc2b464920109cafa7346217a0ab7f389f65 GIT binary patch literal 54607 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 literal 0 HcmV?d00001 diff --git a/pom.xml b/pom.xml index d7cc2ad..61a0cda 100644 --- a/pom.xml +++ b/pom.xml @@ -7,7 +7,7 @@ Google Genomics Utils for GATK Common Java files for Google Genomics integrations with GATK/Picard/HTSJDK https://github.com/googlegenomics/gatk-tools-java - 1.5-SNAPSHOT + v1-0.6-SNAPSHOT Google @@ -55,7 +55,7 @@ https://oss.sonatype.org/service/local/staging/deploy/maven2/ - + @@ -96,10 +96,11 @@ google-http-client-jackson2 ${google.api.version} + com.google.apis google-api-services-genomics - v1beta2-rev9-1.19.0 + ${google.api.genomics.version} @@ -112,7 +113,7 @@ com.google.cloud.genomics google-genomics-utils - v1beta2-0.31 + v1-0.6 @@ -195,6 +196,11 @@ jcommander ${jcommander.version} + + io.grpc + grpc-all + ${io.grpc.version} + @@ -357,8 +363,9 @@ 6.1.26 2.4.2 4.11 - 1.19.0 - v1beta2-rev7-1.19.0 + 1.22.0 + v1-rev87-1.22.0 + 0.15.0 1.10.8 1.35 UTF-8 diff --git a/src/main/java/com/google/cloud/genomics/gatk/common/GA4GHUrl.java b/src/main/java/com/google/cloud/genomics/gatk/common/GA4GHUrl.java index 6c672b8..f88d63c 100644 --- a/src/main/java/com/google/cloud/genomics/gatk/common/GA4GHUrl.java +++ b/src/main/java/com/google/cloud/genomics/gatk/common/GA4GHUrl.java @@ -21,7 +21,7 @@ /** * Represents a GA4GH reads resource as a URL in the form of * ga4gh:///readsets///[start-end], - * e.g. ga4gh://www.googleapis.com/genomics/v1beta2/readgroupsets/CMvnhpKTFhD04eLE-q2yxnU/1/ + * e.g. ga4gh://genomics.googleapis.com/v1/readgroupsets/CMvnhpKTFhD04eLE-q2yxnU/1/ */ public class GA4GHUrl { int rangeStart = 0; diff --git a/src/main/java/com/google/cloud/genomics/gatk/common/GenomicsDataSourceBase.java b/src/main/java/com/google/cloud/genomics/gatk/common/GenomicsDataSourceBase.java index ceefe69..7185970 100644 --- a/src/main/java/com/google/cloud/genomics/gatk/common/GenomicsDataSourceBase.java +++ b/src/main/java/com/google/cloud/genomics/gatk/common/GenomicsDataSourceBase.java @@ -23,6 +23,8 @@ import java.io.File; import java.io.IOException; +import java.net.MalformedURLException; +import java.net.URL; import java.security.GeneralSecurityException; import java.util.logging.Logger; @@ -53,22 +55,30 @@ public GenomicsDataSourceBase(String rootUrl, this.rootUrl = rootUrl; } - protected GenomicsFactory getFactory() throws GeneralSecurityException, IOException { + protected GenomicsFactory getFactory() { if (factory == null) { factory = initGenomicsFactory(); } return factory; } - protected GenomicsFactory initGenomicsFactory() throws GeneralSecurityException, IOException { - VerificationCodeReceiver receiver = noLocalServer ? - new GooglePromptReceiver() : new LocalServerReceiver(); - return GenomicsFactory - .builder("genomics_java_client") - .setRootUrl(rootUrl) - .setServicePath("/") - .setVerificationCodeReceiver(Suppliers.ofInstance(receiver)) - .build(); + protected GenomicsFactory initGenomicsFactory() { + // Remove any path component from the root url - the code expects + // e.g. https://genomics.googleapis.com + URL url = null; + try { + url = new URL(rootUrl); + } catch (MalformedURLException e) { + // Will not set url + } + GenomicsFactory.Builder builder = GenomicsFactory + .builder("genomics_java_client"); + if (url != null) { + String rootUrlString = url.getProtocol() + "://" + url.getHost(); + LOG.info("Initializing genomics factory with root url " + rootUrlString); + builder.setRootUrl(rootUrlString); + } + return builder.build(); } static final String CLIENT_SECRETS_INSTRUCTIONS = diff --git a/src/main/java/com/google/cloud/genomics/gatk/common/GenomicsDataSourceFactory.java b/src/main/java/com/google/cloud/genomics/gatk/common/GenomicsDataSourceFactory.java index 4e19485..4a5f5d6 100644 --- a/src/main/java/com/google/cloud/genomics/gatk/common/GenomicsDataSourceFactory.java +++ b/src/main/java/com/google/cloud/genomics/gatk/common/GenomicsDataSourceFactory.java @@ -20,7 +20,7 @@ /** * Creates GenomicsApiDataSource objects, one per each root url - * (e.g. https://www.googleapis.com/genomics/v1beta2). + * (e.g. https://genomics.googleapis.com/v1). * Allows configuring settings such as client secrets file on a per * root url basis. * This class is abstract and is later specialized for API vs. GRPC. diff --git a/src/main/java/com/google/cloud/genomics/gatk/common/grpc/GenomicsDataSource.java b/src/main/java/com/google/cloud/genomics/gatk/common/grpc/GenomicsDataSource.java index 5b44adf..4c49354 100644 --- a/src/main/java/com/google/cloud/genomics/gatk/common/grpc/GenomicsDataSource.java +++ b/src/main/java/com/google/cloud/genomics/gatk/common/grpc/GenomicsDataSource.java @@ -15,11 +15,11 @@ */ package com.google.cloud.genomics.gatk.common.grpc; -import com.google.api.client.googleapis.auth.oauth2.GoogleClientSecrets; -import com.google.api.client.googleapis.util.Utils; -import com.google.auth.oauth2.UserCredentials; import com.google.cloud.genomics.gatk.common.GenomicsDataSourceBase; -import com.google.cloud.genomics.utils.GenomicsFactory.OfflineAuth; +import com.google.cloud.genomics.utils.CredentialFactory; +import com.google.cloud.genomics.utils.OfflineAuth; +import com.google.cloud.genomics.utils.grpc.GenomicsChannel; +import com.google.common.base.Strings; import com.google.common.collect.Lists; import com.google.common.collect.Maps; import com.google.common.collect.Sets; @@ -39,25 +39,14 @@ import com.google.genomics.v1.StreamReadsResponse; import com.google.genomics.v1.StreamingReadServiceGrpc; import com.google.genomics.v1.StreamingReadServiceGrpc.StreamingReadServiceBlockingStub; - import io.grpc.Channel; -import io.grpc.ChannelImpl; -import io.grpc.ClientInterceptors; -import io.grpc.auth.ClientAuthInterceptor; -import io.grpc.transport.netty.GrpcSslContexts; -import io.grpc.transport.netty.NegotiationType; -import io.grpc.transport.netty.NettyChannelBuilder; - +import io.grpc.ManagedChannel; import java.io.FileNotFoundException; -import java.io.FileReader; import java.io.IOException; import java.security.GeneralSecurityException; -import java.util.ArrayList; import java.util.Iterator; -import java.util.List; import java.util.Map; import java.util.Set; -import java.util.concurrent.Executors; /** * Manages Genomics GRPC Api initialization and provides Read iterator based @@ -66,8 +55,7 @@ public class GenomicsDataSource extends GenomicsDataSourceBase { /** gRPC channel used for faster access to Genomics API */ - private Channel channel; - private ChannelImpl channelImpl; + private ManagedChannel channel; public GenomicsDataSource(String rootUrl, String clientSecretsFilename, @@ -83,41 +71,19 @@ private Channel getChannel() throws FileNotFoundException, IOException, GeneralS return channel; } - private Channel initGenomicsChannel() throws FileNotFoundException, IOException, GeneralSecurityException { - checkParamsForAuth(AUTH_REQUIREMENTS.CLIENT_SECRETS_ONLY); - final GoogleClientSecrets secrets = GoogleClientSecrets.load( - Utils.getDefaultJsonFactory(), - new FileReader(clientSecretsFilename)); - final OfflineAuth auth = getFactory() - .getOfflineAuthFromClientSecretsFile(clientSecretsFilename); - final UserCredentials userCredentials = new UserCredentials( - secrets.getInstalled().getClientId(), - secrets.getInstalled().getClientSecret(), - auth.refreshToken); - - // Java 8's implementation of GCM ciphers is extremely slow. Therefore we disable - // them here. - List defaultCiphers = - GrpcSslContexts.forClient().ciphers(null).build().cipherSuites(); - List performantCiphers = new ArrayList<>(); - for (String cipher : defaultCiphers) { - if (!cipher.contains("GCM")) { - performantCiphers.add(cipher); - } + private ManagedChannel initGenomicsChannel() throws FileNotFoundException, IOException, GeneralSecurityException { + if (clientSecretsFilename != null && clientSecretsFilename.length() > 0) { + return GenomicsChannel.fromOfflineAuth( + new OfflineAuth( + CredentialFactory.getCredentialFromClientSecrets( + clientSecretsFilename, + "genomics_java_client"))); } - channelImpl = NettyChannelBuilder.forAddress("genomics.googleapis.com", 443) - .negotiationType(NegotiationType.TLS) - .streamWindowSize(1000000) - .sslContext(GrpcSslContexts.forClient().ciphers(performantCiphers).build()) - .build(); - /*userCredentials = userCredentials.createScoped( - Arrays.asList("https://www.googleapis.com/auth/genomics"));*/ - ClientAuthInterceptor interceptor = new ClientAuthInterceptor(userCredentials, - Executors.newSingleThreadExecutor()); - return ClientInterceptors.intercept(channelImpl, interceptor); + // API Key is not sufficient for StreamReads request. + // TODO: All support for non default credentials will be removed in a subsequent PR. + return GenomicsChannel.fromDefaultCreds(); } - @Override public ReadIteratorResource getReads( @@ -183,7 +149,7 @@ public ReadIteratorResource getReads( private Map getReferences(ReadGroupSet readGroupSet) throws IOException, GeneralSecurityException { Set referenceSetIds = Sets.newHashSet(); - if (readGroupSet.getReferenceSetId() != null && !readGroupSet.getReferenceSetId().isEmpty()) { + if (!Strings.isNullOrEmpty(readGroupSet.getReferenceSetId())) { LOG.info("Found reference set from read group set " + readGroupSet.getReferenceSetId()); referenceSetIds.add(readGroupSet.getReferenceSetId()); @@ -191,7 +157,7 @@ public ReadIteratorResource getReads( if (readGroupSet.getReadGroupsCount() > 0) { LOG.info("Found read groups"); for (ReadGroup readGroup : readGroupSet.getReadGroupsList()) { - if (readGroup.getReferenceSetId() != null && !readGroup.getReferenceSetId().isEmpty()) { + if (!Strings.isNullOrEmpty(readGroup.getReferenceSetId())) { LOG.info("Found reference set from read group: " + readGroup.getReferenceSetId()); referenceSetIds.add(readGroup.getReferenceSetId()); @@ -217,7 +183,7 @@ public ReadIteratorResource getReads( GetReferenceRequest getReferenceRequest = GetReferenceRequest .newBuilder().setReferenceId(referenceId).build(); Reference reference = referenceSetStub.getReference(getReferenceRequest); - if (reference.getName() != null && !reference.getName().isEmpty()) { + if (!Strings.isNullOrEmpty(reference.getName())) { references.put(reference.getName(), reference); LOG.fine("Adding reference " + reference.getName()); } @@ -316,9 +282,8 @@ public void remove() { @Override public void close() { - if (channelImpl != null ) { - channelImpl.shutdown(); - channelImpl = null; + if (channel != null ) { + channel.shutdown(); } channel = null; } diff --git a/src/main/java/com/google/cloud/genomics/gatk/common/rest/GenomicsDataSource.java b/src/main/java/com/google/cloud/genomics/gatk/common/rest/GenomicsDataSource.java index 6d4dca6..a8a406a 100644 --- a/src/main/java/com/google/cloud/genomics/gatk/common/rest/GenomicsDataSource.java +++ b/src/main/java/com/google/cloud/genomics/gatk/common/rest/GenomicsDataSource.java @@ -15,12 +15,9 @@ */ package com.google.cloud.genomics.gatk.common.rest; -import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport; import com.google.api.client.googleapis.json.GoogleJsonResponseException; -import com.google.api.client.http.HttpRequest; -import com.google.api.client.http.HttpRequestInitializer; -import com.google.api.client.json.jackson2.JacksonFactory; import com.google.api.services.genomics.Genomics; +import com.google.api.services.genomics.model.Program; import com.google.api.services.genomics.model.Read; import com.google.api.services.genomics.model.ReadGroup; import com.google.api.services.genomics.model.ReadGroupSet; @@ -29,11 +26,11 @@ import com.google.api.services.genomics.model.SearchReadsRequest; import com.google.cloud.genomics.gatk.common.GenomicsDataSourceBase; import com.google.cloud.genomics.utils.Paginator; -import com.google.cloud.genomics.utils.Paginator.ShardBoundary; +import com.google.cloud.genomics.utils.ShardBoundary; +import com.google.common.base.Strings; import com.google.common.collect.Lists; import com.google.common.collect.Maps; import com.google.common.collect.Sets; - import java.io.File; import java.io.IOException; import java.security.GeneralSecurityException; @@ -76,22 +73,8 @@ private Genomics initGenomicsApi() throws GeneralSecurityException, IOException LOG.info("Using API key"); return getFactory().fromApiKey(apiKey); } - } else { - final Genomics.Builder builder = new Genomics - .Builder( - GoogleNetHttpTransport.newTrustedTransport(), - JacksonFactory.getDefaultInstance(), - new HttpRequestInitializer() { - @Override public void initialize(HttpRequest httpRequest) throws IOException { - httpRequest.setReadTimeout(20000); - httpRequest.setConnectTimeout(20000); - } - }) - .setApplicationName("genomics_java_client") - .setRootUrl(rootUrl) - .setServicePath("/"); - return builder.build(); - } + } + return getFactory().fromApplicationDefaultCredential(); } @Override @@ -106,6 +89,19 @@ public ReadIteratorResource getReads(String readsetId, ReadGroupSet readGroupSet = stub.readgroupsets().get(readsetId).execute(); String datasetId = readGroupSet.getDatasetId(); LOG.info("Found readset " + readsetId + ", dataset " + datasetId); + // Fix up PP in Programs + + if (readGroupSet.getReadGroups() != null) { + for (ReadGroup readGroup : readGroupSet.getReadGroups()) { + if (readGroup.getPrograms() != null) { + for (Program PG : readGroup.getPrograms()) { + if (PG.getPrevProgramId() != null && PG.getPrevProgramId().length() == 0) { + PG.setPrevProgramId(null); + } + } + } + } + } final Map references = getReferences(readGroupSet); final Reference reference = references.get(sequenceName); @@ -121,7 +117,7 @@ public ReadIteratorResource getReads(String readsetId, if (sequenceName.isEmpty()) { unmappedReads = getUnmappedMatesOfMappedReads(readsetId); } - Paginator.Reads searchReads = Paginator.Reads.create(stub, ShardBoundary.OVERLAPS); + Paginator.Reads searchReads = Paginator.Reads.create(stub, ShardBoundary.Requirement.OVERLAPS); SearchReadsRequest readRequest = new SearchReadsRequest() .setReadGroupSetIds(Arrays.asList(readsetId)) .setReferenceName(sequenceName) @@ -153,15 +149,15 @@ public ReadIteratorResource getReads(String readsetId, private Map getReferences(ReadGroupSet readGroupSet) throws IOException, GeneralSecurityException { Set referenceSetIds = Sets.newHashSet(); - if (readGroupSet.getReferenceSetId() != null) { - LOG.info("Found reference set from read group set " + + if (!Strings.isNullOrEmpty(readGroupSet.getReferenceSetId())) { + LOG.info("Found reference set from read group set: " + readGroupSet.getReferenceSetId()); referenceSetIds.add(readGroupSet.getReferenceSetId()); } if (readGroupSet.getReadGroups() != null) { LOG.info("Found read groups"); for (ReadGroup readGroup : readGroupSet.getReadGroups()) { - if (readGroup.getReferenceSetId() != null) { + if (!Strings.isNullOrEmpty(readGroup.getReferenceSetId())) { LOG.info("Found reference set from read group: " + readGroup.getReferenceSetId()); referenceSetIds.add(readGroup.getReferenceSetId()); @@ -179,7 +175,7 @@ public ReadIteratorResource getReads(String readsetId, for (String referenceId : referenceSet.getReferenceIds()) { LOG.fine("Getting reference " + referenceId); Reference reference = getApi().references().get(referenceId).execute(); - if (reference.getName() != null) { + if (!Strings.isNullOrEmpty(reference.getName())) { references.put(reference.getName(), reference); LOG.fine("Adding reference " + reference.getName()); } @@ -196,7 +192,7 @@ protected UnmappedReads createUnmappedReads() { @Override protected Iterable getUnmappedReadsIterator(String readsetId) throws GeneralSecurityException, IOException { final Paginator.Reads searchUnmappedReads = - Paginator.Reads.create(getApi(), ShardBoundary.OVERLAPS); + Paginator.Reads.create(getApi(), ShardBoundary.Requirement.OVERLAPS); final SearchReadsRequest unmappedReadRequest = new SearchReadsRequest() .setReadGroupSetIds(Arrays.asList(readsetId)) .setReferenceName("*"); diff --git a/src/main/java/com/google/cloud/genomics/gatk/htsjdk/SamReaderExample.java b/src/main/java/com/google/cloud/genomics/gatk/htsjdk/SamReaderExample.java index 1db89e7..bf90444 100644 --- a/src/main/java/com/google/cloud/genomics/gatk/htsjdk/SamReaderExample.java +++ b/src/main/java/com/google/cloud/genomics/gatk/htsjdk/SamReaderExample.java @@ -34,15 +34,15 @@ * * To run this we need to specify the custom reader factory for HTSJDK and set * client_secrets file path for Genomics API: - * -Dsamjdk.custom_reader=https://www.googleapis.com/genomics,com.google.cloud.genomics.gatk.htsjdk.GA4GHReaderFactory + * -Dsamjdk.custom_reader=https://genomics.googleapis.com,com.google.cloud.genomics.gatk.htsjdk.GA4GHReaderFactory * -Dga4gh.client_secrets=. * * Optionally specify -Dga4gh.using_grpc=true, to use GRPC based Api access. */ public class SamReaderExample { static String GA4GH_URL = - "https://www.googleapis.com/genomics/v1beta2/readgroupsets/CMvnhpKTFhD3he72j4KZuyc/chr17/41196311-42677499"; - //"https://www.googleapis.com/genomics/v1beta2/readgroupsets/CK256frpGBD44IWHwLP22R4/"; + "https://genomics.googleapis.com/v1/readgroupsets/CMvnhpKTFhD3he72j4KZuyc/chr17/41196311-42677499"; + //"https://genomics.googleapis.com/v1/readgroupsets/CK256frpGBD44IWHwLP22R4/"; public static void main(String[] args) { try { SamReaderFactory factory = SamReaderFactory.makeDefault(); diff --git a/src/main/java/com/google/cloud/genomics/gatk/picard/runner/GA4GHPicardRunner.java b/src/main/java/com/google/cloud/genomics/gatk/picard/runner/GA4GHPicardRunner.java index 6350335..f3d2b03 100644 --- a/src/main/java/com/google/cloud/genomics/gatk/picard/runner/GA4GHPicardRunner.java +++ b/src/main/java/com/google/cloud/genomics/gatk/picard/runner/GA4GHPicardRunner.java @@ -45,7 +45,7 @@ @Parameter(names = "--root_url", description = "set the Genomics API root URL", hidden = true) - public String rootUrl = "https://www.googleapis.com/genomics/v1beta2"; + public String rootUrl = "https://genomics.googleapis.com/v1"; @Parameter(names = "--nolocalserver", description = "Disable the starting up of a local server for the auth flows", diff --git a/src/main/scripts/example.sh b/src/main/scripts/example.sh index edd3802..f65c0f9 100755 --- a/src/main/scripts/example.sh +++ b/src/main/scripts/example.sh @@ -5,16 +5,16 @@ then # Use this for Java 7 # MAVEN_OPTS="-Xbootclasspath/p:./lib/alpn-boot-7.1.3.v20150130.jar" \ # Use this for Java 8 -MAVEN_OPTS="-Xbootclasspath/p:./lib/alpn-boot-8.1.3.v20150130.jar" \ +MAVEN_OPTS="-Xbootclasspath/p:./lib/alpn-boot-8.1.9.v20160720.jar" \ mvn exec:java \ -Dexec.mainClass=com.google.cloud.genomics.gatk.htsjdk.SamReaderExample \ - -Dsamjdk.custom_reader=https://www.googleapis.com/genomics,com.google.cloud.genomics.gatk.htsjdk.GA4GHReaderFactory \ + -Dsamjdk.custom_reader=https://genomics.googleapis.com,com.google.cloud.genomics.gatk.htsjdk.GA4GHReaderFactory \ -Dga4gh.client_secrets=../client_secrets.json \ -Dga4gh.using_grpc=true else mvn exec:java \ -Dexec.mainClass=com.google.cloud.genomics.gatk.htsjdk.SamReaderExample \ - -Dsamjdk.custom_reader=https://www.googleapis.com/genomics,com.google.cloud.genomics.gatk.htsjdk.GA4GHReaderFactory \ + -Dsamjdk.custom_reader=https://genomics.googleapis.com,com.google.cloud.genomics.gatk.htsjdk.GA4GHReaderFactory \ -Dga4gh.client_secrets=../client_secrets.json \ -Dga4gh.using_grpc=false fi diff --git a/src/main/scripts/mark_duplicates.sh b/src/main/scripts/mark_duplicates.sh index f3a738f..d366a1c 100755 --- a/src/main/scripts/mark_duplicates.sh +++ b/src/main/scripts/mark_duplicates.sh @@ -4,6 +4,6 @@ METRICS_FILE=$(readlink -f ../../../../ex1_deduped_picard_api.metrics) ./run_picard.sh \ MarkDuplicates \ -INPUT=https://www.googleapis.com/genomics/v1beta2/readgroupsets/CK256frpGBD44IWHwLP22R4/ \ +INPUT=https://genomics.googleapis.com/v1/readgroupsets/CK256frpGBD44IWHwLP22R4/ \ OUTPUT=$OUTPUT_FILE \ METRICS_FILE=$METRICS_FILE diff --git a/src/main/scripts/mark_duplicates_cigar.sh b/src/main/scripts/mark_duplicates_cigar.sh index 0d44440..3db44d2 100755 --- a/src/main/scripts/mark_duplicates_cigar.sh +++ b/src/main/scripts/mark_duplicates_cigar.sh @@ -4,6 +4,6 @@ METRICS_FILE=$(readlink -f ../../../../ex1_deduped_picard_cigar_api.metrics) ./run_picard.sh \ MarkDuplicatesWithMateCigar \ -INPUT=https://www.googleapis.com/genomics/v1beta2/readgroupsets/CK256frpGBD44IWHwLP22R4/ \ +INPUT=https://genomics.googleapis.com/v1/readgroupsets/CK256frpGBD44IWHwLP22R4/ \ OUTPUT=$OUTPUT_FILE \ METRICS_FILE=$METRICS_FILE diff --git a/src/main/scripts/run_picard.sh b/src/main/scripts/run_picard.sh index 5537e12..9f3fc4d 100755 --- a/src/main/scripts/run_picard.sh +++ b/src/main/scripts/run_picard.sh @@ -11,17 +11,20 @@ # If your setup is different, please modify paths below. GATK_TOOLS_JAVA_JAR=$(readlink -f `dirname $0`/../../../target/gatk-tools-java-*-SNAPSHOT-jar-with-dependencies.jar) CLIENT_SECRETS=$(readlink -f `dirname $0`/../../../../client_secrets.json) -PICARD_JAR=$(readlink -f `dirname $0`/../../../../picard/dist/picard.jar) - +PICARD_JAR=$(readlink -f `dirname $0`/../../../../picard/build/libs/picard*all.jar) +ALPN_JAR=$(readlink -f `dirname $0`/../../../lib/alpn-boot-8.1.9.v20160720.jar) echo Running Picard from $PICARD_JAR echo Using gatk-tools-java from $GATK_TOOLS_JAVA_JAR -echo Using client_secrets form $CLIENT_SECRETS +echo Using client_secrets from $CLIENT_SECRETS +echo Using ALPN from $ALPN_JAR java -jar \ --Dsamjdk.custom_reader=https://www.googleapis.com/genomics,\ +-Xbootclasspath/p:$ALPN_JAR:$GATK_TOOLS_JAVA_JAR \ +-Dsamjdk.custom_reader=https://genomics.googleapis.com,\ com.google.cloud.genomics.gatk.htsjdk.GA4GHReaderFactory,\ $GATK_TOOLS_JAVA_JAR \ -Dga4gh.client_secrets=$CLIENT_SECRETS \ +-Dga4gh.using_grpc=true \ $PICARD_JAR \ "$@" \ VERBOSITY=DEBUG QUIET=false \ No newline at end of file diff --git a/src/main/scripts/view_sam_file.sh b/src/main/scripts/view_sam_file.sh index 8124513..f916b1b 100755 --- a/src/main/scripts/view_sam_file.sh +++ b/src/main/scripts/view_sam_file.sh @@ -1,4 +1,4 @@ #!/bin/bash `dirname $0`/run_picard.sh \ ViewSam \ -INPUT=https://www.googleapis.com/genomics/v1beta2/readgroupsets/CK256frpGBD44IWHwLP22R4/ +INPUT=https://genomics.googleapis.com/v1/readgroupsets/CK256frpGBD44IWHwLP22R4/