[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