Repository navigation
Expand file tree
/
Copy pathutility.py
More file actions
77 lines (59 loc) · 2.28 KB
/
Copy pathutility.py
File metadata and controls
77 lines (59 loc) · 2.28 KB
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
import pandas as pd
import numpy as np
def classify_gt_kmers(pat_kmers, mat_kmers):
shared_kmers = pat_kmers.intersection(mat_kmers)
unique_pat_kmers = pat_kmers - shared_kmers
unique_mat_kmers = mat_kmers - shared_kmers
het_kmers = unique_pat_kmers.union(unique_mat_kmers)
hom_kmers = shared_kmers
total_kmers = hom_kmers.union(het_kmers)
return het_kmers, hom_kmers, total_kmers
def load_and_preprocess_piles(path):
k_mer_piles = pd.read_csv(path, sep="\t", header=None, names=["read", "pile", "ids"])
k_mer_piles["pile"] = (
k_mer_piles["pile"]
.apply(np.fromstring, # vectorised C‑routine
sep=",", # delimiter
dtype=np.uint32)
)
k_mer_piles["ids"] = (
k_mer_piles["ids"]
.apply(np.fromstring, # vectorised C‑routine
sep=",", # delimiter
dtype=np.uint64)
)
return k_mer_piles
def preprocess_pile(piles, name):
pile = piles.loc[piles.read == name, "pile"].values[0]
print(f"Preprocessing pile for read {name}, length {len(pile)}")
# pile = np.clip(window_mins_nonoverlap(pile), None, 100)
pile = np.clip(pile, None, 100)
return pile, len(pile)
def label_piles(piles, name, het_kmers, hom_kmers):
ids = piles.loc[piles.read == name, "ids"].values[0]
classifications = ["H" if x in het_kmers else ("D" if x in hom_kmers else "E") for x in ids]
return classifications
def window_median_threshold(arr, w=30, thresh=50*1.5, keep_tail=True):
arr = np.asarray(arr, dtype=float)
# mask out values above threshold
arr = np.where(arr > thresh, np.nan, arr)
n = (len(arr) // w) * w
meds = np.nanmedian(arr[:n].reshape(-1, w), axis=1)
if keep_tail and n < len(arr):
meds = np.concatenate([meds, [np.nanmedian(arr[n:])]])
return meds
def expand_median(meds, pile):
expanded = np.repeat(meds[:-1], 30)
if len(expanded) < len(pile):
expanded = np.concatenate([expanded, [meds[-1]]*(len(pile)-len(expanded))])
return expanded
def class_to_int(labels):
int_labels = []
for label in labels:
if label == "D":
int_labels.append(0)
elif label == "H":
int_labels.append(1)
else:
int_labels.append(2)
return int_labels