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,73 @@
# Thomas Hoffmann, EMBL Heidelberg, structures-it@embl.de, 2025/05
easyblock = 'PythonBundle'

name = 'Model-Angelo'
versionsuffix = '-CUDA-%(cudaver)s'
version = '1.0.14'

homepage = 'https://github.com/3dem/model-angelo'
description = "ModelAngelo is an automatic atomic model building program for cryo-EM maps."

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

builddependencies = [
('pkgconf', '1.9.5'),
('cppy', '1.2.1'),

]

dependencies = [
('CUDA', '12.1.1', '', SYSTEM),
('Python', '3.11.3'),
('SciPy-bundle', '2023.07'), # violates req. numpy==1.21.*
('tqdm', '4.66.1'),
('Biopython', '1.83'),
('einops', '0.7.0'),
('mrcfile', '1.5.0'),
('matplotlib', '3.7.2'),
('PyTorch', '2.1.2', versionsuffix),
('PyHMMER', '0.10.6'), # violates req. 0.7.1
('ESM-2', '2.0.0', versionsuffix), # violates req. 1.0.3
('Model-Angelo_data', '1.0.0', '', SYSTEM)
]

github_account = '3dem'

exts_list = [
('loguru', '0.7.2', {
'checksums': ['e671a53522515f34fd406340ee968cb9ecafbc4b36c679da03c18fd8d0bd51ac'],
}),
(name, version, {
'modulename': 'model_angelo',
'patches': [
'Model-Angelo-1.0.9_add_init_py.patch',
'Model-Angelo-1.0.9_multi_torch_home.patch',
'Model-Angelo-1.0.14_relax_requirements.patch',
],
'source_urls': ['https://github.com/%(github_account)s/%(name)s/archive'],
'sources': ['v%(version)s.tar.gz'],
'checksums': [
{'v1.0.14.tar.gz': 'ebeec3de2755c394f8d6d74ce96910c848b2513ea4279de29255b8aceacc94a8'},
{'Model-Angelo-1.0.9_add_init_py.patch':
'7d3144ddac92d5800d9a6993bf50a3850627bc836ad01917be531fdd690b72d3'},
{'Model-Angelo-1.0.9_multi_torch_home.patch':
'950d32ca50f14d04cb7f9cc0c384c1a55979cf88ae7ce5b855bef90a935ce13d'},
{'Model-Angelo-1.0.14_relax_requirements.patch':
'f85362268248b959d4ae65e89ec625d031e17f93f1607e1fbd35d52ec2fc3a5b'},
],
}),
]

sanity_check_commands = [
"model_angelo --help",
]

sanity_check_paths = {
'files': [
'lib/python%(pyshortver)s/site-packages/model_angelo/utils/stereo_chemical_props.txt'
],

'dirs': ['lib/python%(pyshortver)s/site-packages/model_angelo']
}

