view falco/lib/R/plotsPng.R @ 59:73eda23fb8fd draft

Uploaded
author stef
date Wed, 25 Feb 2015 08:50:56 -0500
parents
children
line wrap: on
line source

#!/usr/bin/Rscript 

args <- commandArgs(T)

print(args[1]) # qc.ann.qual.txt
print(args[2]) # qc2.ann.qtxt
print(args[3]) # qc.targets.txt
print(args[4]) # res.txt (unfiltered)
print(args[5]) # clinvar
print(args[6]) # lociFilt
print(args[7]) # basename
options(warn=1)
print(paste("Reading", args[1], sep=" "));
read.delim(args[1], header=T, stringsAsFactors=F) -> d
print(paste("Reading", args[2], sep=" "));
read.delim(args[2], header=T, stringsAsFactors=F) -> d2
print(paste("Reading", args[3], sep=" "));
read.delim(args[3], header=T, stringsAsFactors=F) -> qc
print(paste("Reading", args[4], sep=" "));
read.delim(args[4], header=T, stringsAsFactors=F, row.names=NULL) -> res
print(paste("Reading", args[5], sep=" "));
## clinvar is a VCF with "##" header lines to skip
headerLineCount <- length( grep('^##', readLines(args[5])) )
read.delim(args[5], header=T, stringsAsFactors=F, skip=headerLineCount) -> dclin
print(paste("Reading", args[6], sep=" "));
read.delim(args[6], header=F, stringsAsFactors=F) -> lociFilt
base <- args[7]

# Error rate per cycle
# VAF distribution  
# varDepth distribution ?
# Print coverage plots per amplicon

tmpCP <- paste(d$X.chr, d$pos, sep=":")
tmpClin <- paste(paste("chr", dclin[,1], sep=""), dclin[,2], sep=":")
tmpSnp <- paste(paste("chr", lociFilt[,1], sep=""), lociFilt[,2], sep=":")

inClin <- tmpCP %in% tmpClin 

inSnp <- tmpCP %in% tmpSnp

