# HG changeset patch # User stef # Date 1425476534 18000 # Node ID 81ba2f857fe259b3908a6645f6a3024e7c008f45 # Parent acf62630e4b5dfba7f72cb8d454fa2887a98bbbf Uploaded diff -r acf62630e4b5 -r 81ba2f857fe2 QDNAseq-plot.R --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/QDNAseq-plot.R Wed Mar 04 08:42:14 2015 -0500 @@ -0,0 +1,51 @@ +#!/usr/bin/Rscript + +## -------------------- +## prints all arguments as msg +## -------------------- +catMsg <- function( msg=c() ){ + cat( MAIN_NAME, paste( msg, collapse="" ), "\n", sep='') +} + + +## ================================================== +## Start of analysis +## ================================================== +MAIN_NAME <- '[INFO] ' +catMsg( "Starting QDNAseq-plot wrapper" ) +catMsg( "Loading R libraries" ) + +## supress msg to allow R to finish with non-error msg +suppressWarnings( suppressMessages( library( QDNAseq, quietly = TRUE ) ) ) + +## only one param: the tmp config file +cmdLineArgs <- commandArgs(TRUE) +config <- cmdLineArgs[1] + +## sourcing the config file will load all input params +## many variables are imported via sourced "config" +source( config ) # outputPngPath, outputPdfPath, allOrOne, rdsFilePath +#cat( "ALL? ", allOrOne, sep='' ) + +## desparate tries to make png text scale well, damn you R...! +PLOT_RES <- min( PLOT_WIDTH, PLOT_HEIGHT ) / 6.3 +PAR_SET <- list( pch=22 ) +systemUser <- system("whoami",T) +qdnaseqVersion <- packageDescription( "QDNAseq" )$Version +rVersion <- R.version.string +catMsg( c("QDNAseq version: ", qdnaseqVersion) ) +catMsg( c( rVersion ) ) + +qdnaseqObject <- readRDS( rdsFilePath ) +## COPYNUMBER PLOT +sample <- SAMPLE_INDEX +png( outputPngPath, width=PLOT_WIDTH, height=PLOT_HEIGHT, res=PLOT_RES ) + par( PAR_SET ) + plot( qdnaseqObject[ ,sample ] ) + #mtext( "plotted in galaxy", 3 ) + abline( h=c(-2,-1,1,2,3,4), lty=1, lwd=0.5, col="grey" ) +dev.off() + + +## all ok +q(status=0) diff -r acf62630e4b5 -r 81ba2f857fe2 QDNAseq-plot.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/QDNAseq-plot.xml Wed Mar 04 08:42:14 2015 -0500 @@ -0,0 +1,154 @@ + + + + + + + + + + + Plot QDNAseq copy-number/segments/calls profile + + + + QDNAseq-plot.R + $cfg + + + + + + + + + + + + + + + + + + ^[^\s\\]*$ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +## Desc: this file is sourced in QDNAseq-plot.R wrapper script +## as means to pass all galaxy params to R + +## ----- +## required params +## ----- +"${jobName}" -> outputName +"${outputPng}" -> outputPngPath +"${rdsFile}" -> rdsFilePath +as.integer( "${sample_index}" ) -> SAMPLE_INDEX + +## ----- +## extra options +## ----- +as.integer( "${advanced.plot_width}" ) -> PLOT_WIDTH +as.integer( "${advanced.plot_height}" ) -> PLOT_HEIGHT + + + + + + + + + + + + + +.. class:: infomark + +**Introduction** + +This tool is a wrapper for the plot function of the R Bioconductor package QDNAseq_ + +.. _QDNAseq: http://www.bioconductor.org/packages/release/bioc/html/QDNAseq.html + +----- + +.. class:: warningmark + +As there is no R 3.1.0 galaxy-package yet (a requirement for QDNAseq), the **dependencies** need to be installed by hand and available to the user under which galaxy runs: R (3.1.0) and bioconductor package QDNAseq (>= 1.2.2). In case the default R is not 3.1.0, also the wrapper xml must be updated to include the correct path during installation of this tool. + +----- + +**Citation** + +For the underlying QDNAseq R package please cite: +Scheinin I, Sie D, Bengtsson H, van de Wiel MA, Olshen AB, van Thuijl HF, van Essen HF, Eijk PP, Rustenburg F, Meijer GA, Reijneveld JC, Wesseling P, Pinkel D, Albertson DG and Ylstra B (2014). “DNA copy number analysis of fresh and formalin-fixed specimens by shallow whole-genome sequencing with identification and exclusion of problematic regions in the genome assembly.” Genome Research. doi:10.1101/gr.175141.114. + +See also the bioconductor package_ documentation. + +.. _package: http://www.bioconductor.org/packages/release/bioc/html/QDNAseq.html + +.. image:: LGG150_copynumber.png +.. image:: LGG150_copynumberSegmented.png + + + + diff -r acf62630e4b5 -r 81ba2f857fe2 QDNAseq.R --- a/QDNAseq.R Thu Nov 06 05:48:52 2014 -0500 +++ b/QDNAseq.R Wed Mar 04 08:42:14 2015 -0500 @@ -131,14 +131,21 @@ return(storeList) } +## ================================================== +## Unused but potential usefull code +## ================================================== +#@ a bit hacky galaxy way to allow an unknown number of output files based on param selection +#@ see: https://wiki.galaxyproject.org/Admin/Tools/Multiple%20Output%20Files +#historyName <- paste(binSize, 'kbp-IGV', sep="") +#igvFile <- paste( newFilePath, "/primary_", outputId, "_", historyName, "_visible_txt", sep="" ) ## ================================================== ## Start of analysis ## ================================================== MAIN_NAME <- '[INFO] ' catMsg( "Starting QDNAseq wrapper" ) +#catMsg( R.version.string ) catMsg( "Loading R libraries" ) -catMsg( R.version.string ) ## supress msg to allow R to finish with non-error msg suppressWarnings( suppressMessages( library( QDNAseq, quietly = TRUE ) ) ) @@ -157,6 +164,9 @@ ## many variables are imported via sourced "config" source( config ) +## if calling requested we always need segmenting first as well +if ( doCall ){ doSegment <- TRUE } + ## desparate tries to make png text scale well, damn you R...! PLOT_RES <- min( PLOT_WIDTH, PLOT_HEIGHT ) / 6.3 PAR_SET <- list( pch=22 ) @@ -171,7 +181,15 @@ ## get the comma separated list of chromosomes to exclude excludeChrs <- unlist( strsplit( excludeChrsString, ",") ) -binSizes <- as.numeric( unlist( strsplit( binSizesString, ",") ) ) + +## format binSizes back to integers because stupid galaxy doesn't do what I want +#print( binSizesString ) +binSizes <- gsub( 'kb', '', binSizesString ) # remove the kb string to get integers +#print( binSizes ) +binSizes <- gsub( 'bin', '', binSizes ) # remove the kb string to get integers +#print( binSizes ) +binSizes <- as.numeric( unlist( strsplit( binSizes, ",") ) ) +#print( binSizes ) ## ------------------------ @@ -205,11 +223,11 @@ plotted_images <- list() # to keep track of images for later linking regions <- list() # will contain the segments -outputFiles <- list() ## ------------------------ ## in case of debug just use inbuilt LGG data for speedup if ( debug ){ + catMsg( c("Built in data only contains binsize 15kb so overriding chosen binSizes to single 15kb") ) binSizes <- c(15) bamsPaths <- c( "BUILD_IN_DATA") bamsNames <- c( "LGG150") @@ -219,22 +237,23 @@ for ( binSize in binSizes ){ + catMsg( c("Starting analysis for binSize: ", binSize) ) ## ------------------------ ## construct output file-names and -paths ## ------------------------ - robjReadCoName <- paste( binSize, 'kbp_QDNAseqReadCounts.rds', sep='') - robjCopyNrName <- paste( binSize, 'kbp_QDNAseqCopyNumbers.rds', sep='') - igvCopyNrName <- paste( binSize, 'kbp_QDNAseqCopyNumbers.igv', sep='') - robjSegmntName <- paste( binSize, 'kbp_QDNAseqCopyNumbersSegmented.rds', sep='') + rdsReadName <- paste( binSize, 'kbp_QDNAseqReadCounts.rds', sep='') + rdsCopyName <- paste( binSize, 'kbp_QDNAseqCopyNumbers.rds', sep='') + rdsSegmName <- paste( binSize, 'kbp_QDNAseqCopyNumbersSegmented.rds', sep='') + rdsCallName <- paste( binSize, 'kbp_QDNAseqCopyNumbersCalled.rds', sep='') + igvCopyName <- paste( binSize, 'kbp_QDNAseqCopyNumbers.igv', sep='') + igvSegmName <- paste( binSize, 'kbp_QDNAseqCopyNumbersSegmented.igv', sep='') + igvCallName <- paste( binSize, 'kbp_QDNAseqCopyNumbersCalled.igv', sep='') + regiOutputName <- paste( binSize, 'kbp_QDNAseqRegions.rds', sep='') noiseImgName <- paste( binSize, 'kbp_QDNAseqNoiseplot.png', sep='') - robjReadCoPath <- paste( outputPath, '/', robjReadCoName, sep='') - robjCopyNrPath <- paste( outputPath, '/', robjCopyNrName, sep='') - robjSegmntPath <- paste( outputPath, '/', robjSegmntName, sep='') - robjRegionPath <- paste( outputPath, '/', regiOutputName, sep='') - igvCopyNrPath <- paste( outputPath, '/', igvCopyNrName, sep='') - noiseImgPath <- paste( outputPath, '/', noiseImgName, sep='') + rdsRegiPath <- paste( outputPath, '/', regiOutputName, sep='') + noiseImgPath <- paste( outputPath, '/', noiseImgName, sep='') binAnnFile <- paste( TOOL_PATH, '/static/binannotation/', binSize, 'kbp_binAnnotations.rds', sep="" ) if ( file.exists(binAnnFile) ){ @@ -246,7 +265,7 @@ ## in case of debug just use inbuilt LGG data for speedup if ( debug ){ - data(LGG150) + data( LGG150 ) readCounts <- LGG150 }else{ ## provide bamnames because in galaxy everyting is called "dataset_###" @@ -260,27 +279,49 @@ copyNumbersSmooth <- smoothOutlierBins( copyNumbersNormalized ) sampleNames <- readCountsFiltered@phenoData@data$name - ## save objects to output dir - saveRDS( readCountsFiltered, robjReadCoPath ); - saveRDS( copyNumbersSmooth, robjCopyNrPath ); - exportBins( copyNumbersSmooth, file=igvCopyNrPath, format="igv" ) + ## set file to output if output requested + outputData <- copyNumbersSmooth + outputType <- 'copynumber' + outputLogT <- TRUE + rdsReadPath <- paste( outputPath, '/', rdsReadName, sep='') + saveRDS( readCounts, rdsReadPath ); + rdsPath <- paste( outputPath, '/', rdsCopyName, sep='') + igvPath <- paste( outputPath, '/', igvCopyName, sep='') + + ## proceed with segmenting / calling if requested + if ( doSegment ){ + copyNumbersSegmented <- segmentBins( copyNumbersSmooth, undo.splits=undoSplits, undo.SD=undoSD, transformFun="sqrt" ) + copyNumbersSegmented <- normalizeSegmentedBins( copyNumbersSegmented ) + outputData <- copyNumbersSegmented + outputType <- 'segments' + igvPath <- paste( outputPath, '/', rdsSegmName, sep='') + rdsPath <- paste( outputPath, '/', igvSegmName, sep='') + } + if ( doCall ){ + copyNumbersCalled <- callBins(copyNumbersSegmented) + outputData <- copyNumbersCalled + outputType <- 'calls' + outputLogT <- FALSE # call values should not be transformed at output + rdsPath <- paste( outputPath, '/', rdsCallName, sep='') + igvPath <- paste( outputPath, '/', igvCallName, sep='') + } + + ## save the QDNAseq objects and tsv file of highest level (calls or segments) + saveRDS( outputData, rdsPath ); + exportBins( outputData, file=igvPath, format="igv", type=outputType, logTransform=outputLogT ) ## also save objects for galaxy history output if requested - if ( doOutputCopynumbersIgv ){ - #@ a bit hacky galaxy way to allow an unknown number of output files based on param selection - #@ see: https://wiki.galaxyproject.org/Admin/Tools/Multiple%20Output%20Files - historyName <- paste(binSize, 'kbp-IGV', sep="") - igvFile <- paste( newFilePath, "/primary_", outputId, "_", historyName, "_visible_txt", sep="" ) - exportBins( copyNumbersSmooth, file=igvFile, format="igv" ) - catMsg( c("Exported igv file to history for ", binSize, "kbp bin") ) + if ( txt2history ){ + fileId <- paste('txt_', binSize, sep='') + historyOutputPath <- historyOutputFiles[[ fileId ]] + catMsg( c("About to export igv/txt file to history for ", binSize, "kbp bin") ) + exportBins( outputData, file=historyOutputPath, format="igv", type=outputType, logTransform=outputLogT ) } - - ## proceed with calling if requested - if ( doSegment ){ - copyNumbersSegmented <- segmentBins( copyNumbersSmooth, undo.splits=undoSplits, undo.SD=undoSD ) - copyNumbersSegmented <- normalizeSegmentedBins( copyNumbersSegmented ) - cgh <- makeCgh( copyNumbersSegmented ) - saveRDS( copyNumbersSegmented, robjSegmntPath ); + if ( rds2history ){ + fileId <- paste('rds_', binSize, sep='') + rdsHistoryOutputPath <- historyOutputFiles[[ fileId ]] + catMsg( c("About to export rds file to history for ", binSize, "kbp bin") ) + saveRDS( outputData, file=rdsHistoryOutputPath ) } ## ------------------------ @@ -293,6 +334,7 @@ binSize <- as.character( binSize ) # to avoid R using it as array index... (*#$^@ you R!) binSizeString <- paste( binSize, 'kbp', sep='') + cgh <- makeCgh( outputData ) # needed for fuseRegions function for (i in 1:length(sampleNames) ){ @@ -308,7 +350,7 @@ png( img_file_path, width=PLOT_WIDTH, height=PLOT_HEIGHT, res=PLOT_RES ); par( PAR_SET ) plot( copyNumbersSmooth[ ,sample ], main=paste(sample, ": CopyNumbers", sep="") ) - mtext( paste( binSizeString, " bins", sep=""), 3 ) + mtext( paste( "(", binSizeString, " bins)", sep=""), 3 ) abline( h=c(-2,-1,1,2,3,4), lty=1, lwd=0.5, col="grey" ) dev.off() @@ -319,16 +361,17 @@ img_file <- paste( sample, '_', binSize, 'kbp_QDNAseq', type, '.png', sep='') img_file_path <- paste( outputPath, '/', img_file, sep='' ) - ## COPYNUMBER PLOT + ## COPYNUMBER + SEGMENTS PLOT png( img_file_path, width=PLOT_WIDTH, height=PLOT_HEIGHT, res=PLOT_RES ); par( PAR_SET ) - plot( copyNumbersSegmented[ ,sample ], main=paste(sample, ": CopyNumbers and Segments", sep="") ) + plot( copyNumbersSegmented[ ,sample ], main=paste(sample, ": CopyNumbers (Segmented)", sep="") ) mtext( paste( "(", binSizeString, " bins)", sep=""), 3 ) abline( h=c(-2,-1,1,2,3,4), lty=1, lwd=0.5, col="grey" ) dev.off() plotted_images[[ paste(binSize, sample, type, sep="_" ) ]] <- img_file + ## if segmented we can also retrieve the segment locations catMsg( c(" Fusing regions of sample: ", sample) ) regions[[ sample ]] <- fuseRegions( cgh[, sample] ) @@ -336,13 +379,29 @@ catMsg( c( ' sample "', sample, '" has ', region_count, " regions" ) ) plotted_images[[ paste(binSize, sample, 'region_count', sep="_" ) ]] <- region_count } + + if ( doCall ){ + type <- 'Called' + img_file <- paste( sample, '_', binSize, 'kbp_QDNAseq', type, '.png', sep='') + img_file_path <- paste( outputPath, '/', img_file, sep='' ) + + ## COPYNUMBER + SEGMENTS + CALLS PLOT + png( img_file_path, width=PLOT_WIDTH, height=PLOT_HEIGHT, res=PLOT_RES ); + par( PAR_SET ) + plot( copyNumbersCalled[ ,sample ], main=paste(sample, ": CopyNumbers (Segmented and Called)", sep="") ) + mtext( paste( "(", binSizeString, " bins)", sep=""), 3 ) + abline( h=c(-2,-1,1,2,3,4), lty=1, lwd=0.5, col="grey" ) + dev.off() + + plotted_images[[ paste(binSize, sample, type, sep="_" ) ]] <- img_file + } ## add USED read counts plotted_images[[ paste(binSize, sample, 'usedReads', sep="_" ) ]] <- usedReads } if ( doSegment ){ - saveRDS( regions, robjRegionPath ) + saveRDS( regions, rdsRegiPath ) plotted_images <- outputRegionsFromList( regions, outputBasename=outputName, outputDir=outputPath, binSize=binSize, storeList=plotted_images ) } }# end bin @@ -418,13 +477,20 @@ ## list with links to all output files ## ------------------------ cat( '

