diff --git a/src/python/PyBis/README.rst b/src/python/PyBis/README.rst new file mode 100644 index 0000000000000000000000000000000000000000..bfcf3dcc819d7acb2a0ee0929dc88da6e4edd43b --- /dev/null +++ b/src/python/PyBis/README.rst @@ -0,0 +1,237 @@ +Welcome to pyBIS! +================= + +pyBIS is a Python module for interacting with openBIS, designed to be +used in Jupyter. It offers a sort of IDE for openBIS, supporting TAB +completition and input checks, making the life of a researcher hopefully +easier. + +SYNOPSIS +======== + +connecting to OpenBIS +--------------------- + +:: + + from pybis import Openbis + o = Openbis('https://example.com:8443', verify_certificates=False) + o.login('username', 'password', save_token=True) # saves the session token in ~/.pybis/example.com.token + o.token + o.is_session_active() + o.get_datastores() + o.logout() + +Masterdata +---------- + +:: + + o.get_experiment_types() + o.get_sample_types() + o.get_sample_type('YEAST') + o.get_material_types() + o.get_dataset_types() + o.get_dataset_types()[0] + o.get_dataset_type('RAW_DATA') + o.get_terms() + o.get_terms('MATING_TYPE') + o.get_tags() + +Spaces and Projects +------------------- + +:: + + o.get_spaces() + o.get_space('MY_SPACE') + o.get_projects(space='MY_SPACE') + space.get_projects() + project.get_experiments() + project.get_attachments() + project.download_attachments() + p.add_attachment(fileName='testfile', description= 'another file', title= 'one more attachment') + p.save() + +Samples +------- + +:: + + sample = o.new_sample( + type='YEAST', + space='MY_SPACE', + parents=[parent_sample, '/MY_SPACE/YEA66'], + children=[child_sample] + ) + sample.space + sample.code + sample.permId + sample.identifier + sample.type # once the sample type is defined, you cannot modify it + sample.space + sample.space = 'MY_OTHER_SPACE' + sample.experiment # a sample can belong to one experiment only + sample.experiment = 'MY_SPACE/MY_PROJECT/MY_EXPERIMENT' + sample.tags + sample.tags = ['guten_tag', 'zahl_tag' ] + sample.get_parents() + sample.parents = ['/MY_SPACE/PARENT_SAMPLE_NAME'] + sample.add_parents('/MY_SPACE/PARENT_SAMPLE_NAME') + sample.del_parents('/MY_SPACE/PARENT_SAMPLE_NAME') + + sample.get_childeren() + sample.children = ['/MY_SPACE/CHILD_SAMPLE_NAME'] + sample.add_children('/MY_SPACE/CHILD_SAMPLE_NAME') + sample.del_children('/MY_SPACE/CHILD_SAMPLE_NAME') + sample.get_childeren() + + sample.props + sample.p # same thing as .props + sample.p.my_property = "some value" # set the value of a property (value is checked) + sample.p + TAB # in IPython or Jupyter: show list of available properties + sample.p.my_property_ + TAB # in IPython or Jupyter: show datatype or controlled vocabulary + + sample.get_attachments() + sample.download_attachments() + sample.add_attachment('testfile.xls') + samples = o.get_samples( + space='MY_SPACE', + type='YEAST' + tags=['*'] # tags must be present + NAME = 'some name' # properties are always uppercase to distinguish them from attributes + props=['NAME', 'MATING_TYPE','SHOW_IN_PROJECT_OVERVIEW'] # show these properties in the results + ) + samples.df # returns a pandas dataframe object + samples.get_datasets(type='ANALYZED_DATA') + +Note: Project samples are not implemented yet. + +Experiments +----------- + +:: + + o.new_experiment + type='DEFAULT_EXPERIMENT', + space='MY_SPACE', + project='YEASTS' + ) + o.get_experiments( + project='YEASTS', + space='MY_SPACE', + type='DEFAULT_EXPERIMENT', + tags='*', + finished_flag=False, + props=['name', 'finished_flag'] + ) + exp = o.get_experiment('/MY_SPACE/MY_PROJECT/MY_EXPERIMENT') + + exp.props + exp.p # same thing as .props + exp.p.finished_flag=True + exp.p.my_property = "some value" # set the value of a property (value is checked) + exp.p + TAB # in IPython or Jupyter: show list of available properties + exp.p.my_property_ + TAB # in IPython or Jupyter: show datatype or controlled vocabulary + + exp.attrs + exp.a # same as exp.attrs + exp.attrs.tags = ['some', 'extra', 'tags'] + exp.tags = ['some', 'extra', 'tags'] # same thing + exp.save() + +Datasets +-------- + +:: + + sample.get_datasets() + ds = o.get_dataset('20160719143426517-259') + ds.get_parents() + ds.get_children() + sample = ds.sample + experiment = ds.experiment + ds.physicalData + ds.status # AVAILABLE LOCKED ARCHIVED UNARCHIVE_PENDING ARCHIVE_PENDING BACKUP_PENDING + ds.archive() + ds.unarchive() + ds.get_files(start_folder="/") + ds.file_list + ds.add_attachment() + ds.get_attachments() + ds.download_attachments() + ds.download(destination='/tmp', wait_until_finished=False) + + ds_new = o.new_dataset( + type='ANALYZED_DATA', + experiment=exp, + sample= samp, + parents=[my_dataset, '20160713173002405-212'], + files = ['my_analyzed_data.dat'], + props={'name': 'we give this dataset a name', 'notes': 'and we might need some notes, too'}) + ) + ds_new.save() + + ds.props + ds.p # same thing as .props + ds.p.my_property = "some value" # set the value of a property (value is checked) + ds.p + TAB # in IPython or Jupyter: show list of available properties + ds.p.my_property_ + TAB # in IPython or Jupyter: show datatype or controlled vocabulary + + # complex query with chaining. props adds a "name" column. To filter for some property, the name of the property must be in UPPERCASE + datasets = o.get_experiments(project='YEASTS').get_samples(type='FLY').get_datasets(type='ANALYZED_DATA', props=['MY_PROPERTY'],MY_PROPERTY='some analyzed data') + + # another example + datasets = o.get_experiment('/MY_NEW_SPACE/VERMEUL_PROJECT/MY_EXPERIMENT4').get_samples(type='UNKNOWN').get_parents().get_datasets(type='RAW_DATA') + + # get a pandas dataFrame object + datasets.df + + # use it in a for-loop: + for dataset in datasets: + print(ds.permID) + +Requirements and organization +============================= + +Dependencies and Requirements +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +- pyBIS relies the openBIS API v3; openBIS version 16.05.2 or newer +- pyBIS uses Python 3.3 and pandas +- pyBIS needs the jupyter-api to be installed, in order to register new + datasets + +Installation +~~~~~~~~~~~~ + +- locate the ``jupyter-api`` folder found in ``pybis/src/coreplugins`` +- copy this folder to ``openbis/servers/core-plugins`` in your openBIS + installation +- register the plugin by editing + ``openbis/servers/core-plugins/core-plugins.properties`` : +- ``enabled-modules = jupyter-api`` (separate multiple plugins with + comma) +- restart your DSS to activate the plugin + +Project Organization +~~~~~~~~~~~~~~~~~~~~ + +This project is devided in several parts: + +- src/python/\ **PyBis** Python module which holds all the method to + interact with OpenBIS +- src/python/\ **OBis** a command-line tool to register large datasets + in OpenBIS without actually copying the data. Uses git annex for + version control and OpenBIS linkedDataSet objects to register the + metadata. +- src/python/\ **JupyterBis** a JupyterHub authenticator module which + uses pyBIS for authenticating against openBIS, validating and storing + the session token +- src/core-plugins/\ **jupyter-api**, an ingestion plug-in for openBIS, + allowing people to upload new datasets +- src/vagrant/\ **jupyter-bis/Vagrantfile** to set up JupyterHub on a + virtual machine (CentOS 7), which uses the JupyterBis authenticator + module +- src/vagrant/\ **obis/Vagrantfile** to set up a complete OpenBIS + instance on a virtual machine (CentOS 7)