More Examples

A Simple Application from LIX

Credit: Hugo H. Slepicka

import amostra
import pandas
import amostra.client.commands as acc
import collections
# Definitions
owner = "hhslepicka"
project = "12345"
beamline_id = "lix"
# Create Handlers for collections of interest for this app
container_ref = acc.ContainerReference()
sample_ref = acc.SampleReference()
# Simple utility routines for insertion
def insert_plate(plate_info):
    plate = container_ref.create(**plate_info)
    return plate

def insert_sample_list(samples):
    result = sample_ref.create_sample_list(samples)
    return result
# Plate generate factory
def generate_plate(owner, project, beamline_id, kind, name, barcode, content):
    plate_info = {
            "owner": owner,
            "project": project,
            "beamline_id": beamline_id,
            "kind": kind,
            "name": name,
            "barcode": barcode,
            "content": list(content)
    }

    return insert_plate(plate_info)

# Sample generate factory
def generate_samples_96wp(project, beamline_id, owner, name):
    samples = collections.deque()
    for i in range(96):
        sample_info = {
            "project": project,
            "beamline_id": beamline_id,
            "owner": owner,
            "name": name+" {}".format(i+1),
            "position": {"x": int(i % 8), "y": int(i/8)},
            "concentration": 0.001,
            "volume": 10,
            "temperature": 21.4
        }
        samples.append(sample_info)
    uids = insert_sample_list(samples)
    return uids

# A utility function that searches container by user define info
def find_plate_by_barcode(owner, project, beamline_id, barcode):
    samples = collections.deque()
    plate_info = list(container_ref.find(owner=owner, project=project, beamline_id=beamline_id, barcode=barcode))[0]
    for s_uid in plate_info['content']:
        samples.append(next(sample_ref.find(uid=s_uid)))

    plate_info['content'] = list(samples)
    return plate_info
number_of_plates = 1
# Generate a single plate and fill with samples
for i in range(number_of_plates):
    samples = generate_samples_96wp(project, beamline_id, owner, "Test Sample")
    plate1 = generate_plate(owner, project, beamline_id, "96wp", "Plate {}".format(i+1), "{}".format(i+1).zfill(13), samples)
# Excel utility function using pandas
# Fill up the container and sample information from excel

def import_plate_from_excel(fname, owner, project, beamline_id, plate_kind):
    samples = collections.deque()
    excel_data = pandas.read_excel(fname,header=1)

    for line in excel_data.iterrows():
        if line[0] == 0:
            name = line[1][0]
            barcode = str(int(line[1][1])).zfill(13)
            plate_info = {
                "owner": owner,
                "project": project,
                "beamline_id": beamline_id,
                "kind": plate_kind,
                "name": name,
                "barcode": barcode,
            }
        s_x = line[1][2]
        s_y = line[1][3]
        s_name = line[1][4]
        s_shortname = line[1][5]
        s_conc = line[1][6]
        s_volume = line[1][7]
        s_temperature = line[1][8]
        sample_info = {
                "project": project,
                "beamline_id": beamline_id,
                "owner": owner,
                "name": s_name,
                "short_name": s_shortname,
                "position": {"x": s_x, "y": s_y},
                "concentration": s_conc,
                "volume": s_volume,
                "temperature": s_temperature
            }
        samples.append(sample_info)

    return plate_info, samples
excel_file = "Sample_Import.xlsx"
plate, samples = import_plate_from_excel(excel_file, owner, project, beamline_id, "96wp")
content = insert_sample_list(samples)
plate['content'] = content

