Skip to content

Commit 7619b44

Browse files
author
tcnichol
committed
initial commit, add first todo
new method for getting exp id adding brapi endpoints adding methods for brapi calls brapi get studies, brapi get studies/germplasm added removing todo since experiment_id added to sites json method for getting map of site_ids and cultivar info per experiment id. using brapi to get map of cultivars by site_id, this is added to cached sites json file and then added to site metadata in lemnatec fixing unicode u adding site names, this will help since brapi endpoint that gives treatments has studyDbId, but not siteid - it has sitename adding treatments to cached sites file treatments added to metadata some plots do not have cultivar or treatment data available. in these cases the site entry will have 'no info available' as the value for cultivar and treatments all dict entries now strings check for keys replaces try/except, ending W or E removed these changes work with an issue and pull request created in brapi. pagination did not work properly for the observationunits endpoint using observationUnitName and not location_abbrevation using 'definition' instead of 'treatment_description' to match actual key in bety db adding page size to call to brapi observationunits using one method brapi_get to make all requests still need to fix getting all the observationunits iterate through results for observation units page by page one method brapi_get handles the brapi url, and version method also paginates through results new brapi.py class - brapi methods moved there v1 added to endpoints, not read from environment variable no need to remove ending W or E from plot names
1 parent 266b394 commit 7619b44

File tree

3 files changed

+150
-1
lines changed

3 files changed

+150
-1
lines changed

terrautils/betydb.py

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,9 +8,13 @@
88
from datetime import datetime
99

1010
import requests
11+
import urllib
1112
import json
1213
from osgeo import ogr
14+
import brapi
1315

16+
BRAPI_URL="https://brapi.workbench.terraref.org/brapi"
17+
BRAPI_VERSION="v1"
1418

1519
BETYDB_URL="https://terraref.ncsa.illinois.edu/bety"
1620
BETYDB_LOCAL_CACHE_FOLDER = os.environ.get('BETYDB_LOCAL_CACHE_FOLDER', '/home/extractor/')
@@ -236,12 +240,23 @@ def get_sites(filter_date='', include_halves=False, **kwargs):
236240
if query_data:
237241
results = []
238242
for exp in query_data:
243+
exp_site_cultivar_map = brapi.get_site_id_cultivar_info_map(exp['id'])
239244
start = datetime.strptime(exp['start_date'], '%Y-%m-%d')
240245
end = datetime.strptime(exp['end_date'], '%Y-%m-%d')
241246
if start <= targ_date <= end:
242247
if 'sites' in exp:
243248
for t in exp['sites']:
244249
s = t['site']
250+
s['experiment_id'] = exp['id']
251+
current_site_id = s['id']
252+
if current_site_id in exp_site_cultivar_map:
253+
cultivar_info_for_site = exp_site_cultivar_map[s['id']]['cultivar']
254+
treatment_info_for_site = exp_site_cultivar_map[s['id']]['treatments']
255+
s['cultivar'] = cultivar_info_for_site
256+
s['treatments'] = treatment_info_for_site
257+
else:
258+
s['cultivar'] = 'no info'
259+
s['treatments'] = 'no info'
245260
# TODO: Eventually find better solution for S4 half-plots - they are omitted here
246261
if (s["sitename"].endswith(" W") or s["sitename"].endswith(" E")) and not include_halves:
247262
continue
@@ -327,4 +342,4 @@ def submit_traits(csv, filetype='csv', betykey='', betyurl=''):
327342
return resp.json()['data']['ids_of_new_traits']
328343
else:
329344
logging.error("Error submitting data to BETYdb: %s -- %s" % (resp.status_code, resp.reason))
330-
resp.raise_for_status()
345+
resp.raise_for_status()

terrautils/brapi.py