dir.create(base)
setwd(base)
#unique(unlist(strsplit(d$V3, "\\|"))) -> targets
targets <- qc[,1]
if (1) { 
	print("Plotting variant heatmap")
	# Including off targets increases the amplicon length set at median amplicon length + 10%.
	median(qc$end - qc$start) -> maxAmpLn
	maxAmpLn <- ceiling(1.2 * maxAmpLn)
	print(maxAmpLn)
	ampHeatF <- matrix(ncol=maxAmpLn, nrow=nrow(qc))
	ampHeatR <- matrix(ncol=maxAmpLn, nrow=nrow(qc))
	#dPos <- paste(d$chr, d$pos, sep=":")
	#errPos <- paste(dclin$chr, dclin$pos, sep=":")
	#dPosClin <- dPos %in% errPos

	dPosClin <- !inClin & !inSnp 

	for (i in 1:nrow(qc)) {
		d$pos %in% qc$start[i]:qc$end[i] -> sel
		poss <- d$pos[sel & !dPosClin] - qc$start[i] + 1
		poss <- poss[poss <= maxAmpLn]
		ampHeatF[i, poss] <- d$nVar[sel & !dPosClin] + d$nN[sel & !dPosClin]
		ampHeatR[i, poss] <- rev(d$nVar[sel & !dPosClin] + d$nN[sel & !dPosClin])
	}
	png(paste(base,"heat","png", sep="."), width=960, height=480)
	par(mar=c(4,4,4,2) + .1)

	ampHeatF[is.na(ampHeatF)] <- 0
	ampHeatR[is.na(ampHeatR)] <- 0
	layout(matrix(1:2, nrow=2))
	maxN <- quantile(ampHeatF, .99)
	#heatmap(ampHeat)
	boxplot(ampHeatF, ylim=c(0, maxN), pch=20, cex=.4, main="Non reference counts R1")
	rect(150, 0, ncol(ampHeatF), maxN, col="#00000040")
	boxplot(ampHeatR, ylim=c(0, maxN), pch=20, cex=.4, main="Non reference counts R2")
	rect(150, 0, ncol(ampHeatR), maxN, col="#00000040")
	dev.off()

	#d[,7]/d[,4] * 100 -> d$pctREF
	#d[,8]/d[,4] * 100 -> d$pctVAR
	d$nRef/d$dp * 100 -> d$pctREF
	d$nVar/d$dp * 100 -> d$pctVAR
	d$vaf <- d$nVar / (d$nVar + d$nRef) * 100
	print("Plotting ref frequencies")
	png(paste(base,"raf","png", sep="."), width=480, height=480)
	dref <- density(d$pctREF[!dPosClin])
	#plot(dref, ylim=range(dref$y[dref$x < 80] ))
	hist(d$pctREF[!dPosClin], breaks=100, ylim=c(0, 30), col="#00000040", border=NA)
	dev.off()

	print("Plotting var frequencies")
	png(paste(base,"vaf","png", sep="."), width=480, height=480)
	dvar <- density(d$pctVAR[!dPosClin])
	#plot(dvar, ylim=range(dvar$y[dvar$x > 20] ))
	hist(d$pctVAR[!dPosClin], breaks=100, ylim=c(0, 30), col="#00000040", border=NA)
	dev.off()

	# Set vaf cutoff
	#q95 <- quantile(d$qScore, .95, na.rm=T)
	q95 <- 20
	vs95 <- sd(d$pctVAR[!dPosClin & d$qScore < q95], na.rm=T)
	v95 <- mean(d$pctVAR[!dPosClin & d$qScore < q95], na.rm=T) + vs95 * 3

	nCall <- sum((d$pctVAR > v95) & d$qScore > q95 & !inSnp, na.rm=T)
	print(nCall)
	print("Plotting vaf vs q")
	png(paste(base,"snv-q","png", sep="."), width=480, height=480)
	plot(d$qScore, d$pctVAR, pch=20, cex=.5, main=paste("q:", q95, "-", "v:", v95, "--", "s:", nCall, sep=" "))
	abline(h=c(1,5), v=c(20,13), lty=2)
	abline(v=q95, h=v95, lty=3, col=2)
	points(d$qScore[d$dp < 100], d$pctVAR[d$dp < 100], pch=20, cex=1.2, col=2)
	points(d$qScore[d$nVar < 10], d$pctVAR[d$nVar < 10], pch=20, cex=1, col=4)
	legend(30,80, c("pass", "dp < 100", "nVar < 10"), col=c(1,2,4), pch=20)
	dev.off()

	print("Plotting vaf vs q zoomed")
	png(paste(base,"snv-q-zoom","png", sep="."), width=480, height=480)
	plot(d$qScore, d$pctVAR, pch=20, cex=.5, xlim=c(0, 40),ylim=c(0,10))
	abline(h=c(1,5), v=c(20,13), lty=2)
	abline(v=q95, h=v95, lty=3, col=2)
	points(d$qScore[d$dp < 100], d$pctVAR[d$dp < 100], pch=20, cex=1.2, col=2)
	points(d$qScore[d$nVar < 10], d$pctVAR[d$nVar < 10], pch=20, cex=1, col=4)
	legend("topright", c("pass", "dp < 100", "nVar < 10"), col=c(1,2,4), pch=20)
	dev.off()

	print("Plotting ins vs q")
	d$vafI <- 0
	d$occI <- 0
	if (sum(d$ins != ".") > 0) {
		png(paste(base,"ins-q","png", sep="."), width=480, height=480)
		data.frame(matrix(unlist(strsplit(unlist(strsplit(as.character(d$ins[d$ins != "."]), "\\|")), ":")), ncol=2, byrow=T)) -> insDat
		colnames(insDat) <- c("seq", "occ")
		insDat$seq <- as.character(insDat$seq)
		insDat$occ <- as.numeric(as.vector(insDat$occ))
		nchar(insDat$seq) -> insDat$ln
		d$occI[d$ins != "."] <- insDat$occ
		d$vafI[d$ins != "."] <- insDat$occ / d$nRef[d$ins != "."]
		d$qScoreI[d$qScoreI > 1000] <- 1000
		plot(d$qScoreI, d$occI, pch=20, cex=1)
		abline(h=c(10), v=c(20,13), lty=2)
		# dp 500
		sel <- d$dp < 100
		points(d$qScoreI[sel], d$occI[sel], pch=20, cex=1.2, col=2)
		# nVar 10
		#sel <- d$occI < 10
		#points(d$qScoreI[sel], d$occI[sel], pch=20, cex=1, col=3)
		# vaf < 0.01
		sel <- d$vafI < 0.01
		points(d$qScoreI[sel], d$occI[sel], pch=20, cex=1, col=4)
		legend("topleft", c("pass", "dp < 100", "vaf < 0.01"), col=c(1,2,4), pch=20)
		dev.off()
	}

	print("Plotting del vs q")
	d$vafD <- 0
	d$occD <- 0
	if (sum(d$del != "." ) > 0) {
		png(paste(base,"del-q","png", sep="."), width=480, height=480)
		data.frame(matrix(unlist(strsplit(unlist(strsplit(as.character(d$del[d$del != "."]), "\\|")), ":")), ncol=2, byrow=T)) -> delDat
		colnames(delDat) <- c("seq", "occ")
		delDat$seq <- as.character(delDat$seq)
		delDat$occ <- as.numeric(as.vector(delDat$occ))
		nchar(delDat$seq) -> delDat$ln
		d$occD[d$del != "."] <- delDat$occ
		d$vafD[d$del != "."] <- d$occD[d$del != "."] / d$nRef[d$del != "."]
		d$qScoreD[d$qScoreD > 1000] <- 1000
		#hist(d$qScoreD, breaks=1000, ylim=c(0,100))
		#print(sum(d$qScoreD > 20))
		#Sys.sleep(1)
		plot(d$qScoreD, d$occD, pch=20, cex=1)
		abline(h=c(10), v=c(20,13), lty=2)
		# dp 500
		sel <- d$dp < 100
		points(d$qScoreD[sel], d$occD[sel], pch=20, cex=1.2, col=2)
		# nVar 10
		#sel <- d$occD < 10
		#points(d$qScoreD[sel], d$occD[sel], pch=20, cex=1, col=3)
		# vaf < 0.01
		sel <- d$vafD < 0.01
		points(d$qScoreD[sel], d$occD[sel], pch=20, cex=1, col=4)
		legend("topleft", c("pass", "dp < 100", "vaf < 0.01"), col=c(1,2,4), pch=20)
		dev.off()
	}

	sub("chr", "", qc$chr) -> qc$chrn
	ampOrd <- order(qc$chrn, qc$start)

	print("Plotting amplicon depths")
	png(paste(base,"amp-dp","png", sep="."), width=960, height=480)
	barplot(qc$depth[ampOrd])
	abline(h=100, lty=2)
	totRead <- sum(qc$depth, na.rm=T)
	legend("topright", paste("Total read count: ", totRead, sep=""))
	dev.off()
}

