Orbital-Materials/MofasaDB
MofasaDB The MofasaDB is a publicly available dataset containing 200.000+ de novo generated MOF (Metal-Organic Framework) structures from Mofasa trained on QMOF (up to 170 atoms), along with their geometry-relaxed counterparts. The database is released alongside the paper Mofasa: A Step Change in Metal-Organic Framework Generation. A user-friendly web interface for search and discovery can be accessed at https://mofux.ai/. Database Overview The database contains… See the full description on the dataset page: https://huggingface.co/datasets/Orbital-Materials/MofasaDB.
MofasaDB
The MofasaDB is a publicly available dataset containing 200.000+ de novo generated MOF (Metal-Organic Framework) structures from Mofasa trained on QMOF (up to 170 atoms), along with their geometry-relaxed counterparts. The database is released alongside the paper Mofasa: A Step Change in Metal-Organic Framework Generation. A user-friendly web interface for search and discovery can be accessed at https://mofux.ai/.
Table of Contents
- Database Overview
- Quick Start
- Property Reference
- Structural Properties
- MOFID Properties
- Zeo++ Geometric Properties
- ORB Properties
- MOFChecker Properties
- MOF Fragment Properties
- Linker Properties
- Validation Metrics
Database Overview
The database contains unconditionally generated MOF structures from Mofasa, along with their geometry-relaxed counterparts.
Files
Data Alignment
The databases are row-aligned: row i in samples.db corresponds to row i in relaxed.db.
Indexing:
- ASE databases are 1-indexed: first row is
db.get(1) - NumPy arrays are 0-indexed: first element is
array[0] - Therefore:
latent[i]corresponds todb.get(i + 1)
Quick Start
Load a Structure
from ase.db import connect
db = connect("samples.db")
row_id = 1
row = db.get(row_id) # Get first structure (1-indexed)
atoms = row.toatoms() # Convert to ASE Atoms object
print(atoms.get_chemical_formula())Access Properties
# Get energy per atom
energy = row.data['properties']['orb_properties']['orb_energy_per_atom']
# Get pore diameter
lcd = row.data['properties']['pyzeo_geometric_properties']['lcd']
# Get topology (top-level property)
topology = row.data['topology']Load Orb Latent Embeddings
import numpy as np
latents = np.load("sample_latents/orb_latent_4_graph.npy")
latent = latents[row_id - 1] # Convert 1-indexed row to 0-indexed arrayCompare Sample and Relaxed
sample_db = connect("samples.db")
relaxed_db = connect("relaxed.db")
# Row i in both databases correspond to the same structure
row_id = 100
sample_atoms = sample_db.get(row_id).toatoms()
relaxed_atoms = relaxed_db.get(row_id).toatoms()
print(f"Sample formula: {sample_atoms.get_chemical_formula()}")
print(f"Relaxed formula: {relaxed_atoms.get_chemical_formula()}")Handle Missing Data
Not all properties are available for every structure. Common causes include:
- MOFID failure: If MOFID cannot identify the MOF building blocks (nodes, linkers, topology), these properties are set to
"UNKNOWN","ERROR", or empty lists for missing SMILES strings. - Zeo++ non-porous: If Zeo++ determines a structure has insufficient porosity for probe access, geometric properties (
lcd,pld, accessible volume/surface area) may be missing, zero, orNone. - Component absence: Latent embeddings for
bound_solventandfree_solventare zero vectors when structures contain no solvent molecules.
Property Reference
Properties are stored in row.data with nested paths. Some examples:
PROPERTY_PATHS = {
# ORB model properties
'orb_energy_per_atom': 'properties.orb_properties.orb_energy_per_atom',
'orb_max_force': 'properties.orb_properties.orb_max_force',
# Zeo++ geometric properties
'lcd': 'properties.pyzeo_geometric_properties.lcd',
'pld': 'properties.pyzeo_geometric_properties.pld',
'dif': 'properties.pyzeo_geometric_properties.dif',
'av_volume_fraction': 'properties.pyzeo_geometric_properties.av_volume_fraction',
'av_cm3_per_g': 'properties.pyzeo_geometric_properties.av_cm3_per_g',
'nav_volume_fraction': 'properties.pyzeo_geometric_properties.nav_volume_fraction',
'asa_m2_per_g': 'properties.pyzeo_geometric_properties.asa_m2_per_g',
'number_of_channels': 'properties.pyzeo_geometric_properties.number_of_channels',
'number_of_pockets': 'properties.pyzeo_geometric_properties.number_of_pockets',
# Crystal symmetry
'spacegroup_number': 'properties.crystal_symmetry.symprec_0.01/spacegroup_number',
'pointgroup': 'properties.crystal_symmetry.symprec_0.01/pointgroup',
# MOFID properties
'mofid': 'mofid',
'mofkey': 'mofkey',
'topology': 'topology',
'smiles_nodes': 'smiles_nodes',
'smiles_linkers': 'smiles_linkers',
'cat': 'cat',
# MOFChecker
'mofchecker': 'properties.mofchecker',
'mofchecker_valid': 'properties.mofchecker.mofchecker_valid',
}Structural Properties
Lattice Parameters
Chemical Composition
MOFID Properties
MOFID is a standardized identifier for MOF structures that encodes topology, nodes, linkers, and catenation information.
Crystal Symmetry
Computed using pymatgen's SpacegroupAnalyzer.
Detailed Crystal Symmetry (nested under properties.crystal_symmetry)
Zeo++ Geometric Properties
Computed using Zeo++ via the pyzeo wrapper. These properties characterize the pore geometry and accessibility using a spherical probe (default: N₂ probe radius of 1.86 Å).
Pore Descriptors
Volume Properties
Surface Area Properties
ORB Properties
Properties computed using the ORB machine-learned interatomic potential.
Energy and Forces
ORB Latent Embeddings
ORB latent embeddings are stored as NumPy files in the sample_latents/ and relaxed_latents/ directories.
File naming: orb_latent_{layer}_{component}.npy
- Layers 0-4 correspond to different depths in the ORB GNN (layer 4 = final layer)
- Zero vectors indicate missing data (e.g., structures without solvents)
MOFChecker Properties
Computed using MOFChecker, a tool for validating MOF structures. All keys are prefixed with mofchecker_.
Validity Checks (Binary)
These descriptors are used to determine overall MOF validity. True indicates a problem (except where noted).
Informative Checks (Binary, not used for validity)
Structure Hashes
MOF Fragment Properties
Properties of the decomposed MOF components (nodes, linkers, solvents). Stored under properties.mof_fragments.
Component Types
MOF structures are decomposed into four component types:
- nodes_and_bridges: Metal nodes and bridging groups
- linkers: Organic linker molecules
- bound_solvent: Solvent molecules coordinated to metal centers
- free_solvent: Unbound solvent molecules in pores
Fragment Formulas
Example: `nodes_and_bridges_formulas = ["Zn4O", "Zn4O"]` for a structure with two identical zinc nodes
Linker SMILES
Linker Properties
Molecular descriptors and fingerprints for organic linker molecules. Stored under properties.linker_properties.
Morgan Fingerprints
Morgan (circular) fingerprints are stored as NumPy files. For similarity search, use the standardized versions.
Scalar metadata:
Molecular Descriptors
Computed on standardized molecules using RDKit.
Coordination Site Descriptors
Counts of metal-coordinating functional groups (computed on as-parsed molecules).
Validation Metrics
Binary metrics used to assess structure quality.
License
References
- MOFID: Bucior, B. J., et al. (2019). Identification Schemes for Metal-Organic Frameworks...
- Zeo++: Willems, T. F., et al. (2012). Algorithms and tools for high-throughput geometry-based analysis...
- MOFChecker: Ongari, D., et al. (2019). Building a Consistent and Reproducible Database for Adsorption Evaluation...
- QMOF Andrew S. R., et al. (2021). Paper can be found at Machine learning the quantum-chemical properties of metal–organic frameworks for accelerated materials discovery and corresponding dataset release on GitHub
- ORB: Orbital ORB v3 Force Field
- RDKit Morgan Fingerprints: RDKit Documentation