Output files

', "\n") - cat( '

This table contains output files that can be used for local downstream analysis with the bioconductor QDNAseq package. For each bin-size / data-level there is a R data structure file with data of all samples. See ', htmlLink( WEB_LINK, 'the bioconductor QDNAseq documentation' ), ' for more information on how to work with these files

', "\n", sep='') + cat( '

This table contains output files that can be used for local downstream analysis with the bioconductor QDNAseq package. For each bin-size / data-level there is a R data structure file with data of all samples. See ', htmlLink( WEB_LINK, 'the bioconductor QDNAseq documentation' ), ' for more information on how to work with these files.

', "\n", sep='') cat( '', "\n" ) cat( '', as.vector( mapply( paste, "", sep="" ) ),'', "\n" ) cat( "", "\n") files <- list() - fileTypes <- c( 'ReadCounts.rds', 'CopyNumbers.rds' ) - if ( doSegment ){ fileTypes <- c( fileTypes, 'CopyNumbersSegmented.rds') } + #fileTypes <- c( 'ReadCounts.rds', 'CopyNumbers.rds' ) + fileTypes <- c( 'ReadCounts.rds' ) + if ( doCall ){ + fileTypes <- c( fileTypes, 'CopyNumbersCalled.rds') + }else if ( doSegment ){ + fileTypes <- c( fileTypes, 'CopyNumbersSegmented.rds') + }else { + fileTypes <- c( fileTypes, 'CopyNumbers.rds') + } for ( fileType in fileTypes ){ fileNames <- mapply( paste, binSizes, paste( 'kbp_QDNAseq', fileType, sep=''), sep='') @@ -441,7 +507,7 @@ width_t <- 100; height_t <- 40 ## thumb img cat( '

