--- layout: default navsection: userguide title: "Tutorial: Search PGP data by trait" navorder: 23 --- h1. Tutorial: Search PGP data by trait Here you will use the Python SDK to find public WGS data for people who have a certain medical condition. h3. Prerequisites * Log in to a VM "using SSH":ssh-access.html * Put an "API token":api-tokens.html in your @ARVADOS_API_TOKEN@ environment variable * Put the API host name in your @ARVADOS_API_HOST@ environment variable * Run the @python@ interactive shell. If everything is set up correctly, you will be able to import the arvados SDK:
import arvados
...and display your account information:
arvados.service.users().current().execute()
h3. More prerequisites
import re
import json
h3. Find traits. List traits containing the term "cancer":
for t in filter(lambda t: re.search('cancer', t['name']),
                arvados.service.traits().list(limit=1000).execute()['items']):
  print t['uuid'], t['name']

...
qr1hi-q1cn2-8q57g2diohwnzm0 Cervical cancer
qr1hi-q1cn2-vqp4243janpjbyj Breast cancer
qr1hi-q1cn2-v6usijujcpwqrn1 Non-melanoma skin cancer
...
We will use the "Non-melanoma skin cancer" trait with uuid @qr1hi-q1cn2-v6usijujcpwqrn1@.
trait_uuid = 'qr1hi-q1cn2-v6usijujcpwqrn1'
h3. Find humans. List humans who report this condition:
trait_links = arvados.service.links().list(limit=1000,where=json.dumps({
    'link_class': 'human_trait',
    'tail_kind': 'arvados#human',
    'head_uuid': trait_uuid
  })).execute()['items']
The "tail_uuid" attribute of each of these Links refers to a Human.
map(lambda l: l['tail_uuid'], trait_links)
[u'1h9kt-7a9it-c0uqa4kcdh29wdf', u'1h9kt-7a9it-x4tru6mn40hc6ah',
u'1h9kt-7a9it-yqb8m5s9cpy88i8', u'1h9kt-7a9it-46sm75w200ngwny',
u'1h9kt-7a9it-gx85a4tdkpzsg3w', u'1h9kt-7a9it-8cvlaa8909lgeo9',
u'1h9kt-7a9it-as37qum2pq8vizb', u'1h9kt-7a9it-14fph66z2baqxb9',
u'1h9kt-7a9it-e9zc7i4crmw3v69', u'1h9kt-7a9it-np7f35hlijlxdmt',
u'1h9kt-7a9it-j9hqyjwbvo9cojn', u'1h9kt-7a9it-lqxdtm1gynmsv13',
u'1h9kt-7a9it-zkhhxjfg2o22ywq', u'1h9kt-7a9it-nsjoxqd33lzldw9',
u'1h9kt-7a9it-ytect4smzcgd4kg', u'1h9kt-7a9it-y6tl353b3jc4tos',
u'1h9kt-7a9it-98f8qave4f8vbs5', u'1h9kt-7a9it-gd72sh15q0p4wq3',
u'1h9kt-7a9it-zlx25dscak94q9h', u'1h9kt-7a9it-8gronw4rbgmim01',
u'1h9kt-7a9it-wclfkjcb23tr5es', u'1h9kt-7a9it-rvp2qe7szfz4dy6',
u'1h9kt-7a9it-50iffhmpzsktwjm', u'1h9kt-7a9it-ul412id5y31a5o8',
u'1h9kt-7a9it-732kwkfzylmt4ik', u'1h9kt-7a9it-v9zqxegpblsbtai',
u'1h9kt-7a9it-kmaraqduit1v5wd', u'1h9kt-7a9it-t1nwtlo1hru5vvq',
u'1h9kt-7a9it-q3w6j9od4ibpoyl', u'1h9kt-7a9it-qz8vzkuuz97ezwv',
u'1h9kt-7a9it-t1v8sjz6dm9jmjf', u'1h9kt-7a9it-qe8wrbyvuqs5jew']
h3. Find PGP IDs. For now we don't need to look up the Human objects themselves. As an aside, we will look up "identifier" links to find PGP-assigned participant identifiers:
human_uuids = map(lambda l: l['tail_uuid'], trait_links)
pgpid_links = arvados.service.links().list(limit=1000,where=json.dumps({
    "link_class": "identifier",
    "head_uuid": human_uuids
  })).execute()['items']
map(lambda l: l['name'], pgpid_links)
[u'hu01024B', u'hu11603C', u'hu15402B', u'hu174334', u'hu1BD549', u'hu237A50',
 u'hu34A921', u'hu397733', u'hu414115', u'hu43860C', u'hu474789', u'hu553620',
 u'hu56B3B6', u'hu5917F3', u'hu599905', u'hu5E55F5', u'hu602487', u'hu633787',
 u'hu68F245', u'hu6C3F34', u'hu7260DD', u'hu7A2F1D', u'hu94040B', u'hu9E356F',
 u'huAB8707', u'huB1FD55', u'huB4883B', u'huD09050', u'huD09534', u'huD3A569',
 u'huDF04CC', u'huE2E371']
These PGP IDs let us find public profiles: * "https://my.personalgenomes.org/profile/huE2E371":https://my.personalgenomes.org/profile/huE2E371 * "https://my.personalgenomes.org/profile/huDF04CC":https://my.personalgenomes.org/profile/huDF04CC * ... h3. Find data. Find Collections that were provided by these Humans.
provenance_links = arvados.service.links().list(where=json.dumps({
    "link_class": "provenance",
    "name": "provided",
    "tail_uuid": human_uuids
  })).execute()['items']
