diff --git a/.travis.yml b/.travis.yml
new file mode 100644
index 0000000..ba37ce5
--- /dev/null
+++ b/.travis.yml
@@ -0,0 +1,38 @@
+# Control file for continuous integration testing at http://travis-ci.org/
+
+language: c
+
+addons:
+ apt:
+ packages:
+ - liblzma-dev
+
+matrix:
+ include:
+ - os: linux
+ compiler: clang
+ - os: linux
+ compiler: gcc
+ # An unoptimised C99 build, for detecting non-static inline functions
+ - os: linux
+ compiler: gcc
+ env: CFLAGS="-std=gnu99 -O0"
+ - os: osx
+ compiler: gcc
+
+env:
+ global:
+ - HTSLIB=`pwd`/htslib
+ - HTSDIR=$HTSLIB/b
+ - SAMTOOLSDIR=samtools
+ - PATH=$SAMTOOLSDIR:$PATH
+
+install:
+ - .travis/clone ${HTSREPO:-git://github.com/samtools/htslib.git} $HTSLIB master
+ - .travis/clone ${HTSREPO:-git://github.com/samtools/samtools.git} $SAMTOOLSDIR master
+
+before_script:
+ - (cd $HTSLIB && autoreconf && mkdir b && ./configure --prefix=$HTSDIR && make && make install)
+ - (cd $SAMTOOLSDIR && autoconf && make)
+
+script: autoreconf -i && ./configure -V && ./configure --with-htslib=$HTSDIR && make -e && make -e check
diff --git a/.travis/clone b/.travis/clone
new file mode 100755
index 0000000..d978402
--- /dev/null
+++ b/.travis/clone
@@ -0,0 +1,14 @@
+#!/bin/sh
+# Usage: .travis/clone REPOSITORY [DIR] [BRANCH]
+#
+# Creates a shallow clone, checking out the specified branch. If BRANCH is
+# omitted or if there is no branch with that name, checks out origin/HEAD.
+
+repository=$1
+localdir=$2
+branch=$3
+
+[ -n "$branch" ] && ref=$(git ls-remote --heads $repository $branch)
+
+set -x
+git clone --depth=1 ${ref:+--branch=$branch} $repository $localdir
diff --git a/Makefile b/Makefile
deleted file mode 100644
index a3f25ca..0000000
--- a/Makefile
+++ /dev/null
@@ -1,129 +0,0 @@
-# Makefile for bambi, utilities for the Sequence Alignment/Map format.
-#
-# Copyright (C) 2016 Genome Research Ltd.
-#
-# This program is free software: you can redistribute it and/or modify
-# it under the terms of the GNU Affero General Public License as published
-# by the Free Software Foundation, either version 3 of the License, or
-# (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU Affero General Public License for more details.
-#
-# You should have received a copy of the GNU Affero General Public License
-# along with this program. If not, see .
-#
-# This is @configure_input@
-#
-# If you use configure, this file overrides variables and augments rules
-# in the Makefile to reflect your configuration choices. If you don't run
-# configure, the main Makefile contains suitable conservative defaults.
-
-CC = gcc
-CFLAGS = -g -Wall -O0
-LDFLAGS =
-LIBS =
-
-OBJS= bambi.o hts_addendum.o decode.o
-
-prefix = /usr/local
-exec_prefix = $(prefix)
-bindir = $(exec_prefix)/bin
-datarootdir = $(prefix)/share
-mandir = $(datarootdir)/man
-man1dir = $(mandir)/man1
-
-MKDIR_P = mkdir -p
-INSTALL = install -p
-INSTALL_PROGRAM = $(INSTALL)
-INSTALL_DATA = $(INSTALL) -m 644
-INSTALL_DIR = $(MKDIR_P) -m 755
-
-
-PROGRAMS = bambi
-
-BUILT_TEST_PROGRAMS = \
- test/decode/decode
-
-all: $(PROGRAMS) $(BUILT_TEST_PROGRAMS)
-
-# TODO Use configure or htslib.pc to add -rdynamic/-ldl conditionally
-ALL_CPPFLAGS = -I. $(HTSLIB_CPPFLAGS) $(CPPFLAGS)
-ALL_LDFLAGS = -rdynamic $(HTSLIB_LDFLAGS) $(LDFLAGS)
-ALL_LIBS = -lz -ldl $(LIBS)
-
-# Usually config.mk and config.h are generated by running configure
-# or config.status, but if those aren't used create defaults here.
-
-config.mk:
- @sed -e '/^prefix/,/^LIBS/d;s/@Hsource@//;s/@Hinstall@/#/;s#@HTSDIR@#../htslib#g;s/@HTSLIB_CPPFLAGS@/-I$$(HTSDIR)/g;s/@CURSES_LIB@/-lcurses/g' config.mk.in > $@
-
-include config.mk
-
-
-PACKAGE_VERSION = 0.1
-
-# If building from a Git repository, replace $(PACKAGE_VERSION) with the Git
-# description of the working tree: either a release tag with the same value
-# as $(PACKAGE_VERSION) above, or an exact description likely based on a tag.
-# $(shell), :=, etc are GNU Make-specific. If you don't have GNU Make,
-# comment out this conditional.
-ifneq "$(wildcard .git)" ""
-PACKAGE_VERSION := $(shell git describe --always --dirty)
-
-# Force version.h to be remade if $(PACKAGE_VERSION) has changed.
-version.h: $(if $(wildcard version.h),$(if $(findstring "$(PACKAGE_VERSION)",$(shell cat version.h)),,force))
-endif
-
-# If you don't have GNU Make but are building from a Git repository, you may
-# wish to replace this with a rule that always rebuilds version.h:
-# version.h: force
-# echo '#define SAMTOOLS_VERSION "`git describe --always --dirty`"' > $@
-version.h:
- echo '#define VINES_VERSION "$(PACKAGE_VERSION)"' > $@
-
-print-version:
- @echo $(PACKAGE_VERSION)
-
-
-.SUFFIXES: .c .o
-
-.c.o:
- $(CC) $(CFLAGS) $(ALL_CPPFLAGS) -c -o $@ $<
-
-
-bambi: $(OBJS) $(HTSLIB)
- $(CC) -pthread $(ALL_LDFLAGS) -o $@ $(OBJS) $(HTSLIB_LIB) $(CURSES_LIB) -lm $(ALL_LIBS)
-
-decode.o: decode.c $(htslib_sam_h) $(htslib_khash_h) $(htslib_kstring_h) $(sam_opts_h)
-bambi.o: bambi.c $(htslib_hts_h) version.h
-hts_addendum.o: hts_addendum.h
-
-# test programs
-
-check test: bambi $(BUILT_TEST_PROGRAMS)
- test/decode/decode
-
-test/decode/decode: test/decode/decode.o $(HTSLIB)
- $(CC) -pthread $(ALL_LDFLAGS) -o $@ test/decode/decode.o hts_addendum.o $(HTSLIB_LIB) $(ALL_LIBS)
-
-test/decode/decode.o: test/decode/decode.c decode.o hts_addendum.o
-
-
-install: $(PROGRAMS) $(BUILT_MISC_PROGRAMS)
- $(INSTALL_DIR) $(DESTDIR)$(bindir) $(DESTDIR)$(man1dir)
- $(INSTALL_PROGRAM) $(PROGRAMS) $(MISC_PROGRAMS) $(DESTDIR)$(bindir)
- $(INSTALL_DATA) samtools.1 misc/wgsim.1 $(DESTDIR)$(man1dir)
-
-
-
-clean:
- -rm -f *.o misc/*.o test/*.o test/*/*.o version.h
- -rm -f $(PROGRAMS) $(BUILT_TEST_PROGRAMS)
-
-distclean: clean
- -rm -f config.cache config.log config.status
-
-.PHONY: all check test clean distclean install
diff --git a/Makefile.am b/Makefile.am
new file mode 100644
index 0000000..8f0c75a
--- /dev/null
+++ b/Makefile.am
@@ -0,0 +1,5 @@
+ACLOCAL_AMFLAGS= -I m4
+TESTS = test/posfile/t_posfile test/filterfile/t_filterfile test/bclfile/t_bclfile test/decode/t_decode test/i2b/t_i2b
+SUBDIRS = src test/posfile test/bclfile test/filterfile test/decode test/i2b
+dist_doc_DATA = README.md LICENSE
+AM_COLOR_TESTS=always
diff --git a/README.md b/README.md
index f3d5c74..dbf5c81 100644
--- a/README.md
+++ b/README.md
@@ -1,2 +1,20 @@
# bambi
A set of programs to manipulate SAM/BAM/CRAM files, using HTSLIB
+
+to install:
+
+
+clone into a local directory (eg 'bambi')
+
+cd bambi
+autoreconf -i
+configure --prefix= --with-htslib=
+
+(eg configure --prefix=/usr/local/bambi --with-htslib=/usr/local/htslib/1.3)
+
+make
+
+make check (to run tests)
+
+
+
diff --git a/config.mk b/config.mk
index c03711f..e242dcc 100644
--- a/config.mk
+++ b/config.mk
@@ -24,8 +24,8 @@
# configure, the main Makefile contains suitable conservative defaults.
-HTSDIR = /software/solexa/pkg/htslib/htslib-1.3
-### include $(HTSDIR)/src/htslib.mk
+HTSDIR = ../htslib
+include $(HTSDIR)/htslib.mk
HTSLIB = $(HTSDIR)/libhts.a
HTSLIB_LIB = $(HTSLIB)
BGZIP = $(HTSDIR)/bin/bgzip
diff --git a/configure.ac b/configure.ac
new file mode 100644
index 0000000..81bdf69
--- /dev/null
+++ b/configure.ac
@@ -0,0 +1,33 @@
+AC_INIT([bambi], m4_esyscmd_s([git describe --dirty --always --tags]), [js10@sanger.ac.uk])
+AC_ARG_VAR(HTSDIR,Directory to look for hts)
+AM_INIT_AUTOMAKE([-Wall -Werror foreign subdir-objects])
+AC_PROG_CC
+
+LT_INIT
+
+AC_CONFIG_MACRO_DIR([m4])
+
+AX_WITH_HTSLIB
+
+AC_CONFIG_HEADERS([config.h])
+
+saved_CPPFLAGS="$CPPFLAGS"
+saved_LDFLAGS="$LDFLAGS"
+CPPFLAGS="$HTSLIB_CPPFLAGS"
+LDFLAGS="$HTSLIB_LDFLAGS"
+AC_CHECK_HEADERS([cram/sam_header.h])
+AC_CHECK_LIB([hts], [bam_aux_update_str], [AC_DEFINE([HAVE_BAM_AUX_UPDATE_STR],[1],[Does htslib contain bam_aux_update_str()?])])
+CPPFLAGS="$saved_CPPFLAGS"
+LDFLAGS="$saved_LDFLAGS"
+
+AC_CONFIG_FILES([
+ Makefile
+ src/Makefile
+ test/posfile/Makefile
+ test/bclfile/Makefile
+ test/filterfile/Makefile
+ test/decode/Makefile
+ test/i2b/Makefile
+])
+AC_OUTPUT
+
diff --git a/m4/ax_with_htslib.m4 b/m4/ax_with_htslib.m4
new file mode 100644
index 0000000..4b025ec
--- /dev/null
+++ b/m4/ax_with_htslib.m4
@@ -0,0 +1,117 @@
+#
+# SYNOPSIS
+#
+# AX_WITH_HTSLIB()
+#
+# DESCRIPTION
+#
+# This macro searches for the header files and libraries of a htslib
+# (https://github.com/samtools/htslib) installation. If --with-htslib is specified
+# without argument, or as --with-htslib=yes, a packaged (.deb or
+# .rpm) installation is assumed and the default system paths will be
+# searched. If --with-htslib=DIR is specified, a run-in-place htslib
+# installation will be searched for in DIR.
+#
+# The system header and library paths will be used for run-in-place
+# iRODS installation dependencies, in preference to the those
+# dependencies provided by iRODS in its 'externals' directory
+# because the latter cannot be determined reliably.
+#
+# The macro defines the symbol HAVE_HTSLIB if the library is found
+# and the following output variables are set with AC_SUBST:
+#
+# HTSLIB_CPPFLAGS
+# HTSLIB_LDFLAGS
+# HTSLIB_LIBS
+#
+# You can use them like this in Makefile.am:
+#
+# AM_CPPFLAGS = $(HTSLIB_CPPFLAGS)
+# AM_LDFLAGS = $(HTSLIB_LDFLAGS)
+# library_la_LIBADD = $(HTSLIB_LIBS)
+# program_LDADD = $(HTSLIB_LIBS)
+#
+# LICENSE
+#
+# Copyright (C) 2016, Genome Research Ltd.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+AC_DEFUN([AX_WITH_HTSLIB], [
+ HTSLIB_HOME=
+ HTSLIB_CPPFLAGS=
+ HTSLIB_LDFLAGS=
+ HTSLIB_LIBS=
+
+ saved_CPPFLAGS="$CPPFLAGS"
+ saved_LDFLAGS="$LDFLAGS"
+ saved_LIBS="$LIBS"
+
+ AC_ARG_WITH([htslib],
+ [AS_HELP_STRING([--with-htslib[[=DIR]]], [select htslib directory])], [
+ AS_IF([test "x$with_htslib" != "xno"], [
+
+ AS_IF([test "x$with_htslib" = "xyes"], [
+ AC_MSG_CHECKING([for packaged htslib])
+ CPPFLAGS="-I/usr/include/htslib $CPPFLAGS"
+ LDFLAGS="-L/usr/lib/htslib/externals $LDFLAGS"
+ ], [
+ HTSLIB_HOME="$with_htslib"
+ CPPFLAGS="-I$HTSLIB_HOME/include $CPPFLAGS"
+ LDFLAGS="-L$HTSLIB_HOME/lib $LDFLAGS"
+ ])
+
+ LIBS="$HTSLIB_HOME/lib/libhts.a -lz -ldl -lbz2 -llzma -lpthread"
+
+ AC_MSG_CHECKING([checking htslib version])
+ AC_RUN_IFELSE([AC_LANG_PROGRAM([
+ #include "htslib/hts.h"
+ #include
+ #include
+#include
+ ], [
+ char *v=strdup(hts_version());
+ char *s = strtok(v,".-");
+ int n = atoi(s) * 100000;
+ s = strtok(NULL,".-");
+ if (s) n += atoi(s) * 1000;
+ s = strtok(NULL,".-");
+ if (s) n += atoi(s) * 10;
+printf(" n=%d ",n);
+ if(n>=103010) return 0;
+ else exit(-1);
+ ])
+ ], [AC_MSG_RESULT([Ok])],
+ [AC_MSG_ERROR([htslib version must be 1.3.1 or greater])]
+ )
+
+ HTSLIB_CPPFLAGS="$CPPFLAGS"
+ HTSLIB_LDFLAGS="$LDFLAGS"
+ HTSLIB_LIBS="$LIBS"
+
+ CPPFLAGS="$saved_CPPFLAGS"
+ LDFLAGS="$saved_LDFLAGS"
+ LIBS="$saved_LIBS"
+
+ unset saved_CPPFLAGS
+ unset saved_LDFLAGS
+ unset saved_LIBS
+
+ AC_SUBST([HTSLIB_HOME])
+ AC_SUBST([HTSLIB_CPPFLAGS])
+ AC_SUBST([HTSLIB_LDFLAGS])
+ AC_SUBST([HTSLIB_LIBS])
+
+ ])
+ ])
+])
diff --git a/src/Makefile.am b/src/Makefile.am
new file mode 100644
index 0000000..c4ce07e
--- /dev/null
+++ b/src/Makefile.am
@@ -0,0 +1,7 @@
+AM_CPPFLAGS = $(HTSLIB_CPPFLAGS)
+AM_LDFLAGS = -rdynamic $(HTSLIB_LDFLAGS)
+
+bin_PROGRAMS = bambi
+bambi_SOURCES = bambi.c bclfile.c decode.c filterfile.c hts_addendum.c i2b.c posfile.c
+bambi_CFLAGS = -I/usr/include/libxml2
+bambi_LDADD = $(HTSLIB_HOME)/lib/libhts.a -ldl -lxml2 -lz -llzma -lbz2 -lpthread
diff --git a/bambi.c b/src/bambi.c
similarity index 96%
rename from bambi.c
rename to src/bambi.c
index c7b74e3..2de2f0c 100644
--- a/bambi.c
+++ b/src/bambi.c
@@ -25,8 +25,9 @@ along with this program. If not, see .
#include
#include
#include
+
#include "htslib/hts.h"
-#include "version.h"
+#include "bambi.h"
int main_decode(int argc, char *argv[]);
int main_i2b(int argc, char *argv[]);
@@ -34,7 +35,7 @@ int main_afilter(int argc, char *argv[]);
const char *bambi_version()
{
- return VINES_VERSION;
+ return VERSION;
}
static void vprint_error_core(const char *subcommand, const char *format, va_list args, const char *extra)
@@ -99,6 +100,7 @@ int main(int argc, char *argv[])
int ret = 0;
if (strcmp(argv[1], "decode") == 0) ret = main_decode(argc-1, argv+1);
+ else if (strcmp(argv[1], "i2b") == 0) ret = main_i2b(argc-1, argv+1);
else if (strcmp(argv[1], "--version") == 0) {
printf( "bambi %s\n"
"Using htslib %s\n"
diff --git a/bambi.h b/src/bambi.h
similarity index 97%
rename from bambi.h
rename to src/bambi.h
index 2186585..1c87e17 100644
--- a/bambi.h
+++ b/src/bambi.h
@@ -22,6 +22,7 @@ along with this program. If not, see .
#define __BAMBI_H__
#include "hts_addendum.h"
+#include "config.h"
const char *bambi_version(void);
#endif
diff --git a/src/bclfile.c b/src/bclfile.c
new file mode 100644
index 0000000..b47a30e
--- /dev/null
+++ b/src/bclfile.c
@@ -0,0 +1,146 @@
+/* bclfile.c
+
+ Functions to read and parse an Illumina BCL file.
+
+ Copyright (C) 2016 Genome Research Ltd.
+
+ Author: Jennifer Liddle
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU Affero General Public License as published
+by the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU Affero General Public License for more details.
+
+You should have received a copy of the GNU Affero General Public License
+along with this program. If not, see .
+*/
+
+
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+
+#include "bclfile.h"
+
+#define BCL_BASE_ARRAY "ACGT"
+#define BCL_UNKNOWN_BASE 'N'
+
+/*
+ * Try to open the given bcl/scl file.
+ * If that doesn't work, try appending ".gz" and gzopen it
+ * If *that* doesn't work, return the error message in the errmsg field
+ */
+bclfile_t *bclfile_open(char *fname)
+{
+ bclfile_t *bclfile = calloc(1, sizeof(bclfile_t));
+ bclfile->current_cluster = 0;
+ bclfile->total_clusters = 0;
+ bclfile->gzhandle = NULL;
+ bclfile->file_type = BCL;
+ bclfile->current_base = 0;
+ bclfile->filename = strdup(fname);
+
+ // need to find if this is a BCL or SCL file
+ char *base = basename(fname);
+ char *ext = rindex(base,'.');
+ if (ext) ext++;
+ if (strcmp(ext,"scl")==0) bclfile->file_type = SCL;
+ // FIXME: this isn't going to recognise a .scl.gz file as scl
+ // It will probably crash if it doesn't find an extention (ie ext==NULL)
+
+ bclfile->fhandle = open(fname, O_RDONLY);
+ if (bclfile->fhandle == -1) {
+ char *gzfname = calloc(1,strlen(fname)+8);
+ strcpy(gzfname,fname); strcat(gzfname,".gz");
+ bclfile->gzhandle = gzopen(gzfname,"r");
+ if (bclfile->gzhandle == NULL) {
+ strcpy(gzfname,fname); strcat(gzfname,".bgzf");
+ bclfile->gzhandle = gzopen(gzfname,"r");
+ if (bclfile->gzhandle == NULL) {
+ bclfile->errmsg = strdup(strerror(errno));
+ }
+ } else {
+ gzread(bclfile->gzhandle,(void *)&bclfile->total_clusters,4);
+ }
+ free(gzfname);
+ } else {
+ if (read(bclfile->fhandle, (void *)&bclfile->total_clusters, 4) < 0) {
+ fprintf(stderr,"failed to read total_clusters from bcl_file\n");
+ exit(1);
+ }
+ }
+
+ return bclfile;
+}
+
+void bclfile_seek(bclfile_t *bcl, int cluster)
+{
+ if (bcl->gzhandle) {
+ gzseek(bcl->gzhandle, (z_off_t)(4 + cluster), SEEK_SET);
+ } else {
+ lseek(bcl->fhandle, (off_t)(4 + cluster), SEEK_SET);
+ }
+}
+
+void bclfile_close(bclfile_t *bclfile)
+{
+ if (bclfile->gzhandle) {
+ gzclose(bclfile->gzhandle);
+ } else {
+ close(bclfile->fhandle);
+ }
+ free(bclfile->filename);
+ free(bclfile);
+}
+
+int bclfile_next(bclfile_t *bcl)
+{
+ int i=0;
+ static unsigned char c = 0;
+
+ if (bcl->current_base == 0) {
+ if (bcl->gzhandle) {
+ i = gzgetc(bcl->gzhandle);
+ if (i<0) return i;
+ c = i;
+ } else {
+ if (read(bcl->fhandle, (void *)&c, 1) != 1) return -1;
+ }
+ }
+
+ if (bcl->file_type == SCL) {
+ int baseIndex = 0;
+ switch (bcl->current_base) {
+ case 0: baseIndex = (c >> 6) & 0x03; break;
+ case 1: baseIndex = (c >> 4) & 0x03; break;
+ case 2: baseIndex = (c >> 2) & 0x03; break;
+ case 3: baseIndex = c & 0x03; break;
+ }
+ bcl->base = BCL_BASE_ARRAY[baseIndex];
+ bcl->current_base++;
+ if (bcl->current_base > 3) bcl->current_base = 0;
+ } else {
+ int baseIndex = c & 0x03; // last two bits
+ bcl->quality = (c & 0xfc) >> 2; // rest of bits
+ if (bcl->quality) {
+ bcl->base = BCL_BASE_ARRAY[baseIndex];
+ } else {
+ bcl->base = BCL_UNKNOWN_BASE;
+ }
+ }
+
+ if (bcl->current_base == 0) bcl->current_cluster++;
+ return 0;
+}
+
diff --git a/src/bclfile.h b/src/bclfile.h
new file mode 100644
index 0000000..f694f57
--- /dev/null
+++ b/src/bclfile.h
@@ -0,0 +1,48 @@
+/* bclfile.h
+
+ Copyright (C) 2016 Genome Research Ltd.
+
+ Author: Jennifer Liddle
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU Affero General Public License as published
+by the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU Affero General Public License for more details.
+
+You should have received a copy of the GNU Affero General Public License
+along with this program. If not, see .
+*/
+
+#ifndef __BCLFILE_H__
+#define __BCLFILE_H__
+
+#include
+#include
+
+typedef enum { BCL, SCL } BCL_FILE_TYPE;
+
+typedef struct {
+ BCL_FILE_TYPE file_type;
+ int fhandle;
+ gzFile gzhandle;
+ char *errmsg;
+ uint32_t total_clusters;
+ int current_cluster;
+ int current_base;
+ char base;
+ int quality;
+char *filename;
+} bclfile_t;
+
+bclfile_t *bclfile_open(char *fname);
+int bclfile_next(bclfile_t *bclfile);
+void bclfile_close(bclfile_t *bclfile);
+void bclfile_seek(bclfile_t *bclfile, int cluster);
+
+#endif
+
diff --git a/src/cram/cram_samtools.h b/src/cram/cram_samtools.h
new file mode 100755
index 0000000..635e2e0
--- /dev/null
+++ b/src/cram/cram_samtools.h
@@ -0,0 +1,105 @@
+/*
+Copyright (c) 2010-2013 Genome Research Ltd.
+Author: James Bonfield
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright notice,
+this list of conditions and the following disclaimer in the documentation
+and/or other materials provided with the distribution.
+
+ 3. Neither the names Genome Research Ltd and Wellcome Trust Sanger
+Institute nor the names of its contributors may be used to endorse or promote
+products derived from this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY GENOME RESEARCH LTD AND CONTRIBUTORS "AS IS" AND
+ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL GENOME RESEARCH LTD OR CONTRIBUTORS BE LIABLE
+FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+
+#ifndef _CRAM_SAMTOOLS_H_
+#define _CRAM_SAMTOOLS_H_
+
+/* Samtools compatible API */
+#define bam_blk_size(b) ((b)->l_data)
+#define bam_set_blk_size(b,v) ((b)->data_len = (v))
+
+#define bam_ref(b) (b)->core.tid
+#define bam_pos(b) (b)->core.pos
+#define bam_mate_pos(b) (b)->core.mpos
+#define bam_mate_ref(b) (b)->core.mtid
+#define bam_ins_size(b) (b)->core.isize
+#define bam_seq_len(b) (b)->core.l_qseq
+#define bam_cigar_len(b) (b)->core.n_cigar
+#define bam_flag(b) (b)->core.flag
+#define bam_bin(b) (b)->core.bin
+#define bam_map_qual(b) (b)->core.qual
+#define bam_name_len(b) (b)->core.l_qname
+#define bam_name(b) bam_get_qname((b))
+#define bam_qual(b) bam_get_qual((b))
+#define bam_seq(b) bam_get_seq((b))
+#define bam_cigar(b) bam_get_cigar((b))
+#define bam_aux(b) bam_get_aux((b))
+
+#define bam_dup(b) bam_copy1(bam_init1(), (b))
+
+#define bam_free(b) bam_destroy1((b))
+
+#define bam_reg2bin(beg,end) hts_reg2bin((beg),(end),14,5)
+
+#include "htslib/sam.h"
+
+enum cigar_op {
+ BAM_CMATCH_=BAM_CMATCH,
+ BAM_CINS_=BAM_CINS,
+ BAM_CDEL_=BAM_CDEL,
+ BAM_CREF_SKIP_=BAM_CREF_SKIP,
+ BAM_CSOFT_CLIP_=BAM_CSOFT_CLIP,
+ BAM_CHARD_CLIP_=BAM_CHARD_CLIP,
+ BAM_CPAD_=BAM_CPAD,
+ BAM_CBASE_MATCH=BAM_CEQUAL,
+ BAM_CBASE_MISMATCH=BAM_CDIFF
+};
+
+typedef bam1_t bam_seq_t;
+
+#include "cram/sam_header.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+bam_hdr_t *cram_header_to_bam(SAM_hdr *h);
+SAM_hdr *bam_header_to_cram(bam_hdr_t *h);
+
+int bam_construct_seq(bam_seq_t **bp, size_t extra_len,
+ const char *qname, size_t qname_len,
+ int flag,
+ int rname, // Ref ID
+ int pos,
+ int end, // aligned start/end coords
+ int mapq,
+ uint32_t ncigar, const uint32_t *cigar,
+ int mrnm, // Mate Ref ID
+ int mpos,
+ int isize,
+ int len,
+ const char *seq,
+ const char *qual);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _CRAM_SAMTOOLS_H_ */
diff --git a/src/cram/pooled_alloc.h b/src/cram/pooled_alloc.h
new file mode 100755
index 0000000..e19e320
--- /dev/null
+++ b/src/cram/pooled_alloc.h
@@ -0,0 +1,64 @@
+/*
+Copyright (c) 2009 Genome Research Ltd.
+Author: Rob Davies
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright notice,
+this list of conditions and the following disclaimer in the documentation
+and/or other materials provided with the distribution.
+
+ 3. Neither the names Genome Research Ltd and Wellcome Trust Sanger
+Institute nor the names of its contributors may be used to endorse or promote
+products derived from this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY GENOME RESEARCH LTD AND CONTRIBUTORS "AS IS" AND
+ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL GENOME RESEARCH LTD OR CONTRIBUTORS BE LIABLE
+FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+
+#ifndef _POOLED_ALLOC_H_
+#define _POOLED_ALLOC_H_
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*
+ * Implements a pooled block allocator where all items are the same size,
+ * but we need many of them.
+ */
+typedef struct {
+ void *pool;
+ size_t used;
+} pool_t;
+
+typedef struct {
+ size_t dsize;
+ size_t psize;
+ size_t npools;
+ pool_t *pools;
+ void *free;
+} pool_alloc_t;
+
+pool_alloc_t *pool_create(size_t dsize);
+void pool_destroy(pool_alloc_t *p);
+void *pool_alloc(pool_alloc_t *p);
+void pool_free(pool_alloc_t *p, void *ptr);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /*_POOLED_ALLOC_H_*/
diff --git a/src/cram/sam_header.h b/src/cram/sam_header.h
new file mode 100755
index 0000000..e312df4
--- /dev/null
+++ b/src/cram/sam_header.h
@@ -0,0 +1,459 @@
+/*
+Copyright (c) 2013-2014 Genome Research Ltd.
+Author: James Bonfield
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright notice,
+this list of conditions and the following disclaimer in the documentation
+and/or other materials provided with the distribution.
+
+ 3. Neither the names Genome Research Ltd and Wellcome Trust Sanger
+Institute nor the names of its contributors may be used to endorse or promote
+products derived from this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY GENOME RESEARCH LTD AND CONTRIBUTORS "AS IS" AND
+ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL GENOME RESEARCH LTD OR CONTRIBUTORS BE LIABLE
+FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+
+/*! \file
+ * SAM header parsing.
+ *
+ * These functions can be shared between SAM, BAM and CRAM file
+ * formats as all three internally use the same string encoding for
+ * header fields.
+ */
+
+/*
+ * TODO.
+ *
+ * - Sort order (parse to struct, enum type, updating funcs)
+ * - Removal of lines.
+ * - Updating of lines
+ */
+
+#ifndef _SAM_HDR_H_
+#define _SAM_HDR_H_
+
+#include
+
+#include "cram/string_alloc.h"
+#include "cram/pooled_alloc.h"
+
+#include "htslib/khash.h"
+#include "htslib/kstring.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+// For structure assignment. Eg kstring_t s = KS_INITIALIZER;
+#define KS_INITIALIZER {0,0,0}
+
+// For initialisation elsewhere. Eg KS_INIT(x->str);
+#define KS_INIT(ks) ((ks)->l = 0, (ks)->m = 0, (ks)->s = NULL)
+
+// Frees the string subfield only. Assumes 's' itself is static.
+#define KS_FREE(ks) do { if ((ks)->s) free((ks)->s); } while(0)
+
+/*
+ * Proposed new SAM header parsing
+
+1 @SQ ID:foo LN:100
+2 @SQ ID:bar LN:200
+3 @SQ ID:ram LN:300 UR:xyz
+4 @RG ID:r ...
+5 @RG ID:s ...
+
+Hash table for 2-char @keys without dup entries.
+If dup lines, we form a circular linked list. Ie hash keys = {RG, SQ}.
+
+HASH("SQ")--\
+ |
+ (3) <-> 1 <-> 2 <-> 3 <-> (1)
+
+HASH("RG")--\
+ |
+ (5) <-> 4 <-> 5 <-> (4)
+
+Items stored in the hash values also form their own linked lists:
+Ie SQ->ID(foo)->LN(100)
+ SQ->ID(bar)->LN(200)
+ SQ->ID(ram)->LN(300)->UR(xyz)
+ RG->ID(r)
+ */
+
+/*! A single key:value pair on a header line
+ *
+ * These form a linked list and hold strings. The strings are
+ * allocated from a string_alloc_t pool referenced in the master
+ * SAM_hdr structure. Do not attempt to free, malloc or manipulate
+ * these strings directly.
+ */
+typedef struct SAM_hdr_tag_s {
+ struct SAM_hdr_tag_s *next;
+ char *str;
+ int len;
+} SAM_hdr_tag;
+
+/*! The parsed version of the SAM header string.
+ *
+ * Each header type (SQ, RG, HD, etc) points to its own SAM_hdr_type
+ * struct via the main hash table h in the SAM_hdr struct.
+ *
+ * These in turn consist of circular bi-directional linked lists (ie
+ * rings) to hold the multiple instances of the same header type
+ * code. For example if we have 5 \@SQ lines the primary hash table
+ * will key on \@SQ pointing to the first SAM_hdr_type and that in turn
+ * will be part of a ring of 5 elements.
+ *
+ * For each SAM_hdr_type structure we also point to a SAM_hdr_tag
+ * structure which holds the tokenised attributes; the tab separated
+ * key:value pairs per line.
+ */
+typedef struct SAM_hdr_item_s {
+ struct SAM_hdr_item_s *next; // cirular
+ struct SAM_hdr_item_s *prev;
+ SAM_hdr_tag *tag; // first tag
+ int order; // 0 upwards
+} SAM_hdr_type;
+
+/*! Parsed \@SQ lines */
+typedef struct {
+ char *name;
+ uint32_t len;
+ SAM_hdr_type *ty;
+ SAM_hdr_tag *tag;
+} SAM_SQ;
+
+/*! Parsed \@RG lines */
+typedef struct {
+ char *name;
+ SAM_hdr_type *ty;
+ SAM_hdr_tag *tag;
+ int name_len;
+ int id; // numerical ID
+} SAM_RG;
+
+/*! Parsed \@PG lines */
+typedef struct {
+ char *name;
+ SAM_hdr_type *ty;
+ SAM_hdr_tag *tag;
+ int name_len;
+ int id; // numerical ID
+ int prev_id; // -1 if none
+} SAM_PG;
+
+/*! Sort order parsed from @HD line */
+enum sam_sort_order {
+ ORDER_UNKNOWN =-1,
+ ORDER_UNSORTED = 0,
+ ORDER_NAME = 1,
+ ORDER_COORD = 2,
+ //ORDER_COLLATE = 3 // maybe one day!
+};
+
+KHASH_MAP_INIT_INT(sam_hdr, SAM_hdr_type*)
+KHASH_MAP_INIT_STR(m_s2i, int)
+
+/*! Primary structure for header manipulation
+ *
+ * The initial header text is held in the text kstring_t, but is also
+ * parsed out into SQ, RG and PG arrays. These have a hash table
+ * associated with each to allow lookup by ID or SN fields instead of
+ * their numeric array indices. Additionally PG has an array to hold
+ * the linked list start points (the last in a PP chain).
+ *
+ * Use the appropriate sam_hdr_* functions to edit the header, and
+ * call sam_hdr_rebuild() any time the textual form needs to be
+ * updated again.
+ */
+typedef struct {
+ kstring_t text; //!< concatenated text, indexed by SAM_hdr_tag
+ khash_t(sam_hdr) *h;
+ string_alloc_t *str_pool; //!< Pool of SAM_hdr_tag->str strings
+ pool_alloc_t *type_pool;//!< Pool of SAM_hdr_type structs
+ pool_alloc_t *tag_pool; //!< Pool of SAM_hdr_tag structs
+
+ // @SQ lines / references
+ int nref; //!< Number of \@SQ lines
+ SAM_SQ *ref; //!< Array of parsed \@SQ lines
+ khash_t(m_s2i) *ref_hash; //!< Maps SQ SN field to sq[] index
+
+ // @RG lines / read-groups
+ int nrg; //!< Number of \@RG lines
+ SAM_RG *rg; //!< Array of parsed \@RG lines
+ khash_t(m_s2i) *rg_hash; //!< Maps RG ID field to rg[] index
+
+ // @PG lines / programs
+ int npg; //!< Number of \@PG lines
+ int npg_end; //!< Number of terminating \@PG lines
+ int npg_end_alloc; //!< Size of pg_end field
+ SAM_PG *pg; //!< Array of parsed \@PG lines
+ khash_t(m_s2i) *pg_hash; //!< Maps PG ID field to pg[] index
+ int *pg_end; //!< \@PG chain termination IDs
+
+ // @HD data
+ enum sam_sort_order sort_order; //!< @HD SO: field
+
+ // @cond internal
+ char ID_buf[1024]; // temporary buffer
+ int ID_cnt;
+ int ref_count; // number of uses of this SAM_hdr
+ // @endcond
+} SAM_hdr;
+
+/*! Creates an empty SAM header, ready to be populated.
+ *
+ * @return
+ * Returns a SAM_hdr struct on success (free with sam_hdr_free())
+ * NULL on failure
+ */
+SAM_hdr *sam_hdr_new(void);
+
+/*! Tokenises a SAM header into a hash table.
+ *
+ * Also extracts a few bits on specific data types, such as @RG lines.
+ *
+ * @return
+ * Returns a SAM_hdr struct on success (free with sam_hdr_free());
+ * NULL on failure
+ */
+SAM_hdr *sam_hdr_parse_(const char *hdr, int len);
+
+
+/*! Produces a duplicate copy of hdr and returns it.
+ * @return
+ * Returns NULL on failure
+ */
+SAM_hdr *sam_hdr_dup(SAM_hdr *hdr);
+
+
+/*! Increments a reference count on hdr.
+ *
+ * This permits multiple files to share the same header, all calling
+ * sam_hdr_free when done, without causing errors for other open files.
+ */
+void sam_hdr_incr_ref(SAM_hdr *hdr);
+
+
+/*! Increments a reference count on hdr.
+ *
+ * This permits multiple files to share the same header, all calling
+ * sam_hdr_free when done, without causing errors for other open files.
+ *
+ * If the reference count hits zero then the header is automatically
+ * freed. This makes it a synonym for sam_hdr_free().
+ */
+void sam_hdr_decr_ref(SAM_hdr *hdr);
+
+
+/*! Deallocates all storage used by a SAM_hdr struct.
+ *
+ * This also decrements the header reference count. If after decrementing
+ * it is still non-zero then the header is assumed to be in use by another
+ * caller and the free is not done.
+ *
+ * This is a synonym for sam_hdr_dec_ref().
+ */
+void sam_hdr_free(SAM_hdr *hdr);
+
+/*! Returns the current length of the SAM_hdr in text form.
+ *
+ * Call sam_hdr_rebuild() first if editing has taken place.
+ */
+int sam_hdr_length(SAM_hdr *hdr);
+
+/*! Returns the string form of the SAM_hdr.
+ *
+ * Call sam_hdr_rebuild() first if editing has taken place.
+ */
+char *sam_hdr_str(SAM_hdr *hdr);
+
+/*! Appends a formatted line to an existing SAM header.
+ *
+ * Line is a full SAM header record, eg "@SQ\tSN:foo\tLN:100", with
+ * optional new-line. If it contains more than 1 line then multiple lines
+ * will be added in order.
+ *
+ * Input text is of maximum length len or as terminated earlier by a NUL.
+ * Len may be 0 if unknown, in which case lines must be NUL-terminated.
+ *
+ * @return
+ * Returns 0 on success;
+ * -1 on failure
+ */
+int sam_hdr_add_lines(SAM_hdr *sh, const char *lines, int len);
+
+/*! Adds a single line to a SAM header.
+ *
+ * Specify type and one or more key,value pairs, ending with the NULL key.
+ * Eg. sam_hdr_add(h, "SQ", "ID", "foo", "LN", "100", NULL).
+ *
+ * @return
+ * Returns 0 on success;
+ * -1 on failure
+ */
+int sam_hdr_add(SAM_hdr *sh, const char *type, ...);
+
+/*! Adds a single line to a SAM header.
+ *
+ * This is much like sam_hdr_add() but with the additional va_list
+ * argument. This is followed by specifying type and one or more
+ * key,value pairs, ending with the NULL key.
+ *
+ * Eg. sam_hdr_vadd(h, "SQ", args, "ID", "foo", "LN", "100", NULL).
+ *
+ * The purpose of the additional va_list parameter is to permit other
+ * varargs functions to call this while including their own additional
+ * parameters; an example is in sam_hdr_add_PG().
+ *
+ * Note: this function invokes va_arg at least once, making the value
+ * of ap indeterminate after the return. The caller should call
+ * va_start/va_end before/after calling this function or use va_copy.
+ *
+ * @return
+ * Returns 0 on success;
+ * -1 on failure
+ */
+int sam_hdr_vadd(SAM_hdr *sh, const char *type, va_list ap, ...);
+
+/*!
+ * @return
+ * Returns the first header item matching 'type'. If ID is non-NULL it checks
+ * for the tag ID: and compares against the specified ID.
+ *
+ * Returns NULL if no type/ID is found
+ */
+SAM_hdr_type *sam_hdr_find(SAM_hdr *hdr, char *type,
+ char *ID_key, char *ID_value);
+
+/*!
+ *
+ * As per SAM_hdr_type, but returns a complete line of formatted text
+ * for a specific head type/ID combination. If ID is NULL then it returns
+ * the first line of the specified type.
+ *
+ * The returned string is malloced and should be freed by the calling
+ * function with free().
+ *
+ * @return
+ * Returns NULL if no type/ID is found.
+ */
+char *sam_hdr_find_line(SAM_hdr *hdr, char *type,
+ char *ID_key, char *ID_value);
+
+/*! Looks for a specific key in a single sam header line.
+ *
+ * If prev is non-NULL it also fills this out with the previous tag, to
+ * permit use in key removal. *prev is set to NULL when the tag is the first
+ * key in the list. When a tag isn't found, prev (if non NULL) will be the last
+ * tag in the existing list.
+ *
+ * @return
+ * Returns the tag pointer on success;
+ * NULL on failure
+ */
+SAM_hdr_tag *sam_hdr_find_key(SAM_hdr *sh,
+ SAM_hdr_type *type,
+ char *key,
+ SAM_hdr_tag **prev);
+
+/*! Adds or updates tag key,value pairs in a header line.
+ *
+ * Eg for adding M5 tags to @SQ lines or updating sort order for the
+ * @HD line (although use the sam_hdr_sort_order() function for
+ * HD manipulation, which is a wrapper around this funuction).
+ *
+ * Specify multiple key,value pairs ending in NULL.
+ *
+ * @return
+ * Returns 0 on success;
+ * -1 on failure
+ */
+int sam_hdr_update(SAM_hdr *hdr, SAM_hdr_type *type, ...);
+
+/*! Returns the sort order from the @HD SO: field */
+enum sam_sort_order sam_hdr_sort_order(SAM_hdr *hdr);
+
+/*! Reconstructs the kstring from the header hash table.
+ * @return
+ * Returns 0 on success;
+ * -1 on failure
+ */
+int sam_hdr_rebuild(SAM_hdr *hdr);
+
+/*! Looks up a reference sequence by name and returns the numerical ID.
+ * @return
+ * Returns -1 if unknown reference.
+ */
+int sam_hdr_name2ref(SAM_hdr *hdr, const char *ref);
+
+/*! Looks up a read-group by name and returns a pointer to the start of the
+ * associated tag list.
+ *
+ * @return
+ * Returns NULL on failure
+ */
+SAM_RG *sam_hdr_find_rg(SAM_hdr *hdr, const char *rg);
+
+/*! Fixes any PP links in @PG headers.
+ *
+ * If the entries are in order then this doesn't need doing, but incase
+ * our header is out of order this goes through the sh->pg[] array
+ * setting the prev_id field.
+ *
+ * @return
+ * Returns 0 on sucess;
+ * -1 on failure (indicating broken PG/PP records)
+ */
+int sam_hdr_link_pg(SAM_hdr *hdr);
+
+
+/*! Add an @PG line.
+ *
+ * If we wish complete control over this use sam_hdr_add() directly. This
+ * function uses that, but attempts to do a lot of tedious house work for
+ * you too.
+ *
+ * - It will generate a suitable ID if the supplied one clashes.
+ * - It will generate multiple @PG records if we have multiple PG chains.
+ *
+ * Call it as per sam_hdr_add() with a series of key,value pairs ending
+ * in NULL.
+ *
+ * @return
+ * Returns 0 on success;
+ * -1 on failure
+ */
+int sam_hdr_add_PG(SAM_hdr *sh, const char *name, ...);
+
+/*!
+ * A function to help with construction of CL tags in @PG records.
+ * Takes an argc, argv pair and returns a single space-separated string.
+ * This string should be deallocated by the calling function.
+ *
+ * @return
+ * Returns malloced char * on success;
+ * NULL on failure
+ */
+char *stringify_argv(int argc, char *argv[]);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _SAM_HDR_H_ */
diff --git a/src/cram/string_alloc.h b/src/cram/string_alloc.h
new file mode 100755
index 0000000..e044673
--- /dev/null
+++ b/src/cram/string_alloc.h
@@ -0,0 +1,68 @@
+/*
+Copyright (c) 2010 Genome Research Ltd.
+Author: Andrew Whitwham
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright notice,
+this list of conditions and the following disclaimer in the documentation
+and/or other materials provided with the distribution.
+
+ 3. Neither the names Genome Research Ltd and Wellcome Trust Sanger
+Institute nor the names of its contributors may be used to endorse or promote
+products derived from this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY GENOME RESEARCH LTD AND CONTRIBUTORS "AS IS" AND
+ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL GENOME RESEARCH LTD OR CONTRIBUTORS BE LIABLE
+FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+
+#ifndef _STRING_ALLOC_H_
+#define _STRING_ALLOC_H_
+
+#include
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*
+ * A pooled string allocator intended to cut down on the
+ * memory overhead of many small string allocations.
+ *
+ * Andrew Whitwham, September 2010.
+ */
+
+typedef struct {
+ char *str;
+ size_t used;
+} string_t;
+
+typedef struct {
+ size_t max_length;
+ size_t nstrings;
+ string_t *strings;
+} string_alloc_t;
+
+string_alloc_t *string_pool_create(size_t max_length);
+void string_pool_destroy(string_alloc_t *a_str);
+char *string_alloc(string_alloc_t *a_str, size_t length);
+char *string_dup(string_alloc_t *a_str, char *instr);
+char *string_ndup(string_alloc_t *a_str, char *instr, size_t len);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/decode.c b/src/decode.c
similarity index 98%
rename from decode.c
rename to src/decode.c
index cb7eb96..cda8fcf 100644
--- a/decode.c
+++ b/src/decode.c
@@ -105,7 +105,7 @@ void bc_push(bc_array_t *bc, bc_details_t *bcd)
if (bc->end == bc->max) {
// expand the array
bc->max *= 2;
- bc->entries = realloc(bc->entries, bc->max * sizeof(bc_details_t));
+ bc->entries = realloc(bc->entries, bc->max * sizeof(bc_details_t *));
}
bc->entries[bc->end] = bcd;
bc->end++;
@@ -133,7 +133,7 @@ bc_array_t *bc_init(void)
bc->end = 0;
bc->max = 100;
bc->tag_len = 0;
- bc->entries = calloc(bc->max, sizeof(bc_details_t));
+ bc->entries = calloc(bc->max, sizeof(bc_details_t *));
// initialise first entry for null metrics
bc_details_t *bcd = calloc(1, sizeof(bc_details_t));
@@ -342,8 +342,8 @@ int writeMetrics(bc_array_t *barcodeArray, opts_t *opts)
int total_reads = bcd->reads;
int total_pf_reads = bcd->pf_reads;
int total_pf_reads_assigned = 0;
- int max_reads = bcd->reads;
- int max_pf_reads = bcd->pf_reads;
+ int max_reads = 0;
+ int max_pf_reads = 0;
int nReads = 0;
int n;
@@ -754,10 +754,13 @@ int processRecord(samFile *input_file, bam_hdr_t *input_header, samFile *output_
newseq = checkBarcodeQuality(seq,qual,opts->max_low_quality_to_convert);
}
}
+ if (strlen(seq) > barcodeArray->tag_len) {
+ newseq[barcodeArray->tag_len] = 0; // truncate seq to barcode length
+ }
name = findBarcodeName(newseq,barcodeArray,opts,!(file_read->core.flag & BAM_FQCFAIL));
if (!name) name = "0";
char * newtag = makeNewTag(file_read,"RG",name);
- bam_aux_update_str(file_read,"RG",strlen(newtag)+1,(uint8_t*)newtag);
+ bam_aux_update_str(file_read,"RG",strlen(newtag)+1, newtag);
free(newtag);
if (opts->change_read_name) add_suffix(file_read, name);
free(newseq);
@@ -772,7 +775,7 @@ int processRecord(samFile *input_file, bam_hdr_t *input_header, samFile *output_
r = sam_read1(input_file, input_header, paired_read);
if (p) {
char *newtag = makeNewTag(paired_read,"RG",name);
- bam_aux_update_str(paired_read,"RG",strlen(newtag)+1,(uint8_t*)newtag);
+ bam_aux_update_str(paired_read,"RG",strlen(newtag)+1,newtag);
free(newtag);
}
if (opts->change_read_name) add_suffix(paired_read, name);
@@ -867,7 +870,7 @@ static int decode(opts_t* opts)
/*
* Process each BAM record, collecting metrics as we go
*/
- while (0 == processRecord(input_file, input_header, output_file, output_header, barcodeArray, opts))
+ while (0 == processRecord(input_file, input_header, output_file, output_header, barcodeArray, opts));
/*
* And finally.....the metrics
diff --git a/src/filterfile.c b/src/filterfile.c
new file mode 100644
index 0000000..d1dfb48
--- /dev/null
+++ b/src/filterfile.c
@@ -0,0 +1,87 @@
+/* filterfile.c
+
+ Functions to read and parse an Illumina filter file.
+
+ Copyright (C) 2016 Genome Research Ltd.
+
+ Author: Jennifer Liddle
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU Affero General Public License as published
+by the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU Affero General Public License for more details.
+
+You should have received a copy of the GNU Affero General Public License
+along with this program. If not, see .
+*/
+
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+
+#include "filterfile.h"
+
+filter_t *filter_open(char *fname)
+{
+ uint32_t empty;
+
+ filter_t *filter = calloc(1, sizeof(filter_t));
+ filter->total_clusters = 0;
+ filter->current_cluster = 0;
+ filter->current_pf_cluster = 0;
+ filter->fhandle = open(fname,O_RDONLY);
+ if (filter->fhandle == -1) {
+ filter->errmsg = strdup(strerror(errno));
+ } else {
+ int n;
+ n = read(filter->fhandle,(void *)&empty,4);
+ n = read(filter->fhandle,(void *)&filter->version,4);
+ n = read(filter->fhandle,(void *)&filter->total_clusters,4);
+ if (n<0) {
+ fprintf(stderr,"failed to read header from %s\n", fname);
+ exit(1);
+ }
+ }
+ return filter;
+}
+
+void filter_close(filter_t *filter)
+{
+ close(filter->fhandle);
+ free(filter);
+}
+
+void filter_seek(filter_t *filter, int cluster)
+{
+ off_t pos = 12 + cluster;
+ off_t n =lseek(filter->fhandle, pos, SEEK_SET);
+ if (n != pos) {
+ fprintf(stderr,"filter_seek(%d) failed: returned %d instead of %d\n", cluster, (int)n, (int)pos);
+ exit(1);
+ }
+}
+
+int filter_next(filter_t *filter)
+{
+ unsigned char next;
+
+ if (read(filter->fhandle, (void *)&next, 1) != 1) {
+ return -1;
+ }
+
+ filter->current_cluster++;
+ next = next & 0x01;
+ if (next == 1) filter->current_pf_cluster++;
+ return next;
+}
+
diff --git a/src/filterfile.h b/src/filterfile.h
new file mode 100644
index 0000000..fc6a8f0
--- /dev/null
+++ b/src/filterfile.h
@@ -0,0 +1,41 @@
+/* filter.h
+
+ Copyright (C) 2016 Genome Research Ltd.
+
+ Author: Jennifer Liddle
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU Affero General Public License as published
+by the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU Affero General Public License for more details.
+
+You should have received a copy of the GNU Affero General Public License
+along with this program. If not, see .
+*/
+
+#ifndef __FILTERFILE_H__
+#define __FILTERFILE_H__
+
+#include
+
+typedef struct {
+ int fhandle;
+ char *errmsg;
+ uint32_t version;
+ uint32_t total_clusters;
+ int current_cluster;
+ int current_pf_cluster;
+} filter_t;
+
+filter_t *filter_open(char *fname);
+int filter_next(filter_t *filter);
+void filter_close(filter_t *filter);
+void filter_seek(filter_t *filter, int cluster);
+
+#endif
+
diff --git a/hts_addendum.c b/src/hts_addendum.c
similarity index 90%
rename from hts_addendum.c
rename to src/hts_addendum.c
index fcdfd90..8602dc3 100644
--- a/hts_addendum.c
+++ b/src/hts_addendum.c
@@ -25,9 +25,11 @@ along with this program. If not, see .
#include
#include
+#include "bambi.h"
#include "hts_addendum.h"
-int bam_aux_update_str(bam1_t *b, const char tag[2], int len, uint8_t *data)
+#ifndef HAVE_BAM_AUX_UPDATE_STR
+int bam_aux_update_str(bam1_t *b, const char tag[2], int len, const char *data)
{
uint8_t *s = bam_aux_get(b,tag);
if (!s) return -1;
@@ -40,9 +42,11 @@ int bam_aux_update_str(bam1_t *b, const char tag[2], int len, uint8_t *data)
b->l_data += 3 + len;
if (b->m_data < b->l_data) {
+ ptrdiff_t s_offset = (ptrdiff_t) (s - b->m_data);
b->m_data = b->l_data;
kroundup32(b->m_data);
b->data = (uint8_t*)realloc(b->data, b->m_data);
+ s = (uint8_t *) (b->m_data + s_offset);
}
memmove(s+3+len, s, l_aux - (s - aux));
s[0] = tag[0];
@@ -51,7 +55,7 @@ int bam_aux_update_str(bam1_t *b, const char tag[2], int len, uint8_t *data)
memmove(s+3,data,len);
return 0;
}
-
+#endif
SAM_hdr *sam_hdr_del(SAM_hdr *hdr, char *type, char *ID_key, char *ID_value) {
int i,n;
diff --git a/hts_addendum.h b/src/hts_addendum.h
similarity index 89%
rename from hts_addendum.h
rename to src/hts_addendum.h
index e78f8c2..dc14221 100644
--- a/hts_addendum.h
+++ b/src/hts_addendum.h
@@ -25,8 +25,9 @@ along with this program. If not, see .
#include "htslib/sam.h"
#include "cram/sam_header.h"
+#include "cram/cram_samtools.h"
-int bam_aux_update_str(bam1_t *b, const char tag[2], int len, uint8_t *data);
+int bam_aux_update_str(bam1_t *b, const char tag[2], int len, const char *data);
SAM_hdr * sam_hdr_del(SAM_hdr *hdr, char *type, char *ID_key, char *ID_value);
#endif
diff --git a/src/i2b.c b/src/i2b.c
new file mode 100644
index 0000000..7cafd4d
--- /dev/null
+++ b/src/i2b.c
@@ -0,0 +1,1508 @@
+/* i2b.c -- index i2br subcommand.
+
+ Copyright (C) 2016 Genome Research Ltd.
+
+ Author: Jennifer Liddle
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU Affero General Public License as published
+by the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+You should have received a copy of the GNU Affero General Public License
+along with this program. If not, see .
+*/
+
+#include "bambi.h"
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+
+#include
+
+#include "posfile.h"
+#include "filterfile.h"
+#include "bclfile.h"
+
+#define DEFAULT_BARCODE_TAG "BC"
+#define DEFAULT_QUALITY_TAG "QT"
+
+char *strptime(const char *s, const char *format, struct tm *tm);
+
+/*
+ * index array type
+ */
+typedef struct {
+ int end;
+ int max;
+ int *entries;
+} ia_t;
+
+/*
+ * structure to hold options
+ */
+typedef struct {
+ int verbose;
+ char *argv_list;
+ char *run_folder;
+ char *intensity_dir;
+ char *basecalls_dir;
+ int lane;
+ char *output_file;
+ char *output_fmt;
+ char compression_level;
+ bool generate_secondary_basecalls;
+ bool no_filter;
+ char *read_group_id;
+ char *sample_alias;
+ char *library_name;
+ char *study_name;
+ char *platform_unit;
+ char *run_start_date;
+ char *sequencing_centre;
+ char *platform;
+ int first_tile;
+ int tile_limit;
+ char *barcode_tag;
+ char *quality_tag;
+ char *barcode_tag2;
+ char *quality_tag2;
+ int bc_read;
+ int sec_bc_read;
+ ia_t *first_cycle;
+ ia_t *final_cycle;
+ ia_t *first_index_cycle;
+ ia_t *final_index_cycle;
+ bool add_cluster_index_tag;
+ xmlDocPtr intensityConfig;
+ xmlDocPtr basecallsConfig;
+ xmlDocPtr parametersConfig;
+ xmlDocPtr runinfoConfig;
+} opts_t;
+
+
+//
+// TODO
+// These array handling functions really need to go into a separate module, with seperate tests
+//
+
+/*
+ * integer array functions
+ */
+
+int ia_compare(const void *ia1, const void *ia2)
+{
+ return *(int *)ia1 - *(int *)ia2;
+}
+
+void ia_sort(ia_t *ia)
+{
+ qsort(ia->entries, ia->end, sizeof(int), ia_compare);
+}
+
+bool ia_isEmpty(ia_t *ia) {
+ return (ia->end == 0);
+}
+
+void ia_push(ia_t *ia, int i)
+{
+ if (ia->end == ia->max) {
+ // expand the array
+ ia->max *= 2;
+ ia->entries = realloc(ia->entries, ia->max * sizeof(int));
+ }
+ ia->entries[ia->end] = i;
+ ia->end++;
+}
+
+void ia_free(ia_t *ia)
+{
+ free(ia->entries);
+ free(ia);
+}
+
+ia_t *ia_init(int max)
+{
+ ia_t *ia = calloc(1, sizeof(ia_t));
+ ia->end = 0;
+ ia->max = max;
+ ia->entries = calloc(ia->max, sizeof(int));
+ return ia;
+}
+
+/*
+ * Cycle range array
+ */
+
+typedef struct {
+ char *readname;
+ int first, last;
+} cycleRangeEntry_t;
+
+void freeCycleRange(void *ent)
+{
+ cycleRangeEntry_t *cr = (cycleRangeEntry_t *)ent;
+ free(cr->readname);
+ free(cr);
+}
+
+/*
+ * generic arrays
+ * TODO: this should probably go into a seperate module
+ */
+typedef struct {
+ int end;
+ int max;
+ void (*free_entry)(void *);
+ void **entries;
+} va_t;
+
+va_t *va_init(int max, void(*free_entry)(void*))
+{
+ va_t *va = calloc(1,sizeof(va_t));
+ va->end = 0;
+ va->max = max;
+ va->free_entry = free_entry;
+ va->entries = calloc(va->max, sizeof(void *));
+ return va;
+}
+
+void va_push(va_t *va, void *ent)
+{
+ if (va->end == va->max) {
+ // expand the array
+ va->max *= 2;
+ va->entries = realloc(va->entries, va->max * sizeof(void *));
+ }
+ va->entries[va->end] = ent;
+ va->end++;
+}
+
+bool va_isEmpty(va_t *va)
+{
+ return va->end == 0;
+}
+
+void va_free(va_t *va)
+{
+ int n;
+ if (!va) return;
+ for (n=0; n < va->end; n++) {
+ va->free_entry(va->entries[n]);
+ }
+ free(va->entries);
+ free(va);
+}
+
+/*
+ * BCL Read and File arrays
+ */
+typedef struct {
+ char *readname;
+ va_t *bclFileArray;
+ va_t *sclFileArray;
+} bclReadArrayEntry_t;
+
+typedef struct {
+ bclfile_t *bcl;
+} bclFileArrayEntry_t;
+
+void freeBCLFileArray(void *ent)
+{
+ bclfile_t *bcl = (bclfile_t *)ent;
+ bclfile_close(bcl);
+}
+
+void freeBCLReadArray(void *ent)
+{
+ bclReadArrayEntry_t *ra = (bclReadArrayEntry_t *)ent;
+ free(ra->readname);
+ va_free(ra->bclFileArray);
+ va_free(ra->sclFileArray);
+ free(ra);
+}
+
+typedef struct {
+ int tile;
+ int clusters;
+} tileIndexEntry_t;
+
+void freetileIndexArray(void *ent)
+{
+ free(ent);
+}
+
+/*
+ * Release all the options
+ */
+
+static void free_opts(opts_t* opts)
+{
+ if (!opts) return;
+ free(opts->run_folder);
+ free(opts->intensity_dir);
+ free(opts->basecalls_dir);
+ free(opts->argv_list);
+ free(opts->output_file);
+ free(opts->output_fmt);
+ free(opts->read_group_id);
+ free(opts->sample_alias);
+ free(opts->library_name);
+ free(opts->study_name);
+ free(opts->platform_unit);
+ free(opts->run_start_date);
+ free(opts->sequencing_centre);
+ free(opts->platform);
+ free(opts->barcode_tag);
+ free(opts->quality_tag);
+ free(opts->barcode_tag2);
+ free(opts->quality_tag2);
+ ia_free(opts->first_cycle);
+ ia_free(opts->final_cycle);
+ ia_free(opts->first_index_cycle);
+ ia_free(opts->final_index_cycle);
+ xmlFreeDoc(opts->intensityConfig);
+ xmlFreeDoc(opts->basecallsConfig);
+ xmlFreeDoc(opts->parametersConfig);
+ xmlFreeDoc(opts->runinfoConfig);
+ free(opts);
+}
+
+/*
+ * do something clever with an XML document
+ */
+xmlXPathObjectPtr getnodeset(xmlDocPtr doc, char *xpath)
+{
+ xmlXPathContextPtr context;
+ xmlXPathObjectPtr result;
+
+ context = xmlXPathNewContext(doc);
+ if (context == NULL) {
+ fprintf(stderr,"Error in xmlXPathNewContext\n");
+ return NULL;
+ }
+ result = xmlXPathEvalExpression((xmlChar *)xpath, context);
+ xmlXPathFreeContext(context);
+ if (result == NULL) {
+ fprintf(stderr,"Error in xmlXPathEvalExpression\n");
+ return NULL;
+ }
+ if(xmlXPathNodeSetIsEmpty(result->nodesetval)){
+ xmlXPathFreeObject(result);
+ return NULL;
+ }
+ return result;
+}
+/*
+ * Read an attribute for an xpath from an XML doc
+ */
+static char *getXMLAttr(xmlDocPtr doc, char *node, char *attr)
+{
+ char *v = NULL;
+ xmlNodeSetPtr nodeset;
+ xmlXPathObjectPtr result;
+
+ if (!doc) return v;
+ result = getnodeset(doc, node);
+ if (result) {
+ nodeset = result->nodesetval;
+ v = (char *)xmlGetProp(nodeset->nodeTab[0], (xmlChar *)attr);
+ xmlXPathFreeObject (result);
+ }
+ return v;
+}
+
+static int getXMLAttr_int(xmlDocPtr doc, char *node, char *attr)
+{
+ int n = 0;
+ char *v = getXMLAttr(doc,node,attr);
+ if (v) {
+ n = atoi(v);
+ free(v);
+ }
+ return n;
+}
+
+static int xmlGetProp_int(xmlNodePtr node, char *tag)
+{
+ int n=0;
+ char *v = (char*)xmlGetProp(node,(xmlChar*)tag);
+ if (v) {
+ n = atoi(v);
+ free(v);
+ }
+ return n;
+}
+
+/*
+ * Read the value for an xpath for a given XML doc
+ */
+static char *getXMLVal(xmlDocPtr doc, char *xpath)
+{
+ char *val = NULL;
+
+ if (!doc) return val;
+ xmlXPathObjectPtr ptr = getnodeset(doc, xpath);
+
+ if (ptr && ptr->nodesetval) {
+ val = strdup((char *)ptr->nodesetval->nodeTab[0]->children->content);
+ }
+ xmlXPathFreeObject(ptr);
+ return val;
+}
+
+/*
+ * Load an XML file into a xmlDoc pointer
+ */
+xmlDocPtr loadXML(char *dir, char *fname, int verbose)
+{
+ xmlDocPtr doc;
+ char *tmp = calloc(1, strlen(dir) + strlen(fname) + 2);
+ sprintf(tmp, "%s/%s", dir, fname);
+ doc = xmlReadFile(tmp, NULL, XML_PARSE_NOWARNING);
+ if (!doc) {
+ if (verbose) fprintf(stderr, "WARNING: Failed to parse %s/%s\n", dir, fname);
+ } else {
+ if (verbose) fprintf(stderr, "Opened XML file: %s/%s\n", dir, fname);
+ }
+ free(tmp);
+ return doc;
+}
+
+/*
+ * display usage information
+ */
+static void usage(FILE *write_to)
+{
+ fprintf(write_to,
+"Usage: bambi i2b [options]\n"
+"\n"
+"Options:\n"
+" -r --run-folder Illumina runfolder directory including runParameters xml file under it.\n"
+" [default: two levels up from Intensities directory]\n"
+" -i --intensity-dir Illumina intensities directory including config xml file, and clocs,\n"
+" locs or pos files under lane directory. Required\n"
+" -b --basecalls-dir Illumina basecalls directory including config xml file, and filter files,\n"
+" bcl, maybe scl files under lane cycle directory\n"
+" [default: BaseCalls directory under intensities]\n"
+" -l --lane Lane number. Required\n"
+" -o --output-file Output file name. May be '-' for stdout. Required\n"
+" --generate-secondary-basecalls Including second base call or not [default: false]\n"
+" --no-filter Do not filter cluster [default: false]\n"
+" --read-group-id ID used to link RG header record with RG tag in SAM record. [default: '1']\n"
+" --library-name The name of the sequenced library. [default: 'unknown']\n"
+" --sample-alias The name of the sequenced sample. [default: same as library name]\n"
+" --study-name The name of the study. [default: none]\n"
+" --platform-unit The platform unit. [default: runfolder name plus lane number]\n"
+" --run-start-date The start date of the run [default: read from config file]\n"
+" --sequencing-centre Sequencing Centre. [default: 'SC']\n"
+" --platform Sequencing technology used. [default: 'ILLUMINA']\n"
+" --first-tile First tile to be processed. This is normally only used for testing and\n"
+" debugging. [default: null]\n"
+" --tile-limit Number of tiles to process. Normally only used for testing and\n"
+" debugging. [default: all tiles]\n"
+" --barcode-tag Tag name for barcode sequence. [default: " DEFAULT_BARCODE_TAG "]\n"
+" --quality-tag Tag name for barcode quality. [default: " DEFAULT_QUALITY_TAG "]\n"
+" --sec-barcode-tag Tag name for second barcode sequence. [default: null]\n"
+" --sec-quality-tag Tag name for second barcode quality. [default: null]\n"
+" --bc-read Which read (1 or 2) should the barcode sequence and quality be added to?\n"
+" [default: 1]\n"
+" --sec-bc-read Which read (1 or 2) should the second barcode sequence and quality be added to?\n"
+" [default: bc-read]\n"
+" --first-cycle First cycle for each standard (non-index) read. Can be specified 0 or more times.\n"
+" --final-cycle Last cycle for each standard (non-index) read. Can be specified 0 or more times.\n"
+" --first-index-cycle First cycle for each index read. Can be specified 0 or more times.\n"
+" --final-index-cycle Last cycle for each index read. Can be specified 0 or more times.\n"
+" --add-cluster-index-tag Add cluster index tag [default: false]\n"
+" -v --verbose verbose output\n"
+" --output-fmt [sam/bam/cram] [default: bam]\n"
+" --compression-level [0..9]\n"
+);
+}
+
+/*
+ * Takes the command line options and turns them into something we can understand
+ */
+opts_t* i2b_parse_args(int argc, char *argv[])
+{
+ if (argc == 1) { usage(stdout); return NULL; }
+
+ const char* optstring = "vr:i:b:l:o:";
+
+ static const struct option lopts[] = {
+ { "verbose", 0, 0, 'v' },
+ { "run-folder", 1, 0, 'r' },
+ { "intensity-dir", 1, 0, 'i' },
+ { "basecalls-dir", 1, 0, 'b' },
+ { "lane", 1, 0, 'l' },
+ { "output-file", 1, 0, 'o' },
+ { "generate-secondary-basecalls", 0, 0, 0 },
+ { "no-filter", 0, 0, 0 },
+ { "read-group-id", 1, 0, 0 },
+ { "output-fmt", 1, 0, 0 },
+ { "compression-level", 1, 0, 0 },
+ { "library-name", 1, 0, 0 },
+ { "sample-alias", 1, 0, 0 },
+ { "study-name", 1, 0, 0 },
+ { "platform-unit", 1, 0, 0 },
+ { "run-start-date", 1, 0, 0 },
+ { "sequencing-centre", 1, 0, 0 },
+ { "sequencing-center", 1, 0, 0 },
+ { "platform", 1, 0, 0 },
+ { "first-tile", 1, 0, 0 },
+ { "tile-limit", 1, 0, 0 },
+ { "barcode-tag", 1, 0, 0 },
+ { "quality-tag", 1, 0, 0 },
+ { "sec-barcode-tag", 1, 0, 0 },
+ { "sec-quality-tag", 1, 0, 0 },
+ { "bc-read", 1, 0, 0 },
+ { "sec-bc-read", 1, 0, 0 },
+ { "first-cycle", 1, 0, 0 },
+ { "final-cycle", 1, 0, 0 },
+ { "first-index-cycle", 1, 0, 0 },
+ { "final-index-cycle", 1, 0, 0 },
+ { "add-cluster-index-tag", 0, 0, 0 },
+ { NULL, 0, NULL, 0 }
+ };
+
+ opts_t* opts = calloc(sizeof(opts_t), 1);
+ if (!opts) { perror("cannot allocate option parsing memory"); return NULL; }
+
+ opts->argv_list = stringify_argv(argc+1, argv-1);
+ if (opts->argv_list[strlen(opts->argv_list)-1] == ' ') opts->argv_list[strlen(opts->argv_list)-1] = 0;
+
+ opts->first_cycle = ia_init(5);
+ opts->final_cycle = ia_init(5);
+ opts->first_index_cycle = ia_init(5);
+ opts->final_index_cycle = ia_init(5);
+
+ int opt;
+ int option_index = 0;
+ while ((opt = getopt_long(argc, argv, optstring, lopts, &option_index)) != -1) {
+ const char *arg;
+ switch (opt) {
+ case 'r': opts->run_folder = strdup(optarg);
+ break;
+ case 'i': opts->intensity_dir = strdup(optarg);
+ break;
+ case 'b': opts->basecalls_dir = strdup(optarg);
+ break;
+ case 'o': opts->output_file = strdup(optarg);
+ break;
+ case 'l': opts->lane = atoi(optarg);
+ break;
+ case 'v': opts->verbose++;
+ break;
+ case 0: arg = lopts[option_index].name;
+ if (strcmp(arg, "output-fmt") == 0) opts->output_fmt = strdup(optarg);
+ else if (strcmp(arg, "compression-level") == 0) opts->compression_level = *optarg;
+ else if (strcmp(arg, "generate-secondary-basecalls") == 0) opts->generate_secondary_basecalls = true;
+ else if (strcmp(arg, "no-filter") == 0) opts->no_filter = true;
+ else if (strcmp(arg, "read-group-id") == 0) opts->read_group_id = strdup(optarg);
+ else if (strcmp(arg, "library-name") == 0) opts->library_name = strdup(optarg);
+ else if (strcmp(arg, "sample-alias") == 0) opts->sample_alias = strdup(optarg);
+ else if (strcmp(arg, "study-name") == 0) opts->study_name = strdup(optarg);
+ else if (strcmp(arg, "platform-unit") == 0) opts->platform_unit = strdup(optarg);
+ else if (strcmp(arg, "run-start-date") == 0) opts->run_start_date = strdup(optarg);
+ else if (strcmp(arg, "sequencing-centre") == 0) opts->sequencing_centre = strdup(optarg);
+ else if (strcmp(arg, "sequencing-center") == 0) opts->sequencing_centre = strdup(optarg);
+ else if (strcmp(arg, "platform") == 0) opts->platform = strdup(optarg);
+ else if (strcmp(arg, "first-tile") == 0) opts->first_tile = atoi(optarg);
+ else if (strcmp(arg, "tile-limit") == 0) opts->tile_limit = atoi(optarg);
+ else if (strcmp(arg, "barcode-tag") == 0) opts->barcode_tag = strdup(optarg);
+ else if (strcmp(arg, "quality-tag") == 0) opts->quality_tag = strdup(optarg);
+ else if (strcmp(arg, "sec-barcode-tag") == 0) opts->barcode_tag2 = strdup(optarg);
+ else if (strcmp(arg, "sec-quality-tag") == 0) opts->quality_tag2 = strdup(optarg);
+ else if (strcmp(arg, "bc-read") == 0) opts->bc_read = atoi(optarg);
+ else if (strcmp(arg, "sec-bc-read") == 0) opts->sec_bc_read = atoi(optarg);
+ else if (strcmp(arg, "first-cycle") == 0) ia_push(opts->first_cycle,atoi(optarg));
+ else if (strcmp(arg, "final-cycle") == 0) ia_push(opts->final_cycle,atoi(optarg));
+ else if (strcmp(arg, "first-index-cycle") == 0) ia_push(opts->first_index_cycle,atoi(optarg));
+ else if (strcmp(arg, "final-index-cycle") == 0) ia_push(opts->final_index_cycle,atoi(optarg));
+ else if (strcmp(arg, "add-cluster-index-tag") == 0) opts->add_cluster_index_tag = true;
+ else {
+ fprintf(stderr,"\nUnknown option: %s\n\n", arg);
+ usage(stdout); free_opts(opts);
+ return NULL;
+ }
+ break;
+ default: fprintf(stderr,"Unknown option: '%c'\n", opt);
+ /* else fall-through */
+ case '?': usage(stdout); free_opts(opts); return NULL;
+ }
+ }
+
+ argc -= optind;
+ argv += optind;
+
+ //if (argc > 0) opts->input_name = strdup(argv[0]);
+ optind = 0;
+
+ // some validation and tidying
+ if (!opts->intensity_dir) {
+ fprintf(stderr,"You must specify an intensity directory (-i or --intensity-dir)\n");
+ usage(stderr); return NULL;
+ }
+
+ if (opts->lane <= 0) {
+ fprintf(stderr,"You must specify a lane number (-l or --lane)\n");
+ usage(stderr); return NULL;
+ }
+
+ if (opts->lane > 999) {
+ fprintf(stderr,"I can't handle a lane number greater than 999\n");
+ usage(stderr); return NULL;
+ }
+
+ if (!opts->output_file) {
+ fprintf(stderr,"You must specify an output file (-o or --output-file)\n");
+ usage(stderr); return NULL;
+ }
+
+ if (opts->compression_level && !isdigit(opts->compression_level)) {
+ fprintf(stderr, "compression-level must be a digit in the range [0..9], not '%c'\n", opts->compression_level);
+ usage(stderr); return NULL;
+ }
+
+ // Set defaults
+ if (!opts->read_group_id) opts->read_group_id = strdup("1");
+ if (!opts->library_name) opts->library_name = strdup("unknown");
+ if (!opts->sample_alias) opts->sample_alias = strdup(opts->library_name);
+ if (!opts->sequencing_centre) opts->sequencing_centre = strdup("SC");
+ if (!opts->barcode_tag) opts->barcode_tag = strdup(DEFAULT_BARCODE_TAG);
+ if (!opts->quality_tag) opts->quality_tag = strdup(DEFAULT_QUALITY_TAG);
+ if (!opts->bc_read) opts->bc_read = 1;
+ if (!opts->sec_bc_read) opts->sec_bc_read = opts->bc_read;
+ if (!opts->platform) opts->platform = strdup("ILLUMINA");
+
+ if (!opts->run_folder) {
+ // default is two levels up from intensity dierectory
+ opts->run_folder = calloc(1, strlen(opts->intensity_dir) + 7);
+ sprintf(opts->run_folder, "%s/../..", opts->intensity_dir);
+ }
+
+ if (!opts->basecalls_dir) {
+ opts->basecalls_dir = calloc(1, strlen(opts->intensity_dir) + strlen("/BaseCalls") + 1);
+ sprintf(opts->basecalls_dir, "%s/%s", opts->intensity_dir, "BaseCalls");
+ }
+
+ // rationalise directories
+ char *tmp;
+ tmp = opts->intensity_dir;
+ opts->intensity_dir = realpath(tmp, NULL);
+ if (!opts->intensity_dir) {
+ fprintf(stderr,"Can't open directory: %s\n", tmp);
+ perror("intensity-dir");
+ return NULL;
+ }
+ free(tmp);
+
+ tmp = opts->basecalls_dir;
+ opts->basecalls_dir = realpath(tmp, NULL);
+ if (!opts->basecalls_dir) { perror("basecalls-dir"); return NULL; }
+ free(tmp);
+
+ tmp = opts->run_folder;
+ opts->run_folder = realpath(tmp, NULL);
+ if (!opts->run_folder) { perror("run_folder"); return NULL; }
+ free(tmp);
+
+ if (!opts->platform_unit) {
+ // default is runfolder + lane
+ char *rf = basename(opts->run_folder);
+ opts->platform_unit = calloc(1, strlen(rf) + 5);
+ sprintf(opts->platform_unit, "%s_%d", rf, opts->lane);
+ }
+
+ // read XML files
+ opts->intensityConfig = loadXML(opts->intensity_dir, "config.xml", opts->verbose);
+ opts->basecallsConfig = loadXML(opts->basecalls_dir, "config.xml", opts->verbose);
+ opts->parametersConfig = loadXML(opts->run_folder, "runParameters.xml", opts->verbose);
+ if (!opts->parametersConfig) opts->parametersConfig = loadXML(opts->run_folder, "RunParameters.xml", opts->verbose);
+ opts->runinfoConfig = loadXML(opts->run_folder, "RunInfo.xml", opts->verbose);
+
+ if (!opts->run_start_date) {
+ opts->run_start_date = getXMLVal(opts->intensityConfig, "//RunParameters/RunFolderDate");
+ }
+ if (!opts->run_start_date) {
+ opts->run_start_date = getXMLVal(opts->parametersConfig, "//Setup/RunStartDate");
+ }
+ if (!opts->run_start_date) {
+ opts->run_start_date = getXMLVal(opts->parametersConfig, "//RunParameters/RunStartDate");
+ }
+
+ if (!opts->run_start_date) {
+ fprintf(stderr, "No run-start-date given, and none found in config files\n");
+ return NULL;
+ }
+
+ // reformat date from yymmdd to YYYY-mm-dd
+ if (strlen(opts->run_start_date) == 6) {
+ char *tmp = calloc(1,64);
+ struct tm tm;
+ memset(&tm, 0, sizeof(struct tm));
+ strptime(opts->run_start_date, "%y%m%d", &tm);
+ strftime(tmp, 63, "%Y-%m-%dT00:00:00+0000", &tm);
+ free(opts->run_start_date);
+ opts->run_start_date = tmp;
+ }
+
+ return opts;
+}
+
+/*
+ * convert SAM_hdr to bam_hdr
+ */
+void sam_hdr_unparse(SAM_hdr *sh, bam_hdr_t *h)
+{
+ free(h->text);
+ sam_hdr_rebuild(sh);
+ h->text = strdup(sam_hdr_str(sh));
+ h->l_text = sam_hdr_length(sh);
+ sam_hdr_free(sh);
+}
+
+/*
+ * Add the header lines to the BAM file
+ */
+int addHeader(samFile *output_file, bam_hdr_t *output_header, opts_t *opts)
+{
+ SAM_hdr *sh = sam_hdr_parse_(output_header->text,output_header->l_text);
+ char *version = NULL;
+ char *pname = NULL;
+
+ pname = getXMLAttr(opts->parametersConfig, "/ImageAnalysis/Run/Software", "Name");
+ if (!pname) pname = getXMLAttr(opts->intensityConfig, "/ImageAnalysis/Run/Software", "Name");
+ if (!pname) pname = getXMLVal(opts->parametersConfig, "//ApplicationName");
+ if (!pname) { fprintf(stderr,"Can't find program name anywhere\n"); return 1; }
+
+ version = getXMLAttr(opts->parametersConfig, "/ImageAnalysis/Run/Software", "Version");
+ if (!version) version = getXMLAttr(opts->intensityConfig, "/ImageAnalysis/Run/Software", "Version");
+ if (!version) version = getXMLVal(opts->parametersConfig, "//ApplicationVersion");
+ if (!version) { fprintf(stderr,"Can't find program version anywhere\n"); return 1; }
+
+ // Add header line
+ sam_hdr_add(sh, "HD", "VN", "1.5", "SO", "unsorted", NULL, NULL);
+
+ // Add RG line
+ sam_hdr_add(sh, "RG", "ID", opts->read_group_id,
+ "DT", opts->run_start_date,
+ "PU", opts->platform_unit,
+ "LB", opts->library_name,
+ "PG", "SCS",
+ "SM", opts->sample_alias,
+ "CN", opts->sequencing_centre,
+ "PL", opts->platform,
+ (opts->study_name ? "DS": NULL), (opts->study_name ? opts->study_name: NULL),
+ NULL, NULL);
+
+ // Add PG lines
+ version = getXMLAttr(opts->parametersConfig, "/ImageAnalysis/Run/Software", "Version");
+ if (!version) version = getXMLAttr(opts->intensityConfig, "/ImageAnalysis/Run/Software", "Version");
+ if (!version) version = getXMLVal(opts->parametersConfig, "//Setup/ApplicationVersion");
+ if (!version) { fprintf(stderr, "Can't find program version\n"); exit(1); }
+ pname = getXMLAttr(opts->parametersConfig, "/ImageAnalysis/Run/Software", "Name");
+ if (!pname) pname = getXMLAttr(opts->intensityConfig, "/ImageAnalysis/Run/Software", "Name");
+ if (!pname) pname = getXMLVal(opts->parametersConfig, "//Setup/ApplicationName");
+ if (!pname) { fprintf(stderr, "Can't find program name\n"); exit(1); }
+ sam_hdr_add(sh, "PG",
+ "ID", "SCS",
+ "VN", version,
+ "PN", pname,
+ "DS", "Controlling software on instrument",
+ NULL, NULL);
+ free(pname); free(version);
+
+ version = getXMLAttr(opts->basecallsConfig, "/BaseCallAnalysis/Run/Software", "Version");
+ pname = getXMLAttr(opts->basecallsConfig, "/BaseCallAnalysis/Run/Software", "Name");
+ sam_hdr_add(sh, "PG",
+ "ID", "basecalling",
+ "PP", "SCS",
+ "VN", version ? version : "Unknown",
+ "PN", pname ? pname : "Unknown",
+ "DS", "Basecalling Package",
+ NULL, NULL);
+ free(pname); free(version);
+
+ sam_hdr_add(sh, "PG",
+ "ID", "bambi",
+ "PP", "basecalling",
+ "VN", bambi_version(),
+ "CL", opts->argv_list,
+ "PN", "bambi",
+ "DS", "Convert Illumina BCL to BAM or SAM file",
+ NULL, NULL);
+
+ sam_hdr_unparse(sh,output_header);
+ if (sam_hdr_write(output_file, output_header) != 0) {
+ fprintf(stderr, "Could not write output file header\n");
+ return 1;
+ }
+ return 0;
+}
+
+/*
+ * Get an ID - depending on what config files we have and what is in them
+ * this is either instrument_runid or computer_experiment
+ */
+char *getId(opts_t *opts)
+{
+ xmlDocPtr doc;
+ char *runid = NULL;
+ char *instrument = NULL;
+ char *experiment = NULL;
+ char *computer = NULL;
+ char *id = NULL;
+
+ doc = opts->basecallsConfig ? opts->basecallsConfig : opts->intensityConfig;
+
+ runid = getXMLVal(doc, "//RunParameters/RunFolderId");
+ instrument = getXMLVal(doc, "//RunParameters/Instrument");
+
+ if (instrument && runid) {
+ id = calloc(1, strlen(instrument) + strlen(runid) + 2);
+ sprintf(id, "%s_%s", instrument, runid);
+ }
+
+ if (!id) {
+ experiment = getXMLVal(opts->parametersConfig, "//Setup/ExperimentName");
+ computer = getXMLVal(opts->parametersConfig, "//Setup/ComputerName");
+ if (experiment && computer) {
+ id = calloc(1, strlen(experiment) + strlen(computer) + 2);
+ sprintf(id, "%s_%s", computer, experiment);
+ }
+ }
+
+ free(instrument); free(runid); free(experiment); free(computer);
+
+ return id;
+}
+
+/*
+ * Load the tile index array (the BCI file)
+ * This is only for NextSeq
+ */
+va_t *getTileIndex(opts_t *opts)
+{
+ va_t *tileIndex = NULL;
+ char *fname = calloc(1,strlen(opts->basecalls_dir)+64);
+ sprintf(fname, "%s/L%03d/s_%d.bci", opts->basecalls_dir, opts->lane, opts->lane);
+ int fhandle = open(fname,O_RDONLY);
+ if (fhandle < 0) {
+ if (opts->verbose) fprintf(stderr,"Can't open BCI file %s\n", fname);
+ } else {
+ tileIndex = va_init(100,freetileIndexArray);
+ int n;
+ do {
+ tileIndexEntry_t *ti = calloc(1, sizeof(tileIndexEntry_t));
+ n = read(fhandle, &ti->tile, 4);
+ n = read(fhandle, &ti->clusters, 4);
+ if (n == 4) {
+ va_push(tileIndex,ti);
+ }
+ } while (n == 4);
+ close(fhandle);
+ }
+ return tileIndex;
+}
+
+/*
+ * load tile list from basecallsConfig or intensityConfig
+ */
+ia_t *getTileList(opts_t *opts)
+{
+ ia_t *tiles = ia_init(100);
+ xmlXPathObjectPtr ptr;
+ char *xpath = calloc(1,64);
+ xmlDocPtr doc;
+
+ doc = opts->basecallsConfig ? opts->basecallsConfig : opts->intensityConfig;
+
+ sprintf(xpath, "//TileSelection/Lane[@Index=\"%d\"]/Tile", opts->lane);
+ assert(strlen(xpath) < 64);
+ ptr = getnodeset(doc, xpath);
+ free(xpath);
+
+ if (ptr && ptr->nodesetval) {
+ int n;
+ for (n=0; n < ptr->nodesetval->nodeNr; n++) {
+ char *t = (char *)ptr->nodesetval->nodeTab[n]->children->content;
+ if (t) ia_push(tiles,atoi(t));
+ }
+ xmlXPathFreeObject(ptr);
+ } else {
+ // Maybe this is a NewSeq run?
+ ptr = getnodeset(opts->parametersConfig, "//SelectedTiles/Tile");
+ if (ptr && ptr->nodesetval) {
+ int n;
+ for (n=0; n < ptr->nodesetval->nodeNr; n++) {
+ char *t = (char *)ptr->nodesetval->nodeTab[n]->children->content;
+ char *saveptr;
+ char *lane = strtok_r(t, "_", &saveptr);
+ char *tileno = strtok_r(NULL, "_", &saveptr);
+ if (lane && tileno) {
+ if (atoi(lane) == opts->lane) {
+ ia_push(tiles,atoi(tileno));
+ }
+ }
+ }
+ }
+ }
+
+ if (ia_isEmpty(tiles)) {
+ int numSurfaces = getXMLAttr_int(opts->runinfoConfig, "//FlowcellLayout", "SurfaceCount");
+ int numSwaths = getXMLAttr_int(opts->runinfoConfig, "//FlowcellLayout", "SwathCount");
+ int numTilesPerSwath = getXMLAttr_int(opts->runinfoConfig, "//FlowcellLayout", "TileCount");
+ if (numSurfaces && numSwaths && numTilesPerSwath) {
+ int isur, isw, itile;
+ for (isur = 1; isur <= numSurfaces; isur++) {
+ for (isw = 1; isw <= numSwaths; isw++) {
+ for (itile = 1; itile <= numTilesPerSwath; itile++) {
+ ia_push(tiles, 1000 * isur + 100 * isw + itile);
+ }
+ }
+ }
+ }
+ }
+
+
+ if (ia_isEmpty(tiles)) return tiles;
+
+ ia_sort(tiles);
+
+ // Filter tile list by command line options (mainly used for testing)
+ if (opts->tile_limit && opts->first_tile==0) opts->first_tile = tiles->entries[0];
+
+ if (opts->first_tile != 0) {
+ int n;
+ ia_t *new_tiles = ia_init(100);
+ for (n=0; n < tiles->end; n++) {
+ if (tiles->entries[n] == opts->first_tile) {
+ int i, tl;
+ tl = opts->tile_limit ? opts->tile_limit : tiles->end;
+ for (i=n; i < n+tl; i++) {
+ if (i < tiles->end) {
+ ia_push(new_tiles,tiles->entries[i]);
+ }
+ }
+ }
+ }
+ ia_free(tiles);
+ tiles = new_tiles;
+ if (ia_isEmpty(tiles)) {
+ fprintf(stderr,"No tiles to process\n");
+ exit(1);
+ }
+ }
+
+ return tiles;
+}
+
+char *getCycleName(int readCount, bool isIndex)
+{
+ // implements naming convention used by earlier versions of Lane.java
+ char *cycleName = calloc(1,16);
+;
+ if (isIndex) {
+ if (readCount==1) { strcpy(cycleName,"readIndex"); }
+ else { sprintf(cycleName,"readIndex%d",readCount); }
+ } else {
+ sprintf(cycleName,"read%d",readCount);
+ }
+ return cycleName;
+}
+
+void getCycleRangeFromFile(va_t *cycleRange, xmlDocPtr doc)
+{
+ xmlXPathObjectPtr ptr;
+ int readCount = 1;
+ int cycleCount = 1;
+ int indexCount = 1;
+ int n;
+
+ if (!doc) return;
+ ptr = getnodeset(doc,"/RunInfo/Run/Reads/Read");
+ if (!ptr || !ptr->nodesetval) ptr = getnodeset(doc, "/RunParameters/Setup/Reads/Read");
+ if (!ptr || !ptr->nodesetval) ptr = getnodeset(doc, "/RunParameters/Reads/RunInfoRead");
+ if (!ptr || !ptr->nodesetval) return; // still can't find them. Give up.
+
+ for (n=0; n < ptr->nodesetval->nodeNr; n++) {
+ xmlNodePtr np = ptr->nodesetval->nodeTab[n];
+ cycleRangeEntry_t *cr = calloc(1,sizeof(cycleRangeEntry_t));
+ int numCycles = xmlGetProp_int(np,"NumCycles");
+ char *p = (char *)xmlGetProp(np,(xmlChar *)"IsIndexedRead");
+ bool isIndexedRead = ('Y' == *p || 'y' == *p);
+ free(p);
+ cr->readname = getCycleName(isIndexedRead ? indexCount++ : readCount++, isIndexedRead);
+ cr->first = cycleCount;
+ cr->last = cycleCount + numCycles - 1;
+ va_push(cycleRange,cr);
+ cycleCount += numCycles;
+ }
+}
+
+/*
+ * Try to find a cycle range from somewhere
+ */
+va_t *getCycleRange(opts_t *opts)
+{
+ va_t *cycleRange = va_init(100, freeCycleRange);
+ xmlDocPtr doc;
+ xmlXPathObjectPtr ptr = NULL;
+ int n;
+
+ //
+ // read from command line options
+ //
+ if (!ia_isEmpty(opts->first_cycle)) {
+ for (n=0; n < opts->first_cycle->end; n++) {
+ cycleRangeEntry_t *cr = calloc(1,sizeof(cycleRangeEntry_t));
+ cr->readname = getCycleName(n+1,false);
+ cr->first = opts->first_cycle->entries[n];
+ cr->last = opts->final_cycle->entries[n];
+ va_push(cycleRange,cr);
+ }
+ for (n=0; n < opts->first_index_cycle->end; n++) {
+ cycleRangeEntry_t *cr = calloc(1,sizeof(cycleRangeEntry_t));
+ cr->readname = getCycleName(n+1,true);
+ cr->first = opts->first_index_cycle->entries[n];
+ cr->last = opts->final_index_cycle->entries[n];
+ va_push(cycleRange,cr);
+ }
+ }
+
+ if (va_isEmpty(cycleRange)) getCycleRangeFromFile(cycleRange, opts->runinfoConfig);
+ if (va_isEmpty(cycleRange)) getCycleRangeFromFile(cycleRange, opts->parametersConfig);
+
+ // TODO what if there is a barCodeCycleList ?
+
+ if (va_isEmpty(cycleRange)) {
+ doc = opts->basecallsConfig ? opts->basecallsConfig : opts->intensityConfig;
+ ptr = getnodeset(doc, "//RunParameters/Reads");
+ if (ptr && ptr->nodesetval) {
+ int n;
+ for (n=0; n < ptr->nodesetval->nodeNr; n++) {
+ xmlNodePtr np = ptr->nodesetval->nodeTab[n];
+ char name[64];
+ cycleRangeEntry_t *cr = calloc(1,sizeof(cycleRangeEntry_t));
+ int readIndex = xmlGetProp_int(np,"Index");
+ sprintf(name,"read%d",readIndex);
+ cr->readname = strdup(name);
+ np = np->children;
+ while (np->next) {
+ if (strcmp((char*)np->name,"FirstCycle") == 0) {
+ cr->first = atoi((char*)np->children->content);
+ }
+ if (strcmp((char*)np->name,"LastCycle") == 0) {
+ cr->last = atoi((char*)np->children->content);
+ }
+ np = np->next;
+ }
+ va_push(cycleRange, cr);
+ }
+ }
+ }
+
+ if (ptr) xmlXPathFreeObject(ptr);
+ return cycleRange;
+}
+
+/*
+ * Find cluster number for a given tile
+ * Abort if tile not found
+ */
+int findClusterNumber(int tile, va_t *tileIndex)
+{
+ int n;
+ int clusterNumber = 0;
+ for (n=0; n < tileIndex->end; n++) {
+ tileIndexEntry_t *ti = (tileIndexEntry_t *)tileIndex->entries[n];
+ if (ti->tile == tile)
+ return clusterNumber;
+ clusterNumber += ti->clusters;
+ }
+ fprintf(stderr,"findClusterNumber(%d) : no such tile\n", tile);
+ exit(1);
+}
+
+int findClusters(int tile, va_t *tileIndex)
+{
+ int n;
+ for (n=0; n < tileIndex->end; n++) {
+ tileIndexEntry_t *ti = (tileIndexEntry_t *)tileIndex->entries[n];
+ if (ti->tile == tile)
+ return ti->clusters;
+ }
+ fprintf(stderr,"findClusters(%d) : no such tile\n", tile);
+ exit(1);
+}
+
+/*
+ * Open the position file
+ *
+ * Try looking for _pos.txt, .clocs, locs files in that order
+ *
+ * Open and return the first one found, or NULL if not found.
+ */
+
+posfile_t *openPositionFile(int tile, va_t *tileIndex, opts_t *opts)
+{
+ posfile_t *posfile = NULL;
+
+ char *fname = calloc(1, strlen(opts->intensity_dir)+64);
+
+ sprintf(fname, "%s/s_%d_%04d_pos.txt", opts->intensity_dir, opts->lane, tile);
+ posfile = posfile_open(fname);
+ if (opts->verbose && !posfile->errmsg) fprintf(stderr,"Opened %s\n", fname);
+
+ if (posfile->errmsg) {
+ sprintf(fname, "%s/L%03d/s_%d_%04d.clocs", opts->intensity_dir, opts->lane, opts->lane, tile);
+ free(posfile->errmsg); free(posfile);
+ posfile = posfile_open(fname);
+ if (opts->verbose && !posfile->errmsg) fprintf(stderr,"Opened %s\n", fname);
+ }
+
+ if (posfile->errmsg) {
+ sprintf(fname, "%s/L%03d/s_%d_%04d.locs", opts->intensity_dir, opts->lane, opts->lane, tile);
+ free(posfile->errmsg); free(posfile);
+ posfile = posfile_open(fname);
+ if (opts->verbose && !posfile->errmsg) fprintf(stderr,"Opened %s\n", fname);
+ }
+
+ if (posfile->errmsg) {
+ sprintf(fname, "%s/s.locs", opts->intensity_dir);
+ free(posfile->errmsg); free(posfile);
+ posfile = posfile_open(fname);
+ if (opts->verbose && !posfile->errmsg) fprintf(stderr,"Opened %s\n", fname);
+ }
+
+ // if still not found, try NewSeq format files
+ if (posfile->errmsg) {
+ sprintf(fname, "%s/s_%d_pos.txt", opts->intensity_dir, opts->lane);
+ posfile = posfile_open(fname);
+ if (opts->verbose && !posfile->errmsg) fprintf(stderr,"Opened %s\n", fname);
+
+ if (posfile->errmsg) {
+ sprintf(fname, "%s/L%03d/s_%d.clocs", opts->intensity_dir, opts->lane, opts->lane);
+ posfile = posfile_open(fname);
+ if (opts->verbose && !posfile->errmsg) fprintf(stderr,"Opened %s\n", fname);
+ }
+
+ if (posfile->errmsg) {
+ sprintf(fname, "%s/L%03d/s_%d.locs", opts->intensity_dir, opts->lane, opts->lane);
+ posfile = posfile_open(fname);
+ if (opts->verbose && !posfile->errmsg) fprintf(stderr,"Opened %s\n", fname);
+ }
+
+ if (!posfile->errmsg) {
+ if (tileIndex) {
+ posfile_seek(posfile,findClusterNumber(tile,tileIndex));
+ } else {
+ fprintf(stderr,"Trying to open %s with no tile index\n", fname);
+ posfile->errmsg = strdup("Trying to open position file with no tile index");
+ }
+ }
+ }
+
+ free(fname);
+ return posfile;
+
+}
+
+/*
+ * find and open the filter file
+ */
+filter_t *openFilterFile(int tile, va_t *tileIndex, opts_t *opts)
+{
+ filter_t *filter = NULL;
+ char *fname = calloc(1,strlen(opts->basecalls_dir)+128); // a bit arbitrary :-(
+
+ sprintf(fname, "%s/L%03d/s_%d_%04d.filter", opts->basecalls_dir, opts->lane, opts->lane, tile);
+ filter = filter_open(fname);
+ if (filter->errmsg) {
+ sprintf(fname, "%s/s_%d_%04d.filter", opts->basecalls_dir, opts->lane, tile);
+ filter = filter_open(fname);
+ }
+ if (filter->errmsg) {
+ sprintf(fname, "%s/L%03d/s_%d.filter", opts->basecalls_dir, opts->lane, opts->lane);
+ filter = filter_open(fname);
+ }
+
+ if (opts->verbose && !filter->errmsg) fprintf(stderr,"Opened filter file %s\n", fname);
+
+ if (tileIndex) filter_seek(filter,findClusterNumber(tile,tileIndex));
+
+ free(fname);
+ return filter;
+}
+
+/*
+ * Open a single bcl (or scl) file
+ */
+bclfile_t *openBclFile(char *basecalls, int lane, int tile, int cycle, char *ext, va_t *tileIndex)
+{
+ char *fname = calloc(1, strlen(basecalls)+128);
+ if (tileIndex) { // NextSeq format
+ sprintf(fname, "%s/L%03d/%04d.%s", basecalls, lane, cycle, ext);
+ } else {
+ sprintf(fname, "%s/L%03d/C%d.1/s_%d_%04d.%s", basecalls, lane, cycle, lane, tile, ext);
+ }
+ bclfile_t *bcl = bclfile_open(fname);
+ if (bcl->errmsg) {
+ fprintf(stderr,"Can't open %s\n%s\n", fname, bcl->errmsg);
+ return NULL;
+ }
+
+ free(fname);
+
+ if (tileIndex) bclfile_seek(bcl, findClusterNumber(tile,tileIndex));
+
+ return bcl;
+}
+
+/*
+ * Find and open all the relevant bcl and scl files
+ */
+va_t *openBclFiles(va_t *cycleRange, opts_t *opts, int tile, va_t *tileIndex)
+{
+ int n, cycle, nCycles;
+
+ va_t *bclReadArray = va_init(5,freeBCLReadArray);
+
+ for (n=0; n < cycleRange->end; n++) {
+ cycleRangeEntry_t *cr = cycleRange->entries[n];
+ bclReadArrayEntry_t *ra = calloc(1, sizeof(bclReadArrayEntry_t));
+ ra->readname = strdup(cr->readname);
+ nCycles = cr->last - cr->first + 1;
+ ra->bclFileArray = va_init(nCycles, freeBCLFileArray);
+ ra->sclFileArray = va_init(nCycles, freeBCLFileArray);
+
+ for (cycle = cr->first; cycle <= cr->last; cycle++) {
+ bclfile_t *bcl = openBclFile(opts->basecalls_dir, opts->lane, tile, cycle, "bcl", tileIndex);
+ va_push(ra->bclFileArray, bcl);
+
+ if (opts->generate_secondary_basecalls) {
+ bclfile_t *bcl = openBclFile(opts->basecalls_dir, opts->lane, tile, cycle, "scl", tileIndex);
+ va_push(ra->sclFileArray, bcl);
+ }
+ }
+ va_push(bclReadArray,ra);
+ }
+
+ return bclReadArray;
+}
+
+/*
+ * calculate and return the readname
+ */
+char *getReadName(char *id, int lane, int tile, int x, int y)
+{
+ char *readName = calloc(1, 128);
+
+ if (id && *id) {
+ sprintf(readName, "%s:%d:%d:%d:%d", id, lane, tile, x, y);
+ } else {
+ sprintf(readName, "%d:%d:%d:%d", lane, tile, x, y);
+ }
+ if (strlen(readName) > 127) {
+ fprintf(stderr,"readName too long: %s\n", readName);
+ exit(1);
+ }
+ return readName;
+}
+
+bool readArrayContains(va_t *bclReadArray, char *readname)
+{
+ int n;
+ for (n=0; n < bclReadArray->end; n++) {
+ bclReadArrayEntry_t *ra = bclReadArray->entries[n];
+ if (strcmp(readname, ra->readname) == 0) return true;
+ }
+ return false;
+}
+
+/*
+ * read all the bases and qualities for a given read name ("read1" or "read2")
+ */
+void getBases(va_t *bclReadArray, char *readname, char **bases, char **qualities, bool convert_qual)
+{
+ int n;
+ *bases = NULL; *qualities = NULL;
+ for (n=0; n < bclReadArray->end; n++) {
+ bclReadArrayEntry_t *ra = bclReadArray->entries[n];
+ if (strcmp(ra->readname, readname) == 0) {
+ *bases = calloc(1, ra->bclFileArray->end+1);
+ *qualities = calloc(1, ra->bclFileArray->end+1);
+ int i;
+ for (i=0; i < ra->bclFileArray->end; i++) {
+ bclfile_t *b = ra->bclFileArray->entries[i];
+ if (bclfile_next(b) < 0) {
+ fprintf(stderr,"Failed to read bcl file\n");
+ exit(1);
+ }
+ (*bases)[i] = b->base;
+ (*qualities)[i] = b->quality + (convert_qual ? 33 : 0);
+ }
+ break;
+ }
+ }
+}
+
+/*
+ * set the BAM flag
+ */
+int setFlag(bool second, bool filtered, bool ispaired)
+{
+ int flags = 0;
+
+ flags |= BAM_FUNMAP;
+ if (filtered) flags |= BAM_FQCFAIL;
+ if (ispaired) {
+ flags |= BAM_FPAIRED;
+ flags |= BAM_FMUNMAP;
+ if (second) flags |= BAM_FREAD2;
+ else flags |= BAM_FREAD1;
+ }
+ return flags;
+}
+
+/*
+ * Write a BAM record
+ */
+void writeRecord(int flags, opts_t *opts, char *readName,
+ char *bases, char *qualities, char *ib, char *iq, char *ib2, char *iq2,
+ samFile *output_file, bam_hdr_t *output_header)
+{
+ bam1_t *bam = bam_init1();
+
+ int r = bam_construct_seq(&bam, 0, readName, strlen(readName),
+ flags, -1, 0, 0, 0, 0, (uint32_t*)"", -1, 0, 0, strlen(bases), bases, qualities);
+ if (r) {
+ fprintf(stderr,"bam_construct_seq() failed\n");
+ exit(1);
+ }
+
+ if (ib) {
+ bam_aux_append(bam, opts->barcode_tag, 'Z', strlen(ib)+1, (uint8_t *)ib);
+ }
+
+ bam_aux_append(bam, "RG", 'Z', strlen(opts->read_group_id)+1, (uint8_t *)opts->read_group_id);
+
+ if (ib) {
+ bam_aux_append(bam, opts->quality_tag, 'Z', strlen(iq)+1, (uint8_t *)iq);
+ }
+
+ if (ib2) {
+ bam_aux_append(bam, opts->barcode_tag2, 'Z', strlen(ib2)+1, (uint8_t *)ib2);
+ bam_aux_append(bam, opts->quality_tag2, 'Z', strlen(iq2)+1, (uint8_t *)iq2);
+ }
+
+ r = sam_write1(output_file, output_header, bam);
+ if (r <= 0) {
+ fprintf(stderr, "Problem writing record %s : r=%d\n", readName,r);
+ exit(1);
+ }
+ bam_destroy1(bam);
+}
+
+/*
+ * Write all the BAM records for a given tile
+ */
+int processTile(int tile, samFile *output_file, bam_hdr_t *output_header, va_t *cycleRange, va_t *tileIndex, opts_t *opts)
+{
+ va_t *bclReadArray;
+ int filtered;
+ int max_cluster = 0;
+ int nRecords = 0;
+
+ if (opts->verbose) fprintf(stderr,"Processing Tile %d\n", tile);
+ posfile_t *posfile = openPositionFile(tile, tileIndex, opts);
+ if (posfile->errmsg) {
+ fprintf(stderr,"Can't find position file for Tile %d\n%s\n", tile, posfile->errmsg);
+ return 1;
+ }
+
+ filter_t *filter = openFilterFile(tile,tileIndex,opts);
+ if (filter->errmsg) {
+ fprintf(stderr,"Can't find filter file for tile %d\n%s\n", tile, filter->errmsg);
+ return 1;
+ }
+
+ if (tileIndex) max_cluster = findClusters(tile, tileIndex);
+
+ bclReadArray = openBclFiles(cycleRange, opts, tile, tileIndex);
+ char *id = getId(opts);
+
+ bool ispaired = readArrayContains(bclReadArray, "read2");
+ bool isindexed = readArrayContains(bclReadArray, "readIndex");
+ bool isdual = readArrayContains(bclReadArray, "readIndex2");
+
+ // TODO: is this right? Should we abort, or give a warning here?
+ if (!opts->barcode_tag2 || !opts->quality_tag2) isdual = false;
+
+ //
+ // write all the records
+ //
+ while ( (filtered = filter_next(filter)) >= 0) {
+ if (tileIndex && filter->current_cluster > max_cluster) break;
+ filtered = !filtered; // don't ask
+ posfile_next(posfile);
+ char *readName = getReadName(id, opts->lane, tile, posfile->x, posfile->y);
+ char *bases=NULL, *qualities=NULL, *bases2=NULL, *qualities2=NULL;
+ char *bases_index=NULL, *qualities_index=NULL, *bases_index2=NULL, *qualities_index2=NULL;
+
+ getBases(bclReadArray, "read1", &bases, &qualities, false);
+ if (ispaired) getBases(bclReadArray, "read2", &bases2, &qualities2, false);
+ if (isindexed) getBases(bclReadArray, "readIndex", &bases_index, &qualities_index, true);
+ if (isdual) getBases(bclReadArray, "readIndex2", &bases_index2, &qualities_index2, true);
+
+ // Which reads do we attach the indexes to?
+ char *r1_bi=NULL, *r1_qi=NULL, *r1_bi2=NULL, *r1_qi2 = NULL;
+ char *r2_bi=NULL, *r2_qi=NULL, *r2_bi2=NULL, *r2_qi2 = NULL;
+ if (opts->bc_read == 1) { r1_bi = bases_index; r1_qi = qualities_index; }
+ else { r2_bi = bases_index; r2_qi = qualities_index; }
+
+ if (opts->sec_bc_read == 1) { r1_bi2 = bases_index2; r1_qi2 = qualities_index2; }
+ else { r2_bi2 = bases_index2; r2_qi2 = qualities_index2; }
+
+ if (opts->no_filter || !filtered) {
+ int flags;
+ flags = setFlag(false,filtered,ispaired);
+ writeRecord(flags, opts, readName, bases, qualities, r1_bi, r1_qi, r1_bi2, r1_qi2, output_file, output_header);
+ if (ispaired) {
+ flags = setFlag(true,filtered,ispaired);
+ writeRecord(flags, opts, readName, bases2, qualities2, r2_bi, r2_qi, r2_bi2, r2_qi2, output_file, output_header);
+ }
+ nRecords++;
+ }
+
+ free(bases); free(qualities);
+ free(bases2); free(qualities2);
+ free(bases_index); free(qualities_index);
+ free(bases_index2); free(qualities_index2);
+ free(readName);
+ }
+
+ free(id);
+ va_free(bclReadArray);
+ filter_close(filter);
+ posfile_close(posfile);
+
+ if (opts->verbose) fprintf(stderr,"%d records written\n", nRecords);
+
+ return 0;
+}
+
+/*
+ * process all the tiles and write all the BAM records
+ */
+void createBAM(samFile *output_file, bam_hdr_t *output_header, opts_t *opts)
+{
+ ia_t *tiles = getTileList(opts);
+ va_t *cycleRange = getCycleRange(opts);;
+ va_t *tileIndex = getTileIndex(opts);
+
+ int n;
+
+ for (n=0; n < cycleRange->end; n++) {
+ cycleRangeEntry_t *cr = (cycleRangeEntry_t *)cycleRange->entries[n];
+ if (opts->verbose) fprintf(stderr,"CycleRange: %s\t%d\t%d\n", cr->readname, cr->first, cr->last);
+ }
+
+ if (tiles->end == 0) fprintf(stderr, "There are no tiles to process\n");
+
+ for (n=0; n < tiles->end; n++) {
+ if (processTile(tiles->entries[n], output_file, output_header, cycleRange, tileIndex, opts)) {
+ fprintf(stderr,"Error processing tile %d\n", tiles->entries[n]);
+ break;
+ }
+ }
+
+ va_free(cycleRange);
+ ia_free(tiles);
+}
+
+/*
+ * Main code
+ */
+static int i2b(opts_t* opts)
+{
+ int retcode = 1;
+ samFile *output_file = NULL;
+ bam_hdr_t *output_header = NULL;
+ htsFormat *out_fmt = NULL;
+ char mode[] = "wbC";
+
+ while (1) {
+
+ /*
+ * Open output file and header
+ */
+ if (opts->output_fmt) {
+ out_fmt = calloc(1,sizeof(htsFormat));
+ if (hts_parse_format(out_fmt, opts->output_fmt) < 0) {
+ fprintf(stderr,"Unknown output format: %s\n", opts->output_fmt);
+ break;
+ }
+ }
+ mode[2] = opts->compression_level ? opts->compression_level : '\0';
+ output_file = hts_open_format(opts->output_file, mode, out_fmt);
+ free(out_fmt);
+ if (!output_file) {
+ fprintf(stderr, "Could not open output file (%s)\n", opts->output_file);
+ break;
+ }
+
+ output_header = bam_hdr_init();
+ output_header->text = calloc(1,1); output_header->l_text=0;
+
+ if (!output_header) {
+ fprintf(stderr, "Failed to initialise output header\n");
+ break;
+ }
+
+ addHeader(output_file, output_header, opts);
+ createBAM(output_file, output_header, opts);
+
+ retcode = 0;
+ break;
+ }
+
+ // tidy up after us
+ if (output_header) bam_hdr_destroy(output_header);
+ if (output_file) sam_close(output_file);
+
+ return retcode;
+}
+
+/*
+ * called from bambi to perform Illumina to BAM conversion
+ *
+ * Parse the command line arguments, then call the main i2b function
+ *
+ * returns 0 on success, 1 if there was a problem
+ */
+int main_i2b(int argc, char *argv[])
+{
+ int ret = 1;
+ opts_t* opts = i2b_parse_args(argc, argv);
+ if (opts) ret = i2b(opts);
+ free_opts(opts);
+ return ret;
+}
diff --git a/src/posfile.c b/src/posfile.c
new file mode 100644
index 0000000..a290af2
--- /dev/null
+++ b/src/posfile.c
@@ -0,0 +1,166 @@
+/* posfile.c
+
+ Functions to read and parse an Illumina pos, locs, or clocs file.
+
+ Copyright (C) 2016 Genome Research Ltd.
+
+ Author: Jennifer Liddle
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU Affero General Public License as published
+by the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU Affero General Public License for more details.
+
+You should have received a copy of the GNU Affero General Public License
+along with this program. If not, see .
+*/
+
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+
+#include "posfile.h"
+
+posfile_t *posfile_open(char *fname)
+{
+ posfile_t *posfile = calloc(1, sizeof(posfile_t));
+ posfile->current_block = 0;
+ posfile->errmsg = NULL;
+ posfile->file_type = UNKNOWN_POS;
+
+ // Should we handle compressed (.gz) files?
+
+ char *base = basename(fname);
+ char *ext = rindex(base,'.');
+ if (ext) ext++;
+ if (ext) {
+ if (strcmp(ext,"clocs")==0) posfile->file_type = CLOCS;
+ if (strcmp(ext,"locs")==0) posfile->file_type = LOCS;
+ }
+ if (posfile->file_type == UNKNOWN_POS) {
+ posfile->errmsg = strdup("posfile_open(): Unknown file type\n");
+ return posfile;
+ }
+ posfile->fhandle = open(fname,O_RDONLY);
+
+ if (posfile->fhandle == -1) {
+ posfile->errmsg = strdup(strerror(errno));
+ return posfile;
+ }
+
+ if (posfile->file_type == CLOCS) {
+ int n;
+ n = read(posfile->fhandle,(void *)&posfile->version,1);
+ n = read(posfile->fhandle,(void *)&posfile->total_blocks,4);
+ n = read(posfile->fhandle,(void *)&posfile->unread_clusters,1);
+ if (n<0) {
+ fprintf(stderr,"failed to read header from %s\n", fname);
+ exit(1);
+ }
+ posfile->current_block++;
+ }
+
+ if (posfile->file_type == LOCS) {
+ int n;
+ // first 8 bytes are unused
+ n = read(posfile->fhandle,(void *)&posfile->total_blocks,4);
+ n = read(posfile->fhandle,(void *)&posfile->total_blocks,4);
+ n = read(posfile->fhandle,(void *)&posfile->total_blocks,4);
+ if (n<0) {
+ fprintf(stderr,"failed to read header from %s\n", fname);
+ exit(1);
+ }
+ }
+
+ return posfile;
+}
+
+/*
+ * seek to a given cluster number
+ */
+void posfile_seek(posfile_t *posfile, int cluster)
+{
+ off_t pos = 12 + cluster * 8;
+ if (posfile->file_type != LOCS) {
+ fprintf(stderr,"Can only handle NextSeq pos files of type LOC\n");
+ exit(1);
+ }
+
+ off_t r = lseek(posfile->fhandle, pos, SEEK_SET);
+ if (r != pos) {
+ fprintf(stderr,"Trying to seek to %d (cluster %d) but returned %d\n", (int)pos, cluster, (int)r);
+ perror("posfile_seek() failed");
+ }
+}
+
+void posfile_close(posfile_t *posfile)
+{
+ free(posfile->errmsg);
+ if (posfile->fhandle >= 0) close(posfile->fhandle);
+ free(posfile);
+}
+
+static int locs_next(posfile_t *posfile)
+{
+ float dx, dy;
+
+ if (posfile->current_block >= posfile->total_blocks) return -1;
+ posfile->current_block++;
+
+ int n;
+ n = read(posfile->fhandle, (void *)&dx, 4);
+ n = read(posfile->fhandle, (void *)&dy, 4);
+ if (n<0) {
+ fprintf(stderr,"something has gone wrong in locs_next()\n");
+ exit(1);
+ }
+
+ posfile->x = 10 * dx + 1000.5;
+ posfile->y = 10 * dy + 1000.5;
+
+ return 0;
+}
+
+static int clocs_next(posfile_t *posfile)
+{
+ unsigned char dx, dy;
+
+ while (posfile->unread_clusters == 0 && (posfile->current_block < posfile->total_blocks)) {
+ if (read(posfile->fhandle, (void *)&posfile->unread_clusters, 1) != 1) return -1;
+ posfile->current_block++;
+ }
+
+ if (posfile->unread_clusters == 0) return -1;
+ posfile->unread_clusters--;
+
+ int n;
+ n = read(posfile->fhandle, (void *)&dx, 1);
+ n = read(posfile->fhandle, (void *)&dy, 1);
+ if (n<0) {
+ fprintf(stderr,"something has gone wrong in clocs_next()\n");
+ exit(1);
+ }
+
+ posfile->x = 10 * CLOCS_BLOCK_SIZE * ((posfile->current_block - 1) % CLOCS_BLOCKS_PER_LINE) + dx + 1000;
+ posfile->y = 10 * CLOCS_BLOCK_SIZE * ((posfile->current_block - 1) / CLOCS_BLOCKS_PER_LINE) + dy + 1000;
+ return 0;
+}
+
+int posfile_next(posfile_t *posfile)
+{
+ if (posfile->file_type == CLOCS) return clocs_next(posfile);
+ if (posfile->file_type == LOCS) return locs_next(posfile);
+ return -1;
+}
+
diff --git a/src/posfile.h b/src/posfile.h
new file mode 100644
index 0000000..186b653
--- /dev/null
+++ b/src/posfile.h
@@ -0,0 +1,52 @@
+/* posfile.h
+
+ Copyright (C) 2016 Genome Research Ltd.
+
+ Author: Jennifer Liddle
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU Affero General Public License as published
+by the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU Affero General Public License for more details.
+
+You should have received a copy of the GNU Affero General Public License
+along with this program. If not, see .
+*/
+
+#ifndef __POSFILE_H__
+#define __POSFILE_H__
+
+#include
+
+#define CLOCS_BLOCK_SIZE 25
+#define CLOCS_IMAGE_WIDTH 2048
+#define CLOCS_BLOCKS_PER_LINE ((CLOCS_IMAGE_WIDTH + CLOCS_BLOCK_SIZE - 1) / CLOCS_BLOCK_SIZE)
+
+typedef enum { UNKNOWN_POS, POS, LOCS, CLOCS } POS_FILE_TYPE;
+
+typedef struct {
+ POS_FILE_TYPE file_type;
+ int fhandle;
+ char *errmsg;
+ uint8_t version;
+ uint32_t total_blocks;
+ int current_block;
+ uint8_t unread_clusters;
+ int x,y;
+} posfile_t;
+
+posfile_t *posfile_open(char *fname);
+int posfile_next(posfile_t *posfile);
+void posfile_close(posfile_t *posfile);
+void posfile_seek(posfile_t *posfile, int cluster);
+
+static inline int posfile_get_x(posfile_t *posfile) { return posfile->x; }
+static inline int posfile_get_y(posfile_t *posfile) { return posfile->y; }
+
+#endif
+
diff --git a/test/bclfile/Makefile.am b/test/bclfile/Makefile.am
new file mode 100644
index 0000000..03eade2
--- /dev/null
+++ b/test/bclfile/Makefile.am
@@ -0,0 +1,4 @@
+bin_PROGRAMS = t_bclfile
+t_bclfile_SOURCES = t_bclfile.c
+t_bclfile_CFLAGS = -DDATA_DIR=$(abs_srcdir)
+t_bclfile_LDADD = -lz -ldl -lxml2 -lpthread
diff --git a/test/bclfile/t_bclfile.c b/test/bclfile/t_bclfile.c
new file mode 100644
index 0000000..ad2c562
--- /dev/null
+++ b/test/bclfile/t_bclfile.c
@@ -0,0 +1,131 @@
+/* test/i2b/bclfile.c -- bclfile test cases.
+
+ Copyright (C) 2016 Genome Research Ltd.
+
+ Author: Jennifer Liddle
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU Affero General Public License as published
+by the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU Affero General Public License for more details.
+
+You should have received a copy of the GNU Affero General Public License
+along with this program. If not, see .
+
+*/
+
+#include "../../src/bclfile.c"
+#include
+#include
+#include
+#include
+
+#define xMKNAME(d,f) #d f
+#define MKNAME(d,f) xMKNAME(d,f)
+
+int verbose = 0;
+
+int success = 0;
+int failure = 0;
+
+void checkLike(char *name, char *expected, char *actual)
+{
+ if (actual == NULL) actual = "";
+ if (strstr(actual, expected) == NULL) {
+ fprintf(stderr, "%s: Expected: %s \tGot: %s\n", name, expected, actual);
+ failure++;
+ }
+}
+
+void checkEqual(char *name, char *expected, char *actual)
+{
+ if (actual == NULL) actual = "";
+ if (strcmp(expected, actual)) {
+ fprintf(stderr, "%s: Expected: %s \tGot: %s\n", name, expected, actual);
+ failure++;
+ }
+}
+
+void ccheckEqual(char *name, char expected, char actual)
+{
+ if (expected != actual) {
+ fprintf(stderr, "%s: Expected: '%c' \tGot: '%c'\n", name, expected, actual);
+ failure++;
+ }
+}
+
+void icheckEqual(char *name, int expected, int actual)
+{
+ if (expected != actual) {
+ fprintf(stderr, "%s: Expected: %d \tGot: %d\n", name, expected, actual);
+ failure++;
+ }
+}
+
+int main(int argc, char**argv)
+{
+ int n;
+
+ bclfile_t *bclfile;
+
+ // BCL tests
+
+ bclfile = bclfile_open(MKNAME(DATA_DIR,"/../i2b/110323_HS13_06000_B_B039WABXX/Data/Intensities/BaseCalls/L001/C1.1/s_1_1101.bcl"));
+ if (bclfile->errmsg) {
+ fprintf(stderr,"Error opening file: %s\n", bclfile->errmsg);
+ failure++;
+ }
+ icheckEqual("Total clusters", 2609912, bclfile->total_clusters);
+ icheckEqual("Current cluster", 0, bclfile->current_cluster);
+
+ bclfile_next(bclfile);
+ ccheckEqual("Base", 'N', bclfile->base);
+ icheckEqual("Quality", 0, bclfile->quality);
+ icheckEqual("current cluster", 1, bclfile->current_cluster);
+
+ for (n=0; n<306; n++) {
+ bclfile_next(bclfile);
+ }
+ ccheckEqual("307 Base", 'A', bclfile->base);
+ icheckEqual("307 Quality", 30, bclfile->quality);
+ icheckEqual("307 current cluster", 307, bclfile->current_cluster);
+ icheckEqual("307 Total clusters", 2609912, bclfile->total_clusters);
+
+ while (bclfile_next(bclfile) == 0);
+ ccheckEqual("last Base", 'G', bclfile->base);
+ icheckEqual("last Quality", 20, bclfile->quality);
+ icheckEqual("last current cluster", 2609912, bclfile->current_cluster);
+ icheckEqual("last Total clusters", 2609912, bclfile->total_clusters);
+
+ bclfile_close(bclfile);
+
+ // SCL tests
+
+ bclfile = bclfile_open(MKNAME(DATA_DIR,"/../i2b/110323_HS13_06000_B_B039WABXX/Data/Intensities/BaseCalls/L001/C1.1/s_1_1101.scl"));
+ if (bclfile->errmsg) {
+ fprintf(stderr,"Error opening file: %s\n", bclfile->errmsg);
+ failure++;
+ }
+ icheckEqual("SCL File Type", SCL, bclfile->file_type);
+ icheckEqual("SCL Total clusters", 2609912, bclfile->total_clusters);
+ icheckEqual("SCL Current cluster", 0, bclfile->current_cluster);
+
+ bclfile_next(bclfile);
+ ccheckEqual("SCL First Base", 'A', bclfile->base);
+
+ for (n=0; n<306; n++) {
+ bclfile_next(bclfile);
+ }
+ ccheckEqual("SCL 307 Base", 'T', bclfile->base);
+
+ while (bclfile_next(bclfile) == 0);
+ ccheckEqual("SCL Last Base", 'C', bclfile->base);
+
+ printf("bclfile tests: %s\n", failure ? "FAILED" : "Passed");
+ return failure ? EXIT_FAILURE : EXIT_SUCCESS;
+}
diff --git a/test/decode/Makefile.am b/test/decode/Makefile.am
new file mode 100644
index 0000000..a3abf99
--- /dev/null
+++ b/test/decode/Makefile.am
@@ -0,0 +1,7 @@
+AM_CPPFLAGS = $(HTSLIB_CPPFLAGS)
+AM_LDFLAGS = $(HTSLIB_LDFLAGS)
+
+bin_PROGRAMS = t_decode
+t_decode_SOURCES = t_decode.c
+t_decode_CFLAGS = -I$(top_srcdir)/src -DDATA_DIR=$(abs_srcdir)
+t_decode_LDADD = $(HTSLIB_HOME)/lib/libhts.a -ldl -lxml2 -lz -llzma -lbz2 -lpthread
diff --git a/test/decode/decode.c b/test/decode/t_decode.c
similarity index 84%
rename from test/decode/decode.c
rename to test/decode/t_decode.c
index 8a8f024..25e9449 100644
--- a/test/decode/decode.c
+++ b/test/decode/t_decode.c
@@ -18,13 +18,15 @@ You should have received a copy of the GNU Affero General Public License
along with this program. If not, see .
*/
-#include
+#include "../../src/hts_addendum.c"
+#include "../../src/decode.c"
-#include "bambi.h"
-#include "../../decode.c"
#include
#include
-#include "version.h"
+#include
+
+#define xMKNAME(d,f) #d f
+#define MKNAME(d,f) xMKNAME(d,f)
const char * bambi_version(void)
{
@@ -41,17 +43,17 @@ void setup_test_1(int* argc, char*** argv)
(*argv)[0] = strdup("bambi");
(*argv)[1] = strdup("decode");
(*argv)[2] = strdup("-i");
- (*argv)[3] = strdup("test/decode/6383_9.sam");
+ (*argv)[3] = strdup(MKNAME(DATA_DIR,"/6383_9.sam"));
(*argv)[4] = strdup("-o");
- (*argv)[5] = strdup("test/decode/out/xxx.sam");
+ (*argv)[5] = strdup(MKNAME(DATA_DIR,"/out/xxx.sam"));
(*argv)[6] = strdup("--output-fmt");
(*argv)[7] = strdup("sam");
(*argv)[8] = strdup("--input-fmt");
(*argv)[9] = strdup("sam");
(*argv)[10] = strdup("--barcode-file");
- (*argv)[11] = strdup("test/decode/6383_8.tag");
+ (*argv)[11] = strdup(MKNAME(DATA_DIR,"/6383_8.tag"));
(*argv)[12] = strdup("--metrics-file");
- (*argv)[13] = strdup("test/decode/out/6383_9.metrics");
+ (*argv)[13] = strdup(MKNAME(DATA_DIR,"/out/6383_9.metrics"));
(*argv)[14] = strdup("--barcode-tag-name");
(*argv)[15] = strdup("RT");
}
@@ -63,19 +65,19 @@ void setup_test_2(int* argc, char*** argv)
(*argv)[0] = strdup("bambi");
(*argv)[1] = strdup("decode");
(*argv)[2] = strdup("-i");
- (*argv)[3] = strdup("test/decode/6383_8.sam");
+ (*argv)[3] = strdup(MKNAME(DATA_DIR,"/6383_8.sam"));
(*argv)[4] = strdup("-o");
- (*argv)[5] = strdup("test/decode/out/xxx.sam");
+ (*argv)[5] = strdup(MKNAME(DATA_DIR,"/out/xxx.sam"));
(*argv)[6] = strdup("--output-fmt");
(*argv)[7] = strdup("sam");
(*argv)[8] = strdup("--input-fmt");
(*argv)[9] = strdup("sam");
(*argv)[10] = strdup("--barcode-file");
- (*argv)[11] = strdup("test/decode/6383_8.tag");
+ (*argv)[11] = strdup(MKNAME(DATA_DIR,"/6383_8.tag"));
(*argv)[12] = strdup("--convert-low-quality");
(*argv)[13] = strdup("--change-read-name");
(*argv)[14] = strdup("--metrics-file");
- (*argv)[15] = strdup("test/decode/out/6383_8.metrics");
+ (*argv)[15] = strdup(MKNAME(DATA_DIR,"/out/6383_8.metrics"));
(*argv)[16] = strdup("--barcode-tag-name");
(*argv)[17] = strdup("RT");
}
@@ -157,7 +159,7 @@ int main(int argc, char**argv)
setup_test_1(&argc_1, &argv_1);
main_decode(argc_1-1, argv_1+1);
- int result = system("diff test/decode/out/xxx.sam test/decode/out/6383_9_nosplit_nochange.sam");
+ int result = system("diff -I ID:bambi " MKNAME(DATA_DIR,"/out/xxx.sam") " " MKNAME(DATA_DIR,"/out/6383_9_nosplit_nochange.sam"));
if (result) {
fprintf(stderr, "test 1 failed\n");
failure++;
@@ -171,7 +173,7 @@ int main(int argc, char**argv)
setup_test_2(&argc_2, &argv_2);
main_decode(argc_2-1, argv_2+1);
- result = system("diff test/decode/out/xxx.sam test/decode/out/6383_8_nosplitN.sam");
+ result = system("diff -I ID:bambi " MKNAME(DATA_DIR,"/out/xxx.sam") " " MKNAME(DATA_DIR,"/out/6383_8_nosplitN.sam"));
if (result) {
fprintf(stderr, "test 2 failed\n");
failure++;
diff --git a/test/filterfile/Makefile.am b/test/filterfile/Makefile.am
new file mode 100644
index 0000000..0ee3385
--- /dev/null
+++ b/test/filterfile/Makefile.am
@@ -0,0 +1,4 @@
+bin_PROGRAMS = t_filterfile
+t_filterfile_SOURCES = t_filterfile.c
+t_filterfile_CFLAGS = -DDATA_DIR=$(abs_srcdir)
+AM_COLOR_TESTS=always
diff --git a/test/filterfile/t_filterfile.c b/test/filterfile/t_filterfile.c
new file mode 100644
index 0000000..1866994
--- /dev/null
+++ b/test/filterfile/t_filterfile.c
@@ -0,0 +1,97 @@
+/* test/i2b/filterfile.c -- filterfile test cases.
+
+ Copyright (C) 2016 Genome Research Ltd.
+
+ Author: Jennifer Liddle
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU Affero General Public License as published
+by the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU Affero General Public License for more details.
+
+You should have received a copy of the GNU Affero General Public License
+along with this program. If not, see .
+
+*/
+
+#include "../../src/filterfile.c"
+#include
+#include
+#include
+#include
+
+#define xMKNAME(d,f) #d f
+#define MKNAME(d,f) xMKNAME(d,f)
+
+int verbose = 0;
+
+int success = 0;
+int failure = 0;
+
+void checkLike(char *name, char *expected, char *actual)
+{
+ if (actual == NULL) actual = "";
+ if (strstr(actual, expected) == NULL) {
+ fprintf(stderr, "%s\n" "Expected: %s\n" "Got: %s\n", name, expected, actual);
+ failure++;
+ }
+}
+
+void checkEqual(char *name, char *expected, char *actual)
+{
+ if (actual == NULL) actual = "";
+ if (strcmp(expected, actual)) {
+ fprintf(stderr, "%s\n" "Expected: %s\n" "Got: %s\n", name, expected, actual);
+ failure++;
+ }
+}
+
+void icheckEqual(char *name, int expected, int actual)
+{
+ if (expected != actual) {
+ fprintf(stderr, "%s\n" "Expected: %d\n" "Got: %d\n", name, expected, actual);
+ failure++;
+ }
+}
+
+int main(int argc, char**argv)
+{
+ int n, f;
+
+ filter_t *filter;
+
+ filter = filter_open(MKNAME(DATA_DIR,"/../i2b/110323_HS13_06000_B_B039WABXX/Data/Intensities/BaseCalls/L001/s_1_1101.filter"));
+ if (filter->errmsg) {
+ fprintf(stderr,"Error opening file '%s': %s\n", MKNAME(DATA_DIR,"/../i2b/110323_HS13_06000_B_B039WABXX/Data/Intensities/BaseCalls/L001/s_1_1101.filter"), filter->errmsg);
+ failure++;
+ }
+ icheckEqual("Version", 3, filter->version);
+ icheckEqual("Total clusters", 2609912, filter->total_clusters);
+ icheckEqual("Current cluster", 0, filter->current_cluster);
+
+ f = filter_next(filter);
+ icheckEqual("Next Current cluster", 1, filter->current_cluster);
+ icheckEqual("Next Current PF clusters", 0, filter->current_pf_cluster);
+ icheckEqual("First entry", 0, f);
+
+ for (n=0; n<318; n++) {
+ f = filter_next(filter);
+ }
+ icheckEqual("319 entry", 1, f);
+ icheckEqual("319 Current cluster", 319, filter->current_cluster);
+ icheckEqual("319 Current PF clusters", 264, filter->current_pf_cluster);
+ icheckEqual("319 Total clusters", 2609912, filter->total_clusters);
+
+ while (filter_next(filter) != -1);
+ icheckEqual("Last Current cluster", 2609912, filter->current_cluster);
+ icheckEqual("Last Current PF clusters", 2425954, filter->current_pf_cluster);
+ icheckEqual("Last Total clusters", 2609912, filter->total_clusters);
+
+ printf("filter tests: %s\n", failure ? "FAILED" : "Passed");
+ return failure ? EXIT_FAILURE : EXIT_SUCCESS;
+}
diff --git a/test/i2b/110323_HS13_06000_B_B039WABXX/Data/Intensities/BaseCalls/L001/C1.1/s_1_1101.bcl.gz b/test/i2b/110323_HS13_06000_B_B039WABXX/Data/Intensities/BaseCalls/L001/C1.1/s_1_1101.bcl.gz
new file mode 100644
index 0000000..2dd4f3e
Binary files /dev/null and b/test/i2b/110323_HS13_06000_B_B039WABXX/Data/Intensities/BaseCalls/L001/C1.1/s_1_1101.bcl.gz differ
diff --git a/test/i2b/110323_HS13_06000_B_B039WABXX/Data/Intensities/BaseCalls/L001/C1.1/s_1_1101.scl b/test/i2b/110323_HS13_06000_B_B039WABXX/Data/Intensities/BaseCalls/L001/C1.1/s_1_1101.scl
new file mode 100644
index 0000000..6241205
Binary files /dev/null and b/test/i2b/110323_HS13_06000_B_B039WABXX/Data/Intensities/BaseCalls/L001/C1.1/s_1_1101.scl differ
diff --git a/test/i2b/110323_HS13_06000_B_B039WABXX/Data/Intensities/BaseCalls/L001/C1.1/s_1_1101_uncompressed.bcl b/test/i2b/110323_HS13_06000_B_B039WABXX/Data/Intensities/BaseCalls/L001/C1.1/s_1_1101_uncompressed.bcl
new file mode 100644
index 0000000..941c13d
Binary files /dev/null and b/test/i2b/110323_HS13_06000_B_B039WABXX/Data/Intensities/BaseCalls/L001/C1.1/s_1_1101_uncompressed.bcl differ
diff --git a/test/i2b/110323_HS13_06000_B_B039WABXX/Data/Intensities/BaseCalls/L001/C2.1/s_1_1101.bcl b/test/i2b/110323_HS13_06000_B_B039WABXX/Data/Intensities/BaseCalls/L001/C2.1/s_1_1101.bcl
new file mode 100644
index 0000000..579b89c
Binary files /dev/null and b/test/i2b/110323_HS13_06000_B_B039WABXX/Data/Intensities/BaseCalls/L001/C2.1/s_1_1101.bcl differ
diff --git a/test/i2b/110323_HS13_06000_B_B039WABXX/Data/Intensities/BaseCalls/L001/C2.1/s_1_1101.scl b/test/i2b/110323_HS13_06000_B_B039WABXX/Data/Intensities/BaseCalls/L001/C2.1/s_1_1101.scl
new file mode 100644
index 0000000..bea5a2c
Binary files /dev/null and b/test/i2b/110323_HS13_06000_B_B039WABXX/Data/Intensities/BaseCalls/L001/C2.1/s_1_1101.scl differ
diff --git a/test/i2b/110323_HS13_06000_B_B039WABXX/Data/Intensities/BaseCalls/L001/C50.1/s_1_1101.bcl b/test/i2b/110323_HS13_06000_B_B039WABXX/Data/Intensities/BaseCalls/L001/C50.1/s_1_1101.bcl
new file mode 100644
index 0000000..db0dc48
Binary files /dev/null and b/test/i2b/110323_HS13_06000_B_B039WABXX/Data/Intensities/BaseCalls/L001/C50.1/s_1_1101.bcl differ
diff --git a/test/i2b/110323_HS13_06000_B_B039WABXX/Data/Intensities/BaseCalls/L001/C50.1/s_1_1101.scl b/test/i2b/110323_HS13_06000_B_B039WABXX/Data/Intensities/BaseCalls/L001/C50.1/s_1_1101.scl
new file mode 100644
index 0000000..d53333f
Binary files /dev/null and b/test/i2b/110323_HS13_06000_B_B039WABXX/Data/Intensities/BaseCalls/L001/C50.1/s_1_1101.scl differ
diff --git a/test/i2b/110323_HS13_06000_B_B039WABXX/Data/Intensities/BaseCalls/L001/C51.1/s_1_1101.bcl b/test/i2b/110323_HS13_06000_B_B039WABXX/Data/Intensities/BaseCalls/L001/C51.1/s_1_1101.bcl
new file mode 100644
index 0000000..85ea508
Binary files /dev/null and b/test/i2b/110323_HS13_06000_B_B039WABXX/Data/Intensities/BaseCalls/L001/C51.1/s_1_1101.bcl differ
diff --git a/test/i2b/110323_HS13_06000_B_B039WABXX/Data/Intensities/BaseCalls/L001/C51.1/s_1_1101.scl b/test/i2b/110323_HS13_06000_B_B039WABXX/Data/Intensities/BaseCalls/L001/C51.1/s_1_1101.scl
new file mode 100644
index 0000000..9120a81
Binary files /dev/null and b/test/i2b/110323_HS13_06000_B_B039WABXX/Data/Intensities/BaseCalls/L001/C51.1/s_1_1101.scl differ
diff --git a/test/i2b/110323_HS13_06000_B_B039WABXX/Data/Intensities/BaseCalls/L001/C52.1/s_1_1101.bcl b/test/i2b/110323_HS13_06000_B_B039WABXX/Data/Intensities/BaseCalls/L001/C52.1/s_1_1101.bcl
new file mode 100644
index 0000000..b859fb7
Binary files /dev/null and b/test/i2b/110323_HS13_06000_B_B039WABXX/Data/Intensities/BaseCalls/L001/C52.1/s_1_1101.bcl differ
diff --git a/test/i2b/110323_HS13_06000_B_B039WABXX/Data/Intensities/BaseCalls/L001/C52.1/s_1_1101.scl b/test/i2b/110323_HS13_06000_B_B039WABXX/Data/Intensities/BaseCalls/L001/C52.1/s_1_1101.scl
new file mode 100644
index 0000000..3b51d8e
Binary files /dev/null and b/test/i2b/110323_HS13_06000_B_B039WABXX/Data/Intensities/BaseCalls/L001/C52.1/s_1_1101.scl differ
diff --git a/test/i2b/110323_HS13_06000_B_B039WABXX/Data/Intensities/BaseCalls/L001/C53.1/s_1_1101.bcl b/test/i2b/110323_HS13_06000_B_B039WABXX/Data/Intensities/BaseCalls/L001/C53.1/s_1_1101.bcl
new file mode 100644
index 0000000..b859fb7
Binary files /dev/null and b/test/i2b/110323_HS13_06000_B_B039WABXX/Data/Intensities/BaseCalls/L001/C53.1/s_1_1101.bcl differ
diff --git a/test/i2b/110323_HS13_06000_B_B039WABXX/Data/Intensities/BaseCalls/L001/C53.1/s_1_1101.scl b/test/i2b/110323_HS13_06000_B_B039WABXX/Data/Intensities/BaseCalls/L001/C53.1/s_1_1101.scl
new file mode 100644
index 0000000..3b51d8e
Binary files /dev/null and b/test/i2b/110323_HS13_06000_B_B039WABXX/Data/Intensities/BaseCalls/L001/C53.1/s_1_1101.scl differ
diff --git a/test/i2b/110323_HS13_06000_B_B039WABXX/Data/Intensities/BaseCalls/L001/s_1_1101.filter b/test/i2b/110323_HS13_06000_B_B039WABXX/Data/Intensities/BaseCalls/L001/s_1_1101.filter
new file mode 100644
index 0000000..aa1016d
Binary files /dev/null and b/test/i2b/110323_HS13_06000_B_B039WABXX/Data/Intensities/BaseCalls/L001/s_1_1101.filter differ
diff --git a/test/i2b/110323_HS13_06000_B_B039WABXX/Data/Intensities/BaseCalls/config.xml b/test/i2b/110323_HS13_06000_B_B039WABXX/Data/Intensities/BaseCalls/config.xml
new file mode 100644
index 0000000..398ee90
--- /dev/null
+++ b/test/i2b/110323_HS13_06000_B_B039WABXX/Data/Intensities/BaseCalls/config.xml
@@ -0,0 +1,373 @@
+
+
+
+
+ 0.6
+
+ 2
+ 0
+ 1
+ 0
+ 1
+ 50
+ 1
+
+
+ 2
+ 0
+ 51
+ 0
+ 51
+ 100
+ 2
+
+
+ 2
+ 0
+ 2
+ 1
+ 1
+ 50
+ 1
+ 0
+ 0
+
+
+ 2
+ 0
+ 52
+ 1
+ 51
+ 100
+ 2
+ 0
+ 0
+
+ 0
+ failed-chastity
+ le
+ 1.0
+
+
+
+
+ 0
+ 0
+ 0
+ 0
+ 0
+
+ 1
+ 50
+
+
+ 51
+ 100
+ 110323_HS13_06000_B_B039WABXX
+
+ HS13
+ 0
+ 0
+ 0
+ 0
+
+ 1
+ 2
+
+
+ 51
+ 52
+ 110323_HS13_06000_B_B039WABXX
+
+ 110323_HS13_06000_B_B039WABXX
+ 110323
+ 6000
+ PL14
+
+
+
+
+ s
+ 1102
+ 1103
+ 1101
+ 1104
+ 1106
+ 1105
+ 1107
+ 1108
+ 1201
+ 1202
+ 1204
+ 1203
+ 1206
+ 1205
+ 1208
+ 1207
+ 2101
+ 2102
+ 2104
+ 2103
+ 2105
+ 2106
+ 2108
+ 2107
+ 2201
+ 2202
+ 2203
+ 2204
+ 2206
+ 2205
+ 2207
+ 2208
+
+
+ s
+ 1101
+ 1102
+ 1104
+ 1103
+ 1105
+ 1106
+ 1107
+ 1108
+ 1201
+ 1202
+ 1203
+ 1204
+ 1206
+ 1205
+ 1207
+ 1208
+ 2102
+ 2101
+ 2103
+ 2104
+ 2105
+ 2106
+ 2107
+ 2108
+ 2201
+ 2202
+ 2205
+ 2203
+ 2206
+ 2204
+ 2207
+ 2208
+
+
+ s
+ 1101
+ 1102
+ 1103
+ 1105
+ 1106
+ 1104
+ 1107
+ 1201
+ 1202
+ 1108
+ 1205
+ 1203
+ 1206
+ 1204
+ 2101
+ 1207
+ 2102
+ 1208
+ 2105
+ 2106
+ 2103
+ 2104
+ 2201
+ 2202
+ 2107
+ 2108
+ 2205
+ 2206
+ 2203
+ 2204
+ 2207
+ 2208
+
+
+ s
+ 1101
+ 1102
+ 1105
+ 1106
+ 1103
+ 1201
+ 1104
+ 1202
+ 1107
+ 1205
+ 1108
+ 1206
+ 1203
+ 2101
+ 2102
+ 1204
+ 1207
+ 2105
+ 2106
+ 1208
+ 2103
+ 2201
+ 2202
+ 2107
+ 2205
+ 2104
+ 2206
+ 2203
+ 2108
+ 2207
+ 2204
+ 2208
+
+
+ s
+ 1101
+ 1105
+ 1102
+ 1201
+ 1106
+ 1103
+ 1205
+ 1202
+ 1107
+ 1104
+ 1206
+ 2101
+ 1203
+ 1108
+ 2102
+ 2105
+ 1207
+ 2106
+ 1204
+ 2201
+ 2103
+ 2202
+ 2205
+ 1208
+ 2107
+ 2206
+ 2104
+ 2203
+ 2108
+ 2207
+ 2204
+ 2208
+
+
+ s
+ 1101
+ 1102
+ 1105
+ 1106
+ 1201
+ 1103
+ 1202
+ 1205
+ 1107
+ 1104
+ 1206
+ 2101
+ 1203
+ 1108
+ 2105
+ 2102
+ 1207
+ 2106
+ 2201
+ 1204
+ 2103
+ 2205
+ 2202
+ 1208
+ 2107
+ 2206
+ 2104
+ 2203
+ 2108
+ 2207
+ 2204
+ 2208
+
+
+ s
+ 1101
+ 1105
+ 1102
+ 1201
+ 1106
+ 1205
+ 1202
+ 1103
+ 2101
+ 1206
+ 1107
+ 2105
+ 2102
+ 1203
+ 2201
+ 1104
+ 2106
+ 1207
+ 2205
+ 1108
+ 2202
+ 2103
+ 1204
+ 2206
+ 2107
+ 1208
+ 2203
+ 2104
+ 2207
+ 2108
+ 2204
+ 2208
+
+
+ s
+ 1101
+ 1105
+ 1102
+ 1201
+ 1106
+ 1205
+ 1202
+ 1103
+ 2101
+ 1206
+ 1107
+ 2105
+ 2102
+ 1203
+ 1104
+ 2201
+ 2106
+ 1207
+ 1108
+ 2205
+ 2202
+ 2103
+ 1204
+ 2206
+ 2107
+ 1208
+ 2203
+ 2104
+ 2207
+ 2108
+ 2204
+ 2208
+
+
+
+
+
+
diff --git a/test/i2b/110323_HS13_06000_B_B039WABXX/Data/Intensities/L001/s_1_1101.clocs b/test/i2b/110323_HS13_06000_B_B039WABXX/Data/Intensities/L001/s_1_1101.clocs
new file mode 100644
index 0000000..f17b55d
Binary files /dev/null and b/test/i2b/110323_HS13_06000_B_B039WABXX/Data/Intensities/L001/s_1_1101.clocs differ
diff --git a/test/i2b/110323_HS13_06000_B_B039WABXX/Data/Intensities/config.xml b/test/i2b/110323_HS13_06000_B_B039WABXX/Data/Intensities/config.xml
new file mode 100755
index 0000000..3c652dc
--- /dev/null
+++ b/test/i2b/110323_HS13_06000_B_B039WABXX/Data/Intensities/config.xml
@@ -0,0 +1,334 @@
+
+
+
+
+
+ 0
+ 0
+ 0
+ 0
+ 0
+
+
+ 0
+ 0
+ 0
+ 0
+ 0
+
+ 1
+ 50
+ 110323_HS13_06000_B_B039WABXX
+
+
+ 51
+ 100
+ 110323_HS13_06000_B_B039WABXX
+
+ HS13
+ 0
+ 0
+ 0
+ 0
+
+ 1
+ 50
+ 110323_HS13_06000_B_B039WABXX
+
+
+ 51
+ 100
+ 110323_HS13_06000_B_B039WABXX
+
+ 110323_HS13_06000_B_B039WABXX
+ 110323
+ 6000
+ PL14
+
+
+
+
+ s
+ 1102
+ 1103
+ 1101
+ 1104
+ 1107
+ 1106
+ 1105
+ 1108
+ 1201
+ 1204
+ 1203
+ 1202
+ 1205
+ 1208
+ 1207
+ 2103
+ 2104
+ 2101
+ 1206
+ 2107
+ 2108
+ 2102
+ 2105
+ 2203
+ 2204
+ 2201
+ 2106
+ 2207
+ 2208
+ 2202
+ 2205
+ 2206
+
+
+ s
+ 1104
+ 1103
+ 1101
+ 1108
+ 1107
+ 1102
+ 1105
+ 1203
+ 1204
+ 1106
+ 1201
+ 1202
+ 1207
+ 1208
+ 1205
+ 2103
+ 1206
+ 2104
+ 2107
+ 2101
+ 2102
+ 2203
+ 2108
+ 2106
+ 2207
+ 2105
+ 2204
+ 2202
+ 2201
+ 2208
+ 2206
+ 2205
+
+
+ s
+ 1103
+ 1107
+ 1104
+ 1203
+ 1102
+ 1108
+ 1101
+ 1106
+ 1204
+ 1207
+ 1105
+ 1202
+ 2103
+ 1208
+ 1201
+ 1206
+ 2104
+ 2107
+ 1205
+ 2102
+ 2203
+ 2108
+ 2101
+ 2204
+ 2207
+ 2105
+ 2106
+ 2208
+ 2201
+ 2202
+ 2206
+ 2205
+
+
+ s
+ 1103
+ 1104
+ 1107
+ 1108
+ 1102
+ 1101
+ 1203
+ 1207
+ 1105
+ 1204
+ 1106
+ 1208
+ 2103
+ 1201
+ 1202
+ 2104
+ 2107
+ 1205
+ 1206
+ 2108
+ 2102
+ 2203
+ 2204
+ 2101
+ 2106
+ 2207
+ 2202
+ 2208
+ 2105
+ 2206
+ 2201
+ 2205
+
+
+ s
+ 1103
+ 1104
+ 1108
+ 1107
+ 1102
+ 1204
+ 1203
+ 1106
+ 1207
+ 1208
+ 1101
+ 1202
+ 1105
+ 2103
+ 2104
+ 1206
+ 1201
+ 2107
+ 2108
+ 2102
+ 1205
+ 2203
+ 2204
+ 2106
+ 2101
+ 2208
+ 2207
+ 2202
+ 2105
+ 2201
+ 2206
+ 2205
+
+
+ s
+ 1104
+ 1103
+ 1107
+ 1108
+ 1203
+ 1102
+ 1204
+ 1101
+ 1106
+ 1208
+ 1202
+ 1207
+ 1105
+ 2104
+ 2103
+ 1206
+ 1201
+ 2108
+ 2102
+ 1205
+ 2204
+ 2106
+ 2107
+ 2202
+ 2101
+ 2208
+ 2203
+ 2105
+ 2206
+ 2201
+ 2207
+ 2205
+
+
+ s
+ 1104
+ 1102
+ 1103
+ 1108
+ 1106
+ 1101
+ 1107
+ 1204
+ 1202
+ 1203
+ 1105
+ 1206
+ 1208
+ 2102
+ 2104
+ 1201
+ 1207
+ 2108
+ 2204
+ 2106
+ 2208
+ 1205
+ 2103
+ 2202
+ 2101
+ 2206
+ 2107
+ 2105
+ 2203
+ 2207
+ 2201
+ 2205
+
+
+ s
+ 1104
+ 1108
+ 1204
+ 1102
+ 1208
+ 1106
+ 2104
+ 1202
+ 2108
+ 1206
+ 1103
+ 2204
+ 1107
+ 2102
+ 1101
+ 2208
+ 2106
+ 1203
+ 1105
+ 1207
+ 2202
+ 1201
+ 2206
+ 2103
+ 1205
+ 2107
+ 2101
+ 2105
+ 2203
+ 2207
+ 2201
+ 2205
+
+
+
+
+
+
diff --git a/test/i2b/111014_M00119_0028_AMS0001310-00300/Data/Intensities/L001/s_1_1.locs b/test/i2b/111014_M00119_0028_AMS0001310-00300/Data/Intensities/L001/s_1_1.locs
new file mode 100755
index 0000000..9d344ef
Binary files /dev/null and b/test/i2b/111014_M00119_0028_AMS0001310-00300/Data/Intensities/L001/s_1_1.locs differ
diff --git a/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Basecalling_Netcopy_complete.txt b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Basecalling_Netcopy_complete.txt
new file mode 100755
index 0000000..79a6ab4
--- /dev/null
+++ b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Basecalling_Netcopy_complete.txt
@@ -0,0 +1 @@
+6/25/2014,02:49:01.615,Illumina RTA 1.18.54
diff --git a/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Basecalling_Netcopy_complete_Read1.txt b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Basecalling_Netcopy_complete_Read1.txt
new file mode 100755
index 0000000..aca2b73
--- /dev/null
+++ b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Basecalling_Netcopy_complete_Read1.txt
@@ -0,0 +1 @@
+6/24/2014,19:08:44.528,Illumina RTA 1.18.54
diff --git a/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Basecalling_Netcopy_complete_Read2.txt b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Basecalling_Netcopy_complete_Read2.txt
new file mode 100755
index 0000000..8868eff
--- /dev/null
+++ b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Basecalling_Netcopy_complete_Read2.txt
@@ -0,0 +1 @@
+6/24/2014,20:18:46.734,Illumina RTA 1.18.54
diff --git a/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Basecalling_Netcopy_complete_Read3.txt b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Basecalling_Netcopy_complete_Read3.txt
new file mode 100755
index 0000000..f344f09
--- /dev/null
+++ b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Basecalling_Netcopy_complete_Read3.txt
@@ -0,0 +1 @@
+6/24/2014,21:12:17.107,Illumina RTA 1.18.54
diff --git a/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Basecalling_Netcopy_complete_Read4.txt b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Basecalling_Netcopy_complete_Read4.txt
new file mode 100755
index 0000000..79cab3f
--- /dev/null
+++ b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Basecalling_Netcopy_complete_Read4.txt
@@ -0,0 +1 @@
+6/25/2014,02:49:01.625,Illumina RTA 1.18.54
diff --git a/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Config/Effective.cfg b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Config/Effective.cfg
new file mode 100755
index 0000000..6ebec3c
--- /dev/null
+++ b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Config/Effective.cfg
@@ -0,0 +1,1279 @@
+; C:\Illumina\MiSeq Control Software\MiSeqSoftware.Hardware.cfg
+; #include (InstrumentType).cfg
+C:\Illumina\MiSeq Control Software\Configs\Instruments\Shock.cfg
+; ShockProto.cfg
+; MiSeq.cfg
+; MiSeqPilot.cfg
+; ..\MiSeqCommon.cfg
+; FPGA.cfg
+; YMotor_FPGAStepper.cfg
+; ZMotor_PI_300um.cfg
+; ExcitationLEDs.cfg
+; SipperMotor.cfg
+; Fluidics.cfg
+; Sensors.cfg
+; StatusLights.cfg
+; BurnInTest.cfg
+; ..\SonyCamera.cfg
+; ..\Compensator.cfg
+; C:\MiSeqOverride.cfg
+
+
+[_fileinfo]
+overrideversion = 1.0.10_Shock 5/24/2012 5:15 PM ; MiSeqOverride.cfg
+
+[_notes]
+instrumenttypedescription = Shock ; Shock.cfg
+
+[burnintest.bubble]
+numberofcycles = 1 ; BurnInTest.cfg
+percenterrorsthreshold = 20 ; BurnInTest.cfg
+triespersolution = 3 ; BurnInTest.cfg
+
+[burnintest.chiller]
+chillerlowerbounddegreesc = 3.5 ; BurnInTest.cfg
+chillerramprateminutes = 180 ; BurnInTest.cfg
+chillersetpointdegreesc = 4 ; BurnInTest.cfg
+chillerupperbounddegreesc = 6 ; BurnInTest.cfg
+
+[burnintest.compensator]
+gonumberofcyclesinsteadofruntime = false ; BurnInTest.cfg
+numberofcycles = 10 ; BurnInTest.cfg
+timemsbetweenmoves = 1000 ; BurnInTest.cfg
+
+[burnintest.fctec]
+hightempholdtimesecs = 120 ; BurnInTest.cfg
+hightempramptimeallowedsecs = 40 ; BurnInTest.cfg
+hightempsetpointdegreesc = 70 ; BurnInTest.cfg
+lowtempholdtimesecs = 60 ; BurnInTest.cfg
+lowtempramptimeallowedsecs = 30 ; BurnInTest.cfg
+lowtempsetpointdegreesc = 22 ; BurnInTest.cfg
+tolerancedegreesc = 0.5 ; BurnInTest.cfg
+
+[burnintest.fluidicscommon]
+afterprimingrefillwithpr2 = true ; BurnInTest.cfg
+bubbletestquarter = 3 ; BurnInTest.cfg
+pumpandvalvetestquarter = 2 ; BurnInTest.cfg
+sippertestquarter = 1 ; BurnInTest.cfg
+volumetestquarter = 4 ; BurnInTest.cfg
+
+[burnintest.led]
+ledofftimems = 2000 ; BurnInTest.cfg
+ledontimems = 1000 ; BurnInTest.cfg
+photodiodepercentchangeallowed = 10 ; BurnInTest.cfg
+
+[burnintest.led.green]
+numvalues = 4 ; BurnInTest.cfg
+testcurrentma1 = 2000 ; BurnInTest.cfg
+testcurrentma2 = 4000 ; BurnInTest.cfg
+testcurrentma3 = 6000 ; BurnInTest.cfg
+testcurrentma4 = 7000 ; BurnInTest.cfg
+
+[burnintest.led.red]
+numvalues = 4 ; BurnInTest.cfg
+testcurrentma1 = 375 ; BurnInTest.cfg
+testcurrentma2 = 750 ; BurnInTest.cfg
+testcurrentma3 = 1125 ; BurnInTest.cfg
+testcurrentma4 = 1500 ; BurnInTest.cfg
+
+[burnintest.lightbar]
+displaydelayms = 1000 ; BurnInTest.cfg
+
+[burnintest.mirror] ; BurnInTest.cfg
+
+[burnintest.pumpandvalve]
+cycleapumpstowaste = false ; BurnInTest.cfg
+cyclearepeatduringobcg = 30 ; BurnInTest.cfg
+cyclearepeatduringsbs = 302 ; BurnInTest.cfg
+cyclebrepeatduringobcg = 15 ; BurnInTest.cfg
+cyclebrepeatduringsbs = 151 ; BurnInTest.cfg
+enablecyclea = true ; BurnInTest.cfg
+enablecycleb = false ; BurnInTest.cfg
+ignoretimelimit = false ; BurnInTest.cfg
+primeaspiraterateulperminute = 2000 ; BurnInTest.cfg
+primedispenserateulperminute = 2500 ; BurnInTest.cfg
+primevolumeul = 1500 ; BurnInTest.cfg
+testaspiraterateulperminute = 2000 ; BurnInTest.cfg
+testaspiratevolumeul = 50 ; BurnInTest.cfg
+testaspiratevolumeulcycleb = 50 ; BurnInTest.cfg
+testdelaymsafteraspirate = 500 ; BurnInTest.cfg
+testdelaymsafterdispense = 500 ; BurnInTest.cfg
+testdelaymsbetweenadjacentvalvemoves = 500 ; BurnInTest.cfg
+testdispenserateulperminute = 2500 ; BurnInTest.cfg
+testnumberofruncycles = 12 ; BurnInTest.cfg
+valvepositionsperpumptest = 1 ; BurnInTest.cfg
+
+[burnintest.rfid]
+maxallowedblockreaderrorratepercent = 1 ; BurnInTest.cfg
+readtagrepeats = 25 ; BurnInTest.cfg
+retriesperblock = 5 ; BurnInTest.cfg
+stopiferror = false ; BurnInTest.cfg
+
+[burnintest.sipper]
+downwaittimems = 40000 ; BurnInTest.cfg
+upwaittimems = 40000 ; BurnInTest.cfg
+
+[burnintest.ste.settings]
+testtimeminutes = 1 ; BurnInTest.cfg
+usestesettings = false ; BurnInTest.cfg
+
+[burnintest.volume]
+numberofcycles = 1 ; BurnInTest.cfg
+percenterrorsthreshold = 10 ; BurnInTest.cfg
+
+[burnintest.ystage]
+cyclesperhomingoperation = 300 ; BurnInTest.cfg
+percenterrorsthreshold = 10 ; BurnInTest.cfg
+
+[burnintest.zstage]
+cyclesperhomingoperation = 300 ; BurnInTest.cfg
+percenterrorsthreshold = 1.33 ; BurnInTest.cfg
+testpositionmm1 = -0.145 ; BurnInTest.cfg
+testpositionmm2 = -0.155 ; BurnInTest.cfg
+
+[calibration]
+flowcell1xoffset = 0 ; MiSeqCommon.cfg
+flowcell1yoffset = 0 ; MiSeqCommon.cfg
+flowcell2xoffset = 0 ; MiSeqCommon.cfg
+flowcell2yoffset = 0 ; MiSeqCommon.cfg
+
+[cavrolanepump]
+bypassvalve = BypassValve ; Fluidics.cfg
+reagentvalve = RheodyneSelectorValve ; Fluidics.cfg
+
+[chillerdooropensensor] ; Sensors.cfg
+
+[chillertemperaturecontroller]
+chillerinnertecblock = ChillerInnerTECBlock ; Fluidics.cfg
+
+[cloud]
+performcloudtest = true ; MiSeqCommon.cfg
+
+[exception illumina.instrument.bolt.logic.incompatiblefirmwareversion]
+fatal = true ; MiSeqCommon.cfg
+retryable = false ; MiSeqCommon.cfg
+
+[exception illumina.instrument.bolt.logic.movestoppedbecausedoorisopenexception]
+fatal = false ; MiSeqCommon.cfg
+retryable = true ; MiSeqCommon.cfg
+
+[exception illumina.instrument.bolt.logic.serialportreceiverexception]
+fatal = true ; MiSeqCommon.cfg
+retryable = false ; MiSeqCommon.cfg
+
+[excitationled]
+allowbothledsonatsametime = false ; ExcitationLEDs.cfg
+dacoffset = 0 ; ExcitationLEDs.cfg
+measurepower = false ; ExcitationLEDs.cfg
+
+[flowcellcartridgerfidsensor] ; Sensors.cfg
+
+[flowcellclampclosedsensor] ; Sensors.cfg
+
+[flowcellfluidics]
+cosmeticname = FlowCellFluidics ; Fluidics.cfg
+flowcelltemperaturecontroller = FlowCellTemperatureController ; Fluidics.cfg
+flowsensor = FlowSensor ; Fluidics.cfg
+lanepump = CavroLanePump ; Fluidics.cfg
+
+[flowsensor] ; Fluidics.cfg
+
+[fluidics]
+chillertemperaturecontroller = ChillerTemperatureController ; Fluidics.cfg
+flowcellfluidics = FlowCellFluidics ; Fluidics.cfg
+
+[focus params]
+analyzeimages = true ; MiSeqCommon.cfg
+channeltouse = Focus T ; MiSeqCommon.cfg
+coarsefocuscenterz = -0.17759 ; MiSeqOverride.cfg
+coarsefocusnumsteps = 41 ; MiSeqCommon.cfg
+coarsefocusstepsize = 0.002 ; MiSeqCommon.cfg
+darksamplecontrastthreshold = 20 ; MiSeqCommon.cfg
+focusmirrorzoffset = -0.007 ; MiSeqOverride.cfg
+imagebottomsurfacefirst = false ; MiSeqCommon.cfg
+lowsnrcontrastthreshold = 40 ; MiSeqCommon.cfg
+lowsnrexposuretimeboostfactor = 1.5 ; MiSeqCommon.cfg
+maxautofocusexposuretimems = 1000 ; MiSeqCommon.cfg
+minimagespasssnrthresh = 0 ; MiSeqCommon.cfg
+scanbottomsurfaceonly = false ; MiSeqCommon.cfg
+skipautofocusmaxzcorrection = 0.0005 ; MiSeqOverride.cfg
+skipautofocusnoskipcycles = 5 ; MiSeqOverride.cfg
+skipautofocusntiles = 4 ; MiSeqOverride.cfg
+throughfocuscenterz = -0.17759 ; MiSeqOverride.cfg
+throughfocusmetric = Brenner ; MiSeqCommon.cfg
+throughfocusnumsteps = 41 ; MiSeqCommon.cfg
+throughfocusstepsize = 0.0005 ; MiSeqCommon.cfg
+tiltuntiltfocuscenterz = -0.17759 ; MiSeqOverride.cfg
+tiltuntiltfocusnumsteps = 41 ; MiSeqCommon.cfg
+tiltuntiltfocusstepsize = 0.0005 ; MiSeqCommon.cfg
+usepiecewiselinearfocusmodel = true ; MiSeqCommon.cfg
+usepredictiveoptimization = true ; MiSeqCommon.cfg
+zoffsettofocusled = -0.000746 ; MiSeqOverride.cfg
+
+[fpga features v3]
+array_height_sensor = 0.0 ; FPGA.cfg
+camera_selection = 0.5 ; FPGA.cfg
+deinterlace = 0.0 ; FPGA.cfg
+door_s_cmds = 0.24 ; FPGA.cfg
+doorsenrd = 0.32 ; FPGA.cfg
+doorsstate = 0.29 ; FPGA.cfg
+dynamic_focus = 0.0 ; FPGA.cfg
+ejen = 0.0 ; FPGA.cfg
+filterslider_separate_speeds = 0.0 ; FPGA.cfg
+free_run = 0.0 ; FPGA.cfg
+hm2 = 0.0 ; FPGA.cfg
+hw_zramp_zvelctrl_and_more = 0.1 ; FPGA.cfg
+index_counter = 0.0 ; FPGA.cfg
+laser_pwr = 0.0 ; FPGA.cfg
+laserpb = 0.27 ; FPGA.cfg
+laserset = 0.0 ; FPGA.cfg
+led_cmds = 0.0 ; FPGA.cfg
+ledbar_ms_timing = 0.26 ; FPGA.cfg
+ledbarswap = 0.26 ; FPGA.cfg
+ledharm = 0.26 ; FPGA.cfg
+ledmodepb = 0.18 ; FPGA.cfg
+ledmodepwr = 0.33 ; FPGA.cfg
+lsen = 0.0 ; FPGA.cfg
+miscrvc = 0.0 ; FPGA.cfg
+msgsen = 0.29 ; FPGA.cfg
+pwrben = 0.33 ; FPGA.cfg
+short_cmds = 0.0 ; FPGA.cfg
+sw_bruno = 0.0 ; FPGA.cfg
+sw_ylck = 0.15 ; FPGA.cfg
+swbeadchip = 0.25 ; FPGA.cfg
+swbeadcompat = 0.37 ; FPGA.cfg
+swceiling = 0.33 ; FPGA.cfg
+swcvdbg = 0.0 ; FPGA.cfg
+swdbugpxlx2 = 0.23 ; FPGA.cfg
+swdith_igain = 0.33 ; FPGA.cfg
+swdith_ihist = 0.33 ; FPGA.cfg
+swdith_size = 0.33 ; FPGA.cfg
+swftlsr = 0.16 ; FPGA.cfg
+swlsrshut = 0.15 ; FPGA.cfg
+swsig_tower = 0.0 ; FPGA.cfg
+swtgimage = 0.37 ; FPGA.cfg
+swtime = 0.19 ; FPGA.cfg
+swvix = 0.0 ; FPGA.cfg
+swyz_pos = 0.0 ; FPGA.cfg
+swzlag = 0.15 ; FPGA.cfg
+t1moveto = 0.16x ; FPGA.cfg
+tdibb = 0.16 ; FPGA.cfg
+tdiclines = 0.16x ; FPGA.cfg
+tdimask = 0.13 ; FPGA.cfg
+tdipulses = 0.16z15 ; FPGA.cfg
+tdiyarm3 = 0.16z ; FPGA.cfg
+tdiyarm4 = 0.36 ; FPGA.cfg
+tdiystart = 0.36 ; FPGA.cfg
+tld = 0.16z ; FPGA.cfg
+zarm = 0.0 ; FPGA.cfg
+zmvmathfix = 0.27 ; FPGA.cfg
+zspec = 0.16z ; FPGA.cfg
+
+[fpga features v4]
+array_height_sensor = 0.0 ; FPGA.cfg
+deinterlace = 0.0 ; FPGA.cfg
+dynamic_focus = 0.0 ; FPGA.cfg
+ejen = 0.0 ; FPGA.cfg
+filterslider_separate_speeds = 0.0 ; FPGA.cfg
+free_run = 0.0 ; FPGA.cfg
+hm2 = 0.0 ; FPGA.cfg
+hw_zramp_zvelctrl_and_more = 0.1 ; FPGA.cfg
+index_counter = 0.0 ; FPGA.cfg
+laser_pwr = 0.0 ; FPGA.cfg
+laserset = 0.0 ; FPGA.cfg
+led_cmds = 0.0 ; FPGA.cfg
+lsen = 0.0 ; FPGA.cfg
+short_cmds = 0.0 ; FPGA.cfg
+sw_bruno = 0.0 ; FPGA.cfg
+swceiling = 0.18 ; FPGA.cfg
+swcvdbg = 0.0 ; FPGA.cfg
+swdith_igain = 0.19 ; FPGA.cfg
+swdith_ihist = 0.19 ; FPGA.cfg
+swdith_size = 0.15 ; FPGA.cfg
+swgrp_size = 0.15 ; FPGA.cfg
+swsig_tower = 0.0 ; FPGA.cfg
+swtime = 99.99 ; FPGA.cfg
+swvix = 0.0 ; FPGA.cfg
+swyz_pos = 0.0 ; FPGA.cfg
+swzlag = 0.4 ; FPGA.cfg
+t1moveto = 0.4 ; FPGA.cfg
+tdimask = 0.4 ; FPGA.cfg
+zarm = 0.20 ; FPGA.cfg
+
+[fpga features v6]
+camdblsnap_zdelay = 1.0 ; FPGA.cfg
+camdly = 1.0 ; FPGA.cfg
+dummy = 0.0 ; FPGA.cfg
+emdly = 0.52 ; FPGA.cfg
+flashwr = 0.45 ; FPGA.cfg
+flow1arm_with_t1_response = 0.67 ; FPGA.cfg
+flow1dly = 1.0 ; FPGA.cfg
+focmrrdly = 0.52 ; FPGA.cfg
+focmrrfoc_focmrrimg = 0.14 ; FPGA.cfg
+minimum_required_version = 1.13 ; FPGA.cfg
+prototype_instrument = 0.0 ; FPGA.cfg
+thermal_control_protocol_v2 = 0.49 ; FPGA.cfg
+yhcur = 0.73 ; FPGA.cfg
+yhome_enc = 0.12 ; FPGA.cfg
+ymvto_returns_steps = 0.67 ; FPGA.cfg
+yprof_0_1 = 1.2 ; FPGA.cfg
+yvelus = 0.73 ; FPGA.cfg
+yvprofrd = 0.80 ; FPGA.cfg
+
+[fpga features v8]
+~lightbar = 0.15 ; FPGA.cfg
+camdblsnap_zdelay = 0.6 ; FPGA.cfg
+camdly = 0.6 ; FPGA.cfg
+dummy = 0.0 ; FPGA.cfg
+emdly = 0.0 ; FPGA.cfg
+emin_emout = 0.14 ; FPGA.cfg
+flashwr = 0.0 ; FPGA.cfg
+flow1arm_with_t1_response = 0.7 ; FPGA.cfg
+flow1dly = 0.6 ; FPGA.cfg
+focmrrdly = 0.0 ; FPGA.cfg
+focmrrfoc_focmrrimg = 0.0 ; FPGA.cfg
+lightbar = 0.7 ; FPGA.cfg
+minimum_required_version = 0.18 ; FPGA.cfg
+pilot_instrument = 0.0 ; FPGA.cfg
+thermal_control_protocol_v2 = 0.0 ; FPGA.cfg
+thermal_control_protocol_v3 = 0.14 ; FPGA.cfg
+yhcur = 0.2 ; FPGA.cfg
+yhome_enc = 0.0 ; FPGA.cfg
+ymvto_returns_steps = 0.0 ; FPGA.cfg
+yprof_0_1 = 0.7 ; FPGA.cfg
+yvelus = 0.2 ; FPGA.cfg
+yvprofrd = 0.6 ; FPGA.cfg
+zmv_zstep_zclk = 0.0 ; FPGA.cfg
+
+[fpga features v9]
+buben2 = 5.12 ; FPGA.cfg
+camdblsnap_zdelay = 0.0 ; FPGA.cfg
+camdly = 0.0 ; FPGA.cfg
+diffcompcur = 5.8 ; FPGA.cfg
+dummy = 0.0 ; FPGA.cfg
+emdly = 0.1 ; FPGA.cfg
+emin_emout = 3.0 ; FPGA.cfg
+flashwr = 0.0 ; FPGA.cfg
+flow1arm_with_t1_response = 0.0 ; FPGA.cfg
+flow1dly = 0.0 ; FPGA.cfg
+focmrrdly = 0.0 ; FPGA.cfg
+focmrrfoc_focmrrimg = 0.0 ; FPGA.cfg
+lightbar = 0.3 ; FPGA.cfg
+minimum_required_version = 1.6 ; FPGA.cfg
+otled = 1.4 ; FPGA.cfg
+production_instrument = 0.0 ; FPGA.cfg
+sipcur = 0.0 ; FPGA.cfg
+sipvel = 0.0 ; FPGA.cfg
+supports_96c_and_tec2tcirc = 2.5 ; FPGA.cfg
+swcampwrdn = 1.0 ; FPGA.cfg
+swfx2reset = 1.0 ; FPGA.cfg
+thermal_control_protocol_v2 = 0.0 ; FPGA.cfg
+thermal_control_protocol_v3 = 1.7 ; FPGA.cfg
+yhcur = 0.0 ; FPGA.cfg
+yhome_enc = 0.0 ; FPGA.cfg
+ymvto_returns_steps = 0.0 ; FPGA.cfg
+yprof_0_1 = 0.0 ; FPGA.cfg
+ytablemove = 0.6 ; FPGA.cfg
+yvelus = 0.0 ; FPGA.cfg
+yvprofrd = 0.0 ; FPGA.cfg
+zfltacquire = 2.2 ; FPGA.cfg
+zmv_zstep_zclk = 0.0 ; FPGA.cfg
+
+[fpga initialization]
+command1 = SIPCUR 0 ; FPGA.cfg
+command2 = SIPVEL 0 ; FPGA.cfg
+
+[instrument]
+balance = MettlerToledo ; Fluidics.cfg
+camera = SonyCamera ; SonyCamera.cfg
+compensator = Compensator ; Compensator.cfg
+excitationled = ExcitationLED ; ExcitationLEDs.cfg
+fluidics = Fluidics ; Fluidics.cfg
+focusmirror = FocusMirror ; MiSeqCommon.cfg
+fpga = FPGA ; FPGA.cfg
+sensors = Sensors ; Sensors.cfg
+sippermotor = SipperMotor ; SipperMotor.cfg
+statuslights = StatusLights ; StatusLights.cfg
+ymotor = YMotor_FPGAStepper ; YMotor_FPGAStepper.cfg
+zmotor = ZMotor_PI_300um ; ZMotor_PI_300um.cfg
+
+[instrument.compensator]
+currentpercentin = 80 ; Compensator.cfg
+currentpercentout = 80 ; Compensator.cfg
+delaycurrentpercentin = 40 ; Compensator.cfg
+delaycurrentpercentout = 70 ; Compensator.cfg
+delayms = 500 ; Compensator.cfg
+ignoresensorerrors = false ; Compensator.cfg
+moveindelayms = 20 ; Compensator.cfg
+moveoutdelayms = 20 ; Compensator.cfg
+setcurrentcommand = EMCUR ; Compensator.cfg
+setdelaycommand = EMDLY ; Compensator.cfg
+stopcurrentpercentin = 60 ; Compensator.cfg
+stopcurrentpercentout = 75 ; Compensator.cfg
+zoffsetmm = 0.035 ; Compensator.cfg
+
+[instrument.compensator.retry]
+currentpercentin = 80 ; Compensator.cfg
+currentpercentout = 80 ; Compensator.cfg
+delaycurrentpercentin = 40 ; Compensator.cfg
+delaycurrentpercentout = 75 ; Compensator.cfg
+delayms = 1000 ; Compensator.cfg
+moveindelayms = 40 ; Compensator.cfg
+moveoutdelayms = 40 ; Compensator.cfg
+numretries = 3 ; Compensator.cfg
+stopcurrentpercentin = 60 ; Compensator.cfg
+stopcurrentpercentout = 75 ; Compensator.cfg
+
+[instrument.excitationled1]
+calibrationdrivecurrentma1 = 750 ; MiSeqOverride.cfg
+calibrationdrivecurrentma2 = 1000 ; MiSeqOverride.cfg
+calibrationdrivecurrentma3 = 1250 ; MiSeqOverride.cfg
+calibrationdrivecurrentma4 = 1500 ; MiSeqOverride.cfg
+calibrationdrivecurrentma5 = 1750 ; MiSeqOverride.cfg
+calibrationdrivecurrentma6 = 2000 ; MiSeqOverride.cfg
+calibrationphotodiodeadc1 = 7595 ; MiSeqOverride.cfg
+calibrationphotodiodeadc2 = 10359 ; MiSeqOverride.cfg
+calibrationphotodiodeadc3 = 13214 ; MiSeqOverride.cfg
+calibrationphotodiodeadc4 = 15945 ; MiSeqOverride.cfg
+calibrationphotodiodeadc5 = 18558 ; MiSeqOverride.cfg
+calibrationphotodiodeadc6 = 21189 ; MiSeqOverride.cfg
+calibrationpowermetermw1 = 90.84 ; MiSeqOverride.cfg
+calibrationpowermetermw2 = 122.8 ; MiSeqOverride.cfg
+calibrationpowermetermw3 = 150.1 ; MiSeqOverride.cfg
+calibrationpowermetermw4 = 170.2 ; MiSeqOverride.cfg
+calibrationpowermetermw5 = 181.3 ; MiSeqOverride.cfg
+calibrationpowermetermw6 = 185.3 ; MiSeqOverride.cfg
+color = Red ; ExcitationLEDs.cfg
+cosmeticname = RedLED ; ExcitationLEDs.cfg
+currentmaperdacunit = 2.2393 ; MiSeq.cfg
+enablepolling = false ; ExcitationLEDs.cfg
+enablepowermode = true ; MiSeq.cfg
+ledcontinuouscurrentma = 1500 ; MiSeq.cfg
+ledcontinuouspowermw = 160 ; MiSeq.cfg
+ledsnapcurrentma = 1500 ; MiSeq.cfg
+ledsnappowermw = 205 ; MiSeq.cfg
+maxledcontinuouscurrentma = 1500 ; MiSeq.cfg
+maxledcontinuouspowermw = 160 ; MiSeq.cfg
+maxledsnapcurrentma = 2050 ; MiSeq.cfg
+maxledsnappowermw = 205 ; MiSeq.cfg
+minledcontinuouspowermw = 0 ; MiSeq.cfg
+minledcurrentma = 0 ; ExcitationLEDs.cfg
+minledsnappowermw = 0 ; MiSeq.cfg
+numcalibrationpoints = 6 ; MiSeqOverride.cfg
+overtemperaturelimitadc = 0 ; ExcitationLEDs.cfg
+pollinglogintervalms = 10000 ; ExcitationLEDs.cfg
+powermwfortile1 = 205 ; MiSeq.cfg
+powermwfortile2 = 205 ; MiSeq.cfg
+powermwfortile3 = 205 ; MiSeq.cfg
+powermwfortile4 = 205 ; MiSeq.cfg
+powermwfortile5 = 205 ; MiSeq.cfg
+powermwfortile6 = 205 ; MiSeq.cfg
+powermwfortile7 = 205 ; MiSeq.cfg
+powermwfortile8 = 205 ; MiSeq.cfg
+powermwfortile9 = 205 ; MiSeq.cfg
+powermwfortile10 = 205 ; MiSeq.cfg
+powermwfortile11 = 205 ; MiSeq.cfg
+powermwfortile12 = 205 ; MiSeq.cfg
+powermwfortile13 = 205 ; MiSeq.cfg
+powermwfortile14 = 205 ; MiSeq.cfg
+powerpertilenumtiles = 14 ; MiSeq.cfg
+usepowerpertilemode = false ; MiSeq.cfg
+wavelength = 660 ; ExcitationLEDs.cfg
+
+[instrument.excitationled2]
+calibrationdrivecurrentma1 = 2000 ; MiSeqOverride.cfg
+calibrationdrivecurrentma2 = 3000 ; MiSeqOverride.cfg
+calibrationdrivecurrentma3 = 4000 ; MiSeqOverride.cfg
+calibrationdrivecurrentma4 = 5000 ; MiSeqOverride.cfg
+calibrationdrivecurrentma5 = 6000 ; MiSeqOverride.cfg
+calibrationdrivecurrentma6 = 7000 ; MiSeqOverride.cfg
+calibrationphotodiodeadc1 = 921 ; MiSeqOverride.cfg
+calibrationphotodiodeadc2 = 1249 ; MiSeqOverride.cfg
+calibrationphotodiodeadc3 = 1544 ; MiSeqOverride.cfg
+calibrationphotodiodeadc4 = 1815 ; MiSeqOverride.cfg
+calibrationphotodiodeadc5 = 2071 ; MiSeqOverride.cfg
+calibrationphotodiodeadc6 = 2307 ; MiSeqOverride.cfg
+calibrationpowermetermw1 = 78.39 ; MiSeqOverride.cfg
+calibrationpowermetermw2 = 105.7 ; MiSeqOverride.cfg
+calibrationpowermetermw3 = 128.6 ; MiSeqOverride.cfg
+calibrationpowermetermw4 = 148.3 ; MiSeqOverride.cfg
+calibrationpowermetermw5 = 165.5 ; MiSeqOverride.cfg
+calibrationpowermetermw6 = 180.4 ; MiSeqOverride.cfg
+color = Green ; ExcitationLEDs.cfg
+cosmeticname = GreenLED ; ExcitationLEDs.cfg
+currentmaperdacunit = 2.2393 ; MiSeq.cfg
+enablepolling = false ; ExcitationLEDs.cfg
+enablepowermode = true ; MiSeq.cfg
+ledcontinuouscurrentma = 2000 ; MiSeq.cfg
+ledcontinuouspowermw = 75 ; MiSeq.cfg
+ledsnapcurrentma = 6500 ; MiSeq.cfg
+ledsnappowermw = 180 ; MiSeq.cfg
+maxledcontinuouscurrentma = 2000 ; MiSeq.cfg
+maxledcontinuouspowermw = 75 ; MiSeq.cfg
+maxledsnapcurrentma = 7000 ; MiSeq.cfg
+maxledsnappowermw = 185 ; MiSeq.cfg
+minledcontinuouspowermw = 0 ; MiSeq.cfg
+minledcurrentma = 0 ; ExcitationLEDs.cfg
+minledsnappowermw = 0 ; MiSeq.cfg
+numcalibrationpoints = 6 ; MiSeqOverride.cfg
+overtemperaturelimitadc = 3000 ; ExcitationLEDs.cfg
+pollinglogintervalms = 10000 ; ExcitationLEDs.cfg
+powermwfortile1 = 180 ; MiSeq.cfg
+powermwfortile2 = 180 ; MiSeq.cfg
+powermwfortile3 = 180 ; MiSeq.cfg
+powermwfortile4 = 180 ; MiSeq.cfg
+powermwfortile5 = 180 ; MiSeq.cfg
+powermwfortile6 = 180 ; MiSeq.cfg
+powermwfortile7 = 180 ; MiSeq.cfg
+powermwfortile8 = 180 ; MiSeq.cfg
+powermwfortile9 = 180 ; MiSeq.cfg
+powermwfortile10 = 180 ; MiSeq.cfg
+powermwfortile11 = 180 ; MiSeq.cfg
+powermwfortile12 = 180 ; MiSeq.cfg
+powermwfortile13 = 180 ; MiSeq.cfg
+powermwfortile14 = 180 ; MiSeq.cfg
+powerpertilenumtiles = 14 ; MiSeq.cfg
+usepowerpertilemode = false ; MiSeq.cfg
+wavelength = 532 ; ExcitationLEDs.cfg
+
+[instrument.fluidics] ; Fluidics.cfg
+
+[instrument.fluidics.chillertemperaturecontroller]
+calibrationhighmeasured = 28 ; Fluidics.cfg
+calibrationhightarget = 28 ; Fluidics.cfg
+calibrationlowmeasured = 4 ; Fluidics.cfg
+calibrationlowtarget = 4 ; Fluidics.cfg
+coolingderivativeterm = 0 ; Fluidics.cfg
+coolingestimatedundershoot = 1 ; Fluidics.cfg
+coolingfeedforwardstepsize = 6.0 ; Fluidics.cfg
+coolingfeedforwardthreshold = 6.0 ; Fluidics.cfg
+coolingintegralterm = 0.1 ; Fluidics.cfg
+coolingmaxvoltage = 1.8 ; Fluidics.cfg
+coolingproportionalterm = 10.0 ; Fluidics.cfg
+cosmeticname = ChillerTempControl ; Fluidics.cfg
+detailedlogging = false ; Fluidics.cfg
+enablepolling = true ; Fluidics.cfg
+floattointegerscale = 1000000 ; Fluidics.cfg
+heatingderivativeterm = 0.0 ; Fluidics.cfg
+heatingestimatedovershoot = 1 ; Fluidics.cfg
+heatingfeedforwardstepsize = 2.5 ; Fluidics.cfg
+heatingfeedforwardthreshold = 10.0 ; Fluidics.cfg
+heatingintegralterm = 0.1 ; Fluidics.cfg
+heatingmaxvoltage = 1.8315 ; Fluidics.cfg
+heatingproportionalterm = 10.0 ; Fluidics.cfg
+initialintegralwhenswitching = 1 ; Fluidics.cfg
+innerouterloop = 1 ; Fluidics.cfg
+loggingrateseconds = 60 ; Fluidics.cfg
+lowerbound = 0.1 ; Fluidics.cfg
+maxtemp = 30 ; Fluidics.cfg
+mintemp = 1 ; Fluidics.cfg
+samplerateseconds = 1 ; Fluidics.cfg
+samplingrateseconds = 5 ; Fluidics.cfg
+startteconinit = true ; Fluidics.cfg
+targettemponinit = 4 ; Fluidics.cfg
+tecnumber = 1 ; Fluidics.cfg
+useambientmode = false ; Fluidics.cfg
+
+[instrument.fluidics.chillertemperaturecontroller.chillerinnertecblock]
+coolingderivativeterm = 0.0 ; Fluidics.cfg
+coolingestimatedundershoot = 1 ; Fluidics.cfg
+coolingfeedforwardstepsize = 2.2727 ; Fluidics.cfg
+coolingfeedforwardthreshold = 6.0 ; Fluidics.cfg
+coolingintegralterm = 0.01 ; Fluidics.cfg
+coolingmaxvoltage = 2.2727 ; Fluidics.cfg
+coolingproportionalterm = 1.0 ; Fluidics.cfg
+floattointegerscale = 1000000 ; Fluidics.cfg
+heatingderivativeterm = 0.0 ; Fluidics.cfg
+heatingestimatedovershoot = 1 ; Fluidics.cfg
+heatingfeedforwardstepsize = 2.5 ; Fluidics.cfg
+heatingfeedforwardthreshold = 10.0 ; Fluidics.cfg
+heatingintegralterm = 0.01 ; Fluidics.cfg
+heatingmaxvoltage = 2.2727 ; Fluidics.cfg
+heatingproportionalterm = 1.0 ; Fluidics.cfg
+initialintegralwhenswitching = 0.0 ; Fluidics.cfg
+innerouterloop = 0 ; Fluidics.cfg
+maxtemp = 30 ; Fluidics.cfg
+mintemp = 1 ; Fluidics.cfg
+samplerateseconds = 1 ; Fluidics.cfg
+tecnumber = 1 ; Fluidics.cfg
+useambientmode = false ; Fluidics.cfg
+
+[instrument.fluidics.flowcellfluidics1]
+cosmeticname = FlowCell ; Fluidics.cfg
+
+[instrument.fluidics.flowcellfluidics1.cavrolanepump]
+allowdispensetobypass = false ; Fluidics.cfg
+asyncdeliverydelay = true ; Fluidics.cfg
+baudrate = 9600 ; Fluidics.cfg
+comportname = COM5 ; Fluidics.cfg
+cosmeticname = LanePump ; Fluidics.cfg
+delaymsbetweendispenseandsolenoid = 2 ; Fluidics.cfg
+delaymsbetweenreagentvalveandaspirate = 100 ; Fluidics.cfg
+delaymsforsolution1 = 2000 ; Fluidics.cfg
+delaymsforsolution2 = 2000 ; Fluidics.cfg
+delaymsforsolution3 = 2000 ; Fluidics.cfg
+delaymsforsolution4 = 2000 ; Fluidics.cfg
+delaymsforsolution5 = 2000 ; Fluidics.cfg
+delaymsforsolution6 = 2000 ; Fluidics.cfg
+delaymsforsolution7 = 2000 ; Fluidics.cfg
+delaymsforsolution8 = 2000 ; Fluidics.cfg
+delaymsforsolution9 = 2000 ; Fluidics.cfg
+delaymsforsolution10 = 2000 ; Fluidics.cfg
+delaymsforsolution11 = 2000 ; Fluidics.cfg
+delaymsforsolution12 = 2000 ; Fluidics.cfg
+delaymsforsolution13 = 2000 ; Fluidics.cfg
+delaymsforsolution14 = 2000 ; Fluidics.cfg
+delaymsforsolution15 = 2000 ; Fluidics.cfg
+delaymsforsolution16 = 2000 ; Fluidics.cfg
+delaymsforsolution17 = 2000 ; Fluidics.cfg
+delaymsforsolution18 = 2000 ; Fluidics.cfg
+delaymsforsolution19 = 2000 ; Fluidics.cfg
+delaymsforsolution20 = 2000 ; Fluidics.cfg
+delaymsforsolution21 = 2000 ; Fluidics.cfg
+delaymsforsolution22 = 2000 ; Fluidics.cfg
+delaymsforsolution23 = 2000 ; Fluidics.cfg
+delaymsforsolution24 = 2000 ; Fluidics.cfg
+delaymsforsolution25 = 2000 ; Fluidics.cfg
+flushandwarn = true ; Fluidics.cfg
+fpgacommandprefix = P1 ; Fluidics.cfg
+handshake = None ; Fluidics.cfg
+maxvelocityulperminute = 7500 ; Fluidics.cfg
+minvelocityulperminute = 13 ; Fluidics.cfg
+movetostartspeedulpermin = 2500 ; Fluidics.cfg
+multiaspirate = true ; Fluidics.cfg
+speedcommand = V ; Fluidics.cfg
+stepsperfullstroke = 3000 ; Fluidics.cfg
+syringevolumeul = 500 ; Shock.cfg
+
+[instrument.fluidics.flowcellfluidics1.cavrolanepump.rheodyneselectorvalve]
+airposition = 23 ; Fluidics.cfg
+avoidposition = 18 ; Fluidics.cfg
+baudrate = 19200 ; Fluidics.cfg
+comportname = COM6 ; Fluidics.cfg
+controllerbusypollrate = 420 ; Fluidics.cfg
+controllerbusytimeoutms = 60000 ; Fluidics.cfg
+cosmeticname = ReagentValve ; Fluidics.cfg
+flushandwarn = false ; Fluidics.cfg
+flushdelaybetweenchars = 20 ; Fluidics.cfg
+fpgacommandprefix = P2 ; Fluidics.cfg
+handshake = None ; Fluidics.cfg
+hometimeoutms = 60000 ; Fluidics.cfg
+initialposition = 24 ; Fluidics.cfg
+numberofports = 24 ; Fluidics.cfg
+numberofretries = 4 ; Fluidics.cfg
+plugposition = 24 ; Fluidics.cfg
+
+[instrument.fluidics.flowcellfluidics1.cavrolanepump.viciselectorvalve]
+airposition = 23 ; Fluidics.cfg
+avoidposition = 18 ; Fluidics.cfg
+baudrate = 9600 ; Fluidics.cfg
+comportname = COM2 ; Fluidics.cfg
+cosmeticname = ReagentValve ; Fluidics.cfg
+flushandwarn = false ; Fluidics.cfg
+flushdelaybetweenchars = 20 ; Fluidics.cfg
+handshake = None ; Fluidics.cfg
+initialposition = 24 ; Fluidics.cfg
+numberofports = 24 ; Fluidics.cfg
+numberofretries = 10 ; Fluidics.cfg
+plugposition = 24 ; Fluidics.cfg
+
+[instrument.fluidics.flowcellfluidics1.flowcelltemperaturecontroller]
+ambientmodedeadband = 2.0 ; Fluidics.cfg
+calibrationhighmeasured = 91.4 ; MiSeqOverride.cfg
+calibrationhightarget = 96 ; MiSeqOverride.cfg
+calibrationlowmeasured = 16.7 ; MiSeqOverride.cfg
+calibrationlowtarget = 16 ; MiSeqOverride.cfg
+commandforoldcomboboard70c = TEC2TCIRC 4990 10000 1500 31600 3976 ; Fluidics.cfg
+coolingderivativeterm = 0.0 ; Fluidics.cfg
+coolingestimatedundershoot = 1 ; Fluidics.cfg
+coolingfeedforwardstepsize = 6.0 ; Fluidics.cfg
+coolingfeedforwardthreshold = 6.0 ; Fluidics.cfg
+coolingintegralterm = 0 ; Fluidics.cfg
+coolingmaxvoltage = 1.2000 ; Fluidics.cfg
+coolingproportionalterm = 1.0 ; Fluidics.cfg
+cosmeticname = FlowCellTempControl ; Fluidics.cfg
+detailedlogging = false ; Fluidics.cfg
+enablehighspeedpolling = true ; Fluidics.cfg
+enablepolling = true ; Fluidics.cfg
+floattointegerscale = 1000000 ; Fluidics.cfg
+heatingderivativeterm = 0.0 ; Fluidics.cfg
+heatingestimatedovershoot = 1 ; Fluidics.cfg
+heatingfeedforwardstepsize = 2.5 ; Fluidics.cfg
+heatingfeedforwardthreshold = 10.0 ; Fluidics.cfg
+heatingintegralterm = 0.05 ; Fluidics.cfg
+heatingmaxvoltage = 2.25 ; Fluidics.cfg
+heatingproportionalterm = 0.25 ; Fluidics.cfg
+highspeedpollingratems = 1000 ; Fluidics.cfg
+initialintegralwhenswitching = 1 ; Fluidics.cfg
+innerouterloop = 0 ; Fluidics.cfg
+loggingrateseconds = 30 ; Fluidics.cfg
+maxtemp = 96.5 ; MiSeq.cfg
+mintemp = 10 ; Fluidics.cfg
+samplerateseconds = 1 ; Fluidics.cfg
+samplingrateseconds = 5 ; Fluidics.cfg
+startteconinit = false ; Fluidics.cfg
+supports96c = true ; MiSeq.cfg
+targettemponinit = 25 ; Fluidics.cfg
+tecnumber = 2 ; Fluidics.cfg
+useambientmode = true ; Fluidics.cfg
+
+[instrument.fluidics.flowcellfluidics1.flowsensor]
+bubbleburstmaxedgespertimespan = 50 ; Fluidics.cfg
+bubbleburstminallowedtimespanms = 500 ; Fluidics.cfg
+bubblereportintervalms = 5000 ; Fluidics.cfg
+calculatesimfpgaresponse = true ; Fluidics.cfg
+commandedbubblevolumeul = 10 ; Fluidics.cfg
+commandedflowrateulpermin = 2000 ; Fluidics.cfg
+debugforcebubblesenabled = false ; Fluidics.cfg
+debugforcebubblesintervalms = 10 ; Fluidics.cfg
+debugforcebubblesperinterval = 1 ; Fluidics.cfg
+errorthresholdpercent = 20 ; Fluidics.cfg
+firstsensortimeoutms = 15000 ; Fluidics.cfg
+fpgacommandtimeoutms = 20000 ; Fluidics.cfg
+intialprimevolume = 1000 ; Fluidics.cfg
+lastcalibrated = 5/16/2013 9:47:30 AM ; MiSeqOverride.cfg
+maxbubblesallowedperreportinterval = 250 ; Fluidics.cfg
+maxcorrelation = 0.3 ; Fluidics.cfg
+measureflowratefpgacommand = FLOW2ARM ; Fluidics.cfg
+monitorbubblesduringrun = true ; Fluidics.cfg
+onlyonebubbleratewarningperrun = true ; Fluidics.cfg
+simulatedfpgaresponse = t1=9000,tof=3000,bl=500,trp=1 ; Fluidics.cfg
+solution = 3 ; Fluidics.cfg
+volumebetweensensorsul = 20.13 ; Fluidics.cfg
+volumereagentvalvetofirstsensorul = 200 ; Fluidics.cfg
+
+[instrument.focusmirror]
+currentpercentnormal = 80 ; MiSeqCommon.cfg
+currentpercenttiltfocus = 80 ; MiSeqCommon.cfg
+delayms = 200 ; MiSeqCommon.cfg
+ignoresensorerrors = false ; MiSeqCommon.cfg
+setcurrentcommand = FOCMRRCUR ; MiSeqCommon.cfg
+setdelaycommand = FOCMRRDLY ; MiSeqCommon.cfg
+
+[instrument.fpga]
+baudrate = 115200 ; FPGA.cfg
+command_delay = 1 ; FPGA.cfg
+commandcomportname = COM3 ; FPGA.cfg
+commandhandshake = none ; FPGA.cfg
+requiredfpgaversionprefix = 9 ; MiSeq.cfg
+resettimeoutms = 15000 ; FPGA.cfg
+response_receiverpollingintervalms = 0 ; FPGA.cfg
+responsecomportname = COM4 ; FPGA.cfg
+responsehandshake = none ; FPGA.cfg
+simulatedversion = 9.99.99 ; MiSeq.cfg
+
+[instrument.sensors] ; Sensors.cfg
+
+[instrument.sensors.chillerdooropensensor]
+invertsensor = false ; Sensors.cfg
+simulatedsensorstate = false ; Sensors.cfg
+statusparamtag = CD ; Sensors.cfg
+
+[instrument.sensors.flowcellclampclosedsensor]
+invertsensor = false ; Sensors.cfg
+readsensorcommand = TEC2CLMP? ; Sensors.cfg
+simulatedsensorstate = true ; Sensors.cfg
+
+[instrument.sensors.reagenttraypresentsensor]
+invertsensor = true ; Sensors.cfg
+simulatedsensorstate = true ; Sensors.cfg
+statusparamtag = RP ; Sensors.cfg
+
+[instrument.sensors.rfid] ; Sensors.cfg
+
+[instrument.sensors.rfid.flowcellcartridgerfidsensor]
+rfiddevicenumber = 1 ; Sensors.cfg
+simulatedexpirationdate = Oct 1, 2099 ; Sensors.cfg
+simulatedlotnumber = 9999999 ; Sensors.cfg
+simulatednumberofcycles = 350 ; Sensors.cfg
+simulatednumberofruns = 1 ; Sensors.cfg
+simulatednumberoftiles = 28 ; Sensors.cfg
+simulatedpairedend = true ; Sensors.cfg
+simulatedpartnumber = 1111111111 ; Sensors.cfg
+simulatedpartnumberrevision = C ; Sensors.cfg
+simulatedreaderror = false ; Sensors.cfg
+simulatedreagentcartridgeversion = 1 ; Sensors.cfg
+simulatedrunid = This is run ID 123.456.78911111119 ; Sensors.cfg
+simulatedserialnumber = FC1234567-ABCDE ; Sensors.cfg
+simulatedsignature = AAAAAAAA BBBBBBBB CCCCCCCC DDDDDDDD EEEEEEEE ; Sensors.cfg
+simulateduid = E007ABAC 0BCD975E ; Sensors.cfg
+simulatedwriteerror = false ; Sensors.cfg
+
+[instrument.sensors.rfid.pr2rfidsensor]
+rfiddevicenumber = 3 ; Sensors.cfg
+simulatedexpirationdate = Oct 1, 2099 ; Sensors.cfg
+simulatedlotnumber = 9999999 ; Sensors.cfg
+simulatednumberofcycles = 350 ; Sensors.cfg
+simulatednumberofruns = 1 ; Sensors.cfg
+simulatednumberoftiles = 28 ; Sensors.cfg
+simulatedpairedend = true ; Sensors.cfg
+simulatedpartnumber = 3333333333 ; Sensors.cfg
+simulatedpartnumberrevision = B ; Sensors.cfg
+simulatedreaderror = false ; Sensors.cfg
+simulatedreagentcartridgeversion = 1 ; Sensors.cfg
+simulatedrunid = This is run ID 123.456.78911111119 ; Sensors.cfg
+simulatedserialnumber = PR1234567-ABCDE ; Sensors.cfg
+simulatedsignature = AAAAAAAA BBBBBBBB CCCCCCCC DDDDDDDD EEEEEEEE ; Sensors.cfg
+simulateduid = E0041234 ABCD1234 ; Sensors.cfg
+simulatedwriteerror = false ; Sensors.cfg
+
+[instrument.sensors.rfid.reagentrfidsensor]
+rfiddevicenumber = 2 ; Sensors.cfg
+simulatedexpirationdate = Oct 1, 2099 ; Sensors.cfg
+simulatedlotnumber = 9999999 ; Sensors.cfg
+simulatednumberofcycles = 350 ; Sensors.cfg
+simulatednumberofruns = 1 ; Sensors.cfg
+simulatednumberoftiles = 28 ; Sensors.cfg
+simulatedpairedend = true ; Sensors.cfg
+simulatedpartnumber = 2222222222 ; Sensors.cfg
+simulatedpartnumberrevision = A ; Sensors.cfg
+simulatedreaderror = false ; Sensors.cfg
+simulatedreagentcartridgeversion = 1 ; Sensors.cfg
+simulatedrunid = This is run ID 123.456.78911111119 ; Sensors.cfg
+simulatedserialnumber = RG1234567-00CDE ; Sensors.cfg
+simulatedsignature = AAAAAAAA BBBBBBBB CCCCCCCC DDDDDDDD EEEEEEEE ; Sensors.cfg
+simulateduid = E0071234 A0A0A0A0 ; Sensors.cfg
+simulatedwriteerror = false ; Sensors.cfg
+
+[instrument.sensors.sampledooropensensor]
+invertsensor = true ; Sensors.cfg
+simulatedsensorstate = false ; Sensors.cfg
+statusparamtag = SD ; Sensors.cfg
+
+[instrument.sensors.wasteandpr2sipperdownsensor]
+invertsensor = true ; Sensors.cfg
+simulatedsensorstate = true ; Sensors.cfg
+statusparamtag = WS ; Sensors.cfg
+
+[instrument.sensors.wastebottlefullsensor]
+invertsensor = false ; Sensors.cfg
+simulatedsensorstate = false ; Sensors.cfg
+statusparamtag = WF ; Sensors.cfg
+
+[instrument.sensors.wastebottleinstalledsensor]
+invertsensor = false ; Sensors.cfg
+simulatedsensorstate = true ; Sensors.cfg
+statusparamtag = WI ; Sensors.cfg
+
+[instrument.sippermotor]
+currentpercent = 70 ; MiSeqOverride.cfg
+movedowncommand = SIPDOWN ; SipperMotor.cfg
+moveupcommand = SIPUP ; SipperMotor.cfg
+readdownsensorcommand = SIPDNSNSRRD ; SipperMotor.cfg
+readupsensorcommand = SIPUPSNSRRD ; SipperMotor.cfg
+setcurrentcommand = SIPCUR ; SipperMotor.cfg
+setvelocitycommand = SIPVEL ; SipperMotor.cfg
+velocitypercent = 30 ; SipperMotor.cfg
+
+[instrument.sonycamera]
+cosmeticname = Camera ; SonyCamera.cfg
+enablefpgaledexposurecontrol = true ; SonyCamera.cfg
+extradelaybeforereturnms = 0 ; SonyCamera.cfg
+maxretries = 3 ; SonyCamera.cfg
+numsensors = 2 ; MiSeqPilot.cfg
+simulatedpath = D:\Simulator\Illunis ; SonyCamera.cfg
+skipsimulationimaging = false ; SonyCamera.cfg
+triggermode = HardwareTrigger ; MiSeqPilot.cfg
+uselegacydriver = false ; MiSeqPilot.cfg
+waittimebeforeinitializeafterpowercycle = 20000 ; SonyCamera.cfg
+warningifdurationms = 2000 ; SonyCamera.cfg
+
+[instrument.statuslights] ; StatusLights.cfg
+
+[instrument.statuslights.ledbars] ; StatusLights.cfg
+
+[instrument.statuslights.ledbars.ledbar1] ; StatusLights.cfg
+
+[instrument.statuslights.ledbars.ledbar2] ; StatusLights.cfg
+
+[instrument.ymotor_fpgastepper]
+accelcontrolunitspermm2 = 1600 ; YMotor_FPGAStepper.cfg
+accelerationmmpersecsquared = 1 ; YMotor_FPGAStepper.cfg
+applicationmaxvelocitymmpersec = 10 ; YMotor_FPGAStepper.cfg
+applicationminvelocitymmpersec = 0 ; YMotor_FPGAStepper.cfg
+backlashcorrectionmm = 0.01 ; YMotor_FPGAStepper.cfg
+closedloopprofilecommand = YVPROF 3 ; YMotor_FPGAStepper.cfg
+closedloopusage = Auto ; YMotor_FPGAStepper.cfg
+controllermaxvelocitycontrolunitspersec = 28800 ; YMotor_FPGAStepper.cfg
+controllerminvelocitycontrolunitspersec = 48 ; YMotor_FPGAStepper.cfg
+cosmeticname = Y Motor ; YMotor_FPGAStepper.cfg
+defaultmotortimeoutms = 60000 ; YMotor_FPGAStepper.cfg
+defaulttilemovetablenumber = 2 ; YMotor_FPGAStepper.cfg
+dooropenpollingintervalms = 1000 ; YMotor_FPGAStepper.cfg
+encodercountspermm = 2048 ; YMotor_FPGAStepper.cfg
+encodertestmovesizemm = 1.000 ; YMotor_FPGAStepper.cfg
+encodertestonlyifautodetect = true ; YMotor_FPGAStepper.cfg
+encodertestsettlingdelayms = 10 ; YMotor_FPGAStepper.cfg
+encodertesttolerancepercent = 3 ; YMotor_FPGAStepper.cfg
+encodertestusestablebasedmoves = true ; YMotor_FPGAStepper.cfg
+extramotiontimeoutms = 60000 ; YMotor_FPGAStepper.cfg
+failifsampledooropenduringymove = false ; MiSeqSoftware.Hardware.cfg
+forceclosedloopmovetotile1 = false ; YMotor_FPGAStepper.cfg
+holdcurrentpercent = 50 ; YMotor_FPGAStepper.cfg
+homerequiredeveninunsafemode = false ; YMotor_FPGAStepper.cfg
+homevelocitymmpersec = 10 ; MiSeq.cfg
+homingtimeoutms = 60000 ; YMotor_FPGAStepper.cfg
+magnetunderobjectivepositionmm = 0 ; YMotor_FPGAStepper.cfg
+maxaccelerationmmpersecsquared = 10 ; YMotor_FPGAStepper.cfg
+maxburnindutycycle = 50 ; YMotor_FPGAStepper.cfg
+maxflightrecordersamplesperread = 5 ; YMotor_FPGAStepper.cfg
+maxhomeattempts = 5 ; YMotor_FPGAStepper.cfg
+maxtolerancemm = 1 ; YMotor_FPGAStepper.cfg
+minaccelerationmmpersecsquared = 0.1 ; YMotor_FPGAStepper.cfg
+mintolerancemm = 0.001 ; YMotor_FPGAStepper.cfg
+movecurrentpercent = 100 ; YMotor_FPGAStepper.cfg
+numberoftilemovetables = 2 ; YMotor_FPGAStepper.cfg
+numretries = 2 ; YMotor_FPGAStepper.cfg
+openloopdeadzoneprofilecommand = YVPROF 3 ; YMotor_FPGAStepper.cfg
+openloopnoencoderprofilecommand = YVPROF 0 ; YMotor_FPGAStepper.cfg
+positionpollinginterval = 0 ; YMotor_FPGAStepper.cfg
+retractforchemistrydistancefrompositivesoftlimitmm = 0.2 ; YMotor_FPGAStepper.cfg
+reversedirection = false ; YMotor_FPGAStepper.cfg
+settlingtimems = 3000 ; YMotor_FPGAStepper.cfg
+shortmovevelocitymmpersec = 2 ; YMotor_FPGAStepper.cfg
+softlimitnegativemm = 0.0 ; YMotor_FPGAStepper.cfg
+softlimitpositivemm = 75.25507 ; MiSeqOverride.cfg
+softlimitsdefinedinconfigfile = true ; YMotor_FPGAStepper.cfg
+statuspollinginterval = 50 ; YMotor_FPGAStepper.cfg
+stepspermm = 1600 ; YMotor_FPGAStepper.cfg
+tablebasedmovesettlingtimems = 800 ; MiSeqOverride.cfg
+tablebasedmovesettlingtimems2 = 1100 ; YMotor_FPGAStepper.cfg
+tablebasedtilemovefilepath = Configs\Y Tile Move Tables\1693steps_J32e5_Shaped85Hz_times.txt ; YMotor_FPGAStepper.cfg
+tablebasedtilemovefilepath2 = Configs\Y Tile Move Tables\1328steps_J32e5_Shaped85Hz_times.txt ; YMotor_FPGAStepper.cfg
+tablebasedtilemovetolerancemm = 0.5 ; YMotor_FPGAStepper.cfg
+tablebasedtilemovetriggertolerancesteps = 3 ; YMotor_FPGAStepper.cfg
+tolerancemm = 0.01 ; YMotor_FPGAStepper.cfg
+uselimitsensors = false ; YMotor_FPGAStepper.cfg
+velocitycontrolunitspermm = 1600 ; YMotor_FPGAStepper.cfg
+velocitygranularitycontrolunitspersec = 1 ; YMotor_FPGAStepper.cfg
+velocitymmpersecond = 2 ; YMotor_FPGAStepper.cfg
+
+[instrument.zmotor_pi_300um]
+accelcontrolunitspermm2 = 1 ; ZMotor_PI_300um.cfg
+accelerationmmpersecsquared = 1 ; ZMotor_PI_300um.cfg
+adc_vmax = 12 ; ZMotor_PI_300um.cfg
+adc_vmin = -2 ; ZMotor_PI_300um.cfg
+adcdacvoltageerrorlimit = 1.00 ; ZMotor_PI_300um.cfg
+adcdacvoltagewarninglimit = 0.300 ; ZMotor_PI_300um.cfg
+adcnoiseerrorlimit = 3277 ; ZMotor_PI_300um.cfg
+adcnoisewarninglimit = 655 ; ZMotor_PI_300um.cfg
+applicationmaxvelocitymmpersec = 1 ; ZMotor_PI_300um.cfg
+applicationminvelocitymmpersec = 0 ; ZMotor_PI_300um.cfg
+backlashcorrectionmm = 0 ; ZMotor_PI_300um.cfg
+calibratedlinearitytesttolerancemm = 0.0001 ; ZMotor_PI_300um.cfg
+calibrationadcreads = 50 ; ZMotor_PI_300um.cfg
+calibrationsettlingtimems = 1500 ; ZMotor_PI_300um.cfg
+controllermaxvelocitycontrolunitspersec = 1 ; ZMotor_PI_300um.cfg
+controllerminvelocitycontrolunitspersec = 1 ; ZMotor_PI_300um.cfg
+cosmeticname = Z Motor ; ZMotor_PI_300um.cfg
+dac_calibrationv1 = 2 ; ZMotor_PI_300um.cfg
+dac_calibrationv2 = 8 ; ZMotor_PI_300um.cfg
+dac_vmax = 10 ; ZMotor_PI_300um.cfg
+dac_vmin = 0 ; ZMotor_PI_300um.cfg
+defaultmotortimeoutms = 60000 ; ZMotor_PI_300um.cfg
+extramotiontimeoutms = 0 ; ZMotor_PI_300um.cfg
+findsoftlimitsnumadcreads = 15 ; ZMotor_PI_300um.cfg
+findsoftlimitssettlingtimems = 500 ; ZMotor_PI_300um.cfg
+homerequiredeveninunsafemode = true ; ZMotor_PI_300um.cfg
+homingtimeoutms = 30000 ; ZMotor_PI_300um.cfg
+limitsactivehigh = false ; ZMotor_PI_300um.cfg
+linearitytestnumadcreads = 10 ; ZMotor_PI_300um.cfg
+linearitytestsettlingtimems = 600 ; ZMotor_PI_300um.cfg
+linearityteststepmm = 0.008 ; ZMotor_PI_300um.cfg
+logdatafromallmoves = false ; ZMotor_PI_300um.cfg
+logstacktraceofmoves = false ; ZMotor_PI_300um.cfg
+longmovedistanceum = 40 ; ZMotor_PI_300um.cfg
+longmovesettlingtimems = 500 ; ZMotor_PI_300um.cfg
+magnetunderobjectivepositionmm = 0 ; ZMotor_PI_300um.cfg
+marginum = 1 ; ZMotor_PI_300um.cfg
+maxaccelerationmmpersecsquared = 1 ; ZMotor_PI_300um.cfg
+maxactualpositionreadtimems = 150 ; ZMotor_PI_300um.cfg
+maxburnindutycycle = 50 ; ZMotor_PI_300um.cfg
+maxflightrecordersamplesperread = 5 ; ZMotor_PI_300um.cfg
+maxtolerancemm = 0.2999 ; ZMotor_PI_300um.cfg
+minaccelerationmmpersecsquared = 1 ; ZMotor_PI_300um.cfg
+minallowedsoftlimitspanum = 280 ; ZMotor_PI_300um.cfg
+mintolerancemm = 0.00001 ; ZMotor_PI_300um.cfg
+moveadcreads = 10 ; ZMotor_PI_300um.cfg
+moveyzlegacylogic = false ; ZMotor_PI_300um.cfg
+numretries = 10 ; ZMotor_PI_300um.cfg
+piezooverloadmarginvolts = 0.1 ; ZMotor_PI_300um.cfg
+positionpollinginterval = 0 ; ZMotor_PI_300um.cfg
+rangemmaccordingtopi = 0.300 ; ZMotor_PI_300um.cfg
+reversedirection = true ; ZMotor_PI_300um.cfg
+safenegativelimitmarginum = 5 ; ZMotor_PI_300um.cfg
+safenegativelimitstepum = 3 ; ZMotor_PI_300um.cfg
+safepositivelimitmarginum = 5 ; ZMotor_PI_300um.cfg
+safepositivelimitstepum = 3 ; ZMotor_PI_300um.cfg
+settlingtimems = 150 ; ZMotor_PI_300um.cfg
+softlimitnegativemm = -0.290 ; ZMotor_PI_300um.cfg
+softlimitpositivemm = -0.010 ; ZMotor_PI_300um.cfg
+softlimitsdefinedinconfigfile = false ; ZMotor_PI_300um.cfg
+statuspollinginterval = 50 ; ZMotor_PI_300um.cfg
+stepspermm = 163837.5 ; ZMotor_PI_300um.cfg
+tolerancemm = 0.004 ; ZMotor_PI_300um.cfg
+uncalibratedlinearitytesttolerancemm = 0.006 ; ZMotor_PI_300um.cfg
+useadcreadouts = true ; ZMotor_PI_300um.cfg
+usesoftlimitsfromcfg = false ; ZMotor_PI_300um.cfg
+usezmvduringhoming = false ; ZMotor_PI_300um.cfg
+velocitycontrolunitspermm = 1 ; ZMotor_PI_300um.cfg
+velocitygranularitycontrolunitspersec = 1 ; ZMotor_PI_300um.cfg
+velocitymmpersecond = 1 ; ZMotor_PI_300um.cfg
+
+[instrument.zmotor_pi_300um.settlingtimetest]
+endholdtimems = 1000 ; ZMotor_PI_300um.cfg
+finalpositionwindowms = 100 ; ZMotor_PI_300um.cfg
+flightrecordersampleperiodus = 1000 ; ZMotor_PI_300um.cfg
+hysteresisfactor = 0.8 ; ZMotor_PI_300um.cfg
+maxallowedrisetimems = 100 ; ZMotor_PI_300um.cfg
+maxallowedsettlingtimems = 150 ; ZMotor_PI_300um.cfg
+maxallowedtimebetweensamplesms = 30 ; ZMotor_PI_300um.cfg
+maxfinalerrorum = 0.1 ; ZMotor_PI_300um.cfg
+maxfinalpeaknoiseum = 10 ; ZMotor_PI_300um.cfg
+maxfinalstddeviationum = 1 ; ZMotor_PI_300um.cfg
+maxovershootum = 10 ; ZMotor_PI_300um.cfg
+maxtestattemptsforoksampledelays = 5 ; ZMotor_PI_300um.cfg
+minallowedrisetimems = 0 ; ZMotor_PI_300um.cfg
+numteststothrowout = 1 ; ZMotor_PI_300um.cfg
+overshootwindowms = 100 ; ZMotor_PI_300um.cfg
+preconditionatend = false ; ZMotor_PI_300um.cfg
+preconditionatendholdtimems = 1000 ; ZMotor_PI_300um.cfg
+settlingtoleranceplusminusum = 0.15 ; ZMotor_PI_300um.cfg
+settlingwindowms = 200 ; ZMotor_PI_300um.cfg
+startholdtimems = 1000 ; ZMotor_PI_300um.cfg
+startsamplingatexistingposition = false ; ZMotor_PI_300um.cfg
+startsamplingatexistingpositionholdtimems = 1000 ; ZMotor_PI_300um.cfg
+targetendum = -180 ; ZMotor_PI_300um.cfg
+targetstartum = -150 ; ZMotor_PI_300um.cfg
+usehysteresisfactor = true ; ZMotor_PI_300um.cfg
+
+[ledbar]
+blinkdacstepsize = 983 ; MiSeqPilot.cfg
+blinkratems = 255 ; StatusLights.cfg
+bluedac = 983 ; MiSeqPilot.cfg
+greendac = 983 ; MiSeqPilot.cfg
+maxbluedac = 983 ; MiSeqPilot.cfg
+maxgreendac = 983 ; MiSeqPilot.cfg
+maxyellowdac = 1638 ; MiSeqPilot.cfg
+yellowdac = 1638 ; MiSeqPilot.cfg
+
+[ledbars]
+ledbar = LEDBar ; StatusLights.cfg
+
+[lightbartesting]
+autodisplaydelayms = 3000 ; MiSeqCommon.cfg
+
+[mettlertoledo]
+baudrate = 9600 ; Fluidics.cfg
+comportname = COM2 ; Fluidics.cfg
+cosmeticname = Balance ; Fluidics.cfg
+flushandwarn = false ; Fluidics.cfg
+handshake = None ; Fluidics.cfg
+simulated = true ; Fluidics.cfg
+
+[miseqsoftware]
+initialcompensatorposition = IntoPath ; MiSeqSoftware.Hardware.cfg
+maxlogfilesize = 5000000 ; MiSeqSoftware.Hardware.cfg
+maxnumlogfiles = 30 ; MiSeqSoftware.Hardware.cfg
+
+[multiimageprocessor]
+enabled = false ; MiSeqCommon.cfg
+tilescongfigstring = 0-0.001-2:1-0.001-2:2-0.001-2 ; MiSeqCommon.cfg
+
+[per tile focus params]
+tile10deltaz = 0 ; MiSeqCommon.cfg
+tile11deltaz = 0 ; MiSeqCommon.cfg
+tile12deltaz = 0 ; MiSeqCommon.cfg
+tile1deltaz = 0 ; MiSeqCommon.cfg
+tile2deltaz = 0 ; MiSeqCommon.cfg
+tile3deltaz = 0 ; MiSeqCommon.cfg
+tile4deltaz = 0 ; MiSeqCommon.cfg
+tile5deltaz = 0 ; MiSeqCommon.cfg
+tile6deltaz = 0 ; MiSeqCommon.cfg
+tile7deltaz = 0 ; MiSeqCommon.cfg
+tile8deltaz = 0 ; MiSeqCommon.cfg
+tile9deltaz = 0 ; MiSeqCommon.cfg
+
+[pr2rfidsensor] ; Sensors.cfg
+
+[predictive ydrift settings]
+camerapixelsizeinmicrons = 5.49 ; MiSeqCommon.cfg
+numcyclebeforeanalysis = 10 ; MiSeqCommon.cfg
+numcyclesanalyze = 5 ; MiSeqCommon.cfg
+opticalmagnification = 16.25 ; MiSeqCommon.cfg
+
+[reagentrfidsensor] ; Sensors.cfg
+
+[reagenttraypresentsensor] ; Sensors.cfg
+
+[rfid]
+allowedblockreaderrorratepercent = 1.0 ; Sensors.cfg
+flowcellcartridgerfidsensor = FlowcellCartridgeRFIDSensor ; Sensors.cfg
+functionaltestnumretries = 2 ; Sensors.cfg
+functionaltestrepeats = 10 ; Sensors.cfg
+functionaltestrepeatwritemode = false ; Sensors.cfg
+functionalteststopiferror = true ; Sensors.cfg
+pr2rfidsensor = PR2RFIDSensor ; Sensors.cfg
+readblocknumretries = 20 ; Sensors.cfg
+readuidhardwaretimeoutms = 1000 ; Sensors.cfg
+readuidnumretries = 8 ; Sensors.cfg
+reagentrfidsensor = ReagentRFIDSensor ; Sensors.cfg
+writeblocknumretries = 30 ; Sensors.cfg
+
+[rfid.tagtype.4]
+lockblockhardwaretimeoutms = 5000 ; Sensors.cfg
+maxsupportedblocknumber = 27 ; Sensors.cfg
+minsupportedblocknumber = 0 ; Sensors.cfg
+optionflag = 0 ; Sensors.cfg
+readblockhardwaretimeoutms = 5000 ; Sensors.cfg
+readuidhardwaretimeoutms = 5000 ; Sensors.cfg
+tagtypename = NXP ; Sensors.cfg
+writeblockhardwaretimeoutms = 5000 ; Sensors.cfg
+
+[rfid.tagtype.7]
+lockblockhardwaretimeoutms = 5000 ; Sensors.cfg
+maxsupportedblocknumber = 63 ; Sensors.cfg
+minsupportedblocknumber = 0 ; Sensors.cfg
+optionflag = 1 ; Sensors.cfg
+readblockhardwaretimeoutms = 5000 ; Sensors.cfg
+readuidhardwaretimeoutms = 5000 ; Sensors.cfg
+tagtypename = TI ; Sensors.cfg
+writeblockhardwaretimeoutms = 5000 ; Sensors.cfg
+
+[rheodyneselectorvalve] ; Fluidics.cfg
+
+[sampledooropensensor] ; Sensors.cfg
+
+[sensors]
+chillerdooropensensor = ChillerDoorOpenSensor ; Sensors.cfg
+flowcellclampclosedsensor = FlowcellClampClosedSensor ; Sensors.cfg
+reagenttraypresentsensor = ReagentTrayPresentSensor ; Sensors.cfg
+rfid = RFID ; Sensors.cfg
+sampledooropensensor = SampleDoorOpenSensor ; Sensors.cfg
+wasteandpr2sipperdownsensor = WasteAndPR2SipperDownSensor ; Sensors.cfg
+wastebottlefullsensor = WasteBottleFullSensor ; Sensors.cfg
+wastebottleinstalledsensor = WasteBottleInstalledSensor ; Sensors.cfg
+
+[sequencing channel a]
+cameraintegrationtimems = 200 ; MiSeqCommon.cfg
+flipimagehorizontally = true ; MiSeqCommon.cfg
+index = 0 ; MiSeqCommon.cfg
+ledpath = 0 ; MiSeqCommon.cfg
+ledpower = 100 ; MiSeqCommon.cfg
+sensorpath = 1 ; MiSeqCommon.cfg
+
+[sequencing channel c]
+cameraintegrationtimems = 200 ; MiSeqCommon.cfg
+flipimagehorizontally = false ; MiSeqCommon.cfg
+index = 3 ; MiSeqCommon.cfg
+ledpath = 0 ; MiSeqCommon.cfg
+ledpower = 100 ; MiSeqCommon.cfg
+sensorpath = 0 ; MiSeqCommon.cfg
+
+[sequencing channel focus a]
+cameraintegrationtimems = 200 ; MiSeqCommon.cfg
+flipimagehorizontally = true ; MiSeqCommon.cfg
+index = 0 ; MiSeqCommon.cfg
+ledpath = 0 ; MiSeqCommon.cfg
+ledpower = 100 ; MiSeqCommon.cfg
+sensorpath = 1 ; MiSeqCommon.cfg
+
+[sequencing channel focus c]
+cameraintegrationtimems = 450 ; MiSeqCommon.cfg
+index = 3 ; MiSeqCommon.cfg
+ledpath = 0 ; MiSeqCommon.cfg
+ledpower = 100 ; MiSeqCommon.cfg
+sensorpath = 0 ; MiSeqCommon.cfg
+
+[sequencing channel focus g]
+cameraintegrationtimems = 200 ; MiSeqCommon.cfg
+flipimagehorizontally = true ; MiSeqCommon.cfg
+index = 1 ; MiSeqCommon.cfg
+ledpath = 1 ; MiSeqCommon.cfg
+ledpower = 100 ; MiSeqCommon.cfg
+sensorpath = 1 ; MiSeqCommon.cfg
+
+[sequencing channel focus t]
+cameraintegrationtimems = 200 ; MiSeqCommon.cfg
+index = 2 ; MiSeqCommon.cfg
+ledpath = 1 ; MiSeqCommon.cfg
+ledpower = 100 ; MiSeqCommon.cfg
+sensorpath = 0 ; MiSeqCommon.cfg
+
+[sequencing channel g]
+cameraintegrationtimems = 200 ; MiSeqCommon.cfg
+flipimagehorizontally = true ; MiSeqCommon.cfg
+index = 1 ; MiSeqCommon.cfg
+ledpath = 1 ; MiSeqCommon.cfg
+ledpower = 100 ; MiSeqCommon.cfg
+sensorpath = 1 ; MiSeqCommon.cfg
+
+[sequencing channel t]
+cameraintegrationtimems = 200 ; MiSeqCommon.cfg
+flipimagehorizontally = false ; MiSeqCommon.cfg
+index = 2 ; MiSeqCommon.cfg
+ledpath = 1 ; MiSeqCommon.cfg
+ledpower = 100 ; MiSeqCommon.cfg
+sensorpath = 0 ; MiSeqCommon.cfg
+
+[sequencing channels]
+channel1 = A ; MiSeqCommon.cfg
+channel2 = G ; MiSeqCommon.cfg
+channel3 = T ; MiSeqCommon.cfg
+channel4 = C ; MiSeqCommon.cfg
+
+[stagesafety]
+unsafemovesallowed = false ; MiSeqCommon.cfg
+
+[statuslights]
+ledbars = LEDBars ; StatusLights.cfg
+
+[system]
+cloudservice = Illumina BaseSpace Broker ; MiSeqCommon.cfg
+defaultflowcell = MiSeq14Tiles ; ShockProto.cfg
+defaulttimeoutms = 60000 ; MiSeqCommon.cfg
+diagnosticsfolder = D:\DiagResults ; MiSeqCommon.cfg
+fastsimulation = true ; MiSeqCommon.cfg
+firsttimesetupfile = D:\MiSeqFirstTimeSetup.xml ; MiSeqCommon.cfg
+fpgaflashdefaultfolder = D:\ ; MiSeqCommon.cfg
+initializeallinserial = false ; MiSeqCommon.cfg
+instrumenttype = Shock ; MiSeqOverride.cfg
+logsleepbetweenmax = 700 ; MiSeqCommon.cfg
+logsleepbetweenmin = 150 ; MiSeqCommon.cfg
+logsleepmaxdepth = 10 ; MiSeqCommon.cfg
+logsleepmode = LogIfTooLong ; MiSeqCommon.cfg
+logsleeptoolongmargin = 1000 ; MiSeqCommon.cfg
+maintenancelogsfolder = D:\Illumina Maintenance Logs ; MiSeqCommon.cfg
+name = M02069 ; MiSeqOverride.cfg
+priorityclass = High ; MiSeqCommon.cfg
+reportdevicesections = true ; MiSeqCommon.cfg
+reporterservice = MiSeqReporter ; MiSeqCommon.cfg
+scancounterfile = D:\ScanCounter.txt ; MiSeqCommon.cfg
+serverconfigbackupenabled = true ; MiSeqCommon.cfg
+serverconfigbackuprootfolder = D:\Illumina Maintenance Logs\OverrideBackups ; MiSeqCommon.cfg
+showsplashscreen = true ; MiSeqCommon.cfg
+traceiffnotsimulated = false ; MiSeqCommon.cfg
+
+[system measurements]
+actualedgeofslide = 56.08547 ; MiSeqOverride.cfg
+ystagehometoedgeofslide = 52.68547 ; MiSeqOverride.cfg
+
+[thermalsettlingtest]
+firsttargettemperature = 16 ; MiSeqCommon.cfg
+fourthtargettemperature = 96 ; MiSeqCommon.cfg
+secondtargettemperature = 65 ; MiSeqCommon.cfg
+thirdtargettemperature = 16 ; MiSeqCommon.cfg
+
+[user_notification]
+level = 1 ; MiSeqCommon.cfg
+type = Warning ; MiSeqCommon.cfg
+
+[viciselectorvalve]
+firmwaremodelvalidprefix1 = I-PD-AMHX ; Fluidics.cfg
+firmwaremodelvalidprefix2 = I-PD-AMTX ; Fluidics.cfg
+
+[wasteandpr2sipperdownsensor] ; Sensors.cfg
+
+[wastebottlefullsensor] ; Sensors.cfg
+
+[wastebottleinstalledsensor] ; Sensors.cfg
diff --git a/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Config/MiSeqOverride.cfg b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Config/MiSeqOverride.cfg
new file mode 100755
index 0000000..83c650b
--- /dev/null
+++ b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Config/MiSeqOverride.cfg
@@ -0,0 +1,99 @@
+;Override Version 1.0.10_Shock
+
+[_FileInfo]
+OverrideVersion = 1.0.10_Shock 5/24/2012 5:15 PM
+
+[system]
+Name = M02069; *********** System Specific - Entered by OP400 (also stored in NVRAM) ************
+InstrumentType = Shock
+
+[System Measurements]
+YStageHomeToEdgeOfSlide = 52.68547 ;update by OP600 on 5/17/2013 15034365 rev B
+actualedgeofslide = 56.08547 ;update by OP600 on 5/17/2013 15034365 rev B
+
+[Focus Params]
+ZOffsetToFocusLED = -0.000746 ;update by OP600 on 5/20/2013 by Dong Diep
+FocusMirrorZOffset = -0.007 ;update by OP600 on 5/20/2013 by Dong Diep
+coarsefocuscenterz = -0.17759 ;update by OP600 on 5/20/2013 by Dong Diep
+throughfocuscenterz = -0.17759 ;update by OP600 on 5/20/2013 by Dong Diep
+tiltuntiltfocuscenterz = -0.17759 ;update by OP600 on 5/20/2013 by Dong Diep
+skipautofocusmaxzcorrection = 0.0005 ; Only for Shock
+skipautofocusnoskipcycles = 5 ; Only for Shock
+skipautofocusntiles = 4 ; Only for Shock
+
+[Instrument.ExcitationLED1]
+NumCalibrationPoints = 6
+CalibrationDriveCurrentMa1 = 750
+CalibrationDriveCurrentMa2 = 1000
+CalibrationDriveCurrentMa3 = 1250
+CalibrationDriveCurrentMa4 = 1500
+CalibrationDriveCurrentMa5 = 1750
+CalibrationDriveCurrentMa6 = 2000
+
+CalibrationPhotodiodeADC1 = 7595
+CalibrationPhotodiodeADC2 = 10359
+CalibrationPhotodiodeADC3 = 13214
+CalibrationPhotodiodeADC4 = 15945
+CalibrationPhotodiodeADC5 = 18558
+CalibrationPhotodiodeADC6 = 21189
+
+CalibrationPowerMeterMw1 = 90.84
+CalibrationPowerMeterMw2 = 122.8
+CalibrationPowerMeterMw3 = 150.1
+CalibrationPowerMeterMw4 = 170.2
+CalibrationPowerMeterMw5 = 181.3
+CalibrationPowerMeterMw6 = 185.3
+
+
+
+
+
+[Instrument.ExcitationLED2]
+NumCalibrationPoints = 6
+CalibrationDriveCurrentMa1 = 2000
+CalibrationDriveCurrentMa2 = 3000
+CalibrationDriveCurrentMa3 = 4000
+CalibrationDriveCurrentMa4 = 5000
+CalibrationDriveCurrentMa5 = 6000
+CalibrationDriveCurrentMa6 = 7000
+
+CalibrationPhotodiodeADC1 = 921
+CalibrationPhotodiodeADC2 = 1249
+CalibrationPhotodiodeADC3 = 1544
+CalibrationPhotodiodeADC4 = 1815
+CalibrationPhotodiodeADC5 = 2071
+CalibrationPhotodiodeADC6 = 2307
+
+CalibrationPowerMeterMw1 = 78.39
+CalibrationPowerMeterMw2 = 105.7
+CalibrationPowerMeterMw3 = 128.6
+CalibrationPowerMeterMw4 = 148.3
+CalibrationPowerMeterMw5 = 165.5
+CalibrationPowerMeterMw6 = 180.4
+
+
+
+
+[Instrument.Fluidics.FlowcellFluidics1.FlowCellTemperatureController]
+CalibrationLowTarget = 16
+CalibrationLowMeasured = 16.7
+CalibrationHighTarget = 96
+CalibrationHighMeasured = 91.4
+
+
+[Instrument.SipperMotor]
+CurrentPercent = 70 ; *********** System Specific in some cases ************
+
+[Instrument.YMotor_FPGAStepper]
+SoftLimitPositiveMm = 75.25507 ;update by OP600 on 5/17/2013 15034365 rev B
+tablebasedmovesettlingtimems = 800; 800 for 12mm Z stage ; 1400 for 6mm Z stage *********** System Specific (but all new systems use this value) ***********
+
+
+[Instrument.Fluidics.FlowCellFluidics1]
+;Simulated = true ; Set "simulated = true" for a mock run.
+
+
+
+
+[Instrument.Fluidics.FlowCellFluidics1.FlowSensor]
+LastCalibrated=5/16/2013 9:47:30 AM
diff --git a/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Config/RTAStart.bat b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Config/RTAStart.bat
new file mode 100755
index 0000000..6af3a80
--- /dev/null
+++ b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Config/RTAStart.bat
@@ -0,0 +1,3 @@
+title RTA 1.18.54 - D:\Illumina\MiSeqTemp\140624_MS6_13349_A_MS2639979-300V2
+pushd "C:\Illumina\RTA"
+"C:\Illumina\RTA\RTA.exe" "D:\Illumina\MiSeqTemp\140624_MS6_13349_A_MS2639979-300V2\Images " "Y:\ILorHSorMS_sf49\incoming " Read=All ControlLane=0 Threads=2 CopyIntensityFilesToNetwork=1 instrumentType=miseq
\ No newline at end of file
diff --git a/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/ImageSize.dat b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/ImageSize.dat
new file mode 100755
index 0000000..13b6b61
Binary files /dev/null and b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/ImageSize.dat differ
diff --git a/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C1.1/s_1_1101.bcl b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C1.1/s_1_1101.bcl
new file mode 100644
index 0000000..afb4459
Binary files /dev/null and b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C1.1/s_1_1101.bcl differ
diff --git a/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C10.1/s_1_1101.bcl b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C10.1/s_1_1101.bcl
new file mode 100644
index 0000000..6ff54a1
Binary files /dev/null and b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C10.1/s_1_1101.bcl differ
diff --git a/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C100.1/s_1_1101.bcl b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C100.1/s_1_1101.bcl
new file mode 100644
index 0000000..c84528c
Binary files /dev/null and b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C100.1/s_1_1101.bcl differ
diff --git a/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C101.1/s_1_1101.bcl b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C101.1/s_1_1101.bcl
new file mode 100644
index 0000000..2addd37
Binary files /dev/null and b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C101.1/s_1_1101.bcl differ
diff --git a/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C102.1/s_1_1101.bcl b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C102.1/s_1_1101.bcl
new file mode 100644
index 0000000..5588553
Binary files /dev/null and b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C102.1/s_1_1101.bcl differ
diff --git a/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C103.1/s_1_1101.bcl b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C103.1/s_1_1101.bcl
new file mode 100644
index 0000000..211c775
Binary files /dev/null and b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C103.1/s_1_1101.bcl differ
diff --git a/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C104.1/s_1_1101.bcl b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C104.1/s_1_1101.bcl
new file mode 100644
index 0000000..bc37e1e
Binary files /dev/null and b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C104.1/s_1_1101.bcl differ
diff --git a/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C105.1/s_1_1101.bcl b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C105.1/s_1_1101.bcl
new file mode 100644
index 0000000..85d2a02
Binary files /dev/null and b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C105.1/s_1_1101.bcl differ
diff --git a/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C106.1/s_1_1101.bcl b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C106.1/s_1_1101.bcl
new file mode 100644
index 0000000..a4f4a74
Binary files /dev/null and b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C106.1/s_1_1101.bcl differ
diff --git a/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C107.1/s_1_1101.bcl b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C107.1/s_1_1101.bcl
new file mode 100644
index 0000000..ea96b1c
Binary files /dev/null and b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C107.1/s_1_1101.bcl differ
diff --git a/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C108.1/s_1_1101.bcl b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C108.1/s_1_1101.bcl
new file mode 100644
index 0000000..fa41861
Binary files /dev/null and b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C108.1/s_1_1101.bcl differ
diff --git a/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C109.1/s_1_1101.bcl b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C109.1/s_1_1101.bcl
new file mode 100644
index 0000000..523cc1f
Binary files /dev/null and b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C109.1/s_1_1101.bcl differ
diff --git a/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C11.1/s_1_1101.bcl b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C11.1/s_1_1101.bcl
new file mode 100644
index 0000000..b11622a
Binary files /dev/null and b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C11.1/s_1_1101.bcl differ
diff --git a/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C110.1/s_1_1101.bcl b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C110.1/s_1_1101.bcl
new file mode 100644
index 0000000..b685488
Binary files /dev/null and b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C110.1/s_1_1101.bcl differ
diff --git a/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C111.1/s_1_1101.bcl b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C111.1/s_1_1101.bcl
new file mode 100644
index 0000000..d9d8fb9
Binary files /dev/null and b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C111.1/s_1_1101.bcl differ
diff --git a/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C112.1/s_1_1101.bcl b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C112.1/s_1_1101.bcl
new file mode 100644
index 0000000..ca5e16a
Binary files /dev/null and b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C112.1/s_1_1101.bcl differ
diff --git a/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C113.1/s_1_1101.bcl b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C113.1/s_1_1101.bcl
new file mode 100644
index 0000000..5d68565
Binary files /dev/null and b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C113.1/s_1_1101.bcl differ
diff --git a/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C114.1/s_1_1101.bcl b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C114.1/s_1_1101.bcl
new file mode 100644
index 0000000..53d4d0d
Binary files /dev/null and b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C114.1/s_1_1101.bcl differ
diff --git a/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C115.1/s_1_1101.bcl b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C115.1/s_1_1101.bcl
new file mode 100644
index 0000000..196e6b7
Binary files /dev/null and b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C115.1/s_1_1101.bcl differ
diff --git a/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C116.1/s_1_1101.bcl b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C116.1/s_1_1101.bcl
new file mode 100644
index 0000000..0807b5e
Binary files /dev/null and b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C116.1/s_1_1101.bcl differ
diff --git a/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C117.1/s_1_1101.bcl b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C117.1/s_1_1101.bcl
new file mode 100644
index 0000000..1d8450f
Binary files /dev/null and b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C117.1/s_1_1101.bcl differ
diff --git a/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C118.1/s_1_1101.bcl b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C118.1/s_1_1101.bcl
new file mode 100644
index 0000000..cc904ea
Binary files /dev/null and b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C118.1/s_1_1101.bcl differ
diff --git a/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C119.1/s_1_1101.bcl b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C119.1/s_1_1101.bcl
new file mode 100644
index 0000000..cd3a633
Binary files /dev/null and b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C119.1/s_1_1101.bcl differ
diff --git a/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C12.1/s_1_1101.bcl b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C12.1/s_1_1101.bcl
new file mode 100644
index 0000000..1139c0f
Binary files /dev/null and b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C12.1/s_1_1101.bcl differ
diff --git a/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C120.1/s_1_1101.bcl b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C120.1/s_1_1101.bcl
new file mode 100644
index 0000000..9c3d397
Binary files /dev/null and b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C120.1/s_1_1101.bcl differ
diff --git a/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C121.1/s_1_1101.bcl b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C121.1/s_1_1101.bcl
new file mode 100644
index 0000000..55b9cd9
Binary files /dev/null and b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C121.1/s_1_1101.bcl differ
diff --git a/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C122.1/s_1_1101.bcl b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C122.1/s_1_1101.bcl
new file mode 100644
index 0000000..afc36b9
Binary files /dev/null and b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C122.1/s_1_1101.bcl differ
diff --git a/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C123.1/s_1_1101.bcl b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C123.1/s_1_1101.bcl
new file mode 100644
index 0000000..f76ec31
Binary files /dev/null and b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C123.1/s_1_1101.bcl differ
diff --git a/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C124.1/s_1_1101.bcl b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C124.1/s_1_1101.bcl
new file mode 100644
index 0000000..b5366b0
Binary files /dev/null and b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C124.1/s_1_1101.bcl differ
diff --git a/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C125.1/s_1_1101.bcl b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C125.1/s_1_1101.bcl
new file mode 100644
index 0000000..bec2b53
Binary files /dev/null and b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C125.1/s_1_1101.bcl differ
diff --git a/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C126.1/s_1_1101.bcl b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C126.1/s_1_1101.bcl
new file mode 100644
index 0000000..30e364c
Binary files /dev/null and b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C126.1/s_1_1101.bcl differ
diff --git a/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C127.1/s_1_1101.bcl b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C127.1/s_1_1101.bcl
new file mode 100644
index 0000000..905f050
Binary files /dev/null and b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C127.1/s_1_1101.bcl differ
diff --git a/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C128.1/s_1_1101.bcl b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C128.1/s_1_1101.bcl
new file mode 100644
index 0000000..80fefe1
Binary files /dev/null and b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C128.1/s_1_1101.bcl differ
diff --git a/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C129.1/s_1_1101.bcl b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C129.1/s_1_1101.bcl
new file mode 100644
index 0000000..b4ba42a
Binary files /dev/null and b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C129.1/s_1_1101.bcl differ
diff --git a/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C13.1/s_1_1101.bcl b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C13.1/s_1_1101.bcl
new file mode 100644
index 0000000..7f5e0f8
Binary files /dev/null and b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C13.1/s_1_1101.bcl differ
diff --git a/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C130.1/s_1_1101.bcl b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C130.1/s_1_1101.bcl
new file mode 100644
index 0000000..e026945
Binary files /dev/null and b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C130.1/s_1_1101.bcl differ
diff --git a/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C131.1/s_1_1101.bcl b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C131.1/s_1_1101.bcl
new file mode 100644
index 0000000..793b28f
Binary files /dev/null and b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C131.1/s_1_1101.bcl differ
diff --git a/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C132.1/s_1_1101.bcl b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C132.1/s_1_1101.bcl
new file mode 100644
index 0000000..244e5c3
Binary files /dev/null and b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C132.1/s_1_1101.bcl differ
diff --git a/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C133.1/s_1_1101.bcl b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C133.1/s_1_1101.bcl
new file mode 100644
index 0000000..cb32a27
Binary files /dev/null and b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C133.1/s_1_1101.bcl differ
diff --git a/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C134.1/s_1_1101.bcl b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C134.1/s_1_1101.bcl
new file mode 100644
index 0000000..47abe53
Binary files /dev/null and b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C134.1/s_1_1101.bcl differ
diff --git a/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C135.1/s_1_1101.bcl b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C135.1/s_1_1101.bcl
new file mode 100644
index 0000000..d3c9030
Binary files /dev/null and b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C135.1/s_1_1101.bcl differ
diff --git a/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C136.1/s_1_1101.bcl b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C136.1/s_1_1101.bcl
new file mode 100644
index 0000000..d1dadea
Binary files /dev/null and b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C136.1/s_1_1101.bcl differ
diff --git a/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C137.1/s_1_1101.bcl b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C137.1/s_1_1101.bcl
new file mode 100644
index 0000000..998107f
Binary files /dev/null and b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C137.1/s_1_1101.bcl differ
diff --git a/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C138.1/s_1_1101.bcl b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C138.1/s_1_1101.bcl
new file mode 100644
index 0000000..ed64201
Binary files /dev/null and b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C138.1/s_1_1101.bcl differ
diff --git a/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C139.1/s_1_1101.bcl b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C139.1/s_1_1101.bcl
new file mode 100644
index 0000000..011e46b
Binary files /dev/null and b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C139.1/s_1_1101.bcl differ
diff --git a/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C14.1/s_1_1101.bcl b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C14.1/s_1_1101.bcl
new file mode 100644
index 0000000..9fc7472
Binary files /dev/null and b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C14.1/s_1_1101.bcl differ
diff --git a/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C140.1/s_1_1101.bcl b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C140.1/s_1_1101.bcl
new file mode 100644
index 0000000..ed73ae4
Binary files /dev/null and b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C140.1/s_1_1101.bcl differ
diff --git a/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C141.1/s_1_1101.bcl b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C141.1/s_1_1101.bcl
new file mode 100644
index 0000000..80dc86f
Binary files /dev/null and b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C141.1/s_1_1101.bcl differ
diff --git a/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C142.1/s_1_1101.bcl b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C142.1/s_1_1101.bcl
new file mode 100644
index 0000000..3bbfccf
Binary files /dev/null and b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C142.1/s_1_1101.bcl differ
diff --git a/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C143.1/s_1_1101.bcl b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C143.1/s_1_1101.bcl
new file mode 100644
index 0000000..7cc4bba
Binary files /dev/null and b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C143.1/s_1_1101.bcl differ
diff --git a/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C144.1/s_1_1101.bcl b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C144.1/s_1_1101.bcl
new file mode 100644
index 0000000..b5422ad
Binary files /dev/null and b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C144.1/s_1_1101.bcl differ
diff --git a/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C145.1/s_1_1101.bcl b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C145.1/s_1_1101.bcl
new file mode 100644
index 0000000..976f53b
Binary files /dev/null and b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C145.1/s_1_1101.bcl differ
diff --git a/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C146.1/s_1_1101.bcl b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C146.1/s_1_1101.bcl
new file mode 100644
index 0000000..0a8c87d
Binary files /dev/null and b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C146.1/s_1_1101.bcl differ
diff --git a/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C147.1/s_1_1101.bcl b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C147.1/s_1_1101.bcl
new file mode 100644
index 0000000..05830b9
Binary files /dev/null and b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C147.1/s_1_1101.bcl differ
diff --git a/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C148.1/s_1_1101.bcl b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C148.1/s_1_1101.bcl
new file mode 100644
index 0000000..cc2df1e
Binary files /dev/null and b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C148.1/s_1_1101.bcl differ
diff --git a/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C149.1/s_1_1101.bcl b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C149.1/s_1_1101.bcl
new file mode 100644
index 0000000..f732975
Binary files /dev/null and b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C149.1/s_1_1101.bcl differ
diff --git a/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C15.1/s_1_1101.bcl b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C15.1/s_1_1101.bcl
new file mode 100644
index 0000000..d116f5e
Binary files /dev/null and b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C15.1/s_1_1101.bcl differ
diff --git a/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C150.1/s_1_1101.bcl b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C150.1/s_1_1101.bcl
new file mode 100644
index 0000000..2d4f483
Binary files /dev/null and b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C150.1/s_1_1101.bcl differ
diff --git a/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C151.1/s_1_1101.bcl b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C151.1/s_1_1101.bcl
new file mode 100644
index 0000000..9ad1c66
Binary files /dev/null and b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C151.1/s_1_1101.bcl differ
diff --git a/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C152.1/s_1_1101.bcl b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C152.1/s_1_1101.bcl
new file mode 100644
index 0000000..76a90a1
Binary files /dev/null and b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C152.1/s_1_1101.bcl differ
diff --git a/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C153.1/s_1_1101.bcl b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C153.1/s_1_1101.bcl
new file mode 100644
index 0000000..8147b84
Binary files /dev/null and b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C153.1/s_1_1101.bcl differ
diff --git a/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C154.1/s_1_1101.bcl b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C154.1/s_1_1101.bcl
new file mode 100644
index 0000000..122eb0b
Binary files /dev/null and b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C154.1/s_1_1101.bcl differ
diff --git a/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C155.1/s_1_1101.bcl b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C155.1/s_1_1101.bcl
new file mode 100644
index 0000000..a841d11
Binary files /dev/null and b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C155.1/s_1_1101.bcl differ
diff --git a/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C156.1/s_1_1101.bcl b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C156.1/s_1_1101.bcl
new file mode 100644
index 0000000..d4208e1
Binary files /dev/null and b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C156.1/s_1_1101.bcl differ
diff --git a/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C157.1/s_1_1101.bcl b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C157.1/s_1_1101.bcl
new file mode 100644
index 0000000..37fb0d5
Binary files /dev/null and b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C157.1/s_1_1101.bcl differ
diff --git a/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C158.1/s_1_1101.bcl b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C158.1/s_1_1101.bcl
new file mode 100644
index 0000000..4100f66
Binary files /dev/null and b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C158.1/s_1_1101.bcl differ
diff --git a/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C159.1/s_1_1101.bcl b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C159.1/s_1_1101.bcl
new file mode 100644
index 0000000..7c5e820
Binary files /dev/null and b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C159.1/s_1_1101.bcl differ
diff --git a/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C16.1/s_1_1101.bcl b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C16.1/s_1_1101.bcl
new file mode 100644
index 0000000..d107aa2
Binary files /dev/null and b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C16.1/s_1_1101.bcl differ
diff --git a/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C160.1/s_1_1101.bcl b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C160.1/s_1_1101.bcl
new file mode 100644
index 0000000..63c2904
Binary files /dev/null and b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C160.1/s_1_1101.bcl differ
diff --git a/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C161.1/s_1_1101.bcl b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C161.1/s_1_1101.bcl
new file mode 100644
index 0000000..52db87c
Binary files /dev/null and b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C161.1/s_1_1101.bcl differ
diff --git a/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C162.1/s_1_1101.bcl b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C162.1/s_1_1101.bcl
new file mode 100644
index 0000000..0374963
Binary files /dev/null and b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C162.1/s_1_1101.bcl differ
diff --git a/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C163.1/s_1_1101.bcl b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C163.1/s_1_1101.bcl
new file mode 100644
index 0000000..e0ec853
Binary files /dev/null and b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C163.1/s_1_1101.bcl differ
diff --git a/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C164.1/s_1_1101.bcl b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C164.1/s_1_1101.bcl
new file mode 100644
index 0000000..c63e844
Binary files /dev/null and b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C164.1/s_1_1101.bcl differ
diff --git a/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C165.1/s_1_1101.bcl b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C165.1/s_1_1101.bcl
new file mode 100644
index 0000000..a0dc39d
Binary files /dev/null and b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C165.1/s_1_1101.bcl differ
diff --git a/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C166.1/s_1_1101.bcl b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C166.1/s_1_1101.bcl
new file mode 100644
index 0000000..e16922b
Binary files /dev/null and b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C166.1/s_1_1101.bcl differ
diff --git a/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C167.1/s_1_1101.bcl b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C167.1/s_1_1101.bcl
new file mode 100644
index 0000000..b604ba2
Binary files /dev/null and b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C167.1/s_1_1101.bcl differ
diff --git a/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C168.1/s_1_1101.bcl b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C168.1/s_1_1101.bcl
new file mode 100644
index 0000000..3c003be
Binary files /dev/null and b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C168.1/s_1_1101.bcl differ
diff --git a/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C169.1/s_1_1101.bcl b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C169.1/s_1_1101.bcl
new file mode 100644
index 0000000..cb546e3
Binary files /dev/null and b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C169.1/s_1_1101.bcl differ
diff --git a/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C17.1/s_1_1101.bcl b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C17.1/s_1_1101.bcl
new file mode 100644
index 0000000..bcc1989
Binary files /dev/null and b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C17.1/s_1_1101.bcl differ
diff --git a/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C170.1/s_1_1101.bcl b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C170.1/s_1_1101.bcl
new file mode 100644
index 0000000..716047d
Binary files /dev/null and b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C170.1/s_1_1101.bcl differ
diff --git a/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C18.1/s_1_1101.bcl b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C18.1/s_1_1101.bcl
new file mode 100644
index 0000000..cf44336
Binary files /dev/null and b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C18.1/s_1_1101.bcl differ
diff --git a/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C19.1/s_1_1101.bcl b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C19.1/s_1_1101.bcl
new file mode 100644
index 0000000..c210d79
Binary files /dev/null and b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C19.1/s_1_1101.bcl differ
diff --git a/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C2.1/s_1_1101.bcl b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C2.1/s_1_1101.bcl
new file mode 100644
index 0000000..30f7a5b
Binary files /dev/null and b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C2.1/s_1_1101.bcl differ
diff --git a/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C20.1/s_1_1101.bcl b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C20.1/s_1_1101.bcl
new file mode 100644
index 0000000..053d3a8
Binary files /dev/null and b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C20.1/s_1_1101.bcl differ
diff --git a/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C21.1/s_1_1101.bcl b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C21.1/s_1_1101.bcl
new file mode 100644
index 0000000..3263fa4
Binary files /dev/null and b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C21.1/s_1_1101.bcl differ
diff --git a/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C22.1/s_1_1101.bcl b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C22.1/s_1_1101.bcl
new file mode 100644
index 0000000..cec6290
Binary files /dev/null and b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C22.1/s_1_1101.bcl differ
diff --git a/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C23.1/s_1_1101.bcl b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C23.1/s_1_1101.bcl
new file mode 100644
index 0000000..552b03c
Binary files /dev/null and b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C23.1/s_1_1101.bcl differ
diff --git a/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C24.1/s_1_1101.bcl b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C24.1/s_1_1101.bcl
new file mode 100644
index 0000000..87ac44f
Binary files /dev/null and b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C24.1/s_1_1101.bcl differ
diff --git a/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C25.1/s_1_1101.bcl b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C25.1/s_1_1101.bcl
new file mode 100644
index 0000000..9d5a78a
Binary files /dev/null and b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C25.1/s_1_1101.bcl differ
diff --git a/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C26.1/s_1_1101.bcl b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C26.1/s_1_1101.bcl
new file mode 100644
index 0000000..29a99cf
Binary files /dev/null and b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C26.1/s_1_1101.bcl differ
diff --git a/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C27.1/s_1_1101.bcl b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C27.1/s_1_1101.bcl
new file mode 100644
index 0000000..aea857f
Binary files /dev/null and b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C27.1/s_1_1101.bcl differ
diff --git a/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C28.1/s_1_1101.bcl b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C28.1/s_1_1101.bcl
new file mode 100644
index 0000000..cf7039e
Binary files /dev/null and b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C28.1/s_1_1101.bcl differ
diff --git a/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C29.1/s_1_1101.bcl b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C29.1/s_1_1101.bcl
new file mode 100644
index 0000000..2d1f23b
Binary files /dev/null and b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C29.1/s_1_1101.bcl differ
diff --git a/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C3.1/s_1_1101.bcl b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C3.1/s_1_1101.bcl
new file mode 100644
index 0000000..ed4a763
Binary files /dev/null and b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C3.1/s_1_1101.bcl differ
diff --git a/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C30.1/s_1_1101.bcl b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C30.1/s_1_1101.bcl
new file mode 100644
index 0000000..157aa95
Binary files /dev/null and b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C30.1/s_1_1101.bcl differ
diff --git a/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C31.1/s_1_1101.bcl b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C31.1/s_1_1101.bcl
new file mode 100644
index 0000000..eac5662
Binary files /dev/null and b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C31.1/s_1_1101.bcl differ
diff --git a/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C32.1/s_1_1101.bcl b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C32.1/s_1_1101.bcl
new file mode 100644
index 0000000..8884d66
Binary files /dev/null and b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C32.1/s_1_1101.bcl differ
diff --git a/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C33.1/s_1_1101.bcl b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C33.1/s_1_1101.bcl
new file mode 100644
index 0000000..0c287ab
Binary files /dev/null and b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C33.1/s_1_1101.bcl differ
diff --git a/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C34.1/s_1_1101.bcl b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C34.1/s_1_1101.bcl
new file mode 100644
index 0000000..192aacf
Binary files /dev/null and b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C34.1/s_1_1101.bcl differ
diff --git a/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C35.1/s_1_1101.bcl b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C35.1/s_1_1101.bcl
new file mode 100644
index 0000000..bc0f3e1
Binary files /dev/null and b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C35.1/s_1_1101.bcl differ
diff --git a/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C36.1/s_1_1101.bcl b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C36.1/s_1_1101.bcl
new file mode 100644
index 0000000..2e1b6e9
Binary files /dev/null and b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C36.1/s_1_1101.bcl differ
diff --git a/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C37.1/s_1_1101.bcl b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C37.1/s_1_1101.bcl
new file mode 100644
index 0000000..a6d4543
Binary files /dev/null and b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C37.1/s_1_1101.bcl differ
diff --git a/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C38.1/s_1_1101.bcl b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C38.1/s_1_1101.bcl
new file mode 100644
index 0000000..065d009
Binary files /dev/null and b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C38.1/s_1_1101.bcl differ
diff --git a/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C39.1/s_1_1101.bcl b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C39.1/s_1_1101.bcl
new file mode 100644
index 0000000..4b2316e
Binary files /dev/null and b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C39.1/s_1_1101.bcl differ
diff --git a/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C4.1/s_1_1101.bcl b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C4.1/s_1_1101.bcl
new file mode 100644
index 0000000..1ee03c1
Binary files /dev/null and b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C4.1/s_1_1101.bcl differ
diff --git a/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C40.1/s_1_1101.bcl b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C40.1/s_1_1101.bcl
new file mode 100644
index 0000000..5285e81
Binary files /dev/null and b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C40.1/s_1_1101.bcl differ
diff --git a/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C41.1/s_1_1101.bcl b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C41.1/s_1_1101.bcl
new file mode 100644
index 0000000..9cc438b
Binary files /dev/null and b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C41.1/s_1_1101.bcl differ
diff --git a/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C42.1/s_1_1101.bcl b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C42.1/s_1_1101.bcl
new file mode 100644
index 0000000..2ecc08d
Binary files /dev/null and b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C42.1/s_1_1101.bcl differ
diff --git a/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C43.1/s_1_1101.bcl b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C43.1/s_1_1101.bcl
new file mode 100644
index 0000000..e92989e
Binary files /dev/null and b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C43.1/s_1_1101.bcl differ
diff --git a/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C44.1/s_1_1101.bcl b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C44.1/s_1_1101.bcl
new file mode 100644
index 0000000..bf08b23
Binary files /dev/null and b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C44.1/s_1_1101.bcl differ
diff --git a/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C45.1/s_1_1101.bcl b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C45.1/s_1_1101.bcl
new file mode 100644
index 0000000..db01a8e
Binary files /dev/null and b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C45.1/s_1_1101.bcl differ
diff --git a/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C46.1/s_1_1101.bcl b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C46.1/s_1_1101.bcl
new file mode 100644
index 0000000..4734f33
Binary files /dev/null and b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C46.1/s_1_1101.bcl differ
diff --git a/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C47.1/s_1_1101.bcl b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C47.1/s_1_1101.bcl
new file mode 100644
index 0000000..643b72c
Binary files /dev/null and b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C47.1/s_1_1101.bcl differ
diff --git a/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C48.1/s_1_1101.bcl b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C48.1/s_1_1101.bcl
new file mode 100644
index 0000000..183a628
Binary files /dev/null and b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C48.1/s_1_1101.bcl differ
diff --git a/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C49.1/s_1_1101.bcl b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C49.1/s_1_1101.bcl
new file mode 100644
index 0000000..a44369a
Binary files /dev/null and b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C49.1/s_1_1101.bcl differ
diff --git a/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C5.1/s_1_1101.bcl b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C5.1/s_1_1101.bcl
new file mode 100644
index 0000000..74e9533
Binary files /dev/null and b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C5.1/s_1_1101.bcl differ
diff --git a/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C50.1/s_1_1101.bcl b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C50.1/s_1_1101.bcl
new file mode 100644
index 0000000..dbeab86
Binary files /dev/null and b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C50.1/s_1_1101.bcl differ
diff --git a/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C51.1/s_1_1101.bcl b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C51.1/s_1_1101.bcl
new file mode 100644
index 0000000..45a1285
Binary files /dev/null and b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C51.1/s_1_1101.bcl differ
diff --git a/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C52.1/s_1_1101.bcl b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C52.1/s_1_1101.bcl
new file mode 100644
index 0000000..05220d0
Binary files /dev/null and b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C52.1/s_1_1101.bcl differ
diff --git a/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C53.1/s_1_1101.bcl b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C53.1/s_1_1101.bcl
new file mode 100644
index 0000000..1afd9e3
Binary files /dev/null and b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C53.1/s_1_1101.bcl differ
diff --git a/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C54.1/s_1_1101.bcl b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C54.1/s_1_1101.bcl
new file mode 100644
index 0000000..908911c
Binary files /dev/null and b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C54.1/s_1_1101.bcl differ
diff --git a/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C55.1/s_1_1101.bcl b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C55.1/s_1_1101.bcl
new file mode 100644
index 0000000..7396522
Binary files /dev/null and b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C55.1/s_1_1101.bcl differ
diff --git a/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C56.1/s_1_1101.bcl b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C56.1/s_1_1101.bcl
new file mode 100644
index 0000000..1f10382
Binary files /dev/null and b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C56.1/s_1_1101.bcl differ
diff --git a/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C57.1/s_1_1101.bcl b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C57.1/s_1_1101.bcl
new file mode 100644
index 0000000..6e4066f
Binary files /dev/null and b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C57.1/s_1_1101.bcl differ
diff --git a/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C58.1/s_1_1101.bcl b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C58.1/s_1_1101.bcl
new file mode 100644
index 0000000..e8a2a1a
Binary files /dev/null and b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C58.1/s_1_1101.bcl differ
diff --git a/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C59.1/s_1_1101.bcl b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C59.1/s_1_1101.bcl
new file mode 100644
index 0000000..7cf11cc
Binary files /dev/null and b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C59.1/s_1_1101.bcl differ
diff --git a/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C6.1/s_1_1101.bcl b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C6.1/s_1_1101.bcl
new file mode 100644
index 0000000..2626b34
Binary files /dev/null and b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C6.1/s_1_1101.bcl differ
diff --git a/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C60.1/s_1_1101.bcl b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C60.1/s_1_1101.bcl
new file mode 100644
index 0000000..84aad12
Binary files /dev/null and b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C60.1/s_1_1101.bcl differ
diff --git a/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C61.1/s_1_1101.bcl b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C61.1/s_1_1101.bcl
new file mode 100644
index 0000000..6490d13
Binary files /dev/null and b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C61.1/s_1_1101.bcl differ
diff --git a/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C62.1/s_1_1101.bcl b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C62.1/s_1_1101.bcl
new file mode 100644
index 0000000..c632e44
Binary files /dev/null and b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C62.1/s_1_1101.bcl differ
diff --git a/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C63.1/s_1_1101.bcl b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C63.1/s_1_1101.bcl
new file mode 100644
index 0000000..8c69640
Binary files /dev/null and b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C63.1/s_1_1101.bcl differ
diff --git a/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C64.1/s_1_1101.bcl b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C64.1/s_1_1101.bcl
new file mode 100644
index 0000000..dfc1582
Binary files /dev/null and b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C64.1/s_1_1101.bcl differ
diff --git a/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C65.1/s_1_1101.bcl b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C65.1/s_1_1101.bcl
new file mode 100644
index 0000000..fb48544
Binary files /dev/null and b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C65.1/s_1_1101.bcl differ
diff --git a/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C66.1/s_1_1101.bcl b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C66.1/s_1_1101.bcl
new file mode 100644
index 0000000..bd53ac2
Binary files /dev/null and b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C66.1/s_1_1101.bcl differ
diff --git a/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C67.1/s_1_1101.bcl b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C67.1/s_1_1101.bcl
new file mode 100644
index 0000000..8fcbc0f
Binary files /dev/null and b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C67.1/s_1_1101.bcl differ
diff --git a/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C68.1/s_1_1101.bcl b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C68.1/s_1_1101.bcl
new file mode 100644
index 0000000..c9d271f
Binary files /dev/null and b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C68.1/s_1_1101.bcl differ
diff --git a/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C69.1/s_1_1101.bcl b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C69.1/s_1_1101.bcl
new file mode 100644
index 0000000..a3c5817
Binary files /dev/null and b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C69.1/s_1_1101.bcl differ
diff --git a/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C7.1/s_1_1101.bcl b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C7.1/s_1_1101.bcl
new file mode 100644
index 0000000..2562fe3
Binary files /dev/null and b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C7.1/s_1_1101.bcl differ
diff --git a/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C70.1/s_1_1101.bcl b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C70.1/s_1_1101.bcl
new file mode 100644
index 0000000..84b93d0
Binary files /dev/null and b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C70.1/s_1_1101.bcl differ
diff --git a/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C71.1/s_1_1101.bcl b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C71.1/s_1_1101.bcl
new file mode 100644
index 0000000..0d2a958
Binary files /dev/null and b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C71.1/s_1_1101.bcl differ
diff --git a/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C72.1/s_1_1101.bcl b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C72.1/s_1_1101.bcl
new file mode 100644
index 0000000..10be6f1
Binary files /dev/null and b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C72.1/s_1_1101.bcl differ
diff --git a/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C73.1/s_1_1101.bcl b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C73.1/s_1_1101.bcl
new file mode 100644
index 0000000..8fe7bd4
Binary files /dev/null and b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C73.1/s_1_1101.bcl differ
diff --git a/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C74.1/s_1_1101.bcl b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C74.1/s_1_1101.bcl
new file mode 100644
index 0000000..8827427
Binary files /dev/null and b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C74.1/s_1_1101.bcl differ
diff --git a/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C75.1/s_1_1101.bcl b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C75.1/s_1_1101.bcl
new file mode 100644
index 0000000..0ba8f2d
Binary files /dev/null and b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C75.1/s_1_1101.bcl differ
diff --git a/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C76.1/s_1_1101.bcl b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C76.1/s_1_1101.bcl
new file mode 100644
index 0000000..fe7b127
Binary files /dev/null and b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C76.1/s_1_1101.bcl differ
diff --git a/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C77.1/s_1_1101.bcl b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C77.1/s_1_1101.bcl
new file mode 100644
index 0000000..aa002a4
Binary files /dev/null and b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C77.1/s_1_1101.bcl differ
diff --git a/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C78.1/s_1_1101.bcl b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C78.1/s_1_1101.bcl
new file mode 100644
index 0000000..2271105
Binary files /dev/null and b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C78.1/s_1_1101.bcl differ
diff --git a/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C79.1/s_1_1101.bcl b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C79.1/s_1_1101.bcl
new file mode 100644
index 0000000..c6f2df5
Binary files /dev/null and b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C79.1/s_1_1101.bcl differ
diff --git a/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C8.1/s_1_1101.bcl b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C8.1/s_1_1101.bcl
new file mode 100644
index 0000000..0f30bc8
Binary files /dev/null and b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C8.1/s_1_1101.bcl differ
diff --git a/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C80.1/s_1_1101.bcl b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C80.1/s_1_1101.bcl
new file mode 100644
index 0000000..f664e2e
Binary files /dev/null and b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C80.1/s_1_1101.bcl differ
diff --git a/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C81.1/s_1_1101.bcl b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C81.1/s_1_1101.bcl
new file mode 100644
index 0000000..0c26042
Binary files /dev/null and b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C81.1/s_1_1101.bcl differ
diff --git a/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C82.1/s_1_1101.bcl b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C82.1/s_1_1101.bcl
new file mode 100644
index 0000000..efaad83
Binary files /dev/null and b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C82.1/s_1_1101.bcl differ
diff --git a/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C83.1/s_1_1101.bcl b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C83.1/s_1_1101.bcl
new file mode 100644
index 0000000..b67e847
Binary files /dev/null and b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C83.1/s_1_1101.bcl differ
diff --git a/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C84.1/s_1_1101.bcl b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C84.1/s_1_1101.bcl
new file mode 100644
index 0000000..f5fc808
Binary files /dev/null and b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C84.1/s_1_1101.bcl differ
diff --git a/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C85.1/s_1_1101.bcl b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C85.1/s_1_1101.bcl
new file mode 100644
index 0000000..c1ac2f6
Binary files /dev/null and b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C85.1/s_1_1101.bcl differ
diff --git a/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C86.1/s_1_1101.bcl b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C86.1/s_1_1101.bcl
new file mode 100644
index 0000000..58fb344
Binary files /dev/null and b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C86.1/s_1_1101.bcl differ
diff --git a/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C87.1/s_1_1101.bcl b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C87.1/s_1_1101.bcl
new file mode 100644
index 0000000..6f0066a
Binary files /dev/null and b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C87.1/s_1_1101.bcl differ
diff --git a/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C88.1/s_1_1101.bcl b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C88.1/s_1_1101.bcl
new file mode 100644
index 0000000..d924afe
Binary files /dev/null and b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C88.1/s_1_1101.bcl differ
diff --git a/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C89.1/s_1_1101.bcl b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C89.1/s_1_1101.bcl
new file mode 100644
index 0000000..06d6586
Binary files /dev/null and b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C89.1/s_1_1101.bcl differ
diff --git a/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C9.1/s_1_1101.bcl b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C9.1/s_1_1101.bcl
new file mode 100644
index 0000000..22b037a
Binary files /dev/null and b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C9.1/s_1_1101.bcl differ
diff --git a/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C90.1/s_1_1101.bcl b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C90.1/s_1_1101.bcl
new file mode 100644
index 0000000..265c360
Binary files /dev/null and b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C90.1/s_1_1101.bcl differ
diff --git a/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C91.1/s_1_1101.bcl b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C91.1/s_1_1101.bcl
new file mode 100644
index 0000000..88f023e
Binary files /dev/null and b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C91.1/s_1_1101.bcl differ
diff --git a/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C92.1/s_1_1101.bcl b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C92.1/s_1_1101.bcl
new file mode 100644
index 0000000..0ee0197
Binary files /dev/null and b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C92.1/s_1_1101.bcl differ
diff --git a/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C93.1/s_1_1101.bcl b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C93.1/s_1_1101.bcl
new file mode 100644
index 0000000..f55408f
Binary files /dev/null and b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C93.1/s_1_1101.bcl differ
diff --git a/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C94.1/s_1_1101.bcl b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C94.1/s_1_1101.bcl
new file mode 100644
index 0000000..c724617
Binary files /dev/null and b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C94.1/s_1_1101.bcl differ
diff --git a/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C95.1/s_1_1101.bcl b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C95.1/s_1_1101.bcl
new file mode 100644
index 0000000..c7a0adc
Binary files /dev/null and b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C95.1/s_1_1101.bcl differ
diff --git a/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C96.1/s_1_1101.bcl b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C96.1/s_1_1101.bcl
new file mode 100644
index 0000000..af57aa0
Binary files /dev/null and b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C96.1/s_1_1101.bcl differ
diff --git a/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C97.1/s_1_1101.bcl b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C97.1/s_1_1101.bcl
new file mode 100644
index 0000000..0042431
Binary files /dev/null and b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C97.1/s_1_1101.bcl differ
diff --git a/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C98.1/s_1_1101.bcl b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C98.1/s_1_1101.bcl
new file mode 100644
index 0000000..c7bd981
Binary files /dev/null and b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C98.1/s_1_1101.bcl differ
diff --git a/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C99.1/s_1_1101.bcl b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C99.1/s_1_1101.bcl
new file mode 100644
index 0000000..35d316e
Binary files /dev/null and b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/C99.1/s_1_1101.bcl differ
diff --git a/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/s_1_1101.control b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/s_1_1101.control
new file mode 100755
index 0000000..0ec9619
Binary files /dev/null and b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/s_1_1101.control differ
diff --git a/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/s_1_1101.filter b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/s_1_1101.filter
new file mode 100755
index 0000000..cf1e8f5
Binary files /dev/null and b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/L001/s_1_1101.filter differ
diff --git a/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/SampleSheet.csv b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/SampleSheet.csv
new file mode 100755
index 0000000..1597629
--- /dev/null
+++ b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/SampleSheet.csv
@@ -0,0 +1,114 @@
+[Header],,,,
+Investigator Name,sh2,,,
+Project Name,Transposon Based Genetic Screening in Mice,,,
+Experiment Name,13349,,,
+Date,2014-06-24T11:51:11,,,
+Workflow,LibraryQC,,,
+Chemistry,Transposon_Eukaryotic,,,
+,,,,
+[Reads],,,,
+75,,,,
+75,,,,
+,,,,
+[Settings],,,,
+,,,,
+[Manifests],,,,
+,,,,
+[Data],,,,
+Sample_ID,Sample_Name,GenomeFolder,Index,Index2
+10589429,PAZC_8_5c_Spleen,C:\Illumina\MiSeq Reporter\Genomes\WTSI_references\Mus_musculus\NCBIm37\all\fasta\,TAGGGTTAANNN,TAGCTTGT
+10589430,PAZC_9_1a_Spleen,C:\Illumina\MiSeq Reporter\Genomes\WTSI_references\Mus_musculus\NCBIm37\all\fasta\,TAGGGTTAANNN,CGATGTTT
+10589431,PAZC_7_4d_throat_LN,C:\Illumina\MiSeq Reporter\Genomes\WTSI_references\Mus_musculus\NCBIm37\all\fasta\,TAGGGTTAANNN,GCCAATGT
+10589432,PAZC_9_2c_Spleen,C:\Illumina\MiSeq Reporter\Genomes\WTSI_references\Mus_musculus\NCBIm37\all\fasta\,TAGGGTTAANNN,ACAGTGGT
+10589433,PAZC_1_1c_Spleen,C:\Illumina\MiSeq Reporter\Genomes\WTSI_references\Mus_musculus\NCBIm37\all\fasta\,TAGGGTTAANNN,ATCACGTT
+10589434,PAZC_1_1c_lung,C:\Illumina\MiSeq Reporter\Genomes\WTSI_references\Mus_musculus\NCBIm37\all\fasta\,TAGGGTTAANNN,GATCAGCG
+10589435,PAZC_7_5f_spleen,C:\Illumina\MiSeq Reporter\Genomes\WTSI_references\Mus_musculus\NCBIm37\all\fasta\,TAGGGTTAANNN,CAGATCTG
+10589436,PAZC_8_7f_Spleen,C:\Illumina\MiSeq Reporter\Genomes\WTSI_references\Mus_musculus\NCBIm37\all\fasta\,TAGGGTTAANNN,TTAGGCAT
+10589437,PAZC_9_1g_Skin_tu,C:\Illumina\MiSeq Reporter\Genomes\WTSI_references\Mus_musculus\NCBIm37\all\fasta\,TAGGGTTAANNN,GGCTACAG
+10589438,PAZC_8_4c_Spleen,C:\Illumina\MiSeq Reporter\Genomes\WTSI_references\Mus_musculus\NCBIm37\all\fasta\,TAGGGTTAANNN,CTTGTACT
+10589439,PAZC_9_10f_Spleen,C:\Illumina\MiSeq Reporter\Genomes\WTSI_references\Mus_musculus\NCBIm37\all\fasta\,TAGGGTTAANNN,ACTTGATG
+10589440,PAZC_8_4j_mes_LN,C:\Illumina\MiSeq Reporter\Genomes\WTSI_references\Mus_musculus\NCBIm37\all\fasta\,TAGGGTTAANNN,TGACCACT
+10589441,PAZC_6_4f_Spleen,C:\Illumina\MiSeq Reporter\Genomes\WTSI_references\Mus_musculus\NCBIm37\all\fasta\,TAGGGTTAANNN,TGGTTGTT
+10589442,PAZC_8_2f_Spleen,C:\Illumina\MiSeq Reporter\Genomes\WTSI_references\Mus_musculus\NCBIm37\all\fasta\,TAGGGTTAANNN,TCTCGGTT
+10589443,PAZC_6_4d_Spleen,C:\Illumina\MiSeq Reporter\Genomes\WTSI_references\Mus_musculus\NCBIm37\all\fasta\,TAGGGTTAANNN,TAAGCGTT
+10589444,PAZC_8_1d_spleen,C:\Illumina\MiSeq Reporter\Genomes\WTSI_references\Mus_musculus\NCBIm37\all\fasta\,TAGGGTTAANNN,TCCGTCTT
+10589445,PAZC_7_6e_Thymus,C:\Illumina\MiSeq Reporter\Genomes\WTSI_references\Mus_musculus\NCBIm37\all\fasta\,TAGGGTTAANNN,TGTACCTT
+10589446,PAZC_7_6a_spleen,C:\Illumina\MiSeq Reporter\Genomes\WTSI_references\Mus_musculus\NCBIm37\all\fasta\,TAGGGTTAANNN,TTCTGTGT
+10589447,PAZC_8_3a_spleen,C:\Illumina\MiSeq Reporter\Genomes\WTSI_references\Mus_musculus\NCBIm37\all\fasta\,TAGGGTTAANNN,TCTGCTGT
+10589448,PAZC_7_2f_cer_LN,C:\Illumina\MiSeq Reporter\Genomes\WTSI_references\Mus_musculus\NCBIm37\all\fasta\,TAGGGTTAANNN,TTGGAGGT
+10589449,PAZC_8_1b_spleen,C:\Illumina\MiSeq Reporter\Genomes\WTSI_references\Mus_musculus\NCBIm37\all\fasta\,TAGGGTTAANNN,TCGAGCGT
+10589450,PAZC_8_7b_spleen,C:\Illumina\MiSeq Reporter\Genomes\WTSI_references\Mus_musculus\NCBIm37\all\fasta\,TAGGGTTAANNN,TGATACGT
+10589451,PAZC_7_1e_spleen,C:\Illumina\MiSeq Reporter\Genomes\WTSI_references\Mus_musculus\NCBIm37\all\fasta\,TAGGGTTAANNN,TGCATAGT
+10589452,PAZC_6_6d_spleen,C:\Illumina\MiSeq Reporter\Genomes\WTSI_references\Mus_musculus\NCBIm37\all\fasta\,TAGGGTTAANNN,TTGACTCT
+10589453,PAZC_8_7c_spleen,C:\Illumina\MiSeq Reporter\Genomes\WTSI_references\Mus_musculus\NCBIm37\all\fasta\,TAGGGTTAANNN,TGCGATCT
+10589454,PAZC_7_1a_mes_LN,C:\Illumina\MiSeq Reporter\Genomes\WTSI_references\Mus_musculus\NCBIm37\all\fasta\,TAGGGTTAANNN,TAGTGACT
+10589455,PAZC_8_2b_mes_LN,C:\Illumina\MiSeq Reporter\Genomes\WTSI_references\Mus_musculus\NCBIm37\all\fasta\,TAGGGTTAANNN,TACAGGAT
+10589456,PAZC_9_2a_lung,C:\Illumina\MiSeq Reporter\Genomes\WTSI_references\Mus_musculus\NCBIm37\all\fasta\,TAGGGTTAANNN,TCCTCAAT
+10589457,PAZC_9_2a_spleen,C:\Illumina\MiSeq Reporter\Genomes\WTSI_references\Mus_musculus\NCBIm37\all\fasta\,TAGGGTTAANNN,TGTGGTTG
+10589458,PAZC_8_1c_Thymus,C:\Illumina\MiSeq Reporter\Genomes\WTSI_references\Mus_musculus\NCBIm37\all\fasta\,TAGGGTTAANNN,TAGTCTTG
+10589459,PAZC_9_8d_Spleen,C:\Illumina\MiSeq Reporter\Genomes\WTSI_references\Mus_musculus\NCBIm37\all\fasta\,TAGGGTTAANNN,TCGAAGTG
+10589460,PAZC_8_3f_thorax_tu,C:\Illumina\MiSeq Reporter\Genomes\WTSI_references\Mus_musculus\NCBIm37\all\fasta\,TAGGGTTAANNN,TAACGCTG
+10589461,PAZC_8_3f_Spleen,C:\Illumina\MiSeq Reporter\Genomes\WTSI_references\Mus_musculus\NCBIm37\all\fasta\,TAGGGTTAANNN,TTGGTATG
+10589462,PAZC_6_8e_spleen,C:\Illumina\MiSeq Reporter\Genomes\WTSI_references\Mus_musculus\NCBIm37\all\fasta\,TAGGGTTAANNN,TGAACTGG
+10589463,PAZC_9_6a_lung,C:\Illumina\MiSeq Reporter\Genomes\WTSI_references\Mus_musculus\NCBIm37\all\fasta\,TAGGGTTAANNN,TACTTCGG
+10589464,PAZC_7_5e_spleen,C:\Illumina\MiSeq Reporter\Genomes\WTSI_references\Mus_musculus\NCBIm37\all\fasta\,TAGGGTTAANNN,TCTCACGG
+10589465,PAZC_7_5e_si_tu,C:\Illumina\MiSeq Reporter\Genomes\WTSI_references\Mus_musculus\NCBIm37\all\fasta\,TAGGGTTAANNN,TCAGGAGG
+10589466,PAZC_6_4c_spleen,C:\Illumina\MiSeq Reporter\Genomes\WTSI_references\Mus_musculus\NCBIm37\all\fasta\,TAGGGTTAANNN,TAAGTTCG
+10589467,PAZC_8_6f_spleen,C:\Illumina\MiSeq Reporter\Genomes\WTSI_references\Mus_musculus\NCBIm37\all\fasta\,TAGGGTTAANNN,TCCAGTCG
+10589468,PAZC_6_8d_spleen,C:\Illumina\MiSeq Reporter\Genomes\WTSI_references\Mus_musculus\NCBIm37\all\fasta\,TAGGGTTAANNN,TGTATGCG
+10589469,PAZC_8_7a_cer_LN,C:\Illumina\MiSeq Reporter\Genomes\WTSI_references\Mus_musculus\NCBIm37\all\fasta\,TAGGGTTAANNN,TCATTGAG
+10589470,PAZC_6_3b_liver,C:\Illumina\MiSeq Reporter\Genomes\WTSI_references\Mus_musculus\NCBIm37\all\fasta\,TAGGGTTAANNN,TGGCTCAG
+10589471,PAZC_9_6g_spleen,C:\Illumina\MiSeq Reporter\Genomes\WTSI_references\Mus_musculus\NCBIm37\all\fasta\,TAGGGTTAANNN,TATGCCAG
+10589472,PAZC_9_7f_spleen,C:\Illumina\MiSeq Reporter\Genomes\WTSI_references\Mus_musculus\NCBIm37\all\fasta\,TAGGGTTAANNN,TCAGATTC
+10589473,PAZC_9_8e_spleen,C:\Illumina\MiSeq Reporter\Genomes\WTSI_references\Mus_musculus\NCBIm37\all\fasta\,TAGGGTTAANNN,TACTAGTC
+10589474,PAZC_6_6e_LN,C:\Illumina\MiSeq Reporter\Genomes\WTSI_references\Mus_musculus\NCBIm37\all\fasta\,TAGGGTTAANNN,TTCAGCTC
+10589475,PAZC_8_6c_spleen,C:\Illumina\MiSeq Reporter\Genomes\WTSI_references\Mus_musculus\NCBIm37\all\fasta\,TAGGGTTAANNN,TGTCTATC
+10589476,PAZC_7_8c_spleen,C:\Illumina\MiSeq Reporter\Genomes\WTSI_references\Mus_musculus\NCBIm37\all\fasta\,TAGGGTTAANNN,TATGTGGC
+10589477,PAZC_6_7c_mes_LN,C:\Illumina\MiSeq Reporter\Genomes\WTSI_references\Mus_musculus\NCBIm37\all\fasta\,TAGGGTTAANNN,TTACTCGC
+10589478,PAZC_9_5e_spleen,C:\Illumina\MiSeq Reporter\Genomes\WTSI_references\Mus_musculus\NCBIm37\all\fasta\,TAGGGTTAANNN,TCGTTAGC
+10589479,PAZC_8_4e_Thymus,C:\Illumina\MiSeq Reporter\Genomes\WTSI_references\Mus_musculus\NCBIm37\all\fasta\,TAGGGTTAANNN,TACCGAGC
+10589480,PAZC_9_11b_LN,C:\Illumina\MiSeq Reporter\Genomes\WTSI_references\Mus_musculus\NCBIm37\all\fasta\,TAGGGTTAANNN,TGTTCTCC
+10589481,PAZC_7_8b_LN,C:\Illumina\MiSeq Reporter\Genomes\WTSI_references\Mus_musculus\NCBIm37\all\fasta\,TAGGGTTAANNN,TTCGCACC
+10589482,PAZC_8_2d_lung_tu,C:\Illumina\MiSeq Reporter\Genomes\WTSI_references\Mus_musculus\NCBIm37\all\fasta\,TAGGGTTAANNN,TTGCGTAC
+10589483,PAZC_9_11c_spleen,C:\Illumina\MiSeq Reporter\Genomes\WTSI_references\Mus_musculus\NCBIm37\all\fasta\,TAGGGTTAANNN,TCTACGAC
+10589484,MONE_1_14c_spleen,C:\Illumina\MiSeq Reporter\Genomes\WTSI_references\Mus_musculus\NCBIm37\all\fasta\,TAGGGTTAANNN,TGACAGAC
+10589485,PAZC_7_5i_Thymus,C:\Illumina\MiSeq Reporter\Genomes\WTSI_references\Mus_musculus\NCBIm37\all\fasta\,TAGGGTTAANNN,TAGAACAC
+10589486,PAZC_14_2e_spleen,C:\Illumina\MiSeq Reporter\Genomes\WTSI_references\Mus_musculus\NCBIm37\all\fasta\,TAGGGTTAANNN,TCATCCTA
+10589487,PAZC_15_3i_lumber_LN,C:\Illumina\MiSeq Reporter\Genomes\WTSI_references\Mus_musculus\NCBIm37\all\fasta\,TAGGGTTAANNN,TGCTGATA
+10589488,PAZC_9_6b_lung_tu,C:\Illumina\MiSeq Reporter\Genomes\WTSI_references\Mus_musculus\NCBIm37\all\fasta\,TAGGGTTAANNN,TAGACGGA
+10589489,PAZC_15_4h_Tail,C:\Illumina\MiSeq Reporter\Genomes\WTSI_references\Mus_musculus\NCBIm37\all\fasta\,TAGGGTTAANNN,TGTGAAGA
+10589490,PAZC_15_4h_spleen,C:\Illumina\MiSeq Reporter\Genomes\WTSI_references\Mus_musculus\NCBIm37\all\fasta\,TAGGGTTAANNN,TCTCTTCA
+10589491,PAZC_15_4h_Thymus,C:\Illumina\MiSeq Reporter\Genomes\WTSI_references\Mus_musculus\NCBIm37\all\fasta\,TAGGGTTAANNN,TTGTTCCA
+10589492,PAZC_15_4h_LN,C:\Illumina\MiSeq Reporter\Genomes\WTSI_references\Mus_musculus\NCBIm37\all\fasta\,TAGGGTTAANNN,TGAAGCCA
+10589493,PAZC_15_2b_Thymus,C:\Illumina\MiSeq Reporter\Genomes\WTSI_references\Mus_musculus\NCBIm37\all\fasta\,TAGGGTTAANNN,TACCACCA
+10589494,PAZC_15_2h_mass,C:\Illumina\MiSeq Reporter\Genomes\WTSI_references\Mus_musculus\NCBIm37\all\fasta\,TAGGGTTAANNN,TGCGTGAA
+10589495,PAZC_15_2h_Ovary,C:\Illumina\MiSeq Reporter\Genomes\WTSI_references\Mus_musculus\NCBIm37\all\fasta\,TAGGGTTAANNN,GGTGAGTT
+10589496,PAZC_14_2a_spleen,C:\Illumina\MiSeq Reporter\Genomes\WTSI_references\Mus_musculus\NCBIm37\all\fasta\,TAGGGTTAANNN,GATCTCTT
+10589497,PAZC_15_4b_spleen,C:\Illumina\MiSeq Reporter\Genomes\WTSI_references\Mus_musculus\NCBIm37\all\fasta\,TAGGGTTAANNN,GTGTCCTT
+10589498,PAZC_15_4i_lumber_LN,C:\Illumina\MiSeq Reporter\Genomes\WTSI_references\Mus_musculus\NCBIm37\all\fasta\,TAGGGTTAANNN,GACGGATT
+10589499,PAZC_14_4a_Spleen,C:\Illumina\MiSeq Reporter\Genomes\WTSI_references\Mus_musculus\NCBIm37\all\fasta\,TAGGGTTAANNN,GCAACATT
+10589500,PAZC_15_4c_Thymus,C:\Illumina\MiSeq Reporter\Genomes\WTSI_references\Mus_musculus\NCBIm37\all\fasta\,TAGGGTTAANNN,GGTCGTGT
+10589501,PAZC_15_4d_Spleen,C:\Illumina\MiSeq Reporter\Genomes\WTSI_references\Mus_musculus\NCBIm37\all\fasta\,TAGGGTTAANNN,GAATCTGT
+10589502,WONE_2_1c_spleen,C:\Illumina\MiSeq Reporter\Genomes\WTSI_references\Mus_musculus\NCBIm37\all\fasta\,TAGGGTTAANNN,GTACATCT
+10589503,WONE_2_1j_Mes_LN,C:\Illumina\MiSeq Reporter\Genomes\WTSI_references\Mus_musculus\NCBIm37\all\fasta\,TAGGGTTAANNN,GAGGTGCT
+10589504,WONE_2_2a_spleen,C:\Illumina\MiSeq Reporter\Genomes\WTSI_references\Mus_musculus\NCBIm37\all\fasta\,TAGGGTTAANNN,GCATGGCT
+10589505,WONE_2_1s_spleen,C:\Illumina\MiSeq Reporter\Genomes\WTSI_references\Mus_musculus\NCBIm37\all\fasta\,TAGGGTTAANNN,GTTAGCCT
+10589506,WONE_143488_spleen,C:\Illumina\MiSeq Reporter\Genomes\WTSI_references\Mus_musculus\NCBIm37\all\fasta\,TAGGGTTAANNN,GTCGCTAT
+10589507,WONE_2_5g_spleen,C:\Illumina\MiSeq Reporter\Genomes\WTSI_references\Mus_musculus\NCBIm37\all\fasta\,TAGGGTTAANNN,GGAATGAT
+10589508,WONE_2_2m_spleen,C:\Illumina\MiSeq Reporter\Genomes\WTSI_references\Mus_musculus\NCBIm37\all\fasta\,TAGGGTTAANNN,GAGCCAAT
+10589509,WONE_2_1p_mes_LN,C:\Illumina\MiSeq Reporter\Genomes\WTSI_references\Mus_musculus\NCBIm37\all\fasta\,TAGGGTTAANNN,GCTCCTTG
+10589510,WONE_2_1i_mes_LN,C:\Illumina\MiSeq Reporter\Genomes\WTSI_references\Mus_musculus\NCBIm37\all\fasta\,TAGGGTTAANNN,GTAAGGTG
+10589511,WONE_2_8a_cer_LN,C:\Illumina\MiSeq Reporter\Genomes\WTSI_references\Mus_musculus\NCBIm37\all\fasta\,TAGGGTTAANNN,GAGGATGG
+10589512,WONE_20_6c_spleen,C:\Illumina\MiSeq Reporter\Genomes\WTSI_references\Mus_musculus\NCBIm37\all\fasta\,TAGGGTTAANNN,GTTGTCGG
+10589513,WONE_2_2c_spleen,C:\Illumina\MiSeq Reporter\Genomes\WTSI_references\Mus_musculus\NCBIm37\all\fasta\,TAGGGTTAANNN,GATAGAGG
+10589514,WONE_2_8d_spleen,C:\Illumina\MiSeq Reporter\Genomes\WTSI_references\Mus_musculus\NCBIm37\all\fasta\,TAGGGTTAANNN,GACCTTAG
+10589515,WONE_2_8b_spleen,C:\Illumina\MiSeq Reporter\Genomes\WTSI_references\Mus_musculus\NCBIm37\all\fasta\,TAGGGTTAANNN,GCCTGTTC
+10589516,PAZE_2_6e_spleen,C:\Illumina\MiSeq Reporter\Genomes\WTSI_references\Mus_musculus\NCBIm37\all\fasta\,TAGGGTTAANNN,GCACTGTC
+10589517,PAZB_2_2e_spleen,C:\Illumina\MiSeq Reporter\Genomes\WTSI_references\Mus_musculus\NCBIm37\all\fasta\,TAGGGTTAANNN,GCTAACTC
+10589518,PAZB_2_2g_cer_LN,C:\Illumina\MiSeq Reporter\Genomes\WTSI_references\Mus_musculus\NCBIm37\all\fasta\,TAGGGTTAANNN,GATTCATC
+10589519,PAZB_2_2g_spleen,C:\Illumina\MiSeq Reporter\Genomes\WTSI_references\Mus_musculus\NCBIm37\all\fasta\,TAGGGTTAANNN,GTCTTGGC
+10589520,PAZB_2_2a_Tail,C:\Illumina\MiSeq Reporter\Genomes\WTSI_references\Mus_musculus\NCBIm37\all\fasta\,TAGGGTTAANNN,GTAGAAGC
+10589521,PAZB_2_2a_Thymus,C:\Illumina\MiSeq Reporter\Genomes\WTSI_references\Mus_musculus\NCBIm37\all\fasta\,TAGGGTTAANNN,GATGGTCC
+10589522,PAZB_2_2a_Spleen,C:\Illumina\MiSeq Reporter\Genomes\WTSI_references\Mus_musculus\NCBIm37\all\fasta\,TAGGGTTAANNN,GTGCTACC
+10589523,PAZB_2_2a_mes_LN,C:\Illumina\MiSeq Reporter\Genomes\WTSI_references\Mus_musculus\NCBIm37\all\fasta\,TAGGGTTAANNN,GCGATTAC
+10589524,PAZB_2_7h_spleen,C:\Illumina\MiSeq Reporter\Genomes\WTSI_references\Mus_musculus\NCBIm37\all\fasta\,TAGGGTTAANNN,GGTTGGAC
diff --git a/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/config.xml b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/config.xml
new file mode 100755
index 0000000..293a0e8
--- /dev/null
+++ b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/BaseCalls/config.xml
@@ -0,0 +1,207 @@
+
+
+
+
+ 0.6
+
+ 2
+ 0
+ 1
+ 0
+ 1
+ 75
+ 1
+
+
+ 2
+ 0
+ 76
+ 0
+ 76
+ 87
+ 2
+
+
+ 2
+ 0
+ 88
+ 0
+ 88
+ 95
+ 3
+
+
+ 2
+ 0
+ 96
+ 0
+ 96
+ 170
+ 4
+
+
+ 2
+ 0
+ 2
+ 1
+ 1
+ 75
+ 1
+ 0
+ 0
+
+
+ 2
+ 0
+ 77
+ 1
+ 76
+ 87
+ 2
+ 0
+ 0
+
+
+ 2
+ 0
+ 89
+ 1
+ 88
+ 95
+ 3
+ 0
+ 0
+
+
+ 2
+ 0
+ 97
+ 1
+ 96
+ 170
+ 4
+ 0
+ 0
+
+ 0
+ failed-chastity
+ le
+ 1.0
+
+
+
+
+ 0
+ 0
+ 0
+ 0
+ 0
+
+ 1
+ 75
+
+
+ 76
+ 87
+ 140624_MS6_13349_A_MS2639979-300V2
+
+
+ 88
+ 95
+ 140624_MS6_13349_A_MS2639979-300V2
+
+
+ 96
+ 170
+ 140624_MS6_13349_A_MS2639979-300V2
+
+ MS6
+ 0
+ 0
+ 0
+ 0
+
+ 1
+ 75
+
+
+ 76
+ 87
+ 140624_MS6_13349_A_MS2639979-300V2
+
+
+ 88
+ 95
+ 140624_MS6_13349_A_MS2639979-300V2
+
+
+ 96
+ 170
+ 140624_MS6_13349_A_MS2639979-300V2
+
+ 140624_MS6_13349_A_MS2639979-300V2
+ 140624
+ 13349
+ 000000000-A9RLY
+
+ 76
+ 77
+ 78
+ 79
+ 80
+ 81
+ 82
+ 83
+ 84
+ 85
+ 86
+ 87
+ 88
+ 89
+ 90
+ 91
+ 92
+ 93
+ 94
+ 95
+
+ V6
+
+
+
+
+ s
+ 2105
+ 2106
+ 2103
+ 2104
+ 2101
+ 2102
+ 2108
+ 2107
+ 2114
+ 2113
+ 2112
+ 2111
+ 2110
+ 2109
+ 1106
+ 1105
+ 1104
+ 1103
+ 1102
+ 1101
+ 1108
+ 1107
+ 1113
+ 1114
+ 1112
+ 1111
+ 1110
+ 1109
+
+
+
+
+
+
\ No newline at end of file
diff --git a/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/L001/s_1_1101.locs b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/L001/s_1_1101.locs
new file mode 100755
index 0000000..09a8f00
Binary files /dev/null and b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/L001/s_1_1101.locs differ
diff --git a/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/RTAConfiguration.xml b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/RTAConfiguration.xml
new file mode 100755
index 0000000..e1ca789
--- /dev/null
+++ b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/RTAConfiguration.xml
@@ -0,0 +1,181 @@
+
+
+ Data\Intensities
+ Data\Intensities\BaseCalls
+ Data\Intensities\Offsets
+ HiSeq.Configuration.xml
+ GA.Configuration.xml
+ HiSeq.Configuration.xml
+ MiSeq.Configuration.xml
+ HiSeq.Configuration.xml
+ SampleSheet.csv
+ 5
+ true
+ true
+ false
+ false
+ false
+ MS6
+ 0
+ false
+ 512
+ 2
+ 8
+ false
+ 0
+ Lane
+ 5
+ false
+ 1
+
+
+ true
+ 0
+ MiSeq
+
+
+
+
+ Short
+
+ true
+ true
+ true
+ false
+ 5242880
+ true
+ 13
+ 1
+ false
+ true
+ false
+ false
+ false
+ 10000000
+ 1
+ v6
+ true
+ HCSFourDigit
+
+ 1000
+ 1000
+
+ true
+ 5
+ 1.75
+ true
+ 1400
+ 1.8
+ 1
+ 4
+ 3.5
+ 3.5
+ 1.5
+ 1.25
+ false
+ true
+ false
+ 0
+ false
+
+ 0
+ 0
+ 0
+ 0
+
+
+ 0
+ 0
+ 0
+ 0
+
+
+ 250000
+
+
+ 2.5
+
+ 5
+ 5
+ 1000
+ 1.14244E-07
+ MexicanHat
+ ThreePixel
+ Otsu
+ 64
+ 64
+
+
+
+ 12
+ false
+ 2
+ 2.5
+ false
+ false
+ 1
+ 25
+ 52
+ controls.fasta
+ true
+
+ PhiX.fasta
+ D:\Illumina\MiSeqAnalysis\140624_MS6_13349_A_MS2639979-300V2
+ Y:\ILorHSorMS_sf49\incoming\140624_MS6_13349_A_MS2639979-300V2
+
+ D:\Illumina\MiSeqTemp\140624_MS6_13349_A_MS2639979-300V2\Images
+ false
+ 0
+ false
+ true
+ false
+ true
+ true
+ true
+ false
+ false
+ false
+ false
+ true
+ true
+ true
+ true
+ false
+ true
+ false
+ false
+ true
+ false
+ 246,658,0
+ 246,658,0
+ -1,-1
+ true
+ false
+ 512
+ 512
+ 4
+ 257
+ 2293
+ v2
+ true
+ false
+ false
+ false
+ false
+ 4
+ false
+ false
+ false
+ square
+ false
+ false
+ 8
+ false
+ -1
+ -1
+ true
+ 0.1
+
+
+ .locs
+
\ No newline at end of file
diff --git a/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/config.xml b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/config.xml
new file mode 100755
index 0000000..64d0ce0
--- /dev/null
+++ b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities/config.xml
@@ -0,0 +1,128 @@
+
+
+
+
+
+ 0
+ 0
+ 0
+ 0
+ 0
+
+
+ 0
+ 0
+ 0
+ 0
+ 0
+
+ 1
+ 75
+ 140624_MS6_13349_A_MS2639979-300V2
+
+
+ 76
+ 87
+ 140624_MS6_13349_A_MS2639979-300V2
+
+
+ 88
+ 95
+ 140624_MS6_13349_A_MS2639979-300V2
+
+
+ 96
+ 170
+ 140624_MS6_13349_A_MS2639979-300V2
+
+ MS6
+ 0
+ 0
+ 0
+ 0
+
+ 1
+ 75
+ 140624_MS6_13349_A_MS2639979-300V2
+
+
+ 76
+ 87
+ 140624_MS6_13349_A_MS2639979-300V2
+
+
+ 88
+ 95
+ 140624_MS6_13349_A_MS2639979-300V2
+
+
+ 96
+ 170
+ 140624_MS6_13349_A_MS2639979-300V2
+
+ 140624_MS6_13349_A_MS2639979-300V2
+ 140624
+ 13349
+ 000000000-A9RLY
+
+ 76
+ 77
+ 78
+ 79
+ 80
+ 81
+ 82
+ 83
+ 84
+ 85
+ 86
+ 87
+ 88
+ 89
+ 90
+ 91
+ 92
+ 93
+ 94
+ 95
+
+ V6
+
+
+
+
+ s
+ 1101
+ 1102
+ 1103
+ 1104
+ 1105
+ 1106
+ 1107
+ 1108
+ 1109
+ 1110
+ 1111
+ 1112
+ 1113
+ 1114
+ 2101
+ 2102
+ 2103
+ 2104
+ 2105
+ 2106
+ 2107
+ 2108
+ 2109
+ 2110
+ 2111
+ 2112
+ 2113
+ 2114
+
+
+
+
+
+
\ No newline at end of file
diff --git a/test/i2b/140624_MS6_13349_A_MS2639979-300V2/ImageAnalysis_Netcopy_complete.txt b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/ImageAnalysis_Netcopy_complete.txt
new file mode 100755
index 0000000..479abc7
--- /dev/null
+++ b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/ImageAnalysis_Netcopy_complete.txt
@@ -0,0 +1 @@
+6/25/2014,02:48:51.555,Illumina RTA 1.18.54
diff --git a/test/i2b/140624_MS6_13349_A_MS2639979-300V2/ImageAnalysis_Netcopy_complete_Read1.txt b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/ImageAnalysis_Netcopy_complete_Read1.txt
new file mode 100755
index 0000000..555e70b
--- /dev/null
+++ b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/ImageAnalysis_Netcopy_complete_Read1.txt
@@ -0,0 +1 @@
+6/24/2014,19:08:36.928,Illumina RTA 1.18.54
diff --git a/test/i2b/140624_MS6_13349_A_MS2639979-300V2/ImageAnalysis_Netcopy_complete_Read2.txt b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/ImageAnalysis_Netcopy_complete_Read2.txt
new file mode 100755
index 0000000..64a7c15
--- /dev/null
+++ b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/ImageAnalysis_Netcopy_complete_Read2.txt
@@ -0,0 +1 @@
+6/24/2014,20:18:40.724,Illumina RTA 1.18.54
diff --git a/test/i2b/140624_MS6_13349_A_MS2639979-300V2/ImageAnalysis_Netcopy_complete_Read3.txt b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/ImageAnalysis_Netcopy_complete_Read3.txt
new file mode 100755
index 0000000..571ea06
--- /dev/null
+++ b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/ImageAnalysis_Netcopy_complete_Read3.txt
@@ -0,0 +1 @@
+6/24/2014,21:12:10.767,Illumina RTA 1.18.54
diff --git a/test/i2b/140624_MS6_13349_A_MS2639979-300V2/ImageAnalysis_Netcopy_complete_Read4.txt b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/ImageAnalysis_Netcopy_complete_Read4.txt
new file mode 100755
index 0000000..5a5cda1
--- /dev/null
+++ b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/ImageAnalysis_Netcopy_complete_Read4.txt
@@ -0,0 +1 @@
+6/25/2014,02:48:51.565,Illumina RTA 1.18.54
diff --git a/test/i2b/140624_MS6_13349_A_MS2639979-300V2/RTAComplete.txt b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/RTAComplete.txt
new file mode 100755
index 0000000..a4d64dc
--- /dev/null
+++ b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/RTAComplete.txt
@@ -0,0 +1 @@
+6/25/2014,02:49:01.645,Illumina RTA 1.18.54
diff --git a/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Recipe/MS2639979-300V2.xml b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Recipe/MS2639979-300V2.xml
new file mode 100755
index 0000000..f276957
--- /dev/null
+++ b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Recipe/MS2639979-300V2.xml
@@ -0,0 +1,501 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Recipe/RunState.xml b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Recipe/RunState.xml
new file mode 100755
index 0000000..663fb34
--- /dev/null
+++ b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/Recipe/RunState.xml
@@ -0,0 +1,8 @@
+
+
+ 28
+ 170
+ 170
+ 0
+ 3
+
\ No newline at end of file
diff --git a/test/i2b/140624_MS6_13349_A_MS2639979-300V2/RunInfo.xml b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/RunInfo.xml
new file mode 100755
index 0000000..bb73edc
--- /dev/null
+++ b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/RunInfo.xml
@@ -0,0 +1,15 @@
+
+
+
+ 000000000-A9RLY
+ M02069
+ 140624
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/test/i2b/140624_MS6_13349_A_MS2639979-300V2/SampleSheet.csv b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/SampleSheet.csv
new file mode 100755
index 0000000..1597629
--- /dev/null
+++ b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/SampleSheet.csv
@@ -0,0 +1,114 @@
+[Header],,,,
+Investigator Name,sh2,,,
+Project Name,Transposon Based Genetic Screening in Mice,,,
+Experiment Name,13349,,,
+Date,2014-06-24T11:51:11,,,
+Workflow,LibraryQC,,,
+Chemistry,Transposon_Eukaryotic,,,
+,,,,
+[Reads],,,,
+75,,,,
+75,,,,
+,,,,
+[Settings],,,,
+,,,,
+[Manifests],,,,
+,,,,
+[Data],,,,
+Sample_ID,Sample_Name,GenomeFolder,Index,Index2
+10589429,PAZC_8_5c_Spleen,C:\Illumina\MiSeq Reporter\Genomes\WTSI_references\Mus_musculus\NCBIm37\all\fasta\,TAGGGTTAANNN,TAGCTTGT
+10589430,PAZC_9_1a_Spleen,C:\Illumina\MiSeq Reporter\Genomes\WTSI_references\Mus_musculus\NCBIm37\all\fasta\,TAGGGTTAANNN,CGATGTTT
+10589431,PAZC_7_4d_throat_LN,C:\Illumina\MiSeq Reporter\Genomes\WTSI_references\Mus_musculus\NCBIm37\all\fasta\,TAGGGTTAANNN,GCCAATGT
+10589432,PAZC_9_2c_Spleen,C:\Illumina\MiSeq Reporter\Genomes\WTSI_references\Mus_musculus\NCBIm37\all\fasta\,TAGGGTTAANNN,ACAGTGGT
+10589433,PAZC_1_1c_Spleen,C:\Illumina\MiSeq Reporter\Genomes\WTSI_references\Mus_musculus\NCBIm37\all\fasta\,TAGGGTTAANNN,ATCACGTT
+10589434,PAZC_1_1c_lung,C:\Illumina\MiSeq Reporter\Genomes\WTSI_references\Mus_musculus\NCBIm37\all\fasta\,TAGGGTTAANNN,GATCAGCG
+10589435,PAZC_7_5f_spleen,C:\Illumina\MiSeq Reporter\Genomes\WTSI_references\Mus_musculus\NCBIm37\all\fasta\,TAGGGTTAANNN,CAGATCTG
+10589436,PAZC_8_7f_Spleen,C:\Illumina\MiSeq Reporter\Genomes\WTSI_references\Mus_musculus\NCBIm37\all\fasta\,TAGGGTTAANNN,TTAGGCAT
+10589437,PAZC_9_1g_Skin_tu,C:\Illumina\MiSeq Reporter\Genomes\WTSI_references\Mus_musculus\NCBIm37\all\fasta\,TAGGGTTAANNN,GGCTACAG
+10589438,PAZC_8_4c_Spleen,C:\Illumina\MiSeq Reporter\Genomes\WTSI_references\Mus_musculus\NCBIm37\all\fasta\,TAGGGTTAANNN,CTTGTACT
+10589439,PAZC_9_10f_Spleen,C:\Illumina\MiSeq Reporter\Genomes\WTSI_references\Mus_musculus\NCBIm37\all\fasta\,TAGGGTTAANNN,ACTTGATG
+10589440,PAZC_8_4j_mes_LN,C:\Illumina\MiSeq Reporter\Genomes\WTSI_references\Mus_musculus\NCBIm37\all\fasta\,TAGGGTTAANNN,TGACCACT
+10589441,PAZC_6_4f_Spleen,C:\Illumina\MiSeq Reporter\Genomes\WTSI_references\Mus_musculus\NCBIm37\all\fasta\,TAGGGTTAANNN,TGGTTGTT
+10589442,PAZC_8_2f_Spleen,C:\Illumina\MiSeq Reporter\Genomes\WTSI_references\Mus_musculus\NCBIm37\all\fasta\,TAGGGTTAANNN,TCTCGGTT
+10589443,PAZC_6_4d_Spleen,C:\Illumina\MiSeq Reporter\Genomes\WTSI_references\Mus_musculus\NCBIm37\all\fasta\,TAGGGTTAANNN,TAAGCGTT
+10589444,PAZC_8_1d_spleen,C:\Illumina\MiSeq Reporter\Genomes\WTSI_references\Mus_musculus\NCBIm37\all\fasta\,TAGGGTTAANNN,TCCGTCTT
+10589445,PAZC_7_6e_Thymus,C:\Illumina\MiSeq Reporter\Genomes\WTSI_references\Mus_musculus\NCBIm37\all\fasta\,TAGGGTTAANNN,TGTACCTT
+10589446,PAZC_7_6a_spleen,C:\Illumina\MiSeq Reporter\Genomes\WTSI_references\Mus_musculus\NCBIm37\all\fasta\,TAGGGTTAANNN,TTCTGTGT
+10589447,PAZC_8_3a_spleen,C:\Illumina\MiSeq Reporter\Genomes\WTSI_references\Mus_musculus\NCBIm37\all\fasta\,TAGGGTTAANNN,TCTGCTGT
+10589448,PAZC_7_2f_cer_LN,C:\Illumina\MiSeq Reporter\Genomes\WTSI_references\Mus_musculus\NCBIm37\all\fasta\,TAGGGTTAANNN,TTGGAGGT
+10589449,PAZC_8_1b_spleen,C:\Illumina\MiSeq Reporter\Genomes\WTSI_references\Mus_musculus\NCBIm37\all\fasta\,TAGGGTTAANNN,TCGAGCGT
+10589450,PAZC_8_7b_spleen,C:\Illumina\MiSeq Reporter\Genomes\WTSI_references\Mus_musculus\NCBIm37\all\fasta\,TAGGGTTAANNN,TGATACGT
+10589451,PAZC_7_1e_spleen,C:\Illumina\MiSeq Reporter\Genomes\WTSI_references\Mus_musculus\NCBIm37\all\fasta\,TAGGGTTAANNN,TGCATAGT
+10589452,PAZC_6_6d_spleen,C:\Illumina\MiSeq Reporter\Genomes\WTSI_references\Mus_musculus\NCBIm37\all\fasta\,TAGGGTTAANNN,TTGACTCT
+10589453,PAZC_8_7c_spleen,C:\Illumina\MiSeq Reporter\Genomes\WTSI_references\Mus_musculus\NCBIm37\all\fasta\,TAGGGTTAANNN,TGCGATCT
+10589454,PAZC_7_1a_mes_LN,C:\Illumina\MiSeq Reporter\Genomes\WTSI_references\Mus_musculus\NCBIm37\all\fasta\,TAGGGTTAANNN,TAGTGACT
+10589455,PAZC_8_2b_mes_LN,C:\Illumina\MiSeq Reporter\Genomes\WTSI_references\Mus_musculus\NCBIm37\all\fasta\,TAGGGTTAANNN,TACAGGAT
+10589456,PAZC_9_2a_lung,C:\Illumina\MiSeq Reporter\Genomes\WTSI_references\Mus_musculus\NCBIm37\all\fasta\,TAGGGTTAANNN,TCCTCAAT
+10589457,PAZC_9_2a_spleen,C:\Illumina\MiSeq Reporter\Genomes\WTSI_references\Mus_musculus\NCBIm37\all\fasta\,TAGGGTTAANNN,TGTGGTTG
+10589458,PAZC_8_1c_Thymus,C:\Illumina\MiSeq Reporter\Genomes\WTSI_references\Mus_musculus\NCBIm37\all\fasta\,TAGGGTTAANNN,TAGTCTTG
+10589459,PAZC_9_8d_Spleen,C:\Illumina\MiSeq Reporter\Genomes\WTSI_references\Mus_musculus\NCBIm37\all\fasta\,TAGGGTTAANNN,TCGAAGTG
+10589460,PAZC_8_3f_thorax_tu,C:\Illumina\MiSeq Reporter\Genomes\WTSI_references\Mus_musculus\NCBIm37\all\fasta\,TAGGGTTAANNN,TAACGCTG
+10589461,PAZC_8_3f_Spleen,C:\Illumina\MiSeq Reporter\Genomes\WTSI_references\Mus_musculus\NCBIm37\all\fasta\,TAGGGTTAANNN,TTGGTATG
+10589462,PAZC_6_8e_spleen,C:\Illumina\MiSeq Reporter\Genomes\WTSI_references\Mus_musculus\NCBIm37\all\fasta\,TAGGGTTAANNN,TGAACTGG
+10589463,PAZC_9_6a_lung,C:\Illumina\MiSeq Reporter\Genomes\WTSI_references\Mus_musculus\NCBIm37\all\fasta\,TAGGGTTAANNN,TACTTCGG
+10589464,PAZC_7_5e_spleen,C:\Illumina\MiSeq Reporter\Genomes\WTSI_references\Mus_musculus\NCBIm37\all\fasta\,TAGGGTTAANNN,TCTCACGG
+10589465,PAZC_7_5e_si_tu,C:\Illumina\MiSeq Reporter\Genomes\WTSI_references\Mus_musculus\NCBIm37\all\fasta\,TAGGGTTAANNN,TCAGGAGG
+10589466,PAZC_6_4c_spleen,C:\Illumina\MiSeq Reporter\Genomes\WTSI_references\Mus_musculus\NCBIm37\all\fasta\,TAGGGTTAANNN,TAAGTTCG
+10589467,PAZC_8_6f_spleen,C:\Illumina\MiSeq Reporter\Genomes\WTSI_references\Mus_musculus\NCBIm37\all\fasta\,TAGGGTTAANNN,TCCAGTCG
+10589468,PAZC_6_8d_spleen,C:\Illumina\MiSeq Reporter\Genomes\WTSI_references\Mus_musculus\NCBIm37\all\fasta\,TAGGGTTAANNN,TGTATGCG
+10589469,PAZC_8_7a_cer_LN,C:\Illumina\MiSeq Reporter\Genomes\WTSI_references\Mus_musculus\NCBIm37\all\fasta\,TAGGGTTAANNN,TCATTGAG
+10589470,PAZC_6_3b_liver,C:\Illumina\MiSeq Reporter\Genomes\WTSI_references\Mus_musculus\NCBIm37\all\fasta\,TAGGGTTAANNN,TGGCTCAG
+10589471,PAZC_9_6g_spleen,C:\Illumina\MiSeq Reporter\Genomes\WTSI_references\Mus_musculus\NCBIm37\all\fasta\,TAGGGTTAANNN,TATGCCAG
+10589472,PAZC_9_7f_spleen,C:\Illumina\MiSeq Reporter\Genomes\WTSI_references\Mus_musculus\NCBIm37\all\fasta\,TAGGGTTAANNN,TCAGATTC
+10589473,PAZC_9_8e_spleen,C:\Illumina\MiSeq Reporter\Genomes\WTSI_references\Mus_musculus\NCBIm37\all\fasta\,TAGGGTTAANNN,TACTAGTC
+10589474,PAZC_6_6e_LN,C:\Illumina\MiSeq Reporter\Genomes\WTSI_references\Mus_musculus\NCBIm37\all\fasta\,TAGGGTTAANNN,TTCAGCTC
+10589475,PAZC_8_6c_spleen,C:\Illumina\MiSeq Reporter\Genomes\WTSI_references\Mus_musculus\NCBIm37\all\fasta\,TAGGGTTAANNN,TGTCTATC
+10589476,PAZC_7_8c_spleen,C:\Illumina\MiSeq Reporter\Genomes\WTSI_references\Mus_musculus\NCBIm37\all\fasta\,TAGGGTTAANNN,TATGTGGC
+10589477,PAZC_6_7c_mes_LN,C:\Illumina\MiSeq Reporter\Genomes\WTSI_references\Mus_musculus\NCBIm37\all\fasta\,TAGGGTTAANNN,TTACTCGC
+10589478,PAZC_9_5e_spleen,C:\Illumina\MiSeq Reporter\Genomes\WTSI_references\Mus_musculus\NCBIm37\all\fasta\,TAGGGTTAANNN,TCGTTAGC
+10589479,PAZC_8_4e_Thymus,C:\Illumina\MiSeq Reporter\Genomes\WTSI_references\Mus_musculus\NCBIm37\all\fasta\,TAGGGTTAANNN,TACCGAGC
+10589480,PAZC_9_11b_LN,C:\Illumina\MiSeq Reporter\Genomes\WTSI_references\Mus_musculus\NCBIm37\all\fasta\,TAGGGTTAANNN,TGTTCTCC
+10589481,PAZC_7_8b_LN,C:\Illumina\MiSeq Reporter\Genomes\WTSI_references\Mus_musculus\NCBIm37\all\fasta\,TAGGGTTAANNN,TTCGCACC
+10589482,PAZC_8_2d_lung_tu,C:\Illumina\MiSeq Reporter\Genomes\WTSI_references\Mus_musculus\NCBIm37\all\fasta\,TAGGGTTAANNN,TTGCGTAC
+10589483,PAZC_9_11c_spleen,C:\Illumina\MiSeq Reporter\Genomes\WTSI_references\Mus_musculus\NCBIm37\all\fasta\,TAGGGTTAANNN,TCTACGAC
+10589484,MONE_1_14c_spleen,C:\Illumina\MiSeq Reporter\Genomes\WTSI_references\Mus_musculus\NCBIm37\all\fasta\,TAGGGTTAANNN,TGACAGAC
+10589485,PAZC_7_5i_Thymus,C:\Illumina\MiSeq Reporter\Genomes\WTSI_references\Mus_musculus\NCBIm37\all\fasta\,TAGGGTTAANNN,TAGAACAC
+10589486,PAZC_14_2e_spleen,C:\Illumina\MiSeq Reporter\Genomes\WTSI_references\Mus_musculus\NCBIm37\all\fasta\,TAGGGTTAANNN,TCATCCTA
+10589487,PAZC_15_3i_lumber_LN,C:\Illumina\MiSeq Reporter\Genomes\WTSI_references\Mus_musculus\NCBIm37\all\fasta\,TAGGGTTAANNN,TGCTGATA
+10589488,PAZC_9_6b_lung_tu,C:\Illumina\MiSeq Reporter\Genomes\WTSI_references\Mus_musculus\NCBIm37\all\fasta\,TAGGGTTAANNN,TAGACGGA
+10589489,PAZC_15_4h_Tail,C:\Illumina\MiSeq Reporter\Genomes\WTSI_references\Mus_musculus\NCBIm37\all\fasta\,TAGGGTTAANNN,TGTGAAGA
+10589490,PAZC_15_4h_spleen,C:\Illumina\MiSeq Reporter\Genomes\WTSI_references\Mus_musculus\NCBIm37\all\fasta\,TAGGGTTAANNN,TCTCTTCA
+10589491,PAZC_15_4h_Thymus,C:\Illumina\MiSeq Reporter\Genomes\WTSI_references\Mus_musculus\NCBIm37\all\fasta\,TAGGGTTAANNN,TTGTTCCA
+10589492,PAZC_15_4h_LN,C:\Illumina\MiSeq Reporter\Genomes\WTSI_references\Mus_musculus\NCBIm37\all\fasta\,TAGGGTTAANNN,TGAAGCCA
+10589493,PAZC_15_2b_Thymus,C:\Illumina\MiSeq Reporter\Genomes\WTSI_references\Mus_musculus\NCBIm37\all\fasta\,TAGGGTTAANNN,TACCACCA
+10589494,PAZC_15_2h_mass,C:\Illumina\MiSeq Reporter\Genomes\WTSI_references\Mus_musculus\NCBIm37\all\fasta\,TAGGGTTAANNN,TGCGTGAA
+10589495,PAZC_15_2h_Ovary,C:\Illumina\MiSeq Reporter\Genomes\WTSI_references\Mus_musculus\NCBIm37\all\fasta\,TAGGGTTAANNN,GGTGAGTT
+10589496,PAZC_14_2a_spleen,C:\Illumina\MiSeq Reporter\Genomes\WTSI_references\Mus_musculus\NCBIm37\all\fasta\,TAGGGTTAANNN,GATCTCTT
+10589497,PAZC_15_4b_spleen,C:\Illumina\MiSeq Reporter\Genomes\WTSI_references\Mus_musculus\NCBIm37\all\fasta\,TAGGGTTAANNN,GTGTCCTT
+10589498,PAZC_15_4i_lumber_LN,C:\Illumina\MiSeq Reporter\Genomes\WTSI_references\Mus_musculus\NCBIm37\all\fasta\,TAGGGTTAANNN,GACGGATT
+10589499,PAZC_14_4a_Spleen,C:\Illumina\MiSeq Reporter\Genomes\WTSI_references\Mus_musculus\NCBIm37\all\fasta\,TAGGGTTAANNN,GCAACATT
+10589500,PAZC_15_4c_Thymus,C:\Illumina\MiSeq Reporter\Genomes\WTSI_references\Mus_musculus\NCBIm37\all\fasta\,TAGGGTTAANNN,GGTCGTGT
+10589501,PAZC_15_4d_Spleen,C:\Illumina\MiSeq Reporter\Genomes\WTSI_references\Mus_musculus\NCBIm37\all\fasta\,TAGGGTTAANNN,GAATCTGT
+10589502,WONE_2_1c_spleen,C:\Illumina\MiSeq Reporter\Genomes\WTSI_references\Mus_musculus\NCBIm37\all\fasta\,TAGGGTTAANNN,GTACATCT
+10589503,WONE_2_1j_Mes_LN,C:\Illumina\MiSeq Reporter\Genomes\WTSI_references\Mus_musculus\NCBIm37\all\fasta\,TAGGGTTAANNN,GAGGTGCT
+10589504,WONE_2_2a_spleen,C:\Illumina\MiSeq Reporter\Genomes\WTSI_references\Mus_musculus\NCBIm37\all\fasta\,TAGGGTTAANNN,GCATGGCT
+10589505,WONE_2_1s_spleen,C:\Illumina\MiSeq Reporter\Genomes\WTSI_references\Mus_musculus\NCBIm37\all\fasta\,TAGGGTTAANNN,GTTAGCCT
+10589506,WONE_143488_spleen,C:\Illumina\MiSeq Reporter\Genomes\WTSI_references\Mus_musculus\NCBIm37\all\fasta\,TAGGGTTAANNN,GTCGCTAT
+10589507,WONE_2_5g_spleen,C:\Illumina\MiSeq Reporter\Genomes\WTSI_references\Mus_musculus\NCBIm37\all\fasta\,TAGGGTTAANNN,GGAATGAT
+10589508,WONE_2_2m_spleen,C:\Illumina\MiSeq Reporter\Genomes\WTSI_references\Mus_musculus\NCBIm37\all\fasta\,TAGGGTTAANNN,GAGCCAAT
+10589509,WONE_2_1p_mes_LN,C:\Illumina\MiSeq Reporter\Genomes\WTSI_references\Mus_musculus\NCBIm37\all\fasta\,TAGGGTTAANNN,GCTCCTTG
+10589510,WONE_2_1i_mes_LN,C:\Illumina\MiSeq Reporter\Genomes\WTSI_references\Mus_musculus\NCBIm37\all\fasta\,TAGGGTTAANNN,GTAAGGTG
+10589511,WONE_2_8a_cer_LN,C:\Illumina\MiSeq Reporter\Genomes\WTSI_references\Mus_musculus\NCBIm37\all\fasta\,TAGGGTTAANNN,GAGGATGG
+10589512,WONE_20_6c_spleen,C:\Illumina\MiSeq Reporter\Genomes\WTSI_references\Mus_musculus\NCBIm37\all\fasta\,TAGGGTTAANNN,GTTGTCGG
+10589513,WONE_2_2c_spleen,C:\Illumina\MiSeq Reporter\Genomes\WTSI_references\Mus_musculus\NCBIm37\all\fasta\,TAGGGTTAANNN,GATAGAGG
+10589514,WONE_2_8d_spleen,C:\Illumina\MiSeq Reporter\Genomes\WTSI_references\Mus_musculus\NCBIm37\all\fasta\,TAGGGTTAANNN,GACCTTAG
+10589515,WONE_2_8b_spleen,C:\Illumina\MiSeq Reporter\Genomes\WTSI_references\Mus_musculus\NCBIm37\all\fasta\,TAGGGTTAANNN,GCCTGTTC
+10589516,PAZE_2_6e_spleen,C:\Illumina\MiSeq Reporter\Genomes\WTSI_references\Mus_musculus\NCBIm37\all\fasta\,TAGGGTTAANNN,GCACTGTC
+10589517,PAZB_2_2e_spleen,C:\Illumina\MiSeq Reporter\Genomes\WTSI_references\Mus_musculus\NCBIm37\all\fasta\,TAGGGTTAANNN,GCTAACTC
+10589518,PAZB_2_2g_cer_LN,C:\Illumina\MiSeq Reporter\Genomes\WTSI_references\Mus_musculus\NCBIm37\all\fasta\,TAGGGTTAANNN,GATTCATC
+10589519,PAZB_2_2g_spleen,C:\Illumina\MiSeq Reporter\Genomes\WTSI_references\Mus_musculus\NCBIm37\all\fasta\,TAGGGTTAANNN,GTCTTGGC
+10589520,PAZB_2_2a_Tail,C:\Illumina\MiSeq Reporter\Genomes\WTSI_references\Mus_musculus\NCBIm37\all\fasta\,TAGGGTTAANNN,GTAGAAGC
+10589521,PAZB_2_2a_Thymus,C:\Illumina\MiSeq Reporter\Genomes\WTSI_references\Mus_musculus\NCBIm37\all\fasta\,TAGGGTTAANNN,GATGGTCC
+10589522,PAZB_2_2a_Spleen,C:\Illumina\MiSeq Reporter\Genomes\WTSI_references\Mus_musculus\NCBIm37\all\fasta\,TAGGGTTAANNN,GTGCTACC
+10589523,PAZB_2_2a_mes_LN,C:\Illumina\MiSeq Reporter\Genomes\WTSI_references\Mus_musculus\NCBIm37\all\fasta\,TAGGGTTAANNN,GCGATTAC
+10589524,PAZB_2_7h_spleen,C:\Illumina\MiSeq Reporter\Genomes\WTSI_references\Mus_musculus\NCBIm37\all\fasta\,TAGGGTTAANNN,GGTTGGAC
diff --git a/test/i2b/140624_MS6_13349_A_MS2639979-300V2/runParameters.xml b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/runParameters.xml
new file mode 100755
index 0000000..30137cd
--- /dev/null
+++ b/test/i2b/140624_MS6_13349_A_MS2639979-300V2/runParameters.xml
@@ -0,0 +1,74 @@
+
+
+ false
+ true
+
+ 000000000-A9RLY
+ 15028382
+ 2015-04-16T00:00:00
+
+
+ MS2306658-00PR2
+ 15041807
+ 2015-04-24T00:00:00
+
+
+ MS2639979-300V2
+ 15033572
+ 2015-02-08T00:00:00
+
+ true
+
+ Post-Run Wash
+
+ true
+ 2.4.1.3
+ 14
+ 1
+ 1
+ MiSeq Control Software
+
+ 140624_MS6_13349_A_MS2639979-300V2
+ M02069
+ 133
+ 9.5.12
+ 2.4.1.3
+ 1.18.54
+ 000000000-A9RLY
+ MS2306658-00PR2
+ 15033572
+ Version2
+ MS2639979-300V2
+
+
+ 13349
+ Transposon_Eukaryotic
+ sbsuser
+
+ LibraryQC
+
+ false
+
+
+
+
+
+
+ D:\Illumina\MiSeqTemp\140624_MS6_13349_A_MS2639979-300V2
+ D:\Illumina\MiSeqAnalysis\140624_MS6_13349_A_MS2639979-300V2
+ 140624
+ PostRun
+ D:\Illumina\MiSeq Control Software\CustomRecipe
+ C:\Illumina\MiSeq Control Software\Recipe
+ MS2639979-300V2
+ Y:\ILorHSorMS_sf49\samplesheets
+ D:\Illumina\MiSeq Control Software\Manifests
+ Y:\ILorHSorMS_sf49\incoming\140624_MS6_13349_A_MS2639979-300V2
+ AutoFocus
+ Both
+ true
+ true
+
+ Standalone
+ false
+
\ No newline at end of file
diff --git a/test/i2b/Makefile.am b/test/i2b/Makefile.am
new file mode 100644
index 0000000..ff9de66
--- /dev/null
+++ b/test/i2b/Makefile.am
@@ -0,0 +1,7 @@
+AM_CPPFLAGS = $(HTSLIB_CPPFLAGS)
+AM_LDFLAGS = $(HTSLIB_LDFLAGS)
+
+bin_PROGRAMS = t_i2b
+t_i2b_SOURCES = t_i2b.c ../../src/posfile.c ../../src/bclfile.c ../../src/filterfile.c
+t_i2b_CFLAGS = -I$(top_srcdir)/src -I/usr/include/libxml2 -DDATA_DIR=$(abs_srcdir)
+t_i2b_LDADD = $(HTSLIB_HOME)/lib/libhts.a -ldl -lxml2 -lz -llzma -lbz2 -lpthread
diff --git a/test/i2b/out/test1.bam b/test/i2b/out/test1.bam
new file mode 100644
index 0000000..c08221c
Binary files /dev/null and b/test/i2b/out/test1.bam differ
diff --git a/test/i2b/out/test2.bam b/test/i2b/out/test2.bam
new file mode 100644
index 0000000..432a0ad
Binary files /dev/null and b/test/i2b/out/test2.bam differ
diff --git a/test/i2b/out/test4.bam b/test/i2b/out/test4.bam
new file mode 100644
index 0000000..9588d1b
Binary files /dev/null and b/test/i2b/out/test4.bam differ
diff --git a/test/i2b/out/test5.bam b/test/i2b/out/test5.bam
new file mode 100644
index 0000000..fe52cda
Binary files /dev/null and b/test/i2b/out/test5.bam differ
diff --git a/test/i2b/out/test6.bam b/test/i2b/out/test6.bam
new file mode 100644
index 0000000..7d9ea2a
Binary files /dev/null and b/test/i2b/out/test6.bam differ
diff --git a/test/i2b/t_i2b.c b/test/i2b/t_i2b.c
new file mode 100644
index 0000000..2913c9f
--- /dev/null
+++ b/test/i2b/t_i2b.c
@@ -0,0 +1,463 @@
+/* test/i2b/i2b.c -- i2b test cases.
+
+ Copyright (C) 2016 Genome Research Ltd.
+
+ Author: Jennifer Liddle
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU Affero General Public License as published
+by the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU Affero General Public License for more details.
+
+You should have received a copy of the GNU Affero General Public License
+along with this program. If not, see .
+
+*/
+#include
+
+#include "bambi.h"
+#include "../../src/i2b.c"
+#include
+#include
+
+#define xMKNAME(d,f) #d f
+#define MKNAME(d,f) xMKNAME(d,f)
+
+int verbose = 0;
+
+const char * bambi_version(void)
+{
+ return "12.34";
+}
+
+int success = 0;
+int failure = 0;
+
+void setup_param_test(int* argc, char*** argv)
+{
+ *argc = 0;
+ *argv = (char**)calloc(sizeof(char*), 100);
+ (*argv)[(*argc)++] = strdup("bambi");
+ (*argv)[(*argc)++] = strdup("i2b");
+ (*argv)[(*argc)++] = strdup("-i");
+ (*argv)[(*argc)++] = strdup(MKNAME(DATA_DIR,"/110323_HS13_06000_B_B039WABXX/Data/Intensities"));
+ (*argv)[(*argc)++] = strdup("-o");
+ (*argv)[(*argc)++] = strdup("test/i2b/out/xxx.sam");
+ (*argv)[(*argc)++] = strdup("--output-fmt");
+ (*argv)[(*argc)++] = strdup("sam");
+ (*argv)[(*argc)++] = strdup("--lane");
+ (*argv)[(*argc)++] = strdup("1");
+ (*argv)[(*argc)++] = strdup("--first-tile");
+ (*argv)[(*argc)++] = strdup("1101");
+ (*argv)[(*argc)++] = strdup("--tile-limit");
+ (*argv)[(*argc)++] = strdup("1");
+ (*argv)[(*argc)++] = strdup("--library-name");
+ (*argv)[(*argc)++] = strdup("testlibrary");
+ (*argv)[(*argc)++] = strdup("--run-folder");
+ (*argv)[(*argc)++] = strdup(MKNAME(DATA_DIR,"/110323_HS13_06000_B_B039WABXX/"));
+ (*argv)[(*argc)++] = strdup("--study-name");
+ (*argv)[(*argc)++] = strdup("teststudy");
+ (*argv)[(*argc)++] = strdup("--basecalls-dir");
+ (*argv)[(*argc)++] = strdup(MKNAME(DATA_DIR,"/110323_HS13_06000_B_B039WABXX/Data/Intensities/BaseCalls/"));
+ (*argv)[(*argc)++] = strdup("--generate-secondary-basecalls");
+ (*argv)[(*argc)++] = strdup("--no-filter");
+ (*argv)[(*argc)++] = strdup("--sequencing-centre");
+ (*argv)[(*argc)++] = strdup("XY");
+ (*argv)[(*argc)++] = strdup("--platform");
+ (*argv)[(*argc)++] = strdup("Illumina");
+ (*argv)[(*argc)++] = strdup("--first-tile");
+ (*argv)[(*argc)++] = strdup("1103");
+ (*argv)[(*argc)++] = strdup("--tile-limit");
+ (*argv)[(*argc)++] = strdup("5");
+ (*argv)[(*argc)++] = strdup("--barcode-tag");
+ (*argv)[(*argc)++] = strdup("AB");
+ (*argv)[(*argc)++] = strdup("--quality-tag");
+ (*argv)[(*argc)++] = strdup("CD");
+ (*argv)[(*argc)++] = strdup("--sec-barcode-tag");
+ (*argv)[(*argc)++] = strdup("WX");
+ (*argv)[(*argc)++] = strdup("--sec-quality-tag");
+ (*argv)[(*argc)++] = strdup("YZ");
+ (*argv)[(*argc)++] = strdup("--bc-read");
+ (*argv)[(*argc)++] = strdup("2");
+ (*argv)[(*argc)++] = strdup("--first-cycle");
+ (*argv)[(*argc)++] = strdup("7");
+ (*argv)[(*argc)++] = strdup("--first-cycle");
+ (*argv)[(*argc)++] = strdup("17");
+ (*argv)[(*argc)++] = strdup("--first-cycle");
+ (*argv)[(*argc)++] = strdup("70");
+ (*argv)[(*argc)++] = strdup("--final-cycle");
+ (*argv)[(*argc)++] = strdup("9");
+ (*argv)[(*argc)++] = strdup("--final-index-cycle");
+ (*argv)[(*argc)++] = strdup("9");
+ (*argv)[(*argc)++] = strdup("--add-cluster-index-tag");
+
+ assert(*argc<100);
+}
+
+void setup_test_1(int* argc, char*** argv)
+{
+ *argc = 0;
+ *argv = (char**)calloc(sizeof(char*), 100);
+ (*argv)[(*argc)++] = strdup("bambi");
+ (*argv)[(*argc)++] = strdup("i2b");
+ (*argv)[(*argc)++] = strdup("-i");
+ (*argv)[(*argc)++] = strdup(MKNAME(DATA_DIR,"/110323_HS13_06000_B_B039WABXX/Data/Intensities"));
+ (*argv)[(*argc)++] = strdup("-o");
+ (*argv)[(*argc)++] = strdup(MKNAME(DATA_DIR,"/out/xxx.bam"));
+ (*argv)[(*argc)++] = strdup("--lane");
+ (*argv)[(*argc)++] = strdup("1");
+ (*argv)[(*argc)++] = strdup("--first-tile");
+ (*argv)[(*argc)++] = strdup("1101");
+ (*argv)[(*argc)++] = strdup("--tile-limit");
+ (*argv)[(*argc)++] = strdup("1");
+ (*argv)[(*argc)++] = strdup("--library-name");
+ (*argv)[(*argc)++] = strdup("Test library");
+ (*argv)[(*argc)++] = strdup("--sample-alias");
+ (*argv)[(*argc)++] = strdup("Test Sample");
+ (*argv)[(*argc)++] = strdup("--study-name");
+ (*argv)[(*argc)++] = strdup("Study testStudy");
+ (*argv)[(*argc)++] = strdup("--run-start-date");
+ (*argv)[(*argc)++] = strdup("2011-03-23T00:00:00+0000");
+// (*argv)[(*argc)++] = strdup("--generate-secondary-basecalls");
+ (*argv)[(*argc)++] = strdup("--verbose");
+
+ assert(*argc<100);
+}
+
+void setup_test_2(int* argc, char*** argv)
+{
+ *argc = 0;
+ *argv = (char**)calloc(sizeof(char*), 100);
+ (*argv)[(*argc)++] = strdup("bambi");
+ (*argv)[(*argc)++] = strdup("i2b");
+ (*argv)[(*argc)++] = strdup("-i");
+ (*argv)[(*argc)++] = strdup(MKNAME(DATA_DIR,"/110323_HS13_06000_B_B039WABXX/Data/Intensities"));
+ (*argv)[(*argc)++] = strdup("-o");
+ (*argv)[(*argc)++] = strdup(MKNAME(DATA_DIR,"/out/xxx.bam"));
+ (*argv)[(*argc)++] = strdup("--lane");
+ (*argv)[(*argc)++] = strdup("1");
+ (*argv)[(*argc)++] = strdup("--first-tile");
+ (*argv)[(*argc)++] = strdup("1101");
+ (*argv)[(*argc)++] = strdup("--tile-limit");
+ (*argv)[(*argc)++] = strdup("1");
+ (*argv)[(*argc)++] = strdup("--library-name");
+ (*argv)[(*argc)++] = strdup("Test library");
+ (*argv)[(*argc)++] = strdup("--sample-alias");
+ (*argv)[(*argc)++] = strdup("Test Sample");
+ (*argv)[(*argc)++] = strdup("--study-name");
+ (*argv)[(*argc)++] = strdup("Study testStudy");
+ (*argv)[(*argc)++] = strdup("--run-start-date");
+ (*argv)[(*argc)++] = strdup("2011-03-23T00:00:00+0000");
+ (*argv)[(*argc)++] = strdup("--generate-secondary-basecalls");
+ (*argv)[(*argc)++] = strdup("--verbose");
+ (*argv)[(*argc)++] = strdup("--read-group-id");
+ (*argv)[(*argc)++] = strdup("6000_1");
+
+ assert(*argc<100);
+}
+
+void setup_test_4(int* argc, char*** argv)
+{
+ *argc = 0;
+ *argv = (char**)calloc(sizeof(char*), 100);
+ (*argv)[(*argc)++] = strdup("bambi");
+ (*argv)[(*argc)++] = strdup("i2b");
+ (*argv)[(*argc)++] = strdup("-i");
+ (*argv)[(*argc)++] = strdup(MKNAME(DATA_DIR,"/110323_HS13_06000_B_B039WABXX/Data/Intensities"));
+ (*argv)[(*argc)++] = strdup("-o");
+ (*argv)[(*argc)++] = strdup(MKNAME(DATA_DIR,"/out/xxx.bam"));
+ (*argv)[(*argc)++] = strdup("--lane");
+ (*argv)[(*argc)++] = strdup("1");
+ (*argv)[(*argc)++] = strdup("--first-tile");
+ (*argv)[(*argc)++] = strdup("1101");
+ (*argv)[(*argc)++] = strdup("--tile-limit");
+ (*argv)[(*argc)++] = strdup("1");
+ (*argv)[(*argc)++] = strdup("--library-name");
+ (*argv)[(*argc)++] = strdup("TestLibrary");
+ (*argv)[(*argc)++] = strdup("--sample-alias");
+ (*argv)[(*argc)++] = strdup("TestSample");
+ (*argv)[(*argc)++] = strdup("--study-name");
+ (*argv)[(*argc)++] = strdup("Study TestStudy");
+ (*argv)[(*argc)++] = strdup("--run-start-date");
+ (*argv)[(*argc)++] = strdup("2011-03-23T00:00:00+0000");
+ (*argv)[(*argc)++] = strdup("--verbose");
+ (*argv)[(*argc)++] = strdup("--first-cycle");
+ (*argv)[(*argc)++] = strdup("50");
+ (*argv)[(*argc)++] = strdup("--final-cycle");
+ (*argv)[(*argc)++] = strdup("51");
+
+ assert(*argc<100);
+}
+
+void setup_test_5(int* argc, char*** argv)
+{
+ *argc = 0;
+ *argv = (char**)calloc(sizeof(char*), 100);
+ (*argv)[(*argc)++] = strdup("bambi");
+ (*argv)[(*argc)++] = strdup("i2b");
+ (*argv)[(*argc)++] = strdup("-i");
+ (*argv)[(*argc)++] = strdup(MKNAME(DATA_DIR,"/110323_HS13_06000_B_B039WABXX/Data/Intensities"));
+ (*argv)[(*argc)++] = strdup("-o");
+ (*argv)[(*argc)++] = strdup(MKNAME(DATA_DIR,"/out/xxx.bam"));
+ (*argv)[(*argc)++] = strdup("--lane");
+ (*argv)[(*argc)++] = strdup("1");
+ (*argv)[(*argc)++] = strdup("--first-tile");
+ (*argv)[(*argc)++] = strdup("1101");
+ (*argv)[(*argc)++] = strdup("--tile-limit");
+ (*argv)[(*argc)++] = strdup("1");
+ (*argv)[(*argc)++] = strdup("--library-name");
+ (*argv)[(*argc)++] = strdup("TestLibrary");
+ (*argv)[(*argc)++] = strdup("--sample-alias");
+ (*argv)[(*argc)++] = strdup("TestSample");
+ (*argv)[(*argc)++] = strdup("--study-name");
+ (*argv)[(*argc)++] = strdup("Study TestStudy");
+ (*argv)[(*argc)++] = strdup("--run-start-date");
+ (*argv)[(*argc)++] = strdup("2011-03-23T00:00:00+0000");
+ (*argv)[(*argc)++] = strdup("--verbose");
+ (*argv)[(*argc)++] = strdup("--first-cycle");
+ (*argv)[(*argc)++] = strdup("1");
+ (*argv)[(*argc)++] = strdup("--final-cycle");
+ (*argv)[(*argc)++] = strdup("2");
+ (*argv)[(*argc)++] = strdup("--first-cycle");
+ (*argv)[(*argc)++] = strdup("52");
+ (*argv)[(*argc)++] = strdup("--final-cycle");
+ (*argv)[(*argc)++] = strdup("53");
+ (*argv)[(*argc)++] = strdup("--first-index-cycle");
+ (*argv)[(*argc)++] = strdup("50");
+ (*argv)[(*argc)++] = strdup("--final-index-cycle");
+ (*argv)[(*argc)++] = strdup("51");
+ (*argv)[(*argc)++] = strdup("--bc-read");
+ (*argv)[(*argc)++] = strdup("2");
+
+ assert(*argc<100);
+}
+
+void setup_test_6(int* argc, char*** argv)
+{
+ *argc = 0;
+ *argv = (char**)calloc(sizeof(char*), 100);
+ (*argv)[(*argc)++] = strdup("bambi");
+ (*argv)[(*argc)++] = strdup("i2b");
+ (*argv)[(*argc)++] = strdup("-i");
+ (*argv)[(*argc)++] = strdup(MKNAME(DATA_DIR,"/140624_MS6_13349_A_MS2639979-300V2/Data/Intensities"));
+ (*argv)[(*argc)++] = strdup("-o");
+ (*argv)[(*argc)++] = strdup(MKNAME(DATA_DIR,"/out/xxx.bam"));
+ (*argv)[(*argc)++] = strdup("--lane");
+ (*argv)[(*argc)++] = strdup("1");
+ (*argv)[(*argc)++] = strdup("--first-tile");
+ (*argv)[(*argc)++] = strdup("1101");
+ (*argv)[(*argc)++] = strdup("--tile-limit");
+ (*argv)[(*argc)++] = strdup("1");
+ (*argv)[(*argc)++] = strdup("--library-name");
+ (*argv)[(*argc)++] = strdup("TestLibrary");
+ (*argv)[(*argc)++] = strdup("--sample-alias");
+ (*argv)[(*argc)++] = strdup("TestSample");
+ (*argv)[(*argc)++] = strdup("--study-name");
+ (*argv)[(*argc)++] = strdup("Study TestStudy");
+ (*argv)[(*argc)++] = strdup("--run-start-date");
+ (*argv)[(*argc)++] = strdup("2011-03-23T00:00:00+0000");
+ (*argv)[(*argc)++] = strdup("--verbose");
+ (*argv)[(*argc)++] = strdup("--no-filter");
+ (*argv)[(*argc)++] = strdup("--barcode-tag");
+ (*argv)[(*argc)++] = strdup("tr");
+ (*argv)[(*argc)++] = strdup("--quality-tag");
+ (*argv)[(*argc)++] = strdup("tq");
+ (*argv)[(*argc)++] = strdup("--sec-barcode-tag");
+ (*argv)[(*argc)++] = strdup("BC");
+ (*argv)[(*argc)++] = strdup("--sec-quality-tag");
+ (*argv)[(*argc)++] = strdup("QT");
+
+ assert(*argc<100);
+}
+
+void checkLike(char *name, char *expected, char *actual)
+{
+ if (actual == NULL) actual = "";
+ if (strstr(actual, expected) == NULL) {
+ fprintf(stderr, "%s\n" "Expected: %s\n" "Got: %s\n", name, expected, actual);
+ failure++;
+ }
+}
+
+void checkEqual(char *name, char *expected, char *actual)
+{
+ if (actual == NULL) actual = "";
+ if (strcmp(expected, actual)) {
+ fprintf(stderr, "%s\n" "Expected: %s\n" "Got: %s\n", name, expected, actual);
+ failure++;
+ }
+}
+
+void icheckEqual(char *name, int expected, int actual)
+{
+ if (expected != actual) {
+ fprintf(stderr, "%s\n" "Expected: %d\n" "Got: %d\n", name, expected, actual);
+ failure++;
+ }
+}
+
+void test_paramaters(void)
+{
+ // minimal options
+ int argc_1;
+ char** argv_1;
+ setup_param_test(&argc_1, &argv_1);
+ opts_t *opts = i2b_parse_args(argc_1-1, argv_1+1);
+
+ if (verbose) printf("Testing paramaters\n");
+
+ if (!opts) {
+ fprintf(stderr, "parse_args failed\n");
+ failure++;
+ return;
+ }
+
+ checkLike("options: intensity-dir", "test/i2b/110323_HS13_06000_B_B039WABXX/Data/Intensities", opts->intensity_dir);
+ checkEqual("options: output-file", "test/i2b/out/xxx.sam", opts->output_file);
+ checkEqual("options: sample-alias", "testlibrary", opts->sample_alias);
+ checkEqual("options: study-name", "teststudy", opts->study_name);
+ checkLike("options: run-folder", "test/i2b/110323_HS13_06000_B_B039WABXX", opts->run_folder);
+ checkLike("options: basecalls-dir", "test/i2b/110323_HS13_06000_B_B039WABXX/Data/Intensities/BaseCalls", opts->basecalls_dir);
+ icheckEqual("options: lane", 1, opts->lane);
+ icheckEqual("options: generate-secondary-basecalls", 1, opts->generate_secondary_basecalls);
+ icheckEqual("options: no-filter", 1, opts->no_filter);
+ checkEqual("options: read-group-id", "1", opts->read_group_id);
+ checkEqual("options: sequencing-centre", "XY", opts->sequencing_centre);
+ checkEqual("options: platform", "Illumina", opts->platform);
+ icheckEqual("options: first-tile", 1103, opts->first_tile);
+ icheckEqual("options: tile-limit", 5, opts->tile_limit);
+ checkEqual("options: barcode-tag", "AB", opts->barcode_tag);
+ checkEqual("options: quality-tag", "CD", opts->quality_tag);
+ checkEqual("options: sec-barcode-tag", "WX", opts->barcode_tag2);
+ checkEqual("options: sec-quality-tag", "YZ", opts->quality_tag2);
+ icheckEqual("options: sec-bc-read", 2, opts->sec_bc_read);
+ icheckEqual("options: first-cycle", 3, opts->first_cycle->end);
+ icheckEqual("options: first-cycle[0]", 7, opts->first_cycle->entries[0]);
+ icheckEqual("options: first-cycle[1]", 17, opts->first_cycle->entries[1]);
+ icheckEqual("options: first-cycle[2]", 70, opts->first_cycle->entries[2]);
+ icheckEqual("options: final-cycle", 1, opts->final_cycle->end);
+ icheckEqual("options: final-index-cycle", 1, opts->final_index_cycle->end);
+ icheckEqual("options: final-cycle[0]", 9, opts->final_cycle->entries[0]);
+ icheckEqual("options: add-cluster-index-tag", 1, opts->add_cluster_index_tag);
+}
+
+void checkFiles(char *name, char *fname)
+{
+ char command[256];
+
+ sprintf(command,"samtools view -H %s | grep @RG > /tmp/got.txt", MKNAME(DATA_DIR,"/out/xxx.bam"));
+ if (system(command)) { fprintf(stderr,"samtools failed\n"); failure++; }
+ sprintf(command, "samtools view -H %s | grep @RG > /tmp/expected.txt", fname);
+ if (system(command)) { fprintf(stderr,"samtools failed\n"); failure++; }
+ int result = system("diff /tmp/got.txt /tmp/expected.txt");
+ if (result) {
+ fprintf(stderr, "%s: test 1 failed\n", name);
+ failure++;
+ } else {
+ success++;
+ }
+
+ sprintf(command,"samtools view %s | head | perl -n -e 'chomp; @x=split /\t/;@y=sort @x; print join \",\",@y; print \"\n\";' > /tmp/got.txt",MKNAME(DATA_DIR,"/out/xxx.bam"));
+ if (system(command)) { fprintf(stderr,"samtools failed\n"); failure++; }
+ sprintf(command,"samtools view %s | head | perl -n -e 'chomp; @x=split /\t/;@y=sort @x; print join \",\",@y; print \"\n\";' > /tmp/expected.txt", fname);
+ if (system(command)) { fprintf(stderr,"samtools failed\n"); failure++; }
+ result = system("diff /tmp/got.txt /tmp/expected.txt");
+ if (result) {
+ fprintf(stderr, "%s: test 2 failed\n", name);
+ failure++;
+ } else {
+ success++;
+ }
+
+ sprintf(command,"samtools view %s | tail | perl -n -e 'chomp; @x=split /\t/;@y=sort @x; print join \",\",@y; print \"\n\";' > /tmp/got.txt", MKNAME(DATA_DIR,"/out/xxx.bam"));
+ if (system(command)) { fprintf(stderr,"samtools failed\n"); failure++; }
+ sprintf(command,"samtools view %s | tail | perl -n -e 'chomp; @x=split /\t/;@y=sort @x; print join \",\",@y; print \"\n\";' > /tmp/expected.txt", fname);
+ if (system(command)) { fprintf(stderr,"samtools failed\n"); failure++; }
+ result = system("diff /tmp/got.txt /tmp/expected.txt");
+ if (result) {
+ fprintf(stderr, "%s: test 3 failed\n", name);
+ failure++;
+ } else {
+ success++;
+ }
+}
+
+int main(int argc, char**argv)
+{
+ int getopt_char;
+ while ((getopt_char = getopt(argc, argv, "v")) != -1) {
+ switch (getopt_char) {
+ case 'v': ++verbose;
+ break;
+ default: printf("usage: test_parse_args [-v]\n\n"
+ " -v verbose output\n"
+ );
+ break;
+ }
+ }
+
+ // Cleanup getopt
+ optind = 1;
+
+ int argc_1;
+ char** argv_1;
+
+ // check if we have samtools
+ if (system("which samtools") != 0) {
+ fprintf(stderr,"samtools not found. Tests cannot be run\n");
+ return EXIT_FAILURE;
+ }
+
+ //
+ // test that we can read the command line paramaters
+ //
+ test_paramaters();
+
+
+ //
+ // simple test
+ //
+
+ setup_test_1(&argc_1, &argv_1);
+ main_i2b(argc_1-1, argv_1+1);
+ checkFiles("Simple test", MKNAME(DATA_DIR,"/out/test1.bam"));
+
+
+ //
+ // Test with non-standard read group ID
+ //
+
+ setup_test_2(&argc_1, &argv_1);
+ main_i2b(argc_1-1,argv_1+1);
+ checkFiles("Read Group ID test", MKNAME(DATA_DIR,"/out/test2.bam"));
+
+ //
+ // cycle range test
+ //
+ setup_test_4(&argc_1, &argv_1);
+ main_i2b(argc_1-1,argv_1+1);
+ checkFiles("Cycle Range test", MKNAME(DATA_DIR,"/out/test4.bam"));
+
+ //
+ // bc-read test
+ //
+ setup_test_5(&argc_1, &argv_1);
+ main_i2b(argc_1-1,argv_1+1);
+ checkFiles("BC_READ test", MKNAME(DATA_DIR,"/out/test5.bam"));
+
+ //
+ // dual index run
+ //
+ setup_test_6(&argc_1, &argv_1);
+ main_i2b(argc_1-1,argv_1+1);
+ checkFiles("Dual Index test", MKNAME(DATA_DIR,"/out/test6.bam"));
+
+
+ printf("i2b tests: %s\n", failure ? "FAILED" : "Passed");
+ return failure ? EXIT_FAILURE : EXIT_SUCCESS;
+}
diff --git a/test/posfile/Makefile.am b/test/posfile/Makefile.am
new file mode 100644
index 0000000..10356b5
--- /dev/null
+++ b/test/posfile/Makefile.am
@@ -0,0 +1,3 @@
+bin_PROGRAMS = t_posfile
+t_posfile_SOURCES = t_posfile.c
+t_posfile_CFLAGS = -DDATA_DIR=$(abs_srcdir)
diff --git a/test/posfile/t_posfile.c b/test/posfile/t_posfile.c
new file mode 100644
index 0000000..b733a47
--- /dev/null
+++ b/test/posfile/t_posfile.c
@@ -0,0 +1,120 @@
+/* test/i2b/posfile.c -- posfile test cases.
+
+ Copyright (C) 2016 Genome Research Ltd.
+
+ Author: Jennifer Liddle
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU Affero General Public License as published
+by the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU Affero General Public License for more details.
+
+You should have received a copy of the GNU Affero General Public License
+along with this program. If not, see .
+
+*/
+
+#include "../../src/posfile.c"
+#include
+#include
+#include
+#include
+
+#define xMKNAME(d,f) #d f
+#define MKNAME(d,f) xMKNAME(d,f)
+
+int verbose = 0;
+
+int success = 0;
+int failure = 0;
+
+void checkLike(char *name, char *expected, char *actual)
+{
+ if (actual == NULL) actual = "";
+ if (strstr(actual, expected) == NULL) {
+ fprintf(stderr, "%s\n" "Expected: %s\n" "Got: %s\n", name, expected, actual);
+ failure++;
+ }
+}
+
+void checkEqual(char *name, char *expected, char *actual)
+{
+ if (actual == NULL) actual = "";
+ if (strcmp(expected, actual)) {
+ fprintf(stderr, "%s\n" "Expected: %s\n" "Got: %s\n", name, expected, actual);
+ failure++;
+ }
+}
+
+void icheckEqual(char *name, int expected, int actual)
+{
+ if (expected != actual) {
+ fprintf(stderr, "%s\n" "Expected: %d\n" "Got: %d\n", name, expected, actual);
+ failure++;
+ }
+}
+
+int main(int argc, char**argv)
+{
+ int n;
+
+ posfile_t *posfile;
+
+ /*
+ * clocs file
+ */
+ posfile = posfile_open(MKNAME(DATA_DIR,"/../i2b/110323_HS13_06000_B_B039WABXX/Data/Intensities/L001/s_1_1101.clocs"));
+ if (posfile->errmsg) {
+ fprintf(stderr,"Error opening file: %s\n", posfile->errmsg);
+ failure++;
+ }
+ icheckEqual("Version", 1, posfile->version);
+ icheckEqual("Total blocks", 65600, posfile->total_blocks);
+
+ posfile_next(posfile);
+ icheckEqual("next X", 1235, posfile_get_x(posfile));
+ icheckEqual("next Y", 1989, posfile_get_y(posfile));
+ icheckEqual("current block", 247, posfile->current_block);
+
+ for (n=0; n<306; n++) {
+ posfile_next(posfile);
+ }
+ icheckEqual("307 x", 1279, posfile_get_x(posfile));
+ icheckEqual("307 y", 2120, posfile_get_y(posfile));
+ icheckEqual("307 block", 330, posfile->current_block);
+
+ while (posfile_next(posfile) == 0);
+ posfile_close(posfile);
+
+ /*
+ * locs file
+ */
+ posfile = posfile_open(MKNAME(DATA_DIR,"/../i2b/111014_M00119_0028_AMS0001310-00300/Data/Intensities/L001/s_1_1.locs"));
+ if (posfile->errmsg) {
+ fprintf(stderr,"Error opening file: %s\n", posfile->errmsg);
+ failure++;
+ }
+
+ icheckEqual("LOCS: Total blocks", 235085, posfile->total_blocks);
+ icheckEqual("LOCS: current block", 0, posfile->current_block);
+
+ posfile_next(posfile);
+ icheckEqual("LOCS: first X", 16440, posfile_get_x(posfile));
+ icheckEqual("LOCS: first Y", 1321, posfile_get_y(posfile));
+ icheckEqual("LOCS: current block (2)", 1, posfile->current_block);
+
+ while (posfile_next(posfile)==0);
+
+ icheckEqual("LOCS: last x", 15605, posfile_get_x(posfile));
+ icheckEqual("LOCS: last y", 29408, posfile_get_y(posfile));
+
+ posfile_close(posfile);
+
+ printf("posfile tests: %s\n", failure ? "FAILED" : "Passed");
+ return failure ? EXIT_FAILURE : EXIT_SUCCESS;
+}