<a id="gtars.refget"></a>

Type stubs and documentation for the gtars.refget module.

This file serves two purposes:

1. **Type Hints**: Provides type annotations for IDE autocomplete and static
   type checking tools like mypy.

2. **Documentation**: Contains Google-style docstrings that mkdocstrings uses
   to generate the API reference documentation website.

Note: The actual implementation is in Rust (gtars-python/src/refget/mod.rs)
and compiled via PyO3. This stub file provides the Python interface definition
and structured documentation that tools can parse properly.

<a id="gtars.refget.AlphabetType"></a>

## `AlphabetType`

```python
class AlphabetType
```

Bases: `Enum`

Represents the type of alphabet for a sequence.

### Attributes

- <a id="gtars.refget.AlphabetType.Dna2bit"></a>**`Dna2bit`** (*int*)
- <a id="gtars.refget.AlphabetType.Dna3bit"></a>**`Dna3bit`** (*int*)
- <a id="gtars.refget.AlphabetType.DnaIupac"></a>**`DnaIupac`** (*int*)
- <a id="gtars.refget.AlphabetType.Protein"></a>**`Protein`** (*int*)
- <a id="gtars.refget.AlphabetType.Ascii"></a>**`Ascii`** (*int*)
- <a id="gtars.refget.AlphabetType.Unknown"></a>**`Unknown`** (*int*)

### Methods

<a id="gtars.refget.AlphabetType.__str__"></a>

#### `__str__`

```python
def __str__() -> str
```

<a id="gtars.refget.FaiMetadata"></a>

## `FaiMetadata`

```python
class FaiMetadata
```

FASTA index (FAI) metadata for a sequence.

Contains the information needed to quickly seek to a sequence
in a FASTA file, compatible with samtools faidx format.

**Attributes:**

- `offset` (*int*): Byte offset of the first base in the FASTA file.
- `line_bases` (*int*): Number of bases per line.
- `line_bytes` (*int*): Number of bytes per line (including newline).

### Attributes

- <a id="gtars.refget.FaiMetadata.offset"></a>**`offset`** (*int*)
- <a id="gtars.refget.FaiMetadata.line_bases"></a>**`line_bases`** (*int*)
- <a id="gtars.refget.FaiMetadata.line_bytes"></a>**`line_bytes`** (*int*)

### Methods

<a id="gtars.refget.FaiMetadata.__repr__"></a>

#### `__repr__`

```python
def __repr__() -> str
```

<a id="gtars.refget.FaiMetadata.__str__"></a>

#### `__str__`

```python
def __str__() -> str
```

<a id="gtars.refget.FaiRecord"></a>

## `FaiRecord`

```python
class FaiRecord
```

A FASTA index record for a single sequence.

Represents one line of a .fai index file with sequence name,
length, and FAI metadata for random access.

**Attributes:**

