def test_import_project(self):
     """import_project: check project is imported
     """
     # Make an auto-process directory
     mockdir = MockAnalysisDirFactory.bcl2fastq2(
         '160621_M00879_0087_000000000-AGEW9', 'miseq', top_dir=self.dirn)
     mockdir.create()
     # Check that the project is not currently present
     ap = AutoProcess(mockdir.dirn)
     self.assertFalse(
         'NewProj' in [p.name for p in ap.get_analysis_projects()])
     self.assertFalse(
         'NewProj' in
         [p.name for p in ap.get_analysis_projects_from_dirs()])
     self.assertFalse(
         os.path.exists(os.path.join(ap.analysis_dir, 'NewProj')))
     # Import the project
     import_project(ap, self.new_project_dir)
     self.assertTrue(
         'NewProj' in [p.name for p in ap.get_analysis_projects()])
     self.assertTrue('NewProj' in
                     [p.name for p in ap.get_analysis_projects_from_dirs()])
     self.assertTrue(
         os.path.exists(os.path.join(ap.analysis_dir, 'NewProj')))
     # Verify via fresh AutoProcess object
     ap2 = AutoProcess(mockdir.dirn)
     self.assertTrue(
         'NewProj' in [p.name for p in ap2.get_analysis_projects()])
     self.assertTrue(
         'NewProj' in
         [p.name for p in ap2.get_analysis_projects_from_dirs()])
     self.assertTrue(
         os.path.exists(os.path.join(ap2.analysis_dir, 'NewProj')))
 def test_publish_qc_with_projects_with_multiple_fastq_sets(self):
     """publish_qc: projects with multiple Fastq sets
     """
     # Make an auto-process directory
     mockdir = MockAnalysisDirFactory.bcl2fastq2(
         '160621_K00879_0087_000000000-AGEW9',
         'hiseq',
         metadata={ "run_number": 87,
                    "source": "local",
                    "instrument_datestamp": "160621" },
         top_dir=self.dirn)
     mockdir.create()
     ap = AutoProcess(mockdir.dirn)
     # Add processing report and QC outputs
     UpdateAnalysisDir(ap).add_processing_report()
     for project in ap.get_analysis_projects():
         UpdateAnalysisProject(project).add_qc_outputs()
     # Add additional fastq set for first project
     multi_fastqs_project = ap.get_analysis_projects()[0]
     UpdateAnalysisProject(multi_fastqs_project).add_fastq_set(
         "fastqs.extra",
         ("Alt1.r1.fastq.gz","Alt2.r1.fastq.gz"))
     UpdateAnalysisProject(multi_fastqs_project).add_qc_outputs(
         fastq_set="fastqs.extra",
         qc_dir="qc.extra")
     # Make a mock publication area
     publication_dir = os.path.join(self.dirn,'QC')
     os.mkdir(publication_dir)
     # Publish
     publish_qc(ap,location=publication_dir)
     # Check outputs
     outputs = ["index.html",
                "processing_qc.html"]
     for project in ap.get_analysis_projects():
         # Standard QC outputs
         project_qc = "qc_report.%s.%s" % (project.name,
                                           os.path.basename(
                                               ap.analysis_dir))
         outputs.append(project_qc)
         outputs.append("%s.zip" % project_qc)
         outputs.append(os.path.join(project_qc,"qc_report.html"))
         outputs.append(os.path.join(project_qc,"qc"))
         # MultiQC output
         outputs.append("multiqc_report.%s.html" % project.name)
     # Additional QC for second fastq set in first project
     project_qc = "qc.extra_report.%s.%s" % (multi_fastqs_project.name,
                                             os.path.basename(
                                                 ap.analysis_dir))
     outputs.append(project_qc)
     outputs.append("%s.zip" % project_qc)
     outputs.append(os.path.join(project_qc,"qc.extra_report.html"))
     outputs.append(os.path.join(project_qc,"qc.extra"))
     # MultiQC output
     outputs.append("multiqc.extra_report.%s.html" %
                    multi_fastqs_project.name)
     for item in outputs:
         f = os.path.join(publication_dir,
                          "160621_K00879_0087_000000000-AGEW9_analysis",
                          item)
         self.assertTrue(os.path.exists(f),"Missing %s" % f)
 def test_import_project(self):
     """Check AutoProcess.import_project imports a project
     """
     # Make an auto-process directory
     mockdir = MockAnalysisDirFactory.bcl2fastq2(
         '160621_M00879_0087_000000000-AGEW9',
         'miseq',
         top_dir=self.dirn)
     mockdir.create()
     # Check that the project is not currently present
     ap = AutoProcess(mockdir.dirn)
     self.assertFalse('NewProj' in [p.name
                                    for p in ap.get_analysis_projects()])
     self.assertFalse('NewProj' in [p.name
                                    for p in ap.get_analysis_projects_from_dirs()])
     self.assertFalse(os.path.exists(os.path.join(ap.analysis_dir,'NewProj')))
     # Import the project
     ap.import_project(self.new_project_dir)
     self.assertTrue('NewProj' in [p.name
                                   for p in ap.get_analysis_projects()])
     self.assertTrue('NewProj' in [p.name
                                   for p in ap.get_analysis_projects_from_dirs()])
     self.assertTrue(os.path.exists(os.path.join(ap.analysis_dir,'NewProj')))
     # Verify via fresh AutoProcess object
     ap2 = AutoProcess(mockdir.dirn)
     self.assertTrue('NewProj' in [p.name
                                   for p in ap2.get_analysis_projects()])
     self.assertTrue('NewProj' in [p.name
                                   for p in ap2.get_analysis_projects_from_dirs()])
     self.assertTrue(os.path.exists(os.path.join(ap2.analysis_dir,'NewProj')))
 def test_publish_qc_subset_of_projects(self):
     """publish_qc: only publish subset of projects
     """
     # Make an auto-process directory
     mockdir = MockAnalysisDirFactory.bcl2fastq2(
         '160621_K00879_0087_000000000-AGEW9',
         'hiseq',
         metadata={ "run_number": 87,
                    "source": "local",
                    "instrument_datestamp": "160621" },
         top_dir=self.dirn)
     mockdir.create()
     ap = AutoProcess(mockdir.dirn)
     # Add processing report
     UpdateAnalysisDir(ap).add_processing_report()
     # Add QC outputs for subset of projects
     projects = ap.get_analysis_projects()
     missing_projects = projects[1:]
     projects = projects[0:1]
     for project in ap.get_analysis_projects():
         UpdateAnalysisProject(project).add_qc_outputs()
     # Make a mock publication area
     publication_dir = os.path.join(self.dirn,'QC')
     os.mkdir(publication_dir)
     # Publish
     publish_qc(ap,location=publication_dir,
                projects="AB*")
     # Check outputs
     outputs = ["index.html",
                "processing_qc.html"]
     for project in projects:
         # Standard QC outputs
         project_qc = "qc_report.%s.%s" % (project.name,
                                           os.path.basename(
                                               ap.analysis_dir))
         outputs.append(project_qc)
         outputs.append("%s.zip" % project_qc)
         outputs.append(os.path.join(project_qc,"qc_report.html"))
         outputs.append(os.path.join(project_qc,"qc"))
         # MultiQC output
         outputs.append("multiqc_report.%s.html" % project.name)
     for item in outputs:
         f = os.path.join(publication_dir,
                          "160621_K00879_0087_000000000-AGEW9_analysis",
                          item)
         self.assertTrue(os.path.exists(f),"Missing %s" % f)
     # Check that missing projects weren't copied
     for project in missing_projects:
         self.assertFalse(os.path.exists(
             os.path.join(publication_dir,
                          "160621_K00879_0087_000000000-AGEW9_analysis",
                          "qc_report.%s.%s" % (project.name,
                                               os.path.basename(
                                                   ap.analysis_dir)))),
                          "%s exists in final dir, but shouldn't" %
                          project.name)
 def test_publish_qc_with_icell8_outputs(self):
     """publish_qc: project with ICell8 QC outputs
     """
     # Make an auto-process directory
     mockdir = MockAnalysisDirFactory.bcl2fastq2(
         '160621_K00879_0087_000000000-AGEW9',
         'hiseq',
         metadata={ "run_number": 87,
                    "source": "local",
                    "instrument_datestamp": "160621" },
         top_dir=self.dirn)
     mockdir.create()
     ap = AutoProcess(mockdir.dirn)
     # Add processing report and QC outputs
     UpdateAnalysisDir(ap).add_processing_report()
     projects = ap.get_analysis_projects()
     for project in projects:
         UpdateAnalysisProject(project).add_qc_outputs()
     # Add ICell8 report for one project
     icell8_project = projects[0]
     UpdateAnalysisProject(icell8_project).add_icell8_outputs()
     # Make a mock publication area
     publication_dir = os.path.join(self.dirn,'QC')
     os.mkdir(publication_dir)
     # Publish
     publish_qc(ap,location=publication_dir)
     # Check outputs
     outputs = ["index.html",
                "processing_qc.html"]
     for project in ap.get_analysis_projects():
         # Standard QC outputs
         project_qc = "qc_report.%s.%s" % (project.name,
                                           os.path.basename(
                                               ap.analysis_dir))
         outputs.append(project_qc)
         outputs.append("%s.zip" % project_qc)
         outputs.append(os.path.join(project_qc,"qc_report.html"))
         outputs.append(os.path.join(project_qc,"qc"))
         # MultiQC output
         outputs.append("multiqc_report.%s.html" % project.name)
     # ICell8 outputs
     icell8_dir = "icell8_processing.%s.%s" % (icell8_project.name,
                                               os.path.basename(
                                                   ap.analysis_dir))
     outputs.append(icell8_dir)
     outputs.append("%s.zip" % icell8_dir)
     outputs.append(os.path.join(icell8_dir,"icell8_processing_data"))
     outputs.append(os.path.join(icell8_dir,"icell8_processing.html"))
     outputs.append(os.path.join(icell8_dir,"stats"))
     # Do checks
     for item in outputs:
         f = os.path.join(publication_dir,
                          "160621_K00879_0087_000000000-AGEW9_analysis",
                          item)
         self.assertTrue(os.path.exists(f),"Missing %s" % f)