collection_uuids = map(lambda l: l['head_uuid'], provenance_links)

# build map of human uuid -> PGP ID
pgpid = {}
for pgpid_link in pgpid_links:
  pgpid[pgpid_link['head_uuid']] = pgpid_link['name']

# build map of collection uuid -> PGP ID
for p_link in provenance_links:
  pgpid[p_link['head_uuid']] = pgpid[p_link['tail_uuid']]

# get details (e.g., list of files) of each collection
collections = arvados.service.collections().list(where=json.dumps({
    "uuid": collection_uuids
  })).execute()['items']

# print PGP public profile links with file locators
for c in collections:
  for f in c['files']:
    print "https://my.personalgenomes.org/profile/%s %s %s%s" % (pgpid[c['uuid']], c['uuid'], ('' if f[0] == '.' else f[0]+'/'), f[1])

https://my.personalgenomes.org/profile/hu43860C a58dca7609fa84c8c38a7e926a97b2fc+302+K@qr1hi var-GS00253-DNA_A01_200_37-ASM.tsv.bz2
https://my.personalgenomes.org/profile/huB1FD55 ea30eb9e46eedf7f05ed6e348c2baf5d+291+K@qr1hi var-GS000010320-ASM.tsv.bz2
https://my.personalgenomes.org/profile/huDF04CC 4ab0df8f22f595d1747a22c476c05873+242+K@qr1hi var-GS000010427-ASM.tsv.bz2
https://my.personalgenomes.org/profile/hu7A2F1D 756d0ada29b376140f64e7abfe6aa0e7+242+K@qr1hi var-GS000014566-ASM.tsv.bz2
https://my.personalgenomes.org/profile/hu553620 7ed4e425bb1c7cc18387cbd9388181df+242+K@qr1hi var-GS000015272-ASM.tsv.bz2
https://my.personalgenomes.org/profile/huD09534 542112e210daff30dd3cfea4801a9f2f+242+K@qr1hi var-GS000016374-ASM.tsv.bz2
https://my.personalgenomes.org/profile/hu599905 33a9f3842b01ea3fdf27cc582f5ea2af+242+K@qr1hi var-GS000016015-ASM.tsv.bz2
https://my.personalgenomes.org/profile/hu599905 d6e2e57cd60ba5979006d0b03e45e726+81+K@qr1hi Witch_results.zip
https://my.personalgenomes.org/profile/hu553620 ea4f2d325592a1272f989d141a917fdd+85+K@qr1hi Devenwood_results.zip
https://my.personalgenomes.org/profile/hu7A2F1D 4580f6620bb15b25b18373766e14e4a7+85+K@qr1hi Innkeeper_results.zip
https://my.personalgenomes.org/profile/huD09534 fee37be9440b912eb90f5e779f272416+82+K@qr1hi Hallet_results.zip
h3. Search for a variant. Look for variant rs1126809 in each of the "var" files (these contain variant calls from WGS data).
job = {}
for c in collections:
  if [] != filter(lambda f: re.search('^var-.*\.tsv\.bz2', f[1]), c['files']):
    job[c['uuid']] = arvados.service.jobs().create(job=json.dumps({
      'script': 'grep',
      'script_parameters': {'input': c['uuid'], 'pattern': "rs1126809\\b"},
      'script_version': 'e7aeb42'
    })).execute()
    print "%s %s" % (pgpid[c['uuid']], job[c['uuid']]['uuid'])

hu43860C qr1hi-8i9sb-wyqq2eji4ehiwkq
huB1FD55 qr1hi-8i9sb-ep68uf0jkj3je7q
huDF04CC qr1hi-8i9sb-4ts4cvx6mbtcrsk
hu7A2F1D qr1hi-8i9sb-5lkiu9sh7vdgven
hu553620 qr1hi-8i9sb-nu4p6hjmziic022
huD09534 qr1hi-8i9sb-bt9389e9g3ff0m1
hu599905 qr1hi-8i9sb-ocg0i8r75luvke3
Monitor job progress by refreshing the Jobs page in Workbench, or by using the API:
map(lambda j: arvados.service.jobs().get(uuid=j['uuid']).execute()['success'], job.values())
[True, True, True, True, True, True, True]
(Unfinished jobs will appear as None, failed jobs as False, and completed jobs as True.) After the jobs have completed, check output file sizes.
for collection_uuid in job:
  job_uuid = job[collection_uuid]['uuid']
  job_output = arvados.service.jobs().get(uuid=job_uuid).execute()['output']
  output_files = arvados.service.collections().get(uuid=job_output).execute()['files']
  print "%s %3d %s" % (pgpid[collection_uuid], output_files[0][2], job_output)

hu599905  80 5644238bfb2a1925d423f2c264819cfb+75+K@qr1hi
huD09534  80 f98f92573cf521333607910d320cc33b+75+K@qr1hi
huB1FD55   0 c10e07d8d90b51ee7f3b0a5855dc77c3+65+K@qr1hi
hu7A2F1D  80 922c4ce8d3dab3268edf8b9312cc63d4+75+K@qr1hi
hu553620   0 66da988f45a7ee16b6058fcbe9859d69+65+K@qr1hi
huDF04CC  80 bbe919451a437dde236a561d4e469ad2+75+K@qr1hi
hu43860C   0 45797e38410de9b9ddef2f4f0ec41a93+76+K@qr1hi
Thus, of the 7 WGS results available for PGP participants reporting non-melanoma skin cancer, 4 include the rs1126809 / TYR-R402Q variant.