- `name` (*str*): Sequence name.
- `length` (*int*): Sequence length in bases.
- `fai` (*Optional[[FaiMetadata](#gtars.refget.FaiMetadata)]*): FAI metadata (None for gzipped files).

### Attributes

- <a id="gtars.refget.FaiRecord.name"></a>**`name`** (*str*)
- <a id="gtars.refget.FaiRecord.length"></a>**`length`** (*int*)
- <a id="gtars.refget.FaiRecord.fai"></a>**`fai`** (*Optional[[FaiMetadata](#gtars.refget.FaiMetadata)]*)

### Methods

<a id="gtars.refget.FaiRecord.__repr__"></a>

#### `__repr__`

```python
def __repr__() -> str
```

<a id="gtars.refget.FaiRecord.__str__"></a>

#### `__str__`

```python
def __str__() -> str
```

<a id="gtars.refget.SequenceMetadata"></a>

## `SequenceMetadata`

```python
class SequenceMetadata
```

Metadata for a biological sequence.

Contains identifying information and computed digests for a sequence,
without the actual sequence data.

**Attributes:**

- `name` (*str*): Sequence name (first word of FASTA header).
- `description` (*Optional[str]*): Description from FASTA header (text after first whitespace).
- `length` (*int*): Length of the sequence in bases.
- `sha512t24u` (*str*): GA4GH SHA-512/24u digest (32-char base64url).
- `md5` (*str*): MD5 digest (32-char hex string).
- `alphabet` (*[AlphabetType](#gtars.refget.AlphabetType)*): Detected alphabet type (DNA, protein, etc.).
- `fai` (*Optional[[FaiMetadata](#gtars.refget.FaiMetadata)]*): FASTA index metadata if available.

### Attributes

- <a id="gtars.refget.SequenceMetadata.name"></a>**`name`** (*str*)
- <a id="gtars.refget.SequenceMetadata.description"></a>**`description`** (*Optional[str]*)
- <a id="gtars.refget.SequenceMetadata.length"></a>**`length`** (*int*)
- <a id="gtars.refget.SequenceMetadata.sha512t24u"></a>**`sha512t24u`** (*str*)
- <a id="gtars.refget.SequenceMetadata.md5"></a>**`md5`** (*str*)
- <a id="gtars.refget.SequenceMetadata.alphabet"></a>**`alphabet`** (*[AlphabetType](#gtars.refget.AlphabetType)*)
- <a id="gtars.refget.SequenceMetadata.fai"></a>**`fai`** (*Optional[[FaiMetadata](#gtars.refget.FaiMetadata)]*)

### Methods

<a id="gtars.refget.SequenceMetadata.__repr__"></a>

#### `__repr__`

```python
def __repr__() -> str
```

<a id="gtars.refget.SequenceMetadata.__str__"></a>

#### `__str__`

```python
def __str__() -> str
```

<a id="gtars.refget.SequenceRecord"></a>

## `SequenceRecord`

```python
class SequenceRecord
```

A record representing a biological sequence, including its metadata and optional data.

SequenceRecord can be either a "stub" (metadata only) or "full" (metadata + data).
Stubs are used for lazy-loading where sequence data is fetched on demand.

**Attributes:**

- `metadata` (*[SequenceMetadata](#gtars.refget.SequenceMetadata)*): Sequence metadata (name, length, digests).
- `sequence` (*Optional[bytes]*): Raw sequence data if loaded, None for stubs.
- `is_loaded` (*bool*): Whether sequence data is loaded (True) or just metadata (False).

### Attributes

- <a id="gtars.refget.SequenceRecord.metadata"></a>**`metadata`** (*[SequenceMetadata](#gtars.refget.SequenceMetadata)*)
- <a id="gtars.refget.SequenceRecord.sequence"></a>**`sequence`** (*Optional[bytes]*)

### Properties

<a id="gtars.refget.SequenceRecord.is_loaded"></a>

#### `is_loaded`

```python
@property
def is_loaded -> bool
```

Whether sequence data is loaded (true) or just metadata (false).

### Methods

<a id="gtars.refget.SequenceRecord.decode"></a>

#### `decode`

```python
def decode() -> Optional[str]
```

Decode and return the sequence data as a string.

For Full records with sequence data, returns the decoded sequence.
For Stub records without sequence data, returns None.

**Returns:**

- *Optional[str]*: Decoded sequence string if data is available, None otherwise.

<a id="gtars.refget.SequenceRecord.__repr__"></a>

#### `__repr__`

```python
def __repr__() -> str
```

<a id="gtars.refget.SequenceRecord.__str__"></a>

#### `__str__`

```python
def __str__() -> str
```

<a id="gtars.refget.SeqColDigestLvl1"></a>

## `SeqColDigestLvl1`

```python
class SeqColDigestLvl1
```

Level 1 digests for a sequence collection.

### Attributes

- <a id="gtars.refget.SeqColDigestLvl1.sequences_digest"></a>**`sequences_digest`** (*str*)
- <a id="gtars.refget.SeqColDigestLvl1.names_digest"></a>**`names_digest`** (*str*)
- <a id="gtars.refget.SeqColDigestLvl1.lengths_digest"></a>**`lengths_digest`** (*str*)

### Methods

<a id="gtars.refget.SeqColDigestLvl1.__repr__"></a>

#### `__repr__`

```python
def __repr__() -> str
```

<a id="gtars.refget.SeqColDigestLvl1.__str__"></a>

#### `__str__`

```python
def __str__() -> str
```

<a id="gtars.refget.SequenceCollectionMetadata"></a>

## `SequenceCollectionMetadata`

```python
class SequenceCollectionMetadata
```

Metadata for a sequence collection.

Contains the collection digest and level 1 digests for names, sequences, and lengths.
This is a lightweight representation of a collection without the actual sequence list.

**Attributes:**

- `digest` (*str*): The collection's SHA-512/24u digest.
- `n_sequences` (*int*): Number of sequences in the collection.
- `names_digest` (*str*): Level 1 digest of the names array.
- `sequences_digest` (*str*): Level 1 digest of the sequences array.
- `lengths_digest` (*str*): Level 1 digest of the lengths array.
- `name_length_pairs_digest` (*Optional[str]*): Ancillary digest (if computed).
- `sorted_name_length_pairs_digest` (*Optional[str]*): Ancillary digest (if computed).
- `sorted_sequences_digest` (*Optional[str]*): Ancillary digest (if computed).

### Attributes

- <a id="gtars.refget.SequenceCollectionMetadata.digest"></a>**`digest`** (*str*)
- <a id="gtars.refget.SequenceCollectionMetadata.n_sequences"></a>**`n_sequences`** (*int*)
- <a id="gtars.refget.SequenceCollectionMetadata.names_digest"></a>**`names_digest`** (*str*)
- <a id="gtars.refget.SequenceCollectionMetadata.sequences_digest"></a>**`sequences_digest`** (*str*)
- <a id="gtars.refget.SequenceCollectionMetadata.lengths_digest"></a>**`lengths_digest`** (*str*)
- <a id="gtars.refget.SequenceCollectionMetadata.name_length_pairs_digest"></a>**`name_length_pairs_digest`** (*Optional[str]*)
- <a id="gtars.refget.SequenceCollectionMetadata.sorted_name_length_pairs_digest"></a>**`sorted_name_length_pairs_digest`** (*Optional[str]*)
- <a id="gtars.refget.SequenceCollectionMetadata.sorted_sequences_digest"></a>**`sorted_sequences_digest`** (*Optional[str]*)

### Methods

<a id="gtars.refget.SequenceCollectionMetadata.__repr__"></a>

#### `__repr__`

```python
def __repr__() -> str
```

<a id="gtars.refget.SequenceCollectionMetadata.__str__"></a>

#### `__str__`

```python
def __str__() -> str
```

<a id="gtars.refget.ImportReport"></a>

## `ImportReport`

```python
class ImportReport
```

Result of importing one or more FASTA files.

These are genuine per-run counters describing what the import actually did,
unlike `RefgetStore.stats`, which is a snapshot of current RAM
residency.

`n_sequences_written + n_sequences_deduped` equals the total number of
sequence records seen across all *processed* files. Files short-circuited as
already-present collections (before their FASTA is ever opened) contribute
nothing to either counter.

**Attributes:**

- `collections` (*List[tuple[[SequenceCollectionMetadata](#gtars.refget.SequenceCollectionMetadata), bool]]*): Per-file `(SequenceCollectionMetadata, was_new)` results
  in expanded-input order.
- `n_sequences_written` (*int*): Sequences whose bytes were written this run
  (genuinely new content).
- `n_sequences_deduped` (*int*): Sequences already present by content digest, so no
  bytes were written.
- `n_collections_new` (*int*): Number of collections newly added this run.

### Attributes

- <a id="gtars.refget.ImportReport.collections"></a>**`collections`** (*List[tuple[[SequenceCollectionMetadata](#gtars.refget.SequenceCollectionMetadata), bool]]*)
- <a id="gtars.refget.ImportReport.n_sequences_written"></a>**`n_sequences_written`** (*int*)
- <a id="gtars.refget.ImportReport.n_sequences_deduped"></a>**`n_sequences_deduped`** (*int*)
- <a id="gtars.refget.ImportReport.n_collections_new"></a>**`n_collections_new`** (*int*)

### Methods

<a id="gtars.refget.ImportReport.__repr__"></a>

#### `__repr__`

```python
def __repr__() -> str
```

<a id="gtars.refget.ImportReport.__len__"></a>

#### `__len__`

```python
def __len__() -> int
```

<a id="gtars.refget.SequenceCollection"></a>

## `SequenceCollection`

```python
class SequenceCollection
```

A collection of biological sequences (e.g., a genome assembly).

SequenceCollection represents a set of sequences with collection-level
digests following the GA4GH seqcol specification. Supports iteration,
indexing, and len().

**Attributes:**

- `sequences` (*List[[SequenceRecord](#gtars.refget.SequenceRecord)]*): List of sequence records.
- `digest` (*str*): Collection-level SHA-512/24u digest (Level 2).
- `lvl1` (*[SeqColDigestLvl1](#gtars.refget.SeqColDigestLvl1)*): Level 1 digests for names, lengths, sequences.
- `file_path` (*Optional[str]*): Source file path if loaded from FASTA.

**Examples:**

Iterate over sequences:

```
for seq in collection:
    print(f"{seq.metadata.name}: {seq.metadata.length} bp")
```

Access by index:

```
first_seq = collection[0]
last_seq = collection[-1]
```

Get length:

```
n = len(collection)
```

### Attributes

- <a id="gtars.refget.SequenceCollection.sequences"></a>**`sequences`** (*List[[SequenceRecord](#gtars.refget.SequenceRecord)]*)
- <a id="gtars.refget.SequenceCollection.digest"></a>**`digest`** (*str*)
- <a id="gtars.refget.SequenceCollection.lvl1"></a>**`lvl1`** (*[SeqColDigestLvl1](#gtars.refget.SeqColDigestLvl1)*)
- <a id="gtars.refget.SequenceCollection.file_path"></a>**`file_path`** (*Optional[str]*)

### Methods

<a id="gtars.refget.SequenceCollection.write_fasta"></a>

#### `write_fasta`

```python
def write_fasta(file_path: str, line_width: Optional[int] = None) -> None
```

Write the collection to a FASTA file.

**Parameters:**

- `file_path` (*str*): Path to the output FASTA file.
- `line_width` (*Optional[int]*): Number of bases per line (default: 70). (default: `None`)

**Raises:**

- *IOError*: If any sequence doesn't have data loaded.

Example:

```
collection = load_fasta("genome.fa")
collection.write_fasta("output.fa")
collection.write_fasta("output.fa", line_width=60)
```

<a id="gtars.refget.SequenceCollection.__len__"></a>

#### `__len__`

```python
def __len__() -> int
```

<a id="gtars.refget.SequenceCollection.__getitem__"></a>

#### `__getitem__`

```python
def __getitem__(idx: int) -> SequenceRecord
```

<a id="gtars.refget.SequenceCollection.__iter__"></a>

#### `__iter__`

```python
def __iter__() -> Iterator[SequenceRecord]
```

<a id="gtars.refget.SequenceCollection.__repr__"></a>

#### `__repr__`

```python
def __repr__() -> str
```

<a id="gtars.refget.SequenceCollection.__str__"></a>

#### `__str__`

```python
def __str__() -> str
```

<a id="gtars.refget.RetrievedSequence"></a>

## `RetrievedSequence`

```python
class RetrievedSequence(sequence: str, chrom_name: str, start: int, end: int)
```

Represents a retrieved sequence segment with its metadata.

Returned by methods that extract subsequences from specific regions,
such as substrings_from_regions().

**Attributes:**

- `sequence` (*str*): The extracted sequence string.
- `chrom_name` (*str*): Chromosome/sequence name (e.g., "chr1").
- `start` (*int*): Start position (0-based, inclusive).
- `end` (*int*): End position (0-based, exclusive).

### Attributes

- <a id="gtars.refget.RetrievedSequence.sequence"></a>**`sequence`** (*str*)
- <a id="gtars.refget.RetrievedSequence.chrom_name"></a>**`chrom_name`** (*str*)
- <a id="gtars.refget.RetrievedSequence.start"></a>**`start`** (*int*)
- <a id="gtars.refget.RetrievedSequence.end"></a>**`end`** (*int*)

### Methods

<a id="gtars.refget.RetrievedSequence.__init__"></a>

#### `__init__`

```python
def __init__(sequence: str, chrom_name: str, start: int, end: int) -> None
```

<a id="gtars.refget.RetrievedSequence.__repr__"></a>

#### `__repr__`

```python
def __repr__() -> str
```

<a id="gtars.refget.RetrievedSequence.__str__"></a>

#### `__str__`

```python
def __str__() -> str
```

<a id="gtars.refget.SequenceStream"></a>

## `SequenceStream`

```python
class SequenceStream
```

Lazy, O(1)-memory stream over a (sub)sequence's decoded ASCII bases.

Produced by `RefgetStore.stream_sequence()` /
`ReadonlyRefgetStore.stream_sequence()` (flow 2). Iterating yields `str`
chunks of decoded bases as they are read from the backing source (resident
bytes, a local `.seq`, or a remote HTTP byte-range), so peak memory stays
bounded regardless of region length.

Example:

```
stream = store.stream_sequence("chr1_digest", 0, 1_000_000)
total = 0
for chunk in stream:
    total += len(chunk)
```

### Methods

<a id="gtars.refget.SequenceStream.__iter__"></a>

#### `__iter__`

```python
def __iter__() -> SequenceStream
```

<a id="gtars.refget.SequenceStream.__next__"></a>

#### `__next__`

```python
def __next__() -> str
```

<a id="gtars.refget.SequenceStream.read_all"></a>

#### `read_all`

```python
def read_all() -> str
```

Read and return all remaining bases as a single string.

Exhausts the stream; defeats the O(1)-memory guarantee for the size of
the result.

<a id="gtars.refget.StorageMode"></a>

## `StorageMode`

```python
class StorageMode
```

Bases: `Enum`

Defines how sequence data is stored in the Refget store.

:::note[Variants]
Raw: Store sequences as raw bytes (1 byte per base).
Encoded: Store sequences with 2-bit encoding (4 bases per byte).
:::

### Attributes

- <a id="gtars.refget.StorageMode.Raw"></a>**`Raw`** (*int*)
- <a id="gtars.refget.StorageMode.Encoded"></a>**`Encoded`** (*int*)

<a id="gtars.refget.FhrMetadata"></a>

## `FhrMetadata`

```python
class FhrMetadata(**kwargs: Any)
```

FAIR Headers Reference genome metadata for a sequence collection.

Fields match the FHR 1.0 specification. All fields are optional.
Note: `schema_version` is a number (int or float) per spec, passed as
a Python numeric type and stored as `serde_json::Number` internally.

### Attributes

- <a id="gtars.refget.FhrMetadata.genome"></a>**`genome`** (*Optional[str]*)
- <a id="gtars.refget.FhrMetadata.version"></a>**`version`** (*Optional[str]*)
- <a id="gtars.refget.FhrMetadata.masking"></a>**`masking`** (*Optional[str]*)
- <a id="gtars.refget.FhrMetadata.genome_synonym"></a>**`genome_synonym`** (*Optional[list[str]]*)
- <a id="gtars.refget.FhrMetadata.voucher_specimen"></a>**`voucher_specimen`** (*Optional[str]*)
- <a id="gtars.refget.FhrMetadata.documentation"></a>**`documentation`** (*Optional[str]*)
- <a id="gtars.refget.FhrMetadata.identifier"></a>**`identifier`** (*Optional[list[str]]*)
- <a id="gtars.refget.FhrMetadata.scholarly_article"></a>**`scholarly_article`** (*Optional[str]*)
- <a id="gtars.refget.FhrMetadata.funding"></a>**`funding`** (*Optional[str]*)

### Methods

<a id="gtars.refget.FhrMetadata.__init__"></a>

#### `__init__`

```python
def __init__(**kwargs: Any) -> None
```

<a id="gtars.refget.FhrMetadata.from_json"></a>

#### `from_json`

```python
@staticmethod
def from_json(path: str) -> FhrMetadata
```

<a id="gtars.refget.FhrMetadata.to_dict"></a>

#### `to_dict`

```python
def to_dict() -> dict[str, Any]
```

<a id="gtars.refget.FhrMetadata.to_json"></a>

#### `to_json`

```python
def to_json(path: str) -> None
```

<a id="gtars.refget.FhrMetadata.__repr__"></a>

#### `__repr__`

```python
def __repr__() -> str
```

<a id="gtars.refget.RefgetStore"></a>

## `RefgetStore`

```python
class RefgetStore
```

A global store for GA4GH refget sequences with lazy-loading support.

RefgetStore provides content-addressable storage for reference genome
sequences following the GA4GH refget specification. Supports both local and
remote stores with on-demand sequence loading.

**Attributes:**

- `cache_path` (*Optional[str]*): Local directory path where the store is located or cached.
  None for in-memory stores.
- `remote_url` (*Optional[str]*): Remote URL of the store if loaded remotely, None otherwise.
- `quiet` (*bool*): Whether the store suppresses progress output.
- `storage_mode` (*[StorageMode](#gtars.refget.StorageMode)*): Current storage mode (Raw or Encoded).

:::note[Note]
**Boolean evaluation**: RefgetStore follows Python container semantics,
meaning `bool(store)` is `False` for empty stores (like `list`,
`dict`, etc.). To check if a store variable is initialized (not None),
use `if store is not None:` rather than `if store:`.

Example:

```
store = RefgetStore.in_memory()  # Empty store
bool(store)  # False (empty container)
len(store)   # 0

# Wrong: checks emptiness, not initialization
if store:
    process(store)

# Right: checks if variable is set
if store is not None:
    process(store)
```
:::

**Examples:**

Create a new store and import sequences:

```
from gtars.refget import RefgetStore
store = RefgetStore.in_memory()
store.add_sequence_collection_from_fasta("genome.fa")
```

Open an existing local store:

```
store = RefgetStore.open_local("/data/hg38")
seq = store.get_substring("chr1_digest", 0, 1000)
```

Open a remote store with caching:

```
store = RefgetStore.open_remote(
    "/local/cache",
    "https://example.com/hg38"
)
```

### Attributes

- <a id="gtars.refget.RefgetStore.cache_path"></a>**`cache_path`** (*Optional[str]*)
- <a id="gtars.refget.RefgetStore.remote_url"></a>**`remote_url`** (*Optional[str]*)

### Properties

<a id="gtars.refget.RefgetStore.quiet"></a>

#### `quiet`

```python
@property
def quiet -> bool
```

Whether the store is in quiet mode.

<a id="gtars.refget.RefgetStore.storage_mode"></a>

#### `storage_mode`

```python
@property
def storage_mode -> StorageMode
```

Current storage mode (Raw or Encoded).

<a id="gtars.refget.RefgetStore.is_persisting"></a>

#### `is_persisting`

```python
@property
def is_persisting -> bool
```

Whether the store is currently persisting to disk.

Example:

```
store = RefgetStore.in_memory()
print(store.is_persisting)  # False
store.enable_persistence("/data/store")
print(store.is_persisting)  # True
```

### Class methods

<a id="gtars.refget.RefgetStore.in_memory"></a>

#### `in_memory`

```python
@classmethod
def in_memory() -> RefgetStore
```

Create a new in-memory RefgetStore.

Creates a store that keeps all sequences in memory. Use this for
temporary processing or when you don't need disk persistence.

**Returns:**

- *[RefgetStore](#gtars.refget.RefgetStore)*: New empty RefgetStore with Encoded storage mode.

Example:

```
store = RefgetStore.in_memory()
store.add_sequence_collection_from_fasta("genome.fa")
```

<a id="gtars.refget.RefgetStore.store_exists"></a>

#### `store_exists`

```python
@classmethod
def store_exists(path: Union[str, PathLike]) -> bool
```

Check whether a valid RefgetStore exists at the given path.

Returns True if the path contains a store manifest file,
indicating the store has been initialized. Returns False if the
path does not exist or does not contain a store.

This avoids hardcoding knowledge of the store's internal file
format in calling code.

**Parameters:**

- `path` (*Union[str, PathLike]*): Path to the store directory.

**Returns:**

- *bool*: True if a store exists at the path, False otherwise.

Example:

```
from gtars.refget import RefgetStore
RefgetStore.store_exists("/data/hg38_store")  # True
RefgetStore.store_exists("/tmp/empty")  # False
```

<a id="gtars.refget.RefgetStore.on_disk"></a>

#### `on_disk`

```python
@classmethod
def on_disk(cache_path: Union[str, PathLike]) -> RefgetStore
```

Create or load a disk-backed RefgetStore.

If the directory contains an existing store (rgstore.json),
loads it. Otherwise creates a new store with Encoded mode.

**Parameters:**

- `cache_path` (*Union[str, PathLike]*): Directory path for the store. Created if it doesn't exist.

**Returns:**

- *[RefgetStore](#gtars.refget.RefgetStore)*: RefgetStore (new or loaded from disk).

Example:

```
store = RefgetStore.on_disk("/data/my_store")
store.add_sequence_collection_from_fasta("genome.fa")
# Store is automatically persisted to disk
```

<a id="gtars.refget.RefgetStore.open_local"></a>

#### `open_local`

```python
@classmethod
def open_local(path: Union[str, PathLike]) -> RefgetStore
```

Open a local RefgetStore from a directory.

Loads only lightweight metadata and stubs. Collections and sequences
remain as stubs until explicitly accessed with get_collection()/get_sequence().

Expects: rgstore.json, sequences.rgsi, collections.rgci, collections/*.rgsi

**Parameters:**

- `path` (*Union[str, PathLike]*): Local directory containing the refget store.

**Returns:**

- *[RefgetStore](#gtars.refget.RefgetStore)*: RefgetStore with metadata loaded, sequences lazy-loaded.

**Raises:**

- *IOError*: If the store directory or index files cannot be read.

Example:

```
store = RefgetStore.open_local("/data/hg38_store")
seq = store.get_substring("chr1_digest", 0, 1000)
```

<a id="gtars.refget.RefgetStore.open_remote"></a>

#### `open_remote`

```python
@classmethod
def open_remote(cache_path: Union[str, PathLike], remote_url: str) -> RefgetStore
```

Open a remote RefgetStore with local caching.

Loads only lightweight metadata and stubs from the remote URL.
Data is fetched on-demand when get_collection()/get_sequence() is called.

By default, persistence is enabled (sequences are cached to disk).
Call `disable_persistence()` after loading to keep only in memory.

**Parameters:**

- `cache_path` (*Union[str, PathLike]*): Local directory to cache downloaded metadata and sequences.
  Created if it doesn't exist.
- `remote_url` (*str*): Base URL of the remote refget store (e.g.,
  "https://example.com/hg38" or "s3://bucket/hg38").

**Returns:**

- *[RefgetStore](#gtars.refget.RefgetStore)*: RefgetStore with metadata loaded, sequences fetched on-demand.

**Raises:**

- *IOError*: If remote metadata cannot be fetched or cache cannot be written.

Example:

```
store = RefgetStore.open_remote(
    "/data/cache/hg38",
    "https://refget-server.com/hg38"
)
# First access fetches from remote and caches
seq = store.get_substring("chr1_digest", 0, 1000)
# Second access uses cache
seq2 = store.get_substring("chr1_digest", 1000, 2000)
```

### Methods

<a id="gtars.refget.RefgetStore.set_encoding_mode"></a>

#### `set_encoding_mode`

```python
def set_encoding_mode(mode: StorageMode) -> None
```

Change the storage mode, re-encoding/decoding existing sequences as needed.

When switching from Raw to Encoded, all Full sequences in memory are
encoded (2-bit packed). When switching from Encoded to Raw, all Full
sequences in memory are decoded back to raw bytes.

**Parameters:**

- `mode` (*[StorageMode](#gtars.refget.StorageMode)*): The storage mode to switch to (StorageMode.Raw or StorageMode.Encoded).

Example:

```
store = RefgetStore.in_memory()
store.set_encoding_mode(StorageMode.Raw)
```

<a id="gtars.refget.RefgetStore.enable_encoding"></a>

#### `enable_encoding`

```python
def enable_encoding() -> None
```

Enable 2-bit encoding for space efficiency.

Re-encodes any existing Raw sequences in memory.

Example:

```
store = RefgetStore.in_memory()
store.disable_encoding()  # Switch to Raw
store.enable_encoding()   # Back to Encoded
```

<a id="gtars.refget.RefgetStore.disable_encoding"></a>

#### `disable_encoding`

```python
def disable_encoding() -> None
```

Disable encoding, use raw byte storage.

Decodes any existing Encoded sequences in memory.

Example:

```
store = RefgetStore.in_memory()
store.disable_encoding()  # Switch to Raw mode
```

<a id="gtars.refget.RefgetStore.set_quiet"></a>

#### `set_quiet`

```python
def set_quiet(quiet: bool) -> None
```

Set whether to suppress progress output.

When quiet is True, operations like add_sequence_collection_from_fasta
will not print progress messages.

**Parameters:**

- `quiet` (*bool*): Whether to suppress progress output.

Example:

```
store = RefgetStore.in_memory()
store.set_quiet(True)
store.add_sequence_collection_from_fasta("genome.fa")  # No output
```

<a id="gtars.refget.RefgetStore.enable_persistence"></a>

#### `enable_persistence`

```python
def enable_persistence(path: Union[str, PathLike]) -> None
```

Enable disk persistence for this store.

Sets up the store to write sequences to disk. Any in-memory Full sequences
are flushed to disk and converted to Stubs.

**Parameters:**

- `path` (*Union[str, PathLike]*): Directory for storing sequences and metadata.

**Raises:**

- *IOError*: If the directory cannot be created or written to.

Example:

```
store = RefgetStore.in_memory()
store.add_sequence_collection_from_fasta("genome.fa")
store.enable_persistence("/data/store")  # Flush to disk
```

<a id="gtars.refget.RefgetStore.disable_persistence"></a>

#### `disable_persistence`

```python
def disable_persistence() -> None
```

Disable disk persistence for this store.

New sequences will be kept in memory only. Existing Stub sequences
can still be loaded from disk if local_path is set.

Example:

```
store = RefgetStore.open_remote("/cache", "https://example.com")
store.disable_persistence()  # Stop caching new sequences
```

<a id="gtars.refget.RefgetStore.add_sequence_collection_from_fasta"></a>

#### `add_sequence_collection_from_fasta`

```python
def add_sequence_collection_from_fasta(file_path: Union[str, PathLike], force: bool = False, namespaces: Optional[List[str]] = None, collection_alias: Optional[str] = None) -> tuple[SequenceCollectionMetadata, bool]
```

Add a sequence collection from a FASTA file.

Reads a FASTA file, digests the sequences, creates a SequenceCollection,
and adds it to the store along with all its sequences.

**Parameters:**

- `file_path` (*Union[str, PathLike]*): Path to the FASTA file to import.
- `force` (*bool*): If True, overwrite existing collections/sequences.
  If False (default), skip duplicates. (default: `False`)
- `namespaces` (*Optional[List[str]]*): Optional list of namespace prefixes to extract aliases from
  FASTA headers. For example, ["ncbi", "refseq"] will scan headers
  for tokens like `ncbi:NC_000001.11` and register them as aliases. (default: `None`)
- `collection_alias` (*Optional[str]*): Register the imported collection under this
  collection alias, as `"NAMESPACE:ALIAS"` (e.g. `"ucsc:hg38"`).
  This names the collection as a whole and is distinct from
  `namespaces`. Errors if the alias already names a different
  collection, unless `force` is set. (default: `None`)

**Returns:**

- *tuple[[SequenceCollectionMetadata](#gtars.refget.SequenceCollectionMetadata), bool]*: A tuple containing:
  - SequenceCollectionMetadata: Metadata for the collection.
  - bool: True if the collection was newly added, False if it already existed.

**Raises:**

- *IOError*: If the file cannot be read or processed.

Example:

```
store = RefgetStore.in_memory()
metadata, was_new = store.add_sequence_collection_from_fasta("genome.fa")
print(f"{'Added' if was_new else 'Skipped'}: {metadata.digest}")

# Extract aliases from FASTA headers
metadata, was_new = store.add_sequence_collection_from_fasta(
    "genome.fa", namespaces=["ncbi", "refseq"]
)
```

<a id="gtars.refget.RefgetStore.add_sequence_collections_from_fastas"></a>

#### `add_sequence_collections_from_fastas`

```python
def add_sequence_collections_from_fastas(fastas: Union[str, PathLike, List[Union[str, PathLike]]], file_list: Optional[Union[str, PathLike]] = None, jobs: int = 0, force: bool = False, namespaces: Optional[List[str]] = None) -> ImportReport
```

Import multiple FASTA files into the store.

`fastas` accepts a single path, a glob pattern (e.g. "fasta/*.fa.gz"),
a directory of FASTAs, or a list mixing any of these. `file_list` points
at a file-of-filenames (one path per line; blank lines and #-comments
ignored; may itself contain globs/directories). Inputs are expanded by
gtars into a de-duplicated, deterministic order (explicit paths first,
then file_list lines; directory/glob matches sorted lexicographically).
`jobs` is the number of files imported concurrently (0 = auto, 1 =
serial); it does not affect ordering or the resulting store.

**Parameters:**

- `fastas` (*Union[str, PathLike, List[Union[str, PathLike]]]*): A path, glob, directory, or list of any of these.
- `file_list` (*Optional[Union[str, PathLike]]*): Optional path to a file-of-filenames. (default: `None`)
- `jobs` (*int*): Number of files imported concurrently (0 = auto, 1 = serial). (default: `0`)
- `force` (*bool*): If True, overwrite existing collections/sequences. (default: `False`)
- `namespaces` (*Optional[List[str]]*): Optional namespace prefixes to extract aliases from headers. (default: `None`)

**Returns:**

- `An` (*[ImportReport](#gtars.refget.ImportReport)*): class:`ImportReport`. `report.collections` is a list of
- *[ImportReport](#gtars.refget.ImportReport)*: `(SequenceCollectionMetadata, bool)` tuples in expanded-input
- *[ImportReport](#gtars.refget.ImportReport)*: order (the bool is True if newly added);
- *[ImportReport](#gtars.refget.ImportReport)*: `report.n_sequences_written`, `report.n_sequences_deduped`, and
- *[ImportReport](#gtars.refget.ImportReport)*: `report.n_collections_new` are per-run ingest counters. Use these
- *[ImportReport](#gtars.refget.ImportReport)*: — not `store.stats()` — to report what an import actually added.

**Raises:**

- *ValueError*: If the inputs cannot be expanded (e.g. glob matches nothing).
- *IOError*: If a file cannot be read or processed.

Example:

```
store = RefgetStore.in_memory()
report = store.add_sequence_collections_from_fastas("data/*.fa.gz", jobs=4)
print(report.n_collections_new, report.n_sequences_written)
```

<a id="gtars.refget.RefgetStore.add_sequence_collection"></a>

#### `add_sequence_collection`

```python
def add_sequence_collection(collection: SequenceCollection, force: bool = False) -> None
```

Add a pre-built SequenceCollection to the store.

Adds a SequenceCollection (created via `digest_fasta()` or programmatically)
directly to the store without reading from a FASTA file.

**Parameters:**

- `collection` (*[SequenceCollection](#gtars.refget.SequenceCollection)*): A SequenceCollection to add.
- `force` (*bool*): If True, overwrite existing collections/sequences.
  If False (default), skip duplicates. (default: `False`)

**Raises:**

- *IOError*: If the collection cannot be stored.

Example:

```
from gtars.refget import RefgetStore, digest_fasta
store = RefgetStore.in_memory()
collection = digest_fasta("genome.fa")
store.add_sequence_collection(collection)
```

<a id="gtars.refget.RefgetStore.add_sequence"></a>

#### `add_sequence`

```python
def add_sequence(sequence: SequenceRecord, force: bool = False) -> None
```

Add a sequence to the store without collection association.

The sequence can be created using `digest_sequence()` and later
retrieved by its digest via `get_sequence()`.

**Parameters:**

- `sequence` (*[SequenceRecord](#gtars.refget.SequenceRecord)*): A SequenceRecord created by `digest_sequence()`.
- `force` (*bool*): If True, overwrite existing. If False (default), skip duplicates. (default: `False`)

**Raises:**

- *IOError*: If the sequence cannot be stored.

Example:

```
from gtars.refget import RefgetStore, digest_sequence
store = RefgetStore.in_memory()
seq = digest_sequence(b"ACGTACGT")
store.add_sequence(seq)
retrieved = store.get_sequence(seq.metadata.sha512t24u)
```

<a id="gtars.refget.RefgetStore.list_collections"></a>

#### `list_collections`

```python
def list_collections(page: int = 0, page_size: int = 100, filters: Optional[Dict[str, str]] = None) -> Dict[str, Any]
```

List collections with pagination and optional attribute filtering.

**Parameters:**

- `page` (*int*): 0-indexed page number. (default: `0`)
- `page_size` (*int*): Number of results per page. (default: `100`)
- `filters` (*Optional[Dict[str, str]]*): Optional attribute filters (AND logic). Keys are attribute
  names (names, lengths, sequences, name_length_pairs,
  sorted_name_length_pairs, sorted_sequences), values are digests. (default: `None`)

**Returns:**

- *Dict[str, Any]*: Dict with "results" (list of SequenceCollectionMetadata) and
- *Dict[str, Any]*: "pagination" (dict with page, page_size, total).

Example:

```
# Get first page of all collections
result = store.list_collections()
for meta in result["results"]:
    print(f"{meta.digest}: {meta.n_sequences} sequences")
print(f"Total: {result['pagination']['total']}")

# Filter by names digest
result = store.list_collections(filters={"names": "abc123"})
```

<a id="gtars.refget.RefgetStore.remove_collection"></a>

#### `remove_collection`

```python
def remove_collection(digest: str, remove_orphan_sequences: bool = False) -> bool
```

Remove a collection from the store.

**Parameters:**

- `digest` (*str*): The collection's SHA-512/24u digest string.
- `remove_orphan_sequences` (*bool*): If True, also remove sequences no longer
  referenced by any remaining collection. Default: False. (default: `False`)

**Returns:**

- *bool*: True if the collection was found and removed, False if not found.

<a id="gtars.refget.RefgetStore.get_collection_metadata"></a>

#### `get_collection_metadata`

```python
def get_collection_metadata(collection_digest: str) -> Optional[SequenceCollectionMetadata]
```

Get metadata for a collection by digest.

Returns lightweight metadata without loading the full collection.
Use this for quick lookups of collection information.

**Parameters:**

- `collection_digest` (*str*): The collection's SHA-512/24u digest.

**Returns:**

- *Optional[[SequenceCollectionMetadata](#gtars.refget.SequenceCollectionMetadata)]*: Collection metadata if found, None otherwise.

Example:

```
meta = store.get_collection_metadata("uC_UorBNf3YUu1YIDainBhI94CedlNeH")
if meta:
    print(f"Collection has {meta.n_sequences} sequences")
```

<a id="gtars.refget.RefgetStore.get_collection"></a>

#### `get_collection`

```python
def get_collection(collection_digest: str) -> SequenceCollection
```

Get a collection by digest with all sequences loaded.

Loads the collection and all its sequence data into memory.
Use this when you need full access to sequence content.

**Parameters:**

- `collection_digest` (*str*): The collection's SHA-512/24u digest.

**Returns:**

- *[SequenceCollection](#gtars.refget.SequenceCollection)*: The collection with all sequence data loaded.

**Raises:**

- *IOError*: If the collection cannot be loaded.

Example:

```
collection = store.get_collection("uC_UorBNf3YUu1YIDainBhI94CedlNeH")
for seq in collection.sequences:
    print(f"{seq.metadata.name}: {seq.decode()[:20]}...")
```

<a id="gtars.refget.RefgetStore.iter_collections"></a>

#### `iter_collections`

```python
def iter_collections() -> List[SequenceCollection]
```

Iterate over all collections with their sequences loaded.

This loads all collection data upfront and returns a list of
SequenceCollection objects with full sequence data.

For browsing without loading data, use list_collections() instead.

**Returns:**

- *List[[SequenceCollection](#gtars.refget.SequenceCollection)]*: List of all collections with loaded sequences.

Example:

```
for coll in store.iter_collections():
    print(f"{coll.digest}: {len(coll.sequences)} sequences")
```

<a id="gtars.refget.RefgetStore.is_collection_loaded"></a>

#### `is_collection_loaded`

```python
def is_collection_loaded(collection_digest: str) -> bool
```

Check if a collection is fully loaded.

Returns True if the collection's sequence list is loaded in memory,
False if it's only metadata (stub).

**Parameters:**

- `collection_digest` (*str*): The collection's SHA-512/24u digest.

**Returns:**

- *bool*: True if loaded, False otherwise.

<a id="gtars.refget.RefgetStore.list_sequences"></a>

#### `list_sequences`

```python
def list_sequences() -> List[SequenceMetadata]
```

List all sequence metadata in the store.

Returns metadata for all sequences without loading sequence data.
Use this for browsing/inventory operations.

**Returns:**

- *List[[SequenceMetadata](#gtars.refget.SequenceMetadata)]*: List of metadata for all sequences in the store.

Example:

```
for meta in store.list_sequences():
    print(f"{meta.name}: {meta.length} bp")
```

<a id="gtars.refget.RefgetStore.get_sequence_metadata"></a>

#### `get_sequence_metadata`

```python
def get_sequence_metadata(seq_digest: str) -> Optional[SequenceMetadata]
```

Get metadata for a sequence by digest (no data loaded).

Use this for lightweight lookups when you don't need the actual sequence.
Automatically strips "SQ." prefix from digest if present.

**Parameters:**

- `seq_digest` (*str*): The sequence's SHA-512/24u digest, optionally with "SQ." prefix.

**Returns:**

- *Optional[[SequenceMetadata](#gtars.refget.SequenceMetadata)]*: Sequence metadata if found, None otherwise.

<a id="gtars.refget.RefgetStore.get_sequence"></a>

#### `get_sequence`

```python
def get_sequence(digest: str) -> SequenceRecord
```

Retrieve a sequence record by its digest (SHA-512/24u or MD5).

Loads the sequence data if not already in memory. Supports lookup
by either SHA-512/24u (preferred) or MD5 digest. Automatically
strips "SQ." prefix if present (case-insensitive).

**Parameters:**

- `digest` (*str*): Sequence digest (SHA-512/24u base64url or MD5 hex string),
  optionally with "SQ." prefix.

**Returns:**

- *[SequenceRecord](#gtars.refget.SequenceRecord)*: The sequence record with data.

**Raises:**

- *KeyError*: If the sequence is not found.

Example:

```
record = store.get_sequence("aKF498dAxcJAqme6QYQ7EZ07-fiw8Kw2")
print(f"Found: {record.metadata.name}")
# Also works with SQ. prefix
record = store.get_sequence("SQ.aKF498dAxcJAqme6QYQ7EZ07-fiw8Kw2")
```

<a id="gtars.refget.RefgetStore.get_sequence_by_name"></a>

#### `get_sequence_by_name`

```python
def get_sequence_by_name(collection_digest: str, sequence_name: str) -> SequenceRecord
```

Retrieve a sequence by collection digest and sequence name.

Looks up a sequence within a specific collection using its name
(e.g., "chr1", "chrM"). Loads the sequence data if needed.
Automatically strips "SQ." prefix from collection digest if present.

**Parameters:**

- `collection_digest` (*str*): The collection's SHA-512/24u digest, optionally
  with "SQ." prefix.
- `sequence_name` (*str*): Name of the sequence within that collection.

**Returns:**

- *[SequenceRecord](#gtars.refget.SequenceRecord)*: The sequence record with data.

**Raises:**

- *KeyError*: If the sequence is not found.

Example:

```
record = store.get_sequence_by_name(
    "uC_UorBNf3YUu1YIDainBhI94CedlNeH",
    "chr1"
)
print(f"Sequence: {record.decode()[:50]}...")
```

<a id="gtars.refget.RefgetStore.iter_sequences"></a>

#### `iter_sequences`

```python
def iter_sequences() -> List[SequenceRecord]
```

Iterate over all sequences with their data loaded.

This ensures all sequence data is loaded and returns a list of
SequenceRecord objects with full sequence data.

For browsing without loading data, use list_sequences() instead.

**Returns:**

- *List[[SequenceRecord](#gtars.refget.SequenceRecord)]*: List of all sequences with loaded data.

Example:

```
for seq in store.iter_sequences():
    print(f"{seq.metadata.name}: {seq.decode()[:20]}...")
```

<a id="gtars.refget.RefgetStore.get_substring"></a>

#### `get_substring`

```python
def get_substring(seq_digest: str, start: int, end: int) -> str
```

Extract a substring from a sequence (flow 1: lean partial read).

Retrieves a specific region using 0-based, half-open coordinates
[start, end), reading only the bytes that cover the region. Source
resolution is resident -> local `.seq` -> remote HTTP byte-range, so a
remote-backed store is served directly with no manual preload and
without downloading or caching the whole sequence. For repeat-heavy
access call `load_sequence()` (flow 3) first. Automatically strips
"SQ." prefix from digest if present.

**Parameters:**

- `seq_digest` (*str*): Sequence digest (SHA-512/24u), optionally with "SQ." prefix.
- `start` (*int*): Start position (0-based, inclusive).
- `end` (*int*): End position (0-based, exclusive).

**Returns:**

- *str*: The substring sequence.

**Raises:**

- *KeyError*: If the sequence is not found.

Example:

```
# Get first 1000 bases of chr1
seq = store.get_substring("chr1_digest", 0, 1000)
print(f"First 50bp: {seq[:50]}")
```

<a id="gtars.refget.RefgetStore.stream_sequence"></a>

#### `stream_sequence`

```python
def stream_sequence(seq_digest: str, start: Optional[int] = None, end: Optional[int] = None, chunk_size: int = 65536) -> SequenceStream
```

Stream a (sub)sequence as decoded bases without loading it (flow 2).

Returns a `SequenceStream` that yields `str` chunks lazily,
reading from resident bytes, a local `.seq`, or a remote HTTP
byte-range as needed. Peak memory is O(1) in the region length. Omit
`start`/`end` to stream the whole sequence.

**Parameters:**

- `seq_digest` (*str*): Sequence digest (SHA-512/24u), optionally with "SQ." prefix.
- `start` (*Optional[int]*): Start position (0-based, inclusive). Defaults to 0. (default: `None`)
- `end` (*Optional[int]*): End position (0-based, exclusive). Defaults to the sequence length. (default: `None`)
- `chunk_size` (*int*): Bytes read per chunk (default 64 KiB). (default: `65536`)

**Returns:**

- *[SequenceStream](#gtars.refget.SequenceStream)*: A SequenceStream iterator of decoded base chunks.

<a id="gtars.refget.RefgetStore.stats"></a>

#### `stats`

```python
def stats() -> dict
```

Returns statistics about the store.

**Returns:**

- *dict*: dict with keys:
  - 'n_sequences': Total number of sequences (Stub + Full)
  - 'n_sequences_in_memory': Number of sequences whose bytes are
    currently held in RAM (Full)
  - 'n_collections': Total number of collections (Stub + Full)
  - 'n_collections_in_memory': Number of collections whose
    sequence list is currently held in RAM (Full)
  - 'storage_mode': Storage mode ('Raw' or 'Encoded')

:::note[Note]
These are a snapshot of CURRENT RAM residency, not a record of what
an import run did. n_sequences_in_memory is structurally always 0
for a disk-backed store: importing writes bytes to disk and keeps
only a stub in memory. n_collections_in_memory only reflects
collections fully loaded in memory; it resets on process start and
also counts collections merely touched by a read, so it is not a
count of collections ingested. For remote stores, collections are
loaded on-demand when accessed. For per-run ingest counts, use the
ImportReport returned by add_sequence_collections_from_fastas.
:::

Example:

```
stats = store.stats()
print(f"Store has {stats['n_sequences']} sequences")
print(f"Collections: {stats['n_collections']} total, {stats['n_collections_in_memory']} in memory")
```

<a id="gtars.refget.RefgetStore.write"></a>

#### `write`

```python
def write() -> None
```

Write the store using its configured paths.

Convenience method for disk-backed stores. Uses the store's own
local_path and seqdata_path_template.

**Raises:**

- *IOError*: If the store cannot be written.

<a id="gtars.refget.RefgetStore.write_store_to_dir"></a>

#### `write_store_to_dir`

```python
def write_store_to_dir(root_path: Union[str, PathLike], seqdata_path_template: Optional[str] = None) -> None
```

Write the store to a directory on disk.

Persists the store with all sequences and metadata to disk using the
RefgetStore directory format.

**Parameters:**

- `root_path` (*Union[str, PathLike]*): Directory path to write the store to.
- `seqdata_path_template` (*Optional[str]*): Optional path template for sequence files (e.g.,
  "sequences/%s2/%s.seq" where %s2 = first 2 chars of digest,
  %s = full digest). Uses default if not specified. (default: `None`)

Example:

```
store.write_store_to_dir("/data/my_store")
store.write_store_to_dir("/data/my_store", "sequences/%s2/%s.seq")
```

<a id="gtars.refget.RefgetStore.get_collection_level1"></a>

#### `get_collection_level1`

```python
def get_collection_level1(digest: str) -> dict
```

Get level 1 representation (attribute digests) for a collection.

**Parameters:**

- `digest` (*str*): Collection digest.

**Returns:**

- *dict*: dict with spec-compliant field names (names, lengths, sequences,
- *dict*: plus optional name_length_pairs, sorted_name_length_pairs, sorted_sequences).

<a id="gtars.refget.RefgetStore.get_collection_level2"></a>

#### `get_collection_level2`

```python
def get_collection_level2(digest: str) -> dict
```

Get level 2 representation (full arrays, spec format) for a collection.

**Parameters:**

- `digest` (*str*): Collection digest.

**Returns:**

- *dict*: dict with names (list[str]), lengths (list[int]), sequences (list[str]).

<a id="gtars.refget.RefgetStore.match_sequence_names"></a>

#### `match_sequence_names`

```python
def match_sequence_names(digest_a: str, digest_b: str) -> dict[str, Any]
```

Match collection-local names by sequence content.

**Returns:**

- *dict[str, Any]*: A mapping with collection_a, collection_b, matches, a_only, and
- *dict[str, Any]*: b_only. Each row has digest, length, names_a, and names_b; repeated
- *dict[str, Any]*: content may have many names.

**Raises:**

- *KeyError*: If either collection digest is unknown.

<a id="gtars.refget.RefgetStore.compare"></a>

#### `compare`

```python
def compare(digest_a: str, digest_b: str) -> dict
```

Compare two collections by digest.

**Parameters:**

- `digest_a` (*str*): First collection digest.
- `digest_b` (*str*): Second collection digest.

**Returns:**

- *dict*: dict with keys: digests, attributes, array_elements.

<a id="gtars.refget.RefgetStore.find_collections_by_attribute"></a>

#### `find_collections_by_attribute`

```python
def find_collections_by_attribute(attr_name: str, attr_digest: str) -> List[str]
```

Find collections by attribute digest.

**Parameters:**

- `attr_name` (*str*): Attribute name (names, lengths, sequences,
  name_length_pairs, sorted_name_length_pairs, sorted_sequences).
- `attr_digest` (*str*): The digest to search for.

**Returns:**

- *List[str]*: List of collection digests that have the matching attribute.

<a id="gtars.refget.RefgetStore.get_attribute"></a>

#### `get_attribute`

```python
def get_attribute(attr_name: str, attr_digest: str) -> Optional[list]
```

Get attribute array by digest.

**Parameters:**

- `attr_name` (*str*): Attribute name (names, lengths, or sequences).
- `attr_digest` (*str*): The digest to search for.

**Returns:**

- *Optional[list]*: The attribute array, or None if not found.

<a id="gtars.refget.RefgetStore.enable_ancillary_digests"></a>

#### `enable_ancillary_digests`

```python
def enable_ancillary_digests() -> None
```

Enable computation of ancillary digests.

<a id="gtars.refget.RefgetStore.disable_ancillary_digests"></a>

#### `disable_ancillary_digests`

```python
def disable_ancillary_digests() -> None
```

Disable computation of ancillary digests.

<a id="gtars.refget.RefgetStore.has_ancillary_digests"></a>

#### `has_ancillary_digests`

```python
def has_ancillary_digests() -> bool
```

Returns whether ancillary digests are enabled.

<a id="gtars.refget.RefgetStore.has_attribute_index"></a>

#### `has_attribute_index`

```python
def has_attribute_index() -> bool
```

Returns whether the on-disk attribute index is enabled.

<a id="gtars.refget.RefgetStore.enable_attribute_index"></a>

#### `enable_attribute_index`

```python
def enable_attribute_index() -> None
```

Enable indexed attribute lookup (not yet implemented).

<a id="gtars.refget.RefgetStore.disable_attribute_index"></a>

#### `disable_attribute_index`

```python
def disable_attribute_index() -> None
```

Disable indexed attribute lookup, using brute-force scan instead.

<a id="gtars.refget.RefgetStore.export_fasta_from_regions"></a>

#### `export_fasta_from_regions`

```python
def export_fasta_from_regions(collection_digest: str, bed_file_path: Union[str, PathLike], output_file_path: Union[str, PathLike]) -> None
```

Export sequences from BED file regions to a FASTA file.

Reads a BED file defining genomic regions and exports the sequences
for those regions to a FASTA file.

**Parameters:**

- `collection_digest` (*str*): The collection's SHA-512/24u digest.
- `bed_file_path` (*Union[str, PathLike]*): Path to BED file defining regions.
- `output_file_path` (*Union[str, PathLike]*): Path to write the output FASTA file.

**Raises:**

- *IOError*: If files cannot be read/written or sequences not found.

Example:

```
store.export_fasta_from_regions(
    "uC_UorBNf3YUu1YIDainBhI94CedlNeH",
    "regions.bed",
    "output.fa"
)
```

<a id="gtars.refget.RefgetStore.substrings_from_regions"></a>

#### `substrings_from_regions`

```python
def substrings_from_regions(collection_digest: str, bed_file_path: Union[str, PathLike]) -> List[RetrievedSequence]
```

Get substrings for BED file regions as a list.

Reads a BED file and returns a list of sequences for each region.

**Parameters:**

- `collection_digest` (*str*): The collection's SHA-512/24u digest.
- `bed_file_path` (*Union[str, PathLike]*): Path to BED file defining regions.

**Returns:**

- *List[[RetrievedSequence](#gtars.refget.RetrievedSequence)]*: List of retrieved sequence segments.

**Raises:**

- *IOError*: If files cannot be read or sequences not found.

Example:

```
sequences = store.substrings_from_regions(
    "uC_UorBNf3YUu1YIDainBhI94CedlNeH",
    "regions.bed"
)
for seq in sequences:
    print(f"{seq.chrom_name}:{seq.start}-{seq.end}")
```

<a id="gtars.refget.RefgetStore.export_fasta"></a>

#### `export_fasta`

```python
def export_fasta(collection_digest: str, output_path: Union[str, PathLike], sequence_names: Optional[List[str]] = None, line_width: Optional[int] = None) -> None
```

Export sequences from a collection to a FASTA file.

**Parameters:**

- `collection_digest` (*str*): Collection to export from.
- `output_path` (*Union[str, PathLike]*): Path to write FASTA file.
- `sequence_names` (*Optional[List[str]]*): Optional list of sequence names to export. If None,
  exports all sequences in the collection. (default: `None`)
- `line_width` (*Optional[int]*): Optional line width for wrapping sequences. If None,
  uses default of 80. (default: `None`)

<a id="gtars.refget.RefgetStore.export_fasta_by_digests"></a>

#### `export_fasta_by_digests`

```python
def export_fasta_by_digests(seq_digests: List[str], output_path: Union[str, PathLike], line_width: Optional[int] = None) -> None
```

Export sequences by their digests to a FASTA file.

**Parameters:**

- `seq_digests` (*List[str]*): List of sequence digests to export.
- `output_path` (*Union[str, PathLike]*): Path to write FASTA file.
- `line_width` (*Optional[int]*): Optional line width for wrapping sequences. If None,
  uses default of 80. (default: `None`)

<a id="gtars.refget.RefgetStore.add_sequence_alias"></a>

#### `add_sequence_alias`

```python
def add_sequence_alias(namespace: str, alias: str, digest: str) -> None
```

Add a sequence alias: namespace/alias maps to sequence digest.

<a id="gtars.refget.RefgetStore.get_sequence_metadata_by_alias"></a>

#### `get_sequence_metadata_by_alias`

```python
def get_sequence_metadata_by_alias(namespace: str, alias: str) -> Optional[SequenceMetadata]
```

Resolve a sequence alias to sequence metadata (no data loading).

<a id="gtars.refget.RefgetStore.get_sequence_by_alias"></a>

#### `get_sequence_by_alias`

```python
def get_sequence_by_alias(namespace: str, alias: str) -> Optional[SequenceRecord]
```

Resolve a sequence alias and return the loaded sequence record.

Returns None if the alias is not found.

<a id="gtars.refget.RefgetStore.get_aliases_for_sequence"></a>

#### `get_aliases_for_sequence`

```python
def get_aliases_for_sequence(digest: str) -> list[tuple[str, str]]
```

Reverse lookup: find all (namespace, alias) pairs pointing to this sequence digest.

<a id="gtars.refget.RefgetStore.list_sequence_alias_namespaces"></a>

#### `list_sequence_alias_namespaces`

```python
def list_sequence_alias_namespaces() -> list[str]
```

List all sequence alias namespaces.

<a id="gtars.refget.RefgetStore.list_sequence_aliases"></a>

#### `list_sequence_aliases`

```python
def list_sequence_aliases(namespace: str) -> Optional[list[str]]
```

List all aliases in a sequence alias namespace.

<a id="gtars.refget.RefgetStore.remove_sequence_alias"></a>

#### `remove_sequence_alias`

```python
def remove_sequence_alias(namespace: str, alias: str) -> bool
```

Remove a single sequence alias. Returns True if it existed.

<a id="gtars.refget.RefgetStore.load_sequence_aliases"></a>

#### `load_sequence_aliases`

```python
def load_sequence_aliases(namespace: str, path: str) -> int
```

Load sequence aliases from a TSV file (alias\tdigest per line).

<a id="gtars.refget.RefgetStore.add_collection_alias"></a>

#### `add_collection_alias`

```python
def add_collection_alias(namespace: str, alias: str, digest: str) -> None
```

Add a collection alias: namespace/alias maps to collection digest.

<a id="gtars.refget.RefgetStore.get_collection_metadata_by_alias"></a>

#### `get_collection_metadata_by_alias`

```python
def get_collection_metadata_by_alias(namespace: str, alias: str) -> Optional[SequenceCollectionMetadata]
```

Resolve a collection alias to collection metadata (no data loading).

<a id="gtars.refget.RefgetStore.get_collection_by_alias"></a>

#### `get_collection_by_alias`

```python
def get_collection_by_alias(namespace: str, alias: str) -> Optional[SequenceCollection]
```

Resolve a collection alias and return the loaded collection.

Returns None if the alias is not found.

<a id="gtars.refget.RefgetStore.get_aliases_for_collection"></a>

#### `get_aliases_for_collection`

```python
def get_aliases_for_collection(digest: str) -> list[tuple[str, str]]
```

Reverse lookup: find all (namespace, alias) pairs pointing to this collection digest.

<a id="gtars.refget.RefgetStore.list_collection_alias_namespaces"></a>

#### `list_collection_alias_namespaces`

```python
def list_collection_alias_namespaces() -> list[str]
```

List all collection alias namespaces.

<a id="gtars.refget.RefgetStore.list_collection_aliases"></a>

#### `list_collection_aliases`

```python
def list_collection_aliases(namespace: str) -> Optional[list[str]]
```

List all aliases in a collection alias namespace.

<a id="gtars.refget.RefgetStore.remove_collection_alias"></a>

#### `remove_collection_alias`

```python
def remove_collection_alias(namespace: str, alias: str) -> bool
```

Remove a single collection alias. Returns True if it existed.

<a id="gtars.refget.RefgetStore.load_collection_aliases"></a>

#### `load_collection_aliases`

```python
def load_collection_aliases(namespace: str, path: str) -> int
```

Load collection aliases from a TSV file (alias\tdigest per line).

<a id="gtars.refget.RefgetStore.set_fhr_metadata"></a>

#### `set_fhr_metadata`

```python
def set_fhr_metadata(collection_digest: str, metadata: FhrMetadata) -> None
```

Set FHR metadata for a collection.

<a id="gtars.refget.RefgetStore.get_fhr_metadata"></a>

#### `get_fhr_metadata`

```python
def get_fhr_metadata(collection_digest: str) -> Optional[FhrMetadata]
```

Get FHR metadata for a collection. Returns None if missing.

<a id="gtars.refget.RefgetStore.remove_fhr_metadata"></a>

#### `remove_fhr_metadata`

```python
def remove_fhr_metadata(collection_digest: str) -> bool
```

Remove FHR metadata for a collection.

<a id="gtars.refget.RefgetStore.list_fhr_metadata"></a>

#### `list_fhr_metadata`

```python
def list_fhr_metadata() -> list[str]
```

List all collection digests that have FHR metadata.

<a id="gtars.refget.RefgetStore.load_fhr_metadata"></a>

#### `load_fhr_metadata`

```python
def load_fhr_metadata(collection_digest: str, path: str) -> None
```

Load FHR metadata from a JSON file and attach it to a collection.

<a id="gtars.refget.RefgetStore.into_readonly"></a>

#### `into_readonly`

```python
def into_readonly() -> ReadonlyRefgetStore
```

Convert to a ReadonlyRefgetStore for concurrent read access.

Consumes this store (replacing it with an empty in-memory store)
and returns a ReadonlyRefgetStore whose read methods all use `&self`
(no mutable borrow), making it suitable for `Arc<ReadonlyRefgetStore>`
in servers.

Call `load_all_collections()` or `load_collection()` before
converting, since ReadonlyRefgetStore cannot lazy-load.

**Returns:**

- *[ReadonlyRefgetStore](#gtars.refget.ReadonlyRefgetStore)*: An immutable store suitable for concurrent access.

Example:

```
store = RefgetStore.open_remote("/cache", "https://example.com")
store.load_all_collections()
readonly = store.into_readonly()
coll = readonly.get_collection("abc123")
```

<a id="gtars.refget.RefgetStore.__len__"></a>

#### `__len__`

```python
def __len__() -> int
```

<a id="gtars.refget.RefgetStore.__iter__"></a>

#### `__iter__`

```python
def __iter__() -> Iterator[SequenceMetadata]
```

<a id="gtars.refget.RefgetStore.__str__"></a>

#### `__str__`

```python
def __str__() -> str
```

<a id="gtars.refget.RefgetStore.__repr__"></a>

#### `__repr__`

```python
def __repr__() -> str
```

<a id="gtars.refget.ReadonlyRefgetStore"></a>

## `ReadonlyRefgetStore`

```python
class ReadonlyRefgetStore
```

An immutable RefgetStore for concurrent read access.

All read methods use immutable references, making this suitable for
concurrent access patterns (e.g., shared across threads in a server).

This type has NO write methods and NO constructors -- it is only
obtainable via `RefgetStore.into_readonly()`.

Read methods that require preloaded data (e.g., `get_collection()`)
will error if the data was not loaded before conversion.

**Attributes:**

- `cache_path` (*Optional[str]*): Local directory path where the store is located or cached.
  None for in-memory stores.
- `remote_url` (*Optional[str]*): Remote URL of the store if loaded remotely, None otherwise.
- `storage_mode` (*[StorageMode](#gtars.refget.StorageMode)*): Current storage mode (Raw or Encoded).

Example:

```
store = RefgetStore.open_remote("/cache", "https://example.com")
store.load_all_collections()
readonly = store.into_readonly()
coll = readonly.get_collection("abc123")
```

### Attributes

- <a id="gtars.refget.ReadonlyRefgetStore.cache_path"></a>**`cache_path`** (*Optional[str]*)
- <a id="gtars.refget.ReadonlyRefgetStore.remote_url"></a>**`remote_url`** (*Optional[str]*)

### Properties

<a id="gtars.refget.ReadonlyRefgetStore.storage_mode"></a>

#### `storage_mode`

```python
@property
def storage_mode -> StorageMode
```

Current storage mode (Raw or Encoded).

### Methods

<a id="gtars.refget.ReadonlyRefgetStore.list_collections"></a>

#### `list_collections`

```python
def list_collections(page: int = 0, page_size: int = 100, filters: Optional[Dict[str, str]] = None) -> Dict[str, Any]
```

List collections with pagination and optional attribute filtering.

<a id="gtars.refget.ReadonlyRefgetStore.get_collection_metadata"></a>

#### `get_collection_metadata`

```python
def get_collection_metadata(collection_digest: str) -> Optional[SequenceCollectionMetadata]
```

Get metadata for a collection by digest.

<a id="gtars.refget.ReadonlyRefgetStore.get_collection"></a>

#### `get_collection`

```python
def get_collection(collection_digest: str) -> SequenceCollection
```

Get a collection by digest with all sequences loaded.

Requires that the collection was preloaded before conversion.

**Parameters:**

- `collection_digest` (*str*): The collection's SHA-512/24u digest.

**Returns:**

- *[SequenceCollection](#gtars.refget.SequenceCollection)*: The collection with all sequence data loaded.

**Raises:**

- *IOError*: If the collection was not preloaded.

<a id="gtars.refget.ReadonlyRefgetStore.is_collection_loaded"></a>

#### `is_collection_loaded`

```python
def is_collection_loaded(collection_digest: str) -> bool
```

Check if a collection is fully loaded.

<a id="gtars.refget.ReadonlyRefgetStore.get_collection_level1"></a>

#### `get_collection_level1`

```python
def get_collection_level1(digest: str) -> dict
```

Get level 1 representation (attribute digests) for a collection.

<a id="gtars.refget.ReadonlyRefgetStore.get_collection_level2"></a>

#### `get_collection_level2`

```python
def get_collection_level2(digest: str) -> dict
```

Get level 2 representation (full arrays) for a collection.

<a id="gtars.refget.ReadonlyRefgetStore.match_sequence_names"></a>

#### `match_sequence_names`

```python
def match_sequence_names(digest_a: str, digest_b: str) -> dict[str, Any]
```

Match collection-local names by sequence content.

Each result row has digest, length, names_a, and names_b.

**Raises:**

- *KeyError*: If either collection digest is unknown.

<a id="gtars.refget.ReadonlyRefgetStore.compare"></a>

#### `compare`

```python
def compare(digest_a: str, digest_b: str) -> dict
```

Compare two collections by digest.

<a id="gtars.refget.ReadonlyRefgetStore.find_collections_by_attribute"></a>

#### `find_collections_by_attribute`

```python
def find_collections_by_attribute(attr_name: str, attr_digest: str) -> List[str]
```

Find collections by attribute digest.

<a id="gtars.refget.ReadonlyRefgetStore.get_attribute"></a>

#### `get_attribute`

```python
def get_attribute(attr_name: str, attr_digest: str) -> Optional[list]
```

Get attribute array by digest.

<a id="gtars.refget.ReadonlyRefgetStore.has_ancillary_digests"></a>

#### `has_ancillary_digests`

```python
def has_ancillary_digests() -> bool
```

Returns whether ancillary digests are enabled.

<a id="gtars.refget.ReadonlyRefgetStore.has_attribute_index"></a>

#### `has_attribute_index`

```python
def has_attribute_index() -> bool
```

Returns whether the on-disk attribute index is enabled.

<a id="gtars.refget.ReadonlyRefgetStore.list_sequences"></a>

#### `list_sequences`

```python
def list_sequences() -> List[SequenceMetadata]
```

List all sequence metadata in the store.

<a id="gtars.refget.ReadonlyRefgetStore.get_sequence_metadata"></a>

#### `get_sequence_metadata`

```python
def get_sequence_metadata(seq_digest: str) -> Optional[SequenceMetadata]
```

Get metadata for a sequence by digest.

<a id="gtars.refget.ReadonlyRefgetStore.get_sequence"></a>

#### `get_sequence`

```python
def get_sequence(digest: str) -> SequenceRecord
```

Retrieve a sequence record by its digest.

**Parameters:**

- `digest` (*str*): Sequence digest (SHA-512/24u or MD5).

**Returns:**

- *[SequenceRecord](#gtars.refget.SequenceRecord)*: The sequence record with data.

**Raises:**

- *KeyError*: If the sequence is not found.

<a id="gtars.refget.ReadonlyRefgetStore.get_sequence_by_name"></a>

#### `get_sequence_by_name`

```python
def get_sequence_by_name(collection_digest: str, sequence_name: str) -> SequenceRecord
```

Retrieve a sequence by collection digest and sequence name.

**Parameters:**

- `collection_digest` (*str*): The collection's SHA-512/24u digest.
- `sequence_name` (*str*): Name of the sequence within that collection.

**Returns:**

- *[SequenceRecord](#gtars.refget.SequenceRecord)*: The sequence record with data.

**Raises:**

- *KeyError*: If the sequence is not found.

<a id="gtars.refget.ReadonlyRefgetStore.get_substring"></a>

#### `get_substring`

```python
def get_substring(seq_digest: str, start: int, end: int) -> str
```

Extract a substring from a sequence (flow 1: lean partial read).

Source resolution is resident -> local `.seq` -> remote HTTP
byte-range; remote stores are served with no preload and without
downloading whole sequences.

**Parameters:**

- `seq_digest` (*str*): Sequence digest (SHA-512/24u).
- `start` (*int*): Start position (0-based, inclusive).
- `end` (*int*): End position (0-based, exclusive).

**Returns:**

- *str*: The substring sequence.

**Raises:**

- *KeyError*: If the sequence is not found.

<a id="gtars.refget.ReadonlyRefgetStore.stream_sequence"></a>

#### `stream_sequence`

```python
def stream_sequence(seq_digest: str, start: Optional[int] = None, end: Optional[int] = None, chunk_size: int = 65536) -> SequenceStream
```

Stream a (sub)sequence as decoded bases without loading it (flow 2).

Returns a `SequenceStream` yielding `str` chunks lazily from
resident bytes, a local `.seq`, or a remote HTTP byte-range. Peak
memory is O(1) in the region length. Omit `start`/`end` to stream
the whole sequence.

<a id="gtars.refget.ReadonlyRefgetStore.stats"></a>

#### `stats`

```python
def stats() -> dict
```

Returns statistics about the store.

<a id="gtars.refget.ReadonlyRefgetStore.get_sequence_metadata_by_alias"></a>

#### `get_sequence_metadata_by_alias`

```python
def get_sequence_metadata_by_alias(namespace: str, alias: str) -> Optional[SequenceMetadata]
```

Resolve a sequence alias to sequence metadata.

<a id="gtars.refget.ReadonlyRefgetStore.get_sequence_by_alias"></a>

#### `get_sequence_by_alias`

```python
def get_sequence_by_alias(namespace: str, alias: str) -> Optional[SequenceRecord]
```

Resolve a sequence alias and return the loaded sequence record.

<a id="gtars.refget.ReadonlyRefgetStore.get_aliases_for_sequence"></a>

#### `get_aliases_for_sequence`

```python
def get_aliases_for_sequence(digest: str) -> list[tuple[str, str]]
```

Reverse lookup: find all (namespace, alias) pairs for this sequence.

<a id="gtars.refget.ReadonlyRefgetStore.list_sequence_alias_namespaces"></a>

#### `list_sequence_alias_namespaces`

```python
def list_sequence_alias_namespaces() -> list[str]
```

List all sequence alias namespaces.

<a id="gtars.refget.ReadonlyRefgetStore.list_sequence_aliases"></a>

#### `list_sequence_aliases`

```python
def list_sequence_aliases(namespace: str) -> Optional[list[str]]
```

List all aliases in a sequence alias namespace.

<a id="gtars.refget.ReadonlyRefgetStore.get_collection_metadata_by_alias"></a>

#### `get_collection_metadata_by_alias`

```python
def get_collection_metadata_by_alias(namespace: str, alias: str) -> Optional[SequenceCollectionMetadata]
```

Resolve a collection alias to collection metadata.

<a id="gtars.refget.ReadonlyRefgetStore.get_collection_by_alias"></a>

#### `get_collection_by_alias`

```python
def get_collection_by_alias(namespace: str, alias: str) -> Optional[SequenceCollection]
```

Resolve a collection alias and return the loaded collection.

<a id="gtars.refget.ReadonlyRefgetStore.get_aliases_for_collection"></a>

#### `get_aliases_for_collection`

```python
def get_aliases_for_collection(digest: str) -> list[tuple[str, str]]
```

Reverse lookup: find all (namespace, alias) pairs for this collection.

<a id="gtars.refget.ReadonlyRefgetStore.list_collection_alias_namespaces"></a>

#### `list_collection_alias_namespaces`

```python
def list_collection_alias_namespaces() -> list[str]
```

List all collection alias namespaces.

<a id="gtars.refget.ReadonlyRefgetStore.list_collection_aliases"></a>

#### `list_collection_aliases`

```python
def list_collection_aliases(namespace: str) -> Optional[list[str]]
```

List all aliases in a collection alias namespace.

<a id="gtars.refget.ReadonlyRefgetStore.get_fhr_metadata"></a>

#### `get_fhr_metadata`

```python
def get_fhr_metadata(collection_digest: str) -> Optional[FhrMetadata]
```

Get FHR metadata for a collection.

<a id="gtars.refget.ReadonlyRefgetStore.list_fhr_metadata"></a>

#### `list_fhr_metadata`

```python
def list_fhr_metadata() -> list[str]
```

List all collection digests that have FHR metadata.

<a id="gtars.refget.ReadonlyRefgetStore.__len__"></a>

#### `__len__`

```python
def __len__() -> int
```

<a id="gtars.refget.ReadonlyRefgetStore.__str__"></a>

#### `__str__`

```python
def __str__() -> str
```

<a id="gtars.refget.ReadonlyRefgetStore.__repr__"></a>

#### `__repr__`

```python
def __repr__() -> str
```

<a id="gtars.refget.sha512t24u_digest"></a>

## `sha512t24u_digest`

```python
def sha512t24u_digest(readable: Union[str, bytes]) -> str
```

Compute the GA4GH SHA-512/24u digest for a sequence.

This function computes the GA4GH refget standard digest (truncated SHA-512,
base64url encoded) for a given sequence string or bytes.

**Parameters:**

- `readable` (*Union[str, bytes]*): Input sequence as str or bytes.

**Returns:**

- *str*: The SHA-512/24u digest (32 character base64url string).

**Raises:**

- *TypeError*: If input is not str or bytes.

Example:

```
from gtars.refget import sha512t24u_digest
digest = sha512t24u_digest("ACGT")
print(digest)
# Output: 'aKF498dAxcJAqme6QYQ7EZ07-fiw8Kw2'
```

<a id="gtars.refget.md5_digest"></a>

## `md5_digest`

```python
def md5_digest(readable: Union[str, bytes]) -> str
```

Compute the MD5 digest for a sequence.

This function computes the MD5 hash for a given sequence string or bytes.
MD5 is supported for backward compatibility with legacy systems.

**Parameters:**

- `readable` (*Union[str, bytes]*): Input sequence as str or bytes.

**Returns:**

- *str*: The MD5 digest (32 character hexadecimal string).

**Raises:**

- *TypeError*: If input is not str or bytes.

Example:

```
from gtars.refget import md5_digest
digest = md5_digest("ACGT")
print(digest)
# Output: 'f1f8f4bf413b16ad135722aa4591043e'
```

<a id="gtars.refget.digest_fasta"></a>

## `digest_fasta`

```python
def digest_fasta(fasta: Union[str, PathLike]) -> SequenceCollection
```

Digest all sequences in a FASTA file and compute collection-level digests.

This function reads a FASTA file and computes GA4GH-compliant digests for
each sequence, as well as collection-level digests (Level 1 and Level 2)
following the GA4GH refget specification.

**Parameters:**

- `fasta` (*Union[str, PathLike]*): Path to FASTA file (str or PathLike).

**Returns:**

- *[SequenceCollection](#gtars.refget.SequenceCollection)*: Collection containing all sequences with their metadata and computed digests.

**Raises:**

- *IOError*: If the FASTA file cannot be read or parsed.

Example:

```
from gtars.refget import digest_fasta
collection = digest_fasta("genome.fa")
print(f"Collection digest: {collection.digest}")
print(f"Number of sequences: {len(collection)}")
```

<a id="gtars.refget.compute_fai"></a>

## `compute_fai`

```python
def compute_fai(fasta: Union[str, PathLike]) -> List[FaiRecord]
```

Compute FASTA index (FAI) metadata for all sequences in a FASTA file.

This function computes the FAI index metadata (offset, line_bases, line_bytes)
for each sequence in a FASTA file, compatible with samtools faidx format.
Only works with uncompressed FASTA files.

**Parameters:**

- `fasta` (*Union[str, PathLike]*): Path to FASTA file (str or PathLike). Must be uncompressed.

**Returns:**

- *List[[FaiRecord](#gtars.refget.FaiRecord)]*: List of FAI records, one per sequence, containing name, length,
- *List[[FaiRecord](#gtars.refget.FaiRecord)]*: and FAI metadata (offset, line_bases, line_bytes).

**Raises:**

- *IOError*: If the FASTA file cannot be read or is compressed.

Example:

```
from gtars.refget import compute_fai
fai_records = compute_fai("genome.fa")
for record in fai_records:
    print(f"{record.name}: {record.length} bp")
```

<a id="gtars.refget.load_fasta"></a>

## `load_fasta`

```python
def load_fasta(fasta: Union[str, PathLike]) -> SequenceCollection
```

Load a FASTA file with sequence data into a SequenceCollection.

This function reads a FASTA file and loads all sequences with their data
into memory. Unlike digest_fasta(), this includes the actual sequence data,
not just metadata.

**Parameters:**

- `fasta` (*Union[str, PathLike]*): Path to FASTA file (str or PathLike).

**Returns:**

- *[SequenceCollection](#gtars.refget.SequenceCollection)*: Collection containing all sequences with their metadata and sequence data loaded.

**Raises:**

- *IOError*: If the FASTA file cannot be read or parsed.

Example:

```
from gtars.refget import load_fasta
collection = load_fasta("genome.fa")
first_seq = collection[0]
print(f"Sequence: {first_seq.decode()[:50]}...")
```

<a id="gtars.refget.digest_sequence"></a>

## `digest_sequence`

```python
def digest_sequence(data: bytes, name: Optional[str] = None, description: Optional[str] = None) -> SequenceRecord
```

Create a SequenceRecord from raw data, computing all metadata.

This is the sequence-level parallel to digest_fasta() for collections.
It computes the GA4GH sha512t24u digest, MD5 digest, detects the alphabet,
and returns a SequenceRecord with computed metadata and the original data.

The input data is automatically uppercased to ensure consistent digest
computation (matching FASTA processing behavior).

**Parameters:**

- `data` (*bytes*): The raw sequence bytes (e.g., b"ACGTACGT").
- `name` (*Optional[str]*): Optional sequence name (e.g., "chr1"). Defaults to "" if not provided. (default: `None`)
- `description` (*Optional[str]*): Optional description text for the sequence. (default: `None`)

**Returns:**

- *[SequenceRecord](#gtars.refget.SequenceRecord)*: A SequenceRecord with computed metadata and the original data (uppercased).

Example:

```
from gtars.refget import digest_sequence
seq = digest_sequence(b"ACGTACGT")
print(seq.metadata.length)
# Output: 8

seq = digest_sequence(b"ACGT", name="chr1")
print(seq.metadata.name, seq.metadata.length)
# Output: chr1 4

# With description
seq2 = digest_sequence(b"ACGT", name="chr1", description="Chromosome 1")
print(seq2.metadata.description)
# Output: Chromosome 1
```