res$POS <- as.numeric(as.vector(res$POS))
d$pos <- as.numeric(as.vector(d$pos))

grepl("a", d$ntRef, ignore.case=T) -> Asel
grepl("c", d$ntRef, ignore.case=T) -> Csel
grepl("g", d$ntRef, ignore.case=T) -> Gsel
grepl("t", d$ntRef, ignore.case=T) -> Tsel
cntr <- 0

biasTable <- data.frame(matrix(NA, nrow=length(targets),  ncol=12), row.names=targets)
colnames(biasTable) <- c("AC", "AG", "AT", "CA", "CG", "CT", "GA", "GC", "GT", "TA", "TC", "TG")

for (i in targets) {
	sel <- grepl(i, d$amp)
	print(i)
	for (c in unique(d[sel,1])) {
		csel <- d[,1] == c
		print(c)
		reg <- paste(range(d[sel & csel,2]), collapse="-", sep="-")
		creg <- paste(c, reg, sep=":")
	
		qcsel <- qc[,1] == i	
		allsel <- sel & csel
		clinSel <- dclin$amp == i
		clinPos <- dclin$pos[clinSel]
#		inClin <- d$pos %in% clinPos	
	
	        #dels <- (d[,15] != ".") & allsel
	        #ins <- (d[,14] != ".") & sel	
	#	print(reg)
	#	print(creg)

		# Select annotations
		# calculate quantiles and plot them
#		quantile(d$pctVAR[sel & csel], c(.75,.90,.95,.99), na.rm=T) -> cutoffs
		tmp <- d[sel & csel,]
		#dels <- tmp[,15] != "."
		#ins <- tmp[,14] != "."
		dels <- allsel & d$del != "."
		ins <- allsel & d$ins != "."

		resTmp <- res[(res$POS >= min(tmp[,2])) & (res$POS <= max(tmp[,2])) & (res$X.CHROM == c),]
		#resSel <- res$TARGET == i	
		png(paste(base, i, "cov", "png", sep="."), width=960, height=480)
		
		xvec <- c(0, rep(1:(sum(allsel) - 1), each=2), sum(allsel))
		layout(matrix(1:2, ncol=1), heights=c(2,1))
		par(mar=c(0, 4, 4, 7) + .1, xaxt="n")
		print("Cov")	
		plot(NULL, type="n", main=i, xlab="Position", ylab="Depth", xlim=range(d$pos[allsel]), ylim=range(0, d$dp[allsel]))
		xvec <- d$pos[allsel]
		yvec <- d$dp[allsel]
	
		polygon(rep(c(xvec, max(xvec) + 1), each=2) - .5, c(0, rep(yvec, each=2), 0), col="#00000010", border=1)
		polygon(rep(c(xvec, max(xvec) + 1), each=2) - .5, c(0, rep(rowSums(d[allsel, 7:8]), each=2), 0), col="#00000010")
#		polygon(rep(c(xvec, max(xvec) + 1), each=2) - .5, c(0, rep(d$nVar[allsel], each=2), 0), col=2)
		varCol <- rep(2, sum(allsel))
		varCol[grepl("^a", d$ntVar[allsel], ignore.case=T)] <- "green"
		varCol[grepl("^c", d$ntVar[allsel], ignore.case=T)] <- "blue"
		varCol[grepl("^g", d$ntVar[allsel], ignore.case=T)] <- "black"
		varCol[grepl("^t", d$ntVar[allsel], ignore.case=T)] <- "red"
		rect(xvec-.5,d$nVar[allsel],xvec+.5,0, col=varCol)


		ampMax <- max(d[allsel,4])
		#abline(v=resTmp$POS, lty=2, col=2)
		#delMark <- list()
		#insMark <- list()
			
		for (idx in which(dels)) {
			matrix(unlist(strsplit(as.character(as.vector(d[idx,15])), "[:|]")), ncol=2, byrow=T) -> delDat
				nchar(delDat[,1]) -> lngts
				dpths <- as.numeric(delDat[,2])
				x1 <- d[idx,2] + .5 
				x2 <- x1 + lngts - 1
				if (x2 > max(d$pos[allsel])) {
					next
				}
		#	delMark[[length(delMark) + 1]] <- c(x1, x2)
			rect(x1, ampMax - dpths , x2, ampMax, col="#00000040")
		}

		for (idx in which(ins)) {
			matrix(unlist(strsplit(as.character(as.vector(d[idx,14])), "[:|]")), ncol=2, byrow=T) -> insDat
				nchar(insDat[,1]) -> lngts
				dpths <- as.numeric(insDat[,2])
				x1 <- d$pos[idx] + 1
		#		insMark[length(insMark) + 1] <- x1
				for (ii in 1:ncol(insDat)) {
					polygon(
							c(x1, x1 - (.5 * lngts[ii]), x1 + (.5 * lngts[ii])),
							c(ampMax, ampMax - dpths[ii], ampMax - dpths[ii]),
							, col="#00000040")
				}
		}
		par(xpd=NA)	
		legend(max(d$pos[allsel]) + sum(allsel) * 0.05, ampMax, legend=c("Filtered nt", "Ref nt", "Non-ref nt"), col=c("#00000040", "#00000080", "red"), pch=15)
		legend(max(d$pos[allsel]) + sum(allsel) * 0.05, 0, legend=c("A", "C", "G", "T"), col=c("green", "blue", "black", "red"), pch=15)
		par(xpd=F)	
		par(mar=c(5, 4, 0, 7) + .1, xaxt="s")
		plot(NULL, type="n", xlab="Position", ylab=NA, xlim=range(d$pos[allsel]), ylim=c(0,4.5), yaxt="n")
		axis(side=2, at=1:4, labels=c("ins", "del", "snv", "ref"), las=2)
		abline(h=1:4, col="#00000040")
		sres <- nchar(as.character(resTmp$REF)) == nchar(as.character(resTmp$ALT))
		dres <- nchar(resTmp$REF) > nchar(resTmp$ALT)
		ires <- nchar(resTmp$REF) < nchar(resTmp$ALT)
		
		resTmp$marks <- rep(3.4, nrow(resTmp))
		
		resTmp$cols <- rep("#00000040", nrow(resTmp))
		resTmp$cols[grepl("^a", resTmp$ALT, ignore.case=T) & sres] <- "green"
		resTmp$cols[grepl("^c", resTmp$ALT, ignore.case=T) & sres] <- "blue"
		resTmp$cols[grepl("^g", resTmp$ALT, ignore.case=T) & sres] <- "black"
		resTmp$cols[grepl("^t", resTmp$ALT, ignore.case=T) & sres] <- "red"

		#resTmp$cols[dres] <- 2
		#resTmp$cols[ires] <- 2
		resTmp$marks[dres] <- 2.4
		resTmp$marks[ires] <- 1.4
		resTmp$markP1 <- resTmp$POS -.5
		resTmp$markP2 <- resTmp$POS +.5
		resTmp$markP1[dres] <- resTmp$POS[dres] +.5
		resTmp$markP2[dres] <- resTmp$POS[dres] +.5 + nchar(resTmp$REF[dres]) - 1
		resTmp$markP1[ires] <- resTmp$POS[ires] +.5
		resTmp$markP2[ires] <- resTmp$POS[ires] +.5 + 1
		ntCol <- rep(1, sum(allsel))
		ntCol[grepl("a", d$ntRef[allsel], ignore.case=T)] <- "green"
		ntCol[grepl("c", d$ntRef[allsel], ignore.case=T)] <- "blue"
		ntCol[grepl("g", d$ntRef[allsel], ignore.case=T)] <- "black"
		ntCol[grepl("t", d$ntRef[allsel], ignore.case=T)] <- "red"
	
		rect(d$pos[allsel] -.5, 4.4, d$pos[allsel] +.5, 3.6, col=ntCol, border=0)
		rect(resTmp$markP1, resTmp$marks, resTmp$markP2, resTmp$marks - .8, col=resTmp$cols, border=0)	
		
		if(length(clinPos != 0)) {
			rect(clinPos - .5, 3.5, clinPos + .5, .5, border="black", lwd=2)
		}
		#lapply(delMark, function(x) { rect(x[1], 2, x[2], 1, col=2, border=NA)  })
		#lapply(insMark, function(x) { rect(x[1], 1, x[1] + 1, 0, col=3, border=NA)  })
		
		# Highlight clinically relevant loci	
		#for (i in which(dclin$amp == i)) {
		#	if (dclin$REF[i] == nchar
		#}
		
		dev.off()

		sansClin <- allsel & !inClin
		sansSnp <- allsel & !inSnp

		d$nA[sansClin & sansSnp & Asel] -> AA
		d$nC[sansClin & sansSnp & Asel] -> AC
		d$nG[sansClin & sansSnp & Asel] -> AG
		d$nT[sansClin & sansSnp & Asel] -> AT

		d$nA[sansClin & sansSnp & Csel] -> CA
		d$nC[sansClin & sansSnp & Csel] -> CC
		d$nG[sansClin & sansSnp & Csel] -> CG
		d$nT[sansClin & sansSnp & Csel] -> CT

		d$nA[sansClin & sansSnp & Gsel] -> GA
		d$nC[sansClin & sansSnp & Gsel] -> GC
		d$nG[sansClin & sansSnp & Gsel] -> GG
		d$nT[sansClin & sansSnp & Gsel] -> GT

		d$nA[sansClin & sansSnp & Tsel] -> TA
		d$nC[sansClin & sansSnp & Tsel] -> TC
		d$nG[sansClin & sansSnp & Tsel] -> TG
		d$nT[sansClin & sansSnp & Tsel] -> TT

		print("Bias")	
		png(paste(base, i, "bias", "png", sep="."), width=960, height=480)

		Acnt <- sum(sum(AA), sum(AC), sum(AG), sum(AT))
		Ccnt <- sum(sum(CA), sum(CC), sum(CG), sum(CT))
		Gcnt <- sum(sum(GA), sum(GC), sum(GG), sum(GT))
		Tcnt <- sum(sum(TA), sum(TC), sum(TG), sum(TT))

		NTsums <- c(
			sum(AC)/Acnt, sum(AG)/Acnt, sum(AT)/Acnt, 
			sum(CA)/Ccnt, sum(CG)/Ccnt, sum(CT)/Ccnt,
			sum(GA)/Gcnt, sum(GC)/Gcnt, sum(GT)/Gcnt,
			sum(TA)/Tcnt, sum(TC)/Tcnt, sum(TG)/Tcnt)
		NTsums[!is.finite(NTsums)] <- 0
		NTsums[is.nan(NTsums)] <- 0 
		NTsums[is.na(NTsums)] <- 0 
	
		barplot(NTsums, names.arg=c("AC", "AG", "AT", "CA", "CG", "CT", "GA", "GC", "GT", "TA", "TC", "TG"), main=i)
		dev.off()
		biasTable[rownames(biasTable) == i, ] <- NTsums

		print("Cov2")
		png(paste(base, i, "cov2", "png", sep="."), width=960, height=480)
		layout(matrix(1:2, ncol=1), heights=c(2,1))
		par(mar=c(0, 4, 4, 7) + .1, xaxt="n")
		

		dat <- d2[d2$amp == i,]
		rled <- rle(sort(dat$pos))	
		rds <- sort(unique(dat$X.read))
		lst <- c()
		for (ii in order(rled$lengths, decreasing=T)) 
		{

				rled$values[ii] -> pos
				dat$X.read[dat$pos == pos]
				lst <- c(lst, rds %in% dat$X.read[dat$pos == pos])

		}
		#xlim <- range(dat$pos)
		xlim=range(d$pos[allsel])
		ylim=range(0, d$dp[allsel])
		plot(NULL, xlim=xlim, ylim=ylim, main=i, ylab="Depth")
		rect(xlim[1] - 0.5, 0, xlim[2] + .5, ylim[2], col="#00000010")
		if (length(lst) > 0) {
		matrix(lst, nrow=length(rds), byrow=F) -> mat
		do.call( order, data.frame(mat) ) -> ord
		for (e in 1:length(ord)) {
				sel <- dat$X.read == rds[ord[e]]
				colvec <- rep(1, sum(sel))
				colvec[grepl("A$", dat$event[sel], ignore.case=T)] <- "green"
				colvec[grepl("C$", dat$event[sel], ignore.case=T)] <- "blue"
				colvec[grepl("G$", dat$event[sel], ignore.case=T)] <- "black"
				colvec[grepl("T$", dat$event[sel], ignore.case=T)] <- "red"
				#points(dat$pos[ sel ], rep(e, sum(sel)), col=colvec, pch=20, cex=.2)
				segments(dat$pos[ sel ] - .5, rep(e, sum(sel)), dat$pos[ sel ] + .5, rep(e, sum(sel)), col=colvec, pch=20, cex=.2)
		}
		}

		par(xpd=NA)	
		legend(max(d$pos[allsel]) + sum(allsel) * 0.05, ampMax, legend=c("Filtered nt", "Ref nt", "Non-ref nt"), col=c("#00000040", "#00000080", "red"), pch=15)
		legend(max(d$pos[allsel]) + sum(allsel) * 0.05, 0, legend=c("A", "C", "G", "T"), col=c("green", "blue", "black", "red"), pch=15)
		par(xpd=F)	
		par(mar=c(5, 4, 0, 7) + .1, xaxt="s")
		plot(NULL, type="n", xlab="Position", ylab=NA, xlim=range(d$pos[allsel]), ylim=c(0,4.5), yaxt="n")
		axis(side=2, at=1:4, labels=c("ins", "del", "snv", "ref"), las=2)
		abline(h=1:4, col="#00000040")
		sres <- nchar(as.character(resTmp$REF)) == nchar(as.character(resTmp$ALT))
		dres <- nchar(resTmp$REF) > nchar(resTmp$ALT)
		ires <- nchar(resTmp$REF) < nchar(resTmp$ALT)
		
		resTmp$marks <- rep(3.4, nrow(resTmp))
		
		resTmp$cols <- rep("#00000040", nrow(resTmp))
		resTmp$cols[grepl("^a", resTmp$ALT, ignore.case=T) & sres] <- "green"
		resTmp$cols[grepl("^c", resTmp$ALT, ignore.case=T) & sres] <- "blue"
		resTmp$cols[grepl("^g", resTmp$ALT, ignore.case=T) & sres] <- "black"
		resTmp$cols[grepl("^t", resTmp$ALT, ignore.case=T) & sres] <- "red"

		#resTmp$cols[dres] <- 2
		#resTmp$cols[ires] <- 2
		resTmp$marks[dres] <- 2.4
		resTmp$marks[ires] <- 1.4
		resTmp$markP1 <- resTmp$POS -.5
		resTmp$markP2 <- resTmp$POS +.5
		resTmp$markP1[dres] <- resTmp$POS[dres] +.5
		resTmp$markP2[dres] <- resTmp$POS[dres] +.5 + nchar(resTmp$REF[dres]) - 1
		resTmp$markP1[ires] <- resTmp$POS[ires] +.5
		resTmp$markP2[ires] <- resTmp$POS[ires] +.5 + 1
		ntCol <- rep(1, sum(allsel))
		ntCol[grepl("a", d$ntRef[allsel], ignore.case=T)] <- "green"
		ntCol[grepl("c", d$ntRef[allsel], ignore.case=T)] <- "blue"
		ntCol[grepl("g", d$ntRef[allsel], ignore.case=T)] <- "black"
		ntCol[grepl("t", d$ntRef[allsel], ignore.case=T)] <- "red"
	
		rect(d$pos[allsel] -.5, 4.4, d$pos[allsel] +.5, 3.6, col=ntCol, border=0)
		rect(resTmp$markP1, resTmp$marks, resTmp$markP2, resTmp$marks - .8, col=resTmp$cols, border=0)	
		
		if(length(clinPos != 0)) {
			rect(clinPos - .5, 3.5, clinPos + .5, .5, border="black", lwd=2)
		}


		dev.off()

#		png(paste(base, i, "vaf", "png", sep="."), width=960, height=480)
#		plot(d[sel & csel,2], d$vaf[sel & csel], type="l", ylim=c(0,100), main=paste(i, creg, cutoffs[3], sep=" "), xlab="position", ylab="%", col=2)
		#lines(d[sel & csel,2], d$pctVAR[sel & csel], type="l", col=2)
#		abline(h=100)
#		abline(h=c(1,5,10,50,90,95,99), lty=3, col=1)
#		abline(h=cutoffs[3], lty=4, col=2)
#		abline(v=c(limP[1], limP[1] + 150, limP[2] - 150, limP[2]),lty=4)
#		abline(v=c(qc[qcsel,8:9]), lty=5, col=2)
#		if (length(labs != 0)) {
#			text(resTmp$POS[resTmp$vaf > (cutoffs[3]/100)], 50, labels=resTmp$Amino_Acid_change[resTmp$vaf > (cutoffs[3]/100)])
#			abline(v=resTmp$POS[resTmp$vaf > (cutoffs[3]/100)], col="grey", lty=4)
#		}
#		dev.off()
	}
}

png(paste(base, "biasheat", "png", sep="."), width=960, height=960)
write.table(biasTable, paste(base, "bias", "tsv", sep="."), sep="\t")
biasTable[is.na(biasTable)] <- 0
heatmap(data.matrix(biasTable), Colv=NA, scale="r")
dev.off()
png(paste(base, "bias", "png", sep="."), width=960, height=480)
boxplot(data.matrix(biasTable), pch=20, cex=.5)
dev.off()
warnings()
#hist(d$pctVAR[d$pctVAR < 20], breaks=40, ylim=c(0,1000))
#hist(d$pctREF[d$pctREF > 80], breaks=40, ylim=c(0,1000))

#print(summary(d$pctVAR))