Beispiel #6
0
 def test_publish_qc_with_projects_no_reports(self):
     """publish_qc: projects with all QC outputs but no reports
     """
     # Make an auto-process directory
     mockdir = MockAnalysisDirFactory.bcl2fastq2(
         '160621_K00879_0087_000000000-AGEW9',
         'hiseq',
         metadata={
             "run_number": 87,
             "source": "local",
             "instrument_datestamp": "160621"
         },
         top_dir=self.dirn)
     mockdir.create()
     ap = AutoProcess(mockdir.dirn, settings=self.settings)
     # Add processing report and QC outputs
     UpdateAnalysisDir(ap).add_processing_report()
     for project in ap.get_analysis_projects():
         UpdateAnalysisProject(project).add_qc_outputs()
     # Remove the QC reports
     for project in ap.get_analysis_projects():
         qc_reports = []
         qc_reports.append(
             "qc_report.%s.%s.zip" %
             (project.name, os.path.basename(ap.analysis_dir)))
         qc_reports.append("qc_report.html")
         qc_reports.append("multiqc_report.html")
         for f in qc_reports:
             os.remove(os.path.join(project.dirn, f))
     # Make a mock multiqc
     MockMultiQC.create(os.path.join(self.bin, "multiqc"))
     os.environ['PATH'] = "%s:%s" % (self.bin, os.environ['PATH'])
     # Make a mock publication area
     publication_dir = os.path.join(self.dirn, 'QC')
     os.mkdir(publication_dir)
     # Publish
     publish_qc(ap, location=publication_dir)
     # Check outputs
     outputs = ["index.html", "processing_qc.html"]
     for project in ap.get_analysis_projects():
         # Standard QC outputs
         project_qc = "qc_report.%s.%s" % (
             project.name, os.path.basename(ap.analysis_dir))
         outputs.append(project_qc)
         outputs.append("%s.zip" % project_qc)
         outputs.append(os.path.join(project_qc, "qc_report.html"))
         outputs.append(os.path.join(project_qc, "qc"))
     for item in outputs:
         f = os.path.join(publication_dir,
                          "160621_K00879_0087_000000000-AGEW9_analysis",
                          item)
         self.assertTrue(os.path.exists(f), "Missing %s" % f)
 def test_import_project_with_qc(self):
     """import_project: check project with QC outputs is imported
     """
     # Make mock multiqc
     MockMultiQC.create(os.path.join(self.bin, "multiqc"))
     os.environ['PATH'] = "%s:%s" % (self.bin, os.environ['PATH'])
     # Make an auto-process directory
     mockdir = MockAnalysisDirFactory.bcl2fastq2(
         '160621_M00879_0087_000000000-AGEW9', 'miseq', top_dir=self.dirn)
     mockdir.create()
     # Add QC outputs to the project to be imported
     UpdateAnalysisProject(AnalysisProject(
         'NewProj',
         self.new_project_dir)).add_qc_outputs(include_multiqc=False)
     print(os.listdir(os.path.join(self.dirn, 'NewProj')))
     # Check that the project is not currently present
     ap = AutoProcess(mockdir.dirn)
     self.assertFalse(
         'NewProj' in [p.name for p in ap.get_analysis_projects()])
     self.assertFalse(
         'NewProj' in
         [p.name for p in ap.get_analysis_projects_from_dirs()])
     self.assertFalse(
         os.path.exists(os.path.join(ap.analysis_dir, 'NewProj')))
     # Import the project
     import_project(ap, self.new_project_dir)
     self.assertTrue(
         'NewProj' in [p.name for p in ap.get_analysis_projects()])
     self.assertTrue('NewProj' in
                     [p.name for p in ap.get_analysis_projects_from_dirs()])
     self.assertTrue(
         os.path.exists(os.path.join(ap.analysis_dir, 'NewProj')))
     # Verify via fresh AutoProcess object
     ap2 = AutoProcess(mockdir.dirn)
     self.assertTrue(
         'NewProj' in [p.name for p in ap2.get_analysis_projects()])
     self.assertTrue(
         'NewProj' in
         [p.name for p in ap2.get_analysis_projects_from_dirs()])
     self.assertTrue(
         os.path.exists(os.path.join(ap2.analysis_dir, 'NewProj')))
     # Check for QC report and ZIP file
     print(os.listdir(os.path.join(ap2.analysis_dir, 'NewProj')))
     for f in (
             "qc_report.html",
             "multiqc_report.html",
             "qc_report.NewProj.160621_M00879_0087_000000000-AGEW9.zip",
     ):
         f = os.path.join(ap2.analysis_dir, 'NewProj', f)
         self.assertTrue(os.path.exists(f), "Missing %s" % f)
