[med-svn] [trimmomatic] 01/10: Imported Upstream version 0.35+dfsg
Andreas Tille
tille at debian.org
Thu Nov 26 10:08:44 UTC 2015
This is an automated email from the git hooks/post-receive script.
tille pushed a commit to branch master
in repository trimmomatic.
commit 56676b6f503b871735b967c50827048d3b8d2023
Author: Andreas Tille <tille at debian.org>
Date: Thu Nov 26 09:58:42 2015 +0100
Imported Upstream version 0.35+dfsg
---
adapters/TruSeq2-PE.fa | 2 +-
adapters/TruSeq2-SE.fa | 2 +-
build.xml | 2 +-
src/org/usadellab/trimmomatic/Trimmomatic.java | 41 ++++-
src/org/usadellab/trimmomatic/TrimmomaticPE.java | 169 ++++++++++++---------
src/org/usadellab/trimmomatic/TrimmomaticSE.java | 94 +++++++-----
.../trimmomatic/fastq/FastqNamePattern.java | 82 ++++++++++
.../usadellab/trimmomatic/fastq/FastqParser.java | 10 +-
.../usadellab/trimmomatic/fastq/FastqRecord.java | 2 +-
.../trimmomatic/fastq/PairingValidator.java | 131 ++++++++++++++++
.../trimmomatic/threading/BlockOfRecords.java | 1 +
.../trimmomatic/threading/BlockOfWork.java | 12 +-
.../usadellab/trimmomatic/trim/CropTrimmer.java | 21 +++
.../trimmomatic/trim/IlluminaClippingTrimmer.java | 33 ++--
.../usadellab/trimmomatic/trim/MaxLenTrimmer.java | 29 ++++
.../usadellab/trimmomatic/trim/TrimmerFactory.java | 13 +-
.../trimmomatic/util/ConcatGZIPInputStream.java | 38 ++++-
src/org/usadellab/trimmomatic/util/Logger.java | 78 ++++++++++
18 files changed, 619 insertions(+), 141 deletions(-)
diff --git a/adapters/TruSeq2-PE.fa b/adapters/TruSeq2-PE.fa
index cef17cc..93ce633 100644
--- a/adapters/TruSeq2-PE.fa
+++ b/adapters/TruSeq2-PE.fa
@@ -13,4 +13,4 @@ AGATCGGAAGAGCGGTTCAGCAGGAATGCCGAGACCGATCTCGTATGCCGTCTTCTGCTTG
>FlowCell1
TTTTTTTTTTAATGATACGGCGACCACCGAGATCTACAC
>FlowCell2
-TTTTTTTTTTCAAGCAGAAGACGGCATACGA
+TTTTTTTTTTCAAGCAGAAGACGGCATACGA
\ No newline at end of file
diff --git a/adapters/TruSeq2-SE.fa b/adapters/TruSeq2-SE.fa
index 30eaeae..9ff36ad 100644
--- a/adapters/TruSeq2-SE.fa
+++ b/adapters/TruSeq2-SE.fa
@@ -3,4 +3,4 @@ AGATCGGAAGAGCTCGTATGCCGTCTTCTGCTTG
>TruSeq2_PE_f
AGATCGGAAGAGCGTCGTGTAGGGAAAGAGTGT
>TruSeq2_PE_r
-AGATCGGAAGAGCGGTTCAGCAGGAATGCCGAG
+AGATCGGAAGAGCGGTTCAGCAGGAATGCCGAG
\ No newline at end of file
diff --git a/build.xml b/build.xml
index 9b568b2..2377c50 100644
--- a/build.xml
+++ b/build.xml
@@ -1,5 +1,5 @@
<project name="Trimmomatic" default="dist" basedir=".">
- <property name="version" value="0.33"/>
+ <property name="version" value="0.35"/>
<property name="src" location="src" />
<property name="lib" location="lib" />
diff --git a/src/org/usadellab/trimmomatic/Trimmomatic.java b/src/org/usadellab/trimmomatic/Trimmomatic.java
index 6d84923..16d6032 100644
--- a/src/org/usadellab/trimmomatic/Trimmomatic.java
+++ b/src/org/usadellab/trimmomatic/Trimmomatic.java
@@ -1,23 +1,50 @@
package org.usadellab.trimmomatic;
import java.io.IOException;
+import java.util.ArrayList;
import java.util.Arrays;
+import java.util.Iterator;
+import java.util.List;
+
+import org.usadellab.trimmomatic.trim.Trimmer;
+import org.usadellab.trimmomatic.trim.TrimmerFactory;
+import org.usadellab.trimmomatic.util.Logger;
public class Trimmomatic
{
- private static final int MAX_AUTO_THREADS=16;
+ private static final int MAX_AUTO_THREADS_THRESHOLD=8;
+ private static final int MAX_AUTO_THREADS_ALLOC=4;
- public static int calcAutoThreadCount()
+ static int calcAutoThreadCount()
{
int cpus=Runtime.getRuntime().availableProcessors();
- if(cpus>MAX_AUTO_THREADS)
- return MAX_AUTO_THREADS;
+ if(cpus<=MAX_AUTO_THREADS_THRESHOLD)
+ {
+ if(cpus<MAX_AUTO_THREADS_ALLOC)
+ return cpus;
+
+ return MAX_AUTO_THREADS_ALLOC;
+ }
- return cpus;
+ return 1;
}
+
+ static Trimmer[] createTrimmers(Logger logger, Iterator<String> nonOptionArgsIter) throws IOException
+ {
+ TrimmerFactory fac = new TrimmerFactory(logger);
+
+ List<Trimmer> trimmerList=new ArrayList<Trimmer>();
+ while(nonOptionArgsIter.hasNext())
+ trimmerList.add(fac.makeTrimmer(nonOptionArgsIter.next()));
+
+ Trimmer trimmers[] = trimmerList.toArray(new Trimmer[0]);
+
+ return trimmers;
+ }
+
/**
* @param args
*/
@@ -45,9 +72,9 @@ public class Trimmomatic
if(showUsage)
{
System.err.println("Usage: ");
- System.err.println(" PE [-threads <threads>] [-phred33|-phred64] [-trimlog <trimLogFile>] [-basein <inputBase> | <inputFile1> <inputFile2>] [-baseout <outputBase> | <outputFile1P> <outputFile1U> <outputFile2P> <outputFile2U>] <trimmer1>...");
+ System.err.println(" PE [-threads <threads>] [-phred33|-phred64] [-trimlog <trimLogFile>] [-quiet] [-validatePairs] [-basein <inputBase> | <inputFile1> <inputFile2>] [-baseout <outputBase> | <outputFile1P> <outputFile1U> <outputFile2P> <outputFile2U>] <trimmer1>...");
System.err.println(" or: ");
- System.err.println(" SE [-threads <threads>] [-phred33|-phred64] [-trimlog <trimLogFile>] <inputFile> <outputFile> <trimmer1>...");
+ System.err.println(" SE [-threads <threads>] [-phred33|-phred64] [-trimlog <trimLogFile>] [-quiet] <inputFile> <outputFile> <trimmer1>...");
System.exit(1);
}
}
diff --git a/src/org/usadellab/trimmomatic/TrimmomaticPE.java b/src/org/usadellab/trimmomatic/TrimmomaticPE.java
index 81b4745..613b675 100644
--- a/src/org/usadellab/trimmomatic/TrimmomaticPE.java
+++ b/src/org/usadellab/trimmomatic/TrimmomaticPE.java
@@ -3,6 +3,8 @@ package org.usadellab.trimmomatic;
import java.io.File;
import java.io.IOException;
import java.io.PrintStream;
+import java.util.ArrayList;
+import java.util.Iterator;
import java.util.List;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.Future;
@@ -12,6 +14,7 @@ import java.util.concurrent.TimeUnit;
import org.usadellab.trimmomatic.fastq.FastqParser;
import org.usadellab.trimmomatic.fastq.FastqRecord;
import org.usadellab.trimmomatic.fastq.FastqSerializer;
+import org.usadellab.trimmomatic.fastq.PairingValidator;
import org.usadellab.trimmomatic.threading.BlockOfRecords;
import org.usadellab.trimmomatic.threading.BlockOfWork;
import org.usadellab.trimmomatic.threading.ParserWorker;
@@ -20,6 +23,7 @@ import org.usadellab.trimmomatic.threading.TrimLogWorker;
import org.usadellab.trimmomatic.threading.TrimStatsWorker;
import org.usadellab.trimmomatic.trim.Trimmer;
import org.usadellab.trimmomatic.trim.TrimmerFactory;
+import org.usadellab.trimmomatic.util.Logger;
public class TrimmomaticPE extends Trimmomatic
{
@@ -37,14 +41,16 @@ public class TrimmomaticPE extends Trimmomatic
* MINLEN:<LENGTH> Drop the read if less than specified length
*/
- public TrimmomaticPE()
- {
+ private Logger logger;
+ public TrimmomaticPE(Logger logger)
+ {
+ this.logger=logger;
}
public void processSingleThreaded(FastqParser parser1, FastqParser parser2, FastqSerializer serializer1P,
FastqSerializer serializer1U, FastqSerializer serializer2P, FastqSerializer serializer2U,
- Trimmer trimmers[], PrintStream trimLogStream) throws IOException
+ Trimmer trimmers[], PrintStream trimLogStream, PairingValidator pairingValidator) throws IOException
{
TrimStats stats = new TrimStats();
@@ -56,6 +62,9 @@ public class TrimmomaticPE extends Trimmomatic
originalRecs[0] = recs[0] = parser1.next();
originalRecs[1] = recs[1] = parser2.next();
+ if(pairingValidator!=null)
+ pairingValidator.validatePair(recs[0], recs[1]);
+
for (int i = 0; i < trimmers.length; i++)
{
try
@@ -64,7 +73,7 @@ public class TrimmomaticPE extends Trimmomatic
}
catch (RuntimeException e)
{
- System.err.println("Exception processing reads: " + originalRecs[0].getName() + " and "
+ logger.errorln("Exception processing reads: " + originalRecs[0].getName() + " and "
+ originalRecs[1].getName());
e.printStackTrace();
throw e;
@@ -106,12 +115,12 @@ public class TrimmomaticPE extends Trimmomatic
}
}
- System.err.println(stats.getStatsPE());
+ logger.infoln(stats.getStatsPE());
}
public void processMultiThreaded(FastqParser parser1, FastqParser parser2, FastqSerializer serializer1P,
FastqSerializer serializer1U, FastqSerializer serializer2P, FastqSerializer serializer2U,
- Trimmer trimmers[], PrintStream trimLogStream, int threads) throws IOException
+ Trimmer trimmers[], PrintStream trimLogStream, PairingValidator pairingValidator, int threads) throws IOException
{
ArrayBlockingQueue<List<FastqRecord>> parser1Queue = new ArrayBlockingQueue<List<FastqRecord>>(threads);
ArrayBlockingQueue<List<FastqRecord>> parser2Queue = new ArrayBlockingQueue<List<FastqRecord>>(threads);
@@ -200,8 +209,11 @@ public class TrimmomaticPE extends Trimmomatic
done2 = true;
}
+ if(pairingValidator!=null)
+ pairingValidator.validatePairs(recs1, recs2);
+
BlockOfRecords bor = new BlockOfRecords(recs1, recs2);
- BlockOfWork work = new BlockOfWork(trimmers, bor, true, trimLogStream != null);
+ BlockOfWork work = new BlockOfWork(logger, trimmers, bor, true, trimLogStream != null);
while (taskQueue.remainingCapacity() < 1)
Thread.sleep(100);
@@ -237,7 +249,7 @@ public class TrimmomaticPE extends Trimmomatic
trimLogThread.join();
statsThread.join();
- System.err.println(statsWorker.getStats().getStatsPE());
+ logger.infoln(statsWorker.getStats().getStatsPE());
}
catch (InterruptedException e)
{
@@ -246,7 +258,7 @@ public class TrimmomaticPE extends Trimmomatic
}
public void process(File input1, File input2, File output1P, File output1U, File output2P, File output2U,
- Trimmer trimmers[], int phredOffset, File trimLog, int threads) throws IOException
+ Trimmer trimmers[], int phredOffset, File trimLog, boolean validatePairing, int threads) throws IOException
{
FastqParser parser1 = new FastqParser(phredOffset);
parser1.parse(input1);
@@ -261,13 +273,13 @@ public class TrimmomaticPE extends Trimmomatic
if(phred1==phred2 && phred1!=0)
{
- System.err.println("Quality encoding detected as phred"+phred1);
+ logger.infoln("Quality encoding detected as phred"+phred1);
parser1.setPhredOffset(phred1);
parser2.setPhredOffset(phred1);
}
else
{
- System.err.println("Error: Unable to detect quality encoding");
+ logger.errorln("Error: Unable to detect quality encoding");
System.exit(1);
}
}
@@ -290,12 +302,17 @@ public class TrimmomaticPE extends Trimmomatic
// FileOutputStream(trimLog),1000000),false);
trimLogStream = new PrintStream(trimLog);
+ PairingValidator pairingValidator=null;
+
+ if(validatePairing)
+ pairingValidator=new PairingValidator(logger);
+
if (threads == 1)
processSingleThreaded(parser1, parser2, serializer1P, serializer1U, serializer2P, serializer2U, trimmers,
- trimLogStream);
+ trimLogStream, pairingValidator);
else
processMultiThreaded(parser1, parser2, serializer1P, serializer1U, serializer2P, serializer2U, trimmers,
- trimLogStream, threads);
+ trimLogStream, pairingValidator, threads);
serializer1P.close();
serializer1U.close();
@@ -392,63 +409,83 @@ public class TrimmomaticPE extends Trimmomatic
String templateOutput=null;
boolean badOption = false;
-
+ boolean validatePairs = false;
+ boolean quiet=false;
+
File trimLog = null;
- while (argIndex < args.length && args[argIndex].startsWith("-"))
+ List<String> nonOptionArgs=new ArrayList<String>();
+
+ while (argIndex < args.length)
{
String arg = args[argIndex++];
- if (arg.equals("-phred33"))
- phredOffset = 33;
- else if (arg.equals("-phred64"))
- phredOffset = 64;
- else if (arg.equals("-threads"))
- threads = Integer.parseInt(args[argIndex++]);
- else if (arg.equals("-trimlog"))
- {
- if (argIndex < args.length)
- trimLog = new File(args[argIndex++]);
- else
- badOption = true;
- }
- else if (arg.equals("-basein"))
- {
- if (argIndex < args.length)
- templateInput = args[argIndex++];
- else
- badOption = true;
- }
- else if (arg.equals("-baseout"))
- {
- if (argIndex < args.length)
- templateOutput = args[argIndex++];
+
+ if(arg.startsWith("-"))
+ {
+ if (arg.equals("-phred33"))
+ phredOffset = 33;
+ else if (arg.equals("-phred64"))
+ phredOffset = 64;
+ else if (arg.equals("-threads"))
+ threads = Integer.parseInt(args[argIndex++]);
+ else if (arg.equals("-trimlog"))
+ {
+ if (argIndex < args.length)
+ trimLog = new File(args[argIndex++]);
+ else
+ badOption = true;
+ }
+ else if (arg.equals("-basein"))
+ {
+ if (argIndex < args.length)
+ templateInput = args[argIndex++];
+ else
+ badOption = true;
+ }
+ else if (arg.equals("-baseout"))
+ {
+ if (argIndex < args.length)
+ templateOutput = args[argIndex++];
+ else
+ badOption = true;
+ }
+ else if (arg.equals("-validatePairs"))
+ validatePairs=true;
+ else if (arg.equals("-quiet"))
+ quiet=true;
else
+ {
+ System.err.println("Unknown option " + arg);
badOption = true;
+ }
}
else
- {
- System.err.println("Unknown option " + arg);
- badOption = true;
- }
+ nonOptionArgs.add(arg);
}
int additionalArgs=1+(templateInput==null?2:0)+(templateOutput==null?4:0);
- if (args.length - argIndex < additionalArgs || badOption)
+ if ((nonOptionArgs.size() < additionalArgs) || badOption)
return false;
-
- System.err.print("TrimmomaticPE: Started with arguments:");
+
+ Logger logger=new Logger(true,true,!quiet);
+
+
+ logger.infoln("TrimmomaticPE: Started with arguments:");
for (String arg : args)
- System.err.print(" " + arg);
- System.err.println();
+ logger.info(" " + arg);
+ logger.infoln();
if(threads==0)
{
threads=calcAutoThreadCount();
if(threads>1)
- System.err.println("Multiple cores found: Using "+threads+" threads");
+ logger.infoln("Multiple cores found: Using "+threads+" threads");
}
+
+ Iterator<String> nonOptionArgsIter=nonOptionArgs.iterator();
+
File inputs[],outputs[];
if(templateInput!=null)
@@ -456,17 +493,17 @@ public class TrimmomaticPE extends Trimmomatic
inputs=calculateTemplatedInput(templateInput);
if(inputs==null)
{
- System.err.println("Unable to determine input files from: "+templateInput);
+ logger.errorln("Unable to determine input files from: "+templateInput);
System.exit(1);
}
- System.out.println("Using templated Input files: "+inputs[0]+" "+inputs[1]);
+ logger.infoln("Using templated Input files: "+inputs[0]+" "+inputs[1]);
}
else
{
inputs=new File[2];
- inputs[0]=new File(args[argIndex++]);
- inputs[1]=new File(args[argIndex++]);
+ inputs[0]=new File(nonOptionArgsIter.next());
+ inputs[1]=new File(nonOptionArgsIter.next());
}
if(templateOutput!=null)
@@ -478,27 +515,23 @@ public class TrimmomaticPE extends Trimmomatic
System.exit(1);
}
- System.out.println("Using templated Output files: "+outputs[0]+" "+outputs[1]+" "+outputs[2]+" "+outputs[3]);
+ logger.infoln("Using templated Output files: "+outputs[0]+" "+outputs[1]+" "+outputs[2]+" "+outputs[3]);
}
else
{
outputs=new File[4];
- outputs[0]=new File(args[argIndex++]);
- outputs[1]=new File(args[argIndex++]);
- outputs[2]=new File(args[argIndex++]);
- outputs[3]=new File(args[argIndex++]);
+ outputs[0]=new File(nonOptionArgsIter.next());
+ outputs[1]=new File(nonOptionArgsIter.next());
+ outputs[2]=new File(nonOptionArgsIter.next());
+ outputs[3]=new File(nonOptionArgsIter.next());
}
- TrimmerFactory fac = new TrimmerFactory();
- Trimmer trimmers[] = new Trimmer[args.length - argIndex];
-
- for (int i = 0; i < trimmers.length; i++)
- trimmers[i] = fac.makeTrimmer(args[i + argIndex]);
-
- TrimmomaticPE tm = new TrimmomaticPE();
- tm.process(inputs[0], inputs[1], outputs[0], outputs[1], outputs[2], outputs[3], trimmers, phredOffset, trimLog, threads);
+ Trimmer trimmers[]=createTrimmers(logger, nonOptionArgsIter);
+
+ TrimmomaticPE tm = new TrimmomaticPE(logger);
+ tm.process(inputs[0], inputs[1], outputs[0], outputs[1], outputs[2], outputs[3], trimmers, phredOffset, trimLog, validatePairs, threads);
- System.err.println("TrimmomaticPE: Completed successfully");
+ logger.infoln("TrimmomaticPE: Completed successfully");
return true;
}
@@ -507,7 +540,7 @@ public class TrimmomaticPE extends Trimmomatic
if (!run(args))
{
System.err
- .println("Usage: TrimmomaticPE [-threads <threads>] [-phred33|-phred64] [-trimlog <trimLogFile>] [-basein <inputBase> | <inputFile1> <inputFile2>] [-baseout <outputBase> | <outputFile1P> <outputFile1U> <outputFile2P> <outputFile2U>] <trimmer1>...");
+ .println("Usage: TrimmomaticPE [-threads <threads>] [-phred33|-phred64] [-trimlog <trimLogFile>] [-quiet] [-validatePairs] [-basein <inputBase> | <inputFile1> <inputFile2>] [-baseout <outputBase> | <outputFile1P> <outputFile1U> <outputFile2P> <outputFile2U>] <trimmer1>...");
System.exit(1);
}
}
diff --git a/src/org/usadellab/trimmomatic/TrimmomaticSE.java b/src/org/usadellab/trimmomatic/TrimmomaticSE.java
index 4307274..6855b96 100644
--- a/src/org/usadellab/trimmomatic/TrimmomaticSE.java
+++ b/src/org/usadellab/trimmomatic/TrimmomaticSE.java
@@ -3,6 +3,8 @@ package org.usadellab.trimmomatic;
import java.io.File;
import java.io.IOException;
import java.io.PrintStream;
+import java.util.ArrayList;
+import java.util.Iterator;
import java.util.List;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.Future;
@@ -20,6 +22,7 @@ import org.usadellab.trimmomatic.threading.TrimLogWorker;
import org.usadellab.trimmomatic.threading.TrimStatsWorker;
import org.usadellab.trimmomatic.trim.Trimmer;
import org.usadellab.trimmomatic.trim.TrimmerFactory;
+import org.usadellab.trimmomatic.util.Logger;
public class TrimmomaticSE extends Trimmomatic
{
@@ -37,9 +40,11 @@ public class TrimmomaticSE extends Trimmomatic
* MINLEN:<LENGTH> Drop the read if less than specified length
*/
- public TrimmomaticSE()
- {
+ private Logger logger;
+ public TrimmomaticSE(Logger logger)
+ {
+ this.logger=logger;
}
public void processSingleThreaded(FastqParser parser, FastqSerializer serializer, Trimmer trimmers[],
@@ -62,7 +67,7 @@ public class TrimmomaticSE extends Trimmomatic
}
catch (RuntimeException e)
{
- System.err.println("Exception processing read: " + originalRecs[0].getName());
+ logger.errorln("Exception processing read: " + originalRecs[0].getName());
throw e;
}
}
@@ -97,7 +102,7 @@ public class TrimmomaticSE extends Trimmomatic
}
}
- System.err.println(stats.getStatsSE());
+ logger.infoln(stats.getStatsSE());
}
public void processMultiThreaded(FastqParser parser, FastqSerializer serializer, Trimmer trimmers[],
@@ -151,7 +156,7 @@ public class TrimmomaticSE extends Trimmomatic
done = true;
BlockOfRecords bor = new BlockOfRecords(recs1, null);
- BlockOfWork work = new BlockOfWork(trimmers, bor, false, trimLogStream != null);
+ BlockOfWork work = new BlockOfWork(logger, trimmers, bor, false, trimLogStream != null);
while (taskQueue.remainingCapacity() < 1)
Thread.sleep(100);
@@ -176,7 +181,7 @@ public class TrimmomaticSE extends Trimmomatic
trimLogThread.join();
statsThread.join();
- System.err.println(statsWorker.getStats().getStatsSE());
+ logger.infoln(statsWorker.getStats().getStatsSE());
}
catch (InterruptedException e)
{
@@ -196,12 +201,12 @@ public class TrimmomaticSE extends Trimmomatic
int phred=parser.determinePhredOffset();
if(phred!=0)
{
- System.err.println("Quality encoding detected as phred"+phred);
+ logger.infoln("Quality encoding detected as phred"+phred);
parser.setPhredOffset(phred);
}
else
{
- System.err.println("Error: Unable to detect quality encoding");
+ logger.errorln("Error: Unable to detect quality encoding");
System.exit(1);
}
}
@@ -233,58 +238,69 @@ public class TrimmomaticSE extends Trimmomatic
boolean badOption = false;
File trimLog = null;
+ boolean quiet=false;
- while (argIndex < args.length && args[argIndex].startsWith("-"))
+ List<String> nonOptionArgs=new ArrayList<String>();
+
+ while (argIndex < args.length)
{
String arg = args[argIndex++];
- if (arg.equals("-phred33"))
- phredOffset = 33;
- else if (arg.equals("-phred64"))
- phredOffset = 64;
- else if (arg.equals("-threads"))
- threads = Integer.parseInt(args[argIndex++]);
- else if (arg.equals("-trimlog"))
- {
- if (argIndex < args.length)
- trimLog = new File(args[argIndex++]);
+
+ if(arg.startsWith("-"))
+ {
+ if (arg.equals("-phred33"))
+ phredOffset = 33;
+ else if (arg.equals("-phred64"))
+ phredOffset = 64;
+ else if (arg.equals("-threads"))
+ threads = Integer.parseInt(args[argIndex++]);
+ else if (arg.equals("-trimlog"))
+ {
+ if (argIndex < args.length)
+ trimLog = new File(args[argIndex++]);
+ else
+ badOption = true;
+ }
+ else if (arg.equals("-quiet"))
+ quiet=true;
+
else
+ {
+ System.err.println("Unknown option " + arg);
badOption = true;
+ }
}
else
- {
- System.err.println("Unknown option " + arg);
- badOption = true;
- }
+ nonOptionArgs.add(arg);
}
- if (args.length - argIndex < 3 || badOption)
+ if ((nonOptionArgs.size() < 3) || badOption)
return false;
- System.err.print("TrimmomaticSE: Started with arguments:");
+ Logger logger=new Logger(true,true,!quiet);
+
+ logger.infoln("TrimmomaticSE: Started with arguments:");
for (String arg : args)
- System.err.print(" " + arg);
- System.err.println();
-
+ logger.info(" " + arg);
+ logger.infoln();
+
if(threads==0)
{
threads=calcAutoThreadCount();
- System.err.println("Automatically using "+threads+" threads");
+ logger.infoln("Automatically using "+threads+" threads");
}
+ Iterator<String> nonOptionArgsIter=nonOptionArgs.iterator();
- File input = new File(args[argIndex++]);
- File output = new File(args[argIndex++]);
-
- TrimmerFactory fac = new TrimmerFactory();
- Trimmer trimmers[] = new Trimmer[args.length - argIndex];
+ File input = new File(nonOptionArgsIter.next());
+ File output = new File(nonOptionArgsIter.next());
- for (int i = 0; i < trimmers.length; i++)
- trimmers[i] = fac.makeTrimmer(args[i + argIndex]);
+ Trimmer trimmers[]=createTrimmers(logger, nonOptionArgsIter);
- TrimmomaticSE tm = new TrimmomaticSE();
+ TrimmomaticSE tm = new TrimmomaticSE(logger);
tm.process(input, output, trimmers, phredOffset, trimLog, threads);
- System.err.println("TrimmomaticSE: Completed successfully");
+ logger.infoln("TrimmomaticSE: Completed successfully");
return true;
}
@@ -293,7 +309,7 @@ public class TrimmomaticSE extends Trimmomatic
if(!run(args))
{
System.err
- .println("Usage: TrimmomaticSE [-threads <threads>] [-phred33|-phred64] [-trimlog <trimLogFile>] <inputFile> <outputFile> <trimmer1>...");
+ .println("Usage: TrimmomaticSE [-threads <threads>] [-phred33|-phred64] [-trimlog <trimLogFile>] [-quiet] <inputFile> <outputFile> <trimmer1>...");
System.exit(1);
}
}
diff --git a/src/org/usadellab/trimmomatic/fastq/FastqNamePattern.java b/src/org/usadellab/trimmomatic/fastq/FastqNamePattern.java
new file mode 100644
index 0000000..77eed7e
--- /dev/null
+++ b/src/org/usadellab/trimmomatic/fastq/FastqNamePattern.java
@@ -0,0 +1,82 @@
+package org.usadellab.trimmomatic.fastq;
+
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+/*
+
+ at HWUSI-EAS100R:6:73:941:1973#0/1
+
+HWUSI-EAS100R the unique instrument name
+6 flowcell lane
+73 tile number within the flowcell lane
+941 'x'-coordinate of the cluster within the tile
+1973 'y'-coordinate of the cluster within the tile
+#0 index number for a multiplexed sample (0 for no indexing)
+/1 the member of a pair, /1 or /2 (paired-end or mate-pair reads only)
+
+
+EAS139 the unique instrument name
+136 the run id
+FC706VJ the flowcell id
+2 flowcell lane
+2104 tile number within the flowcell lane
+15343 'x'-coordinate of the cluster within the tile
+197393 'y'-coordinate of the cluster within the tile
+1 the member of a pair, 1 or 2 (paired-end or mate-pair reads only)
+Y Y if the read is filtered, N otherwise
+18 0 when none of the control bits are on, otherwise it is an even number
+ATCACG index sequence
+
+Also allow for SRA padding:
+
+ at SRR001666.1 071112_SLXA-EAS1_s_7:5:1:817:345 length=36
+
+*/
+
+// CASAVA_13("[@ ]([^:]*:[0-9]*:[0-9]*:[0-9]*:[0-9]*#[0-9]*)/[12]","$1"), // HWUSI-EAS100R:6:73:941:1973#0/1
+// SRR001666.1 071112_SLXA-EAS1_s_7:5:1:817:345 length=36
+
+public enum FastqNamePattern
+{
+ CASAVA_13("(.* )?([^:]+:[0-9]+:[0-9]+:[0-9]+:[0-9]+#[A-Z0-9]+).*","$2"), // HWUSI-EAS100R:6:73:941:1973#0/1 -> HWUSI-EAS100R:6:73:941:1973 or HWUSI-EAS100R:6:73:941:1973#NNNN/1
+ CASAVA_18("(.* )?([^:]+:[0-9]+:[A-Z0-9]+:[0-9]+:[0-9]+:[0-9]+:[0-9]+).*","$2"); // EAS139:136:FC706VJ:2:2104:15343:197393 1:Y:18:ATCACG
+
+ private Pattern pattern;
+ private String replacement;
+
+ FastqNamePattern(String patternStr, String replacement)
+ {
+ this.pattern=Pattern.compile(patternStr);
+ this.replacement=replacement;
+ }
+
+ public boolean match(String str)
+ {
+ return pattern.matcher(str).find();
+ }
+
+ public String canonicalizeOne(String str)
+ {
+ Matcher matcher=pattern.matcher(str);
+ if(!matcher.find())
+ return null;
+
+ return matcher.replaceAll(replacement);
+
+ }
+
+ public static String canonicalize(String str)
+ {
+ for(FastqNamePattern fnp: FastqNamePattern.values())
+ {
+ String canon=fnp.canonicalizeOne(str);
+
+ if(canon!=null)
+ return canon;
+ }
+
+ return null;
+ }
+
+}
diff --git a/src/org/usadellab/trimmomatic/fastq/FastqParser.java b/src/org/usadellab/trimmomatic/fastq/FastqParser.java
index 1235f15..139d31e 100644
--- a/src/org/usadellab/trimmomatic/fastq/FastqParser.java
+++ b/src/org/usadellab/trimmomatic/fastq/FastqParser.java
@@ -21,6 +21,7 @@ public class FastqParser {
private int phredOffset;
private ArrayDeque<FastqRecord> deque;
int qualHistogram[];
+ int patternHistogram[];
private PositionTrackingInputStream posTrackInputStream;
private BufferedReader reader;
@@ -68,8 +69,12 @@ public class FastqParser {
}
sequence = reader.readLine();
+ if(sequence==null)
+ throw new RuntimeException("Missing sequence line from record: " + name);
line = reader.readLine();
+ if(line==null)
+ throw new RuntimeException("Missing comment line from record: " + name);
if (line.charAt(0)=='+') {
comment = line.substring(1);
@@ -77,7 +82,10 @@ public class FastqParser {
throw new RuntimeException("Invalid FASTQ comment line: " + line);
}
- quality = reader.readLine();
+ quality = reader.readLine();
+ if(quality==null)
+ throw new RuntimeException("Missing quality line from record: " + name);
+
current = new FastqRecord(name, sequence, comment, quality, phredOffset);
}
diff --git a/src/org/usadellab/trimmomatic/fastq/FastqRecord.java b/src/org/usadellab/trimmomatic/fastq/FastqRecord.java
index a41f78c..592a755 100644
--- a/src/org/usadellab/trimmomatic/fastq/FastqRecord.java
+++ b/src/org/usadellab/trimmomatic/fastq/FastqRecord.java
@@ -28,7 +28,7 @@ public class FastqRecord
public FastqRecord(FastqRecord base, int headPos, int length)
{
if(headPos<0)
- System.err.println("Attempting invalid trim on "+base.name+" with length "+base.sequence.length()+": Wanted "+headPos+" to "+(headPos+length));
+ throw new RuntimeException("Attempting invalid trim on "+base.name+" with length "+base.sequence.length()+": Wanted "+headPos+" to "+(headPos+length));
int availableLength=base.getSequence().length();
if(headPos+length>availableLength)
diff --git a/src/org/usadellab/trimmomatic/fastq/PairingValidator.java b/src/org/usadellab/trimmomatic/fastq/PairingValidator.java
new file mode 100644
index 0000000..a9f1ac9
--- /dev/null
+++ b/src/org/usadellab/trimmomatic/fastq/PairingValidator.java
@@ -0,0 +1,131 @@
+package org.usadellab.trimmomatic.fastq;
+
+import java.util.Collection;
+import java.util.Iterator;
+import java.util.concurrent.atomic.AtomicBoolean;
+
+import org.usadellab.trimmomatic.util.Logger;
+
+public class PairingValidator
+{
+ private Logger logger;
+
+ private boolean complainedAlready;
+ private long offset;
+
+ public PairingValidator(Logger logger)
+ {
+ this.logger=logger;
+
+ complainedAlready=false;
+ offset=0;
+ }
+
+
+ private boolean validateNames(String name1, String name2)
+ {
+ String canon1=FastqNamePattern.canonicalize(name1);
+ String canon2=FastqNamePattern.canonicalize(name2);
+
+ if(canon1!=null && canon2!=null)
+ return canon1.equals(canon2);
+
+ String tokens1[]=name1.split(" ");
+ String tokens2[]=name2.split(" ");
+
+ String tok1=tokens1[0];
+ String tok2=tokens2[0];
+
+ if(tok1.length()!=tok2.length())
+ return false;
+
+ int len=tok1.length();
+
+ for(int i=0;i<len;i++)
+ {
+ char ch1=tok1.charAt(i);
+ char ch2=tok2.charAt(i);
+
+ if((ch1!=ch2) && (ch1!='1' || ch2!='2'))
+ return false;
+ }
+
+ return true;
+ }
+
+
+ public boolean validatePair(FastqRecord rec1, FastqRecord rec2)
+ {
+ if(rec1!=null)
+ {
+ if(rec2!=null)
+ {
+ String name1=rec1.getName();
+ String name2=rec2.getName();
+
+ if(!validateNames(name1,name2))
+ {
+ if(!complainedAlready)
+ {
+ complainedAlready=true;
+ logger.warnln("WARNING: Pair validation failed at record: "+offset);
+ logger.warnln(" Forward read: "+name1);
+ logger.warnln(" Reverse read: "+name2);
+ }
+
+ return false;
+ }
+ }
+ else
+ {
+ if(!complainedAlready)
+ {
+ complainedAlready=true;
+ String name1=rec1.getName();
+ logger.warnln("WARNING: Pair validation failed at record: "+offset);
+ logger.warnln(" Forward read: "+name1);
+ logger.warnln(" No more reverse reads");
+ }
+ return false;
+
+ }
+ }
+ else if(rec2!=null)
+ {
+ if(!complainedAlready)
+ {
+ complainedAlready=true;
+ String name2=rec2.getName();
+ logger.warnln("WARNING: Pair validation failed at record: "+offset);
+ logger.warnln(" No more forward reads");
+ logger.warnln(" Reverse read: "+name2);
+ }
+
+ return false;
+ }
+
+ offset++;
+ return true;
+ }
+
+
+ public boolean validatePairs(Collection<FastqRecord> col1, Collection<FastqRecord> col2)
+ {
+ Iterator<FastqRecord> iter1=col1.iterator();
+ Iterator<FastqRecord> iter2=col2.iterator();
+
+ while(iter1.hasNext() || iter2.hasNext())
+ {
+ FastqRecord rec1=iter1.hasNext()?iter1.next():null;
+ FastqRecord rec2=iter2.hasNext()?iter2.next():null;
+
+ if(!validatePair(rec1, rec2))
+ return false;
+
+ }
+
+ return true;
+ }
+
+
+}
diff --git a/src/org/usadellab/trimmomatic/threading/BlockOfRecords.java b/src/org/usadellab/trimmomatic/threading/BlockOfRecords.java
index 3dfba00..6f58284 100644
--- a/src/org/usadellab/trimmomatic/threading/BlockOfRecords.java
+++ b/src/org/usadellab/trimmomatic/threading/BlockOfRecords.java
@@ -1,5 +1,6 @@
package org.usadellab.trimmomatic.threading;
+import java.util.Iterator;
import java.util.List;
import org.usadellab.trimmomatic.TrimStats;
diff --git a/src/org/usadellab/trimmomatic/threading/BlockOfWork.java b/src/org/usadellab/trimmomatic/threading/BlockOfWork.java
index 8ebc67c..5c51da7 100644
--- a/src/org/usadellab/trimmomatic/threading/BlockOfWork.java
+++ b/src/org/usadellab/trimmomatic/threading/BlockOfWork.java
@@ -7,16 +7,22 @@ import java.util.concurrent.Callable;
import org.usadellab.trimmomatic.TrimStats;
import org.usadellab.trimmomatic.fastq.FastqRecord;
import org.usadellab.trimmomatic.trim.Trimmer;
+import org.usadellab.trimmomatic.util.Logger;
public class BlockOfWork implements Callable<BlockOfRecords>
{
+ private Logger logger;
+
private Trimmer trimmers[];
private BlockOfRecords bor;
private boolean pe;
private boolean trimLog;
+
- public BlockOfWork(Trimmer trimmers[], BlockOfRecords bor, boolean pe, boolean trimLog)
+ public BlockOfWork(Logger logger, Trimmer trimmers[], BlockOfRecords bor, boolean pe, boolean trimLog)
{
+ this.logger=logger;
+
this.trimmers = trimmers;
this.bor = bor;
@@ -94,7 +100,7 @@ public class BlockOfWork implements Callable<BlockOfRecords>
}
catch (RuntimeException e)
{
- System.err.println("Exception processing reads: "+originalRecs[0].getName()+" and "+originalRecs[1].getName());
+ logger.errorln("Exception processing reads: "+originalRecs[0].getName()+" and "+originalRecs[1].getName());
throw e;
}
}
@@ -167,7 +173,7 @@ public class BlockOfWork implements Callable<BlockOfRecords>
}
catch (RuntimeException e)
{
- System.err.println("Exception processing read: "+originalRecs[0].getName());
+ logger.errorln("Exception processing read: "+originalRecs[0].getName());
e.printStackTrace();
throw e;
}
diff --git a/src/org/usadellab/trimmomatic/trim/CropTrimmer.java b/src/org/usadellab/trimmomatic/trim/CropTrimmer.java
index ebaaa0c..d81c693 100644
--- a/src/org/usadellab/trimmomatic/trim/CropTrimmer.java
+++ b/src/org/usadellab/trimmomatic/trim/CropTrimmer.java
@@ -14,8 +14,29 @@ public class CropTrimmer extends AbstractSingleRecordTrimmer
public CropTrimmer(int len) {
this.len = len;
}
+
+
+/*
+ @Override
+ public FastqRecord[] processRecords(FastqRecord[] in)
+ {
+ if(in==null)
+ return null;
+ FastqRecord out[]=new FastqRecord[in.length];
+
+ for(int i=0;i<in.length;i++)
+ {
+ if(in[i]!=null)
+ out[i]=processRecord(in[i]);
+ }
+
+ return out;
+ }
+ */
+
+
@Override
public FastqRecord processRecord(FastqRecord in)
{
diff --git a/src/org/usadellab/trimmomatic/trim/IlluminaClippingTrimmer.java b/src/org/usadellab/trimmomatic/trim/IlluminaClippingTrimmer.java
index a4103c9..a2eed5c 100644
--- a/src/org/usadellab/trimmomatic/trim/IlluminaClippingTrimmer.java
+++ b/src/org/usadellab/trimmomatic/trim/IlluminaClippingTrimmer.java
@@ -10,12 +10,11 @@ import java.util.ListIterator;
import java.util.Map;
import java.util.Set;
import java.util.TreeSet;
-import java.util.logging.Level;
-import java.util.logging.Logger;
import org.usadellab.trimmomatic.fasta.FastaParser;
import org.usadellab.trimmomatic.fasta.FastaRecord;
import org.usadellab.trimmomatic.fastq.FastqRecord;
+import org.usadellab.trimmomatic.util.Logger;
public class IlluminaClippingTrimmer implements Trimmer
{
@@ -27,6 +26,8 @@ public class IlluminaClippingTrimmer implements Trimmer
private final static float LOG10_4 = 0.60206f;
+ private Logger logger;
+
private int seedMaxMiss;
private int minPalindromeLikelihood;
// private int minPalindromeOverlap;
@@ -44,7 +45,7 @@ public class IlluminaClippingTrimmer implements Trimmer
private Set<IlluminaClippingSeq> commonSeqs;
- public static IlluminaClippingTrimmer makeIlluminaClippingTrimmer(String args) throws IOException
+ public static IlluminaClippingTrimmer makeIlluminaClippingTrimmer(Logger logger, String args) throws IOException
{
String arg[] = args.split(":");
@@ -63,7 +64,7 @@ public class IlluminaClippingTrimmer implements Trimmer
if (arg.length > 5)
palindromeKeepBoth = Boolean.parseBoolean(arg[5]);
- IlluminaClippingTrimmer trimmer=new IlluminaClippingTrimmer(seedMaxMiss, minPalindromeLikelihood, minSequenceLikelihood, minPrefix, palindromeKeepBoth);
+ IlluminaClippingTrimmer trimmer=new IlluminaClippingTrimmer(logger, seedMaxMiss, minPalindromeLikelihood, minSequenceLikelihood, minPrefix, palindromeKeepBoth);
try
{
@@ -71,15 +72,17 @@ public class IlluminaClippingTrimmer implements Trimmer
}
catch (IOException ex)
{
- Logger.getLogger(IlluminaClippingTrimmer.class.getName()).log(Level.SEVERE, null, ex);
+ logger.handleException(ex);
}
return trimmer;
}
- public IlluminaClippingTrimmer(int seedMaxMiss, int minPalindromeLikelihood, int minSequenceLikelihood, int minPrefix, boolean palindromeKeepBoth)
+ public IlluminaClippingTrimmer(Logger logger, int seedMaxMiss, int minPalindromeLikelihood, int minSequenceLikelihood, int minPrefix, boolean palindromeKeepBoth)
{
+ this.logger=logger;
+
this.seedMaxMiss = seedMaxMiss;
this.minPalindromeLikelihood = minPalindromeLikelihood;
this.minSequenceLikelihood = minSequenceLikelihood;
@@ -163,7 +166,7 @@ public class IlluminaClippingTrimmer implements Trimmer
reverseSeqs = mapClippingSet(reverseSeqMap);
commonSeqs = mapClippingSet(commonSeqMap);
- System.err.println("ILLUMINACLIP: Using " + prefixPairs.size() + " prefix pairs, " + commonSeqs.size()
+ logger.infoln("ILLUMINACLIP: Using " + prefixPairs.size() + " prefix pairs, " + commonSeqs.size()
+ " forward/reverse sequences, " + forwardSeqs.size() + " forward only sequences, "
+ reverseSeqs.size() + " reverse only sequences");
@@ -200,7 +203,7 @@ public class IlluminaClippingTrimmer implements Trimmer
String seq = rec.getSequence();
if (uniqueSeq.contains(seq))
- System.err.println("Skipping duplicate Clipping Sequence: '" + seq + "'");
+ logger.warnln("Skipping duplicate Clipping Sequence: '" + seq + "'");
else
{
uniqueSeq.add(seq);
@@ -323,7 +326,7 @@ public class IlluminaClippingTrimmer implements Trimmer
private IlluminaPrefixPair(String prefix1, String prefix2)
{
- System.err.println("Using PrefixPair: '" + prefix1 + "' and '" + prefix2 + "'");
+ logger.infoln("Using PrefixPair: '" + prefix1 + "' and '" + prefix2 + "'");
int length1 = prefix1.length();
int length2 = prefix2.length();
@@ -366,6 +369,9 @@ public class IlluminaClippingTrimmer implements Trimmer
int testIndex = 0;
int refIndex = prefixLength;
+ if(pack1.length<=refIndex || pack2.length<=refIndex)
+ return null;
+
int count = 0;
int seedSkip = prefixLength - 16;
@@ -375,8 +381,7 @@ public class IlluminaClippingTrimmer implements Trimmer
count = seedSkip;
}
- long ref1 = pack1[refIndex];
- long ref2 = pack2[refIndex];
+ long ref1, ref2;
int seqlen1 = rec1.getSequence().length() + prefixLength;
int seqlen2 = rec2.getSequence().length() + prefixLength;
@@ -621,7 +626,7 @@ public class IlluminaClippingTrimmer implements Trimmer
IlluminaShortClippingSeq(String seq)
{
- System.err.println("Using Short Clipping Sequence: '" + seq + "'");
+ logger.infoln("Using Short Clipping Sequence: '" + seq + "'");
this.seq = seq;
this.mask = calcSingleMask(seq.length());
@@ -689,7 +694,7 @@ public class IlluminaClippingTrimmer implements Trimmer
{
IlluminaMediumClippingSeq(String seq)
{
- System.err.println("Using Medium Clipping Sequence: '" + seq + "'");
+ logger.infoln("Using Medium Clipping Sequence: '" + seq + "'");
this.seq = seq;
pack = packSeqInternal(seq, false);
@@ -754,7 +759,7 @@ public class IlluminaClippingTrimmer implements Trimmer
{
IlluminaLongClippingSeq(String seq)
{
- System.err.println("Using Long Clipping Sequence: '" + seq + "'");
+ logger.infoln("Using Long Clipping Sequence: '" + seq + "'");
this.seq = seq;
diff --git a/src/org/usadellab/trimmomatic/trim/MaxLenTrimmer.java b/src/org/usadellab/trimmomatic/trim/MaxLenTrimmer.java
new file mode 100644
index 0000000..8680c13
--- /dev/null
+++ b/src/org/usadellab/trimmomatic/trim/MaxLenTrimmer.java
@@ -0,0 +1,29 @@
+package org.usadellab.trimmomatic.trim;
+
+import org.usadellab.trimmomatic.fastq.FastqRecord;
+
+public class MaxLenTrimmer extends AbstractSingleRecordTrimmer
+{
+ private int maxLen;
+
+ public MaxLenTrimmer(String args)
+ {
+ maxLen=Integer.parseInt(args);
+ }
+
+ public MaxLenTrimmer(int maxLen) {
+ this.maxLen = maxLen;
+ }
+
+
+
+ @Override
+ public FastqRecord processRecord(FastqRecord in)
+ {
+ if(in.getSequence().length()<=maxLen)
+ return in;
+
+ return null;
+ }
+
+}
diff --git a/src/org/usadellab/trimmomatic/trim/TrimmerFactory.java b/src/org/usadellab/trimmomatic/trim/TrimmerFactory.java
index a0714f1..ba6aedd 100644
--- a/src/org/usadellab/trimmomatic/trim/TrimmerFactory.java
+++ b/src/org/usadellab/trimmomatic/trim/TrimmerFactory.java
@@ -2,11 +2,16 @@ package org.usadellab.trimmomatic.trim;
import java.io.IOException;
+import org.usadellab.trimmomatic.util.Logger;
+
public class TrimmerFactory
{
- public TrimmerFactory()
+ Logger logger;
+
+ public TrimmerFactory(Logger logger)
{
+ this.logger=logger;
}
public Trimmer makeTrimmer(String desc) throws IOException
@@ -24,7 +29,7 @@ public class TrimmerFactory
}
if(trimmerName.equals("ILLUMINACLIP"))
- return IlluminaClippingTrimmer.makeIlluminaClippingTrimmer(args);
+ return IlluminaClippingTrimmer.makeIlluminaClippingTrimmer(logger, args);
if(trimmerName.equals("LEADING"))
return new LeadingTrimmer(args);
@@ -47,6 +52,9 @@ public class TrimmerFactory
if(trimmerName.equals("MINLEN"))
return new MinLenTrimmer(args);
+ if(trimmerName.equals("MAXLEN"))
+ return new MaxLenTrimmer(args);
+
if(trimmerName.equals("AVGQUAL"))
return new AvgQualTrimmer(args);
@@ -56,7 +64,6 @@ public class TrimmerFactory
if(trimmerName.equals("TOPHRED64"))
return new ToPhred64Trimmer(args);
-
throw new RuntimeException("Unknown trimmer: "+trimmerName);
}
}
diff --git a/src/org/usadellab/trimmomatic/util/ConcatGZIPInputStream.java b/src/org/usadellab/trimmomatic/util/ConcatGZIPInputStream.java
index 9b9e721..e952927 100644
--- a/src/org/usadellab/trimmomatic/util/ConcatGZIPInputStream.java
+++ b/src/org/usadellab/trimmomatic/util/ConcatGZIPInputStream.java
@@ -49,6 +49,16 @@ public class ConcatGZIPInputStream extends InputStream
@Override
public int read() throws IOException
{
+ int res=-1;
+
+ while(res==-1 && gzIn!=null)
+ {
+ res=gzIn.read();
+ if(res==-1)
+ nextGzipInputStream();
+ }
+
+ /*
if(gzIn==null)
return -1;
@@ -61,13 +71,24 @@ public class ConcatGZIPInputStream extends InputStream
else
res=gzIn.read();
}
-
+ */
+
return res;
}
@Override
public int read(byte[] b, int off, int len) throws IOException
{
+ int res=-1;
+
+ while(res==-1 && gzIn!=null)
+ {
+ res=gzIn.read(b,off,len);
+ if(res==-1)
+ nextGzipInputStream();
+ }
+
+ /*
if(gzIn==null)
return -1;
@@ -80,13 +101,24 @@ public class ConcatGZIPInputStream extends InputStream
else
res=gzIn.read(b, off, len);
}
-
+ */
+
return res;
}
@Override
public int read(byte[] b) throws IOException
{
+ int res=-1;
+
+ while(res==-1 && gzIn!=null)
+ {
+ res=gzIn.read(b);
+ if(res==-1)
+ nextGzipInputStream();
+ }
+
+ /*
if(gzIn==null)
return -1;
@@ -99,6 +131,8 @@ public class ConcatGZIPInputStream extends InputStream
else
res=gzIn.read(b);
}
+ */
+
return res;
}
diff --git a/src/org/usadellab/trimmomatic/util/Logger.java b/src/org/usadellab/trimmomatic/util/Logger.java
new file mode 100644
index 0000000..79d38ac
--- /dev/null
+++ b/src/org/usadellab/trimmomatic/util/Logger.java
@@ -0,0 +1,78 @@
+package org.usadellab.trimmomatic.util;
+
+public class Logger
+{
+ private boolean showError, showWarning, showInfo;
+
+ public Logger(boolean showError, boolean showWarning, boolean showInfo)
+ {
+ this.showError=showError;
+ this.showWarning=showWarning;
+ this.showInfo=showInfo;
+ }
+
+ public void handleException(Exception ex)
+ {
+ ex.printStackTrace(System.err);
+ }
+
+ public void errorln()
+ {
+ if(showError)
+ System.err.println();
+ }
+
+ public void errorln(String message)
+ {
+ if(showError)
+ System.err.println(message);
+ }
+
+ public void error(String message)
+ {
+ if(showError)
+ System.err.print(message);
+ }
+
+
+
+
+
+ public void warnln()
+ {
+ if(showWarning)
+ System.err.println();
+ }
+
+ public void warnln(String message)
+ {
+ if(showWarning)
+ System.err.println(message);
+ }
+
+ public void warn(String message)
+ {
+ if(showWarning)
+ System.err.print(message);
+ }
+
+
+ public void infoln()
+ {
+ if(showInfo)
+ System.err.println();
+ }
+
+ public void infoln(String message)
+ {
+ if(showInfo)
+ System.err.println(message);
+ }
+
+ public void info(String message)
+ {
+ if(showInfo)
+ System.err.print(message);
+ }
+
+}
--
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/debian-med/trimmomatic.git
More information about the debian-med-commit
mailing list