This repository has been archived by the owner on Jun 7, 2023. It is now read-only.
/
twobit_helper.go
66 lines (54 loc) · 1.57 KB
/
twobit_helper.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
package main
import "fmt"
func twobit2seq_offset(seq, seq2bit []byte, offset uint, bp_len uint64) {
p:=uint64(0)
for i:=0; i<len(seq2bit); i++ {
for ; offset<4; offset++ {
switch (seq2bit[i] & byte(0x3<<(offset*2))) >> byte(offset*2) {
case 0: seq[p] = 'a'
case 1: seq[p] = 'c'
case 2: seq[p] = 'g'
case 3: seq[p] = 't'
}
p++
if p>=bp_len { break }
}
offset=0
if p>=bp_len { break }
}
}
func twobit2seq(seq, seq2bit []byte) {
twobit2seq_offset(seq, seq2bit, 0, uint64(len(seq2bit)*4))
}
func twobit2seq_sn(seq, seq2bit []byte, s_bp, n uint64) {
s_idx := s_bp/4
s_offset := s_bp%4
twobit2seq_offset(seq, seq2bit[s_idx:], uint(s_offset), n)
}
func seq_to_2bit_offset(obuf, seq []byte, obuf_bp_off uint) error {
obuf_pos := 0
for i:=0; i<len(seq); i++ {
if obuf_pos >= len(obuf) {
return fmt.Errorf("obuf_pos >= len(obuf)")
/*
fmt.Printf("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n")
fmt.Printf("len(obuf) %d, obuf_pos %d, len(seq) %d\n", len(obuf), obuf_pos, len(seq))
panic(">>>")
*/
}
obuf[obuf_pos] &= byte(^(0x03<<(2*obuf_bp_off)))
switch seq[i] {
case 'a', 'A':
case 'c', 'C': obuf[obuf_pos] |= (0x01<<(2*obuf_bp_off))
case 'g', 'G': obuf[obuf_pos] |= (0x02<<(2*obuf_bp_off))
case 't', 'T': obuf[obuf_pos] |= (0x03<<(2*obuf_bp_off))
}
obuf_bp_off = (obuf_bp_off+1)%4
if obuf_bp_off==0 { obuf_pos++ }
}
return nil
}
func seq_to_2bit(obuf, seq []byte) {
seq_to_2bit_offset(obuf, seq, uint(0))
return
}