Beispiel #8
0
 def test_publish_qc_missing_destination(self):
     """publish_qc: raise exception if destination doesn't exist
     """
     # Make an auto-process directory
     mockdir = MockAnalysisDirFactory.bcl2fastq2(
         '160621_K00879_0087_000000000-AGEW9',
         'hiseq',
         metadata={
             "run_number": 87,
             "source": "local",
             "instrument_datestamp": "160621"
         },
         top_dir=self.dirn)
     mockdir.create()
     ap = AutoProcess(mockdir.dirn, settings=self.settings)
     # Add processing report and QC outputs
     UpdateAnalysisDir(ap).add_processing_report()
     for project in ap.get_analysis_projects():
         UpdateAnalysisProject(project).add_qc_outputs()
     # Reference publication area which doesn't exist
     publication_dir = os.path.join(self.dirn, 'QC')
     self.assertFalse(os.path.exists(publication_dir))
     # Publish
     self.assertRaises(Exception, publish_qc, ap, location=publication_dir)
     self.assertFalse(os.path.exists(publication_dir))
Beispiel #9
0
 def test_publish_qc_with_project_missing_qc(self):
     """publish_qc: raises exception if project has missing QC
     """
     # Make an auto-process directory
     mockdir = MockAnalysisDirFactory.bcl2fastq2(
         '160621_K00879_0087_000000000-AGEW9',
         'hiseq',
         metadata={
             "run_number": 87,
             "source": "local",
             "instrument_datestamp": "160621"
         },
         top_dir=self.dirn)
     mockdir.create()
     ap = AutoProcess(mockdir.dirn, settings=self.settings)
     # Add processing report
     UpdateAnalysisDir(ap).add_processing_report()
     # Add QC outputs for subset of projects
     projects = ap.get_analysis_projects()[1:]
     for project in projects:
         UpdateAnalysisProject(project).add_qc_outputs()
     # Make a mock publication area
     publication_dir = os.path.join(self.dirn, 'QC')
     os.mkdir(publication_dir)
     # Publish
     self.assertRaises(Exception, publish_qc, ap, location=publication_dir)
 def test_publish_qc_use_hierarchy(self):
     """publish_qc: publish using YEAR/PLATFORM hierarchy
     """
     # Make an auto-process directory
     mockdir = MockAnalysisDirFactory.bcl2fastq2(
         '160621_K00879_0087_000000000-AGEW9',
         'hiseq',
         metadata={ "run_number": 87,
                    "source": "local",
                    "instrument_datestamp": "160621" },
         top_dir=self.dirn)
     mockdir.create()
     ap = AutoProcess(mockdir.dirn)
     # Add processing report and QC outputs
     UpdateAnalysisDir(ap).add_processing_report()
     for project in ap.get_analysis_projects():
         UpdateAnalysisProject(project).add_qc_outputs()
     # Make a mock publication area
     publication_dir = os.path.join(self.dirn,'QC')
     os.mkdir(publication_dir)
     # Publish
     publish_qc(ap,location=publication_dir,
                use_hierarchy=True)
     # Check outputs
     final_dir = os.path.join(publication_dir,
                              "2016",
                              "hiseq")
     self.assertTrue(os.path.exists(final_dir))
     outputs = ["index.html",
                "processing_qc.html"]
     for project in ap.get_analysis_projects():
         # Standard QC outputs
         project_qc = "qc_report.%s.%s" % (project.name,
                                           os.path.basename(
                                               ap.analysis_dir))
         outputs.append(project_qc)
         outputs.append("%s.zip" % project_qc)
         outputs.append(os.path.join(project_qc,"qc_report.html"))
         outputs.append(os.path.join(project_qc,"qc"))
         # MultiQC output
         outputs.append("multiqc_report.%s.html" % project.name)
     for item in outputs:
         f = os.path.join(final_dir,
                          "160621_K00879_0087_000000000-AGEW9_analysis",
                          item)
         self.assertTrue(os.path.exists(f),"Missing %s" % f)
 def test_import_project_with_comment(self):
     """import_project: check comment is appended
     """
     # Make an auto-process directory
     mockdir = MockAnalysisDirFactory.bcl2fastq2(
         '160621_M00879_0087_000000000-AGEW9', 'miseq', top_dir=self.dirn)
     mockdir.create()
     # Check that the project is not currently present
     ap = AutoProcess(mockdir.dirn)
     self.assertFalse(
         'NewProj' in [p.name for p in ap.get_analysis_projects()])
     self.assertFalse(
         'NewProj' in
         [p.name for p in ap.get_analysis_projects_from_dirs()])
     self.assertFalse(
         os.path.exists(os.path.join(ap.analysis_dir, 'NewProj')))
     # Import the project and append a comment
     import_project(ap,
                    self.new_project_dir,
                    comment="imported from elsewhere")
     self.assertTrue(
         'NewProj' in [p.name for p in ap.get_analysis_projects()])
     self.assertTrue('NewProj' in
                     [p.name for p in ap.get_analysis_projects_from_dirs()])
     self.assertTrue(
         os.path.exists(os.path.join(ap.analysis_dir, 'NewProj')))
     # Verify via fresh AutoProcess object
     ap2 = AutoProcess(mockdir.dirn)
     self.assertTrue(
         'NewProj' in [p.name for p in ap2.get_analysis_projects()])
     self.assertTrue(
         'NewProj' in
         [p.name for p in ap2.get_analysis_projects_from_dirs()])
     self.assertTrue(
         os.path.exists(os.path.join(ap2.analysis_dir, 'NewProj')))
     # Check the comment has been updated
     with open(os.path.join(mockdir.dirn,'NewProj','README.info'),'rt') \
          as fp:
         self.assertTrue(
             "Comments\t1% PhiX spike in; imported from elsewhere" in
             fp.read())
