Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
easyblock = 'PythonPackage'

name = 'expecttest'
version = '0.3.0'

homepage = 'https://github.com/ezyang/expecttest'
description = """This library implements expect tests (also known as "golden" tests). Expect tests are a method of
writing tests where instead of hard-coding the expected output of a test, you run the test to get the output, and
the test framework automatically populates the expected output. If the output of the test changes, you can rerun
the test with the environment variable EXPECTTEST_ACCEPT=1 to automatically update the expected output."""

toolchain = {'name': 'GCCcore', 'version': '14.2.0'}

sources = [SOURCE_TAR_GZ]
checksums = ['6e8512fb86523ada1f94fd1b14e280f924e379064bb8a29ee399950e513eeccd']

builddependencies = [
('binutils', '2.42'),
('poetry', '2.1.2'),
]
dependencies = [
('Python', '3.13.1'),
]

moduleclass = 'tools'
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
--- a/build_pipeline/FormatAlignments.py
+++ b/build_pipeline/FormatAlignments.py
@@ -181,1 +181,1 @@
- pr = Popen( [ "muscle", "-in", ffile, "-gapopen", "-10", "-out", al_filename, ], stdout=PIPE, stderr=PIPE )
+ pr = Popen( [ "muscle", "-align", ffile, "-output", al_filename ], stdout=PIPE, stderr=PIPE )
@@ -191,1 +191,11 @@
- start = ref_aligned.index( reference[0] )
+ # MUSCLE v5 may insert gap characters within a motif; search in degapped
+ # sequence and map the result back to the gapped alignment column index.
+ ref_degapped = ref_aligned.replace('-', '').replace('.', '')
+ motif_pos = ref_degapped.index(reference[0])
+ count, start = 0, 0
+ for i, c in enumerate(ref_aligned):
+ if count == motif_pos:
+ start = i
+ break
+ if c not in '-.':
+ count += 1
--- a/setup.py
+++ b/setup.py
@@ -10,3 +10,3 @@
# Post-installation routine
- ANARCI_LOC = os.path.join(site.getsitepackages()[0], 'anarci') # site-packages/ folder
+ ANARCI_LOC = os.path.join(self.install_lib, 'anarci') # install target, not system site-packages
ANARCI_BIN = sys.executable.split('python')[0] # bin/ folder
@@ -28,4 +28,21 @@
# Copy HMMs where ANARCI can find them
- shutil.copy( "curated_alignments/germlines.py", ANARCI_LOC )
- os.mkdir(os.path.join(ANARCI_LOC, "dat"))
- shutil.copytree( "HMMs", os.path.join(ANARCI_LOC, "dat/HMMs/") )
+ source_pkg_dir = os.path.join("..", "lib", "python", "anarci")
+ for package_dir in [source_pkg_dir, ANARCI_LOC]:
+ if os.path.isfile(package_dir):
+ os.remove(package_dir)
+ if not os.path.isdir(package_dir):
+ os.makedirs(package_dir)
+ shutil.copy("curated_alignments/germlines.py", os.path.join(package_dir, "germlines.py"))
+
+ dat_dir = os.path.join(package_dir, "dat")
+ hmms_dir = os.path.join(dat_dir, "HMMs")
+
+ if os.path.exists(dat_dir) and not os.path.isdir(dat_dir):
+ os.remove(dat_dir)
+ os.makedirs(dat_dir, exist_ok=True)
+
+ if os.path.isdir(hmms_dir):
+ shutil.rmtree(hmms_dir)
+ elif os.path.exists(hmms_dir):
+ os.remove(hmms_dir)
+ shutil.copytree("HMMs", hmms_dir)
@@ -39,2 +57,4 @@
except OSError:
pass
+ finally:
+ os.chdir("..")
@@ -50,1 +50,2 @@
- include_package_data = True,
+ include_package_data = True,
+ package_data={'anarci': ['germlines.py', 'dat/HMMs/**', 'dat/HMMs/**/**']},

Original file line number Diff line number Diff line change
@@ -0,0 +1,97 @@
easyblock = 'PythonBundle'

name = 'ImmuneBuilder'
version = '1.2'

homepage = 'https://github.com/brennanaba/ImmuneBuilder'
description = """Deep-learning models for predicting immune receptor protein structures
(ABodyBuilder2, NanoBodyBuilder2, TCRBuilder2)."""

toolchain = {'name': 'foss', 'version': '2025a'}
versionsuffix = '-CUDA-12.8.0'

# Public EasyBuild 2025a work is on PyTorch 2.9.1; there is no upstream/public
# easyconfig or PR for PyTorch 2.6.0 on foss/2025a.
# If your site only provides a module for PyTorch/OpenMM, switch those entries
# to EXTERNAL_MODULE dependencies using the exact module names from `module avail`.

