Source code for pyscnet.BuildNet.gne_dockercaller

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Created on Fri May 31 12:51:34 2019

@author: mwu
"""
from __future__ import absolute_import
import os
import sys

global path
path = os.path.join(os.path.dirname(__file__)) + '/Docker_App/'
sys.path.append("..")

import docker
import shutil
import pandas as pd
import tarfile
import warnings
import _pickle as pk
from ..utils import *

def __copy_to(container_id, src, dst):
    
    client = docker.from_env()
    container = client.containers.get(container_id)
    strm, stat = container.get_archive(src)

    with open(os.getenv('HOME') + '/temp.tar', 'w') as f:
        for line in strm:
            f.write(str(line, 'utf-8'))
        f.seek(0)
        thisTar = tarfile.TarFile(f.name)
        thisTar.extract('links.txt', path=dst)
    os.remove(os.getenv('HOME') + '/temp.tar')


def __rundocker(gnetdata, method, cell, feature, **kwargs):

    client = docker.from_env()
    cell_clusterid = kwargs.get('cell_clusterid', None)
    select_by = kwargs.get('select_by', None)
    Mms_TF = kwargs.get('Mms_TF', None)
    directed = kwargs.get('directed', True)
    
    shutil.copyfile(os.path.join('/', *(os.path.dirname(__file__).split(os.path.sep))[:-1], 'utils.py'), 
                    path + method + '/utils.py')
    
    tmp_expr = gnetdata_subset(gnetdata, cell, feature, **kwargs)

    if Mms_TF is not None:
        pd.DataFrame.to_csv(pd.DataFrame(Mms_TF), path + method + '/TF_Names.txt', sep='\t', header=False, index=False)

    with open(path + method + '/paras.pk', 'wb') as outfile:
        pk.dump(kwargs, outfile)
        
    pd.DataFrame.to_csv(tmp_expr, path + method + '/Expr.txt', sep='\t')
    client.images.build(path=path + method, dockerfile='Dockerfile', tag=method.lower())
    container = client.containers.run(method.lower(), detach=True)
    
    __copy_to(container_id=container.short_id, src='/' + method + '/links.txt', dst=os.getenv('HOME'))

    #client.remove_container(container.short_id)
    container.stop()
    client.containers.prune()
    client.images.prune()
    raw_links = pd.read_csv(os.getenv('HOME') + '/links.txt', sep='\t', header=None)
    raw_links.columns = ['source', 'target', 'weight']
    os.system('rm ' + path + method + '/*.txt | rm ' + path + method + '/paras.pk')

    if directed is False: raw_links = order_source_target(raw_links).drop_duplicates(subset=['source', 'target'])

    gnetdata._add_netattr(method + '_links', raw_links)
    print(method + '_links added into NetAttrs')
    return gnetdata


[docs]def rundocker(gnetdata, method, cell=None, feature=None, **kwargs): """ Call GRN methods via docker. ------------------------------------- :param gnetdata: Gnetdata object, default None. :param method: str, default None. methods: [GENIE3, GRNBOOST2, PIDC, CORR] :param cell: list, default None. a list of cell names :param feature: list, default None. a list of gene names :param cell_clusterid: str, default None. cell with cell_clusterid will be selected :param select_by: str, default None. key of filtering cells :param Mms_TF: list, default None. a list of transcription factor names :param directed: bool, default True. :param kwargs: additional parameters passed to scnode2vec() :return: Gnetdata object with links saved in NetAttrs """ valid_methods = ['GENIE3', 'CORR', 'PIDC', 'GRNBOOST2', 'SCNODE2VEC'] assert method in valid_methods, f"valid method: {', '.join(valid_methods)}" gnetdata = __rundocker(gnetdata, method=method, cell = cell, feature = feature, **kwargs) return gnetdata
if __name__ == '__main__': warnings.simplefilter("ignore")