Beispiel #12
0
 def test_publish_qc_exclude_zip_files(self):
     """publish_qc: exclude ZIP files from publication
     """
     # Make an auto-process directory
     mockdir = MockAnalysisDirFactory.bcl2fastq2(
         '160621_K00879_0087_000000000-AGEW9',
         'hiseq',
         metadata={
             "run_number": 87,
             "source": "local",
             "instrument_datestamp": "160621"
         },
         top_dir=self.dirn)
     mockdir.create()
     ap = AutoProcess(mockdir.dirn, settings=self.settings)
     # Add processing report and QC outputs
     UpdateAnalysisDir(ap).add_processing_report()
     projects = ap.get_analysis_projects()
     for project in projects:
         UpdateAnalysisProject(project).add_qc_outputs()
     # Add ICell8 report for one project
     icell8_project = projects[0]
     UpdateAnalysisProject(icell8_project).add_icell8_outputs()
     # Add cellranger count output for one project
     tenxgenomics_project = projects[-1]
     UpdateAnalysisProject(
         tenxgenomics_project).add_cellranger_count_outputs()
     # Make a mock publication area
     publication_dir = os.path.join(self.dirn, 'QC')
     os.mkdir(publication_dir)
     # Publish
     publish_qc(ap, location=publication_dir, exclude_zip_files=True)
     # Check outputs
     outputs = ["index.html", "processing_qc.html"]
     zip_files = []
     for project in ap.get_analysis_projects():
         # Standard QC outputs
         project_qc = "qc_report.%s.%s" % (
             project.name, os.path.basename(ap.analysis_dir))
         outputs.append(project_qc)
         outputs.append(os.path.join(project_qc, "qc_report.html"))
         outputs.append(os.path.join(project_qc, "qc"))
         zip_files.append("%s.zip" % project_qc)
     # ICell8 outputs
     icell8_dir = "icell8_processing.%s.%s" % (
         icell8_project.name, os.path.basename(ap.analysis_dir))
     outputs.append(icell8_dir)
     outputs.append(os.path.join(icell8_dir, "icell8_processing_data"))
     outputs.append(os.path.join(icell8_dir, "icell8_processing.html"))
     outputs.append(os.path.join(icell8_dir, "stats"))
     zip_files.append("%s.zip" % icell8_dir)
     # Cellranger count outputs
     cellranger_count_dir = "cellranger_count_report.%s.%s" % (
         tenxgenomics_project.name, os.path.basename(ap.analysis_dir))
     outputs.append(cellranger_count_dir)
     outputs.append(
         os.path.join(cellranger_count_dir, "cellranger_count_report.html"))
     outputs.append(os.path.join(cellranger_count_dir, "cellranger_count"))
     for sample in tenxgenomics_project.samples:
         outputs.append(
             os.path.join(cellranger_count_dir, "cellranger_count",
                          sample.name, "outs", "web_summary.html"))
     zip_files.append("%s.zip" % cellranger_count_dir)
     # Do checks
     for item in outputs:
         f = os.path.join(publication_dir,
                          "160621_K00879_0087_000000000-AGEW9_analysis",
                          item)
         self.assertTrue(os.path.exists(f), "Missing %s" % f)
     for item in outputs:
         f = os.path.join(publication_dir,
                          "160621_K00879_0087_000000000-AGEW9_analysis",
                          item)
         self.assertTrue(os.path.exists(f), "Missing %s" % f)
     # Check the ZIP files were excluded
     for zip_file in zip_files:
         self.assertFalse(
             os.path.exists(
                 os.path.join(
                     publication_dir,
                     "160621_K00879_0087_000000000-AGEW9_analysis",
                     zip_file)),
             "ZIP file '%s' exists, but shouldn't" % zip_file)
