 +			kputsn("NA", 2, str);
 +		}
 +		kputc(',', str);
-+		kputw(p->pair_score, str); // ztz5
++		kputw(p->osub, str); // ztz5
++		kputc(',', str);
++		kputw(p->pair_score, str); // ztz6
 +		kputc(',', str);
 +		if(p->pair_sub >= 0) {
-+			kputw(p->pair_score - p->pair_sub, str); // ztz6
++			kputw(p->pair_score - p->pair_sub, str); // ztz7
 +		} else {
 +			kputsn("NA", 2, str);
 +		}
 +		kputc(',', str);
-+		kputw(p->n_comp, str); // ztz7
++		kputw(p->n_comp, str); // ztz8
 +		kputc(',', str);
-+		kputw(p->seedlen0, str); // ztz8
++		kputw(p->seedlen0, str); // ztz9
 +		kputc(',', str);
-+		kputw(p->sub_n, str); // ztz9
++		kputw(p->sub_n, str); // ztz10
 +		kputc(',', str);
-+		kputw(p->pair_nsub, str); // ztz10
++		kputw(p->osub_n, str); // ztz11
 +		kputc(',', str);
-+		kputw((int)(p->frac_rep * 1000.0), str); // ztz11
++		kputw(p->pair_nsub, str); // ztz12
 +		kputc(',', str);
-+		kputw((int)(p->pair_frac_rep * 1000.0), str); // ztz12
++		kputw((int)(p->frac_rep * 1000.0), str); // ztz13
 +		kputc(',', str);
-+		kputw((int)(p->seedcov * 1000.0), str); // ztz13
++		kputw((int)(p->pair_frac_rep * 1000.0), str); // ztz14
 +		kputc(',', str);
-+		kputw((int)(p->pair_seedcov * 1000.0), str); // ztz14
++		kputw((int)(p->seedcov * 1000.0), str); // ztz15
++		kputc(',', str);
++		kputw((int)(p->pair_seedcov * 1000.0), str); // ztz16
 +	}
  	kputc('\n', str);
  }
  
-@@ -1131,6 +1180,13 @@ mem_aln_t mem_reg2aln(const mem_opt_t *o
+@@ -1129,8 +1184,17 @@ mem_aln_t mem_reg2aln(const mem_opt_t *o
+ 	a.rid = bns_pos2rid(bns, pos);
+ 	assert(a.rid == ar->rid);
  	a.pos = pos - bns->anns[a.rid].offset;
- 	a.score = ar->score; a.sub = ar->sub > ar->csub? ar->sub : ar->csub;
+-	a.score = ar->score; a.sub = ar->sub > ar->csub? ar->sub : ar->csub;
++	a.score = ar->score;
++	a.sub = ar->sub > ar->csub? ar->sub : ar->csub;
++	a.osub = ar->osub;
  	a.is_alt = ar->is_alt; a.alt_sc = ar->alt_sc;
 +	a.seedlen0 = ar->seedlen0;
 +	a.n_comp = ar->n_comp;
 +	a.seedcov = ((float)ar->seedcov) / l_query;
 +	a.frac_rep = ar->frac_rep;
-+	a.sub_n = ar->sub_n;
++	a.sub_n = ar->sub_n; a.osub_n = ar->osub_n;
 +	a.pair_score = a.pair_sub = a.pair_nsub = 0;
 +	a.pair_frac_rep = a.pair_seedcov = 0.;
  	free(query);

 				kputw(p->cigar[i]>>4, str); kputc("MIDSH"[c], str);
 			}
 		} else kputc('*', str); // having a coordinate but unaligned (e.g. when copy_mate is true)
@@ -942,6 +947,50 @@ void mem_aln2sam(const mem_opt_t *opt, c
 		for (i = tmp; i < str->l; ++i) // replace TAB in the comment to SPACE
 			if (str->s[i] == '\t') str->s[i] = ' ';
 	}

 	if (p->rid >= 0) { // with coordinate
 		kputs(bns->anns[p->rid].name, str); kputc('\t', str); // RNAME
 		kputl(p->pos + 1, str); kputc('\t', str); // POS
@@ -847,6 +850,10 @@ void mem_aln2sam(const mem_opt_t *opt, c
 				int c = p->cigar[i]&0xf;
 				if (!(opt->flag&MEM_F_SOFTCLIP) && !p->is_alt && (c == 3 || c == 4))
 					c = which? 4 : 3; // use hard clipping for supplementary alignments
