This document implements and compares two trajectory methods for normal CD4 T cells, then projects Sézary syndrome CD4 T cells onto both reference trajectories.
cell_data_setlearn_graph() fits principal graph to data
topologyorder_cells() rooted at CD4 Naive centroid →
pseudotimegraph_test() identifies trajectory-variable genes| Object | Description | Required columns |
|---|---|---|
cd4_ref |
Annotated normal CD4 T cells | $predicted.celltype.l2, UMAP, RNA |
sezary_obj |
Sézary CD4 T cells | RNA (normalised), optional ADT |
install.packages(c("igraph","RANN","ggrepel","patchwork","pheatmap","viridis"))
BiocManager::install("monocle3")
remotes::install_github("satijalab/seurat-wrappers")
suppressPackageStartupMessages({
library(Seurat)
library(SeuratWrappers)
library(monocle3)
library(igraph)
library(RANN)
library(ggplot2)
library(ggrepel)
library(dplyr)
library(tidyr)
library(patchwork)
library(pheatmap)
library(viridis)
library(scales)
library(RColorBrewer)
library(knitr)
library(kableExtra)
})
STATE_COLORS <- c(
"CD4 Naive" = "#4472C4",
"CD4 TCM" = "#70AD47",
"CD4 TEM" = "#ED7D31",
"CD4 Temra/CTL" = "#C00000",
"Treg" = "#7030A0"
)
METHOD_COLORS <- c(
"Monocle3" = "#e74c3c",
"Custom MST" = "#2980b9"
)
STATE_ORDER <- c("CD4 Naive","CD4 TCM","CD4 TEM","CD4 Temra/CTL","Treg")
UMAP_NAME <- "umap"
STATE_COL <- "predicted.celltype.l2"
# BIOINFORMATICIAN NOTE on resolutions:
# Dotplot showed M03 was TCM-like (LTB+/IL7R+, no effector markers) —
# this means resolution 0.08 for TCM was still too high, producing 3 TCM
# milestones instead of 2. Reducing to 0.05 collapses the third TCM milestone
# so the sub-clustering yields exactly 2 TCM milestones (early and late).
# TEM resolution increased to 0.30 to better separate TEM from Temra.
MILESTONE_RES <- c(
"CD4 Naive" = 0.05, # CHANGED 0.10→0.05: single homogeneous milestone
"CD4 TCM" = 0.05, # CHANGED 0.08→0.05: was producing 3 milestones, need 2
"CD4 TEM" = 0.30, # CHANGED 0.20→0.30: better separation of TEM vs Temra
"CD4 Temra/CTL" = 0.10, # unchanged — single milestone (only 10 cells)
"Treg" = 0.20 # unchanged — 2 milestones (naive + terminal)
)
cat("✓ Setup complete\n")
✓ Setup complete
cat("\nState colours:\n"); print(STATE_COLORS)
State colours:
CD4 Naive CD4 TCM CD4 TEM CD4 Temra/CTL Treg
"#4472C4" "#70AD47" "#ED7D31" "#C00000" "#7030A0"
cat("\nMilestone resolutions:\n"); print(MILESTONE_RES)
Milestone resolutions:
CD4 Naive CD4 TCM CD4 TEM CD4 Temra/CTL Treg
0.05 0.05 0.30 0.10 0.20
cat("\nState column:", STATE_COL, "\n")
State column: predicted.celltype.l2
cat("UMAP name: ", UMAP_NAME, "\n")
UMAP name: umap
cd4_ref <- readRDS("../../CD4_reference_clean_Azimuth_ready_for_Slingshot.rds")
sezary_obj <- readRDS("/home/nabbasi/apollo_home/1-Seurat_RDS_OBJECT_FINAL/All_samples_Merged_with_Renamed_Clusters_Cell_state-03-12-2025.rds.rds")
cat("CD4 reference loaded:", ncol(cd4_ref), "cells\n")
CD4 reference loaded: 11466 cells
cat("Sezary object loaded:", ncol(sezary_obj), "cells\n")
Sezary object loaded: 49305 cells
cat("\nAzimuth l2 labels present:\n")
Azimuth l2 labels present:
print(table(cd4_ref@meta.data[[STATE_COL]]))
CD4 Naive CD4 TCM CD4 TEM CD4 Temra/CTL Treg
2037 9067 145 10 207
stopifnot(
"predicted.celltype.l2 missing from cd4_ref" = STATE_COL %in% colnames(cd4_ref@meta.data),
"UMAP missing from cd4_ref" = UMAP_NAME %in% names(cd4_ref@reductions),
"RNA assay missing from cd4_ref" = "RNA" %in% names(cd4_ref@assays),
"RNA assay missing from sezary_obj" = "RNA" %in% names(sezary_obj@assays)
)
cat("✅ Validation passed\n")
✅ Validation passed
DefaultAssay(cd4_ref) <- "RNA"
DefaultAssay(sezary_obj) <- "RNA"
cd4_states_keep <- names(MILESTONE_RES)
cells_keep <- cd4_ref@meta.data[[STATE_COL]] %in% cd4_states_keep
if (sum(!cells_keep) > 0) {
cd4_ref <- subset(cd4_ref, cells = colnames(cd4_ref)[cells_keep])
cat("Subsetted to trajectory states:", ncol(cd4_ref), "cells\n")
}
umap_df <- as.data.frame(Embeddings(cd4_ref, UMAP_NAME))
colnames(umap_df) <- c("UMAP_1","UMAP_2")
umap_df$cell <- rownames(umap_df)
umap_df$state <- cd4_ref@meta.data[[STATE_COL]]
ref_summary <- cd4_ref@meta.data %>%
count(!!sym(STATE_COL), name = "n_cells") %>%
rename(State = !!sym(STATE_COL)) %>%
mutate(pct = round(100 * n_cells / sum(n_cells), 1)) %>%
arrange(match(State, STATE_ORDER))
kable(ref_summary,
caption = sprintf("Reference CD4 T cells (n = %d total)", ncol(cd4_ref))) %>%
kable_styling(bootstrap_options = c("striped","hover"), full_width = FALSE)
| State | n_cells | pct |
|---|---|---|
| CD4 Naive | 2037 | 17.8 |
| CD4 TCM | 9067 | 79.1 |
| CD4 TEM | 145 | 1.3 |
| CD4 Temra/CTL | 10 | 0.1 |
| Treg | 207 | 1.8 |
Custom MST approach (Burel et al. 2022): connects milestone centroids with a Minimum Spanning Tree; cells get pseudotime by projection onto nearest edge.
# ── Step 1: Distance matrix ────────────────────────────────────────────────
centroid_mat <- as.matrix(milestone_centroids[, c("UMAP_1","UMAP_2")])
rownames(centroid_mat) <- milestone_centroids$milestone
dist_mat <- as.matrix(dist(centroid_mat, method = "euclidean"))
# ── Step 2: Root = CD4 Naive ──────────────────────────────────────────────
tn_milestones <- milestone_centroids$milestone[milestone_centroids$state == "CD4 Naive"]
cat("CD4 Naive milestones:", tn_milestones, "\n")
CD4 Naive milestones: M00
if (length(tn_milestones) == 1) {
root_ms <- tn_milestones
} else {
tn_centroid <- colMeans(centroid_mat[tn_milestones, , drop = FALSE])
tn_dists <- rowSums((centroid_mat[tn_milestones, , drop = FALSE] -
matrix(tn_centroid, nrow=length(tn_milestones), ncol=2, byrow=TRUE))^2)
root_ms <- tn_milestones[which.min(tn_dists)]
}
cat("Root milestone:", root_ms, "\n")
Root milestone: M00
# ── Step 3: Automatic MST — inspect only ──────────────────────────────────
g_auto <- graph_from_adjacency_matrix(dist_mat, mode="undirected",
weighted=TRUE, diag=FALSE)
mst_auto <- mst(g_auto, algorithm="prim")
cat("\nAutomatic MST (reference only):\n")
Automatic MST (reference only):
auto_edges <- as_edgelist(mst_auto)
for (i in seq_len(nrow(auto_edges))) {
s1 <- milestone_centroids$state[milestone_centroids$milestone == auto_edges[i,1]]
s2 <- milestone_centroids$state[milestone_centroids$milestone == auto_edges[i,2]]
cat(sprintf(" %s(%s) — %s(%s)\n", auto_edges[i,1], s1, auto_edges[i,2], s2))
}
M00(CD4 Naive) — M01(CD4 TCM)
M01(CD4 TCM) — M06(Treg)
M02(CD4 TCM) — M06(Treg)
M03(CD4 TEM) — M05(CD4 Temra/CTL)
M04(CD4 TEM) — M05(CD4 Temra/CTL)
M04(CD4 TEM) — M07(Treg)
M06(Treg) — M07(Treg)
# ── Step 4: Build edgelist via state lookup ────────────────────────────────
ms_by_state <- function(state_name, rank = 1) {
candidates <- milestone_centroids[milestone_centroids$state == state_name, ]
if (nrow(candidates) < rank) stop(sprintf(
"State '%s' has only %d milestone(s), but rank=%d was requested.",
state_name, nrow(candidates), rank))
candidates <- candidates[order(candidates$UMAP_1), ]
candidates$milestone[rank]
}
naive_ms <- ms_by_state("CD4 Naive", 1)
tcm_e_ms <- ms_by_state("CD4 TCM", 1)
tcm_l_ms <- ms_by_state("CD4 TCM", 2)
tem_e_ms <- ms_by_state("CD4 TEM", 1)
tem_l_ms <- ms_by_state("CD4 TEM", 2)
temra_ms <- ms_by_state("CD4 Temra/CTL",1)
treg_n_ms <- ms_by_state("Treg", 1)
treg_t_ms <- ms_by_state("Treg", 2)
cat("\nState-to-Current-ID mapping:\n")
State-to-Current-ID mapping:
cat(sprintf(" Naive: %s\n TCM: %s(early), %s(late)\n", naive_ms, tcm_e_ms, tcm_l_ms))
Naive: M00
TCM: M02(early), M01(late)
cat(sprintf(" TEM: %s(early), %s(late)\n Temra: %s\n", tem_e_ms, tem_l_ms, temra_ms))
TEM: M04(early), M03(late)
Temra: M05
cat(sprintf(" Treg: %s(naive), %s(terminal)\n", treg_n_ms, treg_t_ms))
Treg: M06(naive), M07(terminal)
edge_list_ordered <- matrix(c(
naive_ms, tcm_e_ms,
tcm_e_ms, tcm_l_ms,
tcm_l_ms, tem_e_ms,
tem_e_ms, tem_l_ms,
tem_l_ms, temra_ms,
tcm_l_ms, treg_n_ms,
treg_n_ms, treg_t_ms
), ncol = 2, byrow = TRUE)
# ✅ FIXED: e[1] = row name, e[2] = col name → single numeric distance value
edge_weights <- apply(edge_list_ordered, 1, function(e) dist_mat[e[1], e[2]])
# Validate no NaN weights before building graph
if (any(!is.finite(edge_weights))) {
bad <- which(!is.finite(edge_weights))
print(data.frame(from=edge_list_ordered[bad,1],
to =edge_list_ordered[bad,2],
w =edge_weights[bad]))
stop("NaN/NA/Inf edge weights detected — check state lookup or dist_mat rownames.")
}
mst_graph <- graph_from_edgelist(edge_list_ordered, directed = FALSE)
E(mst_graph)$weight <- edge_weights
cat("\nManual edges defined:\n")
Manual edges defined:
for (i in seq_len(nrow(edge_list_ordered))) {
sf <- milestone_centroids$state[milestone_centroids$milestone == edge_list_ordered[i,1]]
st <- milestone_centroids$state[milestone_centroids$milestone == edge_list_ordered[i,2]]
cat(sprintf(" %s(%s) → %s(%s) w=%.4f\n",
edge_list_ordered[i,1], sf, edge_list_ordered[i,2], st, edge_weights[i]))
}
M00(CD4 Naive) → M02(CD4 TCM) w=5.6851
M02(CD4 TCM) → M01(CD4 TCM) w=5.4642
M01(CD4 TCM) → M04(CD4 TEM) w=5.6416
M04(CD4 TEM) → M03(CD4 TEM) w=1.4646
M03(CD4 TEM) → M05(CD4 Temra/CTL) w=0.7915
M01(CD4 TCM) → M06(Treg) w=3.5341
M06(Treg) → M07(Treg) w=2.2321
# ── Step 5: Explicit traversal order ──────────────────────────────────────
bfs_order_clean <- unique(as.vector(t(edge_list_ordered)))
cat("\nTraversal order:", paste(bfs_order_clean, collapse=" → "), "\n")
Traversal order: M00 → M02 → M01 → M04 → M03 → M05 → M06 → M07
stopifnot(
"Must have 8 milestones" = length(bfs_order_clean) == 8,
"Naive must be root" = bfs_order_clean[1] == naive_ms,
"Temra before Treg" = which(bfs_order_clean==temra_ms) < which(bfs_order_clean==treg_n_ms)
)
cat("✅ Traversal order validated\n")
✅ Traversal order validated
# ── Step 6: Rename to M00-M07 ─────────────────────────────────────────────
old_to_new <- setNames(sprintf("M%02d", seq_along(bfs_order_clean) - 1L), bfs_order_clean)
cat("\nRenaming map:\n")
Renaming map:
for (o in names(old_to_new)) {
st <- milestone_centroids$state[milestone_centroids$milestone == o]
cat(sprintf(" %s (%s) → %s\n", o, st, old_to_new[o]))
}
M00 (CD4 Naive) → M00
M02 (CD4 TCM) → M01
M01 (CD4 TCM) → M02
M04 (CD4 TEM) → M03
M03 (CD4 TEM) → M04
M05 (CD4 Temra/CTL) → M05
M06 (Treg) → M06
M07 (Treg) → M07
milestone_centroids$milestone <- old_to_new[milestone_centroids$milestone]
cd4_ref@meta.data$milestone <- unname(old_to_new[cd4_ref@meta.data$milestone])
names(milestone_state_map) <- old_to_new[names(milestone_state_map)]
rownames(centroid_mat) <- old_to_new[rownames(centroid_mat)]
rownames(dist_mat) <- old_to_new[rownames(dist_mat)]
colnames(dist_mat) <- old_to_new[colnames(dist_mat)]
V(mst_graph)$name <- unname(old_to_new[V(mst_graph)$name])
cat("✅ Renaming applied\n")
✅ Renaming applied
# ── Step 7: Verify final biology ──────────────────────────────────────────
milestone_order <- sprintf("M%02d", seq_len(nrow(milestone_centroids)) - 1L)
cat("\nFinal milestone → biology:\n")
Final milestone → biology:
for (m in milestone_order) {
st <- milestone_centroids$state[milestone_centroids$milestone == m]
nc <- milestone_centroids$n_cells[milestone_centroids$milestone == m]
cat(sprintf(" %s = %-20s n=%4d\n", m, st, nc))
}
M00 = CD4 Naive n=2037
M01 = CD4 TCM n= 388
M02 = CD4 TCM n=8679
M03 = CD4 TEM n= 64
M04 = CD4 TEM n= 81
M05 = CD4 Temra/CTL n= 10
M06 = Treg n= 146
M07 = Treg n= 61
cat("Expected:\n M00=Naive M01/M02=TCM M03/M04=TEM M05=Temra/CTL M06/M07=Treg\n")
Expected:
M00=Naive M01/M02=TCM M03/M04=TEM M05=Temra/CTL M06/M07=Treg
# ── Swap helper ────────────────────────────────────────────────────────────
swap_ms <- function(a, b) {
tmp <- "__TMP__"
vn <- V(mst_graph)$name
vn[vn==a] <- tmp; vn[vn==b] <- a; vn[vn==tmp] <- b; V(mst_graph)$name <<- vn
mc <- milestone_centroids$milestone
mc[mc==a] <- tmp; mc[mc==b] <- a; mc[mc==tmp] <- b; milestone_centroids$milestone <<- mc
mv <- cd4_ref@meta.data$milestone
mv[!is.na(mv)&mv==a] <- tmp; mv[!is.na(mv)&mv==b] <- a
mv[!is.na(mv)&mv==tmp] <- b; cd4_ref@meta.data$milestone <<- mv
nm <- names(milestone_state_map)
nm[nm==a] <- tmp; nm[nm==b] <- a; nm[nm==tmp] <- b; names(milestone_state_map) <<- nm
rn <- rownames(centroid_mat)
rn[rn==a] <- tmp; rn[rn==b] <- a; rn[rn==tmp] <- b; rownames(centroid_mat) <<- rn
rn <- rownames(dist_mat); cn <- colnames(dist_mat)
rn[rn==a] <- tmp; rn[rn==b] <- a; rn[rn==tmp] <- b; rownames(dist_mat) <<- rn
cn[cn==a] <- tmp; cn[cn==b] <- a; cn[cn==tmp] <- b; colnames(dist_mat) <<- cn
cat(sprintf(" Swapped %s <-> %s\n", a, b))
}
# swap_ms("M03","M04") # TEM early/late reversed?
# swap_ms("M06","M07") # Treg naive/terminal reversed?
# ── Step 8: Graph distances — unweighted (steps from root) ────────────────
# weights=NA forces hop-count distance, avoids any NaN weight issue entirely
graph_dists <- distances(mst_graph, v = "M00", weights = NA)
graph_dists[is.infinite(graph_dists)] <- max(graph_dists[is.finite(graph_dists)]) + 1
milestone_centroids$graph_dist <- as.numeric(graph_dists[, milestone_centroids$milestone])
milestone_centroids$order_pos <- match(milestone_centroids$milestone, milestone_order)
milestone_centroids <- arrange(milestone_centroids, order_pos)
# ── Step 9: Edge data frame for plotting ──────────────────────────────────
mst_edges <- as_edgelist(mst_graph)
mst_edge_df <- do.call(rbind, lapply(seq_len(nrow(mst_edges)), function(i) {
m1 <- mst_edges[i,1]; m2 <- mst_edges[i,2]
r1 <- milestone_centroids[milestone_centroids$milestone == m1, ]
r2 <- milestone_centroids[milestone_centroids$milestone == m2, ]
if (nrow(r1)==0 || nrow(r2)==0) return(NULL)
data.frame(x1=r1$UMAP_1, y1=r1$UMAP_2, x2=r2$UMAP_1, y2=r2$UMAP_2)
}))
# ── Final summary ─────────────────────────────────────────────────────────
cat(sprintf("\nFinal MST: %d nodes, %d edges | Root: M00\n",
vcount(mst_graph), ecount(mst_graph)))
Final MST: 8 nodes, 7 edges | Root: M00
mst_edges_final <- as_edgelist(mst_graph)
for (i in seq_len(nrow(mst_edges_final))) {
s1 <- milestone_centroids$state[milestone_centroids$milestone == mst_edges_final[i,1]]
s2 <- milestone_centroids$state[milestone_centroids$milestone == mst_edges_final[i,2]]
cat(sprintf(" %s (%s) → %s (%s)\n", mst_edges_final[i,1], s1, mst_edges_final[i,2], s2))
}
M00 (CD4 Naive) → M01 (CD4 TCM)
M01 (CD4 TCM) → M02 (CD4 TCM)
M02 (CD4 TCM) → M03 (CD4 TEM)
M03 (CD4 TEM) → M04 (CD4 TEM)
M04 (CD4 TEM) → M05 (CD4 Temra/CTL)
M02 (CD4 TCM) → M06 (Treg)
M06 (Treg) → M07 (Treg)
project_onto_mst <- function(cell_coords, centroid_mat, mst_graph, graph_dists) {
edges <- as_edgelist(mst_graph)
n_cells <- nrow(cell_coords)
pseudotime <- numeric(n_cells)
nearest_ms <- character(n_cells)
for (i in seq_len(n_cells)) {
cx <- cell_coords[i, 1]; cy <- cell_coords[i, 2]
best_dist <- Inf; best_pt <- 0; best_ms <- NA_character_
for (e in seq_len(nrow(edges))) {
m1 <- edges[e,1]; m2 <- edges[e,2]
p1 <- centroid_mat[m1,]; p2 <- centroid_mat[m2,]
dx <- p2[1]-p1[1]; dy <- p2[2]-p1[2]
len2 <- dx^2 + dy^2
if (len2 < 1e-10) next
t <- max(0, min(1, ((cx-p1[1])*dx + (cy-p1[2])*dy) / len2))
proj <- c(p1[1]+t*dx, p1[2]+t*dy)
d <- sqrt((cx-proj[1])^2 + (cy-proj[2])^2)
if (d < best_dist) {
best_dist <- d
pt_m1 <- graph_dists[m1]
pt_m2 <- graph_dists[m2]
best_pt <- pt_m1 + t * (pt_m2 - pt_m1)
best_ms <- if (t < 0.5) m1 else m2
}
}
pseudotime[i] <- best_pt
nearest_ms[i] <- best_ms
}
list(pseudotime = pseudotime, nearest_ms = nearest_ms)
}
cell_coords <- as.matrix(umap_df[colnames(cd4_ref), c("UMAP_1","UMAP_2")])
g_dists_vec <- setNames(as.numeric(graph_dists), colnames(graph_dists))
cat("Projecting reference cells onto MST...\n")
Projecting reference cells onto MST...
mst_proj <- project_onto_mst(cell_coords, centroid_mat, mst_graph, g_dists_vec)
mst_pt_raw <- mst_proj$pseudotime
mst_pt_range <- range(mst_pt_raw, na.rm = TRUE)
meta <- cd4_ref@meta.data
meta$mst_pseudotime <- mst_pt_raw
meta$mst_pseudotime_norm <- 100 * (mst_pt_raw - mst_pt_range[1]) /
(mst_pt_range[2] - mst_pt_range[1])
meta$nearest_milestone <- mst_proj$nearest_ms
cd4_ref@meta.data <- meta
cat(sprintf("MST pseudotime range: %.3f – %.3f\n",
mst_pt_range[1], mst_pt_range[2]))
MST pseudotime range: 0.000 – 5.000
# Validate: median pseudotime should increase along trajectory
cat("\nMedian pseudotime per state (should increase Naive→TCM→TEM→Temra):\n")
Median pseudotime per state (should increase Naive→TCM→TEM→Temra):
pt_check <- cd4_ref@meta.data %>%
group_by(!!sym(STATE_COL)) %>%
summarise(median_pt = round(median(mst_pseudotime_norm, na.rm=TRUE), 1),
.groups="drop") %>%
arrange(median_pt)
print(pt_check)
ms_plot <- milestone_centroids %>% mutate(x = order_pos, y = 0)
state_bands <- ms_plot %>%
group_by(state) %>%
summarise(xmin = min(x)-.4, xmax = max(x)+.4, .groups="drop") %>%
mutate(ymin=-.35, ymax=-.15, fill=STATE_COLORS[state])
edge_linear <- do.call(rbind, lapply(seq_len(nrow(mst_edges)), function(i) {
m1<-mst_edges[i,1]; m2<-mst_edges[i,2]
r1<-ms_plot[ms_plot$milestone==m1,]; r2<-ms_plot[ms_plot$milestone==m2,]
if(nrow(r1)==0||nrow(r2)==0) return(NULL)
data.frame(x1=r1$x,y1=r1$y,x2=r2$x,y2=r2$y)
}))
# ── Panel a: Linear milestone trajectory ──────────────────────────────────
p_mst_linear <- ggplot() +
geom_rect(data=state_bands,
aes(xmin=xmin,xmax=xmax,ymin=ymin,ymax=ymax,fill=state), alpha=.85) +
geom_text(data=state_bands,
aes(x=(xmin+xmax)/2, y=(ymin+ymax)/2, label=state),
colour="white", size=3.5, fontface="bold") +
geom_segment(data=edge_linear,
aes(x=x1,y=y1,xend=x2,yend=y2),
colour="grey35", linewidth=1.3, lineend="round") +
geom_text(data=ms_plot,
aes(x=x, y=y+0.18, label=paste0("n=", scales::comma(n_cells))),
size=3, colour="grey10", fontface="bold", vjust=0) +
geom_point(data=ms_plot, aes(x=x, y=y, fill=state),
shape=21, colour="white", stroke=2, size=12) +
geom_text(data=ms_plot, aes(x=x, y=y, label=milestone),
size=3.2, colour="white", fontface="bold") +
scale_fill_manual(values=STATE_COLORS, name="State") +
coord_cartesian(ylim=c(-.5, 0.45)) +
theme_void() +
theme(legend.position = "right",
legend.title = element_text(size=10, face="bold"),
legend.text = element_text(size=9),
plot.title = element_text(size=13, face="bold", hjust=.5),
plot.margin = margin(15, 10, 10, 10)) +
ggtitle("Custom MST — Milestones Trajectory")
# ── Panel b: Milestones on UMAP ───────────────────────────────────────────
p_mst_umap_ms <- ggplot() +
geom_point(data=umap_df[sample(nrow(umap_df)),],
aes(x=UMAP_1,y=UMAP_2,colour=state), size=.35, alpha=.5) +
geom_segment(data=mst_edge_df,
aes(x=x1,y=y1,xend=x2,yend=y2),
colour="black", linewidth=1, alpha=.85, lineend="round") +
geom_point(data=milestone_centroids,
aes(x=UMAP_1,y=UMAP_2,fill=state),
shape=21, size=8, colour="white", stroke=2) +
geom_text_repel(data=milestone_centroids,
aes(x=UMAP_1,y=UMAP_2,label=milestone),
size=3, colour="white", fontface="bold",
bg.color="grey20", bg.r=.15, max.overlaps=25,
point.padding=0.3, box.padding=0.4) +
scale_colour_manual(values=STATE_COLORS, guide="none") +
scale_fill_manual(values=STATE_COLORS, name="State") +
theme_classic() +
labs(x="UMAP-1",y="UMAP-2",title="Custom MST — Milestones on UMAP") +
theme(plot.title=element_text(size=13,face="bold"))
# ── Panel c: Pseudotime on UMAP ───────────────────────────────────────────
pt_umap_df <- umap_df
pt_umap_df$pseudotime <- cd4_ref@meta.data$mst_pseudotime_norm
p_mst_pseudo <- ggplot(pt_umap_df[sample(nrow(pt_umap_df)),],
aes(x=UMAP_1,y=UMAP_2,colour=pseudotime)) +
geom_point(size=.35, alpha=.7) +
scale_colour_gradientn(
colours = c("#0D0887","#6A00A8","#B12A90","#E16462","#FCA636","#F0F921"),
name = "Pseudotime\n(0–100)", limits=c(0,100)) +
geom_segment(data=mst_edge_df,
aes(x=x1,y=y1,xend=x2,yend=y2),
colour="black", linewidth=.7, alpha=.6, inherit.aes=FALSE) +
theme_classic() +
labs(x="UMAP-1",y="UMAP-2",title="Custom MST — Pseudotime on UMAP") +
theme(plot.title=element_text(size=13,face="bold"))
print((p_mst_linear) / (p_mst_umap_ms | p_mst_pseudo))
# Panel A: Linear trajectory
print(p_mst_linear)
# Panel B: Milestones on UMAP
print(p_mst_umap_ms)
# Panel C: Pseudotime on UMAP
print(p_mst_pseudo)
# Panel B: Milestones on UMAP
print(p_mst_umap_ms)
# Panel C: Pseudotime on UMAP
print(p_mst_pseudo)
Monocle3 fits a principal graph directly to the data topology using reversed graph embedding, then assigns pseudotime by geodesic distance from the root.
DefaultAssay(cd4_ref) <- "RNA"
cd4_ref_joined <- JoinLayers(cd4_ref)
cds <- as.cell_data_set(cd4_ref_joined)
colData(cds)[[STATE_COL]] <- cd4_ref@meta.data[[STATE_COL]]
colData(cds)$milestone <- cd4_ref@meta.data$milestone
reducedDims(cds)[["PCA"]] <- Embeddings(cd4_ref, "pca")
reducedDims(cds)[["UMAP"]] <- Embeddings(cd4_ref, UMAP_NAME)
cds <- estimate_size_factors(cds)
cds@clusters$UMAP$clusters <- cd4_ref@meta.data[[STATE_COL]]
cat("cell_data_set created:\n")
cell_data_set created:
cat(sprintf(" %d cells | %d genes\n", ncol(cds), nrow(cds)))
11466 cells | 36601 genes
set.seed(42)
DefaultAssay(cd4_ref) <- "RNA"
cd4_ref_joined <- JoinLayers(cd4_ref)
cds <- as.cell_data_set(cd4_ref_joined)
# ── Transfer metadata ──────────────────────────────────────────────────────
colData(cds)[[STATE_COL]] <- cd4_ref@meta.data[[STATE_COL]]
colData(cds)$milestone <- cd4_ref@meta.data$milestone
# ── Transfer reductions ───────────────────────────────────────────────────
reducedDims(cds)[["PCA"]] <- Embeddings(cd4_ref, "pca")
reducedDims(cds)[["UMAP"]] <- Embeddings(cd4_ref, UMAP_NAME)
cds <- estimate_size_factors(cds)
# ── FIX: Set BOTH clusters AND partitions with NAMED factors ──────────────
# learn_graph() checks: names(cds@clusters$UMAP$partitions) != NULL
cell_ids <- colnames(cds)
# Clusters: named factor of state labels
cluster_vec <- setNames(
factor(cd4_ref@meta.data[[STATE_COL]]),
cell_ids
)
# Partitions: all cells in one partition (required slot, use_partition=FALSE
# ignores boundaries but the slot must still be a named factor)
partition_vec <- setNames(
factor(rep(1L, length(cell_ids))),
cell_ids
)
cds@clusters$UMAP$clusters <- cluster_vec
cds@clusters$UMAP$partitions <- partition_vec
# Verify names are present before calling learn_graph
stopifnot(
"clusters must be named" = !is.null(names(cds@clusters$UMAP$clusters)),
"partitions must be named" = !is.null(names(cds@clusters$UMAP$partitions)),
"cluster length matches" = length(cds@clusters$UMAP$clusters) == ncol(cds),
"partition length matches" = length(cds@clusters$UMAP$partitions) == ncol(cds)
)
cat(sprintf("✅ clusters and partitions set: %d cells\n", ncol(cds)))
✅ clusters and partitions set: 11466 cells
cat("cell_data_set created:\n")
cell_data_set created:
cat(sprintf(" %d cells | %d genes\n", ncol(cds), nrow(cds)))
11466 cells | 36601 genes
# ── learn_graph ────────────────────────────────────────────────────────────
set.seed(42)
cds <- learn_graph(
cds,
use_partition = FALSE,
close_loop = FALSE,
learn_graph_control = list(minimal_branch_len = 8, nn.k = 20),
verbose = FALSE
)
cat("✅ learn_graph complete\n")
✅ learn_graph complete
# Set root at CD4 Naive centroid and assign pseudotime
tn_cells <- colnames(cds)[colData(cds)[[STATE_COL]] == "CD4 Naive"]
tn_umap <- reducedDims(cds)[["UMAP"]][tn_cells, , drop = FALSE]
tn_centroid <- colMeans(tn_umap)
pr_nodes <- t(cds@principal_graph_aux[["UMAP"]]$dp_mst)
node_dists <- rowSums((pr_nodes - matrix(tn_centroid, nrow=nrow(pr_nodes),
ncol=2, byrow=TRUE))^2)
root_pr_node <- names(which.min(node_dists))
cat(sprintf("Root principal graph node: %s\n", root_pr_node))
Root principal graph node: Y_14
cds <- order_cells(cds, root_pr_nodes = root_pr_node)
pt_raw <- pseudotime(cds)
cat(sprintf("Pseudotime: %d non-NA | %d NA\n",
sum(!is.na(pt_raw)), sum(is.na(pt_raw))))
Pseudotime: 11466 non-NA | 0 NA
cat(sprintf("Raw range: %.3f – %.3f\n",
min(pt_raw, na.rm=TRUE), max(pt_raw, na.rm=TRUE)))
Raw range: 0.000 – 25.356
stopifnot("order_cells produced all NA — check root node" = sum(!is.na(pt_raw)) > 0)
# Normalise and write to cd4_ref metadata
pt_min <- min(pt_raw, na.rm=TRUE)
pt_max <- max(pt_raw, na.rm=TRUE)
meta <- cd4_ref@meta.data
meta$monocle3_pseudotime <- as.numeric(pt_raw)
meta$monocle3_pseudotime_norm <- 100 * (as.numeric(pt_raw) - pt_min) /
(pt_max - pt_min)
cd4_ref@meta.data <- meta
cat(sprintf("Non-NA in metadata: %d / %d\n",
sum(!is.na(cd4_ref@meta.data$monocle3_pseudotime_norm)),
ncol(cd4_ref)))
Non-NA in metadata: 11466 / 11466
cat("\nMedian pseudotime per state (Naive < TCM < TEM < Temra expected):\n")
Median pseudotime per state (Naive < TCM < TEM < Temra expected):
cd4_ref@meta.data %>%
group_by(!!sym(STATE_COL)) %>%
summarise(median_pt = round(median(monocle3_pseudotime_norm, na.rm=TRUE), 1),
.groups = "drop") %>%
arrange(median_pt) %>%
print()
pr_graph_obj <- principal_graph(cds)[["UMAP"]]
pr_layout <- t(cds@principal_graph_aux[["UMAP"]]$dp_mst)
m3_edge_list <- igraph::as_edgelist(pr_graph_obj)
m3_edge_df <- do.call(rbind, lapply(seq_len(nrow(m3_edge_list)), function(i) {
n1 <- m3_edge_list[i,1]; n2 <- m3_edge_list[i,2]
data.frame(x1=pr_layout[n1,1], y1=pr_layout[n1,2],
x2=pr_layout[n2,1], y2=pr_layout[n2,2])
}))
umap_m3 <- umap_df
umap_m3$pseudotime <- cd4_ref@meta.data$monocle3_pseudotime_norm
p_m3_states <- ggplot() +
geom_point(data=umap_m3[sample(nrow(umap_m3)),],
aes(x=UMAP_1, y=UMAP_2, colour=state), size=.35, alpha=.6) +
geom_segment(data=m3_edge_df,
aes(x=x1,y=y1,xend=x2,yend=y2),
colour="black", linewidth=.6, alpha=.7, lineend="round") +
scale_colour_manual(values=STATE_COLORS, name="State") +
theme_classic() +
labs(x="UMAP-1",y="UMAP-2", title="Monocle3 — Principal Graph & States") +
theme(plot.title=element_text(size=13,face="bold"))
p_m3_pseudo <- ggplot(umap_m3[sample(nrow(umap_m3)),],
aes(x=UMAP_1, y=UMAP_2, colour=pseudotime)) +
geom_point(size=.35, alpha=.7) +
scale_colour_gradientn(
colours=c("#0D0887","#6A00A8","#B12A90","#E16462","#FCA636","#F0F921"),
name="Pseudotime\n(0–100)", limits=c(0,100)) +
geom_segment(data=m3_edge_df,
aes(x=x1,y=y1,xend=x2,yend=y2),
colour="black", linewidth=.6, alpha=.6, inherit.aes=FALSE) +
theme_classic() +
labs(x="UMAP-1",y="UMAP-2", title="Monocle3 — Pseudotime on UMAP") +
theme(plot.title=element_text(size=13,face="bold"))
m3_pt_df <- data.frame(
state = factor(cd4_ref@meta.data[[STATE_COL]], levels=STATE_ORDER),
pseudotime = cd4_ref@meta.data$monocle3_pseudotime_norm
) %>% filter(!is.na(pseudotime), state %in% STATE_ORDER)
p_m3_violin <- ggplot(m3_pt_df, aes(x=state, y=pseudotime, fill=state)) +
geom_violin(scale="width", trim=FALSE, alpha=.85) +
geom_boxplot(width=.08, fill="white", outlier.size=.3, outlier.alpha=.3) +
scale_fill_manual(values=STATE_COLORS, guide="none") +
theme_classic() +
labs(x=NULL, y="Pseudotime (0–100)", title="Monocle3 — Pseudotime per State") +
theme(axis.text.x=element_text(size=11, face="bold"),
plot.title=element_text(size=13,face="bold"))
print((p_m3_states | p_m3_pseudo) / (p_m3_violin | plot_spacer()))
p_m3_states
p_m3_pseudo
p_m3_violin
saveRDS(cd4_ref, "cd4_ref_dual_trajectory.rds")
saveRDS(cds, "monocle3_cds.rds")
var_genes_use <- head(VariableFeatures(cd4_ref), 2000)
var_genes_use <- intersect(var_genes_use, rownames(cds))
cat(sprintf("Variable genes for graph_test: %d\n", length(var_genes_use)))
Variable genes for graph_test: 2000
cat("Running graph_test (Moran's I)...\n")
Running graph_test (Moran's I)...
pr_test_res <- graph_test(
cds[var_genes_use, ],
neighbor_graph = "principal_graph",
cores = 2
)
| | 0%, ETA NA
| | 0%, ETA 06:10
| | 0%, ETA 03:33
| | 0%, ETA 02:41
| | 0%, ETA 02:08
| | 0%, ETA 01:50
| | 0%, ETA 01:36
| | 0%, ETA 01:31
| | 0%, ETA 01:19
|= | 0%, ETA 01:09
|= | 1%, ETA 01:08
|= | 1%, ETA 01:03
|= | 1%, ETA 01:02
|= | 1%, ETA 00:58
|= | 1%, ETA 00:58
|= | 1%, ETA 00:54
|= | 1%, ETA 00:54
|= | 1%, ETA 00:52
|= | 1%, ETA 00:52
|= | 1%, ETA 00:49
|= | 1%, ETA 00:49
|= | 1%, ETA 00:47
|= | 1%, ETA 00:48
|= | 1%, ETA 00:46
|== | 1%, ETA 00:46
|== | 1%, ETA 00:45
|== | 1%, ETA 00:45
|== | 1%, ETA 00:44
|== | 1%, ETA 00:45
|== | 2%, ETA 00:44
|== | 2%, ETA 00:44
|== | 2%, ETA 00:43
|== | 2%, ETA 00:44
|== | 2%, ETA 00:43
|== | 2%, ETA 00:43
|== | 2%, ETA 00:42
|== | 2%, ETA 00:43
|== | 2%, ETA 00:42
|== | 2%, ETA 00:42
|== | 2%, ETA 00:42
|== | 2%, ETA 00:42
|=== | 2%, ETA 00:42
|=== | 2%, ETA 00:43
|=== | 2%, ETA 00:42
|=== | 2%, ETA 00:42
|=== | 2%, ETA 00:42
|=== | 2%, ETA 00:42
|=== | 2%, ETA 00:42
|=== | 2%, ETA 00:42
|=== | 2%, ETA 00:41
|=== | 3%, ETA 00:42
|=== | 3%, ETA 00:42
|=== | 3%, ETA 00:42
|=== | 3%, ETA 00:42
|=== | 3%, ETA 00:41
|=== | 3%, ETA 00:42
|=== | 3%, ETA 00:41
|==== | 3%, ETA 00:41
|==== | 3%, ETA 00:41
|==== | 3%, ETA 00:41
|==== | 3%, ETA 00:41
|==== | 3%, ETA 00:41
|==== | 3%, ETA 00:40
|==== | 3%, ETA 00:41
|==== | 3%, ETA 00:40
|==== | 3%, ETA 00:41
|==== | 3%, ETA 00:40
|==== | 3%, ETA 00:41
|==== | 3%, ETA 00:40
|==== | 4%, ETA 00:40
|==== | 4%, ETA 00:40
|==== | 4%, ETA 00:40
|==== | 4%, ETA 00:40
|==== | 4%, ETA 00:40
|===== | 4%, ETA 00:40
|===== | 4%, ETA 00:40
|===== | 4%, ETA 00:40
|===== | 4%, ETA 00:40
|===== | 4%, ETA 00:40
|===== | 4%, ETA 00:40
|===== | 4%, ETA 00:40
|===== | 4%, ETA 00:40
|===== | 4%, ETA 00:40
|===== | 4%, ETA 00:40
|===== | 4%, ETA 00:40
|===== | 4%, ETA 00:40
|===== | 4%, ETA 00:40
|===== | 4%, ETA 00:40
|===== | 4%, ETA 00:40
|===== | 4%, ETA 00:40
|====== | 5%, ETA 00:40
|====== | 5%, ETA 00:39
|====== | 5%, ETA 00:40
|====== | 5%, ETA 00:39
|====== | 5%, ETA 00:40
|====== | 5%, ETA 00:39
|====== | 5%, ETA 00:39
|====== | 5%, ETA 00:39
|====== | 5%, ETA 00:39
|====== | 5%, ETA 00:39
|====== | 5%, ETA 00:39
|====== | 5%, ETA 00:39
|====== | 5%, ETA 00:39
|====== | 5%, ETA 00:39
|====== | 5%, ETA 00:39
|====== | 5%, ETA 00:39
|====== | 5%, ETA 00:38
|======= | 5%, ETA 00:39
|======= | 5%, ETA 00:38
|======= | 6%, ETA 00:39
|======= | 6%, ETA 00:38
|======= | 6%, ETA 00:38
|======= | 6%, ETA 00:38
|======= | 6%, ETA 00:38
|======= | 6%, ETA 00:38
|======= | 6%, ETA 00:38
|======= | 6%, ETA 00:38
|======= | 6%, ETA 00:38
|======= | 6%, ETA 00:38
|======== | 6%, ETA 00:38
|======== | 6%, ETA 00:38
|======== | 6%, ETA 00:37
|======== | 6%, ETA 00:37
|======== | 6%, ETA 00:37
|======== | 6%, ETA 00:37
|======== | 6%, ETA 00:37
|======== | 7%, ETA 00:37
|======== | 7%, ETA 00:37
|======== | 7%, ETA 00:37
|======== | 7%, ETA 00:37
|======== | 7%, ETA 00:37
|======== | 7%, ETA 00:37
|======== | 7%, ETA 00:36
|======== | 7%, ETA 00:36
|======== | 7%, ETA 00:36
|======== | 7%, ETA 00:36
|========= | 7%, ETA 00:36
|========= | 7%, ETA 00:36
|========= | 7%, ETA 00:36
|========= | 7%, ETA 00:36
|========= | 7%, ETA 00:36
|========= | 7%, ETA 00:36
|========= | 7%, ETA 00:36
|========= | 7%, ETA 00:36
|========= | 7%, ETA 00:36
|========= | 8%, ETA 00:36
|========= | 8%, ETA 00:36
|========= | 8%, ETA 00:36
|========= | 8%, ETA 00:36
|========= | 8%, ETA 00:35
|========= | 8%, ETA 00:35
|========= | 8%, ETA 00:35
|========= | 8%, ETA 00:35
|========== | 8%, ETA 00:35
|========== | 8%, ETA 00:35
|========== | 8%, ETA 00:35
|========== | 8%, ETA 00:35
|========== | 8%, ETA 00:35
|========== | 8%, ETA 00:35
|========== | 8%, ETA 00:35
|========== | 8%, ETA 00:35
|========== | 8%, ETA 00:35
|========== | 8%, ETA 00:35
|========== | 8%, ETA 00:35
|========== | 8%, ETA 00:35
|========== | 8%, ETA 00:35
|========== | 9%, ETA 00:35
|========== | 9%, ETA 00:35
|========== | 9%, ETA 00:34
|=========== | 9%, ETA 00:34
|=========== | 9%, ETA 00:34
|=========== | 9%, ETA 00:34
|=========== | 9%, ETA 00:34
|=========== | 9%, ETA 00:34
|=========== | 9%, ETA 00:34
|=========== | 9%, ETA 00:34
|=========== | 9%, ETA 00:34
|=========== | 9%, ETA 00:34
|=========== | 9%, ETA 00:34
|=========== | 9%, ETA 00:34
|=========== | 9%, ETA 00:34
|=========== | 9%, ETA 00:34
|=========== | 9%, ETA 00:34
|=========== | 9%, ETA 00:34
|=========== | 9%, ETA 00:34
|=========== | 10%, ETA 00:34
|============ | 10%, ETA 00:33
|============ | 10%, ETA 00:33
|============ | 10%, ETA 00:33
|============ | 10%, ETA 00:33
|============ | 10%, ETA 00:33
|============ | 10%, ETA 00:33
|============ | 10%, ETA 00:33
|============ | 10%, ETA 00:33
|============ | 10%, ETA 00:33
|============ | 10%, ETA 00:33
|============ | 10%, ETA 00:33
|============ | 10%, ETA 00:33
|============ | 10%, ETA 00:33
|============ | 10%, ETA 00:33
|============ | 10%, ETA 00:33
|============ | 10%, ETA 00:33
|============= | 10%, ETA 00:33
|============= | 10%, ETA 00:33
|============= | 10%, ETA 00:33
|============= | 10%, ETA 00:33
|============= | 11%, ETA 00:33
|============= | 11%, ETA 00:32
|============= | 11%, ETA 00:32
|============= | 11%, ETA 00:32
|============= | 11%, ETA 00:32
|============= | 11%, ETA 00:32
|============= | 11%, ETA 00:32
|============= | 11%, ETA 00:32
|============= | 11%, ETA 00:32
|============= | 11%, ETA 00:32
|============= | 11%, ETA 00:32
|============= | 11%, ETA 00:32
|============= | 11%, ETA 00:32
|============== | 11%, ETA 00:32
|============== | 11%, ETA 00:32
|============== | 11%, ETA 00:32
|============== | 11%, ETA 00:32
|============== | 11%, ETA 00:32
|============== | 11%, ETA 00:32
|============== | 12%, ETA 00:32
|============== | 12%, ETA 00:32
|============== | 12%, ETA 00:32
|============== | 12%, ETA 00:32
|============== | 12%, ETA 00:31
|============== | 12%, ETA 00:31
|============== | 12%, ETA 00:31
|============== | 12%, ETA 00:31
|============== | 12%, ETA 00:31
|============== | 12%, ETA 00:31
|=============== | 12%, ETA 00:31
|=============== | 12%, ETA 00:31
|=============== | 12%, ETA 00:31
|=============== | 12%, ETA 00:31
|=============== | 12%, ETA 00:31
|=============== | 12%, ETA 00:31
|=============== | 12%, ETA 00:31
|=============== | 12%, ETA 00:31
|=============== | 12%, ETA 00:31
|=============== | 12%, ETA 00:31
|=============== | 12%, ETA 00:31
|=============== | 13%, ETA 00:31
|=============== | 13%, ETA 00:31
|=============== | 13%, ETA 00:31
|=============== | 13%, ETA 00:31
|=============== | 13%, ETA 00:31
|=============== | 13%, ETA 00:31
|================ | 13%, ETA 00:31
|================ | 13%, ETA 00:31
|================ | 13%, ETA 00:31
|================ | 13%, ETA 00:31
|================ | 13%, ETA 00:31
|================ | 13%, ETA 00:30
|================ | 13%, ETA 00:30
|================ | 13%, ETA 00:30
|================ | 13%, ETA 00:30
|================ | 13%, ETA 00:30
|================ | 13%, ETA 00:30
|================ | 13%, ETA 00:30
|================ | 13%, ETA 00:30
|================ | 14%, ETA 00:30
|================ | 14%, ETA 00:30
|================ | 14%, ETA 00:30
|================= | 14%, ETA 00:30
|================= | 14%, ETA 00:30
|================= | 14%, ETA 00:30
|================= | 14%, ETA 00:30
|================= | 14%, ETA 00:30
|================= | 14%, ETA 00:30
|================= | 14%, ETA 00:30
|================= | 14%, ETA 00:30
|================= | 14%, ETA 00:30
|================= | 14%, ETA 00:30
|================= | 14%, ETA 00:30
|================= | 14%, ETA 00:30
|================= | 14%, ETA 00:30
|================= | 14%, ETA 00:30
|================= | 14%, ETA 00:30
|================= | 14%, ETA 00:30
|================= | 14%, ETA 00:30
|================== | 14%, ETA 00:30
|================== | 15%, ETA 00:30
|================== | 15%, ETA 00:30
|================== | 15%, ETA 00:30
|================== | 15%, ETA 00:30
|================== | 15%, ETA 00:30
|================== | 15%, ETA 00:30
|================== | 15%, ETA 00:30
|================== | 15%, ETA 00:29
|================== | 15%, ETA 00:29
|================== | 15%, ETA 00:29
|================== | 15%, ETA 00:29
|================== | 15%, ETA 00:29
|================== | 15%, ETA 00:29
|================== | 15%, ETA 00:29
|================== | 15%, ETA 00:29
|=================== | 15%, ETA 00:29
|=================== | 15%, ETA 00:29
|=================== | 15%, ETA 00:29
|=================== | 15%, ETA 00:29
|=================== | 16%, ETA 00:29
|=================== | 16%, ETA 00:29
|=================== | 16%, ETA 00:29
|=================== | 16%, ETA 00:29
|=================== | 16%, ETA 00:29
|=================== | 16%, ETA 00:29
|=================== | 16%, ETA 00:29
|=================== | 16%, ETA 00:29
|=================== | 16%, ETA 00:29
|=================== | 16%, ETA 00:29
|=================== | 16%, ETA 00:29
|=================== | 16%, ETA 00:29
|=================== | 16%, ETA 00:29
|==================== | 16%, ETA 00:29
|==================== | 16%, ETA 00:29
|==================== | 16%, ETA 00:29
|==================== | 16%, ETA 00:29
|==================== | 16%, ETA 00:29
|==================== | 16%, ETA 00:29
|==================== | 16%, ETA 00:29
|==================== | 16%, ETA 00:29
|==================== | 17%, ETA 00:28
|==================== | 17%, ETA 00:28
|==================== | 17%, ETA 00:28
|==================== | 17%, ETA 00:28
|==================== | 17%, ETA 00:28
|==================== | 17%, ETA 00:28
|==================== | 17%, ETA 00:28
|==================== | 17%, ETA 00:28
|===================== | 17%, ETA 00:28
|===================== | 17%, ETA 00:28
|===================== | 17%, ETA 00:28
|===================== | 17%, ETA 00:28
|===================== | 17%, ETA 00:28
|===================== | 17%, ETA 00:28
|===================== | 17%, ETA 00:28
|===================== | 17%, ETA 00:28
|===================== | 17%, ETA 00:28
|===================== | 17%, ETA 00:28
|===================== | 17%, ETA 00:28
|===================== | 18%, ETA 00:28
|===================== | 18%, ETA 00:28
|===================== | 18%, ETA 00:28
|===================== | 18%, ETA 00:28
|===================== | 18%, ETA 00:28
|===================== | 18%, ETA 00:28
|====================== | 18%, ETA 00:28
|====================== | 18%, ETA 00:28
|====================== | 18%, ETA 00:28
|====================== | 18%, ETA 00:28
|====================== | 18%, ETA 00:28
|====================== | 18%, ETA 00:28
|====================== | 18%, ETA 00:28
|====================== | 18%, ETA 00:28
|====================== | 18%, ETA 00:28
|====================== | 18%, ETA 00:27
|====================== | 18%, ETA 00:27
|====================== | 18%, ETA 00:27
|====================== | 18%, ETA 00:27
|====================== | 18%, ETA 00:27
|====================== | 18%, ETA 00:27
|====================== | 19%, ETA 00:27
|======================= | 19%, ETA 00:27
|======================= | 19%, ETA 00:27
|======================= | 19%, ETA 00:27
|======================= | 19%, ETA 00:27
|======================= | 19%, ETA 00:27
|======================= | 19%, ETA 00:27
|======================= | 19%, ETA 00:27
|======================= | 19%, ETA 00:27
|======================= | 19%, ETA 00:27
|======================= | 19%, ETA 00:27
|======================= | 19%, ETA 00:27
|======================= | 19%, ETA 00:27
|======================= | 19%, ETA 00:27
|======================= | 19%, ETA 00:27
|======================= | 19%, ETA 00:27
|======================= | 19%, ETA 00:27
|======================= | 19%, ETA 00:27
|======================== | 19%, ETA 00:27
|======================== | 20%, ETA 00:27
|======================== | 20%, ETA 00:27
|======================== | 20%, ETA 00:27
|======================== | 20%, ETA 00:27
|======================== | 20%, ETA 00:27
|======================== | 20%, ETA 00:27
|======================== | 20%, ETA 00:27
|======================== | 20%, ETA 00:27
|======================== | 20%, ETA 00:27
|======================== | 20%, ETA 00:27
|======================== | 20%, ETA 00:27
|======================== | 20%, ETA 00:27
|======================== | 20%, ETA 00:27
|======================== | 20%, ETA 00:27
|======================== | 20%, ETA 00:27
|========================= | 20%, ETA 00:27
|========================= | 20%, ETA 00:27
|========================= | 20%, ETA 00:27
|========================= | 20%, ETA 00:26
|========================= | 20%, ETA 00:26
|========================= | 20%, ETA 00:26
|========================= | 21%, ETA 00:26
|========================= | 21%, ETA 00:26
|========================= | 21%, ETA 00:26
|========================= | 21%, ETA 00:26
|========================= | 21%, ETA 00:26
|========================= | 21%, ETA 00:26
|========================= | 21%, ETA 00:26
|========================= | 21%, ETA 00:26
|========================= | 21%, ETA 00:26
|========================= | 21%, ETA 00:26
|========================= | 21%, ETA 00:26
|========================== | 21%, ETA 00:26
|========================== | 21%, ETA 00:26
|========================== | 21%, ETA 00:26
|========================== | 21%, ETA 00:26
|========================== | 21%, ETA 00:26
|========================== | 21%, ETA 00:26
|========================== | 21%, ETA 00:26
|========================== | 21%, ETA 00:26
|========================== | 22%, ETA 00:26
|========================== | 22%, ETA 00:26
|========================== | 22%, ETA 00:26
|========================== | 22%, ETA 00:26
|========================== | 22%, ETA 00:26
|========================== | 22%, ETA 00:26
|========================== | 22%, ETA 00:26
|========================== | 22%, ETA 00:26
|========================== | 22%, ETA 00:26
|=========================== | 22%, ETA 00:26
|=========================== | 22%, ETA 00:26
|=========================== | 22%, ETA 00:26
|=========================== | 22%, ETA 00:26
|=========================== | 22%, ETA 00:26
|=========================== | 22%, ETA 00:26
|=========================== | 22%, ETA 00:26
|=========================== | 22%, ETA 00:26
|=========================== | 22%, ETA 00:26
|=========================== | 22%, ETA 00:26
|=========================== | 22%, ETA 00:26
|=========================== | 22%, ETA 00:26
|=========================== | 23%, ETA 00:26
|=========================== | 23%, ETA 00:26
|=========================== | 23%, ETA 00:26
|=========================== | 23%, ETA 00:26
|============================ | 23%, ETA 00:26
|============================ | 23%, ETA 00:26
|============================ | 23%, ETA 00:25
|============================ | 23%, ETA 00:25
|============================ | 23%, ETA 00:26
|============================ | 23%, ETA 00:26
|============================ | 23%, ETA 00:26
|============================ | 23%, ETA 00:26
|============================ | 23%, ETA 00:26
|============================ | 23%, ETA 00:26
|============================ | 23%, ETA 00:26
|============================ | 23%, ETA 00:26
|============================ | 23%, ETA 00:26
|============================ | 23%, ETA 00:26
|============================ | 23%, ETA 00:26
|============================ | 24%, ETA 00:26
|============================ | 24%, ETA 00:26
|============================= | 24%, ETA 00:25
|============================= | 24%, ETA 00:25
|============================= | 24%, ETA 00:25
|============================= | 24%, ETA 00:25
|============================= | 24%, ETA 00:25
|============================= | 24%, ETA 00:25
|============================= | 24%, ETA 00:25
|============================= | 24%, ETA 00:25
|============================= | 24%, ETA 00:25
|============================= | 24%, ETA 00:25
|============================= | 24%, ETA 00:25
|============================= | 24%, ETA 00:25
|============================= | 24%, ETA 00:25
|============================= | 24%, ETA 00:25
|============================= | 24%, ETA 00:25
|============================= | 24%, ETA 00:25
|============================== | 24%, ETA 00:25
|============================== | 24%, ETA 00:25
|============================== | 24%, ETA 00:25
|============================== | 25%, ETA 00:25
|============================== | 25%, ETA 00:25
|============================== | 25%, ETA 00:25
|============================== | 25%, ETA 00:25
|============================== | 25%, ETA 00:25
|============================== | 25%, ETA 00:25
|============================== | 25%, ETA 00:25
|============================== | 25%, ETA 00:25
|============================== | 25%, ETA 00:25
|============================== | 25%, ETA 00:25
|============================== | 25%, ETA 00:25
|============================== | 25%, ETA 00:25
|============================== | 25%, ETA 00:25
|============================== | 25%, ETA 00:25
|=============================== | 25%, ETA 00:25
|=============================== | 25%, ETA 00:25
|=============================== | 25%, ETA 00:25
|=============================== | 25%, ETA 00:25
|=============================== | 25%, ETA 00:25
|=============================== | 26%, ETA 00:25
|=============================== | 26%, ETA 00:25
|=============================== | 26%, ETA 00:25
|=============================== | 26%, ETA 00:25
|=============================== | 26%, ETA 00:24
|=============================== | 26%, ETA 00:24
|=============================== | 26%, ETA 00:24
|=============================== | 26%, ETA 00:24
|=============================== | 26%, ETA 00:24
|=============================== | 26%, ETA 00:24
|=============================== | 26%, ETA 00:24
|================================ | 26%, ETA 00:24
|================================ | 26%, ETA 00:24
|================================ | 26%, ETA 00:24
|================================ | 26%, ETA 00:24
|================================ | 26%, ETA 00:24
|================================ | 26%, ETA 00:24
|================================ | 26%, ETA 00:24
|================================ | 26%, ETA 00:24
|================================ | 26%, ETA 00:24
|================================ | 26%, ETA 00:24
|================================ | 27%, ETA 00:24
|================================ | 27%, ETA 00:24
|================================ | 27%, ETA 00:24
|================================ | 27%, ETA 00:24
|================================ | 27%, ETA 00:24
|================================ | 27%, ETA 00:24
|================================ | 27%, ETA 00:24
|================================= | 27%, ETA 00:24
|================================= | 27%, ETA 00:24
|================================= | 27%, ETA 00:24
|================================= | 27%, ETA 00:24
|================================= | 27%, ETA 00:24
|================================= | 27%, ETA 00:24
|================================= | 27%, ETA 00:24
|================================= | 27%, ETA 00:24
|================================= | 27%, ETA 00:24
|================================= | 27%, ETA 00:24
|================================= | 27%, ETA 00:24
|================================= | 27%, ETA 00:24
|================================= | 28%, ETA 00:24
|================================= | 28%, ETA 00:24
|================================= | 28%, ETA 00:24
|================================= | 28%, ETA 00:24
|================================== | 28%, ETA 00:24
|================================== | 28%, ETA 00:24
|================================== | 28%, ETA 00:24
|================================== | 28%, ETA 00:24
|================================== | 28%, ETA 00:24
|================================== | 28%, ETA 00:23
|================================== | 28%, ETA 00:23
|================================== | 28%, ETA 00:23
|================================== | 28%, ETA 00:23
|================================== | 28%, ETA 00:23
|================================== | 28%, ETA 00:23
|================================== | 28%, ETA 00:23
|================================== | 28%, ETA 00:23
|================================== | 28%, ETA 00:23
|================================== | 28%, ETA 00:23
|================================== | 28%, ETA 00:23
|================================== | 28%, ETA 00:23
|=================================== | 29%, ETA 00:23
|=================================== | 29%, ETA 00:23
|=================================== | 29%, ETA 00:23
|=================================== | 29%, ETA 00:23
|=================================== | 29%, ETA 00:23
|=================================== | 29%, ETA 00:23
|=================================== | 29%, ETA 00:23
|=================================== | 29%, ETA 00:23
|=================================== | 29%, ETA 00:23
|=================================== | 29%, ETA 00:23
|=================================== | 29%, ETA 00:23
|=================================== | 29%, ETA 00:23
|=================================== | 29%, ETA 00:23
|=================================== | 29%, ETA 00:23
|=================================== | 29%, ETA 00:23
|=================================== | 29%, ETA 00:23
|==================================== | 29%, ETA 00:23
|==================================== | 29%, ETA 00:23
|==================================== | 29%, ETA 00:23
|==================================== | 30%, ETA 00:23
|==================================== | 30%, ETA 00:23
|==================================== | 30%, ETA 00:23
|==================================== | 30%, ETA 00:23
|==================================== | 30%, ETA 00:23
|==================================== | 30%, ETA 00:23
|==================================== | 30%, ETA 00:23
|==================================== | 30%, ETA 00:23
|==================================== | 30%, ETA 00:23
|==================================== | 30%, ETA 00:23
|==================================== | 30%, ETA 00:23
|==================================== | 30%, ETA 00:23
|==================================== | 30%, ETA 00:23
|==================================== | 30%, ETA 00:23
|===================================== | 30%, ETA 00:23
|===================================== | 30%, ETA 00:23
|===================================== | 30%, ETA 00:23
|===================================== | 30%, ETA 00:23
|===================================== | 30%, ETA 00:22
|===================================== | 30%, ETA 00:22
|===================================== | 30%, ETA 00:22
|===================================== | 31%, ETA 00:22
|===================================== | 31%, ETA 00:22
|===================================== | 31%, ETA 00:22
|===================================== | 31%, ETA 00:22
|===================================== | 31%, ETA 00:22
|===================================== | 31%, ETA 00:22
|===================================== | 31%, ETA 00:22
|===================================== | 31%, ETA 00:22
|===================================== | 31%, ETA 00:22
|====================================== | 31%, ETA 00:22
|====================================== | 31%, ETA 00:22
|====================================== | 31%, ETA 00:22
|====================================== | 31%, ETA 00:22
|====================================== | 31%, ETA 00:22
|====================================== | 31%, ETA 00:22
|====================================== | 31%, ETA 00:22
|====================================== | 31%, ETA 00:22
|====================================== | 31%, ETA 00:22
|====================================== | 31%, ETA 00:22
|====================================== | 32%, ETA 00:22
|====================================== | 32%, ETA 00:22
|====================================== | 32%, ETA 00:22
|====================================== | 32%, ETA 00:22
|====================================== | 32%, ETA 00:22
|====================================== | 32%, ETA 00:22
|====================================== | 32%, ETA 00:22
|======================================= | 32%, ETA 00:22
|======================================= | 32%, ETA 00:22
|======================================= | 32%, ETA 00:22
|======================================= | 32%, ETA 00:22
|======================================= | 32%, ETA 00:22
|======================================= | 32%, ETA 00:22
|======================================= | 32%, ETA 00:22
|======================================= | 32%, ETA 00:22
|======================================= | 32%, ETA 00:22
|======================================= | 32%, ETA 00:22
|======================================= | 32%, ETA 00:22
|======================================= | 32%, ETA 00:22
|======================================= | 32%, ETA 00:22
|======================================= | 33%, ETA 00:22
|======================================= | 33%, ETA 00:22
|======================================== | 33%, ETA 00:22
|======================================== | 33%, ETA 00:22
|======================================== | 33%, ETA 00:22
|======================================== | 33%, ETA 00:22
|======================================== | 33%, ETA 00:22
|======================================== | 33%, ETA 00:22
|======================================== | 33%, ETA 00:21
|======================================== | 33%, ETA 00:21
|======================================== | 33%, ETA 00:21
|======================================== | 33%, ETA 00:21
|======================================== | 33%, ETA 00:21
|======================================== | 33%, ETA 00:21
|======================================== | 33%, ETA 00:21
|======================================== | 33%, ETA 00:21
|======================================== | 33%, ETA 00:21
|======================================== | 33%, ETA 00:21
|======================================== | 33%, ETA 00:21
|========================================= | 34%, ETA 00:21
|========================================= | 34%, ETA 00:21
|========================================= | 34%, ETA 00:21
|========================================= | 34%, ETA 00:21
|========================================= | 34%, ETA 00:21
|========================================= | 34%, ETA 00:21
|========================================= | 34%, ETA 00:21
|========================================= | 34%, ETA 00:21
|========================================= | 34%, ETA 00:21
|========================================= | 34%, ETA 00:21
|========================================= | 34%, ETA 00:21
|========================================= | 34%, ETA 00:21
|========================================= | 34%, ETA 00:21
|========================================= | 34%, ETA 00:21
|========================================= | 34%, ETA 00:21
|========================================= | 34%, ETA 00:21
|========================================== | 34%, ETA 00:21
|========================================== | 34%, ETA 00:21
|========================================== | 34%, ETA 00:21
|========================================== | 34%, ETA 00:21
|========================================== | 34%, ETA 00:21
|========================================== | 35%, ETA 00:21
|========================================== | 35%, ETA 00:21
|========================================== | 35%, ETA 00:21
|========================================== | 35%, ETA 00:21
|========================================== | 35%, ETA 00:21
|========================================== | 35%, ETA 00:21
|========================================== | 35%, ETA 00:21
|========================================== | 35%, ETA 00:21
|========================================== | 35%, ETA 00:21
|========================================== | 35%, ETA 00:21
|========================================== | 35%, ETA 00:21
|========================================== | 35%, ETA 00:21
|=========================================== | 35%, ETA 00:21
|=========================================== | 35%, ETA 00:21
|=========================================== | 35%, ETA 00:21
|=========================================== | 35%, ETA 00:21
|=========================================== | 35%, ETA 00:21
|=========================================== | 35%, ETA 00:21
|=========================================== | 35%, ETA 00:21
|=========================================== | 36%, ETA 00:21
|=========================================== | 36%, ETA 00:21
|=========================================== | 36%, ETA 00:21
|=========================================== | 36%, ETA 00:21
|=========================================== | 36%, ETA 00:20
|=========================================== | 36%, ETA 00:20
|=========================================== | 36%, ETA 00:20
|=========================================== | 36%, ETA 00:20
|=========================================== | 36%, ETA 00:20
|=========================================== | 36%, ETA 00:20
|============================================ | 36%, ETA 00:20
|============================================ | 36%, ETA 00:20
|============================================ | 36%, ETA 00:20
|============================================ | 36%, ETA 00:20
|============================================ | 36%, ETA 00:20
|============================================ | 36%, ETA 00:20
|============================================ | 36%, ETA 00:20
|============================================ | 36%, ETA 00:20
|============================================ | 36%, ETA 00:20
|============================================ | 36%, ETA 00:20
|============================================ | 36%, ETA 00:20
|============================================ | 37%, ETA 00:20
|============================================ | 37%, ETA 00:20
|============================================ | 37%, ETA 00:20
|============================================ | 37%, ETA 00:20
|============================================ | 37%, ETA 00:20
|============================================= | 37%, ETA 00:20
|============================================= | 37%, ETA 00:20
|============================================= | 37%, ETA 00:20
|============================================= | 37%, ETA 00:20
|============================================= | 37%, ETA 00:20
|============================================= | 37%, ETA 00:20
|============================================= | 37%, ETA 00:20
|============================================= | 37%, ETA 00:20
|============================================= | 37%, ETA 00:20
|============================================= | 37%, ETA 00:20
|============================================= | 37%, ETA 00:20
|============================================= | 37%, ETA 00:20
|============================================= | 37%, ETA 00:20
|============================================= | 37%, ETA 00:20
|============================================= | 38%, ETA 00:20
|============================================= | 38%, ETA 00:20
|============================================= | 38%, ETA 00:20
|============================================== | 38%, ETA 00:20
|============================================== | 38%, ETA 00:20
|============================================== | 38%, ETA 00:20
|============================================== | 38%, ETA 00:20
|============================================== | 38%, ETA 00:20
|============================================== | 38%, ETA 00:20
|============================================== | 38%, ETA 00:20
|============================================== | 38%, ETA 00:20
|============================================== | 38%, ETA 00:20
|============================================== | 38%, ETA 00:20
|============================================== | 38%, ETA 00:20
|============================================== | 38%, ETA 00:20
|============================================== | 38%, ETA 00:20
|============================================== | 38%, ETA 00:20
|============================================== | 38%, ETA 00:20
|============================================== | 38%, ETA 00:20
|=============================================== | 38%, ETA 00:19
|=============================================== | 38%, ETA 00:19
|=============================================== | 39%, ETA 00:19
|=============================================== | 39%, ETA 00:19
|=============================================== | 39%, ETA 00:19
|=============================================== | 39%, ETA 00:19
|=============================================== | 39%, ETA 00:19
|=============================================== | 39%, ETA 00:19
|=============================================== | 39%, ETA 00:19
|=============================================== | 39%, ETA 00:19
|=============================================== | 39%, ETA 00:19
|=============================================== | 39%, ETA 00:19
|=============================================== | 39%, ETA 00:19
|=============================================== | 39%, ETA 00:19
|=============================================== | 39%, ETA 00:19
|=============================================== | 39%, ETA 00:19
|================================================ | 39%, ETA 00:19
|================================================ | 39%, ETA 00:19
|================================================ | 39%, ETA 00:19
|================================================ | 40%, ETA 00:19
|================================================ | 40%, ETA 00:19
|================================================ | 40%, ETA 00:19
|================================================ | 40%, ETA 00:19
|================================================ | 40%, ETA 00:19
|================================================ | 40%, ETA 00:19
|================================================ | 40%, ETA 00:19
|================================================ | 40%, ETA 00:19
|================================================ | 40%, ETA 00:19
|================================================ | 40%, ETA 00:19
|================================================ | 40%, ETA 00:19
|================================================ | 40%, ETA 00:19
|================================================= | 40%, ETA 00:19
|================================================= | 40%, ETA 00:19
|================================================= | 40%, ETA 00:19
|================================================= | 40%, ETA 00:19
|================================================= | 40%, ETA 00:19
|================================================= | 40%, ETA 00:19
|================================================= | 40%, ETA 00:19
|================================================= | 40%, ETA 00:19
|================================================= | 40%, ETA 00:19
|================================================= | 41%, ETA 00:19
|================================================= | 41%, ETA 00:19
|================================================= | 41%, ETA 00:19
|================================================= | 41%, ETA 00:19
|================================================= | 41%, ETA 00:19
|================================================= | 41%, ETA 00:19
|================================================= | 41%, ETA 00:19
|================================================= | 41%, ETA 00:19
|================================================== | 41%, ETA 00:19
|================================================== | 41%, ETA 00:19
|================================================== | 41%, ETA 00:19
|================================================== | 41%, ETA 00:18
|================================================== | 41%, ETA 00:18
|================================================== | 41%, ETA 00:18
|================================================== | 41%, ETA 00:18
|================================================== | 41%, ETA 00:18
|================================================== | 41%, ETA 00:18
|================================================== | 41%, ETA 00:18
|================================================== | 41%, ETA 00:18
|================================================== | 42%, ETA 00:18
|================================================== | 42%, ETA 00:18
|================================================== | 42%, ETA 00:18
|================================================== | 42%, ETA 00:18
|================================================== | 42%, ETA 00:18
|=================================================== | 42%, ETA 00:18
|=================================================== | 42%, ETA 00:18
|=================================================== | 42%, ETA 00:18
|=================================================== | 42%, ETA 00:18
|=================================================== | 42%, ETA 00:18
|=================================================== | 42%, ETA 00:18
|=================================================== | 42%, ETA 00:18
|=================================================== | 42%, ETA 00:18
|=================================================== | 42%, ETA 00:18
|=================================================== | 42%, ETA 00:18
|=================================================== | 42%, ETA 00:18
|=================================================== | 42%, ETA 00:18
|=================================================== | 42%, ETA 00:18
|=================================================== | 42%, ETA 00:18
|=================================================== | 42%, ETA 00:18
|=================================================== | 42%, ETA 00:18
|=================================================== | 43%, ETA 00:18
|==================================================== | 43%, ETA 00:18
|==================================================== | 43%, ETA 00:18
|==================================================== | 43%, ETA 00:18
|==================================================== | 43%, ETA 00:18
|==================================================== | 43%, ETA 00:18
|==================================================== | 43%, ETA 00:18
|==================================================== | 43%, ETA 00:18
|==================================================== | 43%, ETA 00:18
|==================================================== | 43%, ETA 00:18
|==================================================== | 43%, ETA 00:18
|==================================================== | 43%, ETA 00:18
|==================================================== | 43%, ETA 00:18
|==================================================== | 43%, ETA 00:18
|==================================================== | 43%, ETA 00:18
|==================================================== | 43%, ETA 00:18
|==================================================== | 43%, ETA 00:18
|===================================================== | 43%, ETA 00:18
|===================================================== | 43%, ETA 00:18
|===================================================== | 44%, ETA 00:18
|===================================================== | 44%, ETA 00:18
|===================================================== | 44%, ETA 00:18
|===================================================== | 44%, ETA 00:18
|===================================================== | 44%, ETA 00:18
|===================================================== | 44%, ETA 00:18
|===================================================== | 44%, ETA 00:18
|===================================================== | 44%, ETA 00:18
|===================================================== | 44%, ETA 00:18
|===================================================== | 44%, ETA 00:18
|===================================================== | 44%, ETA 00:17
|===================================================== | 44%, ETA 00:17
|===================================================== | 44%, ETA 00:17
|===================================================== | 44%, ETA 00:17
|===================================================== | 44%, ETA 00:17
|====================================================== | 44%, ETA 00:17
|====================================================== | 44%, ETA 00:17
|====================================================== | 44%, ETA 00:17
|====================================================== | 44%, ETA 00:17
|====================================================== | 44%, ETA 00:17
|====================================================== | 44%, ETA 00:17
|====================================================== | 45%, ETA 00:17
|====================================================== | 45%, ETA 00:17
|====================================================== | 45%, ETA 00:17
|====================================================== | 45%, ETA 00:17
|====================================================== | 45%, ETA 00:17
|====================================================== | 45%, ETA 00:17
|====================================================== | 45%, ETA 00:17
|====================================================== | 45%, ETA 00:17
|====================================================== | 45%, ETA 00:17
|====================================================== | 45%, ETA 00:17
|======================================================= | 45%, ETA 00:17
|======================================================= | 45%, ETA 00:17
|======================================================= | 45%, ETA 00:17
|======================================================= | 45%, ETA 00:17
|======================================================= | 45%, ETA 00:17
|======================================================= | 45%, ETA 00:17
|======================================================= | 45%, ETA 00:17
|======================================================= | 45%, ETA 00:17
|======================================================= | 46%, ETA 00:17
|======================================================= | 46%, ETA 00:17
|======================================================= | 46%, ETA 00:17
|======================================================= | 46%, ETA 00:17
|======================================================= | 46%, ETA 00:17
|======================================================= | 46%, ETA 00:17
|======================================================= | 46%, ETA 00:17
|======================================================== | 46%, ETA 00:17
|======================================================== | 46%, ETA 00:17
|======================================================== | 46%, ETA 00:17
|======================================================== | 46%, ETA 00:17
|======================================================== | 46%, ETA 00:17
|======================================================== | 46%, ETA 00:17
|======================================================== | 46%, ETA 00:17
|======================================================== | 46%, ETA 00:17
|======================================================== | 46%, ETA 00:17
|======================================================== | 46%, ETA 00:17
|======================================================== | 46%, ETA 00:17
|======================================================== | 46%, ETA 00:17
|======================================================== | 46%, ETA 00:17
|======================================================== | 47%, ETA 00:17
|======================================================== | 47%, ETA 00:17
|======================================================== | 47%, ETA 00:17
|========================================================= | 47%, ETA 00:17
|========================================================= | 47%, ETA 00:17
|========================================================= | 47%, ETA 00:17
|========================================================= | 47%, ETA 00:17
|========================================================= | 47%, ETA 00:17
|========================================================= | 47%, ETA 00:16
|========================================================= | 47%, ETA 00:16
|========================================================= | 47%, ETA 00:16
|========================================================= | 47%, ETA 00:16
|========================================================= | 47%, ETA 00:16
|========================================================= | 47%, ETA 00:16
|========================================================= | 47%, ETA 00:16
|========================================================= | 47%, ETA 00:16
|========================================================= | 47%, ETA 00:16
|========================================================= | 48%, ETA 00:16
|========================================================== | 48%, ETA 00:16
|========================================================== | 48%, ETA 00:16
|========================================================== | 48%, ETA 00:16
|========================================================== | 48%, ETA 00:16
|========================================================== | 48%, ETA 00:16
|========================================================== | 48%, ETA 00:16
|========================================================== | 48%, ETA 00:16
|========================================================== | 48%, ETA 00:16
|========================================================== | 48%, ETA 00:16
|========================================================== | 48%, ETA 00:16
|========================================================== | 48%, ETA 00:16
|========================================================== | 48%, ETA 00:16
|=========================================================== | 48%, ETA 00:16
|=========================================================== | 48%, ETA 00:16
|=========================================================== | 48%, ETA 00:16
|=========================================================== | 48%, ETA 00:16
|=========================================================== | 49%, ETA 00:16
|=========================================================== | 49%, ETA 00:16
|=========================================================== | 49%, ETA 00:16
|=========================================================== | 49%, ETA 00:16
|=========================================================== | 49%, ETA 00:16
|=========================================================== | 49%, ETA 00:16
|=========================================================== | 49%, ETA 00:16
|=========================================================== | 49%, ETA 00:16
|=========================================================== | 49%, ETA 00:16
|=========================================================== | 49%, ETA 00:16
|=========================================================== | 49%, ETA 00:16
|=========================================================== | 49%, ETA 00:16
|=========================================================== | 49%, ETA 00:16
|============================================================ | 49%, ETA 00:16
|============================================================ | 49%, ETA 00:16
|============================================================ | 49%, ETA 00:16
|============================================================ | 49%, ETA 00:16
|============================================================ | 49%, ETA 00:16
|============================================================ | 49%, ETA 00:16
|============================================================ | 50%, ETA 00:16
|============================================================ | 50%, ETA 00:16
|============================================================ | 50%, ETA 00:16
|============================================================ | 50%, ETA 00:16
|============================================================ | 50%, ETA 00:16
|============================================================ | 50%, ETA 00:16
|============================================================ | 50%, ETA 00:16
|============================================================ | 50%, ETA 00:16
|============================================================ | 50%, ETA 00:16
|============================================================ | 50%, ETA 00:16
|============================================================ | 50%, ETA 00:16
|============================================================= | 50%, ETA 00:16
|============================================================= | 50%, ETA 00:16
|============================================================= | 50%, ETA 00:16
|============================================================= | 50%, ETA 00:15
|============================================================= | 50%, ETA 00:15
|============================================================= | 50%, ETA 00:15
|============================================================= | 50%, ETA 00:15
|============================================================= | 50%, ETA 00:15
|============================================================= | 50%, ETA 00:15
|============================================================= | 50%, ETA 00:15
|============================================================= | 51%, ETA 00:15
|============================================================= | 51%, ETA 00:15
|============================================================= | 51%, ETA 00:15
|============================================================= | 51%, ETA 00:15
|============================================================= | 51%, ETA 00:15
|============================================================= | 51%, ETA 00:15
|============================================================== | 51%, ETA 00:15
|============================================================== | 51%, ETA 00:15
|============================================================== | 51%, ETA 00:15
|============================================================== | 51%, ETA 00:15
|============================================================== | 51%, ETA 00:15
|============================================================== | 51%, ETA 00:15
|============================================================== | 51%, ETA 00:15
|============================================================== | 51%, ETA 00:15
|============================================================== | 51%, ETA 00:15
|============================================================== | 51%, ETA 00:15
|============================================================== | 51%, ETA 00:15
|============================================================== | 51%, ETA 00:15
|============================================================== | 51%, ETA 00:15
|============================================================== | 52%, ETA 00:15
|============================================================== | 52%, ETA 00:15
|============================================================== | 52%, ETA 00:15
|============================================================== | 52%, ETA 00:15
|=============================================================== | 52%, ETA 00:15
|=============================================================== | 52%, ETA 00:15
|=============================================================== | 52%, ETA 00:15
|=============================================================== | 52%, ETA 00:15
|=============================================================== | 52%, ETA 00:15
|=============================================================== | 52%, ETA 00:15
|=============================================================== | 52%, ETA 00:15
|=============================================================== | 52%, ETA 00:15
|=============================================================== | 52%, ETA 00:15
|=============================================================== | 52%, ETA 00:15
|=============================================================== | 52%, ETA 00:15
|=============================================================== | 52%, ETA 00:15
|=============================================================== | 52%, ETA 00:15
|=============================================================== | 52%, ETA 00:15
|=============================================================== | 52%, ETA 00:15
|=============================================================== | 52%, ETA 00:15
|================================================================ | 52%, ETA 00:15
|================================================================ | 53%, ETA 00:15
|================================================================ | 53%, ETA 00:15
|================================================================ | 53%, ETA 00:15
|================================================================ | 53%, ETA 00:15
|================================================================ | 53%, ETA 00:15
|================================================================ | 53%, ETA 00:15
|================================================================ | 53%, ETA 00:15
|================================================================ | 53%, ETA 00:15
|================================================================ | 53%, ETA 00:15
|================================================================ | 53%, ETA 00:15
|================================================================ | 53%, ETA 00:15
|================================================================ | 53%, ETA 00:15
|================================================================ | 53%, ETA 00:15
|================================================================ | 53%, ETA 00:15
|================================================================ | 53%, ETA 00:15
|================================================================ | 53%, ETA 00:15
|================================================================= | 53%, ETA 00:15
|================================================================= | 53%, ETA 00:15
|================================================================= | 53%, ETA 00:15
|================================================================= | 54%, ETA 00:14
|================================================================= | 54%, ETA 00:14
|================================================================= | 54%, ETA 00:14
|================================================================= | 54%, ETA 00:14
|================================================================= | 54%, ETA 00:14
|================================================================= | 54%, ETA 00:14
|================================================================= | 54%, ETA 00:14
|================================================================= | 54%, ETA 00:14
|================================================================= | 54%, ETA 00:14
|================================================================= | 54%, ETA 00:14
|================================================================= | 54%, ETA 00:14
|================================================================= | 54%, ETA 00:14
|================================================================= | 54%, ETA 00:14
|================================================================== | 54%, ETA 00:14
|================================================================== | 54%, ETA 00:14
|================================================================== | 54%, ETA 00:14
|================================================================== | 54%, ETA 00:14
|================================================================== | 54%, ETA 00:14
|================================================================== | 54%, ETA 00:14
|================================================================== | 54%, ETA 00:14
|================================================================== | 55%, ETA 00:14
|================================================================== | 55%, ETA 00:14
|================================================================== | 55%, ETA 00:14
|================================================================== | 55%, ETA 00:14
|================================================================== | 55%, ETA 00:14
|================================================================== | 55%, ETA 00:14
|================================================================== | 55%, ETA 00:14
|================================================================== | 55%, ETA 00:14
|================================================================== | 55%, ETA 00:14
|================================================================== | 55%, ETA 00:14
|=================================================================== | 55%, ETA 00:14
|=================================================================== | 55%, ETA 00:14
|=================================================================== | 55%, ETA 00:14
|=================================================================== | 55%, ETA 00:14
|=================================================================== | 55%, ETA 00:14
|=================================================================== | 55%, ETA 00:14
|=================================================================== | 55%, ETA 00:14
|=================================================================== | 55%, ETA 00:14
|=================================================================== | 55%, ETA 00:14
|=================================================================== | 55%, ETA 00:14
|=================================================================== | 56%, ETA 00:14
|=================================================================== | 56%, ETA 00:14
|=================================================================== | 56%, ETA 00:14
|=================================================================== | 56%, ETA 00:14
|=================================================================== | 56%, ETA 00:14
|=================================================================== | 56%, ETA 00:14
|==================================================================== | 56%, ETA 00:14
|==================================================================== | 56%, ETA 00:14
|==================================================================== | 56%, ETA 00:14
|==================================================================== | 56%, ETA 00:14
|==================================================================== | 56%, ETA 00:14
|==================================================================== | 56%, ETA 00:14
|==================================================================== | 56%, ETA 00:14
|==================================================================== | 56%, ETA 00:14
|==================================================================== | 56%, ETA 00:14
|==================================================================== | 56%, ETA 00:14
|==================================================================== | 56%, ETA 00:14
|==================================================================== | 56%, ETA 00:14
|==================================================================== | 56%, ETA 00:14
|==================================================================== | 56%, ETA 00:14
|==================================================================== | 56%, ETA 00:14
|==================================================================== | 57%, ETA 00:14
|==================================================================== | 57%, ETA 00:14
|===================================================================== | 57%, ETA 00:13
|===================================================================== | 57%, ETA 00:13
|===================================================================== | 57%, ETA 00:13
|===================================================================== | 57%, ETA 00:13
|===================================================================== | 57%, ETA 00:13
|===================================================================== | 57%, ETA 00:13
|===================================================================== | 57%, ETA 00:13
|===================================================================== | 57%, ETA 00:13
|===================================================================== | 57%, ETA 00:13
|===================================================================== | 57%, ETA 00:13
|===================================================================== | 57%, ETA 00:13
|===================================================================== | 57%, ETA 00:13
|===================================================================== | 57%, ETA 00:13
|===================================================================== | 57%, ETA 00:13
|===================================================================== | 57%, ETA 00:13
|====================================================================== | 57%, ETA 00:13
|====================================================================== | 57%, ETA 00:13
|====================================================================== | 58%, ETA 00:13
|====================================================================== | 58%, ETA 00:13
|====================================================================== | 58%, ETA 00:13
|====================================================================== | 58%, ETA 00:13
|====================================================================== | 58%, ETA 00:13
|====================================================================== | 58%, ETA 00:13
|====================================================================== | 58%, ETA 00:13
|====================================================================== | 58%, ETA 00:13
|====================================================================== | 58%, ETA 00:13
|====================================================================== | 58%, ETA 00:13
|====================================================================== | 58%, ETA 00:13
|======================================================================= | 58%, ETA 00:13
|======================================================================= | 58%, ETA 00:13
|======================================================================= | 58%, ETA 00:13
|======================================================================= | 58%, ETA 00:13
|======================================================================= | 59%, ETA 00:13
|======================================================================= | 59%, ETA 00:13
|======================================================================= | 59%, ETA 00:13
|======================================================================= | 59%, ETA 00:13
|======================================================================= | 59%, ETA 00:13
|======================================================================= | 59%, ETA 00:13
|======================================================================= | 59%, ETA 00:13
|======================================================================= | 59%, ETA 00:13
|======================================================================= | 59%, ETA 00:13
|======================================================================= | 59%, ETA 00:13
|======================================================================= | 59%, ETA 00:13
|======================================================================== | 59%, ETA 00:13
|======================================================================== | 59%, ETA 00:13
|======================================================================== | 59%, ETA 00:13
|======================================================================== | 59%, ETA 00:13
|======================================================================== | 59%, ETA 00:13
|======================================================================== | 59%, ETA 00:13
|======================================================================== | 59%, ETA 00:13
|======================================================================== | 59%, ETA 00:13
|======================================================================== | 60%, ETA 00:13
|======================================================================== | 60%, ETA 00:13
|======================================================================== | 60%, ETA 00:13
|======================================================================== | 60%, ETA 00:13
|======================================================================== | 60%, ETA 00:13
|======================================================================== | 60%, ETA 00:13
|======================================================================== | 60%, ETA 00:13
|======================================================================== | 60%, ETA 00:13
|======================================================================== | 60%, ETA 00:13
|========================================================================= | 60%, ETA 00:13
|========================================================================= | 60%, ETA 00:13
|========================================================================= | 60%, ETA 00:12
|========================================================================= | 60%, ETA 00:12
|========================================================================= | 60%, ETA 00:12
|========================================================================= | 60%, ETA 00:12
|========================================================================= | 60%, ETA 00:12
|========================================================================= | 60%, ETA 00:12
|========================================================================= | 60%, ETA 00:12
|========================================================================= | 60%, ETA 00:12
|========================================================================= | 60%, ETA 00:12
|========================================================================= | 60%, ETA 00:12
|========================================================================= | 61%, ETA 00:12
|========================================================================= | 61%, ETA 00:12
|========================================================================= | 61%, ETA 00:12
|========================================================================= | 61%, ETA 00:12
|========================================================================== | 61%, ETA 00:12
|========================================================================== | 61%, ETA 00:12
|========================================================================== | 61%, ETA 00:12
|========================================================================== | 61%, ETA 00:12
|========================================================================== | 61%, ETA 00:12
|========================================================================== | 61%, ETA 00:12
|========================================================================== | 61%, ETA 00:12
|========================================================================== | 61%, ETA 00:12
|========================================================================== | 61%, ETA 00:12
|========================================================================== | 61%, ETA 00:12
|========================================================================== | 61%, ETA 00:12
|========================================================================== | 61%, ETA 00:12
|========================================================================== | 61%, ETA 00:12
|========================================================================== | 61%, ETA 00:12
|========================================================================== | 61%, ETA 00:12
|========================================================================== | 62%, ETA 00:12
|========================================================================== | 62%, ETA 00:12
|=========================================================================== | 62%, ETA 00:12
|=========================================================================== | 62%, ETA 00:12
|=========================================================================== | 62%, ETA 00:12
|=========================================================================== | 62%, ETA 00:12
|=========================================================================== | 62%, ETA 00:12
|=========================================================================== | 62%, ETA 00:12
|=========================================================================== | 62%, ETA 00:12
|=========================================================================== | 62%, ETA 00:12
|=========================================================================== | 62%, ETA 00:12
|=========================================================================== | 62%, ETA 00:12
|=========================================================================== | 62%, ETA 00:12
|=========================================================================== | 62%, ETA 00:12
|=========================================================================== | 62%, ETA 00:12
|=========================================================================== | 62%, ETA 00:12
|=========================================================================== | 62%, ETA 00:12
|=========================================================================== | 62%, ETA 00:12
|============================================================================ | 62%, ETA 00:12
|============================================================================ | 62%, ETA 00:12
|============================================================================ | 62%, ETA 00:12
|============================================================================ | 63%, ETA 00:12
|============================================================================ | 63%, ETA 00:12
|============================================================================ | 63%, ETA 00:12
|============================================================================ | 63%, ETA 00:12
|============================================================================ | 63%, ETA 00:12
|============================================================================ | 63%, ETA 00:12
|============================================================================ | 63%, ETA 00:12
|============================================================================ | 63%, ETA 00:12
|============================================================================ | 63%, ETA 00:12
|============================================================================ | 63%, ETA 00:12
|============================================================================ | 63%, ETA 00:12
|============================================================================ | 63%, ETA 00:12
|============================================================================ | 63%, ETA 00:12
|============================================================================ | 63%, ETA 00:12
|============================================================================= | 63%, ETA 00:11
|============================================================================= | 63%, ETA 00:11
|============================================================================= | 63%, ETA 00:11
|============================================================================= | 63%, ETA 00:11
|============================================================================= | 64%, ETA 00:11
|============================================================================= | 64%, ETA 00:11
|============================================================================= | 64%, ETA 00:11
|============================================================================= | 64%, ETA 00:11
|============================================================================= | 64%, ETA 00:11
|============================================================================= | 64%, ETA 00:11
|============================================================================= | 64%, ETA 00:11
|============================================================================= | 64%, ETA 00:11
|============================================================================= | 64%, ETA 00:11
|============================================================================= | 64%, ETA 00:11
|============================================================================= | 64%, ETA 00:11
|============================================================================== | 64%, ETA 00:11
|============================================================================== | 64%, ETA 00:11
|============================================================================== | 64%, ETA 00:11
|============================================================================== | 64%, ETA 00:11
|============================================================================== | 64%, ETA 00:11
|============================================================================== | 64%, ETA 00:11
|============================================================================== | 64%, ETA 00:11
|============================================================================== | 64%, ETA 00:11
|============================================================================== | 64%, ETA 00:11
|============================================================================== | 64%, ETA 00:11
|============================================================================== | 65%, ETA 00:11
|============================================================================== | 65%, ETA 00:11
|============================================================================== | 65%, ETA 00:11
|============================================================================== | 65%, ETA 00:11
|============================================================================== | 65%, ETA 00:11
|============================================================================== | 65%, ETA 00:11
|============================================================================== | 65%, ETA 00:11
|=============================================================================== | 65%, ETA 00:11
|=============================================================================== | 65%, ETA 00:11
|=============================================================================== | 65%, ETA 00:11
|=============================================================================== | 65%, ETA 00:11
|=============================================================================== | 65%, ETA 00:11
|=============================================================================== | 65%, ETA 00:11
|=============================================================================== | 65%, ETA 00:11
|=============================================================================== | 65%, ETA 00:11
|=============================================================================== | 65%, ETA 00:11
|=============================================================================== | 65%, ETA 00:11
|=============================================================================== | 65%, ETA 00:11
|=============================================================================== | 65%, ETA 00:11
|=============================================================================== | 66%, ETA 00:11
|=============================================================================== | 66%, ETA 00:11
|=============================================================================== | 66%, ETA 00:11
|=============================================================================== | 66%, ETA 00:11
|=============================================================================== | 66%, ETA 00:11
|================================================================================ | 66%, ETA 00:11
|================================================================================ | 66%, ETA 00:11
|================================================================================ | 66%, ETA 00:11
|================================================================================ | 66%, ETA 00:11
|================================================================================ | 66%, ETA 00:11
|================================================================================ | 66%, ETA 00:11
|================================================================================ | 66%, ETA 00:11
|================================================================================ | 66%, ETA 00:11
|================================================================================ | 66%, ETA 00:11
|================================================================================ | 66%, ETA 00:11
|================================================================================ | 66%, ETA 00:11
|================================================================================ | 66%, ETA 00:10
|================================================================================ | 66%, ETA 00:10
|================================================================================ | 66%, ETA 00:10
|================================================================================= | 67%, ETA 00:10
|================================================================================= | 67%, ETA 00:10
|================================================================================= | 67%, ETA 00:10
|================================================================================= | 67%, ETA 00:10
|================================================================================= | 67%, ETA 00:10
|================================================================================= | 67%, ETA 00:10
|================================================================================= | 67%, ETA 00:10
|================================================================================= | 67%, ETA 00:10
|================================================================================= | 67%, ETA 00:10
|================================================================================= | 67%, ETA 00:10
|================================================================================= | 67%, ETA 00:10
|================================================================================= | 67%, ETA 00:10
|================================================================================= | 67%, ETA 00:10
|================================================================================= | 67%, ETA 00:10
|================================================================================= | 67%, ETA 00:10
|================================================================================= | 67%, ETA 00:10
|================================================================================= | 67%, ETA 00:10
|================================================================================== | 67%, ETA 00:10
|================================================================================== | 67%, ETA 00:10
|================================================================================== | 68%, ETA 00:10
|================================================================================== | 68%, ETA 00:10
|================================================================================== | 68%, ETA 00:10
|================================================================================== | 68%, ETA 00:10
|================================================================================== | 68%, ETA 00:10
|================================================================================== | 68%, ETA 00:10
|================================================================================== | 68%, ETA 00:10
|================================================================================== | 68%, ETA 00:10
|================================================================================== | 68%, ETA 00:10
|================================================================================== | 68%, ETA 00:10
|================================================================================== | 68%, ETA 00:10
|================================================================================== | 68%, ETA 00:10
|================================================================================== | 68%, ETA 00:10
|================================================================================== | 68%, ETA 00:10
|=================================================================================== | 68%, ETA 00:10
|=================================================================================== | 68%, ETA 00:10
|=================================================================================== | 68%, ETA 00:10
|=================================================================================== | 68%, ETA 00:10
|=================================================================================== | 68%, ETA 00:10
|=================================================================================== | 68%, ETA 00:10
|=================================================================================== | 68%, ETA 00:10
|=================================================================================== | 69%, ETA 00:10
|=================================================================================== | 69%, ETA 00:10
|=================================================================================== | 69%, ETA 00:10
|=================================================================================== | 69%, ETA 00:10
|=================================================================================== | 69%, ETA 00:10
|=================================================================================== | 69%, ETA 00:10
|=================================================================================== | 69%, ETA 00:10
|=================================================================================== | 69%, ETA 00:10
|==================================================================================== | 69%, ETA 00:10
|==================================================================================== | 69%, ETA 00:10
|==================================================================================== | 69%, ETA 00:10
|==================================================================================== | 69%, ETA 00:10
|==================================================================================== | 69%, ETA 00:10
|==================================================================================== | 69%, ETA 00:10
|==================================================================================== | 69%, ETA 00:10
|==================================================================================== | 69%, ETA 00:10
|==================================================================================== | 69%, ETA 00:10
|==================================================================================== | 70%, ETA 00:10
|==================================================================================== | 70%, ETA 00:10
|==================================================================================== | 70%, ETA 00:09
|==================================================================================== | 70%, ETA 00:09
|==================================================================================== | 70%, ETA 00:09
|==================================================================================== | 70%, ETA 00:09
|==================================================================================== | 70%, ETA 00:09
|===================================================================================== | 70%, ETA 00:09
|===================================================================================== | 70%, ETA 00:09
|===================================================================================== | 70%, ETA 00:09
|===================================================================================== | 70%, ETA 00:09
|===================================================================================== | 70%, ETA 00:09
|===================================================================================== | 70%, ETA 00:09
|===================================================================================== | 70%, ETA 00:09
|===================================================================================== | 70%, ETA 00:09
|===================================================================================== | 70%, ETA 00:09
|===================================================================================== | 70%, ETA 00:09
|===================================================================================== | 70%, ETA 00:09
|===================================================================================== | 70%, ETA 00:09
|===================================================================================== | 70%, ETA 00:09
|===================================================================================== | 70%, ETA 00:09
|===================================================================================== | 71%, ETA 00:09
|===================================================================================== | 71%, ETA 00:09
|===================================================================================== | 71%, ETA 00:09
|====================================================================================== | 71%, ETA 00:09
|====================================================================================== | 71%, ETA 00:09
|====================================================================================== | 71%, ETA 00:09
|====================================================================================== | 71%, ETA 00:09
|====================================================================================== | 71%, ETA 00:09
|====================================================================================== | 71%, ETA 00:09
|====================================================================================== | 71%, ETA 00:09
|====================================================================================== | 71%, ETA 00:09
|====================================================================================== | 71%, ETA 00:09
|====================================================================================== | 71%, ETA 00:09
|====================================================================================== | 71%, ETA 00:09
|====================================================================================== | 71%, ETA 00:09
|====================================================================================== | 71%, ETA 00:09
|====================================================================================== | 71%, ETA 00:09
|====================================================================================== | 71%, ETA 00:09
|====================================================================================== | 71%, ETA 00:09
|======================================================================================= | 72%, ETA 00:09
|======================================================================================= | 72%, ETA 00:09
|======================================================================================= | 72%, ETA 00:09
|======================================================================================= | 72%, ETA 00:09
|======================================================================================= | 72%, ETA 00:09
|======================================================================================= | 72%, ETA 00:09
|======================================================================================= | 72%, ETA 00:09
|======================================================================================= | 72%, ETA 00:09
|======================================================================================= | 72%, ETA 00:09
|======================================================================================= | 72%, ETA 00:09
|======================================================================================= | 72%, ETA 00:09
|======================================================================================= | 72%, ETA 00:09
|======================================================================================= | 72%, ETA 00:09
|======================================================================================= | 72%, ETA 00:09
|======================================================================================= | 72%, ETA 00:09
|======================================================================================= | 72%, ETA 00:09
|======================================================================================= | 72%, ETA 00:09
|======================================================================================== | 72%, ETA 00:09
|======================================================================================== | 72%, ETA 00:09
|======================================================================================== | 72%, ETA 00:09
|======================================================================================== | 72%, ETA 00:09
|======================================================================================== | 73%, ETA 00:09
|======================================================================================== | 73%, ETA 00:09
|======================================================================================== | 73%, ETA 00:09
|======================================================================================== | 73%, ETA 00:09
|======================================================================================== | 73%, ETA 00:09
|======================================================================================== | 73%, ETA 00:09
|======================================================================================== | 73%, ETA 00:09
|======================================================================================== | 73%, ETA 00:09
|======================================================================================== | 73%, ETA 00:09
|======================================================================================== | 73%, ETA 00:08
|======================================================================================== | 73%, ETA 00:08
|======================================================================================== | 73%, ETA 00:08
|========================================================================================= | 73%, ETA 00:08
|========================================================================================= | 73%, ETA 00:08
|========================================================================================= | 73%, ETA 00:08
|========================================================================================= | 73%, ETA 00:08
|========================================================================================= | 73%, ETA 00:08
|========================================================================================= | 73%, ETA 00:08
|========================================================================================= | 73%, ETA 00:08
|========================================================================================= | 74%, ETA 00:08
|========================================================================================= | 74%, ETA 00:08
|========================================================================================= | 74%, ETA 00:08
|========================================================================================= | 74%, ETA 00:08
|========================================================================================= | 74%, ETA 00:08
|========================================================================================= | 74%, ETA 00:08
|========================================================================================= | 74%, ETA 00:08
|========================================================================================= | 74%, ETA 00:08
|========================================================================================= | 74%, ETA 00:08
|========================================================================================= | 74%, ETA 00:08
|========================================================================================== | 74%, ETA 00:08
|========================================================================================== | 74%, ETA 00:08
|========================================================================================== | 74%, ETA 00:08
|========================================================================================== | 74%, ETA 00:08
|========================================================================================== | 74%, ETA 00:08
|========================================================================================== | 74%, ETA 00:08
|========================================================================================== | 74%, ETA 00:08
|========================================================================================== | 74%, ETA 00:08
|========================================================================================== | 74%, ETA 00:08
|========================================================================================== | 74%, ETA 00:08
|========================================================================================== | 74%, ETA 00:08
|========================================================================================== | 75%, ETA 00:08
|========================================================================================== | 75%, ETA 00:08
|========================================================================================== | 75%, ETA 00:08
|========================================================================================== | 75%, ETA 00:08
|========================================================================================== | 75%, ETA 00:08
|=========================================================================================== | 75%, ETA 00:08
|=========================================================================================== | 75%, ETA 00:08
|=========================================================================================== | 75%, ETA 00:08
|=========================================================================================== | 75%, ETA 00:08
|=========================================================================================== | 75%, ETA 00:08
|=========================================================================================== | 75%, ETA 00:08
|=========================================================================================== | 75%, ETA 00:08
|=========================================================================================== | 75%, ETA 00:08
|=========================================================================================== | 75%, ETA 00:08
|=========================================================================================== | 75%, ETA 00:08
|=========================================================================================== | 75%, ETA 00:08
|=========================================================================================== | 75%, ETA 00:08
|=========================================================================================== | 75%, ETA 00:08
|=========================================================================================== | 75%, ETA 00:08
|=========================================================================================== | 76%, ETA 00:08
|=========================================================================================== | 76%, ETA 00:08
|=========================================================================================== | 76%, ETA 00:08
|============================================================================================ | 76%, ETA 00:08
|============================================================================================ | 76%, ETA 00:08
|============================================================================================ | 76%, ETA 00:08
|============================================================================================ | 76%, ETA 00:08
|============================================================================================ | 76%, ETA 00:08
|============================================================================================ | 76%, ETA 00:08
|============================================================================================ | 76%, ETA 00:08
|============================================================================================ | 76%, ETA 00:08
|============================================================================================ | 76%, ETA 00:08
|============================================================================================ | 76%, ETA 00:08
|============================================================================================ | 76%, ETA 00:08
|============================================================================================ | 76%, ETA 00:08
|============================================================================================ | 76%, ETA 00:08
|============================================================================================ | 76%, ETA 00:07
|============================================================================================ | 76%, ETA 00:07
|============================================================================================ | 76%, ETA 00:07
|============================================================================================= | 76%, ETA 00:07
|============================================================================================= | 76%, ETA 00:07
|============================================================================================= | 77%, ETA 00:07
|============================================================================================= | 77%, ETA 00:07
|============================================================================================= | 77%, ETA 00:07
|============================================================================================= | 77%, ETA 00:07
|============================================================================================= | 77%, ETA 00:07
|============================================================================================= | 77%, ETA 00:07
|============================================================================================= | 77%, ETA 00:07
|============================================================================================= | 77%, ETA 00:07
|============================================================================================= | 77%, ETA 00:07
|============================================================================================= | 77%, ETA 00:07
|============================================================================================= | 77%, ETA 00:07
|============================================================================================= | 77%, ETA 00:07
|============================================================================================= | 77%, ETA 00:07
|============================================================================================= | 77%, ETA 00:07
|============================================================================================== | 77%, ETA 00:07
|============================================================================================== | 77%, ETA 00:07
|============================================================================================== | 77%, ETA 00:07
|============================================================================================== | 77%, ETA 00:07
|============================================================================================== | 78%, ETA 00:07
|============================================================================================== | 78%, ETA 00:07
|============================================================================================== | 78%, ETA 00:07
|============================================================================================== | 78%, ETA 00:07
|============================================================================================== | 78%, ETA 00:07
|============================================================================================== | 78%, ETA 00:07
|============================================================================================== | 78%, ETA 00:07
|============================================================================================== | 78%, ETA 00:07
|============================================================================================== | 78%, ETA 00:07
|============================================================================================== | 78%, ETA 00:07
|============================================================================================== | 78%, ETA 00:07
|============================================================================================== | 78%, ETA 00:07
|=============================================================================================== | 78%, ETA 00:07
|=============================================================================================== | 78%, ETA 00:07
|=============================================================================================== | 78%, ETA 00:07
|=============================================================================================== | 78%, ETA 00:07
|=============================================================================================== | 78%, ETA 00:07
|=============================================================================================== | 78%, ETA 00:07
|=============================================================================================== | 78%, ETA 00:07
|=============================================================================================== | 78%, ETA 00:07
|=============================================================================================== | 78%, ETA 00:07
|=============================================================================================== | 79%, ETA 00:07
|=============================================================================================== | 79%, ETA 00:07
|=============================================================================================== | 79%, ETA 00:07
|=============================================================================================== | 79%, ETA 00:07
|=============================================================================================== | 79%, ETA 00:07
|=============================================================================================== | 79%, ETA 00:07
|=============================================================================================== | 79%, ETA 00:07
|=============================================================================================== | 79%, ETA 00:07
|================================================================================================ | 79%, ETA 00:07
|================================================================================================ | 79%, ETA 00:07
|================================================================================================ | 79%, ETA 00:07
|================================================================================================ | 79%, ETA 00:07
|================================================================================================ | 79%, ETA 00:07
|================================================================================================ | 79%, ETA 00:07
|================================================================================================ | 79%, ETA 00:07
|================================================================================================ | 79%, ETA 00:07
|================================================================================================ | 79%, ETA 00:07
|================================================================================================ | 79%, ETA 00:07
|================================================================================================ | 79%, ETA 00:06
|================================================================================================ | 80%, ETA 00:06
|================================================================================================ | 80%, ETA 00:06
|================================================================================================ | 80%, ETA 00:06
|================================================================================================ | 80%, ETA 00:06
|================================================================================================ | 80%, ETA 00:06
|================================================================================================ | 80%, ETA 00:06
|================================================================================================= | 80%, ETA 00:06
|================================================================================================= | 80%, ETA 00:06
|================================================================================================= | 80%, ETA 00:06
|================================================================================================= | 80%, ETA 00:06
|================================================================================================= | 80%, ETA 00:06
|================================================================================================= | 80%, ETA 00:06
|================================================================================================= | 80%, ETA 00:06
|================================================================================================= | 80%, ETA 00:06
|================================================================================================= | 80%, ETA 00:06
|================================================================================================= | 80%, ETA 00:06
|================================================================================================= | 80%, ETA 00:06
|================================================================================================= | 80%, ETA 00:06
|================================================================================================= | 80%, ETA 00:06
|================================================================================================= | 80%, ETA 00:06
|================================================================================================= | 80%, ETA 00:06
|================================================================================================= | 81%, ETA 00:06
|================================================================================================== | 81%, ETA 00:06
|================================================================================================== | 81%, ETA 00:06
|================================================================================================== | 81%, ETA 00:06
|================================================================================================== | 81%, ETA 00:06
|================================================================================================== | 81%, ETA 00:06
|================================================================================================== | 81%, ETA 00:06
|================================================================================================== | 81%, ETA 00:06
|================================================================================================== | 81%, ETA 00:06
|================================================================================================== | 81%, ETA 00:06
|================================================================================================== | 81%, ETA 00:06
|================================================================================================== | 81%, ETA 00:06
|================================================================================================== | 81%, ETA 00:06
|================================================================================================== | 81%, ETA 00:06
|================================================================================================== | 81%, ETA 00:06
|================================================================================================== | 81%, ETA 00:06
|================================================================================================== | 81%, ETA 00:06
|================================================================================================== | 81%, ETA 00:06
|=================================================================================================== | 81%, ETA 00:06
|=================================================================================================== | 82%, ETA 00:06
|=================================================================================================== | 82%, ETA 00:06
|=================================================================================================== | 82%, ETA 00:06
|=================================================================================================== | 82%, ETA 00:06
|=================================================================================================== | 82%, ETA 00:06
|=================================================================================================== | 82%, ETA 00:06
|=================================================================================================== | 82%, ETA 00:06
|=================================================================================================== | 82%, ETA 00:06
|=================================================================================================== | 82%, ETA 00:06
|=================================================================================================== | 82%, ETA 00:06
|=================================================================================================== | 82%, ETA 00:06
|=================================================================================================== | 82%, ETA 00:06
|=================================================================================================== | 82%, ETA 00:06
|=================================================================================================== | 82%, ETA 00:06
|=================================================================================================== | 82%, ETA 00:06
|==================================================================================================== | 82%, ETA 00:06
|==================================================================================================== | 82%, ETA 00:06
|==================================================================================================== | 82%, ETA 00:06
|==================================================================================================== | 82%, ETA 00:06
|==================================================================================================== | 82%, ETA 00:06
|==================================================================================================== | 82%, ETA 00:06
|==================================================================================================== | 83%, ETA 00:06
|==================================================================================================== | 83%, ETA 00:05
|==================================================================================================== | 83%, ETA 00:05
|==================================================================================================== | 83%, ETA 00:05
|==================================================================================================== | 83%, ETA 00:05
|==================================================================================================== | 83%, ETA 00:05
|==================================================================================================== | 83%, ETA 00:05
|==================================================================================================== | 83%, ETA 00:05
|==================================================================================================== | 83%, ETA 00:05
|==================================================================================================== | 83%, ETA 00:05
|==================================================================================================== | 83%, ETA 00:05
|===================================================================================================== | 83%, ETA 00:05
|===================================================================================================== | 83%, ETA 00:05
|===================================================================================================== | 83%, ETA 00:05
|===================================================================================================== | 83%, ETA 00:05
|===================================================================================================== | 83%, ETA 00:05
|===================================================================================================== | 83%, ETA 00:05
|===================================================================================================== | 83%, ETA 00:05
|===================================================================================================== | 83%, ETA 00:05
|===================================================================================================== | 84%, ETA 00:05
|===================================================================================================== | 84%, ETA 00:05
|===================================================================================================== | 84%, ETA 00:05
|===================================================================================================== | 84%, ETA 00:05
|===================================================================================================== | 84%, ETA 00:05
|===================================================================================================== | 84%, ETA 00:05
|===================================================================================================== | 84%, ETA 00:05
|===================================================================================================== | 84%, ETA 00:05
|====================================================================================================== | 84%, ETA 00:05
|====================================================================================================== | 84%, ETA 00:05
|====================================================================================================== | 84%, ETA 00:05
|====================================================================================================== | 84%, ETA 00:05
|====================================================================================================== | 84%, ETA 00:05
|====================================================================================================== | 84%, ETA 00:05
|====================================================================================================== | 84%, ETA 00:05
|====================================================================================================== | 84%, ETA 00:05
|====================================================================================================== | 84%, ETA 00:05
|====================================================================================================== | 84%, ETA 00:05
|====================================================================================================== | 84%, ETA 00:05
|====================================================================================================== | 84%, ETA 00:05
|====================================================================================================== | 84%, ETA 00:05
|====================================================================================================== | 85%, ETA 00:05
|====================================================================================================== | 85%, ETA 00:05
|====================================================================================================== | 85%, ETA 00:05
|====================================================================================================== | 85%, ETA 00:05
|======================================================================================================= | 85%, ETA 00:05
|======================================================================================================= | 85%, ETA 00:05
|======================================================================================================= | 85%, ETA 00:05
|======================================================================================================= | 85%, ETA 00:05
|======================================================================================================= | 85%, ETA 00:05
|======================================================================================================= | 85%, ETA 00:05
|======================================================================================================= | 85%, ETA 00:05
|======================================================================================================= | 85%, ETA 00:05
|======================================================================================================= | 85%, ETA 00:05
|======================================================================================================= | 85%, ETA 00:05
|======================================================================================================= | 85%, ETA 00:05
|======================================================================================================= | 85%, ETA 00:05
|======================================================================================================= | 85%, ETA 00:05
|======================================================================================================= | 85%, ETA 00:05
|======================================================================================================= | 85%, ETA 00:05
|======================================================================================================= | 86%, ETA 00:05
|======================================================================================================== | 86%, ETA 00:05
|======================================================================================================== | 86%, ETA 00:05
|======================================================================================================== | 86%, ETA 00:05
|======================================================================================================== | 86%, ETA 00:05
|======================================================================================================== | 86%, ETA 00:04
|======================================================================================================== | 86%, ETA 00:04
|======================================================================================================== | 86%, ETA 00:04
|======================================================================================================== | 86%, ETA 00:04
|======================================================================================================== | 86%, ETA 00:04
|======================================================================================================== | 86%, ETA 00:04
|======================================================================================================== | 86%, ETA 00:04
|======================================================================================================== | 86%, ETA 00:04
|======================================================================================================== | 86%, ETA 00:04
|======================================================================================================== | 86%, ETA 00:04
|======================================================================================================== | 86%, ETA 00:04
|======================================================================================================== | 86%, ETA 00:04
|======================================================================================================== | 86%, ETA 00:04
|========================================================================================================= | 86%, ETA 00:04
|========================================================================================================= | 86%, ETA 00:04
|========================================================================================================= | 86%, ETA 00:04
|========================================================================================================= | 87%, ETA 00:04
|========================================================================================================= | 87%, ETA 00:04
|========================================================================================================= | 87%, ETA 00:04
|========================================================================================================= | 87%, ETA 00:04
|========================================================================================================= | 87%, ETA 00:04
|========================================================================================================= | 87%, ETA 00:04
|========================================================================================================= | 87%, ETA 00:04
|========================================================================================================= | 87%, ETA 00:04
|========================================================================================================= | 87%, ETA 00:04
|========================================================================================================= | 87%, ETA 00:04
|========================================================================================================= | 87%, ETA 00:04
|========================================================================================================= | 87%, ETA 00:04
|========================================================================================================= | 87%, ETA 00:04
|========================================================================================================== | 87%, ETA 00:04
|========================================================================================================== | 87%, ETA 00:04
|========================================================================================================== | 87%, ETA 00:04
|========================================================================================================== | 87%, ETA 00:04
|========================================================================================================== | 87%, ETA 00:04
|========================================================================================================== | 87%, ETA 00:04
|========================================================================================================== | 88%, ETA 00:04
|========================================================================================================== | 88%, ETA 00:04
|========================================================================================================== | 88%, ETA 00:04
|========================================================================================================== | 88%, ETA 00:04
|========================================================================================================== | 88%, ETA 00:04
|========================================================================================================== | 88%, ETA 00:04
|========================================================================================================== | 88%, ETA 00:04
|========================================================================================================== | 88%, ETA 00:04
|========================================================================================================== | 88%, ETA 00:04
|========================================================================================================== | 88%, ETA 00:04
|========================================================================================================== | 88%, ETA 00:04
|=========================================================================================================== | 88%, ETA 00:04
|=========================================================================================================== | 88%, ETA 00:04
|=========================================================================================================== | 88%, ETA 00:04
|=========================================================================================================== | 88%, ETA 00:04
|=========================================================================================================== | 88%, ETA 00:04
|=========================================================================================================== | 88%, ETA 00:04
|=========================================================================================================== | 88%, ETA 00:04
|=========================================================================================================== | 88%, ETA 00:04
|=========================================================================================================== | 88%, ETA 00:04
|=========================================================================================================== | 88%, ETA 00:04
|=========================================================================================================== | 89%, ETA 00:04
|=========================================================================================================== | 89%, ETA 00:04
|=========================================================================================================== | 89%, ETA 00:04
|=========================================================================================================== | 89%, ETA 00:04
|=========================================================================================================== | 89%, ETA 00:04
|=========================================================================================================== | 89%, ETA 00:04
|============================================================================================================ | 89%, ETA 00:04
|============================================================================================================ | 89%, ETA 00:03
|============================================================================================================ | 89%, ETA 00:03
|============================================================================================================ | 89%, ETA 00:03
|============================================================================================================ | 89%, ETA 00:03
|============================================================================================================ | 89%, ETA 00:03
|============================================================================================================ | 89%, ETA 00:03
|============================================================================================================ | 89%, ETA 00:03
|============================================================================================================ | 89%, ETA 00:03
|============================================================================================================ | 89%, ETA 00:03
|============================================================================================================ | 89%, ETA 00:03
|============================================================================================================ | 89%, ETA 00:03
|============================================================================================================ | 89%, ETA 00:03
|============================================================================================================ | 90%, ETA 00:03
|============================================================================================================ | 90%, ETA 00:03
|============================================================================================================ | 90%, ETA 00:03
|============================================================================================================ | 90%, ETA 00:03
|============================================================================================================= | 90%, ETA 00:03
|============================================================================================================= | 90%, ETA 00:03
|============================================================================================================= | 90%, ETA 00:03
|============================================================================================================= | 90%, ETA 00:03
|============================================================================================================= | 90%, ETA 00:03
|============================================================================================================= | 90%, ETA 00:03
|============================================================================================================= | 90%, ETA 00:03
|============================================================================================================= | 90%, ETA 00:03
|============================================================================================================= | 90%, ETA 00:03
|============================================================================================================= | 90%, ETA 00:03
|============================================================================================================= | 90%, ETA 00:03
|============================================================================================================= | 90%, ETA 00:03
|============================================================================================================= | 90%, ETA 00:03
|============================================================================================================= | 90%, ETA 00:03
|============================================================================================================= | 90%, ETA 00:03
|============================================================================================================= | 90%, ETA 00:03
|============================================================================================================== | 90%, ETA 00:03
|============================================================================================================== | 91%, ETA 00:03
|============================================================================================================== | 91%, ETA 00:03
|============================================================================================================== | 91%, ETA 00:03
|============================================================================================================== | 91%, ETA 00:03
|============================================================================================================== | 91%, ETA 00:03
|============================================================================================================== | 91%, ETA 00:03
|============================================================================================================== | 91%, ETA 00:03
|============================================================================================================== | 91%, ETA 00:03
|============================================================================================================== | 91%, ETA 00:03
|============================================================================================================== | 91%, ETA 00:03
|============================================================================================================== | 91%, ETA 00:03
|============================================================================================================== | 91%, ETA 00:03
|============================================================================================================== | 91%, ETA 00:03
|============================================================================================================== | 91%, ETA 00:03
|============================================================================================================== | 91%, ETA 00:03
|============================================================================================================== | 91%, ETA 00:03
|=============================================================================================================== | 91%, ETA 00:03
|=============================================================================================================== | 91%, ETA 00:03
|=============================================================================================================== | 91%, ETA 00:03
|=============================================================================================================== | 92%, ETA 00:03
|=============================================================================================================== | 92%, ETA 00:03
|=============================================================================================================== | 92%, ETA 00:03
|=============================================================================================================== | 92%, ETA 00:03
|=============================================================================================================== | 92%, ETA 00:03
|=============================================================================================================== | 92%, ETA 00:03
|=============================================================================================================== | 92%, ETA 00:03
|=============================================================================================================== | 92%, ETA 00:03
|=============================================================================================================== | 92%, ETA 00:03
|=============================================================================================================== | 92%, ETA 00:03
|=============================================================================================================== | 92%, ETA 00:03
|=============================================================================================================== | 92%, ETA 00:02
|=============================================================================================================== | 92%, ETA 00:02
|================================================================================================================ | 92%, ETA 00:02
|================================================================================================================ | 92%, ETA 00:02
|================================================================================================================ | 92%, ETA 00:02
|================================================================================================================ | 92%, ETA 00:02
|================================================================================================================ | 92%, ETA 00:02
|================================================================================================================ | 92%, ETA 00:02
|================================================================================================================ | 92%, ETA 00:02
|================================================================================================================ | 92%, ETA 00:02
|================================================================================================================ | 93%, ETA 00:02
|================================================================================================================ | 93%, ETA 00:02
|================================================================================================================ | 93%, ETA 00:02
|================================================================================================================ | 93%, ETA 00:02
|================================================================================================================ | 93%, ETA 00:02
|================================================================================================================ | 93%, ETA 00:02
|================================================================================================================ | 93%, ETA 00:02
|================================================================================================================ | 93%, ETA 00:02
|================================================================================================================ | 93%, ETA 00:02
|================================================================================================================= | 93%, ETA 00:02
|================================================================================================================= | 93%, ETA 00:02
|================================================================================================================= | 93%, ETA 00:02
|================================================================================================================= | 93%, ETA 00:02
|================================================================================================================= | 93%, ETA 00:02
|================================================================================================================= | 93%, ETA 00:02
|================================================================================================================= | 93%, ETA 00:02
|================================================================================================================= | 93%, ETA 00:02
|================================================================================================================= | 93%, ETA 00:02
|================================================================================================================= | 93%, ETA 00:02
|================================================================================================================= | 94%, ETA 00:02
|================================================================================================================= | 94%, ETA 00:02
|================================================================================================================= | 94%, ETA 00:02
|================================================================================================================= | 94%, ETA 00:02
|================================================================================================================= | 94%, ETA 00:02
|================================================================================================================= | 94%, ETA 00:02
|================================================================================================================= | 94%, ETA 00:02
|================================================================================================================== | 94%, ETA 00:02
|================================================================================================================== | 94%, ETA 00:02
|================================================================================================================== | 94%, ETA 00:02
|================================================================================================================== | 94%, ETA 00:02
|================================================================================================================== | 94%, ETA 00:02
|================================================================================================================== | 94%, ETA 00:02
|================================================================================================================== | 94%, ETA 00:02
|================================================================================================================== | 94%, ETA 00:02
|================================================================================================================== | 94%, ETA 00:02
|================================================================================================================== | 94%, ETA 00:02
|================================================================================================================== | 94%, ETA 00:02
|================================================================================================================== | 94%, ETA 00:02
|================================================================================================================== | 94%, ETA 00:02
|================================================================================================================== | 94%, ETA 00:02
|================================================================================================================== | 95%, ETA 00:02
|================================================================================================================== | 95%, ETA 00:02
|=================================================================================================================== | 95%, ETA 00:02
|=================================================================================================================== | 95%, ETA 00:02
|=================================================================================================================== | 95%, ETA 00:02
|=================================================================================================================== | 95%, ETA 00:02
|=================================================================================================================== | 95%, ETA 00:02
|=================================================================================================================== | 95%, ETA 00:02
|=================================================================================================================== | 95%, ETA 00:02
|=================================================================================================================== | 95%, ETA 00:02
|=================================================================================================================== | 95%, ETA 00:02
|=================================================================================================================== | 95%, ETA 00:02
|=================================================================================================================== | 95%, ETA 00:02
|=================================================================================================================== | 95%, ETA 00:02
|=================================================================================================================== | 95%, ETA 00:01
|=================================================================================================================== | 95%, ETA 00:01
|=================================================================================================================== | 95%, ETA 00:01
|=================================================================================================================== | 95%, ETA 00:01
|=================================================================================================================== | 95%, ETA 00:01
|==================================================================================================================== | 96%, ETA 00:01
|==================================================================================================================== | 96%, ETA 00:01
|==================================================================================================================== | 96%, ETA 00:01
|==================================================================================================================== | 96%, ETA 00:01
|==================================================================================================================== | 96%, ETA 00:01
|==================================================================================================================== | 96%, ETA 00:01
|==================================================================================================================== | 96%, ETA 00:01
|==================================================================================================================== | 96%, ETA 00:01
|==================================================================================================================== | 96%, ETA 00:01
|==================================================================================================================== | 96%, ETA 00:01
|==================================================================================================================== | 96%, ETA 00:01
|==================================================================================================================== | 96%, ETA 00:01
|==================================================================================================================== | 96%, ETA 00:01
|==================================================================================================================== | 96%, ETA 00:01
|==================================================================================================================== | 96%, ETA 00:01
|==================================================================================================================== | 96%, ETA 00:01
|===================================================================================================================== | 96%, ETA 00:01
|===================================================================================================================== | 96%, ETA 00:01
|===================================================================================================================== | 96%, ETA 00:01
|===================================================================================================================== | 96%, ETA 00:01
|===================================================================================================================== | 96%, ETA 00:01
|===================================================================================================================== | 97%, ETA 00:01
|===================================================================================================================== | 97%, ETA 00:01
|===================================================================================================================== | 97%, ETA 00:01
|===================================================================================================================== | 97%, ETA 00:01
|===================================================================================================================== | 97%, ETA 00:01
|===================================================================================================================== | 97%, ETA 00:01
|===================================================================================================================== | 97%, ETA 00:01
|===================================================================================================================== | 97%, ETA 00:01
|===================================================================================================================== | 97%, ETA 00:01
|===================================================================================================================== | 97%, ETA 00:01
|===================================================================================================================== | 97%, ETA 00:01
|===================================================================================================================== | 97%, ETA 00:01
|====================================================================================================================== | 97%, ETA 00:01
|====================================================================================================================== | 97%, ETA 00:01
|====================================================================================================================== | 97%, ETA 00:01
|====================================================================================================================== | 97%, ETA 00:01
|====================================================================================================================== | 97%, ETA 00:01
|====================================================================================================================== | 97%, ETA 00:01
|====================================================================================================================== | 97%, ETA 00:01
|====================================================================================================================== | 98%, ETA 00:01
|====================================================================================================================== | 98%, ETA 00:01
|====================================================================================================================== | 98%, ETA 00:01
|====================================================================================================================== | 98%, ETA 00:01
|====================================================================================================================== | 98%, ETA 00:01
|====================================================================================================================== | 98%, ETA 00:01
|====================================================================================================================== | 98%, ETA 00:01
|====================================================================================================================== | 98%, ETA 00:01
|====================================================================================================================== | 98%, ETA 00:01
|======================================================================================================================= | 98%, ETA 00:01
|======================================================================================================================= | 98%, ETA 00:01
|======================================================================================================================= | 98%, ETA 00:01
|======================================================================================================================= | 98%, ETA 00:01
|======================================================================================================================= | 98%, ETA 00:01
|======================================================================================================================= | 98%, ETA 00:01
|======================================================================================================================= | 98%, ETA 00:01
|======================================================================================================================= | 98%, ETA 00:01
|======================================================================================================================= | 98%, ETA 00:01
|======================================================================================================================= | 98%, ETA 00:01
|======================================================================================================================= | 98%, ETA 00:00
|======================================================================================================================= | 98%, ETA 00:00
|======================================================================================================================= | 99%, ETA 00:00
|======================================================================================================================= | 99%, ETA 00:00
|======================================================================================================================= | 99%, ETA 00:00
|======================================================================================================================= | 99%, ETA 00:00
|======================================================================================================================= | 99%, ETA 00:00
|======================================================================================================================== | 99%, ETA 00:00
|======================================================================================================================== | 99%, ETA 00:00
|======================================================================================================================== | 99%, ETA 00:00
|======================================================================================================================== | 99%, ETA 00:00
|======================================================================================================================== | 99%, ETA 00:00
|======================================================================================================================== | 99%, ETA 00:00
|======================================================================================================================== | 99%, ETA 00:00
|======================================================================================================================== | 99%, ETA 00:00
|======================================================================================================================== | 99%, ETA 00:00
|======================================================================================================================== | 99%, ETA 00:00
|======================================================================================================================== | 99%, ETA 00:00
|======================================================================================================================== | 99%, ETA 00:00
|======================================================================================================================== | 99%, ETA 00:00
|======================================================================================================================== | 99%, ETA 00:00
|======================================================================================================================== | 100%, ETA 00:00
|======================================================================================================================== | 100%, ETA 00:00
|=========================================================================================================================| 100%, ETA 00:00
|=========================================================================================================================| 100%, ETA 00:00
|=========================================================================================================================| 100%, ETA 00:00
|=========================================================================================================================| 100%, ETA 00:00
|=========================================================================================================================| 100%, ETA 00:00
|=========================================================================================================================| 100%, ETA 00:00
|=========================================================================================================================| 100%, ETA 00:00
|=========================================================================================================================| 100%, ETA 00:00
|=====================================================================================================================| 100%, Elapsed 00:32
# Add gene name as column and filter significant hits
sig_traj_genes <- pr_test_res %>%
tibble::rownames_to_column("gene") %>%
filter(q_value < 0.05, status == "OK") %>%
arrange(desc(morans_I))
cat(sprintf("%d trajectory-variable genes (q < 0.05)\n", nrow(sig_traj_genes)))
1851 trajectory-variable genes (q < 0.05)
# Define genes to exclude from dotplot — ribosomal, mitochondrial, housekeeping
# These are trajectory-variable due to technical reasons not biology
exclude_genes <- grep(
"^RP[SL]|^MT-|^MALAT1|^NEAT1|^XIST|^ACTB|^GAPDH|^B2M|^EEF|^EIF",
rownames(cd4_ref), value = TRUE
)
cat(sprintf("Genes to exclude (technical): %d\n", length(exclude_genes)))
Genes to exclude (technical): 199
kable(head(sig_traj_genes[, c("gene","morans_I","q_value")], 20),
caption = "Top 20 trajectory-variable genes (Monocle3 graph_test)",
digits = 4) %>%
kable_styling(bootstrap_options=c("striped","condensed"), full_width=FALSE)
| gene | morans_I | q_value |
|---|---|---|
| CCL5 | 0.6551 | 0 |
| RPL32 | 0.5215 | 0 |
| EEF1A1 | 0.5053 | 0 |
| RPS14 | 0.5000 | 0 |
| RPL10 | 0.4992 | 0 |
| RPL30 | 0.4969 | 0 |
| RPL41 | 0.4953 | 0 |
| RPS3A | 0.4940 | 0 |
| RPL34 | 0.4790 | 0 |
| RPS13 | 0.4789 | 0 |
| RPL39 | 0.4763 | 0 |
| RPL19 | 0.4637 | 0 |
| RPS8 | 0.4579 | 0 |
| RPS23 | 0.4571 | 0 |
| RPS12 | 0.4545 | 0 |
| RPS27A | 0.4537 | 0 |
| FOXP3 | 0.4198 | 0 |
| RPLP1 | 0.4049 | 0 |
| LGALS3 | 0.4027 | 0 |
| RPS18 | 0.4008 | 0 |
# ── Ensure milestone_factor exists ────────────────────────────────────────
if (!"milestone_factor" %in% colnames(cd4_ref@meta.data)) {
cd4_ref@meta.data$milestone_factor <- factor(
cd4_ref@meta.data$milestone, levels = milestone_order
)
}
# ── Filter technical genes and take top n ─────────────────────────────────
n_keep <- 100
clean_traj_genes <- sig_traj_genes %>%
filter(!gene %in% exclude_genes) %>% # use gene column not rownames
slice_head(n = n_keep) %>%
pull(gene) # extract as character vector
cat(sprintf("Clean trajectory genes: %d (removed %d technical)\n",
length(clean_traj_genes),
nrow(sig_traj_genes) - length(clean_traj_genes)))
Clean trajectory genes: 100 (removed 1751 technical)
cat("First 10:", paste(head(clean_traj_genes, 10), collapse=", "), "\n")
First 10: CCL5, FOXP3, LGALS3, GZMK, ANXA2, S100A4, TPT1, ITGB1, AHNAK, TMSB4X
# ── Confirm genes exist in object ─────────────────────────────────────────
clean_traj_genes <- intersect(clean_traj_genes, rownames(cd4_ref))
cat(sprintf("Genes found in cd4_ref: %d\n", length(clean_traj_genes)))
Genes found in cd4_ref: 100
# ── DotPlot ───────────────────────────────────────────────────────────────
DefaultAssay(cd4_ref) <- "RNA"
Idents(cd4_ref) <- "milestone_factor"
p_dot <- DotPlot(
cd4_ref,
features = clean_traj_genes,
cols = c("lightgrey", "#d62728"),
dot.scale = 6,
scale = TRUE
) +
RotatedAxis() +
coord_flip() +
ggtitle(sprintf("Top %d Monocle3 Trajectory Genes — Milestones M00–M07", n_keep)) +
theme(axis.text.x = element_text(size = 8, face = "bold"),
axis.text.y = element_text(size = 7),
plot.title = element_text(size = 13, face = "bold"))
print(p_dot)
Key question: Do the two methods agree on cell ordering?
compare_df <- data.frame(
cell = colnames(cd4_ref),
state = factor(cd4_ref@meta.data[[STATE_COL]], levels=STATE_ORDER),
mst_pt = cd4_ref@meta.data$mst_pseudotime_norm,
monocle3_pt = cd4_ref@meta.data$monocle3_pseudotime_norm,
milestone = cd4_ref@meta.data$milestone
) %>% filter(!is.na(mst_pt), !is.na(monocle3_pt), state %in% STATE_ORDER)
overall_cor <- cor(compare_df$mst_pt, compare_df$monocle3_pt,
method = "spearman", use = "complete.obs")
per_state_cor <- compare_df %>%
group_by(state) %>%
summarise(
n = n(),
spearman = round(cor(mst_pt, monocle3_pt, method="spearman"), 3),
mean_diff = round(mean(mst_pt - monocle3_pt), 1),
sd_diff = round(sd(mst_pt - monocle3_pt), 1),
.groups = "drop"
)
p_scatter <- ggplot(
compare_df[sample(nrow(compare_df), min(5000,nrow(compare_df))),],
aes(x=mst_pt, y=monocle3_pt, colour=state)
) +
geom_point(size=.6, alpha=.5) +
geom_abline(slope=1, intercept=0, linetype="dashed", colour="grey40", linewidth=.8) +
geom_smooth(method="lm", se=FALSE, colour="black", linewidth=.8) +
scale_colour_manual(values=STATE_COLORS, name="State") +
annotate("text", x=5, y=92,
label=sprintf("Spearman ρ = %.3f", overall_cor),
size=4.5, fontface="bold", hjust=0) +
theme_classic() +
labs(x="Custom MST pseudotime (0–100)", y="Monocle3 pseudotime (0–100)",
title="Pseudotime correlation: Custom MST vs Monocle3",
subtitle="Dashed line = perfect agreement | Solid line = linear fit") +
theme(plot.title=element_text(size=13,face="bold"))
p_density <- ggplot(
compare_df %>%
pivot_longer(c(mst_pt, monocle3_pt), names_to="method", values_to="pseudotime") %>%
mutate(method = recode(method, mst_pt="Custom MST", monocle3_pt="Monocle3")),
aes(x=pseudotime, colour=method, fill=method)
) +
geom_density(alpha=.35) +
scale_colour_manual(values=METHOD_COLORS, name="Method") +
scale_fill_manual(values=METHOD_COLORS, name="Method") +
facet_wrap(~state, ncol=3, scales="free_y") +
theme_classic() +
labs(x="Pseudotime (0–100)", y="Density",
title="Pseudotime distribution per state: method comparison") +
theme(plot.title=element_text(size=13,face="bold"),
strip.text=element_text(face="bold"))
print(p_scatter | p_density)
cat(sprintf("\nOverall Spearman ρ = %.3f\n\n", overall_cor))
Overall Spearman ρ = 0.778
kable(per_state_cor,
caption = "Per-state pseudotime correlation (Spearman)",
col.names = c("State","N cells","Spearman ρ","Mean diff","SD diff")) %>%
kable_styling(bootstrap_options=c("striped","hover"), full_width=FALSE)
| State | N cells | Spearman ρ | Mean diff | SD diff |
|---|---|---|---|---|
| CD4 Naive | 2037 | -0.078 | -10.0 | 10.4 |
| CD4 TCM | 9067 | 0.781 | -8.4 | 19.0 |
| CD4 TEM | 145 | 0.283 | -15.1 | 14.9 |
| CD4 Temra/CTL | 10 | 0.399 | -3.7 | 11.1 |
| Treg | 207 | 0.913 | 22.7 | 17.8 |
umap_compare <- umap_df
umap_compare$mst_pt <- cd4_ref@meta.data$mst_pseudotime_norm
umap_compare$monocle3_pt <- cd4_ref@meta.data$monocle3_pseudotime_norm
pt_gradient <- scale_colour_gradientn(
colours=c("#0D0887","#6A00A8","#B12A90","#E16462","#FCA636","#F0F921"),
name="Pseudotime\n(0–100)", limits=c(0,100)
)
p_side_mst <- ggplot(umap_compare[sample(nrow(umap_compare)),],
aes(x=UMAP_1,y=UMAP_2,colour=mst_pt)) +
geom_point(size=.35,alpha=.7) +
geom_segment(data=mst_edge_df, aes(x=x1,y=y1,xend=x2,yend=y2),
colour="black",linewidth=.7,alpha=.6,inherit.aes=FALSE) +
pt_gradient + theme_classic() +
labs(x="UMAP-1",y="UMAP-2",title="Custom MST") +
theme(plot.title=element_text(size=13,face="bold",colour=METHOD_COLORS["Custom MST"]))
p_side_m3 <- ggplot(umap_compare[sample(nrow(umap_compare)),],
aes(x=UMAP_1,y=UMAP_2,colour=monocle3_pt)) +
geom_point(size=.35,alpha=.7) +
geom_segment(data=m3_edge_df, aes(x=x1,y=y1,xend=x2,yend=y2),
colour="black",linewidth=.6,alpha=.6,inherit.aes=FALSE) +
pt_gradient + theme_classic() +
labs(x="UMAP-1",y="UMAP-2",title="Monocle3") +
theme(plot.title=element_text(size=13,face="bold",colour=METHOD_COLORS["Monocle3"]))
print(p_side_mst | p_side_m3)
compare_df$abs_diff <- abs(compare_df$mst_pt - compare_df$monocle3_pt)
threshold <- quantile(compare_df$abs_diff, 0.90, na.rm=TRUE)
discordant <- compare_df %>% filter(abs_diff > threshold) %>% arrange(desc(abs_diff))
cat(sprintf("Top 10%% most discordant cells (|diff| > %.1f): %d cells\n",
threshold, nrow(discordant)))
Top 10% most discordant cells (|diff| > 31.5): 1147 cells
umap_disc <- umap_df
umap_disc$discordant <- rownames(umap_disc) %in% discordant$cell
umap_disc$abs_diff <- compare_df$abs_diff[match(rownames(umap_disc), compare_df$cell)]
p_discordant <- ggplot(umap_disc[sample(nrow(umap_disc)),], aes(x=UMAP_1,y=UMAP_2)) +
geom_point(data=~filter(., !discordant), colour="grey85", size=.3, alpha=.5) +
geom_point(data=~filter(., discordant), aes(colour=abs_diff), size=.8, alpha=.85) +
scale_colour_gradient(low="#FCA636", high="#C00000", name="|MST − M3|") +
theme_classic() +
labs(x="UMAP-1",y="UMAP-2",
title="Discordant cells (top 10% disagreement)",
subtitle="Boundary/transition cells — biologically expected") +
theme(plot.title=element_text(size=13,face="bold"))
disc_states <- discordant %>% count(state) %>% mutate(pct=round(100*n/sum(n),1))
p_disc_bar <- ggplot(disc_states, aes(x=reorder(state,-n), y=pct, fill=state)) +
geom_col(width=.7) +
geom_text(aes(label=sprintf("%.0f%%",pct)), vjust=-.3, size=3.5) +
scale_fill_manual(values=STATE_COLORS, guide="none") +
theme_classic() +
labs(x="State", y="% of discordant cells", title="State composition of discordant cells") +
theme(plot.title=element_text(size=12,face="bold"))
print(p_discordant | p_disc_bar)
if (overall_cor > 0.9) {
rec <- "HIGH agreement (ρ > 0.9): either method valid. Use **Custom MST** for milestone labels; **Monocle3** for graph_test() trajectory genes."
} else if (overall_cor > 0.7) {
rec <- "MODERATE agreement (ρ = 0.7–0.9): similar ordering, differ at boundaries. Use both as complementary evidence."
} else {
rec <- "LOW agreement (ρ < 0.7): significant discordance. Check UMAP topology and milestone assignments."
}
DefaultAssay(cd4_ref) <- "RNA"
cd4_ref@meta.data$milestone_factor <- factor(
cd4_ref@meta.data$milestone, levels = milestone_order
)
Idents(cd4_ref) <- "milestone_factor"
panel_genes <- c(
# Naive
"CCR7","LEF1","TCF7","SELL","KLF2","SATB1","IL7R","CD27","MAL",
# TCM
"S100A4","AQP3","LTB","ITGB1","CD44","CCR4",
# Shared activation
"CD69","LMNA",
# TEM — effector memory and Th1 skewing
"GZMK","CCL5","EOMES","CXCR3","HOPX","CXCR4","IFNG","TNF","CCR5",
# Temra/CTL — terminal cytotoxic effector
"GZMB","GZMA","PRF1","NKG7","CX3CR1","FGFBP2","GNLY","TBX21","ZEB2",
"FCGR3A","KLRG1","NR4A2",
# Treg — core identity
"FOXP3","IL2RA","IKZF2","IKZF4","TIGIT","RTKN2","TNFRSF18","CTLA4",
# Co-inhibitory receptors — shared between effector Treg and exhaustion
# Expression here reflects Treg suppressive machinery, NOT dysfunction
# Critical for Sézary interpretation: Treg-like vs exhausted identity
"PDCD1","HAVCR2","LAG3"
)
panel_genes <- unique(intersect(panel_genes, rownames(cd4_ref)))
p_dotplot_ms <- DotPlot(
cd4_ref,
features = panel_genes,
group.by = "milestone_factor",
cols = c("lightgrey","#d62728"),
dot.scale = 4, scale = TRUE, col.min = -1.5, col.max = 2.5
) +
RotatedAxis() + coord_flip() +
theme(axis.text.x = element_text(size=8, face="bold"),
axis.text.y = element_text(size=7),
plot.title = element_text(size=13,face="bold"),
legend.position = "bottom") +
ggtitle("Marker gene expression per milestone")
print(p_dotplot_ms)
options(future.globals.maxSize = 2 * 1024^3)
DefaultAssay(cd4_ref) <- "RNA"
DefaultAssay(sezary_obj) <- "RNA"
cd4_ref <- FindVariableFeatures(cd4_ref, nfeatures=3000, verbose=FALSE)
cat("Finding transfer anchors...\n")
anchors <- FindTransferAnchors(
reference = cd4_ref,
query = sezary_obj,
normalization.method = "LogNormalize",
reference.reduction = "pca",
dims = 1:30,
reduction = "pcaproject",
verbose = FALSE
)
cat("Running MapQuery...\n")
sezary_obj <- MapQuery(
anchorset = anchors,
query = sezary_obj,
reference = cd4_ref,
refdata = list(
predicted_state = STATE_COL,
predicted_milestone = "milestone"
),
reference.reduction = "pca",
reduction.model = "umap",
verbose = FALSE
)
cat("\nPredicted state distribution:\n")
print(table(sezary_obj$predicted.predicted_state))
sez_umap_coords <- as.matrix(Embeddings(sezary_obj, "ref.umap"))
colnames(sez_umap_coords) <- c("UMAP_1","UMAP_2")
cat("Projecting Sézary cells onto MST...\n")
sez_mst <- project_onto_mst(sez_umap_coords, centroid_mat, mst_graph, g_dists_vec)
ref_umap_mat <- Embeddings(cd4_ref, UMAP_NAME)
ref_m3_pt <- cd4_ref@meta.data$monocle3_pseudotime_norm
nn_result <- nn2(data=ref_umap_mat, query=sez_umap_coords, k=15)
inv_dist <- 1 / (nn_result$nn.dists + 1e-6)
weights <- inv_dist / rowSums(inv_dist)
meta_sez <- sezary_obj@meta.data
meta_sez$mst_pseudotime <- pmax(0, pmin(100,
100 * (sez_mst$pseudotime - mst_pt_range[1]) /
(mst_pt_range[2] - mst_pt_range[1])
))
meta_sez$nearest_milestone_mst <- sez_mst$nearest_ms
meta_sez$monocle3_pseudotime <- rowSums(
weights * matrix(ref_m3_pt[nn_result$nn.idx], nrow=nrow(nn_result$nn.idx))
)
sezary_obj@meta.data <- meta_sez
cat(sprintf("MST pseudotime: %.1f – %.1f\n",
range(sezary_obj@meta.data$mst_pseudotime, na.rm=TRUE)))
cat(sprintf("Monocle3 pseudotime: %.1f – %.1f\n",
range(sezary_obj@meta.data$monocle3_pseudotime, na.rm=TRUE)))
ref_bg <- data.frame(
UMAP_1 = Embeddings(cd4_ref, UMAP_NAME)[,1],
UMAP_2 = Embeddings(cd4_ref, UMAP_NAME)[,2]
)
sez_plot_df <- data.frame(
UMAP_1 = sez_umap_coords[,"UMAP_1"],
UMAP_2 = sez_umap_coords[,"UMAP_2"],
predicted_state = sezary_obj@meta.data$predicted.predicted_state,
pred_score = sezary_obj@meta.data$predicted.predicted_state.score,
mst_pt = sezary_obj@meta.data$mst_pseudotime,
m3_pt = sezary_obj@meta.data$monocle3_pseudotime,
milestone_ref = sezary_obj@meta.data$nearest_milestone_mst
)
p_sez_mst_state <- ggplot() +
geom_point(data=ref_bg[sample(nrow(ref_bg)),],
aes(x=UMAP_1,y=UMAP_2), colour="grey85", size=.3, alpha=.4) +
geom_segment(data=mst_edge_df, aes(x=x1,y=y1,xend=x2,yend=y2),
colour="grey30", linewidth=.8, alpha=.7) +
geom_point(data=sez_plot_df,
aes(x=UMAP_1,y=UMAP_2,colour=predicted_state), size=1.8, alpha=.85) +
geom_text_repel(data=milestone_centroids,
aes(x=UMAP_1,y=UMAP_2,label=milestone),
size=2.5, colour="grey20", fontface="bold",
max.overlaps=20, segment.size=.3) +
scale_colour_manual(values=STATE_COLORS, name="Predicted state") +
theme_classic() +
labs(x="UMAP-1",y="UMAP-2",
title="Sézary cells — Custom MST projection (predicted state)",
subtitle="Grey = normal CD4 reference | Coloured = Sézary | Lines = MST") +
theme(plot.title=element_text(size=13,face="bold"))
p_sez_mst_pt <- ggplot() +
geom_point(data=ref_bg[sample(nrow(ref_bg)),],
aes(x=UMAP_1,y=UMAP_2), colour="grey85", size=.3, alpha=.4) +
geom_segment(data=mst_edge_df, aes(x=x1,y=y1,xend=x2,yend=y2),
colour="grey30", linewidth=.7, alpha=.6) +
geom_point(data=sez_plot_df,
aes(x=UMAP_1,y=UMAP_2,colour=mst_pt), size=1.8, alpha=.9) +
scale_colour_gradientn(
colours=c("#0D0887","#6A00A8","#B12A90","#E16462","#FCA636","#F0F921"),
name="MST\npseudotime", limits=c(0,100)) +
theme_classic() +
labs(x="UMAP-1",y="UMAP-2",title="Sézary — MST projected pseudotime") +
theme(plot.title=element_text(size=13,face="bold"))
print(p_sez_mst_state / p_sez_mst_pt)
p_sez_m3_state <- ggplot() +
geom_point(data=ref_bg[sample(nrow(ref_bg)),],
aes(x=UMAP_1,y=UMAP_2), colour="grey85", size=.3, alpha=.4) +
geom_segment(data=m3_edge_df, aes(x=x1,y=y1,xend=x2,yend=y2),
colour="grey30", linewidth=.6, alpha=.7) +
geom_point(data=sez_plot_df,
aes(x=UMAP_1,y=UMAP_2,colour=predicted_state), size=1.8, alpha=.85) +
scale_colour_manual(values=STATE_COLORS, name="Predicted state") +
theme_classic() +
labs(x="UMAP-1",y="UMAP-2",
title="Sézary cells — Monocle3 projection (predicted state)") +
theme(plot.title=element_text(size=13,face="bold"))
p_sez_m3_pt <- ggplot() +
geom_point(data=ref_bg[sample(nrow(ref_bg)),],
aes(x=UMAP_1,y=UMAP_2), colour="grey85", size=.3, alpha=.4) +
geom_segment(data=m3_edge_df, aes(x=x1,y=y1,xend=x2,yend=y2),
colour="grey30", linewidth=.5, alpha=.6) +
geom_point(data=sez_plot_df,
aes(x=UMAP_1,y=UMAP_2,colour=m3_pt), size=1.8, alpha=.9) +
scale_colour_gradientn(
colours=c("#0D0887","#6A00A8","#B12A90","#E16462","#FCA636","#F0F921"),
name="Monocle3\npseudotime", limits=c(0,100)) +
theme_classic() +
labs(x="UMAP-1",y="UMAP-2",title="Sézary — Monocle3 projected pseudotime") +
theme(plot.title=element_text(size=13,face="bold"))
print(p_sez_m3_state / p_sez_m3_pt)
sez_cor <- cor(sez_plot_df$mst_pt, sez_plot_df$m3_pt,
method="spearman", use="complete.obs")
p_sez_scatter <- ggplot(sez_plot_df, aes(x=mst_pt, y=m3_pt, colour=predicted_state)) +
geom_point(size=1.2, alpha=.7) +
geom_abline(slope=1, intercept=0, linetype="dashed", colour="grey40") +
geom_smooth(method="lm", se=FALSE, colour="black", linewidth=.8) +
scale_colour_manual(values=STATE_COLORS, name="Predicted state") +
annotate("text", x=5, y=90, label=sprintf("Spearman ρ = %.3f", sez_cor),
size=4.5, fontface="bold", hjust=0) +
theme_classic() +
labs(x="Custom MST pseudotime", y="Monocle3 pseudotime",
title="Sézary cells: pseudotime method agreement") +
theme(plot.title=element_text(size=12,face="bold"))
p_sez_violin <- ggplot(
sez_plot_df %>%
pivot_longer(c(mst_pt,m3_pt), names_to="method", values_to="pt") %>%
mutate(method=recode(method, mst_pt="Custom MST", m3_pt="Monocle3")),
aes(x=predicted_state, y=pt, fill=method)
) +
geom_violin(scale="width", trim=FALSE, alpha=.7, position=position_dodge(.8)) +
geom_boxplot(width=.08, fill="white", outlier.size=.3, position=position_dodge(.8)) +
scale_fill_manual(values=METHOD_COLORS, name="Method") +
theme_classic() +
labs(x="Predicted state", y="Pseudotime (0–100)",
title="Sézary pseudotime per state: method comparison") +
theme(plot.title=element_text(size=12,face="bold"),
axis.text.x=element_text(angle=30,hjust=1))
print(p_sez_scatter | p_sez_violin)
sez_summary <- sez_plot_df %>%
group_by(predicted_state) %>%
summarise(
n_cells = n(),
pct = round(100*n()/nrow(sez_plot_df), 1),
mean_pred_score = round(mean(pred_score), 3),
mst_mean_pt = round(mean(mst_pt, na.rm=TRUE), 1),
mst_sd_pt = round(sd(mst_pt, na.rm=TRUE), 1),
m3_mean_pt = round(mean(m3_pt, na.rm=TRUE), 1),
m3_sd_pt = round(sd(m3_pt, na.rm=TRUE), 1),
.groups = "drop"
) %>% arrange(mst_mean_pt)
kable(sez_summary,
col.names = c("State","N","% of Sézary","Pred. score",
"MST mean pt","MST SD","M3 mean pt","M3 SD"),
caption = "Sézary cell trajectory summary — both methods") %>%
kable_styling(bootstrap_options=c("striped","hover"), full_width=FALSE) %>%
column_spec(5:6, color="white", background=METHOD_COLORS["Custom MST"]) %>%
column_spec(7:8, color="white", background=METHOD_COLORS["Monocle3"])
ms_dist <- sez_plot_df %>%
count(milestone_ref) %>%
left_join(milestone_centroids[,c("milestone","state","order_pos")],
by=c("milestone_ref"="milestone")) %>%
mutate(pct=round(100*n/sum(n),1),
milestone_ref=factor(milestone_ref, levels=milestone_order)) %>%
arrange(order_pos)
p_ms_bar <- ggplot(ms_dist, aes(x=milestone_ref, y=pct, fill=state)) +
geom_col(width=.7) +
geom_text(aes(label=sprintf("%.0f%%",pct)), vjust=-.3, size=3) +
scale_fill_manual(values=STATE_COLORS, name="State") +
scale_x_discrete(limits=milestone_order) +
theme_classic() +
labs(x="Nearest reference milestone", y="% Sézary cells",
title="Sézary cell distribution across reference milestones") +
theme(axis.text.x=element_text(angle=45,hjust=1),
plot.title=element_text(size=12,face="bold"))
print(p_ms_bar)
saveRDS(sezary_obj, "sezary_projected_dual.rds")
saveRDS(mst_graph, "mst_graph.rds")
saveRDS(milestone_centroids, "milestone_centroids.rds")
write.csv(milestone_centroids, "milestone_centroids.csv", row.names=FALSE)
write.csv(per_state_cor, "method_comparison_per_state.csv", row.names=FALSE)
write.csv(sez_summary, "sezary_trajectory_summary.csv", row.names=FALSE)
write.csv(sig_traj_genes, "monocle3_trajectory_genes.csv", row.names=FALSE)
write.csv(ms_dist, "sezary_milestone_distribution.csv",row.names=FALSE)
ggsave("fig_milestones_linear.pdf", p_mst_linear, width=14, height=4)
ggsave("fig_mst_umap.pdf", p_mst_umap_ms, width=10, height=8)
ggsave("fig_mst_pseudotime.pdf", p_mst_pseudo, width=10, height=8)
ggsave("fig_m3_pseudotime.pdf", p_m3_pseudo, width=10, height=8)
ggsave("fig_method_comparison.pdf", p_scatter, width=10, height=6)
ggsave("fig_sezary_mst.pdf", p_sez_mst_state, width=12, height=8)
ggsave("fig_sezary_m3.pdf", p_sez_m3_state, width=12, height=8)
ggsave("fig_dotplot_milestones.pdf", p_dotplot_ms, width=9, height=18)
ggsave("fig_milestone_bar.pdf", p_ms_bar, width=12, height=5)
cat("✓ All outputs saved\n")
sessionInfo()