예제 #1
0
    def __init__(self):
        super().__init__()

        # Docker Client
        # This client talks to your local docker
        self.docker = DockerClient('unix:///var/run/docker.sock', 'local')

        self.hostDirectories = {'refs': None, 'seqs': None, 'conf': None, 'counts': None, 'aligns': None, 'barcodes': None}
        self.labelText = {'refs': 'References: {0}', 'seqs': 'Sequences: {0}', 'conf': 'Configs: {0}', 'barcodes': 'Barcode file: {0}'}

        # folders that will created automatically
        self.result_folder_name = "Counts"
        self.aligns_folder_name = "Aligns"

        # GUI
        box = gui.widgetBox(self.controlArea, "Info")
        self.lblRefs = gui.widgetLabel(box, 'References: Not Set')
        self.lblSeqs = gui.widgetLabel(box, 'Sequences: Not Set')
        self.lblConfigs = gui.widgetLabel(box, 'Configs: Not Set')
        self.lblBarcodes = gui.widgetLabel(box, "Barcode file: Not Set")

        self.infoLabel = gui.widgetLabel(box, 'Waiting...')
        self.infoLabel.setWordWrap(True)

        gui.checkBox(self.controlArea, self, 'auto_run', 'Run automatically when input set')
        self.btn_run = gui.button(self.controlArea, self, "Run", callback=self.btn_run_pushed)
        self.is_running = False

        self.setMinimumSize(500, 200)
    def __init__(self):
        super().__init__()

        # Docker Client
        # This client talks to your local docker
        self.docker = DockerClient('unix:///var/run/docker.sock', 'local')

        self.host_ref_dir = None
        self.host_seq_dir = None
        self.ref_dir_set = False
        self.seq_dir_set = False

        self.result_folder_name = "/Count"
        self.aligns_folder_name = "/Aligns"

        # TODO is this an issue if multiple containers write to the same place?
        # TODO add timestamp to directory name to differentiate runs
        # Jimmy, Mar/7/2017, I don't know what does "toHostDir" do. Since our DockerClient missed that code, I comment it temporary
        #self.host_counts_dir = counts_dir #self.docker.toHostDir(counts_dir)

        # GUI
        box = gui.widgetBox(self.controlArea, "Info")
        self.infoLabel = gui.widgetLabel(
            box, 'Connect to a Directory widget '
            'to specify location of reference '
            'and seq fastq files')
        self.infoLabel.setWordWrap(True)

        gui.checkBox(self.controlArea, self, 'auto_run',
                     'Run automatically when input set')
        self.btn_run = gui.button(self.controlArea,
                                  self,
                                  "Run",
                                  callback=self.btn_run_pushed)
        self.is_running = False
    def __init__(self):
        super().__init__()

        # Docker Client
        # This client talks to your local docker
        self.docker = DockerClient('unix:///var/run/docker.sock', 'local')

        # GUI
        box = gui.widgetBox(self.controlArea, "Info")
        self.infoLabel = gui.widgetLabel(
            box, 'Connect to data or use a Directory widget'
            ' to specify location of UMI read data files')
        self.infoLabel.setWordWrap(True)

        # TODO let user specify results directory
        # self.btn_res = gui.button(None, self, "Open", callback=self.set_results_dir)
        # self.resultsEdit = QtGui.QLineEdit(self.host_results_dir)
        # self.buttonsArea.layout().addWidget(self.btn_res)
        # self.buttonsArea.layout().addWidget(self.resultsEdit)

        self.autoRun = True
        gui.checkBox(self.controlArea, self, 'autoRun',
                     'Run automatically when input set')
        self.btn_run = gui.button(self.controlArea,
                                  self,
                                  "Run",
                                  callback=self.start_analysis)
예제 #4
0
    def __init__(self):
        super().__init__()

        # Docker Client
        # This client talks to your local docker
        self.docker = DockerClient('unix:///var/run/docker.sock', 'local')

        # The directory of the seq data needed to run
        # the container will be set by the user before the
        # container can be run
        self.host_ref_dir = None
        self.host_seq_dir = None
        self.ref_dir_set = False
        self.seq_dir_set = False

        # The default write location of all widgets should be
        # ~/BioDepot/WidgetName/
        # TODO is this an issue if multiple containers write to the same place?
        # TODO add timestamp to directory name to differentiate runs
        counts_dir = '~/BioDepot/Dtoxs_Alignment/Counts'
        if not os.path.exists(counts_dir):
            os.makedirs(counts_dir)
        self.host_counts_dir = self.docker.toHostDir(counts_dir)

        # GUI
        box = gui.widgetBox(self.controlArea, "Info")
        self.infoLabel = gui.widgetLabel(
            box, 'Connect to a Directory widget '
            'to specify location of reference '
            'and seq fastq files')
        self.infoLabel.setWordWrap(True)

        gui.checkBox(self.controlArea, self, 'auto_run',
                     'Run automatically when input set')
        self.btn_run = gui.button(self.controlArea,
                                  self,
                                  "Run",
                                  callback=self.btn_run_pushed)
        self.is_running = False
예제 #5
0
class OWBwBWidget(widget.OWWidget):

    dockerClient = DockerClient('unix:///var/run/docker.sock', 'local')

    def __init__(self, image_name, image_tag):
        super().__init__()
        self._hostDirectories = {}
        self._dockerImageName = image_name
        self._dockerImageTag = image_tag
        self._dockerVolumes = None
        self._dockerCommands = None
        self._dockerEnvironments = None
        self._Flag_isRunning = False

    def Event_OnRunFinished(self):
        raise Exception('Event_OnRunFinished not implemented!')

    def Event_OnRunMessage(self, message):
        raise Exception('Event_OnRunMessage not implemented!')

    def Initialize_InputKeys(self, keys):
        for k in keys:
            self._hostDirectories[k] = None

    def setDirectories(self, key, path, ctrlLabel=None):
        labelTitle = ctrlLabel.text().split(':')[0] + ': {}'
        # When a user removes a connected Directory widget,
        # it sends a signal with path=None
        if path is None:
            self._hostDirectories[key] = None
            if ctrlLabel is not None:
                ctrlLabel.setText(labelTitle.format('Not Set'))
        elif not os.path.exists(path):
            self._hostDirectories[key] = None
            if ctrlLabel is not None:
                ctrlLabel.setText(
                    labelTitle.format('None existent directory: {}'.format(
                        str(path))))
        else:
            self._hostDirectories[key] = path.strip()
            if ctrlLabel is not None:
                ctrlLabel.setText(labelTitle.format((str(path))))

    def getDirectory(self, key):
        return self._hostDirectories[key]

    """
    Pull image
    """

    def __dockerPullImage__(self):
        self.Event_OnRunMessage('Pulling \'' + self._dockerImageName + ":" +
                                self._dockerImageTag + '\' from Dockerhub...')
        self.setStatusMessage("Downloading...")
        self.progressBarInit()
        self._Flag_isRunning = True
        # Pull the image in a new thread
        self.pullImageThread = PullImageThread(self.dockerClient,
                                               self._dockerImageName,
                                               self._dockerImageTag)
        self.pullImageThread.pull_progress.connect(self.__dockerPullProgress__)
        self.pullImageThread.finished.connect(self.__dockerPullDone__)
        self.pullImageThread.start()

    def __dockerPullProgress__(self, val):
        self.progressBarSet(val)

    def __dockerPullDone__(self):
        self.Event_OnRunMessage('Finished pulling \'' + self._dockerImageName +
                                ":" + self._dockerImageTag + '\'')
        self.progressBarFinished()
        self.__dockerRealRun__()

    """
    Run container
    """

    def dockerRun(self, volumes=None, commands=None, environments=None):
        if not self._Flag_isRunning:
            self._dockerVolumes = volumes
            self._dockerCommands = commands
            self._dockerEnvironments = environments
            # Make sure the docker image is downloaded
            if not self.dockerClient.has_image(self._dockerImageName,
                                               self._dockerImageTag):
                self.__dockerPullImage__()
            else:
                self.__dockerRealRun__()

    def __dockerRealRun__(self):
        self._Flag_isRunning = True
        self.setStatusMessage('Running...')
        self.Event_OnRunMessage('Running \'' + self._dockerImageName + '\'')
        # Run the container in a new thread
        self.containerThread = LocalContainerRunner(
            self.dockerClient, '{}:{}'.format(self._dockerImageName,
                                              self._dockerImageTag),
            self._dockerVolumes, self._dockerCommands,
            self._dockerEnvironments)
        self.containerThread.progress.connect(self.__dockerRunProgress__)
        self.containerThread.finished.connect(self.__dockerRunDone__)
        self.containerThread.start()

    def __dockerRunProgress__(self, val):
        self.progressBarSet(val)

    def __dockerRunDone__(self):
        self._Flag_isRunning = False
        self.setStatusMessage('Finished!')
        self.Event_OnRunMessage('Finished!')
        self.Event_OnRunFinished()