Lines changed: 130 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,130 @@
1+
"""brapi
2+
3+
This module provides wrappers to BRAPI API for getting and posting data.
4+
"""
5+
6+
import os
7+
8+
import requests
9+
import urllib
10+
11+
BRAPI_URL="https://brapi.workbench.terraref.org/brapi"
12+
BRAPI_VERSION="v1"
13+
14+
15+
def brapi_get(path='',request_params=None):
16+
brapi_url = os.environ.get('BRAPI_URL', BRAPI_URL)
17+
path = 'brapi/'+path
18+
request_url = urllib.parse.urljoin(brapi_url, path)
19+
20+
result = []
21+
22+
if request_params:
23+
r = requests.get(url=request_url, params=request_params)
24+
totalPages = r.json()['metadata']['pagination']['totalPages']
25+
current_data = r.json()['result']['data']
26+
result.extend(current_data)
27+
if totalPages > 1:
28+
for i in range(1, totalPages -1):
29+
request_params['page']=i
30+
r = requests.get(url=request_url, params=request_params)
31+
current_data = r.json()['result']['data']
32+
result.extend(current_data)
33+
return result
34+
else:
35+
r = requests.get(url=request_url)
36+
totalPages = r.json()['metadata']['pagination']['totalPages']
37+
current_data = r.json()['result']['data']
38+
result.extend(current_data)
39+
if totalPages > 1:
40+
for i in range(1, totalPages -1):
41+
request_params['page']=i
42+
r = requests.get(url=request_url, params=request_params)
43+
current_data = r.json()['result']['data']
44+
result.extend(current_data)
45+
return result
46+
47+
48+
def get_brapi_study(studyDbId):
49+
"""return study from brapi based on brapi url"""
50+
studies_path = 'v1/studies'
51+
request_params = {'studyDbId': studyDbId}
52+
studies_result = brapi_get(path=studies_path, request_params=request_params)
53+
return studies_result
54+
55+
56+
def get_brapi_observationunits(studyDbId):
57+
observation_units_path = 'v1/observationunits'
58+
request_params = {'studyDbId': studyDbId}
59+
observationunits_result = brapi_get(path=observation_units_path, request_params=request_params)
60+
61+
return observationunits_result
62+
63+
64+
def get_brapi_study_layouts(studyDbId):
65+
"""return study layouts from brapi based on brapi url"""
66+
current_path = 'v1/studies/' + str(studyDbId) + '/layouts'
67+
data = brapi_get(path=current_path)
68+
69+
site_id_layouts_map = {}
70+
71+
for entry in data:
72+
site_id = str(entry['observationUnitDbId'])
73+
site_name = str(entry['observationUnitName'])
74+
cultivar_id = str(entry['germPlasmDbId'])
75+
site_info = {}
76+
site_info['sitename'] = site_name
77+
site_info['germplasmDbId'] = cultivar_id
78+
site_id_layouts_map[site_id] = site_info
79+
return site_id_layouts_map
80+
81+
82+
def get_brapi_study_germplasm(studyDbId):
83+
current_path = 'v1/studies/' + str(studyDbId) + '/germplasm'
84+
data = brapi_get(current_path)
85+
86+
germplasm_id_data_map = {}
87+
for entry in data:
88+
germplasm = {}
89+
germplasm['germplasmName'] = str(entry['germplasmName'])
90+
germplasm['species'] = str(entry['species'])
91+
germplasm['genus'] = str(entry['genus'])
92+
germplasm['germplasmDbId'] = str(entry['germplasmDbId'])
93+
germplasm_id_data_map[str(entry['germplasmDbId'])] = germplasm
94+
95+
return germplasm_id_data_map
96+
97+
98+
def get_experiment_observation_units_map(studyDbId):
99+
data = get_brapi_observationunits(studyDbId)
100+
location_name_treatments_map = {}
101+
for entry in data:
102+
treatment = {}
103+
treatment['definition'] = str(entry['observationtreatment'])
104+
treatment['id'] = str(entry['treatmentDbId'])
105+
treatment['experiment_id'] = str(entry['studyDbId'])
106+
location_name_treatments_map[str(entry['observationUnitName'])] = treatment
107+
return location_name_treatments_map
108+
109+
110+
def get_site_id_cultivar_info_map(studyDbId):
111+
layouts = get_brapi_study_layouts(studyDbId)
112+
germplasm = get_brapi_study_germplasm(studyDbId)
113+
observationunits = get_experiment_observation_units_map(studyDbId)
114+
115+
site_ids = layouts.keys()
116+
117+
for site_id in site_ids:
118+
corresponding_site_cultivar_id = layouts[site_id]['germplasmDbId']
119+
corresponding_site_name = layouts[site_id]['sitename']
120+
if corresponding_site_cultivar_id in germplasm:
121+
cultivar_info_from_germplasm = germplasm[corresponding_site_cultivar_id]
122+
layouts[site_id]['cultivar'] = cultivar_info_from_germplasm
123+
else:
124+
layouts[site_id]['cultivar'] = 'no info'
125+
if corresponding_site_name in observationunits:
126+
treatment_info = observationunits[corresponding_site_name]
127+
layouts[site_id]['treatments'] = treatment_info
128+
else:
129+
layouts[site_id]['treatments'] = 'no info'
130+
return layouts

terrautils/lemnatec.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -116,6 +116,10 @@ def _get_sites(cleaned_md, date, sensorId):
116116
site_id = str(bety_site["id"])
117117
sites[site_id] = {}
118118
sites[site_id]["sitename"] = bety_site["sitename"]
119+
sites[site_id]["experiment_id"] = bety_site["experiment_id"]
120+
sites[site_id]["treatments"] = bety_site["treatments"]
121+
sites[site_id]["cultivar"] = bety_site["cultivar"]
122+
119123
if "view_url" in bety_site:
120124
sites[site_id]["url"] = bety_site["view_url"]
121125
else:

0 commit comments

Comments
 (0)