# MS2PIP Server API MS2PIP Server can be accessed through the webpage or through a RESTful API. While this page provides an example Python script for contacting the API, the Swagger-generated documentation can be found here: https://iomics.ugent.be/ms2pip/api/v2.
The following Python function contacts the MS2PIP Server RESTful API:
```python def run_ms2pip_server(peptides, frag_method, ptm_list, url=’https://iomics.ugent.be/ms2pip/api/v2’):
# Check if all columns are present in dataframe for col in [‘spec_id’, ‘peptide’, ‘charge’, ‘modifications’]:
- if col not in peptides.columns:
print(“{} is missing from peptides DataFrame”.format(col)) return None
# Split-up into batches of 100 000 peptides (maximum MS2PIP Server accepts per request) batch_size = 100000 result = pd.DataFrame() for i in list(range(0, len(peptides), batch_size)):
print(“Working on batch {}/{}”.format(int(i / batch_size + 1), len(peptides) // batch_size + 1)) peptides_batch = peptides.iloc[i:i+batch_size, :]
# Combine data into dictionary for json post request input_data = {
- “params”: {
“frag_method”: frag_method, “ptm”: ptm_list
}, “peptides”: peptides_batch.to_dict(orient=’list’)
}
# Post data to server and get task id response = requests.post(‘{}/task’.format(url), json=input_data) if ‘task_id’ not in response.json():
- if ‘error’ in response.json():
print(“Server error: {}”.format(response.json()[‘error’]))
- else:
print(“Something went wrong”)
return None
task_id = response.json()[‘task_id’] print(“Received task id: {}”.format(task_id))
# Check server task status and get result when ready sleep(1) response = requests.get(‘{}/task/{}/status’.format(url, task_id)) state = response.json()[‘state’]
- if state != ‘SUCCESS’:
print(“Check MS2PIP Server status every 5 seconds”, end=’’) state = ‘PENDING’ pending_count = 0
- while state == ‘PENDING’ or state == ‘PROGRESS’:
sleep(5) print(‘.’, end=’’) response = requests.get(‘{}/task/{}/status’.format(url, task_id)) state = response.json()[‘state’]
# Do not keep looping if task state is stuck on PENDING, it might have failed silently if state == ‘PENDING’:
pending_count += 1
- if pending_count > 24:
print(”nSomething went wrong”) return None
print(‘’)
- if state == ‘SUCCESS’:
response = requests.get(‘{}/task/{}/result’.format(url, task_id)) result_batch = pd.DataFrame.from_dict(response.json())[‘ms2pip_out’] result_batch = result_batch[[‘spec_id’, ‘charge’, ‘ion’, ‘ionnumber’, ‘mz’, ‘prediction’]] result = result.append(result_batch) print(“Result received”, end=’nn’)
- else:
error_message = response.json()[‘status’] print(“Something went wrong: {}”.format(error_message)) return None
print(“Finished with all batches!”)
return result
The function takes three arguments: peptides, frag_method and ptm_list. peptides is an MS2PIP PEPREC-formatted Pandas DataFrame. ptm_list is a list of MS2PIP formatted PTM definitions. A detailed explanation of both data structures can be found on the [MS2PIP Server webpage](https://iomics.ugent.be/ms2pip/#howto). frag_method is the specific model with which you want to predict peak intensities (e.g. HCD, CID, iTRAQ…) Checkout [README.md](https://github.com/compomics/ms2pip_c/#ms2pip-models) for a list of all available models.
The function also takes an argument url, in which you can provide a custom URL to the server. By default this is https://iomics.ugent.be/ms2pip/api.
An example for running the function: ```python # Define arguments frag_method = ‘HCD’ ptm_list = [
‘Oxidation,15.994915,M’, ‘Carbamidomethyl,57.021464,C’, ‘PhosphoS,79.966331,S’, ‘PhosphoT,79.966331,T’, ‘PhosphoY,79.966331,Y’, ‘Glu->pyro-Glu,-18.010565,E’, ‘Gln->pyro-Glu,-17.026549,Q’, ‘Pyro-carbamidomethyl,39.994915,C’, ‘Deamidated,0.984016,N’, ‘iTRAQ,144.102063,N-term’
] peptides = pd.DataFrame(data={
‘spec_id’: [‘peptide1’, ‘peptide2’], ‘peptide’: [‘STCINTFWLIVK’, ‘GRLNTFILK’], ‘modifications’: [‘3|Carbamidomethyl’, ‘-‘], ‘charge’: [2, 3]
})
# Run function result = run_ms2pip_server(peptides, frag_method, ptm_list) ```