예제 #6
0
class OWDocker(widget.OWWidget):
    name = "Docker Info"
    description = "See the status of your docker engine"
    category = "Dev"
    icon = "icons/docker-info.svg"
    priority = 1

    inputs = []
    outputs = []

    want_main_area = False
    # TODO finish supporting multiple Docker Clients for Containers, Images, Volumns tables
    # see Version table for an example
    docker_clients = [DockerClient('unix:///var/run/docker.sock', 'local')]

    font = QtGui.QFont()
    font.setFamily("Courier New")
    font.setPointSize(12)

    def __init__(self):
        super().__init__()
        self.context = 'none'

        # GUI
        self.btn_cli = gui.button(None,
                                  self,
                                  "Clients",
                                  callback=self.get_clients,
                                  autoDefault=False)
        self.btn_ver = gui.button(None,
                                  self,
                                  "Version",
                                  callback=self.get_version,
                                  autoDefault=False)
        self.btn_inf = gui.button(None,
                                  self,
                                  "Info",
                                  callback=self.get_info,
                                  autoDefault=False)
        self.btn_img = gui.button(None,
                                  self,
                                  "Images",
                                  callback=self.get_images,
                                  autoDefault=False)
        self.btn_con = gui.button(None,
                                  self,
                                  "Containers",
                                  callback=self.get_containers,
                                  autoDefault=False)
        self.btn_vol = gui.button(None,
                                  self,
                                  "Volumes",
                                  callback=self.get_volumes,
                                  autoDefault=False)
        self.btn_cli.setFixedWidth(100)
        self.btn_ver.setFixedWidth(100)
        self.btn_inf.setFixedWidth(100)
        self.btn_img.setFixedWidth(100)
        self.btn_con.setFixedWidth(100)
        self.btn_vol.setFixedWidth(100)

        self.hboxTop = QtWidgets.QHBoxLayout()
        self.hboxTop.setAlignment(QtCore.Qt.AlignLeft)
        self.hboxTop.addWidget(self.btn_con)
        self.hboxTop.addWidget(self.btn_img)
        self.hboxTop.addWidget(self.btn_vol)
        self.hboxTop.addStretch()
        self.hboxTop.addWidget(self.btn_cli)
        self.hboxTop.addWidget(self.btn_ver)
        self.hboxTop.addWidget(self.btn_inf)

        self.infoTable = QtWidgets.QTableWidget()
        self.infoTable.horizontalHeader().setStretchLastSection(True)
        self.infoTable.setFont(self.font)

        self.btn_rmv = gui.button(None,
                                  self,
                                  "Remove",
                                  callback=self.remove_selected,
                                  autoDefault=False)
        self.btn_stp = gui.button(None,
                                  self,
                                  "Stop",
                                  callback=self.stop_selected,
                                  autoDefault=False)
        self.btn_pau = gui.button(None,
                                  self,
                                  "Pause",
                                  callback=self.pause_selected,
                                  autoDefault=False)
        self.btn_unp = gui.button(None,
                                  self,
                                  "Unpause",
                                  callback=self.unpause_selected,
                                  autoDefault=False)
        self.btn_rmv.setHidden(True)
        self.btn_stp.setHidden(True)
        self.btn_pau.setHidden(True)
        self.btn_unp.setHidden(True)
        self.btn_rmv.setFixedWidth(100)
        self.btn_stp.setFixedWidth(100)
        self.btn_pau.setFixedWidth(100)
        self.btn_unp.setFixedWidth(100)

        self.rm_force = QtWidgets.QCheckBox("Force")
        self.rm_force.setHidden(True)

        self.hbox = QtWidgets.QHBoxLayout()
        self.hbox.addWidget(self.btn_rmv)
        self.hbox.addSpacing(5)
        self.hbox.addWidget(self.rm_force)
        self.hbox.addSpacing(20)
        self.hbox.addWidget(self.btn_stp)
        self.hbox.addWidget(self.btn_pau)
        self.hbox.addWidget(self.btn_unp)
        self.hbox.setAlignment(QtCore.Qt.AlignLeft)

        self.controlArea.layout().addLayout(self.hboxTop)
        self.controlArea.layout().addWidget(self.infoTable)
        self.controlArea.layout().addLayout(self.hbox)

        self.controlArea.setMinimumSize(900, 298)
        self.get_containers()

    """
    Button Callbacks
    """

    def get_clients(self):
        self.context = 'clients'
        self.btn_cli.setDefault(True)
        self.btn_rmv.setHidden(True)
        self.rm_force.setHidden(True)
        self.btn_stp.setHidden(True)
        self.btn_pau.setHidden(True)
        self.btn_unp.setHidden(True)
        self.draw_clients_table()

    def get_version(self):
        self.context = 'version'
        self.btn_ver.setDefault(True)
        self.btn_rmv.setHidden(True)
        self.rm_force.setHidden(True)
        self.btn_stp.setHidden(True)
        self.btn_pau.setHidden(True)
        self.btn_unp.setHidden(True)
        self.draw_version_table()

    def get_info(self):
        self.context = 'info'
        self.btn_inf.setDefault(True)
        self.btn_rmv.setHidden(True)
        self.rm_force.setHidden(True)
        self.btn_stp.setHidden(True)
        self.btn_pau.setHidden(True)
        self.btn_unp.setHidden(True)
        self.draw_info_table()

    def get_images(self):
        self.context = 'images'
        self.btn_img.setDefault(True)
        self.btn_rmv.setHidden(False)
        self.rm_force.setHidden(False)
        self.btn_stp.setHidden(True)
        self.btn_pau.setHidden(True)
        self.btn_unp.setHidden(True)
        self.draw_images_table()

    def get_containers(self):
        self.context = 'containers'
        self.btn_con.setDefault(True)
        self.btn_rmv.setHidden(False)
        self.rm_force.setHidden(False)
        self.btn_stp.setHidden(False)
        self.btn_pau.setHidden(False)
        self.btn_unp.setHidden(False)
        self.draw_containers_table()

    def get_volumes(self):
        self.context = 'volumes'
        self.btn_vol.setDefault(True)
        self.btn_rmv.setHidden(False)
        self.rm_force.setHidden(True)
        self.btn_stp.setHidden(True)
        self.btn_pau.setHidden(True)
        self.btn_unp.setHidden(True)
        self.draw_volumes_table()

    """
    Draw Tables
    """

    def draw_clients_table(self):
        self.infoTable.clearSpans()
        self.infoTable.setColumnCount(3)
        self.infoTable.setHorizontalHeaderLabels(['', 'NAME', 'URL'])
        self.infoTable.horizontalHeader().setSectionResizeMode(
            QtWidgets.QHeaderView.ResizeToContents)
        self.infoTable.horizontalHeader().setVisible(True)
        self.infoTable.setRowCount(len(self.docker_clients))
        for i, client in enumerate(self.docker_clients):
            self.infoTable.setCellWidget(i, 0, QtWidgets.QCheckBox())
            self.infoTable.setItem(i, 0, QtWidgets.QTableWidgetItem(''))
            self.infoTable.setItem(
                i, 1, QtWidgets.QTableWidgetItem(client.getName()))
            self.infoTable.setItem(i, 2,
                                   QtWidgets.QTableWidgetItem(client.getUrl()))

    def draw_version_table(self):
        self.infoTable.clearSpans()
        self.infoTable.setColumnCount(2)
        self.infoTable.setHorizontalHeaderLabels(['', ''])
        self.infoTable.horizontalHeader().setVisible(False)
        self.infoTable.verticalHeader().setVisible(False)
        totalRows = len(self.docker_clients) + sum(
            len(client.version().items()) for client in self.docker_clients)
        self.infoTable.setRowCount(totalRows)
        for i, client in enumerate(self.docker_clients):
            clientSep = QtWidgets.QTableWidgetItem(client.getName() + ": " +
                                                   client.getUrl())
            clientSep.setBackground(QtGui.QColor('lightGray'))
            self.infoTable.setItem(i, 0, clientSep)
            self.infoTable.setSpan(i, 0, 1, 2)
            self.infoTable.setCellWidget(i, 0, None)
            table = [(str(k), str(v))
                     for k, v in sorted(client.version().items())]
            for x, row in enumerate(table):
                self.infoTable.setItem(i + x + 1, 0,
                                       QtWidgets.QTableWidgetItem(row[0]))
                self.infoTable.setItem(i + x + 1, 1,
                                       QtWidgets.QTableWidgetItem(row[1]))
                self.infoTable.setCellWidget(i + x + 1, 0, None)
        self.infoTable.horizontalHeader().setSectionResizeMode(
            QtWidgets.QHeaderView.ResizeToContents)

    def draw_info_table(self):
        self.infoTable.clearSpans()
        table = [(str(k), str(v))
                 for k, v in sorted(self.docker_clients[0].info().items())]
        self.infoTable.setColumnCount(2)
        self.infoTable.setHorizontalHeaderLabels(['', ''])
        self.infoTable.setRowCount(len(table))
        self.infoTable.horizontalHeader().setSectionResizeMode(
            QtWidgets.QHeaderView.Interactive)
        self.infoTable.horizontalHeader().resizeSection(0, 150)
        self.infoTable.horizontalHeader().setVisible(False)
        for i, row in enumerate(table):
            self.infoTable.setItem(i, 0, QtWidgets.QTableWidgetItem(row[0]))
            self.infoTable.setItem(i, 1, QtWidgets.QTableWidgetItem(row[1]))
            self.infoTable.setCellWidget(i, 0, None)

    def draw_images_table(self):
        self.infoTable.clearSpans()
        tableHeader = ['', 'REPOSITORY', 'TAG', 'ID', 'CREATED', 'SIZE']
        self.infoTable.setColumnCount(len(tableHeader))
        self.infoTable.setHorizontalHeaderLabels(tableHeader)
        self.infoTable.horizontalHeader().setSectionResizeMode(
            QtWidgets.QHeaderView.ResizeToContents)
        self.infoTable.horizontalHeader().setVisible(True)
        table = []
        imgs = self.docker_clients[0].images()
        if not type(imgs) is list:
            self.infoTable.horizontalHeader().setSectionResizeMode(
                QtWidgets.QHeaderView.Stretch)
            self.infoTable.horizontalHeader().setSectionResizeMode(
                0, QtWidgets.QHeaderView.ResizeToContents)
        else:
            for img in imgs:
                id = img['Id'].split(':')[1][:12]
                created = millis_to_datetime(img['Created'])
                size = sizeof_fmt(img['Size'])
                repo_info = [id, created, size]
                if not img['RepoTags']: continue
                for repo in img['RepoTags']:
                    table.append(repo.split(':') + repo_info)

        self.infoTable.setRowCount(len(table))
        for i, row in enumerate(table):
            self.infoTable.setCellWidget(i, 0, QtWidgets.QCheckBox())
            self.infoTable.setItem(i, 0, QtWidgets.QTableWidgetItem(''))
            for x, cell in enumerate(row):
                self.infoTable.setItem(i, 1 + x,
                                       QtWidgets.QTableWidgetItem(cell))

    def draw_containers_table(self):
        self.infoTable.clearSpans()
        tableHeader = [
            '', 'CONTAINER ID', 'IMAGE', 'COMMAND', 'CREATED', 'STATUS',
            'PORTS', 'NAMES'
        ]
        self.infoTable.setColumnCount(len(tableHeader))
        self.infoTable.setHorizontalHeaderLabels(tableHeader)
        self.infoTable.horizontalHeader().setSectionResizeMode(
            QtWidgets.QHeaderView.ResizeToContents)
        self.infoTable.horizontalHeader().setVisible(True)
        self.infoTable.horizontalHeader().setSectionResizeMode(
            3, QtWidgets.QHeaderView.Interactive)
        self.infoTable.horizontalHeader().resizeSection(3, 120)
        conts = self.docker_clients[0].containers()
        if not type(conts) is list:
            self.infoTable.setRowCount(0)
            self.infoTable.horizontalHeader().setSectionResizeMode(
                QtWidgets.QHeaderView.Stretch)
            self.infoTable.horizontalHeader().setSectionResizeMode(
                0, QtWidgets.QHeaderView.ResizeToContents)
        else:
            self.infoTable.setRowCount(len(conts))
            for i, cont in enumerate(conts):
                self.infoTable.setCellWidget(i, 0, QtWidgets.QCheckBox())
                self.infoTable.setItem(i, 0, QtWidgets.QTableWidgetItem(''))
                self.infoTable.setItem(
                    i, 1, QtWidgets.QTableWidgetItem(cont['Id'][:12]))
                img_split = cont['Image'].split(':')
                img_str = img_split[0] if len(
                    img_split) < 2 else img_split[1][:12]
                self.infoTable.setItem(i, 2,
                                       QtWidgets.QTableWidgetItem(img_str))
                self.infoTable.setItem(
                    i, 3, QtWidgets.QTableWidgetItem(cont['Command']))
                self.infoTable.setItem(
                    i, 4,
                    QtWidgets.QTableWidgetItem(
                        millis_to_datetime(cont['Created'])))
                self.infoTable.setItem(
                    i, 5, QtWidgets.QTableWidgetItem(cont['Status']))
                self.infoTable.setItem(
                    i, 6,
                    QtWidgets.QTableWidgetItem('\n'.join([
                        str(_.get('PublicPort', ' ')) for _ in cont['Ports']
                    ])))
                self.infoTable.setItem(
                    i, 7, QtWidgets.QTableWidgetItem('\n'.join(cont['Names'])))

    def draw_volumes_table(self):
        self.infoTable.clearSpans()
        tableHeader = ['', 'DRIVER', 'VOLUME NAME', 'MOUNT POINT']
        self.infoTable.setColumnCount(len(tableHeader))
        self.infoTable.setHorizontalHeaderLabels(tableHeader)
        self.infoTable.horizontalHeader().setSectionResizeMode(
            QtWidgets.QHeaderView.ResizeToContents)
        self.infoTable.horizontalHeader().setVisible(True)
        vols = self.docker_clients[0].volumes()
        if not type(vols) is list:
            self.infoTable.setRowCount(0)
            self.infoTable.horizontalHeader().setSectionResizeMode(
                QtWidgets.QHeaderView.Stretch)
            self.infoTable.horizontalHeader().setSectionResizeMode(
                0, QtWidgets.QHeaderView.ResizeToContents)
        else:
            self.infoTable.setRowCount(len(vols))
            for i, vol in enumerate(vols):
                self.infoTable.setCellWidget(i, 0, QtWidgets.QCheckBox())
                self.infoTable.setItem(i, 0, QtWidgets.QTableWidgetItem(''))
                self.infoTable.setItem(
                    i, 1, QtWidgets.QTableWidgetItem(vol['Driver']))
                self.infoTable.setItem(i, 2,
                                       QtWidgets.QTableWidgetItem(vol['Name']))
                self.infoTable.setItem(
                    i, 3, QtWidgets.QTableWidgetItem(vol['Mountpoint']))

    """
    Remove functions
    """

    def remove_image(self, id, force):
        print('Removing image: ' + id)
        self.docker_clients[0].remove_image(id, force)

    def remove_container(self, id, force):
        print('Removing container: ' + id)
        self.docker_clients[0].remove_container(id, force)

    def remove_volume(self, id, force):
        print('Removing volume: ' + id)
        self.docker_clients[0].remove_volume(id)

    def remove_selected(self):
        remove_func = None
        draw_func = None
        id_column = 0
        if (self.context == 'images'):
            remove_func = self.remove_image
            draw_func = self.draw_images_table
            id_column = 3
        elif (self.context == 'containers'):
            remove_func = self.remove_container
            draw_func = self.draw_containers_table
            id_column = 1
        elif (self.context == 'volumes'):
            remove_func = self.remove_volume
            draw_func = self.draw_volumes_table
            id_column = 2
        for i in range(0, self.infoTable.rowCount()):
            if (self.infoTable.cellWidget(i, 0).isChecked()):
                remove_func(
                    self.infoTable.item(i, id_column).text(),
                    self.rm_force.isChecked())
        draw_func()

    """
    Stop, Pause, Unpause only apply to containers
    """

    def stop_selected(self):
        for i in range(0, self.infoTable.rowCount()):
            if (self.infoTable.cellWidget(i, 0).isChecked()):
                status = self.infoTable.item(i, 5).text()
                if (status.startswith('Up')
                        and not status.endswith('(Paused)')):
                    self.docker_clients[0].stop_container(
                        self.infoTable.item(i, 1).text())
        self.draw_containers_table()

    def pause_selected(self):
        for i in range(0, self.infoTable.rowCount()):
            if (self.infoTable.cellWidget(i, 0).isChecked()):
                status = self.infoTable.item(i, 5).text()
                if (status.startswith('Up')
                        and not status.endswith('(Paused)')):
                    self.docker_clients[0].pause_container(
                        self.infoTable.item(i, 1).text())
        self.draw_containers_table()

    def unpause_selected(self):
        for i in range(0, self.infoTable.rowCount()):
            if (self.infoTable.cellWidget(i, 0).isChecked()):
                status = self.infoTable.item(i, 5).text()
                if (status.startswith('Up') and status.endswith('(Paused)')):
                    self.docker_clients[0].unpause_container(
                        self.infoTable.item(i, 1).text())
        self.draw_containers_table()
