Post

SRA meta data parsing

python으로 전체 SRA data중 원하는 데이터 골라내기

SRA가 뭔지에 대한 설명은 여기 참고

여기에선 SRA Metadata 를 활용해서 원하는 Raw data를 찾는 방법을 소개한다.

🤨⁉️ 지금까지 publish 된 데이터 중에서 single cell관련된 데이터 만을 모으고 싶다.

SRA metadata download

https://ftp-trace.ncbi.nlm.nih.gov/sra/reports/Metadata/ 이쪽으로 가면 지금까지 나온 전체 SRA accession에 해당하는 metadata를 다운 받을 수 있다. 가장 최신&Full버전으로 다운 받아주면 된다.

1
2
3
4
wget https://ftp-trace.ncbi.nlm.nih.gov/sra/reports/Metadata/NCBI_SRA_Metadata_Full_20240520.tar.gz

ls -l Metadata | grep "SRA" | grep "^d" > SRAaccession_list.txt
sed 's/ /\t/g' SRAaccession_list.txt | cut -f 9 > SRAaccession.txt

Metadata는 xml형식으로 작성되어 있다. 작성일 기준 20210715.tar.gz 파일에는 1,053,754개의 accession number가 있었다.

하나의 SRA number가 폴더형식으로 존재하고 그 아래 experiment.xml이나 study.xml 파일이 들어있는 형태. extperiment, study 둘다 존재 할 수도 있고 둘중 하나만 있을 수도 있다.

일단은 xml 파일 형태로는 parsing이 어려우니 table형태로 재가공 한 후, 원하는 단어가 들어 있는 SRA accession만 추출해내는 방식으로 진행했다.

Converting XML files to Table form

  • experiment.xml 으로 정리
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
import os, glob, datetime

#SRA 284만개
main_dir = "/storage2/Project/subin/Project06_scNDB/01.Data/SRAdb/XML"

SRA_accession_list = open("%s/SRAaccession.txt"%main_dir)

SRA_parsing_out = open('%s/SRA_exp_accession_xml_parsing.txt'%main_dir, 'w')
SRA_no_exp_out = open('%s/SRA_no_exp.txt'%main_dir, 'w')


for  id_list in SRA_accession_list:
	accession_id = id_list.split('\n')[0]
	project_accession = ""
	exp_accession = ""
	sample_accession = ""
	title = ""
	lib_instrument = ""
	lib_strategy = ""
	lib_source = ""
	lib_protocol = ""
	try: 
		exp_xml = open("%s/Metadata/%s/%s.experiment.xml"%(main_dir,accession_id,accession_id))
		for line in exp_xml:
			if '<PRIMARY_ID>SRP' in line :
				project_accession = line.split('<PRIMARY_ID>')[1].split('</PRIMARY_ID>')[0]
				continue
			elif '<PRIMARY_ID>SRX' in line :
				exp_accession = line.split('<PRIMARY_ID>')[1].split('</PRIMARY_ID>')[0]
				continue
			elif '<PRIMARY_ID>SRS' in line :
				sample_accession = line.split('<PRIMARY_ID>')[1].split('</PRIMARY_ID>')[0]
				continue
			elif '<TITLE>' in line :
				title = line.split('<TITLE>')[1].split('</TITLE>')[0]
				continue
			elif '<INSTRUMENT_MODEL>' in line :
				lib_instrument = line.split('<INSTRUMENT_MODEL>')[1].split('</INSTRUMENT_MODEL>')[0]
				continue
			elif '<LIBRARY_STRATEGY>' in line :
				lib_strategy = line.split('<LIBRARY_STRATEGY>')[1].split('</LIBRARY_STRATEGY>')[0]
				continue
			elif '<LIBRARY_SOURCE>' in line :
				lib_source = line.split('<LIBRARY_SOURCE>')[1].split('</LIBRARY_SOURCE>')[0]
				continue
			elif '<LIBRARY_CONSTRUCTION_PROTOCOL>' in line :
				lib_protocol = line.split('<LIBRARY_CONSTRUCTION_PROTOCOL>')[1].split('</LIBRARY_CONSTRUCTION_PROTOCOL>')[0]
				continue

		SRA_parsing_out.write("%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\n"%(accession_id,project_accession,exp_accession,sample_accession,title,lib_instrument,lib_strategy,lib_source,lib_protocol))
	except:
		SRA_no_exp_out.write("%s\n"%accession_id)

SRA_parsing_out.close()
SRA_no_exp_out.close()
  • study.xml 로 정리
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
import os, glob, datetime

#SRA 284만개
main_dir = "/storage2/Project/subin/Project06_scNDB/01.Data/SRAdb/XML"

SRA_accession_list = open("%s/SRAaccession.txt"%main_dir)

SRA_study_parsing_out = open('%s/SRA_study_accession_xml_parsing.txt'%main_dir, 'w')
SRA_no_study_out = open('%s/SRA_no_study.txt'%main_dir, 'w')

for  id_list in SRA_accession_list:
	accession_id = id_list.split('\n')[0]
	project_accession = ""
	Bioproject_accession = ""
	GEO_accession = ""
	Study_title = ""
	Study_abstract = ""
	try: 
		study_xml = open("%s/Metadata/%s/%s.study.xml"%(main_dir,accession_id,accession_id))
		for line in study_xml:
			if '<PRIMARY_ID>SRP' in line :
				project_accession = line.split('<PRIMARY_ID>')[1].split('</PRIMARY_ID>')[0]
				continue
			elif '<EXTERNAL_ID namespace="BioProject" label="primary">' in line :
				Bioproject_accession = line.split('<EXTERNAL_ID namespace="BioProject" label="primary">')[1].split('</EXTERNAL_ID>')[0]
				continue
			elif '<EXTERNAL_ID namespace="GEO">' in line :
				GEO_accession = line.split('<EXTERNAL_ID namespace="GEO">')[1].split('</EXTERNAL_ID>')[0]
				continue
			elif '<STUDY_TITLE>' in line :
				Study_title = line.split('<STUDY_TITLE>')[1].split('</STUDY_TITLE>')[0]
				continue
			elif '<STUDY_ABSTRACT>' in line :
				Study_abstract = line.split('<STUDY_ABSTRACT>')[1].split('</STUDY_ABSTRACT>')[0]
				continue
		SRA_study_parsing_out.write("%s\t%s\t%s\t%s\t%s\t%s\t\n"%(accession_id,project_accession,Bioproject_accession,GEO_accession,Study_title,Study_abstract))
	except:
		SRA_no_study_out.write("%s\n"%accession_id)

SRA_study_parsing_out.close()
SRA_no_study_out.close()
This post is licensed under CC BY 4.0 by the author.

© Subin Cho. Some rights reserved.

Using the Chirpy theme for Jekyll.