Results: overview

', "\n") - cat( '

This table contains the visual results of the copy number aberration analysis. You can click on an image to jump to the larger version. If segmentation was performed as well the number of segments is shown and a file with genomic regions can be downloaded (just remember to inspect the results carefully as this is a more exprimental step).

', "\n", sep='') + cat( '

This table contains the visual results of the copy number aberration analysis. You can click on an image to jump to the larger version. If segmentation was performed as well the number of segments is shown and a file with genomic regions can be downloaded (just remember to inspect the results carefully as this is, together with optional calling afterwards, a more experimental type of analysis).

', "\n", sep='') plots_html <- '' colspan <- 1 @@ -468,6 +534,7 @@ html_copy_thumb <- htmlLink( path=paste('#', copy_img, sep=''), paste('', bam_file, '', sep='') ) html_copy_img <- htmlLink( path=copy_img, paste('',bam_file, '', sep='') ) html_segm_img <- '' + html_call_img <- '' html_bedGraph <- '' region_count <- '' htmlRow <- paste( htmlRow, '' ) @@ -480,7 +547,11 @@ html_segm_img <- htmlLink( path=segm_img, paste('', bam_file, '', sep='') ) htmlRow <- paste( htmlRow, '', sep="" ) } - plots_html <- paste( plots_html, html_copy_img, "\n", html_segm_img, "\n
\n", sep='' ) + if ( doCall ){ + call_img <- plotted_images[[ paste(binSize, bam_file, 'Called', sep="_" ) ]] + html_call_img <- htmlLink( path=call_img, paste('', bam_file, '', sep='') ) + } + plots_html <- paste( plots_html, html_copy_img, "\n", html_segm_img, "\n", html_call_img, "\n
\n", sep='' ) } plots_html <- paste( plots_html, "\n
\n", sep='' ) ## add info to overview table, including small thumbnails diff -r acf62630e4b5 -r 81ba2f857fe2 QDNAseq.xml --- a/QDNAseq.xml Thu Nov 06 05:48:52 2014 -0500 +++ b/QDNAseq.xml Wed Mar 04 08:42:14 2015 -0500 @@ -1,11 +1,11 @@ - + samtools - + QDNASEQ_PATH @@ -22,7 +22,7 @@ - + @@ -34,17 +34,17 @@ - .*\S + ^[^\s\\]+$ - - - - - - - + + + + + + + @@ -59,16 +59,42 @@ - + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -92,11 +119,6 @@ - - - - - @@ -137,7 +159,6 @@ - @@ -162,7 +183,7 @@ -## Desc: this file was sourced in QDNAseq R wrapper script +## Desc: this file is sourced in QDNAseq R wrapper script ## as means to pass all galaxy params to R ## ----- @@ -180,14 +201,34 @@ "${htmlFile.id}" -> outputId "${__new_file_path__}" -> newFilePath +list() -> historyOutputFiles + +"${txt_1}" -> historyOutputFiles[[ 'txt_1' ]] +"${txt_5}" -> historyOutputFiles[[ 'txt_5' ]] +"${txt_15}" -> historyOutputFiles[[ 'txt_15' ]] +"${txt_30}" -> historyOutputFiles[[ 'txt_30' ]] +"${txt_100}" -> historyOutputFiles[[ 'txt_100' ]] +"${txt_1000}" -> historyOutputFiles[[ 'txt_1000' ]] + +"${rds_1}" -> historyOutputFiles[[ 'rds_1' ]] +"${rds_5}" -> historyOutputFiles[[ 'rds_5' ]] +"${rds_15}" -> historyOutputFiles[[ 'rds_15' ]] +"${rds_30}" -> historyOutputFiles[[ 'rds_30' ]] +"${rds_100}" -> historyOutputFiles[[ 'rds_100' ]] +"${rds_1000}" -> historyOutputFiles[[ 'rds_1000' ]] + + "${htmlFile.files_path}" -> outputPath as.logical( "${doSegment}" ) -> doSegment +as.logical( "${doCall}" ) -> doCall as.logical( "${debug}" ) -> debug ## ----- ## own bin-annotations file options ## ----- + ## ----- ## advanced options @@ -196,11 +237,8 @@ as.logical( "${advanced.blacklist}" ) -> filterBlacklistedBins as.integer( "${advanced.mappability}" ) -> mappabilityCutoff "${advanced.undo_splits}" -> undoSplits -as.logical( "${advanced.copynumbers_igv}" ) -> doOutputCopynumbersIgv - -## #for binSize in $binSizes}.split(",")# -## "${binSize}kbp_${igvCopyNumbers}" -> copyNumbersIgvDatasetFile -## #end for +as.logical( "${txt2history}" ) -> txt2history +as.logical( "${rds2history}" ) -> rds2history ## ----- ## plot options @@ -230,7 +268,49 @@ - + + + + + + + + ( "bin1000kb" in binSizes and txt2history == 'TRUE') + + + ("bin100kb" in binSizes and txt2history == 'TRUE') + + + ("bin30kb" in binSizes and txt2history == 'TRUE') + + + ("bin15kb" in binSizes and txt2history == 'TRUE') + + + ("bin5kb" in binSizes and txt2history == 'TRUE') + + + ("bin1kb" in binSizes and txt2history == 'TRUE') + + + + ( "bin1000kb" in binSizes and rds2history == 'TRUE') + + + ( "bin100kb" in binSizes and rds2history == 'TRUE') + + + ( "bin30kb" in binSizes and rds2history == 'TRUE') + + + ( "bin15kb" in binSizes and rds2history == 'TRUE') + + + ( "bin5kb" in binSizes and rds2history == 'TRUE') + + + ( "bin1kb" in binSizes and rds2history == 'TRUE') + diff -r acf62630e4b5 -r 81ba2f857fe2 static/css/QDNAseq.css --- a/static/css/QDNAseq.css Thu Nov 06 05:48:52 2014 -0500 +++ b/static/css/QDNAseq.css Wed Mar 04 08:42:14 2015 -0500 @@ -1,4 +1,17 @@ -/* --- QDNAseq CSS --- */ +/*! +Pure v0.5.0 +Copyright 2014 Yahoo! Inc. All rights reserved. +Licensed under the BSD License. +https://github.com/yui/pure/blob/master/LICENSE.md +*/ +/*! +normalize.css v1.1.3 | MIT License | git.io/normalize +Copyright (c) Nicolas Gallagher and Jonathan Neal +*/ +/*! normalize.css v1.1.3 | MIT License | git.io/normalize */ +article,aside,details,figcaption,figure,footer,header,hgroup,main,nav,section,summary{display:block}audio,canvas,video{display:inline-block;*display:inline;*zoom:1}audio:not([controls]){display:none;height:0}[hidden]{display:none}html{font-size:100%;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}html,button,input,select,textarea{font-family:sans-serif}body{margin:0}a:focus{outline:thin dotted}a:active,a:hover{outline:0}h1{font-size:2em;margin:.67em 0}h2{font-size:1.5em;margin:.83em 0}h3{font-size:1.17em;margin:1em 0}h4{font-size:1em;margin:1.33em 0}h5{font-size:.83em;margin:1.67em 0}h6{font-size:.67em;margin:2.33em 0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:700}blockquote{margin:1em 40px}dfn{font-style:italic}hr{-moz-box-sizing:content-box;box-sizing:content-box;height:0}mark{background:#ff0;color:#000}p,pre{margin:1em 0}code,kbd,pre,samp{font-family:monospace,serif;_font-family:'courier new',monospace;font-size:1em}pre{white-space:pre;white-space:pre-wrap;word-wrap:break-word}q{quotes:none}q:before,q:after{content:'';content:none}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sup{top:-.5em}sub{bottom:-.25em}dl,menu,ol,ul{margin:1em 0}dd{margin:0 0 0 40px}menu,ol,ul{padding:0 0 0 40px}nav ul,nav ol{list-style:none;list-style-image:none}img{border:0;-ms-interpolation-mode:bicubic}svg:not(:root){overflow:hidden}figure{margin:0}form{margin:0}fieldset{border:1px solid silver;margin:0 2px;padding:.35em .625em .75em}legend{border:0;padding:0;white-space:normal;*margin-left:-7px}button,input,select,textarea{font-size:100%;margin:0;vertical-align:baseline;*vertical-align:middle}button,input{line-height:normal}button,select{text-transform:none}button,html input[type=button],input[type=reset],input[type=submit]{-webkit-appearance:button;cursor:pointer;*overflow:visible}button[disabled],html input[disabled]{cursor:default}input[type=checkbox],input[type=radio]{box-sizing:border-box;padding:0;*height:13px;*width:13px}input[type=search]{-webkit-appearance:textfield;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;box-sizing:content-box}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}textarea{overflow:auto;vertical-align:top}table{border-collapse:collapse;border-spacing:0}[hidden]{display:none!important}.pure-img{max-width:100%;height:auto;display:block}.pure-g{letter-spacing:-.31em;*letter-spacing:normal;*word-spacing:-.43em;text-rendering:optimizespeed;font-family:FreeSans,Arimo,"Droid Sans",Helvetica,Arial,sans-serif;display:-webkit-flex;-webkit-flex-flow:row wrap;display:-ms-flexbox;-ms-flex-flow:row wrap}.opera-only :-o-prefocus,.pure-g{word-spacing:-.43em}.pure-u{display:inline-block;*display:inline;zoom:1;letter-spacing:normal;word-spacing:normal;vertical-align:top;text-rendering:auto}.pure-g [class *="pure-u"]{font-family:sans-serif}.pure-u-1,.pure-u-1-1,.pure-u-1-2,.pure-u-1-3,.pure-u-2-3,.pure-u-1-4,.pure-u-3-4,.pure-u-1-5,.pure-u-2-5,.pure-u-3-5,.pure-u-4-5,.pure-u-5-5,.pure-u-1-6,.pure-u-5-6,.pure-u-1-8,.pure-u-3-8,.pure-u-5-8,.pure-u-7-8,.pure-u-1-12,.pure-u-5-12,.pure-u-7-12,.pure-u-11-12,.pure-u-1-24,.pure-u-2-24,.pure-u-3-24,.pure-u-4-24,.pure-u-5-24,.pure-u-6-24,.pure-u-7-24,.pure-u-8-24,.pure-u-9-24,.pure-u-10-24,.pure-u-11-24,.pure-u-12-24,.pure-u-13-24,.pure-u-14-24,.pure-u-15-24,.pure-u-16-24,.pure-u-17-24,.pure-u-18-24,.pure-u-19-24,.pure-u-20-24,.pure-u-21-24,.pure-u-22-24,.pure-u-23-24,.pure-u-24-24{display:inline-block;*display:inline;zoom:1;letter-spacing:normal;word-spacing:normal;vertical-align:top;text-rendering:auto}.pure-u-1-24{width:4.1667%;*width:4.1357%}.pure-u-1-12,.pure-u-2-24{width:8.3333%;*width:8.3023%}.pure-u-1-8,.pure-u-3-24{width:12.5%;*width:12.469%}.pure-u-1-6,.pure-u-4-24{width:16.6667%;*width:16.6357%}.pure-u-1-5{width:20%;*width:19.969%}.pure-u-5-24{width:20.8333%;*width:20.8023%}.pure-u-1-4,.pure-u-6-24{width:25%;*width:24.969%}.pure-u-7-24{width:29.1667%;*width:29.1357%}.pure-u-1-3,.pure-u-8-24{width:33.3333%;*width:33.3023%}.pure-u-3-8,.pure-u-9-24{width:37.5%;*width:37.469%}.pure-u-2-5{width:40%;*width:39.969%}.pure-u-5-12,.pure-u-10-24{width:41.6667%;*width:41.6357%}.pure-u-11-24{width:45.8333%;*width:45.8023%}.pure-u-1-2,.pure-u-12-24{width:50%;*width:49.969%}.pure-u-13-24{width:54.1667%;*width:54.1357%}.pure-u-7-12,.pure-u-14-24{width:58.3333%;*width:58.3023%}.pure-u-3-5{width:60%;*width:59.969%}.pure-u-5-8,.pure-u-15-24{width:62.5%;*width:62.469%}.pure-u-2-3,.pure-u-16-24{width:66.6667%;*width:66.6357%}.pure-u-17-24{width:70.8333%;*width:70.8023%}.pure-u-3-4,.pure-u-18-24{width:75%;*width:74.969%}.pure-u-19-24{width:79.1667%;*width:79.1357%}.pure-u-4-5{width:80%;*width:79.969%}.pure-u-5-6,.pure-u-20-24{width:83.3333%;*width:83.3023%}.pure-u-7-8,.pure-u-21-24{width:87.5%;*width:87.469%}.pure-u-11-12,.pure-u-22-24{width:91.6667%;*width:91.6357%}.pure-u-23-24{width:95.8333%;*width:95.8023%}.pure-u-1,.pure-u-1-1,.pure-u-5-5,.pure-u-24-24{width:100%}.pure-button{display:inline-block;*display:inline;zoom:1;line-height:normal;white-space:nowrap;vertical-align:baseline;text-align:center;cursor:pointer;-webkit-user-drag:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.pure-button::-moz-focus-inner{padding:0;border:0}.pure-button{font-family:inherit;font-size:100%;*font-size:90%;*overflow:visible;padding:.5em 1em;color:#444;color:rgba(0,0,0,.8);*color:#444;border:1px solid #999;border:0 rgba(0,0,0,0);background-color:#E6E6E6;text-decoration:none;border-radius:2px}.pure-button-hover,.pure-button:hover,.pure-button:focus{filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#1a000000', GradientType=0);background-image:-webkit-gradient(linear,0 0,0 100%,from(transparent),color-stop(40%,rgba(0,0,0,.05)),to(rgba(0,0,0,.1)));background-image:-webkit-linear-gradient(transparent,rgba(0,0,0,.05) 40%,rgba(0,0,0,.1));background-image:-moz-linear-gradient(top,rgba(0,0,0,.05) 0,rgba(0,0,0,.1));background-image:-o-linear-gradient(transparent,rgba(0,0,0,.05) 40%,rgba(0,0,0,.1));background-image:linear-gradient(transparent,rgba(0,0,0,.05) 40%,rgba(0,0,0,.1))}.pure-button:focus{outline:0}.pure-button-active,.pure-button:active{box-shadow:0 0 0 1px rgba(0,0,0,.15) inset,0 0 6px rgba(0,0,0,.2) inset}.pure-button[disabled],.pure-button-disabled,.pure-button-disabled:hover,.pure-button-disabled:focus,.pure-button-disabled:active{border:0;background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);filter:alpha(opacity=40);-khtml-opacity:.4;-moz-opacity:.4;opacity:.4;cursor:not-allowed;box-shadow:none}.pure-button-hidden{display:none}.pure-button::-moz-focus-inner{padding:0;border:0}.pure-button-primary,.pure-button-selected,a.pure-button-primary,a.pure-button-selected{background-color:#0078e7;color:#fff}.pure-form input[type=text],.pure-form input[type=password],.pure-form input[type=email],.pure-form input[type=url],.pure-form input[type=date],.pure-form input[type=month],.pure-form input[type=time],.pure-form input[type=datetime],.pure-form input[type=datetime-local],.pure-form input[type=week],.pure-form input[type=number],.pure-form input[type=search],.pure-form input[type=tel],.pure-form input[type=color],.pure-form select,.pure-form textarea{padding:.5em .6em;display:inline-block;border:1px solid #ccc;box-shadow:inset 0 1px 3px #ddd;border-radius:4px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.pure-form input:not([type]){padding:.5em .6em;display:inline-block;border:1px solid #ccc;box-shadow:inset 0 1px 3px #ddd;border-radius:4px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.pure-form input[type=color]{padding:.2em .5em}.pure-form input[type=text]:focus,.pure-form input[type=password]:focus,.pure-form input[type=email]:focus,.pure-form input[type=url]:focus,.pure-form input[type=date]:focus,.pure-form input[type=month]:focus,.pure-form input[type=time]:focus,.pure-form input[type=datetime]:focus,.pure-form input[type=datetime-local]:focus,.pure-form input[type=week]:focus,.pure-form input[type=number]:focus,.pure-form input[type=search]:focus,.pure-form input[type=tel]:focus,.pure-form input[type=color]:focus,.pure-form select:focus,.pure-form textarea:focus{outline:0;outline:thin dotted \9;border-color:#129FEA}.pure-form input:not([type]):focus{outline:0;outline:thin dotted \9;border-color:#129FEA}.pure-form input[type=file]:focus,.pure-form input[type=radio]:focus,.pure-form input[type=checkbox]:focus{outline:thin dotted #333;outline:1px auto #129FEA}.pure-form .pure-checkbox,.pure-form .pure-radio{margin:.5em 0;display:block}.pure-form input[type=text][disabled],.pure-form input[type=password][disabled],.pure-form input[type=email][disabled],.pure-form input[type=url][disabled],.pure-form input[type=date][disabled],.pure-form input[type=month][disabled],.pure-form input[type=time][disabled],.pure-form input[type=datetime][disabled],.pure-form input[type=datetime-local][disabled],.pure-form input[type=week][disabled],.pure-form input[type=number][disabled],.pure-form input[type=search][disabled],.pure-form input[type=tel][disabled],.pure-form input[type=color][disabled],.pure-form select[disabled],.pure-form textarea[disabled]{cursor:not-allowed;background-color:#eaeded;color:#cad2d3}.pure-form input:not([type])[disabled]{cursor:not-allowed;background-color:#eaeded;color:#cad2d3}.pure-form input[readonly],.pure-form select[readonly],.pure-form textarea[readonly]{background:#eee;color:#777;border-color:#ccc}.pure-form input:focus:invalid,.pure-form textarea:focus:invalid,.pure-form select:focus:invalid{color:#b94a48;border-color:#ee5f5b}.pure-form input:focus:invalid:focus,.pure-form textarea:focus:invalid:focus,.pure-form select:focus:invalid:focus{border-color:#e9322d}.pure-form input[type=file]:focus:invalid:focus,.pure-form input[type=radio]:focus:invalid:focus,.pure-form input[type=checkbox]:focus:invalid:focus{outline-color:#e9322d}.pure-form select{border:1px solid #ccc;background-color:#fff}.pure-form select[multiple]{height:auto}.pure-form label{margin:.5em 0 .2em}.pure-form fieldset{margin:0;padding:.35em 0 .75em;border:0}.pure-form legend{display:block;width:100%;padding:.3em 0;margin-bottom:.3em;color:#333;border-bottom:1px solid #e5e5e5}.pure-form-stacked input[type=text],.pure-form-stacked input[type=password],.pure-form-stacked input[type=email],.pure-form-stacked input[type=url],.pure-form-stacked input[type=date],.pure-form-stacked input[type=month],.pure-form-stacked input[type=time],.pure-form-stacked input[type=datetime],.pure-form-stacked input[type=datetime-local],.pure-form-stacked input[type=week],.pure-form-stacked input[type=number],.pure-form-stacked input[type=search],.pure-form-stacked input[type=tel],.pure-form-stacked input[type=color],.pure-form-stacked select,.pure-form-stacked label,.pure-form-stacked textarea{display:block;margin:.25em 0}.pure-form-stacked input:not([type]){display:block;margin:.25em 0}.pure-form-aligned input,.pure-form-aligned textarea,.pure-form-aligned select,.pure-form-aligned .pure-help-inline,.pure-form-message-inline{display:inline-block;*display:inline;*zoom:1;vertical-align:middle}.pure-form-aligned textarea{vertical-align:top}.pure-form-aligned .pure-control-group{margin-bottom:.5em}.pure-form-aligned .pure-control-group label{text-align:right;display:inline-block;vertical-align:middle;width:10em;margin:0 1em 0 0}.pure-form-aligned .pure-controls{margin:1.5em 0 0 10em}.pure-form input.pure-input-rounded,.pure-form .pure-input-rounded{border-radius:2em;padding:.5em 1em}.pure-form .pure-group fieldset{margin-bottom:10px}.pure-form .pure-group input{display:block;padding:10px;margin:0;border-radius:0;position:relative;top:-1px}.pure-form .pure-group input:focus{z-index:2}.pure-form .pure-group input:first-child{top:1px;border-radius:4px 4px 0 0}.pure-form .pure-group input:last-child{top:-2px;border-radius:0 0 4px 4px}.pure-form .pure-group button{margin:.35em 0}.pure-form .pure-input-1{width:100%}.pure-form .pure-input-2-3{width:66%}.pure-form .pure-input-1-2{width:50%}.pure-form .pure-input-1-3{width:33%}.pure-form .pure-input-1-4{width:25%}.pure-form .pure-help-inline,.pure-form-message-inline{display:inline-block;padding-left:.3em;color:#666;vertical-align:middle;font-size:.875em}.pure-form-message{display:block;color:#666;font-size:.875em}@media only screen and (max-width :480px){.pure-form button[type=submit]{margin:.7em 0 0}.pure-form input:not([type]),.pure-form input[type=text],.pure-form input[type=password],.pure-form input[type=email],.pure-form input[type=url],.pure-form input[type=date],.pure-form input[type=month],.pure-form input[type=time],.pure-form input[type=datetime],.pure-form input[type=datetime-local],.pure-form input[type=week],.pure-form input[type=number],.pure-form input[type=search],.pure-form input[type=tel],.pure-form input[type=color],.pure-form label{margin-bottom:.3em;display:block}.pure-group input:not([type]),.pure-group input[type=text],.pure-group input[type=password],.pure-group input[type=email],.pure-group input[type=url],.pure-group input[type=date],.pure-group input[type=month],.pure-group input[type=time],.pure-group input[type=datetime],.pure-group input[type=datetime-local],.pure-group input[type=week],.pure-group input[type=number],.pure-group input[type=search],.pure-group input[type=tel],.pure-group input[type=color]{margin-bottom:0}.pure-form-aligned .pure-control-group label{margin-bottom:.3em;text-align:left;display:block;width:100%}.pure-form-aligned .pure-controls{margin:1.5em 0 0}.pure-form .pure-help-inline,.pure-form-message-inline,.pure-form-message{display:block;font-size:.75em;padding:.2em 0 .8em}}.pure-menu ul{position:absolute;visibility:hidden}.pure-menu.pure-menu-open{visibility:visible;z-index:2;width:100%}.pure-menu ul{left:-10000px;list-style:none;margin:0;padding:0;top:-10000px;z-index:1}.pure-menu>ul{position:relative}.pure-menu-open>ul{left:0;top:0;visibility:visible}.pure-menu-open>ul:focus{outline:0}.pure-menu li{position:relative}.pure-menu a,.pure-menu .pure-menu-heading{display:block;color:inherit;line-height:1.5em;padding:5px 20px;text-decoration:none;white-space:nowrap}.pure-menu.pure-menu-horizontal>.pure-menu-heading{display:inline-block;*display:inline;zoom:1;margin:0;vertical-align:middle}.pure-menu.pure-menu-horizontal>ul{display:inline-block;*display:inline;zoom:1;vertical-align:middle}.pure-menu li a{padding:5px 20px}.pure-menu-can-have-children>.pure-menu-label:after{content:'\25B8';float:right;font-family:'Lucida Grande','Lucida Sans Unicode','DejaVu Sans',sans-serif;margin-right:-20px;margin-top:-1px}.pure-menu-can-have-children>.pure-menu-label{padding-right:30px}.pure-menu-separator{background-color:#dfdfdf;display:block;height:1px;font-size:0;margin:7px 2px;overflow:hidden}.pure-menu-hidden{display:none}.pure-menu-fixed{position:fixed;top:0;left:0;width:100%}.pure-menu-horizontal li{display:inline-block;*display:inline;zoom:1;vertical-align:middle}.pure-menu-horizontal li li{display:block}.pure-menu-horizontal>.pure-menu-children>.pure-menu-can-have-children>.pure-menu-label:after{content:"\25BE"}.pure-menu-horizontal>.pure-menu-children>.pure-menu-can-have-children>.pure-menu-label{padding-right:30px}.pure-menu-horizontal li.pure-menu-separator{height:50%;width:1px;margin:0 7px}.pure-menu-horizontal li li.pure-menu-separator{height:1px;width:auto;margin:7px 2px}.pure-menu.pure-menu-open,.pure-menu.pure-menu-horizontal li .pure-menu-children{background:#fff;border:1px solid #b7b7b7}.pure-menu.pure-menu-horizontal,.pure-menu.pure-menu-horizontal .pure-menu-heading{border:0}.pure-menu a{border:1px solid transparent;border-left:0;border-right:0}.pure-menu a,.pure-menu .pure-menu-can-have-children>li:after{color:#777}.pure-menu .pure-menu-can-have-children>li:hover:after{color:#fff}.pure-menu .pure-menu-open{background:#dedede}.pure-menu li a:hover,.pure-menu li a:focus{background:#eee}.pure-menu li.pure-menu-disabled a:hover,.pure-menu li.pure-menu-disabled a:focus{background:#fff;color:#bfbfbf}.pure-menu .pure-menu-disabled>a{background-image:none;border-color:transparent;cursor:default}.pure-menu .pure-menu-disabled>a,.pure-menu .pure-menu-can-have-children.pure-menu-disabled>a:after{color:#bfbfbf}.pure-menu .pure-menu-heading{color:#565d64;text-transform:uppercase;font-size:90%;margin-top:.5em;border-bottom-width:1px;border-bottom-style:solid;border-bottom-color:#dfdfdf}.pure-menu .pure-menu-selected a{color:#000}.pure-menu.pure-menu-open.pure-menu-fixed{border:0;border-bottom:1px solid #b7b7b7}.pure-paginator{letter-spacing:-.31em;*letter-spacing:normal;*word-spacing:-.43em;text-rendering:optimizespeed;list-style:none;margin:0;padding:0}.opera-only :-o-prefocus,.pure-paginator{word-spacing:-.43em}.pure-paginator li{display:inline-block;*display:inline;zoom:1;letter-spacing:normal;word-spacing:normal;vertical-align:top;text-rendering:auto}.pure-paginator .pure-button{border-radius:0;padding:.8em 1.4em;vertical-align:top;height:1.1em}.pure-paginator .pure-button:focus,.pure-paginator .pure-button:active{outline-style:none}.pure-paginator .prev,.pure-paginator .next{color:#C0C1C3;text-shadow:0 -1px 0 rgba(0,0,0,.45)}.pure-paginator .prev{border-radius:2px 0 0 2px}.pure-paginator .next{border-radius:0 2px 2px 0}@media (max-width:480px){.pure-menu-horizontal{width:100%}.pure-menu-children li{display:block;border-bottom:1px solid #000}}.pure-table{border-collapse:collapse;border-spacing:0;empty-cells:show;border:1px solid #cbcbcb}.pure-table caption{color:#000;font:italic 85%/1 arial,sans-serif;padding:1em 0;text-align:center}.pure-table td,.pure-table th{border-left:1px solid #cbcbcb;border-width:0 0 0 1px;font-size:inherit;margin:0;overflow:visible;padding:.5em 1em}.pure-table td:first-child,.pure-table th:first-child{border-left-width:0}.pure-table thead{background:#e0e0e0;color:#000;text-align:left;vertical-align:bottom}.pure-table td{background-color:transparent}.pure-table-odd td{background-color:#f2f2f2}.pure-table-striped tr:nth-child(2n-1) td{background-color:#f2f2f2}.pure-table-bordered td{border-bottom:1px solid #cbcbcb}.pure-table-bordered tbody>tr:last-child td,.pure-table-horizontal tbody>tr:last-child td{border-bottom-width:0}.pure-table-horizontal td,.pure-table-horizontal th{border-width:0 0 1px;border-bottom:1px solid #cbcbcb}.pure-table-horizontal tbody>tr:last-child td{border-bottom-width:0} + +/* --- QDNAseq extra CSS --- */ body{ padding: 0px 20px; } pre { padding: 0px 25px; } h3.qdnaseq{ color: #355681; border-bottom: 1px solid #355681;} diff -r acf62630e4b5 -r 81ba2f857fe2 tool_dependencies.xml --- a/tool_dependencies.xml Thu Nov 06 05:48:52 2014 -0500 +++ b/tool_dependencies.xml Wed Mar 04 08:42:14 2015 -0500 @@ -5,7 +5,7 @@ - +
Type", binSizes, "kbp
', html_copy_thumb, '', region_count, ' (', html_bedGraph, ')