Skip to content

Commit b118214

Browse files
valeriuojkbonfield
authored andcommitted
Base composition statistics for bar codes.
Quality statistics for barcodes. Fixes samtools#795. Fixes samtools#861. Closes samtools#904.
1 parent 02d93a1 commit b118214

15 files changed

+14167
-4
lines changed

stats.c

Lines changed: 180 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -116,6 +116,17 @@ typedef struct
116116
}
117117
acgtno_count_t;
118118

119+
typedef struct
120+
{
121+
char tag_name[3];
122+
char qual_name[3];
123+
uint32_t nbases;
124+
int32_t tag_sep; // Index of the separator (if present)
125+
int32_t max_qual;
126+
uint32_t offset; // Where the tag stats info is located in the allocated memory
127+
}
128+
barcode_info_t;
129+
119130
typedef struct
120131
{
121132
// Auxiliary data
@@ -230,6 +241,12 @@ typedef struct
230241
uint32_t target_count; // Number of bases covered by the target file
231242
uint32_t last_pair_tid;
232243
uint32_t last_read_flush;
244+
245+
// Barcode statistics
246+
acgtno_count_t *acgtno_barcode;
247+
uint64_t *quals_barcode;
248+
barcode_info_t *tags_barcode;
249+
uint32_t ntags;
233250
}
234251
stats_t;
235252
KHASH_MAP_INIT_STR(c2stats, stats_t*)
@@ -688,6 +705,105 @@ void update_checksum(bam1_t *bam_line, stats_t *stats)
688705
stats->checksum.quals += crc32(0L, qual, (seq_len+1)/2);
689706
}
690707

708+
// Collect statistics about the barcode tags specified by init_barcode_tags method
709+
static void collect_barcode_stats(bam1_t* bam_line, stats_t* stats) {
710+
uint32_t nbases, tag, i;
711+
acgtno_count_t *acgtno;
712+
uint64_t *quals;
713+
int32_t *separator, *maxqual;
714+
715+
for (tag = 0; tag < stats->ntags; tag++) {
716+
const char *barcode_tag = stats->tags_barcode[tag].tag_name, *qual_tag = stats->tags_barcode[tag].qual_name;
717+
uint8_t* bc = bam_aux_get(bam_line, barcode_tag);
718+
if (!bc)
719+
continue;
720+
721+
char* barcode = bam_aux2Z(bc);
722+
if (!barcode)
723+
continue;
724+
725+
uint32_t barcode_len = strlen(barcode);
726+
if (!stats->tags_barcode[tag].nbases) { // tag seen for the first time
727+
uint32_t offset = 0;
728+
for (i = 0; i < stats->ntags; i++)
729+
offset += stats->tags_barcode[i].nbases;
730+
731+
stats->tags_barcode[tag].offset = offset;
732+
stats->tags_barcode[tag].nbases = barcode_len;
733+
stats->acgtno_barcode = realloc(stats->acgtno_barcode, (offset + barcode_len) * sizeof(acgtno_count_t));
734+
stats->quals_barcode = realloc(stats->quals_barcode, (offset + barcode_len) * stats->nquals * sizeof(uint64_t));
735+
736+
if (!stats->acgtno_barcode || !stats->quals_barcode)
737+
error("Error allocating memory. Aborting!\n");
738+
739+
memset(stats->acgtno_barcode + offset, 0, barcode_len*sizeof(acgtno_count_t));
740+
memset(stats->quals_barcode + offset*stats->nquals, 0, barcode_len*stats->nquals*sizeof(uint64_t));
741+
}
742+
743+
nbases = stats->tags_barcode[tag].nbases;
744+
if (barcode_len > nbases) {
745+
fprintf(stderr, "Barcodes with tag %s differ in length at sequence '%s'\n", barcode_tag, bam_get_qname(bam_line));
746+
continue;
747+
}
748+
749+
acgtno = stats->acgtno_barcode + stats->tags_barcode[tag].offset;
750+
quals = stats->quals_barcode + stats->tags_barcode[tag].offset*stats->nquals;
751+
maxqual = &stats->tags_barcode[tag].max_qual;
752+
separator = &stats->tags_barcode[tag].tag_sep;
753+
754+
for (i = 0; i < barcode_len; i++) {
755+
switch (barcode[i]) {
756+
case 'A':
757+
acgtno[i].a++;
758+
break;
759+
case 'C':
760+
acgtno[i].c++;
761+
break;
762+
case 'G':
763+
acgtno[i].g++;
764+
break;
765+
case 'T':
766+
acgtno[i].t++;
767+
break;
768+
case 'N':
769+
acgtno[i].n++;
770+
break;
771+
default:
772+
if (*separator >= 0) {
773+
if (*separator != i) {
774+
fprintf(stderr, "Barcode separator for tag %s is in a different position at sequence '%s'\n", barcode_tag, bam_get_qname(bam_line));
775+
continue;
776+
}
777+
} else {
778+
*separator = i;
779+
}
780+
}
781+
}
782+
783+
uint8_t* qt = bam_aux_get(bam_line, qual_tag);
784+
if (!qt)
785+
continue;
786+
787+
char* barqual = bam_aux2Z(qt);
788+
if (!barqual)
789+
continue;
790+
791+
uint32_t barqual_len = strlen(barqual);
792+
if (barqual_len == barcode_len) {
793+
for (i = 0; i < barcode_len; i++) {
794+
int32_t qual = (int32_t)barqual[i] - '!'; // Phred + 33
795+
if (qual >= 0 && qual < stats->nquals) {
796+
quals[i * stats->nquals + qual]++;
797+
if (qual > *maxqual)
798+
*maxqual = qual;
799+
}
800+
}
801+
} else {
802+
fprintf(stderr, "%s length and %s length don't match for sequence '%s'\n", barcode_tag, qual_tag, bam_get_qname(bam_line));
803+
}
804+
}
805+
}
806+
691807
// These stats should only be calculated for the original reads ignoring
692808
// supplementary artificial reads otherwise we'll accidentally double count
693809
void collect_orig_read_stats(bam1_t *bam_line, stats_t *stats, int* gc_count_out)
@@ -777,6 +893,11 @@ void collect_orig_read_stats(bam1_t *bam_line, stats_t *stats, int* gc_count_out
777893
stats->sum_qual += qual;
778894
}
779895

