// Path: src/main/java/org/cruk/util/CommandLineUtility.java
// public abstract class CommandLineUtility
// {
//     protected Logger log = LoggerFactory.getLogger(getClass());
// 
//     protected String argumentsDisplayString;
//     protected Options options = new Options();
//     protected String outputFilename;
//     protected PrintStream out;
// 
//     /**
//      * Initializes a new CommandLineUtility instance with the given command line
//      * arguments.
//      *
//      * @param args
//      */
//     public CommandLineUtility(String[] args)
//     {
//         this(null, args);
//     }
// 
//     /**
//      * Initializes a new CommandLineUtility instance with the given arguments
//      * display string and command line arguments.
//      *
//      * @param argumentsDisplayString
//      * @param args
//      */
//     public CommandLineUtility(String argumentsDisplayString, String[] args)
//     {
//         this.argumentsDisplayString = argumentsDisplayString;
//         setupOptions();
//         parseCommandLineArguments(args);
//     }
// 
//     /**
//      * Populate the options object held by this utility.
//      */
//     protected abstract void setupOptions();
// 
//     /**
//      * Parses command line arguments. Subclasses may implement this abstract
//      * method to parse the given arguments and populate the command line options
//      * object, but this default implementation would be typical to parse the
//      * options and pass to {@link #parseCommandLine(CommandLine)} to process
//      * the parsed values. Errors are reported and the utility terminated if there
//      * are any.
//      *
//      * @param args The raw command line arguments given to the JVM.
//      */
//     protected void parseCommandLineArguments(String[] args)
//     {
//         CommandLineParser parser = new DefaultParser();
// 
//         try
//         {
//             CommandLine commandLine = parser.parse(options, args);
//             parseCommandLine(commandLine);
//         }
//         catch (ParseException e)
//         {
//             error("Error parsing command-line options: " + e.getMessage(), true);
//         }
//     }
// 
//     /**
//      * Process the parsed command line arguments.  Subclasses should implement this abstract
//      * method to process the parsed options.
//      *
//      * @param commandLine The parsed command line.
//      *
//      * @throws ParseException if there is a problem with any argument.
//      */
//     protected abstract void parseCommandLine(CommandLine commandLine) throws ParseException;
// 
//     /**
//      * Abstract method for running the utility.
//      *
//      * @throws Exception
//      */
//     protected abstract void run() throws Exception;
// 
//     /**
//      * Runs the utility taking care of opening and closing the output writer.
//      */
//     public void execute()
//     {
//         if (outputFilename == null)
//         {
//             out = System.out;
//         }
//         else
//         {
//             try
//             {
//                 out = new PrintStream(new BufferedOutputStream(new FileOutputStream(outputFilename)));
//             }
//             catch (IOException e)
//             {
//                 error("Error creating file " + outputFilename);
//             }
//         }
// 
//         try
//         {
//             run();
//             out.flush();
//         }
//         catch (Exception e)
//         {
//             e.printStackTrace();
//             error("Error: " + e.getClass().getName() + " " + e.getMessage());
//         }
//         finally
//         {
//             closeOutputStream();
//         }
//     }
// 
//     /**
//      * Closes the file output stream.
//      */
//     private void closeOutputStream()
//     {
//         if (outputFilename != null && out != null)
//         {
//             out.close();
//         }
//     }
// 
//     /**
//      * Prints the error message for the given exception and exits.
//      *
//      * @param e the exception
//      */
//     protected void error(Exception e)
//     {
//         error("Error: " + e.getMessage());
//     }
// 
//     /**
//      * Prints the given error message and exits.
//      *
//      * @param error the error message
//      */
//     protected void error(String error)
//     {
//         error(error, false);
//     }
// 
//     /**
//      * Prints the given error message, optionally prints usage details, and exits.
//      *
//      * @param error the error message
//      * @param printUsage
//      */
//     protected void error(String error, boolean printUsage)
//     {
//         System.err.println(error);
//         if (printUsage)
//         {
//             usage();
//         }
//         closeOutputStream();
//         System.exit(1);
//     }
// 
//     /**
//      * Prints usage details.
//      */
//     protected void usage()
//     {
//         HelpFormatter formatter = new HelpFormatter();
//         String commandLine = "java " + getClass().getName();
//         if (argumentsDisplayString != null)
//         {
//             commandLine = commandLine + " " + argumentsDisplayString;
//         }
//         formatter.printHelp(commandLine, options);
//     }
// }


