Skip to content

Commit

Permalink
'archive': refuse to perform final archiving if projects have empty '…
Browse files Browse the repository at this point in the history
…Visium_images' dirs.
  • Loading branch information
pjbriggs committed Jan 18, 2024
1 parent 4e03270 commit 86fa56b
Show file tree
Hide file tree
Showing 2 changed files with 109 additions and 1 deletion.
14 changes: 13 additions & 1 deletion auto_process_ngs/commands/archive_cmd.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
#!/usr/bin/env python
#
# archive_cmd.py: implement auto process archive command
# Copyright (C) University of Manchester 2017-2023 Peter Briggs
# Copyright (C) University of Manchester 2017-2024 Peter Briggs
#
#########################################################################

Expand Down Expand Up @@ -203,6 +203,18 @@ def archive(ap,archive_dir=None,platform=None,year=None,
logging.warning("Error trying to fetch analysis projects: "
"%s" % ex)
projects = []
# Check projects for empty 'Visium_images' subdirs
# when doing final archiving
if final and not force:
for project in projects:
visium_images = os.path.join(project.dirn,"Visium_images")
if os.path.isdir(visium_images):
if not os.listdir(visium_images):
raise Exception("'%s': project contains "
"'Visium_images' directory which "
"is empty; either populate or "
"remove (or use --force)" %
project.name)
if not projects:
if not force:
raise Exception("No project directories found, nothing "
Expand Down
96 changes: 96 additions & 0 deletions auto_process_ngs/test/commands/test_archive_cmd.py
Original file line number Diff line number Diff line change
Expand Up @@ -1356,3 +1356,99 @@ def test_archive_excludes_unwanted_content(self):
self.assertFalse(os.path.exists(os.path.join(final_archive_dir,d)))
for f in exclude_files:
self.assertFalse(os.path.exists(os.path.join(final_archive_dir,f)))

def test_archive_to_final_checks_visium_images_dir(self):
"""archive: test checking 'Visium_images' dir
"""
# 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()
# Add empty 'Visium_images' subdirectory in 'AB' project
os.mkdir(os.path.join(mockdir.dirn,"AB","Visium_images"))
# 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")
# Do archiving op to staging
status = archive(ap,
archive_dir=archive_dir,
year='2017',platform='miseq',
final=False)
self.assertEqual(status,0)
# Attempt to finalise archive
# Should fail as 'Visium_images' is empty
self.assertRaises(Exception,
archive,
ap,
archive_dir=archive_dir,
year='2017',platform='miseq',
final=True)
# Add fake image file to 'Visium_images'
with open(os.path.join(mockdir.dirn,"AB","Visium_images",
"image1.tff"),'wt') as fp:
fp.write("image data")
# Attempt archive to final again
status = archive(ap,
archive_dir=archive_dir,
year='2017',platform='miseq',
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)

def test_archive_to_final_force_ignores_empty_visium_images_dir(self):
"""archive: force final archiving with empty 'Visium_images' dir
"""
# 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()
# Add empty 'Visium_images' subdirectory in 'AB' project
os.mkdir(os.path.join(mockdir.dirn,"AB","Visium_images"))
# 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")
# Do final archiving op with force
# Should ignore empty 'Visium_images'
status = archive(ap,
archive_dir=archive_dir,
year='2017',platform='miseq',
final=True,
force=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)

0 comments on commit 86fa56b

Please sign in to comment.