# Send the prepared data to the server
inserted_plate = insert_plate(plate)
inserted_plate
{'barcode': '1000000000001',
 'beamline_id': 'lix',
 'content': ['e13b9a6f-6838-4dbd-b13e-5b67f325c27c',
  'a04ab8ea-83b2-495c-8f3e-7f713d325bae',
  '9ce22068-a27e-4c5f-9911-c46bdb2fc1ed',
  '1bae2551-79d2-4fa4-a9f1-b83ee9f77e6f',
  'cb0267fe-8e62-4831-afd4-1efb658005a8',
  'f136c707-8b32-4352-a728-257762827c1d',
  '1cfd8535-ff1a-4a24-b227-bb21b1cc6d31',
  '1b77ff58-794e-49f5-ba7b-8320c4fda7b1',
  '7618950b-edb3-430b-bfd3-996e74e73838',
  '7454330a-4b5c-4c96-8b60-431fbd01fe0a',
  'f74c9699-09ed-4fb1-8e82-2037b4d621fd',
  'd3cf7987-7c37-411b-bc94-8f95a65ede9c',
  '2667613d-f918-4cf5-a6b2-83f36b2eea65',
  'e1d7b959-0cb6-4a29-a0eb-bd5aed91febc',
  '4eecbdba-c63c-466b-b4c9-83fdbff0e039',
  'e31d4395-f3e1-4a39-aea0-c808505290b5'],
 'kind': '96wp',
 'name': 'Imported Plate',
 'owner': 'hhslepicka',
 'project': '12345',
 'time': 1461338342.433393,
 'uid': '2f3fdd93-fc5a-41d4-968a-45f50e09b473'}
# Query the database for the barcode
r = find_plate_by_barcode(owner, project, beamline_id, "1000000000001".zfill(13))
r["name"]
'Imported Plate'
# Iterate over the results and print contents inserted then queried
for sample in r["content"]:
    print("Sample Data: ", sample)