moduleclass = 'bio'
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
diff -ru model-angelo-1.0.14/setup.py model-angelo-1.0.14_requirements/setup.py
--- model-angelo-1.0.14/setup.py 2025-05-08 13:15:47.000000000 +0200
+++ model-angelo-1.0.14_requirements/setup.py 2025-05-23 11:16:34.285077409 +0200
@@ -33,9 +33,9 @@
"matplotlib",
"mrcfile",
"pandas",
- "fair-esm==1.0.3",
- "pyhmmer==0.7.1",
+ "fair-esm<=2.0.0",
+ "pyhmmer<=1.10.15",
"loguru",
- "numpy<2.0,
+ "numpy<=1.25.1",
],
)
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
# Thomas Hoffmann, EMBL Heidelberg, structures-it@embl.de, 2023/11
# add missing __init__.py files in apps, c_alpha, data, gnn, models, and utils
# in order to allow setup.py.find_packages() to find and install subdirectories
diff -ruN model-angelo-1.0.9/model_angelo/apps/__init__.py model-angelo-1.0.9_add_init_py/model_angelo/apps/__init__.py
--- model-angelo-1.0.9/model_angelo/apps/__init__.py 2023-10-27 16:42:58.000000000 +0200
+++ model-angelo-1.0.9_add_init_py/model_angelo/apps/__init__.py 2023-11-06 11:06:16.212950502 +0100
@@ -0,0 +1 @@
+#
diff -ruN model-angelo-1.0.9/model_angelo/c_alpha/__init__.py model-angelo-1.0.9_add_init_py/model_angelo/c_alpha/__init__.py
--- model-angelo-1.0.9/model_angelo/c_alpha/__init__.py 1970-01-01 01:00:00.000000000 +0100
+++ model-angelo-1.0.9_add_init_py/model_angelo/c_alpha/__init__.py 2023-11-06 11:06:16.212950502 +0100
@@ -0,0 +1 @@
+#
diff -ruN model-angelo-1.0.9/model_angelo/data/__init__.py model-angelo-1.0.9_add_init_py/model_angelo/data/__init__.py
--- model-angelo-1.0.9/model_angelo/data/__init__.py 1970-01-01 01:00:00.000000000 +0100
+++ model-angelo-1.0.9_add_init_py/model_angelo/data/__init__.py 2023-11-06 11:06:16.212950502 +0100
@@ -0,0 +1 @@
+#
diff -ruN model-angelo-1.0.9/model_angelo/gnn/__init__.py model-angelo-1.0.9_add_init_py/model_angelo/gnn/__init__.py
--- model-angelo-1.0.9/model_angelo/gnn/__init__.py 1970-01-01 01:00:00.000000000 +0100
+++ model-angelo-1.0.9_add_init_py/model_angelo/gnn/__init__.py 2023-11-06 11:06:16.212950502 +0100
@@ -0,0 +1 @@
+#
diff -ruN model-angelo-1.0.9/model_angelo/models/__init__.py model-angelo-1.0.9_add_init_py/model_angelo/models/__init__.py
--- model-angelo-1.0.9/model_angelo/models/__init__.py 1970-01-01 01:00:00.000000000 +0100
+++ model-angelo-1.0.9_add_init_py/model_angelo/models/__init__.py 2023-11-06 11:06:16.212950502 +0100
@@ -0,0 +1 @@
+#
diff -ruN model-angelo-1.0.9/model_angelo/utils/__init__.py model-angelo-1.0.9_add_init_py/model_angelo/utils/__init__.py
--- model-angelo-1.0.9/model_angelo/utils/__init__.py 1970-01-01 01:00:00.000000000 +0100
+++ model-angelo-1.0.9_add_init_py/model_angelo/utils/__init__.py 2023-11-06 11:10:29.338107389 +0100
@@ -0,0 +1 @@
+#
Original file line number Diff line number Diff line change
@@ -0,0 +1,68 @@
# Thomas Hoffmann, EMBL Heidelberg, structures-it@embl.de, 2023/11
# allow to use TORCH_HOME with modextravars.
# Automatic download of models and language is disabled for multi TORCH_HOME.
diff -ru model-angelo-1.0.9/model_angelo/utils/misc_utils.py model-angelo-1.0.9_multi_torch_home/model_angelo/utils/misc_utils.py
--- model-angelo-1.0.9/model_angelo/utils/misc_utils.py 2023-10-27 16:42:58.000000000 +0200
+++ model-angelo-1.0.9_multi_torch_home/model_angelo/utils/misc_utils.py 2023-11-17 18:58:36.581076278 +0100
@@ -116,10 +116,17 @@
warnings.filterwarnings("ignore", ".*with given element none.*")
warnings.filterwarnings("ignore", ".*invalid value encountered in true\_divide.*")

