Skip to content

Commit 68663f4

Browse files
committed
* new methods and adaptations to model change
1 parent 946428a commit 68663f4

File tree

8 files changed

+120
-68
lines changed

8 files changed

+120
-68
lines changed

recastapi/analysis/read.py

+28
Original file line numberDiff line numberDiff line change
@@ -15,3 +15,31 @@ def analysis(analysis_id = None):
1515
return responses['_items']
1616
else:
1717
return responses
18+
19+
def analysis_by_pub_identifier(pubtype, pubid):
20+
"""List analysis given uuid or all analyses.
21+
22+
:param uuid: analysis_id.
23+
24+
:return: JSON object containing all analyses retrieved.
25+
"""
26+
27+
query = None
28+
if pubtype == 'cds':
29+
query = 'cds_id=="{}"'.format(pubid)
30+
elif pubtype == 'arxiv':
31+
query = 'arxiv_id=="{}"'.format(pubid)
32+
elif pubtype == 'inspire':
33+
query = 'inspire_id=="{}"'.format(pubid)
34+
elif pubtype == 'recast':
35+
query = 'id=="{}"'.format(pubid)
36+
else:
37+
raise NotImplementedError()
38+
39+
url = '{}{}'.format(recastapi.ENDPOINTS['ANALYSIS'], '?where={}'.format(query))
40+
responses = recastapi.get(url)
41+
42+
if not responses['_items']:
43+
return None
44+
45+
return responses['_items'][0]

recastapi/analysis/write.py

+9-10
Original file line numberDiff line numberDiff line change
@@ -3,21 +3,20 @@
33

44
def analysis(title,
55
collaboration,
6-
e_print,
7-
journal,
86
doi,
9-
inspire_url,
7+
arxiv_id,
8+
inspire_id,
9+
cds_id,
1010
description,
1111
run_condition_name,
1212
run_condition_description):
1313
"""Create a new analysis and Run Condition.
1414
1515
:param title: Title of the analysis.
1616
:param collaboration: Choice among: ALICE, ATLAS, CMS, .
17-
:param e_print: link.
18-
:param journal: Name of journal.
19-
:param doi: Arxiv doi?
20-
:param inspire_url: URL on inspire website.
17+
:param doi: Digital Object Identifier
18+
:param inspire_id: INSPIRE Record identifier
19+
:param arxiv_id: link.
2120
:param description: A detailed description of the analysis.
2221
:param run_condition_name: Name of the run condition.
2322
:param run_condition_descprition: Detailed description of the run condition.
@@ -40,10 +39,10 @@ def analysis(title,
4039
'owner_id':owner_id,
4140
'title':title,
4241
'collaboration':collaboration,
43-
'e_print':e_print,
44-
'journal':journal,
4542
'doi':doi,
46-
'inspire_URL':inspire_url,
43+
'arxiv_id':arxiv_id,
44+
'inspire_id':inspire_id,
45+
'cds_id':cds_id,
4746
'description':description,
4847
'run_condition_id':run_condition_id,
4948
}

recastapi/apicli.py

+46-23
Original file line numberDiff line numberDiff line change
@@ -1,29 +1,17 @@
11
import yaml
22
import json
3+
import recastapi.analysis.read
34
import recastapi.request.write
45
import click
56
import zipfile
67
import tempfile
78
import os
89

9-
@click.command()
10-
@click.argument('specfile')
11-
def createscan(specfile):
12-
spec = yaml.load(open(specfile))
13-
scanrequest = recastapi.request.write.scan_request(
14-
spec['analysis_id'],
15-
spec['title'],
16-
spec['description'],
17-
spec['reason'],
18-
spec['additional_information']
19-
)
20-
21-
parnames = spec['parameters']
22-
points = spec['points']
23-
10+
def addpoints_to_scan(scanid,req_format,parnames,points):
2411
point_requests = []
2512
basic_requests = []
26-
for p in points:
13+
14+
for i,p in enumerate(points):
2715
coordinates = p['coordinates']
2816
data = p['data']
2917

@@ -42,18 +30,53 @@ def createscan(specfile):
4230
raise click.ClickException('point data needs to be zipfiles or directory')
4331

4432
pointdict = dict(zip(parnames,coordinates))
45-
pr = recastapi.request.write.point_request_with_coords(scanrequest['id'],pointdict)
33+
pr = recastapi.request.write.point_request_with_coords(scanid,pointdict)
4634
point_requests += [{'point':pointdict,'id':pr['id']}]
47-
br = recastapi.request.write.basic_request_with_archive(pr['id'],archive)
48-
basic_requests += [{'point':pointdict,'id':br['id']}]
35+
br = recastapi.request.write.basic_request_with_archive(pr['id'],archive,req_format)
36+
basic_requests += [{'point':pointdict,'id':br['id'], 'point_request': pr['id']}]
37+
click.secho('uploaded {}/{} requests'.format(i+1,len(points)))
38+
return point_requests, basic_requests
39+
40+
41+
@click.command()
42+
@click.argument('specfile')
43+
@click.argument('outputfile')
44+
def createscan(specfile,outputfile):
45+
spec = yaml.load(open(specfile))
46+
47+
analysis_info = recastapi.analysis.read.analysis_by_pub_identifier(*spec['pubkey'].split('/'))
48+
if not analysis_info:
49+
raise click.ClickException('Analysis {} not known, import it first.'.format(spec['pubkey']))
50+
51+
scanrequest = recastapi.request.write.scan_request(
52+
analysis_info['id'],
53+
spec['title'],
54+
spec['description'],
55+
spec['reason'],
56+
spec['additional_information']
57+
)
4958

50-
click.echo(yaml.safe_dump({
59+
60+
parnames = spec['parameters']
61+
points = spec['points']
62+
63+
prlist, brlist = addpoints_to_scan(scanrequest['id'],spec['request_format'],parnames,points)
64+
65+
yaml.safe_dump({
5166
'scan_id': scanrequest['id'],
52-
'point_requests': point_requests,
53-
'basic_requests': basic_requests
67+
'point_requests': prlist,
68+
'basic_requests': brlist
5469
},
70+
open(outputfile,'w'),
5571
default_flow_style = False
56-
))
72+
)
73+
74+
@click.command()
75+
@click.argument('specfile')
76+
@click.argument('outputfile')
77+
def addtoscan(specfile,outputfile):
78+
#existing_points = {tuple(x['value'] for x in p['point_coordinates']):p['id'] for p in recastapi.request.read.point_request_of_scan(2) }
79+
pass
5780

5881
if __name__ == '__main__':
5982
createscan()

recastapi/request/read.py

+4-4
Original file line numberDiff line numberDiff line change
@@ -33,13 +33,13 @@ def scan_request(scan_request_id = None, analysis_id = None, query='?max_results
3333

3434
def point_request(point_request_id):
3535
"""" Returns basic JSON. """
36-
url = '{}/{}'.format(recastapi.ENDPOINTS['POINT_REQUESTS'], point_request_id)
36+
url = '{}/{}/?embedded={{"point_coordinates":1,"requests":1}}'.format(recastapi.ENDPOINTS['POINT_REQUESTS'], point_request_id)
3737
response = recastapi.get(url)
3838
return response
3939