예제 #7
0
    def __init__(self):
        super().__init__()

        self.result_folder_name = "Results"
        self.host_counts_dir = None
        self.host_config_dir = None
        self.host_param_dir = None

        # This client talks to your local docker
        self.docker = DockerClient('unix:///var/run/docker.sock', 'local')

        # GUI
        self.setStyleSheet("QPushButton{\n"
                           "    background-color: #1588c5;\n"
                           "    color: white;\n"
                           "    height: 25px;\n"
                           "    border: 1px solid #1a8ac6;\n"
                           "}")
        # creat controls
        self.vlayoutBase = QtWidgets.QVBoxLayout()
        self.vlayoutBase.setSizeConstraint(
            QtWidgets.QLayout.SetDefaultConstraint)
        self.vlayoutBase.setContentsMargins(0, 0, 0, 0)
        self.vlayoutBase.setSpacing(0)
        self.vlayoutBase.setObjectName("vlayoutBase")

        self.vlayoutBase = QtWidgets.QVBoxLayout()
        self.vlayoutBase.setContentsMargins(0, 0, 0, 0)
        self.vlayoutBase.setSpacing(0)
        self.vlayoutBase.setObjectName("vlayoutBase")
        self.verticalLayout = QtWidgets.QVBoxLayout()
        self.verticalLayout.setSizeConstraint(
            QtWidgets.QLayout.SetDefaultConstraint)
        self.verticalLayout.setSpacing(0)
        self.verticalLayout.setObjectName("verticalLayout")
        self.frameTitle = QtWidgets.QFrame(self.mainArea)
        self.frameTitle.setEnabled(True)
        sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Preferred,
                                           QtWidgets.QSizePolicy.Preferred)
        sizePolicy.setHorizontalStretch(0)
        sizePolicy.setVerticalStretch(0)
        sizePolicy.setHeightForWidth(
            self.frameTitle.sizePolicy().hasHeightForWidth())
        self.frameTitle.setSizePolicy(sizePolicy)
        self.frameTitle.setMinimumSize(QtCore.QSize(0, 45))
        self.frameTitle.setMaximumSize(QtCore.QSize(16777215, 65))
        self.frameTitle.setStyleSheet("QFrame#frameTitle{\n"
                                      "    background: #1588c5;\n"
                                      "    color: #1588c5\n"
                                      "}")
        self.frameTitle.setFrameShape(QtWidgets.QFrame.Box)
        self.frameTitle.setFrameShadow(QtWidgets.QFrame.Plain)
        self.frameTitle.setObjectName("frameTitle")
        self.lblFormTitle = QtWidgets.QLabel(self.frameTitle)
        self.lblFormTitle.setGeometry(QtCore.QRect(10, 13, 221, 21))
        font = QtGui.QFont()
        font.setPointSize(18)
        font.setBold(False)
        font.setWeight(50)
        self.lblFormTitle.setFont(font)
        self.lblFormTitle.setStyleSheet("\n" "    color: white;\n" "")
        self.lblFormTitle.setObjectName("lblFormTitle")
        self.verticalLayout.addWidget(self.frameTitle)
        self.mainContent = QtWidgets.QWidget(self.mainArea)
        self.mainContent.setObjectName("mainContent")
        self.verticalLayout_4 = QtWidgets.QVBoxLayout(self.mainContent)
        self.verticalLayout_4.setContentsMargins(15, 15, 15, 15)
        self.verticalLayout_4.setObjectName("verticalLayout_4")
        self.vlayout_content = QtWidgets.QVBoxLayout()
        self.vlayout_content.setSizeConstraint(
            QtWidgets.QLayout.SetDefaultConstraint)
        self.vlayout_content.setSpacing(2)
        self.vlayout_content.setObjectName("vlayout_content")
        self.lblExpFile = QtWidgets.QLabel(self.mainContent)
        self.lblExpFile.setMinimumSize(QtCore.QSize(0, 25))
        self.lblExpFile.setMaximumSize(QtCore.QSize(16777215, 25))
        self.lblExpFile.setObjectName("lblExpFile")
        self.vlayout_content.addWidget(self.lblExpFile)
        self.horizontalLayout = QtWidgets.QHBoxLayout()
        self.horizontalLayout.setSizeConstraint(
            QtWidgets.QLayout.SetDefaultConstraint)
        self.horizontalLayout.setContentsMargins(0, -1, -1, -1)
        self.horizontalLayout.setSpacing(1)
        self.horizontalLayout.setObjectName("horizontalLayout")
        self.edtExpDesignFile = QtWidgets.QLineEdit(self.mainContent)
        self.edtExpDesignFile.setObjectName("edtExpDesignFile")
        self.horizontalLayout.addWidget(self.edtExpDesignFile)
        self.btnSelectExpFile = QtWidgets.QPushButton(self.mainContent)
        self.btnSelectExpFile.setMinimumSize(QtCore.QSize(24, 24))
        self.btnSelectExpFile.setMaximumSize(QtCore.QSize(24, 24))
        self.btnSelectExpFile.setObjectName("btnSelectExpFile")
        self.horizontalLayout.addWidget(self.btnSelectExpFile)
        self.vlayout_content.addLayout(self.horizontalLayout)
        self.line_2 = QtWidgets.QFrame(self.mainContent)
        self.line_2.setFrameShape(QtWidgets.QFrame.HLine)
        self.line_2.setFrameShadow(QtWidgets.QFrame.Sunken)
        self.line_2.setObjectName("line_2")
        self.vlayout_content.addWidget(self.line_2)
        self.lblInfoTitle = QtWidgets.QLabel(self.mainContent)
        self.lblInfoTitle.setMinimumSize(QtCore.QSize(0, 25))
        self.lblInfoTitle.setMaximumSize(QtCore.QSize(16777215, 25))
        self.lblInfoTitle.setStyleSheet(
            "background-color:qlineargradient(spread:pad, x1:0, y1:0, x2:0, y2:1, stop:0 rgba(235, 235, 235, 255), stop:1 rgba(217, 217, 217, 255));\n"
            "padding-left: 3px;")
        self.lblInfoTitle.setObjectName("lblInfoTitle")
        self.vlayout_content.addWidget(self.lblInfoTitle)
        self.line = QtWidgets.QFrame(self.mainContent)
        self.line.setFrameShape(QtWidgets.QFrame.HLine)
        self.line.setFrameShadow(QtWidgets.QFrame.Sunken)
        self.line.setObjectName("line")
        self.vlayout_content.addWidget(self.line)
        self.infoLabel = QtWidgets.QLabel(self.mainContent)
        self.infoLabel.setMinimumSize(QtCore.QSize(0, 45))
        self.infoLabel.setStyleSheet("padding-left: 3px")
        self.infoLabel.setFrameShape(QtWidgets.QFrame.NoFrame)
        self.infoLabel.setAlignment(QtCore.Qt.AlignLeading
                                    | QtCore.Qt.AlignLeft | QtCore.Qt.AlignTop)
        self.infoLabel.setWordWrap(True)
        self.infoLabel.setObjectName("infoLabel")
        self.vlayout_content.addWidget(self.infoLabel)
        self.btn_run = QtWidgets.QPushButton(self.mainContent)
        self.btn_run.setMinimumSize(QtCore.QSize(90, 0))
        self.btn_run.setMaximumSize(QtCore.QSize(90, 16777215))
        self.btn_run.setObjectName("btn_run")
        self.vlayout_content.addWidget(self.btn_run, 0, QtCore.Qt.AlignRight)
        self.verticalLayout_4.addLayout(self.vlayout_content)
        self.verticalLayout.addWidget(self.mainContent)
        self.vlayoutBase.addLayout(self.verticalLayout)

        self.mainArea.layout().addLayout(self.vlayoutBase)
        self.mainArea.layout().setContentsMargins(0, 0, 0, 0)
        self.mainArea.setMinimumSize(568, 246)

        # events
        self.btnSelectExpFile.clicked.connect(self.OnChooseExpFile)
        self.btn_run.clicked.connect(self.start_analysis)

        self.retranslateUi(self.mainArea)