-
def get_esm_model(esm_model_name):
import esm
import torch
+ is_torch_home_multi=False if os.getenv('TORCH_HOME')==None else len(os.getenv('TORCH_HOME').split(':'))>1
+ if is_torch_home_multi:
+ for tmp_torch_home in os.getenv('TORCH_HOME').split(':'):
+ tmp_dst = os.path.join(tmp_torch_home, 'hub', 'checkpoints', esm_model_name + ".pt")
+ if os.path.isfile(tmp_dst):
+ model = esm.pretrained.load_model_and_alphabet_local(tmp_dst)
+ return model
+ assert False , "None of the paths defined in $TORCH_HOME contains %s" % esm_model_name
try:
model = esm.pretrained.load_model_and_alphabet_hub(esm_model_name)
except:
diff -ru model-angelo-1.0.9/model_angelo/utils/torch_utils.py model-angelo-1.0.9_multi_torch_home/model_angelo/utils/torch_utils.py
--- model-angelo-1.0.9/model_angelo/utils/torch_utils.py 2023-10-27 16:42:58.000000000 +0200
+++ model-angelo-1.0.9_multi_torch_home/model_angelo/utils/torch_utils.py 2023-11-14 18:35:39.669951044 +0100
@@ -446,7 +446,17 @@
dest = os.path.join(
torch.hub.get_dir(), "checkpoints", "model_angelo_v1.0", bundle_name
)
- if os.path.isfile(os.path.join(dest, "success.txt")):
+ is_torch_home_multi=False if os.getenv('TORCH_HOME')==None else len(os.getenv('TORCH_HOME').split(':'))>1
+ if (is_torch_home_multi):
+ torch_homes=os.getenv('TORCH_HOME').split(':')
+ for torch_home in torch_homes:
+ dest = os.path.join(
+ torch_home, "hub", "checkpoints", "model_angelo_v1.0", bundle_name
+ )
+ if os.path.isfile(os.path.join(dest, "success.txt")):
+ return dest
+ assert False, "Model ownload disabled, because multiple paths defined in $TORCH_HOME. %s" % dest
+ elif os.path.isfile(os.path.join(dest, "success.txt")):
return dest

print(f"Setting up bundle with name: {bundle_name} for the first time.")
@@ -503,6 +513,20 @@


