[med-svn] [Git][med-team/libgoby-java][master] 13 commits: Using the Debian packaged implementation of bzip2

Pierre Gruet gitlab at salsa.debian.org
Tue Nov 10 17:06:10 GMT 2020



Pierre Gruet pushed to branch master at Debian Med / libgoby-java


Commits:
a4e59332 by Pierre Gruet at 2020-10-19T17:32:32+02:00
Using the Debian packaged implementation of bzip2

- - - - -
0e08c04c by Pierre Gruet at 2020-10-19T17:33:15+02:00
Changing old invocations of classes of fastutil

- - - - -
812a84ea by Pierre Gruet at 2020-10-19T17:33:58+02:00
Using GeneratedMessageV3 of protobuf instead of GeneratedMessage

- - - - -
acd6c100 by Pierre Gruet at 2020-10-19T17:35:17+02:00
Adding dependencies to build goby-io

- - - - -
61862a5e by Pierre Gruet at 2020-11-10T17:55:19+01:00
Updating dependencies and their management in d/maven.rules and d/maven.ignoreRules

- - - - -
65957a40 by Pierre Gruet at 2020-11-10T18:00:10+01:00
Using classes of commons-cli instead of unpackaged ones

- - - - -
e3db8e80 by Pierre Gruet at 2020-11-10T18:01:06+01:00
Using the correct SamReader api

- - - - -
b8d5e182 by Pierre Gruet at 2020-11-10T18:01:44+01:00
Computing the Fisher p-value with a Debian-packaged tool

- - - - -
e2f3d3b9 by Pierre Gruet at 2020-11-10T18:02:30+01:00
Reading class GeneTranscriptRelationships from Goby archive

- - - - -
cfd4e5b3 by Pierre Gruet at 2020-11-10T18:03:05+01:00
Catch the IOException launched by close() method of LineIterator

- - - - -
3a6ba786 by Pierre Gruet at 2020-11-10T18:03:59+01:00
Modify a few tests when requiring unpackaged tools

- - - - -
295b3cbb by Pierre Gruet at 2020-11-10T18:05:35+01:00
Creating a symlink to test-data to perform the tests

- - - - -
1e72a3f1 by Pierre Gruet at 2020-11-10T18:05:51+01:00
Updating the TODO in d/changelog

- - - - -


16 changed files:

- debian/changelog
- debian/control
- debian/maven.ignoreRules
- debian/maven.rules
- + debian/patches/adapting_to_old_fastutil.patch
- debian/patches/adding_dependencies.patch
- + debian/patches/catch_IOException_LineIterator.patch
- + debian/patches/computing_Fisher_test_pvalue.patch
- + debian/patches/exclude_not_runnable_tests.patch
- + debian/patches/inclusions_in_SplitTranscriptsMode.patch
- debian/patches/series
- + debian/patches/using_GeneratedMessageV3.patch
- + debian/patches/using_commons-cli.patch
- + debian/patches/using_correct_SamReader_api.patch
- + debian/patches/using_jbzip2.patch
- debian/rules


Changes:

