nim-mmcif


Namenim-mmcif JSON
Version 0.0.18 PyPI version JSON
download
home_pageNone
SummarymmCIF parser written in Nim with Python bindings
upload_time2025-08-24 00:06:41
maintainerNone
docs_urlNone
authorNone
requires_python>=3.8
licenseMIT
keywords mmcif cif protein structure bioinformatics structural-biology parser crystallography nim pdb
VCS
bugtrack_url
requirements No requirements were recorded.
Travis-CI No Travis.
coveralls test coverage No coveralls.
            # nim-mmcif

Fast mmCIF (Macromolecular Crystallographic Information File) parser written in Nim with Python bindings

The goal of this repository is to experiment with vibe coding while building something useful for bioinformatics community, to see how much of a cross platform library can be driven to completion by transformers

## Features

- 🚀 High-performance parsing of mmCIF files using Nim
- 🌍 Cross-platform support (Linux, macOS, Windows)
- 📦 Easy installation via pip

## Installation

### Prerequisites

- Python 3.8 or higher
- Nim compiler (see [platform-specific instructions](CROSS_PLATFORM.md))

### From PyPI

```bash
pip install nim-mmcif
```

### From Source

```bash
# Install Nim (platform-specific, see below)
# macOS: brew install nim
# Linux: curl https://nim-lang.org/choosenim/init.sh -sSf | sh
# Windows: scoop install nim

# Install the package
git clone https://github.com/lucidrains/nim-mmcif
cd nim-mmcif
pip install -e .
```

For detailed platform-specific instructions, see [CROSS_PLATFORM.md](CROSS_PLATFORM.md).

## Quick Start

### Python Usage

#### Dictionary Access

```python
import nim_mmcif

# Parse an mmCIF file (returns dict by default)
data = nim_mmcif.parse_mmcif("path/to/file.mmcif")
print(f"Found {len(data['atoms'])} atoms")

# Access atom properties using dictionary notation
first_atom = data['atoms'][0]
print(f"Atom {first_atom['id']}: {first_atom['label_atom_id']}")
print(f"Position: ({first_atom['x']}, {first_atom['y']}, {first_atom['z']})")

# Parse multiple files using glob patterns
results = nim_mmcif.parse_mmcif("path/to/*.mmcif")
for filepath, data in results.items():
    print(f"{filepath}: {len(data['atoms'])} atoms")
```

#### Dataclass Access

```python
import nim_mmcif

# Parse with dataclass support for cleaner dot notation access
data = nim_mmcif.parse_mmcif("path/to/file.mmcif", as_dataclass=True)
print(f"Found {data.atom_count} atoms")

# Access atom properties using dot notation
first_atom = data.atoms[0]
print(f"Atom {first_atom.id}: {first_atom.label_atom_id}")
print(f"Position: ({first_atom.x}, {first_atom.y}, {first_atom.z})")
print(f"Chain: {first_atom.label_asym_id}, Residue: {first_atom.label_comp_id}")

# Use convenience properties and methods
print(f"Unique chains: {data.chains}")
print(f"Number of residues: {len(data.residues)}")

# Get all atoms from a specific chain
chain_a_atoms = data.get_chain('A')

# Get all atoms from a specific residue
residue_atoms = data.get_residue('A', 1)

# Get all positions as tuples
positions = data.positions  # List of (x, y, z) tuples

# Batch processing with dataclasses
results = nim_mmcif.parse_mmcif_batch(["file1.mmcif", "file2.mmcif"], as_dataclass=True)
for result in results:
    print(f"Structure has {result.atom_count} atoms in {len(result.chains)} chain(s)")
```

#### Other Functions

```python
# Get atom count directly
count = nim_mmcif.get_atom_count("path/to/file.mmcif")
print(f"File contains {count} atoms")

# Get all atoms with their properties (returns list of dicts)
atoms = nim_mmcif.get_atoms("path/to/file.mmcif")
for atom in atoms[:5]:  # Print first 5 atoms
    print(f"Atom {atom['id']}: {atom['label_atom_id']} at ({atom['x']}, {atom['y']}, {atom['z']})")

# Get just the 3D coordinates
positions = nim_mmcif.get_atom_positions("path/to/file.mmcif")
for i, (x, y, z) in enumerate(positions[:5]):
    print(f"Position {i}: ({x:.3f}, {y:.3f}, {z:.3f})")
```

### Nim Usage

```nim
import nim_mmcif/mmcif

# Parse an mmCIF file
let data = mmcif_parse("path/to/file.mmcif")
echo "Found ", data.atoms.len, " atoms"

# Iterate through atoms
for atom in data.atoms[0..<min(5, data.atoms.len)]:
  echo "Atom ", atom.id, ": ", atom.label_atom_id, 
       " at (", atom.Cartn_x, ", ", atom.Cartn_y, ", ", atom.Cartn_z, ")"

# Access specific atom properties
if data.atoms.len > 0:
  let firstAtom = data.atoms[0]
  echo "Chain: ", firstAtom.label_asym_id
  echo "Residue: ", firstAtom.label_comp_id
  echo "B-factor: ", firstAtom.B_iso_or_equiv
```

### Batch Processing

Process multiple mmCIF files efficiently in a single operation:

