## ----setup, include = FALSE---------------------------------------------------
knitr::opts_chunk$set(
    collapse = TRUE,
    comment = "#>",
    fig.width = 6,
    fig.height = 4,
    dpi = 150
)

## ----install, eval=FALSE------------------------------------------------------
# # Install from Bioconductor (when available)
# if (!requireNamespace("BiocManager", quietly = TRUE))
#     install.packages("BiocManager")
# BiocManager::install("GenomicCoordinates")
# 
# # Or install development version from GitHub
# BiocManager::install("js2264/GenomicCoordinates")

## ----load-library-------------------------------------------------------------
library(GenomicCoordinates)

## ----auto-detection-----------------------------------------------------------
# Standard genomic ranges
GenomicCoordinates("chr1:1000-2000")

# Single positions (returns GPos)
GenomicCoordinates("chr1:1000:-")

# Genomic interactions (returns GInteractions)
GenomicCoordinates("chr1:1-10:-|chr2:20-30:+")

# Pure numeric ranges (returns IRanges)
GenomicCoordinates("1,000-2,000")

## ----comma-separated----------------------------------------------------------
# GenomicCoordinates handles comma-separated numbers seamlessly
GenomicCoordinates("chr1:100,000-200,000")

# Works with single positions too
GenomicCoordinates("chr1:1,234,567")

# And with strand information
GenomicCoordinates("chr1:100,000-200,000:+")

## ----space-delimited----------------------------------------------------------
# Basic space-delimited format
GenomicCoordinates("chr1 1000 2000")

# Irregular spacing is handled automatically
GenomicCoordinates("chr1    1000     2000")

# Mixed format with strand
GenomicCoordinates("chr1  1000   2000:+")

# Single positions with spaces
GenomicCoordinates("chr1 1000")

## ----complex-chr-names--------------------------------------------------------
# Chromosome names with spaces (common in some organisms)
GenomicCoordinates("chr I:1000-2000")

# Scaffold and contig names
GenomicCoordinates("scaffold_123:1000-2000")
GenomicCoordinates("GL000001.1:1000-2000")

# Organism-specific naming conventions
GenomicCoordinates("2L:1000-2000")  # Drosophila
GenomicCoordinates("chrUn_GL000220v1:1000-2000")  # Unplaced scaffolds

## ----single-vs-ranges---------------------------------------------------------
# Single positions automatically return GPos objects
pos_result <- GenomicCoordinates("chr1:1000")
class(pos_result)
pos(pos_result)

# Ranges return GRanges objects
range_result <- GenomicCoordinates("chr1:1000-2000")
class(range_result)
start(range_result)
end(range_result)

## ----genomic-interactions-----------------------------------------------------
# Simple interaction
interaction <- GenomicCoordinates("chr1:1-10|chr2:20-30")
class(interaction)

# Check the anchor points
InteractionSet::anchors(interaction, "first")
InteractionSet::anchors(interaction, "second")

# Works with complex and formatting too
GenomicCoordinates("chr1 1000 10000  |  chr2:20,000-30,000")

## ----iranges-non-genomic------------------------------------------------------
# Pure numeric ranges
numeric_range <- GenomicCoordinates("1000-2000")
class(numeric_range)

# Works with comma-separated numbers
GenomicCoordinates("1,000-2,000")

# And space-delimited format
GenomicCoordinates("1000 2000")

## ----force-class--------------------------------------------------------------
# Force a single position to be a GRanges instead of GPos
GenomicCoordinates("chr1:1000", force_class = "GRanges")

# Force a single position to be a GPos
# instead of GRanges (removes the `end` coordinate)
GenomicCoordinates("chr1:1000-2000", force_class = "GPos")

# Force a genomic range to be an IRanges (extracts just coordinates)
GenomicCoordinates("chr1:1000-2000", force_class = "IRanges")

# Force a single range to be a GInteractions (creates self-interaction)
GenomicCoordinates("chr1:1000-2000", force_class = "GInteractions")

## ----vector-input-------------------------------------------------------------
# Mixed vector of single positions and ranges
mixed_coords <- c("chr1:1000", "chr2:2000-3000", "chr3:5000")
GenomicCoordinates(mixed_coords)

# All single positions return GPos
single_positions <- c("chr1:1000", "chr2:2000", "chr3:3000")
GenomicCoordinates(single_positions)

# Vector of interactions
interactions <- c("chr1:1-10|chr2:20-30", "chr3:100-200|chr4:300-400")
GenomicCoordinates(interactions)

## ----explicit-conversion------------------------------------------------------
# Convert to GRanges
as_granges("chr1:100,000-200,000")

# Convert to GPos
as_gpos("chr1:1,234,567")

# Convert to GInteractions
as_ginteractions("chr1:1,000-10,000|chr2:20,000-30,000")

# Convert to IRanges
as_iranges("1,000-2,000")

## ----class-detection----------------------------------------------------------
# Detect classes for various input types
inputs <- c(
    "chr1:1000-2000",
    "chr1:1000",
    "chr1:1-10|chr2:20-30",
    "1000-2000"
)

detect_genomic_class(inputs)

## ----session-info-------------------------------------------------------------
sessionInfo()