dependencies = [
('CUDA', '12.8.0', '', SYSTEM),
('Python', '3.13.1'),
('Python-bundle-PyPI', '2025.04'),
('SciPy-bundle', '2025.06'),
('Biopython', '1.85'), # Required by anarci for Bio.SearchIO.HmmerIO
('einops', '0.8.1'),
('gemmi', '0.7.4'),
('PyTorch', '2.9.1', '-CUDA-12.8.0'),
('OpenMM', '8.4.0'),
]

builddependencies = [
# ANARCI setup.py runs build_pipeline/RUN_pipeline.sh and requires these tools in PATH.
('HMMER', '3.4'),
('MUSCLE', '5.3'),
]

exts_list = [
# cgi was removed in Python 3.13; pdbfixer requires the compatibility package.
('legacy-cgi', '2.6.4', {
'modulename': 'cgi',
'source_tmpl': 'legacy_cgi-%(version)s-py3-none-any.whl',
'checksums': ['7e235ce58bf1e25d1fc9b2d299015e4e2cd37305eccafec1e6bac3fc04b878cd'],
}),
('PDBFixer', '1.12', {
'source_urls': ['https://github.com/openmm/pdbfixer/archive/refs/tags/'],
'sources': [{'download_filename': 'v%(version)s.tar.gz', 'filename': SOURCE_TAR_GZ}],
'modulename': 'pdbfixer',
'checksums': ['a5c0b05dfaf2cdcad3b8ffc9ee1e6a955628aade0dda653da04d4a12ba4fe3ec'],
}),
# ANARCI uses a custom install command (CustomInstallCommand) that:
# - runs build_pipeline/RUN_pipeline.sh (downloads IMGT germlines, builds HMMs with HMMER/MUSCLE)
# - copies generated HMMs into the package directory
# The patch (ANARCI-79f6c57-muscle5-compat.patch) fixes:
# (1) MUSCLE v5 CLI flags (setup.py originally used v3 args)
# (2) ANARCI_LOC uses self.install_lib instead of site.getsitepackages()[0]
# (3) adds finally: os.chdir("..") after the pipeline to restore CWD
# (4) adds package_data so pip includes germlines.py and HMMs in the wheel
# preinstallopts pre-runs the pipeline and stages files in the source tree
# so that pip's bdist_wheel picks them up before CustomInstallCommand runs.
('anarci', '79f6c57', {
'source_urls': ['https://github.com/oxpig/ANARCI/archive/'],
'sources': ['79f6c575056dedef86cb8f405ebb039197923eec.zip'],
'patches': ['ANARCI-79f6c57-muscle5-compat.patch'],
'preinstallopts': (
'cd build_pipeline && bash RUN_pipeline.sh && '
'cp curated_alignments/germlines.py ../lib/python/anarci/ && '
'mkdir -p ../lib/python/anarci/dat && cp -r HMMs ../lib/python/anarci/dat/ && '
'cd .. && '
),
'modulename': 'anarci',
'checksums': ['805f227cd165dd1930871ef98de48c30eaa24b4597be501a26d69e4d09a2d54e'],
}),
(name, version, {
'source_urls': ['https://github.com/brennanaba/ImmuneBuilder/archive/refs/tags/'],
'sources': ['%(version)s.tar.gz'],
'checksums': ['1f5d4952d8a558366ff27e0c05c19e858b2a19a0f802708345c8ecbdc7e252c6'],
'modulename': 'ImmuneBuilder',
}),
]

sanity_check_paths = {
'files': [
'bin/ABodyBuilder2',
'bin/NanoBodyBuilder2',
'bin/TCRBuilder2',
],
'dirs': ['lib/python%(pyshortver)s/site-packages/ImmuneBuilder'],
}

# Sanity checks: verify binaries and import, which confirms anarci is available
sanity_check_commands = [
'ABodyBuilder2 --help',
'NanoBodyBuilder2 --help',
'TCRBuilder2 --help',
]

moduleclass = 'bio'

111 changes: 111 additions & 0 deletions easybuild/easyconfigs/i/ImmuneBuilder/ImmuneBuilder-1.2-foss-2025a.eb
Original file line number Diff line number Diff line change
@@ -0,0 +1,111 @@
easyblock = 'PythonBundle'

name = 'ImmuneBuilder'
version = '1.2'

homepage = 'https://github.com/brennanaba/ImmuneBuilder'
description = """Deep-learning models for predicting immune receptor protein structures
(ABodyBuilder2, NanoBodyBuilder2, TCRBuilder2)."""