Sample Data:  {'beamline_id': 'lix', 'concentration': 0.775, 'name': 'Sample Imp 1-1', 'position': {'x': 1, 'y': 1}, 'short_name': 'S1-1', 'uid': 'e13b9a6f-6838-4dbd-b13e-5b67f325c27c', 'volume': 10, 'time': 1461338342.344707, 'temperature': 21, 'owner': 'hhslepicka', 'project': '12345'}
Sample Data:  {'beamline_id': 'lix', 'concentration': 0.772, 'name': 'Sample Imp 1-2', 'position': {'x': 1, 'y': 2}, 'short_name': 'S1-2', 'uid': 'a04ab8ea-83b2-495c-8f3e-7f713d325bae', 'volume': 10, 'time': 1461338342.351725, 'temperature': 21, 'owner': 'hhslepicka', 'project': '12345'}
Sample Data:  {'beamline_id': 'lix', 'concentration': 0.776, 'name': 'Sample Imp 1-3', 'position': {'x': 1, 'y': 3}, 'short_name': 'S1-3', 'uid': '9ce22068-a27e-4c5f-9911-c46bdb2fc1ed', 'volume': 10, 'time': 1461338342.357494, 'temperature': 21, 'owner': 'hhslepicka', 'project': '12345'}
Sample Data:  {'beamline_id': 'lix', 'concentration': 0.47500000000000003, 'name': 'Sample Imp 1-4', 'position': {'x': 1, 'y': 4}, 'short_name': 'S1-4', 'uid': '1bae2551-79d2-4fa4-a9f1-b83ee9f77e6f', 'volume': 10, 'time': 1461338342.362703, 'temperature': 21, 'owner': 'hhslepicka', 'project': '12345'}
Sample Data:  {'beamline_id': 'lix', 'concentration': 0.441, 'name': 'Sample Imp 1-5', 'position': {'x': 1, 'y': 5}, 'short_name': 'S1-5', 'uid': 'cb0267fe-8e62-4831-afd4-1efb658005a8', 'volume': 10, 'time': 1461338342.36843, 'temperature': 21, 'owner': 'hhslepicka', 'project': '12345'}
Sample Data:  {'beamline_id': 'lix', 'concentration': 0.788, 'name': 'Sample Imp 1-6', 'position': {'x': 1, 'y': 6}, 'short_name': 'S1-6', 'uid': 'f136c707-8b32-4352-a728-257762827c1d', 'volume': 10, 'time': 1461338342.374143, 'temperature': 21, 'owner': 'hhslepicka', 'project': '12345'}
Sample Data:  {'beamline_id': 'lix', 'concentration': 0.9580000000000001, 'name': 'Sample Imp 1-7', 'position': {'x': 1, 'y': 7}, 'short_name': 'S1-7', 'uid': '1cfd8535-ff1a-4a24-b227-bb21b1cc6d31', 'volume': 10, 'time': 1461338342.379789, 'temperature': 21, 'owner': 'hhslepicka', 'project': '12345'}
Sample Data:  {'beamline_id': 'lix', 'concentration': 0.48, 'name': 'Sample Imp 1-8', 'position': {'x': 1, 'y': 8}, 'short_name': 'S1-8', 'uid': '1b77ff58-794e-49f5-ba7b-8320c4fda7b1', 'volume': 10, 'time': 1461338342.38548, 'temperature': 21, 'owner': 'hhslepicka', 'project': '12345'}
Sample Data:  {'beamline_id': 'lix', 'concentration': 0.317, 'name': 'Sample Imp 2-1', 'position': {'x': 2, 'y': 1}, 'short_name': 'S2-1', 'uid': '7618950b-edb3-430b-bfd3-996e74e73838', 'volume': 10, 'time': 1461338342.39114, 'temperature': 21, 'owner': 'hhslepicka', 'project': '12345'}
Sample Data:  {'beamline_id': 'lix', 'concentration': 0.459, 'name': 'Sample Imp 2-2', 'position': {'x': 2, 'y': 2}, 'short_name': 'S2-2', 'uid': '7454330a-4b5c-4c96-8b60-431fbd01fe0a', 'volume': 10, 'time': 1461338342.396493, 'temperature': 21, 'owner': 'hhslepicka', 'project': '12345'}
Sample Data:  {'beamline_id': 'lix', 'concentration': 0.248, 'name': 'Sample Imp 2-3', 'position': {'x': 2, 'y': 3}, 'short_name': 'S2-3', 'uid': 'f74c9699-09ed-4fb1-8e82-2037b4d621fd', 'volume': 10, 'time': 1461338342.402075, 'temperature': 21, 'owner': 'hhslepicka', 'project': '12345'}
Sample Data:  {'beamline_id': 'lix', 'concentration': 0.39, 'name': 'Sample Imp 2-4', 'position': {'x': 2, 'y': 4}, 'short_name': 'S2-4', 'uid': 'd3cf7987-7c37-411b-bc94-8f95a65ede9c', 'volume': 10, 'time': 1461338342.407314, 'temperature': 21, 'owner': 'hhslepicka', 'project': '12345'}
Sample Data:  {'beamline_id': 'lix', 'concentration': 0.5740000000000001, 'name': 'Sample Imp 2-5', 'position': {'x': 2, 'y': 5}, 'short_name': 'S2-5', 'uid': '2667613d-f918-4cf5-a6b2-83f36b2eea65', 'volume': 10, 'time': 1461338342.412499, 'temperature': 21, 'owner': 'hhslepicka', 'project': '12345'}
Sample Data:  {'beamline_id': 'lix', 'concentration': 0.799, 'name': 'Sample Imp 2-6', 'position': {'x': 2, 'y': 6}, 'short_name': 'S2-6', 'uid': 'e1d7b959-0cb6-4a29-a0eb-bd5aed91febc', 'volume': 10, 'time': 1461338342.417716, 'temperature': 21, 'owner': 'hhslepicka', 'project': '12345'}
Sample Data:  {'beamline_id': 'lix', 'concentration': 0.371, 'name': 'Sample Imp 2-7', 'position': {'x': 2, 'y': 7}, 'short_name': 'S2-7', 'uid': '4eecbdba-c63c-466b-b4c9-83fdbff0e039', 'volume': 10, 'time': 1461338342.422936, 'temperature': 21, 'owner': 'hhslepicka', 'project': '12345'}
Sample Data:  {'beamline_id': 'lix', 'concentration': 0.099, 'name': 'Sample Imp 2-8', 'position': {'x': 2, 'y': 8}, 'short_name': 'S2-8', 'uid': 'e31d4395-f3e1-4a39-aea0-c808505290b5', 'volume': 10, 'time': 1461338342.428122, 'temperature': 21, 'owner': 'hhslepicka', 'project': '12345'}