예제 #1
0
func convert(fa_ain, ref_ain *simplestream.SimpleStream, aout *os.File, start_pos int64) error {
	var e error
	var fa_bp byte

	allele_num := 0

	bufout := bufio.NewWriter(aout)
	defer bufout.Flush()

	for {
		if fa_ain.Pos >= fa_ain.N {
			if e := fa_ain.Refresh(); e != nil {
				return e
			}
		}

		if ref_ain.Pos >= ref_ain.N {
			if e := ref_ain.Refresh(); e != nil {
				return e
			}
		}

		fa_bp = fa_ain.Buf[fa_ain.Pos]
		fa_ain.Pos++

		ref_bp = ref_ain.Buf[ref_ain.Pos]
		ref_ain.Pos++

		if fa_bp != 'n' && fa_bp != 'N' && fa_bp == ref_bp {
			switch fa_bp {
			case 'A':
				aout.WriteByte('a')
			case 'C':
				aout.WriteByte('c')
			case 'G':
				aout.WriteByte('g')
			case 'T':
				aout.WriteByte('t')
			default:
				aout.WriteByte(fa_bp)
			}
		} else if fa_bp == 'N' || fa_bp == 'n' {
			switch ref_bp {
			case 'A', 'a':
				aout.WriteByte('!')
			case 'C', 'c':
				aout.WriteByte('#')
			case 'G', 'g':
				aout.WriteByte('\'')
			case 'T', 't':
				aout.WriteByte('4')
			default:
				aout.WriteByte(ref_bp)
			}
		} else if fa_bp != ref_bp {
			switch fa_bp {
			case 'a', 'A':
				aout.WriteByte('A')
			case 'c', 'C':
				aout.WriteByte('C')
			case 'g', 'G':
				aout.WriteByte('G')
			case 't', 'T':
				aout.WriteByte('T')
			default:
				aout.WriteByte(fa_bp)
			}
		} else {
			aout.WriteByte('-')
		}

	}

	return nil
}