class OWSTARAlignment(widget.OWWidget):
    name = "Star Alignment"
    description = "Performs alignment of fastqs to bam via STAR"
    category = "RNASeq"
    icon = "icons/staralignment.svg"

    priority = 10

    inputs = [("FastQ Files", str, "setFastqInput", widget.Default),
              ("Genome Dir", str, "setGenomeDir")]
    outputs = [("Directory", str)]

    want_main_area = False

    dockerClient = DockerClient('unix:///var/run/docker.sock', 'local')

    image_name = "biodepot/ubuntu-star"
    image_version = "latest"

    def __init__(self):
        super().__init__()

        self.bFastqDirSet = False
        self.bStarIndexDirSet = False

        # GUI
        box = gui.widgetBox(self.controlArea, "Info")
        self.info_fastq = gui.widgetLabel(box, 'Please specify a directory with fastq files.')
        self.info_starindex = gui.widgetLabel(box, 'Please specify a genome directory.')
        self.info_fastq.setWordWrap(True)
        self.info_starindex.setWordWrap(True)

        self.AutoStarAlignment = False
        gui.checkBox(self.controlArea, self, 'AutoStarAlignment', 'Run automatically when directory was set.')

        self.btnStarAlignment = gui.button(self.controlArea, self, "Star Alignment", callback=self.StartStarAlignment)
        self.btnStarAlignment.setEnabled(False)

    def setFastqInput(self, path):
        # When a user removes a connected Directory widget,
        # it sends a signal with path=None
        if path is None:
            self.bFastqDirSet = False
        else:
            if not os.path.exists(path):
                self.bFastqDirSet = False
                print('References set to invalid directory')
            else:
                self.fastqDirectory = path
                self.bFastqDirSet = True
                self.info_fastq.setText("Fastq files: {0}".format(self.fastqDirectory))
        self.btnStarAlignment.setEnabled(self.bFastqDirSet and self.bStarIndexDirSet)

        if self.bFastqDirSet and self.bStarIndexDirSet and self.AutoStarAlignment:
            self.StartStarAlignment()

    def setGenomeDir(self, path):
        if path is None:
            self.bStarIndexDirSet = False
        else:
            if not os.path.exists(path):
                self.bStarIndexDirSet = False
                print('References set to invalid directory')
            else:
                self.starindexDirectory = path
                self.bStarIndexDirSet = True
                self.info_starindex.setText("Star index: {0}".format(self.starindexDirectory))
        self.btnStarAlignment.setEnabled(self.bFastqDirSet and self.bStarIndexDirSet)

        if self.bFastqDirSet and self.bStarIndexDirSet and self.AutoStarAlignment:
            self.StartStarAlignment()

    def StartStarAlignment(self):
        if not self.bFastqDirSet or not self.bStarIndexDirSet:
            return

        if not self.dockerClient.has_image(self.image_name, self.image_version):
            self.pull_image()
        elif self.bFastqDirSet and self.bStarIndexDirSet:
            self.run_staralignment()


    """
        Pull image
    """
    def pull_image(self):
        self.info_fastq.setText('Pulling \'' + self.image_name + ":" + self.image_version)
        self.info_starindex.setText('')
        self.setStatusMessage("Downloading...")
        self.progressBarInit()
        self.btnStarAlignment.setEnabled(False)
        # Pull the image in a new thread
        self.pull_image_thread = PullImageThread(self.dockerClient, self.image_name, self.image_version)
        self.pull_image_thread.pull_progress.connect(self.pull_image_progress)
        self.pull_image_thread.finished.connect(self.pull_image_done)
        self.pull_image_thread.start()

    def pull_image_progress(self, val=0):
        self.progressBarSet(val)

    def pull_image_done(self):
        self.info_fastq.setText('Finished pulling \'' + self.image_name + ":" + self.image_version + '\'')
        self.progressBarFinished()
        self.run_staralignment()

    def run_staralignment(self):
        self.btnStarAlignment.setEnabled(False)
        self.info_fastq.setText('Running star alignment...')
        self.info_starindex.setText('')
        self.setStatusMessage('Running...')
        #self.progressBarInit()
        # Run the container in a new thread
        self.run_staralignment_thread = StarAlignmentThread(self.dockerClient,
                                                     self.image_name,
                                                     self.image_version,
                                                     self.fastqDirectory,
                                                     self.starindexDirectory,
                                                     self.fastqDirectory)

        self.run_staralignment_thread.analysis_progress.connect(self.run_staralignment_progress)
        self.run_staralignment_thread.finished.connect(self.run_staralignment_done)
        self.run_staralignment_thread.start()

    def run_staralignment_progress(self, val):
        self.progressBarSet(val)

    def run_staralignment_done(self):
        self.info_fastq.setText("Finished running analysis!")
        self.btnStarAlignment.setEnabled(True)
        self.btnStarAlignment.setText('Run again')
        self.setStatusMessage('Finished!')
        #self.progressBarFinished()
        self.send("Directory", self.fastqDirectory)
        self.btnStarAlignment.setEnabled(True)