4040
def basic_request(basic_request_id):
4141
"""" Returns basic JSON. """
42-
url = '{}/{}'.format(recastapi.ENDPOINTS['BASIC_REQUESTS'], basic_request_id)
42+
url = '{}/{}/?embedded={{"point_request": 1}}'.format(recastapi.ENDPOINTS['BASIC_REQUESTS'], basic_request_id)
4343
response = recastapi.get(url)
4444
return response
4545

@@ -48,7 +48,7 @@ def point_request_of_scan(scan_request_id, point_request_index=None):
4848
:param scan_request_id: the request ID to query
4949
:param point_request_index: starting from 0
5050
"""
51-
point_req_url = '{}?where=scan_request_id=="{}"'.format(
51+
point_req_url = '{}?embedded={{"point_coordinates":1,"requests": 1}}&where=scan_request_id=="{}"'.format(
5252
recastapi.ENDPOINTS['POINT_REQUESTS'],
5353
scan_request_id
5454
)
@@ -93,7 +93,7 @@ def coordinate(point_request_id, coordinate_index=None):
9393

9494

9595
def basic_request_of_point(point_request_id):
96-
basic_url = '{}?where=point_request_id=="{}"'.format(
96+
basic_url = '{}?embedded={{"point_request": 1}}&where=point_request_id=="{}"'.format(
9797
recastapi.ENDPOINTS['BASIC_REQUESTS'],
9898
point_request_id)
9999
return recastapi.get(basic_url)['_items']

recastapi/request/write.py

+6-5
Original file line numberDiff line numberDiff line change
@@ -64,21 +64,22 @@ def point_request_with_coords(scan_request_id,coordinate_map):
6464
coordinate(k,float(v),pr['id'])
6565
return pr
6666

67-
def basic_request(point_request_id):
67+
def basic_request(point_request_id,request_format):
6868
"""Adds basic request
6969
:param point_request_id: ID of the point request
7070
:return: JSON object
7171
"""
7272
user = recastapi.user.read.this_user()
7373
payload = {
74+
'request_format': request_format,
7475
'requester_id': user['id'],
7576
'point_request_id': point_request_id,
7677
}
7778
url = '{}/'.format(recastapi.ENDPOINTS['BASIC_REQUESTS'])
7879
return recastapi.post(url, data=payload)
7980

80-
def basic_request_with_archive(point_request_id,filename):
81-
br = basic_request(point_request_id)
81+
def basic_request_with_archive(point_request_id,filename,request_format):
82+
br = basic_request(point_request_id,request_format)
8283
request_archive(br['id'],filename)
8384
return br
8485

@@ -90,9 +91,9 @@ def request_archive(basic_request_id, filename = None):
9091

9192
files = {'file': open(filename, 'rb')} if filename else {}
9293
url = '{}/'.format(recastapi.ENDPOINTS['REQUEST_ARCHIVES'])
93-
basic_request_response = recastapi.post(
94+
basic_request_archive = recastapi.post(
9495
url,
9596
data=payload,
9697
files=files,
9798
)
98-
return basic_request_response
99+
return basic_request_archive

recastapi/response/read.py

+17-17
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
from termcolor import colored
44
import urllib
55
import yaml
6+
import json
67

78
def scan_response(scan_response_id = None, scan_request_id = None):
89
"""List request depending on criteria
@@ -56,29 +57,28 @@ def point_response(point_response_id = None, point_request_id = None):
5657
return None
5758
return response['_items'][0]
5859

