annotate RNAseqDataAnnotation/RNAseqDataAnnotation.R @ 20:14fedfb06e4b draft

Uploaded
author eganrol
date Thu, 20 Nov 2014 04:30:17 -0500
parents de3907c85546
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
de3907c85546 Uploaded
eganrol
parents:
diff changeset
1 #Author : keime / lornage
de3907c85546 Uploaded
eganrol
parents:
diff changeset
2 #Date : 2014/11
de3907c85546 Uploaded
eganrol
parents:
diff changeset
3
de3907c85546 Uploaded
eganrol
parents:
diff changeset
4
de3907c85546 Uploaded
eganrol
parents:
diff changeset
5 ########################################################################################################
de3907c85546 Uploaded
eganrol
parents:
diff changeset
6 #This function concatenates htseq-count result files, normalizes data and annotates data using Ensembl annotations
de3907c85546 Uploaded
eganrol
parents:
diff changeset
7
de3907c85546 Uploaded
eganrol
parents:
diff changeset
8 #arguments
de3907c85546 Uploaded
eganrol
parents:
diff changeset
9 #path2htseqfiles : path to htseq-count result files
de3907c85546 Uploaded
eganrol
parents:
diff changeset
10 #samplenamefile : path ta a tabulated text file with 2 columns : 1. File name 2. Sample names and an header
de3907c85546 Uploaded
eganrol
parents:
diff changeset
11 #Species : latin name of the species
de3907c85546 Uploaded
eganrol
parents:
diff changeset
12 #ensversion : version of Ensembl to use
de3907c85546 Uploaded
eganrol
parents:
diff changeset
13 #fileout : .txt file containing for each library ; gene id, raw read counts, normalized data as well as normalized data/gene length
de3907c85546 Uploaded
eganrol
parents:
diff changeset
14 #conversionensembleversion : tab-delimited file allowing conversion of the Ensembl version to the host
de3907c85546 Uploaded
eganrol
parents:
diff changeset
15 # (Column1 : Version Column2 : Host)
de3907c85546 Uploaded
eganrol
parents:
diff changeset
16 #conversionensemblname : tab-delimited file allowing conversion of species name to the name of the Ensembl dataset to use
de3907c85546 Uploaded
eganrol
parents:
diff changeset
17 # (Column1 : Specie Column2 : Dataset)
de3907c85546 Uploaded
eganrol
parents:
diff changeset
18
de3907c85546 Uploaded
eganrol
parents:
diff changeset
19 #output : a data.frame with the following columns :
de3907c85546 Uploaded
eganrol
parents:
diff changeset
20 #ensembl gene id
de3907c85546 Uploaded
eganrol
parents:
diff changeset
21 #raw read counts for each library (one column per library)
de3907c85546 Uploaded
eganrol
parents:
diff changeset
22 #normalized data for each library (one column per library)
de3907c85546 Uploaded
eganrol
parents:
diff changeset
23 #normalized data divided by gene length for each library (one column per library)
de3907c85546 Uploaded
eganrol
parents:
diff changeset
24 #Gene name
de3907c85546 Uploaded
eganrol
parents:
diff changeset
25 #Description
de3907c85546 Uploaded
eganrol
parents:
diff changeset
26
de3907c85546 Uploaded
eganrol
parents:
diff changeset
27 #require : biomaRt and DESeq2 Bioconductor packages / package plyr1.8.1
de3907c85546 Uploaded
eganrol
parents:
diff changeset
28
de3907c85546 Uploaded
eganrol
parents:
diff changeset
29 #Methods :
de3907c85546 Uploaded
eganrol
parents:
diff changeset
30 #Considering that the resulting files of HTSeq-count have 5 lines of comments in the end
de3907c85546 Uploaded
eganrol
parents:
diff changeset
31 #Normalization is performed using the method described in Genome Biology 2010;11(10):R106
de3907c85546 Uploaded
eganrol
parents:
diff changeset
32 #and implemented in the DESeq2 Bioconductor package
de3907c85546 Uploaded
eganrol
parents:
diff changeset
33 #Gene length correspond to the median of the size of all transcripts corresponding to this gene
de3907c85546 Uploaded
eganrol
parents:
diff changeset
34 #########################################################################################################
de3907c85546 Uploaded
eganrol
parents:
diff changeset
35
de3907c85546 Uploaded
eganrol
parents:
diff changeset
36
de3907c85546 Uploaded
eganrol
parents:
diff changeset
37
de3907c85546 Uploaded
eganrol
parents:
diff changeset
38 RNAseqDataAnnotation = function(path2htseqfiles, samplenamefile, Species, ensversion, fileout, conversionensemblversion, conversionensemblname){
de3907c85546 Uploaded
eganrol
parents:
diff changeset
39
de3907c85546 Uploaded
eganrol
parents:
diff changeset
40 #Create a list with the file names in path2htseqfiles
de3907c85546 Uploaded
eganrol
parents:
diff changeset
41 sampleFiles=list.files(path2htseqfiles)
de3907c85546 Uploaded
eganrol
parents:
diff changeset
42 sampleFiles=strsplit(sampleFiles,".txt")
de3907c85546 Uploaded
eganrol
parents:
diff changeset
43 #_noSpikes_htseq
de3907c85546 Uploaded
eganrol
parents:
diff changeset
44 nfiles=length(sampleFiles)
de3907c85546 Uploaded
eganrol
parents:
diff changeset
45
de3907c85546 Uploaded
eganrol
parents:
diff changeset
46 #Read the data in samplenamefile. Create a data frame establishing the correspondence between file names and sample names
de3907c85546 Uploaded
eganrol
parents:
diff changeset
47 corresp = read.table(samplenamefile,header=T,sep="\t",colClasses=c("character","character"))
de3907c85546 Uploaded
eganrol
parents:
diff changeset
48 corresp$File = strsplit(corresp$File,".fastq.gz")
de3907c85546 Uploaded
eganrol
parents:
diff changeset
49
de3907c85546 Uploaded
eganrol
parents:
diff changeset
50 #Create a string vector called libnames that contains the name of the samples in the same order as in sampleFiles
de3907c85546 Uploaded
eganrol
parents:
diff changeset
51 libnames=rep("",nfiles)
de3907c85546 Uploaded
eganrol
parents:
diff changeset
52 for (i in 1:nfiles){
de3907c85546 Uploaded
eganrol
parents:
diff changeset
53 libnames[i]=corresp$Sample_name[corresp$File==sampleFiles[[i]]]
de3907c85546 Uploaded
eganrol
parents:
diff changeset
54 }
de3907c85546 Uploaded
eganrol
parents:
diff changeset
55
de3907c85546 Uploaded
eganrol
parents:
diff changeset
56 #For all files located in path2htseqfiles read the corresponding file into R
de3907c85546 Uploaded
eganrol
parents:
diff changeset
57 library(plyr)
de3907c85546 Uploaded
eganrol
parents:
diff changeset
58 datalist = list()
de3907c85546 Uploaded
eganrol
parents:
diff changeset
59 for(i in 1:nfiles){
de3907c85546 Uploaded
eganrol
parents:
diff changeset
60 rawdata=read.table(paste(paste(path2htseqfiles,sampleFiles[i],sep="/"),"txt",sep="."))
de3907c85546 Uploaded
eganrol
parents:
diff changeset
61 #noSpikes_htseq.
de3907c85546 Uploaded
eganrol
parents:
diff changeset
62 nbrrows=nrow(rawdata)
de3907c85546 Uploaded
eganrol
parents:
diff changeset
63 datalist[[i]]=rawdata[1:(nbrrows-5), ] # skip the last 5 lines of HTSeq-count files
de3907c85546 Uploaded
eganrol
parents:
diff changeset
64 colnames(datalist[[i]]) = c("ID",libnames[i])
de3907c85546 Uploaded
eganrol
parents:
diff changeset
65 }
de3907c85546 Uploaded
eganrol
parents:
diff changeset
66
de3907c85546 Uploaded
eganrol
parents:
diff changeset
67 #Join all the files in a data.frame called datafile with rownames = gene id
de3907c85546 Uploaded
eganrol
parents:
diff changeset
68 datafile = join_all(datalist, by = "ID", type = "left", match = "all")
de3907c85546 Uploaded
eganrol
parents:
diff changeset
69
de3907c85546 Uploaded
eganrol
parents:
diff changeset
70 #Calculate the number of geneID pro file
de3907c85546 Uploaded
eganrol
parents:
diff changeset
71 nbID=data.frame(rep("",nfiles))
de3907c85546 Uploaded
eganrol
parents:
diff changeset
72 for(i in 1:nfiles){
de3907c85546 Uploaded
eganrol
parents:
diff changeset
73 nbID[,i]=nrow(datalist[[i]])
de3907c85546 Uploaded
eganrol
parents:
diff changeset
74 }
de3907c85546 Uploaded
eganrol
parents:
diff changeset
75 totalnbID=apply((nbID[,1:4]),1,sum)
de3907c85546 Uploaded
eganrol
parents:
diff changeset
76
de3907c85546 Uploaded
eganrol
parents:
diff changeset
77 #Verify that all the files contain the same gene ID
de3907c85546 Uploaded
eganrol
parents:
diff changeset
78 if (nrow(datafile)*4==totalnbID[1]){
de3907c85546 Uploaded
eganrol
parents:
diff changeset
79
de3907c85546 Uploaded
eganrol
parents:
diff changeset
80 #Suppress genes not expressed in all samples
de3907c85546 Uploaded
eganrol
parents:
diff changeset
81 datafile = datafile[apply(datafile[,2:(nfiles+1)],1,sum)!=0,]
de3907c85546 Uploaded
eganrol
parents:
diff changeset
82 row.names(datafile)=datafile[,1]
de3907c85546 Uploaded
eganrol
parents:
diff changeset
83 data=datafile[,-1]
de3907c85546 Uploaded
eganrol
parents:
diff changeset
84
de3907c85546 Uploaded
eganrol
parents:
diff changeset
85 #Number of libraries
de3907c85546 Uploaded
eganrol
parents:
diff changeset
86 nblib= dim(data)[2]
de3907c85546 Uploaded
eganrol
parents:
diff changeset
87 #Determine Data + normalization if the specie is not known
de3907c85546 Uploaded
eganrol
parents:
diff changeset
88 if (Species==""){
de3907c85546 Uploaded
eganrol
parents:
diff changeset
89 #Normalized data calculation
de3907c85546 Uploaded
eganrol
parents:
diff changeset
90 nbcol = dim(data)[2] #nb of column in the data.frame
de3907c85546 Uploaded
eganrol
parents:
diff changeset
91 library(DESeq2)
de3907c85546 Uploaded
eganrol
parents:
diff changeset
92 conds = factor(1:nblib)
de3907c85546 Uploaded
eganrol
parents:
diff changeset
93 design = data.frame(Condition=conds)
de3907c85546 Uploaded
eganrol
parents:
diff changeset
94 dds = DESeqDataSetFromMatrix(countData=data, colData=design, design=~Condition)
de3907c85546 Uploaded
eganrol
parents:
diff changeset
95 dds = estimateSizeFactors(dds)
de3907c85546 Uploaded
eganrol
parents:
diff changeset
96 datanorm = t(t(data)/sizeFactors(dds))
de3907c85546 Uploaded
eganrol
parents:
diff changeset
97
de3907c85546 Uploaded
eganrol
parents:
diff changeset
98 #Data + normalization
de3907c85546 Uploaded
eganrol
parents:
diff changeset
99 dataall = data.frame(row.names(datafile), data, datanorm )
de3907c85546 Uploaded
eganrol
parents:
diff changeset
100
de3907c85546 Uploaded
eganrol
parents:
diff changeset
101 #Renames columns
de3907c85546 Uploaded
eganrol
parents:
diff changeset
102 colnames(dataall) = c("Ensembl gene id", paste(libnames,"(raw read counts)"), paste(libnames,"(normalized)"))
de3907c85546 Uploaded
eganrol
parents:
diff changeset
103 write.table(dataall, file=fileout, sep="\t", quote=F, row.names=F)
de3907c85546 Uploaded
eganrol
parents:
diff changeset
104 }
de3907c85546 Uploaded
eganrol
parents:
diff changeset
105
de3907c85546 Uploaded
eganrol
parents:
diff changeset
106 #Determine Data + normalization + annotation if the specie is known
de3907c85546 Uploaded
eganrol
parents:
diff changeset
107 else{
de3907c85546 Uploaded
eganrol
parents:
diff changeset
108 #Add annotations and calculate gene length
de3907c85546 Uploaded
eganrol
parents:
diff changeset
109 library(biomaRt)
de3907c85546 Uploaded
eganrol
parents:
diff changeset
110
de3907c85546 Uploaded
eganrol
parents:
diff changeset
111 #Convert Ensembl version to host
de3907c85546 Uploaded
eganrol
parents:
diff changeset
112 conversionfile = read.table(conversionensemblversion,header=T,sep="\t",colClasses=c("numeric","character"))
de3907c85546 Uploaded
eganrol
parents:
diff changeset
113 correspondingdate = conversionfile[conversionfile$Version == ensversion, 2]
de3907c85546 Uploaded
eganrol
parents:
diff changeset
114 host = paste(correspondingdate, ".archive.ensembl.org/biomart/martservice/", sep="")
de3907c85546 Uploaded
eganrol
parents:
diff changeset
115
de3907c85546 Uploaded
eganrol
parents:
diff changeset
116 #Convert species name to the name of the corresponding bmdataset
de3907c85546 Uploaded
eganrol
parents:
diff changeset
117 conversion = read.table(conversionensemblname,header=T,sep="\t",colClasses=c("character","character"))
de3907c85546 Uploaded
eganrol
parents:
diff changeset
118 bmdataset = conversion[conversion$Specie == Species, 2]
de3907c85546 Uploaded
eganrol
parents:
diff changeset
119 ensembl=useMart("ENSEMBL_MART_ENSEMBL", host=host, dataset=bmdataset)
de3907c85546 Uploaded
eganrol
parents:
diff changeset
120 if (ensversion<=75){
de3907c85546 Uploaded
eganrol
parents:
diff changeset
121 annotation1 = getBM(attributes=c("ensembl_gene_id","external_gene_id","description", "ensembl_transcript_id","exon_chrom_start","exon_chrom_end"),filters="ensembl_gene_id", values=rownames(data), mart=ensembl)
de3907c85546 Uploaded
eganrol
parents:
diff changeset
122 }
de3907c85546 Uploaded
eganrol
parents:
diff changeset
123 else{
de3907c85546 Uploaded
eganrol
parents:
diff changeset
124 annotation1 = getBM(attributes=c("ensembl_gene_id","external_gene_name","description", "ensembl_transcript_id","exon_chrom_start","exon_chrom_end"),filters="ensembl_gene_id", values=rownames(data), mart=ensembl)
de3907c85546 Uploaded
eganrol
parents:
diff changeset
125 }
de3907c85546 Uploaded
eganrol
parents:
diff changeset
126
de3907c85546 Uploaded
eganrol
parents:
diff changeset
127 #because all the annotations are not always found in a first step
de3907c85546 Uploaded
eganrol
parents:
diff changeset
128 not = rownames(data)[!rownames(data) %in% unique(annotation1$ensembl_gene_id)]
de3907c85546 Uploaded
eganrol
parents:
diff changeset
129 if (length(not) !=0){
de3907c85546 Uploaded
eganrol
parents:
diff changeset
130 annotationnot = getBM(attributes=c("ensembl_gene_id","external_gene_id","description", "ensembl_transcript_id","exon_chrom_start","exon_chrom_end"), filters="ensembl_gene_id", values=not, mart=ensembl)
de3907c85546 Uploaded
eganrol
parents:
diff changeset
131 annotation = rbind(annotation1, annotationnot)
de3907c85546 Uploaded
eganrol
parents:
diff changeset
132 }
de3907c85546 Uploaded
eganrol
parents:
diff changeset
133 else{
de3907c85546 Uploaded
eganrol
parents:
diff changeset
134 annotation = annotation1
de3907c85546 Uploaded
eganrol
parents:
diff changeset
135 }
de3907c85546 Uploaded
eganrol
parents:
diff changeset
136
de3907c85546 Uploaded
eganrol
parents:
diff changeset
137 #Exon length
de3907c85546 Uploaded
eganrol
parents:
diff changeset
138 ensinfos.exlen = data.frame(annotation$ensembl_gene_id, annotation$ensembl_transcript_id, abs(annotation$exon_chrom_start - annotation$exon_chrom_end)+1)
de3907c85546 Uploaded
eganrol
parents:
diff changeset
139 colnames(ensinfos.exlen) = c("ensembl_gene_id", "ensembl_transcript_id", "exon_length")
de3907c85546 Uploaded
eganrol
parents:
diff changeset
140
de3907c85546 Uploaded
eganrol
parents:
diff changeset
141 #Transcript length
de3907c85546 Uploaded
eganrol
parents:
diff changeset
142 tlen = tapply(ensinfos.exlen$exon_length, ensinfos.exlen$ensembl_transcript_id, sum)
de3907c85546 Uploaded
eganrol
parents:
diff changeset
143 tlen.gene = merge(tlen, unique(ensinfos.exlen[,1:2]), by.x="row.names", by.y="ensembl_transcript_id")
de3907c85546 Uploaded
eganrol
parents:
diff changeset
144 colnames(tlen.gene) = c("ensembl_transcript_id", "transcript_length","ensembl_gene_id")
de3907c85546 Uploaded
eganrol
parents:
diff changeset
145
de3907c85546 Uploaded
eganrol
parents:
diff changeset
146 #Gene length = median of the size of all transcripts corresponding to this gene
de3907c85546 Uploaded
eganrol
parents:
diff changeset
147 glen = tapply(tlen.gene$transcript_length, tlen.gene$ensembl_gene_id, median)
de3907c85546 Uploaded
eganrol
parents:
diff changeset
148
de3907c85546 Uploaded
eganrol
parents:
diff changeset
149 #Data with gene length
de3907c85546 Uploaded
eganrol
parents:
diff changeset
150 datalen = merge(data, glen, by="row.names")
de3907c85546 Uploaded
eganrol
parents:
diff changeset
151 colnames(datalen) = c("Ensembl_gene_id",colnames(data), "Gene_length")
de3907c85546 Uploaded
eganrol
parents:
diff changeset
152
de3907c85546 Uploaded
eganrol
parents:
diff changeset
153 #Data with annotations and gene length
de3907c85546 Uploaded
eganrol
parents:
diff changeset
154 annotationgene = unique(annotation[,1:3])
de3907c85546 Uploaded
eganrol
parents:
diff changeset
155 dataannot = merge(datalen, annotationgene, by.x="Ensembl_gene_id", by.y="ensembl_gene_id")
de3907c85546 Uploaded
eganrol
parents:
diff changeset
156
de3907c85546 Uploaded
eganrol
parents:
diff changeset
157 #To keep only the first part of the gene description (before [)
de3907c85546 Uploaded
eganrol
parents:
diff changeset
158 tmpdesc = strsplit(as.character(dataannot$description),"[", fixed=T)
de3907c85546 Uploaded
eganrol
parents:
diff changeset
159 f = function(l){
de3907c85546 Uploaded
eganrol
parents:
diff changeset
160 if (length(l)>=1){
de3907c85546 Uploaded
eganrol
parents:
diff changeset
161 return(l[[1]])
de3907c85546 Uploaded
eganrol
parents:
diff changeset
162 }
de3907c85546 Uploaded
eganrol
parents:
diff changeset
163 else{
de3907c85546 Uploaded
eganrol
parents:
diff changeset
164 return("")
de3907c85546 Uploaded
eganrol
parents:
diff changeset
165 }
de3907c85546 Uploaded
eganrol
parents:
diff changeset
166 }
de3907c85546 Uploaded
eganrol
parents:
diff changeset
167 tmpdescok = unlist(lapply(tmpdesc, f))
de3907c85546 Uploaded
eganrol
parents:
diff changeset
168 dataannot$description = tmpdescok
de3907c85546 Uploaded
eganrol
parents:
diff changeset
169
de3907c85546 Uploaded
eganrol
parents:
diff changeset
170 #Normalized data calculation
de3907c85546 Uploaded
eganrol
parents:
diff changeset
171 nbcol = dim(dataannot)[2] #nb of column in the data.frame
de3907c85546 Uploaded
eganrol
parents:
diff changeset
172 library(DESeq2)
de3907c85546 Uploaded
eganrol
parents:
diff changeset
173 conds = factor(1:nblib)
de3907c85546 Uploaded
eganrol
parents:
diff changeset
174 design = data.frame(Condition=conds)
de3907c85546 Uploaded
eganrol
parents:
diff changeset
175 dds = DESeqDataSetFromMatrix(countData=dataannot[,-c(1,nbcol,nbcol-1,nbcol-2)], colData=design, design=~Condition)
de3907c85546 Uploaded
eganrol
parents:
diff changeset
176 dds = estimateSizeFactors(dds)
de3907c85546 Uploaded
eganrol
parents:
diff changeset
177 datanorm = t(t(dataannot[,-c(1,nbcol,nbcol-1,nbcol-2)])/sizeFactors(dds))
de3907c85546 Uploaded
eganrol
parents:
diff changeset
178
de3907c85546 Uploaded
eganrol
parents:
diff changeset
179 #Normalized data adjusted for gene length (normalized data / gene length)
de3907c85546 Uploaded
eganrol
parents:
diff changeset
180 rpkn = datanorm / (as.vector(dataannot[,nbcol-2]/1000 ))
de3907c85546 Uploaded
eganrol
parents:
diff changeset
181
de3907c85546 Uploaded
eganrol
parents:
diff changeset
182 #Data + annotations + rpkn
de3907c85546 Uploaded
eganrol
parents:
diff changeset
183 dataall = data.frame(dataannot[,-c(nbcol,nbcol-1,nbcol-2)] , datanorm, rpkn, dataannot[,c(nbcol-1,nbcol)] )
de3907c85546 Uploaded
eganrol
parents:
diff changeset
184
de3907c85546 Uploaded
eganrol
parents:
diff changeset
185 #Renames columns
de3907c85546 Uploaded
eganrol
parents:
diff changeset
186 colnames(dataall) = c("Ensembl gene id", paste(libnames,"(raw read counts)"), paste(libnames,"(normalized)"), paste(libnames,"(normalized and divided by gene length in kb)"), "Gene name", "Description")
de3907c85546 Uploaded
eganrol
parents:
diff changeset
187 write.table(dataall, file=fileout, sep="\t", quote=F, row.names=F)
de3907c85546 Uploaded
eganrol
parents:
diff changeset
188
de3907c85546 Uploaded
eganrol
parents:
diff changeset
189 #Return(dataall)
de3907c85546 Uploaded
eganrol
parents:
diff changeset
190
de3907c85546 Uploaded
eganrol
parents:
diff changeset
191 }
de3907c85546 Uploaded
eganrol
parents:
diff changeset
192 }
de3907c85546 Uploaded
eganrol
parents:
diff changeset
193 else{
de3907c85546 Uploaded
eganrol
parents:
diff changeset
194 print("The files are not the same length")
de3907c85546 Uploaded
eganrol
parents:
diff changeset
195 }
de3907c85546 Uploaded
eganrol
parents:
diff changeset
196 }
de3907c85546 Uploaded
eganrol
parents:
diff changeset
197
de3907c85546 Uploaded
eganrol
parents:
diff changeset
198 args <- commandArgs(trailingOnly = TRUE)
de3907c85546 Uploaded
eganrol
parents:
diff changeset
199 print(args)
de3907c85546 Uploaded
eganrol
parents:
diff changeset
200
de3907c85546 Uploaded
eganrol
parents:
diff changeset
201 RNAseqDataAnnotation(args[1], args[2],args[3], args[4], args[5], args[6], args[7])
de3907c85546 Uploaded
eganrol
parents:
diff changeset
202
de3907c85546 Uploaded
eganrol
parents:
diff changeset
203 #R --slave --vanilla --verbose --file=/home/lornage/Bureau/Pour_galaxy/RNAseqDataAnnotation.R --args /home/lornage/Bureau/Test_function /home/lornage/Bureau/ichierconvertitnames.txt Homo_sapiens 75 /home/lornage/Bureau/testttttt5.txt /home/lornage/Bureau/Script_R/Ensembl_Version_Host.txt /home/lornage/Bureau/Script_R/Ensemble_Specie_Dataset.txt
de3907c85546 Uploaded
eganrol
parents:
diff changeset
204
de3907c85546 Uploaded
eganrol
parents:
diff changeset
205
de3907c85546 Uploaded
eganrol
parents:
diff changeset
206
de3907c85546 Uploaded
eganrol
parents:
diff changeset
207
de3907c85546 Uploaded
eganrol
parents:
diff changeset
208
de3907c85546 Uploaded
eganrol
parents:
diff changeset
209