예제 #9
0
class OWUnpack(widget.OWWidget):
    name = "UnPack"
    description = "Unpack compressed fastqc files"
    icon = "icons/unpack.svg"

    priority = 10

    inputs = [("Unpack", str, "setDirectory", widget.Default)]
    outputs = [("Directory", str)]

    want_main_area = False

    dockerClient = DockerClient('unix:///var/run/docker.sock', 'local')

    def __init__(self):
        super().__init__()

        self.inputDirectory = None
        self.bDirectorySet = False;

        # GUI
        box = gui.widgetBox(self.controlArea, "Info")
        self.infoa = gui.widgetLabel(box, 'Please specify a directory.')
        self.infob = gui.widgetLabel(box, '')
        self.infoa.setWordWrap(True)
        self.infob.setWordWrap(True)

        self.AutoUnpack = False
        gui.checkBox(self.controlArea, self, 'AutoUnpack', 'Run automatically when directory was set.')

        self.mergeFile = True
        gui.checkBox(self.controlArea, self, "mergeFile", "Merge files into R1.fastq and R2.fastq")

        self.btnUnpack = gui.button(self.controlArea, self, "Unpack", callback=self.StartUnpack)
        self.btnUnpack.setEnabled(False)

    """
       Set Unpack Directory
    """
    def setDirectory(self, path):
        # When a user removes a connected Directory widget,
        # it sends a signal with path=None
        if path is None:
            self.bDirectorySet = False
        else:
            if not os.path.exists(path):
                self.bDirectorySet = False
                print('References set to invalid directory')
            else:
                self.inputDirectory = path
                self.bDirectorySet = True
                self.infoa.setText("Directory: {0}".format(self.inputDirectory))
        self.btnUnpack.setEnabled(self.bDirectorySet)

        if self.bDirectorySet and self.AutoUnpack:
            self.StartUnpack()
    """
        Do Unpack
        tar  file:///path/to/sample.tar
        #   fq  paired  file:///path/to/R1.fq.gz,file:///path/to/R2.fq.gz
        #   tar single  http://sample-depot.com/single-end-sample.tar
        #   tar paired  s3://my-bucket-name/directory/paired-sample.tar.gz
        #   fq  single  s3://my-bucket-name/directory/single-end-file.fq

        now, only consider [fq paired]
    """
    def StartUnpack(self):
        if not self.bDirectorySet:
            return

        self.progressBarInit()
        command = ['tar', '-zxf']
        if platform.system() == "Darwin":
            #command = ['gunzip', '-k']
            command = ['gunzip']

        fastq_files = []
        for root, subdir, files in os.walk(self.inputDirectory):
            fastq_files.extend([os.path.join(root, x) for x in files])

        if self.mergeFile:
            r1, r2 = [], []
            # Pattern convention: Look for "R1" / "R2" in the filename, or "_1" / "_2" before the extension
            pattern = re.compile('(?:^|[._-])(R[12]|[12]\.f)')
            for fastq in sorted(fastq_files):
                match = pattern.search(os.path.basename(fastq))
                if not match:
                    print ('Invalid FASTQ file: {0}, ignore it.'.format(fastq))
                    continue
                elif '1' in match.group():
                    r1.append(fastq)
                elif '2' in match.group():
                    r2.append(fastq)

            if len(r1) != len(r2):
                self.error('Check fastq names, uneven number of pairs found.')
                print ('Check fastq names, uneven number of pairs found.\nr1: {}\nr2: {}'.format(r1, r2))
                return

            if len(r1) == 0:
                return

            if platform.system() == "Darwin":
                command = ['gunzip', '-c'] if r1[0].endswith('.gz') and r2[0].endswith('.gz') else ['cat']
            else:
                command = ['zcat'] if r1[0].endswith('.gz') and r2[0].endswith('.gz') else ['cat']

            R1_file = open(os.path.join(self.inputDirectory, 'R1.fastq'), 'a')
            R2_file = open(os.path.join(self.inputDirectory, 'R2.fastq'), 'a')

            for i in range(len(r1)):
                p1 = subprocess.Popen(command + [str(r1[i])], stdout = R1_file)
                p2 = subprocess.Popen(command + [str(r2[i])], stdout = R2_file)
                p1.wait()
                p2.wait()
                self.progressBarSet((i + 1) / len(r1) * 100)

            R1_file.flush()
            R2_file.flush()

        else:
            for index, fastq in enumerate(sorted(fastq_files)):
                print("Unpacking....{0}".format(fastq))
                if not fastq.endswith('.gz'):
                    print ("Not supported file format {0}".format(fastq))
                else:
                    runcommand = command + [fastq]
                    #print (runcommand)
                    processor = subprocess.Popen(runcommand)
                    processor.wait()

                self.progressBarSet((index+1)/len(fastq_files)*100)
                #time.sleep(0.1)

        self.progressBarFinished()
        self.send("Directory", self.inputDirectory)