def download_and_install_esm_model(esm_model_name: str) -> str:
+ is_torch_home_multi=False if os.getenv('TORCH_HOME')==None else len(os.getenv('TORCH_HOME').split(':'))>1
+ if is_torch_home_multi:
+ torch_homes = os.getenv('TORCH_HOME').split(':')
+ for torch_home in torch_homes:
+ dest_model = os.path.join(
+ torch_home, "checkpoints", esm_model_name + ".pt"
+ )
+ dest_regr = os.path.join(
+ torch_home, "checkpoints", esm_model_name + "-contact-regression.pt"
+ )
+ if os.path.isfile(dest_model) and os.path.isfile(dest_regr):
+ return dest_model
+ assert is_torch_home_multi==False, 'Language model download disabled, because multiple paths are set in $TORCH_HOME'
+
permissions = (
stat.S_IROTH
| stat.S_IXOTH
108 changes: 108 additions & 0 deletions easybuild/easyconfigs/m/Model-Angelo_data/Model-Angelo_data-1.0.0.eb
Original file line number Diff line number Diff line change
@@ -0,0 +1,108 @@
# Thomas Hoffmann, EMBL Heidelberg, structures-it@embl.de, 2024/10
easyblock = 'Binary'

name = 'Model-Angelo_data'
version = '1.0.0'

homepage = 'https://zenodo.org/search?q=7733060'
description = """A Graph Neural Network Approach to Automated Model Building in Cryo-EM Maps.
Automated model building and protein identification in cryo-EM maps."""

toolchain = SYSTEM

_prepare = ''
# Uncomment and adapt to store data (10GB) elsewhere:
# _common_data = '/easybuild/data'
# _prepare = 'mkdir -p %s/%%(name)s/%%(version)s/torch_home &&' % _common_data
# _prepare += 'ln -s %s/%%(name)s/%%(version)s/torch_home %%(installdir)s/torch_home &&' % _common_data

buildininstalldir = True

_models = [
'original',
'original_no_seq',
'small_gpu',
'nucleotides',
'nucleotides_no_seq'
]

_torch_home = 'torch_home/'
_checkpoints_rel = '%s/hub/checkpoints' % _torch_home
_checkpoints = '%%(installdir)s/%s' % _checkpoints_rel


source_urls = [
'https://dl.fbaipublicfiles.com/fair-esm/models',
'https://dl.fbaipublicfiles.com/fair-esm/regression',
'https://zenodo.org/records/7733060/files/',
'https://zenodo.org/records/7942241/files/',
]
sources = [
{
'filename': 'esm1b_t33_650M_UR50S.pt',
'extract_cmd':
_prepare +
'mkdir -p %s/model_angelo && ' % _checkpoints +
'cp -n %%s %s ' % _checkpoints,
},
{
'filename': 'esm1b_t33_650M_UR50S-contact-regression.pt',
'extract_cmd': 'cp -n %%s %s ' % _checkpoints,
},
{
'filename': 'original-7733060.zip',
'download_filename': 'original.zip',
'extract_cmd': 'unzip -n %%s -d %s/model_angelo_v1.0/ ' % _checkpoints
},
{
'filename': 'original_no_seq-7733060.zip',
'download_filename': 'original_no_seq.zip',
'extract_cmd': 'unzip -n %%s -d %s/model_angelo_v1.0/ ' % _checkpoints
},
{
'filename': 'small_gpu-7733060.zip',
'download_filename': 'small_gpu.zip',
'extract_cmd': 'unzip -n %%s -d %s/model_angelo_v1.0/ ' % _checkpoints
},
{
'filename': 'nucleotides-7942241.zip',
'download_filename': 'nucleotides.zip',
'extract_cmd': 'unzip -n %%s -d %s/model_angelo_v1.0/ ' % _checkpoints
},
{
'filename': 'nucleotides_no_seq-7942241.zip',
'download_filename': 'nucleotides_no_seq.zip',
'extract_cmd': 'unzip -n %%s -d %s/model_angelo_v1.0/ ' % _checkpoints
},
]
checksums = [
{'esm1b_t33_650M_UR50S.pt': '0569754efaff7dcb7e068c27367bc73f10afb4b450ea30aac30d9bc60783a8b1'},
{'esm1b_t33_650M_UR50S-contact-regression.pt': '77193a8814f0db0b36a03aebb1a311adc6b4745f463c04839defc15407bbb28a'},
{'original-7733060.zip': '55bda1751045030f6ed70af55670819f9ada78055b042b9370080df881b6a5bd'},
{'original_no_seq-7733060.zip': '2e66c7748a446b7c7845e7ff60a2b4e515853ba2093062407cff00ce38550a42'},
{'small_gpu-7733060.zip': '1c6d69cb568e81661aad2b10bc1197e22fa3ea91271480c0befe89ffaf314948'},
{'nucleotides-7942241.zip': 'f1b1d22f563977ac54c7366038c48a8ad37ca2f8870879221149d454cb051041'},
{'nucleotides_no_seq-7942241.zip': '3b75de921440dd6891a6c5ea129fafe86e72fd043393f821157e3eda93d685f8'},
]

skipsteps = ['configure', 'build', 'test']
extract_sources = True

_success = [
'echo Sucessfully downloaded model>%s/model_angelo_v1.0/%s/success.txt'
% (_checkpoints, x) for x in _models
]

install_cmd = '%s ' % '&&'.join(_success)

modextrapaths = {'TORCH_HOME': _torch_home}

sanity_check_paths = {
'files': [
'%s/esm1b_t33_650M_UR50S.pt' % _checkpoints,
'%s/esm1b_t33_650M_UR50S-contact-regression.pt' % _checkpoints_rel,
],
'dirs': ['%s/model_angelo_v1.0/%s' % (_checkpoints, m) for m in _models]
}

moduleclass = 'data'