896+
// Barcode statistics
897+
if (IS_READ1(bam_line)) {
898+
collect_barcode_stats(bam_line, stats);
899+
}
900+
780901
// Look at the flags and increment appropriate counters (mapped, paired, etc)
781902
if ( IS_UNMAPPED(bam_line) )
782903
{
@@ -1471,6 +1592,49 @@ void output_stats(FILE *to, stats_t *stats, int sparse)
14711592
100.*acgtno_count_2nd->other/acgt_sum_2nd);
14721593

14731594
}
1595+
int tag;
1596+
for (tag=0; tag<stats->ntags; tag++) {
1597+
if (stats->tags_barcode[tag].nbases) {
1598+
fprintf(to, "# ACGT content per cycle for barcodes. Use `grep ^%sC | cut -f 2-` to extract this part. The columns are: cycle; A,C,G,T base counts as a percentage of all A/C/G/T bases [%%]; and N counts as a percentage of all A/C/G/T bases [%%]\n",
1599+
stats->tags_barcode[tag].tag_name);
1600+
for (ibase=0; ibase<stats->tags_barcode[tag].nbases; ibase++)
1601+
{
1602+
if (ibase == stats->tags_barcode[tag].tag_sep)
1603+
continue;
1604+
1605+
acgtno_count_t *acgtno_count = stats->acgtno_barcode + stats->tags_barcode[tag].offset + ibase;
1606+
uint64_t acgt_sum = acgtno_count->a + acgtno_count->c + acgtno_count->g + acgtno_count->t;
1607+
1608+
if ( acgt_sum )
1609+
fprintf(to, "%sC%d\t%d\t%.2f\t%.2f\t%.2f\t%.2f\t%.2f\n", stats->tags_barcode[tag].tag_name,
1610+
stats->tags_barcode[tag].tag_sep < 0 || ibase < stats->tags_barcode[tag].tag_sep ? 1 : 2,
1611+
stats->tags_barcode[tag].tag_sep < 0 || ibase < stats->tags_barcode[tag].tag_sep ? ibase+1 : ibase-stats->tags_barcode[tag].tag_sep,
1612+
100.*acgtno_count->a/acgt_sum,
1613+
100.*acgtno_count->c/acgt_sum,
1614+
100.*acgtno_count->g/acgt_sum,
1615+
100.*acgtno_count->t/acgt_sum,
1616+
100.*acgtno_count->n/acgt_sum);
1617+
}
1618+
1619+
fprintf(to, "# Barcode Qualities. Use `grep ^%sQ | cut -f 2-` to extract this part.\n", stats->tags_barcode[tag].qual_name);
1620+
fprintf(to, "# Columns correspond to qualities and rows to barcode cycles. First column is the cycle number.\n");
1621+
for (ibase=0; ibase<stats->tags_barcode[tag].nbases; ibase++)
1622+
{
1623+
if (ibase == stats->tags_barcode[tag].tag_sep)
1624+
continue;
1625+
1626+
fprintf(to, "%sQ%d\t%d", stats->tags_barcode[tag].qual_name,
1627+
stats->tags_barcode[tag].tag_sep < 0 || ibase < stats->tags_barcode[tag].tag_sep ? 1 : 2,
1628+
stats->tags_barcode[tag].tag_sep < 0 || ibase < stats->tags_barcode[tag].tag_sep ? ibase+1 : ibase-stats->tags_barcode[tag].tag_sep);
1629+
for (iqual=0; iqual<=stats->tags_barcode[tag].max_qual; iqual++)
1630+
{
1631+
fprintf(to, "\t%ld", (long)stats->quals_barcode[(stats->tags_barcode[tag].offset + ibase)*stats->nquals+iqual]);
1632+
}
1633+
fprintf(to, "\n");
1634+
}
1635+
}
1636+
}
1637+
14741638
fprintf(to, "# Insert sizes. Use `grep ^IS | cut -f 2-` to extract this part. The columns are: insert size, pairs total, inward oriented pairs, outward oriented pairs, other pairs\n");
14751639
for (isize=0; isize<ibulk; isize++) {
14761640
long in = (long)(stats->isize->inward(stats->isize->data, isize));
@@ -1840,6 +2004,9 @@ void cleanup_stats(stats_t* stats)
18402004
free(stats->ins_cycles_2nd);
18412005
free(stats->del_cycles_1st);
18422006
free(stats->del_cycles_2nd);
2007+
if (stats->acgtno_barcode) free(stats->acgtno_barcode);
2008+
if (stats->quals_barcode) free(stats->quals_barcode);
2009+
free(stats->tags_barcode);
18432010
destroy_regions(stats);
18442011
if ( stats->rg_hash ) khash_str2int_destroy(stats->rg_hash);
18452012
free(stats->split_name);
@@ -1944,6 +2111,17 @@ stats_t* stats_init()
19442111
return stats;
19452112
}
19462113

