본문 바로가기

파이썬3/biopython

[biopython] Gene symbol/alias/Entrez id얻기

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
반응형