-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathtranscode.py
95 lines (70 loc) · 2.13 KB
/
transcode.py
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
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
from typing import Union
from qiskit import QuantumCircuit, QuantumRegister, ClassicalRegister
from math import pi
def A() -> QuantumCircuit:
qc = QuantumCircuit(1, name="A")
qc.h(0)
return qc
def C() -> QuantumCircuit:
qc = QuantumCircuit(1, name="C")
qc.x(0)
return qc
def G() -> QuantumCircuit:
qc = QuantumCircuit(1, name="G")
return qc
def U() -> QuantumCircuit:
qc = QuantumCircuit(1, name="U")
qc.x(0)
qc.h(0)
return qc
def create_circuit(RNA: str) -> Union[QuantumCircuit, QuantumRegister, ClassicalRegister]:
rna_len = len(RNA)
q = QuantumRegister(rna_len, name="RNA")
meas = ClassicalRegister(rna_len, name="meas")
qc = QuantumCircuit(q, meas)
op = {
"A": A,
"C": C,
"G": G,
"U": U
}
for i,base in enumerate(RNA[::-1]):
op_qc = op[base]()
qc.append(op_qc, [i])
qc.barrier()
qc.ry(pi, q)
return qc, q, meas
def measure_cg(qc: QuantumCircuit, qreg:QuantumRegister, creg: ClassicalRegister) -> QuantumCircuit:
qc_c = qc.copy()
qc_c.barrier()
qc_c.measure(qreg, creg)
return qc_c
def measure_au(qc: QuantumCircuit, qreg:QuantumRegister, creg: ClassicalRegister) -> QuantumCircuit:
qc_c = qc.copy()
qc_c.barrier()
qc_c.h(qreg)
qc_c.measure(qreg, creg)
return qc_c
def decode(counts:dict, bases:list, DNA:str='') -> str:
dna_len = len(list(counts.keys())[0])
if(not DNA):
DNA_ = ['x']*dna_len
else:
DNA_ = list(DNA)
check = [0]*dna_len
for i, k in enumerate(list(counts.keys())):
for j, v in enumerate(k):
if(i == 0):
check[j] = int(v)
continue
actual_check_val = check[j]
check[j] = 2 if actual_check_val != int(v) else int(v)
for i,v in enumerate(check):
if(v > len(bases)-1):
continue
DNA_[i] = bases[v]
return ''.join(DNA_)
def decode_cg(counts: dict, DNA: str='') -> str:
return decode(counts, ['G', 'C'], DNA)
def decode_au(counts: dict, DNA: str='') -> str:
return decode(counts, ['A', 'T'], DNA)