2114+
static void init_barcode_tags(stats_t* stats) {
2115+
stats->ntags = 4;
2116+
stats->tags_barcode = calloc(stats->ntags, sizeof(barcode_info_t));
2117+
if (!stats->tags_barcode)
2118+
return;
2119+
stats->tags_barcode[0] = (barcode_info_t){"BC", "QT", 0, -1, -1, 0};
2120+
stats->tags_barcode[1] = (barcode_info_t){"CR", "CY", 0, -1, -1, 0};
2121+
stats->tags_barcode[2] = (barcode_info_t){"OX", "BZ", 0, -1, -1, 0};
2122+
stats->tags_barcode[3] = (barcode_info_t){"RX", "QX", 0, -1, -1, 0};
2123+
}
2124+
19472125
static void init_stat_structs(stats_t* stats, stats_info_t* info, const char* group_id, const char* targets)
19482126
{
19492127
// Give stats_t a pointer to the info struct
@@ -1984,6 +2162,7 @@ static void init_stat_structs(stats_t* stats, stats_info_t* info, const char* gr
19842162
stats->ins_cycles_2nd = calloc(stats->nbases+1,sizeof(uint64_t));
19852163
stats->del_cycles_1st = calloc(stats->nbases+1,sizeof(uint64_t));
19862164
stats->del_cycles_2nd = calloc(stats->nbases+1,sizeof(uint64_t));
2165+
init_barcode_tags(stats);
19872166
realloc_rseq_buffer(stats);
19882167
if ( targets )
19892168
init_regions(stats, targets);
@@ -2178,7 +2357,7 @@ int main_stats(int argc, char *argv[])
21782357
else
21792358
{
21802359
if ( info->cov_threshold > 0 && !targets ) {
2181-
fprintf(stderr, "Coverage percentage calcuation requires a list of target regions\n");
2360+
fprintf(stderr, "Coverage percentage calculation requires a list of target regions\n");
21822361
goto cleanup;
21832362
}
21842363

test/stat/11_target.bam

-17 Bytes
Binary file not shown.

test/stat/11_target.sam

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -31,9 +31,9 @@
3131
@SQ SN:ref3_unused LN:70 M5:5fdd18c2c6ecac4838996d029bf395b5
3232
r1 99 alpha 1 40 35M = 66 100 TGGGGTGTCATAGTAATCCGGTTGGGAGTCCGAGG * NM:i:0 RG:Z:s1_a_1
3333
r1 147 alpha 66 40 35M = 1 -100 TATCCAGAACTTTGCAGCCATATCTCCAAGACATG * NM:i:0 RG:Z:s1_a_1
34-
ref1_grp1_p001 99 ref1 1 0 10M = 25 34 CGAGCTCGGT !!!!!!!!!! RG:Z:grp1 BC:Z:ACGT H0:i:1 aa:A:! ab:A:~ fa:f:3.14159 za:Z:Hello world! ha:H:DEADBEEF ba:B:c,-128,0,127 bb:B:C,0,127,255 bc:B:s,-32768,0,32767 bd:B:S,0,32768,65535 be:B:i,-2147483648,0,2147483647 bf:B:I,0,2147483648,4294967295 bg:B:f,2.71828,6.626e-34,2.9979e+09 NM:i:0 MD:Z:10
35-
ref1_grp2_p001 99 ref1 3 1 10M = 27 34 AGCTCGGTAC """""""""" RG:Z:grp2 BC:Z:TGCA H0:i:1 aa:A:A ab:A:Z fa:f:6.67e-11 za:Z:!"$%^&*() ha:H:CAFE NM:i:0 MD:Z:10
36-
ref1_grp1_p002 99 ref1 5 2 10M = 29 34 CTCGGTACCC ########## RG:Z:grp1 BC:Z:AATTCCGG H0:i:1 aa:A:a ab:A:z fa:f:4.3597e-18 za:Z:Another string ha:H:2000AD NM:i:0 MD:Z:10
34+
ref1_grp1_p001 99 ref1 1 0 10M = 25 34 CGAGCTCGGT !!!!!!!!!! RG:Z:grp1 H0:i:1 aa:A:! ab:A:~ fa:f:3.14159 za:Z:Hello world! ha:H:DEADBEEF ba:B:c,-128,0,127 bb:B:C,0,127,255 bc:B:s,-32768,0,32767 bd:B:S,0,32768,65535 be:B:i,-2147483648,0,2147483647 bf:B:I,0,2147483648,4294967295 bg:B:f,2.71828,6.626e-34,2.9979e+09 NM:i:0 MD:Z:10
35+
ref1_grp2_p001 99 ref1 3 1 10M = 27 34 AGCTCGGTAC """""""""" RG:Z:grp2 H0:i:1 aa:A:A ab:A:Z fa:f:6.67e-11 za:Z:!"$%^&*() ha:H:CAFE NM:i:0 MD:Z:10
36+
ref1_grp1_p002 99 ref1 5 2 10M = 29 34 CTCGGTACCC ########## RG:Z:grp1 H0:i:1 aa:A:a ab:A:z fa:f:4.3597e-18 za:Z:Another string ha:H:2000AD NM:i:0 MD:Z:10
3737
ref1_grp2_p002 99 ref1 7 3 10M = 31 34 CGGTACCCGG $$$$$$$$$$ fa:f:6.022e+23 RG:Z:grp2 NM:i:0 MD:Z:10
3838
ref1_grp1_p003 99 ref1 9 4 10M = 33 34 GTACCCGGGG %%%%%%%%%% fa:f:1.66e-27 RG:Z:grp1 NM:i:0 MD:Z:10
3939
ref1_grp2_p003 99 ref1 11 5 10M = 35 34 ACCCGGGGAT &&&&&&&&&& RG:Z:grp2 ia:i:4294967295 NM:i:0 MD:Z:10

test/stat/12.2reads.nooverlap.expected

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -555,6 +555,24 @@ LBC 97 100.00 0.00 0.00 0.00 0.00 0.00
555555
LBC 98 100.00 0.00 0.00 0.00 0.00 0.00
556556
LBC 99 100.00 0.00 0.00 0.00 0.00 0.00
557557
LBC 100 100.00 0.00 0.00 0.00 0.00 0.00
558+
# ACGT content per cycle for barcodes. Use `grep ^BCC | cut -f 2-` to extract this part. The columns are: cycle; A,C,G,T base counts as a percentage of all A/C/G/T bases [%]; and N counts as a percentage of all A/C/G/T bases [%]
559+
BCC1 2 0.00 0.00 100.00 0.00 0.00
560+
BCC1 3 0.00 0.00 0.00 100.00 0.00
561+
BCC1 4 0.00 100.00 0.00 0.00 0.00
562+
BCC1 5 0.00 0.00 0.00 100.00 0.00
563+
BCC1 6 100.00 0.00 0.00 0.00 0.00
564+
BCC1 7 0.00 0.00 0.00 100.00 0.00
565+
BCC1 8 0.00 100.00 0.00 0.00 0.00
566+
# Barcode Qualities. Use `grep ^QTQ | cut -f 2-` to extract this part.
567+
# Columns correspond to qualities and rows to barcode cycles. First column is the cycle number.
568+
QTQ1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
569+
QTQ1 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
570+
QTQ1 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0
571+
QTQ1 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0
572+
QTQ1 5 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0
573+
QTQ1 6 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1
574+
QTQ1 7 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1
575+
QTQ1 8 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0
558576
# Insert sizes. Use `grep ^IS | cut -f 2-` to extract this part. The columns are: insert size, pairs total, inward oriented pairs, outward oriented pairs, other pairs
559577
IS 0 0 0 0 0
560578
IS 1 0 0 0 0

test/stat/12.2reads.overlap.expected

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -555,6 +555,24 @@ LBC 97 100.00 0.00 0.00 0.00 0.00 0.00
555555
LBC 98 100.00 0.00 0.00 0.00 0.00 0.00
556556
LBC 99 100.00 0.00 0.00 0.00 0.00 0.00
557557
LBC 100 100.00 0.00 0.00 0.00 0.00 0.00
558+
# ACGT content per cycle for barcodes. Use `grep ^BCC | cut -f 2-` to extract this part. The columns are: cycle; A,C,G,T base counts as a percentage of all A/C/G/T bases [%]; and N counts as a percentage of all A/C/G/T bases [%]
559+
BCC1 2 0.00 0.00 100.00 0.00 0.00
560+
BCC1 3 0.00 0.00 0.00 100.00 0.00
561+
BCC1 4 0.00 100.00 0.00 0.00 0.00
562+
BCC1 5 0.00 0.00 0.00 100.00 0.00
563+
BCC1 6 100.00 0.00 0.00 0.00 0.00
564+
BCC1 7 0.00 0.00 0.00 100.00 0.00
565+
BCC1 8 0.00 100.00 0.00 0.00 0.00
566+
# Barcode Qualities. Use `grep ^QTQ | cut -f 2-` to extract this part.
567+
# Columns correspond to qualities and rows to barcode cycles. First column is the cycle number.
568+
QTQ1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
569+
QTQ1 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
570+
QTQ1 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0
571+
QTQ1 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0
572+
QTQ1 5 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0
573+
QTQ1 6 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1
574+
QTQ1 7 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1
575+
QTQ1 8 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0
558576
# Insert sizes. Use `grep ^IS | cut -f 2-` to extract this part. The columns are: insert size, pairs total, inward oriented pairs, outward oriented pairs, other pairs
559577
IS 0 0 0 0 0
560578
IS 1 0 0 0 0

test/stat/12.3reads.nooverlap.expected

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -557,6 +557,24 @@ LBC 97 50.00 0.00 0.00 50.00 0.00 0.00
557557
LBC 98 0.00 100.00 0.00 0.00 0.00 0.00
558558
LBC 99 0.00 100.00 0.00 0.00 0.00 0.00
559559
LBC 100 0.00 0.00 0.00 100.00 0.00 0.00
560+
# ACGT content per cycle for barcodes. Use `grep ^BCC | cut -f 2-` to extract this part. The columns are: cycle; A,C,G,T base counts as a percentage of all A/C/G/T bases [%]; and N counts as a percentage of all A/C/G/T bases [%]
561+
BCC1 2 0.00 0.00 100.00 0.00 0.00
562+
BCC1 3 0.00 0.00 0.00 100.00 0.00
563+
BCC1 4 0.00 100.00 0.00 0.00 0.00
564+
BCC1 5 0.00 0.00 0.00 100.00 0.00
565+
BCC1 6 100.00 0.00 0.00 0.00 0.00
566+
BCC1 7 0.00 0.00 0.00 100.00 0.00
567+
BCC1 8 0.00 100.00 0.00 0.00 0.00
568+
# Barcode Qualities. Use `grep ^QTQ | cut -f 2-` to extract this part.
569+
# Columns correspond to qualities and rows to barcode cycles. First column is the cycle number.
570+
QTQ1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
571+
QTQ1 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
572+
QTQ1 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0
573+
QTQ1 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0
574+
QTQ1 5 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1
575+
QTQ1 6 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1
576+
QTQ1 7 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1
577+
QTQ1 8 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0
560578
# Insert sizes. Use `grep ^IS | cut -f 2-` to extract this part. The columns are: insert size, pairs total, inward oriented pairs, outward oriented pairs, other pairs
561579
IS 0 0 0 0 0
562580
IS 1 0 0 0 0

test/stat/12.3reads.overlap.expected

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -557,6 +557,24 @@ LBC 97 50.00 0.00 0.00 50.00 0.00 0.00
557557
LBC 98 0.00 100.00 0.00 0.00 0.00 0.00
558558
LBC 99 0.00 100.00 0.00 0.00 0.00 0.00
559559
LBC 100 0.00 0.00 0.00 100.00 0.00 0.00
560+
# ACGT content per cycle for barcodes. Use `grep ^BCC | cut -f 2-` to extract this part. The columns are: cycle; A,C,G,T base counts as a percentage of all A/C/G/T bases [%]; and N counts as a percentage of all A/C/G/T bases [%]
561+
BCC1 2 0.00 0.00 100.00 0.00 0.00
562+
BCC1 3 0.00 0.00 0.00 100.00 0.00
563+
BCC1 4 0.00 100.00 0.00 0.00 0.00
564+
BCC1 5 0.00 0.00 0.00 100.00 0.00
565+
BCC1 6 100.00 0.00 0.00 0.00 0.00
566+
BCC1 7 0.00 0.00 0.00 100.00 0.00
567+
BCC1 8 0.00 100.00 0.00 0.00 0.00
568+
# Barcode Qualities. Use `grep ^QTQ | cut -f 2-` to extract this part.
569+
# Columns correspond to qualities and rows to barcode cycles. First column is the cycle number.
570+
QTQ1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
571+
QTQ1 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
572+
QTQ1 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0
573+
QTQ1 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0
574+
QTQ1 5 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1
575+
QTQ1 6 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1
576+
QTQ1 7 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1
577+
QTQ1 8 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0
560578
# Insert sizes. Use `grep ^IS | cut -f 2-` to extract this part. The columns are: insert size, pairs total, inward oriented pairs, outward oriented pairs, other pairs
561579
IS 0 0 0 0 0
562580
IS 1 0 0 0 0

0 commit comments

Comments
 (0)