25
|
1 <?xml version="1.0" encoding="UTF-8"?>
|
|
2 <tool id="edger_dge" name="edgeR: Differential Gene(Expression) Analysis">
|
|
3 <description>RNA-Seq gene expression analysis using edgeR (R package)</description>
|
|
4
|
|
5 <requirements>
|
33
|
6 <requirement type="package" version="3.0.3">R</requirement>
|
29
|
7 <requirement type="package" version="latest">package_biocLite_edgeR_limma</requirement>
|
25
|
8 </requirements>
|
|
9
|
|
10 <command>
|
|
11 <!--
|
|
12 The following script is written in the "Cheetah" language:
|
|
13 http://www.cheetahtemplate.org/docs/users_guide_html_multipage/contents.html
|
|
14 -->
|
|
15
|
|
16 R --vanilla --slave -f $R_script '--args
|
|
17 $expression_matrix
|
|
18 $design_matrix
|
|
19 $contrast
|
|
20
|
|
21 $fdr
|
|
22
|
|
23 $output_count_edgeR
|
|
24 $output_cpm
|
|
25
|
|
26 /dev/null <!-- Calculation of FPKM/RPKM should come here -->
|
|
27
|
|
28 #if $output_raw_counts:
|
|
29 $output_raw_counts
|
|
30 #else:
|
|
31 /dev/null
|
|
32 #end if
|
|
33
|
|
34 #if $output_MDSplot:
|
|
35 $output_MDSplot
|
|
36 #else:
|
|
37 /dev/null
|
|
38 #end if
|
|
39
|
|
40 #if $output_BCVplot:
|
|
41 $output_BCVplot
|
|
42 #else:
|
|
43 /dev/null
|
|
44 #end if
|
|
45
|
|
46 #if $output_MAplot:
|
|
47 $output_MAplot
|
|
48 #else:
|
|
49 /dev/null
|
|
50 #end if
|
|
51
|
|
52 #if $output_PValue_distribution_plot:
|
|
53 $output_PValue_distribution_plot
|
|
54 #else:
|
|
55 /dev/null
|
|
56 #end if
|
|
57
|
|
58 #if $output_hierarchical_clustering_plot:
|
|
59 $output_hierarchical_clustering_plot
|
|
60 #else:
|
|
61 /dev/null
|
|
62 #end if
|
|
63
|
|
64 #if $output_heatmap_plot:
|
|
65 $output_heatmap_plot
|
|
66 #else:
|
|
67 /dev/null
|
|
68 #end if
|
|
69
|
|
70 #if $output_RData_obj:
|
|
71 $output_RData_obj
|
|
72 #else:
|
|
73 /dev/null
|
|
74 #end if
|
|
75 '
|
|
76 #if $output_R:
|
|
77 > $output_R
|
|
78 #else:
|
|
79 > /dev/null
|
|
80 #end if
|
|
81
|
|
82 2> stderr.txt
|
|
83 ;
|
|
84 grep -v 'Calculating library sizes from column' stderr.txt 1>&2
|
|
85
|
|
86 </command>
|
|
87
|
|
88 <inputs>
|
|
89 <param name="expression_matrix" type="data" format="tabular" label="Expression (read count) matrix" />
|
|
90 <param name="design_matrix" type="data" format="tabular" label="Design matrix" hepl="Ensure your samplenames are identical to those in the expression matrix. Preferentially, create the contrast matrix using 'edgeR: Design- from Expression matrix'." />
|
|
91
|
|
92 <param name="contrast" type="text" label="Contrast (biological question)" help="e.g. 'tumor-normal' or '(G1+G2)/2-G3' using the factors chosen in the design matrix. Read the 'makeContrasts' manual from Limma package for more info: http://www.bioconductor.org/packages/release/bioc/html/limma.html and http://www.bioconductor.org/packages/release/bioc/vignettes/limma/inst/doc/usersguide.pdf." />
|
|
93
|
|
94 <param name="fdr" type="float" min="0" max="1" value="0.05" label="False Discovery Rate (FDR)" />
|
|
95
|
|
96 <param name="outputs" type="select" label="Optional desired outputs" multiple="true" display="checkboxes">
|
|
97 <option value="make_output_raw_counts">Raw counts table</option>
|
|
98 <option value="make_output_MDSplot">MDS-plot</option>
|
|
99 <option value="make_output_BCVplot">BCV-plot</option>
|
|
100 <option value="make_output_MAplot">MA-plot</option>
|
|
101 <option value="make_output_PValue_distribution_plot">P-Value distribution plot</option>
|
|
102 <option value="make_output_hierarchical_clustering_plot">Hierarchical custering</option>
|
|
103 <option value="make_output_heatmap_plot">Heatmap</option>
|
|
104
|
43
|
105 <option value="make_output_R_stdout">R stdout</option>
|
25
|
106 <option value="make_output_RData_obj">R Data object</option>
|
|
107 </param>
|
|
108 </inputs>
|
|
109
|
|
110 <configfiles>
|
|
111 <configfile name="R_script">
|
|
112 library(limma,quietly=TRUE) ## enable quietly to avoid unnecessaity stderr dumping
|
|
113 library(edgeR,quietly=TRUE) ## enable quietly to avoid unnecessaity stderr dumping
|
|
114 library(splines,quietly=TRUE) ## enable quietly to avoid unnecessaity stderr dumping
|
|
115
|
|
116 ## Fetch commandline arguments
|
|
117 args <- commandArgs(trailingOnly = TRUE)
|
|
118
|
|
119 expression_matrix_file = args[1]
|
|
120 design_matrix_file = args[2]
|
|
121 contrast = args[3]
|
|
122
|
|
123 fdr = args[4]
|
|
124
|
|
125 output_count_edgeR = args[5]
|
|
126 output_cpm = args[6]
|
|
127
|
43
|
128 output_xpkm = args[7] ##FPKM file - yet to be implemented
|
25
|
129
|
|
130 output_raw_counts = args[8]
|
|
131 output_MDSplot = args[9]
|
|
132 output_BCVplot = args[10]
|
|
133 output_MAplot = args[11]
|
|
134 output_PValue_distribution_plot = args[12]
|
|
135 output_hierarchical_clustering_plot = args[13]
|
|
136 output_heatmap_plot = args[14]
|
|
137 output_RData_obj = args[15]
|
|
138
|
|
139
|
|
140 library(edgeR)
|
|
141 ##raw_data <- read.delim(designmatrix,header=T,stringsAsFactors=T)
|
|
142 ## Obtain read-counts
|
|
143
|
|
144 expression_matrix <- read.delim(expression_matrix_file,header=T,stringsAsFactors=F,row.names=1,check.names=FALSE,na.strings=c(""))
|
|
145 design_matrix <- read.delim(design_matrix_file,header=T,stringsAsFactors=F,row.names=1,check.names=FALSE,na.strings=c(""))
|
|
146
|
|
147 colnames(design_matrix) <- make.names(colnames(design_matrix))
|
|
148
|
|
149 for(i in 1:ncol(design_matrix)) {
|
|
150 old = design_matrix[,i]
|
|
151 design_matrix[,i] = make.names(design_matrix[,i])
|
|
152 if(paste(design_matrix[,i],collapse="\t") != paste(old,collapse="\t")) {
|
|
153 print("Renaming of factors:")
|
|
154 print(old)
|
|
155 print("To:")
|
|
156 print(design_matrix[,i])
|
|
157 }
|
|
158 design_matrix[,i] <- as.factor(design_matrix[,i])
|
|
159 }
|
|
160
|
|
161
|
|
162 columns <- match(rownames(design_matrix),colnames(expression_matrix))
|
43
|
163 columns <- columns[!is.na(columns)]
|
25
|
164 read_counts <- expression_matrix[,columns]
|
|
165
|
|
166
|
|
167 ## Filter for HTSeq predifined counts:
|
|
168 exclude_HTSeq <- c("no_feature","ambiguous","too_low_aQual","not_aligned","alignment_not_unique")
|
|
169 exclude_DEXSeq <- c("_ambiguous","_empty","_lowaqual","_notaligned")
|
|
170
|
|
171 exclude = match(c(exclude_HTSeq, exclude_DEXSeq),rownames(read_counts))
|
|
172 exclude = exclude[is.na(exclude)==0]
|
|
173 if(length(exclude) != 0) {
|
|
174 read_counts = read_counts[-exclude,]
|
|
175 }
|
|
176
|
|
177
|
|
178 empty_samples = apply(read_counts,2,function(x) sum(x) == 0)
|
|
179 if(sum(empty_samples) > 0) {
|
|
180 write(paste("There are ",sum(empty_samples)," empty samples found:",sep=""),stderr())
|
|
181 write(colnames(read_counts)[empty_samples],stderr())
|
|
182 } else {
|
|
183
|
|
184 dge <- DGEList(counts=read_counts,genes=rownames(read_counts))
|
|
185
|
|
186 formula <- paste(c("~0",make.names(colnames(design_matrix))),collapse = " + ")
|
|
187 design_matrix_tmp <- design_matrix
|
|
188 colnames(design_matrix_tmp) <- make.names(colnames(design_matrix_tmp))
|
|
189 design <- model.matrix(as.formula(formula),design_matrix_tmp)
|
|
190 rm(design_matrix_tmp)
|
|
191
|
|
192 # Filter prefixes
|
|
193 prefixes = colnames(design_matrix)[attr(design,"assign")]
|
|
194 avoid = nchar(prefixes) == nchar(colnames(design))
|
|
195 replacements = substr(colnames(design),nchar(prefixes)+1,nchar(colnames(design)))
|
|
196 replacements[avoid] = colnames(design)[avoid]
|
|
197 colnames(design) = replacements
|
|
198
|
|
199 # Do normalization
|
|
200 write("Calculating normalization factors...",stdout())
|
|
201 dge <- calcNormFactors(dge)
|
|
202 write("Estimating common dispersion...",stdout())
|
|
203 dge <- estimateGLMCommonDisp(dge,design)
|
|
204 write("Estimating trended dispersion...",stdout())
|
|
205 dge <- estimateGLMTrendedDisp(dge,design)
|
|
206 write("Estimating tagwise dispersion...",stdout())
|
|
207 dge <- estimateGLMTagwiseDisp(dge,design)
|
|
208
|
|
209
|
|
210 if(output_MDSplot != "/dev/null") {
|
|
211 write("Creating MDS plot",stdout())
|
|
212 ##points <- plotMDS(dge,method="bcv",labels=rep("",nrow(dge\$samples)))# Get coordinates of unflexible plot
|
|
213 points <- plotMDS.DGEList(dge,labels=rep("",nrow(dge\$samples)))# Get coordinates of unflexible plot
|
|
214 dev.off()# Kill it
|
|
215
|
|
216 pdf(output_MDSplot)
|
|
217 diff_x <- abs(max(points\$x)-min(points\$x))
|
|
218 diff_y <-(max(points\$y)-min(points\$y))
|
|
219 plot(c(min(points\$x),max(points\$x) + 0.45 * diff_x), c(min(points\$y) - 0.05 * diff_y,max(points\$y) + 0.05 * diff_y), main="edgeR MDS Plot",type="n", xlab="BCV distance 1", ylab="BCV distance 2")
|
|
220 points(points\$x,points\$y,pch=20)
|
|
221 text(points\$x, points\$y,rownames(dge\$samples),cex=0.7,col="gray",pos=4)
|
|
222 rm(diff_x,diff_y)
|
|
223
|
|
224 dev.off()
|
|
225 }
|
|
226
|
|
227 if(output_BCVplot != "/dev/null") {
|
|
228 write("Creating Biological coefficient of variation plot",stdout())
|
|
229 pdf(output_BCVplot)
|
|
230 plotBCV(dge, cex=0.4, main="edgeR: Biological coefficient of variation (BCV) vs abundance")
|
|
231 dev.off()
|
|
232 }
|
|
233
|
|
234
|
|
235 write("Fitting GLM...",stdout())
|
|
236 fit <- glmFit(dge,design)
|
|
237
|
|
238 write(paste("Performing likelihood ratio test: ",contrast,sep=""),stdout())
|
|
239 cont <- c(contrast)
|
|
240 cont <- makeContrasts(contrasts=cont, levels=design)
|
|
241
|
|
242 lrt <- glmLRT(fit, contrast=cont[,1])
|
|
243 write(paste("Exporting to file: ",output_count_edgeR,sep=""),stdout())
|
|
244 write.table(file=output_count_edgeR,topTags(lrt,n=nrow(read_counts))\$table,sep="\t",row.names=TRUE,col.names=NA)
|
|
245 write.table(file=output_cpm,cpm(dge,normalized.lib.sizes=TRUE),sep="\t",row.names=TRUE,col.names=NA)
|
|
246
|
|
247 ## todo EXPORT FPKM
|
|
248 write.table(file=output_raw_counts,dge\$counts,sep="\t",row.names=TRUE,col.names=NA)
|
|
249
|
|
250
|
34
|
251 if(output_MAplot != "/dev/null" || output_PValue_distribution_plot != "/dev/null") {
|
25
|
252 etable <- topTags(lrt, n=nrow(dge))\$table
|
|
253 etable <- etable[order(etable\$FDR), ]
|
32
|
254
|
|
255 if(output_MAplot != "/dev/null") {
|
|
256 write("Creating MA plot...",stdout())
|
|
257 pdf(output_MAplot)
|
|
258 with(etable, plot(logCPM, logFC, pch=20, main="edgeR: Fold change vs abundance"))
|
|
259 with(subset(etable, FDR < fdr), points(logCPM, logFC, pch=20, col="red"))
|
|
260 abline(h=c(-1,1), col="blue")
|
|
261 dev.off()
|
|
262 }
|
25
|
263
|
32
|
264 if(output_PValue_distribution_plot != "/dev/null") {
|
|
265 write("Creating P-value distribution plot...",stdout())
|
|
266 pdf(output_PValue_distribution_plot)
|
|
267 expressed_genes <- subset(etable, PValue < 0.99)
|
|
268 h <- hist(expressed_genes\$PValue,breaks=nrow(expressed_genes)/15,main="Binned P-Values (< 0.99)")
|
|
269 center <- sum(h\$counts) / length(h\$counts)
|
|
270 lines(c(0,1),c(center,center),lty=2,col="red",lwd=2)
|
|
271 k <- ksmooth(h\$mid, h\$counts)
|
|
272 lines(k\$x,k\$y,col="red",lwd=2)
|
|
273 rmsd <- (h\$counts) - center
|
|
274 rmsd <- rmsd^2
|
|
275 rmsd <- sum(rmsd)
|
|
276 rmsd <- sqrt(rmsd)
|
|
277 text(0,max(h\$counts),paste("e=",round(rmsd,2),sep=""),pos=4,col="blue")
|
|
278 ## change e into epsilon somehow
|
|
279 dev.off()
|
|
280 }
|
40
|
281 }
|
|
282
|
|
283 if(output_heatmap_plot != "/dev/null") {
|
42
|
284 pdf(output_heatmap_plot,width=10.5)
|
40
|
285 etable2 <- topTags(lrt, n=100)\$table
|
|
286 order <- rownames(etable2)
|
|
287 cpm_sub <- cpm(dge,normalized.lib.sizes=TRUE,log=TRUE)[as.numeric(order),]
|
|
288 heatmap(t(cpm_sub))
|
|
289 dev.off()
|
25
|
290 }
|
|
291
|
|
292 ##output_hierarchical_clustering_plot = args[13]
|
|
293
|
35
|
294 if(output_RData_obj != "/dev/null") {
|
25
|
295 save.image(output_RData_obj)
|
|
296 }
|
|
297
|
|
298 write("Done!",stdout())
|
|
299 }
|
|
300 </configfile>
|
|
301 </configfiles>
|
|
302
|
|
303 <outputs>
|
|
304 <data format="tabular" name="output_count_edgeR" label="edgeR DGE on ${design_matrix.hid}: ${design_matrix.name} - differtially expressed genes" />
|
|
305 <data format="tabular" name="output_cpm" label="edgeR DGE on ${design_matrix.hid}: ${design_matrix.name} - CPM" />
|
|
306
|
|
307 <data format="tabular" name="output_raw_counts" label="edgeR DGE on ${design_matrix.hid}: ${design_matrix.name} - raw counts">
|
|
308 <filter>("make_output_raw_counts" in outputs)</filter>
|
|
309 </data>
|
|
310
|
|
311 <data format="pdf" name="output_MDSplot" label="edgeR DGE on ${design_matrix.hid}: ${design_matrix.name} - MDS-plot">
|
|
312 <filter>("make_output_MDSplot" in outputs)</filter>
|
|
313 </data>
|
|
314
|
|
315 <data format="pdf" name="output_BCVplot" label="edgeR DGE on ${design_matrix.hid}: ${design_matrix.name} - BCV-plot">
|
|
316 <filter>("make_output_BCVplot" in outputs)</filter>
|
|
317 </data>
|
|
318
|
|
319 <data format="pdf" name="output_MAplot" label="edgeR DGE on ${design_matrix.hid}: ${design_matrix.name} - MA-plot">
|
|
320 <filter>("make_output_MAplot" in outputs)</filter>
|
|
321 </data>
|
|
322
|
|
323 <data format="pdf" name="output_PValue_distribution_plot" label="edgeR DGE on ${design_matrix.hid}: ${design_matrix.name} - P-Value distribution">
|
|
324 <filter>("make_output_PValue_distribution_plot" in outputs)</filter>
|
|
325 </data>
|
|
326
|
|
327 <data format="pdf" name="output_hierarchical_clustering_plot" label="edgeR DGE on ${design_matrix.hid}: ${design_matrix.name} - Hierarchical custering">
|
|
328 <filter>("make_output_hierarchical_clustering_plot" in outputs)</filter>
|
|
329 </data>
|
|
330
|
|
331 <data format="pdf" name="output_heatmap_plot" label="edgeR DGE on ${design_matrix.hid}: ${design_matrix.name} - Heatmap">
|
|
332 <filter>("make_output_heatmap_plot" in outputs)</filter>
|
|
333 </data>
|
|
334
|
|
335 <data format="RData" name="output_RData_obj" label="edgeR DGE on ${design_matrix.hid}: ${design_matrix.name} - R data object">
|
40
|
336 <filter>("make_output_RData_obj" in outputs)</filter>
|
25
|
337 </data>
|
|
338
|
40
|
339 <data format="txt" name="output_R" label="edgeR DGE on ${design_matrix.hid}: ${design_matrix.name} - R output (debug)" >
|
43
|
340 <filter>("make_output_R_stdout" in outputs)</filter>
|
25
|
341 </data>
|
|
342 </outputs>
|
|
343
|
|
344 <help>
|
|
345 edgeR: Differential Gene(Expression) Analysis
|
36
|
346 #############################################
|
25
|
347
|
36
|
348 Overview
|
|
349 --------
|
|
350 Differential expression analysis of RNA-seq and digital gene expression profiles with biological replication. Uses empirical Bayes estimation and exact tests based on the negative binomial distribution. Also useful for differential signal analysis with other types of genome-scale count data [1].
|
25
|
351
|
|
352 For every experiment, the algorithm requires a design matrix. This matrix describes which samples belong to which groups.
|
36
|
353 More details on this are given in the edgeR manual: http://www.bioconductor.org/packages/2.12/bioc/vignettes/edgeR/inst/doc/edgeRUsersGuide.pdf
|
25
|
354 and the limma manual.
|
|
355
|
|
356 Because the creation of a design matrix can be complex and time consuming, especially if no GUI is used, this package comes with an alternative tool which can help you with it.
|
|
357 This tool is called *edgeR Design Matrix Creator*.
|
|
358 If the appropriate design matrix (with corresponding links to the files) is given,
|
|
359 the correct contrast ( http://en.wikipedia.org/wiki/Contrast_(statistics) ) has to be given.
|
|
360
|
|
361 If you have for example two groups, with an equal weight, you would like to compare either
|
|
362 "g1~g2" or "normal~cancer".
|
|
363
|
36
|
364 The test function makes use of a MCF7 dataset used in a study that indicates that a higher sequencing depth is not neccesairily more important than a higher amount of replaciates[2].
|
25
|
365
|
36
|
366 Input
|
|
367 -----
|
|
368 Expression matrix
|
|
369 ^^^^^^^^^^^^^^^^^
|
|
370 ::
|
25
|
371
|
|
372 Geneid "\t" Sample-1 "\t" Sample-2 "\t" Sample-3 "\t" Sample-4 [...] "\n"
|
|
373 SMURF "\t" 123 "\t" 21 "\t" 34545 "\t" 98 ... "\n"
|
|
374 BRCA1 "\t" 435 "\t" 6655 "\t" 45 "\t" 55 ... "\n"
|
|
375 LINK33 "\t" 4 "\t" 645 "\t" 345 "\t" 1 ... "\n"
|
|
376 SNORD78 "\t" 498 "\t" 65 "\t" 98 "\t" 27 ... "\n"
|
|
377 [...]
|
|
378
|
36
|
379 *Note: Make sure the number of columns in the header is identical to the number of columns in the body.*
|
25
|
380
|
36
|
381 Design matrix
|
|
382 ^^^^^^^^^^^^^
|
|
383 ::
|
25
|
384
|
|
385 Sample "\t" Condition "\t" Ethnicity "\t" Patient "\t" Batch "\n"
|
|
386 Sample-1 "\t" Tumor "\t" European "\t" 1 "\t" 1 "\n"
|
|
387 Sample-2 "\t" Normal "\t" European "\t" 1 "\t" 1 "\n"
|
|
388 Sample-3 "\t" Tumor "\t" European "\t" 2 "\t" 1 "\n"
|
|
389 Sample-4 "\t" Normal "\t" European "\t" 2 "\t" 1 "\n"
|
|
390 Sample-5 "\t" Tumor "\t" African "\t" 3 "\t" 1 "\n"
|
|
391 Sample-6 "\t" Normal "\t" African "\t" 3 "\t" 1 "\n"
|
|
392 Sample-7 "\t" Tumor "\t" African "\t" 4 "\t" 2 "\n"
|
|
393 Sample-8 "\t" Normal "\t" African "\t" 4 "\t" 2 "\n"
|
|
394 Sample-9 "\t" Tumor "\t" Asian "\t" 5 "\t" 2 "\n"
|
|
395 Sample-10 "\t" Normal "\t" Asian "\t" 5 "\t" 2 "\n"
|
|
396 Sample-11 "\t" Tumor "\t" Asian "\t" 6 "\t" 2 "\n"
|
|
397 Sample-12 "\t" Normal "\t" Asian "\t" 6 "\t" 2 "\n"
|
|
398
|
36
|
399 *Note: Avoid factor names that are (1) numerical, (2) contain mathematical symbols and preferebly only use letters.*
|
25
|
400
|
36
|
401 Contrast
|
|
402 ^^^^^^^^
|
|
403 The contrast represents the biological question. There can be many questions asked, e.g.:
|
25
|
404
|
36
|
405 - Tumor-Normal
|
|
406 - African-European
|
|
407 - 0.5*(Control+Placebo) / Treated
|
25
|
408
|
36
|
409 Installation
|
|
410 ------------
|
25
|
411
|
|
412 This tool requires no specific configurations. The following dependencies are installed automatically:
|
36
|
413
|
|
414 - R
|
|
415 - Bioconductor
|
25
|
416 - limma
|
36
|
417
|
25
|
418 - edgeR
|
|
419
|
36
|
420 License
|
|
421 -------
|
|
422 - R
|
|
423 - GPL-2 & GPL-3
|
|
424 - limma
|
|
425 - GPL (>=2)
|
|
426 - edgeR
|
|
427 - GPL (>=2)
|
|
428
|
|
429 References
|
|
430 ----------
|
|
431
|
|
432 EdgeR
|
|
433 ^^^^^
|
|
434 **[1] edgeR: a Bioconductor package for differential expression analysis of digital gene expression data.**
|
25
|
435
|
36
|
436 *Mark D. Robinson, Davis J. McCarthy and Gordon K. Smyth* - Bioinformatics (2010) 26 (1): 139-140.
|
|
437
|
|
438 - http://www.bioconductor.org/packages/2.12/bioc/html/edgeR.html
|
|
439 - http://dx.doi.org/10.1093/bioinformatics/btp616
|
|
440 - http://www.bioconductor.org/packages/release/bioc/html/edgeR.html
|
25
|
441
|
36
|
442 Test-data (MCF7)
|
|
443 ^^^^^^^^^^^^^^^^
|
|
444 **[2] RNA-seq differential expression studies: more sequence or more replication?**
|
|
445
|
|
446 *Yuwen Liu, Jie Zhou and Kevin P. White* - Bioinformatics (2014) 30 (3): 301-304.
|
|
447
|
|
448 - http://www.ncbi.nlm.nih.gov/pubmed/24319002
|
|
449 - http://dx.doi.org/10.1093/bioinformatics/btt688
|
|
450
|
|
451 Contact
|
|
452 -------
|
25
|
453 The tool wrapper has been written by Youri Hoogstrate from the Erasmus Medical Center (Rotterdam, Netherlands) on behalf of the Translational Research IT (TraIT) project:
|
|
454 http://www.ctmm.nl/en/programmas/infrastructuren/traitprojecttranslationeleresearch
|
|
455
|
36
|
456 I would like to thank Hina Riaz - Naz Khan for her helpful contribution.
|
25
|
457
|
36
|
458 More tools by the Translational Research IT (TraIT) project can be found in the following repository:
|
|
459 http://testtoolshed.g2.bx.psu.edu/
|
25
|
460 </help>
|
|
461 </tool>
|