예제 #10
0
class OWSBowtie2(widget.OWWidget):
    RunMode_GenerateGenome = 0
    RunMode_STAR = 1

    name = "Bowtie2"
    description = "An ultrafast memory-efficient short read aligner"
    category = "RNASeq"
    icon = "icons/bowtie.png"

    priority = 10

    inputs = [("FQ Files", str, "setFastqInput", widget.Default),
              ("Bt2 Index", str, "setStarIndexDir")]
    outputs = [("SAM Files", str)]

    want_main_area = False

    dockerClient = DockerClient('unix:///var/run/docker.sock', 'local')

    image_name = "biocontainers/bowtie2"
    image_version = "latest"

    def __init__(self):

        super().__init__()

        self.bFastqDirSet = False
        self.bStarIndexDirSet = False

        # GUI
        box = gui.widgetBox(self.controlArea, "Info")
        self.info_fastq = gui.widgetLabel(
            box, 'Please specify a directory with FQ files.')
        self.info_fastq.setWordWrap(True)

        self.AutoBowtie2 = False

        self.info_starindex = gui.widgetLabel(
            box, 'Please specify a directory with bt2 index.')

        self.info_starindex.setWordWrap(True)

        gui.checkBox(self.controlArea, self, 'AutoBowtie2',
                     'Run automatically when directory was set.')

        self.btnStartBowtie2 = gui.button(self.controlArea,
                                          self,
                                          "Star Bowtie2",
                                          callback=self.StartBowtie2)
        self.btnStartBowtie2.setEnabled(False)

    def setFastqInput(self, path):
        # When a user removes a connected Directory widget,
        # it sends a signal with path=None
        if path is None:
            self.bFastqDirSet = False
        else:
            if not os.path.exists(path):
                self.bFastqDirSet = False
                print('References set to invalid directory')
            else:
                self.fastqDirectory = path
                self.bFastqDirSet = True
                self.info_fastq.setText("FQ files: {0}".format(
                    self.fastqDirectory))

        self.btnStartBowtie2.setEnabled(self.bFastqDirSet)

        if self.bFastqDirSet and self.AutoBowtie2 and self.bStarIndexDirSet:
            self.StartBowtie2()

    def setStarIndexDir(self, path):
        if path is None:
            self.bStarIndexDirSet = False
        else:
            if not os.path.exists(path):
                self.bStarIndexDirSet = False
                print('References set to invalid directory')
            else:
                self.starindexDirectory = path
                self.bStarIndexDirSet = True
                self.info_starindex.setText("Bt2 index: {0}".format(
                    self.starindexDirectory))
        self.btnStartBowtie2.setEnabled(self.bFastqDirSet
                                        and self.bStarIndexDirSet)

        if self.bFastqDirSet and self.bStarIndexDirSet and self.AutoBowtie2:
            self.StartBowtie2()

    def StartBowtie2(self):
        if not self.bFastqDirSet or not self.bStarIndexDirSet:
            return

        if not self.dockerClient.has_image(self.image_name,
                                           self.image_version):
            self.pull_image()
        elif self.bFastqDirSet:
            self.run_startbowtie2()

    """
        Pull image
    """

    def pull_image(self):
        self.info_fastq.setText('Pulling \'' + self.image_name + ":" +
                                self.image_version)
        self.info_starindex.setText('')
        self.setStatusMessage("Downloading...")
        self.progressBarInit()
        self.btnStartBowtie2.setEnabled(False)
        # Pull the image in a new thread
        self.pull_image_thread = PullImageThread(self.dockerClient,
                                                 self.image_name,
                                                 self.image_version)
        self.pull_image_thread.pull_progress.connect(self.pull_image_progress)
        self.pull_image_thread.finished.connect(self.pull_image_done)
        self.pull_image_thread.start()

    def pull_image_progress(self, val=0):
        self.progressBarSet(val)

    def pull_image_done(self):
        self.info_fastq.setText('Finished pulling \'' + self.image_name + ":" +
                                self.image_version + '\'')
        self.progressBarFinished()
        self.run_startbowtie2()

    def run_startbowtie2(self):
        self.btnStartBowtie2.setEnabled(False)
        self.info_fastq.setText('Running bowtie alignment...')
        self.setStatusMessage('Running...')
        #self.progressBarInit()
        # Run the container in a new thread
        self.run_startbowtie2_thread = Bowtie2Thread(self.dockerClient,
                                                     self.image_name,
                                                     self.image_version,
                                                     self.fastqDirectory,
                                                     self.starindexDirectory)

        self.run_startbowtie2_thread.analysis_progress.connect(
            self.run_startbowtie2_progress)
        self.run_startbowtie2_thread.finished.connect(
            self.run_startbowtie2_done)
        self.run_startbowtie2_thread.start()

    def run_startbowtie2_progress(self, val):
        self.progressBarSet(val)

    def run_startbowtie2_done(self):
        self.info_fastq.setText("Finished run bowtie2")
        self.btnStartBowtie2.setEnabled(True)
        self.btnStartBowtie2.setText('Run again')
        self.setStatusMessage('Finished!')
        output_channel = self.fastqDirectory
        self.send("SAM Files", output_channel)