toolchain = {'name': 'foss', 'version': '2025a'}

# Public EasyBuild 2025a work is on PyTorch 2.9.1; there is no upstream/public
# easyconfig or PR for PyTorch 2.6.0 on foss/2025a.
# If your site only provides a module for PyTorch/OpenMM, switch those entries
# to EXTERNAL_MODULE dependencies using the exact module names from `module avail`.

dependencies = [
('Python', '3.13.1'),
('Python-bundle-PyPI', '2025.04'),
('SciPy-bundle', '2025.06'),
('Biopython', '1.85'), # Required by anarci for Bio.SearchIO.HmmerIO
('einops', '0.8.1'),
('gemmi', '0.7.4'),
('PyTorch', '2.9.1', '-CUDA-12.8.0'),
('OpenMM', '8.4.0'),
]

builddependencies = [
# uv-build 0.7.22 requires rustc >= 1.86.
('Rust', '1.91.1'),
('maturin', '1.8.3'),
# ANARCI setup.py runs build_pipeline/RUN_pipeline.sh and requires these tools in PATH.
('HMMER', '3.4'),
# Exception: no MUSCLE easyconfig exists for foss-2025a; use local GCCcore-14.2.0 recipe.
('MUSCLE', '5.1.0', '', ('GCCcore', '14.2.0')),
]

use_pip = True

exts_list = [
('uv-build', '0.7.22', {
'source_urls': [PYPI_SOURCE],
'sources': ['uv_build-0.7.22.tar.gz'],
'modulename': 'uv_build',
'checksums': ['e7575036f987080a25a473971c0e6795c79e0b7bd04b95e5a35d5d51e19f3a6c'],
}),
# cgi was removed in Python 3.13; pdbfixer requires the compatibility package.
('legacy-cgi', '2.6.4', {
'modulename': 'cgi',
'source_tmpl': 'legacy_cgi-%(version)s-py3-none-any.whl',
'checksums': ['7e235ce58bf1e25d1fc9b2d299015e4e2cd37305eccafec1e6bac3fc04b878cd'],
}),
('PDBFixer', '1.12', {
'source_urls': ['https://github.com/openmm/pdbfixer/archive/refs/tags/'],
'sources': [{'download_filename': 'v%(version)s.tar.gz', 'filename': SOURCE_TAR_GZ}],
'modulename': 'pdbfixer',
'checksums': ['a5c0b05dfaf2cdcad3b8ffc9ee1e6a955628aade0dda653da04d4a12ba4fe3ec'],
}),
# ANARCI uses a custom install command (CustomInstallCommand) that:
# - runs build_pipeline/RUN_pipeline.sh (downloads IMGT germlines, builds HMMs with HMMER/MUSCLE)
# - copies generated HMMs into the package directory
# The patch (ANARCI-79f6c57-muscle5-compat.patch) fixes:
# (1) MUSCLE v5 CLI flags (setup.py originally used v3 args)
# (2) ANARCI_LOC uses self.install_lib instead of site.getsitepackages()[0]
# (3) adds finally: os.chdir("..") after the pipeline to restore CWD
# (4) adds package_data so pip includes germlines.py and HMMs in the wheel
# preinstallopts pre-runs the pipeline and stages files in the source tree
# so that pip's bdist_wheel picks them up before CustomInstallCommand runs.
('anarci', '79f6c57', {
'source_urls': ['https://github.com/oxpig/ANARCI/archive/'],
'sources': ['79f6c575056dedef86cb8f405ebb039197923eec.zip'],
'patches': ['ANARCI-79f6c57-muscle5-compat.patch'],
'preinstallopts': (
'cd build_pipeline && bash RUN_pipeline.sh && '
'cp curated_alignments/germlines.py ../lib/python/anarci/ && '
'mkdir -p ../lib/python/anarci/dat && cp -r HMMs ../lib/python/anarci/dat/ && '
'cd .. && '
),
'modulename': 'anarci',
'checksums': ['805f227cd165dd1930871ef98de48c30eaa24b4597be501a26d69e4d09a2d54e'],
}),
(name, version, {
'source_urls': ['https://github.com/brennanaba/ImmuneBuilder/archive/refs/tags/'],
'sources': ['%(version)s.tar.gz'],
'checksums': ['1f5d4952d8a558366ff27e0c05c19e858b2a19a0f802708345c8ecbdc7e252c6'],
'modulename': 'ImmuneBuilder',
}),
]

sanity_check_paths = {
'files': [
'bin/ABodyBuilder2',
'bin/NanoBodyBuilder2',
'bin/TCRBuilder2',
],
'dirs': ['lib/python%(pyshortver)s/site-packages/ImmuneBuilder'],
}

