This answer is gold! I hope to one day become as knowledgeable as you are :) Thanks for taking the time to explain it in detail.
Is there a way to map this region? UCSC fails to map it:
#Split in new
chr1 145686997 148411223
And using rtracklayer gives this, crazy that it shows it in other chromosomes!
seqnames start end width strand
1 chr1 16830338 207808943 190978606 *
2 chr2 185430339 185430652 314 *
3 chr15 75867352 75867613 262 *
4 chr11 96457352 96457949 598 *
5 chrX 154139324 154139373 50 *
6 chr12 93794626 93794653 28 *
7 chr7 48030087 48030114 28 *
1 answer
Hi _quantum_girl_,
A little crazy, maybe; it's an artifact predicated upon confluence of 3 issues I'll describe a bit below:
- The technologies and procedures used to create the assemblies you're working between.
- The sequence characteristics at the locus in question; here, 1q21.1 locus and the history of its assembly
- The tool chosen and exact settings used for the procedure (here, liftover; UCSC)
Both assemblies are predominantly clone-based — built on Bacterial Artificial Chromosome (BAC) tiling paths sequenced with Sanger capillary chemistry, with some WGS-derived components and modelled centromeric sequence in GRCh38. For perspective, Schneider et al. 2017 report that the RP11 BAC library contributes ~70% of the GRCh38 primary assembly, and the GRC FAQ notes that ~93% of GRCh38 comes from eleven genomic clone libraries collectively. The fundamental issue at the locus in question is that 1q21.1 is highly enriched for segmental duplications — specifically, NBPF genes containing DUF1220 domains (renamed "Olduvai" domains by Sikela & van Roy in 2018; the NBPF gene family name itself was retained) arrayed in tandem.
When clone-based finishing and assembly processed this region using diploid, polymorphic source material, the duplicated blocks may not be unambiguously resolved. Consequently, the pipelines struggled to distinguish allelic heterozygosity (normal variation between maternal and paternal chromosomes) from paralogy (distinct duplicated segments on the same chromosome). As a result, hg19 over-collapsed repetitive content in 1q21 and left 14 gaps across the 7.7 Mb 1q21.1–q21.2 region, with accompanying gene-order changes, copy-number errors, and two inverted loci later identified during re-finishing.
To resolve this at this specific locus for hg38, the GRC incorporated sequence from the CHM1 cell line to re-finish the 1q21 region; CHM1-derived BAC work informed the GRCh38 representation of 1q21 specifically, not the assembly as a whole. CHM1 is derived from a complete hydatidiform mole: karyotypically 46,XX but essentially homozygous / single-haplotype due to paternal uniparental isodisomy, which makes it effectively haploid at the sequence level. As O'Bleness et al. put it: "diploidization results in a 46 XX karyotype in which all allelic variation has been eliminated allowing the unambiguous delineation of duplicated DNA." With allelic variation eliminated, sequence differences among clone-derived alignments are attributable to paralogy rather than heterozygosity. This allowed the GRC to close all 14 gaps, correct gene-order and copy-number representations, and resolve two inverted (or possibly polymorphic) loci in the region (methodology is detailed in O'Bleness et al. 2014. The same single-haplotype CHM rationale — using the distinct CHM13 cell line with PacBio HiFi + Oxford Nanopore ultra-long reads (rather than BAC-based finishing) — later drove the T2T consortium's gapless assembly, Nurk et al. 2022.)
Because hg38 reorganized this sequence, attempting to map your 2.7 Mb bounding box (chr1:145686997-148411223) results in disjointed mapping. Note that this interval actually straddles the 1q21.1/1q21.2 cytoband boundary — 1q21.1 ends at chr1:147,500,000 and 1q21.2 begins at chr1:147,500,001 in hg38 — enclosing ~1.81 Mb of 1q21.1 and ~0.91 Mb of 1q21.2. It encompasses but is substantially broader than the recurrent distal 1q21.1 BP3–BP4 minimum region (chr1:147,105,904–147,917,509, per GeneReviews NBK52787).
The two tools you mentioned handle this structural fragmentation differently:
- UCSC's liftOver: Applies the
-minMatchparameter (compile-time default 0.95; UCSC recommends lowering this for cross-species chain files or poor-quality assemblies).minMatchis the minimum ratio of bases that must remap to the target — not a contiguity constraint and not a sequence-identity threshold. When thehg38region fragments across many chains inhg19, no candidate mapping satisfies theminMatchthreshold for a single returned interval, and liftOver writes the region to its.unmappedoutput with the reasonSplit in new(prefixed#as a comment in the unmapped file). rtracklayer: Its publicliftOver(x, chain)does not expose UCSC'sminMatchknob in the public API; it returns aGRangesListwhose elements may be one-to-many — that is, each input range can resolve to multiple mapped sub-ranges in the target. Since 1q21.1 is packed with duplications, small query sub-sequences can be mapped to paralogous loci, sometimes on other chromosomes (if that is what your first result-table row showed, those are the mapped fragments). Two distinct phenomena then inflate downstream summaries if you are not careful:- Within-chromosome inflation from
range().range()in GenomicRanges returns bounds per(seqname, strand)pairing. If your lifted fragments span both arms of chr1 (e.g., a tiny paralog hit on 1p together with the main 1q hit), the per-chromosome range on chr1 covers the full span between them — producing the ~190 Mb interval you observed on chr1. - Cross-chromosome fragments. Paralog hits on other chromosomes (e.g., chr2, chr15) remain as separate elements of the
GRangesList—range()does not collapse them into a single synthetic interval across chromosomes, but they will still appear in a flattened result table and can mislead a casualsummary()or a naïvemin/maxover coordinates.
- Within-chromosome inflation from
You should not assume that a single continuous hg38 interval at this locus maps cleanly or biologically meaningfully onto hg19. The chain-alignment framework underlying liftOver does tolerate mismatches and gaps, so "collinearity" here means sufficient local syntenic alignability with consistent orientation and spacing — not identity. For a duplication-rich locus like 1q21.1, that assumption fails for several reasons:
- Internal expansions/collapses:
hg38unpacked collapsed repeat structures at this locus. A 50 kb repeat array inhg19might correspond to 150 kb inhg38. Linear bounding-box math scales internal features incorrectly. - Sequence inversions:
hg38corrected two inverted loci here. A linear translation of an outer bounding box ignores those directional flips and misplaces internal features. - Fragmentation: A sequence represented as one continuous hg38 interval may correspond to multiple chain-aligned fragments in hg19 rather than a single syntenic interval (hence
#Split in new).
Depending on your downstream application, consider one of the following:
1. Map features, not regions — but use the right tool per feature class
- ATAC-seq / ChIP-seq peaks, narrow BED intervals, gene bodies: liftOver is generally reasonable. Lift your
hg19features up tohg38and inspect the mapping. - SNPs / small variants: UCSC specifically discourages plain liftOver for SNP coordinate conversion. Use dbSNP's assembly-specific placements for rsIDs, or Ensembl's Assembly Converter (which wraps CrossMap) with post-checks. Note: NCBI Remap was retired in November 2023 and should no longer be used.
2. Extract and map the boundaries (heuristic only) If you need a broad hg19 bounding box solely to pre-filter a VCF or similar file, extract the 1-bp start and end breakpoints, lift them independently, and rebuild the interval. Caveat: at a locus with internal expansions, inversions, and fragmentation, an interval reconstructed this way is a heuristic for subsetting — it is not a biologically faithful mapping of the original region, and it should not be treated as equivalent to the source interval.
library(rtracklayer)
library(GenomicRanges)
# Define your region in hg38
gr_hg38 <- GRanges("chr1", IRanges(145686997, 148411223))
# Extract the start and end as independent 1-bp boundaries
boundaries_hg38 <- c(
GRanges("chr1", IRanges(start(gr_hg38), start(gr_hg38))),
GRanges("chr1", IRanges(end(gr_hg38), end(gr_hg38)))
)
# Load your chain file
chain <- import.chain("hg38ToHg19.over.chain")
# Lift over the 1-bp boundaries independently
mapped_boundaries <- unlist(liftOver(boundaries_hg38, chain))
print(mapped_boundaries)
3. Use build-specific curated locus definitions If you are analyzing the recurrent 1q21.1 structural variant syndromes — the distal microdeletion syndrome (OMIM #612474) and microduplication syndrome (OMIM #612475) — prefer build-specific curated locus definitions from clinical resources such as ClinVar, DECIPHER, ClinGen dosage curations, and GeneReviews (NBK52787). These are the right primary source for defining the clinical locus in a given assembly; practical breakpoint coordinates vary by assay design and interpretation, so "native curated coordinates for your target build" is safer than lifting coordinates across assemblies.
Log in to answer this question.
Liftover from
hg19tohg38or other way? You forgot to add that in the original question.Just edited the question
You can delete the other question you posted earlier since it appears to be a duplicate of this one.Just in case there is a potential error, you can also post this on UCSC browsers google group help forum: https://groups.google.com/a/soe.ucsc.edu/g/genome
The other question is slightly different since it's about using rtracklayer and how to merge overlapping fragments. Thanks for the other suggestion!