예제 #11
0
class OWSTARAlignment(widget.OWWidget):
    RunMode_GenerateGenome = 0
    RunMode_STAR = 1

    name = "Star Alignment"
    description = "Performs alignment of fastqs to bam via STAR"
    category = "RNASeq"
    icon = "icons/staralignment.svg"

    priority = 10

    inputs = [("FastQ Files", str, "setFastqInput", widget.Default),
              ("Genome Dir", str, "setGenomeDir")]
    outputs = [("Directory", str)]

    want_main_area = False

    dockerClient = DockerClient('unix:///var/run/docker.sock', 'local')

    image_name = "biodepot/ubuntu-star"
    image_version = "latest"

    def __init__(self):
        super().__init__()

        self.bFastqDirSet = False
        self.bStarIndexDirSet = False
        self.result_folder_name = "/Aligned"

        # GUI
        box = gui.widgetBox(self.controlArea, "Info")
        self.info_fastq = gui.widgetLabel(
            box, 'Please specify a directory with fastq or fasta files.')
        self.info_starindex = gui.widgetLabel(
            box, 'Please specify a genome directory.')
        self.info_fastq.setWordWrap(True)
        self.info_starindex.setWordWrap(True)

        self.RunMode = OWSTARAlignment.RunMode_GenerateGenome
        self.cboRunMode = gui.comboBox(self.controlArea,
                                       self,
                                       'RunMode',
                                       label='Running Mode:',
                                       items=('Generate Genome',
                                              'STAR Alignment'),
                                       valueType=int)
        self.cboRunMode.setCurrentIndex(0)

        self.AutoStarAlignment = False
        gui.checkBox(self.controlArea, self, 'AutoStarAlignment',
                     'Run automatically when directory was set.')

        self.btnStarAlignment = gui.button(self.controlArea,
                                           self,
                                           "Star Alignment",
                                           callback=self.StartStarAlignment)
        self.btnStarAlignment.setEnabled(False)

    def setFastqInput(self, path):
        # When a user removes a connected Directory widget,
        # it sends a signal with path=None
        if path is None:
            self.bFastqDirSet = False
        else:
            if not os.path.exists(path):
                self.bFastqDirSet = False
                print('References set to invalid directory')
            else:
                self.fastqDirectory = path
                self.bFastqDirSet = True
                self.info_fastq.setText("Fasta/q files: {0}".format(
                    self.fastqDirectory))

            host_fastq_dir = path.strip()
            # Jimmy May-03-2017, once the fastq input was set, automatically create an output fold as a sibling of "fastq"
            parent_path = os.path.abspath(os.path.join(host_fastq_dir, '..'))
            self.host_results_dir = os.path.join(parent_path +
                                                 self.result_folder_name)
            if not os.path.exists(self.host_results_dir):
                os.makedirs(self.host_results_dir)

        self.btnStarAlignment.setEnabled(self.bFastqDirSet
                                         and self.bStarIndexDirSet)

        if self.bFastqDirSet and self.bStarIndexDirSet and self.AutoStarAlignment:
            self.StartStarAlignment()

    def setGenomeDir(self, path):
        if path is None:
            self.bStarIndexDirSet = False
        else:
            if not os.path.exists(path):
                self.bStarIndexDirSet = False
                print('References set to invalid directory')
            else:
                self.starindexDirectory = path
                self.bStarIndexDirSet = True
                self.info_starindex.setText("Star index: {0}".format(
                    self.starindexDirectory))
        self.btnStarAlignment.setEnabled(self.bFastqDirSet
                                         and self.bStarIndexDirSet)

        if self.bFastqDirSet and self.bStarIndexDirSet and self.AutoStarAlignment:
            self.StartStarAlignment()

    def StartStarAlignment(self):
        if not self.bFastqDirSet or not self.bStarIndexDirSet:
            return

        if not self.dockerClient.has_image(self.image_name,
                                           self.image_version):
            self.pull_image()
        elif self.bFastqDirSet and self.bStarIndexDirSet:
            self.run_staralignment()

    """
        Pull image
    """

    def pull_image(self):
        self.info_fastq.setText('Pulling \'' + self.image_name + ":" +
                                self.image_version)
        self.info_starindex.setText('')
        self.setStatusMessage("Downloading...")
        self.progressBarInit()
        self.btnStarAlignment.setEnabled(False)
        # Pull the image in a new thread
        self.pull_image_thread = PullImageThread(self.dockerClient,
                                                 self.image_name,
                                                 self.image_version)
        self.pull_image_thread.pull_progress.connect(self.pull_image_progress)
        self.pull_image_thread.finished.connect(self.pull_image_done)
        self.pull_image_thread.start()

    def pull_image_progress(self, val=0):
        self.progressBarSet(val)

    def pull_image_done(self):
        self.info_fastq.setText('Finished pulling \'' + self.image_name + ":" +
                                self.image_version + '\'')
        self.progressBarFinished()
        self.run_staralignment()

    def run_staralignment(self):
        self.btnStarAlignment.setEnabled(False)
        self.info_fastq.setText('Running star alignment...')
        self.info_starindex.setText('')
        self.setStatusMessage('Running...')
        #self.progressBarInit()
        # Run the container in a new thread
        self.run_staralignment_thread = StarAlignmentThread(
            self.dockerClient, self.image_name, self.image_version,
            self.fastqDirectory, self.starindexDirectory,
            self.host_results_dir, self.RunMode)

        self.run_staralignment_thread.analysis_progress.connect(
            self.run_staralignment_progress)
        self.run_staralignment_thread.finished.connect(
            self.run_staralignment_done)
        self.run_staralignment_thread.analysis_message.connect(
            self.run_star_message)
        self.run_staralignment_thread.start()

    def run_staralignment_progress(self, val):
        self.progressBarSet(val)

    def run_staralignment_done(self):
        self.info_fastq.setText("Finished running analysis!")
        self.btnStarAlignment.setEnabled(True)
        self.btnStarAlignment.setText('Run again')
        self.setStatusMessage('Finished!')
        output_channel = self.host_results_dir
        if self.RunMode == OWSTARAlignment.RunMode_GenerateGenome:
            output_channel = self.starindexDirectory
        self.send("Directory", output_channel)
        self.btnStarAlignment.setEnabled(True)

    def run_star_message(self, msgType, message):
        if msgType == 'warning':
            self.warning(message)
        elif msgType == 'error':
            self.error(message)
