728x90
반응형
유전자 분석을 하면 결국 official genesymbol이나 entrez id등을 활용할 필요가 생긴다.
이를 위한 스크립트는 아래와 같다.
def get_entrez(x=None,human_only=True):
if x is None:
print(
'''
이 기능은 주어진 유전자의 input/symbol/Aliases/entrez 아이디를 돌려주는 기능임
NCBI에 등록된 것을 기준으로 하기에 최신 정보만 들어옴
실행 전에 아래의 명령어를 실행할 것
1) from Bio import Entrez
2) Entrez.email = 'email@address.com'
param x: gene name/id (ex. 'TP53', 'P29996', ...)
param human_only: True일 경우 인간 유전자만을 불러옴. False일 때는 다른 동물들의 유전자도 가져올 수 있음.
False를 했다고 반드시 다른 동물의 것도 반환하는 것이 아님!
return {'input':x,'symbol':fin_symbol,'alias':fin_alias,'entrez':fin_entrez,'organism':organism}
'''
)
return
x=str(x)
try:
handle = Entrez.esearch(db='gene',term=x, retmax='100') #db="protein",
record=Entrez.read(handle)
idlist=record['IdList'] # 최상단에 위치한 ID를 가져옴
handle2 = Entrez.efetch(db="gene", id=idlist, rettype="gb", retmode="text") #검색[0]
tmp=copy.deepcopy(handle2.read()) # 검색결과를 string화시킴
tmp2=list(filter(lambda x: x!='',tmp.split('\n\n'))) #ID lists
symbol=[]
alias=[]
entrez=[]
for component in tmp2:
c1=component.split('\n')
symbol.append(list(filter(lambda x: 'Official Symbol:' in x ,c1)))
alias.append(list(filter(lambda x: 'Other Aliases:' in x ,c1)))
entrez.append(list(filter(lambda x: 'ID:' in x ,c1)))
symbol=[symbol[num] if len(symbol[num])!=0 else [''] for num in range(len(symbol))]
alias=[alias[num] if len(alias[num])!=0 else [''] for num in range(len(alias))]
#entrez=[entrez[num] if len(entrez[num])!=0 else [''] for num in range(len(entrez))] # 이건 불필요
if human_only:
keep=[index for index in range(len(symbol)) if 'Homo sapiens' in symbol[index][0]]
symbol=[symbol[index] for index in keep]
entrez=[entrez[index] for index in keep]
alias=[alias[index] for index in keep]
organism=[['Not_available'] if symbol[num][0]=='' else [symbol[num][0].split(' [')[1].replace(']','')] for num in range(len(symbol))]
# Finding the provided gene
final_result=[
num for num in range(len(symbol))
if x.lower() in symbol[num][0].lower() or
x.lower() in alias[num][0].lower() or
x in entrez[num][0]
]
fin_symbol=[symbol[index][0].split(': ')[1].split(' and')[0] for index in final_result]
fin_alias=[alias[index][0].replace('Other Aliases: ','').replace(' ','') for index in final_result]
fin_entrez=[entrez[index][0].replace('ID: ','') for index in final_result]
fin_organism=[organism[index][0] for index in final_result]
if len(fin_symbol)==0:
return {'input':[x],'symbol':['Not_available'],'alias':['Not_available'],'entrez':['Not_available'],'organism':['Not_available']}
else:
return {'input':[x],'symbol':fin_symbol,'alias':fin_alias,'entrez':fin_entrez,'organism':fin_organism}
except:
return {'input':x,'symbol':['Not_available'],'alias':['Not_available'],'entrez':['Not_available'],'organism':['Not_available']}
위의 명령어를 활용해 테스트를 해보면 다음과 같이 나온다.
get_entrez(x='TP53')
# {'input': ['TP53'], 'symbol': ['TP53'], 'alias': ['BCC7,BMFS5,LFS1,P53,TRP53'], 'entrez': ['7157'], 'organism': ['Homo sapiens (human)']}
get_entrez(x='TP53',human_only=False)
# {'input': ['TP53'], 'symbol': ['TP53', 'Trp53'], 'alias': ['BCC7,BMFS5,LFS1,P53,TRP53', 'Tp53,bbl,bfy,bhy,p44,p53'], 'entrez': ['7157', '22059'], 'organism': ['Homo sapiens (human)', 'Mus musculus (house mouse)']}
get_entrez(x=1)
# {'input': ['1'], 'symbol': ['A1BG'], 'alias': ['A1B,ABG,GAB,HYST2477'], 'entrez': ['1'], 'organism': ['Homo sapiens (human)']}
entrez ID로 할 경우에 여러가지 아이디가 나올 가능성은 있긴하다.
728x90
반응형
'파이썬3 > biopython' 카테고리의 다른 글
[biopython] fasta파일 불러들이기 (1) | 2023.11.22 |
---|---|
[biopython] NCBI에서 단백질 서열 (protein sequence) 얻기 (0) | 2022.05.30 |