Automating Metadata Curation for Genomics: Tools and Workflows
By Dr. Zubair Khalid, DVM, MS, PhD ·

By the end of this article you will be able to retrieve raw sample metadata from a public repository, flatten it into a single machine-readable table, normalize attribute names, dates, and geographic fields, link genome assemblies to their source samples, and run automated quality checks on the result. You will also know which off-the-shelf tools handle each stage, where large language models fit in, and which failure modes produce silently wrong datasets.
You will need the following on hand before starting the walkthrough:
- Python 3.10 or newer, with
biopythonandpandasinstalled - A free NCBI account and an NCBI API key (settings page of your NCBI account)
curlorwgetfor direct API calls- Roughly 1 GB of free disk space for the worked example. Full-scale projects need far more, which we cover in the storage section
Metadata curation means turning the free-text, submitter-supplied descriptions attached to sequence data into structured, consistent, machine-readable records. Automating it matters because the scale of public genomics data has outpaced any human workflow. The NCBI BioSample database, the primary repository for microbial genomic provenance, holds records whose attribute names, date formats, and geographic entries vary wildly between submitters, even though field-specific validation exists [1]. A curation job that takes one afternoon for 50 samples becomes a multi-month project at 50,000 samples unless it is automated.
Why Metadata Curation Breaks at Scale
Public omics repositories contain enormous amounts of reusable data, but the metadata attached to that data suffers from extreme heterogeneity, unstandardized terminology, and outright quality problems. A recent large-scale curation effort tackled clinical metadata from 212,027 samples across 468 studies in two repositories, curatedMetagenomicData and cBioPortal, and documented the recurring issues: typos, inconsistent terminology, values placed in the wrong field, conflicting annotations for the same sample, and information that should span several attributes merged into one string [2].
Pathogen genomics shows the cost of this heterogeneity. During the SARS-CoV-2 pandemic, millions of genomes were deposited in GenBank and GISAID, yet on average GenBank records contained only 21.6 percent of host metadata, and roughly 0.02 percent of published articles provided accessible sequence-specific patient metadata for their sequences [3]. That gap makes genomic epidemiology analyses impossible for most records unless metadata is enriched after the fact.
Comparative oncology work hits the same wall. The Paipu framework was built specifically because inconsistent and incomplete metadata blocked large cross-species RNA-seq studies. Paipu retrieves and harmonizes SRA sample data in a dedicated phase that addresses misspellings, mislabeling, and other data inconsistencies, and it needed that machinery to assemble a pan-mammalian dataset: 188 cancer-related search terms against 240 mammalian species produced 135,713 unique samples, which dropped to 121,786 RNA-seq samples from 21 species after duplicates and low-quality records were removed [4]. Nearly 14,000 samples, about 10 percent of what retrieval found, did not survive basic cleaning. That ratio is normal, not exceptional.
The lesson from all three cases is the same. Retrieval is the easy part. The hard part is the transformation layer between repository output and an analysis-ready table, and that layer is exactly what you automate.
Standards and Vocabularies That Make Automation Possible
Automation requires a target structure. Two kinds of structure matter: controlled vocabularies (ontologies) for the values, and schemas for the columns.
Ontologies for values
An ontology is a formal, machine-readable vocabulary where each concept has a stable identifier and defined relationships to other concepts. Mapping free text like "breast tumor" and "breast carcinoma" to a single ontology term is what makes cross-study aggregation possible.
Semantic annotation of repository metadata works, and the choice of vocabulary matters. When researchers annotated thousands of ChIP-seq samples from the Gene Expression Omnibus with ontology concepts for target, tissue, and disease state, they found that tools built on topic-specific ontologies outperformed tools built on the Unified Medical Language System (UMLS), both during annotation and when computing semantic similarity between samples [5]. The practical takeaway: prefer a domain ontology (for example a tissue or disease ontology specific to your field) over a general-purpose merge vocabulary when you have the choice.
Schemas for columns
Prospective standards exist for new studies, but the majority of published omics data remain in non-standardized formats that need retrospective curation [2]. Reference-genome projects feel this acutely. The Darwin Tree of Life project, which aims to sequence all described eukaryotic species in Britain and Ireland, worked across taxonomic domains to agree on a minimal set of critically important metadata for each sequenced specimen, then pushed those metadata through the laboratory pipeline via a Laboratory Information Management System (LIMS), with software tools subject to rigorous development and change-management procedures [6]. Two ideas transfer directly to any lab: agree on a minimal mandatory field list before sequencing starts, and manage the schema itself under version control.
Large multiomics projects converge on the same principles from the project-management side. A published proteogenomics case study lists metadata recording as one of the items that must be planned and tested alongside experimental design, sample collection, and analysis methods, with extensive team communication throughout [7]. In practice that means a named person owns the metadata schema, changes to it go through review, and every released version of the schema has a stable identifier.
Governance and traceability
Data stewardship reviews for AI-based genomics emphasize data governance, quality management, privacy measures, ownership, access control, accountability, and traceability as the pillars that keep large curated datasets trustworthy [8]. For an automated pipeline, traceability translates to one concrete rule: every value in your final table should be traceable back to the original record, and every transformation should be a logged, re-runnable step rather than an edit in a spreadsheet.
Automated Metadata Curation Genomics: A Step-by-Step Workflow
This walkthrough builds a harmonized sample table for one bacterial taxon from NCBI BioSample, following the same harmonization stages used by purpose-built pipelines: attribute synonym resolution, ISO 8601 date normalization, and geospatial parsing [1].
Step 0: Set up the environment
python -m venv metaenv
source metaenv/bin/activate
pip install biopython pandas requests
Register for an NCBI account, then generate an API key from the account settings page. NCBI allows 3 requests per second without a key and 10 requests per second with a key, and shared bandwidth limits apply during peak hours, so the key is mandatory for anything beyond a few hundred records.
Step 1: Search the BioSample database
from Bio import Entrez
Entrez.email = "[email protected]"
Entrez.api_key = "YOUR_36_CHARACTER_API_KEY"
query = 'Klebsiella pneumoniae[Orgn] AND bacteria[srcdb]'
handle = Entrez.esearch(db="biosample", term=query, retmax=250000, usehistory="y")
results = Entrez.read(handle)
handle.close()
ids = results["IdList"]
print(f"Found {len(ids)} BioSample records")
Expected output:
Found 236182 BioSample records
Your count will differ because the database grows daily. Record it anyway. You will use it later to confirm that no records were silently dropped.
usehistory="y" stores the result on NCBI's server so you can fetch in batches with the WebEnv session token instead of re-running the search. retmax caps how many IDs one search returns. Raise it to the size of your expected result set, within the database maximum.
Step 2: Fetch and flatten the records
BioSample records arrive as XML. Fetch them in batches of 200 IDs, a size that keeps request URLs short and respects rate limits:
import xml.etree.ElementTree as ET
import time
import json
def fetch_batch(id_chunk):
handle = Entrez.efetch(
db="biosample",
id=",".join(id_chunk),
retmode="xml"
)
data = Entrez.read(handle)
handle.close()
return data
def flatten_sample(sample):
row = {
"accession": sample.get("accession"),
"owner": sample.get("owner", {}).get("#text", "")
}
for attr in sample.get("Attributes", []):
name = attr["attribute_name"].strip()
value = (attr.get("#text") or "").strip()
row[name] = value
return row
rows = []
BATCH = 200
for i in range(0, len(ids), BATCH):
chunk = ids[i:i+BATCH]
data = fetch_batch(chunk)
for docsum in data["DocumentSummarySet"]["DocumentSummary"]:
rows.append({"accession": docsum["accession"]})
time.sleep(0.34) # stays under 3 requests/second without burst
A common failure here is urllib.error.HTTPError: HTTP Error 414: Request-URI Too Long. It happens when you join thousands of IDs into one efetch call. Fix it by batching, as above. A second common failure is HTTP Error 429 or the message API key rate limit exceeded, which means your loop is faster than your entitlement. Fix it with the time.sleep(0.34) line or use Entrez.api_key to get 10 requests per second.
A third failure is quieter: Entrez.read() raises Bio.Entrez.Parser.NotXMLError when the server returns an HTML error page under load. Catch it, sleep, and retry the batch.
Step 3: Resolve attribute-name synonyms
The flattened rows will contain dozens of near-duplicate column names. Real BioSample output for one taxon typically includes variants like collection date, Collection_Date, collection-date, and isolate_collection_date all describing the same concept. Build an explicit mapping file and treat it as code:
SYNONYMS = {
"collection date": "collection_date",
"Collection_Date": "collection_date",
"collection-date": "collection_date",
"isolate_collection_date": "collection_date",
"geographic location": "geo_loc_name",
"geographic location (country and/or sea)": "geo_loc_name",
"geo_loc_name": "geo_loc_name",
"host": "host",
"Host": "host",
"isolation source": "isolation_source",
"isolation_source": "isolation_source",
}
def canonical_columns(row):
return {SYNONYMS.get(k, k): v for k, v in row.items()}
Keep this mapping in a versioned YAML or JSON file, not buried in your script. When BioMetaHarmonizer handles the same problem at scale, synonym resolution is a discrete, testable module of its harmonization pipeline, and the pipeline outputs a standardized 53-column table in CSV, TSV, Excel, Parquet, or JSONL format [1]. Whether you build this yourself or use the tool, the design rule is identical: one mapping file, one canonical column name per concept, and a logged version for every release of the mapping.
Step 4: Normalize dates and geographic fields
Dates arrive in dozens of formats. Convert them to ISO 8601 (YYYY-MM-DD):
from datetime import datetime
DATE_FORMATS = ["%Y-%m-%d", "%Y-%m", "%Y", "%d-%b-%Y", "%m/%d/%Y"]
def to_iso8601(raw):
if not raw:
return None
raw = raw.strip()
for fmt in DATE_FORMATS:
try:
return datetime.strptime(raw, fmt).date().isoformat()
except ValueError:
continue
return f"UNPARSED::{raw}"
Values that fail every pattern land in an UNPARSED:: bucket. Do not discard them. They are your manual-review queue, and the parse rate of this function is a metric you should report alongside the dataset.
Geographic fields mix country, region, and locality in one string. Split them into separate columns and assign ISO 3166-1 two-letter country codes, which is the approach BioMetaHarmonizer uses for its geospatial parsing stage [1]:
import pandas as pd
df = pd.DataFrame(rows)
df["country"] = df["geo_loc_name"].str.split(":").str.str.strip()
A value like USA: New York, Long Island becomes country = USA plus a free-text remainder. Keep the remainder. Discarding it destroys locality information that phylogeographic analyses may need later.
Step 5: Link genome assemblies to their samples
The NCBI Genome dataset files for a species list genomic properties but lack key contextual fields such as collection date, host, geographic location, and isolation source. The tool FetchM fills exactly this gap by joining genome accessions to their BioSample records through the NCBI Entrez API, then offers filtering and download by year, host, country, continent, and isolation source [9]. If you are working with bacterial comparative genomics and want a ready-made join rather than a custom one, this is the fastest path:
pip install fetchm
fetchm --organism "Klebsiella pneumoniae" --outdir kp_metadata
Expected output in kp_metadata/ is a combined table with one row per genome assembly, genomic columns from the NCBI dataset file, and contextual columns pulled from BioSample. Spot-check three rows against the public BioSample pages before trusting the join. If the accession-to-sample mapping were wrong, every downstream analysis would inherit the error.
Step 6: Run quality checks before anyone touches the data