예제 #12
0
class OWCutAdapt(widget.OWWidget):
    name = "CutAdapt"
    description = "CutAdapt for RNA-seq"
    icon = "icons/cutadapt.svg"

    priority = 10

    inputs = [("CutAdapt", str, "setDirectory")]
    outputs = [("Directory", str)]

    want_main_area = False

    dockerClient = DockerClient('unix:///var/run/docker.sock', 'local')

    image_name = "quay.io/ucsc_cgl/cutadapt"
    image_version = "1.9--6bd44edd2b8f8f17e25c5a268fedaab65fa851d2"

    def __init__(self):
        super().__init__()

        # GUI
        box = gui.widgetBox(self.controlArea, "Info")
        self.infoa = gui.widgetLabel(box, 'Please specify a directory.')
        self.infob = gui.widgetLabel(box, '')
        self.infoa.setWordWrap(True)
        self.infob.setWordWrap(True)

        self.AutoCutAdapt = False
        gui.checkBox(self.controlArea, self, 'AutoCutAdapt',
                     'Run automatically when directory was set.')

        self.btnCutAdapt = gui.button(self.controlArea,
                                      self,
                                      "CutAdapt",
                                      callback=self.StartCutAdapt)
        self.btnCutAdapt.setEnabled(False)

    def setDirectory(self, path):
        # When a user removes a connected Directory widget,
        # it sends a signal with path=None
        if path is None:
            self.bDirectorySet = False
        else:
            if not os.path.exists(path):
                self.bDirectorySet = False
                print('References set to invalid directory')
            else:
                self.inputDirectory = path
                self.bDirectorySet = True
                self.infoa.setText("Directory: {0}".format(
                    self.inputDirectory))
        self.btnCutAdapt.setEnabled(self.bDirectorySet)

        if self.bDirectorySet and self.AutoCutAdapt:
            self.StartCutAdapt()

    def StartCutAdapt(self):
        if not self.bDirectorySet:
            return

        if not self.dockerClient.has_image(self.image_name,
                                           self.image_version):
            self.pull_image()
        elif self.bDirectorySet:
            self.run_cutadpat()

    """
        Pull image
    """

    def pull_image(self):
        self.infoa.setText('Pulling \'' + self.image_name + ":" +
                           self.image_version)
        self.setStatusMessage("Downloading...")
        self.progressBarInit()
        self.btnCutAdapt.setEnabled(False)
        # Pull the image in a new thread
        self.pull_image_thread = PullImageThread(self.dockerClient,
                                                 self.image_name,
                                                 self.image_version)
        self.pull_image_thread.pull_progress.connect(self.pull_image_progress)
        self.pull_image_thread.finished.connect(self.pull_image_done)
        self.pull_image_thread.start()

    def pull_image_progress(self, val=0):
        self.progressBarSet(val)

    def pull_image_done(self):
        self.infoa.setText('Finished pulling \'' + self.image_name + ":" +
                           self.image_version + '\'')
        self.progressBarFinished()
        self.run_cutadpat()

    def run_cutadpat(self):
        self.btnCutAdapt.setEnabled(False)
        self.infoa.setText('Running cutadapt...')
        self.setStatusMessage('Running...')
        self.progressBarInit()
        # Run the container in a new thread
        self.run_cutadpat_thread = CutAdaptThread(self.dockerClient,
                                                  self.image_name,
                                                  self.image_version,
                                                  self.inputDirectory,
                                                  self.inputDirectory)

        self.run_cutadpat_thread.analysis_progress.connect(
            self.run_cutadpat_progress)
        self.run_cutadpat_thread.finished.connect(self.run_cutadpat_done)
        self.run_cutadpat_thread.start()

    def run_cutadpat_progress(self, val):
        self.progressBarSet(val)

    def run_cutadpat_done(self):
        self.infoa.setText("Finished running analysis!")
        self.btnCutAdapt.setEnabled(True)
        self.btnCutAdapt.setText('Run again')
        self.setStatusMessage('Finished!')
        self.progressBarFinished()
        self.send("Directory", self.inputDirectory)
        self.btnCutAdapt.setEnabled(True)