# Sanity checks: verify binaries and import, which confirms anarci is available
sanity_check_commands = [
'ABodyBuilder2 --help',
'NanoBodyBuilder2 --help',
'TCRBuilder2 --help',
]

moduleclass = 'bio'

# uv-build installs a Rust binary that bypasses EB's RPATH linker wrapper.
# It is only needed as a build backend, not at runtime. Remove to avoid RPATH sanity check failure.
postinstallcmds = ['rm -f %(installdir)s/bin/uv-build']

44 changes: 44 additions & 0 deletions easybuild/easyconfigs/m/MUSCLE/MUSCLE-5.1.0-GCCcore-14.2.0.eb
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
easyblock = 'MakeCp'

name = 'MUSCLE'
version = '5.1.0'

homepage = 'https://drive5.com/muscle/'
description = """MUSCLE is one of the best-performing multiple alignment programs
according to published benchmark tests, with accuracy and speed that are consistently
better than CLUSTALW. MUSCLE can align hundreds of sequences in seconds. Most users
learn everything they need to know about MUSCLE in a few minutes-only a handful of
command-line options are needed to perform common alignment tasks."""

toolchain = {'name': 'GCCcore', 'version': '14.2.0'}

github_account = 'rcedgar'
source_urls = [GITHUB_LOWER_SOURCE]
sources = ['%(version)s.tar.gz']
patches = ['MUSCLE-5.1.0-add_Aarch64_support.patch']
checksums = [
{'5.1.0.tar.gz': '2bba8b06e3ccabf6465fa26f459763b2029d7e7b9596881063e3aaba60d9e87d'},
{'MUSCLE-5.1.0-add_Aarch64_support.patch': 'aa4c95d8c9dc7205d1d7257f38fce841d49379f87aa88d17df2a1e6ae7ebc9ef'},
]

builddependencies = [
('binutils', '2.42'),
]

start_dir = 'src'

# Use build environment defined by EasyBuild
prebuildopts = "sed -i 's/$(CPPOPTS)/$(CPPOPTS) $(CXXFLAGS) $(CPPFLAGS)/g' Makefile &&"
buildopts = "CPP=${CXX} CC=${CC}"

files_to_copy = [(['Linux/muscle'], 'bin')]

sanity_check_paths = {
'files': ['bin/muscle'],
'dirs': [],
}

sanity_check_commands = ["muscle -h"]

moduleclass = 'bio'

52 changes: 52 additions & 0 deletions easybuild/easyconfigs/m/MUSCLE/MUSCLE-5.3-GCCcore-14.2.0.eb
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
easyblock = 'MakeCp'

name = 'MUSCLE'
version = '5.3'

homepage = 'https://drive5.com/muscle/'
description = """MUSCLE is one of the best-performing multiple alignment programs
according to published benchmark tests, with accuracy and speed that are consistently
better than CLUSTALW. MUSCLE can align hundreds of sequences in seconds. Most users
learn everything they need to know about MUSCLE in a few minutes-only a handful of
command-line options are needed to perform common alignment tasks."""

toolchain = {'name': 'GCCcore', 'version': '14.2.0'}

github_account = 'rcedgar'
source_urls = [GITHUB_LOWER_SOURCE]
# GitHub release tag is v5.3, while version is kept as 5.3 for module naming consistency.
sources = [
{'download_filename': 'v%(version)s.tar.gz', 'filename': '%(version)s.tar.gz'},
{
'filename': 'vcxproj_make.py',
'download_filename': 'vcxproj_make.py',
'source_urls': ['https://raw.githubusercontent.com/rcedgar/vcxproj_make/806d016'],
'extract_cmd': 'cp %s %(builddir)s/muscle-%(version)s/src/',
},
]
checksums = [
{'5.3.tar.gz': '74b22a94e630b16015c2bd9ae83aa2be2c2048d3e41f560b2d4a954725c81968'},
{'vcxproj_make.py': '902735703004c47705ffa389329378f237fecb154945b489edf6abe260c6694f'},
]

builddependencies = [
('binutils', '2.42'),
]

# MUSCLE 5.3 uses vcxproj_make.py to generate Makefile/build rules.
# Vendor the script as a source to avoid runtime network access.
start_dir = '.'
build_cmd = 'cd src && python3 vcxproj_make.py --openmp && sed -i "s/ -static//g" Makefile && make'


files_to_copy = [(['bin/muscle'], 'bin')]

sanity_check_paths = {
'files': ['bin/muscle'],
'dirs': [],
}

sanity_check_commands = ["muscle -h"]

moduleclass = 'bio'

Loading
Loading