#!/usr/bin/env Rscript
library(edgeR)
library(RUVSeq)

outdir <- "/BRC/yan/heart/analysis/sn_ATAC_analysis/results_k6/"
infile <- paste0(outdir, "count_matrix_snPeak.txt")

##########Read the Data#####
cts <- read.table(infile, header = TRUE, sep = "\t", check.names = FALSE)
cts$Peak <- paste0(cts$chr, ":", cts$start, "-", cts$end)
rownames(cts) <- cts$Peak
cts <- cts[, !colnames(cts) %in% c("chr", "start", "end", "Peak")]

########## 1: coldata
samples <- colnames(cts)
group <- as.factor(c(rep("female", 12), rep("male", 13)))
coldata <- data.frame(sampleName = samples,
                      group = group)
rownames(coldata) <- coldata[, 1]
coldata <- coldata[, -1, drop = F]

##########Creating a DGEList object##########
dgList1 <- DGEList(counts = cts, group = group)
cpm1 <- cpm(cts)

# Step 4: Filter lowly expressed genes
keep <- rowSums(cpm1 > 1) >= min(table(group))
summary(keep)
dgList1 <- dgList1[keep, ]
cpm1 <- cpm1[keep, ]

# Step 5: Normalize the data
dgList1 <- calcNormFactors(dgList1)
jpeg(paste0(outdir, "PCA_original.jpeg"), width = 8, height = 6, units = "in", res = 300)
colors <- c("red", "blue")   # female = red, male = blue
pch_vec <- c(rep(16, 12), rep(17, 13))
plotMDS(dgList1, col = colors[group], pch = pch_vec)
legend("top", legend = c("female", "male"), pch = c(16, 17), col = c("red", "blue"))
dev.off()

# Step 6: RUV
coldata <- as.data.frame(group)
row.names(coldata) <- colnames(cts)
set <- newSeqExpressionSet(as.matrix(dgList1$counts), phenoData = coldata)
x <- factor(coldata$group)
design <- model.matrix(~ x, data = pData(set))
y <- DGEList(counts = counts(set), group = x)
y <- calcNormFactors(y, method = "upperquartile")
y <- estimateGLMCommonDisp(y, design)
y <- estimateGLMTagwiseDisp(y, design)
fit <- glmFit(y, design)
res <- residuals(fit, type = "deviance")
seqUQ <- betweenLaneNormalization(set, which = "upper")
ruv6 <- RUVr(seqUQ, rownames(set), k = 6, res)
dgList_ruv6 <- DGEList(counts = normCounts(ruv6), genes = rownames(normCounts(ruv6)), group = x)

jpeg(paste0(outdir, "PCA_RUV6.jpeg"), width = 8, height = 6, units = "in", res = 300)
plotMDS(dgList_ruv6, col = colors[group], pch = pch_vec)
legend("bottom", legend = c("female", "male"), pch = c(16, 17), col = c("red", "blue"))
dev.off()

# Step 6.1: DAR
design.mat <- model.matrix(~ 0 + dgList_ruv6$samples$group)
colnames(design.mat) <- levels(dgList_ruv6$samples$group)
dgList_ruv6 <- estimateCommonDisp(dgList_ruv6, design = design.mat)
dgList_ruv6 <- estimateTagwiseDisp(dgList_ruv6)
et <- exactTest(dgList_ruv6, pair = c("male", "female"))   # logFC > 0 means female > male
edgeR_result <- topTags(et, nrow(et))
edgeR_resultv1 <- edgeR_result$table

edgeR_result_f <- edgeR_resultv1[edgeR_resultv1$FDR < 0.001 & abs(edgeR_resultv1$logFC) > 0.585, ]

dim(edgeR_result)
dim(edgeR_result_f)

write.csv(edgeR_result,   paste0(outdir, "DAR_heart_femaleVSmale_all.csv"))
write.csv(edgeR_result_f, paste0(outdir, "Sig_DAR_heart_femaleVSmale_FDR001_FC0585.csv"))

UP   <- subset(edgeR_result_f, edgeR_result_f$logFC >  0.585)   # female > male
Down <- subset(edgeR_result_f, edgeR_result_f$logFC < -0.585)   # female < male
write.csv(UP,   paste0(outdir, "Sig_DAR_heart_femaleVSmale_FDR001_FC0585_UP.csv"))
write.csv(Down, paste0(outdir, "Sig_DAR_heart_femaleVSmale_FDR001_FC0585_Down.csv"))

cpm_ruv6 <- cpm(dgList_ruv6)
write.csv(cpm_ruv6, paste0(outdir, "Normalized_cpm_RUV6.csv"))

cat("MORE (female > male):", nrow(UP), "\n")
cat("LESS (female < male):", nrow(Down), "\n")
cat("[Done]\n")
