Quick Start

This page gives an introduction on how to get started with the ambra-sdk library. First, make sure that ambra-sdk is installed and up-to-date. Let’s get started with some simple examples.

Init API

Begin by importing the ambra-sdk module:

from ambra_sdk.api import Api

To use ambra-sdk one needs to know the url of AmbraHealth API and SID.

api = Api.with_sid(url, sid)  # Init API with sid

Note

Usually, URL has a form:

url = https://ambrahealth_host/api/v3

Another option is to use user credentials (username and password) and ambra-sdk takes care of using the sid for the session:

api = Api.with_creds(url, username, password)

client_name to ambra-sdk constructors can be used. This value will be added to the SDK request headers. Thus, AmbraHealth will be able to understand and log who exactly is making requests to help troubleshoot issues.

api = Api.with_creds(url, username, password, client_name)

Service API

All ambra-sdk service API methods are described in the AmbraHealth Service API document and all of them are divided by namespaces. In ambra-sdk we have the same separation of methods by namespaces.

All methods in AmbraHealth service API can be divided on two groups:

  • Methods with one result

  • Methods with multiple results

In order to deal with the first group, use get() method for getting results from a prepared request. Alternatively, multiple results can be retrieved by using first() or all() methods to get the first row of results or getting an iterator over all results.

For example, let’s request your user information. This is user method in session namespace, so we should use an api.Session.user method of ambra-sdk.

This is a simple method with only one result, so for fetching data from the service, use the get() method:

from ambra_sdk.api import Api
api = Api.with_creds(url, username, password)
user_info = api.Session.user().get()
print(user_info.email)

Let’s look at another example where we are using methods that return multiple results. One of these methods is the account list method.

Let’s get a first object in results:

account = api.Account.list().first()

all() method returns an iterator over all elements:

# Get all accounts
accounts = api.Account.list().all()

One can use slices for skipping and taking some number of results:

# Get 7 results after skipping the first 5 rows.
accounts = api.Account.list().all()[5:12]

Now, iterate over all accounts:

for account in accounts:
    account_name = account.name

Note

ambra-sdk all() method returns a lazy iterator. It means that we request new data from AmbraHealth API only when we actually need it.

Storage API

All ambra-sdk storage API methods are described in the AmbraHealth Storage API document .

As in the server documentation in ambra-sdk, all api requests to storage are divided into Study and Image namespaces.

For accessing storage api methods, use the ambra-sdk api.Storage namespace.

For example, let’s try to upload a dicom file to your user namespace.

Let’s get your user namespace_id and engine_fqdn using ambra-sdk service api User.get and Namespaces.engine_fqdn methods:

user = api.User.get().get()
namespace_id = user.namespace_id
fqdn = api.Namespace.engine_fqdn(namespace_id=namespace_id).get()
engine_fqdn = fqdn.engine_fqdn

Then, upload dicom file to the storage:

dicom_path = 'PATH_TO_DICOM'
with open(dicom_path, 'rb') as dicom_file:
    uploaded_image = api.Storage.Image.upload(
        engine_fqdn=fqdn.engine_fqdn,
        namespace=namespace_id,
        opened_file=dicom_file,
    )

Note

Unlike service API methods, storage methods do not use get(), first() or all().

Addon methods

All service and storage api methods are described in the AmbraHealth specification documents. In ambra-sdk, all methods outside of this specifications are placed in the Addon namespace.

For example, one common task is to upload a new study in AmbraHealth, upload dicom files to storage, and wait for a new study object in service. Use api.Addon.Study.upload_and_get method:

from pathlib import Path
study_dir = Path('/path_to_study_dir')

new_study = api.Addon.Study.upload_and_get(
    study_dir=study_dir,
    namespace_id=user_info.namespace_id
)