```python
import nim_mmcif

# List of mmCIF files to process
files = [
    "path/to/structure1.mmcif",
    "path/to/structure2.mmcif",
    "path/to/structure3.mmcif"
]

# Parse all files in batch (returns list when no globs used)
results = nim_mmcif.parse_mmcif_batch(files)

# Process results
for i, data in enumerate(results):
    print(f"Structure {i+1}: {len(data['atoms'])} atoms")
    
    # Analyze each structure
    atoms = data['atoms']
    if atoms:
        # Get unique chain IDs
        chains = set(atom['label_asym_id'] for atom in atoms)
        print(f"  Chains: {', '.join(sorted(chains))}")
        
        # Count residues
        residues = set((atom['label_asym_id'], atom['label_seq_id']) 
                      for atom in atoms)
        print(f"  Residues: {len(residues)}")

# Batch processing with glob patterns (returns dict)
results = nim_mmcif.parse_mmcif_batch("path/to/*.mmcif")
for filepath, data in results.items():
    print(f"{filepath}: {len(data['atoms'])} atoms")

# Mix of glob patterns and regular paths (returns dict)
results = nim_mmcif.parse_mmcif_batch([
    "specific_file.mmcif",
    "structures/*.mmcif",
    "models/model_?.mmcif"
])
for filepath, data in results.items():
    print(f"{filepath}: {len(data['atoms'])} atoms")
```

Batch processing is particularly useful when:
- Analyzing multiple protein structures for comparative studies
- Processing entire datasets of crystallographic structures
- Building machine learning datasets from PDB files
- Performing high-throughput structural analysis

The batch function provides better performance than individual parsing when processing multiple files, as it reduces the overhead of repeated function calls.

## API Reference

### Functions

#### `parse_mmcif(filepath: str, as_dataclass: bool = False) -> dict | MmcifData | dict[str, dict] | dict[str, MmcifData]`
Parse an mmCIF file or files matching a glob pattern.
- **filepath**: Path to mmCIF file or glob pattern
- **as_dataclass**: If True, returns MmcifData dataclass(es) with dot notation access
- **Returns**:
  - Single file + dict: Dictionary with 'atoms' key
  - Single file + dataclass: MmcifData instance
  - Glob pattern + dict: Dictionary mapping file paths to parsed data
  - Glob pattern + dataclass: Dictionary mapping file paths to MmcifData instances
- Supports wildcards: `*` (any characters), `?` (single character), `**` (recursive)

#### `parse_mmcif_batch(filepaths: list[str] | str, as_dataclass: bool = False) -> list[dict] | list[MmcifData] | dict[str, dict] | dict[str, MmcifData]`
Parse multiple mmCIF files in a single operation.
- **filepaths**: List of paths, single path, or glob pattern
- **as_dataclass**: If True, returns MmcifData dataclass(es) with dot notation access
- **Returns**:
  - No glob + dict: List of dictionaries with parsed data
  - No glob + dataclass: List of MmcifData instances
  - With glob + dict: Dictionary mapping file paths to parsed data
  - With glob + dataclass: Dictionary mapping file paths to MmcifData instances
- More efficient than parsing files individually when processing multiple structures

#### `get_atom_count(filepath: str) -> int`
Get the number of atoms in an mmCIF file.

#### `get_atoms(filepath: str) -> list[dict]`
Get all atoms from an mmCIF file as a list of dictionaries.

#### `get_atom_positions(filepath: str) -> list[tuple[float, float, float]]`
Get 3D coordinates of all atoms as a list of (x, y, z) tuples.

### Dataclasses

#### `MmcifData`
Container for parsed mmCIF data with typed atom access.

**Properties:**
- `atoms`: List of Atom objects
- `atom_count`: Total number of atoms
- `positions`: List of (x, y, z) tuples for all atoms
- `chains`: Set of unique chain identifiers
- `residues`: Set of unique (chain_id, seq_id) tuples

**Methods:**
- `get_chain(chain_id: str)`: Get all atoms from a specific chain
- `get_residue(chain_id: str, seq_id: int)`: Get all atoms from a specific residue
- `to_dict()`: Convert back to dictionary format

#### `Atom`
Represents a single atom with typed properties accessible via dot notation.

**Properties:**
- `type`: Record type (ATOM or HETATM)
- `id`: Atom serial number
- `type_symbol`: Element symbol
- `label_atom_id`: Atom name
- `label_comp_id`: Residue name
- `label_asym_id`: Chain identifier
- `label_entity_id`: Entity ID
- `label_seq_id`: Residue sequence number
- `Cartn_x`, `Cartn_y`, `Cartn_z`: 3D coordinates
- `x`, `y`, `z`: Convenient aliases for coordinates
- `occupancy`: Occupancy factor
- `B_iso_or_equiv`: B-factor (temperature factor)
- `position`: Tuple of (x, y, z) coordinates

**Methods:**
- `to_dict()`: Convert back to dictionary format

### Dictionary Format

When using the default dictionary format (as_dataclass=False), each atom dictionary contains:
- `type`: Record type (ATOM or HETATM)
- `id`: Atom serial number
- `label_atom_id`: Atom name
- `label_comp_id`: Residue name
- `label_asym_id`: Chain identifier
- `label_seq_id`: Residue sequence number
- `x`, `y`, `z`: 3D coordinates (aliases for Cartn_x, Cartn_y, Cartn_z)
- `occupancy`: Occupancy factor
- `B_iso_or_equiv`: B-factor
- And more...

## Platform Support

| Platform | Architecture | Python | Status |
|----------|-------------|--------|--------|
| Linux    | x64, ARM64  | 3.8-3.12 | ✅ |
| macOS    | x64, ARM64  | 3.8-3.12 | ✅ |
| Windows  | x64         | 3.8-3.12 | ✅ |

