Download model/PXDesignBench/ColabDesign/colabdesign/shared/prep.py from OneScience-Group/PXDesign: direct link, hf CLI and curl.
- Browser
- Download file 2.39 kB
-
https://huggingface.co/OneScience-Group/PXDesign/resolve/main/model/PXDesignBench/ColabDesign/colabdesign/shared/prep.py
- Command line
-
hf download hf://OneScience-Group/PXDesign/model/PXDesignBench/ColabDesign/colabdesign/shared/prep.py
-
curl -L -o prep.py https://huggingface.co/OneScience-Group/PXDesign/resolve/main/model/PXDesignBench/ColabDesign/colabdesign/shared/prep.py
2.39 kB
| import numpy as np | |
| def prep_pos(pos, residue, chain): | |
| ''' | |
| given input [pos]itions (a string of segment ranges seperated by comma, | |
| for example: "1,3-4,10-15"), return list of indices to constrain. | |
| ''' | |
| residue_set = [] | |
| chain_set = [] | |
| len_set = [] | |
| for idx in pos.split(","): | |
| i,j = idx.split("-") if "-" in idx else (idx, None) | |
| if i.isalpha() and j is None: | |
| residue_set += [None] | |
| chain_set += [i] | |
| len_set += [i] | |
| else: | |
| # if chain defined | |
| if i[0].isalpha(): | |
| c,i = i[0], int(i[1:]) | |
| else: | |
| c,i = chain[0],int(i) | |
| if j is None: | |
| j = i | |
| else: | |
| j = int(j[1:] if j[0].isalpha() else j) | |
| residue_set += list(range(i,j+1)) | |
| chain_set += [c] * (j-i+1) | |
| len_set += [j-i+1] | |
| residue = np.asarray(residue) | |
| chain = np.asarray(chain) | |
| pos_set = [] | |
| for i,c in zip(residue_set, chain_set): | |
| if i is None: | |
| idx = np.where(chain == c)[0] | |
| assert len(idx) > 0, f'ERROR: chain {c} not found' | |
| pos_set += [n for n in idx] | |
| len_set[len_set.index(c)] = len(idx) | |
| else: | |
| idx = np.where((residue == i) & (chain == c))[0] | |
| assert len(idx) == 1, f'ERROR: positions {i} and chain {c} not found' | |
| pos_set.append(idx[0]) | |
| return {"residue":np.array(residue_set), | |
| "chain":np.array(chain_set), | |
| "length":np.array(len_set), | |
| "pos":np.asarray(pos_set)} | |
| def rewire(length, order=None, loops=0, offset=0): | |
| ''' | |
| Given a list of segment [length]s, move them around given an [offset], [order] and [loop] lengths. | |
| The [order] of the segments and the length of [loops] between segments can be controlled. | |
| ''' | |
| seg_len = [length] if isinstance(length,int) else length | |
| num_seg = len(seg_len) | |
| # define order of segments | |
| if order is None: order = list(range(num_seg)) | |
| assert len(order) == num_seg | |
| # define loop lengths between segments | |
| loop_len = ([loops] * (num_seg - 1)) if isinstance(loops, int) else loops | |
| assert len(loop_len) == num_seg - 1 | |
| # get positions we want to restrain/constrain within hallucinated protein | |
| l,new_pos = offset,[] | |
| for n,i in enumerate(np.argsort(order)): | |
| new_pos.append(l + np.arange(seg_len[i])) | |
| if n < num_seg - 1: l += seg_len[i] + loop_len[n] | |
| return np.concatenate([new_pos[i] for i in order]) |