Skip to content

Commit f45347f

Browse files
committed
WIP
1 parent 04cfe3e commit f45347f

3 files changed

Lines changed: 46 additions & 12 deletions

File tree

README.md

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,8 @@
7474
or create a dump directly from Docker:
7575

7676
```bash
77-
docker exec -t bionexus-db-1 pg_dump -U bionexus -d bionexus -Fc > /path/on/host/bionexus.dump
77+
docker exec -it bionexus-db-1 pg_dump -U postgres -Fc -d mydb -f /tmp/mydb.dump
78+
docker cp bionexus-db-1:/tmp/db.dump ./db.dump
7879
```
7980

8081
Adminer: http://localhost:8080 (server: db, user: bionexus, db: bionexus)

src/bionexus/db/search.py

Lines changed: 39 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -147,14 +147,39 @@ def retro_search_compound(
147147
from retromol.fingerprint import (
148148
FingerprintGenerator,
149149
NameSimilarityConfig,
150-
polyketide_family_of
150+
polyketide_family_of,
151+
polyketide_ancestors_of,
151152
)
152153
from retromol.rules import get_path_default_matching_rules
153154
except ImportError:
154155
logger.error("RetroMol library is not installed. Please install it to use retro_search.")
155156
return []
156157

157-
raise RuntimeError("Please update generator setup to match recent changes in retromol ETL code; centralize generator setup?")
158+
COLLAPSE_BY_NAME = {
159+
"glycosylation": ["glycosyltransferase"],
160+
"methylation": ["methyltransferase"],
161+
}
162+
163+
def _setup_fingerprint_generator(yaml_path: str) -> FingerprintGenerator:
164+
"""
165+
Setup and return a FingerprintGenerator instance.
166+
167+
:return: FingerprintGenerator instance
168+
"""
169+
collapse_by_name: list[str] = list(COLLAPSE_BY_NAME.keys())
170+
cfg = NameSimilarityConfig(
171+
# family_of=polyketide_family_of,
172+
# family_repeat_scale=1,
173+
ancestors_of=polyketide_ancestors_of,
174+
ancestor_repeat_scale=1,
175+
symmetric=True,
176+
)
177+
generator = FingerprintGenerator(
178+
matching_rules_yaml=yaml_path,
179+
collapse_by_name=collapse_by_name,
180+
name_similarity=cfg
181+
)
182+
return generator
158183

159184
# limit top-k to 500 for performance reasons
160185
if top_k > 500:
@@ -168,13 +193,14 @@ def retro_search_compound(
168193
logger.info(f"RetroMol coverage for input compound: {coverage:.2%}")
169194

170195
# Setup generator
171-
collapse_by_name = ["glycosylation", "methylation"]
172-
cfg = NameSimilarityConfig(family_of=polyketide_family_of, symmetric=True, family_repeat_scale=1)
173-
generator = FingerprintGenerator(
174-
matching_rules_yaml=get_path_default_matching_rules(),
175-
collapse_by_name=collapse_by_name,
176-
name_similarity=cfg
177-
)
196+
# collapse_by_name = ["glycosylation", "methylation"]
197+
# cfg = NameSimilarityConfig(family_of=polyketide_family_of, symmetric=True, family_repeat_scale=1)
198+
# generator = FingerprintGenerator(
199+
# matching_rules_yaml=get_path_default_matching_rules(),
200+
# collapse_by_name=collapse_by_name,
201+
# name_similarity=cfg
202+
# )
203+
generator = _setup_fingerprint_generator(get_path_default_matching_rules())
178204
logger.info(f"Initialized RetroMol FingerprintGenerator: {generator}")
179205

180206
# Calculate fingerprints of shape (N, 512)
@@ -183,6 +209,10 @@ def retro_search_compound(
183209
logger.warning("No RetroMol fingerprints could be generated for the input compound.")
184210
return []
185211

212+
for fp in fps:
213+
print(fp.sum())
214+
exit("CHK")
215+
186216
vec_col = "fp_retro_b512_vec_counted" if counted else "fp_retro_b512_vec_binary"
187217

188218
# Cosine distance operator in pgvector is '<=>'; cosine similarity = 1 - distance

src/bionexus/etl/retromol.py

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,8 @@ def _retro_bits_and_vec(
3737
result_obj = RetroMolResult.from_serialized(result_json)
3838
generator: FingerprintGenerator = generator
3939
# Get fingerprint in shape (N, 512); could return multiple fingerprints if there are multiple optimal mappings
40-
fps_counted: NDArray[np.int8] | None = generator.fingerprint_from_result(result_obj, num_bits=num_bits, counted=True, kmer_sizes=[1, 2, 3], kmer_weights={1: 2, 2: 4, 3: 8})
40+
# fps_counted: NDArray[np.int8] | None = generator.fingerprint_from_result(result_obj, num_bits=num_bits, counted=True, kmer_sizes=[1, 2, 3], kmer_weights={1: 2, 2: 4, 3: 8})
41+
fps_counted: NDArray[np.int8] | None = generator.fingerprint_from_result(result_obj, num_bits=num_bits, counted=True, strict=False)
4142
if fps_counted is None:
4243
# Can happen when coverage is 0.0
4344
yield None
@@ -95,6 +96,7 @@ def backfill_retro_fingerprints(
9596
polyketide_family_of,
9697
polyketide_ancestors_of,
9798
)
99+
from retromol.rules import get_path_default_matching_rules
98100
except ImportError:
99101
logger.error("retromol package not found. Please install retromol.")
100102
return done
@@ -144,7 +146,8 @@ def _setup_fingerprint_generator(yaml_path: str) -> FingerprintGenerator:
144146
# Create separate fingerprint generator for each matching ruleset
145147
generators = {}
146148
for rid, yaml_path in ruleset_files.items():
147-
generators[rid] = _setup_fingerprint_generator(str(yaml_path))
149+
# generators[rid] = _setup_fingerprint_generator(str(yaml_path))
150+
generators[rid] = _setup_fingerprint_generator(get_path_default_matching_rules())
148151

149152
# Calculate fingerprints
150153
total_inserted = 0

0 commit comments

Comments
 (0)