## Building from Source

### Automatic Build

```bash
python build_nim.py
```

### Manual Build

```bash
# Build using nimble tasks
nimble build         # Build debug version
nimble buildRelease  # Build optimized release version
```

## Development

### Running Tests

```bash
pip install pytest
pytest tests/ -v
```

### Contributing

1. Fork the repository
2. Create a feature branch
3. Make your changes
4. Run tests
5. Submit a pull request

## Documentation

- [Cross-Platform Guide](CROSS_PLATFORM.md) - Platform-specific build instructions

## Performance

The Nim implementation provides significant performance improvements over pure Python parsers, especially for large mmCIF files commonly used in structural biology.

## License

MIT License - see [LICENSE](LICENSE) file for details.

## Acknowledgments

- Built with [Nim](https://nim-lang.org/) for high performance
- Python integration via [nimporter](https://github.com/Pebaz/nimporter) and [nimpy](https://github.com/yglukhov/nimpy)
- mmCIF format specification from [wwPDB](https://www.wwpdb.org/)

            

Raw data

            {
    "_id": null,
    "home_page": null,
    "name": "nim-mmcif",
    "maintainer": null,
    "docs_url": null,
    "requires_python": ">=3.8",
    "maintainer_email": null,
    "keywords": "mmcif, cif, protein, structure, bioinformatics, structural-biology, parser, crystallography, nim, pdb",
    "author": null,
    "author_email": "lucidrains <lucidrains@gmail.com>",
    "download_url": "https://files.pythonhosted.org/packages/c2/b7/fb154a2348a8a135a5c5a5ced270e9670fb86ae5f9cfe3df5d317ef6ab47/nim_mmcif-0.0.18.tar.gz",
    "platform": null,
    "description": "# nim-mmcif\n\nFast mmCIF (Macromolecular Crystallographic Information File) parser written in Nim with Python bindings\n\nThe goal of this repository is to experiment with vibe coding while building something useful for bioinformatics community, to see how much of a cross platform library can be driven to completion by transformers\n\n## Features\n\n- \ud83d\ude80 High-performance parsing of mmCIF files using Nim\n- \ud83c\udf0d Cross-platform support (Linux, macOS, Windows)\n- \ud83d\udce6 Easy installation via pip\n\n## Installation\n\n### Prerequisites\n\n- Python 3.8 or higher\n- Nim compiler (see [platform-specific instructions](CROSS_PLATFORM.md))\n\n### From PyPI\n\n```bash\npip install nim-mmcif\n```\n\n### From Source\n\n```bash\n# Install Nim (platform-specific, see below)\n# macOS: brew install nim\n# Linux: curl https://nim-lang.org/choosenim/init.sh -sSf | sh\n# Windows: scoop install nim\n\n# Install the package\ngit clone https://github.com/lucidrains/nim-mmcif\ncd nim-mmcif\npip install -e .\n```\n\nFor detailed platform-specific instructions, see [CROSS_PLATFORM.md](CROSS_PLATFORM.md).\n\n## Quick Start\n\n### Python Usage\n\n#### Dictionary Access\n\n```python\nimport nim_mmcif\n\n# Parse an mmCIF file (returns dict by default)\ndata = nim_mmcif.parse_mmcif(\"path/to/file.mmcif\")\nprint(f\"Found {len(data['atoms'])} atoms\")\n\n# Access atom properties using dictionary notation\nfirst_atom = data['atoms'][0]\nprint(f\"Atom {first_atom['id']}: {first_atom['label_atom_id']}\")\nprint(f\"Position: ({first_atom['x']}, {first_atom['y']}, {first_atom['z']})\")\n\n# Parse multiple files using glob patterns\nresults = nim_mmcif.parse_mmcif(\"path/to/*.mmcif\")\nfor filepath, data in results.items():\n    print(f\"{filepath}: {len(data['atoms'])} atoms\")\n```\n\n#### Dataclass Access\n\n```python\nimport nim_mmcif\n\n# Parse with dataclass support for cleaner dot notation access\ndata = nim_mmcif.parse_mmcif(\"path/to/file.mmcif\", as_dataclass=True)\nprint(f\"Found {data.atom_count} atoms\")\n\n# Access atom properties using dot notation\nfirst_atom = data.atoms[0]\nprint(f\"Atom {first_atom.id}: {first_atom.label_atom_id}\")\nprint(f\"Position: ({first_atom.x}, {first_atom.y}, {first_atom.z})\")\nprint(f\"Chain: {first_atom.label_asym_id}, Residue: {first_atom.label_comp_id}\")\n\n# Use convenience properties and methods\nprint(f\"Unique chains: {data.chains}\")\nprint(f\"Number of residues: {len(data.residues)}\")\n\n# Get all atoms from a specific chain\nchain_a_atoms = data.get_chain('A')\n\n# Get all atoms from a specific residue\nresidue_atoms = data.get_residue('A', 1)\n\n# Get all positions as tuples\npositions = data.positions  # List of (x, y, z) tuples\n\n# Batch processing with dataclasses\nresults = nim_mmcif.parse_mmcif_batch([\"file1.mmcif\", \"file2.mmcif\"], as_dataclass=True)\nfor result in results:\n    print(f\"Structure has {result.atom_count} atoms in {len(result.chains)} chain(s)\")\n```\n\n#### Other Functions\n\n```python\n# Get atom count directly\ncount = nim_mmcif.get_atom_count(\"path/to/file.mmcif\")\nprint(f\"File contains {count} atoms\")\n\n# Get all atoms with their properties (returns list of dicts)\natoms = nim_mmcif.get_atoms(\"path/to/file.mmcif\")\nfor atom in atoms[:5]:  # Print first 5 atoms\n    print(f\"Atom {atom['id']}: {atom['label_atom_id']} at ({atom['x']}, {atom['y']}, {atom['z']})\")\n\n# Get just the 3D coordinates\npositions = nim_mmcif.get_atom_positions(\"path/to/file.mmcif\")\nfor i, (x, y, z) in enumerate(positions[:5]):\n    print(f\"Position {i}: ({x:.3f}, {y:.3f}, {z:.3f})\")\n```\n\n### Nim Usage\n\n```nim\nimport nim_mmcif/mmcif\n\n# Parse an mmCIF file\nlet data = mmcif_parse(\"path/to/file.mmcif\")\necho \"Found \", data.atoms.len, \" atoms\"\n\n# Iterate through atoms\nfor atom in data.atoms[0..<min(5, data.atoms.len)]:\n  echo \"Atom \", atom.id, \": \", atom.label_atom_id, \n       \" at (\", atom.Cartn_x, \", \", atom.Cartn_y, \", \", atom.Cartn_z, \")\"\n\n# Access specific atom properties\nif data.atoms.len > 0:\n  let firstAtom = data.atoms[0]\n  echo \"Chain: \", firstAtom.label_asym_id\n  echo \"Residue: \", firstAtom.label_comp_id\n  echo \"B-factor: \", firstAtom.B_iso_or_equiv\n```\n\n### Batch Processing\n\nProcess multiple mmCIF files efficiently in a single operation:\n\n```python\nimport nim_mmcif\n\n# List of mmCIF files to process\nfiles = [\n    \"path/to/structure1.mmcif\",\n    \"path/to/structure2.mmcif\",\n    \"path/to/structure3.mmcif\"\n]\n\n# Parse all files in batch (returns list when no globs used)\nresults = nim_mmcif.parse_mmcif_batch(files)\n\n# Process results\nfor i, data in enumerate(results):\n    print(f\"Structure {i+1}: {len(data['atoms'])} atoms\")\n    \n    # Analyze each structure\n    atoms = data['atoms']\n    if atoms:\n        # Get unique chain IDs\n        chains = set(atom['label_asym_id'] for atom in atoms)\n        print(f\"  Chains: {', '.join(sorted(chains))}\")\n        \n        # Count residues\n        residues = set((atom['label_asym_id'], atom['label_seq_id']) \n                      for atom in atoms)\n        print(f\"  Residues: {len(residues)}\")\n\n# Batch processing with glob patterns (returns dict)\nresults = nim_mmcif.parse_mmcif_batch(\"path/to/*.mmcif\")\nfor filepath, data in results.items():\n    print(f\"{filepath}: {len(data['atoms'])} atoms\")\n\n# Mix of glob patterns and regular paths (returns dict)\nresults = nim_mmcif.parse_mmcif_batch([\n    \"specific_file.mmcif\",\n    \"structures/*.mmcif\",\n    \"models/model_?.mmcif\"\n])\nfor filepath, data in results.items():\n    print(f\"{filepath}: {len(data['atoms'])} atoms\")\n```\n\nBatch processing is particularly useful when:\n- Analyzing multiple protein structures for comparative studies\n- Processing entire datasets of crystallographic structures\n- Building machine learning datasets from PDB files\n- Performing high-throughput structural analysis\n\nThe batch function provides better performance than individual parsing when processing multiple files, as it reduces the overhead of repeated function calls.\n\n## API Reference\n\n### Functions\n\n#### `parse_mmcif(filepath: str, as_dataclass: bool = False) -> dict | MmcifData | dict[str, dict] | dict[str, MmcifData]`\nParse an mmCIF file or files matching a glob pattern.\n- **filepath**: Path to mmCIF file or glob pattern\n- **as_dataclass**: If True, returns MmcifData dataclass(es) with dot notation access\n- **Returns**:\n  - Single file + dict: Dictionary with 'atoms' key\n  - Single file + dataclass: MmcifData instance\n  - Glob pattern + dict: Dictionary mapping file paths to parsed data\n  - Glob pattern + dataclass: Dictionary mapping file paths to MmcifData instances\n- Supports wildcards: `*` (any characters), `?` (single character), `**` (recursive)\n\n#### `parse_mmcif_batch(filepaths: list[str] | str, as_dataclass: bool = False) -> list[dict] | list[MmcifData] | dict[str, dict] | dict[str, MmcifData]`\nParse multiple mmCIF files in a single operation.\n- **filepaths**: List of paths, single path, or glob pattern\n- **as_dataclass**: If True, returns MmcifData dataclass(es) with dot notation access\n- **Returns**:\n  - No glob + dict: List of dictionaries with parsed data\n  - No glob + dataclass: List of MmcifData instances\n  - With glob + dict: Dictionary mapping file paths to parsed data\n  - With glob + dataclass: Dictionary mapping file paths to MmcifData instances\n- More efficient than parsing files individually when processing multiple structures\n\n#### `get_atom_count(filepath: str) -> int`\nGet the number of atoms in an mmCIF file.\n\n#### `get_atoms(filepath: str) -> list[dict]`\nGet all atoms from an mmCIF file as a list of dictionaries.\n\n#### `get_atom_positions(filepath: str) -> list[tuple[float, float, float]]`\nGet 3D coordinates of all atoms as a list of (x, y, z) tuples.\n\n### Dataclasses\n\n#### `MmcifData`\nContainer for parsed mmCIF data with typed atom access.\n\n**Properties:**\n- `atoms`: List of Atom objects\n- `atom_count`: Total number of atoms\n- `positions`: List of (x, y, z) tuples for all atoms\n- `chains`: Set of unique chain identifiers\n- `residues`: Set of unique (chain_id, seq_id) tuples\n\n**Methods:**\n- `get_chain(chain_id: str)`: Get all atoms from a specific chain\n- `get_residue(chain_id: str, seq_id: int)`: Get all atoms from a specific residue\n- `to_dict()`: Convert back to dictionary format\n\n#### `Atom`\nRepresents a single atom with typed properties accessible via dot notation.\n\n**Properties:**\n- `type`: Record type (ATOM or HETATM)\n- `id`: Atom serial number\n- `type_symbol`: Element symbol\n- `label_atom_id`: Atom name\n- `label_comp_id`: Residue name\n- `label_asym_id`: Chain identifier\n- `label_entity_id`: Entity ID\n- `label_seq_id`: Residue sequence number\n- `Cartn_x`, `Cartn_y`, `Cartn_z`: 3D coordinates\n- `x`, `y`, `z`: Convenient aliases for coordinates\n- `occupancy`: Occupancy factor\n- `B_iso_or_equiv`: B-factor (temperature factor)\n- `position`: Tuple of (x, y, z) coordinates\n\n**Methods:**\n- `to_dict()`: Convert back to dictionary format\n\n### Dictionary Format\n\nWhen using the default dictionary format (as_dataclass=False), each atom dictionary contains:\n- `type`: Record type (ATOM or HETATM)\n- `id`: Atom serial number\n- `label_atom_id`: Atom name\n- `label_comp_id`: Residue name\n- `label_asym_id`: Chain identifier\n- `label_seq_id`: Residue sequence number\n- `x`, `y`, `z`: 3D coordinates (aliases for Cartn_x, Cartn_y, Cartn_z)\n- `occupancy`: Occupancy factor\n- `B_iso_or_equiv`: B-factor\n- And more...\n\n## Platform Support\n\n| Platform | Architecture | Python | Status |\n|----------|-------------|--------|--------|\n| Linux    | x64, ARM64  | 3.8-3.12 | \u2705 |\n| macOS    | x64, ARM64  | 3.8-3.12 | \u2705 |\n| Windows  | x64         | 3.8-3.12 | \u2705 |\n\n## Building from Source\n\n### Automatic Build\n\n```bash\npython build_nim.py\n```\n\n### Manual Build\n\n```bash\n# Build using nimble tasks\nnimble build         # Build debug version\nnimble buildRelease  # Build optimized release version\n```\n\n## Development\n\n### Running Tests\n\n```bash\npip install pytest\npytest tests/ -v\n```\n\n### Contributing\n\n1. Fork the repository\n2. Create a feature branch\n3. Make your changes\n4. Run tests\n5. Submit a pull request\n\n## Documentation\n\n- [Cross-Platform Guide](CROSS_PLATFORM.md) - Platform-specific build instructions\n\n## Performance\n\nThe Nim implementation provides significant performance improvements over pure Python parsers, especially for large mmCIF files commonly used in structural biology.\n\n## License\n\nMIT License - see [LICENSE](LICENSE) file for details.\n\n## Acknowledgments\n\n- Built with [Nim](https://nim-lang.org/) for high performance\n- Python integration via [nimporter](https://github.com/Pebaz/nimporter) and [nimpy](https://github.com/yglukhov/nimpy)\n- mmCIF format specification from [wwPDB](https://www.wwpdb.org/)\n",
    "bugtrack_url": null,
    "license": "MIT",
    "summary": "mmCIF parser written in Nim with Python bindings",
    "version": "0.0.18",
    "project_urls": {
        "Bug Tracker": "https://github.com/lucidrains/nim-mmcif/issues",
        "Homepage": "https://github.com/lucidrains/nim-mmcif",
        "Source Code": "https://github.com/lucidrains/nim-mmcif"
    },
    "split_keywords": [
        "mmcif",
        " cif",
        " protein",
        " structure",
        " bioinformatics",
        " structural-biology",
        " parser",
        " crystallography",
        " nim",
        " pdb"
    ],
    "urls": [
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "66a6f74a5d952f73c3c79151e332458eb4279bc036d3468cc9ea7ab9540c5b6b",
                "md5": "e21fa612cc5ccec6a09843d4b0fca85b",
                "sha256": "ce9587084c683b4517e99583b6cd5d3f0c802c7ee354ef16add28d29b6ab55a5"
            },
            "downloads": -1,
            "filename": "nim_mmcif-0.0.18-cp310-cp310-macosx_10_9_x86_64.whl",
            "has_sig": false,
            "md5_digest": "e21fa612cc5ccec6a09843d4b0fca85b",
            "packagetype": "bdist_wheel",
            "python_version": "cp310",
            "requires_python": ">=3.8",
            "size": 65736,
            "upload_time": "2025-08-24T00:06:24",
            "upload_time_iso_8601": "2025-08-24T00:06:24.289598Z",
            "url": "https://files.pythonhosted.org/packages/66/a6/f74a5d952f73c3c79151e332458eb4279bc036d3468cc9ea7ab9540c5b6b/nim_mmcif-0.0.18-cp310-cp310-macosx_10_9_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "2b6ef2d3f51da8b109deb7fa2c54fdf9735e4154d2d292c7adeb6cddbaf86505",
                "md5": "be7c5f22527923cee0c3cd8aa94b9202",
                "sha256": "d799d4e254965d179566ddc052ada31e04d7c1e12876ef905d1870c05c105617"
            },
            "downloads": -1,
            "filename": "nim_mmcif-0.0.18-cp310-cp310-macosx_11_0_arm64.whl",
            "has_sig": false,
            "md5_digest": "be7c5f22527923cee0c3cd8aa94b9202",
            "packagetype": "bdist_wheel",
            "python_version": "cp310",
            "requires_python": ">=3.8",
            "size": 65932,
            "upload_time": "2025-08-24T00:06:25",
            "upload_time_iso_8601": "2025-08-24T00:06:25.729628Z",
            "url": "https://files.pythonhosted.org/packages/2b/6e/f2d3f51da8b109deb7fa2c54fdf9735e4154d2d292c7adeb6cddbaf86505/nim_mmcif-0.0.18-cp310-cp310-macosx_11_0_arm64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "3231f259a3deeb23a170f50903abd8ab9588b4807623190e13aca1dfdfc2c7b7",
                "md5": "a0e4ffa0d988619d7098ce687f6bf051",
                "sha256": "cc8b2d804d752e2b4315988d2e34f03c8c1b606dfa62cb66d54e931ecb85a51a"
            },
            "downloads": -1,
            "filename": "nim_mmcif-0.0.18-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl",
            "has_sig": false,
            "md5_digest": "a0e4ffa0d988619d7098ce687f6bf051",
            "packagetype": "bdist_wheel",
            "python_version": "cp310",
            "requires_python": ">=3.8",
            "size": 93074,
            "upload_time": "2025-08-24T00:06:26",
            "upload_time_iso_8601": "2025-08-24T00:06:26.726436Z",
            "url": "https://files.pythonhosted.org/packages/32/31/f259a3deeb23a170f50903abd8ab9588b4807623190e13aca1dfdfc2c7b7/nim_mmcif-0.0.18-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "e99ff7099148fd78a4fe9fb88900bcd75d88ac0fec80790358115ef32e7eaa4a",
                "md5": "af7727bcf2d73964d780ac63dac9d71e",
                "sha256": "474f5b1b17c14b179ea4dd1613b4b943b4012808ab40c4f58ea54a10ee211bfe"
            },
            "downloads": -1,
            "filename": "nim_mmcif-0.0.18-cp311-cp311-macosx_10_9_x86_64.whl",
            "has_sig": false,
            "md5_digest": "af7727bcf2d73964d780ac63dac9d71e",
            "packagetype": "bdist_wheel",
            "python_version": "cp311",
            "requires_python": ">=3.8",
            "size": 65738,
            "upload_time": "2025-08-24T00:06:27",
            "upload_time_iso_8601": "2025-08-24T00:06:27.847061Z",
            "url": "https://files.pythonhosted.org/packages/e9/9f/f7099148fd78a4fe9fb88900bcd75d88ac0fec80790358115ef32e7eaa4a/nim_mmcif-0.0.18-cp311-cp311-macosx_10_9_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "09ea5b0068afb3bb06306446fddc8058a439263aef776ded03e144c229f52b65",
                "md5": "24c405b98afaa2b43723c454b00194d8",
                "sha256": "43707ca813e70760fef3d57bbc1f89a0ba87dd0d90bb065969c2b7d42c79dab0"
            },
            "downloads": -1,
            "filename": "nim_mmcif-0.0.18-cp311-cp311-macosx_11_0_arm64.whl",
            "has_sig": false,
            "md5_digest": "24c405b98afaa2b43723c454b00194d8",
            "packagetype": "bdist_wheel",
            "python_version": "cp311",
            "requires_python": ">=3.8",
            "size": 65936,
            "upload_time": "2025-08-24T00:06:28",
            "upload_time_iso_8601": "2025-08-24T00:06:28.922614Z",
            "url": "https://files.pythonhosted.org/packages/09/ea/5b0068afb3bb06306446fddc8058a439263aef776ded03e144c229f52b65/nim_mmcif-0.0.18-cp311-cp311-macosx_11_0_arm64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "75d61cc56f41a5165dafa92f3831d54b6d80c23a27996d897a27184fc0421993",
                "md5": "39047b83d33f62416982410a4bb93fd5",
                "sha256": "11fcb5688b3b89758c84e0cd2d27e314bb5c11e82d64cd87ec557a7c502351cd"
            },
            "downloads": -1,
            "filename": "nim_mmcif-0.0.18-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl",
            "has_sig": false,
            "md5_digest": "39047b83d33f62416982410a4bb93fd5",
            "packagetype": "bdist_wheel",
            "python_version": "cp311",
            "requires_python": ">=3.8",
            "size": 93084,
            "upload_time": "2025-08-24T00:06:31",
            "upload_time_iso_8601": "2025-08-24T00:06:31.877205Z",
            "url": "https://files.pythonhosted.org/packages/75/d6/1cc56f41a5165dafa92f3831d54b6d80c23a27996d897a27184fc0421993/nim_mmcif-0.0.18-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "579976a987f328d059a0c489227da7e771f7b5822177090cad95b1325f260bcd",
                "md5": "e1effe80879df872e809d86a2633133c",
                "sha256": "e496e2c7d31a82ca3b5e071736c134c9318e673e21f0149f53e7dd8b92e9740c"
            },
            "downloads": -1,
            "filename": "nim_mmcif-0.0.18-cp312-cp312-macosx_10_9_x86_64.whl",
            "has_sig": false,
            "md5_digest": "e1effe80879df872e809d86a2633133c",
            "packagetype": "bdist_wheel",
            "python_version": "cp312",
            "requires_python": ">=3.8",
            "size": 65733,
            "upload_time": "2025-08-24T00:06:32",
            "upload_time_iso_8601": "2025-08-24T00:06:32.936893Z",
            "url": "https://files.pythonhosted.org/packages/57/99/76a987f328d059a0c489227da7e771f7b5822177090cad95b1325f260bcd/nim_mmcif-0.0.18-cp312-cp312-macosx_10_9_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "1f69ae3ffafd89e7b95d10053bac027d0c5e2b7f6d9306de14f73631558e5619",
                "md5": "f5dc44dacde635c171d88b13b3c4cb3b",
                "sha256": "7baca38215b37e2e15490f6fdf663af7b3efb954b0d8d061de1ad297531f5960"
            },
            "downloads": -1,
            "filename": "nim_mmcif-0.0.18-cp312-cp312-macosx_11_0_arm64.whl",
            "has_sig": false,
            "md5_digest": "f5dc44dacde635c171d88b13b3c4cb3b",
            "packagetype": "bdist_wheel",
            "python_version": "cp312",
            "requires_python": ">=3.8",
            "size": 65931,
            "upload_time": "2025-08-24T00:06:33",
            "upload_time_iso_8601": "2025-08-24T00:06:33.987554Z",
            "url": "https://files.pythonhosted.org/packages/1f/69/ae3ffafd89e7b95d10053bac027d0c5e2b7f6d9306de14f73631558e5619/nim_mmcif-0.0.18-cp312-cp312-macosx_11_0_arm64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "ae67f59b99e44cfed673ede42810474c07c5fc33972ac4372df308d85b8968aa",
                "md5": "c57dfdeb4e6d98cc679d0524f8c821e8",
                "sha256": "7848d8c4b8e090d5383e78b6acc4df677a1be940f741c8a5941411232d86f215"
            },
            "downloads": -1,
            "filename": "nim_mmcif-0.0.18-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl",
            "has_sig": false,
            "md5_digest": "c57dfdeb4e6d98cc679d0524f8c821e8",
            "packagetype": "bdist_wheel",
            "python_version": "cp312",
            "requires_python": ">=3.8",
            "size": 93246,
            "upload_time": "2025-08-24T00:06:35",
            "upload_time_iso_8601": "2025-08-24T00:06:35.108629Z",
            "url": "https://files.pythonhosted.org/packages/ae/67/f59b99e44cfed673ede42810474c07c5fc33972ac4372df308d85b8968aa/nim_mmcif-0.0.18-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "9a602140b52affe742c32a1c71811a1e9e70817b8b75848c018ee135200107f6",
                "md5": "b7557fca9280738e990987ed68a9fcdc",
                "sha256": "1598eb5f6e3085f92382ffece39c64d6e483c559223457f145b66933c03e9490"
            },
            "downloads": -1,
            "filename": "nim_mmcif-0.0.18-cp38-cp38-macosx_10_9_x86_64.whl",
            "has_sig": false,
            "md5_digest": "b7557fca9280738e990987ed68a9fcdc",
            "packagetype": "bdist_wheel",
            "python_version": "cp38",
            "requires_python": ">=3.8",
            "size": 16102,
            "upload_time": "2025-08-24T00:06:36",
            "upload_time_iso_8601": "2025-08-24T00:06:36.217501Z",
            "url": "https://files.pythonhosted.org/packages/9a/60/2140b52affe742c32a1c71811a1e9e70817b8b75848c018ee135200107f6/nim_mmcif-0.0.18-cp38-cp38-macosx_10_9_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "1f2adf922321d667c781ec46c136c9d4212b45110d71add7dc88342be4510941",
                "md5": "9ec1c5f5579c25e811d12f86d4e28d1e",
                "sha256": "c4fb9bf1e5bfe405ad757ce2ccf1e2f51ae1a80028450433c465f6ef7712c9e2"
            },
            "downloads": -1,
            "filename": "nim_mmcif-0.0.18-cp38-cp38-macosx_11_0_arm64.whl",
            "has_sig": false,
            "md5_digest": "9ec1c5f5579c25e811d12f86d4e28d1e",
            "packagetype": "bdist_wheel",
            "python_version": "cp38",
            "requires_python": ">=3.8",
            "size": 16460,
            "upload_time": "2025-08-24T00:06:36",
            "upload_time_iso_8601": "2025-08-24T00:06:36.879790Z",
            "url": "https://files.pythonhosted.org/packages/1f/2a/df922321d667c781ec46c136c9d4212b45110d71add7dc88342be4510941/nim_mmcif-0.0.18-cp38-cp38-macosx_11_0_arm64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "c9789983fc7850e0c331ee0a9320bb38c7ac2debf8fe758e0087f0be6595a1aa",
                "md5": "11a99637c584bb4d172317c6a7c859c7",
                "sha256": "329b68c18d04fc6f13cca16992e8154e24dc2548d479a6362dc0037e16539e89"
            },
            "downloads": -1,
            "filename": "nim_mmcif-0.0.18-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_28_x86_64.whl",
            "has_sig": false,
            "md5_digest": "11a99637c584bb4d172317c6a7c859c7",
            "packagetype": "bdist_wheel",
            "python_version": "cp38",
            "requires_python": ">=3.8",
            "size": 21722,
            "upload_time": "2025-08-24T00:06:37",
            "upload_time_iso_8601": "2025-08-24T00:06:37.528871Z",
            "url": "https://files.pythonhosted.org/packages/c9/78/9983fc7850e0c331ee0a9320bb38c7ac2debf8fe758e0087f0be6595a1aa/nim_mmcif-0.0.18-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_28_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "dbe41c22b75b796c97be4b9efa4e68b762b35955a58b0a47dc90db3b3d9599fd",
                "md5": "eb03114ff2845a934b09e11b7e770be3",
                "sha256": "2a031f2cead6b44a96301febb6fe7f9b21dfb432a078ad5474237b5c3d1eba13"
            },
            "downloads": -1,
            "filename": "nim_mmcif-0.0.18-cp39-cp39-macosx_10_9_x86_64.whl",
            "has_sig": false,
            "md5_digest": "eb03114ff2845a934b09e11b7e770be3",
            "packagetype": "bdist_wheel",
            "python_version": "cp39",
            "requires_python": ">=3.8",
            "size": 65732,
            "upload_time": "2025-08-24T00:06:38",
            "upload_time_iso_8601": "2025-08-24T00:06:38.531910Z",
            "url": "https://files.pythonhosted.org/packages/db/e4/1c22b75b796c97be4b9efa4e68b762b35955a58b0a47dc90db3b3d9599fd/nim_mmcif-0.0.18-cp39-cp39-macosx_10_9_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "84c85e066d7837c603676c20f54fc87547dff09e6c2350bd8c65b70f90b91701",
                "md5": "a874cfad2ac0362ba2e15e914c89e3cf",
                "sha256": "12fe503adfa727762b5e4a46f3b3afa639fede70814b4c341821fdce75e6b304"
            },
            "downloads": -1,
            "filename": "nim_mmcif-0.0.18-cp39-cp39-macosx_11_0_arm64.whl",
            "has_sig": false,
            "md5_digest": "a874cfad2ac0362ba2e15e914c89e3cf",
            "packagetype": "bdist_wheel",
            "python_version": "cp39",
            "requires_python": ">=3.8",
            "size": 65929,
            "upload_time": "2025-08-24T00:06:39",
            "upload_time_iso_8601": "2025-08-24T00:06:39.663251Z",
            "url": "https://files.pythonhosted.org/packages/84/c8/5e066d7837c603676c20f54fc87547dff09e6c2350bd8c65b70f90b91701/nim_mmcif-0.0.18-cp39-cp39-macosx_11_0_arm64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "10fdc10b4d464175c044706017a608e4d2b849b88e8b6dc71d33cc8ac7a2b954",
                "md5": "7254bfac7f3ab57e895f5066e58ca68a",
                "sha256": "81d87b93b76bef3a37370284cac036cb295549a511793ee48106139fad6a115b"
            },
            "downloads": -1,
            "filename": "nim_mmcif-0.0.18-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl",
            "has_sig": false,
            "md5_digest": "7254bfac7f3ab57e895f5066e58ca68a",
            "packagetype": "bdist_wheel",
            "python_version": "cp39",
            "requires_python": ">=3.8",
            "size": 92923,
            "upload_time": "2025-08-24T00:06:40",
            "upload_time_iso_8601": "2025-08-24T00:06:40.777491Z",
            "url": "https://files.pythonhosted.org/packages/10/fd/c10b4d464175c044706017a608e4d2b849b88e8b6dc71d33cc8ac7a2b954/nim_mmcif-0.0.18-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "c2b7fb154a2348a8a135a5c5a5ced270e9670fb86ae5f9cfe3df5d317ef6ab47",
                "md5": "28bb01f68f1dcfbbec59584447b6ea2b",
                "sha256": "fbbe24b57a7c548981eb0200482a6f8455f0c21e02d920499f914daaf52765a2"
            },
            "downloads": -1,
            "filename": "nim_mmcif-0.0.18.tar.gz",
            "has_sig": false,
            "md5_digest": "28bb01f68f1dcfbbec59584447b6ea2b",
            "packagetype": "sdist",
            "python_version": "source",
            "requires_python": ">=3.8",
            "size": 24795,
            "upload_time": "2025-08-24T00:06:41",
            "upload_time_iso_8601": "2025-08-24T00:06:41.890717Z",
            "url": "https://files.pythonhosted.org/packages/c2/b7/fb154a2348a8a135a5c5a5ced270e9670fb86ae5f9cfe3df5d317ef6ab47/nim_mmcif-0.0.18.tar.gz",
            "yanked": false,
            "yanked_reason": null
        }
    ],
    "upload_time": "2025-08-24 00:06:41",
    "github": true,
    "gitlab": false,
    "bitbucket": false,
    "codeberg": false,
    "github_user": "lucidrains",
    "github_project": "nim-mmcif",
    "travis_ci": false,
    "coveralls": false,
    "github_actions": true,
    "lcname": "nim-mmcif"
}
        
Elapsed time: 1.29389s