=====================================
debian/changelog
=====================================
@@ -2,14 +2,12 @@ libgoby-java (3.3.1+dfsg-1) UNRELEASED; urgency=medium
 
   * Initial release (Closes: #<bug>)
   TODO:
-    - at least four packages are missing:
-      * edu.cornell.med.icb.identifier
-      * it.unimi.dsi.lang
-      * it.unimi.dsi.logging
-      * it.unimi.dsi.io
+    - Packaging variationanalysis by Campagnelab, needed by goby.
+    - Go on investigating non-passing tests
+      (begun in debian/patches/exclude_not_runnable_tests.patch)
     - I have put some dependencies in debian/maven.ignoreRules but it may be
       wrong.
     - See also https://lists.debian.org/debian-med/2013/02/msg00152.html,
       although written for a previous upstream version of goby.
 
- -- Pierre Gruet <pgtdebian at free.fr>  Mon, 24 Aug 2020 11:48:00 +0200
+ -- Pierre Gruet <pgtdebian at free.fr>  Tue, 10 Nov 2020 17:50:48 +0100


=====================================
debian/control
=====================================
@@ -17,6 +17,7 @@ Build-Depends: debhelper-compat (= 13),
                libcommons-lang-java,
                libcommons-logging-java,
                libcommons-math-java,
+               libcommons-cli-java,
                liblog4j1.2-java,
                libexec-maven-plugin-java,
                libmaven-assembly-plugin-java,
@@ -29,7 +30,19 @@ Build-Depends: debhelper-compat (= 13),
                libhtsjdk-java,
                libfastutil-java,
                protobuf-compiler,
-               libjsap-java
+               libjsap-java,
+               libdsiutils-java,
+               libicb-utils-java,
+               libreflections-java,
+               libpj-java,
+               libprotobuf-dev,
+               libpcre3-dev,
+               pkg-config,
+               r-cran-rjava,
+               libeasymock-java <!nocheck>,
+               junit4 <!nocheck>,
+               testng <!nocheck>,
+               libpicard-java <!nocheck>
 Standards-Version: 4.5.0
 Vcs-Browser: https://anonscm.debian.org/cgit/debian-med/libgoby-java.git
 Vcs-Git: https://anonscm.debian.org/git/debian-med/libgoby-java.git


=====================================
debian/maven.ignoreRules
=====================================
@@ -3,7 +3,9 @@ org.sonatype.plugins nexus-staging-maven-plugin * * * *
 kr.motd.maven os-maven-plugin * * * *
 pl.project13.maven git-commit-id-plugin * * * *
 org.apache.maven.plugins maven-verifier-plugin * * * *
-org.campagnelab.icb icb-utils * * * *
-it.unimi.dsi dsiutils * * * *
-org.reflections reflections * * * *
 com.github.lucarosellini.rJava JRI * * * *
+org.deeplearning4j * * * * *
+edu.mssm.crover cli * * * *
+edu.cornell.med.icb tisim-api * * * *
+org.nd4j * * * * *
+junit-addons junit-addons * * * *


=====================================
debian/maven.rules
=====================================
@@ -5,3 +5,10 @@ org.apache.maven.plugins maven-antrun-plugin jar s/.*/1.8/ * *
 org.codehaus.mojo build-helper-maven-plugin jar s/.*/3.0.0/ * *
 org.apache.maven.plugins maven-dependency-plugin jar s/.*/3.1.1/ * *
 org.apache.maven.plugins maven-javadoc-plugin jar s/.*/3.0.1/ * *
+it.unimi.dsi dsiutils jar s/.*/debian/ * *
+org.campagnelab.icb icb-utils jar s/.*/debian/ * *
+org.reflections reflections jar s/.*/debian/ * *
+s/org.campagnelab.ext/com.martiansoftware/ jsap jar s/.*/debian/ * *
+junit junit jar s/.*/4.x/ * *
+org.easymock easymock jar s/.*/debian/ * *
+com.github.samtools htsjdk jar s/.*/debian/ * *


=====================================
debian/patches/adapting_to_old_fastutil.patch
=====================================
@@ -0,0 +1,40 @@
+--- a/goby-distribution/src/main/java/org/campagnelab/goby/alignments/ConcatSortedAlignmentReader.java
++++ b/goby-distribution/src/main/java/org/campagnelab/goby/alignments/ConcatSortedAlignmentReader.java
+@@ -20,7 +20,7 @@
+ 
+ package org.campagnelab.goby.alignments;
+ 
+-import it.unimi.dsi.fastutil.AbstractPriorityQueue;
++import it.unimi.dsi.fastutil.PriorityQueue;
+ import it.unimi.dsi.fastutil.objects.ObjectArrayPriorityQueue;
+ import it.unimi.dsi.fastutil.objects.ObjectHeapPriorityQueue;
+ import org.apache.commons.logging.Log;
+@@ -40,7 +40,7 @@
+  */
+ public class ConcatSortedAlignmentReader extends ConcatAlignmentReader {
+ 
+-    AbstractPriorityQueue<Bucket> entryHeap;
++    PriorityQueue<Bucket> entryHeap;
+     private static AlignmentPositionComparator comparator = new AlignmentPositionComparator();
+     private boolean[] nextLoadedForReader;
+     private Bucket[] buckets;
+--- a/goby-distribution/src/main/java/org/campagnelab/goby/alignments/processors/LocalSortProcessor.java
++++ b/goby-distribution/src/main/java/org/campagnelab/goby/alignments/processors/LocalSortProcessor.java
+@@ -21,7 +21,7 @@
+ import edu.cornell.med.icb.identifier.IndexedIdentifier;
+ import org.campagnelab.goby.alignments.Alignments;
+ import org.campagnelab.goby.reads.RandomAccessSequenceInterface;
+-import it.unimi.dsi.fastutil.AbstractPriorityQueue;
++import it.unimi.dsi.fastutil.PriorityQueue;
+ import it.unimi.dsi.fastutil.objects.ObjectHeapPriorityQueue;
+ 
+ import java.io.IOException;
+@@ -38,7 +38,7 @@
+  *         Time: 10:49 AM
+  */
+ public class LocalSortProcessor implements AlignmentProcessorInterface {
+-    AbstractPriorityQueue<Alignments.AlignmentEntry> entryHeap;
++    PriorityQueue<Alignments.AlignmentEntry> entryHeap;
+     AlignmentProcessorInterface delegate;
+     /**
+      * We store at most alignments for 30 consecutive genomic positions. 30 is chosen because it is much larger than


=====================================
debian/patches/adding_dependencies.patch
=====================================
@@ -1,6 +1,6 @@
 Description: Adding missing dependencies to goby-io/pom.xml
 Author: Pierre Gruet <pgtdebian at free.fr>
-Last-Update: 2020-08-24
+Last-Update: 2020-10-31
 
 --- a/goby-io/pom.xml
 +++ b/goby-io/pom.xml
@@ -29,3 +29,59 @@ Last-Update: 2020-08-24
   </dependencies>
  
  </project>
+--- a/goby-distribution/pom.xml
++++ b/goby-distribution/pom.xml
+@@ -140,6 +140,11 @@
+             <version>2.6</version>
+         </dependency>
+         <dependency>
++            <groupId>commons-cli</groupId>
++            <artifactId>commons-cli</artifactId>
++            <version>debian</version>
++        </dependency>
++        <dependency>
+             <groupId>commons-logging</groupId>
+             <artifactId>commons-logging</artifactId>
+             <version>1.1.1</version>
+@@ -193,7 +198,9 @@
+         <dependency>
+             <groupId>org.rosuda.REngine</groupId>
+             <artifactId>REngine</artifactId>
+-            <version>2.1.0</version>
++            <version>debian</version>
++            <scope>system</scope>
++            <systemPath>/usr/lib/R/site-library/rJava/jri/JRI.jar</systemPath>
+         </dependency>
+         <dependency>
+             <groupId>com.github.lucarosellini.rJava</groupId>
+@@ -240,9 +247,7 @@
+         <dependency>
+             <groupId>edu.rit.pj</groupId>
+             <artifactId>pj</artifactId>
+-            <version>1.0</version>
+-            <scope>system</scope>
+-            <systemPath>${basedir}/../lib/pj20091226.jar</systemPath>
++            <version>debian</version>
+         </dependency>
+         <dependency>
+             <groupId>edu.mssm.crover</groupId>
+@@ -339,10 +344,18 @@
+         </dependency>
+ 
+         <dependency>
++            <groupId>org.testng</groupId>
++            <artifactId>testng</artifactId>
++            <version>debian</version>
++            <scope>test</scope>
++        </dependency>
++
++        <dependency>
+             <groupId>com.github.broadinstitute</groupId>
+             <artifactId>picard</artifactId>
+             <version>2.6.0</version>
+-            <scope>test</scope>
++            <scope>system</scope>
++            <systemPath>/usr/share/java/picard.jar</systemPath>
+         </dependency>
+         <dependency>
+             <groupId>it.unimi.dsi</groupId>


=====================================
debian/patches/catch_IOException_LineIterator.patch
=====================================
@@ -0,0 +1,21 @@
+Description: Catch the IOException launched by close() method of LineIterator
+Author: Pierre Gruet <pgtdebian at free.fr>
+Forwarded: no
+Last-Update: 2020-11-03
+
+--- a/goby-distribution/src/main/java/org/campagnelab/goby/modes/EmpiricalPMode.java
++++ b/goby-distribution/src/main/java/org/campagnelab/goby/modes/EmpiricalPMode.java
+@@ -342,7 +342,12 @@
+             Object next = it.next();
+             lineCount++;
+         }
+-        it.close();
++        try {
++            it.close();
++        } catch (IOException e) {
++            System.err.println("Could not close LineIterator on " + inputFilename);
++            System.exit(1);
++        }
+         return lineCount;
+     }
+ 


=====================================
debian/patches/computing_Fisher_test_pvalue.patch
=====================================
@@ -0,0 +1,33 @@
+Description: Computing the Fisher p-value with a Debian-packaged tool
+Author: Pierre Gruet <pgtdebian at free.fr>
+Forwarded: not-needed
+Last-Update: 2020-11-01
+
+--- a/goby-distribution/src/main/java/org/campagnelab/goby/stats/FisherExactTestCalculator.java
++++ b/goby-distribution/src/main/java/org/campagnelab/goby/stats/FisherExactTestCalculator.java
+@@ -18,8 +18,8 @@
+ 
+ package org.campagnelab.goby.stats;
+ 
+-import gominer.Fisher;
+ import it.unimi.dsi.fastutil.objects.ObjectArraySet;
++import org.campagnelab.goby.R.FisherExact;
+ 
+ /**
+  * Calculates Fisher exact test P-value for an observed count difference between comparison
+@@ -98,8 +98,13 @@
+          * @return 2-tailed gominer.Fisher p value
+          */
+         // public double fisher(final int totalChanged, final int changedInNode, final int total, final int inNode) {
+-        final Fisher fisher = new Fisher();
+-        final double pValue = fisher.fisher(totalCountInA, sumCountInA, totalCountInA + totalCountInB, sumCountInA + sumCountInB);
++        int count00 = sumCountInA;
++        int count10 = totalCountInA - sumCountInA;
++        int count01 = sumCountInB;
++        int count11 = sumCountInA + totalCountInB - count00 - count01;
++        final FisherExact.Result result =
++                FisherExact.fexact(count00, count10, count01, count11);
++        final double pValue = result.getPValue();
+ 
+ 
+         /* Test : fisher.fisher(40,10,100,30)=


=====================================
debian/patches/exclude_not_runnable_tests.patch
=====================================
@@ -0,0 +1,123 @@
+Description: modify a few tests when requiring unpackaged tools
+ junitx.framework is not packaged, the test files TestSplicedSamHelper.java and
+ TestAlignmentReader.java, that use it, are deactivated in
+ goby-distribution/pom.xml.
+ We also exclude TestGobyPaperTop5000s.java in this pom, as data files that it
+ uses are not provided in the source.
+ Two tests in TestSamRecordParser are skipped for the same reason.
+ gominer is not packaged, the tests using it are slightly modified.
+Author: Pierre Gruet <pgtdebian at free.fr>
+Forwarded: no
+Last-Update: 2020-11-08
+
+--- a/goby-distribution/pom.xml
++++ b/goby-distribution/pom.xml
+@@ -39,6 +39,10 @@
+                 <configuration>
+                     <source>${java.version}</source>
+                     <target>${java.version}</target>
++                    <testExcludes>
++                        <exclude>**/TestSplicedSamHelper.java</exclude>
++                        <exclude>**/TestAlignmentReader.java</exclude>
++                    </testExcludes>
+                 </configuration>
+             </plugin>
+             <plugin>
+@@ -73,6 +77,16 @@
+                 </executions>
+             </plugin>
+             <plugin>
++                <groupId>org.apache.maven.plugins</groupId>
++                <artifactId>maven-surefire-plugin</artifactId>
++                <version>debian</version>
++                <configuration>
++                    <excludes>
++                        <exclude>**/TestGobyPaperTop5000s.java</exclude>
++                    </excludes>
++                </configuration>
++            </plugin>
++            <plugin>
+                 <artifactId>maven-assembly-plugin</artifactId>
+                 <version>2.6</version>
+                 <configuration>
+--- a/goby-distribution/src/test/java/org/campagnelab/goby/R/TestFisherExact.java
++++ b/goby-distribution/src/test/java/org/campagnelab/goby/R/TestFisherExact.java
+@@ -18,7 +18,6 @@
+ 
+ package org.campagnelab.goby.R;
+ 
+-import gominer.Fisher;
+ import org.apache.commons.lang.ArrayUtils;
+ import org.junit.AfterClass;
+ import static org.junit.Assert.assertEquals;
+@@ -151,18 +150,6 @@
+                 result.getAlternativeHypothesis());
+     }
+ 
+-    /**
+-     * Validates that the R implementation returns the same p-value for a simple
+-     * example set.
+-     */
+-    @Test
+-    public void twoTailed() {
+-        final Fisher gominer = new Fisher();
+-        final double gominerPValue = gominer.fisher(40, 10, 100, 30);
+-
+-        final double fisherExactPValue = FisherExact.twoTailed(40, 10, 100, 30);
+-        assertEquals("R result does not match gominer", gominerPValue, fisherExactPValue, EPSILON);
+-    }
+ 
+     /**
+      * If R libraries are not set up properly these tests cannot be run.
+--- a/goby-distribution/src/test/java/org/campagnelab/goby/stats/TestStatistics.java
++++ b/goby-distribution/src/test/java/org/campagnelab/goby/stats/TestStatistics.java
+@@ -19,7 +19,6 @@
+ package org.campagnelab.goby.stats;
+ 
+ import org.campagnelab.goby.R.FisherExact;
+-import gominer.Fisher;
+ import it.unimi.dsi.fastutil.objects.ObjectArrayList;
+ import it.unimi.dsi.lang.MutableString;
+ import org.apache.commons.math.MathException;
+@@ -371,15 +370,11 @@
+         assertEquals("fisher test equal expected result", 0.5044757698516504, results.getStatistic(info, fisher.statisticIds.get(0)), 0.001);
+ 
+ 
+-        final Fisher fisherTest = new Fisher();
+         final int totalCountInA = 1700;
+         final int totalCountInB = 170; // equal total in each group
+         final int sumCountInA = 90;
+         final int sumCountInB = 45; // half the counts in sample B
+ 
+-        fisherTest.fisher(totalCountInA, sumCountInA, totalCountInA + totalCountInB, sumCountInA + sumCountInB);
+-
+-        final double pValue = fisherTest.getTwotail();
+         final double proportionTotalA = divide(totalCountInA, (totalCountInA + totalCountInB));
+         final double proportionTotalB = divide(totalCountInB, (totalCountInA + totalCountInB));
+         final ChiSquareTest chisquare = new ChiSquareTestImpl();
+--- a/goby-distribution/src/test/java/org/campagnelab/goby/readers/sam/TestSamRecordParser.java
++++ b/goby-distribution/src/test/java/org/campagnelab/goby/readers/sam/TestSamRecordParser.java
+@@ -29,6 +29,7 @@
+ import org.apache.commons.io.FilenameUtils;
+ import org.slf4j.Logger;
+ import org.junit.BeforeClass;
++import org.junit.Ignore;
+ import org.junit.Test;
+ import org.slf4j.LoggerFactory;
+ 
+@@ -425,6 +426,7 @@
+      *
+      * @throws IOException error
+      */
++    @Ignore
+     @Test
+     public void testRoundTripTrickySpliced18() throws IOException {
+         final RoundTripAlignment rtc = new RoundTripAlignment();
+@@ -672,6 +674,7 @@
+      *
+      * @throws java.io.IOException error
+      */
++    @Ignore
+     @Test
+     public void testTestTargetIndexCreation() throws IOException {
+         final RoundTripAlignment rtc = new RoundTripAlignment();


=====================================
debian/patches/inclusions_in_SplitTranscriptsMode.patch
=====================================
@@ -0,0 +1,17 @@
+Description: reading class GeneTranscriptRelationships from Goby archive
+ The above-named class is in the archive of Goby and thus does not need to be read elsewhere.
+Author: Pierre Gruet <pgtdebian at free.fr>
+Forwarded: no
+Last-Update: 2020-11-02
+
+--- a/goby-distribution/src/main/java/org/campagnelab/goby/modes/SplitTranscriptsMode.java
++++ b/goby-distribution/src/main/java/org/campagnelab/goby/modes/SplitTranscriptsMode.java
+@@ -24,7 +24,7 @@
+ import org.campagnelab.goby.readers.FastXEntry;
+ import org.campagnelab.goby.readers.FastXReader;
+ import edu.cornell.med.icb.identifier.IndexedIdentifier;
+-import edu.cornell.med.icb.tissueinfo.similarity.GeneTranscriptRelationships;
++import org.campagnelab.goby.alignments.filters.GeneTranscriptRelationships;
+ import it.unimi.dsi.fastutil.ints.Int2IntMap;
+ import it.unimi.dsi.fastutil.ints.Int2IntOpenHashMap;
+ import it.unimi.dsi.fastutil.ints.Int2ObjectMap;


=====================================
debian/patches/series
=====================================
@@ -1,2 +1,11 @@
 protoc.patch
 adding_dependencies.patch
+using_jbzip2.patch
+adapting_to_old_fastutil.patch
+using_GeneratedMessageV3.patch
+using_commons-cli.patch
+using_correct_SamReader_api.patch
+computing_Fisher_test_pvalue.patch
+inclusions_in_SplitTranscriptsMode.patch
+catch_IOException_LineIterator.patch
+exclude_not_runnable_tests.patch


=====================================
debian/patches/using_GeneratedMessageV3.patch
=====================================
@@ -0,0 +1,178 @@
+--- a/goby-distribution/src/main/java/org/campagnelab/goby/alignments/AlignmentCollectionHandler.java
++++ b/goby-distribution/src/main/java/org/campagnelab/goby/alignments/AlignmentCollectionHandler.java
+@@ -20,7 +20,7 @@
+ 
+ import com.google.protobuf.ByteString;
+ import com.google.protobuf.CodedInputStream;
+-import com.google.protobuf.GeneratedMessage;
++import com.google.protobuf.GeneratedMessageV3;
+ import com.google.protobuf.Message;
+ import org.campagnelab.goby.compression.*;
+ import org.campagnelab.goby.compression.FastArithmeticCoder;
+@@ -177,7 +177,7 @@
+     }
+ 
+     @Override
+-    public GeneratedMessage parse(final InputStream uncompressedStream) throws IOException {
++    public GeneratedMessageV3 parse(final InputStream uncompressedStream) throws IOException {
+         final byte[] bytes = IOUtils.toByteArray(uncompressedStream);
+         final CodedInputStream codedInput = CodedInputStream.newInstance(bytes);
+         codedInput.setSizeLimit(Integer.MAX_VALUE);
+--- a/goby-distribution/src/main/java/org/campagnelab/goby/compression/FastBufferedMessageChunksReader.java
++++ b/goby-distribution/src/main/java/org/campagnelab/goby/compression/FastBufferedMessageChunksReader.java
+@@ -20,7 +20,7 @@
+ 
+ package org.campagnelab.goby.compression;
+ 
+-import com.google.protobuf.GeneratedMessage;
++import com.google.protobuf.GeneratedMessageV3;
+ import org.campagnelab.goby.exception.GobyRuntimeException;
+ import it.unimi.dsi.fastutil.bytes.ByteSet;
+ import it.unimi.dsi.fastutil.io.FastBufferedInputStream;
+@@ -215,7 +215,7 @@
+      * @return True if the input has more entries, False otherwise.
+      */
+     @Override
+-    public boolean hasNext(final GeneratedMessage collection, final int collectionSize) {
++    public boolean hasNext(final GeneratedMessageV3 collection, final int collectionSize) {
+         if (collection == null || entryIndex >= collectionSize) {
+             if (input != null) {
+                 try {
+--- a/goby-distribution/src/main/java/org/campagnelab/goby/compression/MessageChunksReader.java
++++ b/goby-distribution/src/main/java/org/campagnelab/goby/compression/MessageChunksReader.java
+@@ -20,7 +20,7 @@
+ 
+ package org.campagnelab.goby.compression;
+ 
+-import com.google.protobuf.GeneratedMessage;
++import com.google.protobuf.GeneratedMessageV3;
+ import org.campagnelab.goby.exception.GobyRuntimeException;
+ import org.apache.commons.io.IOUtils;
+ import org.apache.commons.logging.Log;
+@@ -85,7 +85,7 @@
+      * @param collectionSize The size of the current collection (can be zero).
+      * @return True if the input has more entries, False otherwise.
+      */
+-    public boolean hasNext(final GeneratedMessage collection, final int collectionSize) {
++    public boolean hasNext(final GeneratedMessageV3 collection, final int collectionSize) {
+         if (collection == null || entryIndex >= collectionSize) {
+             if (in == null) {
+                 compressedBytes = null;
+--- a/goby-distribution/src/main/java/org/campagnelab/goby/compression/MessageChunksWriter.java
++++ b/goby-distribution/src/main/java/org/campagnelab/goby/compression/MessageChunksWriter.java
+@@ -124,7 +124,7 @@
+      * @param collectionBuilder The builder prepared with the growing collection of entries.
+      * @throws IOException if there was an error writing the entries
+      */
+-    public void writeAsNeeded(final com.google.protobuf.GeneratedMessage.Builder collectionBuilder) {
++    public void writeAsNeeded(final com.google.protobuf.GeneratedMessageV3.Builder collectionBuilder) {
+ 
+         writeAsNeeded(collectionBuilder, 1);
+     }
+@@ -139,7 +139,7 @@
+      *                          was just appended.
+      * @throws IOException if there was an error writing the entries
+      */
+-    public synchronized  long writeAsNeeded(final com.google.protobuf.GeneratedMessage.Builder collectionBuilder,
++    public synchronized  long writeAsNeeded(final com.google.protobuf.GeneratedMessageV3.Builder collectionBuilder,
+                               final int multiplicity) {
+         totalEntriesWritten += Math.max(1, multiplicity);
+         if (++numAppended >= numEntriesPerChunk) {
+@@ -162,7 +162,7 @@
+      *
+      * @param collectionBuilder The builder prepared with the growing collection of entries.
+      */
+-    public synchronized void flush(final com.google.protobuf.GeneratedMessage.Builder collectionBuilder) {
++    public synchronized void flush(final com.google.protobuf.GeneratedMessageV3.Builder collectionBuilder) {
+         // Write the separation between two chunks: eight bytes with value 0xFF.
+ 
+         // If we are flushing a completely empty file, that's OK, the flush() should occur.
+@@ -221,7 +221,7 @@
+      * @param collectionBuilder The builder prepared with the growing collection of entries.
+      * @throws IOException if there is a problem closing the stream unerlying stream
+      */
+-    public void close(final com.google.protobuf.GeneratedMessage.Builder collectionBuilder)
++    public void close(final com.google.protobuf.GeneratedMessageV3.Builder collectionBuilder)
+             throws IOException {
+         flush(collectionBuilder);
+         out.writeByte(0xFF);  // termination codec is always GZIP
+--- a/goby-distribution/src/main/java/org/campagnelab/goby/compression/ProtobuffCollectionHandler.java
++++ b/goby-distribution/src/main/java/org/campagnelab/goby/compression/ProtobuffCollectionHandler.java
+@@ -18,7 +18,7 @@
+ 
+ package org.campagnelab.goby.compression;
+ 
+-import com.google.protobuf.GeneratedMessage;
++import com.google.protobuf.GeneratedMessageV3;
+ import com.google.protobuf.Message;
+ 
+ import java.io.ByteArrayOutputStream;
+@@ -46,7 +46,7 @@
+      */
+     public int getType();
+ 
+-    public GeneratedMessage parse(InputStream uncompressedStream) throws IOException;
++    public GeneratedMessageV3 parse(InputStream uncompressedStream) throws IOException;
+ 
+     /**
+      * Transform a collection to a stream of compressed bits, and return the left-over collection.
+--- a/goby-distribution/src/main/java/org/campagnelab/goby/compression/SequenceBaseInfoCollectionHandler.java
++++ b/goby-distribution/src/main/java/org/campagnelab/goby/compression/SequenceBaseInfoCollectionHandler.java
+@@ -1,7 +1,7 @@
+ package org.campagnelab.goby.compression;
+ 
+ import com.google.protobuf.CodedInputStream;
+-import com.google.protobuf.GeneratedMessage;
++import com.google.protobuf.GeneratedMessageV3;
+ import com.google.protobuf.Message;
+ import org.apache.commons.io.IOUtils;
+ 
+@@ -21,7 +21,7 @@
+     }
+ 
+     @Override
+-    public GeneratedMessage parse(final InputStream compressedBytes) throws IOException {
++    public GeneratedMessageV3 parse(final InputStream compressedBytes) throws IOException {
+         final byte[] bytes = IOUtils.toByteArray(compressedBytes);
+         final CodedInputStream codedInput = CodedInputStream.newInstance(bytes);
+         codedInput.setSizeLimit(Integer.MAX_VALUE);
+--- a/goby-distribution/src/main/java/org/campagnelab/goby/compression/SequenceSegmentInfoCollectionHandler.java
++++ b/goby-distribution/src/main/java/org/campagnelab/goby/compression/SequenceSegmentInfoCollectionHandler.java
+@@ -1,7 +1,7 @@
+ package org.campagnelab.goby.compression;
+ 
+ import com.google.protobuf.CodedInputStream;
+-import com.google.protobuf.GeneratedMessage;
++import com.google.protobuf.GeneratedMessageV3;
+ import com.google.protobuf.Message;
+ import org.apache.commons.io.IOUtils;
+ import org.campagnelab.dl.varanalysis.protobuf.BaseInformationRecords;
+@@ -27,7 +27,7 @@
+     }
+ 
+     @Override
+-    public GeneratedMessage parse(InputStream uncompressedStream) throws IOException {
++    public GeneratedMessageV3 parse(InputStream uncompressedStream) throws IOException {
+         final byte[] bytes = IOUtils.toByteArray(uncompressedStream);
+         final CodedInputStream codedInput = CodedInputStream.newInstance(bytes);
+         codedInput.setSizeLimit(Integer.MAX_VALUE);
+--- a/goby-distribution/src/main/java/org/campagnelab/goby/reads/ReadProtobuffCollectionHandler.java
++++ b/goby-distribution/src/main/java/org/campagnelab/goby/reads/ReadProtobuffCollectionHandler.java
+@@ -19,7 +19,7 @@
+ package org.campagnelab.goby.reads;
+ 
+ import com.google.protobuf.CodedInputStream;
+-import com.google.protobuf.GeneratedMessage;
++import com.google.protobuf.GeneratedMessageV3;
+ import com.google.protobuf.Message;
+ import org.campagnelab.goby.compression.ProtobuffCollectionHandler;
+ import org.apache.commons.io.IOUtils;
+@@ -42,7 +42,7 @@
+     }
+ 
+     @Override
+-    public GeneratedMessage parse(final InputStream compressedBytes) throws IOException {
++    public GeneratedMessageV3 parse(final InputStream compressedBytes) throws IOException {
+         final byte[] bytes = IOUtils.toByteArray(compressedBytes);
+         final CodedInputStream codedInput = CodedInputStream.newInstance(bytes);
+         codedInput.setSizeLimit(Integer.MAX_VALUE);


=====================================
debian/patches/using_commons-cli.patch
=====================================
@@ -0,0 +1,849 @@
+Description: using classes of commons-cli instead of unpackaged ones
+Author: Pierre Gruet <pgtdebian at free.fr>
+Forwarded: not-needed
+Last-Update: 2020-11-02
+
+--- a/goby-distribution/src/main/java/org/campagnelab/goby/algorithmic/algorithm/dmr/EstimatedDistribution.java
++++ b/goby-distribution/src/main/java/org/campagnelab/goby/algorithmic/algorithm/dmr/EstimatedDistribution.java
+@@ -19,7 +19,7 @@
+ package org.campagnelab.goby.algorithmic.algorithm.dmr;
+ 
+ import org.campagnelab.goby.algorithmic.algorithm.FenwickTree;
+-import edu.mssm.crover.cli.CLI;
++import org.apache.commons.cli.*;
+ import it.unimi.dsi.fastutil.ints.IntArrayList;
+ import it.unimi.dsi.fastutil.io.BinIO;
+ import it.unimi.dsi.fastutil.objects.ObjectArrayList;
+@@ -240,68 +240,113 @@
+     }
+ 
+     public static void main(final String[] args) throws IOException {
+-        boolean printDensity = CLI.isKeywordGiven(args, "--print-density");
+-        boolean printObservations = CLI.isKeywordGiven(args, "--print-observations");
+-        String filename = CLI.getOption(args, "-f", null);
+-        String outputFilename = CLI.getOption(args, "-o", "out.tsv");
+-        PrintWriter outWriter = new PrintWriter(new FileWriter(outputFilename));
+-        if (printDensity) {
+-            EstimatedDistribution estimated = null;
+-
+-            try {
+-                estimated = load(filename);
+-                String statName = estimated.getStatAdaptor().statName();
+-                System.out.println("Statistic=" + statName);
+-                System.out.println("binning strategy=" + estimated.getBinningStrategy().getName());
+-                int index = 0;
+-                outWriter.println("midPointSumTotal\tsumTotal range\t" + statName + "\tcount-at-" + statName);
+-                final BinningStrategy binningStrategy = estimated.getBinningStrategy();
+-                for (final FenwickTree tree : estimated.densitities) {
+-                    if (tree != null) {
+-                        int low = binningStrategy.getLowerBound(index);
+-                        int high = binningStrategy.getUpperBound(index);
+-
+-                        int midPointSumTotal = binningStrategy.getMidpoint(index);
+-                        System.out.printf("low=%d high=%d midPoint=%d %n", low, high, midPointSumTotal);
+-                        final long maxCumulative = tree.getCumulativeCount(tree.size() - 2);
+-                        for (int scaledStatistic = 0; scaledStatistic < tree.size() - 1; scaledStatistic++) {
+-                            final long cumulativeCountAt = tree.getCumulativeCount(scaledStatistic);
+-                            final long cumulativeCountAfter = tree.getCumulativeCount(scaledStatistic + 1);
+-
+-                            outWriter.printf("%d\t[%d-%d]\t%g\t%d%n", midPointSumTotal, binningStrategy.getLowerBound(index),
+-                                    binningStrategy.getUpperBound(index), estimated.unscale(scaledStatistic), cumulativeCountAfter - cumulativeCountAt);
+-                            if (cumulativeCountAfter == maxCumulative) {
+-                                break;
++        Options options = new Options();
++
++        Option pDensity = new Option("printDensity", "print-density", false, "print density");
++        pDensity.setRequired(false);
++        options.addOption(pDensity);
++
++        Option pObservations = new Option("printObservations", "print-observations", false, "print observations");
++        pObservations.setRequired(false);
++        options.addOption(pObservations);
++
++        Option fname = new Option("filename", "filename", true, "filename");
++        fname.setRequired(false);
++        options.addOption(fname);
++
++        Option o = new Option("o", "o", true, "output filename");
++        o.setRequired(false);
++        options.addOption(o);
++
++        CommandLineParser parser = new DefaultParser();
++        CommandLine cmd;
++        String filename;
++        String outputFilename;
++        boolean printDensity;
++        boolean printObservations;
++
++        try {
++            cmd = parser.parse(options, args);
++            printDensity = cmd.hasOption("printDensity");
++
++            printObservations = cmd.hasOption("printObservations");
++
++            if (cmd.hasOption("f")) {
++                filename = cmd.getOptionValue("f");
++            }
++            else {
++                filename = null;
++            }
++
++            if (cmd.hasOption("o")) {
++                outputFilename = cmd.getOptionValue("o");
++            }
++            else {
++                outputFilename = new String("out.tsv");
++            }
++
++            PrintWriter outWriter = new PrintWriter(new FileWriter(outputFilename));
++            if (printDensity) {
++                EstimatedDistribution estimated = null;
++
++                try {
++                    estimated = load(filename);
++                    String statName = estimated.getStatAdaptor().statName();
++                    System.out.println("Statistic=" + statName);
++                    System.out.println("binning strategy=" + estimated.getBinningStrategy().getName());
++                    int index = 0;
++                    outWriter.println("midPointSumTotal\tsumTotal range\t" + statName + "\tcount-at-" + statName);
++                    final BinningStrategy binningStrategy = estimated.getBinningStrategy();
++                    for (final FenwickTree tree : estimated.densitities) {
++                        if (tree != null) {
++                            int low = binningStrategy.getLowerBound(index);
++                            int high = binningStrategy.getUpperBound(index);
++
++                            int midPointSumTotal = binningStrategy.getMidpoint(index);
++                            System.out.printf("low=%d high=%d midPoint=%d %n", low, high, midPointSumTotal);
++                            final long maxCumulative = tree.getCumulativeCount(tree.size() - 2);
++                            for (int scaledStatistic = 0; scaledStatistic < tree.size() - 1; scaledStatistic++) {
++                                final long cumulativeCountAt = tree.getCumulativeCount(scaledStatistic);
++                                final long cumulativeCountAfter = tree.getCumulativeCount(scaledStatistic + 1);
++
++                                outWriter.printf("%d\t[%d-%d]\t%g\t%d%n", midPointSumTotal, binningStrategy.getLowerBound(index),
++                                        binningStrategy.getUpperBound(index), estimated.unscale(scaledStatistic), cumulativeCountAfter - cumulativeCountAt);
++                                if (cumulativeCountAfter == maxCumulative) {
++                                    break;
++                                }
+                             }
+                         }
+-                    }
+-                    index++;
++                        index++;
+ 
++                    }
++                    outWriter.close();
++                } catch (Exception e) {
++                    e.printStackTrace();
++                    System.exit(1);
+                 }
+-                outWriter.close();
+-            } catch (Exception e) {
+-                e.printStackTrace();
+-                System.exit(1);
+-            }
+ 
+-        }
+-        if (printObservations) {
++            }
++            if (printObservations) {
+ 
+-            EstimatedDistribution estimated = null;
++                EstimatedDistribution estimated = null;
+ 
+-            try {
+-                estimated = load(filename);
+-                String statName = estimated.getStatAdaptor().statName();
+-                outWriter.println("tscaled-" + statName + "\t" + statName + "\tcovariates\n");
+-                for (final Observation observation : estimated.getObservations()) {
+-                    outWriter.printf("%d\t%d\t%g\t%s%n", observation.scaledStatistic,
+-                            estimated.unscale(observation.scaledStatistic), IntArrayList.wrap(observation.covariates));
++                try {
++                    estimated = load(filename);
++                    String statName = estimated.getStatAdaptor().statName();
++                    outWriter.println("tscaled-" + statName + "\t" + statName + "\tcovariates\n");
++                    for (final Observation observation : estimated.getObservations()) {
++                        outWriter.printf("%d\t%d\t%g\t%s%n", observation.scaledStatistic,
++                                estimated.unscale(observation.scaledStatistic), IntArrayList.wrap(observation.covariates));
++                    }
++                    outWriter.close();
++                } catch (ClassNotFoundException e) {
++                    e.printStackTrace();
++                    System.exit(1);
+                 }
+-                outWriter.close();
+-            } catch (ClassNotFoundException e) {
+-                e.printStackTrace();
+-                System.exit(1);
+             }
++        } catch (ParseException e) {
++            System.out.println(e.getMessage());
++            System.exit(1);
+         }
+     }
+ 
+--- a/goby-distribution/src/main/java/org/campagnelab/goby/cli/FoldChangeForExonPairs.java
++++ b/goby-distribution/src/main/java/org/campagnelab/goby/cli/FoldChangeForExonPairs.java
+@@ -19,7 +19,7 @@
+ package org.campagnelab.goby.cli;
+ 
+ import edu.cornell.med.icb.io.TSVReader;
+-import edu.mssm.crover.cli.CLI;
++import org.apache.commons.cli.*;
+ 
+ import java.io.FileReader;
+ import java.io.FileNotFoundException;
+@@ -46,38 +46,109 @@
+     }
+ 
+     private void process(String[] args) throws FileNotFoundException {
+-        String inputFilenames = CLI.getOption(args, "--data", "expression-data.tsv,expression-data2.tsv");
+-        String pairsFilename = CLI.getOption(args, "--pairs", "pairs.tsv");
+-        String log2AverageId = CLI.getOption(args, "--group", "average log2_RPKM group UHR(BUQ)");
+-        String outputFilename = CLI.getOption(args, "--output", "/data/gc-weights/exons/out.tsv");
+-        String averageCountId = CLI.getOption(args, "--threshold-id", "average count group Brain");
+-        int thresholdValue = CLI.getIntOption(args, "--threshold-value", 20);
+-
+-        //  String groupB= CLI.getOption(args,"-2","average RPKM group UHR(BUQ)");
+-        int log2AverageColumnIndex = -1;
+-        Object2DoubleMap<MutableString> exonExpressionData;
+-
+-
+-        ObjectArrayList<Pair> pairs = loadPairs(pairsFilename);
+-        PrintWriter output = new PrintWriter(outputFilename);
+-        output.printf("experiment\texonId1\texonId2\tlog2RpkmExon1-log2RpkmExon2%n");
+-        for (String inputFilename : inputFilenames.split("[,]")) {
+-
+-            System.out.println("Processing " + inputFilename);
+-            exonExpressionData = loadData(inputFilename, log2AverageId, averageCountId, thresholdValue);
+-            System.out.println("Size: " + exonExpressionData.size());
+-            System.out.println("Writing data..");
+-            for (Pair pair : pairs) {
+-                //calculate log2 RPKM exonId1 - exonId2:
+-                if (exonExpressionData.containsKey(pair.exonId1) && exonExpressionData.containsKey(pair.exonId2)) {
+-                    double log2FoldChangeExons = exonExpressionData.get(pair.exonId1) - exonExpressionData.get(pair.exonId2);
+-                    output.printf("%s\t%s\t%s\t%g%n", FilenameUtils.getBaseName(inputFilename),
+-                            pair.exonId1, pair.exonId2, log2FoldChangeExons);
+-                }
++        Options options = new Options();
++
++        Option oData = new Option("data", "data", true, "data");
++        oData.setRequired(false);
++        options.addOption(oData);
++
++        Option oPairs = new Option("pairs", "pairs", true, "pairs");
++        oPairs.setRequired(false);
++        options.addOption(oPairs);
++
++        Option oGroup = new Option("group", "group", true, "group");
++        oGroup.setRequired(false);
++        options.addOption(oGroup);
++
++        Option oOutput = new Option("output", "output", true, "output");
++        oOutput.setRequired(false);
++        options.addOption(oOutput);
++
++        Option oThresId = new Option("thresholdId", "threshold-id", true, "threshold id");
++        oThresId.setRequired(false);
++        options.addOption(oThresId);
++
++        Option oThresVal = new Option("thresholdVal", "threshold-value", true, "threshold value");
++        oThresVal.setRequired(false);
++        options.addOption(oThresVal);
++
++        CommandLineParser parser = new DefaultParser();
++        CommandLine cmd;
++        String inputFilenames;
++        String pairsFilename;
++        String log2AverageId;
++        String outputFilename;
++        String averageCountId;
++        int thresholdValue;
++
++        try {
++            cmd = parser.parse(options, args);
+ 
++            if (cmd.hasOption("data")) {
++                inputFilenames = cmd.getOptionValue("data");
++            }
++            else {
++                inputFilenames = new String("expression-data.tsv,expression-data2.tsv");
++            }
++            if (cmd.hasOption("pairs")) {
++                pairsFilename = cmd.getOptionValue("pairs");
++            }
++            else {
++                pairsFilename = new String("pairs.tsv");
++            }
++            if (cmd.hasOption("group")) {
++                log2AverageId = cmd.getOptionValue("group");
++            }
++            else {
++                log2AverageId = new String("average log2_RPKM group UHR(BUQ)");
++            }
++            if (cmd.hasOption("output")) {
++                outputFilename = cmd.getOptionValue("output");
++            }
++            else {
++                outputFilename = new String("/data/gc-weights/exons/out.tsv");
++            }
++            if (cmd.hasOption("thresholdId")) {
++                averageCountId = cmd.getOptionValue("thresholdId");
++            }
++            else {
++                averageCountId = new String("average count group Brain");
++            }
++            if (cmd.hasOption("thresholdVal")) {
++                thresholdValue = Integer.parseInt(cmd.getOptionValue("thresholdVal"));
++            }
++            else {
++                thresholdValue = 20;
+             }
+-        }
+ 
++            //  String groupB= CLI.getOption(args,"-2","average RPKM group UHR(BUQ)");
++            int log2AverageColumnIndex = -1;
++            Object2DoubleMap<MutableString> exonExpressionData;
++
++
++            ObjectArrayList<Pair> pairs = loadPairs(pairsFilename);
++            PrintWriter output = new PrintWriter(outputFilename);
++            output.printf("experiment\texonId1\texonId2\tlog2RpkmExon1-log2RpkmExon2%n");
++            for (String inputFilename : inputFilenames.split("[,]")) {
++
++                System.out.println("Processing " + inputFilename);
++                exonExpressionData = loadData(inputFilename, log2AverageId, averageCountId, thresholdValue);
++                System.out.println("Size: " + exonExpressionData.size());
++                System.out.println("Writing data..");
++                for (Pair pair : pairs) {
++                    //calculate log2 RPKM exonId1 - exonId2:
++                    if (exonExpressionData.containsKey(pair.exonId1) && exonExpressionData.containsKey(pair.exonId2)) {
++                        double log2FoldChangeExons = exonExpressionData.get(pair.exonId1) - exonExpressionData.get(pair.exonId2);
++                        output.printf("%s\t%s\t%s\t%g%n", FilenameUtils.getBaseName(inputFilename),
++                                pair.exonId1, pair.exonId2, log2FoldChangeExons);
++                    }
++
++                }
++            }
++        } catch (ParseException e) {
++            System.out.println(e.getMessage());
++            System.exit(1);
++        }
+     }
+ 
+     private ObjectArrayList<Pair> loadPairs(String pairsFilename) throws FileNotFoundException {
+--- a/goby-distribution/src/main/java/org/campagnelab/goby/cli/PlantIndels.java
++++ b/goby-distribution/src/main/java/org/campagnelab/goby/cli/PlantIndels.java
+@@ -19,7 +19,7 @@
+ package org.campagnelab.goby.cli;
+ 
+ import org.campagnelab.goby.parsers.FastaParser;
+-import edu.mssm.crover.cli.CLI;
++import org.apache.commons.cli.*;
+ import it.unimi.dsi.lang.MutableString;
+ 
+ import java.io.*;
+@@ -40,26 +40,128 @@
+     private int numIndels;
+ 
+     public static void main(final String args[]) throws IOException {
+-        final String fastaReference = CLI.getOption(args, "-r", null);
+-        final String outputFilename = CLI.getOption(args, "-o", "out.fq");
+-        final String regionIndelTruth = CLI.getOption(args, "-t", "indel-truth.tsv");
+-        // reference sequence to use
+-        final String refChoice = CLI.getOption(args, "-c", "22");
+-        int from = CLI.getIntOption(args, "-s", 0);
+-        int to = CLI.getIntOption(args, "-e", 0);
+ 
+-        if (to < from) {
+-            System.err.println("argument to -e must be larger than argument to -s");
+-            System.exit(1);
+-        }
+-        final int indelLength = CLI.getIntOption(args, "-l", 3);
++        Options options = new Options();
++
++        Option oR = new Option("r", "r", true, "r");
++        oR.setRequired(false);
++        options.addOption(oR);
++
++        Option oO = new Option("o", "o", true, "o");
++        oO.setRequired(false);
++        options.addOption(oO);
++
++        Option oT = new Option("t", "t", true, "t");
++        oT.setRequired(false);
++        options.addOption(oT);
++
++        Option oC = new Option("c", "c", true, "c");
++        oC.setRequired(false);
++        options.addOption(oC);
++
++        Option oS = new Option("s", "s", true, "s");
++        oS.setRequired(false);
++        options.addOption(oS);
++
++        Option oE = new Option("e", "e", true, "e");
++        oE.setRequired(false);
++        options.addOption(oE);
++
++        Option oL = new Option("l", "l", true, "l");
++        oL.setRequired(false);
++        options.addOption(oL);
++
++        Option oM = new Option("m", "m", true, "m");
++        oM.setRequired(false);
++        options.addOption(oM);
++
++        Option oRd = new Option("readDeletion", "read-deletion", false, "readDeletion");
++        oRd.setRequired(false);
++        options.addOption(oRd);
++
++        Option oN = new Option("n", "n", true, "n");
++        oN.setRequired(false);
++        options.addOption(oN);
++
++        CommandLineParser parser = new DefaultParser();
++        CommandLine cmd;
++        final String fastaReference;
++        final String outputFilename;
++        final String regionIndelTruth;
++        // reference sequence to use
++        final String refChoice;
++        int from;
++        int to;
++        final int indelLength;
+         PlantIndels processor = new PlantIndels();
+-        processor.outputFilename = outputFilename;
+-        processor.insert = !CLI.isKeywordGiven(args, "--read-deletion");
+-        processor.numIndels=CLI.getIntOption(args,"-n",5);
+-        processor.process(refChoice, fastaReference, from, to, indelLength, regionIndelTruth);
+ 
++        try {
++            cmd = parser.parse(options, args);
+ 
++            if (cmd.hasOption("r")) {
++                fastaReference = cmd.getOptionValue("r");
++            }
++            else {
++                fastaReference = null;
++            }
++            if (cmd.hasOption("o")) {
++                outputFilename = cmd.getOptionValue("o");
++            }
++            else {
++                outputFilename = new String("out.fq");
++            }
++            if (cmd.hasOption("t")) {
++                regionIndelTruth = cmd.getOptionValue("t");
++            }
++            else {
++                regionIndelTruth = new String("indel-truth.tsv");
++            }
++            if (cmd.hasOption("c")) {
++                refChoice = cmd.getOptionValue("c");
++            }
++            else {
++                refChoice = new String("22");
++            }
++            if (cmd.hasOption("s")) {
++                from = Integer.parseInt(cmd.getOptionValue("s"));
++            }
++            else {
++                from = 0;
++            }
++            if (cmd.hasOption("e")) {
++                to = Integer.parseInt(cmd.getOptionValue("e"));
++            }
++            else {
++                to = 0;
++            }
++
++            if (to < from) {
++                System.err.println("argument to -e must be larger than argument to -s");
++                System.exit(1);
++            }
++
++            if (cmd.hasOption("l")) {
++                indelLength = Integer.parseInt(cmd.getOptionValue("l"));
++            }
++            else {
++                indelLength = 3;
++            }
++
++            processor.outputFilename = outputFilename;
++            processor.insert = !cmd.hasOption("readDeletion");
++
++            if (cmd.hasOption("n")) {
++                processor.numIndels = Integer.parseInt(cmd.getOptionValue("n"));
++            }
++            else {
++                processor.numIndels = 5;
++            }
++
++            processor.process(refChoice, fastaReference, from, to, indelLength, regionIndelTruth);
++        } catch (ParseException e) {
++            System.out.println(e.getMessage());
++            System.exit(1);
++        }
+     }
+ 
+     public void process(String refChoice, String fastaReference, int from, int to, int indelLength, String regionIndelTruth) throws IOException {
+--- a/goby-distribution/src/main/java/org/campagnelab/goby/cli/SimulateBisulfiteReads.java
++++ b/goby-distribution/src/main/java/org/campagnelab/goby/cli/SimulateBisulfiteReads.java
+@@ -20,7 +20,7 @@
+ 
+ import org.campagnelab.goby.reads.QualityEncoding;
+ import org.campagnelab.goby.parsers.FastaParser;
+-import edu.mssm.crover.cli.CLI;
++import org.apache.commons.cli.*;
+ import it.unimi.dsi.fastutil.doubles.DoubleArrayList;
+ import it.unimi.dsi.fastutil.doubles.DoubleIterator;
+ import it.unimi.dsi.fastutil.doubles.DoubleList;
+@@ -72,32 +72,152 @@
+ 
+     public static void main(String[] args) throws IOException {
+ 
+-        String fastaReference = CLI.getOption(args, "-r", null);
+-        String outputFilename = CLI.getOption(args, "-o", "out.fq");
+-        String regionTrueRates = CLI.getOption(args, "-t", "true-methylation.tsv");
++        Options options = new Options();
++
++        Option oR = new Option("r", "r", true, "r");
++        oR.setRequired(false);
++        options.addOption(oR);
++
++        Option oO = new Option("o", "o", true, "o");
++        oO.setRequired(false);
++        options.addOption(oO);
++
++        Option oT = new Option("t", "t", true, "t");
++        oT.setRequired(false);
++        options.addOption(oT);
++
++        Option oC = new Option("c", "c", true, "c");
++        oC.setRequired(false);
++        options.addOption(oC);
++
++        Option oS = new Option("s", "s", true, "s");
++        oS.setRequired(false);
++        options.addOption(oS);
++
++        Option oE = new Option("e", "e", true, "e");
++        oE.setRequired(false);
++        options.addOption(oE);
++
++        Option oL = new Option("l", "l", true, "l");
++        oL.setRequired(false);
++        options.addOption(oL);
++
++        Option oM = new Option("m", "m", true, "m");
++        oM.setRequired(false);
++        options.addOption(oM);
++
++        Option oBs = new Option("bisulfite", "bisulfite", false, "bisulfite");
++        oBs.setRequired(false);
++        options.addOption(oBs);
++
++        Option oStrand = new Option("strand", "strand", true, "strand");
++        oStrand.setRequired(false);
++        options.addOption(oStrand);
++
++        Option oN = new Option("n", "n", true, "n");
++        oN.setRequired(false);
++        options.addOption(oN);
++
++        CommandLineParser parser = new DefaultParser();
++        CommandLine cmd;
++        String fastaReference;
++        String outputFilename;
++        String regionTrueRates;
+         // reference sequence to use
+-        String refChoice = CLI.getOption(args, "-c", "22");
+-        int from = CLI.getIntOption(args, "-s", 0);
+-        int to = CLI.getIntOption(args, "-e", 0);
+-        if (to < from) {
+-            System.err.println("argument to -e must be larger than argument to -s");
+-            System.exit(1);
+-        }
+-        int readLength = CLI.getIntOption(args, "-l", 50);
+-        String methylationRateFilename = CLI.getOption(args, "-m", "methylation-rates.tsv");
++        String refChoice;
++        int from;
++        int to;
++        int readLength;
++        String methylationRateFilename;
++        String strandChoice;
+         SimulateBisulfiteReads processor = new SimulateBisulfiteReads();
+-        final boolean bisulfite = CLI.isKeywordGiven(args, "--bisulfite");
+-        String strandChoice = CLI.getOption(args, "--strand", "both");
++        final boolean bisulfite;
+ 
+-        processor.configure(bisulfite, strandChoice);
+-        processor.bisulfiteTreatment = bisulfite;
+-        processor.readLength = readLength;
+-        processor.outputFilename = outputFilename;
+-        processor.regionTrueRates = regionTrueRates;
+-        processor.numRepeats = CLI.getIntOption(args, "-n", 10000);
+-
+-        processor.process(refChoice, fastaReference, from, to, methylationRateFilename);
++        try {
++            cmd = parser.parse(options, args);
+ 
++            if (cmd.hasOption("r")) {
++                fastaReference = cmd.getOptionValue("r");
++            }
++            else {
++                fastaReference = null;
++            }
++            if (cmd.hasOption("o")) {
++                outputFilename = cmd.getOptionValue("o");
++            }
++            else {
++                outputFilename = new String("out.fq");
++            }
++            if (cmd.hasOption("t")) {
++                regionTrueRates = cmd.getOptionValue("t");
++            }
++            else {
++                regionTrueRates = new String("true-methylation.tsv");
++            }
++            if (cmd.hasOption("c")) {
++                refChoice = cmd.getOptionValue("c");
++            }
++            else {
++                refChoice = new String("22");
++            }
++            if (cmd.hasOption("s")) {
++                from = Integer.parseInt(cmd.getOptionValue("s"));
++            }
++            else {
++                from = 0;
++            }
++            if (cmd.hasOption("e")) {
++                to = Integer.parseInt(cmd.getOptionValue("e"));
++            }
++            else {
++                to = 0;
++            }
++
++            if (to < from) {
++                System.err.println("argument to -e must be larger than argument to -s");
++                System.exit(1);
++            }
++
++            if (cmd.hasOption("l")) {
++                readLength = Integer.parseInt(cmd.getOptionValue("l"));
++            }
++            else {
++                readLength = 50;
++            }
++            if (cmd.hasOption("m")) {
++                methylationRateFilename = cmd.getOptionValue("c");
++            }
++            else {
++                methylationRateFilename = new String("methylation-rates.tsv");
++            }
++
++            bisulfite = cmd.hasOption("biSulfite");
++
++            if (cmd.hasOption("strand")) {
++                strandChoice = cmd.getOptionValue("strang");
++            }
++            else {
++                strandChoice = new String("both");
++            }
++
++            processor.configure(bisulfite, strandChoice);
++            processor.bisulfiteTreatment = bisulfite;
++            processor.readLength = readLength;
++            processor.outputFilename = outputFilename;
++            processor.regionTrueRates = regionTrueRates;
++
++            if (cmd.hasOption("n")) {
++                processor.numRepeats = Integer.parseInt(cmd.getOptionValue("n"));
++            }
++            else {
++                processor.numRepeats = 10000;
++            }
++
++            processor.process(refChoice, fastaReference, from, to, methylationRateFilename);
++        } catch (ParseException e) {
++            System.out.println(e.getMessage());
++            System.exit(1);
++        }
+     }
+ 
+     public void configure(boolean bisulfite, String strandChoice) {
+--- a/goby-distribution/src/main/java/org/campagnelab/goby/methylation/MethylSimilarityScan.java
++++ b/goby-distribution/src/main/java/org/campagnelab/goby/methylation/MethylSimilarityScan.java
+@@ -20,7 +20,7 @@
+ 
+ import org.campagnelab.goby.cli.DoInParallel;
+ import edu.cornell.med.icb.io.TSVReader;
+-import edu.mssm.crover.cli.CLI;
++import org.apache.commons.cli.*;
+ import it.unimi.dsi.fastutil.floats.FloatArrayList;
+ import it.unimi.dsi.fastutil.ints.*;
+ import it.unimi.dsi.fastutil.io.BinIO;
+@@ -63,40 +63,92 @@
+     }
+ 
+     private void process(String[] args) throws IOException {
+-        String inputFilename = CLI.getOption(args, "-i", "/data/lister/mc_h1.tsv");
+-        this.windowWidths = CLI.getOption(args, "-w", "10");
+-        this.maxBestHits = CLI.getIntOption(args, "-h", 100);
+-        String outputFilename = CLI.getOption(args, "-o", "out.tsv");
+-        final MethylationData data = load(inputFilename);
+-        File outputFile = new File(outputFilename);
+-        boolean outputFileExists = outputFile.exists();
+-// append:
+-        PrintWriter output = new PrintWriter(new FileWriter(outputFilename, true));
+ 
++        Options options = new Options();
+ 
+-        if (!outputFileExists) {
+-            output.write("windowSize\tlocation\tchromosome\tforward strand start\tforward strand end\treverse strand start\treverse strand end\teffective window size\tstatistic\n");
+-        }
+-        for (String windowWidthString : windowWidths.split("[,]")) {
+-            final int windowWidth = Integer.parseInt(windowWidthString);
+-            System.out.println("Processing window size=" + windowWidth);
+-            final HitBoundedPriorityQueue hits = new HitBoundedPriorityQueue(maxBestHits);
+-            DoInParallel scan = new DoInParallel() {
+-                @Override
+-                public void action(DoInParallel forDataAccess, String chromosome, int loopIndex) {
+-                    compareStrands(hits, data, windowWidth, new MutableString(chromosome));
+-                }
+-            };
++        Option oI = new Option("i", "i", true, "i");
++        oI.setRequired(false);
++        options.addOption(oI);
++
++        Option oW = new Option("w", "w", true, "w");
++        oW.setRequired(false);
++        options.addOption(oW);
++
++        Option oH = new Option("h", "h", true, "h");
++        oH.setRequired(false);
++        options.addOption(oH);
++
++        Option oO = new Option("o", "o", true, "o");
++        oO.setRequired(false);
++        options.addOption(oO);
++
++        CommandLineParser parser = new DefaultParser();
++        CommandLine cmd;
++        String inputFilename;
++        String outputFilename;
++
++        try {
++            cmd = parser.parse(options, args);
++
++            if (cmd.hasOption("i")) {
++                inputFilename = cmd.getOptionValue("i");
++            }
++            else {
++                inputFilename = new String("/data/lister/mc_h1.tsv");
++            }
++            if (cmd.hasOption("w")) {
++                this.windowWidths = cmd.getOptionValue("w");
++            }
++            else {
++                this.windowWidths = new String("10");
++            }
++            if (cmd.hasOption("h")) {
++                this.maxBestHits = Integer.parseInt(cmd.getOptionValue("h"));
++            }
++            else {
++                this.maxBestHits = 100;
++            }
++            if (cmd.hasOption("o")) {
++                outputFilename = cmd.getOptionValue("o");
++            }
++            else {
++                outputFilename = new String("out.tsv");
++            }
+ 
+-            try {
+-                scan.execute(true, data.getChromosomeStrings());
+-            } catch (Exception e) {
+-                e.printStackTrace();  //To change body of catch statement use File | Settings | File Templates.
++            final MethylationData data = load(inputFilename);
++            File outputFile = new File(outputFilename);
++            boolean outputFileExists = outputFile.exists();
++            // append:
++            PrintWriter output = new PrintWriter(new FileWriter(outputFilename, true));
++
++
++            if (!outputFileExists) {
++                output.write("windowSize\tlocation\tchromosome\tforward strand start\tforward strand end\treverse strand start\treverse strand end\teffective window size\tstatistic\n");
+             }
++            for (String windowWidthString : windowWidths.split("[,]")) {
++                final int windowWidth = Integer.parseInt(windowWidthString);
++                System.out.println("Processing window size=" + windowWidth);
++                final HitBoundedPriorityQueue hits = new HitBoundedPriorityQueue(maxBestHits);
++                DoInParallel scan = new DoInParallel() {
++                    @Override
++                    public void action(DoInParallel forDataAccess, String chromosome, int loopIndex) {
++                        compareStrands(hits, data, windowWidth, new MutableString(chromosome));
++                    }
++                };
++
++                try {
++                    scan.execute(true, data.getChromosomeStrings());
++                } catch (Exception e) {
++                    e.printStackTrace();  //To change body of catch statement use File | Settings | File Templates.
++                }
+ 
+-            printResults(hits, windowWidth, data, output);
++                printResults(hits, windowWidth, data, output);
++            }
++            output.close();
++        } catch (ParseException e) {
++            System.out.println(e.getMessage());
++            System.exit(1);
+         }
+-        output.close();
+     }
+ 
+ 
+--- a/goby-distribution/src/main/java/org/campagnelab/goby/modes/PercentMismatchesQualityFilter.java
++++ b/goby-distribution/src/main/java/org/campagnelab/goby/modes/PercentMismatchesQualityFilter.java
+@@ -20,7 +20,7 @@
+ 
+ package org.campagnelab.goby.modes;
+ 
+-import edu.mssm.crover.cli.CLI;
++import org.apache.commons.cli.*;
+ import org.apache.commons.lang.StringUtils;
+ import org.campagnelab.goby.alignments.Alignments;
+ import org.campagnelab.goby.alignments.filters.AlignmentQualityFilter;
+@@ -62,8 +62,28 @@
+ 
+     public void setParameters(final String parameters) {
+         final String[] args = StringUtils.defaultString(parameters).split("[',=]");
+-        qualityThresholdPercent = CLI.getDoubleOption(args, "threshold", 0.05d);
+-        System.err.println("Setting quality threshold to " + qualityThresholdPercent);
++        Options options = new Options();
++
++        Option threshold = new Option("threshold", "threshold", true, "threshold");
++        threshold.setRequired(false);
++        options.addOption(threshold);
++        CommandLineParser parser = new DefaultParser();
++        CommandLine cmd;
++
++        try {
++            cmd = parser.parse(options, args);
++
++            if (cmd.hasOption("threshold")) {
++                qualityThresholdPercent = Double.parseDouble(cmd.getOptionValue("threshold"));
++            }
++            else {
++                qualityThresholdPercent = 0.05d;
++            }
++            System.err.println("Setting quality threshold to " + qualityThresholdPercent);
++        } catch (ParseException e) {
++            System.out.println(e.getMessage());
++            System.exit(1);
++        }
+     }
+ 
+     public void printUsage(final PrintStream out) {


=====================================
debian/patches/using_correct_SamReader_api.patch
=====================================
@@ -0,0 +1,344 @@
+Description: using the correct SamReader api
+Author: Pierre Gruet <pgtdebian at free.fr>
+Origin: https://sources.debian.org/src/fastqc/0.11.9+dfsg-4/debian/patches/htsjdk-api.patch
+Forwarded: no
+Last-Update: 2020-11-06
+
+--- a/goby-distribution/src/main/java/org/campagnelab/goby/modes/SAMComparisonMode.java
++++ b/goby-distribution/src/main/java/org/campagnelab/goby/modes/SAMComparisonMode.java
+@@ -32,9 +32,7 @@
+ import org.campagnelab.goby.util.dynoptions.RegisterThis;
+ import htsjdk.samtools.ValidationStringency;
+ import it.unimi.dsi.logging.ProgressLogger;
+-import htsjdk.samtools.SAMFileReader;
+-import htsjdk.samtools.SAMRecord;
+-import htsjdk.samtools.SAMRecordIterator;
++import htsjdk.samtools.*;
+ import org.slf4j.Logger;
+ import org.slf4j.LoggerFactory;
+ 
+@@ -284,12 +282,15 @@
+         }
+ 
+         System.out.println("Comparing source bam and destination bam");
+-        final SAMFileReader sourceParser = new SAMFileReader(new FileInputStream(sourceBamFile));
+-        final SAMFileReader destParser = new SAMFileReader(new FileInputStream(destBamFile));
++        final SamInputResource sirSource = SamInputResource.of(new FileInputStream(sourceBamFile));
++        final SamReaderFactory srfSource = SamReaderFactory.makeDefault().validationStringency(ValidationStringency.SILENT);
++        final SamInputResource sirDest = SamInputResource.of(new FileInputStream(destBamFile));
++        final SamReaderFactory srfDest = SamReaderFactory.makeDefault().validationStringency(ValidationStringency.SILENT);
++
++        final SamReader sourceParser = srfSource.open(sirSource);
++        final SamReader destParser = srfDest.open(sirDest);
+         // We need to set the validation to silent because an incomplete file (if the source isn't the entire file)
+         // we can see errors that wouldn't exist in a real conversion.
+-        sourceParser.setValidationStringency(ValidationStringency.SILENT);
+-        destParser.setValidationStringency(ValidationStringency.SILENT);
+         final SAMRecordIterator sourceIterator = sourceParser.iterator();
+         final SAMRecordIterator destIterator = destParser.iterator();
+         AlignmentReaderImpl gobyReader = null;
+--- a/goby-distribution/src/main/java/org/campagnelab/goby/modes/SAMToCompactMode.java
++++ b/goby-distribution/src/main/java/org/campagnelab/goby/modes/SAMToCompactMode.java
+@@ -242,10 +242,11 @@
+         final ProgressLogger progress = new ProgressLogger(LOG);
+         progress.displayFreeMemory = true;
+         // the following is required to set validation to SILENT before loading the header (done in the SAMFileReader constructor)
+-        SAMFileReader.setDefaultValidationStringency(ValidationStringency.SILENT);
+-
+         final InputStream stream = "-".equals(inputFile) ? System.in : new FileInputStream(inputFile);
+-        final SAMFileReader parser = new SAMFileReader(stream);
++        final SamInputResource sir = SamInputResource.of(stream);
++        final SamReaderFactory srf = SamReaderFactory.makeDefault().validationStringency(ValidationStringency.SILENT);
++
++        final SamReader parser = srf.open(sir);
+         // transfer read groups to Goby header:
+         final SAMFileHeader samHeader = parser.getFileHeader();
+         final IndexedIdentifier readGroups = new IndexedIdentifier();
+--- a/goby-distribution/src/main/java/org/campagnelab/goby/modes/SAMToCompactOldMode.java
++++ b/goby-distribution/src/main/java/org/campagnelab/goby/modes/SAMToCompactOldMode.java
+@@ -128,8 +128,10 @@
+         final int[] readLengths = createReadLengthArray();
+ 
+         final ProgressLogger progress = new ProgressLogger(LOG);
+-        final SAMFileReader parser = new SAMFileReader(new File(inputFile));
+-        parser.setValidationStringency(ValidationStringency.SILENT);
++        final SamInputResource sir = SamInputResource.of(new File(inputFile));
++        final SamReaderFactory srf = SamReaderFactory.makeDefault().validationStringency(ValidationStringency.SILENT);
++
++        final SamReader parser = srf.open(sir);
+ 
+         progress.start();
+ 
+--- a/goby-distribution/src/main/java/org/campagnelab/goby/modes/SAMToCompactSamHelperMode.java
++++ b/goby-distribution/src/main/java/org/campagnelab/goby/modes/SAMToCompactSamHelperMode.java
+@@ -231,10 +231,11 @@
+         final ProgressLogger progress = new ProgressLogger(LOG);
+         progress.displayFreeMemory = true;
+         // the following is required to set validation to SILENT before loading the header (done in the SAMFileReader constructor)
+-        SAMFileReader.setDefaultValidationStringency(ValidationStringency.SILENT);
+-
+         final InputStream stream = "-".equals(inputFile) ? System.in : new FileInputStream(inputFile);
+-        final SAMFileReader parser = new SAMFileReader(stream);
++        final SamInputResource sir = SamInputResource.of(stream);
++        SamReaderFactory srf = SamReaderFactory.makeDefault().validationStringency(ValidationStringency.SILENT);
++
++        final SamReader parser = srf.open(sir);
+         // transfer read groups to Goby header:
+         final SAMFileHeader samHeader = parser.getFileHeader();
+         final IndexedIdentifier readGroups = new IndexedIdentifier();
+@@ -827,4 +828,4 @@
+     }
+ 
+ 
+-}
+\ No newline at end of file
++}
+--- a/goby-distribution/src/main/java/org/campagnelab/goby/modes/SamExtractReadsMode.java
++++ b/goby-distribution/src/main/java/org/campagnelab/goby/modes/SamExtractReadsMode.java
+@@ -30,8 +30,7 @@
+ import htsjdk.samtools.ValidationStringency;
+ import it.unimi.dsi.lang.MutableString;
+ import it.unimi.dsi.logging.ProgressLogger;
+-import htsjdk.samtools.SAMFileReader;
+-import htsjdk.samtools.SAMRecord;
++import htsjdk.samtools.*;
+ import org.slf4j.Logger;
+ import org.slf4j.LoggerFactory;
+ 
+@@ -142,8 +141,10 @@
+         try {
+             final ProgressLogger progress = new ProgressLogger(LOG);
+             // the following is required to set validation to SILENT before loading the header (done in the SAMFileReader constructor)
+-            SAMFileReader.setDefaultValidationStringency(ValidationStringency.SILENT);
+-            final SAMFileReader parser = new SAMFileReader(new File(inputFilename), null);
++            final SamInputResource sir = SamInputResource.of(new File(inputFilename));
++            final SamReaderFactory srf = SamReaderFactory.makeDefault().validationStringency(ValidationStringency.SILENT);
++
++            final SamReader parser = srf.open(sir);
+ 
+             progress.start();
+ 
+--- a/goby-distribution/src/main/java/org/campagnelab/goby/modes/SampleQualityScoresMode.java
++++ b/goby-distribution/src/main/java/org/campagnelab/goby/modes/SampleQualityScoresMode.java
+@@ -29,8 +29,7 @@
+ import it.unimi.dsi.fastutil.ints.IntArrayList;
+ import it.unimi.dsi.fastutil.ints.IntList;
+ import it.unimi.dsi.lang.MutableString;
+-import htsjdk.samtools.SAMFileReader;
+-import htsjdk.samtools.SAMRecord;
++import htsjdk.samtools.*;
+ import org.apache.commons.lang.ArrayUtils;
+ import org.apache.commons.logging.Log;
+ import org.apache.commons.logging.LogFactory;
+@@ -350,8 +349,10 @@
+     private int processSamReadsFile(final String inputFilename) throws IOException {
+         // Create directory for output file if it doesn't already exist
+         int i = 0;
+-        SAMFileReader.setDefaultValidationStringency(ValidationStringency.SILENT);
+-        final SAMFileReader parser = new SAMFileReader(new FileInputStream(inputFilename));
++        final SamInputResource sir = SamInputResource.of(new FileInputStream(inputFilename));
++        final SamReaderFactory srf = SamReaderFactory.makeDefault().validationStringency(ValidationStringency.SILENT);
++
++        final SamReader parser = srf.open(sir);
+         for (final SAMRecord samRecord : new SAMRecordIterable(parser.iterator())) {
+             final String quality = samRecord.getBaseQualityString();
+             if (quality != null && quality.length() != 0) {
+--- a/goby-distribution/src/test/java/org/campagnelab/goby/readers/sam/RoundTripAlignment.java
++++ b/goby-distribution/src/test/java/org/campagnelab/goby/readers/sam/RoundTripAlignment.java
+@@ -32,9 +32,7 @@
+ import org.campagnelab.goby.reads.RandomAccessSequenceTestSupport;
+ import htsjdk.samtools.ValidationStringency;
+ import it.unimi.dsi.logging.ProgressLogger;
+-import htsjdk.samtools.SAMFileReader;
+-import htsjdk.samtools.SAMRecord;
+-import htsjdk.samtools.SAMRecordIterator;
++import htsjdk.samtools.*;
+ import org.apache.commons.io.FilenameUtils;
+ import org.slf4j.Logger;
+ import org.slf4j.LoggerFactory;
+@@ -172,12 +170,15 @@
+         }
+ 
+         LOG.info("Comparing source bam and destination bam");
+-        final SAMFileReader sourceParser = new SAMFileReader(new FileInputStream(sourceBamFilename));
+-        final SAMFileReader destParser = new SAMFileReader(new FileInputStream(destBamFilename));
++        final SamInputResource sirSource = SamInputResource.of(new FileInputStream(sourceBamFilename));
++        final SamReaderFactory srfSource = SamReaderFactory.makeDefault().validationStringency(ValidationStringency.SILENT);
++        final SamInputResource sirDest = SamInputResource.of(new FileInputStream(destBamFilename));
++        final SamReaderFactory srfDest = SamReaderFactory.makeDefault().validationStringency(ValidationStringency.SILENT);
++
++        final SamReader sourceParser = srfSource.open(sirSource);
++        final SamReader destParser = srfDest.open(sirDest);
+         // We need to set the validation to silent because an incomplete file (if the source isn't the entire file)
+         // we can see errors that wouldn't exist in a real conversion.
+-        sourceParser.setValidationStringency(ValidationStringency.SILENT);
+-        destParser.setValidationStringency(ValidationStringency.SILENT);
+         final SAMRecordIterator sourceIterator = sourceParser.iterator();
+         final SAMRecordIterator destIterator = destParser.iterator();
+         AlignmentReaderImpl gobyReader = null;
+--- a/goby-distribution/src/test/java/org/campagnelab/goby/readers/sam/TestSamRecordParser.java
++++ b/goby-distribution/src/test/java/org/campagnelab/goby/readers/sam/TestSamRecordParser.java
+@@ -25,8 +25,7 @@
+ import htsjdk.samtools.ValidationStringency;
+ import it.unimi.dsi.lang.MutableString;
+ import junit.framework.Assert;
+-import htsjdk.samtools.SAMFileReader;
+-import htsjdk.samtools.SAMRecord;
++import htsjdk.samtools.*;
+ import org.apache.commons.io.FilenameUtils;
+ import org.slf4j.Logger;
+ import org.junit.BeforeClass;
+@@ -65,8 +64,10 @@
+     // like 9 no genome
+     public void testSamToCompactTrickCase9NoGenome() throws IOException {
+         final String inputFile = "test-data/splicedsamhelper/tricky-spliced-9.sam";
+-        final SAMFileReader parser = new SAMFileReader(new FileInputStream(inputFile));
+-        parser.setValidationStringency(ValidationStringency.SILENT);
++        final SamInputResource sir = SamInputResource.of(new FileInputStream(inputFile));
++        final SamReaderFactory srf = SamReaderFactory.makeDefault().validationStringency(ValidationStringency.SILENT);
++
++        final SamReader parser = srf.open(sir);
+         final SamRecordParser recordParser = new SamRecordParser();
+         for (final SAMRecord samRecord : new SAMRecordIterable(parser.iterator())) {
+ 
+@@ -84,8 +85,10 @@
+     public void testSamToCompactTrickCase10NoGenome() throws IOException {
+ 
+         final String inputFile = "test-data/splicedsamhelper/tricky-spliced-10.sam";
+-        final SAMFileReader parser = new SAMFileReader(new FileInputStream(inputFile));
+-        parser.setValidationStringency(ValidationStringency.SILENT);
++        final SamInputResource sir = SamInputResource.of(new FileInputStream(inputFile));
++        final SamReaderFactory srf = SamReaderFactory.makeDefault().validationStringency(ValidationStringency.SILENT);
++
++        final SamReader parser = srf.open(sir);
+         final SamRecordParser recordParser = new SamRecordParser();
+         for (final SAMRecord samRecord : new SAMRecordIterable(parser.iterator())) {
+ 
+@@ -103,8 +106,10 @@
+     @Test
+     public void testSamToCompactTrickCase11() throws IOException {
+         final String inputFile = "test-data/splicedsamhelper/tricky-spliced-11.sam";
+-        final SAMFileReader parser = new SAMFileReader(new FileInputStream(inputFile));
+-        parser.setValidationStringency(ValidationStringency.SILENT);
++        final SamInputResource sir = SamInputResource.of(new FileInputStream(inputFile));
++        final SamReaderFactory srf = SamReaderFactory.makeDefault().validationStringency(ValidationStringency.SILENT);
++
++        final SamReader parser = srf.open(sir);
+         final SamRecordParser recordParser = new SamRecordParser();
+         for (final SAMRecord samRecord : new SAMRecordIterable(parser.iterator())) {
+ 
+@@ -121,8 +126,11 @@
+     public void testSamToCompactTrickCase12NoGenome() throws IOException {
+ 
+         final String inputFile = "test-data/splicedsamhelper/tricky-spliced-12.sam";
+-        final SAMFileReader parser = new SAMFileReader(new FileInputStream(inputFile));
+         final SamRecordParser recordParser = new SamRecordParser();
++        final SamInputResource sir = SamInputResource.of(new FileInputStream(inputFile));
++        final SamReaderFactory srf = SamReaderFactory.makeDefault().validationStringency(ValidationStringency.SILENT);
++
++        final SamReader parser = srf.open(sir);
+         for (final SAMRecord samRecord : new SAMRecordIterable(parser.iterator())) {
+ 
+             final GobySamRecord gobySamRecord = recordParser.processRead(samRecord);
+@@ -146,7 +154,10 @@
+     public void testSamToCompactTrickCase13NoGenomeSoftClips() throws IOException {
+ 
+         final String inputFile = "test-data/splicedsamhelper/tricky-spliced-13.sam";
+-        final SAMFileReader parser = new SAMFileReader(new FileInputStream(inputFile));
++        final SamInputResource sir = SamInputResource.of(new FileInputStream(inputFile));
++        final SamReaderFactory srf = SamReaderFactory.makeDefault().validationStringency(ValidationStringency.SILENT);
++
++        final SamReader parser = srf.open(sir);
+         final SamRecordParser recordParser = new SamRecordParser();
+         for (final SAMRecord samRecord : new SAMRecordIterable(parser.iterator())) {
+ 
+@@ -179,8 +190,10 @@
+     public void testSamToCompactTrickCase13SoftClipsWithGenome() throws IOException {
+ 
+         final String inputFile = "test-data/splicedsamhelper/tricky-spliced-14.sam";
+-        final SAMFileReader parser = new SAMFileReader(new FileInputStream(inputFile));
+-        parser.setValidationStringency(ValidationStringency.SILENT);
++        final SamInputResource sir = SamInputResource.of(new FileInputStream(inputFile));
++        final SamReaderFactory srf = SamReaderFactory.makeDefault().validationStringency(ValidationStringency.SILENT);
++
++        final SamReader parser = srf.open(sir);
+ 
+         final SamRecordParser recordParser = new SamRecordParser();
+ 
+@@ -209,7 +222,10 @@
+     public void testSamToCompactTrickCase15NoGenomeThreeSplice() throws IOException {
+ 
+         final String inputFile = "test-data/splicedsamhelper/tricky-spliced-15.sam";
+-        final SAMFileReader parser = new SAMFileReader(new FileInputStream(inputFile));
++        final SamInputResource sir = SamInputResource.of(new FileInputStream(inputFile));
++        final SamReaderFactory srf = SamReaderFactory.makeDefault().validationStringency(ValidationStringency.SILENT);
++
++        final SamReader parser = srf.open(sir);
+         final SamRecordParser recordParser = new SamRecordParser();
+         for (final SAMRecord samRecord : new SAMRecordIterable(parser.iterator())) {
+             final GobySamRecord gobySamRecord = recordParser.processRead(samRecord);
+@@ -247,8 +263,10 @@
+     public void testSamToCompactTrickCase16() throws IOException {
+ 
+         final String inputFile = "test-data/splicedsamhelper/tricky-spliced-16.sam";
+-        final SAMFileReader parser = new SAMFileReader(new FileInputStream(inputFile));
+-        parser.setValidationStringency(ValidationStringency.SILENT);
++        final SamInputResource sir = SamInputResource.of(new FileInputStream(inputFile));
++        final SamReaderFactory srf = SamReaderFactory.makeDefault().validationStringency(ValidationStringency.SILENT);
++
++        final SamReader parser = srf.open(sir);
+         final SamRecordParser recordParser = new SamRecordParser();
+         for (final SAMRecord samRecord : new SAMRecordIterable(parser.iterator())) {
+             final GobySamRecord gobySamRecord = recordParser.processRead(samRecord);
+@@ -337,8 +355,10 @@
+     @Test
+     public void testSamToCompactTrickCase17() throws IOException {
+         final String inputFile = "test-data/splicedsamhelper/tricky-spliced-17.sam";
+-        final SAMFileReader parser = new SAMFileReader(new FileInputStream(inputFile));
+-        parser.setValidationStringency(ValidationStringency.SILENT);
++        final SamInputResource sir = SamInputResource.of(new FileInputStream(inputFile));
++        final SamReaderFactory srf = SamReaderFactory.makeDefault().validationStringency(ValidationStringency.SILENT);
++
++        final SamReader parser = srf.open(sir);
+         final SamRecordParser recordParser = new SamRecordParser();
+         for (final SAMRecord samRecord : new SAMRecordIterable(parser.iterator())) {
+             final GobySamRecord gobySamRecord = recordParser.processRead(samRecord);
+@@ -422,8 +442,10 @@
+     @Test
+     public void testDelNonSplice1() throws IOException {
+         final String inputFile = "test-data/splicedsamhelper/del-nonsplice-1.sam";
+-        final SAMFileReader parser = new SAMFileReader(new FileInputStream(inputFile));
+-        parser.setValidationStringency(ValidationStringency.SILENT);
++        final SamInputResource sir = SamInputResource.of(new FileInputStream(inputFile));
++        final SamReaderFactory srf = SamReaderFactory.makeDefault().validationStringency(ValidationStringency.SILENT);
++
++        final SamReader parser = srf.open(sir);
+         final SamRecordParser recordParser = new SamRecordParser();
+         for (final SAMRecord samRecord : new SAMRecordIterable(parser.iterator())) {
+             final GobySamRecord gobySamRecord = recordParser.processRead(samRecord);
+@@ -453,8 +475,10 @@
+     @Test
+     public void testLeftPadding1() throws IOException {
+         final String inputFile = "test-data/splicedsamhelper/leftpad-nosplice-1.sam";
+-        final SAMFileReader parser = new SAMFileReader(new FileInputStream(inputFile));
+-        parser.setValidationStringency(ValidationStringency.SILENT);
++        final SamInputResource sir = SamInputResource.of(new FileInputStream(inputFile));
++        final SamReaderFactory srf = SamReaderFactory.makeDefault().validationStringency(ValidationStringency.SILENT);
++
++        final SamReader parser = srf.open(sir);
+         final SamRecordParser recordParser = new SamRecordParser();
+         for (final SAMRecord samRecord : new SAMRecordIterable(parser.iterator())) {
+             final GobySamRecord gobySamRecord = recordParser.processRead(samRecord);
+@@ -491,8 +515,10 @@
+     @Test
+     public void testSeqVarReads() throws IOException {
+         final String inputFile = "test-data/seq-var-test/seq-var-reads-gsnap.sam";
+-        final SAMFileReader parser = new SAMFileReader(new FileInputStream(inputFile));
+-        parser.setValidationStringency(ValidationStringency.SILENT);
++        final SamInputResource sir = SamInputResource.of(new FileInputStream(inputFile));
++        final SamReaderFactory srf = SamReaderFactory.makeDefault().validationStringency(ValidationStringency.SILENT);
++
++        final SamReader parser = srf.open(sir);
+         final SamRecordParser recordParser = new SamRecordParser();
+         final PositionToBasesMap<PerQueryAlignmentData> seqvarDataMap = TestIteratedSortedAlignment2.readSeqVarFile(
+                 "test-data/seq-var-test/seq-var-reads-gsnap.seqvar");


=====================================
debian/patches/using_jbzip2.patch
=====================================
@@ -0,0 +1,48 @@
+--- a/goby-distribution/src/main/java/org/campagnelab/goby/compression/BZip2ChunkCodec.java
++++ b/goby-distribution/src/main/java/org/campagnelab/goby/compression/BZip2ChunkCodec.java
+@@ -19,8 +19,8 @@
+ package org.campagnelab.goby.compression;
+ 
+ import com.google.protobuf.Message;
+-import org.apache.tools.bzip2.CBZip2InputStream;
+-import org.apache.tools.bzip2.CBZip2OutputStream;
++import org.itadaki.bzip2.BZip2InputStream;
++import org.itadaki.bzip2.BZip2OutputStream;
+ 
+ import java.io.*;
+ 
+@@ -76,7 +76,7 @@
+ 
+ 
+         byteBuffer.write(magicSignature);
+-        final OutputStream bZip2OutputStream = new CBZip2OutputStream(byteBuffer);
++        final OutputStream bZip2OutputStream = new BZip2OutputStream(byteBuffer);
+         readCollection.writeTo(bZip2OutputStream);
+         bZip2OutputStream.flush();
+         bZip2OutputStream.close();
+@@ -93,7 +93,7 @@
+         }
+ 
+         // remove the magic numbers:
+-        final CBZip2InputStream uncompressStream = new CBZip2InputStream(new ByteArrayInputStream(bytes, 3, bytes.length));
++        final BZip2InputStream uncompressStream = new BZip2InputStream(new ByteArrayInputStream(bytes, 3, bytes.length), false);
+         try {
+             return parser.parse(uncompressStream);
+         } finally {
+--- a/goby-io/pom.xml
++++ b/goby-io/pom.xml
+@@ -451,6 +451,14 @@
+          <version>debian</version>
+      </dependency>
+ 
++     <dependency>
++         <groupId>org.itadaki</groupId>
++         <artifactId>bzip2</artifactId>
++         <version>0.9.1</version>
++         <scope>system</scope>
++         <systemPath>/usr/share/java/jbzip2-0.9.1.jar</systemPath>
++     </dependency>
++
+  </dependencies>
+ 
+ </project>


=====================================
debian/rules
=====================================
@@ -16,3 +16,15 @@
 #	dh_auto_configure
 #	ln -s ../debian/buildsupport/build.xml buildsupport/build.xml
 #	ln -s ../debian/buildsupport/gitant buildsupport/gitant
+
+override_dh_auto_clean:
+	dh_auto_clean
+	$(RM) goby-distribution/test-data
+
+override_dh_auto_test:
+ifeq (,$(filter nocheck,$(DEB_BUILD_OPTIONS)))
+	# Create a symlink to the directory with test data for tests run from the
+	# goby-distribution directory.
+	ln -s ../test-data goby-distribution/test-data
+	dh_auto_test
+endif



View it on GitLab: https://salsa.debian.org/med-team/libgoby-java/-/compare/e007855ad41bb8220531536dc66c3e679a17df41...1e72a3f187f726b1f77b1b27323c42aa69ca70cb

-- 
View it on GitLab: https://salsa.debian.org/med-team/libgoby-java/-/compare/e007855ad41bb8220531536dc66c3e679a17df41...1e72a3f187f726b1f77b1b27323c42aa69ca70cb
You're receiving this email because of your account on salsa.debian.org.


-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://alioth-lists.debian.net/pipermail/debian-med-commit/attachments/20201110/989aa813/attachment-0001.html>


More information about the debian-med-commit mailing list