59-
def basic_response(basic_response_id = None, basic_request_id = None):
60+
def basic_response(basic_response_id = None, basic_request_id_filter = None, description_filter = None):
6061
"""" Returns basic JSON. """
6162

62-
if (basic_response_id is None) and (basic_request_id is None):
63-
response = recastapi.get(recastapi.ENDPOINTS['BASIC_RESPONSES'])
64-
return response['_items']
63+
query = {}
64+
if description_filter:
65+
query.update(description = description_filter)
66+
if basic_request_id_filter:
67+
query.update(basic_request_id = basic_request_id_filter)
68+
if basic_response_id:
69+
query.update(id = basic_response_id)
6570

66-
if (basic_response_id is not None) and (basic_request_id is not None):
67-
raise RuntimeError('Cannot fetch basic_response_id and basic_request_id simultaneously')
71+
query = 'where={}'.format(json.dumps(query))
6872

69-
elif basic_response_id is not None:
70-
url = '{}/{}'.format(recastapi.ENDPOINTS['BASIC_RESPONSES'], basic_response_id)
71-
response = recastapi.get(url)
72-
return response
73+
print query
7374

74-
elif basic_request_id is not None:
75-
selection_str = '?where=basic_request_id=="{}"'.format(basic_request_id)
76-
url = '{}{}'.format(recastapi.ENDPOINTS['BASIC_RESPONSES'], selection_str)
77-
response = recastapi.get(url)
78-
assert(len(response['_items']) < 2)
79-
if not response['_items']:
80-
return None
75+
url = '{}/?{}'.format(recastapi.ENDPOINTS['BASIC_RESPONSES'],query)
76+
response = recastapi.get(url)
77+
78+
if basic_response_id:
8179
return response['_items'][0]
80+
else:
81+
return response['_items']
8282

8383
def response_archive(basic_response_id = None, basic_request_id = None, filename = None):
8484
if basic_response_id is None:

recastapi/response/write.py

+7-6
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ def point_response(scan_response_id,point_request_id,result_data):
5555
url = '{}/'.format(recastapi.ENDPOINTS['POINT_RESPONSES'])
5656
return recastapi.post(url, json=payload)
5757

58-
def basic_response(point_response_id,basic_request_id,result_data):
58+
def basic_response(point_response_id,basic_request_id,result_data, description, replace_existing = True):
5959
"""Adds basic request
6060
:param point_response_id: ID of the point response
6161
:param basic_request_id: ID of the basic request
@@ -66,11 +66,13 @@ def basic_response(point_response_id,basic_request_id,result_data):
6666
'model_id': None,
6767
'basic_request_id': basic_request_id,
6868
'point_response_id': point_response_id,
69+
'description': description
6970
}
7071
payload.update(**result_data)
7172

72-
existing = recastapi.response.read.basic_response(basic_request_id = basic_request_id)
73-
if existing:
73+
existing = recastapi.response.read.basic_response(basic_request_id_filter = basic_request_id, description_filter = description)
74+
if existing and replace_existing:
75+
existing = existing[0]
7476
url = '{}/{}'.format(recastapi.ENDPOINTS['BASIC_RESPONSES'],existing['id'])
7577
existing.update(**payload)
7678
existing = {k:v for k,v in existing.iteritems() if not (k.startswith('_') or k=='id')}
@@ -79,9 +81,8 @@ def basic_response(point_response_id,basic_request_id,result_data):
7981
url = '{}/'.format(recastapi.ENDPOINTS['BASIC_RESPONSES'])
8082
return recastapi.post(url, json=payload)
8183

82-
83-
def basic_response_with_archive(point_response_id,basic_request_id,filename, result_data):
84-
br = basic_response(point_response_id,basic_request_id,result_data)
84+
def basic_response_with_archive(point_response_id,basic_request_id,result_data,description,filename):
85+
br = basic_response(point_response_id,basic_request_id,result_data,description)
8586
response_archive(br['id'],filename)
8687
return br
8788

tests/test_files.py

+3-3
Original file line numberDiff line numberDiff line change
@@ -25,10 +25,10 @@
2525
print colored('Add Analaysis POST METHOD', 'green')
2626
print recastapi.analysis.create(title='test adding analysis from SDK',
2727
collaboration='CMS',
28-
e_print='http://example.com',
29-
journal='example journal',
3028
doi='1211.121121',
31-
inspire_url='http://example.com',
29+
inspire_id='1234',
30+
arxiv_id='56780',
31+
cds_id='938472',
3232
description='this is a test',
3333
run_condition_name='Name of this run condition',
3434
run_condition_description='and finally the description')

0 commit comments

Comments
 (0)