From 93a4e13b619cc463754f2c8c85ca9cc87f1dc281 Mon Sep 17 00:00:00 2001 From: Roy Storey Date: Thu, 5 Mar 2020 06:07:19 +1300 Subject: [PATCH 1/5] Include BC: tag (barcode) in RG (read group) header lines (#165) --- src/decode.c | 4 +- src/decode.h | 3 +- src/i2b.c | 7 +- test/data/out/test10_decode.sam | 154 ++++++++++++++++---------------- test/data/out/test7_decode.sam | 22 ++--- test/data/out/test9_decode.sam | 74 +++++++-------- test/t_i2b.c | 6 +- 7 files changed, 137 insertions(+), 133 deletions(-) diff --git a/src/decode.c b/src/decode.c index 823c2a8a..b96d5824 100644 --- a/src/decode.c +++ b/src/decode.c @@ -1584,7 +1584,8 @@ size_t find_longest_barcode_name(va_t *barcodeArray) int get_barcode_metadata(va_t *barcodeArray, int idx, const char **name_out, const char **lib_out, - const char **sample_out, const char **desc_out) { + const char **sample_out, const char **desc_out, + const char **seq_out) { bc_details_t *barcode; if (!barcodeArray || idx >= barcodeArray->end) return -1; barcode = barcodeArray->entries[idx]; @@ -1592,6 +1593,7 @@ int get_barcode_metadata(va_t *barcodeArray, int idx, if (lib_out) *lib_out = barcode->lib; if (sample_out) *sample_out = barcode->sample; if (desc_out) *desc_out = barcode->desc; + if (seq_out) *seq_out = barcode->seq; return 0; } diff --git a/src/decode.h b/src/decode.h index 000a90fa..d508ee53 100644 --- a/src/decode.h +++ b/src/decode.h @@ -51,7 +51,8 @@ size_t find_longest_barcode_name(va_t *barcodeArray); // Get barcode metadata. Returns -1 if idx is off the end of barcodeArray, else 0 int get_barcode_metadata(va_t *barcodeArray, int idx, const char **name_out, const char **lib_out, - const char **sample_out, const char **desc_out); + const char **sample_out, const char **desc_out, + const char **seq_out); // Make a copy of a barcode array va_t *copy_barcode_array(va_t *barcode_array); diff --git a/src/i2b.c b/src/i2b.c index c51e2a53..dd030c92 100644 --- a/src/i2b.c +++ b/src/i2b.c @@ -898,8 +898,8 @@ static int addHeader(samFile *output_file, bam_hdr_t *output_header, opts_t *opt char *pu = malloc(strlen(opts->platform_unit) + longest_name + 2); if (!id || !pu) die("Out of memory"); for (int idx = 0; ; idx++) { - const char *name = NULL, *lib = NULL, *sample = NULL, *desc = NULL; - if (get_barcode_metadata(opts->barcodeArray, idx, &name, &lib, &sample, &desc) < 0) break; + const char *name = NULL, *lib = NULL, *sample = NULL, *desc = NULL, *seq = NULL; + if (get_barcode_metadata(opts->barcodeArray, idx, &name, &lib, &sample, &desc, &seq) < 0) break; if (idx == 0) { lib = opts->library_name; sample = opts->sample_alias; @@ -917,6 +917,7 @@ static int addHeader(samFile *output_file, bam_hdr_t *output_header, opts_t *opt "CN", opts->sequencing_centre, "PL", opts->platform, (desc ? "DS" : NULL), (desc ? desc : NULL), + (seq ? "BC" : NULL), (seq ? seq : NULL), NULL); } free(id); @@ -2515,7 +2516,7 @@ static int createBAM(samFile *output_file, bam_hdr_t *output_header, hts_tpool * if (!tag_hops) die("Out of memory"); barcodeHash = make_barcode_hash(opts->barcodeArray); longest_barcode_name = find_longest_barcode_name(opts->barcodeArray); - if (get_barcode_metadata(opts->barcodeArray, 0, &opts->unmatched_barcode_name, NULL, NULL, NULL) < 0) { + if (get_barcode_metadata(opts->barcodeArray, 0, &opts->unmatched_barcode_name, NULL, NULL, NULL, NULL) < 0) { opts->unmatched_barcode_name = "0"; } } diff --git a/test/data/out/test10_decode.sam b/test/data/out/test10_decode.sam index b6facb1a..d1316610 100644 --- a/test/data/out/test10_decode.sam +++ b/test/data/out/test10_decode.sam @@ -1,81 +1,81 @@ @HD VN:1.5 SO:unsorted -@RG ID:1#0 DT:2011-03-23T00:00:00+0000 PU:160919_hiseq2500_4966_FC_1#0 LB:TestLibrary PG:SCS SM:TestSample CN:SC PL:ILLUMINA DS:Study TestStudy -@RG ID:1#1 DT:2011-03-23T00:00:00+0000 PU:160919_hiseq2500_4966_FC_1#1 LB:TestLibrary1 PG:SCS SM:TestSample1 CN:SC PL:ILLUMINA DS:Study TestStudy -@RG ID:1#2 DT:2011-03-23T00:00:00+0000 PU:160919_hiseq2500_4966_FC_1#2 LB:TestLibrary2 PG:SCS SM:TestSample2 CN:SC PL:ILLUMINA DS:Study TestStudy -@RG ID:1#3 DT:2011-03-23T00:00:00+0000 PU:160919_hiseq2500_4966_FC_1#3 LB:TestLibrary3 PG:SCS SM:TestSample3 CN:SC PL:ILLUMINA DS:Study TestStudy -@RG ID:1#4 DT:2011-03-23T00:00:00+0000 PU:160919_hiseq2500_4966_FC_1#4 LB:TestLibrary4 PG:SCS SM:TestSample4 CN:SC PL:ILLUMINA DS:Study TestStudy -@RG ID:1#5 DT:2011-03-23T00:00:00+0000 PU:160919_hiseq2500_4966_FC_1#5 LB:TestLibrary5 PG:SCS SM:TestSample5 CN:SC PL:ILLUMINA DS:Study TestStudy -@RG ID:1#6 DT:2011-03-23T00:00:00+0000 PU:160919_hiseq2500_4966_FC_1#6 LB:TestLibrary6 PG:SCS SM:TestSample6 CN:SC PL:ILLUMINA DS:Study TestStudy -@RG ID:1#7 DT:2011-03-23T00:00:00+0000 PU:160919_hiseq2500_4966_FC_1#7 LB:TestLibrary7 PG:SCS SM:TestSample7 CN:SC PL:ILLUMINA DS:Study TestStudy -@RG ID:1#8 DT:2011-03-23T00:00:00+0000 PU:160919_hiseq2500_4966_FC_1#8 LB:TestLibrary8 PG:SCS SM:TestSample8 CN:SC PL:ILLUMINA DS:Study TestStudy -@RG ID:1#9 DT:2011-03-23T00:00:00+0000 PU:160919_hiseq2500_4966_FC_1#9 LB:TestLibrary9 PG:SCS SM:TestSample9 CN:SC PL:ILLUMINA DS:Study TestStudy -@RG ID:1#10 DT:2011-03-23T00:00:00+0000 PU:160919_hiseq2500_4966_FC_1#10 LB:TestLibrary10 PG:SCS SM:TestSample10 CN:SC PL:ILLUMINA DS:Study TestStudy -@RG ID:1#11 DT:2011-03-23T00:00:00+0000 PU:160919_hiseq2500_4966_FC_1#11 LB:TestLibrary11 PG:SCS SM:TestSample11 CN:SC PL:ILLUMINA DS:Study TestStudy -@RG ID:1#12 DT:2011-03-23T00:00:00+0000 PU:160919_hiseq2500_4966_FC_1#12 LB:TestLibrary12 PG:SCS SM:TestSample12 CN:SC PL:ILLUMINA DS:Study TestStudy -@RG ID:1#13 DT:2011-03-23T00:00:00+0000 PU:160919_hiseq2500_4966_FC_1#13 LB:TestLibrary13 PG:SCS SM:TestSample13 CN:SC PL:ILLUMINA DS:Study TestStudy -@RG ID:1#14 DT:2011-03-23T00:00:00+0000 PU:160919_hiseq2500_4966_FC_1#14 LB:TestLibrary14 PG:SCS SM:TestSample14 CN:SC PL:ILLUMINA DS:Study TestStudy -@RG ID:1#15 DT:2011-03-23T00:00:00+0000 PU:160919_hiseq2500_4966_FC_1#15 LB:TestLibrary15 PG:SCS SM:TestSample15 CN:SC PL:ILLUMINA DS:Study TestStudy -@RG ID:1#16 DT:2011-03-23T00:00:00+0000 PU:160919_hiseq2500_4966_FC_1#16 LB:TestLibrary16 PG:SCS SM:TestSample16 CN:SC PL:ILLUMINA DS:Study TestStudy -@RG ID:1#17 DT:2011-03-23T00:00:00+0000 PU:160919_hiseq2500_4966_FC_1#17 LB:TestLibrary17 PG:SCS SM:TestSample17 CN:SC PL:ILLUMINA DS:Study TestStudy -@RG ID:1#18 DT:2011-03-23T00:00:00+0000 PU:160919_hiseq2500_4966_FC_1#18 LB:TestLibrary18 PG:SCS SM:TestSample18 CN:SC PL:ILLUMINA DS:Study TestStudy -@RG ID:1#19 DT:2011-03-23T00:00:00+0000 PU:160919_hiseq2500_4966_FC_1#19 LB:TestLibrary19 PG:SCS SM:TestSample19 CN:SC PL:ILLUMINA DS:Study TestStudy -@RG ID:1#20 DT:2011-03-23T00:00:00+0000 PU:160919_hiseq2500_4966_FC_1#20 LB:TestLibrary20 PG:SCS SM:TestSample20 CN:SC PL:ILLUMINA DS:Study TestStudy -@RG ID:1#21 DT:2011-03-23T00:00:00+0000 PU:160919_hiseq2500_4966_FC_1#21 LB:TestLibrary21 PG:SCS SM:TestSample21 CN:SC PL:ILLUMINA DS:Study TestStudy -@RG ID:1#22 DT:2011-03-23T00:00:00+0000 PU:160919_hiseq2500_4966_FC_1#22 LB:TestLibrary22 PG:SCS SM:TestSample22 CN:SC PL:ILLUMINA DS:Study TestStudy -@RG ID:1#23 DT:2011-03-23T00:00:00+0000 PU:160919_hiseq2500_4966_FC_1#23 LB:TestLibrary23 PG:SCS SM:TestSample23 CN:SC PL:ILLUMINA DS:Study TestStudy -@RG ID:1#24 DT:2011-03-23T00:00:00+0000 PU:160919_hiseq2500_4966_FC_1#24 LB:TestLibrary24 PG:SCS SM:TestSample24 CN:SC PL:ILLUMINA DS:Study TestStudy -@RG ID:1#25 DT:2011-03-23T00:00:00+0000 PU:160919_hiseq2500_4966_FC_1#25 LB:TestLibrary25 PG:SCS SM:TestSample25 CN:SC PL:ILLUMINA DS:Study TestStudy -@RG ID:1#26 DT:2011-03-23T00:00:00+0000 PU:160919_hiseq2500_4966_FC_1#26 LB:TestLibrary26 PG:SCS SM:TestSample26 CN:SC PL:ILLUMINA DS:Study TestStudy -@RG ID:1#27 DT:2011-03-23T00:00:00+0000 PU:160919_hiseq2500_4966_FC_1#27 LB:TestLibrary27 PG:SCS SM:TestSample27 CN:SC PL:ILLUMINA DS:Study TestStudy -@RG ID:1#28 DT:2011-03-23T00:00:00+0000 PU:160919_hiseq2500_4966_FC_1#28 LB:TestLibrary28 PG:SCS SM:TestSample28 CN:SC PL:ILLUMINA DS:Study TestStudy -@RG ID:1#29 DT:2011-03-23T00:00:00+0000 PU:160919_hiseq2500_4966_FC_1#29 LB:TestLibrary29 PG:SCS SM:TestSample29 CN:SC PL:ILLUMINA DS:Study TestStudy -@RG ID:1#30 DT:2011-03-23T00:00:00+0000 PU:160919_hiseq2500_4966_FC_1#30 LB:TestLibrary30 PG:SCS SM:TestSample30 CN:SC PL:ILLUMINA DS:Study TestStudy -@RG ID:1#31 DT:2011-03-23T00:00:00+0000 PU:160919_hiseq2500_4966_FC_1#31 LB:TestLibrary31 PG:SCS SM:TestSample31 CN:SC PL:ILLUMINA DS:Study TestStudy -@RG ID:1#32 DT:2011-03-23T00:00:00+0000 PU:160919_hiseq2500_4966_FC_1#32 LB:TestLibrary32 PG:SCS SM:TestSample32 CN:SC PL:ILLUMINA DS:Study TestStudy -@RG ID:1#33 DT:2011-03-23T00:00:00+0000 PU:160919_hiseq2500_4966_FC_1#33 LB:TestLibrary33 PG:SCS SM:TestSample33 CN:SC PL:ILLUMINA DS:Study TestStudy -@RG ID:1#34 DT:2011-03-23T00:00:00+0000 PU:160919_hiseq2500_4966_FC_1#34 LB:TestLibrary34 PG:SCS SM:TestSample34 CN:SC PL:ILLUMINA DS:Study TestStudy -@RG ID:1#35 DT:2011-03-23T00:00:00+0000 PU:160919_hiseq2500_4966_FC_1#35 LB:TestLibrary35 PG:SCS SM:TestSample35 CN:SC PL:ILLUMINA DS:Study TestStudy -@RG ID:1#36 DT:2011-03-23T00:00:00+0000 PU:160919_hiseq2500_4966_FC_1#36 LB:TestLibrary36 PG:SCS SM:TestSample36 CN:SC PL:ILLUMINA DS:Study TestStudy -@RG ID:1#37 DT:2011-03-23T00:00:00+0000 PU:160919_hiseq2500_4966_FC_1#37 LB:TestLibrary37 PG:SCS SM:TestSample37 CN:SC PL:ILLUMINA DS:Study TestStudy -@RG ID:1#38 DT:2011-03-23T00:00:00+0000 PU:160919_hiseq2500_4966_FC_1#38 LB:TestLibrary38 PG:SCS SM:TestSample38 CN:SC PL:ILLUMINA DS:Study TestStudy -@RG ID:1#39 DT:2011-03-23T00:00:00+0000 PU:160919_hiseq2500_4966_FC_1#39 LB:TestLibrary39 PG:SCS SM:TestSample39 CN:SC PL:ILLUMINA DS:Study TestStudy -@RG ID:1#40 DT:2011-03-23T00:00:00+0000 PU:160919_hiseq2500_4966_FC_1#40 LB:TestLibrary40 PG:SCS SM:TestSample40 CN:SC PL:ILLUMINA DS:Study TestStudy -@RG ID:1#41 DT:2011-03-23T00:00:00+0000 PU:160919_hiseq2500_4966_FC_1#41 LB:TestLibrary41 PG:SCS SM:TestSample41 CN:SC PL:ILLUMINA DS:Study TestStudy -@RG ID:1#42 DT:2011-03-23T00:00:00+0000 PU:160919_hiseq2500_4966_FC_1#42 LB:TestLibrary42 PG:SCS SM:TestSample42 CN:SC PL:ILLUMINA DS:Study TestStudy -@RG ID:1#43 DT:2011-03-23T00:00:00+0000 PU:160919_hiseq2500_4966_FC_1#43 LB:TestLibrary43 PG:SCS SM:TestSample43 CN:SC PL:ILLUMINA DS:Study TestStudy -@RG ID:1#44 DT:2011-03-23T00:00:00+0000 PU:160919_hiseq2500_4966_FC_1#44 LB:TestLibrary44 PG:SCS SM:TestSample44 CN:SC PL:ILLUMINA DS:Study TestStudy -@RG ID:1#45 DT:2011-03-23T00:00:00+0000 PU:160919_hiseq2500_4966_FC_1#45 LB:TestLibrary45 PG:SCS SM:TestSample45 CN:SC PL:ILLUMINA DS:Study TestStudy -@RG ID:1#46 DT:2011-03-23T00:00:00+0000 PU:160919_hiseq2500_4966_FC_1#46 LB:TestLibrary46 PG:SCS SM:TestSample46 CN:SC PL:ILLUMINA DS:Study TestStudy -@RG ID:1#47 DT:2011-03-23T00:00:00+0000 PU:160919_hiseq2500_4966_FC_1#47 LB:TestLibrary47 PG:SCS SM:TestSample47 CN:SC PL:ILLUMINA DS:Study TestStudy -@RG ID:1#48 DT:2011-03-23T00:00:00+0000 PU:160919_hiseq2500_4966_FC_1#48 LB:TestLibrary48 PG:SCS SM:TestSample48 CN:SC PL:ILLUMINA DS:Study TestStudy -@RG ID:1#49 DT:2011-03-23T00:00:00+0000 PU:160919_hiseq2500_4966_FC_1#49 LB:TestLibrary49 PG:SCS SM:TestSample49 CN:SC PL:ILLUMINA DS:Study TestStudy -@RG ID:1#50 DT:2011-03-23T00:00:00+0000 PU:160919_hiseq2500_4966_FC_1#50 LB:TestLibrary50 PG:SCS SM:TestSample50 CN:SC PL:ILLUMINA DS:Study TestStudy -@RG ID:1#51 DT:2011-03-23T00:00:00+0000 PU:160919_hiseq2500_4966_FC_1#51 LB:TestLibrary51 PG:SCS SM:TestSample51 CN:SC PL:ILLUMINA DS:Study TestStudy -@RG ID:1#52 DT:2011-03-23T00:00:00+0000 PU:160919_hiseq2500_4966_FC_1#52 LB:TestLibrary52 PG:SCS SM:TestSample52 CN:SC PL:ILLUMINA DS:Study TestStudy -@RG ID:1#53 DT:2011-03-23T00:00:00+0000 PU:160919_hiseq2500_4966_FC_1#53 LB:TestLibrary53 PG:SCS SM:TestSample53 CN:SC PL:ILLUMINA DS:Study TestStudy -@RG ID:1#54 DT:2011-03-23T00:00:00+0000 PU:160919_hiseq2500_4966_FC_1#54 LB:TestLibrary54 PG:SCS SM:TestSample54 CN:SC PL:ILLUMINA DS:Study TestStudy -@RG ID:1#55 DT:2011-03-23T00:00:00+0000 PU:160919_hiseq2500_4966_FC_1#55 LB:TestLibrary55 PG:SCS SM:TestSample55 CN:SC PL:ILLUMINA DS:Study TestStudy -@RG ID:1#56 DT:2011-03-23T00:00:00+0000 PU:160919_hiseq2500_4966_FC_1#56 LB:TestLibrary56 PG:SCS SM:TestSample56 CN:SC PL:ILLUMINA DS:Study TestStudy -@RG ID:1#57 DT:2011-03-23T00:00:00+0000 PU:160919_hiseq2500_4966_FC_1#57 LB:TestLibrary57 PG:SCS SM:TestSample57 CN:SC PL:ILLUMINA DS:Study TestStudy -@RG ID:1#58 DT:2011-03-23T00:00:00+0000 PU:160919_hiseq2500_4966_FC_1#58 LB:TestLibrary58 PG:SCS SM:TestSample58 CN:SC PL:ILLUMINA DS:Study TestStudy -@RG ID:1#59 DT:2011-03-23T00:00:00+0000 PU:160919_hiseq2500_4966_FC_1#59 LB:TestLibrary59 PG:SCS SM:TestSample59 CN:SC PL:ILLUMINA DS:Study TestStudy -@RG ID:1#60 DT:2011-03-23T00:00:00+0000 PU:160919_hiseq2500_4966_FC_1#60 LB:TestLibrary60 PG:SCS SM:TestSample60 CN:SC PL:ILLUMINA DS:Study TestStudy -@RG ID:1#61 DT:2011-03-23T00:00:00+0000 PU:160919_hiseq2500_4966_FC_1#61 LB:TestLibrary61 PG:SCS SM:TestSample61 CN:SC PL:ILLUMINA DS:Study TestStudy -@RG ID:1#62 DT:2011-03-23T00:00:00+0000 PU:160919_hiseq2500_4966_FC_1#62 LB:TestLibrary62 PG:SCS SM:TestSample62 CN:SC PL:ILLUMINA DS:Study TestStudy -@RG ID:1#63 DT:2011-03-23T00:00:00+0000 PU:160919_hiseq2500_4966_FC_1#63 LB:TestLibrary63 PG:SCS SM:TestSample63 CN:SC PL:ILLUMINA DS:Study TestStudy -@RG ID:1#64 DT:2011-03-23T00:00:00+0000 PU:160919_hiseq2500_4966_FC_1#64 LB:TestLibrary64 PG:SCS SM:TestSample64 CN:SC PL:ILLUMINA DS:Study TestStudy -@RG ID:1#65 DT:2011-03-23T00:00:00+0000 PU:160919_hiseq2500_4966_FC_1#65 LB:TestLibrary65 PG:SCS SM:TestSample65 CN:SC PL:ILLUMINA DS:Study TestStudy -@RG ID:1#66 DT:2011-03-23T00:00:00+0000 PU:160919_hiseq2500_4966_FC_1#66 LB:TestLibrary66 PG:SCS SM:TestSample66 CN:SC PL:ILLUMINA DS:Study TestStudy -@RG ID:1#67 DT:2011-03-23T00:00:00+0000 PU:160919_hiseq2500_4966_FC_1#67 LB:TestLibrary67 PG:SCS SM:TestSample67 CN:SC PL:ILLUMINA DS:Study TestStudy -@RG ID:1#68 DT:2011-03-23T00:00:00+0000 PU:160919_hiseq2500_4966_FC_1#68 LB:TestLibrary68 PG:SCS SM:TestSample68 CN:SC PL:ILLUMINA DS:Study TestStudy -@RG ID:1#69 DT:2011-03-23T00:00:00+0000 PU:160919_hiseq2500_4966_FC_1#69 LB:TestLibrary69 PG:SCS SM:TestSample69 CN:SC PL:ILLUMINA DS:Study TestStudy -@RG ID:1#70 DT:2011-03-23T00:00:00+0000 PU:160919_hiseq2500_4966_FC_1#70 LB:TestLibrary70 PG:SCS SM:TestSample70 CN:SC PL:ILLUMINA DS:Study TestStudy -@RG ID:1#71 DT:2011-03-23T00:00:00+0000 PU:160919_hiseq2500_4966_FC_1#71 LB:TestLibrary71 PG:SCS SM:TestSample71 CN:SC PL:ILLUMINA DS:Study TestStudy -@RG ID:1#72 DT:2011-03-23T00:00:00+0000 PU:160919_hiseq2500_4966_FC_1#72 LB:TestLibrary72 PG:SCS SM:TestSample72 CN:SC PL:ILLUMINA DS:Study TestStudy -@RG ID:1#73 DT:2011-03-23T00:00:00+0000 PU:160919_hiseq2500_4966_FC_1#73 LB:TestLibrary73 PG:SCS SM:TestSample73 CN:SC PL:ILLUMINA DS:Study TestStudy -@RG ID:1#74 DT:2011-03-23T00:00:00+0000 PU:160919_hiseq2500_4966_FC_1#74 LB:TestLibrary74 PG:SCS SM:TestSample74 CN:SC PL:ILLUMINA DS:Study TestStudy -@RG ID:1#75 DT:2011-03-23T00:00:00+0000 PU:160919_hiseq2500_4966_FC_1#75 LB:TestLibrary75 PG:SCS SM:TestSample75 CN:SC PL:ILLUMINA DS:Study TestStudy -@RG ID:1#76 DT:2011-03-23T00:00:00+0000 PU:160919_hiseq2500_4966_FC_1#76 LB:TestLibrary76 PG:SCS SM:TestSample76 CN:SC PL:ILLUMINA DS:Study TestStudy +@RG ID:1#0 DT:2011-03-23T00:00:00+0000 PU:160919_hiseq2500_4966_FC_1#0 LB:TestLibrary PG:SCS SM:TestSample CN:SC PL:ILLUMINA DS:Study TestStudy BC:NN-NNN +@RG ID:1#1 DT:2011-03-23T00:00:00+0000 PU:160919_hiseq2500_4966_FC_1#1 LB:TestLibrary1 PG:SCS SM:TestSample1 CN:SC PL:ILLUMINA DS:Study TestStudy BC:GT-GCG +@RG ID:1#2 DT:2011-03-23T00:00:00+0000 PU:160919_hiseq2500_4966_FC_1#2 LB:TestLibrary2 PG:SCS SM:TestSample2 CN:SC PL:ILLUMINA DS:Study TestStudy BC:TA-GTA +@RG ID:1#3 DT:2011-03-23T00:00:00+0000 PU:160919_hiseq2500_4966_FC_1#3 LB:TestLibrary3 PG:SCS SM:TestSample3 CN:SC PL:ILLUMINA DS:Study TestStudy BC:GA-AAG +@RG ID:1#4 DT:2011-03-23T00:00:00+0000 PU:160919_hiseq2500_4966_FC_1#4 LB:TestLibrary4 PG:SCS SM:TestSample4 CN:SC PL:ILLUMINA DS:Study TestStudy BC:GT-GGT +@RG ID:1#5 DT:2011-03-23T00:00:00+0000 PU:160919_hiseq2500_4966_FC_1#5 LB:TestLibrary5 PG:SCS SM:TestSample5 CN:SC PL:ILLUMINA DS:Study TestStudy BC:AT-ACG +@RG ID:1#6 DT:2011-03-23T00:00:00+0000 PU:160919_hiseq2500_4966_FC_1#6 LB:TestLibrary6 PG:SCS SM:TestSample6 CN:SC PL:ILLUMINA DS:Study TestStudy BC:GC-TAG +@RG ID:1#7 DT:2011-03-23T00:00:00+0000 PU:160919_hiseq2500_4966_FC_1#7 LB:TestLibrary7 PG:SCS SM:TestSample7 CN:SC PL:ILLUMINA DS:Study TestStudy BC:TT-GGA +@RG ID:1#8 DT:2011-03-23T00:00:00+0000 PU:160919_hiseq2500_4966_FC_1#8 LB:TestLibrary8 PG:SCS SM:TestSample8 CN:SC PL:ILLUMINA DS:Study TestStudy BC:AC-GTC +@RG ID:1#9 DT:2011-03-23T00:00:00+0000 PU:160919_hiseq2500_4966_FC_1#9 LB:TestLibrary9 PG:SCS SM:TestSample9 CN:SC PL:ILLUMINA DS:Study TestStudy BC:GG-TGG +@RG ID:1#10 DT:2011-03-23T00:00:00+0000 PU:160919_hiseq2500_4966_FC_1#10 LB:TestLibrary10 PG:SCS SM:TestSample10 CN:SC PL:ILLUMINA DS:Study TestStudy BC:GC-CTG +@RG ID:1#11 DT:2011-03-23T00:00:00+0000 PU:160919_hiseq2500_4966_FC_1#11 LB:TestLibrary11 PG:SCS SM:TestSample11 CN:SC PL:ILLUMINA DS:Study TestStudy BC:GC-GAA +@RG ID:1#12 DT:2011-03-23T00:00:00+0000 PU:160919_hiseq2500_4966_FC_1#12 LB:TestLibrary12 PG:SCS SM:TestSample12 CN:SC PL:ILLUMINA DS:Study TestStudy BC:AC-GGT +@RG ID:1#13 DT:2011-03-23T00:00:00+0000 PU:160919_hiseq2500_4966_FC_1#13 LB:TestLibrary13 PG:SCS SM:TestSample13 CN:SC PL:ILLUMINA DS:Study TestStudy BC:AT-TGT +@RG ID:1#14 DT:2011-03-23T00:00:00+0000 PU:160919_hiseq2500_4966_FC_1#14 LB:TestLibrary14 PG:SCS SM:TestSample14 CN:SC PL:ILLUMINA DS:Study TestStudy BC:AA-CAG +@RG ID:1#15 DT:2011-03-23T00:00:00+0000 PU:160919_hiseq2500_4966_FC_1#15 LB:TestLibrary15 PG:SCS SM:TestSample15 CN:SC PL:ILLUMINA DS:Study TestStudy BC:TA-CAA +@RG ID:1#16 DT:2011-03-23T00:00:00+0000 PU:160919_hiseq2500_4966_FC_1#16 LB:TestLibrary16 PG:SCS SM:TestSample16 CN:SC PL:ILLUMINA DS:Study TestStudy BC:AG-GTA +@RG ID:1#17 DT:2011-03-23T00:00:00+0000 PU:160919_hiseq2500_4966_FC_1#17 LB:TestLibrary17 PG:SCS SM:TestSample17 CN:SC PL:ILLUMINA DS:Study TestStudy BC:TC-ACC +@RG ID:1#18 DT:2011-03-23T00:00:00+0000 PU:160919_hiseq2500_4966_FC_1#18 LB:TestLibrary18 PG:SCS SM:TestSample18 CN:SC PL:ILLUMINA DS:Study TestStudy BC:AT-CTG +@RG ID:1#19 DT:2011-03-23T00:00:00+0000 PU:160919_hiseq2500_4966_FC_1#19 LB:TestLibrary19 PG:SCS SM:TestSample19 CN:SC PL:ILLUMINA DS:Study TestStudy BC:CT-GAG +@RG ID:1#20 DT:2011-03-23T00:00:00+0000 PU:160919_hiseq2500_4966_FC_1#20 LB:TestLibrary20 PG:SCS SM:TestSample20 CN:SC PL:ILLUMINA DS:Study TestStudy BC:GG-CCG +@RG ID:1#21 DT:2011-03-23T00:00:00+0000 PU:160919_hiseq2500_4966_FC_1#21 LB:TestLibrary21 PG:SCS SM:TestSample21 CN:SC PL:ILLUMINA DS:Study TestStudy BC:GT-CTA +@RG ID:1#22 DT:2011-03-23T00:00:00+0000 PU:160919_hiseq2500_4966_FC_1#22 LB:TestLibrary22 PG:SCS SM:TestSample22 CN:SC PL:ILLUMINA DS:Study TestStudy BC:TT-ACA +@RG ID:1#23 DT:2011-03-23T00:00:00+0000 PU:160919_hiseq2500_4966_FC_1#23 LB:TestLibrary23 PG:SCS SM:TestSample23 CN:SC PL:ILLUMINA DS:Study TestStudy BC:CA-CGT +@RG ID:1#24 DT:2011-03-23T00:00:00+0000 PU:160919_hiseq2500_4966_FC_1#24 LB:TestLibrary24 PG:SCS SM:TestSample24 CN:SC PL:ILLUMINA DS:Study TestStudy BC:GA-ACA +@RG ID:1#25 DT:2011-03-23T00:00:00+0000 PU:160919_hiseq2500_4966_FC_1#25 LB:TestLibrary25 PG:SCS SM:TestSample25 CN:SC PL:ILLUMINA DS:Study TestStudy BC:TG-CAT +@RG ID:1#26 DT:2011-03-23T00:00:00+0000 PU:160919_hiseq2500_4966_FC_1#26 LB:TestLibrary26 PG:SCS SM:TestSample26 CN:SC PL:ILLUMINA DS:Study TestStudy BC:AT-GCA +@RG ID:1#27 DT:2011-03-23T00:00:00+0000 PU:160919_hiseq2500_4966_FC_1#27 LB:TestLibrary27 PG:SCS SM:TestSample27 CN:SC PL:ILLUMINA DS:Study TestStudy BC:GC-TTC +@RG ID:1#28 DT:2011-03-23T00:00:00+0000 PU:160919_hiseq2500_4966_FC_1#28 LB:TestLibrary28 PG:SCS SM:TestSample28 CN:SC PL:ILLUMINA DS:Study TestStudy BC:TT-TCC +@RG ID:1#29 DT:2011-03-23T00:00:00+0000 PU:160919_hiseq2500_4966_FC_1#29 LB:TestLibrary29 PG:SCS SM:TestSample29 CN:SC PL:ILLUMINA DS:Study TestStudy BC:AG-CTC +@RG ID:1#30 DT:2011-03-23T00:00:00+0000 PU:160919_hiseq2500_4966_FC_1#30 LB:TestLibrary30 PG:SCS SM:TestSample30 CN:SC PL:ILLUMINA DS:Study TestStudy BC:CG-CGG +@RG ID:1#31 DT:2011-03-23T00:00:00+0000 PU:160919_hiseq2500_4966_FC_1#31 LB:TestLibrary31 PG:SCS SM:TestSample31 CN:SC PL:ILLUMINA DS:Study TestStudy BC:GT-TAT +@RG ID:1#32 DT:2011-03-23T00:00:00+0000 PU:160919_hiseq2500_4966_FC_1#32 LB:TestLibrary32 PG:SCS SM:TestSample32 CN:SC PL:ILLUMINA DS:Study TestStudy BC:TC-ATG +@RG ID:1#33 DT:2011-03-23T00:00:00+0000 PU:160919_hiseq2500_4966_FC_1#33 LB:TestLibrary33 PG:SCS SM:TestSample33 CN:SC PL:ILLUMINA DS:Study TestStudy BC:AC-ATA +@RG ID:1#34 DT:2011-03-23T00:00:00+0000 PU:160919_hiseq2500_4966_FC_1#34 LB:TestLibrary34 PG:SCS SM:TestSample34 CN:SC PL:ILLUMINA DS:Study TestStudy BC:TT-TTA +@RG ID:1#35 DT:2011-03-23T00:00:00+0000 PU:160919_hiseq2500_4966_FC_1#35 LB:TestLibrary35 PG:SCS SM:TestSample35 CN:SC PL:ILLUMINA DS:Study TestStudy BC:AT-TTC +@RG ID:1#36 DT:2011-03-23T00:00:00+0000 PU:160919_hiseq2500_4966_FC_1#36 LB:TestLibrary36 PG:SCS SM:TestSample36 CN:SC PL:ILLUMINA DS:Study TestStudy BC:CT-AGA +@RG ID:1#37 DT:2011-03-23T00:00:00+0000 PU:160919_hiseq2500_4966_FC_1#37 LB:TestLibrary37 PG:SCS SM:TestSample37 CN:SC PL:ILLUMINA DS:Study TestStudy BC:AG-GGC +@RG ID:1#38 DT:2011-03-23T00:00:00+0000 PU:160919_hiseq2500_4966_FC_1#38 LB:TestLibrary38 PG:SCS SM:TestSample38 CN:SC PL:ILLUMINA DS:Study TestStudy BC:GG-ACC +@RG ID:1#39 DT:2011-03-23T00:00:00+0000 PU:160919_hiseq2500_4966_FC_1#39 LB:TestLibrary39 PG:SCS SM:TestSample39 CN:SC PL:ILLUMINA DS:Study TestStudy BC:TC-TGG +@RG ID:1#40 DT:2011-03-23T00:00:00+0000 PU:160919_hiseq2500_4966_FC_1#40 LB:TestLibrary40 PG:SCS SM:TestSample40 CN:SC PL:ILLUMINA DS:Study TestStudy BC:CC-TCC +@RG ID:1#41 DT:2011-03-23T00:00:00+0000 PU:160919_hiseq2500_4966_FC_1#41 LB:TestLibrary41 PG:SCS SM:TestSample41 CN:SC PL:ILLUMINA DS:Study TestStudy BC:CC-AGT +@RG ID:1#42 DT:2011-03-23T00:00:00+0000 PU:160919_hiseq2500_4966_FC_1#42 LB:TestLibrary42 PG:SCS SM:TestSample42 CN:SC PL:ILLUMINA DS:Study TestStudy BC:TA-ATC +@RG ID:1#43 DT:2011-03-23T00:00:00+0000 PU:160919_hiseq2500_4966_FC_1#43 LB:TestLibrary43 PG:SCS SM:TestSample43 CN:SC PL:ILLUMINA DS:Study TestStudy BC:GT-CCC +@RG ID:1#44 DT:2011-03-23T00:00:00+0000 PU:160919_hiseq2500_4966_FC_1#44 LB:TestLibrary44 PG:SCS SM:TestSample44 CN:SC PL:ILLUMINA DS:Study TestStudy BC:AC-ACT +@RG ID:1#45 DT:2011-03-23T00:00:00+0000 PU:160919_hiseq2500_4966_FC_1#45 LB:TestLibrary45 PG:SCS SM:TestSample45 CN:SC PL:ILLUMINA DS:Study TestStudy BC:CG-AAG +@RG ID:1#46 DT:2011-03-23T00:00:00+0000 PU:160919_hiseq2500_4966_FC_1#46 LB:TestLibrary46 PG:SCS SM:TestSample46 CN:SC PL:ILLUMINA DS:Study TestStudy BC:AC-AAC +@RG ID:1#47 DT:2011-03-23T00:00:00+0000 PU:160919_hiseq2500_4966_FC_1#47 LB:TestLibrary47 PG:SCS SM:TestSample47 CN:SC PL:ILLUMINA DS:Study TestStudy BC:GG-AGT +@RG ID:1#48 DT:2011-03-23T00:00:00+0000 PU:160919_hiseq2500_4966_FC_1#48 LB:TestLibrary48 PG:SCS SM:TestSample48 CN:SC PL:ILLUMINA DS:Study TestStudy BC:CT-TGG +@RG ID:1#49 DT:2011-03-23T00:00:00+0000 PU:160919_hiseq2500_4966_FC_1#49 LB:TestLibrary49 PG:SCS SM:TestSample49 CN:SC PL:ILLUMINA DS:Study TestStudy BC:CT-GCT +@RG ID:1#50 DT:2011-03-23T00:00:00+0000 PU:160919_hiseq2500_4966_FC_1#50 LB:TestLibrary50 PG:SCS SM:TestSample50 CN:SC PL:ILLUMINA DS:Study TestStudy BC:CC-CGC +@RG ID:1#51 DT:2011-03-23T00:00:00+0000 PU:160919_hiseq2500_4966_FC_1#51 LB:TestLibrary51 PG:SCS SM:TestSample51 CN:SC PL:ILLUMINA DS:Study TestStudy BC:CG-GGA +@RG ID:1#52 DT:2011-03-23T00:00:00+0000 PU:160919_hiseq2500_4966_FC_1#52 LB:TestLibrary52 PG:SCS SM:TestSample52 CN:SC PL:ILLUMINA DS:Study TestStudy BC:CC-GTT +@RG ID:1#53 DT:2011-03-23T00:00:00+0000 PU:160919_hiseq2500_4966_FC_1#53 LB:TestLibrary53 PG:SCS SM:TestSample53 CN:SC PL:ILLUMINA DS:Study TestStudy BC:GG-TCT +@RG ID:1#54 DT:2011-03-23T00:00:00+0000 PU:160919_hiseq2500_4966_FC_1#54 LB:TestLibrary54 PG:SCS SM:TestSample54 CN:SC PL:ILLUMINA DS:Study TestStudy BC:GT-CGG +@RG ID:1#55 DT:2011-03-23T00:00:00+0000 PU:160919_hiseq2500_4966_FC_1#55 LB:TestLibrary55 PG:SCS SM:TestSample55 CN:SC PL:ILLUMINA DS:Study TestStudy BC:AG-CCT +@RG ID:1#56 DT:2011-03-23T00:00:00+0000 PU:160919_hiseq2500_4966_FC_1#56 LB:TestLibrary56 PG:SCS SM:TestSample56 CN:SC PL:ILLUMINA DS:Study TestStudy BC:GC-CGT +@RG ID:1#57 DT:2011-03-23T00:00:00+0000 PU:160919_hiseq2500_4966_FC_1#57 LB:TestLibrary57 PG:SCS SM:TestSample57 CN:SC PL:ILLUMINA DS:Study TestStudy BC:TG-TCG +@RG ID:1#58 DT:2011-03-23T00:00:00+0000 PU:160919_hiseq2500_4966_FC_1#58 LB:TestLibrary58 PG:SCS SM:TestSample58 CN:SC PL:ILLUMINA DS:Study TestStudy BC:CC-CAG +@RG ID:1#59 DT:2011-03-23T00:00:00+0000 PU:160919_hiseq2500_4966_FC_1#59 LB:TestLibrary59 PG:SCS SM:TestSample59 CN:SC PL:ILLUMINA DS:Study TestStudy BC:CA-GTC +@RG ID:1#60 DT:2011-03-23T00:00:00+0000 PU:160919_hiseq2500_4966_FC_1#60 LB:TestLibrary60 PG:SCS SM:TestSample60 CN:SC PL:ILLUMINA DS:Study TestStudy BC:GA-ATT +@RG ID:1#61 DT:2011-03-23T00:00:00+0000 PU:160919_hiseq2500_4966_FC_1#61 LB:TestLibrary61 PG:SCS SM:TestSample61 CN:SC PL:ILLUMINA DS:Study TestStudy BC:GA-CGA +@RG ID:1#62 DT:2011-03-23T00:00:00+0000 PU:160919_hiseq2500_4966_FC_1#62 LB:TestLibrary62 PG:SCS SM:TestSample62 CN:SC PL:ILLUMINA DS:Study TestStudy BC:CA-ATA +@RG ID:1#63 DT:2011-03-23T00:00:00+0000 PU:160919_hiseq2500_4966_FC_1#63 LB:TestLibrary63 PG:SCS SM:TestSample63 CN:SC PL:ILLUMINA DS:Study TestStudy BC:TG-CTA +@RG ID:1#64 DT:2011-03-23T00:00:00+0000 PU:160919_hiseq2500_4966_FC_1#64 LB:TestLibrary64 PG:SCS SM:TestSample64 CN:SC PL:ILLUMINA DS:Study TestStudy BC:TA-TGA +@RG ID:1#65 DT:2011-03-23T00:00:00+0000 PU:160919_hiseq2500_4966_FC_1#65 LB:TestLibrary65 PG:SCS SM:TestSample65 CN:SC PL:ILLUMINA DS:Study TestStudy BC:CC-ATC +@RG ID:1#66 DT:2011-03-23T00:00:00+0000 PU:160919_hiseq2500_4966_FC_1#66 LB:TestLibrary66 PG:SCS SM:TestSample66 CN:SC PL:ILLUMINA DS:Study TestStudy BC:GG-CGC +@RG ID:1#67 DT:2011-03-23T00:00:00+0000 PU:160919_hiseq2500_4966_FC_1#67 LB:TestLibrary67 PG:SCS SM:TestSample67 CN:SC PL:ILLUMINA DS:Study TestStudy BC:TC-TAT +@RG ID:1#68 DT:2011-03-23T00:00:00+0000 PU:160919_hiseq2500_4966_FC_1#68 LB:TestLibrary68 PG:SCS SM:TestSample68 CN:SC PL:ILLUMINA DS:Study TestStudy BC:AA-TCC +@RG ID:1#69 DT:2011-03-23T00:00:00+0000 PU:160919_hiseq2500_4966_FC_1#69 LB:TestLibrary69 PG:SCS SM:TestSample69 CN:SC PL:ILLUMINA DS:Study TestStudy BC:TG-GAC +@RG ID:1#70 DT:2011-03-23T00:00:00+0000 PU:160919_hiseq2500_4966_FC_1#70 LB:TestLibrary70 PG:SCS SM:TestSample70 CN:SC PL:ILLUMINA DS:Study TestStudy BC:GA-GAC +@RG ID:1#71 DT:2011-03-23T00:00:00+0000 PU:160919_hiseq2500_4966_FC_1#71 LB:TestLibrary71 PG:SCS SM:TestSample71 CN:SC PL:ILLUMINA DS:Study TestStudy BC:CG-CAA +@RG ID:1#72 DT:2011-03-23T00:00:00+0000 PU:160919_hiseq2500_4966_FC_1#72 LB:TestLibrary72 PG:SCS SM:TestSample72 CN:SC PL:ILLUMINA DS:Study TestStudy BC:CT-CTC +@RG ID:1#73 DT:2011-03-23T00:00:00+0000 PU:160919_hiseq2500_4966_FC_1#73 LB:TestLibrary73 PG:SCS SM:TestSample73 CN:SC PL:ILLUMINA DS:Study TestStudy BC:AA-GCT +@RG ID:1#74 DT:2011-03-23T00:00:00+0000 PU:160919_hiseq2500_4966_FC_1#74 LB:TestLibrary74 PG:SCS SM:TestSample74 CN:SC PL:ILLUMINA DS:Study TestStudy BC:CG-TTG +@RG ID:1#75 DT:2011-03-23T00:00:00+0000 PU:160919_hiseq2500_4966_FC_1#75 LB:TestLibrary75 PG:SCS SM:TestSample75 CN:SC PL:ILLUMINA DS:Study TestStudy BC:AG-GAG +@RG ID:1#76 DT:2011-03-23T00:00:00+0000 PU:160919_hiseq2500_4966_FC_1#76 LB:TestLibrary76 PG:SCS SM:TestSample76 CN:SC PL:ILLUMINA DS:Study TestStudy BC:TT-AAC @PG ID:SCS VN:2.0.12.0 PN:HiSeq Control Software DS:Controlling software on instrument @PG ID:basecalling PP:SCS VN:Unknown PN:Unknown DS:Basecalling Package @PG ID:bambi PP:basecalling VN:12.34 CL:bambi i2b -i ./test/data/160919_hiseq2500_4966_FC/Data/Intensities -o /tmp/bambi.3bdOh3/test10_decode.bam --lane 1 --first-tile 1101 --tile-limit 1 --library-name TestLibrary --sample-alias TestSample --study-name Study TestStudy --run-start-date 2011-03-23T00:00:00+0000 --verbose --first-cycle 1,30 --final-cycle 2,32 --first-index-cycle 3,5 --final-index-cycle 4,7 --barcode-file test/data/160919_hiseq2500_4966_FC/barcodes_ci --barcode-tag-name BC --metrics-file /tmp/bambi.3bdOh3/test10_decode.bam.metrics PN:bambi DS:Convert Illumina BCL to BAM or SAM file diff --git a/test/data/out/test7_decode.sam b/test/data/out/test7_decode.sam index 671eb184..79dc88fc 100644 --- a/test/data/out/test7_decode.sam +++ b/test/data/out/test7_decode.sam @@ -1,15 +1,15 @@ @HD VN:1.5 SO:unsorted -@RG ID:1#0 DT:2011-03-23T00:00:00+0000 PU:160919_hiseq2500_4966_FC_1#0 LB:TestLibrary PG:SCS SM:TestSample CN:SC PL:ILLUMINA DS:Study TestStudy -@RG ID:1#1 DT:2011-03-23T00:00:00+0000 PU:160919_hiseq2500_4966_FC_1#1 LB:TestLibrary1 PG:SCS SM:TestSample1 CN:SC PL:ILLUMINA DS:Study TestStudy -@RG ID:1#2 DT:2011-03-23T00:00:00+0000 PU:160919_hiseq2500_4966_FC_1#2 LB:TestLibrary2 PG:SCS SM:TestSample2 CN:SC PL:ILLUMINA DS:Study TestStudy -@RG ID:1#3 DT:2011-03-23T00:00:00+0000 PU:160919_hiseq2500_4966_FC_1#3 LB:TestLibrary3 PG:SCS SM:TestSample3 CN:SC PL:ILLUMINA DS:Study TestStudy -@RG ID:1#4 DT:2011-03-23T00:00:00+0000 PU:160919_hiseq2500_4966_FC_1#4 LB:TestLibrary4 PG:SCS SM:TestSample4 CN:SC PL:ILLUMINA DS:Study TestStudy -@RG ID:1#5 DT:2011-03-23T00:00:00+0000 PU:160919_hiseq2500_4966_FC_1#5 LB:TestLibrary5 PG:SCS SM:TestSample5 CN:SC PL:ILLUMINA DS:Study TestStudy -@RG ID:1#6 DT:2011-03-23T00:00:00+0000 PU:160919_hiseq2500_4966_FC_1#6 LB:TestLibrary6 PG:SCS SM:TestSample6 CN:SC PL:ILLUMINA DS:Study TestStudy -@RG ID:1#7 DT:2011-03-23T00:00:00+0000 PU:160919_hiseq2500_4966_FC_1#7 LB:TestLibrary7 PG:SCS SM:TestSample7 CN:SC PL:ILLUMINA DS:Study TestStudy -@RG ID:1#8 DT:2011-03-23T00:00:00+0000 PU:160919_hiseq2500_4966_FC_1#8 LB:TestLibrary8 PG:SCS SM:TestSample8 CN:SC PL:ILLUMINA DS:Study TestStudy -@RG ID:1#9 DT:2011-03-23T00:00:00+0000 PU:160919_hiseq2500_4966_FC_1#9 LB:TestLibrary9 PG:SCS SM:TestSample9 CN:SC PL:ILLUMINA DS:Study TestStudy -@RG ID:1#10 DT:2011-03-23T00:00:00+0000 PU:160919_hiseq2500_4966_FC_1#10 LB:TestLibrary10 PG:SCS SM:TestSample10 CN:SC PL:ILLUMINA DS:Study TestStudy +@RG ID:1#0 DT:2011-03-23T00:00:00+0000 PU:160919_hiseq2500_4966_FC_1#0 LB:TestLibrary PG:SCS SM:TestSample CN:SC PL:ILLUMINA DS:Study TestStudy BC:NNNNN +@RG ID:1#1 DT:2011-03-23T00:00:00+0000 PU:160919_hiseq2500_4966_FC_1#1 LB:TestLibrary1 PG:SCS SM:TestSample1 CN:SC PL:ILLUMINA DS:Study TestStudy BC:AACCG +@RG ID:1#2 DT:2011-03-23T00:00:00+0000 PU:160919_hiseq2500_4966_FC_1#2 LB:TestLibrary2 PG:SCS SM:TestSample2 CN:SC PL:ILLUMINA DS:Study TestStudy BC:CCTCA +@RG ID:1#3 DT:2011-03-23T00:00:00+0000 PU:160919_hiseq2500_4966_FC_1#3 LB:TestLibrary3 PG:SCS SM:TestSample3 CN:SC PL:ILLUMINA DS:Study TestStudy BC:GGACA +@RG ID:1#4 DT:2011-03-23T00:00:00+0000 PU:160919_hiseq2500_4966_FC_1#4 LB:TestLibrary4 PG:SCS SM:TestSample4 CN:SC PL:ILLUMINA DS:Study TestStudy BC:TAATT +@RG ID:1#5 DT:2011-03-23T00:00:00+0000 PU:160919_hiseq2500_4966_FC_1#5 LB:TestLibrary5 PG:SCS SM:TestSample5 CN:SC PL:ILLUMINA DS:Study TestStudy BC:TGGAC +@RG ID:1#6 DT:2011-03-23T00:00:00+0000 PU:160919_hiseq2500_4966_FC_1#6 LB:TestLibrary6 PG:SCS SM:TestSample6 CN:SC PL:ILLUMINA DS:Study TestStudy BC:GTTAC +@RG ID:1#7 DT:2011-03-23T00:00:00+0000 PU:160919_hiseq2500_4966_FC_1#7 LB:TestLibrary7 PG:SCS SM:TestSample7 CN:SC PL:ILLUMINA DS:Study TestStudy BC:CTACG +@RG ID:1#8 DT:2011-03-23T00:00:00+0000 PU:160919_hiseq2500_4966_FC_1#8 LB:TestLibrary8 PG:SCS SM:TestSample8 CN:SC PL:ILLUMINA DS:Study TestStudy BC:TCTCC +@RG ID:1#9 DT:2011-03-23T00:00:00+0000 PU:160919_hiseq2500_4966_FC_1#9 LB:TestLibrary9 PG:SCS SM:TestSample9 CN:SC PL:ILLUMINA DS:Study TestStudy BC:CGCCT +@RG ID:1#10 DT:2011-03-23T00:00:00+0000 PU:160919_hiseq2500_4966_FC_1#10 LB:TestLibrary10 PG:SCS SM:TestSample10 CN:SC PL:ILLUMINA DS:Study TestStudy BC:AGGTG @PG ID:SCS VN:2.0.12.0 PN:HiSeq Control Software DS:Controlling software on instrument @PG ID:basecalling PP:SCS VN:Unknown PN:Unknown DS:Basecalling Package @PG ID:bambi PP:basecalling VN:12.34 CL:bambi i2b -i test/data/160919_hiseq2500_4966_FC/Data/Intensities -o /tmp/bambi.3bdOh3/i2b_7_decode.bam --lane 1 --first-tile 1101 --tile-limit 1 --library-name TestLibrary --sample-alias TestSample --study-name Study TestStudy --run-start-date 2011-03-23T00:00:00+0000 --verbose --first-cycle 1,30 --final-cycle 2,32 --first-index-cycle 3,6,11 --final-index-cycle 5,10,12 --barcode-tag b1,b2,b3 --quality-tag q1,q2,q3 --barcode-file test/data/160919_hiseq2500_4966_FC/barcodes_i2 --barcode-tag-name b2 --metrics-file /tmp/bambi.3bdOh3/i2b_7_decode.bam.metrics PN:bambi DS:Convert Illumina BCL to BAM or SAM file diff --git a/test/data/out/test9_decode.sam b/test/data/out/test9_decode.sam index c75f6885..8c6c3279 100644 --- a/test/data/out/test9_decode.sam +++ b/test/data/out/test9_decode.sam @@ -1,41 +1,41 @@ @HD VN:1.5 SO:unsorted -@RG ID:1#0 DT:2011-03-23T00:00:00+0000 PU:160919_hiseq2500_4966_FC_1#0 LB:TestLibrary PG:SCS SM:TestSample CN:SC PL:ILLUMINA DS:Study TestStudy -@RG ID:1#1 DT:2011-03-23T00:00:00+0000 PU:160919_hiseq2500_4966_FC_1#1 LB:TestLibrary1 PG:SCS SM:TestSample1 CN:SC PL:ILLUMINA DS:Study TestStudy -@RG ID:1#2 DT:2011-03-23T00:00:00+0000 PU:160919_hiseq2500_4966_FC_1#2 LB:TestLibrary2 PG:SCS SM:TestSample2 CN:SC PL:ILLUMINA DS:Study TestStudy -@RG ID:1#3 DT:2011-03-23T00:00:00+0000 PU:160919_hiseq2500_4966_FC_1#3 LB:TestLibrary3 PG:SCS SM:TestSample3 CN:SC PL:ILLUMINA DS:Study TestStudy -@RG ID:1#4 DT:2011-03-23T00:00:00+0000 PU:160919_hiseq2500_4966_FC_1#4 LB:TestLibrary4 PG:SCS SM:TestSample4 CN:SC PL:ILLUMINA DS:Study TestStudy -@RG ID:1#5 DT:2011-03-23T00:00:00+0000 PU:160919_hiseq2500_4966_FC_1#5 LB:TestLibrary5 PG:SCS SM:TestSample5 CN:SC PL:ILLUMINA DS:Study TestStudy -@RG ID:1#6 DT:2011-03-23T00:00:00+0000 PU:160919_hiseq2500_4966_FC_1#6 LB:TestLibrary6 PG:SCS SM:TestSample6 CN:SC PL:ILLUMINA DS:Study TestStudy -@RG ID:1#7 DT:2011-03-23T00:00:00+0000 PU:160919_hiseq2500_4966_FC_1#7 LB:TestLibrary7 PG:SCS SM:TestSample7 CN:SC PL:ILLUMINA DS:Study TestStudy -@RG ID:1#8 DT:2011-03-23T00:00:00+0000 PU:160919_hiseq2500_4966_FC_1#8 LB:TestLibrary8 PG:SCS SM:TestSample8 CN:SC PL:ILLUMINA DS:Study TestStudy -@RG ID:1#9 DT:2011-03-23T00:00:00+0000 PU:160919_hiseq2500_4966_FC_1#9 LB:TestLibrary9 PG:SCS SM:TestSample9 CN:SC PL:ILLUMINA DS:Study TestStudy -@RG ID:1#10 DT:2011-03-23T00:00:00+0000 PU:160919_hiseq2500_4966_FC_1#10 LB:TestLibrary10 PG:SCS SM:TestSample10 CN:SC PL:ILLUMINA DS:Study TestStudy -@RG ID:1#11 DT:2011-03-23T00:00:00+0000 PU:160919_hiseq2500_4966_FC_1#11 LB:TestLibrary11 PG:SCS SM:TestSample11 CN:SC PL:ILLUMINA DS:Study TestStudy -@RG ID:1#12 DT:2011-03-23T00:00:00+0000 PU:160919_hiseq2500_4966_FC_1#12 LB:TestLibrary12 PG:SCS SM:TestSample12 CN:SC PL:ILLUMINA DS:Study TestStudy -@RG ID:1#13 DT:2011-03-23T00:00:00+0000 PU:160919_hiseq2500_4966_FC_1#13 LB:TestLibrary13 PG:SCS SM:TestSample13 CN:SC PL:ILLUMINA DS:Study TestStudy -@RG ID:1#14 DT:2011-03-23T00:00:00+0000 PU:160919_hiseq2500_4966_FC_1#14 LB:TestLibrary14 PG:SCS SM:TestSample14 CN:SC PL:ILLUMINA DS:Study TestStudy -@RG ID:1#15 DT:2011-03-23T00:00:00+0000 PU:160919_hiseq2500_4966_FC_1#15 LB:TestLibrary15 PG:SCS SM:TestSample15 CN:SC PL:ILLUMINA DS:Study TestStudy -@RG ID:1#16 DT:2011-03-23T00:00:00+0000 PU:160919_hiseq2500_4966_FC_1#16 LB:TestLibrary16 PG:SCS SM:TestSample16 CN:SC PL:ILLUMINA DS:Study TestStudy -@RG ID:1#17 DT:2011-03-23T00:00:00+0000 PU:160919_hiseq2500_4966_FC_1#17 LB:TestLibrary17 PG:SCS SM:TestSample17 CN:SC PL:ILLUMINA DS:Study TestStudy -@RG ID:1#18 DT:2011-03-23T00:00:00+0000 PU:160919_hiseq2500_4966_FC_1#18 LB:TestLibrary18 PG:SCS SM:TestSample18 CN:SC PL:ILLUMINA DS:Study TestStudy -@RG ID:1#19 DT:2011-03-23T00:00:00+0000 PU:160919_hiseq2500_4966_FC_1#19 LB:TestLibrary19 PG:SCS SM:TestSample19 CN:SC PL:ILLUMINA DS:Study TestStudy -@RG ID:1#20 DT:2011-03-23T00:00:00+0000 PU:160919_hiseq2500_4966_FC_1#20 LB:TestLibrary20 PG:SCS SM:TestSample20 CN:SC PL:ILLUMINA DS:Study TestStudy -@RG ID:1#21 DT:2011-03-23T00:00:00+0000 PU:160919_hiseq2500_4966_FC_1#21 LB:TestLibrary21 PG:SCS SM:TestSample21 CN:SC PL:ILLUMINA DS:Study TestStudy -@RG ID:1#22 DT:2011-03-23T00:00:00+0000 PU:160919_hiseq2500_4966_FC_1#22 LB:TestLibrary22 PG:SCS SM:TestSample22 CN:SC PL:ILLUMINA DS:Study TestStudy -@RG ID:1#23 DT:2011-03-23T00:00:00+0000 PU:160919_hiseq2500_4966_FC_1#23 LB:TestLibrary23 PG:SCS SM:TestSample23 CN:SC PL:ILLUMINA DS:Study TestStudy -@RG ID:1#24 DT:2011-03-23T00:00:00+0000 PU:160919_hiseq2500_4966_FC_1#24 LB:TestLibrary24 PG:SCS SM:TestSample24 CN:SC PL:ILLUMINA DS:Study TestStudy -@RG ID:1#25 DT:2011-03-23T00:00:00+0000 PU:160919_hiseq2500_4966_FC_1#25 LB:TestLibrary25 PG:SCS SM:TestSample25 CN:SC PL:ILLUMINA DS:Study TestStudy -@RG ID:1#26 DT:2011-03-23T00:00:00+0000 PU:160919_hiseq2500_4966_FC_1#26 LB:TestLibrary26 PG:SCS SM:TestSample26 CN:SC PL:ILLUMINA DS:Study TestStudy -@RG ID:1#27 DT:2011-03-23T00:00:00+0000 PU:160919_hiseq2500_4966_FC_1#27 LB:TestLibrary27 PG:SCS SM:TestSample27 CN:SC PL:ILLUMINA DS:Study TestStudy -@RG ID:1#28 DT:2011-03-23T00:00:00+0000 PU:160919_hiseq2500_4966_FC_1#28 LB:TestLibrary28 PG:SCS SM:TestSample28 CN:SC PL:ILLUMINA DS:Study TestStudy -@RG ID:1#29 DT:2011-03-23T00:00:00+0000 PU:160919_hiseq2500_4966_FC_1#29 LB:TestLibrary29 PG:SCS SM:TestSample29 CN:SC PL:ILLUMINA DS:Study TestStudy -@RG ID:1#30 DT:2011-03-23T00:00:00+0000 PU:160919_hiseq2500_4966_FC_1#30 LB:TestLibrary30 PG:SCS SM:TestSample30 CN:SC PL:ILLUMINA DS:Study TestStudy -@RG ID:1#31 DT:2011-03-23T00:00:00+0000 PU:160919_hiseq2500_4966_FC_1#31 LB:TestLibrary31 PG:SCS SM:TestSample31 CN:SC PL:ILLUMINA DS:Study TestStudy -@RG ID:1#32 DT:2011-03-23T00:00:00+0000 PU:160919_hiseq2500_4966_FC_1#32 LB:TestLibrary32 PG:SCS SM:TestSample32 CN:SC PL:ILLUMINA DS:Study TestStudy -@RG ID:1#33 DT:2011-03-23T00:00:00+0000 PU:160919_hiseq2500_4966_FC_1#33 LB:TestLibrary33 PG:SCS SM:TestSample33 CN:SC PL:ILLUMINA DS:Study TestStudy -@RG ID:1#34 DT:2011-03-23T00:00:00+0000 PU:160919_hiseq2500_4966_FC_1#34 LB:TestLibrary34 PG:SCS SM:TestSample34 CN:SC PL:ILLUMINA DS:Study TestStudy -@RG ID:1#35 DT:2011-03-23T00:00:00+0000 PU:160919_hiseq2500_4966_FC_1#35 LB:TestLibrary35 PG:SCS SM:TestSample35 CN:SC PL:ILLUMINA DS:Study TestStudy -@RG ID:1#36 DT:2011-03-23T00:00:00+0000 PU:160919_hiseq2500_4966_FC_1#36 LB:TestLibrary36 PG:SCS SM:TestSample36 CN:SC PL:ILLUMINA DS:Study TestStudy +@RG ID:1#0 DT:2011-03-23T00:00:00+0000 PU:160919_hiseq2500_4966_FC_1#0 LB:TestLibrary PG:SCS SM:TestSample CN:SC PL:ILLUMINA DS:Study TestStudy BC:NN-NN +@RG ID:1#1 DT:2011-03-23T00:00:00+0000 PU:160919_hiseq2500_4966_FC_1#1 LB:TestLibrary1 PG:SCS SM:TestSample1 CN:SC PL:ILLUMINA DS:Study TestStudy BC:GT-AG +@RG ID:1#2 DT:2011-03-23T00:00:00+0000 PU:160919_hiseq2500_4966_FC_1#2 LB:TestLibrary2 PG:SCS SM:TestSample2 CN:SC PL:ILLUMINA DS:Study TestStudy BC:AC-TC +@RG ID:1#3 DT:2011-03-23T00:00:00+0000 PU:160919_hiseq2500_4966_FC_1#3 LB:TestLibrary3 PG:SCS SM:TestSample3 CN:SC PL:ILLUMINA DS:Study TestStudy BC:TT-AA +@RG ID:1#4 DT:2011-03-23T00:00:00+0000 PU:160919_hiseq2500_4966_FC_1#4 LB:TestLibrary4 PG:SCS SM:TestSample4 CN:SC PL:ILLUMINA DS:Study TestStudy BC:AA-GT +@RG ID:1#5 DT:2011-03-23T00:00:00+0000 PU:160919_hiseq2500_4966_FC_1#5 LB:TestLibrary5 PG:SCS SM:TestSample5 CN:SC PL:ILLUMINA DS:Study TestStudy BC:GC-TA +@RG ID:1#6 DT:2011-03-23T00:00:00+0000 PU:160919_hiseq2500_4966_FC_1#6 LB:TestLibrary6 PG:SCS SM:TestSample6 CN:SC PL:ILLUMINA DS:Study TestStudy BC:GG-AC +@RG ID:1#7 DT:2011-03-23T00:00:00+0000 PU:160919_hiseq2500_4966_FC_1#7 LB:TestLibrary7 PG:SCS SM:TestSample7 CN:SC PL:ILLUMINA DS:Study TestStudy BC:CT-TG +@RG ID:1#8 DT:2011-03-23T00:00:00+0000 PU:160919_hiseq2500_4966_FC_1#8 LB:TestLibrary8 PG:SCS SM:TestSample8 CN:SC PL:ILLUMINA DS:Study TestStudy BC:GT-CA +@RG ID:1#9 DT:2011-03-23T00:00:00+0000 PU:160919_hiseq2500_4966_FC_1#9 LB:TestLibrary9 PG:SCS SM:TestSample9 CN:SC PL:ILLUMINA DS:Study TestStudy BC:GG-GG +@RG ID:1#10 DT:2011-03-23T00:00:00+0000 PU:160919_hiseq2500_4966_FC_1#10 LB:TestLibrary10 PG:SCS SM:TestSample10 CN:SC PL:ILLUMINA DS:Study TestStudy BC:TA-AG +@RG ID:1#11 DT:2011-03-23T00:00:00+0000 PU:160919_hiseq2500_4966_FC_1#11 LB:TestLibrary11 PG:SCS SM:TestSample11 CN:SC PL:ILLUMINA DS:Study TestStudy BC:AG-GA +@RG ID:1#12 DT:2011-03-23T00:00:00+0000 PU:160919_hiseq2500_4966_FC_1#12 LB:TestLibrary12 PG:SCS SM:TestSample12 CN:SC PL:ILLUMINA DS:Study TestStudy BC:TT-GC +@RG ID:1#13 DT:2011-03-23T00:00:00+0000 PU:160919_hiseq2500_4966_FC_1#13 LB:TestLibrary13 PG:SCS SM:TestSample13 CN:SC PL:ILLUMINA DS:Study TestStudy BC:CG-AG +@RG ID:1#14 DT:2011-03-23T00:00:00+0000 PU:160919_hiseq2500_4966_FC_1#14 LB:TestLibrary14 PG:SCS SM:TestSample14 CN:SC PL:ILLUMINA DS:Study TestStudy BC:CG-TC +@RG ID:1#15 DT:2011-03-23T00:00:00+0000 PU:160919_hiseq2500_4966_FC_1#15 LB:TestLibrary15 PG:SCS SM:TestSample15 CN:SC PL:ILLUMINA DS:Study TestStudy BC:TC-CT +@RG ID:1#16 DT:2011-03-23T00:00:00+0000 PU:160919_hiseq2500_4966_FC_1#16 LB:TestLibrary16 PG:SCS SM:TestSample16 CN:SC PL:ILLUMINA DS:Study TestStudy BC:AC-AG +@RG ID:1#17 DT:2011-03-23T00:00:00+0000 PU:160919_hiseq2500_4966_FC_1#17 LB:TestLibrary17 PG:SCS SM:TestSample17 CN:SC PL:ILLUMINA DS:Study TestStudy BC:TG-TA +@RG ID:1#18 DT:2011-03-23T00:00:00+0000 PU:160919_hiseq2500_4966_FC_1#18 LB:TestLibrary18 PG:SCS SM:TestSample18 CN:SC PL:ILLUMINA DS:Study TestStudy BC:AT-AT +@RG ID:1#19 DT:2011-03-23T00:00:00+0000 PU:160919_hiseq2500_4966_FC_1#19 LB:TestLibrary19 PG:SCS SM:TestSample19 CN:SC PL:ILLUMINA DS:Study TestStudy BC:GC-AT +@RG ID:1#20 DT:2011-03-23T00:00:00+0000 PU:160919_hiseq2500_4966_FC_1#20 LB:TestLibrary20 PG:SCS SM:TestSample20 CN:SC PL:ILLUMINA DS:Study TestStudy BC:TA-GA +@RG ID:1#21 DT:2011-03-23T00:00:00+0000 PU:160919_hiseq2500_4966_FC_1#21 LB:TestLibrary21 PG:SCS SM:TestSample21 CN:SC PL:ILLUMINA DS:Study TestStudy BC:AA-TA +@RG ID:1#22 DT:2011-03-23T00:00:00+0000 PU:160919_hiseq2500_4966_FC_1#22 LB:TestLibrary22 PG:SCS SM:TestSample22 CN:SC PL:ILLUMINA DS:Study TestStudy BC:AG-CC +@RG ID:1#23 DT:2011-03-23T00:00:00+0000 PU:160919_hiseq2500_4966_FC_1#23 LB:TestLibrary23 PG:SCS SM:TestSample23 CN:SC PL:ILLUMINA DS:Study TestStudy BC:GT-GT +@RG ID:1#24 DT:2011-03-23T00:00:00+0000 PU:160919_hiseq2500_4966_FC_1#24 LB:TestLibrary24 PG:SCS SM:TestSample24 CN:SC PL:ILLUMINA DS:Study TestStudy BC:GA-AA +@RG ID:1#25 DT:2011-03-23T00:00:00+0000 PU:160919_hiseq2500_4966_FC_1#25 LB:TestLibrary25 PG:SCS SM:TestSample25 CN:SC PL:ILLUMINA DS:Study TestStudy BC:TT-CG +@RG ID:1#26 DT:2011-03-23T00:00:00+0000 PU:160919_hiseq2500_4966_FC_1#26 LB:TestLibrary26 PG:SCS SM:TestSample26 CN:SC PL:ILLUMINA DS:Study TestStudy BC:CC-AA +@RG ID:1#27 DT:2011-03-23T00:00:00+0000 PU:160919_hiseq2500_4966_FC_1#27 LB:TestLibrary27 PG:SCS SM:TestSample27 CN:SC PL:ILLUMINA DS:Study TestStudy BC:CA-CA +@RG ID:1#28 DT:2011-03-23T00:00:00+0000 PU:160919_hiseq2500_4966_FC_1#28 LB:TestLibrary28 PG:SCS SM:TestSample28 CN:SC PL:ILLUMINA DS:Study TestStudy BC:GA-GC +@RG ID:1#29 DT:2011-03-23T00:00:00+0000 PU:160919_hiseq2500_4966_FC_1#29 LB:TestLibrary29 PG:SCS SM:TestSample29 CN:SC PL:ILLUMINA DS:Study TestStudy BC:TT-TT +@RG ID:1#30 DT:2011-03-23T00:00:00+0000 PU:160919_hiseq2500_4966_FC_1#30 LB:TestLibrary30 PG:SCS SM:TestSample30 CN:SC PL:ILLUMINA DS:Study TestStudy BC:CC-CC +@RG ID:1#31 DT:2011-03-23T00:00:00+0000 PU:160919_hiseq2500_4966_FC_1#31 LB:TestLibrary31 PG:SCS SM:TestSample31 CN:SC PL:ILLUMINA DS:Study TestStudy BC:AA-AC +@RG ID:1#32 DT:2011-03-23T00:00:00+0000 PU:160919_hiseq2500_4966_FC_1#32 LB:TestLibrary32 PG:SCS SM:TestSample32 CN:SC PL:ILLUMINA DS:Study TestStudy BC:CC-GG +@RG ID:1#33 DT:2011-03-23T00:00:00+0000 PU:160919_hiseq2500_4966_FC_1#33 LB:TestLibrary33 PG:SCS SM:TestSample33 CN:SC PL:ILLUMINA DS:Study TestStudy BC:AG-TG +@RG ID:1#34 DT:2011-03-23T00:00:00+0000 PU:160919_hiseq2500_4966_FC_1#34 LB:TestLibrary34 PG:SCS SM:TestSample34 CN:SC PL:ILLUMINA DS:Study TestStudy BC:GC-CG +@RG ID:1#35 DT:2011-03-23T00:00:00+0000 PU:160919_hiseq2500_4966_FC_1#35 LB:TestLibrary35 PG:SCS SM:TestSample35 CN:SC PL:ILLUMINA DS:Study TestStudy BC:TG-AT +@RG ID:1#36 DT:2011-03-23T00:00:00+0000 PU:160919_hiseq2500_4966_FC_1#36 LB:TestLibrary36 PG:SCS SM:TestSample36 CN:SC PL:ILLUMINA DS:Study TestStudy BC:GG-CT @PG ID:SCS VN:2.0.12.0 PN:HiSeq Control Software DS:Controlling software on instrument @PG ID:basecalling PP:SCS VN:Unknown PN:Unknown DS:Basecalling Package @PG ID:bambi PP:basecalling VN:0.11.1-8-g237eff2 CL:./src/bambi i2b -i test/data/160919_hiseq2500_4966_FC/Data/Intensities -o /tmp/bambi.3bdOh3/test9_decode.bam --lane 1 --first-tile 1101 --tile-limit 1 --library-name TestLibrary --sample-alias TestSample --study-name Study TestStudy --run-start-date 2011-03-23T00:00:00+0000 --verbose --first-cycle 1,30 --final-cycle 2,32 --first-index-cycle 3,6,11 --final-index-cycle 4,9,12 --barcode-tag b1,b2,b1 --quality-tag q1,q2,q1 --barcode-file test/data/160919_hiseq2500_4966_FC/barcodes_i1i3_sep --barcode-tag-name b1 --metrics-file /tmp/bambi.3bdOh3/test9_decode.bam.metrics PN:bambi DS:Convert Illumina BCL to BAM or SAM file diff --git a/test/t_i2b.c b/test/t_i2b.c index 8f6783c4..37ae3808 100644 --- a/test/t_i2b.c +++ b/test/t_i2b.c @@ -595,20 +595,20 @@ void checkFiles(char *gotfile, char *expectfile, int verbose) bam1_t *got_rec, *exp_rec; int c = sam_hdr_count_lines(bgot->h, "RG"); - if (c != sam_hdr_count_lines(bexp->h, "RG")) { failure++; return; } + if (c != sam_hdr_count_lines(bexp->h, "RG")) { failure++; c = 0; } for (int n=0; n < c; n++) { kstring_t ks_got; ks_initialize(&ks_got); kstring_t ks_exp; ks_initialize(&ks_exp); sam_hdr_find_line_pos(bgot->h, "RG", n, &ks_got); sam_hdr_find_line_pos(bexp->h, "RG", n, &ks_exp); - if (strcmp(ks_str(&ks_got), ks_str(&ks_exp))) { failure++; return; } + if (strcmp(ks_str(&ks_got), ks_str(&ks_exp))) { failure++; c = 0; } ks_free(&ks_got); ks_free(&ks_exp); } while ((exp_rec = BAMit_next(bexp)) != NULL) { got_rec = BAMit_next(bgot); - if (!got_rec) { fprintf(stderr, "%s ended too soon\n", gotfile); failure++; return; } + if (!got_rec) { fprintf(stderr, "%s ended too soon\n", gotfile); failure++; break; } if (memcmp(got_rec->data, exp_rec->data, got_rec->l_data)) { failure++; break; From 46d4913125b4003cc692ac5a9061ae92cdf91460 Mon Sep 17 00:00:00 2001 From: jenniferliddle Date: Wed, 10 Mar 2021 10:20:01 +0000 Subject: [PATCH 2/5] Minor changes to handle barcode files containing dual tags with only one tag such as "-ACGT" and "ACGT-" --- src/decode.c | 4 +- test/data/decode_5.sam | 20 ++++++ test/data/decode_5.tag | 5 ++ test/data/decode_6.sam | 20 ++++++ test/data/decode_6.tag | 4 ++ test/data/out/decode_5.metrics | 12 ++++ test/data/out/decode_5.sam | 25 ++++++++ test/data/out/decode_6.metrics | 11 ++++ test/data/out/decode_6.sam | 24 +++++++ test/t_decode.c | 113 +++++++++++++++++++++++++++++++++ 10 files changed, 236 insertions(+), 2 deletions(-) create mode 100644 test/data/decode_5.sam create mode 100644 test/data/decode_5.tag create mode 100644 test/data/decode_6.sam create mode 100644 test/data/decode_6.tag create mode 100644 test/data/out/decode_5.metrics create mode 100644 test/data/out/decode_5.sam create mode 100644 test/data/out/decode_6.metrics create mode 100644 test/data/out/decode_6.sam diff --git a/src/decode.c b/src/decode.c index b96d5824..b6af4c59 100644 --- a/src/decode.c +++ b/src/decode.c @@ -633,7 +633,7 @@ int writeMetrics(va_t *barcodeArray, HashTable *tagHopHash, decode_opts_t *opts) * Now write tag hop metrics file - if there are any */ - if (opts->idx2_len) { + if (opts->idx1_len && opts->idx2_len) { char *metrics_hops_name = malloc(strlen(opts->metrics_name)+6); strcpy(metrics_hops_name, opts->metrics_name); strcat(metrics_hops_name, ".hops"); @@ -968,7 +968,7 @@ char *findBarcodeName(char *barcode, va_t *barcodeArray, HashTable *barcodeHash, } else { bcd = findBestMatch(barcode, barcodeArray, barcodeHash, opts); if (isUpdateMetrics) updateMetrics(bcd, barcode, isPf); - if ((bcd == barcodeArray->entries[0]) && opts->idx2_len) { + if ((bcd == barcodeArray->entries[0]) && opts->idx1_len && opts->idx2_len) { bc_details_t *tag_hop = check_tag_hopping(barcode, barcodeArray, tagHopHash, opts); if (isUpdateMetrics && tag_hop) updateMetrics(tag_hop, barcode, isPf); } diff --git a/test/data/decode_5.sam b/test/data/decode_5.sam new file mode 100644 index 00000000..a7421e56 --- /dev/null +++ b/test/data/decode_5.sam @@ -0,0 +1,20 @@ +@HD VN:1.5 SO:unsorted +@RG ID:1 PL:ILLUMINA PU:110608_HS19_06383_B_C024LABXX_8 LB:2_184535_653_010611 DS:Study ZF_MrSol_Exome DT:2011-06-08T00:00:00+0100 SM:MRSOL5096964,MRSOL5096965 CN:SC +@PG ID:SCS PN:RTA DS:Controlling software on instrument VN:1.12.4.0 +@PG ID:basecalling PN:RTA PP:SCS DS:Basecalling Package VN:1.12.4.0 +@PG ID:illumina2bam PN:illumina2bam PP:basecalling DS:Convert Illumina BCL to BAM or SAM file VN:0.03 CL:illumina.Illumina2bam INTENSITY_DIR=/nfs/sf36/ILorHSany_sf36/analysis/110608_HS19_06383_B_C024LABXX/Data/Intensities LANE=8 OUTPUT=/nfs/sf36/ILorHSany_sf36/analysis/110608_HS19_06383_B_C024LABXX/Data/Intensities/PB_basecalls_20110614-084055/6383_8.bam SAMPLE_ALIAS=MRSOL5096964,MRSOL5096965 LIBRARY_NAME=2_184535_653_010611 STUDY_NAME=ZF_MrSol_Exome CREATE_MD5_FILE=true GENERATE_SECONDARY_BASE_CALLS=false PF_FILTER=true READ_GROUP_ID=1 SEQUENCING_CENTER=SC PLATFORM=ILLUMINA TMP_DIR=/tmp/srpipe VERBOSITY=INFO QUIET=false VALIDATION_STRINGENCY=STRICT COMPRESSION_LEVEL=5 MAX_RECORDS_IN_RAM=500000 CREATE_INDEX=false +HS19_6383:8:1101:1128:2136 133 * 0 0 * * 0 0 NTGCGNATCANNNNN !!!!!!!!!!!!!!! RG:Z:1 +HS19_6383:8:1101:1085:2136 69 * 0 0 * * 0 0 ACATTCACAANNNNN @BCD!!!!!!!!!!! RG:Z:1 QT:Z:!!!!!!!! BC:Z:NNNNNNNN +HS19_6383:8:1101:1085:2136 133 * 0 0 * * 0 0 NCATGNAGNNNNNNN !!!!!!!!!!!!!!! RG:Z:1 +HS19_6383:8:1101:1245:2140 69 * 0 0 * * 0 0 TTCTGAAAGCTGTGT @C@FCCHHEAHHAEA RG:Z:1 +HS19_6383:8:1101:1245:2140 133 * 0 0 * * 0 0 NACTGTATGTNNNNN !!!4!!!!!!!!!!! RG:Z:1 QT:Z:@@@DFDFF BC:Z:TATG-TATGT +HS19_6383:8:1101:1216:2154 69 * 0 0 * * 0 0 TTTTGACCCTTGTTT @@@AH?>EEECFFCC RG:Z:1 QT:Z:B@CFF?DF BC:Z:NATG-TATNT +HS19_6383:8:1101:1216:2154 133 * 0 0 * * 0 0 CGTATTCGGACNNNG @@CF++(!(!(!!!( RG:Z:1 +HS19_6383:8:1101:1534:2155 69 * 0 0 * * 0 0 TGTATTGATTTGTTG CCCFHBBCA8@3((( RG:Z:1 QT:Z:@C@FFFFF BC:Z:NNNT-TATNT +HS19_6383:8:1101:1534:2156 69 * 0 0 * * 0 0 TGTATTGATTTGTTG CCCFHBBCA8@3((( RG:Z:1 QT:Z:@C@FFFFF BC:Z:TATG-TANNN +HS19_6383:8:1101:1534:2160 69 * 0 0 * * 0 0 TGTATTGATTTGTTG CCCFHBBCA8@3((( RG:Z:1 QT:Z:@C@FFFFF BC:Z:GCGT-TGCAT +HS19_6383:8:1101:1534:2162 69 * 0 0 * * 0 0 TGTATTGATTTGTTG CCCFHBBCA8@3((( RG:Z:1 QT:Z:@C@FFFFF BC:Z:CATG-TGCAT +HS19_6383:8:1101:1534:2164 69 * 0 0 * * 0 0 TGTATTGATTTGTTG CCCFHBBCA8@3((( RG:Z:1 QT:Z:@C@FFFFF BC:Z:ACGT-AAAAA +HS19_6383:8:1101:1245:2165 133 * 0 0 * * 0 0 NACTGTATGTNNNNN !!!4!!!!!!!!!!! RG:Z:1 QT:Z:@@@DFDFF BC:Z:TATGAA-TATGTAA +HS19_6383:8:1101:1245:2166 133 * 0 0 * * 0 0 NACTGTATGTNNNNN !!!4!!!!!!!!!!! RG:Z:1 QT:Z:@@@DFDFF BC:Z:TATGAA-TCACT +HS19_6383:8:1101:1245:2167 133 * 0 0 * * 0 0 NACTGTATGTNNNNN !!!4!!!!!!!!!!! RG:Z:1 QT:Z:@@@DFDFF BC:Z:TATGAT-TCACT diff --git a/test/data/decode_5.tag b/test/data/decode_5.tag new file mode 100644 index 00000000..5f327633 --- /dev/null +++ b/test/data/decode_5.tag @@ -0,0 +1,5 @@ +barcode_sequence barcode_name +-TGCAT 1 +-TATGT 2 +-ACACT 3 +-TCACT 4 diff --git a/test/data/decode_6.sam b/test/data/decode_6.sam new file mode 100644 index 00000000..a7421e56 --- /dev/null +++ b/test/data/decode_6.sam @@ -0,0 +1,20 @@ +@HD VN:1.5 SO:unsorted +@RG ID:1 PL:ILLUMINA PU:110608_HS19_06383_B_C024LABXX_8 LB:2_184535_653_010611 DS:Study ZF_MrSol_Exome DT:2011-06-08T00:00:00+0100 SM:MRSOL5096964,MRSOL5096965 CN:SC +@PG ID:SCS PN:RTA DS:Controlling software on instrument VN:1.12.4.0 +@PG ID:basecalling PN:RTA PP:SCS DS:Basecalling Package VN:1.12.4.0 +@PG ID:illumina2bam PN:illumina2bam PP:basecalling DS:Convert Illumina BCL to BAM or SAM file VN:0.03 CL:illumina.Illumina2bam INTENSITY_DIR=/nfs/sf36/ILorHSany_sf36/analysis/110608_HS19_06383_B_C024LABXX/Data/Intensities LANE=8 OUTPUT=/nfs/sf36/ILorHSany_sf36/analysis/110608_HS19_06383_B_C024LABXX/Data/Intensities/PB_basecalls_20110614-084055/6383_8.bam SAMPLE_ALIAS=MRSOL5096964,MRSOL5096965 LIBRARY_NAME=2_184535_653_010611 STUDY_NAME=ZF_MrSol_Exome CREATE_MD5_FILE=true GENERATE_SECONDARY_BASE_CALLS=false PF_FILTER=true READ_GROUP_ID=1 SEQUENCING_CENTER=SC PLATFORM=ILLUMINA TMP_DIR=/tmp/srpipe VERBOSITY=INFO QUIET=false VALIDATION_STRINGENCY=STRICT COMPRESSION_LEVEL=5 MAX_RECORDS_IN_RAM=500000 CREATE_INDEX=false +HS19_6383:8:1101:1128:2136 133 * 0 0 * * 0 0 NTGCGNATCANNNNN !!!!!!!!!!!!!!! RG:Z:1 +HS19_6383:8:1101:1085:2136 69 * 0 0 * * 0 0 ACATTCACAANNNNN @BCD!!!!!!!!!!! RG:Z:1 QT:Z:!!!!!!!! BC:Z:NNNNNNNN +HS19_6383:8:1101:1085:2136 133 * 0 0 * * 0 0 NCATGNAGNNNNNNN !!!!!!!!!!!!!!! RG:Z:1 +HS19_6383:8:1101:1245:2140 69 * 0 0 * * 0 0 TTCTGAAAGCTGTGT @C@FCCHHEAHHAEA RG:Z:1 +HS19_6383:8:1101:1245:2140 133 * 0 0 * * 0 0 NACTGTATGTNNNNN !!!4!!!!!!!!!!! RG:Z:1 QT:Z:@@@DFDFF BC:Z:TATG-TATGT +HS19_6383:8:1101:1216:2154 69 * 0 0 * * 0 0 TTTTGACCCTTGTTT @@@AH?>EEECFFCC RG:Z:1 QT:Z:B@CFF?DF BC:Z:NATG-TATNT +HS19_6383:8:1101:1216:2154 133 * 0 0 * * 0 0 CGTATTCGGACNNNG @@CF++(!(!(!!!( RG:Z:1 +HS19_6383:8:1101:1534:2155 69 * 0 0 * * 0 0 TGTATTGATTTGTTG CCCFHBBCA8@3((( RG:Z:1 QT:Z:@C@FFFFF BC:Z:NNNT-TATNT +HS19_6383:8:1101:1534:2156 69 * 0 0 * * 0 0 TGTATTGATTTGTTG CCCFHBBCA8@3((( RG:Z:1 QT:Z:@C@FFFFF BC:Z:TATG-TANNN +HS19_6383:8:1101:1534:2160 69 * 0 0 * * 0 0 TGTATTGATTTGTTG CCCFHBBCA8@3((( RG:Z:1 QT:Z:@C@FFFFF BC:Z:GCGT-TGCAT +HS19_6383:8:1101:1534:2162 69 * 0 0 * * 0 0 TGTATTGATTTGTTG CCCFHBBCA8@3((( RG:Z:1 QT:Z:@C@FFFFF BC:Z:CATG-TGCAT +HS19_6383:8:1101:1534:2164 69 * 0 0 * * 0 0 TGTATTGATTTGTTG CCCFHBBCA8@3((( RG:Z:1 QT:Z:@C@FFFFF BC:Z:ACGT-AAAAA +HS19_6383:8:1101:1245:2165 133 * 0 0 * * 0 0 NACTGTATGTNNNNN !!!4!!!!!!!!!!! RG:Z:1 QT:Z:@@@DFDFF BC:Z:TATGAA-TATGTAA +HS19_6383:8:1101:1245:2166 133 * 0 0 * * 0 0 NACTGTATGTNNNNN !!!4!!!!!!!!!!! RG:Z:1 QT:Z:@@@DFDFF BC:Z:TATGAA-TCACT +HS19_6383:8:1101:1245:2167 133 * 0 0 * * 0 0 NACTGTATGTNNNNN !!!4!!!!!!!!!!! RG:Z:1 QT:Z:@@@DFDFF BC:Z:TATGAT-TCACT diff --git a/test/data/decode_6.tag b/test/data/decode_6.tag new file mode 100644 index 00000000..4312e3a4 --- /dev/null +++ b/test/data/decode_6.tag @@ -0,0 +1,4 @@ +barcode_sequence barcode_name +ACGT- 1 +TATG- 2 +CATG- 3 diff --git a/test/data/out/decode_5.metrics b/test/data/out/decode_5.metrics new file mode 100644 index 00000000..668d8001 --- /dev/null +++ b/test/data/out/decode_5.metrics @@ -0,0 +1,12 @@ +## +# BARCODE_TAG_NAME=BC MAX_MISMATCHES=1 MIN_MISMATCH_DELTA=1 MAX_NO_CALLS=2 +## +# ID:bambi VN:12.34 (htslib 1.11-94-g7152cb4) CL:bambi decode -i ./test/data/decode_5.sam -o /tmp/bambi.fMV6yI/decode_5.sam --output-fmt sam --input-fmt sam --barcode-file ./test/data/decode_5.tag --metrics-file /tmp/bambi.fMV6yI/decode_5.metrics --ignore-pf + +## +BARCODE BARCODE_NAME LIBRARY_NAME SAMPLE_NAME DESCRIPTION READS PERFECT_MATCHES ONE_MISMATCH_MATCHES PCT_MATCHES RATIO_THIS_BARCODE_TO_BEST_BARCODE_PCT +-TGCAT 1 2 2 0 0.182 0.500 +-TATGT 2 4 4 0 0.364 1.000 +-ACACT 3 0 0 0 0.000 0.000 +-TCACT 4 2 2 0 0.182 0.500 +-NNNNN 3 0 0 0.273 0.750 diff --git a/test/data/out/decode_5.sam b/test/data/out/decode_5.sam new file mode 100644 index 00000000..27a3f0ed --- /dev/null +++ b/test/data/out/decode_5.sam @@ -0,0 +1,25 @@ +@HD VN:1.5 SO:unsorted +@PG ID:SCS PN:RTA DS:Controlling software on instrument VN:1.12.4.0 +@PG ID:basecalling PN:RTA PP:SCS DS:Basecalling Package VN:1.12.4.0 +@PG ID:illumina2bam PN:illumina2bam PP:basecalling DS:Convert Illumina BCL to BAM or SAM file VN:0.03 CL:illumina.Illumina2bam INTENSITY_DIR=/nfs/sf36/ILorHSany_sf36/analysis/110608_HS19_06383_B_C024LABXX/Data/Intensities LANE=8 OUTPUT=/nfs/sf36/ILorHSany_sf36/analysis/110608_HS19_06383_B_C024LABXX/Data/Intensities/PB_basecalls_20110614-084055/6383_8.bam SAMPLE_ALIAS=MRSOL5096964,MRSOL5096965 LIBRARY_NAME=2_184535_653_010611 STUDY_NAME=ZF_MrSol_Exome CREATE_MD5_FILE=true GENERATE_SECONDARY_BASE_CALLS=false PF_FILTER=true READ_GROUP_ID=1 SEQUENCING_CENTER=SC PLATFORM=ILLUMINA TMP_DIR=/tmp/srpipe VERBOSITY=INFO QUIET=false VALIDATION_STRINGENCY=STRICT COMPRESSION_LEVEL=5 MAX_RECORDS_IN_RAM=500000 CREATE_INDEX=false +@PG ID:bambi PN:bambi PP:illumina2bam VN:12.34 CL:bambi decode -i ./test/data/decode_5.sam -o /tmp/bambi.fMV6yI/decode_5.sam --output-fmt sam --input-fmt sam --barcode-file ./test/data/decode_5.tag --metrics-file /tmp/bambi.fMV6yI/decode_5.metrics --ignore-pf +@RG ID:1#0 PL:ILLUMINA PU:110608_HS19_06383_B_C024LABXX_8#0 LB:2_184535_653_010611 DS:Study ZF_MrSol_Exome DT:2011-06-08T00:00:00+0100 SM:MRSOL5096964,MRSOL5096965 CN:SC +@RG ID:1#1 PL:ILLUMINA PU:110608_HS19_06383_B_C024LABXX_8#1 LB: DS: DT:2011-06-08T00:00:00+0100 SM: CN:SC +@RG ID:1#2 PL:ILLUMINA PU:110608_HS19_06383_B_C024LABXX_8#2 LB: DS: DT:2011-06-08T00:00:00+0100 SM: CN:SC +@RG ID:1#3 PL:ILLUMINA PU:110608_HS19_06383_B_C024LABXX_8#3 LB: DS: DT:2011-06-08T00:00:00+0100 SM: CN:SC +@RG ID:1#4 PL:ILLUMINA PU:110608_HS19_06383_B_C024LABXX_8#4 LB: DS: DT:2011-06-08T00:00:00+0100 SM: CN:SC +HS19_6383:8:1101:1128:2136 133 * 0 0 * * 0 0 NTGCGNATCANNNNN !!!!!!!!!!!!!!! RG:Z:1 +HS19_6383:8:1101:1085:2136 69 * 0 0 * * 0 0 ACATTCACAANNNNN @BCD!!!!!!!!!!! RG:Z:1#0 QT:Z:!!!!!!!! BC:Z:NNNNNNNN +HS19_6383:8:1101:1085:2136 133 * 0 0 * * 0 0 NCATGNAGNNNNNNN !!!!!!!!!!!!!!! RG:Z:1#0 +HS19_6383:8:1101:1245:2140 69 * 0 0 * * 0 0 TTCTGAAAGCTGTGT @C@FCCHHEAHHAEA RG:Z:1#2 +HS19_6383:8:1101:1245:2140 133 * 0 0 * * 0 0 NACTGTATGTNNNNN !!!4!!!!!!!!!!! RG:Z:1#2 QT:Z:@@@DFDFF BC:Z:TATG-TATGT +HS19_6383:8:1101:1216:2154 69 * 0 0 * * 0 0 TTTTGACCCTTGTTT @@@AH?>EEECFFCC RG:Z:1#2 QT:Z:B@CFF?DF BC:Z:NATG-TATNT +HS19_6383:8:1101:1216:2154 133 * 0 0 * * 0 0 CGTATTCGGACNNNG @@CF++(!(!(!!!( RG:Z:1#2 +HS19_6383:8:1101:1534:2155 69 * 0 0 * * 0 0 TGTATTGATTTGTTG CCCFHBBCA8@3((( RG:Z:1#2 QT:Z:@C@FFFFF BC:Z:NNNT-TATNT +HS19_6383:8:1101:1534:2156 69 * 0 0 * * 0 0 TGTATTGATTTGTTG CCCFHBBCA8@3((( RG:Z:1#0 QT:Z:@C@FFFFF BC:Z:TATG-TANNN +HS19_6383:8:1101:1534:2160 69 * 0 0 * * 0 0 TGTATTGATTTGTTG CCCFHBBCA8@3((( RG:Z:1#1 QT:Z:@C@FFFFF BC:Z:GCGT-TGCAT +HS19_6383:8:1101:1534:2162 69 * 0 0 * * 0 0 TGTATTGATTTGTTG CCCFHBBCA8@3((( RG:Z:1#1 QT:Z:@C@FFFFF BC:Z:CATG-TGCAT +HS19_6383:8:1101:1534:2164 69 * 0 0 * * 0 0 TGTATTGATTTGTTG CCCFHBBCA8@3((( RG:Z:1#0 QT:Z:@C@FFFFF BC:Z:ACGT-AAAAA +HS19_6383:8:1101:1245:2165 133 * 0 0 * * 0 0 NACTGTATGTNNNNN !!!4!!!!!!!!!!! RG:Z:1#2 QT:Z:@@@DFDFF BC:Z:TATGAA-TATGTAA +HS19_6383:8:1101:1245:2166 133 * 0 0 * * 0 0 NACTGTATGTNNNNN !!!4!!!!!!!!!!! RG:Z:1#4 QT:Z:@@@DFDFF BC:Z:TATGAA-TCACT +HS19_6383:8:1101:1245:2167 133 * 0 0 * * 0 0 NACTGTATGTNNNNN !!!4!!!!!!!!!!! RG:Z:1#4 QT:Z:@@@DFDFF BC:Z:TATGAT-TCACT diff --git a/test/data/out/decode_6.metrics b/test/data/out/decode_6.metrics new file mode 100644 index 00000000..207d0953 --- /dev/null +++ b/test/data/out/decode_6.metrics @@ -0,0 +1,11 @@ +## +# BARCODE_TAG_NAME=BC MAX_MISMATCHES=1 MIN_MISMATCH_DELTA=1 MAX_NO_CALLS=2 +## +# ID:bambi VN:12.34 (htslib 1.11-94-g7152cb4) CL:bambi decode -i ./test/data/decode_6.sam -o /tmp/bambi.fMV6yI/decode_6.sam --output-fmt sam --input-fmt sam --barcode-file ./test/data/decode_6.tag --metrics-file /tmp/bambi.fMV6yI/decode_6.metrics --ignore-pf + +## +BARCODE BARCODE_NAME LIBRARY_NAME SAMPLE_NAME DESCRIPTION READS PERFECT_MATCHES ONE_MISMATCH_MATCHES PCT_MATCHES RATIO_THIS_BARCODE_TO_BEST_BARCODE_PCT +ACGT 1 2 1 1 0.182 0.400 +TATG 2 5 5 0 0.455 1.000 +CATG 3 1 1 0 0.091 0.200 +NNNN 3 0 1 0.273 0.600 diff --git a/test/data/out/decode_6.sam b/test/data/out/decode_6.sam new file mode 100644 index 00000000..573870f9 --- /dev/null +++ b/test/data/out/decode_6.sam @@ -0,0 +1,24 @@ +@HD VN:1.5 SO:unsorted +@PG ID:SCS PN:RTA DS:Controlling software on instrument VN:1.12.4.0 +@PG ID:basecalling PN:RTA PP:SCS DS:Basecalling Package VN:1.12.4.0 +@PG ID:illumina2bam PN:illumina2bam PP:basecalling DS:Convert Illumina BCL to BAM or SAM file VN:0.03 CL:illumina.Illumina2bam INTENSITY_DIR=/nfs/sf36/ILorHSany_sf36/analysis/110608_HS19_06383_B_C024LABXX/Data/Intensities LANE=8 OUTPUT=/nfs/sf36/ILorHSany_sf36/analysis/110608_HS19_06383_B_C024LABXX/Data/Intensities/PB_basecalls_20110614-084055/6383_8.bam SAMPLE_ALIAS=MRSOL5096964,MRSOL5096965 LIBRARY_NAME=2_184535_653_010611 STUDY_NAME=ZF_MrSol_Exome CREATE_MD5_FILE=true GENERATE_SECONDARY_BASE_CALLS=false PF_FILTER=true READ_GROUP_ID=1 SEQUENCING_CENTER=SC PLATFORM=ILLUMINA TMP_DIR=/tmp/srpipe VERBOSITY=INFO QUIET=false VALIDATION_STRINGENCY=STRICT COMPRESSION_LEVEL=5 MAX_RECORDS_IN_RAM=500000 CREATE_INDEX=false +@PG ID:bambi PN:bambi PP:illumina2bam VN:12.34 CL:bambi decode -i ./test/data/decode_6.sam -o /tmp/bambi.fMV6yI/decode_6.sam --output-fmt sam --input-fmt sam --barcode-file ./test/data/decode_6.tag --metrics-file /tmp/bambi.fMV6yI/decode_6.metrics --ignore-pf +@RG ID:1#0 PL:ILLUMINA PU:110608_HS19_06383_B_C024LABXX_8#0 LB:2_184535_653_010611 DS:Study ZF_MrSol_Exome DT:2011-06-08T00:00:00+0100 SM:MRSOL5096964,MRSOL5096965 CN:SC +@RG ID:1#1 PL:ILLUMINA PU:110608_HS19_06383_B_C024LABXX_8#1 LB: DS: DT:2011-06-08T00:00:00+0100 SM: CN:SC +@RG ID:1#2 PL:ILLUMINA PU:110608_HS19_06383_B_C024LABXX_8#2 LB: DS: DT:2011-06-08T00:00:00+0100 SM: CN:SC +@RG ID:1#3 PL:ILLUMINA PU:110608_HS19_06383_B_C024LABXX_8#3 LB: DS: DT:2011-06-08T00:00:00+0100 SM: CN:SC +HS19_6383:8:1101:1128:2136 133 * 0 0 * * 0 0 NTGCGNATCANNNNN !!!!!!!!!!!!!!! RG:Z:1 +HS19_6383:8:1101:1085:2136 69 * 0 0 * * 0 0 ACATTCACAANNNNN @BCD!!!!!!!!!!! RG:Z:1#0 QT:Z:!!!!!!!! BC:Z:NNNNNNNN +HS19_6383:8:1101:1085:2136 133 * 0 0 * * 0 0 NCATGNAGNNNNNNN !!!!!!!!!!!!!!! RG:Z:1#0 +HS19_6383:8:1101:1245:2140 69 * 0 0 * * 0 0 TTCTGAAAGCTGTGT @C@FCCHHEAHHAEA RG:Z:1#2 +HS19_6383:8:1101:1245:2140 133 * 0 0 * * 0 0 NACTGTATGTNNNNN !!!4!!!!!!!!!!! RG:Z:1#2 QT:Z:@@@DFDFF BC:Z:TATG-TATGT +HS19_6383:8:1101:1216:2154 69 * 0 0 * * 0 0 TTTTGACCCTTGTTT @@@AH?>EEECFFCC RG:Z:1#0 QT:Z:B@CFF?DF BC:Z:NATG-TATNT +HS19_6383:8:1101:1216:2154 133 * 0 0 * * 0 0 CGTATTCGGACNNNG @@CF++(!(!(!!!( RG:Z:1#0 +HS19_6383:8:1101:1534:2155 69 * 0 0 * * 0 0 TGTATTGATTTGTTG CCCFHBBCA8@3((( RG:Z:1#0 QT:Z:@C@FFFFF BC:Z:NNNT-TATNT +HS19_6383:8:1101:1534:2156 69 * 0 0 * * 0 0 TGTATTGATTTGTTG CCCFHBBCA8@3((( RG:Z:1#2 QT:Z:@C@FFFFF BC:Z:TATG-TANNN +HS19_6383:8:1101:1534:2160 69 * 0 0 * * 0 0 TGTATTGATTTGTTG CCCFHBBCA8@3((( RG:Z:1#1 QT:Z:@C@FFFFF BC:Z:GCGT-TGCAT +HS19_6383:8:1101:1534:2162 69 * 0 0 * * 0 0 TGTATTGATTTGTTG CCCFHBBCA8@3((( RG:Z:1#3 QT:Z:@C@FFFFF BC:Z:CATG-TGCAT +HS19_6383:8:1101:1534:2164 69 * 0 0 * * 0 0 TGTATTGATTTGTTG CCCFHBBCA8@3((( RG:Z:1#1 QT:Z:@C@FFFFF BC:Z:ACGT-AAAAA +HS19_6383:8:1101:1245:2165 133 * 0 0 * * 0 0 NACTGTATGTNNNNN !!!4!!!!!!!!!!! RG:Z:1#2 QT:Z:@@@DFDFF BC:Z:TATGAA-TATGTAA +HS19_6383:8:1101:1245:2166 133 * 0 0 * * 0 0 NACTGTATGTNNNNN !!!4!!!!!!!!!!! RG:Z:1#2 QT:Z:@@@DFDFF BC:Z:TATGAA-TCACT +HS19_6383:8:1101:1245:2167 133 * 0 0 * * 0 0 NACTGTATGTNNNNN !!!4!!!!!!!!!!! RG:Z:1#2 QT:Z:@@@DFDFF BC:Z:TATGAT-TCACT diff --git a/test/t_decode.c b/test/t_decode.c index 3450ae54..9b96ab14 100644 --- a/test/t_decode.c +++ b/test/t_decode.c @@ -160,6 +160,58 @@ void setup_test_4(int* argc, char*** argv, char *outputfile, char* metricsfile, } } +void setup_test_5(int* argc, char*** argv, char *outputfile, char* metricsfile, + int threads) +{ + *argc = 15 + (threads ? 2 : 0); + *argv = (char**)calloc(sizeof(char*), *argc); + (*argv)[0] = strdup("bambi"); + (*argv)[1] = strdup("decode"); + (*argv)[2] = strdup("-i"); + (*argv)[3] = strdup(MKNAME(DATA_DIR,"/decode_5.sam")); + (*argv)[4] = strdup("-o"); + (*argv)[5] = strdup(outputfile); + (*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(MKNAME(DATA_DIR,"/decode_5.tag")); + (*argv)[12] = strdup("--metrics-file"); + (*argv)[13] = strdup(metricsfile); + (*argv)[14] = strdup("--ignore-pf"); + if (threads) { + (*argv)[15] = strdup("--threads"); + (*argv)[16] = itoa(threads); + } +} + +void setup_test_6(int* argc, char*** argv, char *outputfile, char* metricsfile, + int threads) +{ + *argc = 15 + (threads ? 2 : 0); + *argv = (char**)calloc(sizeof(char*), *argc); + (*argv)[0] = strdup("bambi"); + (*argv)[1] = strdup("decode"); + (*argv)[2] = strdup("-i"); + (*argv)[3] = strdup(MKNAME(DATA_DIR,"/decode_6.sam")); + (*argv)[4] = strdup("-o"); + (*argv)[5] = strdup(outputfile); + (*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(MKNAME(DATA_DIR,"/decode_6.tag")); + (*argv)[12] = strdup("--metrics-file"); + (*argv)[13] = strdup(metricsfile); + (*argv)[14] = strdup("--ignore-pf"); + if (threads) { + (*argv)[15] = strdup("--threads"); + (*argv)[16] = itoa(threads); + } +} + void free_argv(int argc, char *argv[]) { for (int n=0; n < argc; free(argv[n++])); @@ -378,6 +430,67 @@ int main(int argc, char**argv) } } + // --dual-tag option with missing first tag + for (int threads = 0; threads <= NTHREADS; threads += NTHREADS) { + int argc_5; + char** argv_5; + int result; + snprintf(outputfile, max_path_length,"%s/decode_5%s.sam",TMPDIR, threads ? "threads" : ""); + snprintf(metricsfile, max_path_length, "%s/decode_5%s.metrics", TMPDIR, threads ? "threads" : ""); + setup_test_5(&argc_5, &argv_5, outputfile, metricsfile, threads); + main_decode(argc_5-1, argv_5+1); + free_argv(argc_5,argv_5); + + snprintf(cmd, sizeof(cmd), "diff -I ID:bambi %s %s", outputfile, MKNAME(DATA_DIR,"/out/decode_5.sam")); + result = system(cmd); + if (result) { + fprintf(stderr, "test 5 failed at SAM file diff\n"); + failure++; + } else { + success++; + } + + snprintf(cmd, sizeof(cmd), "diff -I ID:bambi %s %s", metricsfile, MKNAME(DATA_DIR,"/out/decode_5.metrics")); + result = system(cmd); + if (result) { + fprintf(stderr, "test 5 failed at metrics file diff\n"); + failure++; + } else { + success++; + } + } + + // --dual-tag option with missing second tag + for (int threads = 0; threads <= NTHREADS; threads += NTHREADS) { + int argc_6; + char** argv_6; + int result; + snprintf(outputfile, max_path_length,"%s/decode_6%s.sam",TMPDIR, threads ? "threads" : ""); + snprintf(metricsfile, max_path_length, "%s/decode_6%s.metrics", TMPDIR, threads ? "threads" : ""); + setup_test_6(&argc_6, &argv_6, outputfile, metricsfile, threads); + main_decode(argc_6-1, argv_6+1); + free_argv(argc_6,argv_6); + + snprintf(cmd, sizeof(cmd), "diff -I ID:bambi %s %s", outputfile, MKNAME(DATA_DIR,"/out/decode_6.sam")); + result = system(cmd); + if (result) { + fprintf(stderr, "test 5 failed at SAM file diff\n"); + failure++; + } else { + success++; + } + + snprintf(cmd, sizeof(cmd), "diff -I ID:bambi %s %s", metricsfile, MKNAME(DATA_DIR,"/out/decode_6.metrics")); + result = system(cmd); + if (result) { + fprintf(stderr, "test 5 failed at metrics file diff\n"); + failure++; + } else { + success++; + } + + } + free(metricsfile); free(outputfile); free(chksumfile); From 8843a14669f40f9324137749d3de67d3b0e48fd2 Mon Sep 17 00:00:00 2001 From: Frederick Dodd Date: Thu, 6 May 2021 16:03:07 +0100 Subject: [PATCH 3/5] Change to Github Actions from Travis CI --- .../workflows/testing_and_building_repo.yml | 50 +++++++++++++++++ .travis.yml | 56 ------------------- {.travis => scripts}/clone | 0 3 files changed, 50 insertions(+), 56 deletions(-) create mode 100644 .github/workflows/testing_and_building_repo.yml delete mode 100644 .travis.yml rename {.travis => scripts}/clone (100%) diff --git a/.github/workflows/testing_and_building_repo.yml b/.github/workflows/testing_and_building_repo.yml new file mode 100644 index 00000000..9eb037e0 --- /dev/null +++ b/.github/workflows/testing_and_building_repo.yml @@ -0,0 +1,50 @@ +name: testing_and_building_repo +on: [push, pull_request] +jobs: + build: + strategy: + matrix: + os: ['ubuntu-18.04'] + + runs-on: ${{matrix.os}} + name: Workflow on ${{ matrix.os }} + steps: + - uses: actions/checkout@v2 + with: + fetch-depth: '0' + + - name: install libgd-dev and liblzma-dev + run: + sudo apt-get install -y libgd-dev liblzma-dev libcurl4-openssl-dev + + - name: clone samtools branch + run: | + export HTSLIB=${{ github.workspace }}/htslib + git clone --branch $HTSLIB_BRANCH git://github.com/samtools/htslib.git $HTSLIB + env: + HTSLIB_BRANCH: develop + + - name: make HTSLIB + run: | + export HTSLIB=${{ github.workspace }}/htslib + export HTSDIR=${{ github.workspace }}/htslib/b + cd $HTSLIB + git submodule update --init --recursive + (autoreconf && mkdir b && ./configure --prefix=$HTSDIR && make && make install) + + - name: make and configure + run: | + export HTSDIR=${{ github.workspace }}/htslib/b + autoreconf -i + ./configure --with-htslib=$HTSDIR + make + make check + #make distcheck #TODO + + # running ./Build dist and exporting files + - name: run ./Build dist + run: | + make dist + export DIST_FILE=$(ls bambi-*.tar.gz) + export SHA256_FILE=$DIST_FILE.sha256 + shasum -a 256 $DIST_FILE > $SHA256_FILE diff --git a/.travis.yml b/.travis.yml deleted file mode 100644 index 539bba95..00000000 --- a/.travis.yml +++ /dev/null @@ -1,56 +0,0 @@ -language: c - -addons: - apt: - packages: - - liblzma-dev - - libgd-dev - -matrix: - include: - - os: linux - compiler: clang - env: CFLAGS="-Wno-pointer-sign"" - - os: linux - compiler: gcc - - os: linux - compiler: gcc - -env: - global: - - P=`pwd` - - HTSLIB=$P/htslib - - HTSDIR=$HTSLIB/b - - HTSLIB_BRANCH=develop - - DISTCHECK_CONFIGURE_FLAGS=--with-htslib=$HTSDIR - -install: -- git clone --branch $HTSLIB_BRANCH git://github.com/samtools/htslib.git $HTSLIB - -before_script: -- (cd $HTSLIB && autoreconf && mkdir b && ./configure --prefix=$HTSDIR && make && make install) - -script: - - autoreconf -i && ./configure -V && ./configure --with-htslib=$HTSDIR - - make && make check && make distcheck - -after_success: - - make dist - - export DIST_FILE=$(ls bambi-*.tar.gz) - - export SHA256_FILE=$DIST_FILE.sha256 - - shasum -a 256 $DIST_FILE > $SHA256_FILE - -after_failure: - -deploy: - provider: releases - api_key: - secure: ThARbt8qf7uZsgT/2Di49LOeeUI5NKUP7OKm8WIG2POrjHoxMBFn6xwirRfDLdIGWc93WUjK99y5o0PcHzkvgsqBKMsmBdb3Gar34Wn35Xc7rW/kChv95cXKWAVT12I212Qltiq0M8Ge8tLTou3P5IF/gKZD/aCvTCR+HkZP6WNS63zM+0RxFptw9BUqlPSfBHRJmk6zPLBkxSrq126Um3FEDEr33lU7uOvEiY69gnpQBVNBNS+g4fD/6Trvdj8x3s/IqnnGp4b4Vmz11nK9bkKOavVzFYplq0z//7fpOhhsCppD1pNhyUX9JHZ+/hEkZ1pGzx2QHIHrp23e54CRiWKEFBZ88LJOH7Hjiht7HfdaMUVwF+j8yWD3+3VIhspCk04un9uIFoG0x6IJ1kfzLpvpYuxhdnvCZymfMbsRkvx9vOyeLARZXiw8+UEYDJNxPqho1tJoQtrW5f0CkpQFkSw5qn/VYdotyuVw8fkpK1g/zjzWKS+2Av2XLTFf67ULZeArdaAZqxXI5vnKg3YkJDdkQ8/eiXTYhKkjTP8bx4RXbcdXDTGUPXJBNd6wm4h+KMsa9+Yht1iU3xuALCV3wi8KdNRPA3IDrCH0aXxI5hulqR+iPkMPXsbyhh/TyENkNuB6TgSSNpkeH9Y6kCuODEywT2D5CEEaZMADt+jEINs= - file: - - $DIST_FILE - - $SHA256_FILE - skip_cleanup: true - on: - tags: true - repo: jenniferliddle/bambi - branch: master diff --git a/.travis/clone b/scripts/clone similarity index 100% rename from .travis/clone rename to scripts/clone From 6f471ba073cb93e3cff52ee9b460253a8b148d3a Mon Sep 17 00:00:00 2001 From: jenniferliddle Date: Thu, 13 May 2021 15:55:23 +0100 Subject: [PATCH 4/5] Add substitution_analysis command --- Makefile.am | 13 +- src/bambi.c | 3 + src/parse_bam.c | 10 +- src/spatial_filter.c | 2 +- src/substitution_analysis.c | 794 ++++++++++++++++++++++++++++++++++++ test/data/out/sa.txt | 606 +++++++++++++++++++++++++++ test/data/sa.bam | Bin 0 -> 126978 bytes test/t_sa.c | 91 +++++ 8 files changed, 1510 insertions(+), 9 deletions(-) create mode 100644 src/substitution_analysis.c create mode 100644 test/data/out/sa.txt create mode 100644 test/data/sa.bam create mode 100644 test/t_sa.c diff --git a/Makefile.am b/Makefile.am index 8fc393fa..1b8e72af 100644 --- a/Makefile.am +++ b/Makefile.am @@ -38,7 +38,8 @@ src_bambi_SOURCES = src/bambi.c \ src/parse_bam.c \ src/parse_bam.h \ src/crc.c \ - src/crc.h + src/crc.h \ + src/substitution_analysis.c src_check_bcl_SOURCES = src/check_bcl.c src/bclfile.c src/bambi_utils.c src/array.c @@ -60,7 +61,8 @@ TESTS = test/t_array \ test/t_sf \ test/t_seqchksum \ test/t_adapters \ - test/t_update + test/t_update \ + test/t_sa dist_doc_DATA = README.md LICENSE @@ -77,7 +79,8 @@ check_PROGRAMS = test/t_read2tags \ test/t_sf \ test/t_seqchksum \ test/t_adapters \ - test/t_update + test/t_update \ + test/t_sa TEST_CFLAGS = -I$(top_srcdir)/src $(XML_CFLAGS) -DDATA_DIR=$(top_srcdir)/test/data TEST_LDADD = $(HTSLIB_LIBS) -lm @@ -128,6 +131,10 @@ test_t_sf_SOURCES = test/t_sf.c src/bamit.c src/array.c src/bambi_utils.c test_t_sf_CFLAGS = $(TEST_CFLAGS) test_t_sf_LDADD = $(TEST_LDADD) +test_t_sa_SOURCES = test/t_sa.c src/bamit.c src/bambi_utils.c +test_t_sa_CFLAGS = $(TEST_CFLAGS) +test_t_sa_LDADD = $(TEST_LDADD) + test_t_seqchksum_SOURCES = test/t_seqchksum.c test_t_seqchksum_CFLAGS = $(TEST_CFLAGS) #test_t_seqchksum_LDADD = $(TEST_LDADD) diff --git a/src/bambi.c b/src/bambi.c index 388d9edd..0622603f 100644 --- a/src/bambi.c +++ b/src/bambi.c @@ -39,6 +39,7 @@ int main_spatial_filter(int argc, char *argv[]); int main_seqchksum(int argc, char *argv[]); int main_adapters(int argc, char *argv[]); int main_update(int argc, char *argv[]); +int main_substitution_analysis(int argc, char *argv[]); const char *bambi_version() { @@ -64,6 +65,7 @@ static void usage(FILE *fp) " seqchksum calculate checksums for a bam file\n" " adapters find and remove adapters\n" " update update an existing BAM/SAM/CRAM file\n" +" substitution_analysis produce a substitution analysis table\n" "\n" "bambi for help on a particular command\n" "\n"); @@ -93,6 +95,7 @@ int main(int argc, char *argv[]) else if (strcmp(argv[1], "seqchksum") == 0) ret = main_seqchksum(argc-1, argv+1); else if (strcmp(argv[1], "adapters") == 0) ret = main_adapters(argc-1, argv+1); else if (strcmp(argv[1], "update") == 0) ret = main_update(argc-1, argv+1); + else if (strcmp(argv[1], "substitution_analysis") == 0) ret = main_substitution_analysis(argc-1, argv+1); else if (strcmp(argv[1], "--version") == 0) { printf( "bambi %s\n" "Using htslib %s\n" diff --git a/src/parse_bam.c b/src/parse_bam.c index c33c6031..ee057021 100644 --- a/src/parse_bam.c +++ b/src/parse_bam.c @@ -327,11 +327,11 @@ bam1_t *parse_bam_readinfo( BAMit_t *fp, } } - *bam_lane = lane; - *bam_tile = tile; - *bam_x = x; - *bam_y = y; - *bam_read = read; + if (bam_lane) *bam_lane = lane; + if (bam_tile) *bam_tile = tile; + if (bam_x) *bam_x = x; + if (bam_y) *bam_y = y; + if (bam_read) *bam_read = read; if (bam_offset) *bam_offset = offset; return bam; } diff --git a/src/spatial_filter.c b/src/spatial_filter.c index a8245214..bb7f0493 100644 --- a/src/spatial_filter.c +++ b/src/spatial_filter.c @@ -1146,7 +1146,7 @@ static void writeFilter(opts_t *s, RegionTable_t *rtsArray) if (!fp) die("Can't open filter file %s: %s\n", s->filters->entries[0], strerror(errno)); strncpy(Fheader.region_magic, REGION_MAGIC, sizeof(Fheader.region_magic)); - strncpy(Fheader.cmdLine, s->argv_list, sizeof(Fheader.cmdLine)); + strncpy(Fheader.cmdLine, s->argv_list, sizeof(Fheader.cmdLine)-1); if (hwrite(fp, &Fheader, sizeof(Fheader)) < 0) die("writeFheader() failed\n");; for (int lane=1; lane < SF_MAX_LANES; lane++) { diff --git a/src/substitution_analysis.c b/src/substitution_analysis.c new file mode 100644 index 00000000..3ff1bca4 --- /dev/null +++ b/src/substitution_analysis.c @@ -0,0 +1,794 @@ +/* -*- mode: c; indent-tabs-mode: nil; c-basic-offset: 4; tab-width: 8; -*- */ + +/* + * Copyright (c) 2021, Genome Research Ltd (GRL). + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * * 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. + * + * * Neither the name of the Genome Research Limited 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 GRL ``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 GRL 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. + */ + +/* + * Author: Steven Leonard, Jan 2009 + * + * This code generates a substitution analysis table + * + * Incorporated into Bambi: Jennifer Liddle May 2021 + * + */ + +#include +#include +#include +#include +#include +#include +#include + +#include "parse_bam.h" +#include "bambi_utils.h" +#include "bamit.h" + +#define N_READS 3 + +#define LEN_SUBST 2 +#define NUM_SUBST 16 // 4 ^ LEN_SUBST +#define LEN_CNTXT 4 +#define NUM_CNTXT 256 // 4 ^ LEN_CNTXT + +#define NBINS 51 +#define ST_HILO_QUALITY 29.5 + +typedef struct { + int read; + int cycle; + int nbins; + float predictor_hilo; + float *predictor; + long *num_bases; + long *num_errors; + long *subst[NUM_SUBST]; + long substH[NUM_SUBST]; + long substL[NUM_SUBST]; + long cntxtH[NUM_CNTXT]; + long cntxtL[NUM_CNTXT]; + long total_bases; + long total_errors; + float quality; +} SurvTable; + +typedef struct { + char *reportName; + char *in_bam_file; + int read_length[N_READS]; + int quiet; + int verbose; + char compression_level; + char *input_fmt; + char *output_fmt; + +} opts_t; + +static void free_opts(opts_t *opts) +{ + free(opts->reportName); + free(opts->in_bam_file); + free(opts->input_fmt); + free(opts); +} + + +#define MAXNH 7 +static int* lookup = NULL; + +static void init_lookup(void) { + int i; + + lookup = (int *) calloc(256, sizeof(int)); + for (i = 0; i < 256; i++) + lookup[i] = -1; + lookup['A'] = 0; + lookup['a'] = 0; + lookup['C'] = 1; + lookup['c'] = 1; + lookup['G'] = 2; + lookup['g'] = 2; + lookup['T'] = 3; + lookup['t'] = 3; +} + +int str2word(char *seq, int NH) { + int i, word = -1; + + if (!lookup) { + init_lookup(); + } + + if (NH > MAXNH) + return word; + + word = 0; + for (i = 0; i < NH; i++) { + word <<= 2; + word |= lookup[(int)seq[i]]; + } + + return word; +} + +char *word2str(int word, int NH) { + static char str[MAXNH+1]; + int i; + + if (!lookup) { + init_lookup(); + } + + for (i = 0; i < NH; i++) + str[i] = "ACGT"[(word >> (2*(NH-1)-2*i)) & 3]; + str[NH] = 0; + + return str; +} + +static void initialiseSurvTable(SurvTable *st, int read, int cycle) +{ + int i, j; + + st->read = read; + st->cycle = cycle; + + st->nbins = NBINS; + + st->predictor_hilo = ST_HILO_QUALITY; + + st->predictor = (float *)smalloc(st->nbins * sizeof(float)); + for (i=0;inbins;i++) + st->predictor[i] = i; + + st->num_bases = (long *)smalloc(st->nbins * sizeof(long)); + st->num_errors = (long *)smalloc(st->nbins * sizeof(long)); + for (i=0;inbins;i++) { + st->num_bases[i] = 0; + st->num_errors[i] = 0; + } + + for (j=0;jsubst[j] = (long *)smalloc(st->nbins * sizeof(long)); + for (i=0;inbins;i++) + st->subst[j][i] = 0; + st->substH[j]=0; + st->substL[j]=0; + } + for (j=0;jcntxtH[j]=0; + st->cntxtL[j]=0; + } + + st->total_bases = 0; + st->total_errors = 0; + +} + +static void freeSurvEntry(SurvTable *st) +{ + if (st && st->nbins) { + free(st->predictor); + free(st->num_bases); + free(st->num_errors); + for (int i=0;isubst[i]); + st->nbins = 0; + } +} + +static void freeSurvTable(opts_t *opts, SurvTable **sts) +{ + int read, cycle; + for(read=0;readread_length[read];cycle++) + { + SurvTable *st = sts[read] + cycle; + freeSurvEntry(st); + } + free(sts[read]); + } + free(sts); +} + +static void completeSurvTable(opts_t *opts, SurvTable **sts) +{ + float ssc = 1.0; + + for (int read=0; read < N_READS; read++) { + if (NULL == sts[read]) continue; + for (int cycle=0; cycle < opts->read_length[read]; cycle++) { + SurvTable *st = sts[read] + cycle; + long quality_bases = 0; + long quality_errors = 0; + + for (int i=0; i < st->nbins; i++) { + st->total_bases += st->num_bases[i]; + st->total_errors += st->num_errors[i]; + + // bases in the first bin are called as N and explicitly get a quality of 0 + if( i == 0 ) + continue; + + quality_bases += st->num_bases[i]; + quality_errors += st->num_errors[i]; + } + + st->quality = -10.0 * log10((quality_errors + ssc)/(quality_bases + ssc)); + } + } +} + +static void writeReport(opts_t *opts, SurvTable **sts) +{ + FILE *fp = NULL; + SurvTable **read_sts; + int read, cycle, i, j; + char p; + + // open report file + if (opts->reportName) fp = fopen(opts->reportName, "w"); + else fp = stdout; + + if (!fp) die("ERROR: can't open report file %s: %s\n", opts->reportName, strerror(errno)); + + /* generate read summary tables by summing over cycles */ + + read_sts = (SurvTable **)smalloc(N_READS * sizeof(SurvTable *)); + + for (read=0; read < N_READS; read++) { + int read_length = opts->read_length[read]; + read_sts[read] = NULL; + if (0 == read_length) continue; + + read_sts[read] = (SurvTable *)smalloc(sizeof(SurvTable)); + SurvTable *read_st = read_sts[read]; + + initialiseSurvTable(read_st, read, -1); + + for (cycle=0; cycle < read_length; cycle++) { + SurvTable *st = sts[read] + cycle; + for(j=0;jnbins;i++) + read_st->subst[j][i] += st->subst[j][i]; + for(j=0;jsubstH[j] += st->substH[j]; + for(j=0;jsubstL[j] += st->substL[j]; + for(j=0;jcntxtH[j] += st->cntxtH[j]; + for(j=0;jcntxtL[j] += st->cntxtL[j]; + } + } + + /* substitution RC */ + + fprintf(fp, "# Substitution error table. Use `grep ^SET | cut -f 2-` to extract this part\n"); + fprintf(fp, "# One row per read and quality value, columns read, quality value followed by substitution and count for 12 substitutions\n"); + for(read=0;readnbins;i++) + { + fprintf(fp, "SET\t%d\t%.2f", read, st->predictor[i]); + for (j=0;jsubst[j][i]); + } + fprintf(fp, "\n"); + } + } + + fprintf(fp, "# Mismatch substitutions high quality. Use `grep ^RCH | cut -f 2-` to extract this part\n"); + fprintf(fp, "# One row per read and cycle, columns read, cycle then substitution and count for 12 substitutions\n"); + fprintf(fp, "# Followed by a single row with a total over all cycles for each read, columns are read, -1 then substitution and count for 12 substitutions\n"); + for(read=0;readread_length[read];cycle++) + { + SurvTable *st = sts[read] + cycle; + if( 0 == st->total_bases ) continue; + fprintf(fp, "RCH\t%d\t%d", read, cycle); + for (j=0;jsubstH[j]); + } + fprintf(fp, "\n"); + } + /* and read summary (cycle = -1) */ + SurvTable *st = read_sts[read]; + fprintf(fp, "RCH\t%d\t%d", read, -1); + for (j=0;jsubstH[j]); + } + fprintf(fp, "\n"); + } + + fprintf(fp, "# Mismatch substitutions low quality. Use `grep ^RCL | cut -f 2-` to extract this part\n"); + fprintf(fp, "# One row per read and cycle, columns read, cycle then substitution and count for 12 substitutions\n"); + fprintf(fp, "# Followed by a single row with a total over all cycles for each read, columns are read, -1 then substitution and count for 12 substitutions\n"); + for(read=0;readread_length[read];cycle++) + { + SurvTable *st = sts[read] + cycle; + if( 0 == st->total_bases ) continue; + fprintf(fp, "RCL\t%d\t%d", read, cycle); + for (j=0;jsubstL[j]); + } + fprintf(fp, "\n"); + } + /* and read summary (cycle = -1) */ + SurvTable *st = read_sts[read]; + fprintf(fp, "RCL\t%d\t%d", read, -1); + for (j=0;jsubstL[j]); + } + fprintf(fp, "\n"); + } + + /* previous base PRC */ + + fprintf(fp, "# Effect of previous base high quality. Use `grep ^PRCH | cut -f 2-` to extract this part\n"); + fprintf(fp, "# One row per read and previous base, columns read then previous base+substitution and count for 12 substitutions\n"); + for(read=0;readcntxtH[j]; + } + for (j=0,p=0;jcntxtL[j]; + } + for (j=0,p=0;jcntxtH[j]; + } + for (j=0,p=0;jcntxtL[j]; + } + for (j=0,p=0;jreportName) fclose(fp); +} + +static int updateSurvTable(opts_t *opts, SurvTable **sts, + int read, int *read_mismatch, + char *read_seq, int *read_qual, char *read_ref) { + + int read_length = opts->read_length[read]; + int b; + + /* update survival table */ + for (b = 0; b < read_length; b++) { + SurvTable *st = sts[read] + b; + float predictor = -1.0; + int ibin; + + predictor = read_qual[b]; + + ibin = predictor + 0.5; + if( ibin >= st->nbins ) ibin=(st->nbins-1); + + if( read_mismatch[b] & BASE_KNOWN_SNP ) { + // don't count these + } else { + if( read_mismatch[b] & BASE_ALIGN ) + st->num_bases[ibin]++; + if( read_mismatch[b] & BASE_MISMATCH ){ + char subst[LEN_SUBST+1]; + char cntxt[LEN_CNTXT+1]; + int chr, word; + + st->num_errors[ibin]++; + + chr=0; + subst[chr++]=read_ref[b]; + subst[chr++]=read_seq[b]; + word=str2word(subst, LEN_SUBST); + if( word >= 0 ) { + st->subst[word][ibin]++; + if( predictor >= st->predictor_hilo ) + st->substH[word]++; + else + st->substL[word]++; + } + + chr=0; + cntxt[chr++]=(b > 0 ? read_ref[b-1] : 'N'); + cntxt[chr++]=read_ref[b]; + cntxt[chr++]=read_seq[b]; + cntxt[chr++]=(b < (read_length-1) ? read_ref[b+1] : 'N'); + word=str2word(cntxt, LEN_CNTXT); + if( word >= 0 ) { + if( predictor >= st->predictor_hilo ) + st->cntxtH[word]++; + else + st->cntxtL[word]++; + } + } + } + } + + return 0; +} + +/* + * Takes the bam file as input and updates the survival table + * + * Assumption: within a single input file, all reads are the same length and + * we're using unclipped data. + * + * Returns: +'ve integer for success + * 0 for failure + */ +SurvTable **LoadData(opts_t *opts) { + SurvTable **sts = NULL; + + sts = smalloc(N_READS * sizeof(SurvTable *)); + for(int read=0;readin_bam_file, 'r', opts->input_fmt, 0, NULL); + if (NULL == bam_in) { + die("ERROR: can't open bam file %s: %s\n", opts->in_bam_file, strerror(errno)); + } + + bam1_t *bam; + + /* loop over reads in the bam file */ + while (1) { + int bam_read = -1, read_length; + + bam = parse_bam_readinfo(bam_in, NULL, NULL, NULL, NULL, &bam_read, NULL); + if (!bam) break; // exit loop at end of BAM file + + if (BAM_FUNMAP & bam->core.flag) continue; + if (BAM_FQCFAIL & bam->core.flag) continue; + if (BAM_FSECONDARY & bam->core.flag) continue; + if (BAM_FSUPPLEMENTARY & bam->core.flag) continue; + if (BAM_FPAIRED & bam->core.flag) { + if (BAM_FMUNMAP & bam->core.flag) continue; + if (0 == (BAM_FPROPER_PAIR & bam->core.flag)) continue; + } + + read_length = bam->core.l_qseq; + if (0 == opts->read_length[bam_read]) { + opts->read_length[bam_read] = read_length; + } + + if (opts->read_length[bam_read] != read_length) { + fprintf(stderr, + "Error: inconsistent read lengths " + "within bam file for read %d.\n" + "have length %ld, previously it was %d.\n", + bam_read, (long) read_length, opts->read_length[bam_read]); + exit(EXIT_FAILURE); + } + + parse_bam_alignments(bam_in, bam, bam_read_seq, bam_read_qual, bam_read_ref, + bam_read_mismatch, bam_read_buff_size, NULL); + + if (NULL == sts[bam_read]) { + sts[bam_read] = (SurvTable *)smalloc(read_length * sizeof(SurvTable)); + for(int cycle=0;cycleread_length[n] = 0; + opts->in_bam_file = NULL; + opts->reportName = NULL; + opts->input_fmt = NULL; + + int opt; + int option_index = 0; + while ((opt = getopt_long(argc, argv, optstring, lopts, &option_index)) != -1) { + const char *arg; + switch (opt) { + case 'o': opts->reportName = strdup(optarg); break; + case 'v': opts->verbose = 1; break; + case 'h': usage(stdout); free_opts(opts); return NULL; + case 0: arg = lopts[option_index].name; + if (strcmp(arg, "output-fmt") == 0) opts->output_fmt = strdup(optarg); + else if (strcmp(arg, "input-fmt") == 0) opts->input_fmt = strdup(optarg); + else if (strcmp(arg, "compression-level") == 0) opts->compression_level = *optarg; + else { + fprintf(stderr,"\nUnknown option: %s\n\n", arg); + usage(stderr); free_opts(opts); + return NULL; + } + break; + default: fprintf(stderr,"Unknown option: '%c'\n", opt); + usage(stderr); free_opts(opts); + return NULL; + + } + } + + if (optind < argc) opts->in_bam_file = strdup(argv[optind]); + + return opts; +} + +static int substitution_analysis(opts_t *opts) +{ + SurvTable **sts = NULL; + + sts = LoadData(opts); + writeReport(opts, sts); + freeSurvTable(opts, sts); + + return EXIT_SUCCESS; +} + +/* + * Called from bambi to create a substitution analysis table + * + * parse the command line arguments, then call the main process + * + * returns 0 on success, 1 if there was a problem + */ +int main_substitution_analysis(int argc, char *argv[]) +{ + int ret = 1; + opts_t *opts = substitution_analysis_parse_args(argc, argv); + if (opts) ret = substitution_analysis(opts); + if (opts) free_opts(opts); + return ret; +} + diff --git a/test/data/out/sa.txt b/test/data/out/sa.txt new file mode 100644 index 00000000..c3118e3a --- /dev/null +++ b/test/data/out/sa.txt @@ -0,0 +1,606 @@ +# Substitution error table. Use `grep ^SET | cut -f 2-` to extract this part +# One row per read and quality value, columns read, quality value followed by substitution and count for 12 substitutions +SET 1 0.00 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +SET 1 1.00 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +SET 1 2.00 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +SET 1 3.00 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +SET 1 4.00 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +SET 1 5.00 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +SET 1 6.00 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +SET 1 7.00 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +SET 1 8.00 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +SET 1 9.00 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +SET 1 10.00 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +SET 1 11.00 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 1 TA 1 TC 0 TG 0 +SET 1 12.00 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +SET 1 13.00 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +SET 1 14.00 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +SET 1 15.00 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +SET 1 16.00 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +SET 1 17.00 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +SET 1 18.00 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +SET 1 19.00 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +SET 1 20.00 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +SET 1 21.00 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +SET 1 22.00 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +SET 1 23.00 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +SET 1 24.00 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +SET 1 25.00 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +SET 1 26.00 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +SET 1 27.00 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +SET 1 28.00 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +SET 1 29.00 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +SET 1 30.00 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +SET 1 31.00 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +SET 1 32.00 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +SET 1 33.00 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +SET 1 34.00 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +SET 1 35.00 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +SET 1 36.00 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +SET 1 37.00 AC 0 AG 1 AT 0 CA 0 CG 1 CT 1 GA 0 GC 1 GT 0 TA 0 TC 0 TG 0 +SET 1 38.00 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +SET 1 39.00 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +SET 1 40.00 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +SET 1 41.00 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +SET 1 42.00 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +SET 1 43.00 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +SET 1 44.00 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +SET 1 45.00 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +SET 1 46.00 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +SET 1 47.00 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +SET 1 48.00 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +SET 1 49.00 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +SET 1 50.00 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +SET 2 0.00 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +SET 2 1.00 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +SET 2 2.00 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +SET 2 3.00 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +SET 2 4.00 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +SET 2 5.00 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +SET 2 6.00 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +SET 2 7.00 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +SET 2 8.00 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +SET 2 9.00 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +SET 2 10.00 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +SET 2 11.00 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +SET 2 12.00 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +SET 2 13.00 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +SET 2 14.00 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +SET 2 15.00 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +SET 2 16.00 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +SET 2 17.00 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +SET 2 18.00 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +SET 2 19.00 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +SET 2 20.00 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +SET 2 21.00 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +SET 2 22.00 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +SET 2 23.00 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +SET 2 24.00 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +SET 2 25.00 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +SET 2 26.00 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +SET 2 27.00 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +SET 2 28.00 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +SET 2 29.00 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +SET 2 30.00 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +SET 2 31.00 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +SET 2 32.00 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +SET 2 33.00 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +SET 2 34.00 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +SET 2 35.00 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +SET 2 36.00 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +SET 2 37.00 AC 0 AG 0 AT 0 CA 1 CG 1 CT 0 GA 1 GC 1 GT 0 TA 0 TC 1 TG 0 +SET 2 38.00 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +SET 2 39.00 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +SET 2 40.00 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +SET 2 41.00 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +SET 2 42.00 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +SET 2 43.00 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +SET 2 44.00 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +SET 2 45.00 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +SET 2 46.00 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +SET 2 47.00 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +SET 2 48.00 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +SET 2 49.00 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +SET 2 50.00 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +# Mismatch substitutions high quality. Use `grep ^RCH | cut -f 2-` to extract this part +# One row per read and cycle, columns read, cycle then substitution and count for 12 substitutions +# Followed by a single row with a total over all cycles for each read, columns are read, -1 then substitution and count for 12 substitutions +RCH 1 0 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCH 1 1 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCH 1 2 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCH 1 3 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCH 1 4 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCH 1 5 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCH 1 6 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCH 1 7 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCH 1 8 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCH 1 9 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCH 1 10 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCH 1 11 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCH 1 12 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCH 1 13 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCH 1 14 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCH 1 15 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCH 1 16 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCH 1 17 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCH 1 18 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCH 1 19 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCH 1 20 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCH 1 21 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCH 1 22 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCH 1 23 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCH 1 24 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCH 1 25 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCH 1 26 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCH 1 27 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCH 1 28 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCH 1 29 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCH 1 30 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCH 1 31 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCH 1 32 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCH 1 33 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCH 1 34 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCH 1 35 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCH 1 36 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCH 1 37 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCH 1 38 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCH 1 39 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCH 1 40 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCH 1 41 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCH 1 42 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCH 1 43 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCH 1 44 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCH 1 45 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCH 1 46 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCH 1 47 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCH 1 48 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCH 1 49 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCH 1 50 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCH 1 51 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCH 1 52 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCH 1 53 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCH 1 54 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCH 1 55 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCH 1 56 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCH 1 57 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCH 1 58 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCH 1 59 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 1 GT 0 TA 0 TC 0 TG 0 +RCH 1 60 AC 0 AG 0 AT 0 CA 0 CG 0 CT 1 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCH 1 61 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCH 1 62 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCH 1 63 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCH 1 64 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCH 1 65 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCH 1 66 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCH 1 67 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCH 1 68 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCH 1 69 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCH 1 70 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCH 1 71 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCH 1 72 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCH 1 73 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCH 1 74 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCH 1 75 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCH 1 76 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCH 1 77 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCH 1 78 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCH 1 79 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCH 1 80 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCH 1 81 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCH 1 82 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCH 1 83 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCH 1 84 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCH 1 85 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCH 1 86 AC 0 AG 1 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCH 1 87 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCH 1 88 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCH 1 89 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCH 1 90 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCH 1 91 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCH 1 92 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCH 1 93 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCH 1 94 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCH 1 95 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCH 1 96 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCH 1 97 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCH 1 98 AC 0 AG 0 AT 0 CA 0 CG 1 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCH 1 99 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCH 1 100 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCH 1 -1 AC 0 AG 1 AT 0 CA 0 CG 1 CT 1 GA 0 GC 1 GT 0 TA 0 TC 0 TG 0 +RCH 2 0 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCH 2 1 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCH 2 2 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCH 2 3 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCH 2 4 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCH 2 5 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCH 2 6 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCH 2 7 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCH 2 8 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCH 2 9 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCH 2 10 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCH 2 11 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCH 2 12 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCH 2 13 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCH 2 14 AC 0 AG 0 AT 0 CA 1 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCH 2 15 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCH 2 16 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCH 2 17 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCH 2 18 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCH 2 19 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCH 2 20 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCH 2 21 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCH 2 22 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCH 2 23 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCH 2 24 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCH 2 25 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCH 2 26 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCH 2 27 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 1 GT 0 TA 0 TC 0 TG 0 +RCH 2 28 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCH 2 29 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCH 2 30 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCH 2 31 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 1 GC 0 GT 0 TA 0 TC 0 TG 0 +RCH 2 32 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCH 2 33 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCH 2 34 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCH 2 35 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCH 2 36 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCH 2 37 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCH 2 38 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCH 2 39 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 1 TG 0 +RCH 2 40 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCH 2 41 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCH 2 42 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCH 2 43 AC 0 AG 0 AT 0 CA 0 CG 1 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCH 2 44 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCH 2 45 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCH 2 46 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCH 2 47 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCH 2 48 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCH 2 49 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCH 2 50 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCH 2 51 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCH 2 52 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCH 2 53 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCH 2 54 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCH 2 55 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCH 2 56 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCH 2 57 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCH 2 58 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCH 2 59 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCH 2 60 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCH 2 61 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCH 2 62 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCH 2 63 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCH 2 64 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCH 2 65 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCH 2 66 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCH 2 67 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCH 2 68 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCH 2 69 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCH 2 70 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCH 2 71 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCH 2 72 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCH 2 73 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCH 2 74 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCH 2 75 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCH 2 76 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCH 2 77 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCH 2 78 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCH 2 79 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCH 2 80 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCH 2 81 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCH 2 82 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCH 2 83 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCH 2 84 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCH 2 85 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCH 2 86 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCH 2 87 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCH 2 88 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCH 2 89 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCH 2 90 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCH 2 91 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCH 2 92 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCH 2 93 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCH 2 94 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCH 2 95 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCH 2 96 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCH 2 97 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCH 2 98 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCH 2 99 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCH 2 100 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCH 2 -1 AC 0 AG 0 AT 0 CA 1 CG 1 CT 0 GA 1 GC 1 GT 0 TA 0 TC 1 TG 0 +# Mismatch substitutions low quality. Use `grep ^RCL | cut -f 2-` to extract this part +# One row per read and cycle, columns read, cycle then substitution and count for 12 substitutions +# Followed by a single row with a total over all cycles for each read, columns are read, -1 then substitution and count for 12 substitutions +RCL 1 0 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCL 1 1 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCL 1 2 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCL 1 3 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCL 1 4 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCL 1 5 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCL 1 6 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCL 1 7 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCL 1 8 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCL 1 9 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCL 1 10 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCL 1 11 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCL 1 12 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCL 1 13 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCL 1 14 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCL 1 15 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCL 1 16 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCL 1 17 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCL 1 18 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCL 1 19 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCL 1 20 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCL 1 21 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCL 1 22 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCL 1 23 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCL 1 24 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCL 1 25 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCL 1 26 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCL 1 27 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCL 1 28 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCL 1 29 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCL 1 30 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCL 1 31 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCL 1 32 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCL 1 33 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCL 1 34 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCL 1 35 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCL 1 36 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCL 1 37 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCL 1 38 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCL 1 39 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCL 1 40 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCL 1 41 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCL 1 42 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCL 1 43 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCL 1 44 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCL 1 45 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCL 1 46 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCL 1 47 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCL 1 48 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCL 1 49 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCL 1 50 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCL 1 51 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCL 1 52 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCL 1 53 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCL 1 54 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCL 1 55 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCL 1 56 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCL 1 57 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCL 1 58 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCL 1 59 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCL 1 60 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCL 1 61 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCL 1 62 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCL 1 63 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCL 1 64 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 1 TC 0 TG 0 +RCL 1 65 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCL 1 66 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCL 1 67 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCL 1 68 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCL 1 69 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCL 1 70 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCL 1 71 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCL 1 72 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCL 1 73 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCL 1 74 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCL 1 75 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 1 TA 0 TC 0 TG 0 +RCL 1 76 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCL 1 77 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCL 1 78 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCL 1 79 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCL 1 80 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCL 1 81 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCL 1 82 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCL 1 83 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCL 1 84 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCL 1 85 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCL 1 86 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCL 1 87 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCL 1 88 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCL 1 89 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCL 1 90 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCL 1 91 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCL 1 92 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCL 1 93 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCL 1 94 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCL 1 95 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCL 1 96 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCL 1 97 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCL 1 98 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCL 1 99 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCL 1 100 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCL 1 -1 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 1 TA 1 TC 0 TG 0 +RCL 2 0 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCL 2 1 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCL 2 2 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCL 2 3 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCL 2 4 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCL 2 5 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCL 2 6 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCL 2 7 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCL 2 8 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCL 2 9 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCL 2 10 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCL 2 11 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCL 2 12 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCL 2 13 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCL 2 14 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCL 2 15 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCL 2 16 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCL 2 17 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCL 2 18 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCL 2 19 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCL 2 20 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCL 2 21 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCL 2 22 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCL 2 23 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCL 2 24 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCL 2 25 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCL 2 26 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCL 2 27 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCL 2 28 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCL 2 29 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCL 2 30 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCL 2 31 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCL 2 32 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCL 2 33 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCL 2 34 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCL 2 35 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCL 2 36 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCL 2 37 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCL 2 38 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCL 2 39 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCL 2 40 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCL 2 41 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCL 2 42 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCL 2 43 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCL 2 44 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCL 2 45 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCL 2 46 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCL 2 47 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCL 2 48 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCL 2 49 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCL 2 50 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCL 2 51 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCL 2 52 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCL 2 53 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCL 2 54 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCL 2 55 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCL 2 56 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCL 2 57 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCL 2 58 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCL 2 59 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCL 2 60 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCL 2 61 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCL 2 62 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCL 2 63 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCL 2 64 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCL 2 65 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCL 2 66 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCL 2 67 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCL 2 68 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCL 2 69 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCL 2 70 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCL 2 71 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCL 2 72 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCL 2 73 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCL 2 74 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCL 2 75 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCL 2 76 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCL 2 77 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCL 2 78 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCL 2 79 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCL 2 80 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCL 2 81 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCL 2 82 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCL 2 83 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCL 2 84 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCL 2 85 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCL 2 86 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCL 2 87 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCL 2 88 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCL 2 89 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCL 2 90 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCL 2 91 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCL 2 92 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCL 2 93 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCL 2 94 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCL 2 95 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCL 2 96 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCL 2 97 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCL 2 98 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCL 2 99 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCL 2 100 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +RCL 2 -1 AC 0 AG 0 AT 0 CA 0 CG 0 CT 0 GA 0 GC 0 GT 0 TA 0 TC 0 TG 0 +# Effect of previous base high quality. Use `grep ^PRCH | cut -f 2-` to extract this part +# One row per read and previous base, columns read then previous base+substitution and count for 12 substitutions +PRCH 1 AAC 0 AAG 1 AAT 0 ACA 0 ACG 1 ACT 1 AGA 0 AGC 0 AGT 0 ATA 0 ATC 0 ATG 0 +PRCH 1 CAC 0 CAG 0 CAT 0 CCA 0 CCG 0 CCT 0 CGA 0 CGC 1 CGT 0 CTA 0 CTC 0 CTG 0 +PRCH 1 GAC 0 GAG 0 GAT 0 GCA 0 GCG 0 GCT 0 GGA 0 GGC 0 GGT 0 GTA 0 GTC 0 GTG 0 +PRCH 1 TAC 0 TAG 0 TAT 0 TCA 0 TCG 0 TCT 0 TGA 0 TGC 0 TGT 0 TTA 0 TTC 0 TTG 0 +PRCH 2 AAC 0 AAG 0 AAT 0 ACA 0 ACG 0 ACT 0 AGA 0 AGC 1 AGT 0 ATA 0 ATC 0 ATG 0 +PRCH 2 CAC 0 CAG 0 CAT 0 CCA 0 CCG 0 CCT 0 CGA 0 CGC 0 CGT 0 CTA 0 CTC 0 CTG 0 +PRCH 2 GAC 0 GAG 0 GAT 0 GCA 0 GCG 1 GCT 0 GGA 1 GGC 0 GGT 0 GTA 0 GTC 0 GTG 0 +PRCH 2 TAC 0 TAG 0 TAT 0 TCA 1 TCG 0 TCT 0 TGA 0 TGC 0 TGT 0 TTA 0 TTC 1 TTG 0 +# Effect of previous base low quality. Use `grep ^PRCL | cut -f 2-` to extract this part +# One row per read and previous base, columns read then previous base+substitution and count for 12 substitutions +PRCL 1 AAC 0 AAG 0 AAT 0 ACA 0 ACG 0 ACT 0 AGA 0 AGC 0 AGT 0 ATA 0 ATC 0 ATG 0 +PRCL 1 CAC 0 CAG 0 CAT 0 CCA 0 CCG 0 CCT 0 CGA 0 CGC 0 CGT 0 CTA 1 CTC 0 CTG 0 +PRCL 1 GAC 0 GAG 0 GAT 0 GCA 0 GCG 0 GCT 0 GGA 0 GGC 0 GGT 1 GTA 0 GTC 0 GTG 0 +PRCL 1 TAC 0 TAG 0 TAT 0 TCA 0 TCG 0 TCT 0 TGA 0 TGC 0 TGT 0 TTA 0 TTC 0 TTG 0 +PRCL 2 AAC 0 AAG 0 AAT 0 ACA 0 ACG 0 ACT 0 AGA 0 AGC 0 AGT 0 ATA 0 ATC 0 ATG 0 +PRCL 2 CAC 0 CAG 0 CAT 0 CCA 0 CCG 0 CCT 0 CGA 0 CGC 0 CGT 0 CTA 0 CTC 0 CTG 0 +PRCL 2 GAC 0 GAG 0 GAT 0 GCA 0 GCG 0 GCT 0 GGA 0 GGC 0 GGT 0 GTA 0 GTC 0 GTG 0 +PRCL 2 TAC 0 TAG 0 TAT 0 TCA 0 TCG 0 TCT 0 TGA 0 TGC 0 TGT 0 TTA 0 TTC 0 TTG 0 +# Effect of previous base and next base high quality. Use `grep ^PRCNH | cut -f 2-` to extract this part +# Sixteen rows per read, columns read then 12 of the possible previous base+substitution+next base combinations and the corresponding count +PRCNH 1 AACA 0 AACC 0 AACG 0 AACT 0 AAGA 1 AAGC 0 AAGG 0 AAGT 0 AATA 0 AATC 0 AATG 0 AATT 0 +PRCNH 1 ACAA 0 ACAC 0 ACAG 0 ACAT 0 ACGA 0 ACGC 0 ACGG 0 ACGT 1 ACTA 0 ACTC 1 ACTG 0 ACTT 0 +PRCNH 1 AGAA 0 AGAC 0 AGAG 0 AGAT 0 AGCA 0 AGCC 0 AGCG 0 AGCT 0 AGTA 0 AGTC 0 AGTG 0 AGTT 0 +PRCNH 1 ATAA 0 ATAC 0 ATAG 0 ATAT 0 ATCA 0 ATCC 0 ATCG 0 ATCT 0 ATGA 0 ATGC 0 ATGG 0 ATGT 0 +PRCNH 1 CACA 0 CACC 0 CACG 0 CACT 0 CAGA 0 CAGC 0 CAGG 0 CAGT 0 CATA 0 CATC 0 CATG 0 CATT 0 +PRCNH 1 CCAA 0 CCAC 0 CCAG 0 CCAT 0 CCGA 0 CCGC 0 CCGG 0 CCGT 0 CCTA 0 CCTC 0 CCTG 0 CCTT 0 +PRCNH 1 CGAA 0 CGAC 0 CGAG 0 CGAT 0 CGCA 0 CGCC 1 CGCG 0 CGCT 0 CGTA 0 CGTC 0 CGTG 0 CGTT 0 +PRCNH 1 CTAA 0 CTAC 0 CTAG 0 CTAT 0 CTCA 0 CTCC 0 CTCG 0 CTCT 0 CTGA 0 CTGC 0 CTGG 0 CTGT 0 +PRCNH 1 GACA 0 GACC 0 GACG 0 GACT 0 GAGA 0 GAGC 0 GAGG 0 GAGT 0 GATA 0 GATC 0 GATG 0 GATT 0 +PRCNH 1 GCAA 0 GCAC 0 GCAG 0 GCAT 0 GCGA 0 GCGC 0 GCGG 0 GCGT 0 GCTA 0 GCTC 0 GCTG 0 GCTT 0 +PRCNH 1 GGAA 0 GGAC 0 GGAG 0 GGAT 0 GGCA 0 GGCC 0 GGCG 0 GGCT 0 GGTA 0 GGTC 0 GGTG 0 GGTT 0 +PRCNH 1 GTAA 0 GTAC 0 GTAG 0 GTAT 0 GTCA 0 GTCC 0 GTCG 0 GTCT 0 GTGA 0 GTGC 0 GTGG 0 GTGT 0 +PRCNH 1 TACA 0 TACC 0 TACG 0 TACT 0 TAGA 0 TAGC 0 TAGG 0 TAGT 0 TATA 0 TATC 0 TATG 0 TATT 0 +PRCNH 1 TCAA 0 TCAC 0 TCAG 0 TCAT 0 TCGA 0 TCGC 0 TCGG 0 TCGT 0 TCTA 0 TCTC 0 TCTG 0 TCTT 0 +PRCNH 1 TGAA 0 TGAC 0 TGAG 0 TGAT 0 TGCA 0 TGCC 0 TGCG 0 TGCT 0 TGTA 0 TGTC 0 TGTG 0 TGTT 0 +PRCNH 1 TTAA 0 TTAC 0 TTAG 0 TTAT 0 TTCA 0 TTCC 0 TTCG 0 TTCT 0 TTGA 0 TTGC 0 TTGG 0 TTGT 0 +PRCNH 2 AACA 0 AACC 0 AACG 0 AACT 0 AAGA 0 AAGC 0 AAGG 0 AAGT 0 AATA 0 AATC 0 AATG 0 AATT 0 +PRCNH 2 ACAA 0 ACAC 0 ACAG 0 ACAT 0 ACGA 0 ACGC 0 ACGG 0 ACGT 0 ACTA 0 ACTC 0 ACTG 0 ACTT 0 +PRCNH 2 AGAA 0 AGAC 0 AGAG 0 AGAT 0 AGCA 0 AGCC 0 AGCG 0 AGCT 1 AGTA 0 AGTC 0 AGTG 0 AGTT 0 +PRCNH 2 ATAA 0 ATAC 0 ATAG 0 ATAT 0 ATCA 0 ATCC 0 ATCG 0 ATCT 0 ATGA 0 ATGC 0 ATGG 0 ATGT 0 +PRCNH 2 CACA 0 CACC 0 CACG 0 CACT 0 CAGA 0 CAGC 0 CAGG 0 CAGT 0 CATA 0 CATC 0 CATG 0 CATT 0 +PRCNH 2 CCAA 0 CCAC 0 CCAG 0 CCAT 0 CCGA 0 CCGC 0 CCGG 0 CCGT 0 CCTA 0 CCTC 0 CCTG 0 CCTT 0 +PRCNH 2 CGAA 0 CGAC 0 CGAG 0 CGAT 0 CGCA 0 CGCC 0 CGCG 0 CGCT 0 CGTA 0 CGTC 0 CGTG 0 CGTT 0 +PRCNH 2 CTAA 0 CTAC 0 CTAG 0 CTAT 0 CTCA 0 CTCC 0 CTCG 0 CTCT 0 CTGA 0 CTGC 0 CTGG 0 CTGT 0 +PRCNH 2 GACA 0 GACC 0 GACG 0 GACT 0 GAGA 0 GAGC 0 GAGG 0 GAGT 0 GATA 0 GATC 0 GATG 0 GATT 0 +PRCNH 2 GCAA 0 GCAC 0 GCAG 0 GCAT 0 GCGA 0 GCGC 0 GCGG 1 GCGT 0 GCTA 0 GCTC 0 GCTG 0 GCTT 0 +PRCNH 2 GGAA 0 GGAC 0 GGAG 0 GGAT 1 GGCA 0 GGCC 0 GGCG 0 GGCT 0 GGTA 0 GGTC 0 GGTG 0 GGTT 0 +PRCNH 2 GTAA 0 GTAC 0 GTAG 0 GTAT 0 GTCA 0 GTCC 0 GTCG 0 GTCT 0 GTGA 0 GTGC 0 GTGG 0 GTGT 0 +PRCNH 2 TACA 0 TACC 0 TACG 0 TACT 0 TAGA 0 TAGC 0 TAGG 0 TAGT 0 TATA 0 TATC 0 TATG 0 TATT 0 +PRCNH 2 TCAA 0 TCAC 1 TCAG 0 TCAT 0 TCGA 0 TCGC 0 TCGG 0 TCGT 0 TCTA 0 TCTC 0 TCTG 0 TCTT 0 +PRCNH 2 TGAA 0 TGAC 0 TGAG 0 TGAT 0 TGCA 0 TGCC 0 TGCG 0 TGCT 0 TGTA 0 TGTC 0 TGTG 0 TGTT 0 +PRCNH 2 TTAA 0 TTAC 0 TTAG 0 TTAT 0 TTCA 0 TTCC 0 TTCG 0 TTCT 1 TTGA 0 TTGC 0 TTGG 0 TTGT 0 +# Effect of previous base and next base low quality. Use `grep ^PRCNL | cut -f 2-` to extract this part +# Sixteen rows per read, columns read then 12 of the possible previous base+substitution+next base combinations and the corresponding count +PRCNL 1 AACA 0 AACC 0 AACG 0 AACT 0 AAGA 0 AAGC 0 AAGG 0 AAGT 0 AATA 0 AATC 0 AATG 0 AATT 0 +PRCNL 1 ACAA 0 ACAC 0 ACAG 0 ACAT 0 ACGA 0 ACGC 0 ACGG 0 ACGT 0 ACTA 0 ACTC 0 ACTG 0 ACTT 0 +PRCNL 1 AGAA 0 AGAC 0 AGAG 0 AGAT 0 AGCA 0 AGCC 0 AGCG 0 AGCT 0 AGTA 0 AGTC 0 AGTG 0 AGTT 0 +PRCNL 1 ATAA 0 ATAC 0 ATAG 0 ATAT 0 ATCA 0 ATCC 0 ATCG 0 ATCT 0 ATGA 0 ATGC 0 ATGG 0 ATGT 0 +PRCNL 1 CACA 0 CACC 0 CACG 0 CACT 0 CAGA 0 CAGC 0 CAGG 0 CAGT 0 CATA 0 CATC 0 CATG 0 CATT 0 +PRCNL 1 CCAA 0 CCAC 0 CCAG 0 CCAT 0 CCGA 0 CCGC 0 CCGG 0 CCGT 0 CCTA 0 CCTC 0 CCTG 0 CCTT 0 +PRCNL 1 CGAA 0 CGAC 0 CGAG 0 CGAT 0 CGCA 0 CGCC 0 CGCG 0 CGCT 0 CGTA 0 CGTC 0 CGTG 0 CGTT 0 +PRCNL 1 CTAA 1 CTAC 0 CTAG 0 CTAT 0 CTCA 0 CTCC 0 CTCG 0 CTCT 0 CTGA 0 CTGC 0 CTGG 0 CTGT 0 +PRCNL 1 GACA 0 GACC 0 GACG 0 GACT 0 GAGA 0 GAGC 0 GAGG 0 GAGT 0 GATA 0 GATC 0 GATG 0 GATT 0 +PRCNL 1 GCAA 0 GCAC 0 GCAG 0 GCAT 0 GCGA 0 GCGC 0 GCGG 0 GCGT 0 GCTA 0 GCTC 0 GCTG 0 GCTT 0 +PRCNL 1 GGAA 0 GGAC 0 GGAG 0 GGAT 0 GGCA 0 GGCC 0 GGCG 0 GGCT 0 GGTA 1 GGTC 0 GGTG 0 GGTT 0 +PRCNL 1 GTAA 0 GTAC 0 GTAG 0 GTAT 0 GTCA 0 GTCC 0 GTCG 0 GTCT 0 GTGA 0 GTGC 0 GTGG 0 GTGT 0 +PRCNL 1 TACA 0 TACC 0 TACG 0 TACT 0 TAGA 0 TAGC 0 TAGG 0 TAGT 0 TATA 0 TATC 0 TATG 0 TATT 0 +PRCNL 1 TCAA 0 TCAC 0 TCAG 0 TCAT 0 TCGA 0 TCGC 0 TCGG 0 TCGT 0 TCTA 0 TCTC 0 TCTG 0 TCTT 0 +PRCNL 1 TGAA 0 TGAC 0 TGAG 0 TGAT 0 TGCA 0 TGCC 0 TGCG 0 TGCT 0 TGTA 0 TGTC 0 TGTG 0 TGTT 0 +PRCNL 1 TTAA 0 TTAC 0 TTAG 0 TTAT 0 TTCA 0 TTCC 0 TTCG 0 TTCT 0 TTGA 0 TTGC 0 TTGG 0 TTGT 0 +PRCNL 2 AACA 0 AACC 0 AACG 0 AACT 0 AAGA 0 AAGC 0 AAGG 0 AAGT 0 AATA 0 AATC 0 AATG 0 AATT 0 +PRCNL 2 ACAA 0 ACAC 0 ACAG 0 ACAT 0 ACGA 0 ACGC 0 ACGG 0 ACGT 0 ACTA 0 ACTC 0 ACTG 0 ACTT 0 +PRCNL 2 AGAA 0 AGAC 0 AGAG 0 AGAT 0 AGCA 0 AGCC 0 AGCG 0 AGCT 0 AGTA 0 AGTC 0 AGTG 0 AGTT 0 +PRCNL 2 ATAA 0 ATAC 0 ATAG 0 ATAT 0 ATCA 0 ATCC 0 ATCG 0 ATCT 0 ATGA 0 ATGC 0 ATGG 0 ATGT 0 +PRCNL 2 CACA 0 CACC 0 CACG 0 CACT 0 CAGA 0 CAGC 0 CAGG 0 CAGT 0 CATA 0 CATC 0 CATG 0 CATT 0 +PRCNL 2 CCAA 0 CCAC 0 CCAG 0 CCAT 0 CCGA 0 CCGC 0 CCGG 0 CCGT 0 CCTA 0 CCTC 0 CCTG 0 CCTT 0 +PRCNL 2 CGAA 0 CGAC 0 CGAG 0 CGAT 0 CGCA 0 CGCC 0 CGCG 0 CGCT 0 CGTA 0 CGTC 0 CGTG 0 CGTT 0 +PRCNL 2 CTAA 0 CTAC 0 CTAG 0 CTAT 0 CTCA 0 CTCC 0 CTCG 0 CTCT 0 CTGA 0 CTGC 0 CTGG 0 CTGT 0 +PRCNL 2 GACA 0 GACC 0 GACG 0 GACT 0 GAGA 0 GAGC 0 GAGG 0 GAGT 0 GATA 0 GATC 0 GATG 0 GATT 0 +PRCNL 2 GCAA 0 GCAC 0 GCAG 0 GCAT 0 GCGA 0 GCGC 0 GCGG 0 GCGT 0 GCTA 0 GCTC 0 GCTG 0 GCTT 0 +PRCNL 2 GGAA 0 GGAC 0 GGAG 0 GGAT 0 GGCA 0 GGCC 0 GGCG 0 GGCT 0 GGTA 0 GGTC 0 GGTG 0 GGTT 0 +PRCNL 2 GTAA 0 GTAC 0 GTAG 0 GTAT 0 GTCA 0 GTCC 0 GTCG 0 GTCT 0 GTGA 0 GTGC 0 GTGG 0 GTGT 0 +PRCNL 2 TACA 0 TACC 0 TACG 0 TACT 0 TAGA 0 TAGC 0 TAGG 0 TAGT 0 TATA 0 TATC 0 TATG 0 TATT 0 +PRCNL 2 TCAA 0 TCAC 0 TCAG 0 TCAT 0 TCGA 0 TCGC 0 TCGG 0 TCGT 0 TCTA 0 TCTC 0 TCTG 0 TCTT 0 +PRCNL 2 TGAA 0 TGAC 0 TGAG 0 TGAT 0 TGCA 0 TGCC 0 TGCG 0 TGCT 0 TGTA 0 TGTC 0 TGTG 0 TGTT 0 +PRCNL 2 TTAA 0 TTAC 0 TTAG 0 TTAT 0 TTCA 0 TTCC 0 TTCG 0 TTCT 0 TTGA 0 TTGC 0 TTGG 0 TTGT 0 diff --git a/test/data/sa.bam b/test/data/sa.bam new file mode 100644 index 0000000000000000000000000000000000000000..ce49826f2b876b41679ab4a17d439f56d8d61e70 GIT binary patch literal 126978 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

)rGp=K+%{rQB*N2f`5uKqdq*bmZ0xwFQ>KSOkw9 z*LfQ#Fa; z@O(df6JKE7p%b@nbAZt@(h6h>i5Uy`B|fxVoXk9>7BeC`#1}!t>PnOJGm+`ol325Qe+4Zj z#G5c=oIIvvtsXYwbs&oQyeP9Mx>W9iUr+`Sp)ASQg>0Tcu+iZ%&>(j@wfM9Ta7I1> zDTtUl_n{b!nb9laTtd_=1VT%~kQo@ZqU4_;9zTrNMft7aMEI?<;mngp0`Z8a6f``W z*l^dnw>2CR{H*r#ck%IH6mi4S*=WI^9dL-9nAbD$Mx2CNkJpsw5u#~ldftbR4uj_X zAJ578{{aOawl4tx001A02m}BC000301^_}s0sv(o)LYALUB?kzGoO-$**!heGtE_; zETklgkyyx@=y^o~Xh|R`1N!^au_XP}@t=B}9rpb%Ay!%yMx_mC-D z{+WNn!EzGa5{FQ;R_T;`i>(H;FfxbK*iakE;&~j(HylFdT*8((B)O;3Qk2fD zZG;w6MXRX3h(rDrheC0whmdZtD#oxtJM8!3`x z-4|?J_S_du=ZwbK6Qj350c+yGWiTat)XeAWL6&;JSIV>{5LR@kgg{u6m-jTw>1bO}&5~ z4(&6M*4m3p8s~9H&lZN2vLy~(+!9ts5b~JGP0$Y|&Dw^M)64Zxo^ar$FVGcAdoGML zi%%k@Nfx?AZgp5MSz2q{BcI11EcF2Du_>`OsVRrn9drSEGadtfdKg{AID~K>2VQWn z5I4o4duvo_Oq&kcK+ZXGZ%$GjWV@ZkAuKppNomu*z&soy;=C#)1u#iLTWD2@H0!K< z9tU0sgb*0Wp8NrfA(@SiM@~uFOd+>Ck77u%)D4(2^dNzfmX zCG<(;7^&e~KVJ{)!5JBIb4wgb?AGzgS8oe2a7>^t*nB{Mnxhg2oL<3e5nNv9=fheL zs&UUT*`-E>_K;>UJk)F=82JEX#F|kV=gT2K(;sZpySwAsbnzxF%;a-Gl?!cFtWj)G zp$pnV*R`1n80d~TDAfve(!9ow&lV2?4lpLJgo+*+dLDRBA(GA1*pv}aoc z@qy!dM%5BV@K6VPnp2?Ix}9JTzrnCv7YyfPQ@NU;(r07t^I*gcY^q>;)PYX1JX$@E z!^*0mW$j5OIiMGy$3|!{Hbt5#jmn|9vTKVcV0a=A%aIkuXj3-}S4DN_q%j>(uCu9W8pE283}eqBs_83N*F-V%t69E47i9FU8m=(rPF>3K}pT#ad*0^%R9p?I_CS`mlOxg`(IGXPEI=r> z#-5#lJChNLK_&{8-jEKZ4xC5`Tp1F+j|*^ElTt-l_bdnpmFy+qpGuB%1HPx=S*Uh^ zJ7B)DeR? z=tVzW5Wld9RkRI9*mg@G6m8LQHvgDUIH7Zk)AmJ)a%d(O(rDv)Iy zHzPuWH7A&SR0>d-(CP9#UlECxSg9Ixoh^ar${k)Of)FSNP|O-3&|zc(1!TZZqzJzO zu^i#B&UMo`WeWvYMbj||KNMS2vy@dmGvfCre7g2y(?xBO0PkCg^P~)3E2T z?53HIn6VtRT0C)!$Vf;~o>t<#pduDmBf~P@lTMX(goE9Yyr<)-hKyrEz@-TjueHSs za9DU{Qr?Jv(72I%d=f$_ zTp3PCg@TUSrm!1#ZRH2JGQ8`swUzM4)Cw9?Xjfk=Ia~T*ZJ9EomYwL9;06?TP>9<~ zL$rK4`zbzwV%X@U>4c7-3)>7!L7ZI~oMIkS;0M{Mn5JP zzK88G+{q`gL)bn7%jm3xozs=hB>^f2Z^%#qYEfhW>n8SxDLj5vVuvF_F16~MxuS(s zh^o^f;|hJ4z;y?WE*S9Z4)OA!5c?`T!8}&lNCXG{tIF$Xp4RU&t+?eEaKL|Ww`+ofv>9QTy!DO0M0M6@bzX^ydeN` zCxjs&2?#R}b9j0eV#jWIe3kYQXb>F!5VTaH-Wo2iD7GPS0bO3G+71e_byPye)A?vb z8;1jTn6mCfdlZntvkgYFkfEoC>!1#|g`YzzsAeKrm%jM>RT?&sb zx58D)zajvIl~#G0Cw9blA$Am-HdU#}5w9pVTYbSl4=|=0e3@p!?iy5VxFhp(A@(bR zDGidP&M|z&i=P~1suasV*=o{Bpy^(C4pml}PnGyXyWJrw$5z1Wyd-=HJ$5X&0QC`q z56i6KQsMt|GO#o~D8%+jfLI2de3{S}ZE?(`d|Go1%q1cr|uoK97n? z=LfMaUJEok!8bwZkagvO)eu~wQSJ5MoAD}yfn5^I?r00-r&PYfIwKkAQm!tz`5<%* z9yoB}AHwYcgXZ9q*oO`0t5W%nVbO<+Yngd*&n4TXv0klbkuk;VI(RmAk3#-lN})PP z0KhObmax*{5-)s)a7kcA-s_dZNh1+=f`k!WoXSF!!CC`L6=;>R=>fBhU^B~=DL+#x z2S;OjJ|P?_rIIzXT(l`(&}J|Jr%%L`kJT`P26$CH=`3$j$HKU#vJf=VI4r^<#M<_X z+!WJhFDzm#O|yGyBi?>0>Bh3;PwTuQz^~H<2fe-Q=qB#IAlIEXLO5ml!G?@Ne4UJ2 zi%n0e^NWB?23Q9f+dznGwM^_wJ4a&RE;9fzKNlkJM5lD8} zg>zFdi%*{shO@I;;{l<1I}Yu4M52w*iBGw~mNVftwV;c1u1H++O%gXQxKX3WgF0-p zXM`T1^Lt>_#1>vsaW2GuI95&$iik82M%Vd7pn4l|<=y6&HKj+oM64n^HSZ0yN-26bYXKxCO6e4sD6yv)VPET#wz`r0zCxSw0D!cctsN zdGgEem<^%vOabQv2)Hgn$%ZxIKNn&LBX}~DYG1LP!fz`vXGSbU;1Vw2sf%?NqAniP zeo%)UokAn7)T}QFY#z$#m`_#n;EV3wj%0aT_a(2Dd_1DK;^!6^ z#Ytbn6dPwx@r+*%YIaFab@=)q_HGIqR?zuD1nBsZGUst3gM1sVK#!fpNd)C57LEsn z*r5n9{nZIhIed(n=2I~l&M}E36l> zYfa+z%gKN|6k4gD3sE+68UA3@c`~}V{8rCGqh#)cEUFa}MnEugmo4By9qgXn$evUu zCJY#r`ep70^lZMZgy9muV}MHbd=%p3 zXzcvT#0pjCg0~ z7NiRD?Huq+vn+caw0+-o*y$lSiz_u<;(ipBKjK#|2^Mv1z#-jsioyp0W8yP>UH1G0 zx^txt&=q&37J>3v@F4F4l))<=E&vo$NTkitUDv!03US+Tk@BW<@`CXu1uumB!a~X|t9+arCod^GaY=k7tSq^MLhPd_77|LW`n*sH3H&8> z$T5u*QAT%d0!Ty#u`?%kM7_NlNvY2*zkK3tGpeO5Tskg0LIhqGWkL|B2Yp1nt#)8p z=)5Di>l`{ZQsPm+iup5X?-fy3dBs$nd=b^&zX+u^B4l7gM3>Au{w=40sf*y5f+6yf zu<+jt@vg(pG6nrsdRIC^45g7UI3-LhO_{zhM+cwc2LiBq7{T9l*d3QJ`HMPl2o%sH zAJaoYis8Y)_LvB078yii3^J+0=Q`ZTws`#Mti#A?z6skIE;QWHfvpKYCi%Xz?gGvK z{an1QJnJoB1+j|G$rBMD)F;<~{c|%tb2;J!5c; zr4He0*vr7Mj4ZmO(Pq7cLg68%?QJ_%cc>C5A}Bo=vAuRWfjU6-xv+f>EI+Npoeofn z^tljwPf56^QqnQ=H@4rTn;TNf(5SS|+=;*K9FvkdK(TY{_>qp<|B&80W5^qJ2>^g!IGVFlS ze}6f@WGZL^_k#hZqq7bkXMhQ#6vY<2Yd!(vQidtQo{H()#?N)wMhxzlq|^nQH3o|e z5C;emWcG3IvH#>#ps!}*nLmg2A^qOBTLg3HTxKjw6gU)H^7FGOmN4r}66s9TC)Y!~ z4hrFKy>)UrZ%UEt*lY6Bw}pf)Tpl#PdlK-yxVt`p*X~`2ZOB01hiA0PLZpH2TR=LA z@9Q*_(}!jUV<#FnJmY^aM0^+G=1T`JRp-KU_5$=y=+YAV&Xw_yY2AuzKA~;yNuKdt zh+WEN#a&)!CB%F!`-Eo%gC}Bmdg_AJFBy*X-S#PHCci7OH`sz@D7`Hq-$z`AF!CgU ziIF=EEBVJAlN?UWK_To8(XrT33ekz#aU2~MdLqQ}Lcx}KG~l0`g;97q`670{5Y|gd z$+n4)`4643Wr7s4q#{M64J<1A--(LwvkI#zdGvxc?<-9VW0wu%!|H}on^$4 ztB^Z{$LYZbv5%hYx2)EX(}fuyFDP#)*6<{HRx@6M=PXcf*Fz)m?y>FOTIQfNrp+VX zBNCf26PHH(g+Q$_gT|drv^a6KgF@KbWywZFWg#ja;2?D9oyXNg_bZ|mA`GF*NSfb6 zNA)f1+th3<009!xB|xAsPb~3k^2^7j}hM1)xuXTZfw`n_yEuGp8`H+mD6>Y^y8;&pulW zqT=UFIOb=BzpT3;-9iq5N@NcTv1gMNoON_QpJDP=B!f(GCd*Qr*t$$w0PcMFB@p|0 zP>6lxLd&F7y+nivV08)t(cxP;z-Z_p>}uQ>lJR*^h@BwAt{C4R{$zv3rTav zzLCk34uWlHAhhiFLil$b?xJ{HtW?&aLW_u%C6DOAc{yMmb35=PHb6`Na94(R9d-zt zpcSQfr72i`14b0K1)s?udF*dO;NW>BS>KelcvR1+|W3DmEMr=Lq+-<$CWu-OfX2 z6Rwn7Nq^0%uR#tS1jNIHA~c>)fi)LoY~Y#$aB7cDz?ug2ugXf0HHAAosm`Ev4Ygwq z4hp&?zY7(8)kk#d&nK}@8VqhqV~`0QV%y2QMHD4`bPTMCD8s!GKTlY7{-mASCk@!# zN()gJ%5P2sY$=I)g&={ErNvhTwg^mz`neE(mwJM3DGl~?5+br*S-02%NM3%z=#_ME z_MkKOgGs~R8To9zR2ITRH1=$LsQ_^rhQvNnBv|_8hQsM{<)9F|){~`%QdkE4o@jQ6 z;zHs#$D*(BvfnB;@P}qRD8yas8I|TH;B`MPA}Hk}*N;;iF4&U7|FC9==&r?i%) z?*6u1x=K4s_MK*7@w;$c$_B<|7Tag2B6x|E2hYa$$mMS%7kOMduZV!Jk|Qkw{SuAD zZ#O_4J@C)4ESTyNM<^=l^#kVWMopYX{hEwXStsY z0dj-Rqj4=PiY*g3`D~D6AQ#d{L=h?=3dXtd^U>J1J5aHdMzj?uQ{AC(1;J(Pf>bvm zfHn)^9(@bUrU3~43h`1+k2R}F(+wcjyz$zu(<^hz_ypT*C3}m4X z7xdtz17~-VQXamD*U89xtS8T~(j`{~i3+mx2A#ws9x@@fg2B3SQU`{ygYRJ*H85d; zji<5@II@8;MxwDjb}~dqyl909iX|FY%smglh+9A#2DeI22JH|#@3cs`Md3(@Bmc{T z!B+vIPiXqDmH3~({rwOAKqiaM=TeNz2|o5L`mjF7RSDOS!3LY5)4OVZe)R39{{Mgd z^MC)3`yjm}ORvB8pS_mSUq7^B9M5?jSoZ=*VFw>ctYiS6k@yJz`&0Q-h`bkq6cU{u z0}}p=&@Fr#ktYGe(L$hmhA#|-it~L^h;l20Rl42-h)jsS8yOL7GFq2lbo>E|tohh? zwu3^{y%2QZIt%g2U&9|^C7LCi;Unb1mzoblp~(^XT!@!+>!%RDYCRg3o?$M4In2MI z16+()XfzQq0Y&ALLfBg&w5~bPGUDvaEg=?L81#A02kjJbGJG5Bfl&EV2zM)lQR>Nu zuQRahLeGg49g`*eF>>-fK?(3{$qqOugumYrT2s-N7%H)f0!MNc9;LXj!O3^Dm4kNb zpb+8yYADSrM3{owx7!OxorqB-tIaMsR5X=2t%s%7Pa)#%i>ONDOeZepUiQ`CQRw&( zxGvOeL{Ry3;h%AGS*E}A5jvs!nk#PKBI&gfi<*S&hTwwRnb*6|i4hm83vqsffh_Qqe!`0X%^qAahF3hX6WT6D`U+$m~ z_s%jZ-D+V=Nb(vc*Ao~9)-n0t(m>E_56Tb@j)uE+mbm-s)GXoi9Kfj|2*Coxu5$5% z5Rgxj>3Z#b4+?SbEVV}c23iR2M3#9YObBy0xVm16VZsEwvFJM}#J#hOO7#fLNF6;R zF)GV6xhKuS(9~laf~ig}*Fhm}oh1#s&OQP$CpO2hKn!W%*W!MdNZL#xW(e)cbyA3M zpFW+=7TZen)P!kFMtn!=?0_pnAt1dhF)}^CBiy~Sgm$K~5b)2zDDh|HW1!2#C08?ilfj7iO zmZwCh0L8GjuwAekA>(6N=ueKuy|ctCTV)~agjSj{d$#nFJfGNiGKEGAZs8N+;&@Pq zduLgcvW+n$MMf;pr|BgAiIoOw--=e#9W+$_j#)aT!RS?3gktv1_0SA6r^{EGCcvM=jB6cWmj2#Z z8l^NLR@?}%Ae3ST&VmQC-!#dm!$pHGv&@q_;@(+mb!&vrKsFt8jwarO@aQM$TglN@ z@`kRXJL1+^+N{*l6+58|A>Y6ezw%h%f^MwjABzkNv%-E*hoB;xySuwf z@DSWJ*g$X{VDN}hpI6H&~L=-iY@mg zFQc(1l05y$CW&`AvWw@t5wS|`!6IzIo1_Tz*h=(w3;g(^A|5yXha%+pi}KdJ@O6qF zr@?XulQ8q8g@j>I14^IWHNnQV(X$G+G7+EbGf`Y$=;m-HypJO&SIz$6<%f#3vtDLf zPYWl=!$kH!5gDMW!G%~jqGpQ+Z<&5E!Zh%@-ZFf9TsD4(jeE}u|NmYYz>+U!s<~#j zV??Z6Xq;G7VZ{`6o#w?N+L1KjPX0<{tU%dzhx=V5`4%vuZx ztjnLT%Q=^Ufsa>560ZjXJ(tk81$7A=J>n8?uiXecfOlxA1|*+%(0iivq)*S=jax#{ zzx$y}*N6F^zedvfUvGcBi~fB2G1IE?S)#|kC+PZw=V-l8)`dw@K=cQ9iGHBov@PamKDNxv4vMj*O4I8HM}TrQM#ikc&Y!|IR;T^XN2jSr=$3yJO}kOssubio@+g zGfYjMamw`o)+amK>Hm|>R$Loo-`5K+aYC+7EN;m0rOp`Qwc#U=nf^f~KhAVS z+h`NrL^G(I%4&;0F)3PfBRi00dgO&V3}f^+Sag8j2E%leTT566Yzko^asP9iCe+cg z8?$BazxgfhB*mI7)hGc-J*_#uh;N)#XNl^=%wLT~o^6d(Z>Vosl4D52tDi~8CO@49 z05I=^sYc>ecANiD@~S#GI<_ZMw{%rDx%HooHVDph%&2P z`nPFM8;3<&rEZh3(n7C?)GFErqYuuWrADbZh2Gk>y3xOan=?+&F}NMxGwC=oQLLV%@slabBrswD-rg zsRV)Ly_;Kodg;m}&c@=@tHM4k1TX84&dJuyCY4(IP3jS9km{v;PH zDY_2>*Hol!;9}$Jxjav#QyB$qf3@Q7l#klv3#d&g*5(o_C1Lw1iwrfeTSa%z=GR!W z+L0jCMCw}`1cfs9eQaK|!xf)`F0SEeK2ycA_030;byh*tm_@~2pV1s@+ruU;)-&Z) zKfC?Kq_lBxxRPYF)r|iX3H!V;9lDu^47khB>weOZhGbW!&Sg%_E(7on9b-q z@Hm5Qqp7$u#ZRN$XZZ}Fel=Q&$b{f%RfVx&5iQ||V6OOjFKW}IgZxhR!T8PU``A*n zgz-^w4Rlh@b2G(t^?xQQsrQ-^(sjT4T;M0F&vwG4$P}cN6$3E$8`stAp;GOceK0mP zX<7lYtn92TU)mG=0XGPR{rXQO)efFvB#+Q;%p@((MH&Yo63s4ca7!$m= zTY}=cLG^i(I7Fz@WJei-ub9uW#3JYQ4Ddz0IT7L8T@p6gO_KJcrlSP@2#(b<+tWFn z58LrXI1}Nspi*H)fYR2>dzmU3NH=8sKnkXkICPCr>giXqD{^0@%=hUoVt5S!?LsLq zyjz+s%sPaOlDpmD@>_N#bVvvOhgDpq81nO;;qfjz9}3H8Dd>n1Z&Q834O(}eXHCey zQoz^GnO+r9BZ&?UyjNbResP{~rW2-H8gkQ}4nj8VnvVD8$NY*C_%y(YPI$@nn8e6! z@nNAQG#RoN$|9=;E^U+@ac<0yAqueHSD3ZP3i0)J@vS2~)ELvk3F;BA3=*DD4YO{* zp3KM8aQ{^{#XLY$EAj)yChcoAsC&2W?s77jsBBESN#~)hxn{VkhDP|l?8E`RG8nSR>jv)#%dpOe07u?T2@C{|`p*ftZFLw5pp1H6s#aO?aN0+QX|Rut zVail4Vi+NZ<@f+fyFKa4#m`5X&bU_%OHkF@X5^zq(Y4GqHm z!QSeNCb_?-=Sw_C!?1S7+R^;V7fp_*t;I3ES*Q6jj$cZLmp1P6H2BKHptKRzWAdPs z=w|Zi4_CSE7X5};GLe7UIbrP<_vOh|eEXz3vPy7s+gt4C(NhYV+H_ z=WzM`!^CFr!T3y+-jWWK31Di4oR3=I*2ba{enapdfw$ocg{fwa3yl>5Y8lzFRvCaM zy6ZqEhK4-Fr(@)2LKpF}lhv#HwKdwbG)sV0p1&*nYU>SK~gkbZ` z7adz05~OPQY<@LsOAN3r6(j1k%Yge8;j1(2Z<^c>oik(qaDzxN==Ul3wi5J6Z9W{xl=1)B}s z&hY@Z6ZwpT3U>D2irr<2>k~*4BVh<{PQzs*^xsOtkeZk;W}b+Q5DQCcG(qOs*v4Ue z`#7bIXx9BR{bvoBi@;rbwxspdtgU{C8Nr1ZMJRHDmbC!lzn6BL{SrL9I9Y$A3Cz1i zE2>q$6_{uz?iTi5n%+Nd5u6a@>H1gQu7SM~vMuK=;yco;lRq=m<`%qV;tUBsyaju6V*^tBx;A3=7|*7KUjFFq2i5 z3(XW{6K3zx0~&8brG-oSD_7fXh_=@2akhxDpWmEoiQK`K4qCw76ILBg;dG|+uOUg# z!&#VVwmC4i+uh3tA^!An+O*w=Zjq_{wHVvXS&1*G8y0A!a2_HC(oPa{33YTUy1Uj! z_=Wv2B@ZA#qTCA;!aO6+G1Gqdl0c%yl#FOMIXNvpJz5gCdiKtWQE%y~tZ=v;@TYA% z?nH>br|wBMw6V?vH~i+J__YP|&&MkeFKw;1z7|!RW@4Qo*`MT&iURZ9F;6cmRCn z)4if{b@x0u_swJHYLcPm0^@70?)z4WinUboi&Q8Hh;g+^y~U|Mq#p_xhS318Kp};P zrPocVIP^_p(r&h-dB<*R{Zmh*@V}Dw`xJF`OJVqd5um8lX+~Pn-zM$6^jU7h&1GYD zU;rv}9d$k46hYGFx&kOO0Acxv#J-8+0PJfE)K#?=6uhzO&Tkk0O`0<*-)luhDmX)E z;C8^YYb)POF(h4Mo#T7W!QixO;yE zD(n!3k@>o>2Eb|1A%uEjVB&H#+TzMV8COh=x{B_I+OQN1na?KVqCaXYlSOD=I>Hqx z?Jy@w8)-HBpfOJk>`GMj)^H%n1xu`3f!&i2#kD*OafLt>L$ia2ouQ$}oIbf8$qVt9 zY}T*i87y^MeP~r_3SB~?2I5XRIL_0XRt73L@v4=pa3WvQ5mMB!GZ#oxYokg(WUd^^ zyQ$7jl5tv73YH9rTPCt|uE7F2ia?&-LZas{PU>Znm6C55$D^D#!Tk6COt!T#0>}j8 zO6=-?laewUX?0L^Jp&$>LUA^{21ilbHp$3=v%)Ub!uIMML*n<3u z+;caZTzVF%3K}1Jp4Vpr)d)(mDMpI6B4jgvT|x35E>U@SJoc8)1|`#fRC$IzJ5o+y zezDlzr6e@b0?*8H6K#4)<%RCHMJG`tGf5%FYIfuydA?O zL0{5PIhFE#9E#_T8zw5=mw#5GewmMmyF$CPAgiSNvHIT1at%ziB5TN1+Gl3e>$}vK z87TbPh31X8%hut8L?se&z~5YF!Sei~EEu!YTS0UD;qvQVVB?U0GgJ-^bQX}HYw?yGany5`=w6)tNug@@>}Ywoz!6VSZ; z%n;m1vL~ra#OtgPh>D6!ntEg?`t0BauW2W*UC{HviUe>1x09DQ=Z|wKo|Pw)5L)*I(@2E;-;7Mzwz@%5k^p(DI0i znk4Ro+YH@8)$!-5zn2t%$_B9?{p(C5EbxWRND1584!&bmFo(>M3$x_MC{fs*AK39?M)~hF%8P;hWZ79ndh+>5aJcjt)## zUSf>@7f|w&f<6m1J*|SNWGRvgCu|)U5e4=G4>zAg+>cb3kKtL~mPWx;NJS;?+~B!6RN4o8R&lv1J#ADiL!-!Z8$ki4nq^8y4wXs{`KRL4jBAvss;A3 zTZ{WOaBa73X|uU>?E*7}B;1r=9bCKDbjJjBXEH!BOO)jMT)3JrcgPLp%t6$fT0ERsG4RHbIt2@= zRK@+5Ba0}h{tRZ+ALXdFB0$^@cQVmz=_cm z2&fd7@%Z<6+t@87%0!UaD!==S@gL^5R*ZA);cl*{39fOul&M%%Eie}QW|`!B>Zo2A z=D(SZA$U?fGEKaBcCL^w*id!M04av>7$R?Ff1ouSG}laD$KPHZ9cR|~Vm7lVuLaf^ zv~2bbsL2{jZmS!mPPo`pggi)B?P*MNJ~A4e3xFBSPq_?{tz<^6pW%c7L?zt8{Ry`6 zd`Xlt<}oqS{=zDSnn_F8Fn66#v7PIcP4>wm=0=$~-`n3@Hms}zI#2e^xpIzDMat}1ZX(1qQ_qoCoFed7VBOt@&Jg%6; zjh6yy_)qw9k)1@E+vWraN*b=OqS5%c?Eq@Oe>%x~|BBrC5r(7zZf6LN0S zTKae08ZXMo%~=G6f*Q1xjR&^$=Jv1*N|D5c(IjT6QLK6eC$EwVur+LnI<)}YjsAfc zFWkh$o(1Kre)#dqo~aPFBfX~8T*@3fPiZ-yZZ63^yGoA^!Tn#WcQ~cl;tkY=6%nq3 zg;N}%Re0My;mE-^R%>CbUzZVnK+5cF*cCh+yXeVn?@Fcg2(F#2+0A&K_Q#H6u6AJ& z6K@3q7NLHFn8|qoJ{na`3kese*AGj1W>mQgo!t_Ndn^g=$ScdOc;2&**e4CKWGZfc0Elt$iT>ENO#rUnK}jHWVdlo500b7_6W8u zsO=+%iG0CKUuGRDJe%6No<5%B20NmJhzBuyj$XOQBy)=BhW>HF2q_Qv0`hBGv*5|2 zzF)+}=z5U@V!s0DxlNoDRT-GKh@k~UMFE)@cz>}cd;LG;cylK*CW>y)4lk!m_4oiCx*d-}aIAT_F->4tlk+hsEbXYc7*t#?oP(aIo}px zjy5C^hmm<_e#b@{PpS=^sD45Nwz5R&$SxTQv;+a_G*cqLaB*fMK3Mxw+6xii{%nMD zONX|w==^uotdjrU%Eqy8spvE}X=W!a7H<2t`%1$7a{=A;HzB#H8~+S4BGzazemq95 zI~-C7hcEZrxV#;*rVNx{ZHOR%wC&KwXWCCpvL?HdV!j|CBnU)yf*pDYd7>31jwnVl z&HW>6N?1fPuF&T^9u{loO)4x>Gm(Q% z8NgjJWem>}swu~vDSm@6yY1pKOC9O{X1Q2)3mw)~8oz5C^(6Ah?`$7}mty8T?lxk< zOm*C&P$)dTK^OeFJ6>Fx!Efk`O?#)Cu!^d90fT)D-@7bouZOR&-K;%osglcZqMUx8Wp`pB=ZY)9&P}%- z=Pzxw{g{3Q$CXbL|qlw3n(c zu#IVJ=UGLi)i-E)hXjRYqJDcc%qR73<6II&>5$3@7zuTV8GH(1=)*?{0h+qWe~|5L zM>YCA$}N7BR%#-Uv}j;rjTDbb&x*SDe(EdIDAG;;hN8`5L$8yqBhv@8&n3-)(iqK2 zZR4X9F=t3*l^6=MmHi%~#`SbhAi?g`4we7rAvk96YFC3A>&K$DDjL_$!?ysp+)0YU z-Pou7t3)=Z25g;%ffL4OGQq)7ymItyn3s6_zMbnB9%%CrY)8+P5A|+4rw%f28lll` zVtrjV-zBqzjLkv*VIbL9M<_oV^Ta19O1zyYzZ|V4M-Zo(g{tZUcjG{J^0gR3!2F?F zB|9=l&GWjVY1LWh!C8~RHYoops&qBcqxJO>juA*vg$UEuW9ODCj>;Z0GGsuV9>nWy z>xO4JNkeME5TMx%BV1%5=da#~0q%VZIl)54L6PQ3`MFgzN8@D8h(YJ*!DLVcnWRZS zl?h;_=s&5ad}*rH>YVhBabF3Jl%kt#Z+PkoQpP~_^;MUYs0lSc3Cb@!et(wwTdR?j zp$@o`xDSL13||6 z?iOW^178(dr*i0ARD8@2{C7d~VTN8AYP@y;b1mcGf}ylC^ls@1UT!bcmIVxpZ6k8L z&0~h=1F08chaMG#RbV3dd%$9{JSq4j*Mkn3zhxMc4ZTrzVzgkTUG5hQiJN;UUr>^?Fsx)?iqlRIr!@BNuMFrEVT@3dZIE~I_G=0Ct{(Fh6pWXXm8q`BcHHGl zTeq$7(NyP(^_5suaBoqw>DOelG15w)=1S>H)f6A+U!x+}Fg06OI1bU9cR3Js(I2GJ zw4>Jl3{oU&Ax$0v`}S9hVGTXWIQO)yT=P`Ed+Wrt^+iKe)Vk}^|b7>7ke^4RqR1; zlJ#Gd2+)~dH@PUJJ;6csA<)Xh%VY}ujGN|D;&6tvXf~ZD3-nq*Qu-+AmvkDHYEJfN z%Eemrd`34nhefN`0W$8>9j1+prnTM^P3p#fxNLr=vUPEdguj{pg5S~&`JwdZ>gG+n zrZRtI=T=XLp8Aj4@>SNc{Fp|ZOLQ*k-B0#j0zV<5`TvUm?~!eosJZ5}V~BQ26i4wX zX?@$*A^3U>=N#r8CPwnt0=M@J!CRa1{pYPG$J~0D*Ag5oIs(_Z4|UQ&dVb(v?3==% z06)K~nfsIVvyqjNmFI)&+l7^t5w3rwt_c)5r&y+!f&TATE1v`Vdw%{?@HdO0?zeY1 zwgx6`D0Ve^ABc)>biW@B%zO^2obi!(d->lW?`zM+R?pXC3e&)Vz?bz-S*9O%6mPFc z8?UdMVQz~57v!b*cVNBM^YG(uagbU5zoVJ=K>zeyiSEFco0Eg}*NMAl?%aR=-S5u} zuDRr&&yEsqpYPuufB%`%`0_b7=c4;(VEIJrd)@P&cO+S^=>D(*V-_KTKlloqEY%q} z2N;w$kCNe4p0wC=AlcnfK6h*^p%$g#Xtoyduj?=ctdg4Ix3XpTHJH50i@>v4Q`X6O ze}1alXL{@iyLRFte_HGSz1@rGr7u&e)wH{bhG~6la>$Be)Dz}#=<<6 ziB1FnHnO=8Q&198tFWIWZo=TFFk7c`fvM+IVSm<)ckXNcIx^yOBR=VepIDXCiE-w9 zq{zCMypS(B>qIO@tHc+q<4x5xMc6(FkS+TOz42d6E{BF0fAxMdFH1q$9MGxMDc3;d z1w3!qlXPjSOdm`-q?fDx7*l(q){)j$(Ox!iXZ3e+b4qP?CLJ$}!N}n)*nz*|`W?Iy0Yf-=MXYXQ6Xl&7Lhp0d5X=n0+o? zlSnkoJVPIQiqkJ;+r7~7N|{YV3@1naxX{bp1Q1G`vZ+NAnGw6LS8q~go#+YO32aJA zBYbpI&CMd?1##CT*cEza?X-s^pR#Gu4?VCub6 zq_k)~wfu%^WOxS22W}v<m+v;v!zV!onT)cD+Hho&(=#>(LPA-z)EsjT{WqFq8g1_%K9C}V-r$E=It=p&zioMPnucY z35=`nuc-ub=f~z*J)op3pAA1T2~-qk`_djJhMUKJiOTvcPm;G0U+Z8!dxi0=r{@se z0|gx~xQgzPc}0=U3EyIz2Y_7itln($aYDy=+n!GjoI=b~&&Pi^Yt{IeW*2M<-O89$ zGaCgsDs;@n(!XVewsxL`ypmj-ZXBBQ{J-Q4+RJflF-b1wiuH;YiA9Eh z74egEnRrpFb+EDq%^hwfIavQXiGk^di}0Rj=z6dr1=^kaf13JeLbsY`c#hl@x#@sI zrKO>joM(fK#BEK;KiNcd^bN|b&4d8R)c#)vONK{(aFE*)8;t`8$Em-!;NYR4HR=jC zIp(2Dj#IozgwfE`?4RsAQ1BPatqb8)Qq=ezR_zd-lIq(%mft(%;p8CT^~2j}f%!-z zt0uY0jA-QNvy3Fq&Yg`yT7J7rh#t)r;5rkMn471LZe^j!-eE@9_%_UO`bbVht68oV5PRjEoj z?eWKY-Ef7oc-dl>M)W9C40%XJVbF50reDh}rD>~G)pv!xb}q-`e%7R)!i|n*8}o?2 zeZG)cPcQ3Wa!b~^^J+iDS(FQSKjpUzSJ8Tg69*$U`4juoE$%$=g@i^~ZARLaUq@Qx z8nPnAWK(g3Nk>o8eTaxxmBzzhgsV<| zN)z{m2a`-C&#ZDAZOV5hE9ZvlvM8x47!7RH z;kJ0G{^~;) z$|_@AZr&MguqvUcakB@JwK%S6bh+i4AJar`$Mx_hbH%7put^97X3&3Frp8r5rPkt& zjv#0rzV+3-WHX7hd&n#+yLAcXFZYh!3PWXaogo*#Nuk8Vv>(B7RrZ4jIb{u|nQ9IB z79$@UdBtuWAn7&t#q+h)C?s7pp2CFLcc`y16LC=nmwU`mqWlM#$} z3+)zLF`}fA2{H|`=pOLVeD={PP$Pz{jJLN@)Q_%bhi#V&Vc%uXIE(iqnJ}UqPnYDS zh-p&&SoXYdr@YbM7(ycKA=eMpsiyBnuMdF%Sm82xXQ2Xjk$>=VwTGjbhfR)7=EJ{M%Cj z(4$C{KCsVk%3>As2S)4&zKd_QA1Mj~y-OEcSb&;B4E~IgRey~?AF|hKNVsVu>|j3| zms1uBg3Z<0bzTJsq)>krdGO@G>nz>DD&t*oFwSNvc=rckQpo^5N;)byFbyMJc($i+F`o-)$Xu!SMs7{U)*+_l_p zXLgC_P4Ms{OuYu=ln1S)@z3|O^_5LSUtDQXCyhnM$3B)BN!j<}$_{`c;Z#6jN<|-A z2AkXulX^#{;Uh~;=jqzbU@k|K^4XZl%YV($&P%f=i3+D!6AaeIO16Y|SQ+T{>a)V8 zP!()d&cwm;vh4%Vux#P_lHERRdkR&3?jR@Xa|9rhP^TE1e{~L*oB#WO9mNwXOV^eY z$VNKI!WJqgA-Dq?a%&>R=3l2=W2&Le#EK(CWYmddB-6V?sJ$?os-{8Kp;DvNl@rmo z+}z!f(Z>@u9Ci$duU0s(&HHMxImKMYzie?WzY*A>*d@F0ViKFIWBWHuG?cF6v z_nqIPS6OEv&Q5YX2$`}*0YEwAIVj8ciN%=^Upvf6U!}zH?A4i4Z|$aMGh3yGPRT{K z75L`!JDAe03ggM=U1fHM1n)90Q>H$oLYgWB;f9N*|DW3;eQ5X_;gLBnSI&4DfpYTJ&0Kua_=zk%%kb-I1p~ZzL~&k6D9HmJaC&)6 zx2Xe-kD~1a8Zd_#vj=ZCNM#;Z11oyn~UT0AHruh zL&;$2nvcZqJc|=F)%+15sfWTKWg=?A1?S99F(qdk%`Q|A;DeNPY=Ohf-3*ZruMG}{ ziu#5Wukp20%^qNRh>l$ zolD@)K)Cdz9J+^>mT-TabeAy?PRHKI`k+HNdva}_m^$nV)A zNg^laCy~Kolc;6mkNK;C&6A#r{hi9r>b!4zJWYX>el1e^c$!-x%Zj(x0RqE zxDT&CbN|V^#f*}3=Fgcm{z(eKi!_U-2r2nZd?C<)4_SKh<&Dv)ev@2J96INBoZfW_ z+)#l1J0uwtk~w4$_xZSd;V$WewGCPdib7ct3iubh49;)7o|Uo{0}QrNwW*WLd09pP z13HM^JZOx@OdsFUWjhdSC9|GbB9U31pS?0^Z2#mY->fb!xL`9Jh3fa#IwWl;wx0OD zbo~qSpeUnV+UGf+(4Y^@Sa;k3BxTZRqfYN$@NWqYW$Vb*Wi!|8t{-w|JyBexxv0j( zE&t zAk`X?r;=QlPohTevI;uG{^#(1js0LaRpn>V$`_Ycpwaxfu?(9J*v`fQMCG#%xcezry!a!VF>=xQ4Ao-6sA zo5uYo3F{0Y4nrzp$}2O0{-o!yMHyz3ubfw&hRnYn5d=Ye#UKwNF8t&SMImp}{}l$9 zhJBhnOwyKA2vKt4=REhZpo6z*0CAsk;nSQ!Q+R(v5-Chxy=aP`n0?LIw#AOpFe1PS zmRX68x;^`L?W~CO*ozDziihW{U`#V$JqM($X5ZVjtIXa=V(3cf1l0_s&Ok43-#PS@ zVK~2ExFaqigfTa6$gYD>Jz@D5(rWFdggC(^T`*Y_$$@9lZ#VC#`!P*2J7@LJDIHoB z=H!KE%2<+UPFki|Msqi)`R2n@(e#gdqc^@8z4yLfVnlTb@HS`hIyCW{?XEK|qnvcq@M({@l#-cpen7VgEumBotmwyhZC zjF@jU%+^)%`eUYCJj^Ftvl*@O(WOnC(wy6jG&P>hEAM?7iokD;qqYn86<{w#RcZ${ zbpSG@>bQ_KN349;>#)UfnKqZVAFKRsx_G{Y(msn3L6gx^!NPt zOB*q@4E9JJEWoer`Tf{>8pF`4AZ>+_g==1pYe%D8^raA+T4RuvbFu8p-;Iw%5&V?c z0GHU;cQ>`nWd<3fJ^j+AtOh-C@WxNb>oL72G6cplFy+TktUZjUyEsyRon{{0 z!41xK2StsG*;S$?^*8h<#&tomm1r2`+kk1FW!aRgKk$Wk)^I{KvaC|~3?ZuXa}s;2 z8l`ai=Zo&r$Yk_hfK}5|e^J@gUJwD2`rvLyOg;S47>u1`w&`LoLz2+4F=N3loaiuh zw5W2?Cna`9=!#+TiijEgGqFPDTK-iw)Dt|?N`n{JKM#BAxD62Vnqoy z`TJP|A&ME31Qv)fr0+;20})48FyKUHjo2VIUu0I$pZ`;nUj5Zh_}xFUF%r05IV%{C z+4`qX!=EZK(JAN0j|6DAS2|!NU}wJ#0CjKF1-9949LJJcz4L^5DHTffpV*nRo9y_( zTB~YsVD6@JO!6F&4PIpmFE^N>t7oe#^Rn%_`a_iOf7~h=A#H$v@(pLxoPj)^Ajx?3 z%$kL-ID%AEs<-qPPMq~x_EuT2B5x$9D-tnDfiXL`@XV<6w4Wg1O4Pd|sBKA`C z+-+h4AMuKf70v^67Fiiv6sua#ndLF;ygwO}f4RYArUdf2qaALa5|JF(A}=H*O8Wvs z1cSpTtm?%r|DbDIVd}a_*|GTWojDc=YZkey)1jD5Xg<1UNjII}?_32?u<$)O2j59J z=5l#*WtGe|O(oxRUrzeXhl1oh^X0dgBr=t@@C1;O0$UE zcs6_6;P6^k*2wr8Vs+S$QCSGyw0FB;9OB;^S=YFo`Gsx*lzPDgHiDUV&T&j)~n2(Ngq{?nknvS`(yIX!=DN*ur*Tp2p~ zhcy|}x%@B?;U$c1^FH83mOM%k$wavz*#&s>zIA@dqa#f2WNAlmBz~k94uMHZo52Kr9Rns=?zzde4dA7oiT0z9y4VKj z^+c;vDVpMxGXyz))I?!`po_w#a+aRrcoWnuT8pZA0;F!3-PQqA6Ps1I^URxJOVF{YB-o?D%9N+k`6vjcie{L4ll?u0BG+x#AD|&isZJ| zaN@(@@>bGP{;|~Qg3@x`+ZKWvbi0)Sl(9WR?!k@pzQqdtvw$0jv?@7;{$9nlKzi>9 zIuIzS(19CSq>_1oE;1V=4!|@LRvV25hk<3=L`SQ)c@31vNual zj{DQ5&KOL6?tvIHmq@vEH|MD*xnK5%uY{NKb?njY3Y`=V95lrvqNs#{HL1V6)4WxJ)Z~|N7u@(XFVKC$Bc}k| zXgJ~5Szq`a^Af@YR*udob2xNm9uLCR^oesgaIl~BMF7L#c3`j($+AWh2T^Ad*NxCO zL-b02>U9aAcjg`3RA6tyB$hibPe-X1DLJ%W!wY*N8CA}NxXIn4FcQdI(y+xbAsTph z+-S1zad^)BM{rGke9zL1@I~lk)R6u`RG+>~^d4+XOZVzwOwYw!3#cb$$i>rn{Dq;9 zu}_lJsJ{X$m@^xx%-}x&o$|>fpovyIfBmV(>i#Lb8wS-t!OffZP;caRmW&Y%>BrD< zc&iN7PORZUj&i4Nk03=w4ZE_#nSkYgGj^1IOt-p){5fWoMw8u+Dd&Na*vHCnE=74i zwGce8rM(O2HAni1`l}j7So$qjbs6WuL4Lq=c1-aJ*S}?tqObC6U*WErRF{mvG~@-> zlgOQ8scZv9m@wMn$*JS#P{ns^Y6JEHgLJQYE}`R&*|)f#+C2C&K6$=^Vrq7*qg^2r zANSyg2N6-628Rb$8SH^G29OsWbf_QJdUfEORep)7{a}Du1#)Y>IV+YL;{C7f+Q}Sq zB*~4h?-@==gLpYw0R@WS#<_z0wlyo1of;S7i0$zTuLaNJ1>vWrt=*;DHb@f6Yh(-7 zVxWY+&x;#v$gcet%fobQ&@I`4o5&m$jaLr9minK%sj2fMp++HfHT+!9PN+fKP_6tf zU~Rn|H~dj*HeC_AUMbi3ei~NuW`ATcI`Dt^V)sW+iOSQ`_=p~>(mt?@$HD?4b?}H5 z^3jlJSO*n!?|-WR>E-wA3wV;ivJZyn>~yR^iT2V>8v86o>1etBocmdyd&mEVowC5H zjPf{aN#o2&h7@gx&W}9~ryn2eSxr_pEvr0cZ-n2jY30|Oba?ZNVAwPfrtQ%{p;ZDc z=D$%}e>`a*L{h&9sZNP4%B5Nuz{C2`09W$+`+e7c;<%}!YA@CYxn!>Z1phI#{%!>A z_btMwRK95e=%^!0q5ejP>-0x{hmQ~NT8Zl>t7*{<($e(naYImr@{DPe86NgYW}w23 zR_BSSC$M!a9%4-HG0XBiQKf|%q2=*b4zl!UEY1F^Z3?4V(cTc$Lw19aKw(^^NHBZs zoYECruLRDk*I+#-B@!4fl#O18qvpQF0{ZE+M)4jZvT;@LU0(2l++@ex2adK+sv}9Y zo|Z@zJV}GpP}2-1GY_icU`!J_D5bQn_3$}srcV7ijP>85n08-T`8M?gF+Z7|3j}az zzLGX!s5#j$uh2p{*LL9pdFnM=z9#1?&m5i`;CM`Ff6zm!H|L&jj?B(2!(RsQcl*GM zC>IgOB4rY;tUvDC3pSXA({$039)RN{z7)9k##PqK`1{$}kpIV&K27qeRJSY(?z}Tb;X9T)lwVdc_W{D$R!(3U9u3t=ojN;<(u(Yowg z8u9M`red%g>{AtMn;rd4ymZd|iHTWHJ+LU05GV`NA{QOSkOSoY&V?!l#mEj;Co5tS zM&rad(NLQ~V%pbDBQT(ob-AC*bjOPxFm%=KXkBp+J2rKtJMH8cQ}9zI3`3XDsKPzE zh$m@P^RMoOWLiGlU53+;GMpCJMmUU3rk6q2drv^dmRbuvH>GBi{y2Y?{@A_4O|K@8 zV~j0())aP$gzu9uE=qd+3>KrPW{Kxr{$-|^7Li~F#A_=b_FyG00J<45rVBlL(xqWe zT`9pSpRHoytUjb=Gj=6%8-7lCq0oXbpeMy^#C=5;aCNE9dsDQOou+MKw_GUZNiyh! zGP;fn%2B~NxH{+;gi{JW!$5VWvcN?4dITVz zp^;J&y8{eqm+Sn7@UklG^E8=r=U#f$lj+uO`x^Z4el+wX!7{1>|Nq5!k4ZP6S-v){ z|Ci-UT_PLvt;<0(j|}KMYm?C|rKD>MGs076i#pkJ>E7Vy+BmCc_zchKf9XpHE!I8v zUsU($=IQz5>}(HmeX_n6#qjO|{ge77#oOP#TnV@Ce+s@=8^z2&%CnNa66R8;$jO=K zzjS|npNaDM9Q1J1dHGxH2!VEO9 z`+7S93haKreR)_!klG=iH!kShAmC z{5~*TWRtTQ-dzRK{Eq3ftwArmI*<~zsWsGN5sq9VtZv*l$h5esCM+js8s=3gx9dk7 zGi4)`z#^ZcUTNMC7)m7Ja$r%2f#&G8q$3|#dR?rM`09PZa~5h<;~K9fT#5%4-j6ys zSAC>5*FwfjWTqDO8Zzl*k#QZW^DZI;5p+FFs+F|pMTM|k^?4ultI#^fm=kbKi}Hjz z5EuXbR>R#b6hFJOMtoFv+__X_Iw;uGv}&zW*{A%6W$sS z+U4`4vjsi8YuuYt-!%!Ox}Ry4E*71!k!d(Wav>eb4#jc4kbOMA97lYK+8X@BAqUhb zFozaGFRl&wfL8c;y0{hNa5tCveUEMuGWKWtrPSd`D#rn_^O?yjY~Te@3Vx>E!MrE@`2 zx{(HHQ4#5GknWO_MpAz7v;M!nANQJT=9xJ)_nCXif?4^q%YAyukp%DSQ{HqV7)3ASy`F?&htas4&Y4c< zFP1?6>_3jDTRZHc2!JqAH3t6lwG%jrH|OXSX5=Qg4$##({XXw#5Z%{fCR%}8jGsd( zT9yemI!$yPTNQ^jc9iQcgVY|z4Jlb(6m>_69zi6012Tt6RT+mEm4fMfgYZckQ7z&A zc4i&Bw@D1PToHT%l2F%dzTNO%z>JFO!eeZE`JLX8~`|kzht44q!3c zZ-AIsOy%FL{6(5_TB4HtY>xEPhb0O52kDh!wS6(2503>TR+&84JBvZ-JNp24*!GZ^ z9?mwAG?ouWd)QSp$WVnFe9L2YmL&m%82TxN{QA^nJpcGe-R8@ckGcDvpHYIUJO>V} zgogb98_>roj^||E$rKAN?UBPQo{IKUmfz-n0L1f}KDt!txCiaO1xKLHN;U9D@&u}~ zk@j%YnNkq2bQ-dL-kz}PZY8Enl4N@&mk@od+VIA|AJDRNa|^?63@AA9Ww}f26K)Q; zo^M7ogdGXIH5yIeu^dE>BsGUDWNPVUn!+cq zz+yn;0CTLg%q=uG~stX6^h8`qG!U@L8iTLDf81X|&Pz z)y{ZT^*Rmob_tX&lwn-+8W2NvWkfp^7g@B-lkH z(=@*c`R1NIdR)49(6R!=2}(B3tIM7BtsC9Xco8L`Yzp&4&q?Hn^t3&F6AcGkp?!Dm zS2XM}o54~#+5L$D+R%eGnaN$>^yf>rEq*0)x7fv>f=ada0qKW92 zQJJ$Efl5+W>S`IMz2^96t(}TL()P`=oGRrLOL5730azQI!W~Efq;eG~5>J~WBo*^@ z%%FEm-}8#(0$ZaikcGslRS>X>6DCn8Sx;}x15$UXb#Z%JYSbx+MP@eG21tHOBB2aY z{JtI{%i-1=i(seI(Ae{0g?}>2D?NgL+XfXih+z7)Was7qPv?eshymW~p4l*po1V<1 zzb<7RQI7;tY#Ox}Zj|?)dC3`bDt$Z~P|;k0sW2Ej`A}i3p!JyFpQ-Ej*xGk;8tduk zPQl_jr9RHWbusH#cCn4RIFpv^j`qGuMF^84(u{86C`?XxkAwXXQ?&}@jkK^m$9R8U}hB=fw39r{4{>#u7 zz%jVVVtf(X8K1NRbGH!jX+ENjL`J*q`2Ehl_$`~=kjsU}*cqzriGAF_g|Pi3uoBS5 zw&W?3UK74s00l|Onn$zX@`O{8;YyKVqxaS#eI%N&{7Kd;)8BCKvd3}Q^>jD-3g%0O zbjcH<+;R8QLEpdV@K82l9GS#B*TfV;TZ~7evdBM0WbsAqG_pR=?_&iruCTH;T zPQPm^_!coZ^5r}@lRVb&2(TrmhQM5nNDEaNrN;0-g!z=_f>fOyGYrQO4TG*)wI!Ft}!Qr2<~-bBJ;I)OmB2+29~&pIIqDw zVx0w&?%F2M2A&`V_30+W<~L3Xjihk1^s`gP;bAAoV>*Ux(f=sEFa#b#gXKWBO9PtV)A5Q7+T|Hs6#w#H8;tOJ#@6b z7HE_$y0z^zDL}ssl_ls@;_|JQYJ|Fe4(MzQH^MqB)L`;oVoB(J6%<+XJ)lQricoW^ z(s^_1>OeTpr~S%~L8;UlVNAHmj+T~o79+%>#wI!Z?nmpaHgFN_C-O3XopP8Lc4=`1RC8!Xf)b29k7 z@R)uOFGf})82t`oNNsd`&bn1~_T!TVFlmtcsV3ij8z(`A7GWg{y>I|`yZ*FX!AFfz zENvD&L2>FBWO0Ug?UVQprSsLP5F&eQl}w#RlMJjaxSXjmY`;URQBQRw>qHxMe1^Z4 zsiF|D*Du4(re(?Rq9Xdj)cjbe0vavm zhI$4@-u{zQzNW38l*_02f8mR^I6^LQXg{u#rRo*b*TFXY`XU^~`+pYKqbtURILd^u zVs2t!;z1zn?Sx>=(rV4YjH%5+RFOOk!n>Wx*#DL8HsEtGbA@E)Q7m3+A+b z>qzf_w3LG}4fOX>p?LR{$4VF{0X-T0cm74)l^JQY{SKQ8JqVPI#yD9mbf1fHe`nK1 z`^?T2%BUVgd#rqKwK<+Gp1!DpudC=>FE172Mpkx*6~ilRnm`Jmw_SI> z^j5s0I2USpB7F*5y;U#nb>8r&gzIuT{$*~}qPZmEWTmnh2+faWoAjN3IJ`6+uKeA^>c6szUg1r`?^R`b<*VeJxX*>@^;692 z+yKvK@-)~~4q7Ip@7b*F`VaT}?~&X@jh7fiPDB3$xz5&|$dV>0>5t+)RF2aBGN!-J z6Lsu5)~s~{KC;$VFCxCx5?oeMoWcSWOM$=UNM6W9)gPs$vsKrfE^$TB+na_E&D2@2 zok|4habq@*6G~pZunpo*sU@@Jk)OJwZ(t}U(uk6y!ec4YYBIMq?gTWzRMT(LF^XXA z|HG;0%?dju{dy-LNwCMJq;SEvm2E>snfMeN98rr11Ivr;;%}Q^NC7{oQkq5 z-GuI8&AO&=x2Fiuv<3mUd|MfLZ`YWm-MB9d?XNMt7!CSkwOLX{j-nh%8Uq^8`rgx* z+Np=GF7}C-R9V!%{vR5e{n6-+bw4YB#j4<;9?$)*1B*(i1i@grX&b&?2Zlr+2+yTo zU8&p&!>N^?mPxh&uX1N4*T8HTTCVZ&QFbdPZ(VpqKKTd(n#Bj!WVsjYgX{?@&&m*< znt3$@0uuu=*UWU+j*YxfC%UEY!uD`$W4pN^l2CiZL?^v@Gb)~S+&u?!UqdEVfx1Vn@ZcrFt((MGl=?Mq#$jCnoBq8M4 zr@}pV4xAsht&V(R{NhI{fzpf+kK?==VJP3(eARD(2OwVj7Nu5}NTyxG_l+e8n|~rJ zV4Dkn8FQHlgc`BZq+fzmTV;`SkipRT3`TIo?upH7)EoqALsOjpNP73PyL$o$_=*yD z#>N|0-}dXxH2VG%cyN7$9mHX^SeQkNrvun@W^Df=z0 z5{=1YwIS}sp7Iw*{5Qltl%jI!{i*;WPx@QLi@L>nMy<+iT@vBX>}%5C8aZ*+`U3#n zM=+k0EcIy{wQc-b(2Qj2qugt{!xB67W$B$^MIQjhrb$!bBE_&_UZ5ym{1lADwD|mU zI*GmT98kKz2*JASBKS?oWEMYSI=3XR2%0ozh+F6K8{roL$(pC0eg z04|4q?6c$=4Y+bz7N6`1;!s1_y<HIh8Vs2h3*BtElY4!NGhyKYf+m=2z7inVAAIn;R5O94~p?v)n7{3#Yq zOO7y@=<=t5H9`TiAjS9jmGf*~gkz>7hTVX%!A>=onU=nUMt+a|2=OK&5jxwd0e)e+ z8XrVJz9qUE*;%L|r{B>a4+ynwpS~^dnuQxs~ zXa9h0fh7^YPkWSmudTY}FhLTag61O;`mJ0s+M-om(EZvL#3aCneCtD0Nc!ht_+lS4 z-+~uTG=f%WI7J&G#UPbiJJ=}kLiXqnfH68=A@u)FtO_-4Q25LC#BX(4Mz+bjsaLfu z@K5!ny?64ln#WHZPmwDqUm z0F%%V7}^x%xHv5AE@AzpmC8UA0coaZEX0NBCWp zMsm@D>S8%@S%f$a3YfaJIa48m6nQOpKx|0vOxB8?@rRPz2R-zMaYY8UDpO7!{_jSAJ65x%$<3SNXW7pNlL_us)vh4CAp_BGXk9hvK5)M z#pyQt;lE1@0=PHG4HyfU*C@}7H$RsFcyc1kJoIJrsDI@pMr3uDAj)C1WL9CqhB|%7 z(Yq2*e%`W1Z`8L-oIe)`)qbjbtiyBVSBn79OUF@g!e(&rX}-fnt7t8O7= zAa1ZA>gwPu!?Q&!5Nv?d zSS@^T#9VuYxSTpW!EN((>JMxmM@)JpV_;ld;dfvaP-F6wx+kVTTG+W`+XXULvp8r( z&Da|dVRm=Bcuy_XJ~G>WNNPzq>~R35|OdBDq30 z$U)k(cPLvIZ^+-M6X)hA!UEFZO)x@NyAS1ML{br3We3DyP&;$Gbo>E~?uf>MEsT18 zlI(loa{S8m-_F#}(L0(N>JCL4?O(nZzMP93OZpsIs&MbZeXmV|tk-uPn@R8`A1f16 zf$V|W$84tWpW~~Gi~mfWkwSBk z8@HRQ3;bt9UAKWs^e!?q`ze7jG9S?fTBo&#bN$a}{fj#J{wN-r2&^{6`{XoqkM@>X zewbFuHYE4~=iK)Z<58_B#u*UtFpL&|{5NHf!kj|#Gs5TMXDi|C(uv0WS92kmnd%;9(btg6$;KJ^;_W3e4LFR zDOu1njagz~32U0hq?s>wtZ!(L^tacqe?$KPV{*uT7*bNz==!=S;Lp2$rwHW~R|R77 zxMB%NSgBFPdPD`JadDZ*#1_Ms#nG6DS=?;^j0>DcVQ`Rhxe(58(I2C%21sDy+P%V2 z{@gU_q>XOo-l@sb=zOxa^ifRG6z7qH9ZDJ!Zri=sYBcf3ujuE#q%EV&!Iq;>eZlZK zESBCFjj8)r1fmk$d$@%?iJM$!qowD%M`S;SH_V_T^2K!o=x}Pj36%yMWDIA`p?#_n z$+NZa^_AUpYUxWgjPe>E@pbq{ejOnbqJ`wpx_zq8z z@q+e!AY@`310+JG$73q{$Sg}pV!6y3{Q6xfsPYjn#wns9UyH?^aEq3)D||09rdF?Z z1_%=W-Tr*Q*EHYk{r`y0Xn^SK_9**;8#y^qy4ygel#&`e!XV3!k*d^`CMCiYKZ3K_ ziu;+ht0ScPwf4N)XIZr11{)Cy%V(vxN*}B`A7*c!Kgs-ekDWRC^ye2PBqtFYJOFJe|jZDD;@IKDz*0a?r`hNc$YKD&JSJ>IE|bXqgfW;MutQCG|W|V-zcDeiCN598{4P1iHo3CxEt8A?ij6)hVeyX{sO9 zNNGqb>?7rE^l?IXm8(_aQ+&o59S*}*K&fV*>}C=me#0~({X?|!Fe)!~mzE{L%xe2P z3>q;u@yN(I;eNIR(7h@oJm|f+daC#mu_M_*N?B{N`E?7satJS4;k{ilWpVac(E=oGmB$>VO=i<>z#(yJoAYh@n*&hz)vio>$> zF!Q4*O*m&lC5H8(qY)jRKrbgYfSuKSayhoddMIvV%Rq1M4gNsoyI2Rlr0+X7l`0MP z$zu|>t$;e0p^0&*Mu_yAU#`3{xp>NCcl-pU|X5$tptQB(Y^>Tw{05jt{yb{jmVY6GRN{CaD<4QHcK|D`2RMnAbW3`r;nn4K$HW z!K$?Ivm(=qi+4eG{-^=o0=!w69`P3ivc6)(Url114owkWx_PtV6H*|9 zOynimj>xE38~QC!l@pN~vbNs}gNc(gApr9?W=mvP(%jO=RDJGBpS>*?H;vkRv1Xep z6A41wSXbeKd@l?6+hUo{Ei<*U}e#_yr^biopA&+aT2No?tL#AYkOWbt3@vQiK@3q4nua`AF! zHfKsalKyT3RQ9P^O-3Jaq~V(vpNFup5v9y*Z*<*mhfOf9rz|;#e2u{1{K%GOqlMaS zi_M+VN0y{PI3v9tNnk9`smo)_roxb1>H7NGd=Sb0-~2Tl=V1@#;}~-18;U=>KIe)5 zsn5C*)LHZpF~tzfUoul0m+(h+qWgK$7CkW2m;0)0-FjDq)v^Q5b+&R`V#vZQMr(;D zW1WPb(m4g>Q@o8~@DC!}45kKN6C#+a$`LVs4ev#|!b5iL7k-a9h)=Ivpej}FXP(b= z+Q52Hmle=BnWRo6V#x`x@iG3yk<$UoR7Z(kP@H{g{co#g4g+L1`oNg?V;(c*8y!K- z(O|L5_n)%|x}Y>`!cLXBQ~lUsm)WQWL7x0M=}BI>s_1X%pFy6Y>nJq-`Z#|HplnSf z2I5gT`X&8k3FSvRl;d@ynRHd@Tb8zoEe&cY7-r4(&7<}W!Jqq1f+?ZfP)QYV%x@Oh33~A zOdq3U562Rh`Iu-h8EuXgSPtv51`5*Uuj;=|54HeQ{xDdt8+2ZQTE6zSrf55S4^dP8 zXI5^#5H~;rlj(FhgbAeawA-c-&5y?>R)oDEFE{z@QI9nP=)U}K^1j}ud4dVAK7A7x zg|{6fJ&{yo_P0PSM1ao4t&HR4GS-h?qwx6_yCZM*;&-IZ-*OOkShRqvvJfmp;N|aD80P)|TEAmnipfrZY`H6oOEnSFih`^&Nc1+M>RSk$M15zXTv_hM zq+a(VVy*UlN&L#shGV=Sd)PS&KEotQcw+4L!ZctkKtD-VjepaP#_ZfjY8>#v(lhl4 zaJDrR=Qhd|P9#ntr`+g1EU*?4()iU+7GbH9+(5zEp~>m-6qiS7{!71Qc-@UvxUS?qTy#J5cV>$E#z6Ls8!;- z!1D4z6Ww7^%!XR%!B1^%4G(rNBQMcHmUk@ZnqogDj#$r)Ojcrr2^V_hB{1y0cAB}fPB!Z^-Y!?z z!Oxr=P*?lcXvryP!jyM?#QZXp?LDW?ap&6B(@&DR{=2s&pfP(2_5Rz7-r1BBI=9H# zN22l-&_JNFAx4YXUeZ~s&i&=r`Hs5{`xjH7@E(J(qgQn`;nf6AH-TYVyB!rC4m-qP zy{*qw$)Ue+MiNMCDO=%XHslZy0H+sz_}tGURiHCY(b{USj`vdXR@wwuBUtsty0vI>=)OPQe2?t({$ydtUrn!Hu1I86MB(=`=#($h|A?mYsn)&57#+W?G zMIp+`-WDRGi^G9nm^a(_i&BSLZhw0^>KBfG*5p?aXRNRw=KhH%Iw;@N-KkvKfamDP zn7T06S9Ztwz#4s)TTfv*`XF$`!B;hI{zXwbIPLj8@9F2)=? zJK5pU>*tP<#cwJooveDfw-Z6$_BGQs#u(REVuvLXl(g4@S=XczW61dF8OJ%Fo4lx$ z@oloa|0833kOYH{H%qAkG_#Tge#SXAt8{AwY%_%UP5v|4R4Awah-3}przTy_(?8!+ z>7Fh+SI<@k7RoqLj^?OHdB1fK{O*56CNpbWaZTzas;Q1CKq+Tzj4@Xw=Cb=ci{Jx8 zE|RE4b|bkD;S*k<4a>5SEo4NSq*UnQWzI{6K`5kGHhva#JN0$gZBQKf_rIk|E1t94 zc*HuRjp4A}d_+Usaqr$*8n}T1qq4ILkA58fiz!%HwJ8`P%9*=oc7&l*+nc`*B-LEY z5Z$fI-P1^9$y9hrYc4r@U@fosxL8f7yfr<$=1U1UP_%M{=45WJOUusY)!*BE6-gTjOj zaS97DKW*D(#tI=IYBy(uCLX??T!M~7 zseVPm-~@;PBzPOfib>|!9Q~_?j{l@rjA84`_w)S27LIZ#3B0qJbp7oOJDF%gA@PeRo;Gm&|KSllOzUB0p zsPnB~y~%QlHF6E-be(^jI=fq`)H_|c3M|c55B7GPVj5WyU9wwC>=@hwG$h-m;Rc+m zElP6~{!8Rwf%4CCWR;;En#K=?S(`r8*?;EkGx&*3wBL!9?=i2z+_c}fLf#=9;cYHF zB#GN&>=1T$X=6~7rJ`&Jd=F10w*B#j7mrm+1fm&q`iBcU6z6^T==^b=_f#M~ z-hjfJCM#Owetulk7t&??&M91VAWr;JGpyV8y8sE&EA`BQwXk!~_99yUFB(CM)YMFy z?eQHyG)v)&WhwM}+Ws`Vfuoys9rnvsL~rgWWl`4%RT%}CQ@sAEXd41d3X?_FQl3qk zJ^k*I(NP0p1NJIt1YNMkhkX?zE30D?)+o8@GNV=Z4=!K&=w?d19A6Ch^J&1+;=6TA zwGK@5b=!{_td5`l$UO*zYuQ48IgL=OY;$8H37#h#DU)zMNcBk=6*;vr=w!r2rj(CD zWw#lyU-tBNev&+$#J|GW2Vco{rkK^=5u?GxIH8lRYL(!<@>VB1r$MHhvWgq#5At=F zD*~~CfPJx2pZL%7`7a`RBkmItN?J@>EON9Co_)!|#oS7`&e@Q#7|^O}fp@}&5Qm-y z9BH?=c3Yqr2@Yb+fYT<>JGnf!m0YTLwIPH#QVS)1Jb|nf5nJp}{3%(%V%%t})Y}&_ zrc6)He+@MmUWzr^{vu;0Nuq}Y zO}Hx-aS+EzEZIXCo}WY#`m%RDXC`%nGozx@?v>p;>IR^GK-9XzadN+k6XOv6AjwAj zV(OMhp`LCSx0Nyh0>GKRL%DGb6e)5{j)3c{5XmwTlW*=Pzuo!);V)Gc^S2T38SKuh zS`cgapWm-2l7g5j}ElN{_lBj8@K|XoWniTh3i1YK*A{9e@T`gQUID zn)8jkb-Uw_C=I!ggwKXL1538Bjhf;|6y@;%1+WuG^}9h+QFEecL@l-R_0A%cx5Pz>_+g<5@Byi^t_=O`)op7)K1?djEiJ4 z%>Lcz1`2qyRRTSZ3doW=XW;JAo>IGs#u}TOh~#K;v9(&G>?By<*ud86{^)3e|+d}%e_=uk;V!i2V`BMB0dGOkhs^w%))3qR+$`7{7E-Cz!G9n0P+Ok&}Z@DpD$Hi>OX z(WIPY->`5HvrA-{6fNg5byzqhl?}^1NJJd=VKu3Bvvk2_0r-cgiI39qtpXBJdE<6h zr=osnd)nLntPxYdCtaK~`%N?+tjKstZ5-%WLh;OZ7Qkq>hNOwMG8u8ZZ6FjnY7)_8 zee3Fzxgl_wq<5i&r}{u(^oSw@--taVKz$Gx`1}{uO`+qKIGgaSu(z>1L+|~;rPkFsMkTpxXrbuI{!^TK77|(s+N>K`AnYc z7oT!ESw>uXe!S#zX&(|`_>DCiwF9inTnjr(Cc(EVk5+zB& zuIIj_SsdYwdg|G0n3n}yaVa#5&JoQXqJg%8A#}`KXua6H{w0N`-4t+4e|ev?x|UKw z@0?E?OwC7*%~U_3xQa0D#z&@L&#<=(WR2#O!ENUY-*{jrNHnvHFVZq!nN%|~nkvDE z4wnjOAU!hrHa76SOukhK(<7ZK4<~FHzWd4m7-eh_k2{R*B@cevctg~5^;&?r)sQ!g zymCa*#~jvd&wC!L!?+rCaZZkw8xa$@5{mD6qG`aQ=g%=pLA)W3(cs!+@!(I5pMr__ z#x3m}Rxq%x2>)smmlIfG(>+$^qZPXO&8>> zC^l>dzJz-PFO#-E|4i{`C80m=Fd=@qsklomA7Me)4fZOPeQ6(rtQ0twR{d|C&_O+N z@YM*hF)0m+PspNJr&w*#3&8Ctgg!VYzv45-j9MW1p;DF*I*CQ~={xFLhh%Qa=_pQ@h0cVf%>Ur5TQVk!n$2U<@^9y*+gfUo9!5>G;H=P7>I# z(n}{L7!i{jf|)21z-SdHpZL90f&vowkefZW4B=Laqsys0Kfx!fMu8f6cIJ8WaH*Mf z`oB%5+lt}BJXlxTfx2D587 zhk@MMUdXnzoIj;W-_lif2opi&VI7mQEGm=Gsc(&kC>ZxI@Nn~vxPP&|yUFR)f-Fmy zdjd&#m&tNRvbVEqWD*GbVnF;Qo@`=qI+p5N&+;4glT4);Soco!_^UCaO|nzZqn5r{ zlxmakp_L@E4n$LuBb(rtI16B!^oU7I*Y8=SouM)2X~y=2h%%xZUi8{$*>(MFGP*GI zDZ1e-3$6kJv|b+GQn#M_$_4(%C&Uf4z79 zOCH8jv6LX|!H%w$PC&-nXpB3F5`JZ`lk{hy&8ij%j$${H)~1opl=0#5pcf5jaT{+o z)gw)1CMc#&V3ojOM3_-+CC{nBIn5G<4P}Czw;R`~ba45t+5fgSIdXJlV}!X}l**q` zTcQ|NyNj}=@2S5X8YlJ-0sA7RN60pB zClQ{&T@MkKVe#wV^x}wq`HiUmj!1@`37C=kB{;Aq`ZwRd>Kb&9WmD2dHlnv`G!1UG+h@8FT?W%DU7$R+EuZ8 z9NRDkOm+Z3*&c2|hP?dxK(dretw19}BJ)?T0cw%%vnp%bzsw|>7WT%=GEEn4M?%&8 zn(59tIZaXVBOG^^?arB^wg}11BCl8{i^)bvpwI_6=OSJRjQpq>QB>DrRKFd-&lohs z`3Q*#>7dgW%oi=4Y0r1~Hz#+8tOVbeZIN?G?n(p`>g5UwPI8|ebmWM8?N>%f)js+=vS6KE;hFmaKT2!a~D~)Q^}h9SlTXDrNj! z61)6eq>ME%2?WnTZnRq#<;a&RN=gNOcq*W{S~Ci@-g}L1bX~h< zqt(n`b&y&V{ztiMF!6ubLs&pnU6p}!;Z+MNb|7j97S&R05BZxE+Y>WGV9q%U9K9Q1 zNC}~Gf6hhY6?aXC3V82Li9{XYa_s-**yE1)iVE_`g4+36)$3T{0H@+`Jyf9*j?Bpl zF$8H=anQ3>+m})2P%OZeTFdsCuy<~J@OkaFg81+Ih+h%qkugXh37GpBzw+I z`&vyeOGgj|7*Wuly zfjeCzn|!G;Vw&cK&bd|uYxH@%k}~E8uTT*hO|FbK&H;eS zWeGDo;U+P#XEq#Us8R|NARb8{SmXx&I!;GCO}2ZRo>JY23x@EGR~BESol1b9$}K*H z9OWC-G%USa>W7~UCI8zrj zF3%m4OHkS}raodqw1h40oS#t<)}002)?DEQ-U$NFgcal3iL^8<>fKx9U806t@uL=6 zziG~B#zLwQ&pI@)+)t3hrKYPnQ(KOkuzyTVE`Q_0km#p$ zwaza1AXDK zaTFRl0s-BzSl{AHvS`mcM^3YKJ>+p>erK{>p}04^91lOpPfk(-(F`w+4>a?jm`&i! z^j;}G|12$$&Bk!TF<|$KenBed-IHtRYKqa4r&c6sMl1C*sgh3vH(*;-o$wktsrRqz zHz*g-HL`v_*)gp?vpXYaAvkhe`E_+ZL^Rl3T>S z9^TD{I&kv2W_}ns3WH3^DFp3FON;66QM2Y&OExtxcGyvN8*S~&bJolE!v;PJNCLeP zIE#DYlYRc7U2jTj8BCcso@YdGya4x>i$H1SA4ZWPojR(~>6)Zp3wkS(;2^d2q zr@_f&Ec;r?H`voG^x2_PSh^dvnlMj!92_2hd5U=gg;>zFkYE0%eau)v|J>X#~7QFiJ_-QlEq3Z8oR!+@kZspXMmpy)hQOLuUUehyEEO-*ziiAySyjPf*OM z7Volr5%3sQ&Y@hcAfjxeqb{FB!Lkqk(dLo=+L$os#j7KT14M@C}j6|4yW+7e5X5|HpsJC^ zrEWSQh$Y`$HN45?Ldlt6(uw?NbH*mgqd+D|m#Bj@gW13j!aZ2)jN=AccVVFjNH4+p zPP!?(Snbxf!^ZgR0WDHUh9$WK5#`-e-51UWVlng|AU$4eem~g;!$YMCHn3u4?bWO;mW^8w}Uk76e;{Gqxt@sp5Kg*bHsS>0LM|ecu z0X&Xye!ad=Qp8XD{0L9o=pt-bt8CS$;eTAa&%jUl9tDX|td3F$2!P=>L!nF0k?L<> z1EQmt+=ZcCkz?vOtIkncc(<5+LeDWk zgA!_a{#6(=ogAR?#VuhblomYhMn|zQ^3Uh#<~5kfR_9|Iz}}(}kk@195ri;m7F&^U?=1^b-Bcjry%SiT~(3K3 zDjAx7;5X*ST6@#t%%u$6>^l+X%pZv9Nldbc)rh5CDWr@UEcN?W#p%j}U&P9Nii2E% z;=L*wuYOAM!l*>^c>!=bAfZz@>utwDk0+ZIr(C*i+m~&0TR@oS#jX51K)V|GReaYj ztIX*+X(e^_A+CYl>N*dSQ_!b?#1LgYpfU>z%WY~ON@-8&b{m#Q^!xr@kM2KZ#ri;@ z8@-1_XwfZ>SF3O?B7#EzW=}T~u9xGOMA`*%jsbd3u+`kYS-ZNh4=gA^SlCuZP|_`p zZ;mcNz`scCRnf3B`Z7`dtyKUgo|a?w1LDcHP4~H(vly(u5=gGS>jT6@hE}br&j-Jh zLnhnVwWFy9N`!#C{!Wr|ZC$@C);8 zc7#to#N9!m-(0o4(Pa@MsL;(JO-Hh&lchqCEeQd?Y0UpF$|PcHB}qc@0wZA5PDX%u z+)gK+{*wU{A@~e}C_Br-R`C(uWTxZqtTEL9lNHWLT?}+Jg)t*5GgbJ7QRK{ladqpV9z4&G!LB7|R_-o$KN z7ZVrkT3D_IWo&M-Lc zFm>noM>V}qd9$N5g088**Dmx2{EzRDMH5&sB~=B-nG)Da1k@vXi1Ws+3b?>?ZJ+pM z=@TN_(mWN=6rCF(M+j*V26d)M2w?Arz&!!7GxAVL6|6z55>jhLH(UmubCV77T3Vn` zdB1EGGA@EG**ay{OaL|yZ(^S!WP|Q=mkCh6?V+R9=WWrGT_#!+cW8_a!blS7{hhT_`6I_-bOMFM6oAf3?w?TI^O4(nLafi?&2qAhc@#hJU8~QR z-stzAFC}U7U$CBky{AEEAFEf1U#@HU=sZ7Jz50(KX=GSe5`FJxqU*giW!pbcizX&k zj5?cju?n0f_+i1)xiKUnBUK*r31f-EpDG@1=k_JH$-?KjdkMHOCoilUJJ#){U*9D*F zf)-?8bJzdIACM9JU`Ax1^{rl2VR=)v3CQZi0d*R9FYD*NQ$cmXFW=}~Vn}HA>*~3Q zk3!M`*PIo}So=YNS-SsX&`3d)BzbPbp4sIZk*kX(yflM(8fOc_T6cKezJj-CMJrjs zk6gzIO`}%!%qo?>hZwxOf=si2ywymXuJ@hLD{u$h%+ox(|HXNIL1lHRQLU`sE5I{r zD$TfeRUYXc092|Ue5g`3!ubU=!O?tjhjfQqiJZ@U#LalNYZlv8uP#GVzN_j zeEKm(^I#*J)q^t9TRY9W7f1%7 zac(t%Kq>Sq$=O^eStMvf%3Jc4JN~I&v}P|zKZW^M0_pG)%yH-89J2l{8dmN%-+8a* z*jnUm5n)nPl0~HfmA7nU%<9Z;mP1UtXk2B!E>TOWUmfb$YeDOqgHA}MxFQ@|FDu6cNcdQP;hKWKybU~Pg`gGfDv7KM>y=N%D$ z{_?JW%%F2%Gf4RrZ4I9mLe}GA@&><<@x#ubqojcztU_*@OcZ~MC;ugZfWXjhM0{#; zxQF%@p)L{&1hPZeK{|&GREYuAY^s4tl4VLglk4&-qUxbHtck=fQ1C)2a1vKTPAwFk z%ieoDj~W!V_I;MhE~acL*V$^Wm-a|H5;(xVD{ZDkaTjg zvZP?y`}_Sa5k^3vqWHpA>&bV#xkD{5B3ek2DV8-7dMa-_a76Wdg$cLN1o@EuXK=>L z%-1o9iUlr7oj#5GkHXRd$Gb5j85qvtQavnmkKQn&_$^x0Vu zfmAr6)CZ~%A^3UcRosCz-ld5?nz2o#S@aYfV!{&V*5^YmP5+YO#Gy!2+TGSwMkT6i z#G&L|FyRvASaSq+uxU}pGBRaG5AUf{|0EKQk_T!Gc5&e`wb&~F+z@evpcX-_C3P#X z8Kz*&>Gm2(EtkD2&y7W9DlyK@yKoW_#= zhJ8p&8BS#M`^~Z^FlWIi(rc&={Z#%&H|p0Jzy8?%@2Q+$t?C|N|88Ia3jL8uMU2<6El)5z1zLu`cHfL)k}&Yt&@JVjybvx|1$f4hac z5QTZR>F^6$480IVi2b&86swc{t}7tZk`*#sMF}QZ>q$xFcQ)#|%-N%Pkumf(M*n@R z5iic@bPI>`0mChd9efopJL4@w@qyQAa}(&EBTk|A#vvu!>%K%i8y9I7ps?8^k^B1m zKb=xGR=@EnvNYTwx){hbJ>LGzEE~0foCqOqKI)BrM`RXhv1Zsqlzd<&=Ybzl(0urX z4c~u{dMOQzteI11AfJLK7Lb~rDUv*6TOSI^MW`xMPDS{-OvC>~y%sn7 zDuxi#C{SnySP==4P1eX3dCpt0*8U=$dbc3KSvVV}O%!wlAsR`15BVdr82&_G3cOB9 zsd9d43iX|5r7U8bK;jd~_X%5)Q+Y0HeKp5cI%fWjaoy==Bp*P9Fy??DxHP8aQ%^#o zLkUZCVWlwx?B~PIjV(9hKuQabS3OzDV>l_2>d=-DUmp!`k;bTYYZQ@x9Bcxx+<6NK zH@cM-K$pc+ou1GxM zz$Lp7XTDm8A?gB!M=Lp@j;19jMl{6En+W{-%8(MLG#O-Na`5M+G)bv+tS;QeSmHLB z=2Q9Cn-=pw-JdYO01UlUKc+B`C+@r@+gwVHVh9{pS;|>xDoQtPP5R?GiSnJGdt7qJ zl8$WhMP3SE9z~GANgcN(gPv{H^b<%Z_xmO&h1P*7-`D}hT7H-yDxu&sl{E|Fuh+qo zBQhGzYGj5Vnm{)|C6WxjEB5=l#RaKzA1Y`0?QQcQrDgzvAF!?$L5%uI$rFsOV~<$M zitXV|FH4c^*OfM7FFX+YeGvp_R&(0Z6=fYlQGdsn6W4D`<8kLIqXYOK!YAm=ctUky zc^OI>fp^K2YvxAzTP)^$|6N(COc&JhZZ=~Rr*@@S1$NJOcX|J$qS`(<{8Lj%8&Q;f zQzWsY7GKrw0$75HYz9$Kg8(?=e`W^6W3I0x8UXX8W&3Gd&lw-(3Xl2n$pW#v5|EkA zJ$q4x>)wL{zba~>0{f8 z6;cV5%P}UiN4$7!~!% zT;X5aFs_d<5Wiw=6SXj7%t&uN6dRfMcVpCb4j1d$f@Ohvq1PC0Ieii)e|;!Xf1B97 z6}&F}{V^p4{_j!~$M?uSOiS^y?qO@hqBii4%%WM3#K#f*^e?L%`Z0;#|2$#U^2HT% zODLLGnYQiAj|98q&+VDfE6vfN!slU}H3}vJmIE)0MA?163x5+f8im;Xn^V%e1a|xs zg^~Le0jN9N9wkpdINHaNSJePmu4BLapJdF^*|h8R$@Q-Dq|{??yN|Z71s{LN$L9N( zmIXROTDy>^kbBAROUX}Tg=ar*4X_5I8_(?K<@L7!=+qxCjjoL9kHQ8 zG+FhCT@8W z!Q|vTE;s{4VYm-?qEA znGUk<^0+p%Xeq+zXvmm%y($j@hPM%jH}7-$*iT8~&5h;74%}Q%C@#(+2_4I#K>66g zFsbq{MN?#Cm-rY*7!v%Gs8eY}js{M(IA4RR$ZJLFSzegHf;P)~wWuLI#l67)_V?A^L8 z9La|=+SEF;0j5aVmhedUlm>`cokVuoWmTM`@^~ULc2;HIo_ql?Ox=>7#HWxf)S|ePLAs_euzck`Upqp{pgKiv1BTkgsfw@y})anGW zl0gcB>Z3Vr{g5UID)ri28|vMUm-UWmzM^eEmKEhfpOifss}w5H_lES!%%1CgEtKn7 zC7h%ONI0**7yZ3c_%-x(BCXa`MtH25++O!xYUzxkgWtkl^v}0%U;Vs!8vOe1;>+UM z+n>=t{{{yBT}*o$`1{+a@I2}an3xDOUH#ikI4QX`7Ja@# z=NFMxCD`!dXRM+uvJzPgTIaCL%a}^bjm2!{*sO&U_AA`qIa3VT*2;=p%%#M<+=LEf zg{Bx+KlP8Rij7N<#G73ivafshk~GQ^WwiEnZAFf^60_=cMjLiU&zxBT(2zE}5(@Ul zsa3lrN#XdVu|KdFVP2E83N;`Qxa6`iE3QD9|K?O%JWz77&q*nK?(IHUl@)5>)?8*d z>N~-;Z_WJdU8hvbr(_+_4{Cwsx#flHCLF!ycEK(beXt){iVjE(ox2ihVDNBSUP7{K z0X0^5R=%wHqE7AWCn`1ciAv}Nol0enrU!}Sk+xqt_SdM=REN(I#fKyU*0Zlpm(>+tOHy2 zCt6zIX)p`Yv*&50C_0r;@R8??`yInj> z_nBFEwKCb3#cSOt=X|h1?$+(4!jb9dIHi(GfoqJ$iH7ez|9fOxSAo>obg{%koXj5j zYZ(0^OfKL>UWpbVPHX;R)kru4_^c{xkxHlmYLI2%?5Z;*?%$yC0S)Hib=DV^lgX92 zvOwkR`!k=@VI5iwh>N;dznfokjwZ||X!?HhX$CnEdyUcyh6CePVU=&7?KDo5c8U80W z!D-TndG_dam7DIE2pyS|L?ucc=!z|ygiX8SodVdm*+QbrZ&YUun!=B)B*Xua=hTmT ze(=;z)m6q|lDMbKV9{3}Zmx%oIwKRrpYquf6g-oQ6aDkk7mEUR#AIX~M=$~Q1OovK zhLp?HxLJK3W;PIoUTqKdE?oXfqIVqL#MmcQ0TTW^jFNjf(GoN&iBH)5zd;S_xsf#` zxKLk`OeFqK`%G%?{D6ko=O`Gq;oCzc^;43d7fyP8)TFAk?YI$u-0gDIPpWF5Y$2_Q zwHOoXMb4Tr|6~}VD^XZ?*)Kh&<*rqo?uP2m*C;tpY#?fL&Srg(UlCvN%%X}|9Dn9Z zpfhppr=xW!Q&wmgALLzPKMt?7#k;tnp&dJ3@#Qs97VHCgOwe~>7Ypw77^Y=WZ>v*g zVMp7L57tDT{t47{2qfN>OAgT}`+&G&|O< z7aNs*IPv)l%bp#Uo)p3&P%>V=BE5{VtR3bYakSU*x;S7KT4LXM+lpQK0wrpbP}K!J zNKK7s+2J@cnrTl2l$UN*;H?k$(JgIn^cfW@EuHE*A{x9~M5)I&|4`ObEp!K$|CWzK z_C72&gWF%Do%RB)3SYY~3QLToWO{kR7aP<J#K7p6syAO?2s-?HBcpKBF|PXQ>(wKU6S@_g6=!=uf<9ML2eToW=~5| zKMcfULW?5%GQZ91j$FE=hB5))Whuqi6E2Se03({%`@M*YA;!&J~3th3H$y(E%D`!^?&+*VJVZh3u}o4SvW z?ekO^_fM^UdCn1H(}8w*`=+mAk*k@*1-c*dG7+19f};RHl^7&BC1pB{Z9&4f(5M^i zhv))bmaJANqgD>goyzHr3OG7x)RM>QER-Pfua@K=6~Znh$T=U2nW1zov-=;R5c$(n zph>}pN%=|MJ>E9(AutcHc@G+6XMh&r4d_pHfnn7Pl>WBVIi{yrb)TJB4M#=GYd zc#$2xUp`NIzyHg&RQW;mRy{d|9$ke5YY+RyZ*|G(@IuQT3E z%afv47qs+fNA7|FqK{aO$&fHv`qxL&HP|_(DBc4Z(*Q6?AW>C|1W{DlwroyBGmA}0 zSd{myzmxSMQFAzn<1l8JWFG2vzg`k6-y}W$EZ(V}smmPWGmVp_aFRr|pB!;1nA~R) zJhc~_*6$VWCW+ZdLTqODEG1@R9)Wn=4#!feHV<>2ivM&x+r&e^axOl>pG(%Pe#2b;5Bqit;zNiv^Ig@OX?OK)~F0Wx4ONjEvO}4I@Aycj8&SDVfYIwGRoK6qV z-9m0+lT{Y$x+N&AL>SrW$JA2=e*TF&&D}T?l$VLZ;kS0uz@Wt8U?k3aEQdemV;H@uBV_`%l(Rc{<143X*m6{}-S#|r63yCB8U>&9g5&Mw1YgL%=N3#f z9~i-}(X|IgMP7xN#$CPf45Zd@)I#pO8DS~1)=OFmnpIAs}2VC{1KIrQ8&K5-@ zMNWzFkU_RabTfcqT&L*MWQMn%oM=T8yqpqfhVhCt^D?1s*V+i4VYY`Gwv+F4HDlej z>a5mdNscZ?%>K=rpcD3xlV`+rIZcUTPiNl}Ifm9&K-iFDF>9&&L|>MsW9B-|KJU^Q z7*1#nWREAdtOd9_z~r4$oQv!c-keQAFW)ZL<@-Kyz&YnaW zh(E!~{}QU6pK^*U?q5V2UBB#&X0CIen~ocXA+8UsdKci4X@E!$?_<@+X~%%=-lgqc za%~585jm-E?yJ`6&=PbB9oOHxDZgV{UvE_Y!36H96C__5pNw=IQOM=$S(?pn87ZGO!aUKVY;und|45k;A84TqqCWG&Y3#b>j_S!gDzKjTHdd0U) zcO7c8tJ${b4uv?5grqaWN!^QfW3uS}H>& zhH|5-H;Sdq(B$(S1OFf&)AWx{#gHGH_Pcxv#|^A>$y{EHlG-m!ny8KP`!NOEm}*r6 zye~M~^cTv{v{{?BM9g6ponUn?>xC?D66_c}<( z!^Wc@Kf!bIh0#0vJn=!Cc4+%u$vx1L`8K?5DN-)8Z;ngYUkFQ^bDoVEn-9`33V27C zvDh2*u_GSU)L?80BTJe_PT3maYM&6{jmmXfVpY>N2jJU(Iglk*k}%V0sOg4c;Zo>D zl^QyK&CXDwHI=OkU?)NG$>WGX&Z0@-ok_H7x(!w4S>biJ*lenPk#-3n1eMkJ7?^sC zOj#Dd`5>N*qxDAMO&g2~87fMYn@?3cId3u|Uk;t5dbm&O2L>&K3b4o#{5AWwb3dbe z30=zJRgJ{P#ZW<-eIM86!z6?UDx{v$H*J^*J1>aci#JgEhQ(428E=jK^cgfPI0#~O zuo)S0sdgow1r|2a7%PPF0~8E-s?XPsnzi{-;N#5*qn|i;8E@2wc$;gK$l8d`a2b*s z)8QFd=oNDl99iL5nFfF_j+F29n&G1;m7hxql;LPOPbEn7f5yJ&`d#~P1)3G`>Ke|x zBJ4z}>l4>cschNl+op6oWbsX3_U#SY&jZ*~XH^v_tMhBoQIgdC452TiIb@?tugN=> zQLccmnm>?6CHRv$DHPt$dcei|s;w`jx+!065CB_Dkk?QJo8x6C!1ewSDxsI-CLW$W9bkIS+k}?w6{U9GwPX83F*m9psdr&whPZdcj4q7eWK2hr%8|Z*-eBa3!=_Ga% zpynRiVjg4ZbI1A+qy)MV2V>sZ|EkaaZ}5m|Bi>f;r01DWr`qo=%&b`rL*x&i?!)5Z zwt#a!(n4f%$0Z&pLbO73jY|?C}+Dl!kK>0aT<~zznr0WTo60_wapwa z72QaFBi?0Eflh6x(}=ty6y^F|9Z$SBi@xJht_w3w_+w1#+myTv6_PCRA zXj=MLTPY6`p-!7$cWCb zC#sF+c8cmpmh>hb+R}v+SRJ%HP2D;|ml@Q5x z==mu(;zvDxv;zyM+S@9NB70)4spD!6sw0mlHfC&_n|u8o|T@fXcpD zSG8y?kN-|??HHO)`a;`KqN(5bmK^{IHZ@_7-^O;~Guac}gAE#8sC8!~+Ee0|o3}P- z1jpI5xVp12I)6#MYbFdK*FKEA#w^`ziC7VJ0l=e$axb(cc|70)wkUBtY5Z~a6vF@J&p ztOlf2J8sKo`ek~O(T}~@5z#Q#ZqgqG|1g!8u&9;g=XRKTm~mojG$TgcP+zZKUU35d zdd@`{ql&(rwyNOXuv=blG&H7=%70onSIG$RHw*!Ed=B@yFy7P{ir_M`Ju)IYqb3&W z8@z8MhvUlcR9kRl?=Yz-^#jd%ny|#@6Z+Zdu1sOj7=18s7{rZI)zv)OO^Y>#%?QQCEN$IM5EIKMB?S8Mna+xLFKdf3^?clIA*wHKVc!vs#0^=)^^re{brS#Q(&zz z%XF`YapmTtA8JP7n^DyQi+mVxY%q ^q?T}OI`@-Gh3YEWB$?H)-WG!OSJ)sBQ% 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%0A2iw3+Y?-O_?Gs@$6CdTs+QW0c6+uON8|3b%Lct+ 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 B-B + +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 "bamit.h" +#include + +#define xMKNAME(d,f) #d f +#define MKNAME(d,f) xMKNAME(d,f) + +int main_substitution_anlysis(int argc, char *argv[]); + +const char * bambi_version(void) +{ + return "12.34"; +} + +int success = 0; +int failure = 0; + +void checkOutputFiles(char *tmpdir, char *gotfile, char *expectfile) +{ + char cmd[1024]; + sprintf(cmd,"diff %s/%s %s", tmpdir, gotfile, expectfile); + if (system(cmd)) { fprintf(stderr,"Command failed: %s\n",cmd); failure++; } +} + +int main(int argc, char**argv) +{ + int verbose = 0; + + 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; + + // create temp directory + char template[] = "/tmp/bambi.XXXXXX"; + char *TMPDIR = mkdtemp(template); + if (TMPDIR == NULL) { + fprintf(stderr,"Can't create temp directory\n"); + exit(1); + } else { + if (verbose) fprintf(stderr,"Created temporary directory: %s\n", TMPDIR); + } + + // minimal options + char cmd[2048]; + char prog[512]; + + sprintf(prog, "%s", "src/bambi substitution_analysis"); + + snprintf(cmd, sizeof(cmd), "%s -o %s/sa.txt %s", prog, TMPDIR, MKNAME(DATA_DIR,"/sa.bam")); + if (system(cmd)) { fprintf(stderr,"Command failed: %s\n",cmd); failure++; } + else checkOutputFiles(TMPDIR, "sa.txt", MKNAME(DATA_DIR,"/out/sa.txt")); + + printf("substitution_analysis tests: %s\n", failure ? "FAILED" : "Passed"); + return failure ? EXIT_FAILURE : EXIT_SUCCESS; +} From 68e62e810121fc0c4e91e943ad55d5c7fc5620a5 Mon Sep 17 00:00:00 2001 From: jenniferliddle Date: Thu, 3 Jun 2021 12:17:24 +0100 Subject: [PATCH 5/5] Improved error handling --- src/check_bcl.c | 43 +++++++------------------------------------ 1 file changed, 7 insertions(+), 36 deletions(-) diff --git a/src/check_bcl.c b/src/check_bcl.c index 8af4f101..6b92fd6a 100644 --- a/src/check_bcl.c +++ b/src/check_bcl.c @@ -117,32 +117,6 @@ static char *uncompressBlock(char* abSrc, int nLenSrc, char* abDst, int nLenDst return msg; } -#if 0 -// libdeflate version -#include -static char *uncompressBlock(char* abSrc, int nLenSrc, char* abDst, int nLenDst ) -{ - char *msg = NULL; - size_t actualOut; - - if (nLenDst == 0) return 0; - - int nErr; - struct libdeflate_decompressor *compressor = libdeflate_alloc_decompressor(); - //LIBDEFLATEAPI *compressor = libdeflate_alloc_decompressor(); - - nErr = libdeflate_gzip_decompress(compressor, abSrc, nLenSrc, abDst, nLenDst, &actualOut); - if (nErr != LIBDEFLATE_SUCCESS) { - char buff[64]; - sprintf(buff, "%02x %02x %02x %02x %02x", (uint8_t)abSrc[0], (uint8_t)abSrc[1], (uint8_t)abSrc[2], (uint8_t)abSrc[3], (uint8_t)abSrc[4]); - store_msg(&msg, "inflate() returned %d for data %s", nErr, buff); - } - - libdeflate_free_decompressor(compressor); - return msg; -} -#endif - static off_t find_tile_offset(bclfile_t *bcl, int tile, tilerec_t **ti_out) { off_t offset = bcl->header_size; @@ -208,7 +182,7 @@ static int checkBclFile(char *fname, int verbose) bclfile_t *bcl; bcl = bclfile_open(fname, mt, tile); if (bcl->errmsg) { - display("File: %s\t%s\n", fname, bcl->errmsg); + display("Can't open File: %s\t%s\n", fname, bcl->errmsg); ret = 1; } @@ -234,20 +208,17 @@ static int checkBclFile(char *fname, int verbose) tilerec_t *tile = bcl->tiles->entries[n]; if (verbose) display(" %3d %6d %d\t%d\t%d\t", n, tile->tilenum, tile->nclusters, tile->uncompressed_blocksize, tile->compressed_blocksize); char *msg = checkTile(bcl,tile->tilenum); - if (msg) ret = 1; - if (verbose) { - if (msg) display("***FAIL*** %s\n", msg); - else display("Ok\n"); + if (msg) { + display("Failed Tile %6d for file %s: %s\n", tile->tilenum, fname, msg); + ret = 1; + } else { + if (verbose) display("Ok\n"); } free(msg); } } } - if (!verbose && ret != 0) { - display("Failed %s check: %s\n", (ret==1 ? "Header" : "Tile"), fname); - } - bclfile_close(bcl); return ret; } @@ -343,7 +314,7 @@ int main(int argc, char *argv[]) if (optind >= argc) Usage(stderr); if (isDirectory(argv[optind])) r = checkRunFolder(argv[optind]); - else r = checkBclFile(argv[optind], 1); + else r = checkBclFile(argv[optind], check_opts_verbose); return r; }