Beispiel #13
0
 def test_publish_qc_with_cellranger_counts(self):
     """publish_qc: project with cellranger count output
     """
     # Make an auto-process directory
     mockdir = MockAnalysisDirFactory.bcl2fastq2(
         '160621_K00879_0087_000000000-AGEW9',
         'hiseq',
         metadata={
             "run_number": 87,
             "source": "local",
             "instrument_datestamp": "160621"
         },
         top_dir=self.dirn)
     mockdir.create()
     ap = AutoProcess(mockdir.dirn, settings=self.settings)
     # Add processing and cellranger QC reports
     UpdateAnalysisDir(ap).add_processing_report()
     UpdateAnalysisDir(ap).add_cellranger_qc_output()
     # Add QC outputs
     projects = ap.get_analysis_projects()
     for project in projects:
         UpdateAnalysisProject(project).add_qc_outputs(
             protocol="singlecell")
     # Add cellranger count output for one project
     tenxgenomics_project = projects[0]
     UpdateAnalysisProject(
         tenxgenomics_project).add_cellranger_count_outputs()
     # Make a mock publication area
     publication_dir = os.path.join(self.dirn, 'QC')
     os.mkdir(publication_dir)
     # Publish
     publish_qc(ap, location=publication_dir)
     # Check outputs
     outputs = [
         "index.html", "processing_qc.html", "cellranger_qc_summary.html"
     ]
     for project in ap.get_analysis_projects():
         # Standard QC outputs
         project_qc = "qc_report.%s.%s" % (
             project.name, os.path.basename(ap.analysis_dir))
         outputs.append(project_qc)
         outputs.append("%s.zip" % project_qc)
         outputs.append(os.path.join(project_qc, "qc_report.html"))
         outputs.append(os.path.join(project_qc, "qc"))
     # Cellranger count outputs
     cellranger_count_dir = "cellranger_count_report.%s.%s" % (
         tenxgenomics_project.name, os.path.basename(ap.analysis_dir))
     outputs.append(cellranger_count_dir)
     outputs.append("%s.zip" % cellranger_count_dir)
     outputs.append(
         os.path.join(cellranger_count_dir, "cellranger_count_report.html"))
     outputs.append(os.path.join(cellranger_count_dir, "cellranger_count"))
     for sample in tenxgenomics_project.samples:
         outputs.append(
             os.path.join(cellranger_count_dir, "cellranger_count",
                          sample.name, "outs", "web_summary.html"))
     # Do checks
     for item in outputs:
         f = os.path.join(publication_dir,
                          "160621_K00879_0087_000000000-AGEW9_analysis",
                          item)
         self.assertTrue(os.path.exists(f), "Missing %s" % f)
     # Do checks
     for item in outputs:
         f = os.path.join(publication_dir,
                          "160621_K00879_0087_000000000-AGEW9_analysis",
                          item)
         self.assertTrue(os.path.exists(f), "Missing %s" % f)
 def test_archive_to_final_multiple_fastq_sets_read_only_fastqs(self):
     """archive: test copying multiple fastq sets to final archive dir (read-only Fastqs)
     """
     # Make a mock auto-process directory
     mockdir = MockAnalysisDirFactory.bcl2fastq2(
         '170901_M00879_0087_000000000-AGEW9',
         'miseq',
         metadata={ "instrument_datestamp": "170901" },
         top_dir=self.dirn)
     mockdir.create()
     # Make a mock archive directory
     archive_dir = os.path.join(self.dirn,"archive")
     final_dir = os.path.join(archive_dir,
                              "2017",
                              "miseq")
     os.makedirs(final_dir)
     self.assertTrue(os.path.isdir(final_dir))
     self.assertEqual(len(os.listdir(final_dir)),0)
     # Make autoprocess instance and set required metadata
     ap = AutoProcess(analysis_dir=mockdir.dirn,
                      settings=self.settings)
     ap.set_metadata("source","testing")
     ap.set_metadata("run_number","87")
     # Add additional fastq set for first project
     multi_fastqs_project = ap.get_analysis_projects()[0]
     UpdateAnalysisProject(multi_fastqs_project).add_fastq_set(
         "fastqs.extra",
         ("Alt1.r1.fastq.gz","Alt2.r1.fastq.gz"))
     # Do archiving op
     status = archive(ap,
                      archive_dir=archive_dir,
                      year='2017',platform='miseq',
                      read_only_fastqs=True,
                      final=True)
     self.assertEqual(status,0)
     # Check that final dir exists
     final_archive_dir = os.path.join(
         final_dir,
         "170901_M00879_0087_000000000-AGEW9_analysis")
     self.assertTrue(os.path.exists(final_archive_dir))
     self.assertEqual(len(os.listdir(final_dir)),1)
     # Check contents
     dirs = ("AB","CDE","logs","undetermined")
     for d in dirs:
         d = os.path.join(final_archive_dir,d)
         self.assertTrue(os.path.exists(d))
     files = ("auto_process.info",
              "custom_SampleSheet.csv",
              "metadata.info",
              "projects.info",
              "SampleSheet.orig.csv")
     for f in files:
         f = os.path.join(final_archive_dir,f)
         self.assertTrue(os.path.exists(f))
     # Check that Fastqs are not writable
     for project in ("AB","CDE","undetermined"):
         fq_dir = os.path.join(final_archive_dir,
                               project,
                               "fastqs")
         self.assertTrue(os.path.exists(fq_dir))
         fqs = os.listdir(fq_dir)
         self.assertTrue(len(fqs) > 0)
         for fq in fqs:
             fq = os.path.join(fq_dir,fq)
             self.assertTrue(os.access(fq,os.R_OK))
             self.assertFalse(os.access(fq,os.W_OK))
     # Check additional Fastqs are not writable
     fq_dir = os.path.join(final_archive_dir,
                           multi_fastqs_project.name,
                           "fastqs.extra")
     self.assertTrue(os.path.exists(fq_dir))
     fqs = os.listdir(fq_dir)
     self.assertTrue(len(fqs) > 0)
     for fq in fqs:
         fq = os.path.join(fq_dir,fq)
         self.assertTrue(os.access(fq,os.R_OK))
         self.assertFalse(os.access(fq,os.W_OK))