Beispiel #1
0
def unorganised_runfolder(name="180124_A00181_0019_BH72M5DMXX",
                          root_path="/foo"):
    sample_indexes = sample_index_generator()
    lane_numbers = lane_generator()
    runfolder = Runfolder(name=name, path=os.path.join(root_path, name))
    runfolder.projects = [
        runfolder_project(runfolder,
                          project_name=p,
                          sample_indexes=sample_indexes,
                          lane_numbers=lane_numbers) for p in fake_projects
    ]
    # add another project with missing files
    project = runfolder_project(runfolder,
                                project_name="JKL_123",
                                sample_indexes=sample_indexes,
                                lane_numbers=lane_numbers)
    project.project_files = []
    runfolder.projects.append(project)
    checksums = {}
    for project in runfolder.projects:
        for sample in project.samples:
            for sample_file in sample.sample_files:
                checksums[os.path.relpath(
                    sample_file.file_path,
                    os.path.dirname(runfolder.path))] = sample_file.checksum
        for project_file in project.project_files:
            checksums[os.path.relpath(
                project_file.file_path,
                os.path.dirname(runfolder.path))] = project_file.checksum
    runfolder.checksums = checksums
    return runfolder
Beispiel #2
0
    def _get_runfolders(self):
        # TODO Filter based on expression for runfolders...
        runfolder_expression = r"^\d+_"

        directories = self.file_system_service.find_runfolder_directories(
            self._base_path)
        for directory in directories:
            if re.match(runfolder_expression, os.path.basename(directory)):

                name = os.path.basename(directory)
                path = os.path.join(self._base_path, directory)

                projects_base_dir = os.path.join(path, "Projects")
                project_directories = self.file_system_service.find_project_directories(
                    projects_base_dir)

                runfolder = Runfolder(name=name, path=path, projects=None)

                def project_from_dir(d):
                    return Project(name=os.path.basename(d),
                                   path=os.path.join(projects_base_dir, d),
                                   runfolder_path=path)

                # There are scenarios where there are no project directories in the runfolder,
                # i.e. when fastq files have not yet been divided into projects
                if project_directories:
                    runfolder.projects = map(project_from_dir,
                                             project_directories)

                yield runfolder
 def _get_runfolder_object(self, directory, ignore_errors=False):
     name = os.path.basename(directory)
     path = os.path.join(self._base_path, directory)
     runfolder = Runfolder(name=name, path=path, projects=None)
     self._add_checksums_for_runfolder(runfolder, ignore_errors=ignore_errors)
     self._add_projects_to_runfolder(runfolder)
     return runfolder
    def _get_runfolders(self):
        # TODO Filter based on expression for runfolders...
        runfolder_expression = r"^\d+_"

        directories = self.file_system_service.find_runfolder_directories(
            self._base_path)
        for directory in directories:
            if re.match(runfolder_expression, os.path.basename(directory)):

                name = os.path.basename(directory)
                path = os.path.join(self._base_path, directory)

                runfolder = Runfolder(name=name, path=path, projects=None)
                self._add_projects_to_runfolder(runfolder)

                yield runfolder
Beispiel #5
0
    def organise_runfolder(self, runfolder_id, lanes, projects, force):
        """
        Organise a runfolder in preparation for delivery. This will create separate subdirectories for each of the
        projects and symlink all files belonging to the project to be delivered under this directory.

        :param runfolder_id: the name of the runfolder to be organised
        :param lanes: if not None, only samples on any of the specified lanes will be organised
        :param projects: if not None, only projects in this list will be organised
        :param force: if True, a previously organised project will be renamed with a unique suffix
        :raises ProjectAlreadyOrganisedException: if a project has already been organised and force is False
        :return: a Runfolder instance representing the runfolder after organisation
        """
        # retrieve a runfolder object and project objects to be organised
        runfolder = self.runfolder_service.find_runfolder(runfolder_id)
        projects_on_runfolder = list(
            self.runfolder_service.find_projects_on_runfolder(
                runfolder, only_these_projects=projects))

        # handle previously organised projects
        organised_projects_path = os.path.join(runfolder.path, "Projects")
        for project in projects_on_runfolder:
            self.check_previously_organised_project(project,
                                                    organised_projects_path,
                                                    force)

        # organise the projects and return a new Runfolder instance
        organised_projects = []
        for project in projects_on_runfolder:
            organised_projects.append(
                self.organise_project(runfolder, project,
                                      organised_projects_path, lanes))

        return Runfolder(runfolder.name,
                         runfolder.path,
                         projects=organised_projects,
                         checksums=runfolder.checksums)

fake_directories = [
    "160930_ST-E00216_0111_BH37CWALXX", "160930_ST-E00216_0112_BH37CWALXX"
]
fake_projects = ["ABC_123", "DEF_456"]


def mock_file_system_service(directories, projects):
    mock_file_system_service_instance = MagicMock()
    mock_file_system_service_instance.find_runfolder_directories.return_value = directories
    mock_file_system_service_instance.find_project_directories.return_value = projects
    return mock_file_system_service_instance


_runfolder1 = Runfolder(name="160930_ST-E00216_0111_BH37CWALXX",
                        path="/foo/160930_ST-E00216_0111_BH37CWALXX")

_runfolder1.projects = [
    RunfolderProject(
        name="ABC_123",
        path="/foo/160930_ST-E00216_0111_BH37CWALXX/Projects/ABC_123",
        runfolder_path=_runfolder1.path),
    RunfolderProject(
        name="DEF_456",
        path="/foo/160930_ST-E00216_0111_BH37CWALXX/Projects/DEF_456",
        runfolder_path=_runfolder1.path)
]

_runfolder2 = Runfolder(name="160930_ST-E00216_0112_BH37CWALXX",
                        path="/foo/160930_ST-E00216_0112_BH37CWALXX")