import org.apache.commons.cli.Option;
import org.apache.commons.cli.ParseException;
import org.apache.commons.cli.PatternOptionBuilder;
import org.apache.commons.math3.random.RandomDataGenerator;
import org.cruk.util.CommandLineUtility;
import nu.xom.Document;
import nu.xom.Element;
import nu.xom.Serializer;
import java.io.BufferedOutputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.util.Arrays;
import org.apache.commons.cli.CommandLine;

            Element element = new Element("DatasetId");
            if (datasetId != null) element.appendChild(datasetId);
            root.appendChild(element);

            element = new Element("SampledCount");
            element.appendChild(Integer.toString(sampledCount));
            root.appendChild(element);

            Document document = new Document(root);

            Serializer serializer;
            serializer = new Serializer(outputStream, "ISO-8859-1");
            serializer.setIndent(2);
            serializer.setMaxLength(64);
            serializer.setLineSeparator("\n");
            serializer.write(document);

            outputStream.flush();
        }
        catch (UnsupportedEncodingException e)
        {
            error(e);
        }
        catch (IOException e)
        {
            error("Error writing summary XML file");
        }
        finally
        {
// Path: src/main/java/org/cruk/util/CommandLineUtility.java
// public abstract class CommandLineUtility
// {
//     protected Logger log = LoggerFactory.getLogger(getClass());
// 
//     protected String argumentsDisplayString;
//     protected Options options = new Options();
//     protected String outputFilename;
//     protected PrintStream out;
// 
//     /**
//      * Initializes a new CommandLineUtility instance with the given command line
//      * arguments.
//      *
//      * @param args
//      */
//     public CommandLineUtility(String[] args)
//     {
//         this(null, args);
//     }
// 
//     /**
//      * Initializes a new CommandLineUtility instance with the given arguments
//      * display string and command line arguments.
//      *
//      * @param argumentsDisplayString
//      * @param args
//      */
//     public CommandLineUtility(String argumentsDisplayString, String[] args)
//     {
//         this.argumentsDisplayString = argumentsDisplayString;
//         setupOptions();
//         parseCommandLineArguments(args);
//     }
// 
//     /**
//      * Populate the options object held by this utility.
//      */
//     protected abstract void setupOptions();
// 
//     /**
//      * Parses command line arguments. Subclasses may implement this abstract
//      * method to parse the given arguments and populate the command line options
//      * object, but this default implementation would be typical to parse the
//      * options and pass to {@link #parseCommandLine(CommandLine)} to process
//      * the parsed values. Errors are reported and the utility terminated if there
//      * are any.
//      *
//      * @param args The raw command line arguments given to the JVM.
//      */
//     protected void parseCommandLineArguments(String[] args)
//     {
//         CommandLineParser parser = new DefaultParser();
// 
//         try
//         {
//             CommandLine commandLine = parser.parse(options, args);
//             parseCommandLine(commandLine);
//         }
//         catch (ParseException e)
//         {
//             error("Error parsing command-line options: " + e.getMessage(), true);
//         }
//     }
// 
//     /**
//      * Process the parsed command line arguments.  Subclasses should implement this abstract
//      * method to process the parsed options.
//      *
//      * @param commandLine The parsed command line.
//      *
//      * @throws ParseException if there is a problem with any argument.
//      */
//     protected abstract void parseCommandLine(CommandLine commandLine) throws ParseException;
// 
//     /**
//      * Abstract method for running the utility.
//      *
//      * @throws Exception
//      */
//     protected abstract void run() throws Exception;
// 
//     /**
//      * Runs the utility taking care of opening and closing the output writer.
//      */
//     public void execute()
//     {
//         if (outputFilename == null)
//         {
//             out = System.out;
//         }
//         else
//         {
//             try
//             {
//                 out = new PrintStream(new BufferedOutputStream(new FileOutputStream(outputFilename)));
//             }
//             catch (IOException e)
//             {
//                 error("Error creating file " + outputFilename);
//             }
//         }
// 
//         try
//         {
//             run();
//             out.flush();
//         }
//         catch (Exception e)
//         {
//             e.printStackTrace();
//             error("Error: " + e.getClass().getName() + " " + e.getMessage());
//         }
//         finally
//         {
//             closeOutputStream();
//         }
//     }
// 
//     /**
//      * Closes the file output stream.
//      */
//     private void closeOutputStream()
//     {
//         if (outputFilename != null && out != null)
//         {
//             out.close();
//         }
//     }
// 
//     /**
//      * Prints the error message for the given exception and exits.
//      *
//      * @param e the exception
//      */
//     protected void error(Exception e)
//     {
//         error("Error: " + e.getMessage());
//     }
// 
//     /**
//      * Prints the given error message and exits.
//      *
//      * @param error the error message
//      */
//     protected void error(String error)
//     {
//         error(error, false);
//     }
// 
//     /**
//      * Prints the given error message, optionally prints usage details, and exits.
//      *
//      * @param error the error message
//      * @param printUsage
//      */
//     protected void error(String error, boolean printUsage)
//     {
//         System.err.println(error);
//         if (printUsage)
//         {
//             usage();
//         }
//         closeOutputStream();
//         System.exit(1);
//     }
// 
//     /**
//      * Prints usage details.
//      */
//     protected void usage()
//     {
//         HelpFormatter formatter = new HelpFormatter();
//         String commandLine = "java " + getClass().getName();
//         if (argumentsDisplayString != null)
//         {
//             commandLine = commandLine + " " + argumentsDisplayString;
//         }
//         formatter.printHelp(commandLine, options);
//     }
// }


// Path: src/main/java/org/cruk/seq/SampleFastq.java
import org.apache.commons.cli.Option;
import org.apache.commons.cli.ParseException;
import org.apache.commons.cli.PatternOptionBuilder;
import org.apache.commons.math3.random.RandomDataGenerator;
import org.cruk.util.CommandLineUtility;
import nu.xom.Document;
import nu.xom.Element;
import nu.xom.Serializer;
import java.io.BufferedOutputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.util.Arrays;
import org.apache.commons.cli.CommandLine;


            Element element = new Element("DatasetId");
            if (datasetId != null) element.appendChild(datasetId);
            root.appendChild(element);

            element = new Element("SampledCount");
            element.appendChild(Integer.toString(sampledCount));
            root.appendChild(element);

            Document document = new Document(root);

            Serializer serializer;
            serializer = new Serializer(outputStream, "ISO-8859-1");
            serializer.setIndent(2);
            serializer.setMaxLength(64);
            serializer.setLineSeparator("\n");
            serializer.write(document);

            outputStream.flush();
        }
        catch (UnsupportedEncodingException e)
        {
            error(e);
        }
        catch (IOException e)
        {
            error("Error writing summary XML file");
        }
        finally
        {
            try