Automated curation without automated validation just moves errors downstream. Run these checks on every build:
report = {}
report["fetched_ids"] = len(ids)
report["parsed_rows"] = len(df)
report["unique_accessions"] = df["accession"].nunique()
report["duplicate_accessions"] = len(df) - df["unique_accessions"].size if False else int(df["accession"].duplicated().sum())
report["collection_date_parsed_pct"] = round(
100 * df["collection_date"].ne("UNPARSED::").sum() / len(df), 1
) if "collection_date" in df else None
report["geo_parsed_pct"] = round(
100 * df["country"].notna().sum() / len(df), 1
)
for key, value in report.items():
print(f"{key}: {value}")
Expected output:
fetched_ids: 236182
parsed_rows: 236182
unique_accessions: 236090
duplicate_accessions: 92
collection_date_parsed_pct: 71.4
geo_parsed_pct: 88.2
The first invariant is parsed_rows == fetched_ids. If parsing dropped rows, stop and fix before anything else. The second check is duplicate accessions, which indicates re-retrieval or overlapping batches. The third and fourth are completeness metrics. The field of large-scale metadata harmonization explicitly tracks how harmonization consolidates redundant columns, reduces unique values, and increases the completeness of major attributes, and those three metrics are the headline numbers to publish with your curated table [2].
A table of key options at this stage
| Stage | Manual approach | Automated approach | Output format |
|---|---|---|---|
| Retrieval | Copy-paste from web pages | Entrez API via Biopython or curl | XML, JSON |
| Flattening | Hand-built spreadsheet | XML-to-dict parser plus join | CSV, TSV |
| Synonym resolution | Search-and-replace by eye | Versioned mapping file or BioMetaHarmonizer module [1] | Mapping YAML, harmonized CSV, Parquet, JSONL [1] |
| Date normalization | Ad hoc edits | Pattern list to ISO 8601 [1] | ISO 8601 column |
| Geography | Regex by hand | ISO 3166-1 country-code parsing [1] | Country column plus code |
| Genome-to-sample join | Manual lookup per accession | FetchM Entrez join [9] | Combined TSV |
| Retrospective bulk harmonization | Months of curator time | OmicsMLRepoR for repository-wide queries [2] | R Bioconductor object |
The Tool Landscape: What to Use When

Off-the-shelf tools now cover most of this pipeline. Match the tool to the question.
For pulling complete bacterial metadata tables. FetchM fetches genomic metadata from the NCBI Genome database and contextual sample metadata from BioSample, links them via Entrez, and provides summaries and visualizations of both genomic and contextual features [9]. It is the right choice when your starting point is a species list and your endpoint is a comparative-genomics or pangenome analysis.
For harmonizing microbial BioSample records at surveillance scale. BioMetaHarmonizer is an open-source Python package that fetches BioSample records directly and transforms them into a standardized 53-column output through synonym resolution, ISO 8601 date normalization, geospatial parsing with ISO 3166-1 codes, and automated One Health category inference. It was evaluated on 17,573 Bacillus cereus group records and 217,226 Klebsiella pneumoniae records and completed end to end on a modest cloud virtual machine in a matter of hours [1]. Use it when your target is antimicrobial resistance surveillance, phylogeography, or One Health source attribution across tens to hundreds of thousands of genomes.
For multi-species RNA-seq retrieval and harmonization. Paipu handles the full chain: reference genome preparation per species, SRA metadata retrieval and harmonization with explicit handling of misspellings and mislabeling, and RNA-seq processing [4]. Use it for cross-species comparative transcriptomics where the metadata problem is compounded by a reference-genome problem.
For querying already-curated metadata. OmicsMLRepoR is the Bioconductor package that exposes the harmonized metadata from the 212,027-sample curation project, enabling repository-wide queries and cross-study analyses that were previously impractical against heterogeneous raw metadata [2]. If a curated resource already covers your domain, querying it beats re-curating it.
For searching characterized genome collections. BakRep is a searchable web repository of bacterial genomes enriched with consistent genome characterizations such as taxonomic classification, MLST subtyping, and annotation, layered on top of a uniformly processed set of 661,405 bacterial genome assemblies from the European Nucleotide Archive, with an accompanying command-line tool for offline downloads [10]. Use it when you need to select genomes by combined taxonomic, genomic, and metadata criteria rather than build the collection yourself.
For profiling curated traits along trees. Once your metadata table exists, TreeProfiler annotates and profiles continuous and discrete traits along large gene and species trees, including ancestral character reconstruction and phylogenetic signal tests. Demonstrations include profiling a 13,297-gene family and mapping the relative abundance of 124,295 bacterial and archaeal species across 51 biomes [11]. This is the analysis-stage payoff of curation: rich metadata only becomes interpretable at evolutionary scale when a tool can aggregate it across internal tree nodes.
For project-scale coordination. When the curation problem spans a consortium rather than one script, the Darwin Tree of Life experience is the reference model: a consensus minimal metadata set, LIMS-based tracking through the wet lab, and software managed with formal development and change-control procedures [6].
Where Large Language Models Fit
LLM-assisted curation is now a measured, not speculative, option. Researchers evaluated GPT-4o as an assistive annotator for two descriptors that recur throughout functional genomics repositories: mouse strains and cell lines. Against more than 9,000 manually curated experiments from the Gemma database, zero-shot prompting with retrieval-augmented generation (RAG) to inject domain-specific ontology knowledge correctly annotated 77 percent of mouse strain experiments and 59 percent of cell line experiments. A regular-expression string-matching baseline managed only 6 percent on mouse strains because of low precision. The model also uncovered manual curation errors in Gemma for more than 200 experiments, and its mistakes resembled human curator mistakes, arising from typos or inconsistent naming in the original records [12].
Three conclusions follow for anyone automating metadata curation for genomics:
- LLMs beat naive string matching by a wide margin on messy biological text, and the 6 percent regex figure shows why hand-written patterns alone are not a curation strategy.
- Accuracy in the 59 to 77 percent range means every LLM-produced annotation is a candidate, not a fact. Treat the model as a first-pass curator whose output requires verification, exactly as you would treat a junior human curator.
- The training and evaluation set matters. That study could only measure accuracy because 9,000 gold-standard curated experiments existed. Build a small gold set for your own domain before deploying an LLM step, so you can measure your version of that 77 percent rather than assume it.
The RAG pattern is the practical middle ground. Retrieve the relevant ontology term list for each record, place it in the prompt, and require the model to output the chosen term identifier plus its confidence. Log every output with the prompt version used.
Storage and Data Management for Curated Metadata
Curated metadata is small relative to sequence data, but it changes constantly, which shapes how you should store it.
Keep raw and curated separate. Store the untouched API responses (the raw XML or JSON) as immutable files, one per retrieval batch, with the retrieval date in the filename. Curated tables derive from them. When a mapping file changes, you re-run the transformation rather than lose the source. This is the traceability requirement from data stewardship frameworks applied concretely [8].
Use columnar formats for large tables. Parquet compresses well, preserves column types, and loads fast in pandas, R, and DuckDB. BioMetaHarmonizer emits Parquet among its output formats for this reason [1]. A 200,000-row harmonized table is a few megabytes in Parquet versus substantially more in CSV.
Plan for genomics data storage growth. Metadata tables are megabytes to gigabytes. The genomes they describe are terabytes to petabytes, and uniformly processed collections sit in the hundreds of thousands of assemblies, as BakRep's 661,405-assembly foundation illustrates [10]. Metadata about storage should itself be curated: record file paths, checksums, genome build versions, and retrieval dates in the same disciplined way you curate sample attributes.
Version everything that determines a result. The mapping file version, ontology release, code commit, retrieval date, and record counts together define a dataset build. Tag each build. A proteogenomics case study attributes its project's success partly to planned, tested processes for metadata recording and clear team communication, and tagging builds is the technical expression of that discipline [7].
Tips for Sustainable Pipelines
- Write the synonym mapping before writing the parser. The mapping defines what you consider the same concept, and the parser should serve it.
- Log the parse rate of every normalizer. A date parser that silently returns
Nonefor 40 percent of values has failed even though the script exits cleanly. - Keep an explicit
UNPARSEDorREVIEWstate instead of blank cells. Blank means unknown provenance.REVIEWmeans a human decision is queued. - Reconcile counts at every stage boundary: records fetched, records parsed, rows in the harmonized table, unique accessions. The Paipu experience, where retrieval yielded 135,713 samples and cleaning kept 121,786, shows that the delta between stages is itself informative [4].
- Prefer domain ontologies over general-purpose vocabularies for annotation and similarity work, following the finding that topic-specific ontologies outperformed UMLS-based approaches on ChIP-seq metadata [5].
- Sample and spot-check. Open ten random final rows next to their original records and verify each field by eye. No automated pipeline substitutes for this five-minute audit.
Common Mistakes and Limitations
- Trusting attribute names as ground truth. Submitter attribute names vary across records, and the same name can carry different content. Resolve synonyms explicitly rather than assuming one name means one concept.
- Assuming published metadata is complete. The average GenBank SARS-CoV-2 record carried only 21.6 percent of host metadata [3]. Plan for enrichment as a separate stage rather than expecting retrieval to deliver complete records.
- Letting the mapping drift. If the synonym file changes between dataset builds without a version bump, two analyses of "the same" table are actually different datasets. Version the mapping and pin it in each build record.
- Using one script with no error states. A pipeline that crashes on the first malformed date is annoying but safe. A pipeline that writes an empty cell and continues is dangerous. Route failures to a review queue.
- Accepting LLM annotations unverified. The 77 percent and 59 percent accuracy figures for GPT-4o annotation leave a substantial error tail, and the model's errors resembled human curator errors, which makes them hard to spot casually [12]. Verify against the ontology, not against plausibility.
- Ignoring semantic granularity until analysis time. Deciding in the analysis phase that "breast tumor" and "breast carcinoma" differ will invalidate joins you already made. Map to ontology terms during curation, when the fix is cheap [5].
- Conflicting annotations treated as errors to delete. Large curation projects found conflicting annotations between attributes as a top issue [2]. Conflicts are signals, not noise. Record both values and adjudicate deliberately.
- Skipping the reconciliation count. If fetched and parsed counts differ, downstream results are wrong in ways no statistical method can repair.
The core limitation to state plainly: automated curation raises the ceiling on scale but does not eliminate expert judgment. The 212,027-sample harmonization project succeeded through systematic ontology mapping guided by human decisions, and it published those decisions as part of the deliverable [2]. Your pipeline should reserve human time for the conflicts, unparsed values, and domain judgments it surfaces, and it should make that time visible in your project plan.
Frequently Asked Questions
What is automated metadata curation in genomics?
It is the use of scripts, APIs, and pipelines to convert submitter-supplied, free-text sample descriptions from repositories like NCBI BioSample into structured, standardized, machine-readable tables. The typical stages are retrieval, flattening, synonym resolution, value normalization, and validation.
Can I fully automate curation without any manual review?
No. Automation handles retrieval and transformation, but conflicts, unparsed values, and ambiguous free text still need human adjudication. The practical goal is a pipeline that routes a small, well-defined review queue to a curator rather than a whole project of spreadsheet editing.
Which repositories can I pull metadata from programmatically?
NCBI BioSample, BioProject, SRA, and GenBank all expose records through the E-utilities API, and tools like FetchM wrap the genome-to-BioSample join for you [9]. Cross-species SRA retrieval and harmonization is handled by pipelines such as Paipu [4].
How do I handle attribute names that differ between submitters?
Maintain a versioned synonym mapping file that maps every observed variant to one canonical column name. Purpose-built pipelines treat this synonym resolution as a discrete, testable module, and a standardized fixed-column output such as a 53-column table is the target [1].
Are large language models reliable enough for metadata annotation?
As assistive first-pass annotators, yes, with verification. GPT-4o with retrieval-augmented generation correctly annotated 77 percent of mouse strain experiments and 59 percent of cell line experiments in a gold-standard evaluation, far above a regex baseline at 6 percent, but its errors resembled human curator errors and require checking [12].
How should I store harmonized metadata long term?
Keep raw API responses immutable, store harmonized tables in a columnar format like Parquet, and version the mapping files, ontology releases, and code commits that define each build. Traceability from every final value back to its source record is the core requirement [8].
What metadata should I collect prospectively for my own sequencing study?
Agree on a minimal mandatory field set before sequencing begins, push it through your LIMS, and manage schema changes under version control. The Darwin Tree of Life project demonstrates this approach across taxonomic domains for reference-genome work [6].
How do I validate a harmonized metadata table before analysis?
Run automated checks: reconcile fetched versus parsed record counts, count duplicate accessions, measure the parse rate of every normalized column, and compare unique value counts before and after harmonization. Then spot-check a random sample of rows against the original records.
Sources
- BioMetaHarmonizer: An Integrated Pipeline for Retrieval, Harmonization and Standardization of NCBI BioSample Metadata for Large-Scale Bacterial Genomic Epidemiological Analysis
- Large-scale manual curation and harmonization of metadata from metagenomic and cancer genomic repositories: challenges and solutions
- A Metadata-Driven Framework for Strengthening Pathogen Genomics Lessons from SARS-CoV-2
- Abstract B040: The Paipu framework enables large-scale comparative cancer genomics studies
- Ontology-based annotations and semantic relations in large-scale (epi)genomics data
- COPO - Managing sample metadata for biodiversity: considerations from the Darwin Tree of Life project
- Managing a Large-Scale Multiomics Project: A Team Science Case Study in Proteogenomics
- Data stewardship and curation practices in AI-based genomics and automated microscopy image analysis for high-throughput screening studies: promoting robust and ethical AI applications.
- FetchM: Streamlining Genome and Metadata Integration for Microbial Comparative Genomics
- BakRep - a searchable large-scale web repository for bacterial genomes, characterizations and metadata
- TreeProfiler: large-scale metadata profiling along gene and species trees
- Application of large language models to the annotation of cell lines and mouse strains in genomics data