diff --git a/deep_sequencing_unit/.gitignore b/deep_sequencing_unit/.gitignore deleted file mode 100644 index 12cf78902707d9fcf5c297c001f38a59242ffbd1..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/.gitignore +++ /dev/null @@ -1,10 +0,0 @@ -/.shredder -/.settings -/test-output -/temp-testng-customsuite.xml -/targets -/bin -/build -/.idea/ -*.iml -*.eml \ No newline at end of file diff --git a/deep_sequencing_unit/.pydevproject b/deep_sequencing_unit/.pydevproject deleted file mode 100644 index a9cca037b33037ebc3232e6b63f3f00283463a4e..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/.pydevproject +++ /dev/null @@ -1,7 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?> -<?eclipse-pydev version="1.0"?> - -<pydev_project> -<pydev_property name="org.python.pydev.PYTHON_PROJECT_INTERPRETER">Default</pydev_property> -<pydev_property name="org.python.pydev.PYTHON_PROJECT_VERSION">python 2.7</pydev_property> -</pydev_project> diff --git a/deep_sequencing_unit/.shadow_dependencies b/deep_sequencing_unit/.shadow_dependencies deleted file mode 100644 index d3dfcd195f766d41162f2ef30eaa56ea78fa6a78..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/.shadow_dependencies +++ /dev/null @@ -1,4 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<classpath> - <classpathentry kind="lib" path="/libraries/openbis-apis"/> -</classpath> diff --git a/deep_sequencing_unit/HOW_TO_FIX_FAILING_CI_BUILD.txt b/deep_sequencing_unit/HOW_TO_FIX_FAILING_CI_BUILD.txt deleted file mode 100644 index 94f6ee1dcdffab64e1d8e3dcc01cfb461bb3b2cf..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/HOW_TO_FIX_FAILING_CI_BUILD.txt +++ /dev/null @@ -1,25 +0,0 @@ -Problem: - -java.lang.IllegalArgumentException: No dump file found. - at ch.ethz.bsse.cisd.dsu.dss.systemtests.DSUTestInitializer.init(DSUTestInitializer.java:71) - at ch.ethz.bsse.cisd.dsu.dss.systemtests.DSUDropboxSystemTest.beforeSuite(DSUDropboxSystemTest.java:33) - -Solution: - -ssh jenkins (i.e. ci@bs-ci01.ethz.ch) -cd ~/jenkins/workspace_fast/deep_sequencing_unit/resource/test-db -ln -s ../../../../test-db/openbis_test_qgf.dmp openbis_test_qgf.dmp -ls -la - -Problem: - -Caused by: ch.systemsx.cisd.common.exceptions.ConfigurationFailureException: Store root 'targets/playground/store' does not exist. - at ch.systemsx.cisd.common.exceptions.ConfigurationFailureException.fromTemplate(ConfigurationFailureException.java:49) - at ch.systemsx.cisd.openbis.dss.generic.server.plugins.standard.AbstractDatastorePlugin.<init>(AbstractDatastorePlugin.java:66) - at ch.systemsx.cisd.openbis.dss.generic.server.plugins.standard.AbstractDatastorePlugin.<init>(AbstractDatastorePlugin.java:58) - -Solution: - -ssh jenkins (i.e. ci@bs-ci01.ethz.ch) -cd ~/jenkins/workspace_fast/deep_sequencing_unit/targets -mkdir -p playground/store diff --git a/deep_sequencing_unit/build.gradle b/deep_sequencing_unit/build.gradle deleted file mode 100644 index 6133f7e7adad37bb6b2b3b94fbfce7dd6ce1a27b..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/build.gradle +++ /dev/null @@ -1,117 +0,0 @@ -evaluationDependsOn(':commonbase') -evaluationDependsOn(':common') -evaluationDependsOn(':openbis_api') -evaluationDependsOn(':openbis-common') -evaluationDependsOn(':authentication') -evaluationDependsOn(':dbmigration') -evaluationDependsOn(':openbis') -evaluationDependsOn(':datastore_server') - -apply from: '../gradle/javaproject.gradle' - -archivesBaseName = 'datastore_server_plugin-dsu' - -configurations.create('trackingClient') -configurations.create('trackingClientPartial') -dependencies { - api project(':common'), - project(':openbis-common'), - project(':openbis_api'), - project(':openbis'), - project(':datastore_server'), - 'apache:commons-cli:1.2' - - - testImplementation project(path: ':commonbase', configuration: 'tests'), - project(path: ':common', configuration: 'tests'), - project(path: ':dbmigration', configuration: 'tests'), - project(path: ':authentication', configuration: 'tests'), - project(path: ':openbis_api', configuration: 'tests'), - project(path: ':openbis-common', configuration: 'tests'), - project(path: ':openbis', configuration: 'tests'), - project(path: ':datastore_server', configuration: 'tests'), - 'fjelmer:classycle:1.4.2', - 'testng:testng:6.8-CISD' - - trackingClient 'sis:sis-base:18.09.0', - 'javax:mail:1.4.3', - 'apache:log4j:1.2.15', - 'springframework:spring-aop:5.0.1.RELEASE', - 'springframework:spring-beans:5.0.1.RELEASE', - 'springframework:spring-context:5.0.1.RELEASE', - 'springframework:spring-core:5.0.1.RELEASE', - 'springframework:spring-web:5.0.1.RELEASE', - 'springframework:spring-webmvc:5.0.1.RELEASE', - 'springframework:spring-expression:5.0.1.RELEASE', - 'marathon:marathon-spring-util:1.2.5', - 'apache:httpclient:4.3.6', - 'apache:httpcore:4.3.3', - 'apache:commons-logging:1.2', - 'aopalliance:aopalliance:1.0', - 'apache:commons-cli:1.2' - - trackingClientPartial 'google:gwt-user:2.4' -} - -task trackingJar(type: Jar) { - archiveName "openbis-tracking-qgf-client.jar" - - from zipTree(project(':common').jar.archivePath).plus( - zipTree(project(':openbis-common').jar.archivePath).plus( - zipTree(project(':commonbase').jar.archivePath).plus( - zipTree(project(':openbis_api').jar.archivePath).plus( - zipTree(project(':datastore_server').jar.archivePath).plus( - zipTree(project(':openbis').jar.archivePath)))))).matching { - include '**/*.class' - } - - from zipTree(configurations.trackingClientPartial.files.iterator().next()).matching { - include '**/com/google/gwt/user/client/rpc/IsSerializable.class' - include '**/com/google/gwt/user/client/rpc/SerializableException.class' - } - - from (sourceSets.main.output.classesDirs) { - include '**/*' - } - - manifest { - attributes 'Main-Class': 'ch.ethz.bsse.cisd.dsu.tracking.main.TrackingClient', - "Class-Path": configurations.trackingClient.files.collect { it.getName() }.join(' ') - } -} - -task trackingZip(type: Zip, dependsOn: [trackingJar]) { - baseName = "openbis-tracking-qgf-client" - - from (trackingJar.archivePath) { - into "tracking-${project.version}/lib" - } - - from (configurations.trackingClient.files) { - into "tracking-${project.version}/lib" - } - - from ('tracking/dist/etc') { - into "tracking-${project.version}/etc" - } - - from ('tracking/dist/tracking.sh') { - into "tracking-${project.version}/" - } -} - -task zip(type: Zip) { - includeEmptyDirs false - from (jar.archivePath) { - into 'datastore_server/lib/' - rename 'datastore_server_plugin-dsu(.*)\\.jar', 'datastore_server_plugin-dsu.jar' - } - - from (fileTree(dir: 'source/core-plugins', includes:['illumina-ngs/**'], excludes:['**/as/**', '**/package-to-dist'])) { - into 'core-plugins' - } -} - -zip.dependsOn jar -build.dependsOn zip -build.dependsOn trackingZip \ No newline at end of file diff --git a/deep_sequencing_unit/createInvoices/dist/createInvoices.sh b/deep_sequencing_unit/createInvoices/dist/createInvoices.sh deleted file mode 100644 index 74d823767269873bb222bc6859a40087a4cb49b5..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/createInvoices/dist/createInvoices.sh +++ /dev/null @@ -1,4 +0,0 @@ -LIB=/home/sbsuser/openbis/createInvoices/lib/ -CLASSPATH=/home/sbsuser/openbis/createInvoices/lib/ -cd $LIB/.. -java -cp $LIB/dom4j-1.6.1.jar:$LIB/geronimo-stax-api_1.0_spec-1.0.jar:$LIB/openbis-query-api.jar:$LIB/dss_client.jar:jython.jar:$LIB/stream-supporting-httpinvoker.jar:$LIB/spring.jar:commons-logging.jar:$LIB/commons-httpclient.jar:$LIB/commons-codec.jar:$LIB/commons-lang.jar:$LIB/log5j.jar:$LIB/poi.jar:$LIB/poi-ooxml.jar:$LIB/poi-ooxml-schemas.jar org.python.util.jython create_QGF_Invoices_simplified.py "$@" \ No newline at end of file diff --git a/deep_sequencing_unit/createInvoices/dist/etc/service.properties b/deep_sequencing_unit/createInvoices/dist/etc/service.properties deleted file mode 100644 index 5ac20ddbe85b30936c970bd68411dfcbdbcbc233..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/createInvoices/dist/etc/service.properties +++ /dev/null @@ -1,23 +0,0 @@ -# Config file for QGF Invoicing -[GENERAL] -facilityName = Quantitative Genomics Facility -facilityNameShort = QGF -facilityInstitution = ETHZ_D-BSSE -mailList = mail@myinstitute.ch -mailFrom = invoicing@myinstitute.ch -smptHost = <smtpHost> -separator = , -indexSeparator = - - -[OPENBIS] -openbisServer = http://<openbisserver>:8080 -openbisUserName = <username> -openbisPassword = <password> -connectionTimeout = 5000 -principalInvestigator = PRINCIPAL_INVESTIGATOR -sampleCodePrefix = BSSE-QGF- - -[EXCEL] -defaultFonts = Calibri - -jython-version=2.7 diff --git a/deep_sequencing_unit/createInvoices/dist/log/.gitignore b/deep_sequencing_unit/createInvoices/dist/log/.gitignore deleted file mode 100644 index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..0000000000000000000000000000000000000000 diff --git a/deep_sequencing_unit/createsamplesheet/dist/createSampleSheet.sh b/deep_sequencing_unit/createsamplesheet/dist/createSampleSheet.sh deleted file mode 100755 index 05c34e7514bbbc429a105fd4820903a6e681d88f..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/createsamplesheet/dist/createSampleSheet.sh +++ /dev/null @@ -1,30 +0,0 @@ -#!/bin/bash -# -# Launch script for CISD openBIS Create Sample Sheet for Illumina NGS -# Runs on Unix / Linux systems. -# ------------------------------------------------------------------------- - -JYTHON_FILE=createSampleSheet.py - -# -# change to installation directory -# -bin=$0 -if [ -L $bin ]; then - bin=`dirname $bin`/`readlink $bin` -fi -WD=`dirname $bin` -cd $WD -SCRIPT=./`basename $0` - -if [ "$JAVA_HOME" != "" ]; then - JAVA_BIN="$JAVA_HOME/bin/java" -else - JAVA_BIN="java" -fi - -ALL_JAVA_OPTS="-Djavax.net.ssl.trustStore=etc/openBIS.keystore $JAVA_OPTS" - -LIB="lib" -# echo "Starting Sample Sheet Creator for openBIS Illumina NGS" -${JAVA_BIN} ${ALL_JAVA_OPTS} -cp ${LIB}/commons-codec.jar:${LIB}/commons-httpclient.jar:${LIB}/commons-logging.jar:${LIB}/dss_client.jar:${LIB}/spring.jar:${LIB}/stream-supporting-httpinvoker.jar:${LIB}/jython.jar org.python.util.jython $JYTHON_FILE "$@" diff --git a/deep_sequencing_unit/createsamplesheet/dist/createSampleSheet_nov.sh b/deep_sequencing_unit/createsamplesheet/dist/createSampleSheet_nov.sh deleted file mode 100644 index d6046d9203349535b75728351f910ba4c158743f..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/createsamplesheet/dist/createSampleSheet_nov.sh +++ /dev/null @@ -1,30 +0,0 @@ -#!/bin/bash -# -# Launch script for CISD openBIS Create Sample Sheet for Illumina NGS -# Runs on Unix / Linux systems. -# ------------------------------------------------------------------------- - -JYTHON_FILE=createSampleSheet_nov.py - -# -# change to installation directory -# -bin=$0 -if [ -L $bin ]; then - bin=`dirname $bin`/`readlink $bin` -fi -WD=`dirname $bin` -cd $WD -SCRIPT=./`basename $0` - -if [ "$JAVA_HOME" != "" ]; then - JAVA_BIN="$JAVA_HOME/bin/java" -else - JAVA_BIN="java" -fi - -ALL_JAVA_OPTS="-Djavax.net.ssl.trustStore=etc/openBIS.keystore $JAVA_OPTS" - -LIB="lib" -# echo "Starting Sample Sheet Creator for openBIS Illumina NGS" -${JAVA_BIN} ${ALL_JAVA_OPTS} -cp ${LIB}/commons-codec.jar:${LIB}/commons-httpclient.jar:${LIB}/commons-logging.jar:${LIB}/dss_client.jar:${LIB}/spring.jar:${LIB}/stream-supporting-httpinvoker.jar:${LIB}/jython.jar org.python.util.jython $JYTHON_FILE "$@" \ No newline at end of file diff --git a/deep_sequencing_unit/createsamplesheet/dist/etc/createSampleSheet.properties b/deep_sequencing_unit/createsamplesheet/dist/etc/createSampleSheet.properties deleted file mode 100644 index 82e5adc3f18cfc8a59f7376396cbbf18f7bbb7d2..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/createsamplesheet/dist/etc/createSampleSheet.properties +++ /dev/null @@ -1,55 +0,0 @@ -# Config file for Illumina Sample Sheet Creation - -[GENERAL] -facilityName = Quantitative Genomics Facility -facilityNameShort = QGF -facilityInstitution = ETHZ_D-BSSE -mailList = mail@ethz.ch -mailFrom = SampleSheetCreator@ethz.ch -smptHost = smtphost.ethz.ch -SampleSheetFileName = SampleSheet -separator = , -indexSeparator = - - -[OPENBIS] -openbisServer = http://<openbis-server>:<port> -openbisUserName = <username> -openbisPassword = <password> -connectionTimeout = 5000 -illuminaFlowCellTypeName = ILLUMINA_FLOW_CELL -index1Name = BARCODE -index2Name = INDEX2 -index1Length = INDEXREAD -index2Length = INDEXREAD2 -endType = END_TYPE -cycles = CYCLES_REQUESTED_BY_CUSTOMER -controlLane = CONTROL_LANE -ncbi = NCBI_ORGANISM_TAXONOMY -externalSampleName = EXTERNAL_SAMPLE_NAME -laneCount = LANECOUNT - -[ILLUMINA] -hiSeqNames = SN792 SN100 -miSeqNames = M00721 M00100 -hiSeqHeader = FCID,Lane,SampleID,SampleRef,Index,Description,Control,Recipe,Operator,SampleProject - -miSeqHeaderSection = [Header], IEMFileVersion, Investigator Name, Project Name,Experiment Name, Date, Workflow, Application, Assay, Description, Chemistry -miSeqReadsSection = [Reads] -miSeqSettingsSection = [Settings], Adapter -miSeqDataSection = [Data], Sample_ID Sample_Name Sample_Plate Sample_Well I7_Index_ID index Sample_Project Description - -miSeqWorkflow = GenerateFASTQ -miSeqApplication = FASTQ Only -miSeqChemistry = Amplicon - -truSeqAdapter = Adapter,AGATCGGAAGAGCACACGTC -nexteraAdapter = Adapter,CTGTCTCTTATACACATCT -iemFileVersion = 4 - -configureBclToFastqPath = /usr/local/bin/configureBclToFastq.pl -failedReads = --with-failed-reads -clusterCount = --fastq-cluster-count -clusterCountNumber = 50000000 -outputDir = --output-dir -sampleSheetName = --sample-sheet -baseMask = --use-bases-mask \ No newline at end of file diff --git a/deep_sequencing_unit/createsamplesheet/dist/etc/createSampleSheet_nov.properties b/deep_sequencing_unit/createsamplesheet/dist/etc/createSampleSheet_nov.properties deleted file mode 100644 index e8f710e8d66d773caf371494a8a587380405b6f3..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/createsamplesheet/dist/etc/createSampleSheet_nov.properties +++ /dev/null @@ -1,34 +0,0 @@ -# Config file for Illumina Sample Sheet Creation - -[GENERAL] -facilityName = Novartis -facilityNameShort = NOV -facilityInstitution = Novartis_NIBR_NGS -sampleSheetFileName = SampleSheet -lanePrefix = S_ - -separator = , -indexSeparator = - - -[OPENBIS] -openbisServer = https://localhost:8443 -openbisUserName = admin -openbisPassword = admin -connectionTimeout = 5000 - -illuminaFlowCellTypeName = FLOWCELL -index1Name = INDEX_1 -index2Name = INDEX_2 -species = SPECIES -sampleName = SAMPLE_NAME -operator = OPERATOR -endType = END_TYPE -readLength = READ_LEN -lengthIndex1 = LENGTH_OF_INDEX1 -lengthIndex2 = LENGTH_OF_INDEX2 -gaNumber = GA_NUMBER_L - -[ILLUMINA] -hiSeqNames = SN792 SN100 -miSeqNames = M00721 M00100 -hiSeqHeader = FCID,Lane,SampleID,SampleRef,Index,Description,Control,Recipe,Operator,SampleProject \ No newline at end of file diff --git a/deep_sequencing_unit/createsamplesheet/dist/etc/openBIS.keystore b/deep_sequencing_unit/createsamplesheet/dist/etc/openBIS.keystore deleted file mode 100644 index 28d6c1945533908c76f28785953cbed4004c4555..0000000000000000000000000000000000000000 Binary files a/deep_sequencing_unit/createsamplesheet/dist/etc/openBIS.keystore and /dev/null differ diff --git a/deep_sequencing_unit/createsamplesheet/dist/log/.gitignore b/deep_sequencing_unit/createsamplesheet/dist/log/.gitignore deleted file mode 100644 index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..0000000000000000000000000000000000000000 diff --git a/deep_sequencing_unit/dist/etc/data-set-handler-alignment.py b/deep_sequencing_unit/dist/etc/data-set-handler-alignment.py deleted file mode 100755 index 52530a1fef847703a250377353407a3c8255bf65..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/dist/etc/data-set-handler-alignment.py +++ /dev/null @@ -1,137 +0,0 @@ -''' -This is handling bowtie-BAM files and extracts some properties from the BAM header and -the samtools flagstat command. The results are formatted and attached as a property -to the openBIS DataSet. -Prerequisites are the DataSetType: ALIGNMENT and -the following properties assigned to the DataSetType mentioned above: -ALIGNMENT_SOFTWARE, ISSUED_COMMAND, SAMTOOLS_FLAGSTAT, -TOTAL_READS, MAPPED_READS - -Obviously you need a working samtools binary - -Uses 'flagstat' and 'view -H' - -Note: -print statements go to: ~openbis/sprint/datastore_server/log/startup_log.txt -''' - -import os -import fnmatch -import re -from ch.systemsx.cisd.openbis.generic.shared.api.v1.dto import SearchCriteria -from ch.systemsx.cisd.openbis.generic.shared.api.v1.dto import SearchSubCriteria - -FOLDER='/links/shared/dsu-dss/dss/incoming-jython-alignment/' -SAMTOOLS='/usr/local/dsu/samtools/samtools' -BAM_PATTERN='*.bam' - -matches = [] -searchStrings = ['@PG'] -programList = [] - -# Create a "transaction" -- a way of grouping operations together so they all -# happen or none of them do. -transaction = service.transaction() - -# Create a data set and set type -dataSet = transaction.createNewDataSet("ALIGNMENT") -dataSet.setMeasuredData(False) - -incomingPath = incoming.getAbsolutePath() - -# Get the incoming name -# expected: -# Project_110907_SN792_0059_AC012FACXX_3/Sample_BSSE-DSU-1662/BSSE-DSU-1662_CGATGTA_L003_R1_001_sorted.bam -name = incoming.getName() -split=name.split('_') -if (len(split) == 6): - incoming_sample=split[1]+ '_'+ split[2] + '_' + split[3] + '_' + split[4]+ ':' + split[-1] -if (len(split) ==4): - incoming_sample=split[1]+ '_'+ split[2] + ':' + split[-1] - - -# Looking for BAMS: -for root, dirnames, filenames in os.walk(FOLDER + name): - for filename in fnmatch.filter(filenames, BAM_PATTERN): - matches.append(os.path.join(root, filename)) - -# ----------------------------------------------------------------------------- - -def listSearch (myList, searchString): - ''' - Searches for a given String in a list. - Only lines matching the start of a line a considerd as a match - ''' - matches = [] - for i in range (0, len(myList)): - if(re.match(searchString, myList[i])): - matches.append(myList[i]) - return (matches) - -# ----------------------------------------------------------------------------- - -def programParameters (programList): - ''' - Extracts the aligner datils from the bam header - ''' - elements = {} - for program in range(0, len(programList)): - line = programList[program].split('\t') - - for element in range (1, len(line)): - key, value = line[element].split(":") - elements[key] = value - - return elements - - -# Extract values from a samtools view and set the results as DataSet properties -# Command: samtools view -H ETHZ_BSSE_110429_63558AAXX_1_sorted.bam - -arguments = SAMTOOLS + ' view -H ' + matches[0] -print('Arguments: '+ arguments) -cmdResult=os.popen(arguments).read() - -properties=cmdResult.split("\n") -for s in range (0, len(searchStrings)): - programList = listSearch (properties, searchStrings[s]) -print(programList) - -e = programParameters (programList) - -dataSet.setPropertyValue("ALIGNMENT_SOFTWARE", e['ID']) -dataSet.setPropertyValue("VERSION", e['VN']) -dataSet.setPropertyValue("ISSUED_COMMAND", e['CL']) - - -arguments = SAMTOOLS + ' flagstat ' + matches[0] - -cmdResult=os.popen(arguments).read() -totalReads=cmdResult.split('\n')[0].split(' ')[0] -mappedReads=cmdResult.split('\n')[2].split(' ')[0] - -dataSet.setPropertyValue("SAMTOOLS_FLAGSTAT", cmdResult) -dataSet.setPropertyValue("TOTAL_READS", totalReads) -dataSet.setPropertyValue("MAPPED_READS", mappedReads) - -# Add the incoming file into the data set -transaction.moveFile(incomingPath, dataSet) - -# Get the search service -search_service = transaction.getSearchService() - -# Search for the sample -sc = SearchCriteria() -sc.addMatchClause(SearchCriteria.MatchClause.createAttributeMatch(SearchCriteria.MatchClauseAttribute.CODE, incoming_sample)); -foundSamples = search_service.searchForSamples(sc) - -if foundSamples.size() > 0: - dataSet.setSample(foundSamples[0]) - - # Search for parent data set of the same sample - dataSetSc = SearchCriteria() - dataSetSc.addMatchClause(SearchCriteria.MatchClause.createAttributeMatch(SearchCriteria.MatchClauseAttribute.TYPE, 'FASTQ_GZ')) - dataSetSc.addSubCriteria(SearchSubCriteria.createSampleCriteria(sc)) - foundDataSets = search_service.searchForDataSets(dataSetSc) - if foundDataSets.size() > 0: - dataSet.setParentDatasets([ds.getDataSetCode() for ds in foundDataSets]) diff --git a/deep_sequencing_unit/dist/etc/data-set-handler-basecall-stats.py b/deep_sequencing_unit/dist/etc/data-set-handler-basecall-stats.py deleted file mode 100755 index b8f9fb4a97de250f9d1573abaf63da4623d202fe..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/dist/etc/data-set-handler-basecall-stats.py +++ /dev/null @@ -1,53 +0,0 @@ -''' - -Note: -print statements go to: ~openbis/sprint/datastore_server/log/startup_log.txt -''' - -import os -from ch.systemsx.cisd.openbis.generic.shared.api.v1.dto import SearchCriteria -from ch.systemsx.cisd.openbis.generic.shared.api.v1.dto import SearchSubCriteria - -# Create a "transaction" -- a way of grouping operations together so they all -# happen or none of them do. -transaction = service.transaction() - -incomingPath = incoming.getAbsolutePath() -folders=[] -# no walk in Jython 2.2 -#for root, dirs, files in os.walk(folders): -# folders.append(root) -folders=os.listdir(incomingPath) - -# Get the incoming name -name = incoming.getName() -# expected incoming Name, e.g.: 110715_SN792_0054_BC035RACXX - -# Create a data set and set type -dataSet = transaction.createNewDataSet("BASECALL_STATS") -dataSet.setMeasuredData(False) - -#dataSet.setPropertyValue("MISMATCH_IN_INDEX", r) - -# Get the search service -search_service = transaction.getSearchService() - -# Add the incoming file into the data set -transaction.moveFile(incomingPath, dataSet) - -# Search for the sample -sc = SearchCriteria() -sc.addMatchClause(SearchCriteria.MatchClause.createAttributeMatch(SearchCriteria.MatchClauseAttribute.CODE, name)) -foundSamples = search_service.searchForSamples(sc) - -if foundSamples.size() > 0: - dataSet.setSample(foundSamples[0]) - - # Search for another data set of the same sample - dataSetSc = SearchCriteria() - dataSetSc.addMatchClause(SearchCriteria.MatchClause.createAttributeMatch(SearchCriteria.MatchClauseAttribute.TYPE, 'ILLUMINA_HISEQ_OUTPUT')) - dataSetSc.addSubCriteria(SearchSubCriteria.createSampleCriteria(sc)) - foundDataSets = search_service.searchForDataSets(dataSetSc) - if foundDataSets.size() > 0: - dataSet.setParentDatasets([ds.getDataSetCode() for ds in foundDataSets]) - diff --git a/deep_sequencing_unit/dist/etc/data-set-handler-bigwig.py b/deep_sequencing_unit/dist/etc/data-set-handler-bigwig.py deleted file mode 100755 index f9d6e2ae98b623881271a0deda69fd681046f826..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/dist/etc/data-set-handler-bigwig.py +++ /dev/null @@ -1,124 +0,0 @@ -''' - -Note: -print statements go to: ~openbis/sprint/datastore_server/log/startup_log.txt -''' - -import os -import fnmatch -import re -from ch.systemsx.cisd.openbis.generic.shared.api.v1.dto import SearchCriteria -from ch.systemsx.cisd.openbis.generic.shared.api.v1.dto import SearchSubCriteria - -FOLDER='/links/shared/dsu-dss/dss/incoming-jython-bigwig/' -BIGWIGINFO='/links/application/dsu/bigWig/bigWigInfo ' -BW_PATTERN='*.bw' - -matches = [] - -# Create a "transaction" -- a way of grouping operations together so they all -# happen or none of them do. -transaction = service.transaction() - -# Create a data set and set type -dataSet = transaction.createNewDataSet("BIGWIGGLE") -dataSet.setMeasuredData(False) - -incomingPath = incoming.getAbsolutePath() - -# Get the incoming name -# expected: -# Project_110907_SN792_0059_AC012FACXX_3/BSSE-DSU-1662_CGATGTA_L003_R1_001_sorted.bw -name = incoming.getName() -split=name.split('_') -if (len(split) == 6): - incoming_sample=split[1]+ '_'+ split[2] + '_' + split[3] + '_' + split[4]+ ':' + split[-1] -if (len(split) ==4): - incoming_sample=split[1]+ '_'+ split[2] + ':' + split[-1] - - -# Looking for BWs: -for root, dirnames, filenames in os.walk(FOLDER + name): - for filename in fnmatch.filter(filenames, BW_PATTERN): - matches.append(os.path.join(root, filename)) - -# ----------------------------------------------------------------------------- - -def listSearch (myList, searchString): - ''' - Searches for a given String in a list. - Only lines matching the start of a line a considerd as a match - ''' - matches = [] - for i in range (0, len(myList)): - if(re.match(searchString, myList[i])): - matches.append(myList[i]) - return (matches) - -# ----------------------------------------------------------------------------- - -def translateBoolean (value): - if (value.lower() == 'yes') | (value.lower() =='y'): - return True - else: - return False - -def sanitizeInt (intNumber): - return intNumber.replace(',','') - -# ----------------------------------------------------------------------------- - -def convertListToDict(prop): - d={} - for i in range(0,len(properties)-1): - lineSplit = prop[i].split(':') - d[lineSplit[0].strip()] = lineSplit[1].strip() - return(d) - -# ----------------------------------------------------------------------------- - -# Extract values from a samtools view and set the results as DataSet properties -# Command: samtools view -H ETHZ_BSSE_110429_63558AAXX_1_sorted.bam - -arguments = BIGWIGINFO + matches[0] -#print('Arguments: '+ arguments) -cmdResult=os.popen(arguments).read() - -properties=cmdResult.split("\n") -dictProp = convertListToDict(properties) -#print(dictProp) - -dataSet.setPropertyValue("VERSION", dictProp['version']) -dataSet.setPropertyValue("ISCOMPRESSED", str(translateBoolean(dictProp['isCompressed']))) -dataSet.setPropertyValue("ISSWAPPED", dictProp['isSwapped']) -dataSet.setPropertyValue("PRIMARYDATASIZE", sanitizeInt(dictProp['primaryDataSize'])) -dataSet.setPropertyValue("PRIMARYINDEXSIZE", sanitizeInt(dictProp['primaryIndexSize'])) -dataSet.setPropertyValue("ZOOMLEVELS", dictProp['zoomLevels']) -dataSet.setPropertyValue("CHROMCOUNT", dictProp['chromCount']) -dataSet.setPropertyValue("BASESCOVERED", sanitizeInt(dictProp['basesCovered'])) -dataSet.setPropertyValue("MEAN", dictProp['mean']) -dataSet.setPropertyValue("MIN", dictProp['min']) -dataSet.setPropertyValue("MAX", dictProp['max']) -dataSet.setPropertyValue("STD", dictProp['std']) - -# Add the incoming file into the data set -transaction.moveFile(incomingPath, dataSet) - -# Get the search service -search_service = transaction.getSearchService() - -# Search for the sample -sc = SearchCriteria() -sc.addMatchClause(SearchCriteria.MatchClause.createAttributeMatch(SearchCriteria.MatchClauseAttribute.CODE, incoming_sample)); -foundSamples = search_service.searchForSamples(sc) - -if foundSamples.size() > 0: - dataSet.setSample(foundSamples[0]) - - # Search for parent data set of the same sample - dataSetSc = SearchCriteria() - dataSetSc.addMatchClause(SearchCriteria.MatchClause.createAttributeMatch(SearchCriteria.MatchClauseAttribute.TYPE, 'FASTQ_GZ')) - dataSetSc.addSubCriteria(SearchSubCriteria.createSampleCriteria(sc)) - foundDataSets = search_service.searchForDataSets(dataSetSc) - if foundDataSets.size() > 0: - dataSet.setParentDatasets([ds.getDataSetCode() for ds in foundDataSets]) diff --git a/deep_sequencing_unit/dist/etc/data-set-handler-cell.py b/deep_sequencing_unit/dist/etc/data-set-handler-cell.py deleted file mode 100755 index c2ceb47928b99c0fb17c41667ec0b409dd00ccdb..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/dist/etc/data-set-handler-cell.py +++ /dev/null @@ -1,111 +0,0 @@ -''' -expected incoming Name for HiSeq2000 runs: 110715_SN792_0054_BC035RACXX -expected incoming Name for GAII runs: 110812_6353WAAXX - -Note: -print statements go to: ~openbis/sprint/datastore_server/log/startup_log.txt -''' - -import os -import shutil -import glob -import xml.etree.ElementTree as etree -from ch.systemsx.cisd.openbis.generic.shared.api.v1.dto import SearchCriteria - -IS_HISEQ_RUN=False -RUNPARAMETERS = 'runParameters.xml' -XML_ELEMENTS = {'FLOWCELL': 'Flowcell', 'RTAVERSION': 'RTAVersion', - 'CONTROLLANE': 'ControlLane', 'SBS': 'Sbs', 'INDEX': 'Index'} - -RUNINFO_FOLDER='/links/shared/dsu-dss/dss/incoming-jython-runinfostatistics/' -REGEX_RUNINFO_SAMPLE = '/Data/Status*' -REGEX_RUNINFO_REPORTS = '/Data/reports' -MARKER_STRING='.MARKER_is_finished_' - - -def parseXml(xmlFile): - ''' - Parses an XML file and returns the root leaf - ''' - tree = etree.parse(xmlFile) - root = tree.getroot() - return root - - -def getXmlElement (elementName): - ''' - Returns the text value of a given XML element - ''' - for e in root.getchildren(): - element = e.find(elementName) - if element is None: - return 'None' - else: - print(element.text) - return element.text - -def touch_markerfile(filename): - try: - # do a touch - open(filename, 'w').close() - except: - print('Could not touch ' + filename) - - -# Create a "transaction" -- a way of grouping operations together so they all -# happen or none of them do. -transaction = service.transaction() - -incomingPath = incoming.getAbsolutePath() -folders=[] -folders=os.listdir(incomingPath) - -# Get the incoming name -name = incoming.getName() - -split=name.split("_") -if (len(split) == 4): - dataSet = transaction.createNewDataSet("ILLUMINA_HISEQ_OUTPUT") - IS_HISEQ_RUN=True -if (len(split) == 2): - dataSet = transaction.createNewDataSet("ILLUMINA_GA_OUTPUT") - -#move RunInfo into a different drop box -runInfoSample=glob.glob(incomingPath + REGEX_RUNINFO_SAMPLE) -runInfoReport=glob.glob(incomingPath + REGEX_RUNINFO_REPORTS) -runInfoList = runInfoSample + runInfoReport -os.makedirs(RUNINFO_FOLDER + name + '/Data/') -for runInfo in runInfoList: - try: - if os.path.isdir(runInfo): - shutil.copytree(runInfo, RUNINFO_FOLDER + name + '/Data/' + os.path.basename(runInfo)) - else: - shutil.copy2(runInfo, RUNINFO_FOLDER + name + '/Data/') - except (IOError, os.error), why: - print (runInfo, RUNINFO_FOLDER + name, str(why)) - -touch_markerfile(RUNINFO_FOLDER+MARKER_STRING+name) - -# Create a data set and set type -dataSet.setMeasuredData(False) - -# Get the search service -search_service = transaction.getSearchService() - -# Search for the sample -sc = SearchCriteria() -sc.addMatchClause(SearchCriteria.MatchClause.createAttributeMatch(SearchCriteria.MatchClauseAttribute.CODE, name)); -foundSamples = search_service.searchForSamples(sc) - -if foundSamples.size() > 0: - if IS_HISEQ_RUN: - sa = transaction.getSampleForUpdate(foundSamples[0].getSampleIdentifier()) - root = parseXml(incomingPath + '/' + RUNPARAMETERS) -# sa.setPropertyValue("ILLUMINA_PIPELINE_VERSION", getXmlElement(XML_ELEMENTS['RTAVERSION'])) -# sa.setPropertyValue("FLOWCELLTYPE", getXmlElement(XML_ELEMENTS['FLOWCELL'])) -# sa.setPropertyValue("CONTROL_LANE", getXmlElement(XML_ELEMENTS['CONTROLLANE'])) - - # Add the incoming file into the data set - transaction.moveFile(incomingPath, dataSet) - - dataSet.setSample(foundSamples[0]) diff --git a/deep_sequencing_unit/dist/etc/data-set-handler-create-flow-cell.py b/deep_sequencing_unit/dist/etc/data-set-handler-create-flow-cell.py deleted file mode 100755 index e1017031690fb2b64b392d7db7b839b556c4266e..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/dist/etc/data-set-handler-create-flow-cell.py +++ /dev/null @@ -1,165 +0,0 @@ -''' -expected incoming Name for HiSeq2000 runs: 110715_SN792_0054_BC035RACXX -expected incoming Name for GAII runs: 110812_6353WAAXX - -Note: -print statements go to: ~openbis/sprint/datastore_server/log/startup_log.txt -''' - -import os -import shutil -from time import * -from datetime import * -import xml.etree.ElementTree as etree -from ch.systemsx.cisd.openbis.generic.shared.api.v1.dto import SearchCriteria - -IS_HISEQ_RUN=False -RUNPARAMETERS = 'runParameters.xml' -RUNINFO = 'RunInfo.xml' -FLOWCELL_SPACE='/BSSE_FLOWCELLS/' -FLOWCELL_PROJECT='FLOWCELLS/' -EXPERIMENT_TYPE_CODE='HT_SEQUENCING' - -# Mapping between XML file naming and used in here -RUNPARAMETERS_XML = {'FLOWCELL':'Flowcell', 'RTAVERSION':'RTAVersion', - 'CONTROLLANE':'ControlLane', 'SBS':'Sbs', 'INDEX':'Index', - 'CYCLES_REQUESTED_BY_CUSTOMER':'Read1', 'PE':'Pe'} -RUNINFO_XML = {'LANECOUNT':'LaneCount', 'SURFACECOUNT':'SurfaceCount', - 'SWATHCOUNT':'SwathCount', 'TILECOUNT':'TileCount'} -INSTRUMENT = {'SN792':'RUA', 'BS-DSU-ELLAC':'ELLAC'} - -class parseXmlFile: - - def __init__(self, xmlFile): - self.xmlFile = xmlFile - self.tree = etree.parse(self.xmlFile) - self.root = self.tree.getroot() - - def getXmlElement (self, elementName): - ''' - Returns the text value of a given XML element - ''' - for e in self.root.getchildren(): - element = e.find(elementName) - if element is None: - return 'None' - else: - return element.text - - def getAllchildren (self, elementName): - ''' - finds all children of a given XML Element and returns them as list - ''' - for e in self.root.getchildren(): - # the '//' means look recursively for all children not only direct ones - childList = self.tree.findall('//' + elementName) - return childList - -# ----------------------------------------------------------------------------- - -def create_openbis_timestamp (): - ''' - Create an openBIS conform timestamp - ''' - tz=localtime()[3]-gmtime()[3] - d=datetime.now() - return d.strftime("%Y-%m-%d %H:%M:%S GMT"+"%+.2d" % tz+":00") - -# ----------------------------------------------------------------------------- - -# Create a "transaction" -- a way of grouping operations together so they all -# happen or none of them do. -transaction = service.transaction() - -incomingPath = incoming.getAbsolutePath() -print(incomingPath) - -# Get the incoming name -name = incoming.getName() - -split=name.split("_") -if (len(split) == 4): - IS_HISEQ_RUN=True -if (len(split) == 2): - pass - -# Search for the sample and check if there is already sample with this name -search_service = transaction.getSearchService() -sc = SearchCriteria() -sc.addMatchClause(SearchCriteria.MatchClause.createAttributeMatch(SearchCriteria.MatchClauseAttribute.CODE, name)); -foundSamples = search_service.searchForSamples(sc) -if foundSamples.size() > 0: - raise NameError('Already found a Flow Cell with the following name: '+ name) - -# Parse the RunInfo.xml file -runInfo = parseXmlFile(incomingPath + '/' + RUNINFO) -print(runInfo) - -# Create a new Flow Cell and set the experiment -newFlowCell = transaction.createNewSample(FLOWCELL_SPACE + name, "ILLUMINA_FLOW_CELL") -exp = transaction.getExperiment(FLOWCELL_SPACE + FLOWCELL_PROJECT + datetime.now().strftime("%Y.%m")) -if exp == None: - exp = transaction.createNewExperiment(FLOWCELL_SPACE + FLOWCELL_PROJECT + datetime.now().strftime("%Y.%m"), - EXPERIMENT_TYPE_CODE) -newFlowCell.setExperiment(exp) - -if IS_HISEQ_RUN: - run = runInfo.getAllchildren('Run')[0].attrib - if (run['Id'] != name): - raise NameError('Flowcell names do not match between directory name '+ name + - ' and ' + RUNINFO + 'property file: ' + run['Id']) - - # The HiSeq is providing more infos, which we will parse here: - runParameters = parseXmlFile(incomingPath + '/' + RUNPARAMETERS) - - newFlowCell.setPropertyValue("ILLUMINA_PIPELINE_VERSION", runParameters.getXmlElement(RUNPARAMETERS_XML['RTAVERSION'])) - newFlowCell.setPropertyValue("FLOWCELLTYPE", runParameters.getXmlElement(RUNPARAMETERS_XML['FLOWCELL'])) - newFlowCell.setPropertyValue("CONTROL_LANE", runParameters.getXmlElement(RUNPARAMETERS_XML['CONTROLLANE'])) - newFlowCell.setPropertyValue("SBS_KIT", runParameters.getXmlElement(RUNPARAMETERS_XML['SBS'])) - - read1 = runParameters.getAllchildren('Read1') - newFlowCell.setPropertyValue("CYCLES_REQUESTED_BY_CUSTOMER", read1[0].text) - - read2 = runParameters.getAllchildren('Read2') - if (str(read2[0].text) == '0'): - newFlowCell.setPropertyValue("END_TYPE", "SINGLE_READ") - else: - newFlowCell.setPropertyValue("END_TYPE", "PAIRED_END") - newFlowCell.setPropertyValue("PAIRED_END_KIT", runParameters.getXmlElement(RUNPARAMETERS_XML['PE'])) - - indexRead1 = runParameters.getAllchildren('IndexRead1') - newFlowCell.setPropertyValue("INDEXREAD", indexRead1[0].text) - - indexRead2 = runParameters.getAllchildren('IndexRead2') - newFlowCell.setPropertyValue("INDEXREAD2", indexRead2[0].text) - - def setFcProperty(searchId, dict): - children = runInfo.getAllchildren(searchId) - for element in (dict): - if (element <> '') and (dict[element] <> ''): - newFlowCell.setPropertyValue(element, children[0].attrib[dict[element]]) - - setFcProperty('FlowcellLayout', RUNINFO_XML) - - -sequencer = runInfo.getAllchildren('Instrument') -newFlowCell.setPropertyValue("SEQUENCER", INSTRUMENT[sequencer[0].text]) - -newFlowCell.setPropertyValue("FLOW_CELL_SEQUENCED_ON", create_openbis_timestamp()) -if IS_HISEQ_RUN: - maxLanes = runInfo.getAllchildren('FlowcellLayout')[0].attrib[RUNINFO_XML['LANECOUNT']] -else: - maxLanes = len(runInfo.getAllchildren('Tiles')[0]) - -# ----------------------------------------------------------------------------- - -def registerFlowLane(a_lane): - ''' - Registers a new Flow lane - ''' - newFlowLane = transaction.createNewSample(FLOWCELL_SPACE + name + ':' + str(a_lane), "ILLUMINA_FLOW_LANE") - newFlowLane.setContainer(newFlowCell) - -[registerFlowLane(lane) for lane in range(1,int(maxLanes)+1)] - -shutil.rmtree(incomingPath) diff --git a/deep_sequencing_unit/dist/etc/data-set-handler-demultiplex-stats.py b/deep_sequencing_unit/dist/etc/data-set-handler-demultiplex-stats.py deleted file mode 100755 index 0781051f88eba33a20d0446ff2d5b60d1904f267..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/dist/etc/data-set-handler-demultiplex-stats.py +++ /dev/null @@ -1,428 +0,0 @@ -''' - @copyright: 2012 ETH Zuerich, CISD - - @license: - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - - -@author: Manuel Kohler - -XML Structur which is processed: - -<?xml version="1.0"?> -<Summary> - <Lane index="8"> - <Sample index="lane8"> - <Barcode index="Undetermined"> - <Tile index="1101"> - <Read index="1"> - <Raw> - <Yield>1921250</Yield> - <YieldQ30>949680</YieldQ30> - <ClusterCount>38425</ClusterCount> - <ClusterCount0MismatchBarcode>0</ClusterCount0MismatchBarcode> - <ClusterCount1MismatchBarcode>0</ClusterCount1MismatchBarcode> - <QualityScoreSum>40995660</QualityScoreSum> - </Raw> - <Pf> - <Yield>945450</Yield> - <YieldQ30>854815</YieldQ30> - <ClusterCount>18909</ClusterCount> - <ClusterCount0MismatchBarcode>0</ClusterCount0MismatchBarcode> - <ClusterCount1MismatchBarcode>0</ClusterCount1MismatchBarcode> - <QualityScoreSum>33815505</QualityScoreSum> - </Pf> - </Read> - </Tile> - [...] - -@note: -print statements go to: <openBIS_HOME>/datastore_server/log/startup_log.txt -''' - -import time -import os -import fnmatch -import xml.etree.ElementTree as etree -from ch.systemsx.cisd.openbis.generic.shared.api.v1.dto import SearchCriteria -from ch.systemsx.cisd.openbis.generic.shared.api.v1.dto import SearchSubCriteria - - -class parseXmlFile: - - def __init__(self, xmlFile): - self.xmlFile = xmlFile - self.tree = etree.parse(self.xmlFile) - self.root = self.tree.getroot() - -# ----------------------------------------------------------------------------- - -class qcValues(object): - def __init__(self, Yield = 0, YieldQ30 = 0, ClusterCount = 0, - ClusterCount0MismatchBarcode = 0, ClusterCount1MismatchBarcode = 0, - QualityScoreSum = 0, *args, **kwargs): - self.Yield = Yield - self.YieldQ30 = YieldQ30 - self.ClusterCount = ClusterCount - self.ClusterCount0MismatchBarcode = ClusterCount0MismatchBarcode - self.ClusterCount1MismatchBarcode = ClusterCount1MismatchBarcode - self.QualityScoreSum = QualityScoreSum - - def __str__(self): - return "Yield: %s, YieldQ30: %s, ClusterCount: %s, ClusterCount0MismatchBarcode: %s," \ - " CusterCount1MismatchBarcode: %s, QualityScoreSum: %s" \ - % (self.Yield, self.YieldQ30, self.ClusterCount, self.ClusterCount0MismatchBarcode, - self.ClusterCount1MismatchBarcode, self.QualityScoreSum) - -class sample: - def __init__(self, Lane = 0, Sample = '', Barcode = '', Tile = '', Read = '', rawqc = qcValues([]), - pfqc = qcValues([]), *args, **kwargs): - self.Lane = Lane - self.Sample = Sample - self.Barcode = Barcode - self.Tile = Tile - self.Read = Read - self.rawqc = rawqc - self.pfqc = pfqc - - def __str__(self): - return "Lane: %s, Sample: %s, Barcode: %s, Tile: %s, Read: %s, rawqc: %s, pfqc: %s" \ - % (self.Lane, self.Sample, self.Barcode, self.Tile, self.Read, self.rawqc, self.pfqc) - -# ----------------------------------------------------------------------------- - -class Statistics: - def __init__(self, lane = 0, sampleName = "", index1 = "NoIndex", index2 = "NoIndex", pfYieldSum = 0, - rawYieldSum = 0, pfPercentage = 0.0, rawReadsSum = 0, pfReadsSum = 0, - pfYieldQ30Sum = 0, qualityScoreSum = 0, rawPercentageReadsPerLane = 0.0, - pfYieldQ30Percentage = 0.0, pfsumQualityScore = 0, pfmeanQualityScore = 0.0): - self.lane = lane - self.sampleName = sampleName - self.index1 = index1 - self.index2 = index2 - self.pfYieldSum = pfYieldSum - self.rawYieldSum = rawYieldSum - self.pfPercentage = pfPercentage - self.rawReadsSum = rawReadsSum - self.pfReadsSum = pfReadsSum - self.pfYieldQ30Sum = pfYieldQ30Sum - self.qualityScoreSum = qualityScoreSum - self.rawPercentageReadsPerLane = rawPercentageReadsPerLane - self.pfYieldQ30Percentage = pfYieldQ30Percentage - self.pfsumQualityScore = pfsumQualityScore - self.pfmeanQualityScore = pfmeanQualityScore - - def __str__(self): - return "lane: %s, sampleName: %s, index1: %s, index2: %s, pfYieldSum: %s, pfPercentage: %s," \ - " rawReadsSum: %s, pfReadsSum: %s," \ - " rawPercentageReadsPerLane: %s, pfYieldQ30Percentage: %s," \ - " pfmeanQualityScore: %s" \ - % (self.lane, self.sampleName, self.index1, self.index2, self.pfYieldSum, self.pfPercentage, - self.rawReadsSum, self.pfReadsSum, - self.rawPercentageReadsPerLane, self.pfYieldQ30Percentage, self.pfmeanQualityScore) - - def calculatePercentagePF (self, rawYield = 0, pfYield = 1): - try: - return round(float(pfYield) / float(rawYield) * 100, 2) - except: - return 0.0 - - def calulateMeanQualityScore (self, pfqualityScoreSum = 0, pfYield = 1): - try: - return round (float(pfqualityScoreSum) / float(pfYield), 2) - except: - return 0.0 - - def calculateYieldQ30Percentage (self, pfYieldQ30 = 0, pfYield = 1): - try: - return round (float(pfYieldQ30) / float(pfYield) * 100, 2) - except: - return 0.0 - -# ----------------------------------------------------------------------------- - -def xml2Memory(DEMULTIPLEX_XML): - ''' - Parse the XML file and put all values in a memory structure: - List of: - lane, sample, barcode, tile, read, qcRawList, qcPfList - ''' - - RAW_TAG = "Raw" - PF_TAG = "Pf" - - sampleList = [] - - xml = parseXmlFile(DEMULTIPLEX_XML) - r = xml.tree.getroot() - - for lane in r.getchildren(): - for mysample in lane: - for barcode in mysample: - for tile in barcode: - for read in tile: - - qcRaw = qcValues() - qcPf = qcValues() - qcRawList = [] - qcPfList = [] - - # Read out the Raw fields - raw = read.find(RAW_TAG) - for child in raw.getchildren(): - # equivalent to a Java reflection - setattr(qcRaw, child.tag, int(child.text)) - - # Read out the Pf fields - pf = read.find(PF_TAG) - for child in pf.getchildren(): - # equivalent to a Java reflection - setattr(qcPf, child.tag, int(child.text)) - - qcRawList.append(qcRaw) - qcPfList.append(qcPf) - - singleElement = sample () - - setattr(singleElement, lane.tag, lane.attrib) - setattr(singleElement, mysample.tag, mysample.attrib) - setattr(singleElement, barcode.tag, barcode.attrib) - setattr(singleElement, tile.tag, tile.attrib) - setattr(singleElement, read.tag, read.attrib) - singleElement.rawqc = qcRawList - singleElement.pfqc = qcPfList - - sampleList.append(singleElement) - return sampleList - -# ----------------------------------------------------------------------------- - -def calculateStatistics(listofSamples): - ''' - Structure of 'listofSamples' - Lane: {'index': '6'}, Sample: {'index': 'BSSE-QGF-3524_C0NKPACXX'}, Barcode: {'index': 'TGACCA'}, - Tile: {'index': '2307'}, Read: {'index': '1'}, rawqc:<mem>, pfqc:<mem> - ''' - - numberOfTiles = len(listofSamples) - - tile = sample() - raw = qcValues () - pf = qcValues () - stats = Statistics() - - for tile in listofSamples: - raw = tile.rawqc[0] - pf = tile.pfqc[0] - - stats.pfYieldSum += pf.Yield - stats.rawYieldSum += raw.Yield - stats.rawReadsSum += raw.ClusterCount - stats.pfReadsSum += pf.ClusterCount - stats.pfYieldQ30Sum += pf.YieldQ30 - stats.qualityScoreSum += pf.QualityScoreSum - - # Can not be set here, needs to be calculated later - #stats.rawPercentageReadsPerLane = rawPercentageReadsPerLane - stats.pfPercentage = stats.calculatePercentagePF(stats.rawYieldSum, stats.pfYieldSum) - stats.pfYieldQ30Percentage = stats.calculateYieldQ30Percentage(stats.pfYieldQ30Sum, stats.pfYieldSum) - stats.pfmeanQualityScore = stats.calulateMeanQualityScore(stats.qualityScoreSum, stats.pfYieldSum) - stats.lane = listofSamples[0].Lane.values()[0] - stats.sampleName = listofSamples[0].Sample.values()[0] - index = listofSamples[0].Barcode.values()[0] - try: - stats.index1, stats.index2 = index.split("-") - except: - stats.index1 = index - return stats - -# ----------------------------------------------------------------------------- - - -def rawReadSumPerSamples(stat): - ''' - Creates a dictionary with the lanes as keys - The values are a list where the elements are a dictionary again. - This dictionary has the sample names as key and the RawReadSum as value. - - Example: - {4': [{'BSSE-QGF-3434_C0NKPACXX': 248999502}], '7': [{'lane7': 123921974}, - {'BSSE-QGF-3527_C0NKPACXX': 38587703}, {'BSSE-QGF-3529_C0NKPACXX': 30130893}, - {'BSSE-QGF-3528_C0NKPACXX': 34519296}, {'BSSE-QGF-3526_C0NKPACXX': 34980179}]} - ''' - - laneDict = {} - for e in stat: - if e.lane not in laneDict: - laneDict[e.lane] = [{e.sampleName:e.rawReadsSum}] - else: - laneDict[e.lane].append({e.sampleName:e.rawReadsSum}) - return laneDict - -# ----------------------------------------------------------------------------- - -def createSumRawReadsPerLane(laneDict): - ''' - Creates a dictionary with lane as key and sum of Raw Reads as value: - {'1': 183180877, '3': 244968562, '2': 191496395, '5': 193466239, '4': 248999502, - '7': 262140045, '6': 257136830, '8': 209948449} - ''' - sumRawReadsDict = {} - for lane in laneDict: - sumRawReads = 0 - for sampleNameDict in laneDict[lane]: - sumRawReads += sampleNameDict.values()[0] - - sumRawReadsDict[lane] = sumRawReads - return sumRawReadsDict - -# ----------------------------------------------------------------------------- - -def createPercentagePerLane(laneDict, sumRawReadsDict): - ''' - Creates a dictionary with the sample Name as key and the percentage of raw reads related to - all reads in the same lane - {'lane7': 47.27, 'BSSE-QGF-3433_C0NKPACXX': 100.0, 'BSSE-QGF-3666_C0NKPACXX': 54.12} - ''' - - relRawReadsDict = {} - for lane in laneDict: - for sampleName in laneDict[lane]: - relRawReadsDict[sampleName.keys()[0]] = round(float(sampleName.values()[0]) / - float(sumRawReadsDict[lane]) * 100, 2) - return relRawReadsDict - -# ----------------------------------------------------------------------------- - -def locate(pattern, root): - '''Locate all files matching supplied filename pattern in and below - supplied root directory.''' - for path, dirs, files in os.walk(os.path.abspath(root)): - for filename in fnmatch.filter(files, pattern): - yield os.path.join(path, filename) - -# ----------------------------------------------------------------------------- -# ----------------------------------------------------------------------------- - -FASTQ_DATA_SET_TYPE='FASTQ_GZ' -DEMUX_FILE='Flowcell_demux_summary.xml' -NO_INDEX='NOINDEX' -UNDETERMINED='UNDETERMINED' - -print('\n'+time.ctime()) -incomingPath = incoming.getAbsolutePath() -# Create a "transaction" -- a way of grouping operations together so they all -# happen or none of them do. -transaction = service.transaction() -# Get the incoming name -incomingName = incoming.getName() -# Get the search service -search_service = transaction.getSearchService() - -FileGenerator= locate(DEMUX_FILE, incomingPath) -DEMULTIPLEX_XML = FileGenerator.next() - -sampleList = xml2Memory(DEMULTIPLEX_XML) - -sa = sample() -sampleDict = {} - -# key = sample name, value = sample() -for element in range(0, len(sampleList)): - sa = sampleList[element] - # Check if new sample - if (sa.Sample is not sampleList[element - 1].Sample): - sampleName = sa.Sample.values()[0] - sampleDict[sampleName] = [sa] - else: - sampleDict[sampleName].append(sa) - -stat = [calculateStatistics(sampleDict[mysample]) for mysample in sampleDict] - -# calculate the relative amount of reads per index -laneDict = rawReadSumPerSamples(stat) -sumRawReadsDict = createSumRawReadsPerLane(laneDict) -relRawReadsDict = createPercentagePerLane(laneDict, sumRawReadsDict) - -# set the values in the object -for mye in stat: - mye.rawPercentageReadsPerLane = relRawReadsDict[mye.sampleName] - -#for m in stat: -# print m - -def sampleSearch(Code=''): - sc = SearchCriteria() - numberOfLanes = 0 - sc.addMatchClause(SearchCriteria.MatchClause.createAttributeMatch(SearchCriteria.MatchClauseAttribute.CODE, Code)); - search_service = transaction.getSearchService() - foundSample = search_service.searchForSamples(sc) - if foundSample.size() > 0: - # Search for contained samples - sampleSc = SearchCriteria() - sampleSc.addSubCriteria(SearchSubCriteria.createSampleContainerCriteria(sc)) - foundContainedSamples = search_service.searchForSamples(sampleSc) - numberOfLanes = foundContainedSamples.size() - return foundSample, foundContainedSamples, numberOfLanes - -def searchDataSetsofSample(sample, index1, index2, DATA_SET_TYPE): - sc = SearchCriteria() - sc.addMatchClause(SearchCriteria.MatchClause.createAttributeMatch(SearchCriteria.MatchClauseAttribute.CODE, sample)); - search_service = transaction.getSearchService() - foundSample = search_service.searchForSamples(sc) - - dataSetSc = SearchCriteria() - dataSetSc.addMatchClause(SearchCriteria.MatchClause.createAttributeMatch(SearchCriteria.MatchClauseAttribute.TYPE, DATA_SET_TYPE)) - if index1 not in (NO_INDEX): - if index1 in (UNDETERMINED): - index1 = NO_INDEX - else: - # Ugly workaround, the Index vocabulary has 7 nucleotides of which the last one is always an 'A' - index1 = index1 + "A" - dataSetSc.addMatchClause(SearchCriteria.MatchClause.createPropertyMatch("BARCODE", index1)) - if index2 not in (NO_INDEX): - if index2 in (UNDETERMINED): - index2 = NO_INDEX - dataSetSc.addMatchClause(SearchCriteria.MatchClause.createPropertyMatch("INDEX2", index2)) - dataSetSc.addSubCriteria(SearchSubCriteria.createSampleCriteria(sc)) - foundDataSets = search_service.searchForDataSets(dataSetSc) - - return foundDataSets - -flowcell, lanes, numberOfLanes = sampleSearch(incomingName) - -for mystat in stat: - laneCode = flowcell[0].getCode() + ":" + mystat.lane - searchIndex1 = mystat.index1.upper() - searchIndex2 = mystat.index2.upper() - - # Search for a data set with those two indices - DataSet = searchDataSetsofSample(laneCode, searchIndex1, searchIndex2, FASTQ_DATA_SET_TYPE) - try: - assert DataSet.size() == 1 - except AssertionError: - print (str(DataSet.size()) + ' data sets found which match the criterias: '+ - str(laneCode), searchIndex1, searchIndex2) - break - - sa = transaction.getDataSetForUpdate(DataSet[0].getDataSetCode()) - sa.setPropertyValue('YIELD_MBASES', str(mystat.pfYieldSum)) - sa.setPropertyValue('RAW_YIELD_MBASES', str(mystat.rawYieldSum)) - sa.setPropertyValue('PERCENTAGE_PASSED_FILTERING',str(mystat.pfPercentage)) - sa.setPropertyValue('PF_READS_SUM',str(mystat.pfReadsSum)) - sa.setPropertyValue('RAW_READS_SUM',str(mystat.rawReadsSum)) - sa.setPropertyValue('PERCENTAGE_RAW_CLUSTERS_PER_LANE', str(mystat.rawPercentageReadsPerLane)) - sa.setPropertyValue('PFYIELDQ30PERCENTAGE', str(mystat.pfYieldQ30Percentage)) - sa.setPropertyValue('PFMEANQUALITYSCORE', str(mystat.pfmeanQualityScore)) - - print "Modified data sets properties of: " + DataSet[0].getDataSetCode() diff --git a/deep_sequencing_unit/dist/etc/data-set-handler-lane.py b/deep_sequencing_unit/dist/etc/data-set-handler-lane.py deleted file mode 100755 index 5e4b0b8581010320a2e079df40f5263a78ead47d..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/dist/etc/data-set-handler-lane.py +++ /dev/null @@ -1,269 +0,0 @@ -''' -Processes each flow lane of a Sequencing run - -Expects as incoming folder: -Project_<Flow Cell>_<Lane> -e.g.Project_110715_SN792_0054_BC035RACXX_1 or Project_110816_6354LAAXX_1 - -Note: -print statements go to: ~openbis/sprint/datastore_server/log/startup_log.txt -''' - -import os -import fnmatch -import time -import shutil -from time import * -from datetime import * -from ch.systemsx.cisd.openbis.generic.shared.api.v1.dto import SearchCriteria - -FASTQ_GZ_PATTERN = "*.fastq.gz" -METADATA_FILE_SUFFIX = "_metadata.tsv" -AFFILIATION= {'FMI': '/links/shared/dsu-dss/dss/customers/fmi/drop-box/','BIOCENTER_BASEL': '/links/shared/dsu-dss/dss/customers/biozentrum/drop-box/'} -AFFILIATION_PROPERTY_NAME='AFFILIATION' -INDEX1='BARCODE' -INDEX2='INDEX2' - -DEFAULT_INDEX='NoIndex' - -# ------------------------------------------------------------------------------- - -incomingPath = incoming.getAbsolutePath() -# useful for debugging: -print(datetime.now()) - -def getFileNames(path=incomingPath): - ''' - Gets all files matching a PATTERN in a path recursively - and returns the result as a list - ''' - matches = [] - for root, dirnames, filenames in os.walk(path): - for filename in fnmatch.filter(filenames, FASTQ_GZ_PATTERN): - matches.append(os.path.join(root, filename)) - matches.sort() - return(matches) - -def writeMetadataFile (fileName, parentPropertyTypes, parentPropertiesMap, fcMetaDataDict, fcMetaDataList): - ''' - Writes a file of meta date related to one sample - ''' - try: - metaDataFile = open(fileName,'w') - for propertyType in parentPropertyTypes: - metaDataFile.write(propertyType.encode('utf-8') + "\t" + - parentPropertiesMap[propertyType].tryGetAsString().encode('utf-8') + "\n") - - metaDataFile.write("\nFLOWCELL PROPERTIES\n".encode('utf-8')) - - for fcMetaData in fcMetaDataList: - metaDataFile.write(fcMetaData.encode('utf-8') + "\t" + - fcMetaDataDict[fcMetaData].tryGetAsString().encode('utf-8') + "\n") - pass - except IOError: - print ('File error, could not write '+ fileName) - finally: - metaDataFile.close() - -def create_openbis_timestamp (): - ''' - Create an openBIS conform timestamp - ''' - tz=localtime()[3]-gmtime()[3] - d=datetime.now() - return d.strftime("%Y-%m-%d %H:%M:%S GMT"+"%+.2d" % tz+":00") - -def extraCopy (affiliationName, path): - ''' - Handles the extra copies of the data for transfer with datamover via the - bc2 network to the FMI and BIOCENTER - For the BIOCENTER there is a folder created in which all data gets into - ''' - if (affiliation_name in AFFILIATION): - if (affiliation_name == 'BIOCENTER_BASEL'): - dirname = AFFILIATION[affiliation_name] + datetime.now().strftime("%Y-%m-%d") - if not os.path.exists(dirname): - os.mkdir(dirname) - shutil.copy(path, dirname) - else: - shutil.copy(path, AFFILIATION[affiliation_name]) -# ------------------------------------------------------------------------------- - -# Create a "transaction" -- a way of grouping operations together so they all -# happen or none of them do. -transaction = service.transaction() - -folders=[] -folders=os.listdir(incomingPath) - -# Get the incoming name -name = incoming.getName() -# expected incoming Name, e.g.: Project_110715_SN792_0054_BC035RACXX_1 -split=name.split("_") -if (len(split) == 6): - runningDate = split[1] - sequencerId = split[2] - sequentialNumber = split[3] - hiseqTray = split[4][0] - flowCellId = split[4][1:] - flowLane = split[-1] - incoming_sample=runningDate+ '_'+ sequencerId + '_' + sequentialNumber + '_' + hiseqTray + flowCellId + ':' + flowLane -# expected Project_120112_63537AAXX_1 -if (len(split) ==4): - runningDate = split[1] - flowCellId = split[2] - flowLane = split[-1] - incoming_sample=runningDate+ '_'+ flowCellId + ':' + flowLane - - -# ------------------------------------------------------------------------------- - -def getFlowCellMetaData (flowCellId): - - def sortedDictValues(adict): - keys = adict.keys() - keys.sort() - return map(adict.get, keys) - - search = transaction.getSearchService() - sc = SearchCriteria() - print('Searching FlowCell: '+ str(flowCellId)) - sc.addMatchClause(SearchCriteria.MatchClause.createAttributeMatch(SearchCriteria.MatchClauseAttribute.CODE, flowCellId)); - foundFlowCells = search.searchForSamples(sc) - - try: - assert foundFlowCells.size() == 1 - except AssertionError: - print (str(foundFlowCells.size()) + ' flow cells found which match the criterias: '+ flowCellId) - - fcPropertiesDict = {} - fcPropertyTypes = [] - - fcProperties = foundFlowCells[0].getSample().getProperties() - for property in fcProperties: - code = property.getPropertyType().getSimpleCode() - fcPropertyTypes.append(code) - fcPropertiesDict[code] = property - - fcPropertyTypes.sort() - return fcPropertiesDict, fcPropertyTypes - - -# ------------------------------------------------------------------------------- - -# Get the search service -search_service = transaction.getSearchService() - -# Search for the incoming_sample which is a Flow Lane -sc = SearchCriteria() -print('Processing sample: '+ str(incoming_sample)) -sc.addMatchClause(SearchCriteria.MatchClause.createAttributeMatch(SearchCriteria.MatchClauseAttribute.CODE, incoming_sample)); -foundSamples = search_service.searchForSamples(sc) - -# there should be only one sample because it is unique within one Flow Cell -if (len(foundSamples) > 1): - raise Exception("More than one sample found! No unique code: " + incoming_sample) -elif (len(foundSamples) == 0): - raise Exception("No matching sample found for: " + incoming_sample) -else : - sample = foundSamples[0].getSample() - parents = sample.getParents() - -# ------------------------------------------------------------------------------- - -# search for the parents -sc = SearchCriteria() -# set the Search Criteria to an OR condition, default is AND -sc.setOperator(SearchCriteria.SearchOperator.MATCH_ANY_CLAUSES) -# Get the codes for all parents -for parent in parents: - parentSubCode = parent.getSubCode() - sc.addMatchClause(SearchCriteria.MatchClause.createAttributeMatch(SearchCriteria.MatchClauseAttribute.CODE, parentSubCode)); -# all parents of the flow lane -foundParents = search_service.searchForSamples(sc) - -# ------------------------------------------------------------------------------- - -# loop over each Sample folder within a lane -for f in range(0,len(folders)): - # Create a data set and set type - dataSet = transaction.createNewDataSet("FASTQ_GZ") - dataSet.setMeasuredData(False) - dataSet.setPropertyValue(INDEX1, DEFAULT_INDEX) - dataSet.setPropertyValue(INDEX2, DEFAULT_INDEX) - dirName = transaction.createNewDirectory(dataSet,folders[f]) - - # if multiplexed samples then there is more than one folder - pathPerLane = incomingPath + '/' + folders[f] - print ("pathPerLane: " + pathPerLane) - - # get all properties of the parent samples - for foundParent in foundParents: - parent = foundParent.getSample() - # ArrayList - parentProperties = parent.getProperties() - # just get the current code - parentCode = parent.getCode() - #print("Found parent code: "+ parentCode) - - # reformat Java ArrayList and Sort - parentPropertyTypes = [] - parentPropertiesMap = {} - for property in parentProperties: - code = property.getPropertyType().getSimpleCode() - parentPropertyTypes.append(code) - parentPropertiesMap[code] = property - try: - barcode = parentPropertiesMap[INDEX1].tryGetAsString() - if barcode == "NOINDEX": - barcode = DEFAULT_INDEX - else: - barcode.split()[-1][:-1] - except: - barcode = DEFAULT_INDEX - - try: - index2 = parentPropertiesMap[INDEX2].tryGetAsString() - if index2 == "NOINDEX": - index2 = DEFAULT_INDEX - else: - index2.split()[-1][:-1] - except: - index2 = DEFAULT_INDEX - - # just use the first six nucleotides for the naming - completeBarcode=barcode + "-" + index2 - - parentPropertyTypes.sort() - # BSSE--1754_C0364ACXX_CTTGTAA-AACC_L007_R1_001.fastq.gz - nameOfFile = parentCode + "_" + flowCellId + "_" + completeBarcode + "_L00" + flowLane +METADATA_FILE_SUFFIX - - if (parentCode == folders[f].split('_')[1]): - dataSet.setPropertyValue(INDEX1, barcode) - dataSet.setPropertyValue(INDEX2, index2) - #print("Creating metadata file:" + nameOfFile) - # get a file from the IDataSetRegistrationTransaction so it is automatically part of the data set - pathToFile = transaction.createNewFile(dataSet, folders[f], nameOfFile) - - fcMetaDataDict, fcMetaDataList = getFlowCellMetaData(incoming_sample.split(":")[0]) - writeMetadataFile(pathToFile, parentPropertyTypes, parentPropertiesMap, fcMetaDataDict, fcMetaDataList) - - affiliation_name = parentPropertiesMap[AFFILIATION_PROPERTY_NAME].tryGetAsString() - extraCopy (affiliation_name, pathToFile) - - # get all fastqs in this dataSet - fastqFileList=getFileNames(pathPerLane) - - # put the files into the dataSet - affiliation_name = parentPropertiesMap[AFFILIATION_PROPERTY_NAME].tryGetAsString() - for file in fastqFileList: - extraCopy (affiliation_name, file) - # finally add the files to the data set - transaction.moveFile(file , dataSet, folders[f]) - - if foundSamples.size() > 0: - sa = transaction.getSampleForUpdate(foundSamples[0].getSampleIdentifier()) - sa.setPropertyValue("DATA_TRANSFERRED", create_openbis_timestamp()) - dataSet.setSample(foundSamples[0]) - -shutil.rmtree(incomingPath) diff --git a/deep_sequencing_unit/dist/etc/data-set-handler-pdf.py b/deep_sequencing_unit/dist/etc/data-set-handler-pdf.py deleted file mode 100755 index 1772673509eae9dfe59eb88f1416eb5ec42b8115..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/dist/etc/data-set-handler-pdf.py +++ /dev/null @@ -1,67 +0,0 @@ -''' - -Note: -print statements go to: ~openbis/sprint/datastore_server/log/startup_log.txt -''' - -import os -import fnmatch -import re -from ch.systemsx.cisd.openbis.generic.shared.api.v1.dto import SearchCriteria -from ch.systemsx.cisd.openbis.generic.shared.api.v1.dto import SearchSubCriteria - -FOLDER='/links/shared/dsu-dss/dss/incoming-jython-pdf/' -PDF_PATTERN='*.pdf' - -matches = [] -searchStrings = ['@PG'] -programList = [] - -# Create a "transaction" -- a way of grouping operations together so they all -# happen or none of them do. -transaction = service.transaction() - -# Create a data set and set type -dataSet = transaction.createNewDataSet("QUALITY_PDFS") -dataSet.setMeasuredData(False) - -incomingPath = incoming.getAbsolutePath() - -# Get the incoming name -# expected: -# Project_110907_SN792_0059_AC012FACXX_3/Sample_BSSE-DSU-1662/BSSE-DSU-1662_CGATGTA_L003_R1_001_sorted.pdf -name = incoming.getName() -split=name.split('_') -if (len(split) == 6): - incoming_sample=split[1]+ '_'+ split[2] + '_' + split[3] + '_' + split[4]+ ':' + split[-1] -if (len(split) ==4): - incoming_sample=split[1]+ '_'+ split[2] + ':' + split[-1] - - -# Looking for PDFS -for root, dirnames, filenames in os.walk(FOLDER + name): - for filename in fnmatch.filter(filenames, PDF_PATTERN): - matches.append(os.path.join(root, filename)) - - -# Add the incoming file into the data set -transaction.moveFile(incomingPath, dataSet) - -# Get the search service -search_service = transaction.getSearchService() - -# Search for the sample -sc = SearchCriteria() -sc.addMatchClause(SearchCriteria.MatchClause.createAttributeMatch(SearchCriteria.MatchClauseAttribute.CODE, incoming_sample)); -foundSamples = search_service.searchForSamples(sc) - -if foundSamples.size() > 0: - dataSet.setSample(foundSamples[0]) - - # Search for parent data set of the same sample - dataSetSc = SearchCriteria() - dataSetSc.addMatchClause(SearchCriteria.MatchClause.createAttributeMatch(SearchCriteria.MatchClauseAttribute.TYPE, 'FASTQ_GZ')) - dataSetSc.addSubCriteria(SearchSubCriteria.createSampleCriteria(sc)) - foundDataSets = search_service.searchForDataSets(dataSetSc) - if foundDataSets.size() > 0: - dataSet.setParentDatasets([ds.getDataSetCode() for ds in foundDataSets]) diff --git a/deep_sequencing_unit/dist/etc/data-set-handler-unaligned.py b/deep_sequencing_unit/dist/etc/data-set-handler-unaligned.py deleted file mode 100755 index c47815e82b4367f730c2c0e0c8ff346a0cf0a7b6..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/dist/etc/data-set-handler-unaligned.py +++ /dev/null @@ -1,113 +0,0 @@ -''' -Expects as incoming folder: <FlowCell>/Unaligned_no_mismatch - - -Note: -print statements go to: ~openbis/sprint/datastore_server/log/startup_log.txt -''' - -import os -import glob -import shutil -import time -#from java.lang import RuntimeException -from ch.systemsx.cisd.openbis.generic.shared.api.v1.dto import SearchCriteria -from ch.systemsx.cisd.openbis.generic.shared.api.v1.dto import SearchSubCriteria - -BASECALL_STATS_FOLDER = 'Basecall_Stats_' -REGEX_FILES = '*.*' -REGEX_MAKEFILE = 'Make*' -REGEX_LANES='/P*' -REGEX_UNDETERMINED = '/U*/Sample*' -UNALIGNED_FOLDER='Unaligned_no_mismatch' -LANE_FOLDER='/links/shared/dsu-dss/dss/incoming-jython-lanes/' -MARKER_STRING='.MARKER_is_finished_' - -def touch_markerfile(filename): - try: - # do a touch - open(filename, 'w').close() - except: - print('Could not touch ' + filename) - -def renameFiles(dir, flowcellName): - print dir - print flowcellName - for root, dirs, files in os.walk(dir): - for file in files: - print root + file - os.rename(root + '/' + file, root + "/" + flowcellName + "_" + file) - - -# Create a "transaction" -- a way of grouping operations together so they all -# happen or none of them do. -transaction = service.transaction() - -incomingPath = incoming.getAbsolutePath() - -# Get the incoming name and set the Data Set Type based on this -name = incoming.getName() -split=name.split("_") -if (len(split) == 4): - DSTYPE='ILLUMINA_HISEQ_OUTPUT' - flowcell=name.split("_")[-1][1:] -if (len(split) ==2): - DSTYPE='ILLUMINA_GA_OUTPUT' - flowcell=name.split("_")[-1] - # fix Illumina Script error: the GA FC Name does not contain a suffix A or B so noes not need to be removed - # but Illumina removes it anyway, so we just revert this - #os.rename(incomingPath + '/' + UNALIGNED_FOLDER + '/' + BASECALL_STATS_FOLDER + name.split("_")[-1][1:], incomingPath + '/' + UNALIGNED_FOLDER +'/' + BASECALL_STATS_FOLDER + flowcell) - -#move Lanes into a different drop box -laneList=glob.glob(incomingPath + '/'+ UNALIGNED_FOLDER + REGEX_LANES) -laneList.sort() - -undeterminedList=glob.glob(incomingPath + '/'+ UNALIGNED_FOLDER + REGEX_UNDETERMINED) -undeterminedList.sort() - -# add the Flow Cell Name to the Undetermined FASTQ files -[renameFiles(dir, flowcell) for dir in undeterminedList] - -# Multiplexing: -# First move the Undetermined reads to the other ones -[shutil.move(undeterminedLane, laneList[int(undeterminedLane.split('/')[-1][-1])-1] +'/' + undeterminedLane.split('/')[-1]) for undeterminedLane in undeterminedList] - -[shutil.move(lane, LANE_FOLDER+lane.split('/')[-1]) for lane in laneList] -markerFileList = [touch_markerfile(LANE_FOLDER+MARKER_STRING+lane.split('/')[-1]) for lane in laneList] - -# Create a data set and set type -dataSet = transaction.createNewDataSet("BASECALL_STATS") -dataSet.setMeasuredData(False) - -# Build up a list of file which are part of the data set -fileList=glob.glob(incomingPath + '/'+ UNALIGNED_FOLDER + '/' + REGEX_FILES) -[fileList.append(i) for i in glob.glob(incomingPath + '/' + UNALIGNED_FOLDER +'/' +REGEX_MAKEFILE)] - -# Add the incoming file into the data set -transaction.createNewDirectory(dataSet, UNALIGNED_FOLDER) -# move all files is data set -[transaction.moveFile(file, dataSet, UNALIGNED_FOLDER) for file in fileList] -# move base call stat dir into data set -print("flowcell: "+flowcell) -transaction.moveFile(incomingPath + '/' + UNALIGNED_FOLDER + '/' + BASECALL_STATS_FOLDER + flowcell, dataSet, UNALIGNED_FOLDER + '/') - -# Get the search service -search_service = transaction.getSearchService() - -# Search for the sample -sc = SearchCriteria() -sc.addMatchClause(SearchCriteria.MatchClause.createAttributeMatch(SearchCriteria.MatchClauseAttribute.CODE, name)) -foundSamples = search_service.searchForSamples(sc) - -if foundSamples.size() > 0: - dataSet.setSample(foundSamples[0]) - - # Search for another data set of the same sample and make it a child of it - dataSetSc = SearchCriteria() - dataSetSc.addMatchClause(SearchCriteria.MatchClause.createAttributeMatch(SearchCriteria.MatchClauseAttribute.TYPE, DSTYPE)) - dataSetSc.addSubCriteria(SearchSubCriteria.createSampleCriteria(sc)) - foundDataSets = search_service.searchForDataSets(dataSetSc) - if foundDataSets.size() > 0: - dataSet.setParentDatasets([ds.getDataSetCode() for ds in foundDataSets]) - -shutil.rmtree(incomingPath) diff --git a/deep_sequencing_unit/dist/etc/data-set-handler_fastqc.py b/deep_sequencing_unit/dist/etc/data-set-handler_fastqc.py deleted file mode 100644 index 49972b6b03cf87e75b6af88258cdbfe0b85eaa6b..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/dist/etc/data-set-handler_fastqc.py +++ /dev/null @@ -1,56 +0,0 @@ -''' -Expects as incoming folder: Project_120427_SN792_0110_AD0YCGACXX_1 - -Note: -print statements go to: ~openbis/sprint/datastore_server/log/startup_log.txt -''' - -import os -import shutil -from ch.systemsx.cisd.openbis.generic.shared.api.v1.dto import SearchCriteria -from ch.systemsx.cisd.openbis.generic.shared.api.v1.dto import SearchSubCriteria - -def renameFiles(dir, flowcellName): - print dir - print flowcellName - for root, dirs, files in os.walk(dir): - for file in files: - print root + file - os.rename(root + '/' + file, root + "/" + flowcellName + "_" + file) - - -# Create a "transaction" -- a way of grouping operations together so they all -# happen or none of them do. -transaction = service.transaction() - -incomingPath = incoming.getAbsolutePath() -name = incoming.getName() -fcAndLane = name.split("_",1)[-1] -flowCell, flowLane = fcAndLane.rsplit("_",1) -print flowLane - -# Get the search service -search_service = transaction.getSearchService() - -# Search for the sample -sc = SearchCriteria() -sc.addMatchClause(SearchCriteria.MatchClause.createAttributeMatch(SearchCriteria.MatchClauseAttribute.CODE, flowCell)) -foundSamples = search_service.searchForSamples(sc) - -if foundSamples.size() > 0: - - # Search for another data set of the same sample and make it a child of it - sampleSc = SearchCriteria() - sampleSc.addSubCriteria(SearchSubCriteria.createSampleContainerCriteria(sc)) - foundContainedSamples = search_service.searchForSamples(sampleSc) - if foundContainedSamples.size() > 0: - dataSet = transaction.createNewDataSet("FASTQC") - dataSet.setMeasuredData(False) - for indx in range(0, len(foundContainedSamples)): - lane = foundContainedSamples[indx].getCode().split(':')[-1] - print lane - if (flowLane == lane): - dataSet.setSample(foundContainedSamples[indx]) - # Add the incoming file into the data set - transaction.moveFile(incomingPath + "/fastqc/", dataSet) - break diff --git a/deep_sequencing_unit/dist/etc/data-set-handler_runinfostatistics.py b/deep_sequencing_unit/dist/etc/data-set-handler_runinfostatistics.py deleted file mode 100755 index da183924e4611602de133c0c0ad31bf2cbb4a04c..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/dist/etc/data-set-handler_runinfostatistics.py +++ /dev/null @@ -1,54 +0,0 @@ -''' -expected incoming Name for HiSeq2000 runs: 110715_SN792_0054_BC035RACXX -expected incoming Name for GAII runs: 110812_6353WAAXX - -Note: -print statements go to: ~openbis/sprint/datastore_server/log/startup_log.txt -''' - -import os -import shutil -from ch.systemsx.cisd.openbis.generic.shared.api.v1.dto import SearchCriteria -from ch.systemsx.cisd.openbis.generic.shared.api.v1.dto import SearchSubCriteria - -# Create a "transaction" -- a way of grouping operations together so they all -# happen or none of them do. -transaction = service.transaction() - -incomingPath = incoming.getAbsolutePath() -folders=[] -folders=os.listdir(incomingPath) - -# Get the incoming name -name = incoming.getName() - -split=name.split("_") -if (len(split) == 4): - IS_HISEQ_RUN=True -if (len(split) == 2): - IS_HISEQ_RUN=False - -# Get the search service -search_service = transaction.getSearchService() - -# Search for the sample -sc = SearchCriteria() -sc.addMatchClause(SearchCriteria.MatchClause.createAttributeMatch(SearchCriteria.MatchClauseAttribute.CODE, name)); -foundSamples = search_service.searchForSamples(sc) - -if foundSamples.size() > 0: - - # Search for another data set of the same sample and make it a child of it - sampleSc = SearchCriteria() - sampleSc.addSubCriteria(SearchSubCriteria.createSampleContainerCriteria(sc)) - foundContainedSamples = search_service.searchForSamples(sampleSc) - if foundContainedSamples.size() > 0: - for fcs in range(0,foundContainedSamples.size()): - dataSet = transaction.createNewDataSet("RUNINFO") - dataSet.setMeasuredData(False) - dataSet.setSample(foundContainedSamples[fcs]) - # Add the incoming file into the data set - shutil.copytree(incomingPath, incomingPath + "_" + str(fcs+1)) - transaction.moveFile(incomingPath + "_" + str(fcs+1), dataSet) - -shutil.rmtree(incomingPath) diff --git a/deep_sequencing_unit/dist/etc/data-set-handler_takeRTA_timestamp.py b/deep_sequencing_unit/dist/etc/data-set-handler_takeRTA_timestamp.py deleted file mode 100644 index 33fd7e3959293684ca9a97e4721ef80ae6fb8164..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/dist/etc/data-set-handler_takeRTA_timestamp.py +++ /dev/null @@ -1,48 +0,0 @@ -import os -import shutil -from time import * -from datetime import * -from ch.systemsx.cisd.openbis.generic.shared.api.v1.dto import SearchCriteria - -MarkerGAComplete = 'RTAComplete.txt' -MarkerHiSeqComplete = 'RTAComplete.txt' - -def createOpenbisTimeStamp(file): - ''' - Creates a openBIS compatible time stamp of a file time stamp - ''' - mtime = os.path.getmtime(file) - lt = localtime(mtime) - tz = localtime().tm_hour - gmtime().tm_hour - return (strftime("%Y-%m-%d %H:%M:%S GMT" + "%+.2d" % tz + ":00", lt)) - -# ----------------------------------------------------------------------------- - -# Create a "transaction" -- a way of grouping operations together so they all -# happen or none of them do. -transaction = service.transaction() - -incomingPath = incoming.getAbsolutePath() - -# Get the incoming name -name = incoming.getName() - -split=name.split("_") -if (len(split) == 4): - IS_HISEQ_RUN=True - Markerfile = incomingPath + "/" + MarkerHiSeqComplete -if (len(split) == 2): - Markerfile = incomingPath + "/" + MarkerGAComplete - - -# Search for the sample and check if there is already sample with this name -search_service = transaction.getSearchService() -sc = SearchCriteria() -sc.addMatchClause(SearchCriteria.MatchClause.createAttributeMatch(SearchCriteria.MatchClauseAttribute.CODE, name)); -foundSamples = search_service.searchForSamples(sc) - -if foundSamples.size() > 0: - sa = transaction.getSampleForUpdate(foundSamples[0].getSampleIdentifier()) - sa.setPropertyValue("SEQUENCER_FINISHED", createOpenbisTimeStamp(Markerfile)) - -shutil.rmtree(incomingPath) diff --git a/deep_sequencing_unit/dist/etc/log.xml b/deep_sequencing_unit/dist/etc/log.xml deleted file mode 100644 index 5512436db76cd83ba12ebfa1c59511659ea858a8..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/dist/etc/log.xml +++ /dev/null @@ -1,56 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" ?> -<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd"> - -<log4j:configuration xmlns:log4j='http://jakarta.apache.org/log4j/'> - - <appender name="DEFAULT" class="org.apache.log4j.DailyRollingFileAppender"> - - <param name="File" value="log/datastore_server_log.txt"/> - <param name="DatePattern" value="'.'yyyy-MM-dd"/> - - <layout class="org.apache.log4j.PatternLayout"> - <param name="ConversionPattern" value="%d %-5p [%t] %c - %m%n"/> - </layout> - - </appender> - - <appender name="STDOUT" class="org.apache.log4j.ConsoleAppender"> - <layout class="org.apache.log4j.PatternLayout"> - <param name="ConversionPattern" value="%d %-5p [%t] %c - %m%n"/> - </layout> - </appender> - - <appender name="NULL" class="org.apache.log4j.varia.NullAppender" /> - - <appender name="EMAIL" class="org.apache.log4j.net.SMTPAppender"> - - <param name="BufferSize" value="512" /> - <param name="SMTPHost" value="localhost" /> - <param name="From" value="dsu@localhost" /> - <param name="To" value="root@localhost" /> - <param name="Subject" value="ATTENTION: DSU Data Set Server" /> - <param name="EvaluatorClass" value="ch.systemsx.cisd.common.logging.AlwaysTrueTriggeringEventEvaluator" /> - - <layout class="org.apache.log4j.PatternLayout"> - <param name="ConversionPattern" value="%d %-5p [%t] %c - %m%n"/> - </layout> - - <!--filter class="org.apache.log4j.varia.LevelRangeFilter"> - <param name="LevelMin" value="ERROR"/> - <param name="LevelMax" value="FATAL"/> - </filter--> - - </appender> - - <category name="NOTIFY"> - <priority value="info" /> - <appender-ref ref="DEFAULT" /> - <appender-ref ref="EMAIL" /> - </category> - - <root> - <priority value="info" /> - <appender-ref ref="DEFAULT" /> - </root> - -</log4j:configuration> diff --git a/deep_sequencing_unit/dist/etc/passwd b/deep_sequencing_unit/dist/etc/passwd deleted file mode 100644 index 9a706e68a26f1e4e39733914a319ec5dfe169f3d..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/dist/etc/passwd +++ /dev/null @@ -1,4 +0,0 @@ -a:a@admins.com:A:The Admin:J3fII6Pex7jnCBwF+uXz2mFuB1QVhPUi -u:u@users.com:U:The User:dmbGKaGRmbX8YKfslMxUHObmYfjywkuT -o:o@observers.com:O:The Observer:t53ADCnFnEFhBvHB7FPoHhbHeW2O1KJc -etlserver::::SHGHSPawL/B3NKXD5nsu4fSrj5LwR2MX diff --git a/deep_sequencing_unit/dist/etc/service.properties b/deep_sequencing_unit/dist/etc/service.properties deleted file mode 100644 index 6d3c1edd9277f4ba6892ae457b9be1e3675ab775..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/dist/etc/service.properties +++ /dev/null @@ -1,228 +0,0 @@ -# Unique code of this Data Store Server. Not more than 40 characters. -data-store-server-code = DSS1 - -# The root directory of the data store -storeroot-dir = data/store - -# The directory where the command queue file is located; defaults to storeroot-dir -commandqueue-dir = - -# Port -port = 8444 - -# Session timeout in minutes -session-timeout = 720 - -# Path to the keystore -keystore.path = etc/openBIS.keystore - -# Password of the keystore -keystore.password = changeit - -# Key password of the keystore -keystore.key-password = changeit - -# The check interval (in seconds) -check-interval = 60 - -# The time-out for clean up work in the shutdown sequence (in seconds). -# Note that that the maximal time for the shutdown sequence to complete can be as large -# as twice this time. -# Remark: On a network file system, it is not recommended to turn this value to something -# lower than 180. -shutdown-timeout = 180 - -# If free disk space goes below value defined here, a notification email will be sent. -# Value must be specified in kilobytes (1048576 = 1024 * 1024 = 1GB). If no high water mark is -# specified or if value is negative, the system will not be watching. -highwater-mark = -1 - -# If a data set is successfully registered it sends out an email to the registrator. -# If this property is not specified, no email is sent to the registrator. This property -# does not affect the mails which are sent, when the data set could not be registered. -notify-successful-registration = false - -# The URL of the openBIS server -server-url = https://localhost:8443/openbis/openbis - -# The username to use when contacting the openBIS server -username = etlserver - -# The password to use when contacting the openBIS server -password = etlserver - -# The base URL for Web client access. -download-url = https://localhost:8444 - -# SMTP properties (must start with 'mail' to be considered). -# mail.smtp.host = localhost -# mail.from = datastore_server@localhost - -# ---------------- Timing parameters for file system operations on remote shares. - -# Time (in seconds) to wait for any file system operation to finish. Operations exceeding this -# timeout will be terminated. -timeout = 60 -# Number of times that a timed out operation will be tried again (0 means: every file system -# operation will only ever be performed once). -max-retries = 11 -# Time (in seconds) to wait after an operation has been timed out before re-trying. -failure-interval = 10 - -# The period of no write access that needs to pass before an incoming data item is considered -# complete and ready to be processed (in seconds) [default: 300]. -# Valid only when auto-detection method is used to determine if an incoming data are ready to be processed. -quiet-period = 10 - -# Globally used separator character which separates entities in a data set file name -data-set-file-name-entity-separator = _ - -# Specifies what should happen if an error occurs during dataset processing. -# By default this flag is set to false and user has to modify the 'faulty paths file' -# each time the faulty dataset should be processed again. -# Set this flag to true if the processing should be repeated after some time without manual intervention. -# Note that this can increase the server load. -# reprocess-faulty-datasets = false - -# --------------------------------------------------------------------------- -# reporting and processing plugins configuration -# --------------------------------------------------------------------------- - -# Comma separated names of reporting plugins. Each plugin should have configuration properties prefixed with its name. -# If name has 'default-' prefix it will be used by default in data set Data View. -reporting-plugins = illumina-summary - -# Label of the plugin which will be shown for the users. -illumina-summary.label = Illumina Summary -# Comma separated list of dataset type codes which can be handled by this plugin. -illumina-summary.dataset-types = SHORT_READS_SEQUENCING, ILLUMINA_GA_OUTPUT -# Plugin class specification (together with the list of packages this class belongs to). -illumina-summary.class = ch.ethz.bsse.cisd.dsu.dss.plugins.IlluminaSummaryReportingPlugin -# The property file. Its content will be passed as a parameter to the plugin. -illumina-summary.properties-file = - -# Comma separated names of processing threads. Each thread should have configuration properties prefixed with its name. -# E.g. 'code-extractor' property for the thread 'my-etl' should be specified as 'my-etl.code-extractor' -inputs = flow-cell, fl1, fl2, fl3, fl4, fl5, fl6, fl7, fl8 - -# --------------------------------------------------------------------------- -# 'flow-cell' thread configuration -# --------------------------------------------------------------------------- -# The directory to watch for incoming data. -flow-cell.incoming-dir = data/incoming - -# Determines when the incoming data should be considered complete and ready to be processed. -# Allowed values: -# - auto-detection - when no write access will be detected for a specified 'quite-period' -# - marker-file - when an appropriate marker file for the data exists. -# The default value is 'marker-file'. -flow-cell.incoming-data-completeness-condition = auto-detection - -# The space the samples extracted by this thread belong to. If commented out or empty, then samples -# are considered associated to a database instance (not group private). -# flow-cell.space-code = <change this> - -# ---------------- Plugin properties -# The extractor class to use for code extraction -flow-cell.data-set-info-extractor = ch.systemsx.cisd.etlserver.DefaultDataSetInfoExtractor -flow-cell.data-set-info-extractor.strip-file-extension = true -flow-cell.data-set-info-extractor.entity-separator = ${data-set-file-name-entity-separator} -flow-cell.data-set-info-extractor.space-code = TEST -# Location of file containing data set properties -#flow-cell.data-set-info-extractor.data-set-properties-file-name = data-set.properties - -# The extractor class to use for type extraction -flow-cell.type-extractor = ch.systemsx.cisd.etlserver.SimpleTypeExtractor -flow-cell.type-extractor.file-format-type = PROPRIETARY -flow-cell.type-extractor.locator-type = RELATIVE_LOCATION -flow-cell.type-extractor.data-set-type = FLOW_CELL -flow-cell.type-extractor.is-measured = true - -# The storage processor (IStorageProcessor implementation) -flow-cell.storage-processor = ch.ethz.bsse.cisd.dsu.dss.StorageProcessor -flow-cell.storage-processor.processor = ch.systemsx.cisd.etlserver.DefaultStorageProcessor -# Template of flow-lane drop boxes. {0} is the place holder for flow lane number -flow-cell.storage-processor.flow-lane-drop-box-template = data/drop-box-{0} -flow-cell.storage-processor.transfer.BSSE = data/drop-box-bsse -flow-cell.storage-processor.meta-data-file-prefix = PREFIX_FOR_TSV - -# -------- Flow Lane 1 -------------------------------------- -fl1.incoming-dir = data/drop-box-1 -fl1.data-set-info-extractor = ch.ethz.bsse.cisd.dsu.dss.FlowLaneDataSetInfoExtractor -fl1.data-set-info-extractor.entity-separator = ${data-set-file-name-entity-separator} -fl1.data-set-info-extractor.index-of-space-code = 0 -fl1.type-extractor = ch.systemsx.cisd.etlserver.SimpleTypeExtractor -fl1.type-extractor.file-format-type = PROPRIETARY -fl1.type-extractor.data-set-type = FLOW_LANE -fl1.storage-processor = ch.systemsx.cisd.etlserver.DefaultStorageProcessor - -# -------- Flow Lane 2 -------------------------------------- -fl2.incoming-dir = data/drop-box-2 -fl2.data-set-info-extractor = ch.ethz.bsse.cisd.dsu.dss.FlowLaneDataSetInfoExtractor -fl2.data-set-info-extractor.entity-separator = ${data-set-file-name-entity-separator} -fl2.data-set-info-extractor.index-of-space-code = 0 -fl2.type-extractor = ch.systemsx.cisd.etlserver.SimpleTypeExtractor -fl2.type-extractor.file-format-type = PROPRIETARY -fl2.type-extractor.data-set-type = FLOW_LANE -fl2.storage-processor = ch.systemsx.cisd.etlserver.DefaultStorageProcessor - -# -------- Flow Lane 3 -------------------------------------- -fl3.incoming-dir = data/drop-box-3 -fl3.data-set-info-extractor = ch.ethz.bsse.cisd.dsu.dss.FlowLaneDataSetInfoExtractor -fl3.data-set-info-extractor.entity-separator = ${data-set-file-name-entity-separator} -fl3.data-set-info-extractor.index-of-space-code = 0 -fl3.type-extractor = ch.systemsx.cisd.etlserver.SimpleTypeExtractor -fl3.type-extractor.file-format-type = PROPRIETARY -fl3.type-extractor.data-set-type = FLOW_LANE -fl3.storage-processor = ch.systemsx.cisd.etlserver.DefaultStorageProcessor - -# -------- Flow Lane 4 -------------------------------------- -fl4.incoming-dir = data/drop-box-4 -fl4.data-set-info-extractor = ch.ethz.bsse.cisd.dsu.dss.FlowLaneDataSetInfoExtractor -fl4.data-set-info-extractor.entity-separator = ${data-set-file-name-entity-separator} -fl4.data-set-info-extractor.index-of-space-code = 0 -fl4.type-extractor = ch.systemsx.cisd.etlserver.SimpleTypeExtractor -fl4.type-extractor.file-format-type = PROPRIETARY -fl4.type-extractor.data-set-type = FLOW_LANE -fl4.storage-processor = ch.systemsx.cisd.etlserver.DefaultStorageProcessor - -# -------- Flow Lane 5 -------------------------------------- -fl5.incoming-dir = data/drop-box-5 -fl5.data-set-info-extractor = ch.ethz.bsse.cisd.dsu.dss.FlowLaneDataSetInfoExtractor -fl5.data-set-info-extractor.entity-separator = ${data-set-file-name-entity-separator} -fl5.data-set-info-extractor.index-of-space-code = 0 -fl5.type-extractor = ch.systemsx.cisd.etlserver.SimpleTypeExtractor -fl5.type-extractor.file-format-type = PROPRIETARY -fl5.type-extractor.data-set-type = FLOW_LANE -fl5.storage-processor = ch.systemsx.cisd.etlserver.DefaultStorageProcessor - -# -------- Flow Lane 6 -------------------------------------- -fl6.incoming-dir = data/drop-box-6 -fl6.data-set-info-extractor = ch.ethz.bsse.cisd.dsu.dss.FlowLaneDataSetInfoExtractor -fl6.data-set-info-extractor.entity-separator = ${data-set-file-name-entity-separator} -fl6.data-set-info-extractor.index-of-space-code = 0 -fl6.type-extractor = ch.systemsx.cisd.etlserver.SimpleTypeExtractor -fl6.type-extractor.file-format-type = PROPRIETARY -fl6.type-extractor.data-set-type = FLOW_LANE -fl6.storage-processor = ch.systemsx.cisd.etlserver.DefaultStorageProcessor - -# -------- Flow Lane 7 -------------------------------------- -fl7.incoming-dir = data/drop-box-7 -fl7.data-set-info-extractor = ch.ethz.bsse.cisd.dsu.dss.FlowLaneDataSetInfoExtractor -fl7.data-set-info-extractor.entity-separator = ${data-set-file-name-entity-separator} -fl7.data-set-info-extractor.index-of-space-code = 0 -fl7.type-extractor = ch.systemsx.cisd.etlserver.SimpleTypeExtractor -fl7.type-extractor.file-format-type = PROPRIETARY -fl7.type-extractor.data-set-type = FLOW_LANE -fl7.storage-processor = ch.systemsx.cisd.etlserver.DefaultStorageProcessor - -# -------- Flow Lane 8 -------------------------------------- -fl8.incoming-dir = data/drop-box-8 -fl8.data-set-info-extractor = ch.ethz.bsse.cisd.dsu.dss.FlowLaneDataSetInfoExtractor -fl8.data-set-info-extractor.entity-separator = ${data-set-file-name-entity-separator} -fl8.data-set-info-extractor.index-of-space-code = 0 -fl8.type-extractor = ch.systemsx.cisd.etlserver.SimpleTypeExtractor -fl8.type-extractor.file-format-type = PROPRIETARY -fl8.type-extractor.data-set-type = FLOW_LANE -fl8.storage-processor = ch.systemsx.cisd.etlserver.DefaultStorageProcessor -jython-version=2.7 diff --git a/deep_sequencing_unit/etc/log.xml b/deep_sequencing_unit/etc/log.xml deleted file mode 100644 index 5cee0a68436a19a6c4ec4b14b580e6d9f75bf84f..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/etc/log.xml +++ /dev/null @@ -1,19 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" ?> -<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd"> - -<log4j:configuration xmlns:log4j='http://jakarta.apache.org/log4j/'> - - <appender name="STDOUT" class="org.apache.log4j.ConsoleAppender"> - <layout class="org.apache.log4j.PatternLayout"> - <param name="ConversionPattern" value="%d %-5p [%t] %c - %m%n"/> - </layout> - </appender> - - <appender name="NULL" class="org.apache.log4j.varia.NullAppender" /> - - <root> - <priority value ="info" /> - <appender-ref ref="STDOUT" /> - </root> - -</log4j:configuration> diff --git a/deep_sequencing_unit/etc/service.properties b/deep_sequencing_unit/etc/service.properties deleted file mode 100644 index be9f4246ff676cff42dc96beffd2551e4e86b09d..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/etc/service.properties +++ /dev/null @@ -1,189 +0,0 @@ -# Unique code of this Data Store Server. Not more than 40 characters. -data-store-server-code = DSS1 - -# The root directory of the data store -storeroot-dir = targets/playground/store -root = ${root-dir} -incoming-root-dir = ${root-dir} - -# The directory where the command queue file is located; defaults to storeroot-dir -commandqueue-dir = - -# Port -port = 8889 - -# Session timeout in minutes -session-timeout = 720 - -use-ssl = false - -# Path to the keystore -keystore.path = ../datastore_server/dist/etc/openBIS.keystore - -# Password of the keystore -keystore.password = changeit - -# Key password of the keystore -keystore.key-password = changeit - -# The check interval (in seconds) -check-interval = 5 - -# The time-out for clean up work in the shutdown sequence (in seconds). -# Note that that the maximal time for the shutdown sequence to complete can be as large -# as twice this time. -# Remark: On a network file system, it is not recommended to turn this value to something -# lower than 180. -shutdown-timeout = 2 - -# If free disk space goes below value defined here, a notification email will be sent. -# Value must be specified in kilobytes (1048576 = 1024 * 1024 = 1GB). If no high water mark is -# specified or if value is negative, the system will not be watching. -highwater-mark = -1 - -# If a data set is successfully registered it sends out an email to the registrator. -# If this property is not specified, no email is sent to the registrator. This property -# does not affect the mails which are sent, when the data set could not be registered. -notify-successful-registration = false - -# The URL of the openBIS server -server-url = http://localhost:8888/openbis - -# The username to use when contacting the openBIS server -username = etlserver_bsse - -# The password to use when contacting the openBIS server -password = etlserver - -# The base URL for Web client access. -download-url = http://localhost:${port} - -# SMTP properties (must start with 'mail' to be considered). -mail.smtp.host = file://targets/playground/email -# mail.from = datastore_server@localhost - -# ---------------- Timing parameters for file system operations on remote shares. - -# Time (in seconds) to wait for any file system operation to finish. Operations exceeding this -# timeout will be terminated. -timeout = 60 -# Number of times that a timed out operation will be tried again (0 means: every file system -# operation will only ever be performed once). -max-retries = 11 -# Time (in seconds) to wait after an operation has been timed out before re-trying. -failure-interval = 10 - -# The period of no write access that needs to pass before an incoming data item is considered -# complete and ready to be processed (in seconds) [default: 300]. -# Valid only when auto-detection method is used to determine if an incoming data are ready to be processed. -quiet-period = 10 - -# Globally used separator character which separates entities in a data set file name -data-set-file-name-entity-separator = : - -# Specifies what should happen if an error occurs during dataset processing. -# By default this flag is set to false and user has to modify the 'faulty paths file' -# each time the faulty dataset should be processed again. -# Set this flag to true if the processing should be repeated after some time without manual intervention. -# Note that this can increase the server load. -# reprocess-faulty-datasets = false - -# --------------------------------------------------------------------------- -# reporting and processing plugins configuration -# --------------------------------------------------------------------------- - -# Comma separated names of reporting plugins. Each plugin should have configuration properties prefixed with its name. -# If name has 'default-' prefix it will be used by default in data set Data View. -reporting-plugins = illumina-summary - -# Label of the plugin which will be shown for the users. -illumina-summary.label = Illumina Summary -# Comma separated list of dataset type codes which can be handled by this plugin. -illumina-summary.dataset-types = BASECALL_STATS, ILLUMINA_GA_OUTPUT -# Plugin class specification (together with the list of packages this class belongs to). -illumina-summary.class = ch.ethz.bsse.cisd.dsu.dss.plugins.IlluminaSummaryReportingPlugin -# The property file. Its content will be passed as a parameter to the plugin. -illumina-summary.properties-file = - -processing-plugins = to-SOFT -to-SOFT.label = Flow Lane to SOFT Exporter -to-SOFT.dataset-types = FLOW_LANE -to-SOFT.class = ch.ethz.bsse.cisd.dsu.dss.plugins.DataSetToSOFT -#to-SOFT.properties-file = - -# Comma separated names of processing threads. Each thread should have configuration properties prefixed with its name. -# E.g. 'code-extractor' property for the thread 'my-etl' should be specified as 'my-etl.code-extractor' -inputs = flow-cell, fl1, default, jbasecall - -default.incoming-dir = targets/playground/default_upload -default.incoming-data-completeness-condition = auto-detection -default.data-set-info-extractor = ch.systemsx.cisd.etlserver.DefaultDataSetInfoExtractor -default.data-set-info-extractor.strip-file-extension = true -default.data-set-info-extractor.entity-separator = ${data-set-file-name-entity-separator} -default.data-set-info-extractor.space-code = BSSE_FLOWCELLS -default.type-extractor = ch.systemsx.cisd.etlserver.SimpleTypeExtractor -default.type-extractor.file-format-type = PROPRIETARY -default.type-extractor.locator-type = RELATIVE_LOCATION -default.type-extractor.data-set-type = ILLUMINA_GA_OUTPUT -default.type-extractor.is-measured = true -default.storage-processor = ch.systemsx.cisd.etlserver.DefaultStorageProcessor -default.storage-processor.processor = ch.systemsx.cisd.etlserver.DefaultStorageProcessor - - -# --------------------------------------------------------------------------- -# 'flow-cell' thread configuration -# --------------------------------------------------------------------------- -# The directory to watch for incoming data. -flow-cell.incoming-dir = targets/playground/incoming-flow-cell - -# Determines when the incoming data should be considered complete and ready to be processed. -# Allowed values: -# - auto-detection - when no write access will be detected for a specified 'quite-period' -# - marker-file - when an appropriate marker file for the data exists. -# The default value is 'marker-file'. -flow-cell.incoming-data-completeness-condition = auto-detection - -# The space the samples extracted by this thread belong to. If commented out or empty, then samples -# are considered associated to a database instance (not space private). -# flow-cell.space-code = <change this> - -# ---------------- Plugin properties -# The extractor class to use for code extraction -flow-cell.data-set-info-extractor = ch.systemsx.cisd.etlserver.DefaultDataSetInfoExtractor -flow-cell.data-set-info-extractor.strip-file-extension = true -flow-cell.data-set-info-extractor.entity-separator = ${data-set-file-name-entity-separator} -flow-cell.data-set-info-extractor.space-code = BSSE -# Location of file containing data set properties -#flow-cell.data-set-info-extractor.data-set-properties-file-name = data-set.properties - -# The extractor class to use for type extraction -flow-cell.type-extractor = ch.systemsx.cisd.etlserver.SimpleTypeExtractor -flow-cell.type-extractor.file-format-type = PROPRIETARY -flow-cell.type-extractor.locator-type = RELATIVE_LOCATION -flow-cell.type-extractor.data-set-type = ILLUMINA_GA_OUTPUT -flow-cell.type-extractor.is-measured = true - -# The storage processor (IStorageProcessor implementation) -flow-cell.storage-processor = ch.ethz.bsse.cisd.dsu.dss.StorageProcessor -flow-cell.storage-processor.processor = ch.systemsx.cisd.etlserver.DefaultStorageProcessor -flow-cell.storage-processor.flow-lane-drop-box-template = targets/playground/drop-box-{0} -flow-cell.storage-processor.entity-separator = ${data-set-file-name-entity-separator} -flow-cell.storage-processor.transfer.FMI = targets/playground/drop-box-fmi -flow-cell.storage-processor.meta-data-file-prefix = PREFIX_FOR_TSV - -# -------- Flow Lane 1 -------------------------------------- -fl1.incoming-dir = targets/playground/drop-box-1 -fl1.data-set-info-extractor = ch.ethz.bsse.cisd.dsu.dss.FlowLaneDataSetInfoExtractor -fl1.data-set-info-extractor.entity-separator = ${data-set-file-name-entity-separator} -fl1.data-set-info-extractor.index-of-space-code = 0 -fl1.type-extractor = ch.systemsx.cisd.etlserver.SimpleTypeExtractor -fl1.type-extractor.file-format-type = SRF -fl1.type-extractor.data-set-type = SRF_PER_LANE -fl1.storage-processor = ch.systemsx.cisd.etlserver.DefaultStorageProcessor - -jbasecall.incoming-dir = targets/playground/incoming-jython-basecall-stats -jbasecall.top-level-data-set-handler = ch.systemsx.cisd.etlserver.registrator.JythonTopLevelDataSetHandler -jbasecall.script-path = ${root}/dss/jython_scripts/data-set-handler-basecall-stats.py -jbasecall.storage-processor = ch.systemsx.cisd.etlserver.DefaultStorageProcessor -jbasecall.incoming-data-completeness-condition = marker-file -jython-version=2.7 diff --git a/deep_sequencing_unit/etc/web-client.properties b/deep_sequencing_unit/etc/web-client.properties deleted file mode 100644 index f946e8e9637b650d76c5bb464b0dffb5d75843af..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/etc/web-client.properties +++ /dev/null @@ -1,77 +0,0 @@ -# Experimental: Enable moving entities to trash (non-permanent deletion). -# Default value: false -enable-trash = true - -# Default view mode that should be used if user doesn't have it specified in URL. -# Options: 'NORMAL' (standard mode - default), 'SIMPLE' (readonly mode with simplified GUI). -# -#default-view-mode = SIMPLE - -# Flag specifying whether default login mode is anonymous or not. -# If true a user-for-anonymous-login has to be defined in service.properties -# Default value: false -#default-anonymous-login = true - -# Maximal number of visible columns in tables. Default: 50. -max-visible-columns = 25 - -# Should the feature of adding unofficial/ad-hoc terms to vocabularies be turned on. -# Default value: false -allow-adding-unofficial-terms = true - -# (optional) List of data set types for which there should be an image overview shown in dataset tables. -# If not specified image overview will not be shown for any datasets. -data-set-types-with-image-overview = HCS_IMAGE, UNKNOWN - -# (optional) Allows power users adding vocabulary terms when editing the form. -# If not specified, default is false -# allow-adding-unofficial-terms = true - -# Configuration of entity (experiment, sample, data set, material) detail views. -# -# Mandatory properties: -# - view (entity detail view id) -# - types (list of entity type codes) -# Optional properties: -# - hide-sections (list of section ids) -# - hide-smart-view (removes "Smart View" from Data Set Detail View -> Data View) (generic_dataset_viewer) -# - hide-file-view (removes "File View" from Data Set Detail View -> Data View) (generic_dataset_viewer) -# Available sections in entity-detail-views: -# generic_dataset_viewer -# data-set-data-section -# data-set-parents-section -# data-set-children-section -# data-set-contained-section -# query-section -# generic_experiment_viewer -# data-sets-section -# attachment-section -# query-section -# experiment-sample-section -# generic_sample_viewer -# container-sample-section -# derived-samples-section -# parent-samples-section -# data-sets-section -# attachment-section -# query-section -# generic_material_viewer -# query-section -# -# Example: -# -detail-views = sample-view, experiment-view, data-view - -sample-view.view = generic_sample_viewer -sample-view.types = CELL_PLATE, CONTROL_LAYOUT -sample-view.hide-sections = attachment-section, module-section - -experiment-view.view = generic_experiment_viewer -experiment-view.types = COMPOUND_HCS -experiment-view.hide-sections = attachment-section - -data-view.view = generic_dataset_viewer -data-view.types = HCS_IMAGE -data-view.hide-smart-view = false -data-view.hide-file-view = false - diff --git a/deep_sequencing_unit/gradle/wrapper/gradle-wrapper.jar b/deep_sequencing_unit/gradle/wrapper/gradle-wrapper.jar deleted file mode 100644 index 5c2d1cf016b3885f6930543d57b744ea8c220a1a..0000000000000000000000000000000000000000 Binary files a/deep_sequencing_unit/gradle/wrapper/gradle-wrapper.jar and /dev/null differ diff --git a/deep_sequencing_unit/gradle/wrapper/gradle-wrapper.properties b/deep_sequencing_unit/gradle/wrapper/gradle-wrapper.properties deleted file mode 100644 index 7745c4ec463c7bb1c4ff6a5e58db239890345152..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/gradle/wrapper/gradle-wrapper.properties +++ /dev/null @@ -1,5 +0,0 @@ -distributionBase=GRADLE_USER_HOME -distributionPath=wrapper/dists -distributionUrl=https\://sissource.ethz.ch/openbis/openbis-public/openbis-ivy/-/raw/main/gradle/distribution/7.4/gradle-7.4-bin.zip -zipStoreBase=GRADLE_USER_HOME -zipStorePath=wrapper/dists diff --git a/deep_sequencing_unit/gradlew b/deep_sequencing_unit/gradlew deleted file mode 100755 index 83f2acfdc319a24e8766cca78f32474ad7a22dd6..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/gradlew +++ /dev/null @@ -1,188 +0,0 @@ -#!/usr/bin/env sh - -# -# Copyright 2015 the original author or authors. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# https://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# - -############################################################################## -## -## Gradle start up script for UN*X -## -############################################################################## - -# Attempt to set APP_HOME -# Resolve links: $0 may be a link -PRG="$0" -# Need this for relative symlinks. -while [ -h "$PRG" ] ; do - ls=`ls -ld "$PRG"` - link=`expr "$ls" : '.*-> \(.*\)$'` - if expr "$link" : '/.*' > /dev/null; then - PRG="$link" - else - PRG=`dirname "$PRG"`"/$link" - fi -done -SAVED="`pwd`" -cd "`dirname \"$PRG\"`/" >/dev/null -APP_HOME="`pwd -P`" -cd "$SAVED" >/dev/null - -APP_NAME="Gradle" -APP_BASE_NAME=`basename "$0"` - -# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' - -# Use the maximum available, or set MAX_FD != -1 to use that value. -MAX_FD="maximum" - -warn () { - echo "$*" -} - -die () { - echo - echo "$*" - echo - exit 1 -} - -# OS specific support (must be 'true' or 'false'). -cygwin=false -msys=false -darwin=false -nonstop=false -case "`uname`" in - CYGWIN* ) - cygwin=true - ;; - Darwin* ) - darwin=true - ;; - MINGW* ) - msys=true - ;; - NONSTOP* ) - nonstop=true - ;; -esac - -CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar - -# Determine the Java command to use to start the JVM. -if [ -n "$JAVA_HOME" ] ; then - if [ -x "$JAVA_HOME/jre/sh/java" ] ; then - # IBM's JDK on AIX uses strange locations for the executables - JAVACMD="$JAVA_HOME/jre/sh/java" - else - JAVACMD="$JAVA_HOME/bin/java" - fi - if [ ! -x "$JAVACMD" ] ; then - die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME - -Please set the JAVA_HOME variable in your environment to match the -location of your Java installation." - fi -else - JAVACMD="java" - which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. - -Please set the JAVA_HOME variable in your environment to match the -location of your Java installation." -fi - -# Increase the maximum file descriptors if we can. -if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then - MAX_FD_LIMIT=`ulimit -H -n` - if [ $? -eq 0 ] ; then - if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then - MAX_FD="$MAX_FD_LIMIT" - fi - ulimit -n $MAX_FD - if [ $? -ne 0 ] ; then - warn "Could not set maximum file descriptor limit: $MAX_FD" - fi - else - warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" - fi -fi - -# For Darwin, add options to specify how the application appears in the dock -if $darwin; then - GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" -fi - -# For Cygwin or MSYS, switch paths to Windows format before running java -if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then - APP_HOME=`cygpath --path --mixed "$APP_HOME"` - CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` - JAVACMD=`cygpath --unix "$JAVACMD"` - - # We build the pattern for arguments to be converted via cygpath - ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` - SEP="" - for dir in $ROOTDIRSRAW ; do - ROOTDIRS="$ROOTDIRS$SEP$dir" - SEP="|" - done - OURCYGPATTERN="(^($ROOTDIRS))" - # Add a user-defined pattern to the cygpath arguments - if [ "$GRADLE_CYGPATTERN" != "" ] ; then - OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" - fi - # Now convert the arguments - kludge to limit ourselves to /bin/sh - i=0 - for arg in "$@" ; do - CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` - CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option - - if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition - eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` - else - eval `echo args$i`="\"$arg\"" - fi - i=$((i+1)) - done - case $i in - (0) set -- ;; - (1) set -- "$args0" ;; - (2) set -- "$args0" "$args1" ;; - (3) set -- "$args0" "$args1" "$args2" ;; - (4) set -- "$args0" "$args1" "$args2" "$args3" ;; - (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; - (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; - (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; - (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; - (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; - esac -fi - -# Escape application args -save () { - for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done - echo " " -} -APP_ARGS=$(save "$@") - -# Collect all arguments for the java command, following the shell quoting and substitution rules -eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" - -# by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong -if [ "$(uname)" = "Darwin" ] && [ "$HOME" = "$PWD" ]; then - cd "$(dirname "$0")" -fi - -exec "$JAVACMD" "$@" diff --git a/deep_sequencing_unit/gradlew.bat b/deep_sequencing_unit/gradlew.bat deleted file mode 100644 index 24467a141f791695fc1009c78d913b2c849d1412..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/gradlew.bat +++ /dev/null @@ -1,100 +0,0 @@ -@rem -@rem Copyright 2015 the original author or authors. -@rem -@rem Licensed under the Apache License, Version 2.0 (the "License"); -@rem you may not use this file except in compliance with the License. -@rem You may obtain a copy of the License at -@rem -@rem https://www.apache.org/licenses/LICENSE-2.0 -@rem -@rem Unless required by applicable law or agreed to in writing, software -@rem distributed under the License is distributed on an "AS IS" BASIS, -@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -@rem See the License for the specific language governing permissions and -@rem limitations under the License. -@rem - -@if "%DEBUG%" == "" @echo off -@rem ########################################################################## -@rem -@rem Gradle startup script for Windows -@rem -@rem ########################################################################## - -@rem Set local scope for the variables with windows NT shell -if "%OS%"=="Windows_NT" setlocal - -set DIRNAME=%~dp0 -if "%DIRNAME%" == "" set DIRNAME=. -set APP_BASE_NAME=%~n0 -set APP_HOME=%DIRNAME% - -@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" - -@rem Find java.exe -if defined JAVA_HOME goto findJavaFromJavaHome - -set JAVA_EXE=java.exe -%JAVA_EXE% -version >NUL 2>&1 -if "%ERRORLEVEL%" == "0" goto init - -echo. -echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. -echo. -echo Please set the JAVA_HOME variable in your environment to match the -echo location of your Java installation. - -goto fail - -:findJavaFromJavaHome -set JAVA_HOME=%JAVA_HOME:"=% -set JAVA_EXE=%JAVA_HOME%/bin/java.exe - -if exist "%JAVA_EXE%" goto init - -echo. -echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% -echo. -echo Please set the JAVA_HOME variable in your environment to match the -echo location of your Java installation. - -goto fail - -:init -@rem Get command-line arguments, handling Windows variants - -if not "%OS%" == "Windows_NT" goto win9xME_args - -:win9xME_args -@rem Slurp the command line arguments. -set CMD_LINE_ARGS= -set _SKIP=2 - -:win9xME_args_slurp -if "x%~1" == "x" goto execute - -set CMD_LINE_ARGS=%* - -:execute -@rem Setup the command line - -set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar - -@rem Execute Gradle -"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% - -:end -@rem End local scope for the variables with windows NT shell -if "%ERRORLEVEL%"=="0" goto mainEnd - -:fail -rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of -rem the _cmd.exe /c_ return code! -if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 -exit /b 1 - -:mainEnd -if "%OS%"=="Windows_NT" endlocal - -:omega diff --git a/deep_sequencing_unit/metadata/etc/log.xml b/deep_sequencing_unit/metadata/etc/log.xml deleted file mode 100644 index 5cee0a68436a19a6c4ec4b14b580e6d9f75bf84f..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/metadata/etc/log.xml +++ /dev/null @@ -1,19 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" ?> -<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd"> - -<log4j:configuration xmlns:log4j='http://jakarta.apache.org/log4j/'> - - <appender name="STDOUT" class="org.apache.log4j.ConsoleAppender"> - <layout class="org.apache.log4j.PatternLayout"> - <param name="ConversionPattern" value="%d %-5p [%t] %c - %m%n"/> - </layout> - </appender> - - <appender name="NULL" class="org.apache.log4j.varia.NullAppender" /> - - <root> - <priority value ="info" /> - <appender-ref ref="STDOUT" /> - </root> - -</log4j:configuration> diff --git a/deep_sequencing_unit/metadata/etc/openBIS.keystore b/deep_sequencing_unit/metadata/etc/openBIS.keystore deleted file mode 100644 index 28d6c1945533908c76f28785953cbed4004c4555..0000000000000000000000000000000000000000 Binary files a/deep_sequencing_unit/metadata/etc/openBIS.keystore and /dev/null differ diff --git a/deep_sequencing_unit/metadata/etc/service.properties b/deep_sequencing_unit/metadata/etc/service.properties deleted file mode 100644 index d2377c4fad0186133029e6d3b46fec5cd8ad939f..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/metadata/etc/service.properties +++ /dev/null @@ -1,8 +0,0 @@ -openbis-user = kohleman -openbis-password = password -openbis-server-url = http://127.0.0.1:8888 - -pathinfo-db-connection-string = jdbc:postgresql://localhost:5432/pathinfo_productive -pathinfo-db-user = postgres -pathinfo-db-password = postgres -jython-version=2.7 diff --git a/deep_sequencing_unit/resource/DSU TrackingClient.launch b/deep_sequencing_unit/resource/DSU TrackingClient.launch deleted file mode 100644 index f27f8805548cbdda4bcae72bd80dece4983ed5ef..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/resource/DSU TrackingClient.launch +++ /dev/null @@ -1,28 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?> -<launchConfiguration type="org.eclipse.jdt.launching.localJavaApplication"> -<listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_PATHS"> -<listEntry value="/deep_sequencing_unit/source/java/ch/ethz/bsse/cisd/dsu/tracking/main/TrackingClient.java"/> -</listAttribute> -<listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_TYPES"> -<listEntry value="1"/> -</listAttribute> -<listAttribute key="org.eclipse.debug.ui.favoriteGroups"> -<listEntry value="org.eclipse.debug.ui.launchGroup.run"/> -</listAttribute> -<listAttribute key="org.eclipse.jdt.launching.CLASSPATH"> -<listEntry value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <runtimeClasspathEntry containerPath="org.eclipse.jdt.launching.JRE_CONTAINER" javaProject="deep_sequencing_unit" path="1" type="4"/> "/> -<listEntry value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <runtimeClasspathEntry path="3" projectName="openbis" type="1"/> "/> -<listEntry value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <runtimeClasspathEntry path="3" projectName="authentication" type="1"/> "/> -<listEntry value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <runtimeClasspathEntry path="3" projectName="openbis-common" type="1"/> "/> -<listEntry value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <runtimeClasspathEntry path="3" projectName="openbis_api" type="1"/> "/> -<listEntry value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <runtimeClasspathEntry path="3" projectName="dbmigration" type="1"/> "/> -<listEntry value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <runtimeClasspathEntry path="3" projectName="common" type="1"/> "/> -<listEntry value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <runtimeClasspathEntry internalArchive="/libraries/hibernate-search/jsr250-api.jar" path="3" type="2"/> "/> -<listEntry value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <runtimeClasspathEntry id="org.eclipse.jdt.launching.classpathentry.defaultClasspath"> <memento exportedEntriesOnly="false" project="deep_sequencing_unit"/> </runtimeClasspathEntry> "/> -</listAttribute> -<booleanAttribute key="org.eclipse.jdt.launching.DEFAULT_CLASSPATH" value="false"/> -<stringAttribute key="org.eclipse.jdt.launching.MAIN_TYPE" value="ch.ethz.bsse.cisd.dsu.tracking.main.TrackingClient"/> -<stringAttribute key="org.eclipse.jdt.launching.PROJECT_ATTR" value="deep_sequencing_unit"/> -<stringAttribute key="org.eclipse.jdt.launching.VM_ARGUMENTS" value="-Xmx1G -Djavax.net.ssl.trustStore=etc/openBIS.keystore"/> -<stringAttribute key="org.eclipse.jdt.launching.WORKING_DIRECTORY" value="${workspace_loc:deep_sequencing_unit/tracking}"/> -</launchConfiguration> diff --git a/deep_sequencing_unit/resource/dependency-structure.ddf b/deep_sequencing_unit/resource/dependency-structure.ddf deleted file mode 100644 index e152acbfae5479eeb7090ab77dbdb3931166bdfa..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/resource/dependency-structure.ddf +++ /dev/null @@ -1,16 +0,0 @@ -#show allResults - -{root} = ch.ethz.bsse.cisd.dsu -{dss} = ${root}.dss -{openbis} = ch.systemsx.cisd.openbis - -###################################################################### -# Check dependencies to openbis - -[dss] = ${dss}.* -[private_openbis] = ${openbis}.* excluding [dss] ${openbis}.dss.generic.shared.* ${openbis}.generic.shared.* ${openbis}.dss.generic.server.plugins.* ${openbis}.common.* - -check sets [dss] - -check [dss] independentOf [private_openbis] - diff --git a/deep_sequencing_unit/resource/dsu-master-data.py b/deep_sequencing_unit/resource/dsu-master-data.py deleted file mode 100644 index 0a2e7e5b7dbd4f30d8113a13a31d4365a2acbbae..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/resource/dsu-master-data.py +++ /dev/null @@ -1,3623 +0,0 @@ -# -*- coding: utf-8 -*- -import ch.systemsx.cisd.openbis.generic.server.jython.api.v1.DataType as DataType - -tr = service.transaction() - - -file_type_FASTQ_PHRED_64 = tr.createNewFileFormatType('FASTQ_PHRED_64') -file_type_FASTQ_PHRED_64.setDescription('FastQ Format with PHRED+64 quality values (as deliverd by Illumina GA Pipeline >= 1.3)') - -file_type_HDF5 = tr.createNewFileFormatType('HDF5') -file_type_HDF5.setDescription('Hierarchical Data Format File, version 5') - -file_type_PROPRIETARY = tr.createNewFileFormatType('PROPRIETARY') -file_type_PROPRIETARY.setDescription('Proprietary Format File') - -file_type_SRF = tr.createNewFileFormatType('SRF') -file_type_SRF.setDescription('Sequence Read Format File') - -file_type_TIFF = tr.createNewFileFormatType('TIFF') -file_type_TIFF.setDescription('TIFF File') - -file_type_TSV = tr.createNewFileFormatType('TSV') -file_type_TSV.setDescription('Tab Separated Values File') - -file_type_XML = tr.createNewFileFormatType('XML') -file_type_XML.setDescription('XML File') - -vocabulary_STORAGE_FORMAT = tr.createNewVocabulary('STORAGE_FORMAT') -vocabulary_STORAGE_FORMAT.setDescription('The on-disk storage format of a data set') -vocabulary_STORAGE_FORMAT.setUrlTemplate(None) -vocabulary_STORAGE_FORMAT.setManagedInternally(True) -vocabulary_STORAGE_FORMAT.setInternalNamespace(True) -vocabulary_STORAGE_FORMAT.setChosenFromList(True) - -vocabulary_term_STORAGE_FORMAT_PROPRIETARY = tr.createNewVocabularyTerm('PROPRIETARY') -vocabulary_term_STORAGE_FORMAT_PROPRIETARY.setDescription(None) -vocabulary_term_STORAGE_FORMAT_PROPRIETARY.setLabel(None) -vocabulary_term_STORAGE_FORMAT_PROPRIETARY.setOrdinal(1) -vocabulary_STORAGE_FORMAT.addTerm(vocabulary_term_STORAGE_FORMAT_PROPRIETARY) - -vocabulary_term_STORAGE_FORMAT_BDS_DIRECTORY = tr.createNewVocabularyTerm('BDS_DIRECTORY') -vocabulary_term_STORAGE_FORMAT_BDS_DIRECTORY.setDescription(None) -vocabulary_term_STORAGE_FORMAT_BDS_DIRECTORY.setLabel(None) -vocabulary_term_STORAGE_FORMAT_BDS_DIRECTORY.setOrdinal(2) -vocabulary_STORAGE_FORMAT.addTerm(vocabulary_term_STORAGE_FORMAT_BDS_DIRECTORY) - -vocabulary_AFFILIATION = tr.createNewVocabulary('AFFILIATION') -vocabulary_AFFILIATION.setDescription('Where will the data be shipped after analysis and where will the bill be sent to') -vocabulary_AFFILIATION.setUrlTemplate(None) -vocabulary_AFFILIATION.setManagedInternally(False) -vocabulary_AFFILIATION.setInternalNamespace(False) -vocabulary_AFFILIATION.setChosenFromList(True) - -vocabulary_term_AFFILIATION_NOVARTIS = tr.createNewVocabularyTerm('NOVARTIS') -vocabulary_term_AFFILIATION_NOVARTIS.setDescription(None) -vocabulary_term_AFFILIATION_NOVARTIS.setLabel('Novartis') -vocabulary_term_AFFILIATION_NOVARTIS.setOrdinal(6) -vocabulary_AFFILIATION.addTerm(vocabulary_term_AFFILIATION_NOVARTIS) - -vocabulary_term_AFFILIATION_ETHZ_NON_BSSE = tr.createNewVocabularyTerm('ETHZ_NON_BSSE') -vocabulary_term_AFFILIATION_ETHZ_NON_BSSE.setDescription(None) -vocabulary_term_AFFILIATION_ETHZ_NON_BSSE.setLabel('ETHZ non-BSSE') -vocabulary_term_AFFILIATION_ETHZ_NON_BSSE.setOrdinal(9) -vocabulary_AFFILIATION.addTerm(vocabulary_term_AFFILIATION_ETHZ_NON_BSSE) - -vocabulary_term_AFFILIATION_OTHER = tr.createNewVocabularyTerm('OTHER') -vocabulary_term_AFFILIATION_OTHER.setDescription(None) -vocabulary_term_AFFILIATION_OTHER.setLabel('Other') -vocabulary_term_AFFILIATION_OTHER.setOrdinal(8) -vocabulary_AFFILIATION.addTerm(vocabulary_term_AFFILIATION_OTHER) - -vocabulary_term_AFFILIATION_BSSE = tr.createNewVocabularyTerm('BSSE') -vocabulary_term_AFFILIATION_BSSE.setDescription(None) -vocabulary_term_AFFILIATION_BSSE.setLabel('BSSE') -vocabulary_term_AFFILIATION_BSSE.setOrdinal(7) -vocabulary_AFFILIATION.addTerm(vocabulary_term_AFFILIATION_BSSE) - -vocabulary_term_AFFILIATION_UNI_ZUERICH = tr.createNewVocabularyTerm('UNI_ZUERICH') -vocabulary_term_AFFILIATION_UNI_ZUERICH.setDescription(None) -vocabulary_term_AFFILIATION_UNI_ZUERICH.setLabel(None) -vocabulary_term_AFFILIATION_UNI_ZUERICH.setOrdinal(11) -vocabulary_AFFILIATION.addTerm(vocabulary_term_AFFILIATION_UNI_ZUERICH) - -vocabulary_term_AFFILIATION_BIOCENTER_BASEL = tr.createNewVocabularyTerm('BIOCENTER_BASEL') -vocabulary_term_AFFILIATION_BIOCENTER_BASEL.setDescription(None) -vocabulary_term_AFFILIATION_BIOCENTER_BASEL.setLabel('Biocenter Basel') -vocabulary_term_AFFILIATION_BIOCENTER_BASEL.setOrdinal(3) -vocabulary_AFFILIATION.addTerm(vocabulary_term_AFFILIATION_BIOCENTER_BASEL) - -vocabulary_term_AFFILIATION_PHIX = tr.createNewVocabularyTerm('PHIX') -vocabulary_term_AFFILIATION_PHIX.setDescription(None) -vocabulary_term_AFFILIATION_PHIX.setLabel(None) -vocabulary_term_AFFILIATION_PHIX.setOrdinal(5) -vocabulary_AFFILIATION.addTerm(vocabulary_term_AFFILIATION_PHIX) - -vocabulary_term_AFFILIATION_UNI_BERN = tr.createNewVocabularyTerm('UNI_BERN') -vocabulary_term_AFFILIATION_UNI_BERN.setDescription(None) -vocabulary_term_AFFILIATION_UNI_BERN.setLabel(None) -vocabulary_term_AFFILIATION_UNI_BERN.setOrdinal(10) -vocabulary_AFFILIATION.addTerm(vocabulary_term_AFFILIATION_UNI_BERN) - -vocabulary_term_AFFILIATION_FMI = tr.createNewVocabularyTerm('FMI') -vocabulary_term_AFFILIATION_FMI.setDescription(None) -vocabulary_term_AFFILIATION_FMI.setLabel('FMI') -vocabulary_term_AFFILIATION_FMI.setOrdinal(2) -vocabulary_AFFILIATION.addTerm(vocabulary_term_AFFILIATION_FMI) - -vocabulary_term_AFFILIATION_UNIVERSITY_HOSPITAL_ZURICH = tr.createNewVocabularyTerm('UNIVERSITY_HOSPITAL_ZURICH') -vocabulary_term_AFFILIATION_UNIVERSITY_HOSPITAL_ZURICH.setDescription(None) -vocabulary_term_AFFILIATION_UNIVERSITY_HOSPITAL_ZURICH.setLabel(None) -vocabulary_term_AFFILIATION_UNIVERSITY_HOSPITAL_ZURICH.setOrdinal(12) -vocabulary_AFFILIATION.addTerm(vocabulary_term_AFFILIATION_UNIVERSITY_HOSPITAL_ZURICH) - -vocabulary_term_AFFILIATION_UNIVERSITY_BASEL = tr.createNewVocabularyTerm('UNIVERSITY_BASEL') -vocabulary_term_AFFILIATION_UNIVERSITY_BASEL.setDescription(None) -vocabulary_term_AFFILIATION_UNIVERSITY_BASEL.setLabel('University of Basel') -vocabulary_term_AFFILIATION_UNIVERSITY_BASEL.setOrdinal(4) -vocabulary_AFFILIATION.addTerm(vocabulary_term_AFFILIATION_UNIVERSITY_BASEL) - -vocabulary_AGILENT_KIT = tr.createNewVocabulary('AGILENT_KIT') -vocabulary_AGILENT_KIT.setDescription(None) -vocabulary_AGILENT_KIT.setUrlTemplate(None) -vocabulary_AGILENT_KIT.setManagedInternally(False) -vocabulary_AGILENT_KIT.setInternalNamespace(False) -vocabulary_AGILENT_KIT.setChosenFromList(True) - -vocabulary_term_AGILENT_KIT_AGILENT_DNA_KIT_1000 = tr.createNewVocabularyTerm('AGILENT_DNA_KIT_1000') -vocabulary_term_AGILENT_KIT_AGILENT_DNA_KIT_1000.setDescription(None) -vocabulary_term_AGILENT_KIT_AGILENT_DNA_KIT_1000.setLabel(None) -vocabulary_term_AGILENT_KIT_AGILENT_DNA_KIT_1000.setOrdinal(1) -vocabulary_AGILENT_KIT.addTerm(vocabulary_term_AGILENT_KIT_AGILENT_DNA_KIT_1000) - -vocabulary_term_AGILENT_KIT_AGILENT_HIGH_SENSITIVITY_DNA_KIT = tr.createNewVocabularyTerm('AGILENT_HIGH_SENSITIVITY_DNA_KIT') -vocabulary_term_AGILENT_KIT_AGILENT_HIGH_SENSITIVITY_DNA_KIT.setDescription(None) -vocabulary_term_AGILENT_KIT_AGILENT_HIGH_SENSITIVITY_DNA_KIT.setLabel(None) -vocabulary_term_AGILENT_KIT_AGILENT_HIGH_SENSITIVITY_DNA_KIT.setOrdinal(2) -vocabulary_AGILENT_KIT.addTerm(vocabulary_term_AGILENT_KIT_AGILENT_HIGH_SENSITIVITY_DNA_KIT) - -vocabulary_ALIGNMENT_SOFTWARE = tr.createNewVocabulary('ALIGNMENT_SOFTWARE') -vocabulary_ALIGNMENT_SOFTWARE.setDescription('If an alignment is requested, which software package should be use?') -vocabulary_ALIGNMENT_SOFTWARE.setUrlTemplate(None) -vocabulary_ALIGNMENT_SOFTWARE.setManagedInternally(False) -vocabulary_ALIGNMENT_SOFTWARE.setInternalNamespace(False) -vocabulary_ALIGNMENT_SOFTWARE.setChosenFromList(True) - -vocabulary_term_ALIGNMENT_SOFTWARE_BOWTIE = tr.createNewVocabularyTerm('BOWTIE') -vocabulary_term_ALIGNMENT_SOFTWARE_BOWTIE.setDescription(None) -vocabulary_term_ALIGNMENT_SOFTWARE_BOWTIE.setLabel(None) -vocabulary_term_ALIGNMENT_SOFTWARE_BOWTIE.setOrdinal(9) -vocabulary_ALIGNMENT_SOFTWARE.addTerm(vocabulary_term_ALIGNMENT_SOFTWARE_BOWTIE) - -vocabulary_term_ALIGNMENT_SOFTWARE_BWA = tr.createNewVocabularyTerm('BWA') -vocabulary_term_ALIGNMENT_SOFTWARE_BWA.setDescription(None) -vocabulary_term_ALIGNMENT_SOFTWARE_BWA.setLabel(None) -vocabulary_term_ALIGNMENT_SOFTWARE_BWA.setOrdinal(6) -vocabulary_ALIGNMENT_SOFTWARE.addTerm(vocabulary_term_ALIGNMENT_SOFTWARE_BWA) - -vocabulary_term_ALIGNMENT_SOFTWARE_BOWTIE_0127 = tr.createNewVocabularyTerm('BOWTIE_0.12.7') -vocabulary_term_ALIGNMENT_SOFTWARE_BOWTIE_0127.setDescription(None) -vocabulary_term_ALIGNMENT_SOFTWARE_BOWTIE_0127.setLabel(None) -vocabulary_term_ALIGNMENT_SOFTWARE_BOWTIE_0127.setOrdinal(7) -vocabulary_ALIGNMENT_SOFTWARE.addTerm(vocabulary_term_ALIGNMENT_SOFTWARE_BOWTIE_0127) - -vocabulary_term_ALIGNMENT_SOFTWARE_ELAND = tr.createNewVocabularyTerm('ELAND') -vocabulary_term_ALIGNMENT_SOFTWARE_ELAND.setDescription(None) -vocabulary_term_ALIGNMENT_SOFTWARE_ELAND.setLabel(None) -vocabulary_term_ALIGNMENT_SOFTWARE_ELAND.setOrdinal(3) -vocabulary_ALIGNMENT_SOFTWARE.addTerm(vocabulary_term_ALIGNMENT_SOFTWARE_ELAND) - -vocabulary_term_ALIGNMENT_SOFTWARE_NOT_NEEDED = tr.createNewVocabularyTerm('NOT_NEEDED') -vocabulary_term_ALIGNMENT_SOFTWARE_NOT_NEEDED.setDescription(None) -vocabulary_term_ALIGNMENT_SOFTWARE_NOT_NEEDED.setLabel(None) -vocabulary_term_ALIGNMENT_SOFTWARE_NOT_NEEDED.setOrdinal(1) -vocabulary_ALIGNMENT_SOFTWARE.addTerm(vocabulary_term_ALIGNMENT_SOFTWARE_NOT_NEEDED) - -vocabulary_term_ALIGNMENT_SOFTWARE_MAQ = tr.createNewVocabularyTerm('MAQ') -vocabulary_term_ALIGNMENT_SOFTWARE_MAQ.setDescription(None) -vocabulary_term_ALIGNMENT_SOFTWARE_MAQ.setLabel(None) -vocabulary_term_ALIGNMENT_SOFTWARE_MAQ.setOrdinal(5) -vocabulary_ALIGNMENT_SOFTWARE.addTerm(vocabulary_term_ALIGNMENT_SOFTWARE_MAQ) - -vocabulary_term_ALIGNMENT_SOFTWARE_NOVOALIGN = tr.createNewVocabularyTerm('NOVOALIGN') -vocabulary_term_ALIGNMENT_SOFTWARE_NOVOALIGN.setDescription(None) -vocabulary_term_ALIGNMENT_SOFTWARE_NOVOALIGN.setLabel(None) -vocabulary_term_ALIGNMENT_SOFTWARE_NOVOALIGN.setOrdinal(8) -vocabulary_ALIGNMENT_SOFTWARE.addTerm(vocabulary_term_ALIGNMENT_SOFTWARE_NOVOALIGN) - -vocabulary_BARCODES = tr.createNewVocabulary('BARCODES') -vocabulary_BARCODES.setDescription('Index 1 for Illumina Indexing') -vocabulary_BARCODES.setUrlTemplate(None) -vocabulary_BARCODES.setManagedInternally(False) -vocabulary_BARCODES.setInternalNamespace(False) -vocabulary_BARCODES.setChosenFromList(True) - -vocabulary_term_BARCODES_TCGGCAA = tr.createNewVocabularyTerm('TCGGCAA') -vocabulary_term_BARCODES_TCGGCAA.setDescription(None) -vocabulary_term_BARCODES_TCGGCAA.setLabel('DNA Adapter 48') -vocabulary_term_BARCODES_TCGGCAA.setOrdinal(90) -vocabulary_BARCODES.addTerm(vocabulary_term_BARCODES_TCGGCAA) - -vocabulary_term_BARCODES_TATAATA = tr.createNewVocabularyTerm('TATAATA') -vocabulary_term_BARCODES_TATAATA.setDescription(None) -vocabulary_term_BARCODES_TATAATA.setLabel('DNA Adapter 44') -vocabulary_term_BARCODES_TATAATA.setOrdinal(86) -vocabulary_BARCODES.addTerm(vocabulary_term_BARCODES_TATAATA) - -vocabulary_term_BARCODES_CTAGCTA = tr.createNewVocabularyTerm('CTAGCTA') -vocabulary_term_BARCODES_CTAGCTA.setDescription(None) -vocabulary_term_BARCODES_CTAGCTA.setLabel('DNA Adapter 38') -vocabulary_term_BARCODES_CTAGCTA.setOrdinal(80) -vocabulary_BARCODES.addTerm(vocabulary_term_BARCODES_CTAGCTA) - -vocabulary_term_BARCODES_GTGAAAC = tr.createNewVocabularyTerm('GTGAAAC') -vocabulary_term_BARCODES_GTGAAAC.setDescription('Illumina, Nextera or Scriptseq') -vocabulary_term_BARCODES_GTGAAAC.setLabel('Index19 GTGAAAC') -vocabulary_term_BARCODES_GTGAAAC.setOrdinal(18) -vocabulary_BARCODES.addTerm(vocabulary_term_BARCODES_GTGAAAC) - -vocabulary_term_BARCODES_CGTACGT = tr.createNewVocabularyTerm('CGTACGT') -vocabulary_term_BARCODES_CGTACGT.setDescription('Illumina, Nextera or Scriptseq') -vocabulary_term_BARCODES_CGTACGT.setLabel('Index22 CGTACGT') -vocabulary_term_BARCODES_CGTACGT.setOrdinal(21) -vocabulary_BARCODES.addTerm(vocabulary_term_BARCODES_CGTACGT) - -vocabulary_term_BARCODES_CGAGGCTG = tr.createNewVocabularyTerm('CGAGGCTG') -vocabulary_term_BARCODES_CGAGGCTG.setDescription('Nextera DNA') -vocabulary_term_BARCODES_CGAGGCTG.setLabel('Index1 (i7) N710 CGAGGCTG') -vocabulary_term_BARCODES_CGAGGCTG.setOrdinal(34) -vocabulary_BARCODES.addTerm(vocabulary_term_BARCODES_CGAGGCTG) - -vocabulary_term_BARCODES_TCATTCA = tr.createNewVocabularyTerm('TCATTCA') -vocabulary_term_BARCODES_TCATTCA.setDescription(None) -vocabulary_term_BARCODES_TCATTCA.setLabel('DNA Adapter 45') -vocabulary_term_BARCODES_TCATTCA.setOrdinal(87) -vocabulary_BARCODES.addTerm(vocabulary_term_BARCODES_TCATTCA) - -vocabulary_term_BARCODES_TAGCTTA = tr.createNewVocabularyTerm('TAGCTTA') -vocabulary_term_BARCODES_TAGCTTA.setDescription('Illumina, Nextera or Scriptseq') -vocabulary_term_BARCODES_TAGCTTA.setLabel('Index10 TAGCTTA') -vocabulary_term_BARCODES_TAGCTTA.setOrdinal(10) -vocabulary_BARCODES.addTerm(vocabulary_term_BARCODES_TAGCTTA) - -vocabulary_term_BARCODES_AGCATAA = tr.createNewVocabularyTerm('AGCATAA') -vocabulary_term_BARCODES_AGCATAA.setDescription(None) -vocabulary_term_BARCODES_AGCATAA.setLabel('20 AGCATAA') -vocabulary_term_BARCODES_AGCATAA.setOrdinal(42) -vocabulary_BARCODES.addTerm(vocabulary_term_BARCODES_AGCATAA) - -vocabulary_term_BARCODES_TTCGTCA = tr.createNewVocabularyTerm('TTCGTCA') -vocabulary_term_BARCODES_TTCGTCA.setDescription(None) -vocabulary_term_BARCODES_TTCGTCA.setLabel('17 TTCGTCA') -vocabulary_term_BARCODES_TTCGTCA.setOrdinal(40) -vocabulary_BARCODES.addTerm(vocabulary_term_BARCODES_TTCGTCA) - -vocabulary_term_BARCODES_TTACTTA = tr.createNewVocabularyTerm('TTACTTA') -vocabulary_term_BARCODES_TTACTTA.setDescription(None) -vocabulary_term_BARCODES_TTACTTA.setLabel('74 TTACTT') -vocabulary_term_BARCODES_TTACTTA.setOrdinal(58) -vocabulary_BARCODES.addTerm(vocabulary_term_BARCODES_TTACTTA) - -vocabulary_term_BARCODES_GAAGCCA = tr.createNewVocabularyTerm('GAAGCCA') -vocabulary_term_BARCODES_GAAGCCA.setDescription(None) -vocabulary_term_BARCODES_GAAGCCA.setLabel('52 GAAGCC') -vocabulary_term_BARCODES_GAAGCCA.setOrdinal(50) -vocabulary_BARCODES.addTerm(vocabulary_term_BARCODES_GAAGCCA) - -vocabulary_term_BARCODES_CTCTCTAC = tr.createNewVocabularyTerm('CTCTCTAC') -vocabulary_term_BARCODES_CTCTCTAC.setDescription('Nextera DNA') -vocabulary_term_BARCODES_CTCTCTAC.setLabel('Index1 (i7) N707 CTCTCTAC') -vocabulary_term_BARCODES_CTCTCTAC.setOrdinal(31) -vocabulary_BARCODES.addTerm(vocabulary_term_BARCODES_CTCTCTAC) - -vocabulary_term_BARCODES_CGGAATA = tr.createNewVocabularyTerm('CGGAATA') -vocabulary_term_BARCODES_CGGAATA.setDescription(None) -vocabulary_term_BARCODES_CGGAATA.setLabel('DNA Adapter 37') -vocabulary_term_BARCODES_CGGAATA.setOrdinal(79) -vocabulary_BARCODES.addTerm(vocabulary_term_BARCODES_CGGAATA) - -vocabulary_term_BARCODES_GTAGAGA = tr.createNewVocabularyTerm('GTAGAGA') -vocabulary_term_BARCODES_GTAGAGA.setDescription(None) -vocabulary_term_BARCODES_GTAGAGA.setLabel('DNA Adapter 17') -vocabulary_term_BARCODES_GTAGAGA.setOrdinal(62) -vocabulary_BARCODES.addTerm(vocabulary_term_BARCODES_GTAGAGA) - -vocabulary_term_BARCODES_CCGTCCA = tr.createNewVocabularyTerm('CCGTCCA') -vocabulary_term_BARCODES_CCGTCCA.setDescription(None) -vocabulary_term_BARCODES_CCGTCCA.setLabel('DNA Adapter 16') -vocabulary_term_BARCODES_CCGTCCA.setOrdinal(61) -vocabulary_BARCODES.addTerm(vocabulary_term_BARCODES_CCGTCCA) - -vocabulary_term_BARCODES_CTTGTAA = tr.createNewVocabularyTerm('CTTGTAA') -vocabulary_term_BARCODES_CTTGTAA.setDescription('Illumina, Nextera or Scriptseq') -vocabulary_term_BARCODES_CTTGTAA.setLabel('Index12 CTTGTAA') -vocabulary_term_BARCODES_CTTGTAA.setOrdinal(12) -vocabulary_BARCODES.addTerm(vocabulary_term_BARCODES_CTTGTAA) - -vocabulary_term_BARCODES_AGTCAAC = tr.createNewVocabularyTerm('AGTCAAC') -vocabulary_term_BARCODES_AGTCAAC.setDescription(None) -vocabulary_term_BARCODES_AGTCAAC.setLabel('Index13 AGTCAAC') -vocabulary_term_BARCODES_AGTCAAC.setOrdinal(91) -vocabulary_BARCODES.addTerm(vocabulary_term_BARCODES_AGTCAAC) - -vocabulary_term_BARCODES_CTGACCA = tr.createNewVocabularyTerm('CTGACCA') -vocabulary_term_BARCODES_CTGACCA.setDescription(None) -vocabulary_term_BARCODES_CTGACCA.setLabel('50 CTGACC') -vocabulary_term_BARCODES_CTGACCA.setOrdinal(49) -vocabulary_BARCODES.addTerm(vocabulary_term_BARCODES_CTGACCA) - -vocabulary_term_BARCODES_TGACCAA = tr.createNewVocabularyTerm('TGACCAA') -vocabulary_term_BARCODES_TGACCAA.setDescription('Illumina, Nextera or Scriptseq') -vocabulary_term_BARCODES_TGACCAA.setLabel('Index4 TGACCAA') -vocabulary_term_BARCODES_TGACCAA.setOrdinal(4) -vocabulary_BARCODES.addTerm(vocabulary_term_BARCODES_TGACCAA) - -vocabulary_term_BARCODES_ATCACGA = tr.createNewVocabularyTerm('ATCACGA') -vocabulary_term_BARCODES_ATCACGA.setDescription('Illumina, Nextera or Scriptseq') -vocabulary_term_BARCODES_ATCACGA.setLabel('Index1 ATCACGA') -vocabulary_term_BARCODES_ATCACGA.setOrdinal(1) -vocabulary_BARCODES.addTerm(vocabulary_term_BARCODES_ATCACGA) - -vocabulary_term_BARCODES_TCCCGAA = tr.createNewVocabularyTerm('TCCCGAA') -vocabulary_term_BARCODES_TCCCGAA.setDescription(None) -vocabulary_term_BARCODES_TCCCGAA.setLabel('DNA Adapter 46') -vocabulary_term_BARCODES_TCCCGAA.setOrdinal(88) -vocabulary_BARCODES.addTerm(vocabulary_term_BARCODES_TCCCGAA) - -vocabulary_term_BARCODES_CAAAAGA = tr.createNewVocabularyTerm('CAAAAGA') -vocabulary_term_BARCODES_CAAAAGA.setDescription(None) -vocabulary_term_BARCODES_CAAAAGA.setLabel('DNA Adapter 28') -vocabulary_term_BARCODES_CAAAAGA.setOrdinal(70) -vocabulary_BARCODES.addTerm(vocabulary_term_BARCODES_CAAAAGA) - -vocabulary_term_BARCODES_CGTACTAG = tr.createNewVocabularyTerm('CGTACTAG') -vocabulary_term_BARCODES_CGTACTAG.setDescription('Nextera DNA') -vocabulary_term_BARCODES_CGTACTAG.setLabel('Index1 (i7) N702 CGTACTAG') -vocabulary_term_BARCODES_CGTACTAG.setOrdinal(26) -vocabulary_BARCODES.addTerm(vocabulary_term_BARCODES_CGTACTAG) - -vocabulary_term_BARCODES_GGCTACA = tr.createNewVocabularyTerm('GGCTACA') -vocabulary_term_BARCODES_GGCTACA.setDescription('Illumina, Nextera or Scriptseq') -vocabulary_term_BARCODES_GGCTACA.setLabel('Index11 GGCTACA') -vocabulary_term_BARCODES_GGCTACA.setOrdinal(11) -vocabulary_BARCODES.addTerm(vocabulary_term_BARCODES_GGCTACA) - -vocabulary_term_BARCODES_ATGTCAA = tr.createNewVocabularyTerm('ATGTCAA') -vocabulary_term_BARCODES_ATGTCAA.setDescription(None) -vocabulary_term_BARCODES_ATGTCAA.setLabel('DNA Adapter 15') -vocabulary_term_BARCODES_ATGTCAA.setOrdinal(60) -vocabulary_BARCODES.addTerm(vocabulary_term_BARCODES_ATGTCAA) - -vocabulary_term_BARCODES_GAGTGGA = tr.createNewVocabularyTerm('GAGTGGA') -vocabulary_term_BARCODES_GAGTGGA.setDescription('Illumina, Nextera or Scriptseq') -vocabulary_term_BARCODES_GAGTGGA.setLabel('Index23 GAGTGGA') -vocabulary_term_BARCODES_GAGTGGA.setOrdinal(22) -vocabulary_BARCODES.addTerm(vocabulary_term_BARCODES_GAGTGGA) - -vocabulary_term_BARCODES_GGACTCCT = tr.createNewVocabularyTerm('GGACTCCT') -vocabulary_term_BARCODES_GGACTCCT.setDescription('Nextera DNA') -vocabulary_term_BARCODES_GGACTCCT.setLabel('Index1 (i7) N705 GGACTCCT') -vocabulary_term_BARCODES_GGACTCCT.setOrdinal(29) -vocabulary_BARCODES.addTerm(vocabulary_term_BARCODES_GGACTCCT) - -vocabulary_term_BARCODES_CTATACA = tr.createNewVocabularyTerm('CTATACA') -vocabulary_term_BARCODES_CTATACA.setDescription(None) -vocabulary_term_BARCODES_CTATACA.setLabel('DNA Adapter 39') -vocabulary_term_BARCODES_CTATACA.setOrdinal(81) -vocabulary_BARCODES.addTerm(vocabulary_term_BARCODES_CTATACA) - -vocabulary_term_BARCODES_TCCTGAGC = tr.createNewVocabularyTerm('TCCTGAGC') -vocabulary_term_BARCODES_TCCTGAGC.setDescription('Nextera DNA') -vocabulary_term_BARCODES_TCCTGAGC.setLabel('Index1 (i7) N704 TCCTGAGC') -vocabulary_term_BARCODES_TCCTGAGC.setOrdinal(28) -vocabulary_BARCODES.addTerm(vocabulary_term_BARCODES_TCCTGAGC) - -vocabulary_term_BARCODES_CACTCAA = tr.createNewVocabularyTerm('CACTCAA') -vocabulary_term_BARCODES_CACTCAA.setDescription(None) -vocabulary_term_BARCODES_CACTCAA.setLabel('DNA Adapter 32') -vocabulary_term_BARCODES_CACTCAA.setOrdinal(74) -vocabulary_BARCODES.addTerm(vocabulary_term_BARCODES_CACTCAA) - -vocabulary_term_BARCODES_CAGATCA = tr.createNewVocabularyTerm('CAGATCA') -vocabulary_term_BARCODES_CAGATCA.setDescription('Illumina, Nextera or Scriptseq') -vocabulary_term_BARCODES_CAGATCA.setLabel('Index7 CAGATCA') -vocabulary_term_BARCODES_CAGATCA.setOrdinal(7) -vocabulary_BARCODES.addTerm(vocabulary_term_BARCODES_CAGATCA) - -vocabulary_term_BARCODES_CGATGTA = tr.createNewVocabularyTerm('CGATGTA') -vocabulary_term_BARCODES_CGATGTA.setDescription('Illumina, Nextera or Scriptseq') -vocabulary_term_BARCODES_CGATGTA.setLabel('Index2 CGATGTA') -vocabulary_term_BARCODES_CGATGTA.setOrdinal(2) -vocabulary_BARCODES.addTerm(vocabulary_term_BARCODES_CGATGTA) - -vocabulary_term_BARCODES_AGTTCCG = tr.createNewVocabularyTerm('AGTTCCG') -vocabulary_term_BARCODES_AGTTCCG.setDescription('Illumina, Nextera or Scriptseq') -vocabulary_term_BARCODES_AGTTCCG.setLabel('Index14 AGTTCCG') -vocabulary_term_BARCODES_AGTTCCG.setOrdinal(14) -vocabulary_BARCODES.addTerm(vocabulary_term_BARCODES_AGTTCCG) - -vocabulary_term_BARCODES_TAAGGCGA = tr.createNewVocabularyTerm('TAAGGCGA') -vocabulary_term_BARCODES_TAAGGCGA.setDescription('Nextera DNA') -vocabulary_term_BARCODES_TAAGGCGA.setLabel('Index1 (i7) N701 TAAGGCGA') -vocabulary_term_BARCODES_TAAGGCGA.setOrdinal(25) -vocabulary_BARCODES.addTerm(vocabulary_term_BARCODES_TAAGGCGA) - -vocabulary_term_BARCODES_GACGACA = tr.createNewVocabularyTerm('GACGACA') -vocabulary_term_BARCODES_GACGACA.setDescription(None) -vocabulary_term_BARCODES_GACGACA.setLabel('DNA Adapter 41') -vocabulary_term_BARCODES_GACGACA.setOrdinal(83) -vocabulary_BARCODES.addTerm(vocabulary_term_BARCODES_GACGACA) - -vocabulary_term_BARCODES_CACGATA = tr.createNewVocabularyTerm('CACGATA') -vocabulary_term_BARCODES_CACGATA.setDescription(None) -vocabulary_term_BARCODES_CACGATA.setLabel('DNA Adapter 31') -vocabulary_term_BARCODES_CACGATA.setOrdinal(73) -vocabulary_BARCODES.addTerm(vocabulary_term_BARCODES_CACGATA) - -vocabulary_term_BARCODES_CGCTCGA = tr.createNewVocabularyTerm('CGCTCGA') -vocabulary_term_BARCODES_CGCTCGA.setDescription(None) -vocabulary_term_BARCODES_CGCTCGA.setLabel('43 CGCTCG') -vocabulary_term_BARCODES_CGCTCGA.setOrdinal(46) -vocabulary_BARCODES.addTerm(vocabulary_term_BARCODES_CGCTCGA) - -vocabulary_term_BARCODES_ACTGATA = tr.createNewVocabularyTerm('ACTGATA') -vocabulary_term_BARCODES_ACTGATA.setDescription('Illumina, Nextera or Scriptseq') -vocabulary_term_BARCODES_ACTGATA.setLabel('Index25 ACTGATA') -vocabulary_term_BARCODES_ACTGATA.setOrdinal(23) -vocabulary_BARCODES.addTerm(vocabulary_term_BARCODES_ACTGATA) - -vocabulary_term_BARCODES_AATGCGA = tr.createNewVocabularyTerm('AATGCGA') -vocabulary_term_BARCODES_AATGCGA.setDescription(None) -vocabulary_term_BARCODES_AATGCGA.setLabel('Lib AATGCGA') -vocabulary_term_BARCODES_AATGCGA.setOrdinal(92) -vocabulary_BARCODES.addTerm(vocabulary_term_BARCODES_AATGCGA) - -vocabulary_term_BARCODES_GTCCGCA = tr.createNewVocabularyTerm('GTCCGCA') -vocabulary_term_BARCODES_GTCCGCA.setDescription('Illumina, Nextera or Scriptseq') -vocabulary_term_BARCODES_GTCCGCA.setLabel('Index18 GTCCGCA') -vocabulary_term_BARCODES_GTCCGCA.setOrdinal(17) -vocabulary_BARCODES.addTerm(vocabulary_term_BARCODES_GTCCGCA) - -vocabulary_term_BARCODES_CGTACGA = tr.createNewVocabularyTerm('CGTACGA') -vocabulary_term_BARCODES_CGTACGA.setDescription(None) -vocabulary_term_BARCODES_CGTACGA.setLabel('DNA Adapter 22') -vocabulary_term_BARCODES_CGTACGA.setOrdinal(66) -vocabulary_BARCODES.addTerm(vocabulary_term_BARCODES_CGTACGA) - -vocabulary_term_BARCODES_GTGAAAA = tr.createNewVocabularyTerm('GTGAAAA') -vocabulary_term_BARCODES_GTGAAAA.setDescription(None) -vocabulary_term_BARCODES_GTGAAAA.setLabel('DNA Adapter 19') -vocabulary_term_BARCODES_GTGAAAA.setOrdinal(63) -vocabulary_BARCODES.addTerm(vocabulary_term_BARCODES_GTGAAAA) - -vocabulary_term_BARCODES_GTTTCGA = tr.createNewVocabularyTerm('GTTTCGA') -vocabulary_term_BARCODES_GTTTCGA.setDescription(None) -vocabulary_term_BARCODES_GTTTCGA.setLabel('DNA Adapter 21') -vocabulary_term_BARCODES_GTTTCGA.setOrdinal(65) -vocabulary_BARCODES.addTerm(vocabulary_term_BARCODES_GTTTCGA) - -vocabulary_term_BARCODES_TAATCGA = tr.createNewVocabularyTerm('TAATCGA') -vocabulary_term_BARCODES_TAATCGA.setDescription(None) -vocabulary_term_BARCODES_TAATCGA.setLabel('DNA Adapter 42') -vocabulary_term_BARCODES_TAATCGA.setOrdinal(84) -vocabulary_BARCODES.addTerm(vocabulary_term_BARCODES_TAATCGA) - -vocabulary_term_BARCODES_CAGATGA = tr.createNewVocabularyTerm('CAGATGA') -vocabulary_term_BARCODES_CAGATGA.setDescription(None) -vocabulary_term_BARCODES_CAGATGA.setLabel('28 CAGATG') -vocabulary_term_BARCODES_CAGATGA.setOrdinal(44) -vocabulary_BARCODES.addTerm(vocabulary_term_BARCODES_CAGATGA) - -vocabulary_term_BARCODES_ACTTGAA = tr.createNewVocabularyTerm('ACTTGAA') -vocabulary_term_BARCODES_ACTTGAA.setDescription('Illumina, Nextera or Scriptseq') -vocabulary_term_BARCODES_ACTTGAA.setLabel('Index8 ACTTGAA') -vocabulary_term_BARCODES_ACTTGAA.setOrdinal(8) -vocabulary_BARCODES.addTerm(vocabulary_term_BARCODES_ACTTGAA) - -vocabulary_term_BARCODES_GCCAATA = tr.createNewVocabularyTerm('GCCAATA') -vocabulary_term_BARCODES_GCCAATA.setDescription('Illumina, Nextera or Scriptseq') -vocabulary_term_BARCODES_GCCAATA.setLabel('Index6 GCCAATA') -vocabulary_term_BARCODES_GCCAATA.setOrdinal(6) -vocabulary_BARCODES.addTerm(vocabulary_term_BARCODES_GCCAATA) - -vocabulary_term_BARCODES_AAGACTA = tr.createNewVocabularyTerm('AAGACTA') -vocabulary_term_BARCODES_AAGACTA.setDescription(None) -vocabulary_term_BARCODES_AAGACTA.setLabel('02 AAGACT') -vocabulary_term_BARCODES_AAGACTA.setOrdinal(37) -vocabulary_BARCODES.addTerm(vocabulary_term_BARCODES_AAGACTA) - -vocabulary_term_BARCODES_TACAGCA = tr.createNewVocabularyTerm('TACAGCA') -vocabulary_term_BARCODES_TACAGCA.setDescription(None) -vocabulary_term_BARCODES_TACAGCA.setLabel('DNA Adapter 43') -vocabulary_term_BARCODES_TACAGCA.setOrdinal(85) -vocabulary_BARCODES.addTerm(vocabulary_term_BARCODES_TACAGCA) - -vocabulary_term_BARCODES_GCTGAAA = tr.createNewVocabularyTerm('GCTGAAA') -vocabulary_term_BARCODES_GCTGAAA.setDescription(None) -vocabulary_term_BARCODES_GCTGAAA.setLabel('59 GCTGAA') -vocabulary_term_BARCODES_GCTGAAA.setOrdinal(51) -vocabulary_BARCODES.addTerm(vocabulary_term_BARCODES_GCTGAAA) - -vocabulary_term_BARCODES_AGATACA = tr.createNewVocabularyTerm('AGATACA') -vocabulary_term_BARCODES_AGATACA.setDescription('Illumina, Nextera or Scriptseq') -vocabulary_term_BARCODES_AGATACA.setLabel('Index13 AGATAC') -vocabulary_term_BARCODES_AGATACA.setOrdinal(13) -vocabulary_BARCODES.addTerm(vocabulary_term_BARCODES_AGATACA) - -vocabulary_term_BARCODES_TATCGTA = tr.createNewVocabularyTerm('TATCGTA') -vocabulary_term_BARCODES_TATCGTA.setDescription(None) -vocabulary_term_BARCODES_TATCGTA.setLabel('66 TATCGT') -vocabulary_term_BARCODES_TATCGTA.setOrdinal(55) -vocabulary_BARCODES.addTerm(vocabulary_term_BARCODES_TATCGTA) - -vocabulary_term_BARCODES_CCGTCCC = tr.createNewVocabularyTerm('CCGTCCC') -vocabulary_term_BARCODES_CCGTCCC.setDescription('Illumina, Nextera or Scriptseq') -vocabulary_term_BARCODES_CCGTCCC.setLabel('Index16 CCGTCCC') -vocabulary_term_BARCODES_CCGTCCC.setOrdinal(16) -vocabulary_BARCODES.addTerm(vocabulary_term_BARCODES_CCGTCCC) - -vocabulary_term_BARCODES_ATTCCTT = tr.createNewVocabularyTerm('ATTCCTT') -vocabulary_term_BARCODES_ATTCCTT.setDescription('Illumina, Nextera or Scriptseq') -vocabulary_term_BARCODES_ATTCCTT.setLabel('Index27 ATTCCTT') -vocabulary_term_BARCODES_ATTCCTT.setOrdinal(24) -vocabulary_BARCODES.addTerm(vocabulary_term_BARCODES_ATTCCTT) - -vocabulary_term_BARCODES_ATACGCA = tr.createNewVocabularyTerm('ATACGCA') -vocabulary_term_BARCODES_ATACGCA.setDescription(None) -vocabulary_term_BARCODES_ATACGCA.setLabel('20 ATACGC') -vocabulary_term_BARCODES_ATACGCA.setOrdinal(43) -vocabulary_BARCODES.addTerm(vocabulary_term_BARCODES_ATACGCA) - -vocabulary_term_BARCODES_GCGCTGA = tr.createNewVocabularyTerm('GCGCTGA') -vocabulary_term_BARCODES_GCGCTGA.setDescription(None) -vocabulary_term_BARCODES_GCGCTGA.setLabel('66 GCGCTGA') -vocabulary_term_BARCODES_GCGCTGA.setOrdinal(54) -vocabulary_BARCODES.addTerm(vocabulary_term_BARCODES_GCGCTGA) - -vocabulary_term_BARCODES_TCGAAGA = tr.createNewVocabularyTerm('TCGAAGA') -vocabulary_term_BARCODES_TCGAAGA.setDescription(None) -vocabulary_term_BARCODES_TCGAAGA.setLabel('DNA Adapter 47') -vocabulary_term_BARCODES_TCGAAGA.setOrdinal(89) -vocabulary_BARCODES.addTerm(vocabulary_term_BARCODES_TCGAAGA) - -vocabulary_term_BARCODES_GTGGCCA = tr.createNewVocabularyTerm('GTGGCCA') -vocabulary_term_BARCODES_GTGGCCA.setDescription(None) -vocabulary_term_BARCODES_GTGGCCA.setLabel('DNA Adapter 20') -vocabulary_term_BARCODES_GTGGCCA.setOrdinal(64) -vocabulary_BARCODES.addTerm(vocabulary_term_BARCODES_GTGGCCA) - -vocabulary_term_BARCODES_CTCAGAA = tr.createNewVocabularyTerm('CTCAGAA') -vocabulary_term_BARCODES_CTCAGAA.setDescription(None) -vocabulary_term_BARCODES_CTCAGAA.setLabel('DNA Adapter 40') -vocabulary_term_BARCODES_CTCAGAA.setOrdinal(82) -vocabulary_BARCODES.addTerm(vocabulary_term_BARCODES_CTCAGAA) - -vocabulary_term_BARCODES_CACCGGA = tr.createNewVocabularyTerm('CACCGGA') -vocabulary_term_BARCODES_CACCGGA.setDescription(None) -vocabulary_term_BARCODES_CACCGGA.setLabel('DNA Adapter 30') -vocabulary_term_BARCODES_CACCGGA.setOrdinal(72) -vocabulary_BARCODES.addTerm(vocabulary_term_BARCODES_CACCGGA) - -vocabulary_term_BARCODES_GGTAGCA = tr.createNewVocabularyTerm('GGTAGCA') -vocabulary_term_BARCODES_GGTAGCA.setDescription(None) -vocabulary_term_BARCODES_GGTAGCA.setLabel('DNA Adapter 24') -vocabulary_term_BARCODES_GGTAGCA.setOrdinal(67) -vocabulary_BARCODES.addTerm(vocabulary_term_BARCODES_GGTAGCA) - -vocabulary_term_BARCODES_CCATGAA = tr.createNewVocabularyTerm('CCATGAA') -vocabulary_term_BARCODES_CCATGAA.setDescription(None) -vocabulary_term_BARCODES_CCATGAA.setLabel('50 CCATGAA') -vocabulary_term_BARCODES_CCATGAA.setOrdinal(48) -vocabulary_BARCODES.addTerm(vocabulary_term_BARCODES_CCATGAA) - -vocabulary_term_BARCODES_CAGAGAGG = tr.createNewVocabularyTerm('CAGAGAGG') -vocabulary_term_BARCODES_CAGAGAGG.setDescription('Nextera DNA') -vocabulary_term_BARCODES_CAGAGAGG.setLabel('Index1 (i7) N708 CAGAGAGG') -vocabulary_term_BARCODES_CAGAGAGG.setOrdinal(32) -vocabulary_BARCODES.addTerm(vocabulary_term_BARCODES_CAGAGAGG) - -vocabulary_term_BARCODES_ACAGTGA = tr.createNewVocabularyTerm('ACAGTGA') -vocabulary_term_BARCODES_ACAGTGA.setDescription('Illumina, Nextera or Scriptseq') -vocabulary_term_BARCODES_ACAGTGA.setLabel('Index5 ACAGTGA') -vocabulary_term_BARCODES_ACAGTGA.setOrdinal(5) -vocabulary_BARCODES.addTerm(vocabulary_term_BARCODES_ACAGTGA) - -vocabulary_term_BARCODES_GCTACGCT = tr.createNewVocabularyTerm('GCTACGCT') -vocabulary_term_BARCODES_GCTACGCT.setDescription('Nextera DNA') -vocabulary_term_BARCODES_GCTACGCT.setLabel('Index1 (i7) N709 GCTACGCT') -vocabulary_term_BARCODES_GCTACGCT.setOrdinal(33) -vocabulary_BARCODES.addTerm(vocabulary_term_BARCODES_GCTACGCT) - -vocabulary_term_BARCODES_GTAGAGGA = tr.createNewVocabularyTerm('GTAGAGGA') -vocabulary_term_BARCODES_GTAGAGGA.setDescription('Nextera DNA') -vocabulary_term_BARCODES_GTAGAGGA.setLabel('Index1 (i7) N712 GTAGAGGA') -vocabulary_term_BARCODES_GTAGAGGA.setOrdinal(36) -vocabulary_BARCODES.addTerm(vocabulary_term_BARCODES_GTAGAGGA) - -vocabulary_term_BARCODES_AGGCAGAA = tr.createNewVocabularyTerm('AGGCAGAA') -vocabulary_term_BARCODES_AGGCAGAA.setDescription('Nextera DNA') -vocabulary_term_BARCODES_AGGCAGAA.setLabel('Index1 (i7) N703 AGGCAGAA') -vocabulary_term_BARCODES_AGGCAGAA.setOrdinal(27) -vocabulary_BARCODES.addTerm(vocabulary_term_BARCODES_AGGCAGAA) - -vocabulary_term_BARCODES_TCCTACA = tr.createNewVocabularyTerm('TCCTACA') -vocabulary_term_BARCODES_TCCTACA.setDescription(None) -vocabulary_term_BARCODES_TCCTACA.setLabel('68 TCCTAC') -vocabulary_term_BARCODES_TCCTACA.setOrdinal(56) -vocabulary_BARCODES.addTerm(vocabulary_term_BARCODES_TCCTACA) - -vocabulary_term_BARCODES_TCTATAA = tr.createNewVocabularyTerm('TCTATAA') -vocabulary_term_BARCODES_TCTATAA.setDescription(None) -vocabulary_term_BARCODES_TCTATAA.setLabel('70 TCTATA') -vocabulary_term_BARCODES_TCTATAA.setOrdinal(57) -vocabulary_BARCODES.addTerm(vocabulary_term_BARCODES_TCTATAA) - -vocabulary_term_BARCODES_TTAGGCA = tr.createNewVocabularyTerm('TTAGGCA') -vocabulary_term_BARCODES_TTAGGCA.setDescription('Illumina, Nextera or Scriptseq') -vocabulary_term_BARCODES_TTAGGCA.setLabel('Index3 TTAGGCA') -vocabulary_term_BARCODES_TTAGGCA.setOrdinal(3) -vocabulary_BARCODES.addTerm(vocabulary_term_BARCODES_TTAGGCA) - -vocabulary_term_BARCODES_CCAACAA = tr.createNewVocabularyTerm('CCAACAA') -vocabulary_term_BARCODES_CCAACAA.setDescription(None) -vocabulary_term_BARCODES_CCAACAA.setLabel('DNA Adapter 36') -vocabulary_term_BARCODES_CCAACAA.setOrdinal(78) -vocabulary_BARCODES.addTerm(vocabulary_term_BARCODES_CCAACAA) - -vocabulary_term_BARCODES_ATGTCAG = tr.createNewVocabularyTerm('ATGTCAG') -vocabulary_term_BARCODES_ATGTCAG.setDescription('Illumina, Nextera or Scriptseq') -vocabulary_term_BARCODES_ATGTCAG.setLabel('Index15 ATGTCAG') -vocabulary_term_BARCODES_ATGTCAG.setOrdinal(15) -vocabulary_BARCODES.addTerm(vocabulary_term_BARCODES_ATGTCAG) - -vocabulary_term_BARCODES_CAGGCGA = tr.createNewVocabularyTerm('CAGGCGA') -vocabulary_term_BARCODES_CAGGCGA.setDescription(None) -vocabulary_term_BARCODES_CAGGCGA.setLabel('DNA Adapter 33') -vocabulary_term_BARCODES_CAGGCGA.setOrdinal(75) -vocabulary_BARCODES.addTerm(vocabulary_term_BARCODES_CAGGCGA) - -vocabulary_term_BARCODES_ATGAGCA = tr.createNewVocabularyTerm('ATGAGCA') -vocabulary_term_BARCODES_ATGAGCA.setDescription(None) -vocabulary_term_BARCODES_ATGAGCA.setLabel('DNA Adapter 26') -vocabulary_term_BARCODES_ATGAGCA.setOrdinal(68) -vocabulary_BARCODES.addTerm(vocabulary_term_BARCODES_ATGAGCA) - -vocabulary_term_BARCODES_GTTTCGG = tr.createNewVocabularyTerm('GTTTCGG') -vocabulary_term_BARCODES_GTTTCGG.setDescription('Illumina, Nextera or Scriptseq') -vocabulary_term_BARCODES_GTTTCGG.setLabel('Index21 GTTTCGG') -vocabulary_term_BARCODES_GTTTCGG.setOrdinal(20) -vocabulary_BARCODES.addTerm(vocabulary_term_BARCODES_GTTTCGG) - -vocabulary_term_BARCODES_ATTCCTA = tr.createNewVocabularyTerm('ATTCCTA') -vocabulary_term_BARCODES_ATTCCTA.setDescription(None) -vocabulary_term_BARCODES_ATTCCTA.setLabel('DNA Adapter 27') -vocabulary_term_BARCODES_ATTCCTA.setOrdinal(69) -vocabulary_BARCODES.addTerm(vocabulary_term_BARCODES_ATTCCTA) - -vocabulary_term_BARCODES_CGTATTA = tr.createNewVocabularyTerm('CGTATTA') -vocabulary_term_BARCODES_CGTATTA.setDescription(None) -vocabulary_term_BARCODES_CGTATTA.setLabel('45 CGTATT') -vocabulary_term_BARCODES_CGTATTA.setOrdinal(47) -vocabulary_BARCODES.addTerm(vocabulary_term_BARCODES_CGTATTA) - -vocabulary_term_BARCODES_CCGAATA = tr.createNewVocabularyTerm('CCGAATA') -vocabulary_term_BARCODES_CCGAATA.setDescription(None) -vocabulary_term_BARCODES_CCGAATA.setLabel('34 CCGAAT') -vocabulary_term_BARCODES_CCGAATA.setOrdinal(45) -vocabulary_BARCODES.addTerm(vocabulary_term_BARCODES_CCGAATA) - -vocabulary_term_BARCODES_CATGGCA = tr.createNewVocabularyTerm('CATGGCA') -vocabulary_term_BARCODES_CATGGCA.setDescription(None) -vocabulary_term_BARCODES_CATGGCA.setLabel('DNA Adapter 34') -vocabulary_term_BARCODES_CATGGCA.setOrdinal(76) -vocabulary_BARCODES.addTerm(vocabulary_term_BARCODES_CATGGCA) - -vocabulary_term_BARCODES_GTCGCGA = tr.createNewVocabularyTerm('GTCGCGA') -vocabulary_term_BARCODES_GTCGCGA.setDescription(None) -vocabulary_term_BARCODES_GTCGCGA.setLabel('64 GTCGCG') -vocabulary_term_BARCODES_GTCGCGA.setOrdinal(52) -vocabulary_BARCODES.addTerm(vocabulary_term_BARCODES_GTCGCGA) - -vocabulary_term_BARCODES_GATCAGA = tr.createNewVocabularyTerm('GATCAGA') -vocabulary_term_BARCODES_GATCAGA.setDescription('Illumina, Nextera or Scriptseq') -vocabulary_term_BARCODES_GATCAGA.setLabel('Index9 GATCAGA') -vocabulary_term_BARCODES_GATCAGA.setOrdinal(9) -vocabulary_BARCODES.addTerm(vocabulary_term_BARCODES_GATCAGA) - -vocabulary_term_BARCODES_CATTTTA = tr.createNewVocabularyTerm('CATTTTA') -vocabulary_term_BARCODES_CATTTTA.setDescription(None) -vocabulary_term_BARCODES_CATTTTA.setLabel('DNA Adapter 35') -vocabulary_term_BARCODES_CATTTTA.setOrdinal(77) -vocabulary_BARCODES.addTerm(vocabulary_term_BARCODES_CATTTTA) - -vocabulary_term_BARCODES_AGGTTGA = tr.createNewVocabularyTerm('AGGTTGA') -vocabulary_term_BARCODES_AGGTTGA.setDescription(None) -vocabulary_term_BARCODES_AGGTTGA.setLabel('17 AGGTTG') -vocabulary_term_BARCODES_AGGTTGA.setOrdinal(39) -vocabulary_BARCODES.addTerm(vocabulary_term_BARCODES_AGGTTGA) - -vocabulary_term_BARCODES_TAAGATA = tr.createNewVocabularyTerm('TAAGATA') -vocabulary_term_BARCODES_TAAGATA.setDescription(None) -vocabulary_term_BARCODES_TAAGATA.setLabel('65 TAAGAT') -vocabulary_term_BARCODES_TAAGATA.setOrdinal(53) -vocabulary_BARCODES.addTerm(vocabulary_term_BARCODES_TAAGATA) - -vocabulary_term_BARCODES_AAGAGGCA = tr.createNewVocabularyTerm('AAGAGGCA') -vocabulary_term_BARCODES_AAGAGGCA.setDescription('Nextera DNA') -vocabulary_term_BARCODES_AAGAGGCA.setLabel('Index1 (i7) N711 AAGAGGCA') -vocabulary_term_BARCODES_AAGAGGCA.setOrdinal(35) -vocabulary_BARCODES.addTerm(vocabulary_term_BARCODES_AAGAGGCA) - -vocabulary_term_BARCODES_GTGGCCT = tr.createNewVocabularyTerm('GTGGCCT') -vocabulary_term_BARCODES_GTGGCCT.setDescription('Illumina, Nextera or Scriptseq') -vocabulary_term_BARCODES_GTGGCCT.setLabel('Index20 GTGGCCT') -vocabulary_term_BARCODES_GTGGCCT.setOrdinal(19) -vocabulary_BARCODES.addTerm(vocabulary_term_BARCODES_GTGGCCT) - -vocabulary_term_BARCODES_TTCCGAA = tr.createNewVocabularyTerm('TTCCGAA') -vocabulary_term_BARCODES_TTCCGAA.setDescription(None) -vocabulary_term_BARCODES_TTCCGAA.setLabel('75 TTCCGA') -vocabulary_term_BARCODES_TTCCGAA.setOrdinal(59) -vocabulary_BARCODES.addTerm(vocabulary_term_BARCODES_TTCCGAA) - -vocabulary_term_BARCODES_ACTTCAA = tr.createNewVocabularyTerm('ACTTCAA') -vocabulary_term_BARCODES_ACTTCAA.setDescription(None) -vocabulary_term_BARCODES_ACTTCAA.setLabel('10 ACTTCA') -vocabulary_term_BARCODES_ACTTCAA.setOrdinal(38) -vocabulary_BARCODES.addTerm(vocabulary_term_BARCODES_ACTTCAA) - -vocabulary_term_BARCODES_TAGGCATG = tr.createNewVocabularyTerm('TAGGCATG') -vocabulary_term_BARCODES_TAGGCATG.setDescription('Nextera DNA') -vocabulary_term_BARCODES_TAGGCATG.setLabel('Index1 (i7) N706 TAGGCATG') -vocabulary_term_BARCODES_TAGGCATG.setOrdinal(30) -vocabulary_BARCODES.addTerm(vocabulary_term_BARCODES_TAGGCATG) - -vocabulary_term_BARCODES_CAACTAA = tr.createNewVocabularyTerm('CAACTAA') -vocabulary_term_BARCODES_CAACTAA.setDescription(None) -vocabulary_term_BARCODES_CAACTAA.setLabel('DNA Adapter 29') -vocabulary_term_BARCODES_CAACTAA.setOrdinal(71) -vocabulary_BARCODES.addTerm(vocabulary_term_BARCODES_CAACTAA) - -vocabulary_CASAVA_VERSION = tr.createNewVocabulary('CASAVA_VERSION') -vocabulary_CASAVA_VERSION.setDescription('Post analyzing software') -vocabulary_CASAVA_VERSION.setUrlTemplate(None) -vocabulary_CASAVA_VERSION.setManagedInternally(False) -vocabulary_CASAVA_VERSION.setInternalNamespace(False) -vocabulary_CASAVA_VERSION.setChosenFromList(True) - -vocabulary_term_CASAVA_VERSION_17 = tr.createNewVocabularyTerm('1.7') -vocabulary_term_CASAVA_VERSION_17.setDescription(None) -vocabulary_term_CASAVA_VERSION_17.setLabel(None) -vocabulary_term_CASAVA_VERSION_17.setOrdinal(2) -vocabulary_CASAVA_VERSION.addTerm(vocabulary_term_CASAVA_VERSION_17) - -vocabulary_term_CASAVA_VERSION_18 = tr.createNewVocabularyTerm('1.8') -vocabulary_term_CASAVA_VERSION_18.setDescription(None) -vocabulary_term_CASAVA_VERSION_18.setLabel(None) -vocabulary_term_CASAVA_VERSION_18.setOrdinal(1) -vocabulary_CASAVA_VERSION.addTerm(vocabulary_term_CASAVA_VERSION_18) - -vocabulary_CLUSTER_GENERATION_KIT_VERSION = tr.createNewVocabulary('CLUSTER_GENERATION_KIT_VERSION') -vocabulary_CLUSTER_GENERATION_KIT_VERSION.setDescription('Version of the Cluster Generation Kit') -vocabulary_CLUSTER_GENERATION_KIT_VERSION.setUrlTemplate(None) -vocabulary_CLUSTER_GENERATION_KIT_VERSION.setManagedInternally(False) -vocabulary_CLUSTER_GENERATION_KIT_VERSION.setInternalNamespace(False) -vocabulary_CLUSTER_GENERATION_KIT_VERSION.setChosenFromList(True) - -vocabulary_term_CLUSTER_GENERATION_KIT_VERSION_TRUSEQ_CBOT_HS_V25 = tr.createNewVocabularyTerm('TRUSEQ_CBOT_HS_V2.5') -vocabulary_term_CLUSTER_GENERATION_KIT_VERSION_TRUSEQ_CBOT_HS_V25.setDescription(None) -vocabulary_term_CLUSTER_GENERATION_KIT_VERSION_TRUSEQ_CBOT_HS_V25.setLabel('TruSeq cBot-HS v2.5') -vocabulary_term_CLUSTER_GENERATION_KIT_VERSION_TRUSEQ_CBOT_HS_V25.setOrdinal(2) -vocabulary_CLUSTER_GENERATION_KIT_VERSION.addTerm(vocabulary_term_CLUSTER_GENERATION_KIT_VERSION_TRUSEQ_CBOT_HS_V25) - -vocabulary_term_CLUSTER_GENERATION_KIT_VERSION_V2 = tr.createNewVocabularyTerm('V2') -vocabulary_term_CLUSTER_GENERATION_KIT_VERSION_V2.setDescription(None) -vocabulary_term_CLUSTER_GENERATION_KIT_VERSION_V2.setLabel(None) -vocabulary_term_CLUSTER_GENERATION_KIT_VERSION_V2.setOrdinal(16) -vocabulary_CLUSTER_GENERATION_KIT_VERSION.addTerm(vocabulary_term_CLUSTER_GENERATION_KIT_VERSION_V2) - -vocabulary_term_CLUSTER_GENERATION_KIT_VERSION_TRUSEQ_CBOT_HS_V3 = tr.createNewVocabularyTerm('TRUSEQ_CBOT_HS_V3') -vocabulary_term_CLUSTER_GENERATION_KIT_VERSION_TRUSEQ_CBOT_HS_V3.setDescription(None) -vocabulary_term_CLUSTER_GENERATION_KIT_VERSION_TRUSEQ_CBOT_HS_V3.setLabel('TruSeq cBot-HS v3') -vocabulary_term_CLUSTER_GENERATION_KIT_VERSION_TRUSEQ_CBOT_HS_V3.setOrdinal(1) -vocabulary_CLUSTER_GENERATION_KIT_VERSION.addTerm(vocabulary_term_CLUSTER_GENERATION_KIT_VERSION_TRUSEQ_CBOT_HS_V3) - -vocabulary_term_CLUSTER_GENERATION_KIT_VERSION_TRUSEQ_CS_GA_V5 = tr.createNewVocabularyTerm('TRUSEQ_CS_GA_V5') -vocabulary_term_CLUSTER_GENERATION_KIT_VERSION_TRUSEQ_CS_GA_V5.setDescription(None) -vocabulary_term_CLUSTER_GENERATION_KIT_VERSION_TRUSEQ_CS_GA_V5.setLabel('TrueSeq CS-GA v5') -vocabulary_term_CLUSTER_GENERATION_KIT_VERSION_TRUSEQ_CS_GA_V5.setOrdinal(8) -vocabulary_CLUSTER_GENERATION_KIT_VERSION.addTerm(vocabulary_term_CLUSTER_GENERATION_KIT_VERSION_TRUSEQ_CS_GA_V5) - -vocabulary_term_CLUSTER_GENERATION_KIT_VERSION_V5 = tr.createNewVocabularyTerm('V5') -vocabulary_term_CLUSTER_GENERATION_KIT_VERSION_V5.setDescription(None) -vocabulary_term_CLUSTER_GENERATION_KIT_VERSION_V5.setLabel(None) -vocabulary_term_CLUSTER_GENERATION_KIT_VERSION_V5.setOrdinal(14) -vocabulary_CLUSTER_GENERATION_KIT_VERSION.addTerm(vocabulary_term_CLUSTER_GENERATION_KIT_VERSION_V5) - -vocabulary_term_CLUSTER_GENERATION_KIT_VERSION_TRUSEQ_CBOT_GA_V2 = tr.createNewVocabularyTerm('TRUSEQ_CBOT_GA_V2') -vocabulary_term_CLUSTER_GENERATION_KIT_VERSION_TRUSEQ_CBOT_GA_V2.setDescription(None) -vocabulary_term_CLUSTER_GENERATION_KIT_VERSION_TRUSEQ_CBOT_GA_V2.setLabel('TrueSeq cBot-GA v2') -vocabulary_term_CLUSTER_GENERATION_KIT_VERSION_TRUSEQ_CBOT_GA_V2.setOrdinal(7) -vocabulary_CLUSTER_GENERATION_KIT_VERSION.addTerm(vocabulary_term_CLUSTER_GENERATION_KIT_VERSION_TRUSEQ_CBOT_GA_V2) - -vocabulary_term_CLUSTER_GENERATION_KIT_VERSION_V4 = tr.createNewVocabularyTerm('V4') -vocabulary_term_CLUSTER_GENERATION_KIT_VERSION_V4.setDescription(None) -vocabulary_term_CLUSTER_GENERATION_KIT_VERSION_V4.setLabel(None) -vocabulary_term_CLUSTER_GENERATION_KIT_VERSION_V4.setOrdinal(15) -vocabulary_CLUSTER_GENERATION_KIT_VERSION.addTerm(vocabulary_term_CLUSTER_GENERATION_KIT_VERSION_V4) - -vocabulary_CLUSTER_STATION = tr.createNewVocabulary('CLUSTER_STATION') -vocabulary_CLUSTER_STATION.setDescription('Cluster Station') -vocabulary_CLUSTER_STATION.setUrlTemplate(None) -vocabulary_CLUSTER_STATION.setManagedInternally(False) -vocabulary_CLUSTER_STATION.setInternalNamespace(False) -vocabulary_CLUSTER_STATION.setChosenFromList(True) - -vocabulary_term_CLUSTER_STATION_CBOT = tr.createNewVocabularyTerm('CBOT') -vocabulary_term_CLUSTER_STATION_CBOT.setDescription(None) -vocabulary_term_CLUSTER_STATION_CBOT.setLabel('cBot') -vocabulary_term_CLUSTER_STATION_CBOT.setOrdinal(1) -vocabulary_CLUSTER_STATION.addTerm(vocabulary_term_CLUSTER_STATION_CBOT) - -vocabulary_term_CLUSTER_STATION_SPUTNIK = tr.createNewVocabularyTerm('SPUTNIK') -vocabulary_term_CLUSTER_STATION_SPUTNIK.setDescription(None) -vocabulary_term_CLUSTER_STATION_SPUTNIK.setLabel('Sputnik') -vocabulary_term_CLUSTER_STATION_SPUTNIK.setOrdinal(2) -vocabulary_CLUSTER_STATION.addTerm(vocabulary_term_CLUSTER_STATION_SPUTNIK) - -vocabulary_term_CLUSTER_STATION_ISS = tr.createNewVocabularyTerm('ISS') -vocabulary_term_CLUSTER_STATION_ISS.setDescription(None) -vocabulary_term_CLUSTER_STATION_ISS.setLabel('ISS (CS2)') -vocabulary_term_CLUSTER_STATION_ISS.setOrdinal(3) -vocabulary_CLUSTER_STATION.addTerm(vocabulary_term_CLUSTER_STATION_ISS) - -vocabulary_CLUSTER_STATION_SOFTWARE_VERSION = tr.createNewVocabulary('CLUSTER_STATION_SOFTWARE_VERSION') -vocabulary_CLUSTER_STATION_SOFTWARE_VERSION.setDescription(None) -vocabulary_CLUSTER_STATION_SOFTWARE_VERSION.setUrlTemplate(None) -vocabulary_CLUSTER_STATION_SOFTWARE_VERSION.setManagedInternally(False) -vocabulary_CLUSTER_STATION_SOFTWARE_VERSION.setInternalNamespace(False) -vocabulary_CLUSTER_STATION_SOFTWARE_VERSION.setChosenFromList(True) - -vocabulary_term_CLUSTER_STATION_SOFTWARE_VERSION_NOT_KNOWN = tr.createNewVocabularyTerm('NOT_KNOWN') -vocabulary_term_CLUSTER_STATION_SOFTWARE_VERSION_NOT_KNOWN.setDescription(None) -vocabulary_term_CLUSTER_STATION_SOFTWARE_VERSION_NOT_KNOWN.setLabel(None) -vocabulary_term_CLUSTER_STATION_SOFTWARE_VERSION_NOT_KNOWN.setOrdinal(6) -vocabulary_CLUSTER_STATION_SOFTWARE_VERSION.addTerm(vocabulary_term_CLUSTER_STATION_SOFTWARE_VERSION_NOT_KNOWN) - -vocabulary_term_CLUSTER_STATION_SOFTWARE_VERSION_GALAXY_06 = tr.createNewVocabularyTerm('GALAXY_0.6') -vocabulary_term_CLUSTER_STATION_SOFTWARE_VERSION_GALAXY_06.setDescription('Old Cluster Station') -vocabulary_term_CLUSTER_STATION_SOFTWARE_VERSION_GALAXY_06.setLabel('Galaxy 0.6 Build 98') -vocabulary_term_CLUSTER_STATION_SOFTWARE_VERSION_GALAXY_06.setOrdinal(3) -vocabulary_CLUSTER_STATION_SOFTWARE_VERSION.addTerm(vocabulary_term_CLUSTER_STATION_SOFTWARE_VERSION_GALAXY_06) - -vocabulary_term_CLUSTER_STATION_SOFTWARE_VERSION_CBOT_14360 = tr.createNewVocabularyTerm('CBOT_1.4.36.0') -vocabulary_term_CLUSTER_STATION_SOFTWARE_VERSION_CBOT_14360.setDescription(None) -vocabulary_term_CLUSTER_STATION_SOFTWARE_VERSION_CBOT_14360.setLabel('cBot 1.4.36.0') -vocabulary_term_CLUSTER_STATION_SOFTWARE_VERSION_CBOT_14360.setOrdinal(1) -vocabulary_CLUSTER_STATION_SOFTWARE_VERSION.addTerm(vocabulary_term_CLUSTER_STATION_SOFTWARE_VERSION_CBOT_14360) - -vocabulary_CONTROL_LANE = tr.createNewVocabulary('CONTROL_LANE') -vocabulary_CONTROL_LANE.setDescription(None) -vocabulary_CONTROL_LANE.setUrlTemplate(None) -vocabulary_CONTROL_LANE.setManagedInternally(False) -vocabulary_CONTROL_LANE.setInternalNamespace(False) -vocabulary_CONTROL_LANE.setChosenFromList(True) - -vocabulary_term_CONTROL_LANE_0 = tr.createNewVocabularyTerm('0') -vocabulary_term_CONTROL_LANE_0.setDescription(None) -vocabulary_term_CONTROL_LANE_0.setLabel(None) -vocabulary_term_CONTROL_LANE_0.setOrdinal(10) -vocabulary_CONTROL_LANE.addTerm(vocabulary_term_CONTROL_LANE_0) - -vocabulary_term_CONTROL_LANE_6 = tr.createNewVocabularyTerm('6') -vocabulary_term_CONTROL_LANE_6.setDescription(None) -vocabulary_term_CONTROL_LANE_6.setLabel(None) -vocabulary_term_CONTROL_LANE_6.setOrdinal(6) -vocabulary_CONTROL_LANE.addTerm(vocabulary_term_CONTROL_LANE_6) - -vocabulary_term_CONTROL_LANE_4 = tr.createNewVocabularyTerm('4') -vocabulary_term_CONTROL_LANE_4.setDescription(None) -vocabulary_term_CONTROL_LANE_4.setLabel(None) -vocabulary_term_CONTROL_LANE_4.setOrdinal(4) -vocabulary_CONTROL_LANE.addTerm(vocabulary_term_CONTROL_LANE_4) - -vocabulary_term_CONTROL_LANE_2 = tr.createNewVocabularyTerm('2') -vocabulary_term_CONTROL_LANE_2.setDescription(None) -vocabulary_term_CONTROL_LANE_2.setLabel(None) -vocabulary_term_CONTROL_LANE_2.setOrdinal(2) -vocabulary_CONTROL_LANE.addTerm(vocabulary_term_CONTROL_LANE_2) - -vocabulary_term_CONTROL_LANE_8 = tr.createNewVocabularyTerm('8') -vocabulary_term_CONTROL_LANE_8.setDescription(None) -vocabulary_term_CONTROL_LANE_8.setLabel(None) -vocabulary_term_CONTROL_LANE_8.setOrdinal(8) -vocabulary_CONTROL_LANE.addTerm(vocabulary_term_CONTROL_LANE_8) - -vocabulary_term_CONTROL_LANE_NONE = tr.createNewVocabularyTerm('NONE') -vocabulary_term_CONTROL_LANE_NONE.setDescription(None) -vocabulary_term_CONTROL_LANE_NONE.setLabel(None) -vocabulary_term_CONTROL_LANE_NONE.setOrdinal(9) -vocabulary_CONTROL_LANE.addTerm(vocabulary_term_CONTROL_LANE_NONE) - -vocabulary_term_CONTROL_LANE_3 = tr.createNewVocabularyTerm('3') -vocabulary_term_CONTROL_LANE_3.setDescription(None) -vocabulary_term_CONTROL_LANE_3.setLabel(None) -vocabulary_term_CONTROL_LANE_3.setOrdinal(3) -vocabulary_CONTROL_LANE.addTerm(vocabulary_term_CONTROL_LANE_3) - -vocabulary_term_CONTROL_LANE_5 = tr.createNewVocabularyTerm('5') -vocabulary_term_CONTROL_LANE_5.setDescription(None) -vocabulary_term_CONTROL_LANE_5.setLabel(None) -vocabulary_term_CONTROL_LANE_5.setOrdinal(5) -vocabulary_CONTROL_LANE.addTerm(vocabulary_term_CONTROL_LANE_5) - -vocabulary_term_CONTROL_LANE_1 = tr.createNewVocabularyTerm('1') -vocabulary_term_CONTROL_LANE_1.setDescription(None) -vocabulary_term_CONTROL_LANE_1.setLabel(None) -vocabulary_term_CONTROL_LANE_1.setOrdinal(1) -vocabulary_CONTROL_LANE.addTerm(vocabulary_term_CONTROL_LANE_1) - -vocabulary_term_CONTROL_LANE_7 = tr.createNewVocabularyTerm('7') -vocabulary_term_CONTROL_LANE_7.setDescription(None) -vocabulary_term_CONTROL_LANE_7.setLabel(None) -vocabulary_term_CONTROL_LANE_7.setOrdinal(7) -vocabulary_CONTROL_LANE.addTerm(vocabulary_term_CONTROL_LANE_7) - -vocabulary_CYCLES = tr.createNewVocabulary('CYCLES') -vocabulary_CYCLES.setDescription('Number of cycles') -vocabulary_CYCLES.setUrlTemplate(None) -vocabulary_CYCLES.setManagedInternally(False) -vocabulary_CYCLES.setInternalNamespace(False) -vocabulary_CYCLES.setChosenFromList(True) - -vocabulary_term_CYCLES_101 = tr.createNewVocabularyTerm('101') -vocabulary_term_CYCLES_101.setDescription(None) -vocabulary_term_CYCLES_101.setLabel(None) -vocabulary_term_CYCLES_101.setOrdinal(4) -vocabulary_CYCLES.addTerm(vocabulary_term_CYCLES_101) - -vocabulary_term_CYCLES_51 = tr.createNewVocabularyTerm('51') -vocabulary_term_CYCLES_51.setDescription(None) -vocabulary_term_CYCLES_51.setLabel(None) -vocabulary_term_CYCLES_51.setOrdinal(6) -vocabulary_CYCLES.addTerm(vocabulary_term_CYCLES_51) - -vocabulary_term_CYCLES_58 = tr.createNewVocabularyTerm('58') -vocabulary_term_CYCLES_58.setDescription(None) -vocabulary_term_CYCLES_58.setLabel(None) -vocabulary_term_CYCLES_58.setOrdinal(7) -vocabulary_CYCLES.addTerm(vocabulary_term_CYCLES_58) - -vocabulary_term_CYCLES_100 = tr.createNewVocabularyTerm('100') -vocabulary_term_CYCLES_100.setDescription(None) -vocabulary_term_CYCLES_100.setLabel(None) -vocabulary_term_CYCLES_100.setOrdinal(12) -vocabulary_CYCLES.addTerm(vocabulary_term_CYCLES_100) - -vocabulary_term_CYCLES_151 = tr.createNewVocabularyTerm('151') -vocabulary_term_CYCLES_151.setDescription(None) -vocabulary_term_CYCLES_151.setLabel(None) -vocabulary_term_CYCLES_151.setOrdinal(11) -vocabulary_CYCLES.addTerm(vocabulary_term_CYCLES_151) - -vocabulary_term_CYCLES_49 = tr.createNewVocabularyTerm('49') -vocabulary_term_CYCLES_49.setDescription(None) -vocabulary_term_CYCLES_49.setLabel(None) -vocabulary_term_CYCLES_49.setOrdinal(15) -vocabulary_CYCLES.addTerm(vocabulary_term_CYCLES_49) - -vocabulary_term_CYCLES_50 = tr.createNewVocabularyTerm('50') -vocabulary_term_CYCLES_50.setDescription(None) -vocabulary_term_CYCLES_50.setLabel(None) -vocabulary_term_CYCLES_50.setOrdinal(2) -vocabulary_CYCLES.addTerm(vocabulary_term_CYCLES_50) - -vocabulary_term_CYCLES_150 = tr.createNewVocabularyTerm('150') -vocabulary_term_CYCLES_150.setDescription(None) -vocabulary_term_CYCLES_150.setLabel(None) -vocabulary_term_CYCLES_150.setOrdinal(14) -vocabulary_CYCLES.addTerm(vocabulary_term_CYCLES_150) - -vocabulary_term_CYCLES_36 = tr.createNewVocabularyTerm('36') -vocabulary_term_CYCLES_36.setDescription(None) -vocabulary_term_CYCLES_36.setLabel(None) -vocabulary_term_CYCLES_36.setOrdinal(1) -vocabulary_CYCLES.addTerm(vocabulary_term_CYCLES_36) - -vocabulary_term_CYCLES_108 = tr.createNewVocabularyTerm('108') -vocabulary_term_CYCLES_108.setDescription(None) -vocabulary_term_CYCLES_108.setLabel(None) -vocabulary_term_CYCLES_108.setOrdinal(13) -vocabulary_CYCLES.addTerm(vocabulary_term_CYCLES_108) - -vocabulary_term_CYCLES_76 = tr.createNewVocabularyTerm('76') -vocabulary_term_CYCLES_76.setDescription(None) -vocabulary_term_CYCLES_76.setLabel(None) -vocabulary_term_CYCLES_76.setOrdinal(3) -vocabulary_CYCLES.addTerm(vocabulary_term_CYCLES_76) - -vocabulary_term_CYCLES_125 = tr.createNewVocabularyTerm('125') -vocabulary_term_CYCLES_125.setDescription(None) -vocabulary_term_CYCLES_125.setLabel(None) -vocabulary_term_CYCLES_125.setOrdinal(10) -vocabulary_CYCLES.addTerm(vocabulary_term_CYCLES_125) - -vocabulary_END_TYPE = tr.createNewVocabulary('END_TYPE') -vocabulary_END_TYPE.setDescription('Sequencing method') -vocabulary_END_TYPE.setUrlTemplate(None) -vocabulary_END_TYPE.setManagedInternally(False) -vocabulary_END_TYPE.setInternalNamespace(False) -vocabulary_END_TYPE.setChosenFromList(True) - -vocabulary_term_END_TYPE_PAIRED_END = tr.createNewVocabularyTerm('PAIRED_END') -vocabulary_term_END_TYPE_PAIRED_END.setDescription(None) -vocabulary_term_END_TYPE_PAIRED_END.setLabel(None) -vocabulary_term_END_TYPE_PAIRED_END.setOrdinal(3) -vocabulary_END_TYPE.addTerm(vocabulary_term_END_TYPE_PAIRED_END) - -vocabulary_term_END_TYPE_SINGLE_READ = tr.createNewVocabularyTerm('SINGLE_READ') -vocabulary_term_END_TYPE_SINGLE_READ.setDescription(None) -vocabulary_term_END_TYPE_SINGLE_READ.setLabel(None) -vocabulary_term_END_TYPE_SINGLE_READ.setOrdinal(2) -vocabulary_END_TYPE.addTerm(vocabulary_term_END_TYPE_SINGLE_READ) - -vocabulary_EXPERIMENT_DESIGN = tr.createNewVocabulary('EXPERIMENT_DESIGN') -vocabulary_EXPERIMENT_DESIGN.setDescription('General Intent') -vocabulary_EXPERIMENT_DESIGN.setUrlTemplate(None) -vocabulary_EXPERIMENT_DESIGN.setManagedInternally(False) -vocabulary_EXPERIMENT_DESIGN.setInternalNamespace(False) -vocabulary_EXPERIMENT_DESIGN.setChosenFromList(True) - -vocabulary_term_EXPERIMENT_DESIGN_OTHER = tr.createNewVocabularyTerm('OTHER') -vocabulary_term_EXPERIMENT_DESIGN_OTHER.setDescription(None) -vocabulary_term_EXPERIMENT_DESIGN_OTHER.setLabel('Other') -vocabulary_term_EXPERIMENT_DESIGN_OTHER.setOrdinal(9) -vocabulary_EXPERIMENT_DESIGN.addTerm(vocabulary_term_EXPERIMENT_DESIGN_OTHER) - -vocabulary_term_EXPERIMENT_DESIGN_BINDING_SITE_IDENTIFICATION = tr.createNewVocabularyTerm('BINDING_SITE_IDENTIFICATION') -vocabulary_term_EXPERIMENT_DESIGN_BINDING_SITE_IDENTIFICATION.setDescription(None) -vocabulary_term_EXPERIMENT_DESIGN_BINDING_SITE_IDENTIFICATION.setLabel('Binding Site Identification') -vocabulary_term_EXPERIMENT_DESIGN_BINDING_SITE_IDENTIFICATION.setOrdinal(1) -vocabulary_EXPERIMENT_DESIGN.addTerm(vocabulary_term_EXPERIMENT_DESIGN_BINDING_SITE_IDENTIFICATION) - -vocabulary_term_EXPERIMENT_DESIGN_SEQUENCE_ENRICHMENT = tr.createNewVocabularyTerm('SEQUENCE_ENRICHMENT') -vocabulary_term_EXPERIMENT_DESIGN_SEQUENCE_ENRICHMENT.setDescription(None) -vocabulary_term_EXPERIMENT_DESIGN_SEQUENCE_ENRICHMENT.setLabel('Sequence Enrichment') -vocabulary_term_EXPERIMENT_DESIGN_SEQUENCE_ENRICHMENT.setOrdinal(7) -vocabulary_EXPERIMENT_DESIGN.addTerm(vocabulary_term_EXPERIMENT_DESIGN_SEQUENCE_ENRICHMENT) - -vocabulary_term_EXPERIMENT_DESIGN_TRANSCRIPT_IDENTIFICATION = tr.createNewVocabularyTerm('TRANSCRIPT_IDENTIFICATION') -vocabulary_term_EXPERIMENT_DESIGN_TRANSCRIPT_IDENTIFICATION.setDescription(None) -vocabulary_term_EXPERIMENT_DESIGN_TRANSCRIPT_IDENTIFICATION.setLabel('Transcript Identification') -vocabulary_term_EXPERIMENT_DESIGN_TRANSCRIPT_IDENTIFICATION.setOrdinal(8) -vocabulary_EXPERIMENT_DESIGN.addTerm(vocabulary_term_EXPERIMENT_DESIGN_TRANSCRIPT_IDENTIFICATION) - -vocabulary_term_EXPERIMENT_DESIGN_EXPRESSION = tr.createNewVocabularyTerm('EXPRESSION') -vocabulary_term_EXPERIMENT_DESIGN_EXPRESSION.setDescription(None) -vocabulary_term_EXPERIMENT_DESIGN_EXPRESSION.setLabel('Expression') -vocabulary_term_EXPERIMENT_DESIGN_EXPRESSION.setOrdinal(6) -vocabulary_EXPERIMENT_DESIGN.addTerm(vocabulary_term_EXPERIMENT_DESIGN_EXPRESSION) - -vocabulary_term_EXPERIMENT_DESIGN_DIFFERENTIAL_SPLICING = tr.createNewVocabularyTerm('DIFFERENTIAL_SPLICING') -vocabulary_term_EXPERIMENT_DESIGN_DIFFERENTIAL_SPLICING.setDescription(None) -vocabulary_term_EXPERIMENT_DESIGN_DIFFERENTIAL_SPLICING.setLabel('Differential Splicing') -vocabulary_term_EXPERIMENT_DESIGN_DIFFERENTIAL_SPLICING.setOrdinal(5) -vocabulary_EXPERIMENT_DESIGN.addTerm(vocabulary_term_EXPERIMENT_DESIGN_DIFFERENTIAL_SPLICING) - -vocabulary_term_EXPERIMENT_DESIGN_COMPARATIVE_GENOMIC_HYBRIDIZATION = tr.createNewVocabularyTerm('COMPARATIVE_GENOMIC_HYBRIDIZATION') -vocabulary_term_EXPERIMENT_DESIGN_COMPARATIVE_GENOMIC_HYBRIDIZATION.setDescription(None) -vocabulary_term_EXPERIMENT_DESIGN_COMPARATIVE_GENOMIC_HYBRIDIZATION.setLabel('Comparative Genomic Hybridization') -vocabulary_term_EXPERIMENT_DESIGN_COMPARATIVE_GENOMIC_HYBRIDIZATION.setOrdinal(3) -vocabulary_EXPERIMENT_DESIGN.addTerm(vocabulary_term_EXPERIMENT_DESIGN_COMPARATIVE_GENOMIC_HYBRIDIZATION) - -vocabulary_term_EXPERIMENT_DESIGN_DIFFERENTIAL_EXPRESSION = tr.createNewVocabularyTerm('DIFFERENTIAL_EXPRESSION') -vocabulary_term_EXPERIMENT_DESIGN_DIFFERENTIAL_EXPRESSION.setDescription(None) -vocabulary_term_EXPERIMENT_DESIGN_DIFFERENTIAL_EXPRESSION.setLabel('Differential Expression') -vocabulary_term_EXPERIMENT_DESIGN_DIFFERENTIAL_EXPRESSION.setOrdinal(4) -vocabulary_EXPERIMENT_DESIGN.addTerm(vocabulary_term_EXPERIMENT_DESIGN_DIFFERENTIAL_EXPRESSION) - -vocabulary_term_EXPERIMENT_DESIGN_CHROMATIN_MARKS = tr.createNewVocabularyTerm('CHROMATIN_MARKS') -vocabulary_term_EXPERIMENT_DESIGN_CHROMATIN_MARKS.setDescription(None) -vocabulary_term_EXPERIMENT_DESIGN_CHROMATIN_MARKS.setLabel('Chromatin Marks') -vocabulary_term_EXPERIMENT_DESIGN_CHROMATIN_MARKS.setOrdinal(2) -vocabulary_EXPERIMENT_DESIGN.addTerm(vocabulary_term_EXPERIMENT_DESIGN_CHROMATIN_MARKS) - -vocabulary_INDEX2 = tr.createNewVocabulary('INDEX2') -vocabulary_INDEX2.setDescription('Index 2 for Illumina Dual Indexing') -vocabulary_INDEX2.setUrlTemplate(None) -vocabulary_INDEX2.setManagedInternally(False) -vocabulary_INDEX2.setInternalNamespace(False) -vocabulary_INDEX2.setChosenFromList(True) - -vocabulary_term_INDEX2_ACTGCATA = tr.createNewVocabularyTerm('ACTGCATA') -vocabulary_term_INDEX2_ACTGCATA.setDescription('Nextera DNA') -vocabulary_term_INDEX2_ACTGCATA.setLabel('Index2 (i5) N506 ACTGCATA') -vocabulary_term_INDEX2_ACTGCATA.setOrdinal(6) -vocabulary_INDEX2.addTerm(vocabulary_term_INDEX2_ACTGCATA) - -vocabulary_term_INDEX2_TATCCTCT = tr.createNewVocabularyTerm('TATCCTCT') -vocabulary_term_INDEX2_TATCCTCT.setDescription('Nextera DNA') -vocabulary_term_INDEX2_TATCCTCT.setLabel('Index2 (i5) N503 TATCCTCT') -vocabulary_term_INDEX2_TATCCTCT.setOrdinal(3) -vocabulary_INDEX2.addTerm(vocabulary_term_INDEX2_TATCCTCT) - -vocabulary_term_INDEX2_GTAAGGAG = tr.createNewVocabularyTerm('GTAAGGAG') -vocabulary_term_INDEX2_GTAAGGAG.setDescription('Nextera DNA') -vocabulary_term_INDEX2_GTAAGGAG.setLabel('Index2 (i5) N505 GTAAGGAG') -vocabulary_term_INDEX2_GTAAGGAG.setOrdinal(5) -vocabulary_INDEX2.addTerm(vocabulary_term_INDEX2_GTAAGGAG) - -vocabulary_term_INDEX2_AGAGTAGA = tr.createNewVocabularyTerm('AGAGTAGA') -vocabulary_term_INDEX2_AGAGTAGA.setDescription('Nextera DNA') -vocabulary_term_INDEX2_AGAGTAGA.setLabel('Index2 (i5) N504 AGAGTAGA') -vocabulary_term_INDEX2_AGAGTAGA.setOrdinal(4) -vocabulary_INDEX2.addTerm(vocabulary_term_INDEX2_AGAGTAGA) - -vocabulary_term_INDEX2_CTCTCTAT = tr.createNewVocabularyTerm('CTCTCTAT') -vocabulary_term_INDEX2_CTCTCTAT.setDescription('Nextera DNA') -vocabulary_term_INDEX2_CTCTCTAT.setLabel('Index2 (i5) N502 CTCTCTAT') -vocabulary_term_INDEX2_CTCTCTAT.setOrdinal(2) -vocabulary_INDEX2.addTerm(vocabulary_term_INDEX2_CTCTCTAT) - -vocabulary_term_INDEX2_CTAAGCCT = tr.createNewVocabularyTerm('CTAAGCCT') -vocabulary_term_INDEX2_CTAAGCCT.setDescription('Nextera DNA') -vocabulary_term_INDEX2_CTAAGCCT.setLabel('Index2 (i5) N508 CTAAGCCT') -vocabulary_term_INDEX2_CTAAGCCT.setOrdinal(8) -vocabulary_INDEX2.addTerm(vocabulary_term_INDEX2_CTAAGCCT) - -vocabulary_term_INDEX2_AAGGAGTA = tr.createNewVocabularyTerm('AAGGAGTA') -vocabulary_term_INDEX2_AAGGAGTA.setDescription('Nextera DNA') -vocabulary_term_INDEX2_AAGGAGTA.setLabel('Index2 (i5) N507 AAGGAGTA') -vocabulary_term_INDEX2_AAGGAGTA.setOrdinal(7) -vocabulary_INDEX2.addTerm(vocabulary_term_INDEX2_AAGGAGTA) - -vocabulary_term_INDEX2_TAGATCGC = tr.createNewVocabularyTerm('TAGATCGC') -vocabulary_term_INDEX2_TAGATCGC.setDescription('Nextera DNA') -vocabulary_term_INDEX2_TAGATCGC.setLabel('Index2 (i5) N501 TAGATCGC') -vocabulary_term_INDEX2_TAGATCGC.setOrdinal(1) -vocabulary_INDEX2.addTerm(vocabulary_term_INDEX2_TAGATCGC) - -vocabulary_KIT = tr.createNewVocabulary('KIT') -vocabulary_KIT.setDescription('Illumina Kit used for preparation') -vocabulary_KIT.setUrlTemplate(None) -vocabulary_KIT.setManagedInternally(False) -vocabulary_KIT.setInternalNamespace(False) -vocabulary_KIT.setChosenFromList(True) - -vocabulary_term_KIT_AGILENT_SURESELECT_ENRICHMENTSYSTEM = tr.createNewVocabularyTerm('AGILENT_SURESELECT_ENRICHMENTSYSTEM') -vocabulary_term_KIT_AGILENT_SURESELECT_ENRICHMENTSYSTEM.setDescription(None) -vocabulary_term_KIT_AGILENT_SURESELECT_ENRICHMENTSYSTEM.setLabel('Agilent_SureSelect_EnrichmentSystem') -vocabulary_term_KIT_AGILENT_SURESELECT_ENRICHMENTSYSTEM.setOrdinal(20) -vocabulary_KIT.addTerm(vocabulary_term_KIT_AGILENT_SURESELECT_ENRICHMENTSYSTEM) - -vocabulary_term_KIT_NEXTERA_DNA_SAMPLE_PREP_KIT_BUFFER_HMW = tr.createNewVocabularyTerm('NEXTERA_DNA_SAMPLE_PREP_KIT_BUFFER_HMW') -vocabulary_term_KIT_NEXTERA_DNA_SAMPLE_PREP_KIT_BUFFER_HMW.setDescription(None) -vocabulary_term_KIT_NEXTERA_DNA_SAMPLE_PREP_KIT_BUFFER_HMW.setLabel('Nextera Genomic DNA Sample Preparation Kit BufferHMW(Epicentre)') -vocabulary_term_KIT_NEXTERA_DNA_SAMPLE_PREP_KIT_BUFFER_HMW.setOrdinal(19) -vocabulary_KIT.addTerm(vocabulary_term_KIT_NEXTERA_DNA_SAMPLE_PREP_KIT_BUFFER_HMW) - -vocabulary_term_KIT_GENOMICDNA_SAMPLE_PREP = tr.createNewVocabularyTerm('GENOMICDNA_SAMPLE_PREP') -vocabulary_term_KIT_GENOMICDNA_SAMPLE_PREP.setDescription(None) -vocabulary_term_KIT_GENOMICDNA_SAMPLE_PREP.setLabel('Illumina Genomic DNA Sample Preparation Kit') -vocabulary_term_KIT_GENOMICDNA_SAMPLE_PREP.setOrdinal(3) -vocabulary_KIT.addTerm(vocabulary_term_KIT_GENOMICDNA_SAMPLE_PREP) - -vocabulary_term_KIT_NONE = tr.createNewVocabularyTerm('NONE') -vocabulary_term_KIT_NONE.setDescription(None) -vocabulary_term_KIT_NONE.setLabel('None (Already prepared)') -vocabulary_term_KIT_NONE.setOrdinal(23) -vocabulary_KIT.addTerm(vocabulary_term_KIT_NONE) - -vocabulary_term_KIT_NEBNEXT_DNA_SAMPLE_PREP_MASTER_MIX_SET1 = tr.createNewVocabularyTerm('NEBNEXT_DNA_SAMPLE_PREP_MASTER_MIX_SET1') -vocabulary_term_KIT_NEBNEXT_DNA_SAMPLE_PREP_MASTER_MIX_SET1.setDescription(None) -vocabulary_term_KIT_NEBNEXT_DNA_SAMPLE_PREP_MASTER_MIX_SET1.setLabel('NEB Genomic DNA Sample Preparation Kit') -vocabulary_term_KIT_NEBNEXT_DNA_SAMPLE_PREP_MASTER_MIX_SET1.setOrdinal(2) -vocabulary_KIT.addTerm(vocabulary_term_KIT_NEBNEXT_DNA_SAMPLE_PREP_MASTER_MIX_SET1) - -vocabulary_term_KIT_PAIRED_END_DNA_SAMPLE_PREP = tr.createNewVocabularyTerm('PAIRED_END_DNA_SAMPLE_PREP') -vocabulary_term_KIT_PAIRED_END_DNA_SAMPLE_PREP.setDescription(None) -vocabulary_term_KIT_PAIRED_END_DNA_SAMPLE_PREP.setLabel('Paired End DNA Sample Prep Oligo Kit') -vocabulary_term_KIT_PAIRED_END_DNA_SAMPLE_PREP.setOrdinal(14) -vocabulary_KIT.addTerm(vocabulary_term_KIT_PAIRED_END_DNA_SAMPLE_PREP) - -vocabulary_term_KIT_CHIP_SEQ_SAMPLE_PREP = tr.createNewVocabularyTerm('CHIP_SEQ_SAMPLE_PREP') -vocabulary_term_KIT_CHIP_SEQ_SAMPLE_PREP.setDescription(None) -vocabulary_term_KIT_CHIP_SEQ_SAMPLE_PREP.setLabel('ChIP-Seq Sample Preparation Kit') -vocabulary_term_KIT_CHIP_SEQ_SAMPLE_PREP.setOrdinal(1) -vocabulary_KIT.addTerm(vocabulary_term_KIT_CHIP_SEQ_SAMPLE_PREP) - -vocabulary_term_KIT_POLYA_SCRIPTSEQ_MRNASEQ_KIT = tr.createNewVocabularyTerm('POLYA_SCRIPTSEQ_MRNA-SEQ_KIT') -vocabulary_term_KIT_POLYA_SCRIPTSEQ_MRNASEQ_KIT.setDescription(None) -vocabulary_term_KIT_POLYA_SCRIPTSEQ_MRNASEQ_KIT.setLabel('PolyA(Beads) ScriptSeq mRNA-Seq_Epicentre-kit') -vocabulary_term_KIT_POLYA_SCRIPTSEQ_MRNASEQ_KIT.setOrdinal(17) -vocabulary_KIT.addTerm(vocabulary_term_KIT_POLYA_SCRIPTSEQ_MRNASEQ_KIT) - -vocabulary_term_KIT_MRNA_SEQ_SAMPLE_PREP = tr.createNewVocabularyTerm('MRNA_SEQ_SAMPLE_PREP') -vocabulary_term_KIT_MRNA_SEQ_SAMPLE_PREP.setDescription(None) -vocabulary_term_KIT_MRNA_SEQ_SAMPLE_PREP.setLabel('mRNA-Seq Sample Preparation Kit') -vocabulary_term_KIT_MRNA_SEQ_SAMPLE_PREP.setOrdinal(15) -vocabulary_KIT.addTerm(vocabulary_term_KIT_MRNA_SEQ_SAMPLE_PREP) - -vocabulary_term_KIT_TRUSEQ_DNA_SAMPLE_PREP_KIT = tr.createNewVocabularyTerm('TRUSEQ_DNA_SAMPLE_PREP_KIT') -vocabulary_term_KIT_TRUSEQ_DNA_SAMPLE_PREP_KIT.setDescription(None) -vocabulary_term_KIT_TRUSEQ_DNA_SAMPLE_PREP_KIT.setLabel('TruSeq_DNA_SamplePrepKit_Illumina') -vocabulary_term_KIT_TRUSEQ_DNA_SAMPLE_PREP_KIT.setOrdinal(22) -vocabulary_KIT.addTerm(vocabulary_term_KIT_TRUSEQ_DNA_SAMPLE_PREP_KIT) - -vocabulary_term_KIT_TRUSEQRNA_SAMPLE_PREP_KIT = tr.createNewVocabularyTerm('TRUSEQRNA_SAMPLE_PREP_KIT') -vocabulary_term_KIT_TRUSEQRNA_SAMPLE_PREP_KIT.setDescription(None) -vocabulary_term_KIT_TRUSEQRNA_SAMPLE_PREP_KIT.setLabel('TruSeq_RNA_SamplePrepKit_Illumina') -vocabulary_term_KIT_TRUSEQRNA_SAMPLE_PREP_KIT.setOrdinal(21) -vocabulary_KIT.addTerm(vocabulary_term_KIT_TRUSEQRNA_SAMPLE_PREP_KIT) - -vocabulary_term_KIT_NEXTERA_DNA_SAMPLE_PREP_KITS = tr.createNewVocabularyTerm('NEXTERA_DNA_SAMPLE_PREP_KITS') -vocabulary_term_KIT_NEXTERA_DNA_SAMPLE_PREP_KITS.setDescription(None) -vocabulary_term_KIT_NEXTERA_DNA_SAMPLE_PREP_KITS.setLabel('Nextera Genomic DNA Sample Preparation Kit BufferLMW(Epicentre)') -vocabulary_term_KIT_NEXTERA_DNA_SAMPLE_PREP_KITS.setOrdinal(18) -vocabulary_KIT.addTerm(vocabulary_term_KIT_NEXTERA_DNA_SAMPLE_PREP_KITS) - -vocabulary_term_KIT_RIBOZERO_SCRIPTSEQ_MRNASEQ_KIT = tr.createNewVocabularyTerm('RIBOZERO_SCRIPTSEQ_MRNA-SEQ_KIT') -vocabulary_term_KIT_RIBOZERO_SCRIPTSEQ_MRNASEQ_KIT.setDescription(None) -vocabulary_term_KIT_RIBOZERO_SCRIPTSEQ_MRNASEQ_KIT.setLabel('RiboZero ScriptSeq mRNA-Seq_Epicentre-kit') -vocabulary_term_KIT_RIBOZERO_SCRIPTSEQ_MRNASEQ_KIT.setOrdinal(16) -vocabulary_KIT.addTerm(vocabulary_term_KIT_RIBOZERO_SCRIPTSEQ_MRNASEQ_KIT) - -vocabulary_MACS_VERSION = tr.createNewVocabulary('MACS_VERSION') -vocabulary_MACS_VERSION.setDescription('Used MACS version for Peak Calling') -vocabulary_MACS_VERSION.setUrlTemplate(None) -vocabulary_MACS_VERSION.setManagedInternally(False) -vocabulary_MACS_VERSION.setInternalNamespace(False) -vocabulary_MACS_VERSION.setChosenFromList(True) - -vocabulary_term_MACS_VERSION_1371 = tr.createNewVocabularyTerm('1.3.7.1') -vocabulary_term_MACS_VERSION_1371.setDescription(None) -vocabulary_term_MACS_VERSION_1371.setLabel('macs 1.3.7.1 (Oktoberfest, bug fixed #1)') -vocabulary_term_MACS_VERSION_1371.setOrdinal(4) -vocabulary_MACS_VERSION.addTerm(vocabulary_term_MACS_VERSION_1371) - -vocabulary_term_MACS_VERSION_140RC2 = tr.createNewVocabularyTerm('1.4.0RC2') -vocabulary_term_MACS_VERSION_140RC2.setDescription(None) -vocabulary_term_MACS_VERSION_140RC2.setLabel('macs14 1.4.0rc2 20110214 (Valentine)') -vocabulary_term_MACS_VERSION_140RC2.setOrdinal(3) -vocabulary_MACS_VERSION.addTerm(vocabulary_term_MACS_VERSION_140RC2) - -vocabulary_MISMATCH_IN_INDEX = tr.createNewVocabulary('MISMATCH_IN_INDEX') -vocabulary_MISMATCH_IN_INDEX.setDescription('Mismatch in Index allowed') -vocabulary_MISMATCH_IN_INDEX.setUrlTemplate(None) -vocabulary_MISMATCH_IN_INDEX.setManagedInternally(False) -vocabulary_MISMATCH_IN_INDEX.setInternalNamespace(False) -vocabulary_MISMATCH_IN_INDEX.setChosenFromList(True) - -vocabulary_term_MISMATCH_IN_INDEX_ONE = tr.createNewVocabularyTerm('ONE') -vocabulary_term_MISMATCH_IN_INDEX_ONE.setDescription(None) -vocabulary_term_MISMATCH_IN_INDEX_ONE.setLabel(None) -vocabulary_term_MISMATCH_IN_INDEX_ONE.setOrdinal(2) -vocabulary_MISMATCH_IN_INDEX.addTerm(vocabulary_term_MISMATCH_IN_INDEX_ONE) - -vocabulary_term_MISMATCH_IN_INDEX_NONE = tr.createNewVocabularyTerm('NONE') -vocabulary_term_MISMATCH_IN_INDEX_NONE.setDescription(None) -vocabulary_term_MISMATCH_IN_INDEX_NONE.setLabel(None) -vocabulary_term_MISMATCH_IN_INDEX_NONE.setOrdinal(1) -vocabulary_MISMATCH_IN_INDEX.addTerm(vocabulary_term_MISMATCH_IN_INDEX_NONE) - -vocabulary_NANO_DROP = tr.createNewVocabulary('NANO_DROP') -vocabulary_NANO_DROP.setDescription('Device for measuring the total amount of genetic material contained in the probe') -vocabulary_NANO_DROP.setUrlTemplate(None) -vocabulary_NANO_DROP.setManagedInternally(False) -vocabulary_NANO_DROP.setInternalNamespace(False) -vocabulary_NANO_DROP.setChosenFromList(True) - -vocabulary_term_NANO_DROP_CONCND3300 = tr.createNewVocabularyTerm('CONCND3300') -vocabulary_term_NANO_DROP_CONCND3300.setDescription(None) -vocabulary_term_NANO_DROP_CONCND3300.setLabel('Conc Nano Drop 3300') -vocabulary_term_NANO_DROP_CONCND3300.setOrdinal(1) -vocabulary_NANO_DROP.addTerm(vocabulary_term_NANO_DROP_CONCND3300) - -vocabulary_term_NANO_DROP_CONCND1000 = tr.createNewVocabularyTerm('CONCND1000') -vocabulary_term_NANO_DROP_CONCND1000.setDescription(None) -vocabulary_term_NANO_DROP_CONCND1000.setLabel('Conc Nano Drop 1000') -vocabulary_term_NANO_DROP_CONCND1000.setOrdinal(2) -vocabulary_NANO_DROP.addTerm(vocabulary_term_NANO_DROP_CONCND1000) - -vocabulary_term_NANO_DROP_CONCND2000 = tr.createNewVocabularyTerm('CONCND2000') -vocabulary_term_NANO_DROP_CONCND2000.setDescription(None) -vocabulary_term_NANO_DROP_CONCND2000.setLabel('Conc Nano Drop 2000') -vocabulary_term_NANO_DROP_CONCND2000.setOrdinal(3) -vocabulary_NANO_DROP.addTerm(vocabulary_term_NANO_DROP_CONCND2000) - -vocabulary_NCBI_TAXONOMY = tr.createNewVocabulary('NCBI_TAXONOMY') -vocabulary_NCBI_TAXONOMY.setDescription(None) -vocabulary_NCBI_TAXONOMY.setUrlTemplate('http://www.ncbi.nlm.nih.gov/Taxonomy/Browser/wwwtax.cgi?id=$term$') -vocabulary_NCBI_TAXONOMY.setManagedInternally(False) -vocabulary_NCBI_TAXONOMY.setInternalNamespace(False) -vocabulary_NCBI_TAXONOMY.setChosenFromList(True) - -vocabulary_term_NCBI_TAXONOMY_9940 = tr.createNewVocabularyTerm('9940') -vocabulary_term_NCBI_TAXONOMY_9940.setDescription('Genbank common name: sheep\nInherited blast name: even-toed ungulates') -vocabulary_term_NCBI_TAXONOMY_9940.setLabel('Ovis aries') -vocabulary_term_NCBI_TAXONOMY_9940.setOrdinal(32) -vocabulary_NCBI_TAXONOMY.addTerm(vocabulary_term_NCBI_TAXONOMY_9940) - -vocabulary_term_NCBI_TAXONOMY_35525 = tr.createNewVocabularyTerm('35525') -vocabulary_term_NCBI_TAXONOMY_35525.setDescription(None) -vocabulary_term_NCBI_TAXONOMY_35525.setLabel('Daphnia Magna') -vocabulary_term_NCBI_TAXONOMY_35525.setOrdinal(38) -vocabulary_NCBI_TAXONOMY.addTerm(vocabulary_term_NCBI_TAXONOMY_35525) - -vocabulary_term_NCBI_TAXONOMY_4896 = tr.createNewVocabularyTerm('4896') -vocabulary_term_NCBI_TAXONOMY_4896.setDescription('Genbank common name: fission yeast\nInherited blast name: ascomycetes') -vocabulary_term_NCBI_TAXONOMY_4896.setLabel('Schizosaccharomyces pombe') -vocabulary_term_NCBI_TAXONOMY_4896.setOrdinal(25) -vocabulary_NCBI_TAXONOMY.addTerm(vocabulary_term_NCBI_TAXONOMY_4896) - -vocabulary_term_NCBI_TAXONOMY_3702 = tr.createNewVocabularyTerm('3702') -vocabulary_term_NCBI_TAXONOMY_3702.setDescription('Genbank common name: thale cress\nInherited blast name: eudicots') -vocabulary_term_NCBI_TAXONOMY_3702.setLabel('Arabidopsis thaliana') -vocabulary_term_NCBI_TAXONOMY_3702.setOrdinal(28) -vocabulary_NCBI_TAXONOMY.addTerm(vocabulary_term_NCBI_TAXONOMY_3702) - -vocabulary_term_NCBI_TAXONOMY_9823 = tr.createNewVocabularyTerm('9823') -vocabulary_term_NCBI_TAXONOMY_9823.setDescription('Genbank common name: pig\nInherited blast name: even-toed ungulates') -vocabulary_term_NCBI_TAXONOMY_9823.setLabel('Sus scrofa') -vocabulary_term_NCBI_TAXONOMY_9823.setOrdinal(31) -vocabulary_NCBI_TAXONOMY.addTerm(vocabulary_term_NCBI_TAXONOMY_9823) - -vocabulary_term_NCBI_TAXONOMY_3573 = tr.createNewVocabularyTerm('3573') -vocabulary_term_NCBI_TAXONOMY_3573.setDescription('Genbank common name: campions\nInherited blast name: eudicots') -vocabulary_term_NCBI_TAXONOMY_3573.setLabel(' Silene') -vocabulary_term_NCBI_TAXONOMY_3573.setOrdinal(42) -vocabulary_NCBI_TAXONOMY.addTerm(vocabulary_term_NCBI_TAXONOMY_3573) - -vocabulary_term_NCBI_TAXONOMY_99287 = tr.createNewVocabularyTerm('99287') -vocabulary_term_NCBI_TAXONOMY_99287.setDescription('Inherited blast name: enterobacteria') -vocabulary_term_NCBI_TAXONOMY_99287.setLabel('Salmonella enterica subsp. enterica serovar Typhimurium str. LT2') -vocabulary_term_NCBI_TAXONOMY_99287.setOrdinal(24) -vocabulary_NCBI_TAXONOMY.addTerm(vocabulary_term_NCBI_TAXONOMY_99287) - -vocabulary_term_NCBI_TAXONOMY_562 = tr.createNewVocabularyTerm('562') -vocabulary_term_NCBI_TAXONOMY_562.setDescription('Inherited blast name: enterobacteria') -vocabulary_term_NCBI_TAXONOMY_562.setLabel('Escherichia coli') -vocabulary_term_NCBI_TAXONOMY_562.setOrdinal(8) -vocabulary_NCBI_TAXONOMY.addTerm(vocabulary_term_NCBI_TAXONOMY_562) - -vocabulary_term_NCBI_TAXONOMY_282301 = tr.createNewVocabularyTerm('282301') -vocabulary_term_NCBI_TAXONOMY_282301.setDescription('Inherited blast name: flatworms') -vocabulary_term_NCBI_TAXONOMY_282301.setLabel('Macrostomum lignano') -vocabulary_term_NCBI_TAXONOMY_282301.setOrdinal(23) -vocabulary_NCBI_TAXONOMY.addTerm(vocabulary_term_NCBI_TAXONOMY_282301) - -vocabulary_term_NCBI_TAXONOMY_8153 = tr.createNewVocabularyTerm('8153') -vocabulary_term_NCBI_TAXONOMY_8153.setDescription('cichlid fish') -vocabulary_term_NCBI_TAXONOMY_8153.setLabel('Haplochromis burtoni') -vocabulary_term_NCBI_TAXONOMY_8153.setOrdinal(34) -vocabulary_NCBI_TAXONOMY.addTerm(vocabulary_term_NCBI_TAXONOMY_8153) - -vocabulary_term_NCBI_TAXONOMY_6669 = tr.createNewVocabularyTerm('6669') -vocabulary_term_NCBI_TAXONOMY_6669.setDescription('Genbank common name: common water flea\nInherited blast name: crustaceans') -vocabulary_term_NCBI_TAXONOMY_6669.setLabel('Daphnia pulex') -vocabulary_term_NCBI_TAXONOMY_6669.setOrdinal(7) -vocabulary_NCBI_TAXONOMY.addTerm(vocabulary_term_NCBI_TAXONOMY_6669) - -vocabulary_term_NCBI_TAXONOMY_8113 = tr.createNewVocabularyTerm('8113') -vocabulary_term_NCBI_TAXONOMY_8113.setDescription('Genbank common name: cichlids\nInherited blast name: bony fishes') -vocabulary_term_NCBI_TAXONOMY_8113.setLabel('Cichlidae') -vocabulary_term_NCBI_TAXONOMY_8113.setOrdinal(20) -vocabulary_NCBI_TAXONOMY.addTerm(vocabulary_term_NCBI_TAXONOMY_8113) - -vocabulary_term_NCBI_TAXONOMY_7227 = tr.createNewVocabularyTerm('7227') -vocabulary_term_NCBI_TAXONOMY_7227.setDescription('Genbank common name: fruit fly\nInherited blast name: flies') -vocabulary_term_NCBI_TAXONOMY_7227.setLabel('Drosophila melanogaster') -vocabulary_term_NCBI_TAXONOMY_7227.setOrdinal(3) -vocabulary_NCBI_TAXONOMY.addTerm(vocabulary_term_NCBI_TAXONOMY_7227) - -vocabulary_term_NCBI_TAXONOMY_623 = tr.createNewVocabularyTerm('623') -vocabulary_term_NCBI_TAXONOMY_623.setDescription('Inherited blast name: enterobacteria') -vocabulary_term_NCBI_TAXONOMY_623.setLabel('Shigella flexneri') -vocabulary_term_NCBI_TAXONOMY_623.setOrdinal(9) -vocabulary_NCBI_TAXONOMY.addTerm(vocabulary_term_NCBI_TAXONOMY_623) - -vocabulary_term_NCBI_TAXONOMY_3569 = tr.createNewVocabularyTerm('3569') -vocabulary_term_NCBI_TAXONOMY_3569.setDescription('Genbank common name: clove pink') -vocabulary_term_NCBI_TAXONOMY_3569.setLabel('Dianthus') -vocabulary_term_NCBI_TAXONOMY_3569.setOrdinal(41) -vocabulary_NCBI_TAXONOMY.addTerm(vocabulary_term_NCBI_TAXONOMY_3569) - -vocabulary_term_NCBI_TAXONOMY_4932 = tr.createNewVocabularyTerm('4932') -vocabulary_term_NCBI_TAXONOMY_4932.setDescription("Genbank common name: baker's yeast\nInherited blast name: ascomycetes") -vocabulary_term_NCBI_TAXONOMY_4932.setLabel('Saccharomyces cerevisiae') -vocabulary_term_NCBI_TAXONOMY_4932.setOrdinal(5) -vocabulary_NCBI_TAXONOMY.addTerm(vocabulary_term_NCBI_TAXONOMY_4932) - -vocabulary_term_NCBI_TAXONOMY_7955 = tr.createNewVocabularyTerm('7955') -vocabulary_term_NCBI_TAXONOMY_7955.setDescription('Genbank common name: zebrafish\nInherited blast name: bony fishes') -vocabulary_term_NCBI_TAXONOMY_7955.setLabel('Danio rerio') -vocabulary_term_NCBI_TAXONOMY_7955.setOrdinal(27) -vocabulary_NCBI_TAXONOMY.addTerm(vocabulary_term_NCBI_TAXONOMY_7955) - -vocabulary_term_NCBI_TAXONOMY_13068 = tr.createNewVocabularyTerm('13068') -vocabulary_term_NCBI_TAXONOMY_13068.setDescription(None) -vocabulary_term_NCBI_TAXONOMY_13068.setLabel('Forficula auricularia (earwig)') -vocabulary_term_NCBI_TAXONOMY_13068.setOrdinal(40) -vocabulary_NCBI_TAXONOMY.addTerm(vocabulary_term_NCBI_TAXONOMY_13068) - -vocabulary_term_NCBI_TAXONOMY_10116 = tr.createNewVocabularyTerm('10116') -vocabulary_term_NCBI_TAXONOMY_10116.setDescription('Genbank common name: Norway rat\nInherited blast name: rodents') -vocabulary_term_NCBI_TAXONOMY_10116.setLabel('Rattus norvegicus') -vocabulary_term_NCBI_TAXONOMY_10116.setOrdinal(6) -vocabulary_NCBI_TAXONOMY.addTerm(vocabulary_term_NCBI_TAXONOMY_10116) - -vocabulary_term_NCBI_TAXONOMY_225322 = tr.createNewVocabularyTerm('225322') -vocabulary_term_NCBI_TAXONOMY_225322.setDescription('Bacterium which infects Daphnia\nPasteuria ramosa Metchnikoff 1888 (Approved Lists 1980) emend. Starr et al. 1986\nEbert D, Rainey P, Embley TM, Scholz D. Development, life\n cycle, ultrastructure and phylogenetic position of Pasteuria ramosa Metchnikoff 1888: rediscovery of an obligate\n endoparasite of Daphnia magna Straus. Philos Trans R Soc\n Lond Ser B. 1996;351:1689.') -vocabulary_term_NCBI_TAXONOMY_225322.setLabel('Pasteuria ramosa') -vocabulary_term_NCBI_TAXONOMY_225322.setOrdinal(29) -vocabulary_NCBI_TAXONOMY.addTerm(vocabulary_term_NCBI_TAXONOMY_225322) - -vocabulary_term_NCBI_TAXONOMY_4897 = tr.createNewVocabularyTerm('4897') -vocabulary_term_NCBI_TAXONOMY_4897.setDescription('Inherited blast name: ascomycetes') -vocabulary_term_NCBI_TAXONOMY_4897.setLabel('Schizosaccharomyces japonicus') -vocabulary_term_NCBI_TAXONOMY_4897.setOrdinal(26) -vocabulary_NCBI_TAXONOMY.addTerm(vocabulary_term_NCBI_TAXONOMY_4897) - -vocabulary_term_NCBI_TAXONOMY_32644 = tr.createNewVocabularyTerm('32644') -vocabulary_term_NCBI_TAXONOMY_32644.setDescription('Inherited blast name: unclassified') -vocabulary_term_NCBI_TAXONOMY_32644.setLabel('unidentified') -vocabulary_term_NCBI_TAXONOMY_32644.setOrdinal(50) -vocabulary_NCBI_TAXONOMY.addTerm(vocabulary_term_NCBI_TAXONOMY_32644) - -vocabulary_term_NCBI_TAXONOMY_9606 = tr.createNewVocabularyTerm('9606') -vocabulary_term_NCBI_TAXONOMY_9606.setDescription('Genbank common name: human\nInherited blast name: primates') -vocabulary_term_NCBI_TAXONOMY_9606.setLabel('Homo sapiens') -vocabulary_term_NCBI_TAXONOMY_9606.setOrdinal(2) -vocabulary_NCBI_TAXONOMY.addTerm(vocabulary_term_NCBI_TAXONOMY_9606) - -vocabulary_term_NCBI_TAXONOMY_9913 = tr.createNewVocabularyTerm('9913') -vocabulary_term_NCBI_TAXONOMY_9913.setDescription('Genbank common name: cattle\nInherited blast name: even-toed ungulates') -vocabulary_term_NCBI_TAXONOMY_9913.setLabel('Bos taurus') -vocabulary_term_NCBI_TAXONOMY_9913.setOrdinal(30) -vocabulary_NCBI_TAXONOMY.addTerm(vocabulary_term_NCBI_TAXONOMY_9913) - -vocabulary_term_NCBI_TAXONOMY_10847 = tr.createNewVocabularyTerm('10847') -vocabulary_term_NCBI_TAXONOMY_10847.setDescription('Inherited blast name: viruses') -vocabulary_term_NCBI_TAXONOMY_10847.setLabel('Enterobacteria phage phiX174') -vocabulary_term_NCBI_TAXONOMY_10847.setOrdinal(18) -vocabulary_NCBI_TAXONOMY.addTerm(vocabulary_term_NCBI_TAXONOMY_10847) - -vocabulary_term_NCBI_TAXONOMY_6239 = tr.createNewVocabularyTerm('6239') -vocabulary_term_NCBI_TAXONOMY_6239.setDescription('Inherited blast name: nematodes') -vocabulary_term_NCBI_TAXONOMY_6239.setLabel('Caenorhabditis elegans') -vocabulary_term_NCBI_TAXONOMY_6239.setOrdinal(4) -vocabulary_NCBI_TAXONOMY.addTerm(vocabulary_term_NCBI_TAXONOMY_6239) - -vocabulary_term_NCBI_TAXONOMY_10090 = tr.createNewVocabularyTerm('10090') -vocabulary_term_NCBI_TAXONOMY_10090.setDescription('Genbank common name: house mouse\nInherited blast name: rodents') -vocabulary_term_NCBI_TAXONOMY_10090.setLabel('Mus musculus') -vocabulary_term_NCBI_TAXONOMY_10090.setOrdinal(1) -vocabulary_NCBI_TAXONOMY.addTerm(vocabulary_term_NCBI_TAXONOMY_10090) - -vocabulary_term_NCBI_TAXONOMY_190650 = tr.createNewVocabularyTerm('190650') -vocabulary_term_NCBI_TAXONOMY_190650.setDescription('Inherited blast name: a-proteobacteria') -vocabulary_term_NCBI_TAXONOMY_190650.setLabel('Caulobacter crescentus CB15') -vocabulary_term_NCBI_TAXONOMY_190650.setOrdinal(19) -vocabulary_NCBI_TAXONOMY.addTerm(vocabulary_term_NCBI_TAXONOMY_190650) - -vocabulary_term_NCBI_TAXONOMY_481459 = tr.createNewVocabularyTerm('481459') -vocabulary_term_NCBI_TAXONOMY_481459.setDescription('Genbank common name: three-spined stickleback\nInherited blast name: bony fishes') -vocabulary_term_NCBI_TAXONOMY_481459.setLabel('Gasterosteus aculeatus aculeatus') -vocabulary_term_NCBI_TAXONOMY_481459.setOrdinal(21) -vocabulary_NCBI_TAXONOMY.addTerm(vocabulary_term_NCBI_TAXONOMY_481459) - -vocabulary_term_NCBI_TAXONOMY_9925 = tr.createNewVocabularyTerm('9925') -vocabulary_term_NCBI_TAXONOMY_9925.setDescription('Genbank common name: goat\nInherited blast name: even-toed ungulates') -vocabulary_term_NCBI_TAXONOMY_9925.setLabel('Capra hircus') -vocabulary_term_NCBI_TAXONOMY_9925.setOrdinal(33) -vocabulary_NCBI_TAXONOMY.addTerm(vocabulary_term_NCBI_TAXONOMY_9925) - -vocabulary_term_NCBI_TAXONOMY_4081 = tr.createNewVocabularyTerm('4081') -vocabulary_term_NCBI_TAXONOMY_4081.setDescription('Common Name: tomato') -vocabulary_term_NCBI_TAXONOMY_4081.setLabel('Solanum lycopersicum (tomato)') -vocabulary_term_NCBI_TAXONOMY_4081.setOrdinal(39) -vocabulary_NCBI_TAXONOMY.addTerm(vocabulary_term_NCBI_TAXONOMY_4081) - -vocabulary_term_NCBI_TAXONOMY_61818 = tr.createNewVocabularyTerm('61818') -vocabulary_term_NCBI_TAXONOMY_61818.setDescription('bony fish') -vocabulary_term_NCBI_TAXONOMY_61818.setLabel('Amphilophus (nicaraguan)') -vocabulary_term_NCBI_TAXONOMY_61818.setOrdinal(35) -vocabulary_NCBI_TAXONOMY.addTerm(vocabulary_term_NCBI_TAXONOMY_61818) - -vocabulary_PIPELINE_VERSION = tr.createNewVocabulary('PIPELINE_VERSION') -vocabulary_PIPELINE_VERSION.setDescription('With which pipeline version has the data been analyzed?') -vocabulary_PIPELINE_VERSION.setUrlTemplate(None) -vocabulary_PIPELINE_VERSION.setManagedInternally(False) -vocabulary_PIPELINE_VERSION.setInternalNamespace(False) -vocabulary_PIPELINE_VERSION.setChosenFromList(True) - -vocabulary_term_PIPELINE_VERSION_11242 = tr.createNewVocabularyTerm('1.12.4.2') -vocabulary_term_PIPELINE_VERSION_11242.setDescription('Real Time Analysis in combination with HCS 1.4.8') -vocabulary_term_PIPELINE_VERSION_11242.setLabel('RTA 1.12.4.2 (HiSeq 2000)') -vocabulary_term_PIPELINE_VERSION_11242.setOrdinal(2) -vocabulary_PIPELINE_VERSION.addTerm(vocabulary_term_PIPELINE_VERSION_11242) - -vocabulary_term_PIPELINE_VERSION_10 = tr.createNewVocabularyTerm('1.0') -vocabulary_term_PIPELINE_VERSION_10.setDescription(None) -vocabulary_term_PIPELINE_VERSION_10.setLabel(None) -vocabulary_term_PIPELINE_VERSION_10.setOrdinal(26) -vocabulary_PIPELINE_VERSION.addTerm(vocabulary_term_PIPELINE_VERSION_10) - -vocabulary_term_PIPELINE_VERSION_RTA_16 = tr.createNewVocabularyTerm('RTA_1.6') -vocabulary_term_PIPELINE_VERSION_RTA_16.setDescription('Real Time Analysis 1.6') -vocabulary_term_PIPELINE_VERSION_RTA_16.setLabel('RTA 1.6') -vocabulary_term_PIPELINE_VERSION_RTA_16.setOrdinal(13) -vocabulary_PIPELINE_VERSION.addTerm(vocabulary_term_PIPELINE_VERSION_RTA_16) - -vocabulary_term_PIPELINE_VERSION_132 = tr.createNewVocabularyTerm('1.3.2') -vocabulary_term_PIPELINE_VERSION_132.setDescription(None) -vocabulary_term_PIPELINE_VERSION_132.setLabel(None) -vocabulary_term_PIPELINE_VERSION_132.setOrdinal(23) -vocabulary_PIPELINE_VERSION.addTerm(vocabulary_term_PIPELINE_VERSION_132) - -vocabulary_term_PIPELINE_VERSION_14 = tr.createNewVocabularyTerm('1.4') -vocabulary_term_PIPELINE_VERSION_14.setDescription(None) -vocabulary_term_PIPELINE_VERSION_14.setLabel(None) -vocabulary_term_PIPELINE_VERSION_14.setOrdinal(22) -vocabulary_PIPELINE_VERSION.addTerm(vocabulary_term_PIPELINE_VERSION_14) - -vocabulary_term_PIPELINE_VERSION_RTA_15 = tr.createNewVocabularyTerm('RTA_1.5') -vocabulary_term_PIPELINE_VERSION_RTA_15.setDescription(None) -vocabulary_term_PIPELINE_VERSION_RTA_15.setLabel('RTA 1.5') -vocabulary_term_PIPELINE_VERSION_RTA_15.setOrdinal(14) -vocabulary_PIPELINE_VERSION.addTerm(vocabulary_term_PIPELINE_VERSION_RTA_15) - -vocabulary_term_PIPELINE_VERSION_19 = tr.createNewVocabularyTerm('1.9') -vocabulary_term_PIPELINE_VERSION_19.setDescription('Real Time Analysis 1.9') -vocabulary_term_PIPELINE_VERSION_19.setLabel('RTA 1.9 (GA IIx)') -vocabulary_term_PIPELINE_VERSION_19.setOrdinal(5) -vocabulary_PIPELINE_VERSION.addTerm(vocabulary_term_PIPELINE_VERSION_19) - -vocabulary_term_PIPELINE_VERSION_1124 = tr.createNewVocabularyTerm('1.12.4') -vocabulary_term_PIPELINE_VERSION_1124.setDescription(None) -vocabulary_term_PIPELINE_VERSION_1124.setLabel('RTA 1.12.4 (HiSeq 2000)') -vocabulary_term_PIPELINE_VERSION_1124.setOrdinal(3) -vocabulary_PIPELINE_VERSION.addTerm(vocabulary_term_PIPELINE_VERSION_1124) - -vocabulary_term_PIPELINE_VERSION_RTA = tr.createNewVocabularyTerm('RTA') -vocabulary_term_PIPELINE_VERSION_RTA.setDescription(None) -vocabulary_term_PIPELINE_VERSION_RTA.setLabel(None) -vocabulary_term_PIPELINE_VERSION_RTA.setOrdinal(30) -vocabulary_PIPELINE_VERSION.addTerm(vocabulary_term_PIPELINE_VERSION_RTA) - -vocabulary_term_PIPELINE_VERSION_RTA_14150 = tr.createNewVocabularyTerm('RTA_1.4.15.0') -vocabulary_term_PIPELINE_VERSION_RTA_14150.setDescription(None) -vocabulary_term_PIPELINE_VERSION_RTA_14150.setLabel('RTA 1.4.15.0') -vocabulary_term_PIPELINE_VERSION_RTA_14150.setOrdinal(17) -vocabulary_PIPELINE_VERSION.addTerm(vocabulary_term_PIPELINE_VERSION_RTA_14150) - -vocabulary_term_PIPELINE_VERSION_112 = tr.createNewVocabularyTerm('1.12') -vocabulary_term_PIPELINE_VERSION_112.setDescription('Real Time Analysis 1.12 HiSeq 2000') -vocabulary_term_PIPELINE_VERSION_112.setLabel('RTA 1.12') -vocabulary_term_PIPELINE_VERSION_112.setOrdinal(4) -vocabulary_PIPELINE_VERSION.addTerm(vocabulary_term_PIPELINE_VERSION_112) - -vocabulary_term_PIPELINE_VERSION_15 = tr.createNewVocabularyTerm('1.5') -vocabulary_term_PIPELINE_VERSION_15.setDescription(None) -vocabulary_term_PIPELINE_VERSION_15.setLabel(None) -vocabulary_term_PIPELINE_VERSION_15.setOrdinal(18) -vocabulary_PIPELINE_VERSION.addTerm(vocabulary_term_PIPELINE_VERSION_15) - -vocabulary_term_PIPELINE_VERSION_11348 = tr.createNewVocabularyTerm('1.13.48') -vocabulary_term_PIPELINE_VERSION_11348.setDescription(None) -vocabulary_term_PIPELINE_VERSION_11348.setLabel('RTA 1.13.48') -vocabulary_term_PIPELINE_VERSION_11348.setOrdinal(1) -vocabulary_PIPELINE_VERSION.addTerm(vocabulary_term_PIPELINE_VERSION_11348) - -vocabulary_term_PIPELINE_VERSION_PRE_10 = tr.createNewVocabularyTerm('PRE_1.0') -vocabulary_term_PIPELINE_VERSION_PRE_10.setDescription('Before Pipeline Version 1.0') -vocabulary_term_PIPELINE_VERSION_PRE_10.setLabel(None) -vocabulary_term_PIPELINE_VERSION_PRE_10.setOrdinal(27) -vocabulary_PIPELINE_VERSION.addTerm(vocabulary_term_PIPELINE_VERSION_PRE_10) - -vocabulary_term_PIPELINE_VERSION_RTA_18 = tr.createNewVocabularyTerm('RTA_1.8') -vocabulary_term_PIPELINE_VERSION_RTA_18.setDescription('Real Time Analysis 1.8') -vocabulary_term_PIPELINE_VERSION_RTA_18.setLabel('RTA 1.8') -vocabulary_term_PIPELINE_VERSION_RTA_18.setOrdinal(6) -vocabulary_PIPELINE_VERSION.addTerm(vocabulary_term_PIPELINE_VERSION_RTA_18) - -vocabulary_term_PIPELINE_VERSION_NONE = tr.createNewVocabularyTerm('NONE') -vocabulary_term_PIPELINE_VERSION_NONE.setDescription(None) -vocabulary_term_PIPELINE_VERSION_NONE.setLabel(None) -vocabulary_term_PIPELINE_VERSION_NONE.setOrdinal(29) -vocabulary_PIPELINE_VERSION.addTerm(vocabulary_term_PIPELINE_VERSION_NONE) - -vocabulary_REQUIRED_LANES = tr.createNewVocabulary('REQUIRED_LANES') -vocabulary_REQUIRED_LANES.setDescription('Amount of lanes needed for this probe') -vocabulary_REQUIRED_LANES.setUrlTemplate(None) -vocabulary_REQUIRED_LANES.setManagedInternally(False) -vocabulary_REQUIRED_LANES.setInternalNamespace(False) -vocabulary_REQUIRED_LANES.setChosenFromList(True) - -vocabulary_term_REQUIRED_LANES_7 = tr.createNewVocabularyTerm('7') -vocabulary_term_REQUIRED_LANES_7.setDescription(None) -vocabulary_term_REQUIRED_LANES_7.setLabel(None) -vocabulary_term_REQUIRED_LANES_7.setOrdinal(8) -vocabulary_REQUIRED_LANES.addTerm(vocabulary_term_REQUIRED_LANES_7) - -vocabulary_term_REQUIRED_LANES_13 = tr.createNewVocabularyTerm('13') -vocabulary_term_REQUIRED_LANES_13.setDescription(None) -vocabulary_term_REQUIRED_LANES_13.setLabel(None) -vocabulary_term_REQUIRED_LANES_13.setOrdinal(15) -vocabulary_REQUIRED_LANES.addTerm(vocabulary_term_REQUIRED_LANES_13) - -vocabulary_term_REQUIRED_LANES_8 = tr.createNewVocabularyTerm('8') -vocabulary_term_REQUIRED_LANES_8.setDescription(None) -vocabulary_term_REQUIRED_LANES_8.setLabel(None) -vocabulary_term_REQUIRED_LANES_8.setOrdinal(10) -vocabulary_REQUIRED_LANES.addTerm(vocabulary_term_REQUIRED_LANES_8) - -vocabulary_term_REQUIRED_LANES_14 = tr.createNewVocabularyTerm('14') -vocabulary_term_REQUIRED_LANES_14.setDescription(None) -vocabulary_term_REQUIRED_LANES_14.setLabel(None) -vocabulary_term_REQUIRED_LANES_14.setOrdinal(16) -vocabulary_REQUIRED_LANES.addTerm(vocabulary_term_REQUIRED_LANES_14) - -vocabulary_term_REQUIRED_LANES_3 = tr.createNewVocabularyTerm('3') -vocabulary_term_REQUIRED_LANES_3.setDescription(None) -vocabulary_term_REQUIRED_LANES_3.setLabel(None) -vocabulary_term_REQUIRED_LANES_3.setOrdinal(4) -vocabulary_REQUIRED_LANES.addTerm(vocabulary_term_REQUIRED_LANES_3) - -vocabulary_term_REQUIRED_LANES_4 = tr.createNewVocabularyTerm('4') -vocabulary_term_REQUIRED_LANES_4.setDescription(None) -vocabulary_term_REQUIRED_LANES_4.setLabel(None) -vocabulary_term_REQUIRED_LANES_4.setOrdinal(5) -vocabulary_REQUIRED_LANES.addTerm(vocabulary_term_REQUIRED_LANES_4) - -vocabulary_term_REQUIRED_LANES_16 = tr.createNewVocabularyTerm('16') -vocabulary_term_REQUIRED_LANES_16.setDescription(None) -vocabulary_term_REQUIRED_LANES_16.setLabel(None) -vocabulary_term_REQUIRED_LANES_16.setOrdinal(18) -vocabulary_REQUIRED_LANES.addTerm(vocabulary_term_REQUIRED_LANES_16) - -vocabulary_term_REQUIRED_LANES_5 = tr.createNewVocabularyTerm('5') -vocabulary_term_REQUIRED_LANES_5.setDescription(None) -vocabulary_term_REQUIRED_LANES_5.setLabel(None) -vocabulary_term_REQUIRED_LANES_5.setOrdinal(6) -vocabulary_REQUIRED_LANES.addTerm(vocabulary_term_REQUIRED_LANES_5) - -vocabulary_term_REQUIRED_LANES_2 = tr.createNewVocabularyTerm('2') -vocabulary_term_REQUIRED_LANES_2.setDescription(None) -vocabulary_term_REQUIRED_LANES_2.setLabel(None) -vocabulary_term_REQUIRED_LANES_2.setOrdinal(3) -vocabulary_REQUIRED_LANES.addTerm(vocabulary_term_REQUIRED_LANES_2) - -vocabulary_term_REQUIRED_LANES_15 = tr.createNewVocabularyTerm('15') -vocabulary_term_REQUIRED_LANES_15.setDescription(None) -vocabulary_term_REQUIRED_LANES_15.setLabel(None) -vocabulary_term_REQUIRED_LANES_15.setOrdinal(17) -vocabulary_REQUIRED_LANES.addTerm(vocabulary_term_REQUIRED_LANES_15) - -vocabulary_term_REQUIRED_LANES_6 = tr.createNewVocabularyTerm('6') -vocabulary_term_REQUIRED_LANES_6.setDescription(None) -vocabulary_term_REQUIRED_LANES_6.setLabel(None) -vocabulary_term_REQUIRED_LANES_6.setOrdinal(7) -vocabulary_REQUIRED_LANES.addTerm(vocabulary_term_REQUIRED_LANES_6) - -vocabulary_term_REQUIRED_LANES_1 = tr.createNewVocabularyTerm('1') -vocabulary_term_REQUIRED_LANES_1.setDescription(None) -vocabulary_term_REQUIRED_LANES_1.setLabel(None) -vocabulary_term_REQUIRED_LANES_1.setOrdinal(2) -vocabulary_REQUIRED_LANES.addTerm(vocabulary_term_REQUIRED_LANES_1) - -vocabulary_term_REQUIRED_LANES_11 = tr.createNewVocabularyTerm('11') -vocabulary_term_REQUIRED_LANES_11.setDescription(None) -vocabulary_term_REQUIRED_LANES_11.setLabel(None) -vocabulary_term_REQUIRED_LANES_11.setOrdinal(13) -vocabulary_REQUIRED_LANES.addTerm(vocabulary_term_REQUIRED_LANES_11) - -vocabulary_term_REQUIRED_LANES_10 = tr.createNewVocabularyTerm('10') -vocabulary_term_REQUIRED_LANES_10.setDescription(None) -vocabulary_term_REQUIRED_LANES_10.setLabel(None) -vocabulary_term_REQUIRED_LANES_10.setOrdinal(12) -vocabulary_REQUIRED_LANES.addTerm(vocabulary_term_REQUIRED_LANES_10) - -vocabulary_term_REQUIRED_LANES_12 = tr.createNewVocabularyTerm('12') -vocabulary_term_REQUIRED_LANES_12.setDescription(None) -vocabulary_term_REQUIRED_LANES_12.setLabel(None) -vocabulary_term_REQUIRED_LANES_12.setOrdinal(14) -vocabulary_REQUIRED_LANES.addTerm(vocabulary_term_REQUIRED_LANES_12) - -vocabulary_term_REQUIRED_LANES_9 = tr.createNewVocabularyTerm('9') -vocabulary_term_REQUIRED_LANES_9.setDescription(None) -vocabulary_term_REQUIRED_LANES_9.setLabel(None) -vocabulary_term_REQUIRED_LANES_9.setOrdinal(11) -vocabulary_REQUIRED_LANES.addTerm(vocabulary_term_REQUIRED_LANES_9) - -vocabulary_SAMPLE_LIBRARY_SELECTION = tr.createNewVocabulary('SAMPLE_LIBRARY_SELECTION') -vocabulary_SAMPLE_LIBRARY_SELECTION.setDescription('Describes whether any method was used to select and/or enrich the material being sequenced.') -vocabulary_SAMPLE_LIBRARY_SELECTION.setUrlTemplate(None) -vocabulary_SAMPLE_LIBRARY_SELECTION.setManagedInternally(False) -vocabulary_SAMPLE_LIBRARY_SELECTION.setInternalNamespace(False) -vocabulary_SAMPLE_LIBRARY_SELECTION.setChosenFromList(True) - -vocabulary_term_SAMPLE_LIBRARY_SELECTION_RANDOM_PCR = tr.createNewVocabularyTerm('RANDOM_PCR') -vocabulary_term_SAMPLE_LIBRARY_SELECTION_RANDOM_PCR.setDescription('Source material was selected by randomly generated primers') -vocabulary_term_SAMPLE_LIBRARY_SELECTION_RANDOM_PCR.setLabel('RANDOM PCR') -vocabulary_term_SAMPLE_LIBRARY_SELECTION_RANDOM_PCR.setOrdinal(11) -vocabulary_SAMPLE_LIBRARY_SELECTION.addTerm(vocabulary_term_SAMPLE_LIBRARY_SELECTION_RANDOM_PCR) - -vocabulary_term_SAMPLE_LIBRARY_SELECTION_RESTRICTION_DIGEST = tr.createNewVocabularyTerm('RESTRICTION_DIGEST') -vocabulary_term_SAMPLE_LIBRARY_SELECTION_RESTRICTION_DIGEST.setDescription('Restriction enzyme digestion') -vocabulary_term_SAMPLE_LIBRARY_SELECTION_RESTRICTION_DIGEST.setLabel('Restriction Digest') -vocabulary_term_SAMPLE_LIBRARY_SELECTION_RESTRICTION_DIGEST.setOrdinal(3) -vocabulary_SAMPLE_LIBRARY_SELECTION.addTerm(vocabulary_term_SAMPLE_LIBRARY_SELECTION_RESTRICTION_DIGEST) - -vocabulary_term_SAMPLE_LIBRARY_SELECTION_CHIP = tr.createNewVocabularyTerm('CHIP') -vocabulary_term_SAMPLE_LIBRARY_SELECTION_CHIP.setDescription('Chromatin immunoprecipitation') -vocabulary_term_SAMPLE_LIBRARY_SELECTION_CHIP.setLabel('ChIP') -vocabulary_term_SAMPLE_LIBRARY_SELECTION_CHIP.setOrdinal(1) -vocabulary_SAMPLE_LIBRARY_SELECTION.addTerm(vocabulary_term_SAMPLE_LIBRARY_SELECTION_CHIP) - -vocabulary_term_SAMPLE_LIBRARY_SELECTION_CFS = tr.createNewVocabularyTerm('CF-S') -vocabulary_term_SAMPLE_LIBRARY_SELECTION_CFS.setDescription('Cot-filtered single/low-copy genomic DNA') -vocabulary_term_SAMPLE_LIBRARY_SELECTION_CFS.setLabel('CF-S') -vocabulary_term_SAMPLE_LIBRARY_SELECTION_CFS.setOrdinal(13) -vocabulary_SAMPLE_LIBRARY_SELECTION.addTerm(vocabulary_term_SAMPLE_LIBRARY_SELECTION_CFS) - -vocabulary_term_SAMPLE_LIBRARY_SELECTION_UNSPECIFIED = tr.createNewVocabularyTerm('UNSPECIFIED') -vocabulary_term_SAMPLE_LIBRARY_SELECTION_UNSPECIFIED.setDescription(None) -vocabulary_term_SAMPLE_LIBRARY_SELECTION_UNSPECIFIED.setLabel('unspecified') -vocabulary_term_SAMPLE_LIBRARY_SELECTION_UNSPECIFIED.setOrdinal(18) -vocabulary_SAMPLE_LIBRARY_SELECTION.addTerm(vocabulary_term_SAMPLE_LIBRARY_SELECTION_UNSPECIFIED) - -vocabulary_term_SAMPLE_LIBRARY_SELECTION_CFH = tr.createNewVocabularyTerm('CF-H') -vocabulary_term_SAMPLE_LIBRARY_SELECTION_CFH.setDescription('Cot-filtered highly repetitive genomic DNA') -vocabulary_term_SAMPLE_LIBRARY_SELECTION_CFH.setLabel('CF-H') -vocabulary_term_SAMPLE_LIBRARY_SELECTION_CFH.setOrdinal(15) -vocabulary_SAMPLE_LIBRARY_SELECTION.addTerm(vocabulary_term_SAMPLE_LIBRARY_SELECTION_CFH) - -vocabulary_term_SAMPLE_LIBRARY_SELECTION_RANDOM = tr.createNewVocabularyTerm('RANDOM') -vocabulary_term_SAMPLE_LIBRARY_SELECTION_RANDOM.setDescription('Random shearing only') -vocabulary_term_SAMPLE_LIBRARY_SELECTION_RANDOM.setLabel('RANDOM') -vocabulary_term_SAMPLE_LIBRARY_SELECTION_RANDOM.setOrdinal(5) -vocabulary_SAMPLE_LIBRARY_SELECTION.addTerm(vocabulary_term_SAMPLE_LIBRARY_SELECTION_RANDOM) - -vocabulary_term_SAMPLE_LIBRARY_SELECTION_HMPR = tr.createNewVocabularyTerm('HMPR') -vocabulary_term_SAMPLE_LIBRARY_SELECTION_HMPR.setDescription('Hypo-methylated partial restriction digest') -vocabulary_term_SAMPLE_LIBRARY_SELECTION_HMPR.setLabel('HMPR') -vocabulary_term_SAMPLE_LIBRARY_SELECTION_HMPR.setOrdinal(8) -vocabulary_SAMPLE_LIBRARY_SELECTION.addTerm(vocabulary_term_SAMPLE_LIBRARY_SELECTION_HMPR) - -vocabulary_term_SAMPLE_LIBRARY_SELECTION_MNASE = tr.createNewVocabularyTerm('MNASE') -vocabulary_term_SAMPLE_LIBRARY_SELECTION_MNASE.setDescription('Micrococcal Nuclease (MNase) digestion') -vocabulary_term_SAMPLE_LIBRARY_SELECTION_MNASE.setLabel('MNase') -vocabulary_term_SAMPLE_LIBRARY_SELECTION_MNASE.setOrdinal(2) -vocabulary_SAMPLE_LIBRARY_SELECTION.addTerm(vocabulary_term_SAMPLE_LIBRARY_SELECTION_MNASE) - -vocabulary_term_SAMPLE_LIBRARY_SELECTION_5METHYLCYTIDINE_ANTIBODY = tr.createNewVocabularyTerm('5-METHYLCYTIDINE_ANTIBODY') -vocabulary_term_SAMPLE_LIBRARY_SELECTION_5METHYLCYTIDINE_ANTIBODY.setDescription('Methylated DNA immunoprecipitation') -vocabulary_term_SAMPLE_LIBRARY_SELECTION_5METHYLCYTIDINE_ANTIBODY.setLabel('5-methylcytidine antibody') -vocabulary_term_SAMPLE_LIBRARY_SELECTION_5METHYLCYTIDINE_ANTIBODY.setOrdinal(4) -vocabulary_SAMPLE_LIBRARY_SELECTION.addTerm(vocabulary_term_SAMPLE_LIBRARY_SELECTION_5METHYLCYTIDINE_ANTIBODY) - -vocabulary_term_SAMPLE_LIBRARY_SELECTION_RTPCR = tr.createNewVocabularyTerm('RT-PCR') -vocabulary_term_SAMPLE_LIBRARY_SELECTION_RTPCR.setDescription('Source material was selected by reverse transcription PCR') -vocabulary_term_SAMPLE_LIBRARY_SELECTION_RTPCR.setLabel('RT-PCR') -vocabulary_term_SAMPLE_LIBRARY_SELECTION_RTPCR.setOrdinal(12) -vocabulary_SAMPLE_LIBRARY_SELECTION.addTerm(vocabulary_term_SAMPLE_LIBRARY_SELECTION_RTPCR) - -vocabulary_term_SAMPLE_LIBRARY_SELECTION_CFM = tr.createNewVocabularyTerm('CF-M') -vocabulary_term_SAMPLE_LIBRARY_SELECTION_CFM.setDescription('Cot-filtered moderately repetitive genomic DNA') -vocabulary_term_SAMPLE_LIBRARY_SELECTION_CFM.setLabel('CF-M') -vocabulary_term_SAMPLE_LIBRARY_SELECTION_CFM.setOrdinal(14) -vocabulary_SAMPLE_LIBRARY_SELECTION.addTerm(vocabulary_term_SAMPLE_LIBRARY_SELECTION_CFM) - -vocabulary_term_SAMPLE_LIBRARY_SELECTION_CDNA = tr.createNewVocabularyTerm('CDNA') -vocabulary_term_SAMPLE_LIBRARY_SELECTION_CDNA.setDescription('complementary DNA') -vocabulary_term_SAMPLE_LIBRARY_SELECTION_CDNA.setLabel('cDNA') -vocabulary_term_SAMPLE_LIBRARY_SELECTION_CDNA.setOrdinal(9) -vocabulary_SAMPLE_LIBRARY_SELECTION.addTerm(vocabulary_term_SAMPLE_LIBRARY_SELECTION_CDNA) - -vocabulary_term_SAMPLE_LIBRARY_SELECTION_MF = tr.createNewVocabularyTerm('MF') -vocabulary_term_SAMPLE_LIBRARY_SELECTION_MF.setDescription('Methyl Filtrated') -vocabulary_term_SAMPLE_LIBRARY_SELECTION_MF.setLabel('MF') -vocabulary_term_SAMPLE_LIBRARY_SELECTION_MF.setOrdinal(6) -vocabulary_SAMPLE_LIBRARY_SELECTION.addTerm(vocabulary_term_SAMPLE_LIBRARY_SELECTION_MF) - -vocabulary_term_SAMPLE_LIBRARY_SELECTION_OTHER = tr.createNewVocabularyTerm('OTHER') -vocabulary_term_SAMPLE_LIBRARY_SELECTION_OTHER.setDescription(None) -vocabulary_term_SAMPLE_LIBRARY_SELECTION_OTHER.setLabel('other') -vocabulary_term_SAMPLE_LIBRARY_SELECTION_OTHER.setOrdinal(17) -vocabulary_SAMPLE_LIBRARY_SELECTION.addTerm(vocabulary_term_SAMPLE_LIBRARY_SELECTION_OTHER) - -vocabulary_term_SAMPLE_LIBRARY_SELECTION_PCR = tr.createNewVocabularyTerm('PCR') -vocabulary_term_SAMPLE_LIBRARY_SELECTION_PCR.setDescription('Source material was selected by designed primers') -vocabulary_term_SAMPLE_LIBRARY_SELECTION_PCR.setLabel('PCR') -vocabulary_term_SAMPLE_LIBRARY_SELECTION_PCR.setOrdinal(10) -vocabulary_SAMPLE_LIBRARY_SELECTION.addTerm(vocabulary_term_SAMPLE_LIBRARY_SELECTION_PCR) - -vocabulary_term_SAMPLE_LIBRARY_SELECTION_MSLL = tr.createNewVocabularyTerm('MSLL') -vocabulary_term_SAMPLE_LIBRARY_SELECTION_MSLL.setDescription('Methylation Spanning Linking Library') -vocabulary_term_SAMPLE_LIBRARY_SELECTION_MSLL.setLabel('MSLL') -vocabulary_term_SAMPLE_LIBRARY_SELECTION_MSLL.setOrdinal(7) -vocabulary_SAMPLE_LIBRARY_SELECTION.addTerm(vocabulary_term_SAMPLE_LIBRARY_SELECTION_MSLL) - -vocabulary_term_SAMPLE_LIBRARY_SELECTION_CFT = tr.createNewVocabularyTerm('CF-T') -vocabulary_term_SAMPLE_LIBRARY_SELECTION_CFT.setDescription('Cot-filtered theoretical single-copy genomic DNA') -vocabulary_term_SAMPLE_LIBRARY_SELECTION_CFT.setLabel('CF-T') -vocabulary_term_SAMPLE_LIBRARY_SELECTION_CFT.setOrdinal(16) -vocabulary_SAMPLE_LIBRARY_SELECTION.addTerm(vocabulary_term_SAMPLE_LIBRARY_SELECTION_CFT) - -vocabulary_SAMPLE_LIBRARY_SOURCE_VOC = tr.createNewVocabulary('SAMPLE_LIBRARY_SOURCE_VOC') -vocabulary_SAMPLE_LIBRARY_SOURCE_VOC.setDescription(None) -vocabulary_SAMPLE_LIBRARY_SOURCE_VOC.setUrlTemplate(None) -vocabulary_SAMPLE_LIBRARY_SOURCE_VOC.setManagedInternally(False) -vocabulary_SAMPLE_LIBRARY_SOURCE_VOC.setInternalNamespace(False) -vocabulary_SAMPLE_LIBRARY_SOURCE_VOC.setChosenFromList(True) - -vocabulary_term_SAMPLE_LIBRARY_SOURCE_VOC_OTHER = tr.createNewVocabularyTerm('OTHER') -vocabulary_term_SAMPLE_LIBRARY_SOURCE_VOC_OTHER.setDescription(None) -vocabulary_term_SAMPLE_LIBRARY_SOURCE_VOC_OTHER.setLabel(None) -vocabulary_term_SAMPLE_LIBRARY_SOURCE_VOC_OTHER.setOrdinal(6) -vocabulary_SAMPLE_LIBRARY_SOURCE_VOC.addTerm(vocabulary_term_SAMPLE_LIBRARY_SOURCE_VOC_OTHER) - -vocabulary_term_SAMPLE_LIBRARY_SOURCE_VOC_NONGENOMIC = tr.createNewVocabularyTerm('NON-GENOMIC') -vocabulary_term_SAMPLE_LIBRARY_SOURCE_VOC_NONGENOMIC.setDescription(None) -vocabulary_term_SAMPLE_LIBRARY_SOURCE_VOC_NONGENOMIC.setLabel(None) -vocabulary_term_SAMPLE_LIBRARY_SOURCE_VOC_NONGENOMIC.setOrdinal(2) -vocabulary_SAMPLE_LIBRARY_SOURCE_VOC.addTerm(vocabulary_term_SAMPLE_LIBRARY_SOURCE_VOC_NONGENOMIC) - -vocabulary_term_SAMPLE_LIBRARY_SOURCE_VOC_GENOMIC = tr.createNewVocabularyTerm('GENOMIC') -vocabulary_term_SAMPLE_LIBRARY_SOURCE_VOC_GENOMIC.setDescription(None) -vocabulary_term_SAMPLE_LIBRARY_SOURCE_VOC_GENOMIC.setLabel(None) -vocabulary_term_SAMPLE_LIBRARY_SOURCE_VOC_GENOMIC.setOrdinal(1) -vocabulary_SAMPLE_LIBRARY_SOURCE_VOC.addTerm(vocabulary_term_SAMPLE_LIBRARY_SOURCE_VOC_GENOMIC) - -vocabulary_term_SAMPLE_LIBRARY_SOURCE_VOC_VIRAL = tr.createNewVocabularyTerm('VIRAL') -vocabulary_term_SAMPLE_LIBRARY_SOURCE_VOC_VIRAL.setDescription(None) -vocabulary_term_SAMPLE_LIBRARY_SOURCE_VOC_VIRAL.setLabel(None) -vocabulary_term_SAMPLE_LIBRARY_SOURCE_VOC_VIRAL.setOrdinal(4) -vocabulary_SAMPLE_LIBRARY_SOURCE_VOC.addTerm(vocabulary_term_SAMPLE_LIBRARY_SOURCE_VOC_VIRAL) - -vocabulary_term_SAMPLE_LIBRARY_SOURCE_VOC_SYNTHETIC = tr.createNewVocabularyTerm('SYNTHETIC') -vocabulary_term_SAMPLE_LIBRARY_SOURCE_VOC_SYNTHETIC.setDescription(None) -vocabulary_term_SAMPLE_LIBRARY_SOURCE_VOC_SYNTHETIC.setLabel(None) -vocabulary_term_SAMPLE_LIBRARY_SOURCE_VOC_SYNTHETIC.setOrdinal(3) -vocabulary_SAMPLE_LIBRARY_SOURCE_VOC.addTerm(vocabulary_term_SAMPLE_LIBRARY_SOURCE_VOC_SYNTHETIC) - -vocabulary_term_SAMPLE_LIBRARY_SOURCE_VOC_RNA = tr.createNewVocabularyTerm('RNA') -vocabulary_term_SAMPLE_LIBRARY_SOURCE_VOC_RNA.setDescription(None) -vocabulary_term_SAMPLE_LIBRARY_SOURCE_VOC_RNA.setLabel(None) -vocabulary_term_SAMPLE_LIBRARY_SOURCE_VOC_RNA.setOrdinal(5) -vocabulary_SAMPLE_LIBRARY_SOURCE_VOC.addTerm(vocabulary_term_SAMPLE_LIBRARY_SOURCE_VOC_RNA) - -vocabulary_SAMPLE_LIBRARY_STRATEGY = tr.createNewVocabulary('SAMPLE_LIBRARY_STRATEGY') -vocabulary_SAMPLE_LIBRARY_STRATEGY.setDescription('Sequencing technique for this library.') -vocabulary_SAMPLE_LIBRARY_STRATEGY.setUrlTemplate(None) -vocabulary_SAMPLE_LIBRARY_STRATEGY.setManagedInternally(False) -vocabulary_SAMPLE_LIBRARY_STRATEGY.setInternalNamespace(False) -vocabulary_SAMPLE_LIBRARY_STRATEGY.setChosenFromList(True) - -vocabulary_term_SAMPLE_LIBRARY_STRATEGY_AMPLICON = tr.createNewVocabularyTerm('AMPLICON') -vocabulary_term_SAMPLE_LIBRARY_STRATEGY_AMPLICON.setDescription('Sequencing of overlapping or distinct PCR or RT-PCR products') -vocabulary_term_SAMPLE_LIBRARY_STRATEGY_AMPLICON.setLabel('AMPLICON') -vocabulary_term_SAMPLE_LIBRARY_STRATEGY_AMPLICON.setOrdinal(15) -vocabulary_SAMPLE_LIBRARY_STRATEGY.addTerm(vocabulary_term_SAMPLE_LIBRARY_STRATEGY_AMPLICON) - -vocabulary_term_SAMPLE_LIBRARY_STRATEGY_CHIPSEQ = tr.createNewVocabularyTerm('CHIP-SEQ') -vocabulary_term_SAMPLE_LIBRARY_STRATEGY_CHIPSEQ.setDescription('Direct sequencing of chromatin immunoprecipitates') -vocabulary_term_SAMPLE_LIBRARY_STRATEGY_CHIPSEQ.setLabel('ChIP-Seq') -vocabulary_term_SAMPLE_LIBRARY_STRATEGY_CHIPSEQ.setOrdinal(1) -vocabulary_SAMPLE_LIBRARY_STRATEGY.addTerm(vocabulary_term_SAMPLE_LIBRARY_STRATEGY_CHIPSEQ) - -vocabulary_term_SAMPLE_LIBRARY_STRATEGY_RNASEQ = tr.createNewVocabularyTerm('RNA-SEQ') -vocabulary_term_SAMPLE_LIBRARY_STRATEGY_RNASEQ.setDescription('RNA sequencing') -vocabulary_term_SAMPLE_LIBRARY_STRATEGY_RNASEQ.setLabel('RNA-Seq') -vocabulary_term_SAMPLE_LIBRARY_STRATEGY_RNASEQ.setOrdinal(2) -vocabulary_SAMPLE_LIBRARY_STRATEGY.addTerm(vocabulary_term_SAMPLE_LIBRARY_STRATEGY_RNASEQ) - -vocabulary_term_SAMPLE_LIBRARY_STRATEGY_OTHER = tr.createNewVocabularyTerm('OTHER') -vocabulary_term_SAMPLE_LIBRARY_STRATEGY_OTHER.setDescription('Library strategy not listed') -vocabulary_term_SAMPLE_LIBRARY_STRATEGY_OTHER.setLabel('OTHER') -vocabulary_term_SAMPLE_LIBRARY_STRATEGY_OTHER.setOrdinal(17) -vocabulary_SAMPLE_LIBRARY_STRATEGY.addTerm(vocabulary_term_SAMPLE_LIBRARY_STRATEGY_OTHER) - -vocabulary_term_SAMPLE_LIBRARY_STRATEGY_CTS = tr.createNewVocabularyTerm('CTS') -vocabulary_term_SAMPLE_LIBRARY_STRATEGY_CTS.setDescription('Concatenated Tag Sequencing') -vocabulary_term_SAMPLE_LIBRARY_STRATEGY_CTS.setLabel('CTS') -vocabulary_term_SAMPLE_LIBRARY_STRATEGY_CTS.setOrdinal(8) -vocabulary_SAMPLE_LIBRARY_STRATEGY.addTerm(vocabulary_term_SAMPLE_LIBRARY_STRATEGY_CTS) - -vocabulary_term_SAMPLE_LIBRARY_STRATEGY_MNASESEQ = tr.createNewVocabularyTerm('MNASE-SEQ') -vocabulary_term_SAMPLE_LIBRARY_STRATEGY_MNASESEQ.setDescription('Direct sequencing following MNase digestion') -vocabulary_term_SAMPLE_LIBRARY_STRATEGY_MNASESEQ.setLabel('MNase-Seq') -vocabulary_term_SAMPLE_LIBRARY_STRATEGY_MNASESEQ.setOrdinal(4) -vocabulary_SAMPLE_LIBRARY_STRATEGY.addTerm(vocabulary_term_SAMPLE_LIBRARY_STRATEGY_MNASESEQ) - -vocabulary_term_SAMPLE_LIBRARY_STRATEGY_EST = tr.createNewVocabularyTerm('EST') -vocabulary_term_SAMPLE_LIBRARY_STRATEGY_EST.setDescription('Single pass sequencing of cDNA templates') -vocabulary_term_SAMPLE_LIBRARY_STRATEGY_EST.setLabel('EST') -vocabulary_term_SAMPLE_LIBRARY_STRATEGY_EST.setOrdinal(6) -vocabulary_SAMPLE_LIBRARY_STRATEGY.addTerm(vocabulary_term_SAMPLE_LIBRARY_STRATEGY_EST) - -vocabulary_term_SAMPLE_LIBRARY_STRATEGY_FLCDNA = tr.createNewVocabularyTerm('FL-CDNA') -vocabulary_term_SAMPLE_LIBRARY_STRATEGY_FLCDNA.setDescription('Full-length sequencing of cDNA templates') -vocabulary_term_SAMPLE_LIBRARY_STRATEGY_FLCDNA.setLabel('FL-cDNA') -vocabulary_term_SAMPLE_LIBRARY_STRATEGY_FLCDNA.setOrdinal(7) -vocabulary_SAMPLE_LIBRARY_STRATEGY.addTerm(vocabulary_term_SAMPLE_LIBRARY_STRATEGY_FLCDNA) - -vocabulary_term_SAMPLE_LIBRARY_STRATEGY_CLONEEND = tr.createNewVocabularyTerm('CLONEEND') -vocabulary_term_SAMPLE_LIBRARY_STRATEGY_CLONEEND.setDescription("Clone end (5', 3', or both) sequencing") -vocabulary_term_SAMPLE_LIBRARY_STRATEGY_CLONEEND.setLabel('CLONEEND') -vocabulary_term_SAMPLE_LIBRARY_STRATEGY_CLONEEND.setOrdinal(10) -vocabulary_SAMPLE_LIBRARY_STRATEGY.addTerm(vocabulary_term_SAMPLE_LIBRARY_STRATEGY_CLONEEND) - -vocabulary_term_SAMPLE_LIBRARY_STRATEGY_MEDIPSEQ = tr.createNewVocabularyTerm('MEDIP-SEQ') -vocabulary_term_SAMPLE_LIBRARY_STRATEGY_MEDIPSEQ.setDescription('Methylated DNA immunoprecipitation sequencing') -vocabulary_term_SAMPLE_LIBRARY_STRATEGY_MEDIPSEQ.setLabel('MeDIP-Seq') -vocabulary_term_SAMPLE_LIBRARY_STRATEGY_MEDIPSEQ.setOrdinal(3) -vocabulary_SAMPLE_LIBRARY_STRATEGY.addTerm(vocabulary_term_SAMPLE_LIBRARY_STRATEGY_MEDIPSEQ) - -vocabulary_term_SAMPLE_LIBRARY_STRATEGY_BARCODE = tr.createNewVocabularyTerm('BARCODE') -vocabulary_term_SAMPLE_LIBRARY_STRATEGY_BARCODE.setDescription('Sequencing of products that have been tagged with a short identifying sequence (barcode)') -vocabulary_term_SAMPLE_LIBRARY_STRATEGY_BARCODE.setLabel('BARCODE') -vocabulary_term_SAMPLE_LIBRARY_STRATEGY_BARCODE.setOrdinal(9) -vocabulary_SAMPLE_LIBRARY_STRATEGY.addTerm(vocabulary_term_SAMPLE_LIBRARY_STRATEGY_BARCODE) - -vocabulary_term_SAMPLE_LIBRARY_STRATEGY_MRESEQ = tr.createNewVocabularyTerm('MRE-SEQ') -vocabulary_term_SAMPLE_LIBRARY_STRATEGY_MRESEQ.setDescription('Methylation-sensitive restriction enzyme sequencing') -vocabulary_term_SAMPLE_LIBRARY_STRATEGY_MRESEQ.setLabel('MRE-Seq') -vocabulary_term_SAMPLE_LIBRARY_STRATEGY_MRESEQ.setOrdinal(5) -vocabulary_SAMPLE_LIBRARY_STRATEGY.addTerm(vocabulary_term_SAMPLE_LIBRARY_STRATEGY_MRESEQ) - -vocabulary_term_SAMPLE_LIBRARY_STRATEGY_FINISHING = tr.createNewVocabularyTerm('FINISHING') -vocabulary_term_SAMPLE_LIBRARY_STRATEGY_FINISHING.setDescription('Sequencing intended to finish (close) gaps in existing coverage') -vocabulary_term_SAMPLE_LIBRARY_STRATEGY_FINISHING.setLabel('FINISHING') -vocabulary_term_SAMPLE_LIBRARY_STRATEGY_FINISHING.setOrdinal(16) -vocabulary_SAMPLE_LIBRARY_STRATEGY.addTerm(vocabulary_term_SAMPLE_LIBRARY_STRATEGY_FINISHING) - -vocabulary_term_SAMPLE_LIBRARY_STRATEGY_WCS = tr.createNewVocabularyTerm('WCS') -vocabulary_term_SAMPLE_LIBRARY_STRATEGY_WCS.setDescription('Whole chromosome (or other replicon) shotgun') -vocabulary_term_SAMPLE_LIBRARY_STRATEGY_WCS.setLabel('WCS') -vocabulary_term_SAMPLE_LIBRARY_STRATEGY_WCS.setOrdinal(12) -vocabulary_SAMPLE_LIBRARY_STRATEGY.addTerm(vocabulary_term_SAMPLE_LIBRARY_STRATEGY_WCS) - -vocabulary_term_SAMPLE_LIBRARY_STRATEGY_POOLCLONE = tr.createNewVocabularyTerm('POOLCLONE') -vocabulary_term_SAMPLE_LIBRARY_STRATEGY_POOLCLONE.setDescription('Shotgun of pooled clones (usually BACs and Fosmids)') -vocabulary_term_SAMPLE_LIBRARY_STRATEGY_POOLCLONE.setLabel('POOLCLONE') -vocabulary_term_SAMPLE_LIBRARY_STRATEGY_POOLCLONE.setOrdinal(14) -vocabulary_SAMPLE_LIBRARY_STRATEGY.addTerm(vocabulary_term_SAMPLE_LIBRARY_STRATEGY_POOLCLONE) - -vocabulary_term_SAMPLE_LIBRARY_STRATEGY_CLONE = tr.createNewVocabularyTerm('CLONE') -vocabulary_term_SAMPLE_LIBRARY_STRATEGY_CLONE.setDescription('Genomic clone based (hierarchical) sequencing') -vocabulary_term_SAMPLE_LIBRARY_STRATEGY_CLONE.setLabel('CLONE') -vocabulary_term_SAMPLE_LIBRARY_STRATEGY_CLONE.setOrdinal(13) -vocabulary_SAMPLE_LIBRARY_STRATEGY.addTerm(vocabulary_term_SAMPLE_LIBRARY_STRATEGY_CLONE) - -vocabulary_term_SAMPLE_LIBRARY_STRATEGY_WGS = tr.createNewVocabularyTerm('WGS') -vocabulary_term_SAMPLE_LIBRARY_STRATEGY_WGS.setDescription('Whole genome shotgun') -vocabulary_term_SAMPLE_LIBRARY_STRATEGY_WGS.setLabel('WGS') -vocabulary_term_SAMPLE_LIBRARY_STRATEGY_WGS.setOrdinal(11) -vocabulary_SAMPLE_LIBRARY_STRATEGY.addTerm(vocabulary_term_SAMPLE_LIBRARY_STRATEGY_WGS) - -vocabulary_SAMPLE_MOLECULE = tr.createNewVocabulary('SAMPLE_MOLECULE') -vocabulary_SAMPLE_MOLECULE.setDescription(None) -vocabulary_SAMPLE_MOLECULE.setUrlTemplate(None) -vocabulary_SAMPLE_MOLECULE.setManagedInternally(False) -vocabulary_SAMPLE_MOLECULE.setInternalNamespace(False) -vocabulary_SAMPLE_MOLECULE.setChosenFromList(True) - -vocabulary_term_SAMPLE_MOLECULE_PROTEIN = tr.createNewVocabularyTerm('PROTEIN') -vocabulary_term_SAMPLE_MOLECULE_PROTEIN.setDescription(None) -vocabulary_term_SAMPLE_MOLECULE_PROTEIN.setLabel(None) -vocabulary_term_SAMPLE_MOLECULE_PROTEIN.setOrdinal(6) -vocabulary_SAMPLE_MOLECULE.addTerm(vocabulary_term_SAMPLE_MOLECULE_PROTEIN) - -vocabulary_term_SAMPLE_MOLECULE_TOTAL_RNA = tr.createNewVocabularyTerm('TOTAL_RNA') -vocabulary_term_SAMPLE_MOLECULE_TOTAL_RNA.setDescription(None) -vocabulary_term_SAMPLE_MOLECULE_TOTAL_RNA.setLabel(None) -vocabulary_term_SAMPLE_MOLECULE_TOTAL_RNA.setOrdinal(1) -vocabulary_SAMPLE_MOLECULE.addTerm(vocabulary_term_SAMPLE_MOLECULE_TOTAL_RNA) - -vocabulary_term_SAMPLE_MOLECULE_CYTOPLASMIC_RNA = tr.createNewVocabularyTerm('CYTOPLASMIC_RNA') -vocabulary_term_SAMPLE_MOLECULE_CYTOPLASMIC_RNA.setDescription(None) -vocabulary_term_SAMPLE_MOLECULE_CYTOPLASMIC_RNA.setLabel(None) -vocabulary_term_SAMPLE_MOLECULE_CYTOPLASMIC_RNA.setOrdinal(3) -vocabulary_SAMPLE_MOLECULE.addTerm(vocabulary_term_SAMPLE_MOLECULE_CYTOPLASMIC_RNA) - -vocabulary_term_SAMPLE_MOLECULE_NUCLEAR_RNA = tr.createNewVocabularyTerm('NUCLEAR_RNA') -vocabulary_term_SAMPLE_MOLECULE_NUCLEAR_RNA.setDescription(None) -vocabulary_term_SAMPLE_MOLECULE_NUCLEAR_RNA.setLabel(None) -vocabulary_term_SAMPLE_MOLECULE_NUCLEAR_RNA.setOrdinal(4) -vocabulary_SAMPLE_MOLECULE.addTerm(vocabulary_term_SAMPLE_MOLECULE_NUCLEAR_RNA) - -vocabulary_term_SAMPLE_MOLECULE_GENOMIC_DNA = tr.createNewVocabularyTerm('GENOMIC_DNA') -vocabulary_term_SAMPLE_MOLECULE_GENOMIC_DNA.setDescription(None) -vocabulary_term_SAMPLE_MOLECULE_GENOMIC_DNA.setLabel(None) -vocabulary_term_SAMPLE_MOLECULE_GENOMIC_DNA.setOrdinal(5) -vocabulary_SAMPLE_MOLECULE.addTerm(vocabulary_term_SAMPLE_MOLECULE_GENOMIC_DNA) - -vocabulary_term_SAMPLE_MOLECULE_POLYA_RNA = tr.createNewVocabularyTerm('POLYA_RNA') -vocabulary_term_SAMPLE_MOLECULE_POLYA_RNA.setDescription(None) -vocabulary_term_SAMPLE_MOLECULE_POLYA_RNA.setLabel(None) -vocabulary_term_SAMPLE_MOLECULE_POLYA_RNA.setOrdinal(2) -vocabulary_SAMPLE_MOLECULE.addTerm(vocabulary_term_SAMPLE_MOLECULE_POLYA_RNA) - -vocabulary_term_SAMPLE_MOLECULE_OTHER = tr.createNewVocabularyTerm('OTHER') -vocabulary_term_SAMPLE_MOLECULE_OTHER.setDescription(None) -vocabulary_term_SAMPLE_MOLECULE_OTHER.setLabel(None) -vocabulary_term_SAMPLE_MOLECULE_OTHER.setOrdinal(18) -vocabulary_SAMPLE_MOLECULE.addTerm(vocabulary_term_SAMPLE_MOLECULE_OTHER) - -vocabulary_SAMPLE_TYPE = tr.createNewVocabulary('SAMPLE_TYPE') -vocabulary_SAMPLE_TYPE.setDescription('Type of sample delivered by the customer') -vocabulary_SAMPLE_TYPE.setUrlTemplate(None) -vocabulary_SAMPLE_TYPE.setManagedInternally(False) -vocabulary_SAMPLE_TYPE.setInternalNamespace(False) -vocabulary_SAMPLE_TYPE.setChosenFromList(True) - -vocabulary_term_SAMPLE_TYPE_MRNA = tr.createNewVocabularyTerm('MRNA') -vocabulary_term_SAMPLE_TYPE_MRNA.setDescription(None) -vocabulary_term_SAMPLE_TYPE_MRNA.setLabel(None) -vocabulary_term_SAMPLE_TYPE_MRNA.setOrdinal(8) -vocabulary_SAMPLE_TYPE.addTerm(vocabulary_term_SAMPLE_TYPE_MRNA) - -vocabulary_term_SAMPLE_TYPE_OTHER = tr.createNewVocabularyTerm('OTHER') -vocabulary_term_SAMPLE_TYPE_OTHER.setDescription(None) -vocabulary_term_SAMPLE_TYPE_OTHER.setLabel(None) -vocabulary_term_SAMPLE_TYPE_OTHER.setOrdinal(9) -vocabulary_SAMPLE_TYPE.addTerm(vocabulary_term_SAMPLE_TYPE_OTHER) - -vocabulary_term_SAMPLE_TYPE_PROCESSED_DNA_LIBRARY = tr.createNewVocabularyTerm('PROCESSED_DNA_LIBRARY') -vocabulary_term_SAMPLE_TYPE_PROCESSED_DNA_LIBRARY.setDescription(None) -vocabulary_term_SAMPLE_TYPE_PROCESSED_DNA_LIBRARY.setLabel(None) -vocabulary_term_SAMPLE_TYPE_PROCESSED_DNA_LIBRARY.setOrdinal(10) -vocabulary_SAMPLE_TYPE.addTerm(vocabulary_term_SAMPLE_TYPE_PROCESSED_DNA_LIBRARY) - -vocabulary_term_SAMPLE_TYPE_GENOMIC_DNA = tr.createNewVocabularyTerm('GENOMIC_DNA') -vocabulary_term_SAMPLE_TYPE_GENOMIC_DNA.setDescription(None) -vocabulary_term_SAMPLE_TYPE_GENOMIC_DNA.setLabel(None) -vocabulary_term_SAMPLE_TYPE_GENOMIC_DNA.setOrdinal(1) -vocabulary_SAMPLE_TYPE.addTerm(vocabulary_term_SAMPLE_TYPE_GENOMIC_DNA) - -vocabulary_term_SAMPLE_TYPE_SMALL_RNA = tr.createNewVocabularyTerm('SMALL_RNA') -vocabulary_term_SAMPLE_TYPE_SMALL_RNA.setDescription(None) -vocabulary_term_SAMPLE_TYPE_SMALL_RNA.setLabel(None) -vocabulary_term_SAMPLE_TYPE_SMALL_RNA.setOrdinal(2) -vocabulary_SAMPLE_TYPE.addTerm(vocabulary_term_SAMPLE_TYPE_SMALL_RNA) - -vocabulary_term_SAMPLE_TYPE_CHIP = tr.createNewVocabularyTerm('CHIP') -vocabulary_term_SAMPLE_TYPE_CHIP.setDescription(None) -vocabulary_term_SAMPLE_TYPE_CHIP.setLabel(None) -vocabulary_term_SAMPLE_TYPE_CHIP.setOrdinal(4) -vocabulary_SAMPLE_TYPE.addTerm(vocabulary_term_SAMPLE_TYPE_CHIP) - -vocabulary_term_SAMPLE_TYPE_SYNTHETIC = tr.createNewVocabularyTerm('SYNTHETIC') -vocabulary_term_SAMPLE_TYPE_SYNTHETIC.setDescription(None) -vocabulary_term_SAMPLE_TYPE_SYNTHETIC.setLabel(None) -vocabulary_term_SAMPLE_TYPE_SYNTHETIC.setOrdinal(6) -vocabulary_SAMPLE_TYPE.addTerm(vocabulary_term_SAMPLE_TYPE_SYNTHETIC) - -vocabulary_term_SAMPLE_TYPE_TOTAL_RNA = tr.createNewVocabularyTerm('TOTAL_RNA') -vocabulary_term_SAMPLE_TYPE_TOTAL_RNA.setDescription(None) -vocabulary_term_SAMPLE_TYPE_TOTAL_RNA.setLabel(None) -vocabulary_term_SAMPLE_TYPE_TOTAL_RNA.setOrdinal(3) -vocabulary_SAMPLE_TYPE.addTerm(vocabulary_term_SAMPLE_TYPE_TOTAL_RNA) - -vocabulary_term_SAMPLE_TYPE_FRAGMENTED_GENOMIC_DNA = tr.createNewVocabularyTerm('FRAGMENTED_GENOMIC_DNA') -vocabulary_term_SAMPLE_TYPE_FRAGMENTED_GENOMIC_DNA.setDescription(None) -vocabulary_term_SAMPLE_TYPE_FRAGMENTED_GENOMIC_DNA.setLabel(None) -vocabulary_term_SAMPLE_TYPE_FRAGMENTED_GENOMIC_DNA.setOrdinal(7) -vocabulary_SAMPLE_TYPE.addTerm(vocabulary_term_SAMPLE_TYPE_FRAGMENTED_GENOMIC_DNA) - -vocabulary_term_SAMPLE_TYPE_NONGENOMIC = tr.createNewVocabularyTerm('NON-GENOMIC') -vocabulary_term_SAMPLE_TYPE_NONGENOMIC.setDescription(None) -vocabulary_term_SAMPLE_TYPE_NONGENOMIC.setLabel(None) -vocabulary_term_SAMPLE_TYPE_NONGENOMIC.setOrdinal(12) -vocabulary_SAMPLE_TYPE.addTerm(vocabulary_term_SAMPLE_TYPE_NONGENOMIC) - -vocabulary_term_SAMPLE_TYPE_VIRAL = tr.createNewVocabularyTerm('VIRAL') -vocabulary_term_SAMPLE_TYPE_VIRAL.setDescription(None) -vocabulary_term_SAMPLE_TYPE_VIRAL.setLabel(None) -vocabulary_term_SAMPLE_TYPE_VIRAL.setOrdinal(5) -vocabulary_SAMPLE_TYPE.addTerm(vocabulary_term_SAMPLE_TYPE_VIRAL) - -vocabulary_term_SAMPLE_TYPE_BISULFITE_CHIP = tr.createNewVocabularyTerm('BISULFITE_CHIP') -vocabulary_term_SAMPLE_TYPE_BISULFITE_CHIP.setDescription(None) -vocabulary_term_SAMPLE_TYPE_BISULFITE_CHIP.setLabel(None) -vocabulary_term_SAMPLE_TYPE_BISULFITE_CHIP.setOrdinal(11) -vocabulary_SAMPLE_TYPE.addTerm(vocabulary_term_SAMPLE_TYPE_BISULFITE_CHIP) - -vocabulary_SBS_SEQUENCING_KIT_VERSION = tr.createNewVocabulary('SBS_SEQUENCING_KIT_VERSION') -vocabulary_SBS_SEQUENCING_KIT_VERSION.setDescription('Version of the Sequencing by Synthesis (SBS) Kit') -vocabulary_SBS_SEQUENCING_KIT_VERSION.setUrlTemplate(None) -vocabulary_SBS_SEQUENCING_KIT_VERSION.setManagedInternally(False) -vocabulary_SBS_SEQUENCING_KIT_VERSION.setInternalNamespace(False) -vocabulary_SBS_SEQUENCING_KIT_VERSION.setChosenFromList(True) - -vocabulary_term_SBS_SEQUENCING_KIT_VERSION_SBS_HS_V3 = tr.createNewVocabularyTerm('SBS_HS_V3') -vocabulary_term_SBS_SEQUENCING_KIT_VERSION_SBS_HS_V3.setDescription(None) -vocabulary_term_SBS_SEQUENCING_KIT_VERSION_SBS_HS_V3.setLabel('TruSeq SBS HS v3') -vocabulary_term_SBS_SEQUENCING_KIT_VERSION_SBS_HS_V3.setOrdinal(6) -vocabulary_SBS_SEQUENCING_KIT_VERSION.addTerm(vocabulary_term_SBS_SEQUENCING_KIT_VERSION_SBS_HS_V3) - -vocabulary_term_SBS_SEQUENCING_KIT_VERSION_V3 = tr.createNewVocabularyTerm('V3') -vocabulary_term_SBS_SEQUENCING_KIT_VERSION_V3.setDescription(None) -vocabulary_term_SBS_SEQUENCING_KIT_VERSION_V3.setLabel(None) -vocabulary_term_SBS_SEQUENCING_KIT_VERSION_V3.setOrdinal(5) -vocabulary_SBS_SEQUENCING_KIT_VERSION.addTerm(vocabulary_term_SBS_SEQUENCING_KIT_VERSION_V3) - -vocabulary_term_SBS_SEQUENCING_KIT_VERSION_V4 = tr.createNewVocabularyTerm('V4') -vocabulary_term_SBS_SEQUENCING_KIT_VERSION_V4.setDescription(None) -vocabulary_term_SBS_SEQUENCING_KIT_VERSION_V4.setLabel(None) -vocabulary_term_SBS_SEQUENCING_KIT_VERSION_V4.setOrdinal(4) -vocabulary_SBS_SEQUENCING_KIT_VERSION.addTerm(vocabulary_term_SBS_SEQUENCING_KIT_VERSION_V4) - -vocabulary_term_SBS_SEQUENCING_KIT_VERSION_TRUSEQ_V5 = tr.createNewVocabularyTerm('TRUSEQ_V5') -vocabulary_term_SBS_SEQUENCING_KIT_VERSION_TRUSEQ_V5.setDescription(None) -vocabulary_term_SBS_SEQUENCING_KIT_VERSION_TRUSEQ_V5.setLabel('TruSeq v5') -vocabulary_term_SBS_SEQUENCING_KIT_VERSION_TRUSEQ_V5.setOrdinal(1) -vocabulary_SBS_SEQUENCING_KIT_VERSION.addTerm(vocabulary_term_SBS_SEQUENCING_KIT_VERSION_TRUSEQ_V5) - -vocabulary_term_SBS_SEQUENCING_KIT_VERSION_V5 = tr.createNewVocabularyTerm('V5') -vocabulary_term_SBS_SEQUENCING_KIT_VERSION_V5.setDescription(None) -vocabulary_term_SBS_SEQUENCING_KIT_VERSION_V5.setLabel(None) -vocabulary_term_SBS_SEQUENCING_KIT_VERSION_V5.setOrdinal(3) -vocabulary_SBS_SEQUENCING_KIT_VERSION.addTerm(vocabulary_term_SBS_SEQUENCING_KIT_VERSION_V5) - -vocabulary_SCS_PROTOCOL_VERSION = tr.createNewVocabulary('SCS_PROTOCOL_VERSION') -vocabulary_SCS_PROTOCOL_VERSION.setDescription('THE Illumina protocol') -vocabulary_SCS_PROTOCOL_VERSION.setUrlTemplate(None) -vocabulary_SCS_PROTOCOL_VERSION.setManagedInternally(False) -vocabulary_SCS_PROTOCOL_VERSION.setInternalNamespace(False) -vocabulary_SCS_PROTOCOL_VERSION.setChosenFromList(True) - -vocabulary_term_SCS_PROTOCOL_VERSION_V7 = tr.createNewVocabularyTerm('V7') -vocabulary_term_SCS_PROTOCOL_VERSION_V7.setDescription(None) -vocabulary_term_SCS_PROTOCOL_VERSION_V7.setLabel(None) -vocabulary_term_SCS_PROTOCOL_VERSION_V7.setOrdinal(3) -vocabulary_SCS_PROTOCOL_VERSION.addTerm(vocabulary_term_SCS_PROTOCOL_VERSION_V7) - -vocabulary_term_SCS_PROTOCOL_VERSION_V8 = tr.createNewVocabularyTerm('V8') -vocabulary_term_SCS_PROTOCOL_VERSION_V8.setDescription(None) -vocabulary_term_SCS_PROTOCOL_VERSION_V8.setLabel(None) -vocabulary_term_SCS_PROTOCOL_VERSION_V8.setOrdinal(1) -vocabulary_SCS_PROTOCOL_VERSION.addTerm(vocabulary_term_SCS_PROTOCOL_VERSION_V8) - -vocabulary_term_SCS_PROTOCOL_VERSION_V6 = tr.createNewVocabularyTerm('V6') -vocabulary_term_SCS_PROTOCOL_VERSION_V6.setDescription(None) -vocabulary_term_SCS_PROTOCOL_VERSION_V6.setLabel(None) -vocabulary_term_SCS_PROTOCOL_VERSION_V6.setOrdinal(2) -vocabulary_SCS_PROTOCOL_VERSION.addTerm(vocabulary_term_SCS_PROTOCOL_VERSION_V6) - -vocabulary_SCS_SOFTWARE_VERSION = tr.createNewVocabulary('SCS_SOFTWARE_VERSION') -vocabulary_SCS_SOFTWARE_VERSION.setDescription('Software version of the Sequencing PC attached to the GA') -vocabulary_SCS_SOFTWARE_VERSION.setUrlTemplate(None) -vocabulary_SCS_SOFTWARE_VERSION.setManagedInternally(False) -vocabulary_SCS_SOFTWARE_VERSION.setInternalNamespace(False) -vocabulary_SCS_SOFTWARE_VERSION.setChosenFromList(True) - -vocabulary_term_SCS_SOFTWARE_VERSION_HCS_145 = tr.createNewVocabularyTerm('HCS_1.4.5') -vocabulary_term_SCS_SOFTWARE_VERSION_HCS_145.setDescription(None) -vocabulary_term_SCS_SOFTWARE_VERSION_HCS_145.setLabel('HCS 1.4.5/RTA 1.12.4') -vocabulary_term_SCS_SOFTWARE_VERSION_HCS_145.setOrdinal(2) -vocabulary_SCS_SOFTWARE_VERSION.addTerm(vocabulary_term_SCS_SOFTWARE_VERSION_HCS_145) - -vocabulary_term_SCS_SOFTWARE_VERSION_210 = tr.createNewVocabularyTerm('2.10') -vocabulary_term_SCS_SOFTWARE_VERSION_210.setDescription(None) -vocabulary_term_SCS_SOFTWARE_VERSION_210.setLabel('2.10/RTA 1.13.48') -vocabulary_term_SCS_SOFTWARE_VERSION_210.setOrdinal(4) -vocabulary_SCS_SOFTWARE_VERSION.addTerm(vocabulary_term_SCS_SOFTWARE_VERSION_210) - -vocabulary_term_SCS_SOFTWARE_VERSION_25 = tr.createNewVocabularyTerm('2.5') -vocabulary_term_SCS_SOFTWARE_VERSION_25.setDescription(None) -vocabulary_term_SCS_SOFTWARE_VERSION_25.setLabel('2.5 (no longer in use)') -vocabulary_term_SCS_SOFTWARE_VERSION_25.setOrdinal(8) -vocabulary_SCS_SOFTWARE_VERSION.addTerm(vocabulary_term_SCS_SOFTWARE_VERSION_25) - -vocabulary_term_SCS_SOFTWARE_VERSION_HCS_1515 = tr.createNewVocabularyTerm('HCS_1.5.15') -vocabulary_term_SCS_SOFTWARE_VERSION_HCS_1515.setDescription(None) -vocabulary_term_SCS_SOFTWARE_VERSION_HCS_1515.setLabel('HCS 1.5.15/1.13.48') -vocabulary_term_SCS_SOFTWARE_VERSION_HCS_1515.setOrdinal(1) -vocabulary_SCS_SOFTWARE_VERSION.addTerm(vocabulary_term_SCS_SOFTWARE_VERSION_HCS_1515) - -vocabulary_term_SCS_SOFTWARE_VERSION_28 = tr.createNewVocabularyTerm('2.8') -vocabulary_term_SCS_SOFTWARE_VERSION_28.setDescription(None) -vocabulary_term_SCS_SOFTWARE_VERSION_28.setLabel('2.8/RTA 1.8') -vocabulary_term_SCS_SOFTWARE_VERSION_28.setOrdinal(6) -vocabulary_SCS_SOFTWARE_VERSION.addTerm(vocabulary_term_SCS_SOFTWARE_VERSION_28) - -vocabulary_term_SCS_SOFTWARE_VERSION_26 = tr.createNewVocabularyTerm('2.6') -vocabulary_term_SCS_SOFTWARE_VERSION_26.setDescription(None) -vocabulary_term_SCS_SOFTWARE_VERSION_26.setLabel('2.6/RTA 1.6 (no longer in use)') -vocabulary_term_SCS_SOFTWARE_VERSION_26.setOrdinal(7) -vocabulary_SCS_SOFTWARE_VERSION.addTerm(vocabulary_term_SCS_SOFTWARE_VERSION_26) - -vocabulary_term_SCS_SOFTWARE_VERSION_HCS_14 = tr.createNewVocabularyTerm('HCS_1.4') -vocabulary_term_SCS_SOFTWARE_VERSION_HCS_14.setDescription(None) -vocabulary_term_SCS_SOFTWARE_VERSION_HCS_14.setLabel('HCS 1.4/RTA 1.12') -vocabulary_term_SCS_SOFTWARE_VERSION_HCS_14.setOrdinal(3) -vocabulary_SCS_SOFTWARE_VERSION.addTerm(vocabulary_term_SCS_SOFTWARE_VERSION_HCS_14) - -vocabulary_term_SCS_SOFTWARE_VERSION_24 = tr.createNewVocabularyTerm('2.4') -vocabulary_term_SCS_SOFTWARE_VERSION_24.setDescription(None) -vocabulary_term_SCS_SOFTWARE_VERSION_24.setLabel('2.4 (no longer in use)') -vocabulary_term_SCS_SOFTWARE_VERSION_24.setOrdinal(9) -vocabulary_SCS_SOFTWARE_VERSION.addTerm(vocabulary_term_SCS_SOFTWARE_VERSION_24) - -vocabulary_term_SCS_SOFTWARE_VERSION_29 = tr.createNewVocabularyTerm('2.9') -vocabulary_term_SCS_SOFTWARE_VERSION_29.setDescription(None) -vocabulary_term_SCS_SOFTWARE_VERSION_29.setLabel('2.9/RTA2.9') -vocabulary_term_SCS_SOFTWARE_VERSION_29.setOrdinal(5) -vocabulary_SCS_SOFTWARE_VERSION.addTerm(vocabulary_term_SCS_SOFTWARE_VERSION_29) - -vocabulary_SEQUENCER = tr.createNewVocabulary('SEQUENCER') -vocabulary_SEQUENCER.setDescription('Which Sequencer was used?') -vocabulary_SEQUENCER.setUrlTemplate(None) -vocabulary_SEQUENCER.setManagedInternally(False) -vocabulary_SEQUENCER.setInternalNamespace(False) -vocabulary_SEQUENCER.setChosenFromList(True) - -vocabulary_term_SEQUENCER_ATTILA = tr.createNewVocabularyTerm('ATTILA') -vocabulary_term_SEQUENCER_ATTILA.setDescription('old GA II, do not use any more (deprecated)') -vocabulary_term_SEQUENCER_ATTILA.setLabel('Attila GA II') -vocabulary_term_SEQUENCER_ATTILA.setOrdinal(6) -vocabulary_SEQUENCER.addTerm(vocabulary_term_SEQUENCER_ATTILA) - -vocabulary_term_SEQUENCER_RUA = tr.createNewVocabularyTerm('RUA') -vocabulary_term_SEQUENCER_RUA.setDescription('back of the room') -vocabulary_term_SEQUENCER_RUA.setLabel('Rua HiSeq2000') -vocabulary_term_SEQUENCER_RUA.setOrdinal(1) -vocabulary_SEQUENCER.addTerm(vocabulary_term_SEQUENCER_RUA) - -vocabulary_term_SEQUENCER_ELLAC = tr.createNewVocabularyTerm('ELLAC') -vocabulary_term_SEQUENCER_ELLAC.setDescription('GA IIx at the front of the room') -vocabulary_term_SEQUENCER_ELLAC.setLabel('Ellac GA IIx') -vocabulary_term_SEQUENCER_ELLAC.setOrdinal(4) -vocabulary_SEQUENCER.addTerm(vocabulary_term_SEQUENCER_ELLAC) - -vocabulary_term_SEQUENCER_ATTILAX = tr.createNewVocabularyTerm('ATTILAX') -vocabulary_term_SEQUENCER_ATTILAX.setDescription('Upgraded Attila, back of the room (deprecated)') -vocabulary_term_SEQUENCER_ATTILAX.setLabel('Attila GA IIx') -vocabulary_term_SEQUENCER_ATTILAX.setOrdinal(5) -vocabulary_SEQUENCER.addTerm(vocabulary_term_SEQUENCER_ATTILAX) - -vocabulary_term_SEQUENCER_KITT = tr.createNewVocabularyTerm('KITT') -vocabulary_term_SEQUENCER_KITT.setDescription(None) -vocabulary_term_SEQUENCER_KITT.setLabel('Kitt HiSeq2500') -vocabulary_term_SEQUENCER_KITT.setOrdinal(2) -vocabulary_SEQUENCER.addTerm(vocabulary_term_SEQUENCER_KITT) - -vocabulary_SEQUENCING_APPLICATION = tr.createNewVocabulary('SEQUENCING_APPLICATION') -vocabulary_SEQUENCING_APPLICATION.setDescription('Type of experiment of the High Throughput Sequencing applications') -vocabulary_SEQUENCING_APPLICATION.setUrlTemplate(None) -vocabulary_SEQUENCING_APPLICATION.setManagedInternally(False) -vocabulary_SEQUENCING_APPLICATION.setInternalNamespace(False) -vocabulary_SEQUENCING_APPLICATION.setChosenFromList(True) - -vocabulary_term_SEQUENCING_APPLICATION_GENOMIC_DNA_SEQ = tr.createNewVocabularyTerm('GENOMIC_DNA_SEQ') -vocabulary_term_SEQUENCING_APPLICATION_GENOMIC_DNA_SEQ.setDescription(None) -vocabulary_term_SEQUENCING_APPLICATION_GENOMIC_DNA_SEQ.setLabel(None) -vocabulary_term_SEQUENCING_APPLICATION_GENOMIC_DNA_SEQ.setOrdinal(3) -vocabulary_SEQUENCING_APPLICATION.addTerm(vocabulary_term_SEQUENCING_APPLICATION_GENOMIC_DNA_SEQ) - -vocabulary_term_SEQUENCING_APPLICATION_RNA_SEQ = tr.createNewVocabularyTerm('RNA_SEQ') -vocabulary_term_SEQUENCING_APPLICATION_RNA_SEQ.setDescription(None) -vocabulary_term_SEQUENCING_APPLICATION_RNA_SEQ.setLabel(None) -vocabulary_term_SEQUENCING_APPLICATION_RNA_SEQ.setOrdinal(2) -vocabulary_SEQUENCING_APPLICATION.addTerm(vocabulary_term_SEQUENCING_APPLICATION_RNA_SEQ) - -vocabulary_term_SEQUENCING_APPLICATION_SMALL_RNA_SEQ = tr.createNewVocabularyTerm('SMALL_RNA_SEQ') -vocabulary_term_SEQUENCING_APPLICATION_SMALL_RNA_SEQ.setDescription(None) -vocabulary_term_SEQUENCING_APPLICATION_SMALL_RNA_SEQ.setLabel(None) -vocabulary_term_SEQUENCING_APPLICATION_SMALL_RNA_SEQ.setOrdinal(1) -vocabulary_SEQUENCING_APPLICATION.addTerm(vocabulary_term_SEQUENCING_APPLICATION_SMALL_RNA_SEQ) - -vocabulary_term_SEQUENCING_APPLICATION_CHIP_SEQ = tr.createNewVocabularyTerm('CHIP_SEQ') -vocabulary_term_SEQUENCING_APPLICATION_CHIP_SEQ.setDescription(None) -vocabulary_term_SEQUENCING_APPLICATION_CHIP_SEQ.setLabel(None) -vocabulary_term_SEQUENCING_APPLICATION_CHIP_SEQ.setOrdinal(4) -vocabulary_SEQUENCING_APPLICATION.addTerm(vocabulary_term_SEQUENCING_APPLICATION_CHIP_SEQ) - -vocabulary_TRANSFER_METHOD = tr.createNewVocabulary('TRANSFER_METHOD') -vocabulary_TRANSFER_METHOD.setDescription('How does the customer get the data') -vocabulary_TRANSFER_METHOD.setUrlTemplate(None) -vocabulary_TRANSFER_METHOD.setManagedInternally(False) -vocabulary_TRANSFER_METHOD.setInternalNamespace(False) -vocabulary_TRANSFER_METHOD.setChosenFromList(True) - -vocabulary_term_TRANSFER_METHOD_RSYNC = tr.createNewVocabularyTerm('RSYNC') -vocabulary_term_TRANSFER_METHOD_RSYNC.setDescription(None) -vocabulary_term_TRANSFER_METHOD_RSYNC.setLabel(None) -vocabulary_term_TRANSFER_METHOD_RSYNC.setOrdinal(1) -vocabulary_TRANSFER_METHOD.addTerm(vocabulary_term_TRANSFER_METHOD_RSYNC) - -exp_type_HT_SEQUENCING = tr.createNewExperimentType('HT_SEQUENCING') -exp_type_HT_SEQUENCING.setDescription('High Throughput Sequencing (e.g. Illumina GA)') - -samp_type_ILLUMINA_FLOW_CELL = tr.createNewSampleType('ILLUMINA_FLOW_CELL') -samp_type_ILLUMINA_FLOW_CELL.setDescription('Flow Cell containing eight Flow Lanes') -samp_type_ILLUMINA_FLOW_CELL.setListable(True) -samp_type_ILLUMINA_FLOW_CELL.setSubcodeUnique(False) -samp_type_ILLUMINA_FLOW_CELL.setAutoGeneratedCode(False) -samp_type_ILLUMINA_FLOW_CELL.setGeneratedCodePrefix('BSSE-QGF-FC-') - -samp_type_ILLUMINA_FLOW_LANE = tr.createNewSampleType('ILLUMINA_FLOW_LANE') -samp_type_ILLUMINA_FLOW_LANE.setDescription('Flow Lane containing one Biological Sample') -samp_type_ILLUMINA_FLOW_LANE.setListable(True) -samp_type_ILLUMINA_FLOW_LANE.setSubcodeUnique(False) -samp_type_ILLUMINA_FLOW_LANE.setAutoGeneratedCode(False) -samp_type_ILLUMINA_FLOW_LANE.setGeneratedCodePrefix('BSSE-QGF-FL-') - -samp_type_ILLUMINA_SEQUENCING = tr.createNewSampleType('ILLUMINA_SEQUENCING') -samp_type_ILLUMINA_SEQUENCING.setDescription('Biological Sample') -samp_type_ILLUMINA_SEQUENCING.setListable(True) -samp_type_ILLUMINA_SEQUENCING.setSubcodeUnique(False) -samp_type_ILLUMINA_SEQUENCING.setAutoGeneratedCode(True) -samp_type_ILLUMINA_SEQUENCING.setGeneratedCodePrefix('BSSE-QGF-') - -data_set_type_ALIGNMENT = tr.createNewDataSetType('ALIGNMENT') -data_set_type_ALIGNMENT.setDescription('Aligner ouput, ideally bam/sam') - -data_set_type_BASECALL_STATS = tr.createNewDataSetType('BASECALL_STATS') -data_set_type_BASECALL_STATS.setDescription('Base Call Statistics') - -data_set_type_BIGWIGGLE = tr.createNewDataSetType('BIGWIGGLE') -data_set_type_BIGWIGGLE.setDescription('visualization') - -data_set_type_ELAND_ALIGNMENT = tr.createNewDataSetType('ELAND_ALIGNMENT') -data_set_type_ELAND_ALIGNMENT.setDescription('Illumina Eland Alignment Output') - -data_set_type_FASTQ_GZ = tr.createNewDataSetType('FASTQ_GZ') -data_set_type_FASTQ_GZ.setDescription('Gzipped Fastq file produced by Casava 1.8+') - -data_set_type_ILLUMINA_GA_OUTPUT = tr.createNewDataSetType('ILLUMINA_GA_OUTPUT') -data_set_type_ILLUMINA_GA_OUTPUT.setDescription('The directory structure as produced by the Illumina GA Pipeline (whatever Illumina spits out)') - -data_set_type_ILLUMINA_HISEQ_OUTPUT = tr.createNewDataSetType('ILLUMINA_HISEQ_OUTPUT') -data_set_type_ILLUMINA_HISEQ_OUTPUT.setDescription('HiSeq2000 Output') - -data_set_type_MACS_OUTPUT = tr.createNewDataSetType('MACS_OUTPUT') -data_set_type_MACS_OUTPUT.setDescription('MACS Peak Caller output') - -data_set_type_QUALITY_JPGS = tr.createNewDataSetType('QUALITY_JPGS') -data_set_type_QUALITY_JPGS.setDescription('R generated Quality plots') - -data_set_type_QUALITY_PDFS = tr.createNewDataSetType('QUALITY_PDFS') -data_set_type_QUALITY_PDFS.setDescription('R generated pdfs showing quality data') - -data_set_type_QUALITY_SVG = tr.createNewDataSetType('QUALITY_SVG') -data_set_type_QUALITY_SVG.setDescription('R generated Quality plots') - -data_set_type_RUNINFO = tr.createNewDataSetType('RUNINFO') -data_set_type_RUNINFO.setDescription('Run statstics: Status.html and Status_Files folder') - -data_set_type_SRF_PER_LANE = tr.createNewDataSetType('SRF_PER_LANE') -data_set_type_SRF_PER_LANE.setDescription('Short Read Format file (SRF) plus meta data file (TSV)') - -data_set_type_THUMBNAILS = tr.createNewDataSetType('THUMBNAILS') -data_set_type_THUMBNAILS.setDescription('Thumbnails provided by the Illumina software') - -data_set_type_TSV = tr.createNewDataSetType('TSV') -data_set_type_TSV.setDescription('Tab separated files') - -data_set_type_UNKNOWN = tr.createNewDataSetType('UNKNOWN') -data_set_type_UNKNOWN.setDescription('Unknown') - -prop_type_AFFILIATION = tr.createNewPropertyType('AFFILIATION', DataType.CONTROLLEDVOCABULARY) -prop_type_AFFILIATION.setLabel('Affiliation') -prop_type_AFFILIATION.setManagedInternally(False) -prop_type_AFFILIATION.setInternalNamespace(False) - -prop_type_AFFILIATION.setVocabulary(vocabulary_AFFILIATION) - -prop_type_AGILENT_KIT = tr.createNewPropertyType('AGILENT_KIT', DataType.CONTROLLEDVOCABULARY) -prop_type_AGILENT_KIT.setLabel('Agilent Kit') -prop_type_AGILENT_KIT.setManagedInternally(False) -prop_type_AGILENT_KIT.setInternalNamespace(False) - -prop_type_AGILENT_KIT.setVocabulary(vocabulary_AGILENT_KIT) - -prop_type_ALIGNMENT_SOFTWARE = tr.createNewPropertyType('ALIGNMENT_SOFTWARE', DataType.CONTROLLEDVOCABULARY) -prop_type_ALIGNMENT_SOFTWARE.setLabel('Alignment software') -prop_type_ALIGNMENT_SOFTWARE.setManagedInternally(False) -prop_type_ALIGNMENT_SOFTWARE.setInternalNamespace(False) - -prop_type_ALIGNMENT_SOFTWARE.setVocabulary(vocabulary_ALIGNMENT_SOFTWARE) - -prop_type_ANALYSIS_FINISHED = tr.createNewPropertyType('ANALYSIS_FINISHED', DataType.TIMESTAMP) -prop_type_ANALYSIS_FINISHED.setLabel('Analysis finished') -prop_type_ANALYSIS_FINISHED.setManagedInternally(False) -prop_type_ANALYSIS_FINISHED.setInternalNamespace(False) - - -prop_type_BARCODE = tr.createNewPropertyType('BARCODE', DataType.CONTROLLEDVOCABULARY) -prop_type_BARCODE.setLabel('Index 1') -prop_type_BARCODE.setManagedInternally(False) -prop_type_BARCODE.setInternalNamespace(False) - -prop_type_BARCODE.setVocabulary(vocabulary_BARCODES) - -prop_type_BARCODES = tr.createNewPropertyType('BARCODES', DataType.MULTILINE_VARCHAR) -prop_type_BARCODES.setLabel('Adaptor and Barcodes') -prop_type_BARCODES.setManagedInternally(False) -prop_type_BARCODES.setInternalNamespace(False) - - -prop_type_BARCODE_COMPLEXITY_CHECKER = tr.createNewPropertyType('BARCODE_COMPLEXITY_CHECKER', DataType.MULTILINE_VARCHAR) -prop_type_BARCODE_COMPLEXITY_CHECKER.setLabel('Barcode_Complexity_Checker') -prop_type_BARCODE_COMPLEXITY_CHECKER.setManagedInternally(False) -prop_type_BARCODE_COMPLEXITY_CHECKER.setInternalNamespace(False) - - -prop_type_BARCODE_LENGTH = tr.createNewPropertyType('BARCODE_LENGTH', DataType.INTEGER) -prop_type_BARCODE_LENGTH.setLabel('Barcode Length (+ recognition site)') -prop_type_BARCODE_LENGTH.setManagedInternally(False) -prop_type_BARCODE_LENGTH.setInternalNamespace(False) - - -prop_type_BAREBACKED = tr.createNewPropertyType('BAREBACKED', DataType.BOOLEAN) -prop_type_BAREBACKED.setLabel('Barebacked?') -prop_type_BAREBACKED.setManagedInternally(False) -prop_type_BAREBACKED.setInternalNamespace(False) - - -prop_type_BASESCOVERED = tr.createNewPropertyType('BASESCOVERED', DataType.INTEGER) -prop_type_BASESCOVERED.setLabel('bases Covered') -prop_type_BASESCOVERED.setManagedInternally(False) -prop_type_BASESCOVERED.setInternalNamespace(False) - - -prop_type_BIOLOGICAL_SAMPLE_ARRIVED = tr.createNewPropertyType('BIOLOGICAL_SAMPLE_ARRIVED', DataType.TIMESTAMP) -prop_type_BIOLOGICAL_SAMPLE_ARRIVED.setLabel('Arrival Date of Biological Sample') -prop_type_BIOLOGICAL_SAMPLE_ARRIVED.setManagedInternally(False) -prop_type_BIOLOGICAL_SAMPLE_ARRIVED.setInternalNamespace(False) - - -prop_type_CALCLUATED_EXAMPLE = tr.createNewPropertyType('CALCLUATED_EXAMPLE', DataType.REAL) -prop_type_CALCLUATED_EXAMPLE.setLabel('Calcluated_example') -prop_type_CALCLUATED_EXAMPLE.setManagedInternally(False) -prop_type_CALCLUATED_EXAMPLE.setInternalNamespace(False) - - -prop_type_CASAVA_VERSION = tr.createNewPropertyType('CASAVA_VERSION', DataType.CONTROLLEDVOCABULARY) -prop_type_CASAVA_VERSION.setLabel('Casava Version') -prop_type_CASAVA_VERSION.setManagedInternally(False) -prop_type_CASAVA_VERSION.setInternalNamespace(False) - -prop_type_CASAVA_VERSION.setVocabulary(vocabulary_CASAVA_VERSION) - -prop_type_CELL_PLASTICITY_SYSTEMSX = tr.createNewPropertyType('CELL_PLASTICITY_SYSTEMSX', DataType.BOOLEAN) -prop_type_CELL_PLASTICITY_SYSTEMSX.setLabel('Cell Plasticity (SystemsX)') -prop_type_CELL_PLASTICITY_SYSTEMSX.setManagedInternally(False) -prop_type_CELL_PLASTICITY_SYSTEMSX.setInternalNamespace(False) - - -prop_type_CHROMCOUNT = tr.createNewPropertyType('CHROMCOUNT', DataType.INTEGER) -prop_type_CHROMCOUNT.setLabel('chrom Count') -prop_type_CHROMCOUNT.setManagedInternally(False) -prop_type_CHROMCOUNT.setInternalNamespace(False) - - -prop_type_CLUSTER_GENERATION_KIT_VERSION = tr.createNewPropertyType('CLUSTER_GENERATION_KIT_VERSION', DataType.CONTROLLEDVOCABULARY) -prop_type_CLUSTER_GENERATION_KIT_VERSION.setLabel('CS Generation Kit Version') -prop_type_CLUSTER_GENERATION_KIT_VERSION.setManagedInternally(False) -prop_type_CLUSTER_GENERATION_KIT_VERSION.setInternalNamespace(False) - -prop_type_CLUSTER_GENERATION_KIT_VERSION.setVocabulary(vocabulary_CLUSTER_GENERATION_KIT_VERSION) - -prop_type_CLUSTER_STATION = tr.createNewPropertyType('CLUSTER_STATION', DataType.CONTROLLEDVOCABULARY) -prop_type_CLUSTER_STATION.setLabel('Cluster Station') -prop_type_CLUSTER_STATION.setManagedInternally(False) -prop_type_CLUSTER_STATION.setInternalNamespace(False) - -prop_type_CLUSTER_STATION.setVocabulary(vocabulary_CLUSTER_STATION) - -prop_type_CLUSTER_STATION_SOFTWARE_VERSION = tr.createNewPropertyType('CLUSTER_STATION_SOFTWARE_VERSION', DataType.CONTROLLEDVOCABULARY) -prop_type_CLUSTER_STATION_SOFTWARE_VERSION.setLabel('CS Software version') -prop_type_CLUSTER_STATION_SOFTWARE_VERSION.setManagedInternally(False) -prop_type_CLUSTER_STATION_SOFTWARE_VERSION.setInternalNamespace(False) - -prop_type_CLUSTER_STATION_SOFTWARE_VERSION.setVocabulary(vocabulary_CLUSTER_STATION_SOFTWARE_VERSION) - -prop_type_CONCENTRATION_FLOWLANE = tr.createNewPropertyType('CONCENTRATION_FLOWLANE', DataType.REAL) -prop_type_CONCENTRATION_FLOWLANE.setLabel('Concentration in flow lane [pM]') -prop_type_CONCENTRATION_FLOWLANE.setManagedInternally(False) -prop_type_CONCENTRATION_FLOWLANE.setInternalNamespace(False) - - -prop_type_CONCENTRATION_ORIGINAL_ILLUMINA = tr.createNewPropertyType('CONCENTRATION_ORIGINAL_ILLUMINA', DataType.REAL) -prop_type_CONCENTRATION_ORIGINAL_ILLUMINA.setLabel(u'Concentration (original) [ng/ul]') -prop_type_CONCENTRATION_ORIGINAL_ILLUMINA.setManagedInternally(False) -prop_type_CONCENTRATION_ORIGINAL_ILLUMINA.setInternalNamespace(False) - - -prop_type_CONCENTRATION_PREPARED_ILLUMINA = tr.createNewPropertyType('CONCENTRATION_PREPARED_ILLUMINA', DataType.REAL) -prop_type_CONCENTRATION_PREPARED_ILLUMINA.setLabel('Concentration (prepared) [ng/ul]') -prop_type_CONCENTRATION_PREPARED_ILLUMINA.setManagedInternally(False) -prop_type_CONCENTRATION_PREPARED_ILLUMINA.setInternalNamespace(False) - - -prop_type_CONCENTRATION_TOTAL = tr.createNewPropertyType('CONCENTRATION_TOTAL', DataType.INTEGER) -prop_type_CONCENTRATION_TOTAL.setLabel('DNA concentration of library [ng/ul])') -prop_type_CONCENTRATION_TOTAL.setManagedInternally(False) -prop_type_CONCENTRATION_TOTAL.setInternalNamespace(False) - - -prop_type_CONC_IF_SAMPLE_PROCESSED_DNA_LIBRARY = tr.createNewPropertyType('CONC_IF_SAMPLE_PROCESSED_DNA_LIBRARY', DataType.INTEGER) -prop_type_CONC_IF_SAMPLE_PROCESSED_DNA_LIBRARY.setLabel('Conc. if sample="proc. DNA library" (nM)') -prop_type_CONC_IF_SAMPLE_PROCESSED_DNA_LIBRARY.setManagedInternally(False) -prop_type_CONC_IF_SAMPLE_PROCESSED_DNA_LIBRARY.setInternalNamespace(False) - - -prop_type_CONTACT_PERSON_EMAIL = tr.createNewPropertyType('CONTACT_PERSON_EMAIL', DataType.VARCHAR) -prop_type_CONTACT_PERSON_EMAIL.setLabel('Email of Contact Person') -prop_type_CONTACT_PERSON_EMAIL.setManagedInternally(False) -prop_type_CONTACT_PERSON_EMAIL.setInternalNamespace(False) - - -prop_type_CONTACT_PERSON_NAME = tr.createNewPropertyType('CONTACT_PERSON_NAME', DataType.VARCHAR) -prop_type_CONTACT_PERSON_NAME.setLabel('Name of Contact Person') -prop_type_CONTACT_PERSON_NAME.setManagedInternally(False) -prop_type_CONTACT_PERSON_NAME.setInternalNamespace(False) - - -prop_type_CONTROL_LANE = tr.createNewPropertyType('CONTROL_LANE', DataType.CONTROLLEDVOCABULARY) -prop_type_CONTROL_LANE.setLabel('Control Lane') -prop_type_CONTROL_LANE.setManagedInternally(False) -prop_type_CONTROL_LANE.setInternalNamespace(False) - -prop_type_CONTROL_LANE.setVocabulary(vocabulary_CONTROL_LANE) - -prop_type_CREATED_ON_CS = tr.createNewPropertyType('CREATED_ON_CS', DataType.TIMESTAMP) -prop_type_CREATED_ON_CS.setLabel('Clustering date') -prop_type_CREATED_ON_CS.setManagedInternally(False) -prop_type_CREATED_ON_CS.setInternalNamespace(False) - - -prop_type_CS_PROTOCOL_VERSION = tr.createNewPropertyType('CS_PROTOCOL_VERSION', DataType.VARCHAR) -prop_type_CS_PROTOCOL_VERSION.setLabel('CS Protocol Version') -prop_type_CS_PROTOCOL_VERSION.setManagedInternally(False) -prop_type_CS_PROTOCOL_VERSION.setInternalNamespace(False) - - -prop_type_CYCLES = tr.createNewPropertyType('CYCLES', DataType.INTEGER) -prop_type_CYCLES.setLabel('Number of Cycles') -prop_type_CYCLES.setManagedInternally(False) -prop_type_CYCLES.setInternalNamespace(False) - - -prop_type_CYCLES_REQUESTED_BY_CUSTOMER = tr.createNewPropertyType('CYCLES_REQUESTED_BY_CUSTOMER', DataType.CONTROLLEDVOCABULARY) -prop_type_CYCLES_REQUESTED_BY_CUSTOMER.setLabel('Cycles requested') -prop_type_CYCLES_REQUESTED_BY_CUSTOMER.setManagedInternally(False) -prop_type_CYCLES_REQUESTED_BY_CUSTOMER.setInternalNamespace(False) - -prop_type_CYCLES_REQUESTED_BY_CUSTOMER.setVocabulary(vocabulary_CYCLES) - -prop_type_DATA_TRANSFERRED = tr.createNewPropertyType('DATA_TRANSFERRED', DataType.TIMESTAMP) -prop_type_DATA_TRANSFERRED.setLabel('Data transferred') -prop_type_DATA_TRANSFERRED.setManagedInternally(False) -prop_type_DATA_TRANSFERRED.setInternalNamespace(False) - - -prop_type_DNA_CONCENTRATION_OF_LIBRARY = tr.createNewPropertyType('DNA_CONCENTRATION_OF_LIBRARY', DataType.INTEGER) -prop_type_DNA_CONCENTRATION_OF_LIBRARY.setLabel('DNA concentration of library (nM)') -prop_type_DNA_CONCENTRATION_OF_LIBRARY.setManagedInternally(False) -prop_type_DNA_CONCENTRATION_OF_LIBRARY.setInternalNamespace(False) - - -prop_type_END_TYPE = tr.createNewPropertyType('END_TYPE', DataType.CONTROLLEDVOCABULARY) -prop_type_END_TYPE.setLabel('Paired End / Single Read') -prop_type_END_TYPE.setManagedInternally(False) -prop_type_END_TYPE.setInternalNamespace(False) - -prop_type_END_TYPE.setVocabulary(vocabulary_END_TYPE) - -prop_type_EXPERIMENT_DESIGN = tr.createNewPropertyType('EXPERIMENT_DESIGN', DataType.CONTROLLEDVOCABULARY) -prop_type_EXPERIMENT_DESIGN.setLabel('Experiment Design') -prop_type_EXPERIMENT_DESIGN.setManagedInternally(False) -prop_type_EXPERIMENT_DESIGN.setInternalNamespace(False) - -prop_type_EXPERIMENT_DESIGN.setVocabulary(vocabulary_EXPERIMENT_DESIGN) - -prop_type_EXTERNAL_SAMPLE_NAME = tr.createNewPropertyType('EXTERNAL_SAMPLE_NAME', DataType.VARCHAR) -prop_type_EXTERNAL_SAMPLE_NAME.setLabel('External Sample Name') -prop_type_EXTERNAL_SAMPLE_NAME.setManagedInternally(False) -prop_type_EXTERNAL_SAMPLE_NAME.setInternalNamespace(False) - - -prop_type_FLOWCELLTYPE = tr.createNewPropertyType('FLOWCELLTYPE', DataType.VARCHAR) -prop_type_FLOWCELLTYPE.setLabel('Flow Cell Type') -prop_type_FLOWCELLTYPE.setManagedInternally(False) -prop_type_FLOWCELLTYPE.setInternalNamespace(False) - - -prop_type_FLOW_CELL_SEQUENCED_ON = tr.createNewPropertyType('FLOW_CELL_SEQUENCED_ON', DataType.TIMESTAMP) -prop_type_FLOW_CELL_SEQUENCED_ON.setLabel('Sequencing date') -prop_type_FLOW_CELL_SEQUENCED_ON.setManagedInternally(False) -prop_type_FLOW_CELL_SEQUENCED_ON.setInternalNamespace(False) - - -prop_type_FRAGMENT_SIZE_PREPARED_ILLUMINA = tr.createNewPropertyType('FRAGMENT_SIZE_PREPARED_ILLUMINA', DataType.INTEGER) -prop_type_FRAGMENT_SIZE_PREPARED_ILLUMINA.setLabel('Fragment Size (prepared) [base (pairs)]') -prop_type_FRAGMENT_SIZE_PREPARED_ILLUMINA.setManagedInternally(False) -prop_type_FRAGMENT_SIZE_PREPARED_ILLUMINA.setInternalNamespace(False) - - -prop_type_ILLUMINA_PIPELINE_VERSION = tr.createNewPropertyType('ILLUMINA_PIPELINE_VERSION', DataType.CONTROLLEDVOCABULARY) -prop_type_ILLUMINA_PIPELINE_VERSION.setLabel('Pipeline Version') -prop_type_ILLUMINA_PIPELINE_VERSION.setManagedInternally(False) -prop_type_ILLUMINA_PIPELINE_VERSION.setInternalNamespace(False) - -prop_type_ILLUMINA_PIPELINE_VERSION.setVocabulary(vocabulary_PIPELINE_VERSION) - -prop_type_INDEX2 = tr.createNewPropertyType('INDEX2', DataType.CONTROLLEDVOCABULARY) -prop_type_INDEX2.setLabel('Index 2') -prop_type_INDEX2.setManagedInternally(False) -prop_type_INDEX2.setInternalNamespace(False) - -prop_type_INDEX2.setVocabulary(vocabulary_INDEX2) - -prop_type_INDEXREAD = tr.createNewPropertyType('INDEXREAD', DataType.INTEGER) -prop_type_INDEXREAD.setLabel('Index Read') -prop_type_INDEXREAD.setManagedInternally(False) -prop_type_INDEXREAD.setInternalNamespace(False) - - -prop_type_INVOICE = tr.createNewPropertyType('INVOICE', DataType.BOOLEAN) -prop_type_INVOICE.setLabel('Invoice sent?') -prop_type_INVOICE.setManagedInternally(False) -prop_type_INVOICE.setInternalNamespace(False) - - -prop_type_ISCOMPRESSED = tr.createNewPropertyType('ISCOMPRESSED', DataType.BOOLEAN) -prop_type_ISCOMPRESSED.setLabel('Is Compressed') -prop_type_ISCOMPRESSED.setManagedInternally(False) -prop_type_ISCOMPRESSED.setInternalNamespace(False) - - -prop_type_ISSUED_COMMAND = tr.createNewPropertyType('ISSUED_COMMAND', DataType.MULTILINE_VARCHAR) -prop_type_ISSUED_COMMAND.setLabel('Issued Command') -prop_type_ISSUED_COMMAND.setManagedInternally(False) -prop_type_ISSUED_COMMAND.setInternalNamespace(False) - - -prop_type_ISSWAPPED = tr.createNewPropertyType('ISSWAPPED', DataType.INTEGER) -prop_type_ISSWAPPED.setLabel('Is byte swapped') -prop_type_ISSWAPPED.setManagedInternally(False) -prop_type_ISSWAPPED.setInternalNamespace(False) - - -prop_type_KIT = tr.createNewPropertyType('KIT', DataType.CONTROLLEDVOCABULARY) -prop_type_KIT.setLabel('Library preparation kit') -prop_type_KIT.setManagedInternally(False) -prop_type_KIT.setInternalNamespace(False) - -prop_type_KIT.setVocabulary(vocabulary_KIT) - -prop_type_KIT_ARRIVED = tr.createNewPropertyType('KIT_ARRIVED', DataType.TIMESTAMP) -prop_type_KIT_ARRIVED.setLabel('Kit arrived') -prop_type_KIT_ARRIVED.setManagedInternally(False) -prop_type_KIT_ARRIVED.setInternalNamespace(False) - - -prop_type_KIT_PREPARED = tr.createNewPropertyType('KIT_PREPARED', DataType.TIMESTAMP) -prop_type_KIT_PREPARED.setLabel('Sample processed') -prop_type_KIT_PREPARED.setManagedInternally(False) -prop_type_KIT_PREPARED.setInternalNamespace(False) - - -prop_type_LANECOUNT = tr.createNewPropertyType('LANECOUNT', DataType.INTEGER) -prop_type_LANECOUNT.setLabel('Lane Count') -prop_type_LANECOUNT.setManagedInternally(False) -prop_type_LANECOUNT.setInternalNamespace(False) - - -prop_type_LIBRARY_PROCESSING_FAILED = tr.createNewPropertyType('LIBRARY_PROCESSING_FAILED', DataType.BOOLEAN) -prop_type_LIBRARY_PROCESSING_FAILED.setLabel('Library processing failed') -prop_type_LIBRARY_PROCESSING_FAILED.setManagedInternally(False) -prop_type_LIBRARY_PROCESSING_FAILED.setInternalNamespace(False) - - -prop_type_LIBRARY_PROCESSING_POSSIBLE = tr.createNewPropertyType('LIBRARY_PROCESSING_POSSIBLE', DataType.BOOLEAN) -prop_type_LIBRARY_PROCESSING_POSSIBLE.setLabel('Library Processing possible') -prop_type_LIBRARY_PROCESSING_POSSIBLE.setManagedInternally(False) -prop_type_LIBRARY_PROCESSING_POSSIBLE.setInternalNamespace(False) - - -prop_type_LIBRARY_PROCESSING_SUCCESSFUL = tr.createNewPropertyType('LIBRARY_PROCESSING_SUCCESSFUL', DataType.BOOLEAN) -prop_type_LIBRARY_PROCESSING_SUCCESSFUL.setLabel('Library processing successful') -prop_type_LIBRARY_PROCESSING_SUCCESSFUL.setManagedInternally(False) -prop_type_LIBRARY_PROCESSING_SUCCESSFUL.setInternalNamespace(False) - - -prop_type_LOT = tr.createNewPropertyType('LOT', DataType.INTEGER) -prop_type_LOT.setLabel('Kit Lot #') -prop_type_LOT.setManagedInternally(False) -prop_type_LOT.setInternalNamespace(False) - - -prop_type_MACS_VERSION = tr.createNewPropertyType('MACS_VERSION', DataType.CONTROLLEDVOCABULARY) -prop_type_MACS_VERSION.setLabel('MACS VERSION') -prop_type_MACS_VERSION.setManagedInternally(False) -prop_type_MACS_VERSION.setInternalNamespace(False) - -prop_type_MACS_VERSION.setVocabulary(vocabulary_MACS_VERSION) - -prop_type_MAPPED_READS = tr.createNewPropertyType('MAPPED_READS', DataType.INTEGER) -prop_type_MAPPED_READS.setLabel('Mapped reads') -prop_type_MAPPED_READS.setManagedInternally(False) -prop_type_MAPPED_READS.setInternalNamespace(False) - - -prop_type_MAX = tr.createNewPropertyType('MAX', DataType.REAL) -prop_type_MAX.setLabel('Maximum') -prop_type_MAX.setManagedInternally(False) -prop_type_MAX.setInternalNamespace(False) - - -prop_type_MEAN = tr.createNewPropertyType('MEAN', DataType.REAL) -prop_type_MEAN.setLabel('Mean') -prop_type_MEAN.setManagedInternally(False) -prop_type_MEAN.setInternalNamespace(False) - - -prop_type_MIN = tr.createNewPropertyType('MIN', DataType.REAL) -prop_type_MIN.setLabel('Minimum') -prop_type_MIN.setManagedInternally(False) -prop_type_MIN.setInternalNamespace(False) - - -prop_type_MISMATCH_IN_INDEX = tr.createNewPropertyType('MISMATCH_IN_INDEX', DataType.CONTROLLEDVOCABULARY) -prop_type_MISMATCH_IN_INDEX.setLabel('Mismatch in Index') -prop_type_MISMATCH_IN_INDEX.setManagedInternally(False) -prop_type_MISMATCH_IN_INDEX.setInternalNamespace(False) - -prop_type_MISMATCH_IN_INDEX.setVocabulary(vocabulary_MISMATCH_IN_INDEX) - -prop_type_NANO_DROP = tr.createNewPropertyType('NANO_DROP', DataType.CONTROLLEDVOCABULARY) -prop_type_NANO_DROP.setLabel('Nano Drop') -prop_type_NANO_DROP.setManagedInternally(False) -prop_type_NANO_DROP.setInternalNamespace(False) - -prop_type_NANO_DROP.setVocabulary(vocabulary_NANO_DROP) - -prop_type_NCBI_ORGANISM_TAXONOMY = tr.createNewPropertyType('NCBI_ORGANISM_TAXONOMY', DataType.CONTROLLEDVOCABULARY) -prop_type_NCBI_ORGANISM_TAXONOMY.setLabel('Organism (NCBI Taxonomy)') -prop_type_NCBI_ORGANISM_TAXONOMY.setManagedInternally(False) -prop_type_NCBI_ORGANISM_TAXONOMY.setInternalNamespace(False) - -prop_type_NCBI_ORGANISM_TAXONOMY.setVocabulary(vocabulary_NCBI_TAXONOMY) - -prop_type_NM_DNA = tr.createNewPropertyType('NM_DNA', DataType.REAL) -prop_type_NM_DNA.setLabel('Calculated DNA concentration of library (nM)') -prop_type_NM_DNA.setManagedInternally(False) -prop_type_NM_DNA.setInternalNamespace(False) - - -prop_type_NOTES = tr.createNewPropertyType('NOTES', DataType.MULTILINE_VARCHAR) -prop_type_NOTES.setLabel('Notes') -prop_type_NOTES.setManagedInternally(False) -prop_type_NOTES.setInternalNamespace(False) - - -prop_type_NOTES_CUSTOMER = tr.createNewPropertyType('NOTES_CUSTOMER', DataType.MULTILINE_VARCHAR) -prop_type_NOTES_CUSTOMER.setLabel('Notes Customer') -prop_type_NOTES_CUSTOMER.setManagedInternally(False) -prop_type_NOTES_CUSTOMER.setInternalNamespace(False) - - -prop_type_NUMBER_OF_ATTACHMENTS = tr.createNewPropertyType('NUMBER_OF_ATTACHMENTS', DataType.INTEGER) -prop_type_NUMBER_OF_ATTACHMENTS.setLabel('Number of Attachments') -prop_type_NUMBER_OF_ATTACHMENTS.setManagedInternally(False) -prop_type_NUMBER_OF_ATTACHMENTS.setInternalNamespace(False) - - -prop_type_ORGANISM_FREE = tr.createNewPropertyType('ORGANISM_FREE', DataType.VARCHAR) -prop_type_ORGANISM_FREE.setLabel('Organism (if OTHER)') -prop_type_ORGANISM_FREE.setManagedInternally(False) -prop_type_ORGANISM_FREE.setInternalNamespace(False) - - -prop_type_OTRS = tr.createNewPropertyType('OTRS', DataType.INTEGER) -prop_type_OTRS.setLabel('OTRS ID #') -prop_type_OTRS.setManagedInternally(False) -prop_type_OTRS.setInternalNamespace(False) - - -prop_type_PAIRED_END_KIT = tr.createNewPropertyType('PAIRED_END_KIT', DataType.VARCHAR) -prop_type_PAIRED_END_KIT.setLabel('Paired End Kit') -prop_type_PAIRED_END_KIT.setManagedInternally(False) -prop_type_PAIRED_END_KIT.setInternalNamespace(False) - - -prop_type_PERCENTAGE_ONE_MISMATCH_READS_INDEX = tr.createNewPropertyType('PERCENTAGE_ONE_MISMATCH_READS_INDEX', DataType.REAL) -prop_type_PERCENTAGE_ONE_MISMATCH_READS_INDEX.setLabel('% One Mismatch Reads (Index)') -prop_type_PERCENTAGE_ONE_MISMATCH_READS_INDEX.setManagedInternally(False) -prop_type_PERCENTAGE_ONE_MISMATCH_READS_INDEX.setInternalNamespace(False) - - -prop_type_PERCENTAGE_PASSED_FILTERING = tr.createNewPropertyType('PERCENTAGE_PASSED_FILTERING', DataType.REAL) -prop_type_PERCENTAGE_PASSED_FILTERING.setLabel('% Passes Illumina Filtering (PF)') -prop_type_PERCENTAGE_PASSED_FILTERING.setManagedInternally(False) -prop_type_PERCENTAGE_PASSED_FILTERING.setInternalNamespace(False) - - -prop_type_PERCENTAGE_PERFECT_INDEX_READS = tr.createNewPropertyType('PERCENTAGE_PERFECT_INDEX_READS', DataType.REAL) -prop_type_PERCENTAGE_PERFECT_INDEX_READS.setLabel('% Perfect Index Reads') -prop_type_PERCENTAGE_PERFECT_INDEX_READS.setManagedInternally(False) -prop_type_PERCENTAGE_PERFECT_INDEX_READS.setInternalNamespace(False) - - -prop_type_PERCENTAGE_RAW_CLUSTERS_PER_LANE = tr.createNewPropertyType('PERCENTAGE_RAW_CLUSTERS_PER_LANE', DataType.REAL) -prop_type_PERCENTAGE_RAW_CLUSTERS_PER_LANE.setLabel('% of raw clusters per lane') -prop_type_PERCENTAGE_RAW_CLUSTERS_PER_LANE.setManagedInternally(False) -prop_type_PERCENTAGE_RAW_CLUSTERS_PER_LANE.setInternalNamespace(False) - - -prop_type_PREPARED_BY = tr.createNewPropertyType('PREPARED_BY', DataType.VARCHAR) -prop_type_PREPARED_BY.setLabel('Prepared by') -prop_type_PREPARED_BY.setManagedInternally(False) -prop_type_PREPARED_BY.setInternalNamespace(False) - - -prop_type_PRIMARYDATASIZE = tr.createNewPropertyType('PRIMARYDATASIZE', DataType.INTEGER) -prop_type_PRIMARYDATASIZE.setLabel('primary Data Size') -prop_type_PRIMARYDATASIZE.setManagedInternally(False) -prop_type_PRIMARYDATASIZE.setInternalNamespace(False) - - -prop_type_PRIMARYINDEXSIZE = tr.createNewPropertyType('PRIMARYINDEXSIZE', DataType.INTEGER) -prop_type_PRIMARYINDEXSIZE.setLabel('primary Index Size') -prop_type_PRIMARYINDEXSIZE.setManagedInternally(False) -prop_type_PRIMARYINDEXSIZE.setInternalNamespace(False) - - -prop_type_PRINCIPAL_INVESTIGATOR_EMAIL = tr.createNewPropertyType('PRINCIPAL_INVESTIGATOR_EMAIL', DataType.VARCHAR) -prop_type_PRINCIPAL_INVESTIGATOR_EMAIL.setLabel('Email of Principal Investigator') -prop_type_PRINCIPAL_INVESTIGATOR_EMAIL.setManagedInternally(False) -prop_type_PRINCIPAL_INVESTIGATOR_EMAIL.setInternalNamespace(False) - - -prop_type_PRINCIPAL_INVESTIGATOR_NAME = tr.createNewPropertyType('PRINCIPAL_INVESTIGATOR_NAME', DataType.VARCHAR) -prop_type_PRINCIPAL_INVESTIGATOR_NAME.setLabel('Name of Principal Investigator') -prop_type_PRINCIPAL_INVESTIGATOR_NAME.setManagedInternally(False) -prop_type_PRINCIPAL_INVESTIGATOR_NAME.setInternalNamespace(False) - - -prop_type_REQUIRED_LANES = tr.createNewPropertyType('REQUIRED_LANES', DataType.CONTROLLEDVOCABULARY) -prop_type_REQUIRED_LANES.setLabel('Number of Required Lanes') -prop_type_REQUIRED_LANES.setManagedInternally(False) -prop_type_REQUIRED_LANES.setInternalNamespace(False) - -prop_type_REQUIRED_LANES.setVocabulary(vocabulary_REQUIRED_LANES) - -prop_type_SAMPLE_CHARACTERISTICS = tr.createNewPropertyType('SAMPLE_CHARACTERISTICS', DataType.MULTILINE_VARCHAR) -prop_type_SAMPLE_CHARACTERISTICS.setLabel('Sample characteristics') -prop_type_SAMPLE_CHARACTERISTICS.setManagedInternally(False) -prop_type_SAMPLE_CHARACTERISTICS.setInternalNamespace(False) - - -prop_type_SAMPLE_DATA_PROCESSING = tr.createNewPropertyType('SAMPLE_DATA_PROCESSING', DataType.MULTILINE_VARCHAR) -prop_type_SAMPLE_DATA_PROCESSING.setLabel('Sample Data Processing') -prop_type_SAMPLE_DATA_PROCESSING.setManagedInternally(False) -prop_type_SAMPLE_DATA_PROCESSING.setInternalNamespace(False) - - -prop_type_SAMPLE_EXTRACT_PROTOCOL = tr.createNewPropertyType('SAMPLE_EXTRACT_PROTOCOL', DataType.MULTILINE_VARCHAR) -prop_type_SAMPLE_EXTRACT_PROTOCOL.setLabel('Sample Extract Protocol') -prop_type_SAMPLE_EXTRACT_PROTOCOL.setManagedInternally(False) -prop_type_SAMPLE_EXTRACT_PROTOCOL.setInternalNamespace(False) - - -prop_type_SAMPLE_ID = tr.createNewPropertyType('SAMPLE_ID', DataType.VARCHAR) -prop_type_SAMPLE_ID.setLabel('Sample ID') -prop_type_SAMPLE_ID.setManagedInternally(False) -prop_type_SAMPLE_ID.setInternalNamespace(False) - - -prop_type_SAMPLE_KIND = tr.createNewPropertyType('SAMPLE_KIND', DataType.CONTROLLEDVOCABULARY) -prop_type_SAMPLE_KIND.setLabel('Sample Kind') -prop_type_SAMPLE_KIND.setManagedInternally(False) -prop_type_SAMPLE_KIND.setInternalNamespace(False) - -prop_type_SAMPLE_KIND.setVocabulary(vocabulary_SAMPLE_TYPE) - -prop_type_SAMPLE_LIBRARY_SELECTION = tr.createNewPropertyType('SAMPLE_LIBRARY_SELECTION', DataType.CONTROLLEDVOCABULARY) -prop_type_SAMPLE_LIBRARY_SELECTION.setLabel('Sample Library Selection') -prop_type_SAMPLE_LIBRARY_SELECTION.setManagedInternally(False) -prop_type_SAMPLE_LIBRARY_SELECTION.setInternalNamespace(False) - -prop_type_SAMPLE_LIBRARY_SELECTION.setVocabulary(vocabulary_SAMPLE_LIBRARY_SELECTION) - -prop_type_SAMPLE_LIBRARY_SOURCE = tr.createNewPropertyType('SAMPLE_LIBRARY_SOURCE', DataType.CONTROLLEDVOCABULARY) -prop_type_SAMPLE_LIBRARY_SOURCE.setLabel('Sample Library Source') -prop_type_SAMPLE_LIBRARY_SOURCE.setManagedInternally(False) -prop_type_SAMPLE_LIBRARY_SOURCE.setInternalNamespace(False) - -prop_type_SAMPLE_LIBRARY_SOURCE.setVocabulary(vocabulary_SAMPLE_LIBRARY_SOURCE_VOC) - -prop_type_SAMPLE_LIBRARY_STRATEGY = tr.createNewPropertyType('SAMPLE_LIBRARY_STRATEGY', DataType.CONTROLLEDVOCABULARY) -prop_type_SAMPLE_LIBRARY_STRATEGY.setLabel('Sample Library Strategy') -prop_type_SAMPLE_LIBRARY_STRATEGY.setManagedInternally(False) -prop_type_SAMPLE_LIBRARY_STRATEGY.setInternalNamespace(False) - -prop_type_SAMPLE_LIBRARY_STRATEGY.setVocabulary(vocabulary_SAMPLE_LIBRARY_STRATEGY) - -prop_type_SAMPLE_MOLECULE = tr.createNewPropertyType('SAMPLE_MOLECULE', DataType.CONTROLLEDVOCABULARY) -prop_type_SAMPLE_MOLECULE.setLabel('Sample molecule') -prop_type_SAMPLE_MOLECULE.setManagedInternally(False) -prop_type_SAMPLE_MOLECULE.setInternalNamespace(False) - -prop_type_SAMPLE_MOLECULE.setVocabulary(vocabulary_SAMPLE_MOLECULE) - -prop_type_SAMPLE_SOURCE_NAME = tr.createNewPropertyType('SAMPLE_SOURCE_NAME', DataType.VARCHAR) -prop_type_SAMPLE_SOURCE_NAME.setLabel('Sample Source Name') -prop_type_SAMPLE_SOURCE_NAME.setManagedInternally(False) -prop_type_SAMPLE_SOURCE_NAME.setInternalNamespace(False) - - -prop_type_SAMTOOLS_FLAGSTAT = tr.createNewPropertyType('SAMTOOLS_FLAGSTAT', DataType.MULTILINE_VARCHAR) -prop_type_SAMTOOLS_FLAGSTAT.setLabel('Samtools Flagstat Output') -prop_type_SAMTOOLS_FLAGSTAT.setManagedInternally(False) -prop_type_SAMTOOLS_FLAGSTAT.setInternalNamespace(False) - - -prop_type_SBS_KIT = tr.createNewPropertyType('SBS_KIT', DataType.VARCHAR) -prop_type_SBS_KIT.setLabel('SBS Kit') -prop_type_SBS_KIT.setManagedInternally(False) -prop_type_SBS_KIT.setInternalNamespace(False) - - -prop_type_SBS_SEQUENCING_KIT_VERSION = tr.createNewPropertyType('SBS_SEQUENCING_KIT_VERSION', DataType.CONTROLLEDVOCABULARY) -prop_type_SBS_SEQUENCING_KIT_VERSION.setLabel('SBS Sequencing Kit Version') -prop_type_SBS_SEQUENCING_KIT_VERSION.setManagedInternally(False) -prop_type_SBS_SEQUENCING_KIT_VERSION.setInternalNamespace(False) - -prop_type_SBS_SEQUENCING_KIT_VERSION.setVocabulary(vocabulary_SBS_SEQUENCING_KIT_VERSION) - -prop_type_SCRIPT_TYPE = tr.createNewPropertyType('SCRIPT_TYPE', DataType.REAL) -prop_type_SCRIPT_TYPE.setLabel('Script Type') -prop_type_SCRIPT_TYPE.setManagedInternally(False) -prop_type_SCRIPT_TYPE.setInternalNamespace(False) - - -prop_type_SCS_PROTOCOL_VERSION = tr.createNewPropertyType('SCS_PROTOCOL_VERSION', DataType.CONTROLLEDVOCABULARY) -prop_type_SCS_PROTOCOL_VERSION.setLabel('SCS Protocol Version') -prop_type_SCS_PROTOCOL_VERSION.setManagedInternally(False) -prop_type_SCS_PROTOCOL_VERSION.setInternalNamespace(False) - -prop_type_SCS_PROTOCOL_VERSION.setVocabulary(vocabulary_SCS_PROTOCOL_VERSION) - -prop_type_SCS_SOFTWARE_VERSION = tr.createNewPropertyType('SCS_SOFTWARE_VERSION', DataType.CONTROLLEDVOCABULARY) -prop_type_SCS_SOFTWARE_VERSION.setLabel('SCS Software Version') -prop_type_SCS_SOFTWARE_VERSION.setManagedInternally(False) -prop_type_SCS_SOFTWARE_VERSION.setInternalNamespace(False) - -prop_type_SCS_SOFTWARE_VERSION.setVocabulary(vocabulary_SCS_SOFTWARE_VERSION) - -prop_type_SEQUENCER = tr.createNewPropertyType('SEQUENCER', DataType.CONTROLLEDVOCABULARY) -prop_type_SEQUENCER.setLabel('Sequencer') -prop_type_SEQUENCER.setManagedInternally(False) -prop_type_SEQUENCER.setInternalNamespace(False) - -prop_type_SEQUENCER.setVocabulary(vocabulary_SEQUENCER) - -prop_type_SEQUENCER_FINISHED = tr.createNewPropertyType('SEQUENCER_FINISHED', DataType.TIMESTAMP) -prop_type_SEQUENCER_FINISHED.setLabel('Sequencer finished') -prop_type_SEQUENCER_FINISHED.setManagedInternally(False) -prop_type_SEQUENCER_FINISHED.setInternalNamespace(False) - - -prop_type_SEQUENCING_APPLICATION = tr.createNewPropertyType('SEQUENCING_APPLICATION', DataType.CONTROLLEDVOCABULARY) -prop_type_SEQUENCING_APPLICATION.setLabel('Sequencing Application') -prop_type_SEQUENCING_APPLICATION.setManagedInternally(False) -prop_type_SEQUENCING_APPLICATION.setInternalNamespace(False) - -prop_type_SEQUENCING_APPLICATION.setVocabulary(vocabulary_SEQUENCING_APPLICATION) - -prop_type_STARTING_AMOUNT_OF_SAMPLE_IN_NG = tr.createNewPropertyType('STARTING_AMOUNT_OF_SAMPLE_IN_NG', DataType.REAL) -prop_type_STARTING_AMOUNT_OF_SAMPLE_IN_NG.setLabel('Starting amount of sample (ng)') -prop_type_STARTING_AMOUNT_OF_SAMPLE_IN_NG.setManagedInternally(False) -prop_type_STARTING_AMOUNT_OF_SAMPLE_IN_NG.setInternalNamespace(False) - - -prop_type_STD = tr.createNewPropertyType('STD', DataType.REAL) -prop_type_STD.setLabel('Standard deviation') -prop_type_STD.setManagedInternally(False) -prop_type_STD.setInternalNamespace(False) - - -prop_type_SURFACECOUNT = tr.createNewPropertyType('SURFACECOUNT', DataType.INTEGER) -prop_type_SURFACECOUNT.setLabel('Surface Count') -prop_type_SURFACECOUNT.setManagedInternally(False) -prop_type_SURFACECOUNT.setInternalNamespace(False) - - -prop_type_SWATHCOUNT = tr.createNewPropertyType('SWATHCOUNT', DataType.INTEGER) -prop_type_SWATHCOUNT.setLabel('Swath Count') -prop_type_SWATHCOUNT.setManagedInternally(False) -prop_type_SWATHCOUNT.setInternalNamespace(False) - - -prop_type_TILECOUNT = tr.createNewPropertyType('TILECOUNT', DataType.INTEGER) -prop_type_TILECOUNT.setLabel('Tile Count') -prop_type_TILECOUNT.setManagedInternally(False) -prop_type_TILECOUNT.setInternalNamespace(False) - - -prop_type_TOTAL_READS = tr.createNewPropertyType('TOTAL_READS', DataType.INTEGER) -prop_type_TOTAL_READS.setLabel('Total reads') -prop_type_TOTAL_READS.setManagedInternally(False) -prop_type_TOTAL_READS.setInternalNamespace(False) - - -prop_type_TRANSFER_METHOD = tr.createNewPropertyType('TRANSFER_METHOD', DataType.CONTROLLEDVOCABULARY) -prop_type_TRANSFER_METHOD.setLabel('Data transfer method') -prop_type_TRANSFER_METHOD.setManagedInternally(False) -prop_type_TRANSFER_METHOD.setInternalNamespace(False) - -prop_type_TRANSFER_METHOD.setVocabulary(vocabulary_TRANSFER_METHOD) - -prop_type_UL_DNA = tr.createNewPropertyType('UL_DNA', DataType.REAL) -prop_type_UL_DNA.setLabel('Calculated ul DNA for 2nM stock') -prop_type_UL_DNA.setManagedInternally(False) -prop_type_UL_DNA.setInternalNamespace(False) - - -prop_type_UL_EB = tr.createNewPropertyType('UL_EB', DataType.REAL) -prop_type_UL_EB.setLabel('Calculated ul EB for 2nM stock ') -prop_type_UL_EB.setManagedInternally(False) -prop_type_UL_EB.setInternalNamespace(False) - - -prop_type_UL_STOCK = tr.createNewPropertyType('UL_STOCK', DataType.INTEGER) -prop_type_UL_STOCK.setLabel('ul of 2nM stock') -prop_type_UL_STOCK.setManagedInternally(False) -prop_type_UL_STOCK.setInternalNamespace(False) - - -prop_type_VERSION = tr.createNewPropertyType('VERSION', DataType.VARCHAR) -prop_type_VERSION.setLabel('Version') -prop_type_VERSION.setManagedInternally(False) -prop_type_VERSION.setInternalNamespace(False) - - -prop_type_YIELD_MBASES = tr.createNewPropertyType('YIELD_MBASES', DataType.INTEGER) -prop_type_YIELD_MBASES.setLabel('Yield(Mbases)') -prop_type_YIELD_MBASES.setManagedInternally(False) -prop_type_YIELD_MBASES.setInternalNamespace(False) - - -prop_type_ZOOMLEVELS = tr.createNewPropertyType('ZOOMLEVELS', DataType.INTEGER) -prop_type_ZOOMLEVELS.setLabel('zoom Levels') -prop_type_ZOOMLEVELS.setManagedInternally(False) -prop_type_ZOOMLEVELS.setInternalNamespace(False) - - -assignment_DATA_SET_ALIGNMENT_ALIGNMENT_SOFTWARE = tr.assignPropertyType(data_set_type_ALIGNMENT, prop_type_ALIGNMENT_SOFTWARE) -assignment_DATA_SET_ALIGNMENT_ALIGNMENT_SOFTWARE.setMandatory(False) -assignment_DATA_SET_ALIGNMENT_ALIGNMENT_SOFTWARE.setSection(None) -assignment_DATA_SET_ALIGNMENT_ALIGNMENT_SOFTWARE.setPositionInForms(1) - -assignment_DATA_SET_ALIGNMENT_VERSION = tr.assignPropertyType(data_set_type_ALIGNMENT, prop_type_VERSION) -assignment_DATA_SET_ALIGNMENT_VERSION.setMandatory(False) -assignment_DATA_SET_ALIGNMENT_VERSION.setSection(None) -assignment_DATA_SET_ALIGNMENT_VERSION.setPositionInForms(2) - -assignment_DATA_SET_ALIGNMENT_NOTES = tr.assignPropertyType(data_set_type_ALIGNMENT, prop_type_NOTES) -assignment_DATA_SET_ALIGNMENT_NOTES.setMandatory(False) -assignment_DATA_SET_ALIGNMENT_NOTES.setSection(None) -assignment_DATA_SET_ALIGNMENT_NOTES.setPositionInForms(3) - -assignment_DATA_SET_ALIGNMENT_SAMTOOLS_FLAGSTAT = tr.assignPropertyType(data_set_type_ALIGNMENT, prop_type_SAMTOOLS_FLAGSTAT) -assignment_DATA_SET_ALIGNMENT_SAMTOOLS_FLAGSTAT.setMandatory(False) -assignment_DATA_SET_ALIGNMENT_SAMTOOLS_FLAGSTAT.setSection(None) -assignment_DATA_SET_ALIGNMENT_SAMTOOLS_FLAGSTAT.setPositionInForms(4) - -assignment_DATA_SET_ALIGNMENT_MAPPED_READS = tr.assignPropertyType(data_set_type_ALIGNMENT, prop_type_MAPPED_READS) -assignment_DATA_SET_ALIGNMENT_MAPPED_READS.setMandatory(False) -assignment_DATA_SET_ALIGNMENT_MAPPED_READS.setSection(None) -assignment_DATA_SET_ALIGNMENT_MAPPED_READS.setPositionInForms(5) - -assignment_DATA_SET_ALIGNMENT_TOTAL_READS = tr.assignPropertyType(data_set_type_ALIGNMENT, prop_type_TOTAL_READS) -assignment_DATA_SET_ALIGNMENT_TOTAL_READS.setMandatory(False) -assignment_DATA_SET_ALIGNMENT_TOTAL_READS.setSection(None) -assignment_DATA_SET_ALIGNMENT_TOTAL_READS.setPositionInForms(6) - -assignment_DATA_SET_ALIGNMENT_ISSUED_COMMAND = tr.assignPropertyType(data_set_type_ALIGNMENT, prop_type_ISSUED_COMMAND) -assignment_DATA_SET_ALIGNMENT_ISSUED_COMMAND.setMandatory(False) -assignment_DATA_SET_ALIGNMENT_ISSUED_COMMAND.setSection(None) -assignment_DATA_SET_ALIGNMENT_ISSUED_COMMAND.setPositionInForms(7) - -assignment_DATA_SET_BASECALL_STATS_MISMATCH_IN_INDEX = tr.assignPropertyType(data_set_type_BASECALL_STATS, prop_type_MISMATCH_IN_INDEX) -assignment_DATA_SET_BASECALL_STATS_MISMATCH_IN_INDEX.setMandatory(False) -assignment_DATA_SET_BASECALL_STATS_MISMATCH_IN_INDEX.setSection(None) -assignment_DATA_SET_BASECALL_STATS_MISMATCH_IN_INDEX.setPositionInForms(1) - -assignment_DATA_SET_BIGWIGGLE_NOTES = tr.assignPropertyType(data_set_type_BIGWIGGLE, prop_type_NOTES) -assignment_DATA_SET_BIGWIGGLE_NOTES.setMandatory(False) -assignment_DATA_SET_BIGWIGGLE_NOTES.setSection(None) -assignment_DATA_SET_BIGWIGGLE_NOTES.setPositionInForms(1) - -assignment_DATA_SET_BIGWIGGLE_VERSION = tr.assignPropertyType(data_set_type_BIGWIGGLE, prop_type_VERSION) -assignment_DATA_SET_BIGWIGGLE_VERSION.setMandatory(False) -assignment_DATA_SET_BIGWIGGLE_VERSION.setSection(None) -assignment_DATA_SET_BIGWIGGLE_VERSION.setPositionInForms(2) - -assignment_DATA_SET_BIGWIGGLE_ISCOMPRESSED = tr.assignPropertyType(data_set_type_BIGWIGGLE, prop_type_ISCOMPRESSED) -assignment_DATA_SET_BIGWIGGLE_ISCOMPRESSED.setMandatory(False) -assignment_DATA_SET_BIGWIGGLE_ISCOMPRESSED.setSection(None) -assignment_DATA_SET_BIGWIGGLE_ISCOMPRESSED.setPositionInForms(3) - -assignment_DATA_SET_BIGWIGGLE_ISSWAPPED = tr.assignPropertyType(data_set_type_BIGWIGGLE, prop_type_ISSWAPPED) -assignment_DATA_SET_BIGWIGGLE_ISSWAPPED.setMandatory(False) -assignment_DATA_SET_BIGWIGGLE_ISSWAPPED.setSection(None) -assignment_DATA_SET_BIGWIGGLE_ISSWAPPED.setPositionInForms(4) - -assignment_DATA_SET_BIGWIGGLE_PRIMARYDATASIZE = tr.assignPropertyType(data_set_type_BIGWIGGLE, prop_type_PRIMARYDATASIZE) -assignment_DATA_SET_BIGWIGGLE_PRIMARYDATASIZE.setMandatory(False) -assignment_DATA_SET_BIGWIGGLE_PRIMARYDATASIZE.setSection(None) -assignment_DATA_SET_BIGWIGGLE_PRIMARYDATASIZE.setPositionInForms(5) - -assignment_DATA_SET_BIGWIGGLE_PRIMARYINDEXSIZE = tr.assignPropertyType(data_set_type_BIGWIGGLE, prop_type_PRIMARYINDEXSIZE) -assignment_DATA_SET_BIGWIGGLE_PRIMARYINDEXSIZE.setMandatory(False) -assignment_DATA_SET_BIGWIGGLE_PRIMARYINDEXSIZE.setSection(None) -assignment_DATA_SET_BIGWIGGLE_PRIMARYINDEXSIZE.setPositionInForms(6) - -assignment_DATA_SET_BIGWIGGLE_ZOOMLEVELS = tr.assignPropertyType(data_set_type_BIGWIGGLE, prop_type_ZOOMLEVELS) -assignment_DATA_SET_BIGWIGGLE_ZOOMLEVELS.setMandatory(False) -assignment_DATA_SET_BIGWIGGLE_ZOOMLEVELS.setSection(None) -assignment_DATA_SET_BIGWIGGLE_ZOOMLEVELS.setPositionInForms(7) - -assignment_DATA_SET_BIGWIGGLE_CHROMCOUNT = tr.assignPropertyType(data_set_type_BIGWIGGLE, prop_type_CHROMCOUNT) -assignment_DATA_SET_BIGWIGGLE_CHROMCOUNT.setMandatory(False) -assignment_DATA_SET_BIGWIGGLE_CHROMCOUNT.setSection(None) -assignment_DATA_SET_BIGWIGGLE_CHROMCOUNT.setPositionInForms(8) - -assignment_DATA_SET_BIGWIGGLE_BASESCOVERED = tr.assignPropertyType(data_set_type_BIGWIGGLE, prop_type_BASESCOVERED) -assignment_DATA_SET_BIGWIGGLE_BASESCOVERED.setMandatory(False) -assignment_DATA_SET_BIGWIGGLE_BASESCOVERED.setSection(None) -assignment_DATA_SET_BIGWIGGLE_BASESCOVERED.setPositionInForms(9) - -assignment_DATA_SET_BIGWIGGLE_MEAN = tr.assignPropertyType(data_set_type_BIGWIGGLE, prop_type_MEAN) -assignment_DATA_SET_BIGWIGGLE_MEAN.setMandatory(False) -assignment_DATA_SET_BIGWIGGLE_MEAN.setSection(None) -assignment_DATA_SET_BIGWIGGLE_MEAN.setPositionInForms(10) - -assignment_DATA_SET_BIGWIGGLE_MIN = tr.assignPropertyType(data_set_type_BIGWIGGLE, prop_type_MIN) -assignment_DATA_SET_BIGWIGGLE_MIN.setMandatory(False) -assignment_DATA_SET_BIGWIGGLE_MIN.setSection(None) -assignment_DATA_SET_BIGWIGGLE_MIN.setPositionInForms(11) - -assignment_DATA_SET_BIGWIGGLE_MAX = tr.assignPropertyType(data_set_type_BIGWIGGLE, prop_type_MAX) -assignment_DATA_SET_BIGWIGGLE_MAX.setMandatory(False) -assignment_DATA_SET_BIGWIGGLE_MAX.setSection(None) -assignment_DATA_SET_BIGWIGGLE_MAX.setPositionInForms(12) - -assignment_DATA_SET_BIGWIGGLE_STD = tr.assignPropertyType(data_set_type_BIGWIGGLE, prop_type_STD) -assignment_DATA_SET_BIGWIGGLE_STD.setMandatory(False) -assignment_DATA_SET_BIGWIGGLE_STD.setSection(None) -assignment_DATA_SET_BIGWIGGLE_STD.setPositionInForms(13) - -assignment_DATA_SET_FASTQ_GZ_NOTES = tr.assignPropertyType(data_set_type_FASTQ_GZ, prop_type_NOTES) -assignment_DATA_SET_FASTQ_GZ_NOTES.setMandatory(False) -assignment_DATA_SET_FASTQ_GZ_NOTES.setSection(None) -assignment_DATA_SET_FASTQ_GZ_NOTES.setPositionInForms(1) - -assignment_DATA_SET_FASTQ_GZ_YIELD_MBASES = tr.assignPropertyType(data_set_type_FASTQ_GZ, prop_type_YIELD_MBASES) -assignment_DATA_SET_FASTQ_GZ_YIELD_MBASES.setMandatory(False) -assignment_DATA_SET_FASTQ_GZ_YIELD_MBASES.setSection(None) -assignment_DATA_SET_FASTQ_GZ_YIELD_MBASES.setPositionInForms(2) - -assignment_DATA_SET_FASTQ_GZ_PERCENTAGE_PASSED_FILTERING = tr.assignPropertyType(data_set_type_FASTQ_GZ, prop_type_PERCENTAGE_PASSED_FILTERING) -assignment_DATA_SET_FASTQ_GZ_PERCENTAGE_PASSED_FILTERING.setMandatory(False) -assignment_DATA_SET_FASTQ_GZ_PERCENTAGE_PASSED_FILTERING.setSection(None) -assignment_DATA_SET_FASTQ_GZ_PERCENTAGE_PASSED_FILTERING.setPositionInForms(3) - -assignment_DATA_SET_FASTQ_GZ_BARCODE = tr.assignPropertyType(data_set_type_FASTQ_GZ, prop_type_BARCODE) -assignment_DATA_SET_FASTQ_GZ_BARCODE.setMandatory(False) -assignment_DATA_SET_FASTQ_GZ_BARCODE.setSection(None) -assignment_DATA_SET_FASTQ_GZ_BARCODE.setPositionInForms(4) - -assignment_DATA_SET_FASTQ_GZ_PERCENTAGE_RAW_CLUSTERS_PER_LANE = tr.assignPropertyType(data_set_type_FASTQ_GZ, prop_type_PERCENTAGE_RAW_CLUSTERS_PER_LANE) -assignment_DATA_SET_FASTQ_GZ_PERCENTAGE_RAW_CLUSTERS_PER_LANE.setMandatory(False) -assignment_DATA_SET_FASTQ_GZ_PERCENTAGE_RAW_CLUSTERS_PER_LANE.setSection(None) -assignment_DATA_SET_FASTQ_GZ_PERCENTAGE_RAW_CLUSTERS_PER_LANE.setPositionInForms(5) - -assignment_DATA_SET_FASTQ_GZ_PERCENTAGE_PERFECT_INDEX_READS = tr.assignPropertyType(data_set_type_FASTQ_GZ, prop_type_PERCENTAGE_PERFECT_INDEX_READS) -assignment_DATA_SET_FASTQ_GZ_PERCENTAGE_PERFECT_INDEX_READS.setMandatory(False) -assignment_DATA_SET_FASTQ_GZ_PERCENTAGE_PERFECT_INDEX_READS.setSection(None) -assignment_DATA_SET_FASTQ_GZ_PERCENTAGE_PERFECT_INDEX_READS.setPositionInForms(6) - -assignment_DATA_SET_FASTQ_GZ_PERCENTAGE_ONE_MISMATCH_READS_INDEX = tr.assignPropertyType(data_set_type_FASTQ_GZ, prop_type_PERCENTAGE_ONE_MISMATCH_READS_INDEX) -assignment_DATA_SET_FASTQ_GZ_PERCENTAGE_ONE_MISMATCH_READS_INDEX.setMandatory(False) -assignment_DATA_SET_FASTQ_GZ_PERCENTAGE_ONE_MISMATCH_READS_INDEX.setSection(None) -assignment_DATA_SET_FASTQ_GZ_PERCENTAGE_ONE_MISMATCH_READS_INDEX.setPositionInForms(7) - -assignment_EXPERIMENT_HT_SEQUENCING_EXPERIMENT_DESIGN = tr.assignPropertyType(exp_type_HT_SEQUENCING, prop_type_EXPERIMENT_DESIGN) -assignment_EXPERIMENT_HT_SEQUENCING_EXPERIMENT_DESIGN.setMandatory(False) -assignment_EXPERIMENT_HT_SEQUENCING_EXPERIMENT_DESIGN.setSection(None) -assignment_EXPERIMENT_HT_SEQUENCING_EXPERIMENT_DESIGN.setPositionInForms(1) - -assignment_SAMPLE_ILLUMINA_FLOW_CELL_SEQUENCER = tr.assignPropertyType(samp_type_ILLUMINA_FLOW_CELL, prop_type_SEQUENCER) -assignment_SAMPLE_ILLUMINA_FLOW_CELL_SEQUENCER.setMandatory(False) -assignment_SAMPLE_ILLUMINA_FLOW_CELL_SEQUENCER.setSection(None) -assignment_SAMPLE_ILLUMINA_FLOW_CELL_SEQUENCER.setPositionInForms(2) - -assignment_SAMPLE_ILLUMINA_FLOW_CELL_END_TYPE = tr.assignPropertyType(samp_type_ILLUMINA_FLOW_CELL, prop_type_END_TYPE) -assignment_SAMPLE_ILLUMINA_FLOW_CELL_END_TYPE.setMandatory(False) -assignment_SAMPLE_ILLUMINA_FLOW_CELL_END_TYPE.setSection(None) -assignment_SAMPLE_ILLUMINA_FLOW_CELL_END_TYPE.setPositionInForms(4) - -assignment_SAMPLE_ILLUMINA_FLOW_CELL_FLOW_CELL_SEQUENCED_ON = tr.assignPropertyType(samp_type_ILLUMINA_FLOW_CELL, prop_type_FLOW_CELL_SEQUENCED_ON) -assignment_SAMPLE_ILLUMINA_FLOW_CELL_FLOW_CELL_SEQUENCED_ON.setMandatory(False) -assignment_SAMPLE_ILLUMINA_FLOW_CELL_FLOW_CELL_SEQUENCED_ON.setSection(None) -assignment_SAMPLE_ILLUMINA_FLOW_CELL_FLOW_CELL_SEQUENCED_ON.setPositionInForms(5) - -assignment_SAMPLE_ILLUMINA_FLOW_CELL_SEQUENCER_FINISHED = tr.assignPropertyType(samp_type_ILLUMINA_FLOW_CELL, prop_type_SEQUENCER_FINISHED) -assignment_SAMPLE_ILLUMINA_FLOW_CELL_SEQUENCER_FINISHED.setMandatory(False) -assignment_SAMPLE_ILLUMINA_FLOW_CELL_SEQUENCER_FINISHED.setSection(None) -assignment_SAMPLE_ILLUMINA_FLOW_CELL_SEQUENCER_FINISHED.setPositionInForms(6) - -assignment_SAMPLE_ILLUMINA_FLOW_CELL_ILLUMINA_PIPELINE_VERSION = tr.assignPropertyType(samp_type_ILLUMINA_FLOW_CELL, prop_type_ILLUMINA_PIPELINE_VERSION) -assignment_SAMPLE_ILLUMINA_FLOW_CELL_ILLUMINA_PIPELINE_VERSION.setMandatory(False) -assignment_SAMPLE_ILLUMINA_FLOW_CELL_ILLUMINA_PIPELINE_VERSION.setSection(None) -assignment_SAMPLE_ILLUMINA_FLOW_CELL_ILLUMINA_PIPELINE_VERSION.setPositionInForms(7) - -assignment_SAMPLE_ILLUMINA_FLOW_CELL_CYCLES_REQUESTED_BY_CUSTOMER = tr.assignPropertyType(samp_type_ILLUMINA_FLOW_CELL, prop_type_CYCLES_REQUESTED_BY_CUSTOMER) -assignment_SAMPLE_ILLUMINA_FLOW_CELL_CYCLES_REQUESTED_BY_CUSTOMER.setMandatory(False) -assignment_SAMPLE_ILLUMINA_FLOW_CELL_CYCLES_REQUESTED_BY_CUSTOMER.setSection(None) -assignment_SAMPLE_ILLUMINA_FLOW_CELL_CYCLES_REQUESTED_BY_CUSTOMER.setPositionInForms(8) - -assignment_SAMPLE_ILLUMINA_FLOW_CELL_INDEXREAD = tr.assignPropertyType(samp_type_ILLUMINA_FLOW_CELL, prop_type_INDEXREAD) -assignment_SAMPLE_ILLUMINA_FLOW_CELL_INDEXREAD.setMandatory(False) -assignment_SAMPLE_ILLUMINA_FLOW_CELL_INDEXREAD.setSection(None) -assignment_SAMPLE_ILLUMINA_FLOW_CELL_INDEXREAD.setPositionInForms(9) - -assignment_SAMPLE_ILLUMINA_FLOW_CELL_CONTROL_LANE = tr.assignPropertyType(samp_type_ILLUMINA_FLOW_CELL, prop_type_CONTROL_LANE) -assignment_SAMPLE_ILLUMINA_FLOW_CELL_CONTROL_LANE.setMandatory(False) -assignment_SAMPLE_ILLUMINA_FLOW_CELL_CONTROL_LANE.setSection(None) -assignment_SAMPLE_ILLUMINA_FLOW_CELL_CONTROL_LANE.setPositionInForms(10) - -assignment_SAMPLE_ILLUMINA_FLOW_CELL_FLOWCELLTYPE = tr.assignPropertyType(samp_type_ILLUMINA_FLOW_CELL, prop_type_FLOWCELLTYPE) -assignment_SAMPLE_ILLUMINA_FLOW_CELL_FLOWCELLTYPE.setMandatory(False) -assignment_SAMPLE_ILLUMINA_FLOW_CELL_FLOWCELLTYPE.setSection(None) -assignment_SAMPLE_ILLUMINA_FLOW_CELL_FLOWCELLTYPE.setPositionInForms(11) - -assignment_SAMPLE_ILLUMINA_FLOW_CELL_LANECOUNT = tr.assignPropertyType(samp_type_ILLUMINA_FLOW_CELL, prop_type_LANECOUNT) -assignment_SAMPLE_ILLUMINA_FLOW_CELL_LANECOUNT.setMandatory(False) -assignment_SAMPLE_ILLUMINA_FLOW_CELL_LANECOUNT.setSection(None) -assignment_SAMPLE_ILLUMINA_FLOW_CELL_LANECOUNT.setPositionInForms(12) - -assignment_SAMPLE_ILLUMINA_FLOW_CELL_SURFACECOUNT = tr.assignPropertyType(samp_type_ILLUMINA_FLOW_CELL, prop_type_SURFACECOUNT) -assignment_SAMPLE_ILLUMINA_FLOW_CELL_SURFACECOUNT.setMandatory(False) -assignment_SAMPLE_ILLUMINA_FLOW_CELL_SURFACECOUNT.setSection(None) -assignment_SAMPLE_ILLUMINA_FLOW_CELL_SURFACECOUNT.setPositionInForms(13) - -assignment_SAMPLE_ILLUMINA_FLOW_CELL_SWATHCOUNT = tr.assignPropertyType(samp_type_ILLUMINA_FLOW_CELL, prop_type_SWATHCOUNT) -assignment_SAMPLE_ILLUMINA_FLOW_CELL_SWATHCOUNT.setMandatory(False) -assignment_SAMPLE_ILLUMINA_FLOW_CELL_SWATHCOUNT.setSection(None) -assignment_SAMPLE_ILLUMINA_FLOW_CELL_SWATHCOUNT.setPositionInForms(14) - -assignment_SAMPLE_ILLUMINA_FLOW_CELL_TILECOUNT = tr.assignPropertyType(samp_type_ILLUMINA_FLOW_CELL, prop_type_TILECOUNT) -assignment_SAMPLE_ILLUMINA_FLOW_CELL_TILECOUNT.setMandatory(False) -assignment_SAMPLE_ILLUMINA_FLOW_CELL_TILECOUNT.setSection(None) -assignment_SAMPLE_ILLUMINA_FLOW_CELL_TILECOUNT.setPositionInForms(15) - -assignment_SAMPLE_ILLUMINA_FLOW_CELL_SBS_KIT = tr.assignPropertyType(samp_type_ILLUMINA_FLOW_CELL, prop_type_SBS_KIT) -assignment_SAMPLE_ILLUMINA_FLOW_CELL_SBS_KIT.setMandatory(False) -assignment_SAMPLE_ILLUMINA_FLOW_CELL_SBS_KIT.setSection(None) -assignment_SAMPLE_ILLUMINA_FLOW_CELL_SBS_KIT.setPositionInForms(16) - -assignment_SAMPLE_ILLUMINA_FLOW_CELL_PAIRED_END_KIT = tr.assignPropertyType(samp_type_ILLUMINA_FLOW_CELL, prop_type_PAIRED_END_KIT) -assignment_SAMPLE_ILLUMINA_FLOW_CELL_PAIRED_END_KIT.setMandatory(False) -assignment_SAMPLE_ILLUMINA_FLOW_CELL_PAIRED_END_KIT.setSection(None) -assignment_SAMPLE_ILLUMINA_FLOW_CELL_PAIRED_END_KIT.setPositionInForms(17) - -assignment_SAMPLE_ILLUMINA_FLOW_CELL_ANALYSIS_FINISHED = tr.assignPropertyType(samp_type_ILLUMINA_FLOW_CELL, prop_type_ANALYSIS_FINISHED) -assignment_SAMPLE_ILLUMINA_FLOW_CELL_ANALYSIS_FINISHED.setMandatory(False) -assignment_SAMPLE_ILLUMINA_FLOW_CELL_ANALYSIS_FINISHED.setSection(None) -assignment_SAMPLE_ILLUMINA_FLOW_CELL_ANALYSIS_FINISHED.setPositionInForms(19) - -assignment_SAMPLE_ILLUMINA_FLOW_CELL_NOTES = tr.assignPropertyType(samp_type_ILLUMINA_FLOW_CELL, prop_type_NOTES) -assignment_SAMPLE_ILLUMINA_FLOW_CELL_NOTES.setMandatory(False) -assignment_SAMPLE_ILLUMINA_FLOW_CELL_NOTES.setSection(None) -assignment_SAMPLE_ILLUMINA_FLOW_CELL_NOTES.setPositionInForms(20) - -assignment_SAMPLE_ILLUMINA_FLOW_LANE_DATA_TRANSFERRED = tr.assignPropertyType(samp_type_ILLUMINA_FLOW_LANE, prop_type_DATA_TRANSFERRED) -assignment_SAMPLE_ILLUMINA_FLOW_LANE_DATA_TRANSFERRED.setMandatory(False) -assignment_SAMPLE_ILLUMINA_FLOW_LANE_DATA_TRANSFERRED.setSection(None) -assignment_SAMPLE_ILLUMINA_FLOW_LANE_DATA_TRANSFERRED.setPositionInForms(1) - -assignment_SAMPLE_ILLUMINA_FLOW_LANE_NOTES = tr.assignPropertyType(samp_type_ILLUMINA_FLOW_LANE, prop_type_NOTES) -assignment_SAMPLE_ILLUMINA_FLOW_LANE_NOTES.setMandatory(False) -assignment_SAMPLE_ILLUMINA_FLOW_LANE_NOTES.setSection(None) -assignment_SAMPLE_ILLUMINA_FLOW_LANE_NOTES.setPositionInForms(4) - -assignment_DATA_SET_ILLUMINA_GA_OUTPUT_SAMPLE_KIND = tr.assignPropertyType(data_set_type_ILLUMINA_GA_OUTPUT, prop_type_SAMPLE_KIND) -assignment_DATA_SET_ILLUMINA_GA_OUTPUT_SAMPLE_KIND.setMandatory(False) -assignment_DATA_SET_ILLUMINA_GA_OUTPUT_SAMPLE_KIND.setSection(None) -assignment_DATA_SET_ILLUMINA_GA_OUTPUT_SAMPLE_KIND.setPositionInForms(1) - -assignment_DATA_SET_ILLUMINA_HISEQ_OUTPUT_CASAVA_VERSION = tr.assignPropertyType(data_set_type_ILLUMINA_HISEQ_OUTPUT, prop_type_CASAVA_VERSION) -assignment_DATA_SET_ILLUMINA_HISEQ_OUTPUT_CASAVA_VERSION.setMandatory(False) -assignment_DATA_SET_ILLUMINA_HISEQ_OUTPUT_CASAVA_VERSION.setSection(None) -assignment_DATA_SET_ILLUMINA_HISEQ_OUTPUT_CASAVA_VERSION.setPositionInForms(1) - -assignment_SAMPLE_ILLUMINA_SEQUENCING_AFFILIATION = tr.assignPropertyType(samp_type_ILLUMINA_SEQUENCING, prop_type_AFFILIATION) -assignment_SAMPLE_ILLUMINA_SEQUENCING_AFFILIATION.setMandatory(True) -assignment_SAMPLE_ILLUMINA_SEQUENCING_AFFILIATION.setSection('Contact') -assignment_SAMPLE_ILLUMINA_SEQUENCING_AFFILIATION.setPositionInForms(9) - -assignment_SAMPLE_ILLUMINA_SEQUENCING_CONTACT_PERSON_NAME = tr.assignPropertyType(samp_type_ILLUMINA_SEQUENCING, prop_type_CONTACT_PERSON_NAME) -assignment_SAMPLE_ILLUMINA_SEQUENCING_CONTACT_PERSON_NAME.setMandatory(True) -assignment_SAMPLE_ILLUMINA_SEQUENCING_CONTACT_PERSON_NAME.setSection('Contact') -assignment_SAMPLE_ILLUMINA_SEQUENCING_CONTACT_PERSON_NAME.setPositionInForms(10) - -assignment_SAMPLE_ILLUMINA_SEQUENCING_CONTACT_PERSON_EMAIL = tr.assignPropertyType(samp_type_ILLUMINA_SEQUENCING, prop_type_CONTACT_PERSON_EMAIL) -assignment_SAMPLE_ILLUMINA_SEQUENCING_CONTACT_PERSON_EMAIL.setMandatory(True) -assignment_SAMPLE_ILLUMINA_SEQUENCING_CONTACT_PERSON_EMAIL.setSection('Contact') -assignment_SAMPLE_ILLUMINA_SEQUENCING_CONTACT_PERSON_EMAIL.setPositionInForms(11) - -assignment_SAMPLE_ILLUMINA_SEQUENCING_PRINCIPAL_INVESTIGATOR_NAME = tr.assignPropertyType(samp_type_ILLUMINA_SEQUENCING, prop_type_PRINCIPAL_INVESTIGATOR_NAME) -assignment_SAMPLE_ILLUMINA_SEQUENCING_PRINCIPAL_INVESTIGATOR_NAME.setMandatory(True) -assignment_SAMPLE_ILLUMINA_SEQUENCING_PRINCIPAL_INVESTIGATOR_NAME.setSection('Contact') -assignment_SAMPLE_ILLUMINA_SEQUENCING_PRINCIPAL_INVESTIGATOR_NAME.setPositionInForms(12) - -assignment_SAMPLE_ILLUMINA_SEQUENCING_PRINCIPAL_INVESTIGATOR_EMAIL = tr.assignPropertyType(samp_type_ILLUMINA_SEQUENCING, prop_type_PRINCIPAL_INVESTIGATOR_EMAIL) -assignment_SAMPLE_ILLUMINA_SEQUENCING_PRINCIPAL_INVESTIGATOR_EMAIL.setMandatory(True) -assignment_SAMPLE_ILLUMINA_SEQUENCING_PRINCIPAL_INVESTIGATOR_EMAIL.setSection('Contact') -assignment_SAMPLE_ILLUMINA_SEQUENCING_PRINCIPAL_INVESTIGATOR_EMAIL.setPositionInForms(13) - -assignment_SAMPLE_ILLUMINA_SEQUENCING_EXTERNAL_SAMPLE_NAME = tr.assignPropertyType(samp_type_ILLUMINA_SEQUENCING, prop_type_EXTERNAL_SAMPLE_NAME) -assignment_SAMPLE_ILLUMINA_SEQUENCING_EXTERNAL_SAMPLE_NAME.setMandatory(True) -assignment_SAMPLE_ILLUMINA_SEQUENCING_EXTERNAL_SAMPLE_NAME.setSection('Sample Data') -assignment_SAMPLE_ILLUMINA_SEQUENCING_EXTERNAL_SAMPLE_NAME.setPositionInForms(25) - -assignment_SAMPLE_ILLUMINA_SEQUENCING_SAMPLE_KIND = tr.assignPropertyType(samp_type_ILLUMINA_SEQUENCING, prop_type_SAMPLE_KIND) -assignment_SAMPLE_ILLUMINA_SEQUENCING_SAMPLE_KIND.setMandatory(True) -assignment_SAMPLE_ILLUMINA_SEQUENCING_SAMPLE_KIND.setSection('Sample Data') -assignment_SAMPLE_ILLUMINA_SEQUENCING_SAMPLE_KIND.setPositionInForms(27) - -assignment_SAMPLE_ILLUMINA_SEQUENCING_SEQUENCING_APPLICATION = tr.assignPropertyType(samp_type_ILLUMINA_SEQUENCING, prop_type_SEQUENCING_APPLICATION) -assignment_SAMPLE_ILLUMINA_SEQUENCING_SEQUENCING_APPLICATION.setMandatory(True) -assignment_SAMPLE_ILLUMINA_SEQUENCING_SEQUENCING_APPLICATION.setSection('Sample Data') -assignment_SAMPLE_ILLUMINA_SEQUENCING_SEQUENCING_APPLICATION.setPositionInForms(28) - -assignment_SAMPLE_ILLUMINA_SEQUENCING_CONCENTRATION_ORIGINAL_ILLUMINA = tr.assignPropertyType(samp_type_ILLUMINA_SEQUENCING, prop_type_CONCENTRATION_ORIGINAL_ILLUMINA) -assignment_SAMPLE_ILLUMINA_SEQUENCING_CONCENTRATION_ORIGINAL_ILLUMINA.setMandatory(False) -assignment_SAMPLE_ILLUMINA_SEQUENCING_CONCENTRATION_ORIGINAL_ILLUMINA.setSection('Sample Data') -assignment_SAMPLE_ILLUMINA_SEQUENCING_CONCENTRATION_ORIGINAL_ILLUMINA.setPositionInForms(32) - -assignment_SAMPLE_ILLUMINA_SEQUENCING_CONC_IF_SAMPLE_PROCESSED_DNA_LIBRARY = tr.assignPropertyType(samp_type_ILLUMINA_SEQUENCING, prop_type_CONC_IF_SAMPLE_PROCESSED_DNA_LIBRARY) -assignment_SAMPLE_ILLUMINA_SEQUENCING_CONC_IF_SAMPLE_PROCESSED_DNA_LIBRARY.setMandatory(False) -assignment_SAMPLE_ILLUMINA_SEQUENCING_CONC_IF_SAMPLE_PROCESSED_DNA_LIBRARY.setSection('Sample Data') -assignment_SAMPLE_ILLUMINA_SEQUENCING_CONC_IF_SAMPLE_PROCESSED_DNA_LIBRARY.setPositionInForms(35) - -assignment_SAMPLE_ILLUMINA_SEQUENCING_NCBI_ORGANISM_TAXONOMY = tr.assignPropertyType(samp_type_ILLUMINA_SEQUENCING, prop_type_NCBI_ORGANISM_TAXONOMY) -assignment_SAMPLE_ILLUMINA_SEQUENCING_NCBI_ORGANISM_TAXONOMY.setMandatory(True) -assignment_SAMPLE_ILLUMINA_SEQUENCING_NCBI_ORGANISM_TAXONOMY.setSection('Sample Data') -assignment_SAMPLE_ILLUMINA_SEQUENCING_NCBI_ORGANISM_TAXONOMY.setPositionInForms(36) - -assignment_SAMPLE_ILLUMINA_SEQUENCING_ORGANISM_FREE = tr.assignPropertyType(samp_type_ILLUMINA_SEQUENCING, prop_type_ORGANISM_FREE) -assignment_SAMPLE_ILLUMINA_SEQUENCING_ORGANISM_FREE.setMandatory(False) -assignment_SAMPLE_ILLUMINA_SEQUENCING_ORGANISM_FREE.setSection('Sample Data') -assignment_SAMPLE_ILLUMINA_SEQUENCING_ORGANISM_FREE.setPositionInForms(40) - -assignment_SAMPLE_ILLUMINA_SEQUENCING_CELL_PLASTICITY_SYSTEMSX = tr.assignPropertyType(samp_type_ILLUMINA_SEQUENCING, prop_type_CELL_PLASTICITY_SYSTEMSX) -assignment_SAMPLE_ILLUMINA_SEQUENCING_CELL_PLASTICITY_SYSTEMSX.setMandatory(False) -assignment_SAMPLE_ILLUMINA_SEQUENCING_CELL_PLASTICITY_SYSTEMSX.setSection('Sample Data') -assignment_SAMPLE_ILLUMINA_SEQUENCING_CELL_PLASTICITY_SYSTEMSX.setPositionInForms(41) - -assignment_SAMPLE_ILLUMINA_SEQUENCING_SAMPLE_LIBRARY_STRATEGY = tr.assignPropertyType(samp_type_ILLUMINA_SEQUENCING, prop_type_SAMPLE_LIBRARY_STRATEGY) -assignment_SAMPLE_ILLUMINA_SEQUENCING_SAMPLE_LIBRARY_STRATEGY.setMandatory(False) -assignment_SAMPLE_ILLUMINA_SEQUENCING_SAMPLE_LIBRARY_STRATEGY.setSection('GEO compliant annotation') -assignment_SAMPLE_ILLUMINA_SEQUENCING_SAMPLE_LIBRARY_STRATEGY.setPositionInForms(48) - -assignment_SAMPLE_ILLUMINA_SEQUENCING_SAMPLE_SOURCE_NAME = tr.assignPropertyType(samp_type_ILLUMINA_SEQUENCING, prop_type_SAMPLE_SOURCE_NAME) -assignment_SAMPLE_ILLUMINA_SEQUENCING_SAMPLE_SOURCE_NAME.setMandatory(False) -assignment_SAMPLE_ILLUMINA_SEQUENCING_SAMPLE_SOURCE_NAME.setSection('GEO compliant annotation') -assignment_SAMPLE_ILLUMINA_SEQUENCING_SAMPLE_SOURCE_NAME.setPositionInForms(49) - -assignment_SAMPLE_ILLUMINA_SEQUENCING_SAMPLE_LIBRARY_SELECTION = tr.assignPropertyType(samp_type_ILLUMINA_SEQUENCING, prop_type_SAMPLE_LIBRARY_SELECTION) -assignment_SAMPLE_ILLUMINA_SEQUENCING_SAMPLE_LIBRARY_SELECTION.setMandatory(False) -assignment_SAMPLE_ILLUMINA_SEQUENCING_SAMPLE_LIBRARY_SELECTION.setSection('GEO compliant annotation') -assignment_SAMPLE_ILLUMINA_SEQUENCING_SAMPLE_LIBRARY_SELECTION.setPositionInForms(50) - -assignment_SAMPLE_ILLUMINA_SEQUENCING_SAMPLE_CHARACTERISTICS = tr.assignPropertyType(samp_type_ILLUMINA_SEQUENCING, prop_type_SAMPLE_CHARACTERISTICS) -assignment_SAMPLE_ILLUMINA_SEQUENCING_SAMPLE_CHARACTERISTICS.setMandatory(False) -assignment_SAMPLE_ILLUMINA_SEQUENCING_SAMPLE_CHARACTERISTICS.setSection('GEO compliant annotation') -assignment_SAMPLE_ILLUMINA_SEQUENCING_SAMPLE_CHARACTERISTICS.setPositionInForms(51) - -assignment_SAMPLE_ILLUMINA_SEQUENCING_SAMPLE_MOLECULE = tr.assignPropertyType(samp_type_ILLUMINA_SEQUENCING, prop_type_SAMPLE_MOLECULE) -assignment_SAMPLE_ILLUMINA_SEQUENCING_SAMPLE_MOLECULE.setMandatory(False) -assignment_SAMPLE_ILLUMINA_SEQUENCING_SAMPLE_MOLECULE.setSection('GEO compliant annotation') -assignment_SAMPLE_ILLUMINA_SEQUENCING_SAMPLE_MOLECULE.setPositionInForms(52) - -assignment_SAMPLE_ILLUMINA_SEQUENCING_SAMPLE_EXTRACT_PROTOCOL = tr.assignPropertyType(samp_type_ILLUMINA_SEQUENCING, prop_type_SAMPLE_EXTRACT_PROTOCOL) -assignment_SAMPLE_ILLUMINA_SEQUENCING_SAMPLE_EXTRACT_PROTOCOL.setMandatory(False) -assignment_SAMPLE_ILLUMINA_SEQUENCING_SAMPLE_EXTRACT_PROTOCOL.setSection('GEO compliant annotation') -assignment_SAMPLE_ILLUMINA_SEQUENCING_SAMPLE_EXTRACT_PROTOCOL.setPositionInForms(53) - -assignment_SAMPLE_ILLUMINA_SEQUENCING_SAMPLE_DATA_PROCESSING = tr.assignPropertyType(samp_type_ILLUMINA_SEQUENCING, prop_type_SAMPLE_DATA_PROCESSING) -assignment_SAMPLE_ILLUMINA_SEQUENCING_SAMPLE_DATA_PROCESSING.setMandatory(False) -assignment_SAMPLE_ILLUMINA_SEQUENCING_SAMPLE_DATA_PROCESSING.setSection('GEO compliant annotation') -assignment_SAMPLE_ILLUMINA_SEQUENCING_SAMPLE_DATA_PROCESSING.setPositionInForms(55) - -assignment_SAMPLE_ILLUMINA_SEQUENCING_CYCLES_REQUESTED_BY_CUSTOMER = tr.assignPropertyType(samp_type_ILLUMINA_SEQUENCING, prop_type_CYCLES_REQUESTED_BY_CUSTOMER) -assignment_SAMPLE_ILLUMINA_SEQUENCING_CYCLES_REQUESTED_BY_CUSTOMER.setMandatory(False) -assignment_SAMPLE_ILLUMINA_SEQUENCING_CYCLES_REQUESTED_BY_CUSTOMER.setSection('Sequencing') -assignment_SAMPLE_ILLUMINA_SEQUENCING_CYCLES_REQUESTED_BY_CUSTOMER.setPositionInForms(57) - -assignment_SAMPLE_ILLUMINA_SEQUENCING_END_TYPE = tr.assignPropertyType(samp_type_ILLUMINA_SEQUENCING, prop_type_END_TYPE) -assignment_SAMPLE_ILLUMINA_SEQUENCING_END_TYPE.setMandatory(False) -assignment_SAMPLE_ILLUMINA_SEQUENCING_END_TYPE.setSection('Sequencing') -assignment_SAMPLE_ILLUMINA_SEQUENCING_END_TYPE.setPositionInForms(58) - -assignment_SAMPLE_ILLUMINA_SEQUENCING_REQUIRED_LANES = tr.assignPropertyType(samp_type_ILLUMINA_SEQUENCING, prop_type_REQUIRED_LANES) -assignment_SAMPLE_ILLUMINA_SEQUENCING_REQUIRED_LANES.setMandatory(False) -assignment_SAMPLE_ILLUMINA_SEQUENCING_REQUIRED_LANES.setSection('Sequencing') -assignment_SAMPLE_ILLUMINA_SEQUENCING_REQUIRED_LANES.setPositionInForms(59) - -assignment_SAMPLE_ILLUMINA_SEQUENCING_BARCODE_LENGTH = tr.assignPropertyType(samp_type_ILLUMINA_SEQUENCING, prop_type_BARCODE_LENGTH) -assignment_SAMPLE_ILLUMINA_SEQUENCING_BARCODE_LENGTH.setMandatory(False) -assignment_SAMPLE_ILLUMINA_SEQUENCING_BARCODE_LENGTH.setSection('Sequencing') -assignment_SAMPLE_ILLUMINA_SEQUENCING_BARCODE_LENGTH.setPositionInForms(60) - -assignment_SAMPLE_ILLUMINA_SEQUENCING_BARCODES = tr.assignPropertyType(samp_type_ILLUMINA_SEQUENCING, prop_type_BARCODES) -assignment_SAMPLE_ILLUMINA_SEQUENCING_BARCODES.setMandatory(False) -assignment_SAMPLE_ILLUMINA_SEQUENCING_BARCODES.setSection('Sequencing') -assignment_SAMPLE_ILLUMINA_SEQUENCING_BARCODES.setPositionInForms(62) - -assignment_SAMPLE_ILLUMINA_SEQUENCING_BARCODE = tr.assignPropertyType(samp_type_ILLUMINA_SEQUENCING, prop_type_BARCODE) -assignment_SAMPLE_ILLUMINA_SEQUENCING_BARCODE.setMandatory(False) -assignment_SAMPLE_ILLUMINA_SEQUENCING_BARCODE.setSection('Sequencing') -assignment_SAMPLE_ILLUMINA_SEQUENCING_BARCODE.setPositionInForms(63) - -assignment_SAMPLE_ILLUMINA_SEQUENCING_INDEX2 = tr.assignPropertyType(samp_type_ILLUMINA_SEQUENCING, prop_type_INDEX2) -assignment_SAMPLE_ILLUMINA_SEQUENCING_INDEX2.setMandatory(False) -assignment_SAMPLE_ILLUMINA_SEQUENCING_INDEX2.setSection('Sequencing') -assignment_SAMPLE_ILLUMINA_SEQUENCING_INDEX2.setPositionInForms(64) - -assignment_SAMPLE_ILLUMINA_SEQUENCING_NOTES_CUSTOMER = tr.assignPropertyType(samp_type_ILLUMINA_SEQUENCING, prop_type_NOTES_CUSTOMER) -assignment_SAMPLE_ILLUMINA_SEQUENCING_NOTES_CUSTOMER.setMandatory(False) -assignment_SAMPLE_ILLUMINA_SEQUENCING_NOTES_CUSTOMER.setSection('Notes') -assignment_SAMPLE_ILLUMINA_SEQUENCING_NOTES_CUSTOMER.setPositionInForms(73) - -assignment_SAMPLE_ILLUMINA_SEQUENCING_OTRS = tr.assignPropertyType(samp_type_ILLUMINA_SEQUENCING, prop_type_OTRS) -assignment_SAMPLE_ILLUMINA_SEQUENCING_OTRS.setMandatory(False) -assignment_SAMPLE_ILLUMINA_SEQUENCING_OTRS.setSection('Laboratory of Quantitative Genomics (LQG)') -assignment_SAMPLE_ILLUMINA_SEQUENCING_OTRS.setPositionInForms(74) - -assignment_SAMPLE_ILLUMINA_SEQUENCING_SAMPLE_ID = tr.assignPropertyType(samp_type_ILLUMINA_SEQUENCING, prop_type_SAMPLE_ID) -assignment_SAMPLE_ILLUMINA_SEQUENCING_SAMPLE_ID.setMandatory(False) -assignment_SAMPLE_ILLUMINA_SEQUENCING_SAMPLE_ID.setSection('Laboratory of Quantitative Genomics (LQG)') -assignment_SAMPLE_ILLUMINA_SEQUENCING_SAMPLE_ID.setPositionInForms(75) - -assignment_SAMPLE_ILLUMINA_SEQUENCING_BIOLOGICAL_SAMPLE_ARRIVED = tr.assignPropertyType(samp_type_ILLUMINA_SEQUENCING, prop_type_BIOLOGICAL_SAMPLE_ARRIVED) -assignment_SAMPLE_ILLUMINA_SEQUENCING_BIOLOGICAL_SAMPLE_ARRIVED.setMandatory(False) -assignment_SAMPLE_ILLUMINA_SEQUENCING_BIOLOGICAL_SAMPLE_ARRIVED.setSection('Laboratory of Quantitative Genomics (LQG)') -assignment_SAMPLE_ILLUMINA_SEQUENCING_BIOLOGICAL_SAMPLE_ARRIVED.setPositionInForms(76) - -assignment_SAMPLE_ILLUMINA_SEQUENCING_LIBRARY_PROCESSING_POSSIBLE = tr.assignPropertyType(samp_type_ILLUMINA_SEQUENCING, prop_type_LIBRARY_PROCESSING_POSSIBLE) -assignment_SAMPLE_ILLUMINA_SEQUENCING_LIBRARY_PROCESSING_POSSIBLE.setMandatory(False) -assignment_SAMPLE_ILLUMINA_SEQUENCING_LIBRARY_PROCESSING_POSSIBLE.setSection('LQG: Generation of DNA library') -assignment_SAMPLE_ILLUMINA_SEQUENCING_LIBRARY_PROCESSING_POSSIBLE.setPositionInForms(77) - -assignment_SAMPLE_ILLUMINA_SEQUENCING_FRAGMENT_SIZE_PREPARED_ILLUMINA = tr.assignPropertyType(samp_type_ILLUMINA_SEQUENCING, prop_type_FRAGMENT_SIZE_PREPARED_ILLUMINA) -assignment_SAMPLE_ILLUMINA_SEQUENCING_FRAGMENT_SIZE_PREPARED_ILLUMINA.setMandatory(False) -assignment_SAMPLE_ILLUMINA_SEQUENCING_FRAGMENT_SIZE_PREPARED_ILLUMINA.setSection('LQG: Generation of DNA library') -assignment_SAMPLE_ILLUMINA_SEQUENCING_FRAGMENT_SIZE_PREPARED_ILLUMINA.setPositionInForms(78) - -assignment_SAMPLE_ILLUMINA_SEQUENCING_CONCENTRATION_PREPARED_ILLUMINA = tr.assignPropertyType(samp_type_ILLUMINA_SEQUENCING, prop_type_CONCENTRATION_PREPARED_ILLUMINA) -assignment_SAMPLE_ILLUMINA_SEQUENCING_CONCENTRATION_PREPARED_ILLUMINA.setMandatory(False) -assignment_SAMPLE_ILLUMINA_SEQUENCING_CONCENTRATION_PREPARED_ILLUMINA.setSection('LQG: Generation of DNA library') -assignment_SAMPLE_ILLUMINA_SEQUENCING_CONCENTRATION_PREPARED_ILLUMINA.setPositionInForms(80) - -assignment_SAMPLE_ILLUMINA_SEQUENCING_NM_DNA = tr.assignPropertyType(samp_type_ILLUMINA_SEQUENCING, prop_type_NM_DNA) -assignment_SAMPLE_ILLUMINA_SEQUENCING_NM_DNA.setMandatory(False) -assignment_SAMPLE_ILLUMINA_SEQUENCING_NM_DNA.setSection('LQG: Generation of DNA library') -assignment_SAMPLE_ILLUMINA_SEQUENCING_NM_DNA.setPositionInForms(81) - -assignment_SAMPLE_ILLUMINA_SEQUENCING_UL_STOCK = tr.assignPropertyType(samp_type_ILLUMINA_SEQUENCING, prop_type_UL_STOCK) -assignment_SAMPLE_ILLUMINA_SEQUENCING_UL_STOCK.setMandatory(False) -assignment_SAMPLE_ILLUMINA_SEQUENCING_UL_STOCK.setSection('LQG: Generation of DNA library') -assignment_SAMPLE_ILLUMINA_SEQUENCING_UL_STOCK.setPositionInForms(82) - -assignment_SAMPLE_ILLUMINA_SEQUENCING_UL_DNA = tr.assignPropertyType(samp_type_ILLUMINA_SEQUENCING, prop_type_UL_DNA) -assignment_SAMPLE_ILLUMINA_SEQUENCING_UL_DNA.setMandatory(False) -assignment_SAMPLE_ILLUMINA_SEQUENCING_UL_DNA.setSection('LQG: Generation of DNA library') -assignment_SAMPLE_ILLUMINA_SEQUENCING_UL_DNA.setPositionInForms(83) - -assignment_SAMPLE_ILLUMINA_SEQUENCING_UL_EB = tr.assignPropertyType(samp_type_ILLUMINA_SEQUENCING, prop_type_UL_EB) -assignment_SAMPLE_ILLUMINA_SEQUENCING_UL_EB.setMandatory(False) -assignment_SAMPLE_ILLUMINA_SEQUENCING_UL_EB.setSection('LQG: Generation of DNA library') -assignment_SAMPLE_ILLUMINA_SEQUENCING_UL_EB.setPositionInForms(84) - -assignment_SAMPLE_ILLUMINA_SEQUENCING_KIT_PREPARED = tr.assignPropertyType(samp_type_ILLUMINA_SEQUENCING, prop_type_KIT_PREPARED) -assignment_SAMPLE_ILLUMINA_SEQUENCING_KIT_PREPARED.setMandatory(False) -assignment_SAMPLE_ILLUMINA_SEQUENCING_KIT_PREPARED.setSection('LQG: Generation of DNA library') -assignment_SAMPLE_ILLUMINA_SEQUENCING_KIT_PREPARED.setPositionInForms(85) - -assignment_SAMPLE_ILLUMINA_SEQUENCING_PREPARED_BY = tr.assignPropertyType(samp_type_ILLUMINA_SEQUENCING, prop_type_PREPARED_BY) -assignment_SAMPLE_ILLUMINA_SEQUENCING_PREPARED_BY.setMandatory(False) -assignment_SAMPLE_ILLUMINA_SEQUENCING_PREPARED_BY.setSection('LQG: Generation of DNA library') -assignment_SAMPLE_ILLUMINA_SEQUENCING_PREPARED_BY.setPositionInForms(86) - -assignment_SAMPLE_ILLUMINA_SEQUENCING_KIT = tr.assignPropertyType(samp_type_ILLUMINA_SEQUENCING, prop_type_KIT) -assignment_SAMPLE_ILLUMINA_SEQUENCING_KIT.setMandatory(False) -assignment_SAMPLE_ILLUMINA_SEQUENCING_KIT.setSection('LQG: Generation of DNA library') -assignment_SAMPLE_ILLUMINA_SEQUENCING_KIT.setPositionInForms(87) - -assignment_SAMPLE_ILLUMINA_SEQUENCING_LOT = tr.assignPropertyType(samp_type_ILLUMINA_SEQUENCING, prop_type_LOT) -assignment_SAMPLE_ILLUMINA_SEQUENCING_LOT.setMandatory(False) -assignment_SAMPLE_ILLUMINA_SEQUENCING_LOT.setSection('LQG: Generation of DNA library') -assignment_SAMPLE_ILLUMINA_SEQUENCING_LOT.setPositionInForms(89) - -assignment_SAMPLE_ILLUMINA_SEQUENCING_STARTING_AMOUNT_OF_SAMPLE_IN_NG = tr.assignPropertyType(samp_type_ILLUMINA_SEQUENCING, prop_type_STARTING_AMOUNT_OF_SAMPLE_IN_NG) -assignment_SAMPLE_ILLUMINA_SEQUENCING_STARTING_AMOUNT_OF_SAMPLE_IN_NG.setMandatory(False) -assignment_SAMPLE_ILLUMINA_SEQUENCING_STARTING_AMOUNT_OF_SAMPLE_IN_NG.setSection('LQG: Generation of DNA library') -assignment_SAMPLE_ILLUMINA_SEQUENCING_STARTING_AMOUNT_OF_SAMPLE_IN_NG.setPositionInForms(90) - -assignment_SAMPLE_ILLUMINA_SEQUENCING_DNA_CONCENTRATION_OF_LIBRARY = tr.assignPropertyType(samp_type_ILLUMINA_SEQUENCING, prop_type_DNA_CONCENTRATION_OF_LIBRARY) -assignment_SAMPLE_ILLUMINA_SEQUENCING_DNA_CONCENTRATION_OF_LIBRARY.setMandatory(False) -assignment_SAMPLE_ILLUMINA_SEQUENCING_DNA_CONCENTRATION_OF_LIBRARY.setSection('LQG: Generation of DNA library') -assignment_SAMPLE_ILLUMINA_SEQUENCING_DNA_CONCENTRATION_OF_LIBRARY.setPositionInForms(92) - -assignment_SAMPLE_ILLUMINA_SEQUENCING_NANO_DROP = tr.assignPropertyType(samp_type_ILLUMINA_SEQUENCING, prop_type_NANO_DROP) -assignment_SAMPLE_ILLUMINA_SEQUENCING_NANO_DROP.setMandatory(False) -assignment_SAMPLE_ILLUMINA_SEQUENCING_NANO_DROP.setSection('LQG: Generation of DNA library') -assignment_SAMPLE_ILLUMINA_SEQUENCING_NANO_DROP.setPositionInForms(93) - -assignment_SAMPLE_ILLUMINA_SEQUENCING_AGILENT_KIT = tr.assignPropertyType(samp_type_ILLUMINA_SEQUENCING, prop_type_AGILENT_KIT) -assignment_SAMPLE_ILLUMINA_SEQUENCING_AGILENT_KIT.setMandatory(False) -assignment_SAMPLE_ILLUMINA_SEQUENCING_AGILENT_KIT.setSection('LQG: Generation of DNA library') -assignment_SAMPLE_ILLUMINA_SEQUENCING_AGILENT_KIT.setPositionInForms(94) - -assignment_SAMPLE_ILLUMINA_SEQUENCING_LIBRARY_PROCESSING_SUCCESSFUL = tr.assignPropertyType(samp_type_ILLUMINA_SEQUENCING, prop_type_LIBRARY_PROCESSING_SUCCESSFUL) -assignment_SAMPLE_ILLUMINA_SEQUENCING_LIBRARY_PROCESSING_SUCCESSFUL.setMandatory(False) -assignment_SAMPLE_ILLUMINA_SEQUENCING_LIBRARY_PROCESSING_SUCCESSFUL.setSection('LQG: Generation of DNA library') -assignment_SAMPLE_ILLUMINA_SEQUENCING_LIBRARY_PROCESSING_SUCCESSFUL.setPositionInForms(95) - -assignment_SAMPLE_ILLUMINA_SEQUENCING_LIBRARY_PROCESSING_FAILED = tr.assignPropertyType(samp_type_ILLUMINA_SEQUENCING, prop_type_LIBRARY_PROCESSING_FAILED) -assignment_SAMPLE_ILLUMINA_SEQUENCING_LIBRARY_PROCESSING_FAILED.setMandatory(False) -assignment_SAMPLE_ILLUMINA_SEQUENCING_LIBRARY_PROCESSING_FAILED.setSection('LQG: Generation of DNA library') -assignment_SAMPLE_ILLUMINA_SEQUENCING_LIBRARY_PROCESSING_FAILED.setPositionInForms(96) - -assignment_SAMPLE_ILLUMINA_SEQUENCING_CLUSTER_STATION = tr.assignPropertyType(samp_type_ILLUMINA_SEQUENCING, prop_type_CLUSTER_STATION) -assignment_SAMPLE_ILLUMINA_SEQUENCING_CLUSTER_STATION.setMandatory(False) -assignment_SAMPLE_ILLUMINA_SEQUENCING_CLUSTER_STATION.setSection('LQG: Clustering Process') -assignment_SAMPLE_ILLUMINA_SEQUENCING_CLUSTER_STATION.setPositionInForms(102) - -assignment_SAMPLE_ILLUMINA_SEQUENCING_CREATED_ON_CS = tr.assignPropertyType(samp_type_ILLUMINA_SEQUENCING, prop_type_CREATED_ON_CS) -assignment_SAMPLE_ILLUMINA_SEQUENCING_CREATED_ON_CS.setMandatory(False) -assignment_SAMPLE_ILLUMINA_SEQUENCING_CREATED_ON_CS.setSection('LQG: Clustering Process') -assignment_SAMPLE_ILLUMINA_SEQUENCING_CREATED_ON_CS.setPositionInForms(103) - -assignment_SAMPLE_ILLUMINA_SEQUENCING_CS_PROTOCOL_VERSION = tr.assignPropertyType(samp_type_ILLUMINA_SEQUENCING, prop_type_CS_PROTOCOL_VERSION) -assignment_SAMPLE_ILLUMINA_SEQUENCING_CS_PROTOCOL_VERSION.setMandatory(False) -assignment_SAMPLE_ILLUMINA_SEQUENCING_CS_PROTOCOL_VERSION.setSection('LQG: Clustering Process') -assignment_SAMPLE_ILLUMINA_SEQUENCING_CS_PROTOCOL_VERSION.setPositionInForms(104) - -assignment_SAMPLE_ILLUMINA_SEQUENCING_CLUSTER_GENERATION_KIT_VERSION = tr.assignPropertyType(samp_type_ILLUMINA_SEQUENCING, prop_type_CLUSTER_GENERATION_KIT_VERSION) -assignment_SAMPLE_ILLUMINA_SEQUENCING_CLUSTER_GENERATION_KIT_VERSION.setMandatory(False) -assignment_SAMPLE_ILLUMINA_SEQUENCING_CLUSTER_GENERATION_KIT_VERSION.setSection('LQG: Clustering Process') -assignment_SAMPLE_ILLUMINA_SEQUENCING_CLUSTER_GENERATION_KIT_VERSION.setPositionInForms(105) - -assignment_SAMPLE_ILLUMINA_SEQUENCING_CLUSTER_STATION_SOFTWARE_VERSION = tr.assignPropertyType(samp_type_ILLUMINA_SEQUENCING, prop_type_CLUSTER_STATION_SOFTWARE_VERSION) -assignment_SAMPLE_ILLUMINA_SEQUENCING_CLUSTER_STATION_SOFTWARE_VERSION.setMandatory(False) -assignment_SAMPLE_ILLUMINA_SEQUENCING_CLUSTER_STATION_SOFTWARE_VERSION.setSection('LQG: Clustering Process') -assignment_SAMPLE_ILLUMINA_SEQUENCING_CLUSTER_STATION_SOFTWARE_VERSION.setPositionInForms(106) - -assignment_SAMPLE_ILLUMINA_SEQUENCING_CONCENTRATION_FLOWLANE = tr.assignPropertyType(samp_type_ILLUMINA_SEQUENCING, prop_type_CONCENTRATION_FLOWLANE) -assignment_SAMPLE_ILLUMINA_SEQUENCING_CONCENTRATION_FLOWLANE.setMandatory(False) -assignment_SAMPLE_ILLUMINA_SEQUENCING_CONCENTRATION_FLOWLANE.setSection('LQG: Clustering Process') -assignment_SAMPLE_ILLUMINA_SEQUENCING_CONCENTRATION_FLOWLANE.setPositionInForms(107) - -assignment_SAMPLE_ILLUMINA_SEQUENCING_CYCLES = tr.assignPropertyType(samp_type_ILLUMINA_SEQUENCING, prop_type_CYCLES) -assignment_SAMPLE_ILLUMINA_SEQUENCING_CYCLES.setMandatory(False) -assignment_SAMPLE_ILLUMINA_SEQUENCING_CYCLES.setSection('LQG: Sequencing') -assignment_SAMPLE_ILLUMINA_SEQUENCING_CYCLES.setPositionInForms(108) - -assignment_SAMPLE_ILLUMINA_SEQUENCING_SCS_PROTOCOL_VERSION = tr.assignPropertyType(samp_type_ILLUMINA_SEQUENCING, prop_type_SCS_PROTOCOL_VERSION) -assignment_SAMPLE_ILLUMINA_SEQUENCING_SCS_PROTOCOL_VERSION.setMandatory(False) -assignment_SAMPLE_ILLUMINA_SEQUENCING_SCS_PROTOCOL_VERSION.setSection('LQG: Sequencing') -assignment_SAMPLE_ILLUMINA_SEQUENCING_SCS_PROTOCOL_VERSION.setPositionInForms(110) - -assignment_SAMPLE_ILLUMINA_SEQUENCING_SBS_SEQUENCING_KIT_VERSION = tr.assignPropertyType(samp_type_ILLUMINA_SEQUENCING, prop_type_SBS_SEQUENCING_KIT_VERSION) -assignment_SAMPLE_ILLUMINA_SEQUENCING_SBS_SEQUENCING_KIT_VERSION.setMandatory(False) -assignment_SAMPLE_ILLUMINA_SEQUENCING_SBS_SEQUENCING_KIT_VERSION.setSection('LQG: Sequencing') -assignment_SAMPLE_ILLUMINA_SEQUENCING_SBS_SEQUENCING_KIT_VERSION.setPositionInForms(111) - -assignment_SAMPLE_ILLUMINA_SEQUENCING_SCS_SOFTWARE_VERSION = tr.assignPropertyType(samp_type_ILLUMINA_SEQUENCING, prop_type_SCS_SOFTWARE_VERSION) -assignment_SAMPLE_ILLUMINA_SEQUENCING_SCS_SOFTWARE_VERSION.setMandatory(False) -assignment_SAMPLE_ILLUMINA_SEQUENCING_SCS_SOFTWARE_VERSION.setSection('LQG: Sequencing') -assignment_SAMPLE_ILLUMINA_SEQUENCING_SCS_SOFTWARE_VERSION.setPositionInForms(112) - -assignment_SAMPLE_ILLUMINA_SEQUENCING_BAREBACKED = tr.assignPropertyType(samp_type_ILLUMINA_SEQUENCING, prop_type_BAREBACKED) -assignment_SAMPLE_ILLUMINA_SEQUENCING_BAREBACKED.setMandatory(False) -assignment_SAMPLE_ILLUMINA_SEQUENCING_BAREBACKED.setSection('LQG: Sequencing') -assignment_SAMPLE_ILLUMINA_SEQUENCING_BAREBACKED.setPositionInForms(113) - -assignment_SAMPLE_ILLUMINA_SEQUENCING_INVOICE = tr.assignPropertyType(samp_type_ILLUMINA_SEQUENCING, prop_type_INVOICE) -assignment_SAMPLE_ILLUMINA_SEQUENCING_INVOICE.setMandatory(False) -assignment_SAMPLE_ILLUMINA_SEQUENCING_INVOICE.setSection('LQG: Administrative') -assignment_SAMPLE_ILLUMINA_SEQUENCING_INVOICE.setPositionInForms(117) - -assignment_SAMPLE_ILLUMINA_SEQUENCING_NOTES = tr.assignPropertyType(samp_type_ILLUMINA_SEQUENCING, prop_type_NOTES) -assignment_SAMPLE_ILLUMINA_SEQUENCING_NOTES.setMandatory(False) -assignment_SAMPLE_ILLUMINA_SEQUENCING_NOTES.setSection('LQG: Administrative') -assignment_SAMPLE_ILLUMINA_SEQUENCING_NOTES.setPositionInForms(118) - -assignment_SAMPLE_ILLUMINA_SEQUENCING_NUMBER_OF_ATTACHMENTS = tr.assignPropertyType(samp_type_ILLUMINA_SEQUENCING, prop_type_NUMBER_OF_ATTACHMENTS) -assignment_SAMPLE_ILLUMINA_SEQUENCING_NUMBER_OF_ATTACHMENTS.setMandatory(False) -assignment_SAMPLE_ILLUMINA_SEQUENCING_NUMBER_OF_ATTACHMENTS.setSection(None) -assignment_SAMPLE_ILLUMINA_SEQUENCING_NUMBER_OF_ATTACHMENTS.setPositionInForms(119) - -assignment_DATA_SET_MACS_OUTPUT_MACS_VERSION = tr.assignPropertyType(data_set_type_MACS_OUTPUT, prop_type_MACS_VERSION) -assignment_DATA_SET_MACS_OUTPUT_MACS_VERSION.setMandatory(False) -assignment_DATA_SET_MACS_OUTPUT_MACS_VERSION.setSection(None) -assignment_DATA_SET_MACS_OUTPUT_MACS_VERSION.setPositionInForms(1) - -assignment_DATA_SET_MACS_OUTPUT_NOTES = tr.assignPropertyType(data_set_type_MACS_OUTPUT, prop_type_NOTES) -assignment_DATA_SET_MACS_OUTPUT_NOTES.setMandatory(False) -assignment_DATA_SET_MACS_OUTPUT_NOTES.setSection(None) -assignment_DATA_SET_MACS_OUTPUT_NOTES.setPositionInForms(2) diff --git a/deep_sequencing_unit/resource/eclipse/DSU Data Store Server.launch b/deep_sequencing_unit/resource/eclipse/DSU Data Store Server.launch deleted file mode 100644 index 27b002429a8d711dcbee4a357809f987e6c1f2d9..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/resource/eclipse/DSU Data Store Server.launch +++ /dev/null @@ -1,14 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<launchConfiguration type="org.eclipse.jdt.launching.localJavaApplication"> -<stringAttribute key="bad_container_name" value="/deep_sequencing_unit/resource/ecli"/> -<listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_PATHS"> -<listEntry value="/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/DataStoreServer.java"/> -</listAttribute> -<listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_TYPES"> -<listEntry value="1"/> -</listAttribute> -<booleanAttribute key="org.eclipse.debug.core.appendEnvironmentVariables" value="true"/> -<stringAttribute key="org.eclipse.jdt.launching.MAIN_TYPE" value="ch.systemsx.cisd.openbis.dss.generic.DataStoreServer"/> -<stringAttribute key="org.eclipse.jdt.launching.PROJECT_ATTR" value="deep_sequencing_unit"/> -<stringAttribute key="org.eclipse.jdt.launching.VM_ARGUMENTS" value="-Xmx2G -ea -Dpython.path=../libraries/jython/jython-lib"/> -</launchConfiguration> diff --git a/deep_sequencing_unit/resource/property_types_for_admin_console.txt b/deep_sequencing_unit/resource/property_types_for_admin_console.txt deleted file mode 100644 index 552f1809c5eb41b51e9f0770722fe89fd316a1cc..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/resource/property_types_for_admin_console.txt +++ /dev/null @@ -1,268 +0,0 @@ --- --- Creating entities for Deep Sequencing Distribution --- - --- @author Manuel Kohler - -set type = POLYCOMB2010 -register-type EXPERIMENT ${type} - -register-type SAMPLE ILLUMINA_FLOW_CELL listable=true show-container=false show-parents=false description="Flow Cell containing eight flow lanes" -register-type SAMPLE ILLUMINA_FLOW_LANE listable=true show-container=true show-parents=true description="Flow Lane is parented by one ILLUMINA_SEQUENCING" -register-type SAMPLE ILLUMINA_SEQUENCING listable=true show-container=false show-parents=false description="Biological Sample" - -set type = FASTQ_GZ -register-type DATA_SET ${type} description="Gzipped FASTQ files produced by CASAVA 1.8+" - -set type = ILLUMINA_GA_OUTPUT -register-type DATA_SET ${type} description="Illumina GA Output" - -set type = ILLUMINA_HISEQ_OUTPUT description="Illumina HiSeq Output" -register-type DATA_SET ${type} - -set type = MACS_OUTPUT -register-type DATA_SET ${type} description="MACS Peak Caller output" - -set type = TSV -register-type DATA_SET ${type} description="All kind of Tab Separated Value files" - -set type = WIGGLE -register-type DATA_SET ${type} description="Visualization Format of ChIP-Seq data for UCSC browser" - -set type = BED -register-type DATA_SET ${type} description="Visualization Format of ChIP-Seq data for UCSC browser" - -set type = AFFILIATION -register-property-type ${type} with data type CONTROLLEDVOCABULARY(AFFILIATION) "description=Where data will be shipped to" "label=Affiliation" -assign-to SAMPLE:ILLUMINA_SEQUENCING ${type} - -set type = ALIGNMENT -register-type DATA_SET ${type} description="Alignment software output, e.g. SAM/BAM" -assign-to DATA_SET:${type} AFFILIATION - -set type = AGILENT_KIT -register-property-type ${type} with data type CONTROLLEDVOCABULARY(AGILENT_KIT) "description=Kit used for QC" "label=Agilent Kit" -assign-to SAMPLE:ILLUMINA_SEQUENCING ${type} - -set type = ANALYSIS_FINISHED -register-property-type ${type} with data type TIMESTAMP "description=Post processing of the complete Flow Cell is finished and the fastq/SRF files have been created" "label=Analysis finshed" -assign-to SAMPLE:ILLUMINA_FLOW_CELL ${type} - -set type = BIOLOGICAL_SAMPLE_ARRIVED -register-property-type ${type} with data type TIMESTAMP "description=The date when the biological sample arrived at lab" "label=Arrival Date of Biological Sample" -assign-to SAMPLE:ILLUMINA_SEQUENCING ${type} - -set type = BARCODE -register-property-type ${type} with data type CONTROLLEDVOCABULARY(BARCODES) "description=Barcodes used for multiplexing" "label=Barcode" -assign-to SAMPLE:ILLUMINA_SEQUENCING ${type} - -set type = BARCODE_LENGTH -register-property-type ${type} with data type INTEGER "description=Length of the barcode. Will be used as a parameter for the bareback image analysis: Large Scale Loss of Data in Low-Diversity Illumina Sequencing Libraries Can Be recovered by Deferred Cluster Calling Felix Krueger1, Simon R. Andrews1, Cameron S. Osborne2*,Plos One, 2011" "label=Barcode Length (+ recognition site)" -assign-to SAMPLE:ILLUMINA_SEQUENCING ${type} - -set type = BAREBACKED -register-property-type ${type} with data type BOOLEAN "description=Has the bareback algorithm been applied? Krueger F, Andrews SR, Osborne CS (2011) Large Scale Loss of Data in Low-Diversity Illumina Sequencing Libraries Can Be Recovered by Deferred Cluster Calling. PLoS ONE 6(1): e16607. doi:10.1371/journal.pone.0016607" "label=Barebacked?" -assign-to SAMPLE:ILLUMINA_SEQUENCING ${type} - -set type = CLUSTER_GENERATION_KIT_VERSION -register-property-type ${type} with data type CONTROLLEDVOCABULARY(CLUSTER_GENERATION_KIT_VERSION) "description=Cluster Station Kit Version" "label=CS Generation Kit Version" -assign-to SAMPLE:ILLUMINA_SEQUENCING ${type} - -set type = CASAVA_VERSION -register-property-type ${type} with data type CONTROLLEDVOCABULARY(CASAVA_VERSION) "description=Illumina's post analyzing software" "label=Casava Version" -assign-to DATA_SET:ILLUMINA_GA_OUTPUT ${type} -assign-to DATA_SET:ILLUMINA_HISEQ_OUTPUT ${type} - -set type = CLUSTER_STATION -register-property-type ${type} with data type CONTROLLEDVOCABULARY(CLUSTER_STATION) "description=Used Cluster Station" "label=Cluster Station" -assign-to SAMPLE:ILLUMINA_SEQUENCING ${type} - -set type = CONCENTRATION_ORIGINAL -register-property-type ${type} with data type REAL "description=Concentration of the original sample for Illumina Sequencing in nano grams per micro liter" "label=Concentration (original) [ng/μl]" -assign-to SAMPLE:ILLUMINA_SEQUENCING ${type} - -set type = CONCENTRATION_PREPARED -register-property-type ${type} with data type REAL "description=Concentration of the prepared sample for Illumina Sequencing in nano grams per micro liter" "label=Concentration (prepared) [ng/μl]" -assign-to SAMPLE:ILLUMINA_SEQUENCING ${type} - -set type = CONCENTRATION_FLOW_LANE -register-property-type ${type} with data type REAL "description=Concentration of library loaded in flow lane" "label=Concentration in flow lane [pM]" -assign-to SAMPLE:ILLUMINA_SEQUENCING ${type} - -set type = CYCLES_REQUESTED_BY_CUSTOMER -register-property-type ${type} with data type CONTROLLEDVOCABULARY(CYCLES) "description=Read length" "label=Cycles" -assign-to SAMPLE:ILLUMINA_SEQUENCING ${type} -assign-to SAMPLE:ILLUMINA_FLOW_CELL ${type} - -set type = DNA_CONCENTRATION_OF_LIBRARY -register-property-type ${type} with data type INTEGER "description=" "label=DNA concentration of library (nM)" -assign-to SAMPLE:ILLUMINA_SEQUENCING ${type} - -set type = CONCENTRATION_TOTAL -register-property-type ${type} with data type INTEGER "description=Total amount of genetic material" "label=DNA concentration of library (ng/µl)" -assign-to SAMPLE:ILLUMINA_SEQUENCING ${type} - -set type = DATA_TRANSFERRED -register-property-type ${type} with data type TIMESTAMP "description=Date of successful data transfer to the customer" "label=Data transferred on" -assign-to SAMPLE:ILLUMINA_SEQUENCING ${type} - -set type = CONTACT_PERSON_EMAIL -register-property-type ${type} with data type VARCHAR "description=Email of person to contact about the sample, Used for the tracking system" "label=Email of Contact Person" -assign-to SAMPLE:ILLUMINA_SEQUENCING ${type} mandatory - -set type = CONTACT_PERSON_NAME -register-property-type ${type} with data type VARCHAR "description=Name of person to contact about the sample" "label=Email of Contact Person" -assign-to SAMPLE:ILLUMINA_SEQUENCING ${type} mandatory - -set type = EXTERNAL_SAMPLE_NAME -register-property-type ${type} with data type VARCHAR "description=Original Sample Name" "label=External Sample Name" -assign-to SAMPLE:ILLUMINA_SEQUENCING ${type} mandatory - -set type = FRAGMENT_SIZE_PREPARED_ILLUMINA -register-property-type ${type} with data type INTEGER "description=Fragment size of the library of a prepared Illumina Sequencing sample in either bases or base pairs" "label=Fragment Size (prepared) [base (pairs)]" -assign-to SAMPLE:ILLUMINA_SEQUENCING ${type} - -set type = INVOICE -register-property-type ${type} with data type BOOLEAN "description=Check box if invoice has been sent" "label=Invoice sent?" -assign-to SAMPLE:ILLUMINA_SEQUENCING ${type} - -set type = LOT -register-property-type ${type} with data type INTEGER "description=Illumina Kit Lot" "label=Kit Lot #" -assign-to SAMPLE:ILLUMINA_SEQUENCING ${type} - -set type = KIT_ARRIVED -register-property-type ${type} with data type TIMESTAMP "description=Date when Illumina Kit arrived" "label=Kit arrived" -assign-to SAMPLE:ILLUMINA_SEQUENCING ${type} - -set type = LIBRARY_PROCESSING_POSSIBLE -register-property-type ${type} with data type BOOLEAN "description=" "label=Library Processing possible" -assign-to SAMPLE:ILLUMINA_SEQUENCING ${type} - -set type = KIT -register-property-type ${type} with data type CONTROLLEDVOCABULARY(KIT) "description=Type of preparation kit" "label=Type of preparation kit" -assign-to SAMPLE:ILLUMINA_SEQUENCING ${type} - -set type = LIBRARY_PROCESSING_SUCCESSFUL -register-property-type ${type} with data type BOOLEAN "description=" "label=Library processing successful" -assign-to SAMPLE:ILLUMINA_SEQUENCING ${type} - -set type = MACS_VERSION -register-property-type ${type} with data type CONTROLLEDVOCABULARY(MACS_VERSION) "description=Used MACS version (peak caller) http://liulab.dfci.harvard.edu/MACS/" "label=MACS Version" -assign-to DATA_SET:MACS_OUTPUT ${type} - -set type = MAPPED_READS -register-property-type ${type} with data type INTEGER "description=Reads successfully aligned to reference genome" "label=# of mapped reads" -assign-to DATA_SET:ALIGNMENT ${type} - -set type = NANO_DROP -register-property-type ${type} with data type CONTROLLEDVOCABULARY(NANO_DROP) "description=" "label=Nano Drop" -assign-to SAMPLE:ILLUMINA_SEQUENCING ${type} - -set type = NCBI_ORGANISM_TAXONOMY -register-property-type ${type} with data type CONTROLLEDVOCABULARY(NCBI_TAXONOMY) "description=Standard NCBI Taxonomy (http://www.ncbi.nlm.nih.gov/taxonomy)" "label=Organism (NCBI Taxonomy)" -assign-to SAMPLE:ILLUMINA_SEQUENCING ${type} mandatory - -set type = NOTES -register-property-type ${type} with data type MULTILINE_VARCHAR "description=Free text" "label=Notes" -assign-to SAMPLE:ILLUMINA_SEQUENCING ${type} -assign-to SAMPLE:ILLUMINA_FLOW_CELL ${type} - -set type = NOTES_CUSTOMER -register-property-type ${type} with data type MULTILINE_VARCHAR "description=Free text" "label=Customer notes" -assign-to SAMPLE:ILLUMINA_SEQUENCING ${type} - -set type = NUMBER_OF_ATTACHMENTS -register-property-type ${type} with data type INTEGER "description=" "label=# of attachments" -assign-to SAMPLE:ILLUMINA_SEQUENCING ${type} - -set type = OTRS -register-property-type ${type} with data type INTEGER "description=OTRS Reference Number" "label=OTRS ID #" -assign-to SAMPLE:ILLUMINA_SEQUENCING ${type} - -set type = PRINCIPAL_INVESTIGATOR_EMAIL -register-property-type ${type} with data type VARCHAR "description=Email of Principal Investigator responsible for the sample. Used for the tracking system" "label=Email of Principal Investigator" -assign-to SAMPLE:ILLUMINA_SEQUENCING ${type} mandatory - -set type = PRINCIPAL_INVESTIGATOR_NAME -register-property-type ${type} with data type VARCHAR "description=Name of Principal Investigator responsible for the sample." "label=Name of Principal Investigator" -assign-to SAMPLE:ILLUMINA_SEQUENCING ${type} mandatory - -set type = REQUIRED_LANES -register-property-type ${type} with data type CONTROLLEDVOCABULARY(REQUIRED_LANES) "description=" "label=Required Lanes" -assign-to SAMPLE:ILLUMINA_SEQUENCING ${type} - -set type = SAMPLE_CHARACTERISTICS -register-property-type ${type} with data type MULTILINE_VARCHAR "description=Describe all available characteristics of the biological source, including factors not necessarily under investigation. Provide in 'Tag: Value' format, where 'Tag' is a type of characteristic (e.g. 'gender', 'strain', 'tissue', 'developmental stage', 'tumor stage', etc), and 'Value' is the value for each tag (e.g. 'female', '129SV', 'brain', 'embryo', etc). Include as many characteristics fields as necessary to thoroughly describe your Samples." "label=Sample characteristics" -assign-to SAMPLE:ILLUMINA_SEQUENCING ${type} - -set type = SAMPLE_DATA_PROCESSING -register-property-type ${type} with data type MULTILINE_VARCHAR "description=Provide details of how data were generated and calculated. For example, what software was used, how and to what were the reads aligned, what filtering parameters were applied, how were peaks calculated, etc. Include a separate 'data processing' attribute for each file type described." "label=Sample Data Processing" -assign-to SAMPLE:ILLUMINA_SEQUENCING ${type} - -set type = SAMPLE_EXTRACT_PROTOCOL -register-property-type ${type} with data type MULTILINE_VARCHAR "description=Describe the protocol used to isolate the extract material. Describe the library construction protocol, ie, the protocols used to extract and prepare the material to be sequenced. You can include as much text as you need to thoroughly describe the protocol; it is strongly recommended that complete protocol descriptions are provided within your submission." "label=Sample Extract Protocol" -assign-to SAMPLE:ILLUMINA_SEQUENCING ${type} - -set type = SAMPLE_KIND -register-property-type ${type} with data type CONTROLLEDVOCABULARY(SAMPLE_TYPE) "description=Kind of sample delivered by the customer (and suitable for a certain sequencing application)" "label=Sample Kind" -assign-to SAMPLE:ILLUMINA_SEQUENCING ${type} mandatory - -set type = SAMPLE_LIBRARY_SELECTION -register-property-type ${type} with data type CONTROLLEDVOCABULARY(SAMPLE_LIBRARY_SELECTION) "description=Describes whether any method was used to select and/or enrich the material being sequenced." "label=Sample Library Selection" -assign-to SAMPLE:ILLUMINA_SEQUENCING ${type} - -set type = SAMPLE_LIBRARY_SOURCE -register-property-type ${type} with data type CONTROLLEDVOCABULARY(SAMPLE_LIBRARY_SOURCE_VOC) "description=Type of source material that is being sequenced." "label=Sample Library Source" -assign-to SAMPLE:ILLUMINA_SEQUENCING ${type} - -set type = SAMPLE_LIBRARY_STRATEGY -register-property-type ${type} with data type CONTROLLEDVOCABULARY(SAMPLE_LIBRARY_STRATEGY) "description=Sequencing technique for this library." "label=Sample Library Strategy" -assign-to SAMPLE:ILLUMINA_SEQUENCING ${type} - -set type = SAMPLE_MOLECULE -register-property-type ${type} with data type CONTROLLEDVOCABULARY(SAMPLE_MOLECULE) "description=Specify the type of molecule that was extracted from the biological material." "label=Sample molecule" -assign-to SAMPLE:ILLUMINA_SEQUENCING ${type} - -set type = SAMPLE_SOURCE_NAME -register-property-type ${type} with data type VARCHAR "description=Briefly identify the biological material and the experimental variable(s), e.g., vastus lateralis muscle, exercised, 60 min." "label=Sample Source Name" -assign-to SAMPLE:ILLUMINA_SEQUENCING ${type} - -set type = SAMTOOLS_FLAGSTAT -register-property-type ${type} with data type MULTILINE_VARCHAR "description=Output of the samtools flagstat command" "label=Samtools Flagstat Output" -assign-to SAMPLE:ILLUMINA_SEQUENCING ${type} - -set type = SBS_SEQUENCING_KIT_VERSION -register-property-type ${type} with data type CONTROLLEDVOCABULARY(SBS_SEQUENCING_KIT_VERSION) "description=SBS Sequencing Kit Version" "label=SBS Sequencing Kit Version" -assign-to SAMPLE:ILLUMINA_SEQUENCING ${type} - -set type = SCS_PROTOCOL_VERSION -register-property-type ${type} with data type CONTROLLEDVOCABULARY(SCS_PROTOCOL_VERSION) "description=Illumina protocol version" "label=SCS Protocol Version" -assign-to SAMPLE:ILLUMINA_SEQUENCING ${type} - -set type = SCS_SOFTWARE_VERSION -register-property-type ${type} with data type CONTROLLEDVOCABULARY(SCS_SOFTWARE_VERSION) "description=Version of the SCS Software on the GA Control PC" "label=SCS Software Version" -assign-to SAMPLE:ILLUMINA_SEQUENCING ${type} - -set type = SEQUENCER -register-property-type ${type} with data type CONTROLLEDVOCABULARY(SEQUENCER) "description=Which sequencer has been used?" "label=Sequencer" -assign-to SAMPLE:ILLUMINA_FLOW_CELL ${type} - -set type = SEQUENCING_APPLICATION -register-property-type ${type} with data type CONTROLLEDVOCABULARY(SEQUENCING_APPLICATION) "description=What kind of sequencing application the sample has been prepared for" "label=Sequencing Application" -assign-to SAMPLE:ILLUMINA_SEQUENCING ${type} mandatory - -set type = STARTING_AMOUNT_OF_SAMPLE_IN_NG -register-property-type ${type} with data type REAL "description=" "label=Starting amount of sample (ng)" -assign-to SAMPLE:ILLUMINA_SEQUENCING ${type} - -set type = TOTAL_READS -register-property-type ${type} with data type REAL "description=Total reads which have been tried to map" "label=Total reads" -assign-to DATA_SET:ALIGNMENT ${type} - -set type = CLUSTERING_DATE -register-property-type ${type} with data type TIMESTAMP "description=Date of Clustering Process" "label=Clustering Date" -assign-to SAMPLE:ILLUMINA_SEQUENCING ${type} - -set type = CLUSTERING_PROTOCOL_VERSION -register-property-type ${type} with data type VARCHAR "description=" "label=Cluster Station Protocol Version" -assign-to SAMPLE:ILLUMINA_SEQUENCING ${type} diff --git a/deep_sequencing_unit/resource/test-data/DemoDropboxTest/demo-data/demo-file-1 b/deep_sequencing_unit/resource/test-data/DemoDropboxTest/demo-data/demo-file-1 deleted file mode 100644 index 7ed1e2540223c1ff279a39af28b018f20e13706f..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/resource/test-data/DemoDropboxTest/demo-data/demo-file-1 +++ /dev/null @@ -1 +0,0 @@ -DEMO-EXPERIMENT-1 \ No newline at end of file diff --git a/deep_sequencing_unit/resource/test-data/DemoDropboxTest/demo-data/demo-file-2 b/deep_sequencing_unit/resource/test-data/DemoDropboxTest/demo-data/demo-file-2 deleted file mode 100644 index 0ce414b76f454657a32a70444a67d7f6eed1ef2d..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/resource/test-data/DemoDropboxTest/demo-data/demo-file-2 +++ /dev/null @@ -1 +0,0 @@ -DEMO-EXPERIMENT-2 \ No newline at end of file diff --git a/deep_sequencing_unit/resource/test-data/QGFCreateFlowCellHiseqTest/141212_D00535_0037_AC5UMNANXX/RunInfo.xml b/deep_sequencing_unit/resource/test-data/QGFCreateFlowCellHiseqTest/141212_D00535_0037_AC5UMNANXX/RunInfo.xml deleted file mode 100644 index 1271980cef1cd1be352f5833814579c6b3f350a3..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/resource/test-data/QGFCreateFlowCellHiseqTest/141212_D00535_0037_AC5UMNANXX/RunInfo.xml +++ /dev/null @@ -1,23 +0,0 @@ -<?xml version="1.0"?> -<RunInfo xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Version="2"> - <Run Id="141212_D00535_0037_AC5UMNANXX" Number="37"> - <Flowcell>C5UMNANXX</Flowcell> - <Instrument>D00535</Instrument> - <Date>141212</Date> - <Reads> - <Read Number="1" NumCycles="51" IsIndexedRead="N" /> - <Read Number="2" NumCycles="7" IsIndexedRead="Y" /> - </Reads> - <FlowcellLayout LaneCount="8" SurfaceCount="2" SwathCount="3" TileCount="16" /> - <AlignToPhiX> - <Lane>1</Lane> - <Lane>2</Lane> - <Lane>3</Lane> - <Lane>4</Lane> - <Lane>5</Lane> - <Lane>6</Lane> - <Lane>7</Lane> - <Lane>8</Lane> - </AlignToPhiX> - </Run> -</RunInfo> \ No newline at end of file diff --git a/deep_sequencing_unit/resource/test-data/QGFCreateFlowCellHiseqTest/141212_D00535_0038_BC6A12ANXX/RunInfo.xml b/deep_sequencing_unit/resource/test-data/QGFCreateFlowCellHiseqTest/141212_D00535_0038_BC6A12ANXX/RunInfo.xml deleted file mode 100644 index de51e4e7d169eeb5f6489b2523b7ff63cd3b4613..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/resource/test-data/QGFCreateFlowCellHiseqTest/141212_D00535_0038_BC6A12ANXX/RunInfo.xml +++ /dev/null @@ -1,23 +0,0 @@ -<?xml version="1.0"?> -<RunInfo xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Version="2"> - <Run Id="141212_D00535_0038_BC6A12ANXX" Number="38"> - <Flowcell>C6A12ANXX</Flowcell> - <Instrument>D00535</Instrument> - <Date>141212</Date> - <Reads> - <Read Number="1" NumCycles="51" IsIndexedRead="N" /> - <Read Number="2" NumCycles="7" IsIndexedRead="Y" /> - </Reads> - <FlowcellLayout LaneCount="8" SurfaceCount="2" SwathCount="3" TileCount="16" /> - <AlignToPhiX> - <Lane>1</Lane> - <Lane>2</Lane> - <Lane>3</Lane> - <Lane>4</Lane> - <Lane>5</Lane> - <Lane>6</Lane> - <Lane>7</Lane> - <Lane>8</Lane> - </AlignToPhiX> - </Run> -</RunInfo> \ No newline at end of file diff --git a/deep_sequencing_unit/resource/test-data/QGFCreateFlowCellHiseqTest/141212_D00535_0038_BC6A12ANXX/runParameters.xml b/deep_sequencing_unit/resource/test-data/QGFCreateFlowCellHiseqTest/141212_D00535_0038_BC6A12ANXX/runParameters.xml deleted file mode 100644 index a8074b90066291c5ba48661aea68a84e860d5d77..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/resource/test-data/QGFCreateFlowCellHiseqTest/141212_D00535_0038_BC6A12ANXX/runParameters.xml +++ /dev/null @@ -1,151 +0,0 @@ -<?xml version="1.0"?> -<RunParameters xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> - <Setup> - <ExperimentName>141212_C6A12ANXX</ExperimentName> - <ScanID>-999</ScanID> - <FCPosition>B</FCPosition> - <WorkFlowType>SINGLEINDEX</WorkFlowType> - <PairEndFC>false</PairEndFC> - <Read1>51</Read1> - <IndexRead1>7</IndexRead1> - <IndexRead2>0</IndexRead2> - <Read2>0</Read2> - <OutputFolder>Y:\jabba</OutputFolder> - <CompressBcls>true</CompressBcls> - <RemapQScores /> - <NearNeighborCorrection>false</NearNeighborCorrection> - <PeriodicSave>Save All Thumbnails</PeriodicSave> - <Flowcell>HiSeq Flow Cell v4</Flowcell> - <FirstBaseConfirmation>true</FirstBaseConfirmation> - <SampleSheet /> - <KeepIntensityFiles>false</KeepIntensityFiles> - <Sbs>HiSeq SBS Kit v4</Sbs> - <Pe /> - <Index>HiSeq v4 Single Index</Index> - <AlignToPhiX> - <Lane>1</Lane> - <Lane>2</Lane> - <Lane>3</Lane> - <Lane>4</Lane> - <Lane>5</Lane> - <Lane>6</Lane> - <Lane>7</Lane> - <Lane>8</Lane> - </AlignToPhiX> - <ClusteringChoice>None</ClusteringChoice> - <RunMode>RapidHighOutput</RunMode> - <Rehyb>None</Rehyb> - <PerformPreRunFluidicsCheck>false</PerformPreRunFluidicsCheck> - <ServiceRun>false</ServiceRun> - <ApplicationName>HiSeq Control Software</ApplicationName> - <ApplicationVersion>2.2.38</ApplicationVersion> - <RunID>141212_D00535_0038_BC6A12ANXX</RunID> - <RunStartDate>141212</RunStartDate> - <IntegrationMode>Standalone</IntegrationMode> - <BaseSpaceSettings> - <Username /> - <RunId /> - <TempFolder /> - <SendInstrumentHealthToILMN>false</SendInstrumentHealthToILMN> - <RunMonitoringOnly>false</RunMonitoringOnly> - <PlannedRun>false</PlannedRun> - </BaseSpaceSettings> - <ScannerID>D00535</ScannerID> - <ScanNumber>38</ScanNumber> - <ComputerName>BS-DSFCONTROL06</ComputerName> - <FPGAVersion>7.9.7</FPGAVersion> - <CPLDVersion>3.0.0</CPLDVersion> - <RTAVersion>1.18.61</RTAVersion> - <ChemistryVersion>Illumina,Bruno Fluidics Controller,0,v2.0340</ChemistryVersion> - <CameraFirmware>2.01-F20-R02</CameraFirmware> - <CameraDriver>6.45.20.3690</CameraDriver> - <FocusCameraFirmware /> - <Barcode>C6A12ANXX</Barcode> - <WashBarcode>C4R3MANXX</WashBarcode> - <Username>bs-dsfcontrol06</Username> - <SelectedSections> - <Section Name="A_1" /> - <Section Name="B_1" /> - <Section Name="C_1" /> - <Section Name="D_1" /> - <Section Name="E_1" /> - <Section Name="F_1" /> - <Section Name="G_1" /> - <Section Name="H_1" /> - </SelectedSections> - <FocusMethod>DynamicITF</FocusMethod> - <SelectedSurface>BothLaneSurfaces</SelectedSurface> - <SwathScanMode>AutoSwath</SwathScanMode> - <EnableLft>true</EnableLft> - <AutoTiltOnce>true</AutoTiltOnce> - <EnableAutoCenter>true</EnableAutoCenter> - <EnableAnalysis>true</EnableAnalysis> - <EnableBasecalling>true</EnableBasecalling> - <EnableCameraLogging>false</EnableCameraLogging> - <AdapterPlate>HiSeq Adapter Plate</AdapterPlate> - <SlideHolder>HiSeq Flow Cell Holder</SlideHolder> - <TemplateCycleCount>5</TemplateCycleCount> - <NumAnalysisThreads>8</NumAnalysisThreads> - <FPGADynamicFocusSettings> - <MaxInitialZJumpHalfUm>3</MaxInitialZJumpHalfUm> - <MaxSubsequentZJumpHalfUm>7</MaxSubsequentZJumpHalfUm> - <NumberOfInitialZJumps>0</NumberOfInitialZJumps> - <CVGainStart>500</CVGainStart> - <CVGainPosLocked>500</CVGainPosLocked> - <Offset>250</Offset> - <HotPixel>350</HotPixel> - <MotorDelayFrames>10</MotorDelayFrames> - <SoftwareLaserLag>200</SoftwareLaserLag> - <DitherSize>100</DitherSize> - <GroupSize>40</GroupSize> - <DitherShift>0</DitherShift> - <IntensityCeiling>65535</IntensityCeiling> - <IGain>100</IGain> - <IHistory>4</IHistory> - </FPGADynamicFocusSettings> - <TileWidth>2048</TileWidth> - <TileHeight>10000</TileHeight> - <ImageWidth>2048</ImageWidth> - <ImageHeight>160000</ImageHeight> - <AreaPerPixelmm2>1.40625E-07</AreaPerPixelmm2> - <LaneLength>60</LaneLength> - <NumTilesPerSwath>16</NumTilesPerSwath> - <NumSwaths>3</NumSwaths> - <UseExistingRecipe>false</UseExistingRecipe> - <Reads> - <Read Number="1" NumCycles="51" IsIndexedRead="N" /> - <Read Number="2" NumCycles="7" IsIndexedRead="Y" /> - </Reads> - <EnableNotifications>false</EnableNotifications> - <ReagentKits> - <Sbs> - <SbsReagentKit> - <ID>RGT4611449RGT4588772RGT4731952</ID> - <Prime>false</Prime> - <NumberCyclesRemaining>74</NumberCyclesRemaining> - <IsNew50Cycle>true</IsNew50Cycle> - <IsNew200Cycle>false</IsNew200Cycle> - </SbsReagentKit> - </Sbs> - <Index> - <ReagentKit> - <ID /> - </ReagentKit> - </Index> - <Pe /> - <Rehyb /> - </ReagentKits> - <ReagentBottles> - <Sbs /> - </ReagentBottles> - <Resume>false</Resume> - <ResumeCycle>0</ResumeCycle> - <SupportMultipleSurfacesInUI>true</SupportMultipleSurfacesInUI> - <TempFolder>E:\Illumina\HiSeqTemp\141212_D00535_0038_BC6A12ANXX</TempFolder> - <RecipeFragmentVersion>1.5.14.0</RecipeFragmentVersion> - <PromptForPeReagents>false</PromptForPeReagents> - <MockRun>false</MockRun> - <ScannedBarcode /> - </Setup> - <Version>1</Version> -</RunParameters> \ No newline at end of file diff --git a/deep_sequencing_unit/resource/test-data/QGFCreateFlowCellHiseqTest/141212_D00535_0038_BC6A12ANXX_NonmatchingFolderName/RunInfo.xml b/deep_sequencing_unit/resource/test-data/QGFCreateFlowCellHiseqTest/141212_D00535_0038_BC6A12ANXX_NonmatchingFolderName/RunInfo.xml deleted file mode 100644 index de51e4e7d169eeb5f6489b2523b7ff63cd3b4613..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/resource/test-data/QGFCreateFlowCellHiseqTest/141212_D00535_0038_BC6A12ANXX_NonmatchingFolderName/RunInfo.xml +++ /dev/null @@ -1,23 +0,0 @@ -<?xml version="1.0"?> -<RunInfo xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Version="2"> - <Run Id="141212_D00535_0038_BC6A12ANXX" Number="38"> - <Flowcell>C6A12ANXX</Flowcell> - <Instrument>D00535</Instrument> - <Date>141212</Date> - <Reads> - <Read Number="1" NumCycles="51" IsIndexedRead="N" /> - <Read Number="2" NumCycles="7" IsIndexedRead="Y" /> - </Reads> - <FlowcellLayout LaneCount="8" SurfaceCount="2" SwathCount="3" TileCount="16" /> - <AlignToPhiX> - <Lane>1</Lane> - <Lane>2</Lane> - <Lane>3</Lane> - <Lane>4</Lane> - <Lane>5</Lane> - <Lane>6</Lane> - <Lane>7</Lane> - <Lane>8</Lane> - </AlignToPhiX> - </Run> -</RunInfo> \ No newline at end of file diff --git a/deep_sequencing_unit/resource/test-data/QGFCreateFlowCellHiseqTest/141212_D00535_0038_BC6A12ANXX_NonmatchingFolderName/runParameters.xml b/deep_sequencing_unit/resource/test-data/QGFCreateFlowCellHiseqTest/141212_D00535_0038_BC6A12ANXX_NonmatchingFolderName/runParameters.xml deleted file mode 100644 index a8074b90066291c5ba48661aea68a84e860d5d77..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/resource/test-data/QGFCreateFlowCellHiseqTest/141212_D00535_0038_BC6A12ANXX_NonmatchingFolderName/runParameters.xml +++ /dev/null @@ -1,151 +0,0 @@ -<?xml version="1.0"?> -<RunParameters xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> - <Setup> - <ExperimentName>141212_C6A12ANXX</ExperimentName> - <ScanID>-999</ScanID> - <FCPosition>B</FCPosition> - <WorkFlowType>SINGLEINDEX</WorkFlowType> - <PairEndFC>false</PairEndFC> - <Read1>51</Read1> - <IndexRead1>7</IndexRead1> - <IndexRead2>0</IndexRead2> - <Read2>0</Read2> - <OutputFolder>Y:\jabba</OutputFolder> - <CompressBcls>true</CompressBcls> - <RemapQScores /> - <NearNeighborCorrection>false</NearNeighborCorrection> - <PeriodicSave>Save All Thumbnails</PeriodicSave> - <Flowcell>HiSeq Flow Cell v4</Flowcell> - <FirstBaseConfirmation>true</FirstBaseConfirmation> - <SampleSheet /> - <KeepIntensityFiles>false</KeepIntensityFiles> - <Sbs>HiSeq SBS Kit v4</Sbs> - <Pe /> - <Index>HiSeq v4 Single Index</Index> - <AlignToPhiX> - <Lane>1</Lane> - <Lane>2</Lane> - <Lane>3</Lane> - <Lane>4</Lane> - <Lane>5</Lane> - <Lane>6</Lane> - <Lane>7</Lane> - <Lane>8</Lane> - </AlignToPhiX> - <ClusteringChoice>None</ClusteringChoice> - <RunMode>RapidHighOutput</RunMode> - <Rehyb>None</Rehyb> - <PerformPreRunFluidicsCheck>false</PerformPreRunFluidicsCheck> - <ServiceRun>false</ServiceRun> - <ApplicationName>HiSeq Control Software</ApplicationName> - <ApplicationVersion>2.2.38</ApplicationVersion> - <RunID>141212_D00535_0038_BC6A12ANXX</RunID> - <RunStartDate>141212</RunStartDate> - <IntegrationMode>Standalone</IntegrationMode> - <BaseSpaceSettings> - <Username /> - <RunId /> - <TempFolder /> - <SendInstrumentHealthToILMN>false</SendInstrumentHealthToILMN> - <RunMonitoringOnly>false</RunMonitoringOnly> - <PlannedRun>false</PlannedRun> - </BaseSpaceSettings> - <ScannerID>D00535</ScannerID> - <ScanNumber>38</ScanNumber> - <ComputerName>BS-DSFCONTROL06</ComputerName> - <FPGAVersion>7.9.7</FPGAVersion> - <CPLDVersion>3.0.0</CPLDVersion> - <RTAVersion>1.18.61</RTAVersion> - <ChemistryVersion>Illumina,Bruno Fluidics Controller,0,v2.0340</ChemistryVersion> - <CameraFirmware>2.01-F20-R02</CameraFirmware> - <CameraDriver>6.45.20.3690</CameraDriver> - <FocusCameraFirmware /> - <Barcode>C6A12ANXX</Barcode> - <WashBarcode>C4R3MANXX</WashBarcode> - <Username>bs-dsfcontrol06</Username> - <SelectedSections> - <Section Name="A_1" /> - <Section Name="B_1" /> - <Section Name="C_1" /> - <Section Name="D_1" /> - <Section Name="E_1" /> - <Section Name="F_1" /> - <Section Name="G_1" /> - <Section Name="H_1" /> - </SelectedSections> - <FocusMethod>DynamicITF</FocusMethod> - <SelectedSurface>BothLaneSurfaces</SelectedSurface> - <SwathScanMode>AutoSwath</SwathScanMode> - <EnableLft>true</EnableLft> - <AutoTiltOnce>true</AutoTiltOnce> - <EnableAutoCenter>true</EnableAutoCenter> - <EnableAnalysis>true</EnableAnalysis> - <EnableBasecalling>true</EnableBasecalling> - <EnableCameraLogging>false</EnableCameraLogging> - <AdapterPlate>HiSeq Adapter Plate</AdapterPlate> - <SlideHolder>HiSeq Flow Cell Holder</SlideHolder> - <TemplateCycleCount>5</TemplateCycleCount> - <NumAnalysisThreads>8</NumAnalysisThreads> - <FPGADynamicFocusSettings> - <MaxInitialZJumpHalfUm>3</MaxInitialZJumpHalfUm> - <MaxSubsequentZJumpHalfUm>7</MaxSubsequentZJumpHalfUm> - <NumberOfInitialZJumps>0</NumberOfInitialZJumps> - <CVGainStart>500</CVGainStart> - <CVGainPosLocked>500</CVGainPosLocked> - <Offset>250</Offset> - <HotPixel>350</HotPixel> - <MotorDelayFrames>10</MotorDelayFrames> - <SoftwareLaserLag>200</SoftwareLaserLag> - <DitherSize>100</DitherSize> - <GroupSize>40</GroupSize> - <DitherShift>0</DitherShift> - <IntensityCeiling>65535</IntensityCeiling> - <IGain>100</IGain> - <IHistory>4</IHistory> - </FPGADynamicFocusSettings> - <TileWidth>2048</TileWidth> - <TileHeight>10000</TileHeight> - <ImageWidth>2048</ImageWidth> - <ImageHeight>160000</ImageHeight> - <AreaPerPixelmm2>1.40625E-07</AreaPerPixelmm2> - <LaneLength>60</LaneLength> - <NumTilesPerSwath>16</NumTilesPerSwath> - <NumSwaths>3</NumSwaths> - <UseExistingRecipe>false</UseExistingRecipe> - <Reads> - <Read Number="1" NumCycles="51" IsIndexedRead="N" /> - <Read Number="2" NumCycles="7" IsIndexedRead="Y" /> - </Reads> - <EnableNotifications>false</EnableNotifications> - <ReagentKits> - <Sbs> - <SbsReagentKit> - <ID>RGT4611449RGT4588772RGT4731952</ID> - <Prime>false</Prime> - <NumberCyclesRemaining>74</NumberCyclesRemaining> - <IsNew50Cycle>true</IsNew50Cycle> - <IsNew200Cycle>false</IsNew200Cycle> - </SbsReagentKit> - </Sbs> - <Index> - <ReagentKit> - <ID /> - </ReagentKit> - </Index> - <Pe /> - <Rehyb /> - </ReagentKits> - <ReagentBottles> - <Sbs /> - </ReagentBottles> - <Resume>false</Resume> - <ResumeCycle>0</ResumeCycle> - <SupportMultipleSurfacesInUI>true</SupportMultipleSurfacesInUI> - <TempFolder>E:\Illumina\HiSeqTemp\141212_D00535_0038_BC6A12ANXX</TempFolder> - <RecipeFragmentVersion>1.5.14.0</RecipeFragmentVersion> - <PromptForPeReagents>false</PromptForPeReagents> - <MockRun>false</MockRun> - <ScannedBarcode /> - </Setup> - <Version>1</Version> -</RunParameters> \ No newline at end of file diff --git a/deep_sequencing_unit/resource/test-data/QGFCreateFlowcellNextseqTest/141212_NS500318_0033_AH16YMBGXX/RunInfo.xml b/deep_sequencing_unit/resource/test-data/QGFCreateFlowcellNextseqTest/141212_NS500318_0033_AH16YMBGXX/RunInfo.xml deleted file mode 100644 index 168a72f9f210a6fd2462956cb76ed4842e4254eb..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/resource/test-data/QGFCreateFlowcellNextseqTest/141212_NS500318_0033_AH16YMBGXX/RunInfo.xml +++ /dev/null @@ -1,888 +0,0 @@ -<?xml version="1.0"?> -<RunInfo xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Version="4"> - <Run Id="141212_NS500318_0033_AH16YMBGXX" Number="33"> - <Flowcell>H16YMBGXX</Flowcell> - <Instrument>NS500318</Instrument> - <Date>141212</Date> - <Reads> - <Read Number="1" NumCycles="76" IsIndexedRead="N" /> - <Read Number="2" NumCycles="8" IsIndexedRead="Y" /> - <Read Number="3" NumCycles="8" IsIndexedRead="Y" /> - </Reads> - <FlowcellLayout LaneCount="4" SurfaceCount="2" SwathCount="3" TileCount="12" SectionPerLane="3" LanePerSection="2"> - <TileSet TileNamingConvention="FiveDigit"> - <Tiles> - <Tile>1_11101</Tile> - <Tile>1_21101</Tile> - <Tile>1_11102</Tile> - <Tile>1_21102</Tile> - <Tile>1_11103</Tile> - <Tile>1_21103</Tile> - <Tile>1_11104</Tile> - <Tile>1_21104</Tile> - <Tile>1_11105</Tile> - <Tile>1_21105</Tile> - <Tile>1_11106</Tile> - <Tile>1_21106</Tile> - <Tile>1_11107</Tile> - <Tile>1_21107</Tile> - <Tile>1_11108</Tile> - <Tile>1_21108</Tile> - <Tile>1_11109</Tile> - <Tile>1_21109</Tile> - <Tile>1_11110</Tile> - <Tile>1_21110</Tile> - <Tile>1_11111</Tile> - <Tile>1_21111</Tile> - <Tile>1_11112</Tile> - <Tile>1_21112</Tile> - <Tile>1_12101</Tile> - <Tile>1_22101</Tile> - <Tile>1_12102</Tile> - <Tile>1_22102</Tile> - <Tile>1_12103</Tile> - <Tile>1_22103</Tile> - <Tile>1_12104</Tile> - <Tile>1_22104</Tile> - <Tile>1_12105</Tile> - <Tile>1_22105</Tile> - <Tile>1_12106</Tile> - <Tile>1_22106</Tile> - <Tile>1_12107</Tile> - <Tile>1_22107</Tile> - <Tile>1_12108</Tile> - <Tile>1_22108</Tile> - <Tile>1_12109</Tile> - <Tile>1_22109</Tile> - <Tile>1_12110</Tile> - <Tile>1_22110</Tile> - <Tile>1_12111</Tile> - <Tile>1_22111</Tile> - <Tile>1_12112</Tile> - <Tile>1_22112</Tile> - <Tile>1_13101</Tile> - <Tile>1_23101</Tile> - <Tile>1_13102</Tile> - <Tile>1_23102</Tile> - <Tile>1_13103</Tile> - <Tile>1_23103</Tile> - <Tile>1_13104</Tile> - <Tile>1_23104</Tile> - <Tile>1_13105</Tile> - <Tile>1_23105</Tile> - <Tile>1_13106</Tile> - <Tile>1_23106</Tile> - <Tile>1_13107</Tile> - <Tile>1_23107</Tile> - <Tile>1_13108</Tile> - <Tile>1_23108</Tile> - <Tile>1_13109</Tile> - <Tile>1_23109</Tile> - <Tile>1_13110</Tile> - <Tile>1_23110</Tile> - <Tile>1_13111</Tile> - <Tile>1_23111</Tile> - <Tile>1_13112</Tile> - <Tile>1_23112</Tile> - <Tile>2_11101</Tile> - <Tile>2_21101</Tile> - <Tile>2_11102</Tile> - <Tile>2_21102</Tile> - <Tile>2_11103</Tile> - <Tile>2_21103</Tile> - <Tile>2_11104</Tile> - <Tile>2_21104</Tile> - <Tile>2_11105</Tile> - <Tile>2_21105</Tile> - <Tile>2_11106</Tile> - <Tile>2_21106</Tile> - <Tile>2_11107</Tile> - <Tile>2_21107</Tile> - <Tile>2_11108</Tile> - <Tile>2_21108</Tile> - <Tile>2_11109</Tile> - <Tile>2_21109</Tile> - <Tile>2_11110</Tile> - <Tile>2_21110</Tile> - <Tile>2_11111</Tile> - <Tile>2_21111</Tile> - <Tile>2_11112</Tile> - <Tile>2_21112</Tile> - <Tile>2_12101</Tile> - <Tile>2_22101</Tile> - <Tile>2_12102</Tile> - <Tile>2_22102</Tile> - <Tile>2_12103</Tile> - <Tile>2_22103</Tile> - <Tile>2_12104</Tile> - <Tile>2_22104</Tile> - <Tile>2_12105</Tile> - <Tile>2_22105</Tile> - <Tile>2_12106</Tile> - <Tile>2_22106</Tile> - <Tile>2_12107</Tile> - <Tile>2_22107</Tile> - <Tile>2_12108</Tile> - <Tile>2_22108</Tile> - <Tile>2_12109</Tile> - <Tile>2_22109</Tile> - <Tile>2_12110</Tile> - <Tile>2_22110</Tile> - <Tile>2_12111</Tile> - <Tile>2_22111</Tile> - <Tile>2_12112</Tile> - <Tile>2_22112</Tile> - <Tile>2_13101</Tile> - <Tile>2_23101</Tile> - <Tile>2_13102</Tile> - <Tile>2_23102</Tile> - <Tile>2_13103</Tile> - <Tile>2_23103</Tile> - <Tile>2_13104</Tile> - <Tile>2_23104</Tile> - <Tile>2_13105</Tile> - <Tile>2_23105</Tile> - <Tile>2_13106</Tile> - <Tile>2_23106</Tile> - <Tile>2_13107</Tile> - <Tile>2_23107</Tile> - <Tile>2_13108</Tile> - <Tile>2_23108</Tile> - <Tile>2_13109</Tile> - <Tile>2_23109</Tile> - <Tile>2_13110</Tile> - <Tile>2_23110</Tile> - <Tile>2_13111</Tile> - <Tile>2_23111</Tile> - <Tile>2_13112</Tile> - <Tile>2_23112</Tile> - <Tile>1_11201</Tile> - <Tile>1_21201</Tile> - <Tile>1_11202</Tile> - <Tile>1_21202</Tile> - <Tile>1_11203</Tile> - <Tile>1_21203</Tile> - <Tile>1_11204</Tile> - <Tile>1_21204</Tile> - <Tile>1_11205</Tile> - <Tile>1_21205</Tile> - <Tile>1_11206</Tile> - <Tile>1_21206</Tile> - <Tile>1_11207</Tile> - <Tile>1_21207</Tile> - <Tile>1_11208</Tile> - <Tile>1_21208</Tile> - <Tile>1_11209</Tile> - <Tile>1_21209</Tile> - <Tile>1_11210</Tile> - <Tile>1_21210</Tile> - <Tile>1_11211</Tile> - <Tile>1_21211</Tile> - <Tile>1_11212</Tile> - <Tile>1_21212</Tile> - <Tile>1_12201</Tile> - <Tile>1_22201</Tile> - <Tile>1_12202</Tile> - <Tile>1_22202</Tile> - <Tile>1_12203</Tile> - <Tile>1_22203</Tile> - <Tile>1_12204</Tile> - <Tile>1_22204</Tile> - <Tile>1_12205</Tile> - <Tile>1_22205</Tile> - <Tile>1_12206</Tile> - <Tile>1_22206</Tile> - <Tile>1_12207</Tile> - <Tile>1_22207</Tile> - <Tile>1_12208</Tile> - <Tile>1_22208</Tile> - <Tile>1_12209</Tile> - <Tile>1_22209</Tile> - <Tile>1_12210</Tile> - <Tile>1_22210</Tile> - <Tile>1_12211</Tile> - <Tile>1_22211</Tile> - <Tile>1_12212</Tile> - <Tile>1_22212</Tile> - <Tile>1_13201</Tile> - <Tile>1_23201</Tile> - <Tile>1_13202</Tile> - <Tile>1_23202</Tile> - <Tile>1_13203</Tile> - <Tile>1_23203</Tile> - <Tile>1_13204</Tile> - <Tile>1_23204</Tile> - <Tile>1_13205</Tile> - <Tile>1_23205</Tile> - <Tile>1_13206</Tile> - <Tile>1_23206</Tile> - <Tile>1_13207</Tile> - <Tile>1_23207</Tile> - <Tile>1_13208</Tile> - <Tile>1_23208</Tile> - <Tile>1_13209</Tile> - <Tile>1_23209</Tile> - <Tile>1_13210</Tile> - <Tile>1_23210</Tile> - <Tile>1_13211</Tile> - <Tile>1_23211</Tile> - <Tile>1_13212</Tile> - <Tile>1_23212</Tile> - <Tile>2_11201</Tile> - <Tile>2_21201</Tile> - <Tile>2_11202</Tile> - <Tile>2_21202</Tile> - <Tile>2_11203</Tile> - <Tile>2_21203</Tile> - <Tile>2_11204</Tile> - <Tile>2_21204</Tile> - <Tile>2_11205</Tile> - <Tile>2_21205</Tile> - <Tile>2_11206</Tile> - <Tile>2_21206</Tile> - <Tile>2_11207</Tile> - <Tile>2_21207</Tile> - <Tile>2_11208</Tile> - <Tile>2_21208</Tile> - <Tile>2_11209</Tile> - <Tile>2_21209</Tile> - <Tile>2_11210</Tile> - <Tile>2_21210</Tile> - <Tile>2_11211</Tile> - <Tile>2_21211</Tile> - <Tile>2_11212</Tile> - <Tile>2_21212</Tile> - <Tile>2_12201</Tile> - <Tile>2_22201</Tile> - <Tile>2_12202</Tile> - <Tile>2_22202</Tile> - <Tile>2_12203</Tile> - <Tile>2_22203</Tile> - <Tile>2_12204</Tile> - <Tile>2_22204</Tile> - <Tile>2_12205</Tile> - <Tile>2_22205</Tile> - <Tile>2_12206</Tile> - <Tile>2_22206</Tile> - <Tile>2_12207</Tile> - <Tile>2_22207</Tile> - <Tile>2_12208</Tile> - <Tile>2_22208</Tile> - <Tile>2_12209</Tile> - <Tile>2_22209</Tile> - <Tile>2_12210</Tile> - <Tile>2_22210</Tile> - <Tile>2_12211</Tile> - <Tile>2_22211</Tile> - <Tile>2_12212</Tile> - <Tile>2_22212</Tile> - <Tile>2_13201</Tile> - <Tile>2_23201</Tile> - <Tile>2_13202</Tile> - <Tile>2_23202</Tile> - <Tile>2_13203</Tile> - <Tile>2_23203</Tile> - <Tile>2_13204</Tile> - <Tile>2_23204</Tile> - <Tile>2_13205</Tile> - <Tile>2_23205</Tile> - <Tile>2_13206</Tile> - <Tile>2_23206</Tile> - <Tile>2_13207</Tile> - <Tile>2_23207</Tile> - <Tile>2_13208</Tile> - <Tile>2_23208</Tile> - <Tile>2_13209</Tile> - <Tile>2_23209</Tile> - <Tile>2_13210</Tile> - <Tile>2_23210</Tile> - <Tile>2_13211</Tile> - <Tile>2_23211</Tile> - <Tile>2_13212</Tile> - <Tile>2_23212</Tile> - <Tile>1_11301</Tile> - <Tile>1_21301</Tile> - <Tile>1_11302</Tile> - <Tile>1_21302</Tile> - <Tile>1_11303</Tile> - <Tile>1_21303</Tile> - <Tile>1_11304</Tile> - <Tile>1_21304</Tile> - <Tile>1_11305</Tile> - <Tile>1_21305</Tile> - <Tile>1_11306</Tile> - <Tile>1_21306</Tile> - <Tile>1_11307</Tile> - <Tile>1_21307</Tile> - <Tile>1_11308</Tile> - <Tile>1_21308</Tile> - <Tile>1_11309</Tile> - <Tile>1_21309</Tile> - <Tile>1_11310</Tile> - <Tile>1_21310</Tile> - <Tile>1_11311</Tile> - <Tile>1_21311</Tile> - <Tile>1_11312</Tile> - <Tile>1_21312</Tile> - <Tile>1_12301</Tile> - <Tile>1_22301</Tile> - <Tile>1_12302</Tile> - <Tile>1_22302</Tile> - <Tile>1_12303</Tile> - <Tile>1_22303</Tile> - <Tile>1_12304</Tile> - <Tile>1_22304</Tile> - <Tile>1_12305</Tile> - <Tile>1_22305</Tile> - <Tile>1_12306</Tile> - <Tile>1_22306</Tile> - <Tile>1_12307</Tile> - <Tile>1_22307</Tile> - <Tile>1_12308</Tile> - <Tile>1_22308</Tile> - <Tile>1_12309</Tile> - <Tile>1_22309</Tile> - <Tile>1_12310</Tile> - <Tile>1_22310</Tile> - <Tile>1_12311</Tile> - <Tile>1_22311</Tile> - <Tile>1_12312</Tile> - <Tile>1_22312</Tile> - <Tile>1_13301</Tile> - <Tile>1_23301</Tile> - <Tile>1_13302</Tile> - <Tile>1_23302</Tile> - <Tile>1_13303</Tile> - <Tile>1_23303</Tile> - <Tile>1_13304</Tile> - <Tile>1_23304</Tile> - <Tile>1_13305</Tile> - <Tile>1_23305</Tile> - <Tile>1_13306</Tile> - <Tile>1_23306</Tile> - <Tile>1_13307</Tile> - <Tile>1_23307</Tile> - <Tile>1_13308</Tile> - <Tile>1_23308</Tile> - <Tile>1_13309</Tile> - <Tile>1_23309</Tile> - <Tile>1_13310</Tile> - <Tile>1_23310</Tile> - <Tile>1_13311</Tile> - <Tile>1_23311</Tile> - <Tile>1_13312</Tile> - <Tile>1_23312</Tile> - <Tile>2_11301</Tile> - <Tile>2_21301</Tile> - <Tile>2_11302</Tile> - <Tile>2_21302</Tile> - <Tile>2_11303</Tile> - <Tile>2_21303</Tile> - <Tile>2_11304</Tile> - <Tile>2_21304</Tile> - <Tile>2_11305</Tile> - <Tile>2_21305</Tile> - <Tile>2_11306</Tile> - <Tile>2_21306</Tile> - <Tile>2_11307</Tile> - <Tile>2_21307</Tile> - <Tile>2_11308</Tile> - <Tile>2_21308</Tile> - <Tile>2_11309</Tile> - <Tile>2_21309</Tile> - <Tile>2_11310</Tile> - <Tile>2_21310</Tile> - <Tile>2_11311</Tile> - <Tile>2_21311</Tile> - <Tile>2_11312</Tile> - <Tile>2_21312</Tile> - <Tile>2_12301</Tile> - <Tile>2_22301</Tile> - <Tile>2_12302</Tile> - <Tile>2_22302</Tile> - <Tile>2_12303</Tile> - <Tile>2_22303</Tile> - <Tile>2_12304</Tile> - <Tile>2_22304</Tile> - <Tile>2_12305</Tile> - <Tile>2_22305</Tile> - <Tile>2_12306</Tile> - <Tile>2_22306</Tile> - <Tile>2_12307</Tile> - <Tile>2_22307</Tile> - <Tile>2_12308</Tile> - <Tile>2_22308</Tile> - <Tile>2_12309</Tile> - <Tile>2_22309</Tile> - <Tile>2_12310</Tile> - <Tile>2_22310</Tile> - <Tile>2_12311</Tile> - <Tile>2_22311</Tile> - <Tile>2_12312</Tile> - <Tile>2_22312</Tile> - <Tile>2_13301</Tile> - <Tile>2_23301</Tile> - <Tile>2_13302</Tile> - <Tile>2_23302</Tile> - <Tile>2_13303</Tile> - <Tile>2_23303</Tile> - <Tile>2_13304</Tile> - <Tile>2_23304</Tile> - <Tile>2_13305</Tile> - <Tile>2_23305</Tile> - <Tile>2_13306</Tile> - <Tile>2_23306</Tile> - <Tile>2_13307</Tile> - <Tile>2_23307</Tile> - <Tile>2_13308</Tile> - <Tile>2_23308</Tile> - <Tile>2_13309</Tile> - <Tile>2_23309</Tile> - <Tile>2_13310</Tile> - <Tile>2_23310</Tile> - <Tile>2_13311</Tile> - <Tile>2_23311</Tile> - <Tile>2_13312</Tile> - <Tile>2_23312</Tile> - <Tile>1_11401</Tile> - <Tile>1_21401</Tile> - <Tile>1_11402</Tile> - <Tile>1_21402</Tile> - <Tile>1_11403</Tile> - <Tile>1_21403</Tile> - <Tile>1_11404</Tile> - <Tile>1_21404</Tile> - <Tile>1_11405</Tile> - <Tile>1_21405</Tile> - <Tile>1_11406</Tile> - <Tile>1_21406</Tile> - <Tile>1_11407</Tile> - <Tile>1_21407</Tile> - <Tile>1_11408</Tile> - <Tile>1_21408</Tile> - <Tile>1_11409</Tile> - <Tile>1_21409</Tile> - <Tile>1_11410</Tile> - <Tile>1_21410</Tile> - <Tile>1_11411</Tile> - <Tile>1_21411</Tile> - <Tile>1_11412</Tile> - <Tile>1_21412</Tile> - <Tile>1_12401</Tile> - <Tile>1_22401</Tile> - <Tile>1_12402</Tile> - <Tile>1_22402</Tile> - <Tile>1_12403</Tile> - <Tile>1_22403</Tile> - <Tile>1_12404</Tile> - <Tile>1_22404</Tile> - <Tile>1_12405</Tile> - <Tile>1_22405</Tile> - <Tile>1_12406</Tile> - <Tile>1_22406</Tile> - <Tile>1_12407</Tile> - <Tile>1_22407</Tile> - <Tile>1_12408</Tile> - <Tile>1_22408</Tile> - <Tile>1_12409</Tile> - <Tile>1_22409</Tile> - <Tile>1_12410</Tile> - <Tile>1_22410</Tile> - <Tile>1_12411</Tile> - <Tile>1_22411</Tile> - <Tile>1_12412</Tile> - <Tile>1_22412</Tile> - <Tile>1_13401</Tile> - <Tile>1_23401</Tile> - <Tile>1_13402</Tile> - <Tile>1_23402</Tile> - <Tile>1_13403</Tile> - <Tile>1_23403</Tile> - <Tile>1_13404</Tile> - <Tile>1_23404</Tile> - <Tile>1_13405</Tile> - <Tile>1_23405</Tile> - <Tile>1_13406</Tile> - <Tile>1_23406</Tile> - <Tile>1_13407</Tile> - <Tile>1_23407</Tile> - <Tile>1_13408</Tile> - <Tile>1_23408</Tile> - <Tile>1_13409</Tile> - <Tile>1_23409</Tile> - <Tile>1_13410</Tile> - <Tile>1_23410</Tile> - <Tile>1_13411</Tile> - <Tile>1_23411</Tile> - <Tile>1_13412</Tile> - <Tile>1_23412</Tile> - <Tile>2_11401</Tile> - <Tile>2_21401</Tile> - <Tile>2_11402</Tile> - <Tile>2_21402</Tile> - <Tile>2_11403</Tile> - <Tile>2_21403</Tile> - <Tile>2_11404</Tile> - <Tile>2_21404</Tile> - <Tile>2_11405</Tile> - <Tile>2_21405</Tile> - <Tile>2_11406</Tile> - <Tile>2_21406</Tile> - <Tile>2_11407</Tile> - <Tile>2_21407</Tile> - <Tile>2_11408</Tile> - <Tile>2_21408</Tile> - <Tile>2_11409</Tile> - <Tile>2_21409</Tile> - <Tile>2_11410</Tile> - <Tile>2_21410</Tile> - <Tile>2_11411</Tile> - <Tile>2_21411</Tile> - <Tile>2_11412</Tile> - <Tile>2_21412</Tile> - <Tile>2_12401</Tile> - <Tile>2_22401</Tile> - <Tile>2_12402</Tile> - <Tile>2_22402</Tile> - <Tile>2_12403</Tile> - <Tile>2_22403</Tile> - <Tile>2_12404</Tile> - <Tile>2_22404</Tile> - <Tile>2_12405</Tile> - <Tile>2_22405</Tile> - <Tile>2_12406</Tile> - <Tile>2_22406</Tile> - <Tile>2_12407</Tile> - <Tile>2_22407</Tile> - <Tile>2_12408</Tile> - <Tile>2_22408</Tile> - <Tile>2_12409</Tile> - <Tile>2_22409</Tile> - <Tile>2_12410</Tile> - <Tile>2_22410</Tile> - <Tile>2_12411</Tile> - <Tile>2_22411</Tile> - <Tile>2_12412</Tile> - <Tile>2_22412</Tile> - <Tile>2_13401</Tile> - <Tile>2_23401</Tile> - <Tile>2_13402</Tile> - <Tile>2_23402</Tile> - <Tile>2_13403</Tile> - <Tile>2_23403</Tile> - <Tile>2_13404</Tile> - <Tile>2_23404</Tile> - <Tile>2_13405</Tile> - <Tile>2_23405</Tile> - <Tile>2_13406</Tile> - <Tile>2_23406</Tile> - <Tile>2_13407</Tile> - <Tile>2_23407</Tile> - <Tile>2_13408</Tile> - <Tile>2_23408</Tile> - <Tile>2_13409</Tile> - <Tile>2_23409</Tile> - <Tile>2_13410</Tile> - <Tile>2_23410</Tile> - <Tile>2_13411</Tile> - <Tile>2_23411</Tile> - <Tile>2_13412</Tile> - <Tile>2_23412</Tile> - <Tile>1_11501</Tile> - <Tile>1_21501</Tile> - <Tile>1_11502</Tile> - <Tile>1_21502</Tile> - <Tile>1_11503</Tile> - <Tile>1_21503</Tile> - <Tile>1_11504</Tile> - <Tile>1_21504</Tile> - <Tile>1_11505</Tile> - <Tile>1_21505</Tile> - <Tile>1_11506</Tile> - <Tile>1_21506</Tile> - <Tile>1_11507</Tile> - <Tile>1_21507</Tile> - <Tile>1_11508</Tile> - <Tile>1_21508</Tile> - <Tile>1_11509</Tile> - <Tile>1_21509</Tile> - <Tile>1_11510</Tile> - <Tile>1_21510</Tile> - <Tile>1_11511</Tile> - <Tile>1_21511</Tile> - <Tile>1_11512</Tile> - <Tile>1_21512</Tile> - <Tile>1_12501</Tile> - <Tile>1_22501</Tile> - <Tile>1_12502</Tile> - <Tile>1_22502</Tile> - <Tile>1_12503</Tile> - <Tile>1_22503</Tile> - <Tile>1_12504</Tile> - <Tile>1_22504</Tile> - <Tile>1_12505</Tile> - <Tile>1_22505</Tile> - <Tile>1_12506</Tile> - <Tile>1_22506</Tile> - <Tile>1_12507</Tile> - <Tile>1_22507</Tile> - <Tile>1_12508</Tile> - <Tile>1_22508</Tile> - <Tile>1_12509</Tile> - <Tile>1_22509</Tile> - <Tile>1_12510</Tile> - <Tile>1_22510</Tile> - <Tile>1_12511</Tile> - <Tile>1_22511</Tile> - <Tile>1_12512</Tile> - <Tile>1_22512</Tile> - <Tile>1_13501</Tile> - <Tile>1_23501</Tile> - <Tile>1_13502</Tile> - <Tile>1_23502</Tile> - <Tile>1_13503</Tile> - <Tile>1_23503</Tile> - <Tile>1_13504</Tile> - <Tile>1_23504</Tile> - <Tile>1_13505</Tile> - <Tile>1_23505</Tile> - <Tile>1_13506</Tile> - <Tile>1_23506</Tile> - <Tile>1_13507</Tile> - <Tile>1_23507</Tile> - <Tile>1_13508</Tile> - <Tile>1_23508</Tile> - <Tile>1_13509</Tile> - <Tile>1_23509</Tile> - <Tile>1_13510</Tile> - <Tile>1_23510</Tile> - <Tile>1_13511</Tile> - <Tile>1_23511</Tile> - <Tile>1_13512</Tile> - <Tile>1_23512</Tile> - <Tile>2_11501</Tile> - <Tile>2_21501</Tile> - <Tile>2_11502</Tile> - <Tile>2_21502</Tile> - <Tile>2_11503</Tile> - <Tile>2_21503</Tile> - <Tile>2_11504</Tile> - <Tile>2_21504</Tile> - <Tile>2_11505</Tile> - <Tile>2_21505</Tile> - <Tile>2_11506</Tile> - <Tile>2_21506</Tile> - <Tile>2_11507</Tile> - <Tile>2_21507</Tile> - <Tile>2_11508</Tile> - <Tile>2_21508</Tile> - <Tile>2_11509</Tile> - <Tile>2_21509</Tile> - <Tile>2_11510</Tile> - <Tile>2_21510</Tile> - <Tile>2_11511</Tile> - <Tile>2_21511</Tile> - <Tile>2_11512</Tile> - <Tile>2_21512</Tile> - <Tile>2_12501</Tile> - <Tile>2_22501</Tile> - <Tile>2_12502</Tile> - <Tile>2_22502</Tile> - <Tile>2_12503</Tile> - <Tile>2_22503</Tile> - <Tile>2_12504</Tile> - <Tile>2_22504</Tile> - <Tile>2_12505</Tile> - <Tile>2_22505</Tile> - <Tile>2_12506</Tile> - <Tile>2_22506</Tile> - <Tile>2_12507</Tile> - <Tile>2_22507</Tile> - <Tile>2_12508</Tile> - <Tile>2_22508</Tile> - <Tile>2_12509</Tile> - <Tile>2_22509</Tile> - <Tile>2_12510</Tile> - <Tile>2_22510</Tile> - <Tile>2_12511</Tile> - <Tile>2_22511</Tile> - <Tile>2_12512</Tile> - <Tile>2_22512</Tile> - <Tile>2_13501</Tile> - <Tile>2_23501</Tile> - <Tile>2_13502</Tile> - <Tile>2_23502</Tile> - <Tile>2_13503</Tile> - <Tile>2_23503</Tile> - <Tile>2_13504</Tile> - <Tile>2_23504</Tile> - <Tile>2_13505</Tile> - <Tile>2_23505</Tile> - <Tile>2_13506</Tile> - <Tile>2_23506</Tile> - <Tile>2_13507</Tile> - <Tile>2_23507</Tile> - <Tile>2_13508</Tile> - <Tile>2_23508</Tile> - <Tile>2_13509</Tile> - <Tile>2_23509</Tile> - <Tile>2_13510</Tile> - <Tile>2_23510</Tile> - <Tile>2_13511</Tile> - <Tile>2_23511</Tile> - <Tile>2_13512</Tile> - <Tile>2_23512</Tile> - <Tile>1_11601</Tile> - <Tile>1_21601</Tile> - <Tile>1_11602</Tile> - <Tile>1_21602</Tile> - <Tile>1_11603</Tile> - <Tile>1_21603</Tile> - <Tile>1_11604</Tile> - <Tile>1_21604</Tile> - <Tile>1_11605</Tile> - <Tile>1_21605</Tile> - <Tile>1_11606</Tile> - <Tile>1_21606</Tile> - <Tile>1_11607</Tile> - <Tile>1_21607</Tile> - <Tile>1_11608</Tile> - <Tile>1_21608</Tile> - <Tile>1_11609</Tile> - <Tile>1_21609</Tile> - <Tile>1_11610</Tile> - <Tile>1_21610</Tile> - <Tile>1_11611</Tile> - <Tile>1_21611</Tile> - <Tile>1_11612</Tile> - <Tile>1_21612</Tile> - <Tile>1_12601</Tile> - <Tile>1_22601</Tile> - <Tile>1_12602</Tile> - <Tile>1_22602</Tile> - <Tile>1_12603</Tile> - <Tile>1_22603</Tile> - <Tile>1_12604</Tile> - <Tile>1_22604</Tile> - <Tile>1_12605</Tile> - <Tile>1_22605</Tile> - <Tile>1_12606</Tile> - <Tile>1_22606</Tile> - <Tile>1_12607</Tile> - <Tile>1_22607</Tile> - <Tile>1_12608</Tile> - <Tile>1_22608</Tile> - <Tile>1_12609</Tile> - <Tile>1_22609</Tile> - <Tile>1_12610</Tile> - <Tile>1_22610</Tile> - <Tile>1_12611</Tile> - <Tile>1_22611</Tile> - <Tile>1_12612</Tile> - <Tile>1_22612</Tile> - <Tile>1_13601</Tile> - <Tile>1_23601</Tile> - <Tile>1_13602</Tile> - <Tile>1_23602</Tile> - <Tile>1_13603</Tile> - <Tile>1_23603</Tile> - <Tile>1_13604</Tile> - <Tile>1_23604</Tile> - <Tile>1_13605</Tile> - <Tile>1_23605</Tile> - <Tile>1_13606</Tile> - <Tile>1_23606</Tile> - <Tile>1_13607</Tile> - <Tile>1_23607</Tile> - <Tile>1_13608</Tile> - <Tile>1_23608</Tile> - <Tile>1_13609</Tile> - <Tile>1_23609</Tile> - <Tile>1_13610</Tile> - <Tile>1_23610</Tile> - <Tile>1_13611</Tile> - <Tile>1_23611</Tile> - <Tile>1_13612</Tile> - <Tile>1_23612</Tile> - <Tile>2_11601</Tile> - <Tile>2_21601</Tile> - <Tile>2_11602</Tile> - <Tile>2_21602</Tile> - <Tile>2_11603</Tile> - <Tile>2_21603</Tile> - <Tile>2_11604</Tile> - <Tile>2_21604</Tile> - <Tile>2_11605</Tile> - <Tile>2_21605</Tile> - <Tile>2_11606</Tile> - <Tile>2_21606</Tile> - <Tile>2_11607</Tile> - <Tile>2_21607</Tile> - <Tile>2_11608</Tile> - <Tile>2_21608</Tile> - <Tile>2_11609</Tile> - <Tile>2_21609</Tile> - <Tile>2_11610</Tile> - <Tile>2_21610</Tile> - <Tile>2_11611</Tile> - <Tile>2_21611</Tile> - <Tile>2_11612</Tile> - <Tile>2_21612</Tile> - <Tile>2_12601</Tile> - <Tile>2_22601</Tile> - <Tile>2_12602</Tile> - <Tile>2_22602</Tile> - <Tile>2_12603</Tile> - <Tile>2_22603</Tile> - <Tile>2_12604</Tile> - <Tile>2_22604</Tile> - <Tile>2_12605</Tile> - <Tile>2_22605</Tile> - <Tile>2_12606</Tile> - <Tile>2_22606</Tile> - <Tile>2_12607</Tile> - <Tile>2_22607</Tile> - <Tile>2_12608</Tile> - <Tile>2_22608</Tile> - <Tile>2_12609</Tile> - <Tile>2_22609</Tile> - <Tile>2_12610</Tile> - <Tile>2_22610</Tile> - <Tile>2_12611</Tile> - <Tile>2_22611</Tile> - <Tile>2_12612</Tile> - <Tile>2_22612</Tile> - <Tile>2_13601</Tile> - <Tile>2_23601</Tile> - <Tile>2_13602</Tile> - <Tile>2_23602</Tile> - <Tile>2_13603</Tile> - <Tile>2_23603</Tile> - <Tile>2_13604</Tile> - <Tile>2_23604</Tile> - <Tile>2_13605</Tile> - <Tile>2_23605</Tile> - <Tile>2_13606</Tile> - <Tile>2_23606</Tile> - <Tile>2_13607</Tile> - <Tile>2_23607</Tile> - <Tile>2_13608</Tile> - <Tile>2_23608</Tile> - <Tile>2_13609</Tile> - <Tile>2_23609</Tile> - <Tile>2_13610</Tile> - <Tile>2_23610</Tile> - <Tile>2_13611</Tile> - <Tile>2_23611</Tile> - <Tile>2_13612</Tile> - <Tile>2_23612</Tile> - </Tiles> - </TileSet> - </FlowcellLayout> - <ImageDimensions Width="2592" Height="1944" /> - <ImageChannels> - <Name>Red</Name> - <Name>Green</Name> - </ImageChannels> - </Run> -</RunInfo> \ No newline at end of file diff --git a/deep_sequencing_unit/resource/test-data/QGFCreateFlowcellNextseqTest/141212_NS500318_0033_AH16YMBGXX/RunParameters.xml b/deep_sequencing_unit/resource/test-data/QGFCreateFlowcellNextseqTest/141212_NS500318_0033_AH16YMBGXX/RunParameters.xml deleted file mode 100644 index dadfb6c1ad6985ed8818802fde8bba3fc0866bf7..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/resource/test-data/QGFCreateFlowcellNextseqTest/141212_NS500318_0033_AH16YMBGXX/RunParameters.xml +++ /dev/null @@ -1,926 +0,0 @@ -<?xml version="1.0"?> -<RunParameters xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> - <Setup> - <SupportMultipleSurfacesInUI>true</SupportMultipleSurfacesInUI> - <ApplicationVersion>1.3.0.23</ApplicationVersion> - <ApplicationName>NextSeq Control Software</ApplicationName> - <NumTilesPerSwath>12</NumTilesPerSwath> - <NumSwaths>3</NumSwaths> - <NumLanes>4</NumLanes> - <Read1>76</Read1> - <Read2>0</Read2> - <Index1Read>8</Index1Read> - <Index2Read>8</Index2Read> - <SectionPerLane>3</SectionPerLane> - <LanePerSection>2</LanePerSection> - </Setup> - <RunID>141212_NS500318_0033_AH16YMBGXX</RunID> - <InstrumentID>NS500318</InstrumentID> - <RunNumber>33</RunNumber> - <RTAVersion>2.1.3</RTAVersion> - <SystemSuiteVersion>1.3.0.9</SystemSuiteVersion> - <FlowCellSerial>H16YMBGXX</FlowCellSerial> - <PR2BottleSerial>NS2049329-BUFFR</PR2BottleSerial> - <ReagentKitSerial>NS2038160-REAGT</ReagentKitSerial> - <ReagentKitSerialWasEnteredInBaseSpace>false</ReagentKitSerialWasEnteredInBaseSpace> - <ExperimentName>Arnau_SC4</ExperimentName> - <LibraryID /> - <Chemistry>NextSeq High</Chemistry> - <SelectedTiles> - <Tile>1_11101</Tile> - <Tile>1_21101</Tile> - <Tile>1_11102</Tile> - <Tile>1_21102</Tile> - <Tile>1_11103</Tile> - <Tile>1_21103</Tile> - <Tile>1_11104</Tile> - <Tile>1_21104</Tile> - <Tile>1_11105</Tile> - <Tile>1_21105</Tile> - <Tile>1_11106</Tile> - <Tile>1_21106</Tile> - <Tile>1_11107</Tile> - <Tile>1_21107</Tile> - <Tile>1_11108</Tile> - <Tile>1_21108</Tile> - <Tile>1_11109</Tile> - <Tile>1_21109</Tile> - <Tile>1_11110</Tile> - <Tile>1_21110</Tile> - <Tile>1_11111</Tile> - <Tile>1_21111</Tile> - <Tile>1_11112</Tile> - <Tile>1_21112</Tile> - <Tile>1_12101</Tile> - <Tile>1_22101</Tile> - <Tile>1_12102</Tile> - <Tile>1_22102</Tile> - <Tile>1_12103</Tile> - <Tile>1_22103</Tile> - <Tile>1_12104</Tile> - <Tile>1_22104</Tile> - <Tile>1_12105</Tile> - <Tile>1_22105</Tile> - <Tile>1_12106</Tile> - <Tile>1_22106</Tile> - <Tile>1_12107</Tile> - <Tile>1_22107</Tile> - <Tile>1_12108</Tile> - <Tile>1_22108</Tile> - <Tile>1_12109</Tile> - <Tile>1_22109</Tile> - <Tile>1_12110</Tile> - <Tile>1_22110</Tile> - <Tile>1_12111</Tile> - <Tile>1_22111</Tile> - <Tile>1_12112</Tile> - <Tile>1_22112</Tile> - <Tile>1_13101</Tile> - <Tile>1_23101</Tile> - <Tile>1_13102</Tile> - <Tile>1_23102</Tile> - <Tile>1_13103</Tile> - <Tile>1_23103</Tile> - <Tile>1_13104</Tile> - <Tile>1_23104</Tile> - <Tile>1_13105</Tile> - <Tile>1_23105</Tile> - <Tile>1_13106</Tile> - <Tile>1_23106</Tile> - <Tile>1_13107</Tile> - <Tile>1_23107</Tile> - <Tile>1_13108</Tile> - <Tile>1_23108</Tile> - <Tile>1_13109</Tile> - <Tile>1_23109</Tile> - <Tile>1_13110</Tile> - <Tile>1_23110</Tile> - <Tile>1_13111</Tile> - <Tile>1_23111</Tile> - <Tile>1_13112</Tile> - <Tile>1_23112</Tile> - <Tile>2_11101</Tile> - <Tile>2_21101</Tile> - <Tile>2_11102</Tile> - <Tile>2_21102</Tile> - <Tile>2_11103</Tile> - <Tile>2_21103</Tile> - <Tile>2_11104</Tile> - <Tile>2_21104</Tile> - <Tile>2_11105</Tile> - <Tile>2_21105</Tile> - <Tile>2_11106</Tile> - <Tile>2_21106</Tile> - <Tile>2_11107</Tile> - <Tile>2_21107</Tile> - <Tile>2_11108</Tile> - <Tile>2_21108</Tile> - <Tile>2_11109</Tile> - <Tile>2_21109</Tile> - <Tile>2_11110</Tile> - <Tile>2_21110</Tile> - <Tile>2_11111</Tile> - <Tile>2_21111</Tile> - <Tile>2_11112</Tile> - <Tile>2_21112</Tile> - <Tile>2_12101</Tile> - <Tile>2_22101</Tile> - <Tile>2_12102</Tile> - <Tile>2_22102</Tile> - <Tile>2_12103</Tile> - <Tile>2_22103</Tile> - <Tile>2_12104</Tile> - <Tile>2_22104</Tile> - <Tile>2_12105</Tile> - <Tile>2_22105</Tile> - <Tile>2_12106</Tile> - <Tile>2_22106</Tile> - <Tile>2_12107</Tile> - <Tile>2_22107</Tile> - <Tile>2_12108</Tile> - <Tile>2_22108</Tile> - <Tile>2_12109</Tile> - <Tile>2_22109</Tile> - <Tile>2_12110</Tile> - <Tile>2_22110</Tile> - <Tile>2_12111</Tile> - <Tile>2_22111</Tile> - <Tile>2_12112</Tile> - <Tile>2_22112</Tile> - <Tile>2_13101</Tile> - <Tile>2_23101</Tile> - <Tile>2_13102</Tile> - <Tile>2_23102</Tile> - <Tile>2_13103</Tile> - <Tile>2_23103</Tile> - <Tile>2_13104</Tile> - <Tile>2_23104</Tile> - <Tile>2_13105</Tile> - <Tile>2_23105</Tile> - <Tile>2_13106</Tile> - <Tile>2_23106</Tile> - <Tile>2_13107</Tile> - <Tile>2_23107</Tile> - <Tile>2_13108</Tile> - <Tile>2_23108</Tile> - <Tile>2_13109</Tile> - <Tile>2_23109</Tile> - <Tile>2_13110</Tile> - <Tile>2_23110</Tile> - <Tile>2_13111</Tile> - <Tile>2_23111</Tile> - <Tile>2_13112</Tile> - <Tile>2_23112</Tile> - <Tile>1_11201</Tile> - <Tile>1_21201</Tile> - <Tile>1_11202</Tile> - <Tile>1_21202</Tile> - <Tile>1_11203</Tile> - <Tile>1_21203</Tile> - <Tile>1_11204</Tile> - <Tile>1_21204</Tile> - <Tile>1_11205</Tile> - <Tile>1_21205</Tile> - <Tile>1_11206</Tile> - <Tile>1_21206</Tile> - <Tile>1_11207</Tile> - <Tile>1_21207</Tile> - <Tile>1_11208</Tile> - <Tile>1_21208</Tile> - <Tile>1_11209</Tile> - <Tile>1_21209</Tile> - <Tile>1_11210</Tile> - <Tile>1_21210</Tile> - <Tile>1_11211</Tile> - <Tile>1_21211</Tile> - <Tile>1_11212</Tile> - <Tile>1_21212</Tile> - <Tile>1_12201</Tile> - <Tile>1_22201</Tile> - <Tile>1_12202</Tile> - <Tile>1_22202</Tile> - <Tile>1_12203</Tile> - <Tile>1_22203</Tile> - <Tile>1_12204</Tile> - <Tile>1_22204</Tile> - <Tile>1_12205</Tile> - <Tile>1_22205</Tile> - <Tile>1_12206</Tile> - <Tile>1_22206</Tile> - <Tile>1_12207</Tile> - <Tile>1_22207</Tile> - <Tile>1_12208</Tile> - <Tile>1_22208</Tile> - <Tile>1_12209</Tile> - <Tile>1_22209</Tile> - <Tile>1_12210</Tile> - <Tile>1_22210</Tile> - <Tile>1_12211</Tile> - <Tile>1_22211</Tile> - <Tile>1_12212</Tile> - <Tile>1_22212</Tile> - <Tile>1_13201</Tile> - <Tile>1_23201</Tile> - <Tile>1_13202</Tile> - <Tile>1_23202</Tile> - <Tile>1_13203</Tile> - <Tile>1_23203</Tile> - <Tile>1_13204</Tile> - <Tile>1_23204</Tile> - <Tile>1_13205</Tile> - <Tile>1_23205</Tile> - <Tile>1_13206</Tile> - <Tile>1_23206</Tile> - <Tile>1_13207</Tile> - <Tile>1_23207</Tile> - <Tile>1_13208</Tile> - <Tile>1_23208</Tile> - <Tile>1_13209</Tile> - <Tile>1_23209</Tile> - <Tile>1_13210</Tile> - <Tile>1_23210</Tile> - <Tile>1_13211</Tile> - <Tile>1_23211</Tile> - <Tile>1_13212</Tile> - <Tile>1_23212</Tile> - <Tile>2_11201</Tile> - <Tile>2_21201</Tile> - <Tile>2_11202</Tile> - <Tile>2_21202</Tile> - <Tile>2_11203</Tile> - <Tile>2_21203</Tile> - <Tile>2_11204</Tile> - <Tile>2_21204</Tile> - <Tile>2_11205</Tile> - <Tile>2_21205</Tile> - <Tile>2_11206</Tile> - <Tile>2_21206</Tile> - <Tile>2_11207</Tile> - <Tile>2_21207</Tile> - <Tile>2_11208</Tile> - <Tile>2_21208</Tile> - <Tile>2_11209</Tile> - <Tile>2_21209</Tile> - <Tile>2_11210</Tile> - <Tile>2_21210</Tile> - <Tile>2_11211</Tile> - <Tile>2_21211</Tile> - <Tile>2_11212</Tile> - <Tile>2_21212</Tile> - <Tile>2_12201</Tile> - <Tile>2_22201</Tile> - <Tile>2_12202</Tile> - <Tile>2_22202</Tile> - <Tile>2_12203</Tile> - <Tile>2_22203</Tile> - <Tile>2_12204</Tile> - <Tile>2_22204</Tile> - <Tile>2_12205</Tile> - <Tile>2_22205</Tile> - <Tile>2_12206</Tile> - <Tile>2_22206</Tile> - <Tile>2_12207</Tile> - <Tile>2_22207</Tile> - <Tile>2_12208</Tile> - <Tile>2_22208</Tile> - <Tile>2_12209</Tile> - <Tile>2_22209</Tile> - <Tile>2_12210</Tile> - <Tile>2_22210</Tile> - <Tile>2_12211</Tile> - <Tile>2_22211</Tile> - <Tile>2_12212</Tile> - <Tile>2_22212</Tile> - <Tile>2_13201</Tile> - <Tile>2_23201</Tile> - <Tile>2_13202</Tile> - <Tile>2_23202</Tile> - <Tile>2_13203</Tile> - <Tile>2_23203</Tile> - <Tile>2_13204</Tile> - <Tile>2_23204</Tile> - <Tile>2_13205</Tile> - <Tile>2_23205</Tile> - <Tile>2_13206</Tile> - <Tile>2_23206</Tile> - <Tile>2_13207</Tile> - <Tile>2_23207</Tile> - <Tile>2_13208</Tile> - <Tile>2_23208</Tile> - <Tile>2_13209</Tile> - <Tile>2_23209</Tile> - <Tile>2_13210</Tile> - <Tile>2_23210</Tile> - <Tile>2_13211</Tile> - <Tile>2_23211</Tile> - <Tile>2_13212</Tile> - <Tile>2_23212</Tile> - <Tile>1_11301</Tile> - <Tile>1_21301</Tile> - <Tile>1_11302</Tile> - <Tile>1_21302</Tile> - <Tile>1_11303</Tile> - <Tile>1_21303</Tile> - <Tile>1_11304</Tile> - <Tile>1_21304</Tile> - <Tile>1_11305</Tile> - <Tile>1_21305</Tile> - <Tile>1_11306</Tile> - <Tile>1_21306</Tile> - <Tile>1_11307</Tile> - <Tile>1_21307</Tile> - <Tile>1_11308</Tile> - <Tile>1_21308</Tile> - <Tile>1_11309</Tile> - <Tile>1_21309</Tile> - <Tile>1_11310</Tile> - <Tile>1_21310</Tile> - <Tile>1_11311</Tile> - <Tile>1_21311</Tile> - <Tile>1_11312</Tile> - <Tile>1_21312</Tile> - <Tile>1_12301</Tile> - <Tile>1_22301</Tile> - <Tile>1_12302</Tile> - <Tile>1_22302</Tile> - <Tile>1_12303</Tile> - <Tile>1_22303</Tile> - <Tile>1_12304</Tile> - <Tile>1_22304</Tile> - <Tile>1_12305</Tile> - <Tile>1_22305</Tile> - <Tile>1_12306</Tile> - <Tile>1_22306</Tile> - <Tile>1_12307</Tile> - <Tile>1_22307</Tile> - <Tile>1_12308</Tile> - <Tile>1_22308</Tile> - <Tile>1_12309</Tile> - <Tile>1_22309</Tile> - <Tile>1_12310</Tile> - <Tile>1_22310</Tile> - <Tile>1_12311</Tile> - <Tile>1_22311</Tile> - <Tile>1_12312</Tile> - <Tile>1_22312</Tile> - <Tile>1_13301</Tile> - <Tile>1_23301</Tile> - <Tile>1_13302</Tile> - <Tile>1_23302</Tile> - <Tile>1_13303</Tile> - <Tile>1_23303</Tile> - <Tile>1_13304</Tile> - <Tile>1_23304</Tile> - <Tile>1_13305</Tile> - <Tile>1_23305</Tile> - <Tile>1_13306</Tile> - <Tile>1_23306</Tile> - <Tile>1_13307</Tile> - <Tile>1_23307</Tile> - <Tile>1_13308</Tile> - <Tile>1_23308</Tile> - <Tile>1_13309</Tile> - <Tile>1_23309</Tile> - <Tile>1_13310</Tile> - <Tile>1_23310</Tile> - <Tile>1_13311</Tile> - <Tile>1_23311</Tile> - <Tile>1_13312</Tile> - <Tile>1_23312</Tile> - <Tile>2_11301</Tile> - <Tile>2_21301</Tile> - <Tile>2_11302</Tile> - <Tile>2_21302</Tile> - <Tile>2_11303</Tile> - <Tile>2_21303</Tile> - <Tile>2_11304</Tile> - <Tile>2_21304</Tile> - <Tile>2_11305</Tile> - <Tile>2_21305</Tile> - <Tile>2_11306</Tile> - <Tile>2_21306</Tile> - <Tile>2_11307</Tile> - <Tile>2_21307</Tile> - <Tile>2_11308</Tile> - <Tile>2_21308</Tile> - <Tile>2_11309</Tile> - <Tile>2_21309</Tile> - <Tile>2_11310</Tile> - <Tile>2_21310</Tile> - <Tile>2_11311</Tile> - <Tile>2_21311</Tile> - <Tile>2_11312</Tile> - <Tile>2_21312</Tile> - <Tile>2_12301</Tile> - <Tile>2_22301</Tile> - <Tile>2_12302</Tile> - <Tile>2_22302</Tile> - <Tile>2_12303</Tile> - <Tile>2_22303</Tile> - <Tile>2_12304</Tile> - <Tile>2_22304</Tile> - <Tile>2_12305</Tile> - <Tile>2_22305</Tile> - <Tile>2_12306</Tile> - <Tile>2_22306</Tile> - <Tile>2_12307</Tile> - <Tile>2_22307</Tile> - <Tile>2_12308</Tile> - <Tile>2_22308</Tile> - <Tile>2_12309</Tile> - <Tile>2_22309</Tile> - <Tile>2_12310</Tile> - <Tile>2_22310</Tile> - <Tile>2_12311</Tile> - <Tile>2_22311</Tile> - <Tile>2_12312</Tile> - <Tile>2_22312</Tile> - <Tile>2_13301</Tile> - <Tile>2_23301</Tile> - <Tile>2_13302</Tile> - <Tile>2_23302</Tile> - <Tile>2_13303</Tile> - <Tile>2_23303</Tile> - <Tile>2_13304</Tile> - <Tile>2_23304</Tile> - <Tile>2_13305</Tile> - <Tile>2_23305</Tile> - <Tile>2_13306</Tile> - <Tile>2_23306</Tile> - <Tile>2_13307</Tile> - <Tile>2_23307</Tile> - <Tile>2_13308</Tile> - <Tile>2_23308</Tile> - <Tile>2_13309</Tile> - <Tile>2_23309</Tile> - <Tile>2_13310</Tile> - <Tile>2_23310</Tile> - <Tile>2_13311</Tile> - <Tile>2_23311</Tile> - <Tile>2_13312</Tile> - <Tile>2_23312</Tile> - <Tile>1_11401</Tile> - <Tile>1_21401</Tile> - <Tile>1_11402</Tile> - <Tile>1_21402</Tile> - <Tile>1_11403</Tile> - <Tile>1_21403</Tile> - <Tile>1_11404</Tile> - <Tile>1_21404</Tile> - <Tile>1_11405</Tile> - <Tile>1_21405</Tile> - <Tile>1_11406</Tile> - <Tile>1_21406</Tile> - <Tile>1_11407</Tile> - <Tile>1_21407</Tile> - <Tile>1_11408</Tile> - <Tile>1_21408</Tile> - <Tile>1_11409</Tile> - <Tile>1_21409</Tile> - <Tile>1_11410</Tile> - <Tile>1_21410</Tile> - <Tile>1_11411</Tile> - <Tile>1_21411</Tile> - <Tile>1_11412</Tile> - <Tile>1_21412</Tile> - <Tile>1_12401</Tile> - <Tile>1_22401</Tile> - <Tile>1_12402</Tile> - <Tile>1_22402</Tile> - <Tile>1_12403</Tile> - <Tile>1_22403</Tile> - <Tile>1_12404</Tile> - <Tile>1_22404</Tile> - <Tile>1_12405</Tile> - <Tile>1_22405</Tile> - <Tile>1_12406</Tile> - <Tile>1_22406</Tile> - <Tile>1_12407</Tile> - <Tile>1_22407</Tile> - <Tile>1_12408</Tile> - <Tile>1_22408</Tile> - <Tile>1_12409</Tile> - <Tile>1_22409</Tile> - <Tile>1_12410</Tile> - <Tile>1_22410</Tile> - <Tile>1_12411</Tile> - <Tile>1_22411</Tile> - <Tile>1_12412</Tile> - <Tile>1_22412</Tile> - <Tile>1_13401</Tile> - <Tile>1_23401</Tile> - <Tile>1_13402</Tile> - <Tile>1_23402</Tile> - <Tile>1_13403</Tile> - <Tile>1_23403</Tile> - <Tile>1_13404</Tile> - <Tile>1_23404</Tile> - <Tile>1_13405</Tile> - <Tile>1_23405</Tile> - <Tile>1_13406</Tile> - <Tile>1_23406</Tile> - <Tile>1_13407</Tile> - <Tile>1_23407</Tile> - <Tile>1_13408</Tile> - <Tile>1_23408</Tile> - <Tile>1_13409</Tile> - <Tile>1_23409</Tile> - <Tile>1_13410</Tile> - <Tile>1_23410</Tile> - <Tile>1_13411</Tile> - <Tile>1_23411</Tile> - <Tile>1_13412</Tile> - <Tile>1_23412</Tile> - <Tile>2_11401</Tile> - <Tile>2_21401</Tile> - <Tile>2_11402</Tile> - <Tile>2_21402</Tile> - <Tile>2_11403</Tile> - <Tile>2_21403</Tile> - <Tile>2_11404</Tile> - <Tile>2_21404</Tile> - <Tile>2_11405</Tile> - <Tile>2_21405</Tile> - <Tile>2_11406</Tile> - <Tile>2_21406</Tile> - <Tile>2_11407</Tile> - <Tile>2_21407</Tile> - <Tile>2_11408</Tile> - <Tile>2_21408</Tile> - <Tile>2_11409</Tile> - <Tile>2_21409</Tile> - <Tile>2_11410</Tile> - <Tile>2_21410</Tile> - <Tile>2_11411</Tile> - <Tile>2_21411</Tile> - <Tile>2_11412</Tile> - <Tile>2_21412</Tile> - <Tile>2_12401</Tile> - <Tile>2_22401</Tile> - <Tile>2_12402</Tile> - <Tile>2_22402</Tile> - <Tile>2_12403</Tile> - <Tile>2_22403</Tile> - <Tile>2_12404</Tile> - <Tile>2_22404</Tile> - <Tile>2_12405</Tile> - <Tile>2_22405</Tile> - <Tile>2_12406</Tile> - <Tile>2_22406</Tile> - <Tile>2_12407</Tile> - <Tile>2_22407</Tile> - <Tile>2_12408</Tile> - <Tile>2_22408</Tile> - <Tile>2_12409</Tile> - <Tile>2_22409</Tile> - <Tile>2_12410</Tile> - <Tile>2_22410</Tile> - <Tile>2_12411</Tile> - <Tile>2_22411</Tile> - <Tile>2_12412</Tile> - <Tile>2_22412</Tile> - <Tile>2_13401</Tile> - <Tile>2_23401</Tile> - <Tile>2_13402</Tile> - <Tile>2_23402</Tile> - <Tile>2_13403</Tile> - <Tile>2_23403</Tile> - <Tile>2_13404</Tile> - <Tile>2_23404</Tile> - <Tile>2_13405</Tile> - <Tile>2_23405</Tile> - <Tile>2_13406</Tile> - <Tile>2_23406</Tile> - <Tile>2_13407</Tile> - <Tile>2_23407</Tile> - <Tile>2_13408</Tile> - <Tile>2_23408</Tile> - <Tile>2_13409</Tile> - <Tile>2_23409</Tile> - <Tile>2_13410</Tile> - <Tile>2_23410</Tile> - <Tile>2_13411</Tile> - <Tile>2_23411</Tile> - <Tile>2_13412</Tile> - <Tile>2_23412</Tile> - <Tile>1_11501</Tile> - <Tile>1_21501</Tile> - <Tile>1_11502</Tile> - <Tile>1_21502</Tile> - <Tile>1_11503</Tile> - <Tile>1_21503</Tile> - <Tile>1_11504</Tile> - <Tile>1_21504</Tile> - <Tile>1_11505</Tile> - <Tile>1_21505</Tile> - <Tile>1_11506</Tile> - <Tile>1_21506</Tile> - <Tile>1_11507</Tile> - <Tile>1_21507</Tile> - <Tile>1_11508</Tile> - <Tile>1_21508</Tile> - <Tile>1_11509</Tile> - <Tile>1_21509</Tile> - <Tile>1_11510</Tile> - <Tile>1_21510</Tile> - <Tile>1_11511</Tile> - <Tile>1_21511</Tile> - <Tile>1_11512</Tile> - <Tile>1_21512</Tile> - <Tile>1_12501</Tile> - <Tile>1_22501</Tile> - <Tile>1_12502</Tile> - <Tile>1_22502</Tile> - <Tile>1_12503</Tile> - <Tile>1_22503</Tile> - <Tile>1_12504</Tile> - <Tile>1_22504</Tile> - <Tile>1_12505</Tile> - <Tile>1_22505</Tile> - <Tile>1_12506</Tile> - <Tile>1_22506</Tile> - <Tile>1_12507</Tile> - <Tile>1_22507</Tile> - <Tile>1_12508</Tile> - <Tile>1_22508</Tile> - <Tile>1_12509</Tile> - <Tile>1_22509</Tile> - <Tile>1_12510</Tile> - <Tile>1_22510</Tile> - <Tile>1_12511</Tile> - <Tile>1_22511</Tile> - <Tile>1_12512</Tile> - <Tile>1_22512</Tile> - <Tile>1_13501</Tile> - <Tile>1_23501</Tile> - <Tile>1_13502</Tile> - <Tile>1_23502</Tile> - <Tile>1_13503</Tile> - <Tile>1_23503</Tile> - <Tile>1_13504</Tile> - <Tile>1_23504</Tile> - <Tile>1_13505</Tile> - <Tile>1_23505</Tile> - <Tile>1_13506</Tile> - <Tile>1_23506</Tile> - <Tile>1_13507</Tile> - <Tile>1_23507</Tile> - <Tile>1_13508</Tile> - <Tile>1_23508</Tile> - <Tile>1_13509</Tile> - <Tile>1_23509</Tile> - <Tile>1_13510</Tile> - <Tile>1_23510</Tile> - <Tile>1_13511</Tile> - <Tile>1_23511</Tile> - <Tile>1_13512</Tile> - <Tile>1_23512</Tile> - <Tile>2_11501</Tile> - <Tile>2_21501</Tile> - <Tile>2_11502</Tile> - <Tile>2_21502</Tile> - <Tile>2_11503</Tile> - <Tile>2_21503</Tile> - <Tile>2_11504</Tile> - <Tile>2_21504</Tile> - <Tile>2_11505</Tile> - <Tile>2_21505</Tile> - <Tile>2_11506</Tile> - <Tile>2_21506</Tile> - <Tile>2_11507</Tile> - <Tile>2_21507</Tile> - <Tile>2_11508</Tile> - <Tile>2_21508</Tile> - <Tile>2_11509</Tile> - <Tile>2_21509</Tile> - <Tile>2_11510</Tile> - <Tile>2_21510</Tile> - <Tile>2_11511</Tile> - <Tile>2_21511</Tile> - <Tile>2_11512</Tile> - <Tile>2_21512</Tile> - <Tile>2_12501</Tile> - <Tile>2_22501</Tile> - <Tile>2_12502</Tile> - <Tile>2_22502</Tile> - <Tile>2_12503</Tile> - <Tile>2_22503</Tile> - <Tile>2_12504</Tile> - <Tile>2_22504</Tile> - <Tile>2_12505</Tile> - <Tile>2_22505</Tile> - <Tile>2_12506</Tile> - <Tile>2_22506</Tile> - <Tile>2_12507</Tile> - <Tile>2_22507</Tile> - <Tile>2_12508</Tile> - <Tile>2_22508</Tile> - <Tile>2_12509</Tile> - <Tile>2_22509</Tile> - <Tile>2_12510</Tile> - <Tile>2_22510</Tile> - <Tile>2_12511</Tile> - <Tile>2_22511</Tile> - <Tile>2_12512</Tile> - <Tile>2_22512</Tile> - <Tile>2_13501</Tile> - <Tile>2_23501</Tile> - <Tile>2_13502</Tile> - <Tile>2_23502</Tile> - <Tile>2_13503</Tile> - <Tile>2_23503</Tile> - <Tile>2_13504</Tile> - <Tile>2_23504</Tile> - <Tile>2_13505</Tile> - <Tile>2_23505</Tile> - <Tile>2_13506</Tile> - <Tile>2_23506</Tile> - <Tile>2_13507</Tile> - <Tile>2_23507</Tile> - <Tile>2_13508</Tile> - <Tile>2_23508</Tile> - <Tile>2_13509</Tile> - <Tile>2_23509</Tile> - <Tile>2_13510</Tile> - <Tile>2_23510</Tile> - <Tile>2_13511</Tile> - <Tile>2_23511</Tile> - <Tile>2_13512</Tile> - <Tile>2_23512</Tile> - <Tile>1_11601</Tile> - <Tile>1_21601</Tile> - <Tile>1_11602</Tile> - <Tile>1_21602</Tile> - <Tile>1_11603</Tile> - <Tile>1_21603</Tile> - <Tile>1_11604</Tile> - <Tile>1_21604</Tile> - <Tile>1_11605</Tile> - <Tile>1_21605</Tile> - <Tile>1_11606</Tile> - <Tile>1_21606</Tile> - <Tile>1_11607</Tile> - <Tile>1_21607</Tile> - <Tile>1_11608</Tile> - <Tile>1_21608</Tile> - <Tile>1_11609</Tile> - <Tile>1_21609</Tile> - <Tile>1_11610</Tile> - <Tile>1_21610</Tile> - <Tile>1_11611</Tile> - <Tile>1_21611</Tile> - <Tile>1_11612</Tile> - <Tile>1_21612</Tile> - <Tile>1_12601</Tile> - <Tile>1_22601</Tile> - <Tile>1_12602</Tile> - <Tile>1_22602</Tile> - <Tile>1_12603</Tile> - <Tile>1_22603</Tile> - <Tile>1_12604</Tile> - <Tile>1_22604</Tile> - <Tile>1_12605</Tile> - <Tile>1_22605</Tile> - <Tile>1_12606</Tile> - <Tile>1_22606</Tile> - <Tile>1_12607</Tile> - <Tile>1_22607</Tile> - <Tile>1_12608</Tile> - <Tile>1_22608</Tile> - <Tile>1_12609</Tile> - <Tile>1_22609</Tile> - <Tile>1_12610</Tile> - <Tile>1_22610</Tile> - <Tile>1_12611</Tile> - <Tile>1_22611</Tile> - <Tile>1_12612</Tile> - <Tile>1_22612</Tile> - <Tile>1_13601</Tile> - <Tile>1_23601</Tile> - <Tile>1_13602</Tile> - <Tile>1_23602</Tile> - <Tile>1_13603</Tile> - <Tile>1_23603</Tile> - <Tile>1_13604</Tile> - <Tile>1_23604</Tile> - <Tile>1_13605</Tile> - <Tile>1_23605</Tile> - <Tile>1_13606</Tile> - <Tile>1_23606</Tile> - <Tile>1_13607</Tile> - <Tile>1_23607</Tile> - <Tile>1_13608</Tile> - <Tile>1_23608</Tile> - <Tile>1_13609</Tile> - <Tile>1_23609</Tile> - <Tile>1_13610</Tile> - <Tile>1_23610</Tile> - <Tile>1_13611</Tile> - <Tile>1_23611</Tile> - <Tile>1_13612</Tile> - <Tile>1_23612</Tile> - <Tile>2_11601</Tile> - <Tile>2_21601</Tile> - <Tile>2_11602</Tile> - <Tile>2_21602</Tile> - <Tile>2_11603</Tile> - <Tile>2_21603</Tile> - <Tile>2_11604</Tile> - <Tile>2_21604</Tile> - <Tile>2_11605</Tile> - <Tile>2_21605</Tile> - <Tile>2_11606</Tile> - <Tile>2_21606</Tile> - <Tile>2_11607</Tile> - <Tile>2_21607</Tile> - <Tile>2_11608</Tile> - <Tile>2_21608</Tile> - <Tile>2_11609</Tile> - <Tile>2_21609</Tile> - <Tile>2_11610</Tile> - <Tile>2_21610</Tile> - <Tile>2_11611</Tile> - <Tile>2_21611</Tile> - <Tile>2_11612</Tile> - <Tile>2_21612</Tile> - <Tile>2_12601</Tile> - <Tile>2_22601</Tile> - <Tile>2_12602</Tile> - <Tile>2_22602</Tile> - <Tile>2_12603</Tile> - <Tile>2_22603</Tile> - <Tile>2_12604</Tile> - <Tile>2_22604</Tile> - <Tile>2_12605</Tile> - <Tile>2_22605</Tile> - <Tile>2_12606</Tile> - <Tile>2_22606</Tile> - <Tile>2_12607</Tile> - <Tile>2_22607</Tile> - <Tile>2_12608</Tile> - <Tile>2_22608</Tile> - <Tile>2_12609</Tile> - <Tile>2_22609</Tile> - <Tile>2_12610</Tile> - <Tile>2_22610</Tile> - <Tile>2_12611</Tile> - <Tile>2_22611</Tile> - <Tile>2_12612</Tile> - <Tile>2_22612</Tile> - <Tile>2_13601</Tile> - <Tile>2_23601</Tile> - <Tile>2_13602</Tile> - <Tile>2_23602</Tile> - <Tile>2_13603</Tile> - <Tile>2_23603</Tile> - <Tile>2_13604</Tile> - <Tile>2_23604</Tile> - <Tile>2_13605</Tile> - <Tile>2_23605</Tile> - <Tile>2_13606</Tile> - <Tile>2_23606</Tile> - <Tile>2_13607</Tile> - <Tile>2_23607</Tile> - <Tile>2_13608</Tile> - <Tile>2_23608</Tile> - <Tile>2_13609</Tile> - <Tile>2_23609</Tile> - <Tile>2_13610</Tile> - <Tile>2_23610</Tile> - <Tile>2_13611</Tile> - <Tile>2_23611</Tile> - <Tile>2_13612</Tile> - <Tile>2_23612</Tile> - </SelectedTiles> - <RunFolder>D:\Illumina\NextSeq Control Software Temp\141212_NS500318_0033_AH16YMBGXX\</RunFolder> - <OutputFolder>Y:\r2d2\141212_NS500318_0033_AH16YMBGXX\</OutputFolder> - <RecipeFolder>C:\Illumina\NextSeq Control Software\Recipe\High\v1.1</RecipeFolder> - <SimulationFolder /> - <RunStartDate>141212</RunStartDate> - <FocusMethod>IXFocus</FocusMethod> - <SurfaceToScan>Both</SurfaceToScan> - <SaveFocusImages>false</SaveFocusImages> - <SaveScanImages>false</SaveScanImages> - <SelectiveSave>true</SelectiveSave> - <IsPairedEnd>false</IsPairedEnd> - <AnalysisWorkflowType /> - <CustomReadOnePrimer>BP10</CustomReadOnePrimer> - <CustomReadTwoPrimer>BP11</CustomReadTwoPrimer> - <CustomIndexPrimer>BP12</CustomIndexPrimer> - <CustomIndexTwoPrimer>EXT</CustomIndexTwoPrimer> - <UsesCustomReadOnePrimer>false</UsesCustomReadOnePrimer> - <UsesCustomReadTwoPrimer>false</UsesCustomReadTwoPrimer> - <UsesCustomIndexPrimer>false</UsesCustomIndexPrimer> - <UsesCustomIndexTwoPrimer>false</UsesCustomIndexTwoPrimer> - <RunManagementType>Standalone</RunManagementType> - <BaseSpaceRunId>9643683</BaseSpaceRunId> - <BaseSpaceRunMode>IlluminaHealthOnly</BaseSpaceRunMode> - <ComputerName>BS-DSFCONTROL05</ComputerName> - <SequencingStarted>true</SequencingStarted> - <PlannedRead1Cycles>76</PlannedRead1Cycles> - <PlannedRead2Cycles>0</PlannedRead2Cycles> - <PlannedIndex1ReadCycles>8</PlannedIndex1ReadCycles> - <PlannedIndex2ReadCycles>8</PlannedIndex2ReadCycles> - <IsRehyb>false</IsRehyb> - <MaxCyclesSupportedByReagentKit>92</MaxCyclesSupportedByReagentKit> -</RunParameters> \ No newline at end of file diff --git a/deep_sequencing_unit/resource/test-data/QGFReadRtaTimestampTest/141204_D00535_0035_BC5LPVANXX/RTAComplete.txt b/deep_sequencing_unit/resource/test-data/QGFReadRtaTimestampTest/141204_D00535_0035_BC5LPVANXX/RTAComplete.txt deleted file mode 100644 index 3a3b0960199aa31bfd4725dd32948d39897bdf35..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/resource/test-data/QGFReadRtaTimestampTest/141204_D00535_0035_BC5LPVANXX/RTAComplete.txt +++ /dev/null @@ -1 +0,0 @@ -12/5/2014,16:47:09.380,Illumina RTA 1.18.61 diff --git a/deep_sequencing_unit/resource/test-db/.gitignore b/deep_sequencing_unit/resource/test-db/.gitignore deleted file mode 100644 index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..0000000000000000000000000000000000000000 diff --git a/deep_sequencing_unit/settings.gradle b/deep_sequencing_unit/settings.gradle deleted file mode 100644 index 33440dae995c32d3e498e18b39ed5c1e0f9af0b5..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/settings.gradle +++ /dev/null @@ -1 +0,0 @@ -includeFlat 'commonbase', 'common', 'openbis_api', 'openbis-common', 'authentication', 'dbmigration', 'openbis', 'datastore_server' diff --git a/deep_sequencing_unit/source/BDS/analysis_bcl2fastq.bds b/deep_sequencing_unit/source/BDS/analysis_bcl2fastq.bds deleted file mode 100755 index 7085666c1b947318603a87e3d31694956b3f4acd..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/source/BDS/analysis_bcl2fastq.bds +++ /dev/null @@ -1,770 +0,0 @@ -#!/usr/bin/env /links/application/dsu/.bds/bds - -/* The BDS automatic command line parsing allows the control on what to run -* bds yoda_analysis.bds -reRun true -latestFolder /home/sbsuser/yoda/150304_M01761_0119_000000000-ADTAN -* -* For trying out what would run use the dryRun flag: -* bds -c /links/application/dsu/.bds/bds.config -dryRun -s ssh yoda_analysis.bds -reRun \ -* -latestFolder /home/sbsuser/yoda/150304_M01761_0119_000000000-ADTAN \ -* -runReadRTATimestamp -runSampleSheetCreation -runTriggerBcl2fastq -runDemultiplexStats -runRsyncOnDemux -* -runRsyncFlowcell -runCreateFastqc -runBarcodeDistribution -runRsyncDemux -*/ - -bool reRun -bool runReadRTATimestamp -bool runSampleSheetCreation -bool runTriggerBcl2fastq -bool runDemultiplexStats -bool runRsyncFlowcell -bool runCreateFastqc -bool runAggregateFastqc -bool runBarcodeDistribution -bool runRsyncDemultiplexedFiles -bool runRsyncLaneStatictics -bool runBowtie -bool runReadJSON -bool runChecksums -bool debugRun -string sequencer -string latestFolder -string [] laneList -int mismatches - -runBase := "/links/shared/dsu/runs/$sequencer" - -if (latestFolder.isEmpty()) { - latestFolder = getLatestFolder(runBase) -} - -analysisStarted := "$latestFolder" + "/Analysis.started" -analysisFinished := "$latestFolder" + "/Analysis.finished" -runCompleted := "$latestFolder" + "/RTAComplete.txt" - -dss := "/links/shared/dsu/dss" - -# Drop boxes paths -rtaIncoming := "$dss/v2_read-rta-timestamp" -flowCellData := "$dss/v2_register-flowcell" -unalignedData := "$dss/v2_register-flowlane" -# is set in the function depending on the run -#demuxData := "$dss/v2_read-demultiplex-stats-miseq-hiseq" -fastqcData := "$dss/v2_register-fastqc" -fastqcAggregateData := "$dss/v2_register-fastqc-aggregate" -barcodeDistData := "$dss/v2_register-undetermined" -reportsData := "$dss/v2_register-demuliplex-stats" - -demultiplexedFolder := "demultiplexed" -marker := ".MARKER_is_finished_" -#marker := ".MARKER_" -samplePrefix := "BSSE_QGF_" - -if (!latestFolder.exists()) { - print("Folder $latestFolder does not exist!\n") - exit 0 -} - -string fcName -runFolderName := latestFolder.baseName() -print("Runfolder: $runFolderName\n") - -splits := runFolderName.split("_") - -if (splits[3].startsWith("000")) { - fcName = splits[3] -} -else { - fcName = splits[3].substr(1) -} - -print("Flowcell: $fcName\n") -string model = get_model(splits[1]) -print("Model: $model\n") -bool {} taskList - -# ----------------------------------------------------------------------------- -# Pre-Checks - -if (reRun) { - removeOutputFiles() - if (laneList.isEmpty()) { - taskList = {"runReadRTATimestamp" => true, \ - "runSampleSheetCreation" => true, \ - "runTriggerBcl2fastq" => true, \ - "runDemultiplexStats" => true, \ - "runRsyncDemultiplexedFiles" => true, \ - "runRsyncFlowcell" => true, \ - "runCreateFastqc" => true, \ - "runAggregateFastqc" => true, \ - "runBowtie" => true, \ - "runBarcodeDistribution" => true, \ - "runRsyncLaneStatictics" => true,\ - "runReadJSON" => true, \ - "runChecksums" => true, \ - "debugRun" => debugRun} - } - else { - taskList = {"runReadRTATimestamp" => false, \ - "runSampleSheetCreation" => true, \ - "runTriggerBcl2fastq" => true, \ - "runDemultiplexStats" => true, \ - "runRsyncDemultiplexedFiles" => true, \ - "runRsyncFlowcell" => true, \ - "runCreateFastqc" => true, \ - "runAggregateFastqc" => true, \ - "runBarcodeDistribution" => true, \ - "runBowtie" => false, \ - "runRsyncLaneStatictics" => true, \ - "runReadJSON" => true, \ - "runChecksums" => true, \ - "debugRun" => true} - } -} -else { - taskList = {"runReadRTATimestamp" => runReadRTATimestamp, \ - "runSampleSheetCreation" => runSampleSheetCreation, \ - "runTriggerBcl2fastq" => runTriggerBcl2fastq, \ - "runDemultiplexStats" => runDemultiplexStats, \ - "runRsyncDemultiplexedFiles" => runRsyncDemultiplexedFiles, \ - "runRsyncFlowcell" => runRsyncFlowcell, \ - "runCreateFastqc" => runCreateFastqc, \ - "runAggregateFastqc" => runAggregateFastqc, \ - "runBowtie" => runBowtie, \ - "runBarcodeDistribution" => runBarcodeDistribution, \ - "runRsyncLaneStatictics" => runRsyncLaneStatictics, \ - "runReadJSON" => runReadJSON, \ - "runChecksums" => runChecksums, \ - "debugRun" => debugRun} -} - -print("taskList\n$taskList\n") - -if (analysisStarted.canRead() && (!taskList{"debugRun"})) { - print("Analysis already started/done for flowcell $runFolderName\n") - exit 0 -} - -if ( runCompleted.canRead() ) { - print ("Run is complete, found: $runCompleted\n" ) - analysisStarted.write("Started: " + getDate()) - startAnalysis("$fcName", "$model") -} - -# -------------------------------------------------------------------------- -# Helper functions - -string getLatestFolder (string runBase) { - - string [] runFolderList - - folderList := runBase.dir("*") - for (string folder : folderList) { - fullfolder := "$runBase/$folder" - Analysisstarted := "$fullfolder/" + "Analysis.started" - runComplete := "$fullfolder/" + "RTAComplete.txt" - if (fullfolder.isDir() && !Analysisstarted.exists() && runComplete.exists()) { - runFolderList.add(fullfolder) - } - } - print("Run Folders to consider: " + "$runFolderList\n") - - string latestFolder = "does_not_exist" - - if (runFolderList.size() > 0 ) { - runFolderList.sort() - reversedList := runFolderList.reverse() - latestFolder = reversedList.pop() - } - - return latestFolder -} - -void removeOutputFiles() { - - print "Removing files...\n" - - for (int i=1; i < 9; i++) { - oldDemuxFolder := "$latestFolder/$demultiplexedFolder" + "_" + "$i" - print("Removing $oldDemuxFolder\n") - string demuxTaskID task ( canFail := true, cpus := 1 ){ - sys rm -rf "$oldDemuxFolder" - } - wait demuxTaskID - } - - string markerTaskId task (canFail := true, cpus := 4 ){ - sys rm -f "$analysisStarted" - sys rm -f "$analysisFinished" - } - wait markerTaskId - sleep(30) - sys rm -f "$analysisStarted" -} - -string cleanString (string toClean) { - return toClean.replace("-", "_") -} - - -string [] getLaneNumbers (string searchFolder, string fileRegex) { - # try to figure out which lanes are present and returns the result as a string list - - string [] listOfLanes - fileList := searchFolder.dir(fileRegex) - # print("$searchFolder\n") - # print("$fileRegex\n") - - for (string aFile : fileList) { - string lane - - splittedName := aFile.split("_") - # print("splittedName") - # print(splittedName) - - # 'Regular case': Undetermined_S0_L003_R1_001.fastq.gz - if (splittedName[2].startsWith("L00") || splittedName[0].startsWith("BSSE")) { - splitSize := splittedName.size() - lane = splittedName[splitSize-3].substr(3,4) - } - # Assuming that Illumina leaves out the Lane - # information when there using the option "--no-lane-splitting" - # with bcl2fastq - else { - lane = "1" - } - if (!listOfLanes.has(lane) && !lane.isEmpty()) { - listOfLanes.add(lane) - } - } - return listOfLanes -} - -int extractLaneNumberfromRunInfo () { - - string laneCount = sys /bin/grep LaneCount "$latestFolder/RunInfo.xml" | /bin/awk '{ print $2 }' | /usr/bin/tr -dc '0-9' - - laneCountInt := laneCount.parseInt() - if (model == "NEXTSEQ_500") { - laneCountInt = 1 - } - return laneCountInt -} - - -string get_model(string machineId) { - """ - Guesses the sequencer model from the run folder name - - Current Naming schema for Illumina run folders, as far as I know, - no documentation found on this, Illumina introduced a field called - <InstrumentID> on the NextSeq runParameters.xml. That might be an - option for the future. Alternatively a combination of the fields - <ApplicationName> and <ApplicationVersion>. - - MiSeq: 150130_M01761_0114_000000000-ACUR0 - NextSeq: 150202_NS500318_0047_AH3KLMBGXX - HiSeq 2000: 130919_SN792_0281_BD2CHRACXX - HiSeq 2500: 150203_D00535_0052_AC66RWANXX - HiSeq 3000: 150724_J00121_0017_AH2VYMBBXX - HiSeq 4000: 150210_K00111_0013_AH2372BBXX - HiSeq X: 141121_ST-E00107_0356_AH00C3CCXX - """ - - if (machineId.startsWith("NS")) model = "NEXTSEQ_500" - else if (machineId.startsWith("M")) model = "MISEQ" - else if (machineId.startsWith("D")) model = "HISEQ_2500" - else if (machineId.startsWith("SN")) model = "HISEQ_2000" - else if (machineId.startsWith("J")) model = "HISEQ_3000" - else if (machineId.startsWith("K")) model = "HISEQ_4000" - else if (machineId.startsWith("ST")) model = "HISEQ_X" - else model = "UNIDENTIFIED" - - return model -} - -void rsyncRunFolder (string[] rsyncParameters, string source, string targetFolder, string markerFile) { - targetFolder.mkdir() - source.trim() - joinedParameters := rsyncParameters.join() - print("rsync $joinedParameters $source $targetFolder\n") - - string taskId = task /usr/bin/rsync $joinedParameters $source $targetFolder - wait taskId - if (!markerFile.isEmpty()) { - task touch "$markerFile" - } -} - -int[] buildLaneList(string [] laneList) { - """ - Builds a list of lanes which need to be processed. Could be all lanes or a subset which is - given by a parameter. - """ - - int [] laneListInt - if (laneList.isEmpty()) { - int [] laneList - int laneCount = extractLaneNumberfromRunInfo() - for (int i=1; i < laneCount + 1; i++) { - laneListInt.add(i) - } - } - else { - for (string lane : laneList) { - laneListInt.add(lane.parseInt()) - } - } - return laneListInt -} - - -# -------------------------------------------------------------------------- - -void startAnalysis (string fcName, string model) { - - # Main function - - int laneCount = extractLaneNumberfromRunInfo() - int [] laneListInt - - laneListInt = buildLaneList(laneList) - - print("laneListInt: " + "$laneListInt\n") - - # Read RTA timestamp - if (taskList{"runReadRTATimestamp"}) { - rsyncRunFolder(["-a"], \ - "$runCompleted", \ - "$rtaIncoming/$runFolderName", \ - "$rtaIncoming/$marker$runFolderName") - } - - # Read the JSON created with illuminate - if (taskList{"runReadJSON"}) { - triggerRunReadJSON() - } - - # Create a sample sheet from data from openBIS - if (taskList{"runSampleSheetCreation"}) { - sampleSheetName := triggerSampleSheetCreation() - } - - # Start Demultiplexing for lanes - if (taskList{"runTriggerBcl2fastq"}) { - triggerBcl2fastq(model, laneListInt, mismatches) - } - - # html demultiplexing overview - if (taskList{"runDemultiplexStats"}) { - triggerDemultiplexStats(laneListInt) - } - - if (taskList{"runChecksums"}) { - max_jobs := 15 - if ((model != "MISEQ") || (model != "NEXTSEQ_500")){ - max_jobs = 8 - } - triggerChecksums(max_jobs, laneListInt) - } - - # Rsync Flow Cell Raw Data - if (taskList{"runRsyncFlowcell"}) { - # sys mkdir "$flowCellData/$runFolderName" - rsyncRunFolder (["-a", \ - "--exclude='*.cif'", \ - "--exclude='*.FWHMMap'", \ - "--exclude='demultiplexed*'", \ - "--exclude='Images'", \ - "--exclude='L00*'", \ - "--exclude='fastqc'", \ - "--exclude='*_pos.txt'"], \ - "$latestFolder", \ - "$flowCellData", \ - "$flowCellData/$marker$runFolderName") - } - - if (taskList{"runCreateFastqc"}) { - createFastqc (laneListInt) - } - - if (taskList{"runAggregateFastqc"}) { - aggregateFastqc (laneListInt) - } - - # run in parallel - par { - if (taskList{"runBarcodeDistribution"}) { - # We skip this for now as we have the stats in the bcl2fastq - barcodeDistribution (laneListInt) - } - if (taskList{"runBowtie"}) { - bowtie () - } - } - wait - - # Rsync the demultiplexed files: Register flow_lane - if (taskList{"runRsyncDemultiplexedFiles"}) { - rsyncDemultiplexedFiles(laneListInt) - if (model == "MISEQ") { - sleep(600) - } - else { - sleep(1) - } - } - - # Sync Statistic for Flowcell and Lane statistic - if (taskList{"runRsyncLaneStatictics"}) { - rsyncLaneStatictics(laneListInt) - - # Ugly hack to ensure that the data have been registered and we can set the properties - #if ((model != "MISEQ") || (model != "NEXTSEQ_500")){ - sleep(7200) - rsyncLaneStatictics(laneListInt) - #} - } - - - if (!taskList{"debugRun"}) { - analysisFinished.write("Finished: " + getDate()) - send_mail ("Sequencer $sequencer: Analysis finished", "Analysis for flow cell $fcName is finished.") - } - -} - -/* --------------------------------------------------------------------------*/ - -string triggerSampleSheetCreation() { - createSampleSheetBinary := "/links/application/dsu/createSampleSheet/createSampleSheet_bcl2fastq.sh" - - splits := runFolderName.split("_") - SampleSheetName := "SampleSheet_" + "$fcName" + ".csv" - - task $createSampleSheetBinary \ - -f $fcName \ - -o $latestFolder \ - -s - wait - return SampleSheetName -} - - -void triggerBcl2fastq (string model, int [] laneList, int mismatches) { - - bcl2fastqBinary := "/usr/local/bin/bcl2fastq" - string laneSplitting - print("Starting demultiplexing using bcl2fastq\n") - - if (model == "NEXTSEQ_500") { - # just appending the option - bcl2fastqBinary += " --no-lane-splitting " - } - - print("laneList" + "$laneList\n") - - for(int lane : laneList) { - sampleSheetName := "SampleSheet_" + "$fcName" + "_" + "$lane" + ".csv" - outDir := "$latestFolder/$demultiplexedFolder" + "_" + "$lane" - nohupFile := "$latestFolder/" + "nohup_" + "$runFolderName" + "_" + "$lane" + ".txt" - - task ( cpus := 8 ) { - sys /usr/bin/nohup $bcl2fastqBinary \ - --with-failed-reads \ - --ignore-missing-bcls \ - --ignore-missing-controls \ - --ignore-missing-positions \ - --ignore-missing-filter \ - --no-bgzf-compression \ - --barcode-mismatches $mismatches \ - --runfolder-dir $latestFolder \ - --input-dir $latestFolder/Data/Intensities/BaseCalls \ - --output-dir $outDir\ - --min-log-level DEBUG \ - --sample-sheet $latestFolder/$sampleSheetName \ - > $nohupFile 2>> $nohupFile - } - wait - } -} - - -void triggerDemultiplexStats (int [] laneCount) { - - print("triggerDemultiplexStats: laneCount: " + "$laneCount") - - binary := "/home/sbsuser/munge_demultiplex_files_bcl2fastq/source/mungeDemultiplexStats_bcl2fastq.py" - task python3.5 $binary \ - -p "$latestFolder" \ - -o "$reportsData/$runFolderName" - wait - sleep(5) - task touch "$reportsData/$marker$runFolderName" - - for(int lane : laneCount) { - - rsyncRunFolder (["-a"], \ - "$latestFolder/$demultiplexedFolder" + "_" + "$lane" + "/Reports", \ - "$reportsData/$runFolderName"+ "_" + "$lane", \ - "") - - rsyncRunFolder (["-a"], \ - "$latestFolder/$demultiplexedFolder" + "_" + "$lane" + "/Stats", \ - "$reportsData/$runFolderName"+ "_" + "$lane", \ - "$reportsData/$marker$runFolderName"+ "_" + "$lane") - } -} - - -void createFastqc (int [] laneCount) { - - fastqcBinary := "/links/application/dsu/Python-scripts/fastqc_plots_improved.py" - fastqcOutputFolder := "fastqc" - - for(int intLane : laneCount) { - - inputFolder := "$latestFolder/$demultiplexedFolder" + "_" + "$intLane" - outPutFolder := "$inputFolder/$fastqcOutputFolder" - - task python3.5 $fastqcBinary \ - --path $inputFolder \ - --outpath $outPutFolder \ - --regex "*.fastq.gz" \ - --debug - wait - - filesPerLane := outPutFolder.dir("*$intLane*.html") - print("$filesPerLane") - folderName := cleanString("$fcName") + "_" + "$intLane" - - newFastqcFolder := "$outPutFolder/$folderName" - newFastqcFolder.mkdir() - - for (string fastqcHtmlfile : filesPerLane) { - sys mv "$outPutFolder/$fastqcHtmlfile" "$newFastqcFolder" - } - - rsyncRunFolder (["-a"], \ - "$newFastqcFolder", \ - "$fastqcData", \ - "$fastqcData/$marker$folderName") - - } -} - - -void aggregateFastqc (int [] laneCount) { - - fastqc_aggregate_binary := "/links/application/dsu/fastqc-aggregation/fastqc_aggregate/fastqc_aggregate.py" - fastqcOutputFolder := "fastqc-aggregate" - folderName := fastqcOutputFolder + "_" + cleanString("$fcName") - outPutFolder := "$latestFolder$folderName" - - for(int intLane : laneCount) { - - inputFolder := "$latestFolder$demultiplexedFolder" + "_" + "$intLane/fastqc" - filename := cleanString("$fcName") + "_" + "$intLane" + ".html" - task python3.5 $fastqc_aggregate_binary --path $inputFolder --outpath $outPutFolder --filename "$filename" --ids M1,M2,M4,M5,M6,M8,M10 - } - wait - - rsyncRunFolder (["-a"], \ - "$outPutFolder", \ - "$fastqcAggregateData", \ - "$fastqcAggregateData/$marker$folderName") -} - - -void barcodeDistribution (int [] laneCount) { - - barcodeDistBinary := "/links/application/dsu/barcodeDistribution/source/barcodeDistribution.py" - - for(int intLane : laneCount) { - - searchFolder := "$latestFolder/$demultiplexedFolder" + "_" + "$intLane" - - listOfLanes := getLaneNumbers("$searchFolder", "*R1_001*.gz") - print("$listOfLanes\n") - string laneString - - # TODO distinguish between single lane and more lanes - if (listOfLanes.size() > 1) { - laneString = "L00" - } - else{ - laneString = "" - } - for (string lane : listOfLanes) { - outputFolder := cleanString("$fcName") + "_" + "$lane" - fullOutputfolder := "$barcodeDistData/$outputFolder" - regex := "Undetermined*$laneString$lane*R1*.fastq.gz" - fullOutputfolder.mkdir() - task (cpus := 2) { - sys python3.5 $barcodeDistBinary \ - -f $outputFolder \ - -p $searchFolder \ - -r $regex \ - -o $fullOutputfolder \ - -d - } - wait - task touch "$barcodeDistData/$marker$outputFolder" - } - wait - } -} - - -void rsyncDemultiplexedFiles (int [] laneCount) { - - for(int intLane : laneCount) { - - searchFolder := "$latestFolder/$demultiplexedFolder" + "_" + "$intLane" - nohupFile := "$latestFolder/" + "nohup_" + "$runFolderName" + "_" + "$intLane" + ".txt" - - listOfLanes := getLaneNumbers(searchFolder, "*R1_001*.fastq.gz") - print(listOfLanes) - debug(listOfLanes) - - string [] filesPerLane - - # just for the Undetermined - for (string lane : listOfLanes) { - string newFolderName = "Undetermined_" + cleanString(fcName) + "_" + lane - #Undetermined_000000000_AH4PH_1 - string newFolderPath = searchFolder + "/" + newFolderName - - # Assuming it is only one lane - if (listOfLanes.size() == 1 && listOfLanes[0] == 1) { - filesPerLane = searchFolder.dir("*.fastq.gz") - } - else { - filesPerLane = searchFolder.dir("*L00" + lane + "*.fastq.gz") - } - - newFolderPath.mkdir() - print("Created $newFolderPath\n") - - for (string fastqFile : filesPerLane) { - string moveAndLinkID task ( canFail := true, cpus := 1 ){ - # sys echo "$searchFolder/$fastqFile" "$searchFolder/$newFolderName" - sys [[ -f "$searchFolder/$fastqFile" ]] && mv "$searchFolder/$fastqFile" "$searchFolder/$newFolderName/" - sys [[ ! -f "$searchFolder/$fastqFile" ]] && ln -s "$searchFolder/$newFolderName/$fastqFile" "$searchFolder/$fastqFile" - } - } - sys chmod -R 774 "$newFolderPath" - - rsyncRunFolder (["-a"], \ - "$nohupFile", \ - "$unalignedData/$newFolderName", \ - "") - - rsyncRunFolder (["-a"], \ - "$newFolderPath", \ - "$unalignedData", \ - "$unalignedData/$marker$newFolderName") - } - - # BSSE_QGF_36104_000000000_AH4PH_1 - sampleDirList := searchFolder.dir("$samplePrefix*") - for( string sampleFolder : sampleDirList) { - sys chmod -R 774 "$searchFolder/$sampleFolder" - - rsyncRunFolder (["-a"], \ - "$searchFolder/$sampleFolder", \ - "$unalignedData", \ - "") - - rsyncRunFolder (["-a"], \ - "$nohupFile", \ - "$unalignedData/$sampleFolder", \ - "$unalignedData/$marker$sampleFolder") - } - } -} - - -void rsyncLaneStatictics (int [] laneCount) { - - print("Starting rsyncLaneStatictics with lanes $laneCount\n") - for(int intLane : laneCount) { - - conversionStatsFile := "ConversionStats.xml" - demuxFile := "$latestFolder/$demultiplexedFolder" + "_" + "$intLane" + "/Stats/$conversionStatsFile" - if (!demuxFile.canRead()) { - printErr("Cannot read $demuxFile") - } - else { - print("Found $demuxFile") - } - demuxData := "" - folder_splits := runFolderName.split("_") - if (folder_splits[1].startsWith("NS")) { - demuxData = "$dss/v2_read-demultiplex-stats-nextseq" - } - else { - demuxData = "$dss/v2_read-demultiplex-stats-miseq-hiseq" - } - - outputDir:= "$demuxData/$runFolderName" + "_" + "$intLane" - markerFile := "$demuxData/$marker" + "$runFolderName" + "_" + "$intLane" - - print("$demuxFile") - rsyncRunFolder (["-a"], \ - "$demuxFile", \ - "$outputDir", \ - "$markerFile") - } -} - - -void bowtie () { - - undeterminedPath := "$latestFolder/$demultiplexedFolder/Undetermined_indices/Sample_lane1" - bowtie2Binary := "/links/application/dsu/aligner/bowtie2/bowtie2" - bowtie2PhixIndices := "/links/application/dsu/Genomes/bowtie2_indexes/phix/phix" - r1 := "$undeterminedPath/lane1_Undetermined_L001_R1_001.fastq.gz" - r2 := "$undeterminedPath/lane1_Undetermined_L001_R2_001.fastq.gz" - - task ( cpus := 7 ) { - sys $bowtie2Binary \ - -p7 \ - -x $bowtie2PhixIndices \ - -1 $r1 \ - -2 $r2 2>"$undeterminedPath/bowtie2_outPE.txt" \ - -S "$undeterminedPath/bowtie2_phiX_mapped_reads_PE.sam" - } -} - -void triggerRunReadJSON() { - - monitoringBinary := "/links/application/dsu/monitor_Illumina/source/monitor.py" - v2_read_json_dropbox := "/home/sbsuser/dss/v2_read-json" - - task /usr/local/bin/python2.7 $monitoringBinary \ - --single $latestFolder \ - --calculate \ - --outpath $v2_read_json_dropbox - wait - task touch "$v2_read_json_dropbox/$marker$fcName" -} - -void triggerChecksums(int max_jobs, int [] laneCount) { - checksumBinary := "/links/application/dsu/crc32/create_checksum_file.sh" - - for(int intLane : laneCount) { - inputFolder := "$latestFolder/$demultiplexedFolder" + "_" + "$intLane" - task $checksumBinary $inputFolder $max_jobs - } - wait -} - - -string getDate() { - return sys date -} - -void send_mail (string subject, string message){ - mailList := "kohleman@ethz.ch cbeisel@ethz.ch" - #mailList := "kohleman@ethz.ch" - task echo "$message" | /usr/bin/mutt -s "$subject" $mailList -} diff --git a/deep_sequencing_unit/source/Jython/barcodeComplexityChecker.py b/deep_sequencing_unit/source/Jython/barcodeComplexityChecker.py deleted file mode 100644 index d44c5aafc9c3ae1c8f17e640d8c04d8dc6159b57..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/source/Jython/barcodeComplexityChecker.py +++ /dev/null @@ -1,62 +0,0 @@ -def checkBarcodes(): - ''' - 'parents' are a HashSet of SamplePropertyPE - ''' - VOCABULARY_INDEX1 = 'BARCODE' - VOCABULARY_INDEX2 = 'INDEX2' - - RED = set(['A', 'C']) - GREEN = set(['T', 'G']) - - SUCCESS_MESSAGE = "OK" - NO_INDEX = "No Index" - - listofIndices = [] - boolList = [] - positionList = [] - returnString = " " - - for e in entity.entityPE().parents: - for s in e.properties: - if s.entityTypePropertyType.propertyType.simpleCode == VOCABULARY_INDEX1: - index = s.getVocabularyTerm().code - - if len(listofIndices) > 0: - for n in range(0, len(index) - 1): - listofIndices[n].append(index[n]) - else: - for n in range(0, len(index) - 1): - listofIndices.append([index[n]]) - - # remove any duplicates - setofIndices = [set(list) for list in listofIndices] - - # Test whether every element in the set 's' is in the RED set - boolList = [setofNuc.issubset(RED) for setofNuc in setofIndices] - - if boolList: - for b in boolList: - if b: - positionList.append(boolList.index(b) + 1) - # set the value to False, because 'index' returns only the first occurrence - boolList[boolList.index(b)] = False - else: - return NO_INDEX - - # if s.entityTypePropertyType.propertyType.simpleCode == VOCABULARY_INDEX2: - # pass - - if positionList: - for pos in positionList: - returnString += "WARNING! The following base position of " + \ - VOCABULARY_INDEX1 + \ - " does not have both color channels the index read: " + str(pos) + \ - "\n" - else: - returnString = SUCCESS_MESSAGE - - return returnString - -def calculate(): - """Main script function. The result will be used as the value of appropriate dynamic property.""" - return checkBarcodes() diff --git a/deep_sequencing_unit/source/Jython/createInvoices_Illumina_NGS.py b/deep_sequencing_unit/source/Jython/createInvoices_Illumina_NGS.py deleted file mode 100644 index d77c5c5f062bd1db6526f34dd20563da2cc6dff7..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/source/Jython/createInvoices_Illumina_NGS.py +++ /dev/null @@ -1,614 +0,0 @@ -# -*- coding: utf-8 -*- -''' -Copyright 2013 ETH Zuerich, CISD - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. - -@author Manuel Kohler - -@description: -Creates Excel-based invoices for the Quantitative Genomics Facility, -D-BSSE, ETH Zurich - -@attention: -Runs under Jython - -@note: - -''' - -import os -import re -import sys -import logging -from datetime import * -from ConfigParser import SafeConfigParser -from optparse import OptionParser -from java.io import FileOutputStream -from org.apache.poi.hssf.usermodel import HSSFWorkbook -from org.apache.poi.poifs.filesystem import POIFSFileSystem -from org.apache.poi.xssf.usermodel import XSSFWorkbook -from ch.systemsx.cisd.openbis.dss.client.api.v1 import OpenbisServiceFacadeFactory -from ch.systemsx.cisd.openbis.generic.shared.api.v1.dto import SearchCriteria -from ch.systemsx.cisd.openbis.generic.shared.api.v1.dto import SearchSubCriteria -from java.util import EnumSet -from java.util import TreeMap -from ch.systemsx.cisd.openbis.generic.shared.api.v1.dto import SampleFetchOption -from ch.systemsx.cisd.openbis.generic.shared.dto import NewRoleAssignment - -excelFormats = {"xls": "HSSFWorkbook()" , "xlsx": "XSSFWorkbook()"} - -# This list is imply used to keep the order of elements of the 'columnHeadersMap' -columnHeadersList = ["EXTERNAL_SAMPLE_NAME", "BARCODE", "INDEX2", "CONTACT_PERSON_NAME", - "BIOLOGICAL_SAMPLE_ARRIVED", "PREPARED_BY", "KIT", "QC_AT_DBSSE", - "CELL_PLASTICITY_SYSTEMSX", "PRICE", "NOTES"] - -columnHeadersMap = {"EXTERNAL_SAMPLE_NAME": "Sample Name", - "BARCODE": "Index", - "INDEX2": "Index2", - "PREPARED_BY" : "Prepared by", - "KIT" : "Kit", - "QC_AT_DBSSE" : "QC at D-BSSE", - "CONTACT_PERSON_NAME" : "Contact Person", - "NOTES" : "Notes", - "BIOLOGICAL_SAMPLE_ARRIVED": "Received", - "CELL_PLASTICITY_SYSTEMSX": "Cell Plasticity", - "PRICE" : "Price"} - -SAMPLETYPE = 'SAMPLETYPE' -EXTERNAL_SAMPLE_NAME = 'EXTERNAL_SAMPLE_NAME' -RUN_FOLDER_NAME = 'RUN_FOLDER_NAME' - -class uniqueRow(): - ''' - Little helper class which ensures the unique use of a row - ''' - def __init__(self): - self.row = -1 - - def getNextRow (self): - self.row += 1 - return self.row - - def setRow(self, rowNumber): - self.row = rowNumber - return self.row - -class uniqueColumn(): - ''' - Little helper class which ensures the unique use of a column - ''' - def __init__(self): - self.column = -1 - - def getCurrentColumn(self): - return self.column - - def getNextColumn (self): - self.column += 1 - return self.column - - def setColumn(self, columnNumber): - self.column = columnNumber - return self.column - - -class openbisRow (): - ''' - Represents a single row in an Excel file with the relevant properties, - code and pi are for internal organization - ''' - def __init__(self): - self.code = 'code' - self.pi = 'PRINCIPAL_INVESTIGATOR_NAME' - self.externalSampleName = 'EXTERNAL_SAMPLE_NAME' - self.index1 = 'INDEX1' - self.index2 = 'INDEX2' - self.preparedBy = 'PREPARED_BY' - self.kit = 'KIT' - self.qcAtBsse = 'QC_AT_DBSSE' - self.contactPersonName = 'CONTACT_PERSON_NAME' - self.notes = 'NOTES' - self.biologicalSampleArrived = 'BIOLOGICAL_SAMPLE_ARRIVED' - self.cellPlasticitySystemsX = '' - self.price = '' - - def __str__(self): - return "code: %s, pi: %s, externalSampleName: %s, index1: %s, index2: %s, preparedBy: %s, kit: %s," \ - " qcAtBsse: %s, contactPersonName: %s, notes: %s, biologicalSampleArrived: %s," \ - " cellPlasticitySystemsX: %s, price: %s" \ - % (self.code, self.pi, self.externalSampleName, self.index1, self.index2, self.preparedBy, self.kit, - self.qcAtBsse, self.contactPersonName, self.notes, self.biologicalSampleArrived, - self.cellPlasticitySystemsX, self.price) - -def getDate(): - d = datetime.now() - return d.strftime("%A, %d-%B-%Y") - -def setFont(wb, configDict, fontSize=10): - font = wb.createFont() - font.setFontHeightInPoints(fontSize) - font.setFontName(configDict["defaultFonts"]) - font.setItalic(False) - font.setStrikeout(False) - # Fonts are set into a style so create a new one to use. - style = wb.createCellStyle() - style.setFont(font) - return style - -def getVocabulary(service, vocabularyCode): - ''' Returns the vocabulary term and vocabulary label of a vocabulary specified by the parameter - vocabularyCode in a map''' - - vocabularies = service.listVocabularies() - vocabularyMap = {} - for vocabulary in vocabularies: - if (vocabulary.getCode() == vocabularyCode): - terms = vocabulary.getTerms() - for term in terms: - vocabularyMap[term.getCode()] = term.getLabel() - return vocabularyMap - -def writeExcel(myoptions, configDict, service, piName, piDict, - piSpace, flowCellProperties, flowcell, logger, - listOfCodeList, listOfPropertyDicts, format="xls"): - - ''' - Writes out all data to an Excel file - ''' - myRows = uniqueRow() - sequencerVocabulary = getVocabulary(service, "SEQUENCER") - setOfFlowcells = set () - - def getValueOrEmptyString (key, myDict): - if key in myDict: - return myDict[key] - else: - return '' - - def writeHeader(): - # Write header - row = sheet.createRow(myRows.getNextRow()) - row.createCell(0).setCellValue(configDict["facilityName"] + ", " + configDict["facilityInstitution"]) - row.getCell(0).setCellStyle(setFont(wb, configDict, 10)) - row1 = sheet.createRow(myRows.getNextRow()) - row1.createCell(0).setCellValue(getDate()) - row1.getCell(0).setCellStyle(setFont(wb, configDict, 10)) - - def createRow(key="", value="", rowNumber=0, fontSize=10): - ''' - ''' - if rowNumber == 0: - row = sheet.createRow(myRows.getNextRow()) - else: - row = rowNumber - row.createCell(0).setCellValue(key) - row.createCell(1).setCellValue(value) - row.getCell(0).setCellStyle(setFont(wb, configDict, fontSize)) - row.getCell(1).setCellStyle(setFont(wb, configDict, fontSize)) - return row - - def writeFooter(service, sheet): - footer = sheet.getFooter() - footer.setRight("generated on " + datetime.now().strftime("%H:%M - %d.%m.%Y")) - - - wb = (eval(excelFormats[format])) - createHelper = wb.getCreationHelper() - sheet = wb.createSheet(configDict["facilityNameShort"]) - # 3/2 = 150 percent magnification when opening the workbook - sheet.setZoom(3, 2) - - writeHeader() - createRow("Principal Investigator", piName.replace("_", " ")) - createRow("Data Space", piSpace) - createRow("Run Folder Name", getValueOrEmptyString(RUN_FOLDER_NAME, flowCellProperties)) - createRow() - - myColumns = uniqueColumn() - - sampleHeader = sheet.createRow(myRows.getNextRow()) - sampleHeader.createCell(myColumns.getNextColumn()).setCellValue("Flow Cell:Lane") - sampleHeader.getCell(myColumns.getCurrentColumn()).setCellStyle(setFont(wb, configDict, 10)) - sampleHeader.createCell(myColumns.getNextColumn()).setCellValue("Sample Code") - sampleHeader.getCell(myColumns.getCurrentColumn()).setCellStyle(setFont(wb, configDict, 10)) - for c in columnHeadersList: - sampleHeader.createCell(myColumns.getNextColumn()).setCellValue(columnHeadersMap[c]) - sampleHeader.getCell(myColumns.getCurrentColumn()).setCellStyle(setFont(wb, configDict, 10)) - - listofLanes = piDict[piName] - listofLanes.sort() - logger.debug(listofLanes) - - for lane in listofLanes: - singleSampleColumns = uniqueColumn() - - sampleCodeForInvoicing = [] - - for code in listOfCodeList[lane-1]: - logger.info ('Processing: ' + code) - sampleProperties = listOfPropertyDicts[lane-1][code] - - if (sampleProperties[SAMPLETYPE] == configDict['masterTypeName']): - newRow.biologicalSampleArrived = getValueOrEmptyString(newRow.biologicalSampleArrived, sampleProperties) - newRow.contactPersonName = getValueOrEmptyString(newRow.contactPersonName, sampleProperties) - newRow.pi = sanitizeString(getValueOrEmptyString(newRow.pi, sampleProperties)) - - if (newRow.pi != piName): - logger.info('This is a shared lane.Lane PI and sample PI are not the same. We do not write ' - 'the row to the Excel file') - continue - - logger.info('Excel Sheet line: ') - logger.info(newRow) - - rowN = sheet.createRow(myRows.getNextRow()) - rowN.createCell(singleSampleColumns.getNextColumn()).setCellValue(flowcell + ":" + str(lane)) - rowN.getCell(singleSampleColumns.getCurrentColumn()).setCellStyle(setFont(wb, configDict, 10)) - - #Code Sample Name Index Index2 Contact Person Received Prepared by Kit QC at D-BSSE Cell Plasticity Price Notes - rowN.createCell(singleSampleColumns.getNextColumn()).setCellValue(newRow.code) - rowN.getCell(singleSampleColumns.getCurrentColumn()).setCellStyle(setFont(wb, configDict, 10)) - - rowN.createCell(singleSampleColumns.getNextColumn()).setCellValue(newRow.externalSampleName) - rowN.getCell(singleSampleColumns.getCurrentColumn()).setCellStyle(setFont(wb, configDict, 10)) - - rowN.createCell(singleSampleColumns.getNextColumn()).setCellValue(newRow.index1) - rowN.getCell(singleSampleColumns.getCurrentColumn()).setCellStyle(setFont(wb, configDict, 10)) - - rowN.createCell(singleSampleColumns.getNextColumn()).setCellValue(newRow.index2) - rowN.getCell(singleSampleColumns.getCurrentColumn()).setCellStyle(setFont(wb, configDict, 10)) - - rowN.createCell(singleSampleColumns.getNextColumn()).setCellValue(newRow.contactPersonName) - rowN.getCell(singleSampleColumns.getCurrentColumn()).setCellStyle(setFont(wb, configDict, 10)) - - rowN.createCell(singleSampleColumns.getNextColumn()).setCellValue(newRow.biologicalSampleArrived) - rowN.getCell(singleSampleColumns.getCurrentColumn()).setCellStyle(setFont(wb, configDict, 10)) - - rowN.createCell(singleSampleColumns.getNextColumn()).setCellValue(newRow.preparedBy) - rowN.getCell(singleSampleColumns.getCurrentColumn()).setCellStyle(setFont(wb, configDict, 10)) - - rowN.createCell(singleSampleColumns.getNextColumn()).setCellValue(newRow.kit) - rowN.getCell(singleSampleColumns.getCurrentColumn()).setCellStyle(setFont(wb, configDict, 10)) - - rowN.createCell(singleSampleColumns.getNextColumn()).setCellValue(newRow.qcAtBsse) - rowN.getCell(singleSampleColumns.getCurrentColumn()).setCellStyle(setFont(wb, configDict, 10)) - - rowN.createCell(singleSampleColumns.getNextColumn()).setCellValue(newRow.cellPlasticitySystemsX) - rowN.getCell(singleSampleColumns.getCurrentColumn()).setCellStyle(setFont(wb, configDict, 10)) - - rowN.createCell(singleSampleColumns.getNextColumn()).setCellValue(newRow.price) - rowN.getCell(singleSampleColumns.getCurrentColumn()).setCellStyle(setFont(wb, configDict, 10)) - - rowN.createCell(singleSampleColumns.getNextColumn()).setCellValue(newRow.notes) - rowN.getCell(singleSampleColumns.getCurrentColumn()).setCellStyle(setFont(wb, configDict, 10)) - - # if the LIBRARY has no External Name we try to take the one from the RAW sample - if (sampleProperties[SAMPLETYPE] == configDict['rawTypeName']): - if not newRow.externalSampleName: - newRow.externalSampleName = 'Raw Sample Name: ' + getValueOrEmptyString(EXTERNAL_SAMPLE_NAME, sampleProperties) - - if (sampleProperties[SAMPLETYPE] == configDict['libraryTypeName']): - newRow = openbisRow() - sampleCodeForInvoicing.append(code) - - newRow.code = code - newRow.externalSampleName = getValueOrEmptyString(newRow.externalSampleName, sampleProperties) - newRow.index1 = getValueOrEmptyString(newRow.index1, sampleProperties) - newRow.index2 = getValueOrEmptyString(newRow.index2, sampleProperties) - newRow.preparedBy = getValueOrEmptyString(newRow.preparedBy, sampleProperties) - newRow.kit = getValueOrEmptyString(newRow.kit, sampleProperties) - newRow.qcAtBsse = getValueOrEmptyString(newRow.qcAtBsse, sampleProperties) - newRow.notes = getValueOrEmptyString(newRow.notes, sampleProperties) - - singleSampleColumns = uniqueColumn() - - createRow() - createRow("Flow Cell Details", "", 0, 14) - - createRow("Flow Cell", flowcell) - for property in flowCellProperties: - if (property == "SEQUENCER"): - val = sequencerVocabulary[flowCellProperties[property]] - else: - val = flowCellProperties[property] - - createRow(property, val) - createRow() - - # adjust width - for i in range(0, 20): - sheet.autoSizeColumn(i) - - # set layout to landscape - sheet.getPrintSetup().setLandscape(True) - - writeFooter(service, sheet) - - # sanitizeString(piName) + datetime.now().strftime("_%d_%m_%Y.") + format - # Write the output to a file - fileName = myoptions.outdir + configDict["facilityNameShort"] + "_" + flowcell + "_" + \ - sanitizeString(piName) + "." + format - fileOut = FileOutputStream(fileName) - # need this print for use as an openBIS webapp - print fileName - - wb.write(fileOut); - fileOut.close(); - - return sampleCodeForInvoicing - -def sanitizeString(myString): - myString = myString.replace(u'ä', 'ae') - myString = myString.replace(u'ü', 'ue') - myString = myString.replace(u'ö', 'oe') - return re.sub('[^A-Za-z0-9]+', '_', myString) - -def setUpLogger(logPath, logLevel=logging.INFO): - logFileName = 'createInvoices' - d = datetime.now() - logFileName = logFileName + '_' + d.strftime('%Y-%m-%d_%H_%M_%S') + '.log' - logging.basicConfig(filename=logPath + logFileName, - format='%(asctime)s [%(levelname)s] %(message)s', level=logLevel) - logger = logging.getLogger(logFileName) - return logger - - -def parseConfigurationFile(propertyFile='etc/service.properties'): - ''' - Parses the given config files and returns the values - ''' - config = SafeConfigParser() - config.read(propertyFile) - config.sections() - return config - -def readConfig(logger): - GENERAL = 'GENERAL' - OPENBIS = 'OPENBIS' - EXCEL = 'EXCEL' - - logger.info('Reading config file') - configDict = {} - - configParameters = parseConfigurationFile() - configDict['facilityName'] = configParameters.get(GENERAL, 'facilityName') - configDict['facilityNameShort'] = configParameters.get(GENERAL, 'facilityNameShort') - configDict['facilityInstitution'] = configParameters.get(GENERAL, 'facilityInstitution') - configDict['mailList'] = configParameters.get(GENERAL, 'mailList') - configDict['mailFrom'] = configParameters.get(GENERAL, 'mailFrom') - configDict['smptHost'] = configParameters.get(GENERAL, 'smptHost') - configDict['separator'] = configParameters.get(GENERAL, 'separator') - configDict['indexSeparator'] = configParameters.get(GENERAL, 'indexSeparator') - - configDict['openbisUserName'] = configParameters.get(OPENBIS, 'openbisUserName') - configDict['openbisPassword'] = configParameters.get(OPENBIS, 'openbisPassword', raw=True) - configDict['openbisServer'] = configParameters.get(OPENBIS, 'openbisServer') - configDict['connectionTimeout'] = configParameters.getint(OPENBIS, 'connectionTimeout') - configDict['pIPropertyName'] = configParameters.get(OPENBIS, 'pIPropertyName') - configDict['invoiceName'] = configParameters.get(OPENBIS, 'invoiceName') - configDict['sampleCodePrefix'] = configParameters.get(OPENBIS, 'sampleCodePrefix') - - configDict['illuminaFlowLaneTypeName'] = configParameters.get(OPENBIS, 'illuminaFlowLaneTypeName') - configDict['libraryPoolTypeName'] = configParameters.get(OPENBIS, 'libraryPoolTypeName') - configDict['libraryTypeName'] = configParameters.get(OPENBIS, 'libraryTypeName') - configDict['rawTypeName'] = configParameters.get(OPENBIS, 'rawTypeName') - configDict['masterTypeName'] = configParameters.get(OPENBIS, 'masterTypeName') - - configDict['defaultFonts'] = configParameters.get(EXCEL, 'defaultFonts') - - return configDict - -def login(logger, configDict): - logger.info('Logging into ' + configDict['openbisServer']) - service = OpenbisServiceFacadeFactory.tryCreate(configDict['openbisUserName'], - configDict['openbisPassword'], - configDict['openbisServer'], - configDict['connectionTimeout']) - return service - -def parseOptions(logger): - logger.info('Parsing command line parameters') - parser = OptionParser(version='%prog 1.0') - parser.add_option('-f', '--flowcell', - dest='flowcell', - help='The flowcell which is used to create the SampleSheet.csv', - metavar='<flowcell>') - parser.add_option('-o', '--outdir', - dest='outdir', - default='./', - help='Specify the ouput directory. Default: ./' , - metavar='<outdir>') - parser.add_option('-d', '--debug', - dest='debug', - default=False, - action='store_true', - help='Verbose debug logging. Default: False') - - (options, args) = parser.parse_args() - - if options.outdir[-1] <> '/': - options.outdir = options.outdir + '/' - - if options.flowcell is None: - parser.print_help() - exit(-1) - return options - - - -def getLaneAncestors(service, lane, logger): - ''' - Gets all ancestors and corresponding properties of a sample - ''' - fetchOptions = EnumSet.of(SampleFetchOption.ANCESTORS, SampleFetchOption.PROPERTIES) - sc = SearchCriteria(); - sc.addMatchClause(SearchCriteria.MatchClause.createAttributeMatch(SearchCriteria.MatchClauseAttribute.CODE, lane)); - dList = service.searchForSamples(sc, fetchOptions) - - def recursiveSamples(list, codeList, propertyDict): - ''' - Recursively walks through the sample tree and write the sample codes - to a list and the properties into a dictionary. The sample code is - the key, the properties are the values - ''' - - for element in list: - elementCode = element.getCode() - codeList.append(elementCode) - elementProperties = element.getProperties() - - tmpDict = {} - - for eP in elementProperties: - tmpDict[eP] = elementProperties[eP] - - tmpDict[SAMPLETYPE] = element.getSampleTypeCode() - tmpDict['SPACE'] = element.getSpaceCode() - propertyDict[elementCode] = tmpDict - - elementParents = element.getParents() - - if (elementParents.size() > 0): - recursiveSamples(elementParents, codeList, propertyDict) - - codeList = [] - propertyDict = {} - - recursiveSamples(dList, codeList, propertyDict) - - logger.debug(codeList) - logger.debug(propertyDict) - - return codeList, propertyDict - - -def getFLowcellData(service, configDict, flowcell, logger): - - fetchOptions = EnumSet.of(SampleFetchOption.ANCESTORS, SampleFetchOption.PROPERTIES) - - sc = SearchCriteria(); - sc.addMatchClause(SearchCriteria.MatchClause.createAttributeMatch(SearchCriteria.MatchClauseAttribute.CODE, flowcell)); - fcList = service.searchForSamples(sc, fetchOptions) - - try: - assert fcList.size() == 1 - except AssertionError: - print (str(fcList.size()) + ' flow cells found which match.') - exit(1) - - for p in fcList: - flowCellProperties = p.getProperties() - - numberOfLanes = int(flowCellProperties['LANECOUNT']) - - piDict = {} - spaceDict = {} - invoiceDict = {} - listOfCodeList = [] - listOfPropertyDicts = [] - - for lane in range(1, numberOfLanes + 1): - myLane = flowcell + ":" + str(lane) - codeList, propertyDict = getLaneAncestors(service, myLane, logger) - listOfCodeList.append(codeList) - listOfPropertyDicts.append(propertyDict) - - for code in codeList: - sampleProperties = propertyDict[code] - logger.debug ('Processing ' + code) - - if (sampleProperties[SAMPLETYPE] == configDict['libraryTypeName']): - invoiceProperty = sampleProperties[configDict['invoiceName']] - # if sample got created via Excel upload, the property could be not set, which is represented by None - if (invoiceProperty is None): - invoiceProperty = 'false' - sentInvoice = {'true': True, 'false': False}.get(invoiceProperty.lower()) - - if (sampleProperties[SAMPLETYPE] == configDict['masterTypeName']): - pi = sanitizeString(sampleProperties[configDict['pIPropertyName']]) - logger.debug("PI for " + code + ": " + pi) - logger.debug("Invoice sent for " + code + ": " + str(sentInvoice)) - - if piDict.has_key(pi): - piDict[pi].append(lane) - # Making the lanes unique - piDict[pi] = list(set(piDict[pi])) - else: - piDict[pi] = [lane] - - if not sentInvoice: - if invoiceDict.has_key(pi): - invoiceDict[pi].append(lane) - # Making the lanes unique - invoiceDict[pi] = list(set(invoiceDict[pi])) - else: - invoiceDict[pi] = [lane] - - spaceDict[pi] = sampleProperties['SPACE'] - - logger.debug(spaceDict) - - logger.info("Found the following PIs on the lanes: ") - logger.info(piDict) - logger.info("Found the following PIs with non-invoiced samples : ") - logger.info(invoiceDict) - - # simply sort the hashmap - treeMap = TreeMap (flowCellProperties) - return piDict, treeMap, spaceDict, invoiceDict, listOfCodeList, listOfPropertyDicts - - -''' -Main script -''' - -def main(): - - # for now setting the format by hand - format = "xlsx" - magicString = "@Invoice@" - - logger = setUpLogger('log/') - logger.info('Started Creation Invoices...') - - myoptions = parseOptions(logger) - configDict = readConfig(logger) - if myoptions.debug: - logger.setLevel(logging.DEBUG) - - service = login(logger, configDict) - flowcellName = myoptions.flowcell - piDict, flowCellProperties, spaceDict, invoiceDict, listOfCodeList, listOfPropertyDicts =\ - getFLowcellData(service, configDict, flowcellName, logger) - - piSampleCodeDict = {} - - for piName in piDict: - # create an Excel file for each PI - sampleCodeForInvoicing = writeExcel(myoptions, configDict, service, piName, piDict, - spaceDict[piName], flowCellProperties, flowcellName, logger, - listOfCodeList, listOfPropertyDicts, format) - - piSampleCodeDict[piName] = sampleCodeForInvoicing - - for invoicePi in invoiceDict: - tmpString = magicString + invoicePi - for samplecode in piSampleCodeDict[invoicePi]: - tmpString = tmpString + '#' + samplecode - print tmpString - - service.logout() - -if __name__ == "__main__": - main() diff --git a/deep_sequencing_unit/source/Jython/createSampleSheet.py b/deep_sequencing_unit/source/Jython/createSampleSheet.py deleted file mode 100644 index 4165e800ac8f5ce9bb9cacb64c5fa8ce90d438ba..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/source/Jython/createSampleSheet.py +++ /dev/null @@ -1,702 +0,0 @@ -''' -@copyright: -Copyright 2014 ETH Zuerich, SIS - -@license: -Licensed under the Apache License, Version 2.0 (the 'License'); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - -http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an 'AS IS' BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. - -@author: -Manuel Kohler - -@description: -Creates the SampleSheet.csv out of values from openBIS for Demultiplexing -used in the Illumina pipeline (configureBclToFastq.pl) - -@attention: -Runs under Jython - -@note: -Takes into account to replace special characters with an underscore so that the Illumina script -does not fail - -HiSeq Header Description -======================== -Column Header Description -FCID Flow cell ID -Lane Positive integer, indicating the lane number (1-8) -SampleID ID of the sample -SampleRef The reference used for alignment for the sample -Index Index sequences. Multiple index reads are separated by a hyphen (for example, ACCAGTAA-GGACATGA). -Description Description of the sample -Control Y indicates this lane is a control lane, N means sample -Recipe Recipe used during sequencing -Operator Name or ID of the operator -SampleProject The project the sample belongs to -''' - -from __future__ import with_statement -import os -import logging -import re -import sys -import string -import smtplib -from ConfigParser import SafeConfigParser -from optparse import OptionParser -from datetime import * - -from email.MIMEMultipart import MIMEMultipart -from email.MIMEBase import MIMEBase -from email.MIMEText import MIMEText -from email.Utils import COMMASPACE, formatdate -from email import Encoders - -from ch.systemsx.cisd.openbis.dss.client.api.v1 import OpenbisServiceFacadeFactory -from ch.systemsx.cisd.openbis.generic.shared.api.v1.dto import SearchCriteria -from ch.systemsx.cisd.openbis.generic.shared.api.v1.dto import SearchSubCriteria - -lineending = {'win32':'\r\n', 'linux':'\n', 'mac':'\r'} -COMMA = ',' - -def login(logger, configMap): - logger.info('Logging into ' + configMap['openbisServer']) - service = OpenbisServiceFacadeFactory.tryCreate(configMap['openbisUserName'], - configMap['openbisPassword'], - configMap['openbisServer'], - configMap['connectionTimeout']) - return service - -def logout (service, logger): - service.logout() - logger.info('Logged out') - -def setUpLogger(logPath, logLevel=logging.INFO): - logFileName = 'createSampleSheet' - d = datetime.now() - logFileName = logFileName + '_' + d.strftime('%Y-%m-%d_%H_%M_%S') + '.log' - logging.basicConfig(filename=logPath + logFileName, - format='%(asctime)s [%(levelname)s] %(message)s', level=logLevel) - logger = logging.getLogger(logFileName) - return logger - -def parseOptions(logger): - logger.info('Parsing command line parameters') - parser = OptionParser(version='%prog 1.0') - parser.add_option('-f', '--flowcell', - dest='flowcell', - help='The flowcell which is used to create the SampleSheet.csv', - metavar='<flowcell>') - parser.add_option('-m', '--mailist', - dest='maillist', - default=False, - action='store_true', - help='Generated Sample Sheet will be addtionally sent as email to the defined list of recipients', - metavar='<maillist>') - parser.add_option('-l', '--lineending', - dest='lineending', - type='choice', - action='store', - choices=['win32', 'linux', 'mac'], - default='linux', - help='Specify end of line separator: win32, linux, mac. Default: linux' , - metavar='<lineending>') - parser.add_option('-o', '--outdir', - dest='outdir', - default='./', - help='Specify the ouput directory. Default: ./' , - metavar='<outdir>') - parser.add_option('-s', '--singlelane', - dest='singlelane', - default=False, - action='store_true', - help='Creates a single Sample Sheet for each lane. Default: False') - parser.add_option('-d', '--debug', - dest='debug', - default=False, - action='store_true', - help='Verbose debug logging. Default: False') - parser.add_option('-v', '--verbose', - dest='verbose', - default=False, - action='store_true', - help='Write Sample Sheet to stout. Default: False') - - - (options, args) = parser.parse_args() - - if options.outdir[-1] <> '/': - options.outdir = options.outdir + '/' - - if options.flowcell is None: - parser.print_help() - exit(-1) - return options - -def parseConfigurationFile(propertyFile='etc/createSampleSheet.properties'): - ''' - Parses the given config files and returns the values - ''' - config = SafeConfigParser() - config.read(propertyFile) - config.sections() - return config - -def readConfig(logger): - GENERAL = 'GENERAL' - OPENBIS = 'OPENBIS' - ILLUMINA = 'ILLUMINA' - - logger.info('Reading config file') - configMap = {} - - configParameters = parseConfigurationFile() - configMap['facilityName'] = configParameters.get(GENERAL, 'facilityName') - configMap['facilityNameShort'] = configParameters.get(GENERAL, 'facilityNameShort') - configMap['facilityInstitution'] = configParameters.get(GENERAL, 'facilityInstitution') - configMap['mailList'] = configParameters.get(GENERAL, 'mailList') - configMap['mailFrom'] = configParameters.get(GENERAL, 'mailFrom') - configMap['smptHost'] = configParameters.get(GENERAL, 'smptHost') - configMap['SampleSheetFileName'] = configParameters.get(GENERAL, 'SampleSheetFileName') - configMap['separator'] = configParameters.get(GENERAL, 'separator') - configMap['indexSeparator'] = configParameters.get(GENERAL, 'indexSeparator') - - configMap['openbisUserName'] = configParameters.get(OPENBIS, 'openbisUserName') - configMap['openbisPassword'] = configParameters.get(OPENBIS, 'openbisPassword', raw=True) - configMap['openbisServer'] = configParameters.get(OPENBIS, 'openbisServer') - configMap['connectionTimeout'] = configParameters.getint(OPENBIS, 'connectionTimeout') - configMap['illuminaFlowCellTypeName'] = configParameters.get(OPENBIS, 'illuminaFlowCellTypeName') - configMap['index1Name'] = configParameters.get(OPENBIS, 'index1Name') - configMap['index2Name'] = configParameters.get(OPENBIS, 'index2Name') - configMap['index1Length'] = configParameters.get(OPENBIS, 'index1Length') - configMap['index2Length'] = configParameters.get(OPENBIS, 'index2Length') - configMap['endType'] = configParameters.get(OPENBIS, 'endType') - configMap['cycles'] = configParameters.get(OPENBIS, 'cycles') - configMap['controlLane'] = configParameters.get(OPENBIS, 'controlLane') - configMap['ncbi'] = configParameters.get(OPENBIS, 'ncbi') - configMap['externalSampleName'] = configParameters.get(OPENBIS, 'externalSampleName') - configMap['laneCount'] = configParameters.get(OPENBIS, 'laneCount') - - configMap['hiSeqNames'] = configParameters.get(ILLUMINA, 'hiSeqNames') - configMap['miSeqNames'] = configParameters.get(ILLUMINA, 'miSeqNames') - configMap['hiSeqHeader'] = configParameters.get(ILLUMINA, 'hiSeqHeader') - - configMap['miSeqHeaderSection'] = configParameters.get(ILLUMINA, 'miSeqHeaderSection') - configMap['miSeqReadsSection'] = configParameters.get(ILLUMINA, 'miSeqReadsSection') - configMap['miSeqSettingsSection'] = configParameters.get(ILLUMINA, 'miSeqSettingsSection') - configMap['miSeqWorkflow'] = configParameters.get(ILLUMINA, 'miSeqWorkflow') - configMap['miSeqApplication'] = configParameters.get(ILLUMINA, 'miSeqApplication') - configMap['miSeqChemistry'] = configParameters.get(ILLUMINA, 'miSeqChemistry') - - configMap['nexteraAdapter'] = configParameters.get(ILLUMINA, 'nexteraAdapter') - configMap['iemFileVersion'] = configParameters.get(ILLUMINA, 'iemFileVersion') - - configMap['configureBclToFastqPath'] = configParameters.get(ILLUMINA, 'configureBclToFastqPath') - configMap['failedReads'] = configParameters.get(ILLUMINA, 'failedReads') - configMap['clusterCount'] = configParameters.get(ILLUMINA, 'clusterCount') - configMap['clusterCountNumber'] = configParameters.get(ILLUMINA, 'clusterCountNumber') - configMap['outputDir'] = configParameters.get(ILLUMINA, 'outputDir') - configMap['sampleSheetName'] = configParameters.get(ILLUMINA, 'sampleSheetName') - configMap['baseMask'] = configParameters.get(ILLUMINA, 'baseMask') - - return configMap - -def getDate(): - d = datetime.now() - return d.strftime('%A, %d of %B %Y') - -def sanitizeString(myString): - return re.sub('[^A-Za-z0-9]+', '_', myString) - -def getVocabulary(vocabularyCode, service): - ''' Returns the vocabulary terms and vocabulary labels of a vocabulary in a dictionary - specified by the parameter vocabularyCode - ''' - terms = [] - vocabularies = service.listVocabularies() - vocabularyDict = {} - for vocabulary in vocabularies: - if (vocabulary.getCode() == vocabularyCode): - terms = vocabulary.getTerms() - if terms: - for term in terms: - vocabularyDict[term.getCode()] = term.getLabel() - else: - print ('No vocabulary found for ' + vocabularyCode) - return vocabularyDict - -def sendMail(emails, files, flowCellName, configMap, logger): - ''' - Send out an email to the specified recipients - ''' - COMMASPACE = ', ' - listofEmails = emails.split() - - msg = MIMEMultipart() - msg['From'] = configMap['mailFrom'] - msg['To'] = COMMASPACE.join(listofEmails) - msg['Date'] = formatdate(localtime=True) - msg['Subject'] = 'Generated Sample Sheet for flowcell ' + flowCellName - - msg.attach(MIMEText('Sample Sheet for ' + flowCellName + ' attached.')) - - for f in files: - part = MIMEBase('application', 'octet-stream') - part.set_payload(open(f, 'rb').read()) - Encoders.encode_base64(part) - part.add_header('Content-Disposition', 'attachment; filename="%s"' % os.path.basename(f)) - msg.attach(part) - - smtp = smtplib.SMTP(configMap['smptHost']) - smtp.sendmail(configMap['mailFrom'], listofEmails, msg.as_string()) - smtp.close() - logger.info('Sent email to ' + COMMASPACE.join(listofEmails)) - - -def getFlowCell (illuminaFlowCellTypeName, flowCellName, service, logger): - ''' - Getting the the matching FlowCell - ''' - sc = SearchCriteria(); - sc.addMatchClause(SearchCriteria.MatchClause.createAttributeMatch(SearchCriteria.MatchClauseAttribute.TYPE, illuminaFlowCellTypeName)); - sc.addMatchClause(SearchCriteria.MatchClause.createAttributeMatch(SearchCriteria.MatchClauseAttribute.CODE, flowCellName)); - foundSample = service.searchForSamples(sc) - try: - assert foundSample.size() == 1 - except AssertionError: - print (str(foundSample.size()) + ' flow cells found which match.') - exit(1) - - logger.info('Found ' + foundSample[0].getCode() + ' in openBIS') - # Search for contained samples - sampleSc = SearchCriteria() - sampleSc.addSubCriteria(SearchSubCriteria.createSampleContainerCriteria(sc)) - foundContainedSamples = service.searchForSamples(sampleSc) - - return foundSample[0], foundContainedSamples - - -def getParents(sampleName, service): - ''' - Returns a list of parents of a sample - ''' - sc = SearchCriteria(); - sc.addMatchClause(SearchCriteria.MatchClause.createAttributeMatch(SearchCriteria.MatchClauseAttribute.CODE, sampleName)); - foundSample = service.searchForSamples(sc) - - try: - assert foundSample.size() == 1 - except AssertionError: - print (str(foundSample.size()) + ' flow lanes found which match.') - - # set the criteria for getting the parents when providing the child name - sampleSc = SearchCriteria() - sampleSc.addSubCriteria(SearchSubCriteria.createSampleChildCriteria(sc)) - foundParentSamples = service.searchForSamples(sampleSc) - - return foundParentSamples - -def getContainedSampleProperties(containedSamples, service): - - # TODO: update description and function name - ''' - Takes a list of contained samples, retrieves the parents and their properties and returns it - as a dictionary. The key is the sample name, the value is a list of the properties - - Additionally a dictionary with the lane (key) and the number of samples (value) is returned - ''' - parentDict = {} - samplesPerLaneDict = {} - - for lane in containedSamples: - parents = getParents (lane.getCode(), service) - - try: - assert parents.size() >= 1 - except AssertionError: - print (str(parents.size()) + ' parents found for lane ' + lane.getCode()) - - samplesPerLaneDict[lane.getCode()[-1]] = len(parents) - - for parent in parents: - parentCode = parent.getCode() - parentProperties = parent.getProperties() - propertyDict = {} - for property in parentProperties: - propertyDict[property] = parentProperties.get(property) - - propertyDict['LANE'] = lane.getCode() - - myKey = sanitizeString(parentCode + '_' + lane.getCode()) - parentDict[myKey] = propertyDict - - return parentDict, samplesPerLaneDict - - -def convertSampleToDict(foundFlowCell): - ''' - converts <type 'ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.Sample'> to a python dict - ''' - flowCellDict = {} - fcProperties = foundFlowCell.getProperties() - for property in fcProperties: - flowCellDict[property] = fcProperties.get(property) - flowCellDict['Project'] = foundFlowCell.getExperimentIdentifierOrNull().split('/')[-1] - flowCellDict['Name'] = foundFlowCell.getIdentifier().split('/')[-1] - return flowCellDict - - -def createDemultiplexCommands(myoptions, configMap, laneIndexDict, endType, cycles, lane, - myFileName, indexRead1Length, indexRead2Length): - ''' - Builds up a command line for the demultiplexing of a single flow lane - ''' - - newline = lineending[myoptions.lineending] - indexlength = laneIndexDict[lane][0] - if laneIndexDict[lane][1] == 'DUALINDEX': - basesMask = 'Y' + cycles + COMMA + 'I' + str(indexlength / 2) + 'n' + COMMA + 'I' + \ - str(indexlength / 2) + 'n' - else: - basesMask = 'Y' + cycles + COMMA + 'I' + str(indexlength) + (indexRead1Length - indexlength + 1)*'n' - if endType == 'PAIRED_END': - basesMask = basesMask + COMMA + 'Y' + cycles - return ([' '.join([configMap['configureBclToFastqPath'], configMap['failedReads'], - configMap['clusterCount'], configMap['clusterCountNumber'], - configMap['outputDir'], '../../../Unaligned_' + str(lane), configMap['sampleSheetName'], - myFileName, configMap['baseMask'], basesMask, "--no-eamss", newline])]) - -def createHiseqSampleSheet(parentDict, flowCellDict, samplesPerLaneDict, flowCellName, configMap, - logger, myoptions): - ''' - Builds up a dictionary with all entries in the Sample Sheet - ''' - sampleSheetDict = {} - laneIndexDict = {} - # the illlumina pipeline uses always one base less than the sequencer is sequencing - DEMULTIPLEX_INDEX_LENGTH_PENALTY = -1 - - logger.debug (parentDict) - logger.debug(samplesPerLaneDict) - - # Making sure the header is always a the top of the file - sampleSheetDict[u'!'] = ([configMap['hiSeqHeader']]) - endType = flowCellDict[configMap['endType']] - cycles = flowCellDict[configMap['cycles']] - - index1Name = configMap['index1Name'] - index2Name = configMap['index2Name'] - - indexRead1Length = int(flowCellDict[configMap['index1Length']]) + DEMULTIPLEX_INDEX_LENGTH_PENALTY - try: - indexRead2Length = int(flowCellDict[configMap['index2Length']]) + DEMULTIPLEX_INDEX_LENGTH_PENALTY - except: - pass - - for key in parentDict.keys(): - index = '' - dualIndex = False - lane = parentDict[key]['LANE'][-1:] - - if index1Name in parentDict[key] and indexRead1Length > 0 and (parentDict[key])[index1Name] != 'NOINDEX': - index = parentDict[key][index1Name][0:indexRead1Length] - - if index2Name in parentDict[key] and indexRead2Length > 0 and (parentDict[key])[index2Name] != 'NOINDEX': - index = index + configMap['indexSeparator'] + parentDict[key][index2Name][0:indexRead2Length] - dualIndex = True - - # little hack to make the non-indexed control lane and non-indexed runs also part of - # the sample sheet - # eventually hide in a function - - if len(index) == 0: - # more than one samples in an non-indexed lane - if samplesPerLaneDict[lane] > 1: - # if it is not a PhiX and not a Pool Sample - if (parentDict[key]['NCBI_ORGANISM_TAXONOMY'] != '10847') and parentDict[key]['BARCODE_COMPLEXITY_CHECKER'] == 'No Pool': - # then just use this sample and skip the others if there are more - samplesPerLaneDict[lane] = 0 - index = ' ' - - # only one non-indexed sample in the lane - elif samplesPerLaneDict[lane] == 1: - index = ' ' - - - # Set flag if this lane is a control lane. has no influence on the result, but makes reading - # the demultiplex statistics easier - try: - if lane == flowCellDict[configMap['controlLane']]: - control = 'Y' - else: - control = 'N' - except: - control = 'N' - - if len(index) > 0: - sampleSheetDict[lane + '_' + key] = [flowCellName + COMMA - + lane + COMMA - + key + COMMA - + parentDict[key][configMap['ncbi']] + COMMA - + index + COMMA - + sanitizeString(parentDict[key][configMap['externalSampleName']]) + COMMA - + control + COMMA - + endType + '_' + cycles + COMMA - + configMap['facilityInstitution'] + COMMA - + key.split('_', 3)[-1] - ] - - sampleEndType = 'DUALINDEX' if dualIndex else 'SINGLEINDEX' - laneIndexDict[int(lane)] = [len(index), sampleEndType] - - sortedSampleSheetList = sampleSheetDict.keys() - sortedSampleSheetList.sort() - - # if single lane demultiplexing is activated - if myoptions.singlelane: - demultiplexCommandList = [] - for lane in range(1, int(flowCellDict[configMap['laneCount']]) + 1): - laneSeparatedList = [sample for sample in sortedSampleSheetList if sample[0] == str(lane)] - # Making sure the header is also included at the top - laneSeparatedList.insert(0, u'!') - logger.debug(laneSeparatedList) - myFileName = myoptions.outdir + configMap['SampleSheetFileName'] + '_' + str(lane) + '_' + \ - flowCellName + '.csv' - - demultiplexCommandList.append(createDemultiplexCommands(myoptions, configMap, laneIndexDict, - endType, cycles, lane, myFileName, indexRead1Length, indexRead2Length)) - SamplesheetFile = writeSampleSheet(myoptions, logger, sampleSheetDict, laneSeparatedList, - fileName=myFileName) - writeDemultiplexCommandList(logger, demultiplexCommandList, - fileName=myoptions.outdir + flowCellName + '_DemultiplexCommandList.txt') - pickleDemultiplexCommandList(logger, demultiplexCommandList, - fileName=myoptions.outdir + flowCellName + '_DemultiplexCommandList.pickle') - else: - myFileName = myoptions.outdir + configMap['SampleSheetFileName'] + '_' + \ - flowCellName + '.csv' - writeSampleSheet(myoptions, logger, sampleSheetDict, sortedSampleSheetList, - fileName=myFileName) - return sampleSheetDict, myFileName - -def writeDemultiplexCommandList(logger, demultiplexCommandList, - fileName): - try: - with open(fileName, 'wb') as demuxFile: - for listElement in demultiplexCommandList: - demuxFile.write(*listElement) - - logger.info('Writing file ' + fileName) - print('Written ' + fileName) - except IOError, err: - logger.error('File error: ' + str(err)) - print ('File error: ' + str(err)) - -def pickleDemultiplexCommandList(logger, demultiplexCommandList, fileName): - import pickle - - try: - with open(fileName, 'w') as pickleDemux: - pickle.dump(demultiplexCommandList, pickleDemux) - logger.info('Writing file ' + fileName) - except IOError, err: - logger.error('File error: ' + str(err)) - print ('File error: ' + str(err)) - - - -def writeSampleSheet(myoptions, logger, sampleSheetDict, sortedSampleSheetList, fileName): - ''' - Writes the given dictionary out to a csv file. The additional list is sorted and is used to write - the dictionary in a sorted order. - ''' - newline = lineending[myoptions.lineending] - try: - with open(fileName, 'w') as sampleSheetFile: - for listElement in sortedSampleSheetList: - if myoptions.verbose: - print sampleSheetDict[listElement][0] - sampleSheetFile.write(sampleSheetDict[listElement][0] + newline) - - logger.info('Writing file ' + fileName) - except IOError, err: - logger.error('File error: ' + str(err)) - print ('File error: ' + str(err)) - -def writeMiSeqSampleSheet(sampleSheetDict, headerList, flowCellName, myoptions, logger, fileName): - ''' - Writes the given dictionary to a csv file. The order does not matter. As the header is not fixed - we first need to write the headerList in the file. This is specific to MiSeq - ''' - newline = lineending[myoptions.lineending] - try: - with open(fileName, 'wb') as sampleSheetFile: - for listElement in headerList: - if myoptions.verbose: - print listElement - sampleSheetFile.write(listElement + newline) - for sample in sampleSheetDict: - if myoptions.verbose: - print sampleSheetDict[sample][0] - sampleSheetFile.write(sampleSheetDict[sample][0] + newline) - - logger.info('Writing file ' + fileName) - - except IOError: - logger.error('File error: ' + str(err)) - print ('File error: ' + str(err)) - - return fileName - - - -def createMiSeqSampleSheet(parentDict, flowCellDict, configMap, index1Vocabulary, index2Vocabulary, - flowCellName, logger, myoptions): - ''' - ''' - sampleSheetDict = {} - headerList = [] - - separator = configMap['separator'] - - miSeqHeaderSection = configMap['miSeqHeaderSection'].split(separator) - miSeqHeaderSection.reverse() - headerList = [miSeqHeaderSection.pop().strip()] - headerList.append(miSeqHeaderSection.pop().strip() + separator + configMap['iemFileVersion']) - headerList.append(miSeqHeaderSection.pop().strip() + separator + configMap['facilityInstitution']) - headerList.append(miSeqHeaderSection.pop().strip() + separator + configMap['facilityName']) - headerList.append(miSeqHeaderSection.pop().strip() + separator + flowCellDict['Name']) - headerList.append(miSeqHeaderSection.pop().strip() + separator + datetime.now().strftime('%d.%m.%Y')) - headerList.append(miSeqHeaderSection.pop().strip() + separator + configMap['miSeqWorkflow']) - headerList.append(miSeqHeaderSection.pop().strip() + separator + configMap['miSeqApplication']) - headerList.append(miSeqHeaderSection.pop().strip() + separator + '') - headerList.append(miSeqHeaderSection.pop().strip() + separator + flowCellDict[configMap['endType']] + '_' + flowCellDict[configMap['cycles']]) - headerList.append(miSeqHeaderSection.pop().strip() + separator + configMap['miSeqChemistry']) - headerList.append('') - - miSeqReadsSection = configMap['miSeqReadsSection'].split(separator) - miSeqReadsSection.reverse() - headerList.append(miSeqReadsSection.pop()) - headerList.append(flowCellDict[configMap['cycles']]) - if (flowCellDict[configMap['endType']] == 'PAIRED_END'): - headerList.append(flowCellDict[configMap['cycles']]) - headerList.append('') - - - miSeqSettingsSection = configMap['miSeqSettingsSection'].split(separator) - miSeqSettingsSection.reverse() - headerList.append(miSeqSettingsSection.pop()) -# if ('nextera' in (separator + parentDict.itervalues().next()['KIT'].lower())): -# headerList.append(configMap['nexteraAdapter']) -# if ('truseq' in (separator + parentDict.itervalues().next()['KIT'].lower())): -# headerList.append(configMap['truSeqAdapter']) - headerList.append('') - - miSeqDataSection = configMap['miSeqDataSection'].split(',') - miSeqDataSection.reverse() - headerList.append(miSeqDataSection.pop()) - headerList.append(','.join(miSeqDataSection.pop().strip().split())) - - for key in parentDict.keys(): - lane = parentDict[key]['LANE'][-1:] - # If no index then just skip this sample - if configMap['index1Name'] not in parentDict[key]: - continue - - - index1 = parentDict[key][configMap['index1Name']] - index2 = parentDict[key][configMap['index2Name']] - - sampleSheetDict[lane + '_' + key] = [key + separator - + sanitizeString(parentDict[key][configMap['externalSampleName']]) + separator - + separator - + separator - + index1Vocabulary[index1] + separator - + index1 + separator - + index2Vocabulary[index2].split()[2] + separator - + index2 + separator - + separator - + key + '_' + flowCellName - ] - myFileName = myoptions.outdir + configMap['SampleSheetFileName'] + '_' + \ - flowCellName + '.csv' - - sampleSheetFile = writeMiSeqSampleSheet(sampleSheetDict, headerList, flowCellName, - myoptions, logger, fileName=myFileName) - return sampleSheetFile - -''' -Main script -''' -def main (): - - logger = setUpLogger('log/') - logger.info('Started Creation of Sample Sheet...') - - myoptions = parseOptions(logger) - - if myoptions.debug: - logger.setLevel(logging.DEBUG) - - flowCellName = myoptions.flowcell - configMap = readConfig(logger) - service = login(logger, configMap) - - foundFlowCell, containedSamples = getFlowCell(configMap['illuminaFlowCellTypeName'], flowCellName, - service, logger) - parentDict, samplesPerLaneDict = getContainedSampleProperties(containedSamples, service) - logger.info('Found ' + str(len(parentDict)) + ' samples on the flow cell ' + flowCellName) - - # take this variable from the FlowCellDict - - #flowCellName = foundFlowCell.getCode().split('_')[3][1:] - flowCellName = foundFlowCell.getCode() - if '-' in flowCellName: - flowCellName = flowCellName.split('_')[3] - else: - flowCellName = flowCellName.split('_')[3][1:] - - flowCellDict = convertSampleToDict(foundFlowCell) - - logger.debug(flowCellDict) - - hiseqList = configMap['hiSeqNames'].split() - miseqList = configMap['miSeqNames'].split() - - runFolderName = flowCellDict['Name'] - -# for hiseq in hiseqList: -# if hiseq in runFolderName: -# logger.info('Detected HiSeq run.') -# SampleSheetFile = createHiseqSampleSheet(parentDict, flowCellDict, samplesPerLaneDict, flowCellName, configMap, -# logger, myoptions) -# break - - sampleSheetDict, SampleSheetFile = createHiseqSampleSheet(parentDict, flowCellDict, samplesPerLaneDict, flowCellName, configMap, - logger, myoptions) - logger.debug(sampleSheetDict) -# for miseq in miseqList: -# if miseq in runFolderName: -# logger.info('Detected MiSeq run.') -# index1Vocabulary = getVocabulary(configMap['index1Name'], service) -# index2Vocabulary = getVocabulary(configMap['index2Name'], service) -# SampleSheetFile = createMiSeqSampleSheet(parentDict, flowCellDict, configMap, -# index1Vocabulary, index2Vocabulary, flowCellName, logger, myoptions) -# break - - if myoptions.maillist: - sendMail(configMap['mailList'], [SampleSheetFile], flowCellName, configMap, logger) - - logout(service, logger) - - -if __name__ == "__main__": - main() diff --git a/deep_sequencing_unit/source/Jython/createSampleSheetTest.py b/deep_sequencing_unit/source/Jython/createSampleSheetTest.py deleted file mode 100644 index 0d8b17b45553c1cc050cc49d3923d672490339b4..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/source/Jython/createSampleSheetTest.py +++ /dev/null @@ -1,186 +0,0 @@ -import unittest -from createSampleSheet import * -from optparse import OptionParser - -def setUpLogger(logPath, logLevel=logging.INFO): - logFileName = 'createSampleSheet' - d = datetime.now() - logFileName = logFileName + '_' + d.strftime('%Y-%m-%d_%H_%M_%S') + '.log' - logging.basicConfig(filename=logPath + logFileName, - format='%(asctime)s [%(levelname)s] %(message)s', level=logLevel) - logger = logging.getLogger(logFileName) - return logger - -def setUpParser(self): - '''is there a more elegant way to mock parser object, except the v3.3 - unitest.mock object library?''' - - self.parser = OptionParser() - self.parser.add_option('--verbose', dest='verbose') - self.parser.add_option('--lineending', dest='lineending') - self.parser.add_option('--maillist', dest='maillist') - self.parser.add_option('--singlelane', dest='singlelane') - self.parser.add_option('--flowcell', dest='flowcell') - self.parser.add_option('--outdir', dest='outdir') - self.parser.add_option('--debug', dest='debug') - self.parser.verbose = False - self.parser.lineending = 'linux' - self.parser.maillist = False - self.parser.singlelane = False - self.parser.flowcell = '140127_SN792_0312_AC36DWACXX' - self.parser.outdir = './' - self.parser.debug = True - return self.parser - -class TestCreateHiseqSampleSheet(unittest.TestCase): - ''' - There are three cases currently covered: - Case1: PhiX and one or more other non-barcoded samples in a lane -> only one sample in the Sample Sheet - Case2: PhiX and one ore more barcoded samples in a lane -> all samples but PhiX in the Sample Sheet - Case3: PhiX in a lane -> Phix in the Sample Sheet - - Also no Pools are allowed these are only relevant for the lab - ''' - - def setUp(self): - - self.parser = setUpParser(self) - self.logger = setUpLogger('log/') - self.configMap = {'illuminaFlowCellTypeName':'ILLUMINA_FLOW_CELL', 'facilityName':'Quantitative Genomics Facility', 'index1Length':'INDEXREAD', 'clusterCountNumber':'50000000', 'connectionTimeout':60000, 'facilityInstitution':'ETHZ_D-BSSE', 'index1Name':'BARCODE', 'configureBclToFastqPath':'/usr/local/bin/configureBclToFastq.pl', 'smptHost':'smtp0.ethz.ch', 'miSeqApplication':'FASTQ Only', 'ncbi':'NCBI_ORGANISM_TAXONOMY', 'failedReads':'--with-failed-reads', 'nexteraAdapter':'Adapter,CTGTCTCTTATACACATCT', 'cycles':'CYCLES_REQUESTED_BY_CUSTOMER', 'miSeqChemistry':'Default', 'outputDir':'--output-dir', 'openbisUserName':'tracker', 'miSeqWorkflow':'GenerateFASTQ', 'openbisPassword':"*hsh8Fs['h9#$%^&", 'index2Length':'INDEXREAD2', 'mailFrom':'SampleSheetCreator@miseq.bsse.ethz.ch', 'hiSeqHeader':'FCID,Lane,SampleID,SampleRef,Index,Description,Control,Recipe,Operator,SampleProject', 'externalSampleName':'EXTERNAL_SAMPLE_NAME', 'SampleSheetFileName':'SampleSheet', 'clusterCount':'--fastq-cluster-count', 'index2Name':'INDEX2', 'mailList':'manuel.kohler@bsse.ethz.ch', 'miSeqNames':'M00721 M00100', 'endType':'END_TYPE', 'miSeqSettingsSection':'[Settings], Adapter', 'facilityNameShort':'QGF', 'baseMask':'--use-bases-mask', 'miSeqReadsSection':'[Reads]', 'laneCount':'LANECOUNT', 'openbisServer':'http://openbis-dsu.bsse.ethz.ch:8080', 'iemFileVersion':'4', 'miSeqHeaderSection':'[Header], IEMFileVersion, Investigator Name, Project Name,Experiment Name, Date, Workflow, Application, Assay, Description, Chemistry', 'controlLane':'CONTROL_LANE', 'indexSeparator':'-', 'separator':',', 'hiSeqNames':'SN792 SN100', 'sampleSheetName':'--sample-sheet'} - - self.flowCellDict = {u'CONTROL_LANE':u'5', u'RUNNINGTIME':u'7 days, 18:25:19', u'SEQUENCER_FINISHED':u'2014-02-04 07:40:26 +0100', u'ILLUMINA_PIPELINE_VERSION':u'1.17.21.3', u'END_TYPE':u'SINGLE_READ', u'FLOW_CELL_SEQUENCED_ON':u'2014-01-27 13:15:07 +0100', u'INDEXREAD2':u'0', u'SBS_KIT':u'TruSeq SBS Kit v3', u'FLOWCELLTYPE':u'HiSeq Flow Cell v3', u'SEQUENCER':u'SN792', u'TILECOUNT':u'16', u'LANECOUNT':u'8', 'Name':u'140127_SN792_0312_AC36DWACXX', u'SEQUENCER_RUN_TIME':u'7.768', u'CYCLES_REQUESTED_BY_CUSTOMER':u'151', u'INDEXREAD':u'7', u'SWATHCOUNT':u'3', u'SURFACECOUNT':u'2', 'Project':u'2014.01'} - self.parentDict = {u'BSSE_QGF_16252_140127_SN792_0312_AC36DWACXX_2':{u'QC_AT_DBSSE':u'true', u'FRAGMENT_SIZE_PREPARED_ILLUMINA':u'402', u'UNIQUE_BARCODES':u'OK', u'UL_EB':u' 19.0', u'FLOW_CELL_PROPERTIES':u'Illumina RTA Version: 1.17.21.3\nSequencer : QGF HiSeq2000 (Rua)\nRun type: SINGLE_READ\nNumber of cycles: 151\nFLOWCELLTYPE: HiSeq Flow Cell v3\nKit : TruSeq SBS Kit v3', u'CONCENTRATION_PREPARED_ILLUMINA':u'10.1', u'CELL_PLASTICITY_SYSTEMSX':u'false', u'NCBI_ORGANISM_TAXONOMY':u'481459', u'CONCENTRATION_FLOWLANE':u'12', u'LIBRARY_PROCESSING_SUCCESSFUL':u'false', u'HOW_OFTEN_SEQUENCED':u'1', u'CYCLES':u'157', u'BAREBACKED':u'false', u'SEQUENCING_APPLICATION':u'GENOMIC_DNA_SEQ', u'CLUSTER_STATION':u'CBOT', u'END_TYPE':u'SINGLE_READ', u'BARCODE_COMPLEXITY_CHECKER':u'No Pool', u'CONTACT_PERSON_EMAIL':u'marius.roesti@unibas.ch', u'INVOICE':u'false', 'LANE':u'140127_SN792_0312_AC36DWACXX:2', u'CLUSTER_GENERATION_KIT_VERSION':u'TRUSEQ_CBOT_HS_V3', u'PREPARED_BY':u'Marius', u'LIBRARY_PROCESSING_FAILED':u'false', u'CONTACT_PERSON_NAME':u'Marius R\xf6sti', u'REQUIRED_LANES':u'1', u'NM_DNA':u' 38.65', u'CYCLES_REQUESTED_BY_CUSTOMER':u'150', u'LIBRARY_PROCESSING_POSSIBLE':u'false', u'NOTES':u'15% Phix spike-in', u'PRINCIPAL_INVESTIGATOR_NAME':u'Walter Salzburger', u'NANO_DROP':u'CONCND3300', u'AFFILIATION':u'UNIVERSITY_BASEL', u'SBS_SEQUENCING_KIT_VERSION':u'SBS_HS_V3', u'EXTERNAL_SAMPLE_NAME':u'Ga_lib_34', u'BIOLOGICAL_SAMPLE_ARRIVED':u'2013-12-06 12:00:00 +0100', u'UL_EB_MISEQ':u' 17.9', u'KIT':u'NONE', u'PRINCIPAL_INVESTIGATOR_EMAIL':u'walter.salzburger@unibas.ch', u'UL_DNA':u' 1.0', u'NUMBER_OF_ATTACHMENTS':u'0', u'SAMPLE_KIND':u'FRAGMENTED_GENOMIC_DNA', u'CS_PROTOCOL_VERSION':u'v8', u'UL_STOCK':u'20', u'UL_DNA_MISEQ':u' 2.1'}, u'BSSE_QGF_16256_140127_SN792_0312_AC36DWACXX_7':{u'QC_AT_DBSSE':u'true', u'FRAGMENT_SIZE_PREPARED_ILLUMINA':u'363', u'UNIQUE_BARCODES':u'OK', u'UL_EB':u' 19.0', u'FLOW_CELL_PROPERTIES':u'Illumina RTA Version: 1.17.21.3\nSequencer : QGF HiSeq2000 (Rua)\nRun type: SINGLE_READ\nNumber of cycles: 151\nFLOWCELLTYPE: HiSeq Flow Cell v3\nKit : TruSeq SBS Kit v3', u'CONCENTRATION_PREPARED_ILLUMINA':u'9.1', u'CELL_PLASTICITY_SYSTEMSX':u'false', u'NCBI_ORGANISM_TAXONOMY':u'481459', u'CONCENTRATION_FLOWLANE':u'12', u'LIBRARY_PROCESSING_SUCCESSFUL':u'false', u'HOW_OFTEN_SEQUENCED':u'1', u'CYCLES':u'157', u'BAREBACKED':u'false', u'SEQUENCING_APPLICATION':u'GENOMIC_DNA_SEQ', u'CLUSTER_STATION':u'CBOT', u'END_TYPE':u'SINGLE_READ', u'BARCODE_COMPLEXITY_CHECKER':u'No Pool', u'CONTACT_PERSON_EMAIL':u'marius.roesti@unibas.ch', u'INVOICE':u'false', 'LANE':u'140127_SN792_0312_AC36DWACXX:7', u'CLUSTER_GENERATION_KIT_VERSION':u'TRUSEQ_CBOT_HS_V3', u'PREPARED_BY':u'Marius', u'LIBRARY_PROCESSING_FAILED':u'false', u'CONTACT_PERSON_NAME':u'Marius R\xf6sti', u'REQUIRED_LANES':u'1', u'NM_DNA':u' 38.57', u'CYCLES_REQUESTED_BY_CUSTOMER':u'150', u'LIBRARY_PROCESSING_POSSIBLE':u'false', u'NOTES':u'15% Phix spike-in', u'PRINCIPAL_INVESTIGATOR_NAME':u'Walter Salzburger', u'NANO_DROP':u'CONCND3300', u'AFFILIATION':u'UNIVERSITY_BASEL', u'SBS_SEQUENCING_KIT_VERSION':u'SBS_HS_V3', u'EXTERNAL_SAMPLE_NAME':u'Ga_lib_38', u'BIOLOGICAL_SAMPLE_ARRIVED':u'2013-12-06 12:00:00 +0100', u'UL_EB_MISEQ':u' 17.9', u'KIT':u'NONE', u'PRINCIPAL_INVESTIGATOR_EMAIL':u'walter.salzburger@unibas.ch', u'UL_DNA':u' 1.0', u'NUMBER_OF_ATTACHMENTS':u'0', u'SAMPLE_KIND':u'FRAGMENTED_GENOMIC_DNA', u'CS_PROTOCOL_VERSION':u'v8', u'UL_STOCK':u'20', u'UL_DNA_MISEQ':u' 2.1'}, u'BSSE_QGF_19990_140127_SN792_0312_AC36DWACXX_5':{u'QC_AT_DBSSE':u'false', u'UNIQUE_BARCODES':u'OK', u'UL_EB':u'0', u'FLOW_CELL_PROPERTIES':u'Sample got sequenced more than once. Please check the flow lane properties for detailed description!', u'CELL_PLASTICITY_SYSTEMSX':u'false', u'NCBI_ORGANISM_TAXONOMY':u'481459', u'KIT_PREPARED':u'2013-12-09 12:00:00 +0100', u'LIBRARY_PROCESSING_SUCCESSFUL':u'false', u'HOW_OFTEN_SEQUENCED':u'2', u'BAREBACKED':u'false', u'SEQUENCING_APPLICATION':u'GENOMIC_DNA_SEQ', u'END_TYPE':u'SINGLE_READ', u'BARCODE_COMPLEXITY_CHECKER':u'OK', u'CONTACT_PERSON_EMAIL':u'marius.roesti@unibas.ch', u'INVOICE':u'false', 'LANE':u'140127_SN792_0312_AC36DWACXX:5', u'PREPARED_BY':u'Ina', u'LIBRARY_PROCESSING_FAILED':u'false', u'CONTACT_PERSON_NAME':u'Marius R\xf6sti', u'NM_DNA':u'0', u'LIBRARY_PROCESSING_POSSIBLE':u'false', u'PRINCIPAL_INVESTIGATOR_NAME':u'Walter Salzburger', u'NANO_DROP':u'CONCND3300', u'AFFILIATION':u'UNIVERSITY_BASEL', u'DNA_CONCENTRATION_OF_LIBRARY':u'2', u'EXTERNAL_SAMPLE_NAME':u'Pool201_293', u'BIOLOGICAL_SAMPLE_ARRIVED':u'2013-12-05 12:00:00 +0100', u'KIT':u'NEBNEXT_DNA_SAMPLE_PREP_MASTER_MIX_SET1', u'UL_EB_MISEQ':u'0', u'PRINCIPAL_INVESTIGATOR_EMAIL':u'walter.salzburger@unibas.ch', u'UL_DNA':u'0', u'NUMBER_OF_ATTACHMENTS':u'0', u'SAMPLE_KIND':u'GENOMIC_DNA', u'UL_DNA_MISEQ':u'0'}, u'BSSE_QGF_16028_140127_SN792_0312_AC36DWACXX_6':{u'QC_AT_DBSSE':u'false', u'UNIQUE_BARCODES':u'OK', u'UL_EB':u'0', u'FLOW_CELL_PROPERTIES':u'Sample got sequenced more than once. Please check the flow lane properties for detailed description!', u'CELL_PLASTICITY_SYSTEMSX':u'false', u'NCBI_ORGANISM_TAXONOMY':u'10847', u'LIBRARY_PROCESSING_SUCCESSFUL':u'false', u'HOW_OFTEN_SEQUENCED':u'24', u'BAREBACKED':u'false', u'SEQUENCING_APPLICATION':u'GENOMIC_DNA_SEQ', u'BARCODE_COMPLEXITY_CHECKER':u'No Pool', u'CONTACT_PERSON_EMAIL':u'ina.nissen@bsse.ethz.ch', u'INVOICE':u'false', 'LANE':u'140127_SN792_0312_AC36DWACXX:6', u'LOT':u'9306315', u'LIBRARY_PROCESSING_FAILED':u'false', u'CONTACT_PERSON_NAME':u'Ina Nissen', u'NM_DNA':u'0', u'LIBRARY_PROCESSING_POSSIBLE':u'false', u'PRINCIPAL_INVESTIGATOR_NAME':u'Christian Beisel', u'AFFILIATION':u'OTHER', u'EXTERNAL_SAMPLE_NAME':u'PhiX', u'KIT':u'NONE', u'UL_EB_MISEQ':u'0', u'UL_DNA':u'0', u'PRINCIPAL_INVESTIGATOR_EMAIL':u'christian.beisel@bsse.ethz.ch', u'NUMBER_OF_ATTACHMENTS':u'0', u'SAMPLE_KIND':u'GENOMIC_DNA', u'UL_DNA_MISEQ':u'0'}, u'BSSE_QGF_16253_140127_SN792_0312_AC36DWACXX_3':{u'QC_AT_DBSSE':u'true', u'FRAGMENT_SIZE_PREPARED_ILLUMINA':u'383', u'UNIQUE_BARCODES':u'OK', u'UL_EB':u' 18.5', u'FLOW_CELL_PROPERTIES':u'Illumina RTA Version: 1.17.21.3\nSequencer : QGF HiSeq2000 (Rua)\nRun type: SINGLE_READ\nNumber of cycles: 151\nFLOWCELLTYPE: HiSeq Flow Cell v3\nKit : TruSeq SBS Kit v3', u'CONCENTRATION_PREPARED_ILLUMINA':u'6.5', u'CELL_PLASTICITY_SYSTEMSX':u'false', u'NCBI_ORGANISM_TAXONOMY':u'481459', u'CONCENTRATION_FLOWLANE':u'12', u'LIBRARY_PROCESSING_SUCCESSFUL':u'false', u'HOW_OFTEN_SEQUENCED':u'1', u'CYCLES':u'157', u'BAREBACKED':u'false', u'SEQUENCING_APPLICATION':u'GENOMIC_DNA_SEQ', u'CLUSTER_STATION':u'CBOT', u'END_TYPE':u'SINGLE_READ', u'BARCODE_COMPLEXITY_CHECKER':u'No Pool', u'CONTACT_PERSON_EMAIL':u'marius.roesti@unibas.ch', u'INVOICE':u'false', 'LANE':u'140127_SN792_0312_AC36DWACXX:3', u'CLUSTER_GENERATION_KIT_VERSION':u'TRUSEQ_CBOT_HS_V3', u'PREPARED_BY':u'Marius', u'LIBRARY_PROCESSING_FAILED':u'false', u'CONTACT_PERSON_NAME':u'Marius R\xf6sti', u'REQUIRED_LANES':u'1', u'NM_DNA':u' 26.11', u'CYCLES_REQUESTED_BY_CUSTOMER':u'150', u'LIBRARY_PROCESSING_POSSIBLE':u'false', u'NOTES':u'15% Phix spike-in', u'PRINCIPAL_INVESTIGATOR_NAME':u'Walter Salzburger', u'NANO_DROP':u'CONCND3300', u'AFFILIATION':u'UNIVERSITY_BASEL', u'SBS_SEQUENCING_KIT_VERSION':u'SBS_HS_V3', u'EXTERNAL_SAMPLE_NAME':u'Ga_lib_35', u'BIOLOGICAL_SAMPLE_ARRIVED':u'2013-12-06 12:00:00 +0100', u'UL_EB_MISEQ':u' 16.9', u'KIT':u'NONE', u'PRINCIPAL_INVESTIGATOR_EMAIL':u'walter.salzburger@unibas.ch', u'UL_DNA':u' 1.5', u'NUMBER_OF_ATTACHMENTS':u'0', u'SAMPLE_KIND':u'FRAGMENTED_GENOMIC_DNA', u'CS_PROTOCOL_VERSION':u'v8', u'UL_STOCK':u'20', u'UL_DNA_MISEQ':u' 3.1'}, u'BSSE_QGF_16254_140127_SN792_0312_AC36DWACXX_4':{u'QC_AT_DBSSE':u'true', u'FRAGMENT_SIZE_PREPARED_ILLUMINA':u'385', u'UNIQUE_BARCODES':u'OK', u'UL_EB':u' 19.0', u'FLOW_CELL_PROPERTIES':u'Illumina RTA Version: 1.17.21.3\nSequencer : QGF HiSeq2000 (Rua)\nRun type: SINGLE_READ\nNumber of cycles: 151\nFLOWCELLTYPE: HiSeq Flow Cell v3\nKit : TruSeq SBS Kit v3', u'CONCENTRATION_PREPARED_ILLUMINA':u'9.9', u'CELL_PLASTICITY_SYSTEMSX':u'false', u'NCBI_ORGANISM_TAXONOMY':u'481459', u'CONCENTRATION_FLOWLANE':u'12', u'LIBRARY_PROCESSING_SUCCESSFUL':u'false', u'HOW_OFTEN_SEQUENCED':u'1', u'CYCLES':u'157', u'BAREBACKED':u'false', u'SEQUENCING_APPLICATION':u'GENOMIC_DNA_SEQ', u'CLUSTER_STATION':u'CBOT', u'END_TYPE':u'SINGLE_READ', u'BARCODE_COMPLEXITY_CHECKER':u'No Pool', u'CONTACT_PERSON_EMAIL':u'marius.roesti@unibas.ch', u'INVOICE':u'false', 'LANE':u'140127_SN792_0312_AC36DWACXX:4', u'CLUSTER_GENERATION_KIT_VERSION':u'TRUSEQ_CBOT_HS_V3', u'PREPARED_BY':u'Marius', u'LIBRARY_PROCESSING_FAILED':u'false', u'CONTACT_PERSON_NAME':u'Marius R\xf6sti', u'REQUIRED_LANES':u'1', u'NM_DNA':u' 39.56', u'CYCLES_REQUESTED_BY_CUSTOMER':u'150', u'LIBRARY_PROCESSING_POSSIBLE':u'false', u'NOTES':u'15% Phix spike-in', u'PRINCIPAL_INVESTIGATOR_NAME':u'Walter Salzburger', u'NANO_DROP':u'CONCND3300', u'AFFILIATION':u'UNIVERSITY_BASEL', u'SBS_SEQUENCING_KIT_VERSION':u'SBS_HS_V3', u'EXTERNAL_SAMPLE_NAME':u'Ga_lib_36', u'BIOLOGICAL_SAMPLE_ARRIVED':u'2013-12-06 12:00:00 +0100', u'UL_EB_MISEQ':u' 18.0', u'KIT':u'NONE', u'PRINCIPAL_INVESTIGATOR_EMAIL':u'walter.salzburger@unibas.ch', u'UL_DNA':u' 1.0', u'NUMBER_OF_ATTACHMENTS':u'0', u'SAMPLE_KIND':u'FRAGMENTED_GENOMIC_DNA', u'CS_PROTOCOL_VERSION':u'v8', u'UL_STOCK':u'20', u'UL_DNA_MISEQ':u' 2.0'}, u'BSSE_QGF_19989_140127_SN792_0312_AC36DWACXX_5':{u'QC_AT_DBSSE':u'false', u'FRAGMENT_SIZE_PREPARED_ILLUMINA':u'581', u'UNIQUE_BARCODES':u'OK', u'UL_EB':u' 48.4', u'FLOW_CELL_PROPERTIES':u'Sample got sequenced more than once. Please check the flow lane properties for detailed description!', u'CONCENTRATION_PREPARED_ILLUMINA':u'23.4', u'STARTING_AMOUNT_OF_SAMPLE_IN_NG':u'2000', u'CELL_PLASTICITY_SYSTEMSX':u'false', u'NCBI_ORGANISM_TAXONOMY':u'481459', u'KIT_PREPARED':u'2013-12-09 12:00:00 +0100', u'LIBRARY_PROCESSING_SUCCESSFUL':u'false', u'HOW_OFTEN_SEQUENCED':u'2', u'BAREBACKED':u'false', u'SEQUENCING_APPLICATION':u'GENOMIC_DNA_SEQ', u'END_TYPE':u'SINGLE_READ', u'BARCODE':u'GTGAAAC', u'BARCODE_COMPLEXITY_CHECKER':u'No Pool', u'CONTACT_PERSON_EMAIL':u'marius.roesti@unibas.ch', u'INVOICE':u'false', 'LANE':u'140127_SN792_0312_AC36DWACXX:5', u'PREPARED_BY':u'Ina', u'LIBRARY_PROCESSING_FAILED':u'false', u'CONTACT_PERSON_NAME':u'Marius R\xf6sti', u'NM_DNA':u' 61.96', u'CONCENTRATION_ORIGINAL_ILLUMINA':u'38.3', u'LIBRARY_PROCESSING_POSSIBLE':u'false', u'PRINCIPAL_INVESTIGATOR_NAME':u'Walter Salzburger', u'NANO_DROP':u'CONCND3300', u'AFFILIATION':u'UNIVERSITY_BASEL', u'EXTERNAL_SAMPLE_NAME':u'293', u'BIOLOGICAL_SAMPLE_ARRIVED':u'2013-12-05 12:00:00 +0100', u'UL_EB_MISEQ':u' 46.8', u'KIT':u'NEBNEXT_DNA_SAMPLE_PREP_MASTER_MIX_SET1', u'PRINCIPAL_INVESTIGATOR_EMAIL':u'walter.salzburger@unibas.ch', u'UL_DNA':u' 1.6', u'NUMBER_OF_ATTACHMENTS':u'0', u'SAMPLE_KIND':u'GENOMIC_DNA', u'UL_STOCK':u'50', u'UL_DNA_MISEQ':u' 3.2'}, u'BSSE_QGF_16028_140127_SN792_0312_AC36DWACXX_7':{u'QC_AT_DBSSE':u'false', u'UNIQUE_BARCODES':u'OK', u'UL_EB':u'0', u'FLOW_CELL_PROPERTIES':u'Sample got sequenced more than once. Please check the flow lane properties for detailed description!', u'CELL_PLASTICITY_SYSTEMSX':u'false', u'NCBI_ORGANISM_TAXONOMY':u'10847', u'LIBRARY_PROCESSING_SUCCESSFUL':u'false', u'HOW_OFTEN_SEQUENCED':u'24', u'BAREBACKED':u'false', u'SEQUENCING_APPLICATION':u'GENOMIC_DNA_SEQ', u'BARCODE_COMPLEXITY_CHECKER':u'No Pool', u'CONTACT_PERSON_EMAIL':u'ina.nissen@bsse.ethz.ch', u'INVOICE':u'false', 'LANE':u'140127_SN792_0312_AC36DWACXX:7', u'LOT':u'9306315', u'LIBRARY_PROCESSING_FAILED':u'false', u'CONTACT_PERSON_NAME':u'Ina Nissen', u'NM_DNA':u'0', u'LIBRARY_PROCESSING_POSSIBLE':u'false', u'PRINCIPAL_INVESTIGATOR_NAME':u'Christian Beisel', u'AFFILIATION':u'OTHER', u'EXTERNAL_SAMPLE_NAME':u'PhiX', u'KIT':u'NONE', u'UL_EB_MISEQ':u'0', u'UL_DNA':u'0', u'PRINCIPAL_INVESTIGATOR_EMAIL':u'christian.beisel@bsse.ethz.ch', u'NUMBER_OF_ATTACHMENTS':u'0', u'SAMPLE_KIND':u'GENOMIC_DNA', u'UL_DNA_MISEQ':u'0'}, u'BSSE_QGF_16028_140127_SN792_0312_AC36DWACXX_8':{u'QC_AT_DBSSE':u'false', u'UNIQUE_BARCODES':u'OK', u'UL_EB':u'0', u'FLOW_CELL_PROPERTIES':u'Sample got sequenced more than once. Please check the flow lane properties for detailed description!', u'CELL_PLASTICITY_SYSTEMSX':u'false', u'NCBI_ORGANISM_TAXONOMY':u'10847', u'LIBRARY_PROCESSING_SUCCESSFUL':u'false', u'HOW_OFTEN_SEQUENCED':u'24', u'BAREBACKED':u'false', u'SEQUENCING_APPLICATION':u'GENOMIC_DNA_SEQ', u'BARCODE_COMPLEXITY_CHECKER':u'No Pool', u'CONTACT_PERSON_EMAIL':u'ina.nissen@bsse.ethz.ch', u'INVOICE':u'false', 'LANE':u'140127_SN792_0312_AC36DWACXX:8', u'LOT':u'9306315', u'LIBRARY_PROCESSING_FAILED':u'false', u'CONTACT_PERSON_NAME':u'Ina Nissen', u'NM_DNA':u'0', u'LIBRARY_PROCESSING_POSSIBLE':u'false', u'PRINCIPAL_INVESTIGATOR_NAME':u'Christian Beisel', u'AFFILIATION':u'OTHER', u'EXTERNAL_SAMPLE_NAME':u'PhiX', u'KIT':u'NONE', u'UL_EB_MISEQ':u'0', u'UL_DNA':u'0', u'PRINCIPAL_INVESTIGATOR_EMAIL':u'christian.beisel@bsse.ethz.ch', u'NUMBER_OF_ATTACHMENTS':u'0', u'SAMPLE_KIND':u'GENOMIC_DNA', u'UL_DNA_MISEQ':u'0'}, u'BSSE_QGF_16028_140127_SN792_0312_AC36DWACXX_2':{u'QC_AT_DBSSE':u'false', u'UNIQUE_BARCODES':u'OK', u'UL_EB':u'0', u'FLOW_CELL_PROPERTIES':u'Sample got sequenced more than once. Please check the flow lane properties for detailed description!', u'CELL_PLASTICITY_SYSTEMSX':u'false', u'NCBI_ORGANISM_TAXONOMY':u'10847', u'LIBRARY_PROCESSING_SUCCESSFUL':u'false', u'HOW_OFTEN_SEQUENCED':u'24', u'BAREBACKED':u'false', u'SEQUENCING_APPLICATION':u'GENOMIC_DNA_SEQ', u'BARCODE_COMPLEXITY_CHECKER':u'No Pool', u'CONTACT_PERSON_EMAIL':u'ina.nissen@bsse.ethz.ch', u'INVOICE':u'false', 'LANE':u'140127_SN792_0312_AC36DWACXX:2', u'LOT':u'9306315', u'LIBRARY_PROCESSING_FAILED':u'false', u'CONTACT_PERSON_NAME':u'Ina Nissen', u'NM_DNA':u'0', u'LIBRARY_PROCESSING_POSSIBLE':u'false', u'PRINCIPAL_INVESTIGATOR_NAME':u'Christian Beisel', u'AFFILIATION':u'OTHER', u'EXTERNAL_SAMPLE_NAME':u'PhiX', u'KIT':u'NONE', u'UL_EB_MISEQ':u'0', u'UL_DNA':u'0', u'PRINCIPAL_INVESTIGATOR_EMAIL':u'christian.beisel@bsse.ethz.ch', u'NUMBER_OF_ATTACHMENTS':u'0', u'SAMPLE_KIND':u'GENOMIC_DNA', u'UL_DNA_MISEQ':u'0'}, u'BSSE_QGF_16251_140127_SN792_0312_AC36DWACXX_1':{u'QC_AT_DBSSE':u'true', u'FRAGMENT_SIZE_PREPARED_ILLUMINA':u'375', u'UNIQUE_BARCODES':u'OK', u'UL_EB':u' 19.0', u'FLOW_CELL_PROPERTIES':u'Sample got sequenced more than once. Please check the flow lane properties for detailed description!', u'CONCENTRATION_PREPARED_ILLUMINA':u'9.5', u'CELL_PLASTICITY_SYSTEMSX':u'false', u'NCBI_ORGANISM_TAXONOMY':u'481459', u'CONCENTRATION_FLOWLANE':u'12', u'LIBRARY_PROCESSING_SUCCESSFUL':u'false', u'HOW_OFTEN_SEQUENCED':u'3', u'CYCLES':u'157', u'BAREBACKED':u'false', u'SEQUENCING_APPLICATION':u'GENOMIC_DNA_SEQ', u'CLUSTER_STATION':u'CBOT', u'END_TYPE':u'SINGLE_READ', u'BARCODE_COMPLEXITY_CHECKER':u'No Pool', u'CREATED_ON_CS':u'2014-01-08 12:00:00 +0100', u'CONTACT_PERSON_EMAIL':u'marius.roesti@unibas.ch', u'INVOICE':u'false', 'LANE':u'140127_SN792_0312_AC36DWACXX:1', u'CLUSTER_GENERATION_KIT_VERSION':u'TRUSEQ_CBOT_HS_V3', u'PREPARED_BY':u'Marius', u'LIBRARY_PROCESSING_FAILED':u'false', u'CONTACT_PERSON_NAME':u'Marius R\xf6sti', u'REQUIRED_LANES':u'1', u'NM_DNA':u' 38.97', u'CYCLES_REQUESTED_BY_CUSTOMER':u'150', u'LIBRARY_PROCESSING_POSSIBLE':u'false', u'NOTES':u'15% Phix spike-in, this pool as test on SR50 first', u'PRINCIPAL_INVESTIGATOR_NAME':u'Walter Salzburger', u'NANO_DROP':u'CONCND3300', u'AFFILIATION':u'UNIVERSITY_BASEL', u'SBS_SEQUENCING_KIT_VERSION':u'SBS_HS_V3', u'EXTERNAL_SAMPLE_NAME':u'Ga_lib_33', u'BIOLOGICAL_SAMPLE_ARRIVED':u'2013-12-06 12:00:00 +0100', u'UL_EB_MISEQ':u' 17.9', u'KIT':u'NONE', u'PRINCIPAL_INVESTIGATOR_EMAIL':u'walter.salzburger@unibas.ch', u'UL_DNA':u' 1.0', u'NUMBER_OF_ATTACHMENTS':u'1', u'SAMPLE_KIND':u'FRAGMENTED_GENOMIC_DNA', u'CS_PROTOCOL_VERSION':u'v8', u'UL_STOCK':u'20', u'UL_DNA_MISEQ':u' 2.1'}, u'BSSE_QGF_19988_140127_SN792_0312_AC36DWACXX_5':{u'QC_AT_DBSSE':u'false', u'FRAGMENT_SIZE_PREPARED_ILLUMINA':u'564', u'UNIQUE_BARCODES':u'OK', u'UL_EB':u' 48.9', u'FLOW_CELL_PROPERTIES':u'Sample got sequenced more than once. Please check the flow lane properties for detailed description!', u'CONCENTRATION_PREPARED_ILLUMINA':u'33.3', u'STARTING_AMOUNT_OF_SAMPLE_IN_NG':u'2000', u'CELL_PLASTICITY_SYSTEMSX':u'false', u'NCBI_ORGANISM_TAXONOMY':u'481459', u'KIT_PREPARED':u'2013-12-09 12:00:00 +0100', u'LIBRARY_PROCESSING_SUCCESSFUL':u'false', u'HOW_OFTEN_SEQUENCED':u'2', u'BAREBACKED':u'false', u'SEQUENCING_APPLICATION':u'GENOMIC_DNA_SEQ', u'END_TYPE':u'SINGLE_READ', u'BARCODE':u'ACAGTGA', u'BARCODE_COMPLEXITY_CHECKER':u'No Pool', u'CONTACT_PERSON_EMAIL':u'marius.roesti@unibas.ch', u'INVOICE':u'false', 'LANE':u'140127_SN792_0312_AC36DWACXX:5', u'PREPARED_BY':u'Ina', u'LIBRARY_PROCESSING_FAILED':u'false', u'CONTACT_PERSON_NAME':u'Marius R\xf6sti', u'NM_DNA':u' 90.83', u'CONCENTRATION_ORIGINAL_ILLUMINA':u'58.2', u'LIBRARY_PROCESSING_POSSIBLE':u'false', u'PRINCIPAL_INVESTIGATOR_NAME':u'Walter Salzburger', u'NANO_DROP':u'CONCND3300', u'AFFILIATION':u'UNIVERSITY_BASEL', u'EXTERNAL_SAMPLE_NAME':u'201', u'BIOLOGICAL_SAMPLE_ARRIVED':u'2013-12-05 12:00:00 +0100', u'UL_EB_MISEQ':u' 47.8', u'KIT':u'NEBNEXT_DNA_SAMPLE_PREP_MASTER_MIX_SET1', u'PRINCIPAL_INVESTIGATOR_EMAIL':u'walter.salzburger@unibas.ch', u'UL_DNA':u' 1.1', u'NUMBER_OF_ATTACHMENTS':u'1', u'SAMPLE_KIND':u'GENOMIC_DNA', u'UL_STOCK':u'50', u'UL_DNA_MISEQ':u' 2.2'}, u'BSSE_QGF_16028_140127_SN792_0312_AC36DWACXX_3':{u'QC_AT_DBSSE':u'false', u'UNIQUE_BARCODES':u'OK', u'UL_EB':u'0', u'FLOW_CELL_PROPERTIES':u'Sample got sequenced more than once. Please check the flow lane properties for detailed description!', u'CELL_PLASTICITY_SYSTEMSX':u'false', u'NCBI_ORGANISM_TAXONOMY':u'10847', u'LIBRARY_PROCESSING_SUCCESSFUL':u'false', u'HOW_OFTEN_SEQUENCED':u'24', u'BAREBACKED':u'false', u'SEQUENCING_APPLICATION':u'GENOMIC_DNA_SEQ', u'BARCODE_COMPLEXITY_CHECKER':u'No Pool', u'CONTACT_PERSON_EMAIL':u'ina.nissen@bsse.ethz.ch', u'INVOICE':u'false', 'LANE':u'140127_SN792_0312_AC36DWACXX:3', u'LOT':u'9306315', u'LIBRARY_PROCESSING_FAILED':u'false', u'CONTACT_PERSON_NAME':u'Ina Nissen', u'NM_DNA':u'0', u'LIBRARY_PROCESSING_POSSIBLE':u'false', u'PRINCIPAL_INVESTIGATOR_NAME':u'Christian Beisel', u'AFFILIATION':u'OTHER', u'EXTERNAL_SAMPLE_NAME':u'PhiX', u'KIT':u'NONE', u'UL_EB_MISEQ':u'0', u'UL_DNA':u'0', u'PRINCIPAL_INVESTIGATOR_EMAIL':u'christian.beisel@bsse.ethz.ch', u'NUMBER_OF_ATTACHMENTS':u'0', u'SAMPLE_KIND':u'GENOMIC_DNA', u'UL_DNA_MISEQ':u'0'}, u'BSSE_QGF_16255_140127_SN792_0312_AC36DWACXX_6':{u'QC_AT_DBSSE':u'true', u'FRAGMENT_SIZE_PREPARED_ILLUMINA':u'373', u'UNIQUE_BARCODES':u'OK', u'UL_EB':u' 19.2', u'FLOW_CELL_PROPERTIES':u'Illumina RTA Version: 1.17.21.3\nSequencer : QGF HiSeq2000 (Rua)\nRun type: SINGLE_READ\nNumber of cycles: 151\nFLOWCELLTYPE: HiSeq Flow Cell v3\nKit : TruSeq SBS Kit v3', u'CONCENTRATION_PREPARED_ILLUMINA':u'12.2', u'CELL_PLASTICITY_SYSTEMSX':u'false', u'NCBI_ORGANISM_TAXONOMY':u'481459', u'CONCENTRATION_FLOWLANE':u'12', u'LIBRARY_PROCESSING_SUCCESSFUL':u'false', u'HOW_OFTEN_SEQUENCED':u'1', u'CYCLES':u'157', u'BAREBACKED':u'false', u'SEQUENCING_APPLICATION':u'GENOMIC_DNA_SEQ', u'CLUSTER_STATION':u'CBOT', u'END_TYPE':u'SINGLE_READ', u'BARCODE_COMPLEXITY_CHECKER':u'No Pool', u'CONTACT_PERSON_EMAIL':u'marius.roesti@unibas.ch', u'INVOICE':u'false', 'LANE':u'140127_SN792_0312_AC36DWACXX:6', u'CLUSTER_GENERATION_KIT_VERSION':u'TRUSEQ_CBOT_HS_V3', u'PREPARED_BY':u'Marius', u'LIBRARY_PROCESSING_FAILED':u'false', u'CONTACT_PERSON_NAME':u'Marius R\xf6sti', u'REQUIRED_LANES':u'1', u'NM_DNA':u' 50.32', u'CYCLES_REQUESTED_BY_CUSTOMER':u'150', u'LIBRARY_PROCESSING_POSSIBLE':u'false', u'NOTES':u'15% Phix spike-in', u'PRINCIPAL_INVESTIGATOR_NAME':u'Walter Salzburger', u'NANO_DROP':u'CONCND3300', u'AFFILIATION':u'UNIVERSITY_BASEL', u'SBS_SEQUENCING_KIT_VERSION':u'SBS_HS_V3', u'EXTERNAL_SAMPLE_NAME':u'Ga_lib_37', u'BIOLOGICAL_SAMPLE_ARRIVED':u'2013-12-06 12:00:00 +0100', u'KIT':u'NONE', u'UL_EB_MISEQ':u' 18.4', u'PRINCIPAL_INVESTIGATOR_EMAIL':u'walter.salzburger@unibas.ch', u'UL_DNA':u' 0.8', u'NUMBER_OF_ATTACHMENTS':u'0', u'SAMPLE_KIND':u'FRAGMENTED_GENOMIC_DNA', u'CS_PROTOCOL_VERSION':u'v8', u'UL_STOCK':u'20', u'UL_DNA_MISEQ':u' 1.6'}, u'BSSE_QGF_16028_140127_SN792_0312_AC36DWACXX_4':{u'QC_AT_DBSSE':u'false', u'UNIQUE_BARCODES':u'OK', u'UL_EB':u'0', u'FLOW_CELL_PROPERTIES':u'Sample got sequenced more than once. Please check the flow lane properties for detailed description!', u'CELL_PLASTICITY_SYSTEMSX':u'false', u'NCBI_ORGANISM_TAXONOMY':u'10847', u'LIBRARY_PROCESSING_SUCCESSFUL':u'false', u'HOW_OFTEN_SEQUENCED':u'24', u'BAREBACKED':u'false', u'SEQUENCING_APPLICATION':u'GENOMIC_DNA_SEQ', u'BARCODE_COMPLEXITY_CHECKER':u'No Pool', u'CONTACT_PERSON_EMAIL':u'ina.nissen@bsse.ethz.ch', u'INVOICE':u'false', 'LANE':u'140127_SN792_0312_AC36DWACXX:4', u'LOT':u'9306315', u'LIBRARY_PROCESSING_FAILED':u'false', u'CONTACT_PERSON_NAME':u'Ina Nissen', u'NM_DNA':u'0', u'LIBRARY_PROCESSING_POSSIBLE':u'false', u'PRINCIPAL_INVESTIGATOR_NAME':u'Christian Beisel', u'AFFILIATION':u'OTHER', u'EXTERNAL_SAMPLE_NAME':u'PhiX', u'KIT':u'NONE', u'UL_EB_MISEQ':u'0', u'UL_DNA':u'0', u'PRINCIPAL_INVESTIGATOR_EMAIL':u'christian.beisel@bsse.ethz.ch', u'NUMBER_OF_ATTACHMENTS':u'0', u'SAMPLE_KIND':u'GENOMIC_DNA', u'UL_DNA_MISEQ':u'0'}, u'BSSE_QGF_16028_140127_SN792_0312_AC36DWACXX_1':{u'QC_AT_DBSSE':u'false', u'UNIQUE_BARCODES':u'OK', u'UL_EB':u'0', u'FLOW_CELL_PROPERTIES':u'Sample got sequenced more than once. Please check the flow lane properties for detailed description!', u'CELL_PLASTICITY_SYSTEMSX':u'false', u'NCBI_ORGANISM_TAXONOMY':u'10847', u'LIBRARY_PROCESSING_SUCCESSFUL':u'false', u'HOW_OFTEN_SEQUENCED':u'24', u'BAREBACKED':u'false', u'SEQUENCING_APPLICATION':u'GENOMIC_DNA_SEQ', u'BARCODE_COMPLEXITY_CHECKER':u'No Pool', u'CONTACT_PERSON_EMAIL':u'ina.nissen@bsse.ethz.ch', u'INVOICE':u'false', 'LANE':u'140127_SN792_0312_AC36DWACXX:1', u'LOT':u'9306315', u'LIBRARY_PROCESSING_FAILED':u'false', u'CONTACT_PERSON_NAME':u'Ina Nissen', u'NM_DNA':u'0', u'LIBRARY_PROCESSING_POSSIBLE':u'false', u'PRINCIPAL_INVESTIGATOR_NAME':u'Christian Beisel', u'AFFILIATION':u'OTHER', u'EXTERNAL_SAMPLE_NAME':u'PhiX', u'KIT':u'NONE', u'UL_EB_MISEQ':u'0', u'UL_DNA':u'0', u'PRINCIPAL_INVESTIGATOR_EMAIL':u'christian.beisel@bsse.ethz.ch', u'NUMBER_OF_ATTACHMENTS':u'0', u'SAMPLE_KIND':u'GENOMIC_DNA', u'UL_DNA_MISEQ':u'0'}, u'BSSE_QGF_16257_140127_SN792_0312_AC36DWACXX_8':{u'QC_AT_DBSSE':u'true', u'FRAGMENT_SIZE_PREPARED_ILLUMINA':u'361', u'UNIQUE_BARCODES':u'OK', u'UL_EB':u' 19.0', u'FLOW_CELL_PROPERTIES':u'Illumina RTA Version: 1.17.21.3\nSequencer : QGF HiSeq2000 (Rua)\nRun type: SINGLE_READ\nNumber of cycles: 151\nFLOWCELLTYPE: HiSeq Flow Cell v3\nKit : TruSeq SBS Kit v3', u'CONCENTRATION_PREPARED_ILLUMINA':u'9.6', u'CELL_PLASTICITY_SYSTEMSX':u'false', u'NCBI_ORGANISM_TAXONOMY':u'481459', u'CONCENTRATION_FLOWLANE':u'12', u'LIBRARY_PROCESSING_SUCCESSFUL':u'false', u'HOW_OFTEN_SEQUENCED':u'1', u'CYCLES':u'157', u'BAREBACKED':u'false', u'SEQUENCING_APPLICATION':u'GENOMIC_DNA_SEQ', u'CLUSTER_STATION':u'CBOT', u'END_TYPE':u'SINGLE_READ', u'BARCODE_COMPLEXITY_CHECKER':u'No Pool', u'CONTACT_PERSON_EMAIL':u'marius.roesti@unibas.ch', u'INVOICE':u'false', 'LANE':u'140127_SN792_0312_AC36DWACXX:8', u'CLUSTER_GENERATION_KIT_VERSION':u'TRUSEQ_CBOT_HS_V3', u'PREPARED_BY':u'Marius', u'LIBRARY_PROCESSING_FAILED':u'false', u'CONTACT_PERSON_NAME':u'Marius R\xf6sti', u'REQUIRED_LANES':u'1', u'NM_DNA':u' 40.91', u'CYCLES_REQUESTED_BY_CUSTOMER':u'150', u'LIBRARY_PROCESSING_POSSIBLE':u'false', u'NOTES':u'10-15% Phix spike-in', u'PRINCIPAL_INVESTIGATOR_NAME':u'Walter Salzburger', u'NANO_DROP':u'CONCND3300', u'AFFILIATION':u'UNIVERSITY_BASEL', u'SBS_SEQUENCING_KIT_VERSION':u'SBS_HS_V3', u'EXTERNAL_SAMPLE_NAME':u'Ga_lib_39', u'BIOLOGICAL_SAMPLE_ARRIVED':u'2013-12-06 12:00:00 +0100', u'KIT':u'NONE', u'UL_EB_MISEQ':u' 18.0', u'PRINCIPAL_INVESTIGATOR_EMAIL':u'walter.salzburger@unibas.ch', u'UL_DNA':u' 1.0', u'NUMBER_OF_ATTACHMENTS':u'1', u'SAMPLE_KIND':u'FRAGMENTED_GENOMIC_DNA', u'CS_PROTOCOL_VERSION':u'v8', u'UL_STOCK':u'20', u'UL_DNA_MISEQ':u' 2.0'}} - self.samplesPerLaneDict = {u'8':2, u'1':2, u'7':2, u'5':3, u'2':2, u'6':2, u'3':2, u'4':2} - self.flowCellName = 'C36DWACXX' - - self.flowCellDict2 = {u'RUNNINGTIME': u'1 day, 16:14:28', u'SEQUENCER_FINISHED': u'2014-02-21 06:23:44 +0100', u'ILLUMINA_PIPELINE_VERSION': u'1.18.42', u'END_TYPE': u'PAIRED_END', u'FLOW_CELL_SEQUENCED_ON': u'2014-02-19 14:09:16 +0100', u'INDEXREAD2': u'8', u'SBS_KIT': u'MS2048060-500V2', u'SEQUENCER': u'M01761', u'TILECOUNT': u'14', u'LANECOUNT': u'1', 'Name': u'140219_M01761_0057_000000000-A825W', u'SEQUENCER_RUN_TIME': u'1.677', u'CYCLES_REQUESTED_BY_CUSTOMER': u'251', u'INDEXREAD': u'8', u'SWATHCOUNT': u'1', u'SURFACECOUNT': u'2', 'Project': u'2014.02'} - self.parentDict2 = {u'BSSE_QGF_20267_140219_M01761_0057_000000000_A825W_1': {u'QC_AT_DBSSE': u'false', u'UNIQUE_BARCODES': u'OK', u'UL_EB': u'0', u'FLOW_CELL_PROPERTIES': u'Illumina RTA Version: 1.18.42\nSequencer : QGF MiSeq (Yoda)\nRun type: PAIRED_END\nNumber of cycles: 251\n\nKit : MS2048060-500V2', u'CELL_PLASTICITY_SYSTEMSX': u'false', u'NCBI_ORGANISM_TAXONOMY': u'1773', u'LIBRARY_PROCESSING_SUCCESSFUL': u'false', u'HOW_OFTEN_SEQUENCED': u'1', u'BAREBACKED': u'false', u'SEQUENCING_APPLICATION': u'GENOMIC_DNA_SEQ', u'BARCODE_COMPLEXITY_CHECKER': u'OK', u'CONTACT_PERSON_EMAIL': u'Julia.Feldmann@unibas.ch', u'INVOICE': u'false', 'LANE': u'140219_M01761_0057_000000000-A825W:1', u'LIBRARY_PROCESSING_FAILED': u'false', u'CONTACT_PERSON_NAME': u'Julia Feldmann', u'NM_DNA': u'0', u'LIBRARY_PROCESSING_POSSIBLE': u'false', u'PRINCIPAL_INVESTIGATOR_NAME': u'Sebastien Gagneux', u'AFFILIATION': u'UNIVERSITY_BASEL', u'EXTERNAL_SAMPLE_NAME': u'PAL MiSeq 22', u'BIOLOGICAL_SAMPLE_ARRIVED': u'2014-02-14 12:00:00 +0100', u'UL_EB_MISEQ': u'0', u'UL_DNA': u'0', u'PRINCIPAL_INVESTIGATOR_EMAIL': u'Sebastien.Gagneux@unibas.ch', u'NUMBER_OF_ATTACHMENTS': u'0', u'SAMPLE_KIND': u'GENOMIC_DNA', u'UL_DNA_MISEQ': u'0'}, u'BSSE_QGF_14958_140219_M01761_0057_000000000_A825W_1': {u'QC_AT_DBSSE': u'false', u'UNIQUE_BARCODES': u'OK', u'UL_EB': u'0', u'FLOW_CELL_PROPERTIES': u'Sample got sequenced more than once. Please check the flow lane properties for detailed description!', u'CELL_PLASTICITY_SYSTEMSX': u'false', u'NCBI_ORGANISM_TAXONOMY': u'10847', u'LIBRARY_PROCESSING_SUCCESSFUL': u'false', u'HOW_OFTEN_SEQUENCED': u'32', u'BAREBACKED': u'false', u'SEQUENCING_APPLICATION': u'GENOMIC_DNA_SEQ', u'BARCODE_COMPLEXITY_CHECKER': u'No Pool', u'CONTACT_PERSON_EMAIL': u'ina.nissen@bsse.ethz.ch', u'INVOICE': u'false', 'LANE': u'140219_M01761_0057_000000000-A825W:1', u'LIBRARY_PROCESSING_FAILED': u'false', u'CONTACT_PERSON_NAME': u'Ina Nissen', u'NM_DNA': u'0', u'LIBRARY_PROCESSING_POSSIBLE': u'false', u'PRINCIPAL_INVESTIGATOR_NAME': u'Christian Beisel', u'AFFILIATION': u'BSSE', u'EXTERNAL_SAMPLE_NAME': u'PhiX', u'UL_EB_MISEQ': u'0', u'KIT': u'NONE', u'UL_DNA': u'0', u'PRINCIPAL_INVESTIGATOR_EMAIL': u'christian.beisel@bsse.ethz.ch', u'NUMBER_OF_ATTACHMENTS': u'0', u'SAMPLE_KIND': u'GENOMIC_DNA', u'UL_DNA_MISEQ': u'0'}, u'BSSE_QGF_20261_140219_M01761_0057_000000000_A825W_1': {u'HOW_OFTEN_SEQUENCED': u'1', u'INDEX2': u'TATCCTCT', u'UNIQUE_BARCODES': u'OK', u'UL_EB': u'0', u'FLOW_CELL_PROPERTIES': u'Illumina RTA Version: 1.18.42\nSequencer : QGF MiSeq (Yoda)\nRun type: PAIRED_END\nNumber of cycles: 251\n\nKit : MS2048060-500V2', u'SEQUENCING_APPLICATION': u'GENOMIC_DNA_SEQ', u'BARCODE': u'CTCTCTAC', u'BARCODE_COMPLEXITY_CHECKER': u'No Pool', u'CONTACT_PERSON_EMAIL': u'Julia.Feldmann@unibas.ch', u'INVOICE': u'false', 'LANE': u'140219_M01761_0057_000000000-A825W:1', u'NCBI_ORGANISM_TAXONOMY': u'1773', u'EXTERNAL_SAMPLE_NAME': u'G01665', u'CONTACT_PERSON_NAME': u'Julia Feldmann', u'UL_EB_MISEQ': u'0', u'NM_DNA': u'0', u'PRINCIPAL_INVESTIGATOR_EMAIL': u'Sebastien.Gagneux@unibas.ch', u'UL_DNA': u'0', u'NUMBER_OF_ATTACHMENTS': u'0', u'PRINCIPAL_INVESTIGATOR_NAME': u'Sebastien Gagneux', u'SAMPLE_KIND': u'GENOMIC_DNA', u'AFFILIATION': u'UNIVERSITY_BASEL', u'UL_DNA_MISEQ': u'0'}, u'BSSE_QGF_20260_140219_M01761_0057_000000000_A825W_1': {u'HOW_OFTEN_SEQUENCED': u'1', u'INDEX2': u'CTCTCTAT', u'UNIQUE_BARCODES': u'OK', u'UL_EB': u'0', u'FLOW_CELL_PROPERTIES': u'Illumina RTA Version: 1.18.42\nSequencer : QGF MiSeq (Yoda)\nRun type: PAIRED_END\nNumber of cycles: 251\n\nKit : MS2048060-500V2', u'SEQUENCING_APPLICATION': u'GENOMIC_DNA_SEQ', u'BARCODE': u'TAGGCATG', u'BARCODE_COMPLEXITY_CHECKER': u'No Pool', u'CONTACT_PERSON_EMAIL': u'Julia.Feldmann@unibas.ch', u'INVOICE': u'false', 'LANE': u'140219_M01761_0057_000000000-A825W:1', u'NCBI_ORGANISM_TAXONOMY': u'1773', u'EXTERNAL_SAMPLE_NAME': u'G01664', u'CONTACT_PERSON_NAME': u'Julia Feldmann', u'UL_EB_MISEQ': u'0', u'NM_DNA': u'0', u'PRINCIPAL_INVESTIGATOR_EMAIL': u'Sebastien.Gagneux@unibas.ch', u'UL_DNA': u'0', u'NUMBER_OF_ATTACHMENTS': u'0', u'PRINCIPAL_INVESTIGATOR_NAME': u'Sebastien Gagneux', u'SAMPLE_KIND': u'GENOMIC_DNA', u'AFFILIATION': u'UNIVERSITY_BASEL', u'UL_DNA_MISEQ': u'0'}, u'BSSE_QGF_20256_140219_M01761_0057_000000000_A825W_1': {u'HOW_OFTEN_SEQUENCED': u'1', u'INDEX2': u'ACTGCATA', u'UNIQUE_BARCODES': u'OK', u'UL_EB': u'0', u'FLOW_CELL_PROPERTIES': u'Illumina RTA Version: 1.18.42\nSequencer : QGF MiSeq (Yoda)\nRun type: PAIRED_END\nNumber of cycles: 251\n\nKit : MS2048060-500V2', u'SEQUENCING_APPLICATION': u'GENOMIC_DNA_SEQ', u'BARCODE': u'CGTACTAG', u'BARCODE_COMPLEXITY_CHECKER': u'No Pool', u'CONTACT_PERSON_EMAIL': u'Julia.Feldmann@unibas.ch', u'INVOICE': u'false', 'LANE': u'140219_M01761_0057_000000000-A825W:1', u'NCBI_ORGANISM_TAXONOMY': u'1773', u'EXTERNAL_SAMPLE_NAME': u'G01660', u'CONTACT_PERSON_NAME': u'Julia Feldmann', u'UL_EB_MISEQ': u'0', u'NM_DNA': u'0', u'PRINCIPAL_INVESTIGATOR_EMAIL': u'Sebastien.Gagneux@unibas.ch', u'UL_DNA': u'0', u'NUMBER_OF_ATTACHMENTS': u'0', u'PRINCIPAL_INVESTIGATOR_NAME': u'Sebastien Gagneux', u'SAMPLE_KIND': u'GENOMIC_DNA', u'AFFILIATION': u'UNIVERSITY_BASEL', u'UL_DNA_MISEQ': u'0'}, u'BSSE_QGF_20257_140219_M01761_0057_000000000_A825W_1': {u'HOW_OFTEN_SEQUENCED': u'1', u'INDEX2': u'AAGGAGTA', u'UNIQUE_BARCODES': u'OK', u'UL_EB': u'0', u'FLOW_CELL_PROPERTIES': u'Illumina RTA Version: 1.18.42\nSequencer : QGF MiSeq (Yoda)\nRun type: PAIRED_END\nNumber of cycles: 251\n\nKit : MS2048060-500V2', u'SEQUENCING_APPLICATION': u'GENOMIC_DNA_SEQ', u'BARCODE': u'AGGCAGAA', u'BARCODE_COMPLEXITY_CHECKER': u'No Pool', u'CONTACT_PERSON_EMAIL': u'Julia.Feldmann@unibas.ch', u'INVOICE': u'false', 'LANE': u'140219_M01761_0057_000000000-A825W:1', u'NCBI_ORGANISM_TAXONOMY': u'1773', u'EXTERNAL_SAMPLE_NAME': u'G01661', u'CONTACT_PERSON_NAME': u'Julia Feldmann', u'UL_EB_MISEQ': u'0', u'NM_DNA': u'0', u'PRINCIPAL_INVESTIGATOR_EMAIL': u'Sebastien.Gagneux@unibas.ch', u'UL_DNA': u'0', u'NUMBER_OF_ATTACHMENTS': u'0', u'PRINCIPAL_INVESTIGATOR_NAME': u'Sebastien Gagneux', u'SAMPLE_KIND': u'GENOMIC_DNA', u'AFFILIATION': u'UNIVERSITY_BASEL', u'UL_DNA_MISEQ': u'0'}, u'BSSE_QGF_20255_140219_M01761_0057_000000000_A825W_1': {u'HOW_OFTEN_SEQUENCED': u'1', u'INDEX2': u'GTAAGGAG', u'UNIQUE_BARCODES': u'OK', u'UL_EB': u'0', u'FLOW_CELL_PROPERTIES': u'Illumina RTA Version: 1.18.42\nSequencer : QGF MiSeq (Yoda)\nRun type: PAIRED_END\nNumber of cycles: 251\n\nKit : MS2048060-500V2', u'SEQUENCING_APPLICATION': u'GENOMIC_DNA_SEQ', u'BARCODE': u'TAAGGCGA', u'BARCODE_COMPLEXITY_CHECKER': u'No Pool', u'CONTACT_PERSON_EMAIL': u'Julia.Feldmann@unibas.ch', u'INVOICE': u'false', 'LANE': u'140219_M01761_0057_000000000-A825W:1', u'NCBI_ORGANISM_TAXONOMY': u'1773', u'EXTERNAL_SAMPLE_NAME': u'G01659', u'CONTACT_PERSON_NAME': u'Julia Feldmann', u'UL_EB_MISEQ': u'0', u'NM_DNA': u'0', u'PRINCIPAL_INVESTIGATOR_EMAIL': u'Sebastien.Gagneux@unibas.ch', u'UL_DNA': u'0', u'NUMBER_OF_ATTACHMENTS': u'0', u'PRINCIPAL_INVESTIGATOR_NAME': u'Sebastien Gagneux', u'SAMPLE_KIND': u'GENOMIC_DNA', u'AFFILIATION': u'UNIVERSITY_BASEL', u'UL_DNA_MISEQ': u'0'}, u'BSSE_QGF_20266_140219_M01761_0057_000000000_A825W_1': {u'HOW_OFTEN_SEQUENCED': u'1', u'INDEX2': u'CTAAGCCT', u'UNIQUE_BARCODES': u'OK', u'UL_EB': u'0', u'FLOW_CELL_PROPERTIES': u'Illumina RTA Version: 1.18.42\nSequencer : QGF MiSeq (Yoda)\nRun type: PAIRED_END\nNumber of cycles: 251\n\nKit : MS2048060-500V2', u'SEQUENCING_APPLICATION': u'GENOMIC_DNA_SEQ', u'BARCODE': u'GTAGAGGA', u'BARCODE_COMPLEXITY_CHECKER': u'No Pool', u'CONTACT_PERSON_EMAIL': u'Julia.Feldmann@unibas.ch', u'INVOICE': u'false', 'LANE': u'140219_M01761_0057_000000000-A825W:1', u'NCBI_ORGANISM_TAXONOMY': u'1773', u'EXTERNAL_SAMPLE_NAME': u'G01670', u'CONTACT_PERSON_NAME': u'Julia Feldmann', u'UL_EB_MISEQ': u'0', u'NM_DNA': u'0', u'PRINCIPAL_INVESTIGATOR_EMAIL': u'Sebastien.Gagneux@unibas.ch', u'UL_DNA': u'0', u'NUMBER_OF_ATTACHMENTS': u'0', u'PRINCIPAL_INVESTIGATOR_NAME': u'Sebastien Gagneux', u'SAMPLE_KIND': u'GENOMIC_DNA', u'AFFILIATION': u'UNIVERSITY_BASEL', u'UL_DNA_MISEQ': u'0'}, u'BSSE_QGF_20258_140219_M01761_0057_000000000_A825W_1': {u'HOW_OFTEN_SEQUENCED': u'1', u'INDEX2': u'CTAAGCCT', u'UNIQUE_BARCODES': u'OK', u'UL_EB': u'0', u'FLOW_CELL_PROPERTIES': u'Illumina RTA Version: 1.18.42\nSequencer : QGF MiSeq (Yoda)\nRun type: PAIRED_END\nNumber of cycles: 251\n\nKit : MS2048060-500V2', u'SEQUENCING_APPLICATION': u'GENOMIC_DNA_SEQ', u'BARCODE': u'TCCTGAGC', u'BARCODE_COMPLEXITY_CHECKER': u'No Pool', u'CONTACT_PERSON_EMAIL': u'Julia.Feldmann@unibas.ch', u'INVOICE': u'false', 'LANE': u'140219_M01761_0057_000000000-A825W:1', u'NCBI_ORGANISM_TAXONOMY': u'1773', u'EXTERNAL_SAMPLE_NAME': u'G01662', u'CONTACT_PERSON_NAME': u'Julia Feldmann', u'UL_EB_MISEQ': u'0', u'NM_DNA': u'0', u'PRINCIPAL_INVESTIGATOR_EMAIL': u'Sebastien.Gagneux@unibas.ch', u'UL_DNA': u'0', u'NUMBER_OF_ATTACHMENTS': u'0', u'PRINCIPAL_INVESTIGATOR_NAME': u'Sebastien Gagneux', u'SAMPLE_KIND': u'GENOMIC_DNA', u'AFFILIATION': u'UNIVERSITY_BASEL', u'UL_DNA_MISEQ': u'0'}, u'BSSE_QGF_20265_140219_M01761_0057_000000000_A825W_1': {u'HOW_OFTEN_SEQUENCED': u'1', u'INDEX2': u'AAGGAGTA', u'UNIQUE_BARCODES': u'OK', u'UL_EB': u'0', u'FLOW_CELL_PROPERTIES': u'Illumina RTA Version: 1.18.42\nSequencer : QGF MiSeq (Yoda)\nRun type: PAIRED_END\nNumber of cycles: 251\n\nKit : MS2048060-500V2', u'SEQUENCING_APPLICATION': u'GENOMIC_DNA_SEQ', u'BARCODE': u'AAGAGGCA', u'BARCODE_COMPLEXITY_CHECKER': u'No Pool', u'CONTACT_PERSON_EMAIL': u'Julia.Feldmann@unibas.ch', u'INVOICE': u'false', 'LANE': u'140219_M01761_0057_000000000-A825W:1', u'NCBI_ORGANISM_TAXONOMY': u'1773', u'EXTERNAL_SAMPLE_NAME': u'G01669', u'CONTACT_PERSON_NAME': u'Julia Feldmann', u'UL_EB_MISEQ': u'0', u'NM_DNA': u'0', u'PRINCIPAL_INVESTIGATOR_EMAIL': u'Sebastien.Gagneux@unibas.ch', u'UL_DNA': u'0', u'NUMBER_OF_ATTACHMENTS': u'0', u'PRINCIPAL_INVESTIGATOR_NAME': u'Sebastien Gagneux', u'SAMPLE_KIND': u'GENOMIC_DNA', u'AFFILIATION': u'UNIVERSITY_BASEL', u'UL_DNA_MISEQ': u'0'}, u'BSSE_QGF_20262_140219_M01761_0057_000000000_A825W_1': {u'HOW_OFTEN_SEQUENCED': u'1', u'INDEX2': u'AGAGTAGA', u'UNIQUE_BARCODES': u'OK', u'UL_EB': u'0', u'FLOW_CELL_PROPERTIES': u'Illumina RTA Version: 1.18.42\nSequencer : QGF MiSeq (Yoda)\nRun type: PAIRED_END\nNumber of cycles: 251\n\nKit : MS2048060-500V2', u'SEQUENCING_APPLICATION': u'GENOMIC_DNA_SEQ', u'BARCODE': u'CAGAGAGG', u'BARCODE_COMPLEXITY_CHECKER': u'No Pool', u'CONTACT_PERSON_EMAIL': u'Julia.Feldmann@unibas.ch', u'INVOICE': u'false', 'LANE': u'140219_M01761_0057_000000000-A825W:1', u'NCBI_ORGANISM_TAXONOMY': u'1773', u'EXTERNAL_SAMPLE_NAME': u'G01666', u'CONTACT_PERSON_NAME': u'Julia Feldmann', u'UL_EB_MISEQ': u'0', u'NM_DNA': u'0', u'PRINCIPAL_INVESTIGATOR_EMAIL': u'Sebastien.Gagneux@unibas.ch', u'UL_DNA': u'0', u'NUMBER_OF_ATTACHMENTS': u'0', u'PRINCIPAL_INVESTIGATOR_NAME': u'Sebastien Gagneux', u'SAMPLE_KIND': u'GENOMIC_DNA', u'AFFILIATION': u'UNIVERSITY_BASEL', u'UL_DNA_MISEQ': u'0'}, u'BSSE_QGF_20264_140219_M01761_0057_000000000_A825W_1': {u'HOW_OFTEN_SEQUENCED': u'1', u'INDEX2': u'ACTGCATA', u'UNIQUE_BARCODES': u'OK', u'UL_EB': u'0', u'FLOW_CELL_PROPERTIES': u'Illumina RTA Version: 1.18.42\nSequencer : QGF MiSeq (Yoda)\nRun type: PAIRED_END\nNumber of cycles: 251\n\nKit : MS2048060-500V2', u'SEQUENCING_APPLICATION': u'GENOMIC_DNA_SEQ', u'BARCODE': u'CGAGGCTG', u'BARCODE_COMPLEXITY_CHECKER': u'No Pool', u'CONTACT_PERSON_EMAIL': u'Julia.Feldmann@unibas.ch', u'INVOICE': u'false', 'LANE': u'140219_M01761_0057_000000000-A825W:1', u'NCBI_ORGANISM_TAXONOMY': u'1773', u'EXTERNAL_SAMPLE_NAME': u'G01668', u'CONTACT_PERSON_NAME': u'Julia Feldmann', u'UL_EB_MISEQ': u'0', u'NM_DNA': u'0', u'PRINCIPAL_INVESTIGATOR_EMAIL': u'Sebastien.Gagneux@unibas.ch', u'UL_DNA': u'0', u'NUMBER_OF_ATTACHMENTS': u'0', u'PRINCIPAL_INVESTIGATOR_NAME': u'Sebastien Gagneux', u'SAMPLE_KIND': u'GENOMIC_DNA', u'AFFILIATION': u'UNIVERSITY_BASEL', u'UL_DNA_MISEQ': u'0'}, u'BSSE_QGF_20259_140219_M01761_0057_000000000_A825W_1': {u'HOW_OFTEN_SEQUENCED': u'1', u'INDEX2': u'TAGATCGC', u'UNIQUE_BARCODES': u'OK', u'UL_EB': u'0', u'FLOW_CELL_PROPERTIES': u'Illumina RTA Version: 1.18.42\nSequencer : QGF MiSeq (Yoda)\nRun type: PAIRED_END\nNumber of cycles: 251\n\nKit : MS2048060-500V2', u'SEQUENCING_APPLICATION': u'GENOMIC_DNA_SEQ', u'BARCODE': u'GGACTCCT', u'BARCODE_COMPLEXITY_CHECKER': u'No Pool', u'CONTACT_PERSON_EMAIL': u'Julia.Feldmann@unibas.ch', u'INVOICE': u'false', 'LANE': u'140219_M01761_0057_000000000-A825W:1', u'NCBI_ORGANISM_TAXONOMY': u'1773', u'EXTERNAL_SAMPLE_NAME': u'G01663', u'CONTACT_PERSON_NAME': u'Julia Feldmann', u'UL_EB_MISEQ': u'0', u'NM_DNA': u'0', u'PRINCIPAL_INVESTIGATOR_EMAIL': u'Sebastien.Gagneux@unibas.ch', u'UL_DNA': u'0', u'NUMBER_OF_ATTACHMENTS': u'0', u'PRINCIPAL_INVESTIGATOR_NAME': u'Sebastien Gagneux', u'SAMPLE_KIND': u'GENOMIC_DNA', u'AFFILIATION': u'UNIVERSITY_BASEL', u'UL_DNA_MISEQ': u'0'}, u'BSSE_QGF_20263_140219_M01761_0057_000000000_A825W_1': {u'HOW_OFTEN_SEQUENCED': u'1', u'INDEX2': u'ACTGCATA', u'UNIQUE_BARCODES': u'OK', u'UL_EB': u'0', u'FLOW_CELL_PROPERTIES': u'Illumina RTA Version: 1.18.42\nSequencer : QGF MiSeq (Yoda)\nRun type: PAIRED_END\nNumber of cycles: 251\n\nKit : MS2048060-500V2', u'SEQUENCING_APPLICATION': u'GENOMIC_DNA_SEQ', u'BARCODE': u'GCTACGCT', u'BARCODE_COMPLEXITY_CHECKER': u'No Pool', u'CONTACT_PERSON_EMAIL': u'Julia.Feldmann@unibas.ch', u'INVOICE': u'false', 'LANE': u'140219_M01761_0057_000000000-A825W:1', u'NCBI_ORGANISM_TAXONOMY': u'1773', u'EXTERNAL_SAMPLE_NAME': u'G01667', u'CONTACT_PERSON_NAME': u'Julia Feldmann', u'UL_EB_MISEQ': u'0', u'NM_DNA': u'0', u'PRINCIPAL_INVESTIGATOR_EMAIL': u'Sebastien.Gagneux@unibas.ch', u'UL_DNA': u'0', u'NUMBER_OF_ATTACHMENTS': u'0', u'PRINCIPAL_INVESTIGATOR_NAME': u'Sebastien Gagneux', u'SAMPLE_KIND': u'GENOMIC_DNA', u'AFFILIATION': u'UNIVERSITY_BASEL', u'UL_DNA_MISEQ': u'0'}} - self.samplesPerLaneDict2 = {u'1': 14} - self.flowCellName2 = '000000000-A825W' - - self.flowCellDict3 = {u'CONTROL_LANE': u'5', u'RUNNINGTIME': u'2 days, 11:29:33', u'SEQUENCER_FINISHED': u'2014-01-26 23:07:19 +0100', u'ILLUMINA_PIPELINE_VERSION': u'1.17.21.3', u'END_TYPE': u'SINGLE_READ', u'FLOW_CELL_SEQUENCED_ON': u'2014-01-24 11:37:46 +0100', u'INDEXREAD2': u'0', u'SBS_KIT': u'TruSeq SBS Kit v3', u'FLOWCELLTYPE': u'HiSeq Flow Cell v3', u'SEQUENCER': u'SN792', u'TILECOUNT': u'16', u'LANECOUNT': u'8', 'Name': u'140124_SN792_0311_AC36GVACXX', u'SEQUENCER_RUN_TIME': u'2.479', u'CYCLES_REQUESTED_BY_CUSTOMER': u'51', u'INDEXREAD': u'7', u'SWATHCOUNT': u'3', u'SURFACECOUNT': u'2', 'Project': u'2014.01'} - self.parentDict3 = {u'BSSE_QGF_20024_140124_SN792_0311_AC36GVACXX_4': {u'QC_AT_DBSSE': u'false', u'UNIQUE_BARCODES': u'OK', u'UL_EB': u'0', u'FLOW_CELL_PROPERTIES': u'Sample got sequenced more than once. Please check the flow lane properties for detailed description!', u'STARTING_AMOUNT_OF_SAMPLE_IN_NG': u'2000', u'CELL_PLASTICITY_SYSTEMSX': u'false', u'NCBI_ORGANISM_TAXONOMY': u'9606', u'LIBRARY_PROCESSING_SUCCESSFUL': u'false', u'HOW_OFTEN_SEQUENCED': u'4', u'BAREBACKED': u'false', u'SEQUENCING_APPLICATION': u'GENOMIC_DNA_SEQ', u'BARCODE': u'CAAAAG', u'BARCODE_COMPLEXITY_CHECKER': u'No Pool', u'CONTACT_PERSON_EMAIL': u'Christine.Fritz@usz.ch', u'INVOICE': u'false', 'LANE': u'140124_SN792_0311_AC36GVACXX:4', u'PREPARED_BY': u'Ina', u'LIBRARY_PROCESSING_FAILED': u'false', u'CONTACT_PERSON_NAME': u'Fritz Christine', u'NM_DNA': u'0', u'LIBRARY_PROCESSING_POSSIBLE': u'false', u'PRINCIPAL_INVESTIGATOR_NAME': u'Peter Wild', u'AFFILIATION': u'OTHER', u'EXTERNAL_SAMPLE_NAME': u'14_G12.336 TA1', u'BIOLOGICAL_SAMPLE_ARRIVED': u'2013-10-29 12:00:00 +0100', u'UL_EB_MISEQ': u'0', u'KIT': u'AGILENT_SURESELECT_ENRICHMENTSYSTEM', u'PRINCIPAL_INVESTIGATOR_EMAIL': u'peter.wild@usz.ch', u'UL_DNA': u'0', u'NUMBER_OF_ATTACHMENTS': u'0', u'SAMPLE_KIND': u'GENOMIC_DNA', u'UL_DNA_MISEQ': u'0'}, u'BSSE_QGF_20015_140124_SN792_0311_AC36GVACXX_4': {u'QC_AT_DBSSE': u'false', u'UNIQUE_BARCODES': u'OK', u'UL_EB': u'0', u'FLOW_CELL_PROPERTIES': u'Sample got sequenced more than once. Please check the flow lane properties for detailed description!', u'STARTING_AMOUNT_OF_SAMPLE_IN_NG': u'2000', u'CELL_PLASTICITY_SYSTEMSX': u'false', u'NCBI_ORGANISM_TAXONOMY': u'9606', u'LIBRARY_PROCESSING_SUCCESSFUL': u'false', u'HOW_OFTEN_SEQUENCED': u'4', u'BAREBACKED': u'false', u'SEQUENCING_APPLICATION': u'GENOMIC_DNA_SEQ', u'BARCODE': u'ACAGTGA', u'BARCODE_COMPLEXITY_CHECKER': u'No Pool', u'CONTACT_PERSON_EMAIL': u'Christine.Fritz@usz.ch', u'INVOICE': u'false', 'LANE': u'140124_SN792_0311_AC36GVACXX:4', u'PREPARED_BY': u'Ina', u'LIBRARY_PROCESSING_FAILED': u'false', u'CONTACT_PERSON_NAME': u'Fritz Christine', u'NM_DNA': u'0', u'LIBRARY_PROCESSING_POSSIBLE': u'false', u'PRINCIPAL_INVESTIGATOR_NAME': u'Peter Wild', u'AFFILIATION': u'OTHER', u'EXTERNAL_SAMPLE_NAME': u'5_G08.792 NO', u'BIOLOGICAL_SAMPLE_ARRIVED': u'2013-10-29 12:00:00 +0100', u'KIT': u'AGILENT_SURESELECT_ENRICHMENTSYSTEM', u'UL_EB_MISEQ': u'0', u'PRINCIPAL_INVESTIGATOR_EMAIL': u'peter.wild@usz.ch', u'UL_DNA': u'0', u'NUMBER_OF_ATTACHMENTS': u'0', u'SAMPLE_KIND': u'GENOMIC_DNA', u'UL_DNA_MISEQ': u'0'}, u'BSSE_QGF_19937_140124_SN792_0311_AC36GVACXX_3': {u'FRAGMENT_SIZE_PREPARED_ILLUMINA': u'160', u'HOW_OFTEN_SEQUENCED': u'1', u'UNIQUE_BARCODES': u'OK', u'UL_EB': u' 2.0', u'FLOW_CELL_PROPERTIES': u'Illumina RTA Version: 1.17.21.3\nSequencer : QGF HiSeq2000 (Rua)\nRun type: SINGLE_READ\nNumber of cycles: 51\nFLOWCELLTYPE: HiSeq Flow Cell v3\nKit : TruSeq SBS Kit v3', u'CONCENTRATION_PREPARED_ILLUMINA': u'0.26', u'SEQUENCING_APPLICATION': u'SMALL_RNA_SEQ', u'BARCODE': u'AGTTCCG', u'BARCODE_COMPLEXITY_CHECKER': u'No Pool', u'CONTACT_PERSON_EMAIL': u'deni.subasic@imls.uzh.ch', u'INVOICE': u'false', 'LANE': u'140124_SN792_0311_AC36GVACXX:3', u'NCBI_ORGANISM_TAXONOMY': u'9606', u'EXTERNAL_SAMPLE_NAME': u'24_fox-1 asd-1 3', u'CONTACT_PERSON_NAME': u'Deni Subasic', u'UL_EB_MISEQ': u' -6.0', u'NM_DNA': u' 2.50', u'PRINCIPAL_INVESTIGATOR_EMAIL': u'michael.hengartner@imls.uzh.ch', u'UL_DNA': u' 8.0', u'NUMBER_OF_ATTACHMENTS': u'0', u'PRINCIPAL_INVESTIGATOR_NAME': u'Michael Hengartner', u'SAMPLE_KIND': u'PROCESSED_DNA_LIBRARY', u'UL_STOCK': u'10', u'AFFILIATION': u'OTHER', u'UL_DNA_MISEQ': u' 16.0'}, u'BSSE_QGF_19928_140124_SN792_0311_AC36GVACXX_3': {u'FRAGMENT_SIZE_PREPARED_ILLUMINA': u'159', u'HOW_OFTEN_SEQUENCED': u'1', u'UNIQUE_BARCODES': u'OK', u'UL_EB': u' 18.0', u'FLOW_CELL_PROPERTIES': u'Illumina RTA Version: 1.17.21.3\nSequencer : QGF HiSeq2000 (Rua)\nRun type: SINGLE_READ\nNumber of cycles: 51\nFLOWCELLTYPE: HiSeq Flow Cell v3\nKit : TruSeq SBS Kit v3', u'CONCENTRATION_PREPARED_ILLUMINA': u'2.1', u'SEQUENCING_APPLICATION': u'SMALL_RNA_SEQ', u'BARCODE': u'TTAGGCA', u'BARCODE_COMPLEXITY_CHECKER': u'No Pool', u'CONTACT_PERSON_EMAIL': u'deni.subasic@imls.uzh.ch', u'INVOICE': u'false', 'LANE': u'140124_SN792_0311_AC36GVACXX:3', u'NCBI_ORGANISM_TAXONOMY': u'9606', u'EXTERNAL_SAMPLE_NAME': u'15_wt (N2) 3 (OLD)', u'CONTACT_PERSON_NAME': u'Deni Subasic', u'UL_EB_MISEQ': u' 16.1', u'NM_DNA': u' 20.32', u'PRINCIPAL_INVESTIGATOR_EMAIL': u'michael.hengartner@imls.uzh.ch', u'UL_DNA': u' 2.0', u'NUMBER_OF_ATTACHMENTS': u'0', u'PRINCIPAL_INVESTIGATOR_NAME': u'Michael Hengartner', u'SAMPLE_KIND': u'PROCESSED_DNA_LIBRARY', u'UL_STOCK': u'20', u'AFFILIATION': u'OTHER', u'UL_DNA_MISEQ': u' 3.9'}, u'BSSE_QGF_20029_140124_SN792_0311_AC36GVACXX_1': {u'QC_AT_DBSSE': u'true', u'FRAGMENT_SIZE_PREPARED_ILLUMINA': u'870', u'UNIQUE_BARCODES': u'OK', u'UL_EB': u' 18.3', u'FLOW_CELL_PROPERTIES': u'Illumina RTA Version: 1.17.21.3\nSequencer : QGF HiSeq2000 (Rua)\nRun type: SINGLE_READ\nNumber of cycles: 51\nFLOWCELLTYPE: HiSeq Flow Cell v3\nKit : TruSeq SBS Kit v3', u'CONCENTRATION_PREPARED_ILLUMINA': u'13.7', u'CELL_PLASTICITY_SYSTEMSX': u'false', u'NCBI_ORGANISM_TAXONOMY': u'3569', u'LIBRARY_PROCESSING_SUCCESSFUL': u'false', u'HOW_OFTEN_SEQUENCED': u'1', u'BAREBACKED': u'false', u'SEQUENCING_APPLICATION': u'GENOMIC_DNA_SEQ', u'END_TYPE': u'PAIRED_END', u'BARCODE': u'GATCAGA', u'BARCODE_COMPLEXITY_CHECKER': u'No Pool', u'CONTACT_PERSON_EMAIL': u'simone.fior@env.ethz.ch', u'INVOICE': u'false', 'LANE': u'140124_SN792_0311_AC36GVACXX:1', u'PREPARED_BY': u'Simone', u'LIBRARY_PROCESSING_FAILED': u'false', u'CONTACT_PERSON_NAME': u'Fior Simone', u'NM_DNA': u' 24.23', u'CYCLES_REQUESTED_BY_CUSTOMER': u'100', u'LIBRARY_PROCESSING_POSSIBLE': u'false', u'PRINCIPAL_INVESTIGATOR_NAME': u'Alexander Widmer', u'NANO_DROP': u'CONCND3300', u'AFFILIATION': u'OTHER', u'EXTERNAL_SAMPLE_NAME': u'2_Dcar_Grengiols', u'BIOLOGICAL_SAMPLE_ARRIVED': u'2013-12-16 12:00:00 +0100', u'UL_EB_MISEQ': u' 16.7', u'KIT': u'NONE', u'PRINCIPAL_INVESTIGATOR_EMAIL': u'alex.widmer@env.ethz.ch', u'UL_DNA': u' 1.7', u'NUMBER_OF_ATTACHMENTS': u'0', u'SAMPLE_KIND': u'GENOMIC_DNA', u'UL_STOCK': u'20', u'UL_DNA_MISEQ': u' 3.3'}, u'BSSE_QGF_20030_140124_SN792_0311_AC36GVACXX_1': {u'QC_AT_DBSSE': u'true', u'FRAGMENT_SIZE_PREPARED_ILLUMINA': u'903', u'UNIQUE_BARCODES': u'OK', u'UL_EB': u' 18.3', u'FLOW_CELL_PROPERTIES': u'Illumina RTA Version: 1.17.21.3\nSequencer : QGF HiSeq2000 (Rua)\nRun type: SINGLE_READ\nNumber of cycles: 51\nFLOWCELLTYPE: HiSeq Flow Cell v3\nKit : TruSeq SBS Kit v3', u'CONCENTRATION_PREPARED_ILLUMINA': u'13.9', u'CELL_PLASTICITY_SYSTEMSX': u'false', u'NCBI_ORGANISM_TAXONOMY': u'3569', u'LIBRARY_PROCESSING_SUCCESSFUL': u'false', u'HOW_OFTEN_SEQUENCED': u'1', u'BAREBACKED': u'false', u'SEQUENCING_APPLICATION': u'GENOMIC_DNA_SEQ', u'END_TYPE': u'PAIRED_END', u'BARCODE': u'GTGGCCT', u'BARCODE_COMPLEXITY_CHECKER': u'No Pool', u'CONTACT_PERSON_EMAIL': u'simone.fior@env.ethz.ch', u'INVOICE': u'false', 'LANE': u'140124_SN792_0311_AC36GVACXX:1', u'PREPARED_BY': u'Simone', u'LIBRARY_PROCESSING_FAILED': u'false', u'CONTACT_PERSON_NAME': u'Fior Simone', u'NM_DNA': u' 23.68', u'CYCLES_REQUESTED_BY_CUSTOMER': u'100', u'LIBRARY_PROCESSING_POSSIBLE': u'false', u'PRINCIPAL_INVESTIGATOR_NAME': u'Alexander Widmer', u'NANO_DROP': u'CONCND3300', u'AFFILIATION': u'OTHER', u'EXTERNAL_SAMPLE_NAME': u'3_Dcar_Gibidumsee', u'BIOLOGICAL_SAMPLE_ARRIVED': u'2013-12-16 12:00:00 +0100', u'KIT': u'NONE', u'UL_EB_MISEQ': u' 16.6', u'PRINCIPAL_INVESTIGATOR_EMAIL': u'alex.widmer@env.ethz.ch', u'UL_DNA': u' 1.7', u'NUMBER_OF_ATTACHMENTS': u'0', u'SAMPLE_KIND': u'GENOMIC_DNA', u'UL_STOCK': u'20', u'UL_DNA_MISEQ': u' 3.4'}, u'BSSE_QGF_20025_140124_SN792_0311_AC36GVACXX_4': {u'QC_AT_DBSSE': u'false', u'UNIQUE_BARCODES': u'OK', u'UL_EB': u'0', u'FLOW_CELL_PROPERTIES': u'Sample got sequenced more than once. Please check the flow lane properties for detailed description!', u'STARTING_AMOUNT_OF_SAMPLE_IN_NG': u'2000', u'CELL_PLASTICITY_SYSTEMSX': u'false', u'NCBI_ORGANISM_TAXONOMY': u'9606', u'LIBRARY_PROCESSING_SUCCESSFUL': u'false', u'HOW_OFTEN_SEQUENCED': u'4', u'BAREBACKED': u'false', u'SEQUENCING_APPLICATION': u'GENOMIC_DNA_SEQ', u'BARCODE': u'GAAACC', u'BARCODE_COMPLEXITY_CHECKER': u'No Pool', u'CONTACT_PERSON_EMAIL': u'Christine.Fritz@usz.ch', u'INVOICE': u'false', 'LANE': u'140124_SN792_0311_AC36GVACXX:4', u'PREPARED_BY': u'Ina', u'LIBRARY_PROCESSING_FAILED': u'false', u'CONTACT_PERSON_NAME': u'Fritz Christine', u'NM_DNA': u'0', u'LIBRARY_PROCESSING_POSSIBLE': u'false', u'PRINCIPAL_INVESTIGATOR_NAME': u'Peter Wild', u'AFFILIATION': u'OTHER', u'EXTERNAL_SAMPLE_NAME': u'15_G12.336 TA2', u'BIOLOGICAL_SAMPLE_ARRIVED': u'2013-10-29 12:00:00 +0100', u'UL_EB_MISEQ': u'0', u'KIT': u'AGILENT_SURESELECT_ENRICHMENTSYSTEM', u'PRINCIPAL_INVESTIGATOR_EMAIL': u'peter.wild@usz.ch', u'UL_DNA': u'0', u'NUMBER_OF_ATTACHMENTS': u'0', u'SAMPLE_KIND': u'GENOMIC_DNA', u'UL_DNA_MISEQ': u'0'}, u'BSSE_QGF_19914_140124_SN792_0311_AC36GVACXX_2': {u'HOW_OFTEN_SEQUENCED': u'1', u'UNIQUE_BARCODES': u'OK', u'UL_EB': u'0', u'FLOW_CELL_PROPERTIES': u'Illumina RTA Version: 1.17.21.3\nSequencer : QGF HiSeq2000 (Rua)\nRun type: SINGLE_READ\nNumber of cycles: 51\nFLOWCELLTYPE: HiSeq Flow Cell v3\nKit : TruSeq SBS Kit v3', u'CONCENTRATION_PREPARED_ILLUMINA': u'0.4', u'SEQUENCING_APPLICATION': u'SMALL_RNA_SEQ', u'BARCODE': u'CGATGTA', u'BARCODE_COMPLEXITY_CHECKER': u'No Pool', u'CONTACT_PERSON_EMAIL': u'deni.subasic@imls.uzh.ch', u'INVOICE': u'false', 'LANE': u'140124_SN792_0311_AC36GVACXX:2', u'NCBI_ORGANISM_TAXONOMY': u'9606', u'EXTERNAL_SAMPLE_NAME': u'2_wt L2', u'CONTACT_PERSON_NAME': u'Deni Subasic', u'UL_EB_MISEQ': u'0', u'NM_DNA': u'0', u'PRINCIPAL_INVESTIGATOR_EMAIL': u'michael.hengartner@imls.uzh.ch', u'UL_DNA': u'0', u'NUMBER_OF_ATTACHMENTS': u'0', u'PRINCIPAL_INVESTIGATOR_NAME': u'Michael Hengartner', u'SAMPLE_KIND': u'PROCESSED_DNA_LIBRARY', u'AFFILIATION': u'OTHER', u'UL_DNA_MISEQ': u'0'}, u'BSSE_QGF_19956_140124_SN792_0311_AC36GVACXX_7': {u'QC_AT_DBSSE': u'false', u'FRAGMENT_SIZE_PREPARED_ILLUMINA': u'189', u'UNIQUE_BARCODES': u'OK', u'UL_EB': u'0', u'FLOW_CELL_PROPERTIES': u'Illumina RTA Version: 1.17.21.3\nSequencer : QGF HiSeq2000 (Rua)\nRun type: SINGLE_READ\nNumber of cycles: 51\nFLOWCELLTYPE: HiSeq Flow Cell v3\nKit : TruSeq SBS Kit v3', u'CELL_PLASTICITY_SYSTEMSX': u'false', u'NCBI_ORGANISM_TAXONOMY': u'9606', u'CONCENTRATION_FLOWLANE': u'13', u'LIBRARY_PROCESSING_SUCCESSFUL': u'false', u'HOW_OFTEN_SEQUENCED': u'2', u'BAREBACKED': u'false', u'SEQUENCING_APPLICATION': u'RNA_SEQ', u'CLUSTER_STATION': u'CBOT', u'END_TYPE': u'SINGLE_READ', u'BARCODE_COMPLEXITY_CHECKER': u'No Pool', u'CREATED_ON_CS': u'2014-01-23 12:00:00 +0100', u'CONTACT_PERSON_EMAIL': u'arnau.vinavilaseca@unibas.ch', u'INVOICE': u'false', 'LANE': u'140124_SN792_0311_AC36GVACXX:7', u'CLUSTER_GENERATION_KIT_VERSION': u'TRUSEQ_CBOT_HS_V3', u'PREPARED_BY': u'Arnau', u'LIBRARY_PROCESSING_FAILED': u'false', u'CONTACT_PERSON_NAME': u'Arnau Vina Vilaseca', u'REQUIRED_LANES': u'2', u'NM_DNA': u'0', u'CYCLES_REQUESTED_BY_CUSTOMER': u'58', u'LIBRARY_PROCESSING_POSSIBLE': u'false', u'PRINCIPAL_INVESTIGATOR_NAME': u'Mihaela Zavolan', u'NANO_DROP': u'CONCND3300', u'BARCODES': u'these are 12 samples pooled together with the True seq universal adaptor and personal internal barcode\n\nthe samples should run in two lanes.\n\nlet me know if any questions\n\nArnau', u'AFFILIATION': u'BIOCENTER_BASEL', u'EXTERNAL_SAMPLE_NAME': u'Ina-PseudoUridination', u'BIOLOGICAL_SAMPLE_ARRIVED': u'2014-01-13 12:00:00 +0100', u'KIT': u'NONE', u'UL_EB_MISEQ': u'0', u'PRINCIPAL_INVESTIGATOR_EMAIL': u'mihaela.zavolan@unibas.ch', u'UL_DNA': u'0', u'NUMBER_OF_ATTACHMENTS': u'2', u'CS_PROTOCOL_VERSION': u'v8', u'SAMPLE_KIND': u'SMALL_RNA', u'UL_DNA_MISEQ': u'0'}, u'BSSE_QGF_20039_140124_SN792_0311_AC36GVACXX_8': {u'QC_AT_DBSSE': u'false', u'UNIQUE_BARCODES': u'OK', u'UL_EB': u'0', u'FLOW_CELL_PROPERTIES': u'Illumina RTA Version: 1.17.21.3\nSequencer : QGF HiSeq2000 (Rua)\nRun type: SINGLE_READ\nNumber of cycles: 51\nFLOWCELLTYPE: HiSeq Flow Cell v3\nKit : TruSeq SBS Kit v3', u'CELL_PLASTICITY_SYSTEMSX': u'false', u'NCBI_ORGANISM_TAXONOMY': u'27434', u'LIBRARY_PROCESSING_SUCCESSFUL': u'false', u'HOW_OFTEN_SEQUENCED': u'1', u'BAREBACKED': u'false', u'SEQUENCING_APPLICATION': u'RNA_SEQ', u'BARCODE': u'ACAGTGA', u'BARCODE_COMPLEXITY_CHECKER': u'No Pool', u'CONTACT_PERSON_EMAIL': u'minwu@ethz.ch', u'INVOICE': u'false', 'LANE': u'140124_SN792_0311_AC36GVACXX:8', u'LIBRARY_PROCESSING_FAILED': u'false', u'CONTACT_PERSON_NAME': u'Min Wu', u'NM_DNA': u'0', u'LIBRARY_PROCESSING_POSSIBLE': u'false', u'NOTES': u'TruSeq Strande mRNA sample Prep Kit', u'PRINCIPAL_INVESTIGATOR_NAME': u'Mathias K\xf6lliker', u'AFFILIATION': u'OTHER', u'EXTERNAL_SAMPLE_NAME': u'22Ab', u'UL_EB_MISEQ': u'0', u'UL_DNA': u'0', u'PRINCIPAL_INVESTIGATOR_EMAIL': u'mathias.koelliker@unibas.ch', u'NUMBER_OF_ATTACHMENTS': u'0', u'SAMPLE_KIND': u'TOTAL_RNA', u'UL_DNA_MISEQ': u'0'}, u'BSSE_QGF_20017_140124_SN792_0311_AC36GVACXX_4': {u'QC_AT_DBSSE': u'false', u'UNIQUE_BARCODES': u'OK', u'UL_EB': u'0', u'FLOW_CELL_PROPERTIES': u'Sample got sequenced more than once. Please check the flow lane properties for detailed description!', u'STARTING_AMOUNT_OF_SAMPLE_IN_NG': u'2000', u'CELL_PLASTICITY_SYSTEMSX': u'false', u'NCBI_ORGANISM_TAXONOMY': u'9606', u'LIBRARY_PROCESSING_SUCCESSFUL': u'false', u'HOW_OFTEN_SEQUENCED': u'4', u'BAREBACKED': u'false', u'SEQUENCING_APPLICATION': u'GENOMIC_DNA_SEQ', u'BARCODE': u'CAGATCA', u'BARCODE_COMPLEXITY_CHECKER': u'No Pool', u'CONTACT_PERSON_EMAIL': u'Christine.Fritz@usz.ch', u'INVOICE': u'false', 'LANE': u'140124_SN792_0311_AC36GVACXX:4', u'PREPARED_BY': u'Ina', u'LIBRARY_PROCESSING_FAILED': u'false', u'CONTACT_PERSON_NAME': u'Fritz Christine', u'NM_DNA': u'0', u'LIBRARY_PROCESSING_POSSIBLE': u'false', u'PRINCIPAL_INVESTIGATOR_NAME': u'Peter Wild', u'AFFILIATION': u'OTHER', u'EXTERNAL_SAMPLE_NAME': u'7_G09.245 TA1', u'BIOLOGICAL_SAMPLE_ARRIVED': u'2013-10-29 12:00:00 +0100', u'KIT': u'AGILENT_SURESELECT_ENRICHMENTSYSTEM', u'UL_EB_MISEQ': u'0', u'PRINCIPAL_INVESTIGATOR_EMAIL': u'peter.wild@usz.ch', u'UL_DNA': u'0', u'NUMBER_OF_ATTACHMENTS': u'0', u'SAMPLE_KIND': u'GENOMIC_DNA', u'UL_DNA_MISEQ': u'0'}, u'BSSE_QGF_20013_140124_SN792_0311_AC36GVACXX_4': {u'QC_AT_DBSSE': u'false', u'UNIQUE_BARCODES': u'OK', u'UL_EB': u'0', u'FLOW_CELL_PROPERTIES': u'Sample got sequenced more than once. Please check the flow lane properties for detailed description!', u'STARTING_AMOUNT_OF_SAMPLE_IN_NG': u'2000', u'CELL_PLASTICITY_SYSTEMSX': u'false', u'NCBI_ORGANISM_TAXONOMY': u'9606', u'LIBRARY_PROCESSING_SUCCESSFUL': u'false', u'HOW_OFTEN_SEQUENCED': u'4', u'BAREBACKED': u'false', u'SEQUENCING_APPLICATION': u'GENOMIC_DNA_SEQ', u'BARCODE': u'TTAGGCA', u'BARCODE_COMPLEXITY_CHECKER': u'No Pool', u'CONTACT_PERSON_EMAIL': u'Christine.Fritz@usz.ch', u'INVOICE': u'false', 'LANE': u'140124_SN792_0311_AC36GVACXX:4', u'PREPARED_BY': u'Ina', u'LIBRARY_PROCESSING_FAILED': u'false', u'CONTACT_PERSON_NAME': u'Fritz Christine', u'NM_DNA': u'0', u'LIBRARY_PROCESSING_POSSIBLE': u'false', u'PRINCIPAL_INVESTIGATOR_NAME': u'Peter Wild', u'AFFILIATION': u'OTHER', u'EXTERNAL_SAMPLE_NAME': u'3_G11.806 TA2', u'BIOLOGICAL_SAMPLE_ARRIVED': u'2013-10-29 12:00:00 +0100', u'UL_EB_MISEQ': u'0', u'KIT': u'AGILENT_SURESELECT_ENRICHMENTSYSTEM', u'PRINCIPAL_INVESTIGATOR_EMAIL': u'peter.wild@usz.ch', u'UL_DNA': u'0', u'NUMBER_OF_ATTACHMENTS': u'0', u'SAMPLE_KIND': u'GENOMIC_DNA', u'UL_DNA_MISEQ': u'0'}, u'BSSE_QGF_19924_140124_SN792_0311_AC36GVACXX_2': {u'FRAGMENT_SIZE_PREPARED_ILLUMINA': u'159', u'HOW_OFTEN_SEQUENCED': u'1', u'UNIQUE_BARCODES': u'OK', u'UL_EB': u' 3.1', u'FLOW_CELL_PROPERTIES': u'Illumina RTA Version: 1.17.21.3\nSequencer : QGF HiSeq2000 (Rua)\nRun type: SINGLE_READ\nNumber of cycles: 51\nFLOWCELLTYPE: HiSeq Flow Cell v3\nKit : TruSeq SBS Kit v3', u'CONCENTRATION_PREPARED_ILLUMINA': u'0.3', u'SEQUENCING_APPLICATION': u'SMALL_RNA_SEQ', u'BARCODE': u'AGTTCCG', u'BARCODE_COMPLEXITY_CHECKER': u'No Pool', u'CONTACT_PERSON_EMAIL': u'deni.subasic@imls.uzh.ch', u'INVOICE': u'false', 'LANE': u'140124_SN792_0311_AC36GVACXX:2', u'NCBI_ORGANISM_TAXONOMY': u'9606', u'EXTERNAL_SAMPLE_NAME': u'12_Q L3', u'CONTACT_PERSON_NAME': u'Deni Subasic', u'UL_EB_MISEQ': u' -3.8', u'NM_DNA': u' 2.90', u'PRINCIPAL_INVESTIGATOR_EMAIL': u'michael.hengartner@imls.uzh.ch', u'UL_DNA': u' 6.9', u'NUMBER_OF_ATTACHMENTS': u'0', u'PRINCIPAL_INVESTIGATOR_NAME': u'Michael Hengartner', u'SAMPLE_KIND': u'PROCESSED_DNA_LIBRARY', u'UL_STOCK': u'10', u'AFFILIATION': u'OTHER', u'UL_DNA_MISEQ': u' 13.8'}, u'BSSE_QGF_19934_140124_SN792_0311_AC36GVACXX_3': {u'HOW_OFTEN_SEQUENCED': u'1', u'UNIQUE_BARCODES': u'OK', u'UL_EB': u'0', u'FLOW_CELL_PROPERTIES': u'Illumina RTA Version: 1.17.21.3\nSequencer : QGF HiSeq2000 (Rua)\nRun type: SINGLE_READ\nNumber of cycles: 51\nFLOWCELLTYPE: HiSeq Flow Cell v3\nKit : TruSeq SBS Kit v3', u'SEQUENCING_APPLICATION': u'SMALL_RNA_SEQ', u'BARCODE': u'GGCTACA', u'BARCODE_COMPLEXITY_CHECKER': u'No Pool', u'CONTACT_PERSON_EMAIL': u'deni.subasic@imls.uzh.ch', u'INVOICE': u'false', 'LANE': u'140124_SN792_0311_AC36GVACXX:3', u'NCBI_ORGANISM_TAXONOMY': u'9606', u'EXTERNAL_SAMPLE_NAME': u'21_fox-1 3', u'CONTACT_PERSON_NAME': u'Deni Subasic', u'UL_EB_MISEQ': u'0', u'NM_DNA': u'0', u'PRINCIPAL_INVESTIGATOR_EMAIL': u'michael.hengartner@imls.uzh.ch', u'UL_DNA': u'0', u'NUMBER_OF_ATTACHMENTS': u'0', u'PRINCIPAL_INVESTIGATOR_NAME': u'Michael Hengartner', u'SAMPLE_KIND': u'PROCESSED_DNA_LIBRARY', u'AFFILIATION': u'OTHER', u'UL_DNA_MISEQ': u'0'}, u'BSSE_QGF_20042_140124_SN792_0311_AC36GVACXX_8': {u'QC_AT_DBSSE': u'false', u'UNIQUE_BARCODES': u'OK', u'UL_EB': u'0', u'FLOW_CELL_PROPERTIES': u'Illumina RTA Version: 1.17.21.3\nSequencer : QGF HiSeq2000 (Rua)\nRun type: SINGLE_READ\nNumber of cycles: 51\nFLOWCELLTYPE: HiSeq Flow Cell v3\nKit : TruSeq SBS Kit v3', u'CELL_PLASTICITY_SYSTEMSX': u'false', u'NCBI_ORGANISM_TAXONOMY': u'27434', u'LIBRARY_PROCESSING_SUCCESSFUL': u'false', u'HOW_OFTEN_SEQUENCED': u'1', u'BAREBACKED': u'false', u'SEQUENCING_APPLICATION': u'RNA_SEQ', u'BARCODE': u'CTTGTAA', u'BARCODE_COMPLEXITY_CHECKER': u'No Pool', u'CONTACT_PERSON_EMAIL': u'minwu@ethz.ch', u'INVOICE': u'false', 'LANE': u'140124_SN792_0311_AC36GVACXX:8', u'LIBRARY_PROCESSING_FAILED': u'false', u'CONTACT_PERSON_NAME': u'Min Wu', u'NM_DNA': u'0', u'LIBRARY_PROCESSING_POSSIBLE': u'false', u'NOTES': u'TruSeq Strande mRNA sample Prep Kit', u'PRINCIPAL_INVESTIGATOR_NAME': u'Mathias K\xf6lliker', u'AFFILIATION': u'OTHER', u'EXTERNAL_SAMPLE_NAME': u'26Ny', u'UL_EB_MISEQ': u'0', u'UL_DNA': u'0', u'PRINCIPAL_INVESTIGATOR_EMAIL': u'mathias.koelliker@unibas.ch', u'NUMBER_OF_ATTACHMENTS': u'0', u'SAMPLE_KIND': u'TOTAL_RNA', u'UL_DNA_MISEQ': u'0'}, u'BSSE_QGF_20033_140124_SN792_0311_AC36GVACXX_1': {u'QC_AT_DBSSE': u'true', u'FRAGMENT_SIZE_PREPARED_ILLUMINA': u'775', u'UNIQUE_BARCODES': u'OK', u'UL_EB': u' 18.6', u'FLOW_CELL_PROPERTIES': u'Illumina RTA Version: 1.17.21.3\nSequencer : QGF HiSeq2000 (Rua)\nRun type: SINGLE_READ\nNumber of cycles: 51\nFLOWCELLTYPE: HiSeq Flow Cell v3\nKit : TruSeq SBS Kit v3', u'CONCENTRATION_PREPARED_ILLUMINA': u'14.8', u'CELL_PLASTICITY_SYSTEMSX': u'false', u'NCBI_ORGANISM_TAXONOMY': u'3569', u'LIBRARY_PROCESSING_SUCCESSFUL': u'false', u'HOW_OFTEN_SEQUENCED': u'1', u'BAREBACKED': u'false', u'SEQUENCING_APPLICATION': u'GENOMIC_DNA_SEQ', u'END_TYPE': u'PAIRED_END', u'BARCODE': u'ATTCCTA', u'BARCODE_COMPLEXITY_CHECKER': u'No Pool', u'CONTACT_PERSON_EMAIL': u'simone.fior@env.ethz.ch', u'INVOICE': u'false', 'LANE': u'140124_SN792_0311_AC36GVACXX:1', u'PREPARED_BY': u'Simone', u'LIBRARY_PROCESSING_FAILED': u'false', u'CONTACT_PERSON_NAME': u'Fior Simone', u'NM_DNA': u' 29.38', u'CYCLES_REQUESTED_BY_CUSTOMER': u'100', u'LIBRARY_PROCESSING_POSSIBLE': u'false', u'PRINCIPAL_INVESTIGATOR_NAME': u'Alexander Widmer', u'NANO_DROP': u'CONCND3300', u'AFFILIATION': u'OTHER', u'EXTERNAL_SAMPLE_NAME': u'6_Dcar_Niedergampel', u'BIOLOGICAL_SAMPLE_ARRIVED': u'2013-12-16 12:00:00 +0100', u'KIT': u'NONE', u'UL_EB_MISEQ': u' 17.3', u'PRINCIPAL_INVESTIGATOR_EMAIL': u'alex.widmer@env.ethz.ch', u'UL_DNA': u' 1.4', u'NUMBER_OF_ATTACHMENTS': u'0', u'SAMPLE_KIND': u'GENOMIC_DNA', u'UL_STOCK': u'20', u'UL_DNA_MISEQ': u' 2.7'}, u'BSSE_QGF_20041_140124_SN792_0311_AC36GVACXX_8': {u'QC_AT_DBSSE': u'false', u'UNIQUE_BARCODES': u'OK', u'UL_EB': u'0', u'FLOW_CELL_PROPERTIES': u'Illumina RTA Version: 1.17.21.3\nSequencer : QGF HiSeq2000 (Rua)\nRun type: SINGLE_READ\nNumber of cycles: 51\nFLOWCELLTYPE: HiSeq Flow Cell v3\nKit : TruSeq SBS Kit v3', u'CELL_PLASTICITY_SYSTEMSX': u'false', u'NCBI_ORGANISM_TAXONOMY': u'27434', u'LIBRARY_PROCESSING_SUCCESSFUL': u'false', u'HOW_OFTEN_SEQUENCED': u'1', u'BAREBACKED': u'false', u'SEQUENCING_APPLICATION': u'RNA_SEQ', u'BARCODE': u'CAGATCA', u'BARCODE_COMPLEXITY_CHECKER': u'No Pool', u'CONTACT_PERSON_EMAIL': u'minwu@ethz.ch', u'INVOICE': u'false', 'LANE': u'140124_SN792_0311_AC36GVACXX:8', u'LIBRARY_PROCESSING_FAILED': u'false', u'CONTACT_PERSON_NAME': u'Min Wu', u'NM_DNA': u'0', u'LIBRARY_PROCESSING_POSSIBLE': u'false', u'NOTES': u'TruSeq Strande mRNA sample Prep Kit', u'PRINCIPAL_INVESTIGATOR_NAME': u'Mathias K\xf6lliker', u'AFFILIATION': u'OTHER', u'EXTERNAL_SAMPLE_NAME': u'16Ny', u'UL_EB_MISEQ': u'0', u'UL_DNA': u'0', u'PRINCIPAL_INVESTIGATOR_EMAIL': u'mathias.koelliker@unibas.ch', u'NUMBER_OF_ATTACHMENTS': u'0', u'SAMPLE_KIND': u'TOTAL_RNA', u'UL_DNA_MISEQ': u'0'}, u'BSSE_QGF_20016_140124_SN792_0311_AC36GVACXX_4': {u'QC_AT_DBSSE': u'false', u'UNIQUE_BARCODES': u'OK', u'UL_EB': u'0', u'FLOW_CELL_PROPERTIES': u'Sample got sequenced more than once. Please check the flow lane properties for detailed description!', u'STARTING_AMOUNT_OF_SAMPLE_IN_NG': u'2000', u'CELL_PLASTICITY_SYSTEMSX': u'false', u'NCBI_ORGANISM_TAXONOMY': u'9606', u'LIBRARY_PROCESSING_SUCCESSFUL': u'false', u'HOW_OFTEN_SEQUENCED': u'4', u'BAREBACKED': u'false', u'SEQUENCING_APPLICATION': u'GENOMIC_DNA_SEQ', u'BARCODE': u'GCCAATA', u'BARCODE_COMPLEXITY_CHECKER': u'No Pool', u'CONTACT_PERSON_EMAIL': u'Christine.Fritz@usz.ch', u'INVOICE': u'false', 'LANE': u'140124_SN792_0311_AC36GVACXX:4', u'PREPARED_BY': u'Ina', u'LIBRARY_PROCESSING_FAILED': u'false', u'CONTACT_PERSON_NAME': u'Fritz Christine', u'NM_DNA': u'0', u'LIBRARY_PROCESSING_POSSIBLE': u'false', u'PRINCIPAL_INVESTIGATOR_NAME': u'Peter Wild', u'AFFILIATION': u'OTHER', u'EXTERNAL_SAMPLE_NAME': u'6_G09.245 NO', u'BIOLOGICAL_SAMPLE_ARRIVED': u'2013-10-29 12:00:00 +0100', u'UL_EB_MISEQ': u'0', u'KIT': u'AGILENT_SURESELECT_ENRICHMENTSYSTEM', u'PRINCIPAL_INVESTIGATOR_EMAIL': u'peter.wild@usz.ch', u'UL_DNA': u'0', u'NUMBER_OF_ATTACHMENTS': u'0', u'SAMPLE_KIND': u'GENOMIC_DNA', u'UL_DNA_MISEQ': u'0'}, u'BSSE_QGF_20020_140124_SN792_0311_AC36GVACXX_4': {u'QC_AT_DBSSE': u'false', u'UNIQUE_BARCODES': u'OK', u'UL_EB': u'0', u'FLOW_CELL_PROPERTIES': u'Sample got sequenced more than once. Please check the flow lane properties for detailed description!', u'STARTING_AMOUNT_OF_SAMPLE_IN_NG': u'2000', u'CELL_PLASTICITY_SYSTEMSX': u'false', u'NCBI_ORGANISM_TAXONOMY': u'9606', u'LIBRARY_PROCESSING_SUCCESSFUL': u'false', u'HOW_OFTEN_SEQUENCED': u'4', u'BAREBACKED': u'false', u'SEQUENCING_APPLICATION': u'GENOMIC_DNA_SEQ', u'BARCODE': u'TAGCTTA', u'BARCODE_COMPLEXITY_CHECKER': u'No Pool', u'CONTACT_PERSON_EMAIL': u'Christine.Fritz@usz.ch', u'INVOICE': u'false', 'LANE': u'140124_SN792_0311_AC36GVACXX:4', u'PREPARED_BY': u'Ina', u'LIBRARY_PROCESSING_FAILED': u'false', u'CONTACT_PERSON_NAME': u'Fritz Christine', u'NM_DNA': u'0', u'LIBRARY_PROCESSING_POSSIBLE': u'false', u'PRINCIPAL_INVESTIGATOR_NAME': u'Peter Wild', u'AFFILIATION': u'OTHER', u'EXTERNAL_SAMPLE_NAME': u'10_G11.838 TA2', u'BIOLOGICAL_SAMPLE_ARRIVED': u'2013-10-29 12:00:00 +0100', u'UL_EB_MISEQ': u'0', u'KIT': u'AGILENT_SURESELECT_ENRICHMENTSYSTEM', u'PRINCIPAL_INVESTIGATOR_EMAIL': u'peter.wild@usz.ch', u'UL_DNA': u'0', u'NUMBER_OF_ATTACHMENTS': u'0', u'SAMPLE_KIND': u'GENOMIC_DNA', u'UL_DNA_MISEQ': u'0'}, u'BSSE_QGF_16028_140124_SN792_0311_AC36GVACXX_5': {u'QC_AT_DBSSE': u'false', u'UNIQUE_BARCODES': u'OK', u'UL_EB': u'0', u'FLOW_CELL_PROPERTIES': u'Sample got sequenced more than once. Please check the flow lane properties for detailed description!', u'CELL_PLASTICITY_SYSTEMSX': u'false', u'NCBI_ORGANISM_TAXONOMY': u'10847', u'LIBRARY_PROCESSING_SUCCESSFUL': u'false', u'HOW_OFTEN_SEQUENCED': u'24', u'BAREBACKED': u'false', u'SEQUENCING_APPLICATION': u'GENOMIC_DNA_SEQ', u'BARCODE_COMPLEXITY_CHECKER': u'No Pool', u'CONTACT_PERSON_EMAIL': u'ina.nissen@bsse.ethz.ch', u'INVOICE': u'false', 'LANE': u'140124_SN792_0311_AC36GVACXX:5', u'LOT': u'9306315', u'LIBRARY_PROCESSING_FAILED': u'false', u'CONTACT_PERSON_NAME': u'Ina Nissen', u'NM_DNA': u'0', u'LIBRARY_PROCESSING_POSSIBLE': u'false', u'PRINCIPAL_INVESTIGATOR_NAME': u'Christian Beisel', u'AFFILIATION': u'OTHER', u'EXTERNAL_SAMPLE_NAME': u'PhiX', u'UL_EB_MISEQ': u'0', u'KIT': u'NONE', u'UL_DNA': u'0', u'PRINCIPAL_INVESTIGATOR_EMAIL': u'christian.beisel@bsse.ethz.ch', u'NUMBER_OF_ATTACHMENTS': u'0', u'SAMPLE_KIND': u'GENOMIC_DNA', u'UL_DNA_MISEQ': u'0'}, u'BSSE_QGF_20018_140124_SN792_0311_AC36GVACXX_4': {u'QC_AT_DBSSE': u'false', u'UNIQUE_BARCODES': u'OK', u'UL_EB': u'0', u'FLOW_CELL_PROPERTIES': u'Sample got sequenced more than once. Please check the flow lane properties for detailed description!', u'STARTING_AMOUNT_OF_SAMPLE_IN_NG': u'1000', u'CELL_PLASTICITY_SYSTEMSX': u'false', u'NCBI_ORGANISM_TAXONOMY': u'9606', u'LIBRARY_PROCESSING_SUCCESSFUL': u'false', u'HOW_OFTEN_SEQUENCED': u'4', u'BAREBACKED': u'false', u'SEQUENCING_APPLICATION': u'GENOMIC_DNA_SEQ', u'BARCODE': u'ACTTGAA', u'BARCODE_COMPLEXITY_CHECKER': u'No Pool', u'CONTACT_PERSON_EMAIL': u'Christine.Fritz@usz.ch', u'INVOICE': u'false', 'LANE': u'140124_SN792_0311_AC36GVACXX:4', u'PREPARED_BY': u'Ina', u'LIBRARY_PROCESSING_FAILED': u'false', u'CONTACT_PERSON_NAME': u'Fritz Christine', u'NM_DNA': u'0', u'LIBRARY_PROCESSING_POSSIBLE': u'false', u'PRINCIPAL_INVESTIGATOR_NAME': u'Peter Wild', u'AFFILIATION': u'OTHER', u'EXTERNAL_SAMPLE_NAME': u'8_G11.838 NO', u'BIOLOGICAL_SAMPLE_ARRIVED': u'2013-10-29 12:00:00 +0100', u'UL_EB_MISEQ': u'0', u'KIT': u'AGILENT_SURESELECT_ENRICHMENTSYSTEM', u'PRINCIPAL_INVESTIGATOR_EMAIL': u'peter.wild@usz.ch', u'UL_DNA': u'0', u'NUMBER_OF_ATTACHMENTS': u'0', u'SAMPLE_KIND': u'GENOMIC_DNA', u'UL_DNA_MISEQ': u'0'}, u'BSSE_QGF_19956_140124_SN792_0311_AC36GVACXX_6': {u'QC_AT_DBSSE': u'false', u'FRAGMENT_SIZE_PREPARED_ILLUMINA': u'189', u'UNIQUE_BARCODES': u'OK', u'UL_EB': u'0', u'FLOW_CELL_PROPERTIES': u'Illumina RTA Version: 1.17.21.3\nSequencer : QGF HiSeq2000 (Rua)\nRun type: SINGLE_READ\nNumber of cycles: 51\nFLOWCELLTYPE: HiSeq Flow Cell v3\nKit : TruSeq SBS Kit v3', u'CELL_PLASTICITY_SYSTEMSX': u'false', u'NCBI_ORGANISM_TAXONOMY': u'9606', u'CONCENTRATION_FLOWLANE': u'13', u'LIBRARY_PROCESSING_SUCCESSFUL': u'false', u'HOW_OFTEN_SEQUENCED': u'2', u'BAREBACKED': u'false', u'SEQUENCING_APPLICATION': u'RNA_SEQ', u'CLUSTER_STATION': u'CBOT', u'END_TYPE': u'SINGLE_READ', u'BARCODE_COMPLEXITY_CHECKER': u'No Pool', u'CREATED_ON_CS': u'2014-01-23 12:00:00 +0100', u'CONTACT_PERSON_EMAIL': u'arnau.vinavilaseca@unibas.ch', u'INVOICE': u'false', 'LANE': u'140124_SN792_0311_AC36GVACXX:6', u'CLUSTER_GENERATION_KIT_VERSION': u'TRUSEQ_CBOT_HS_V3', u'PREPARED_BY': u'Arnau', u'LIBRARY_PROCESSING_FAILED': u'false', u'CONTACT_PERSON_NAME': u'Arnau Vina Vilaseca', u'REQUIRED_LANES': u'2', u'NM_DNA': u'0', u'CYCLES_REQUESTED_BY_CUSTOMER': u'58', u'LIBRARY_PROCESSING_POSSIBLE': u'false', u'PRINCIPAL_INVESTIGATOR_NAME': u'Mihaela Zavolan', u'NANO_DROP': u'CONCND3300', u'BARCODES': u'these are 12 samples pooled together with the True seq universal adaptor and personal internal barcode\n\nthe samples should run in two lanes.\n\nlet me know if any questions\n\nArnau', u'AFFILIATION': u'BIOCENTER_BASEL', u'EXTERNAL_SAMPLE_NAME': u'Ina-PseudoUridination', u'BIOLOGICAL_SAMPLE_ARRIVED': u'2014-01-13 12:00:00 +0100', u'KIT': u'NONE', u'UL_EB_MISEQ': u'0', u'PRINCIPAL_INVESTIGATOR_EMAIL': u'mihaela.zavolan@unibas.ch', u'UL_DNA': u'0', u'NUMBER_OF_ATTACHMENTS': u'2', u'CS_PROTOCOL_VERSION': u'v8', u'SAMPLE_KIND': u'SMALL_RNA', u'UL_DNA_MISEQ': u'0'}, u'BSSE_QGF_19930_140124_SN792_0311_AC36GVACXX_3': {u'FRAGMENT_SIZE_PREPARED_ILLUMINA': u'147', u'HOW_OFTEN_SEQUENCED': u'1', u'UNIQUE_BARCODES': u'OK', u'UL_EB': u' 18.7', u'FLOW_CELL_PROPERTIES': u'Illumina RTA Version: 1.17.21.3\nSequencer : QGF HiSeq2000 (Rua)\nRun type: SINGLE_READ\nNumber of cycles: 51\nFLOWCELLTYPE: HiSeq Flow Cell v3\nKit : TruSeq SBS Kit v3', u'CONCENTRATION_PREPARED_ILLUMINA': u'2.84', u'SEQUENCING_APPLICATION': u'SMALL_RNA_SEQ', u'BARCODE': u'ACAGTGA', u'BARCODE_COMPLEXITY_CHECKER': u'No Pool', u'CONTACT_PERSON_EMAIL': u'deni.subasic@imls.uzh.ch', u'INVOICE': u'false', 'LANE': u'140124_SN792_0311_AC36GVACXX:3', u'NCBI_ORGANISM_TAXONOMY': u'9606', u'EXTERNAL_SAMPLE_NAME': u'17_asd-1 2 (OLD)', u'CONTACT_PERSON_NAME': u'Deni Subasic', u'UL_EB_MISEQ': u' 17.3', u'NM_DNA': u' 29.72', u'PRINCIPAL_INVESTIGATOR_EMAIL': u'michael.hengartner@imls.uzh.ch', u'UL_DNA': u' 1.3', u'NUMBER_OF_ATTACHMENTS': u'0', u'PRINCIPAL_INVESTIGATOR_NAME': u'Michael Hengartner', u'SAMPLE_KIND': u'PROCESSED_DNA_LIBRARY', u'UL_STOCK': u'20', u'AFFILIATION': u'OTHER', u'UL_DNA_MISEQ': u' 2.7'}, u'BSSE_QGF_20012_140124_SN792_0311_AC36GVACXX_4': {u'QC_AT_DBSSE': u'false', u'UNIQUE_BARCODES': u'OK', u'UL_EB': u'0', u'FLOW_CELL_PROPERTIES': u'Sample got sequenced more than once. Please check the flow lane properties for detailed description!', u'STARTING_AMOUNT_OF_SAMPLE_IN_NG': u'2000', u'CELL_PLASTICITY_SYSTEMSX': u'false', u'NCBI_ORGANISM_TAXONOMY': u'9606', u'LIBRARY_PROCESSING_SUCCESSFUL': u'false', u'HOW_OFTEN_SEQUENCED': u'4', u'BAREBACKED': u'false', u'SEQUENCING_APPLICATION': u'GENOMIC_DNA_SEQ', u'BARCODE': u'CGATGTA', u'BARCODE_COMPLEXITY_CHECKER': u'No Pool', u'CONTACT_PERSON_EMAIL': u'Christine.Fritz@usz.ch', u'INVOICE': u'false', 'LANE': u'140124_SN792_0311_AC36GVACXX:4', u'PREPARED_BY': u'Ina', u'LIBRARY_PROCESSING_FAILED': u'false', u'CONTACT_PERSON_NAME': u'Fritz Christine', u'NM_DNA': u'0', u'LIBRARY_PROCESSING_POSSIBLE': u'false', u'PRINCIPAL_INVESTIGATOR_NAME': u'Peter Wild', u'AFFILIATION': u'OTHER', u'EXTERNAL_SAMPLE_NAME': u'2_G11.806 TA1', u'BIOLOGICAL_SAMPLE_ARRIVED': u'2013-10-29 12:00:00 +0100', u'UL_EB_MISEQ': u'0', u'KIT': u'AGILENT_SURESELECT_ENRICHMENTSYSTEM', u'PRINCIPAL_INVESTIGATOR_EMAIL': u'peter.wild@usz.ch', u'UL_DNA': u'0', u'NUMBER_OF_ATTACHMENTS': u'0', u'SAMPLE_KIND': u'GENOMIC_DNA', u'UL_DNA_MISEQ': u'0'}, u'BSSE_QGF_19923_140124_SN792_0311_AC36GVACXX_2': {u'FRAGMENT_SIZE_PREPARED_ILLUMINA': u'161', u'HOW_OFTEN_SEQUENCED': u'1', u'UNIQUE_BARCODES': u'OK', u'UL_EB': u' 6.2', u'FLOW_CELL_PROPERTIES': u'Illumina RTA Version: 1.17.21.3\nSequencer : QGF HiSeq2000 (Rua)\nRun type: SINGLE_READ\nNumber of cycles: 51\nFLOWCELLTYPE: HiSeq Flow Cell v3\nKit : TruSeq SBS Kit v3', u'CONCENTRATION_PREPARED_ILLUMINA': u'0.55', u'SEQUENCING_APPLICATION': u'SMALL_RNA_SEQ', u'BARCODE': u'AGTCAAC', u'BARCODE_COMPLEXITY_CHECKER': u'No Pool', u'CONTACT_PERSON_EMAIL': u'deni.subasic@imls.uzh.ch', u'INVOICE': u'false', 'LANE': u'140124_SN792_0311_AC36GVACXX:2', u'NCBI_ORGANISM_TAXONOMY': u'9606', u'EXTERNAL_SAMPLE_NAME': u'11_Q L2', u'CONTACT_PERSON_NAME': u'Deni Subasic', u'UL_EB_MISEQ': u' 2.4', u'NM_DNA': u' 5.26', u'PRINCIPAL_INVESTIGATOR_EMAIL': u'michael.hengartner@imls.uzh.ch', u'UL_DNA': u' 3.8', u'NUMBER_OF_ATTACHMENTS': u'0', u'PRINCIPAL_INVESTIGATOR_NAME': u'Michael Hengartner', u'SAMPLE_KIND': u'PROCESSED_DNA_LIBRARY', u'UL_STOCK': u'10', u'AFFILIATION': u'OTHER', u'UL_DNA_MISEQ': u' 7.6'}, u'BSSE_QGF_20043_140124_SN792_0311_AC36GVACXX_8': {u'QC_AT_DBSSE': u'false', u'UNIQUE_BARCODES': u'OK', u'UL_EB': u'0', u'FLOW_CELL_PROPERTIES': u'Illumina RTA Version: 1.17.21.3\nSequencer : QGF HiSeq2000 (Rua)\nRun type: SINGLE_READ\nNumber of cycles: 51\nFLOWCELLTYPE: HiSeq Flow Cell v3\nKit : TruSeq SBS Kit v3', u'CELL_PLASTICITY_SYSTEMSX': u'false', u'NCBI_ORGANISM_TAXONOMY': u'27434', u'LIBRARY_PROCESSING_SUCCESSFUL': u'false', u'HOW_OFTEN_SEQUENCED': u'1', u'BAREBACKED': u'false', u'SEQUENCING_APPLICATION': u'RNA_SEQ', u'BARCODE': u'AGTCAAC', u'BARCODE_COMPLEXITY_CHECKER': u'No Pool', u'CONTACT_PERSON_EMAIL': u'minwu@ethz.ch', u'INVOICE': u'false', 'LANE': u'140124_SN792_0311_AC36GVACXX:8', u'LIBRARY_PROCESSING_FAILED': u'false', u'CONTACT_PERSON_NAME': u'Min Wu', u'NM_DNA': u'0', u'LIBRARY_PROCESSING_POSSIBLE': u'false', u'NOTES': u'TruSeq Strande mRNA sample Prep Kit', u'PRINCIPAL_INVESTIGATOR_NAME': u'Mathias K\xf6lliker', u'AFFILIATION': u'OTHER', u'EXTERNAL_SAMPLE_NAME': u'14Ny', u'UL_EB_MISEQ': u'0', u'UL_DNA': u'0', u'PRINCIPAL_INVESTIGATOR_EMAIL': u'mathias.koelliker@unibas.ch', u'NUMBER_OF_ATTACHMENTS': u'0', u'SAMPLE_KIND': u'TOTAL_RNA', u'UL_DNA_MISEQ': u'0'}, u'BSSE_QGF_19929_140124_SN792_0311_AC36GVACXX_3': {u'FRAGMENT_SIZE_PREPARED_ILLUMINA': u'153', u'HOW_OFTEN_SEQUENCED': u'1', u'UNIQUE_BARCODES': u'OK', u'UL_EB': u' 19.0', u'FLOW_CELL_PROPERTIES': u'Illumina RTA Version: 1.17.21.3\nSequencer : QGF HiSeq2000 (Rua)\nRun type: SINGLE_READ\nNumber of cycles: 51\nFLOWCELLTYPE: HiSeq Flow Cell v3\nKit : TruSeq SBS Kit v3', u'CONCENTRATION_PREPARED_ILLUMINA': u'3.9', u'SEQUENCING_APPLICATION': u'SMALL_RNA_SEQ', u'BARCODE': u'TGACCAA', u'BARCODE_COMPLEXITY_CHECKER': u'No Pool', u'CONTACT_PERSON_EMAIL': u'deni.subasic@imls.uzh.ch', u'INVOICE': u'false', 'LANE': u'140124_SN792_0311_AC36GVACXX:3', u'NCBI_ORGANISM_TAXONOMY': u'9606', u'EXTERNAL_SAMPLE_NAME': u'16_asd-1 1 (OLD)', u'CONTACT_PERSON_NAME': u'Deni Subasic', u'UL_EB_MISEQ': u' 18.0', u'NM_DNA': u' 39.22', u'PRINCIPAL_INVESTIGATOR_EMAIL': u'michael.hengartner@imls.uzh.ch', u'UL_DNA': u' 1.0', u'NUMBER_OF_ATTACHMENTS': u'0', u'PRINCIPAL_INVESTIGATOR_NAME': u'Michael Hengartner', u'SAMPLE_KIND': u'PROCESSED_DNA_LIBRARY', u'UL_STOCK': u'20', u'AFFILIATION': u'OTHER', u'UL_DNA_MISEQ': u' 2.0'}, u'BSSE_QGF_19919_140124_SN792_0311_AC36GVACXX_2': {u'FRAGMENT_SIZE_PREPARED_ILLUMINA': u'162', u'HOW_OFTEN_SEQUENCED': u'1', u'UNIQUE_BARCODES': u'OK', u'UL_EB': u' 19.1', u'FLOW_CELL_PROPERTIES': u'Illumina RTA Version: 1.17.21.3\nSequencer : QGF HiSeq2000 (Rua)\nRun type: SINGLE_READ\nNumber of cycles: 51\nFLOWCELLTYPE: HiSeq Flow Cell v3\nKit : TruSeq SBS Kit v3', u'CONCENTRATION_PREPARED_ILLUMINA': u'4.89', u'SEQUENCING_APPLICATION': u'SMALL_RNA_SEQ', u'BARCODE': u'CAGATCA', u'BARCODE_COMPLEXITY_CHECKER': u'No Pool', u'CONTACT_PERSON_EMAIL': u'deni.subasic@imls.uzh.ch', u'INVOICE': u'false', 'LANE': u'140124_SN792_0311_AC36GVACXX:2', u'NCBI_ORGANISM_TAXONOMY': u'9606', u'EXTERNAL_SAMPLE_NAME': u'7_58 80 L1', u'CONTACT_PERSON_NAME': u'Deni Subasic', u'UL_EB_MISEQ': u' 18.3', u'NM_DNA': u' 46.44', u'PRINCIPAL_INVESTIGATOR_EMAIL': u'michael.hengartner@imls.uzh.ch', u'UL_DNA': u' 0.9', u'NUMBER_OF_ATTACHMENTS': u'0', u'PRINCIPAL_INVESTIGATOR_NAME': u'Michael Hengartner', u'SAMPLE_KIND': u'PROCESSED_DNA_LIBRARY', u'UL_STOCK': u'20', u'AFFILIATION': u'OTHER', u'UL_DNA_MISEQ': u' 1.7'}, u'BSSE_QGF_19925_140124_SN792_0311_AC36GVACXX_2': {u'QC_AT_DBSSE': u'true', u'UNIQUE_BARCODES': u'OK', u'UL_EB': u'0', u'FLOW_CELL_PROPERTIES': u'Illumina RTA Version: 1.17.21.3\nSequencer : QGF HiSeq2000 (Rua)\nRun type: SINGLE_READ\nNumber of cycles: 51\nFLOWCELLTYPE: HiSeq Flow Cell v3\nKit : TruSeq SBS Kit v3', u'CELL_PLASTICITY_SYSTEMSX': u'false', u'NCBI_ORGANISM_TAXONOMY': u'9606', u'CONCENTRATION_FLOWLANE': u'12', u'LIBRARY_PROCESSING_SUCCESSFUL': u'false', u'HOW_OFTEN_SEQUENCED': u'1', u'BAREBACKED': u'false', u'SEQUENCING_APPLICATION': u'SMALL_RNA_SEQ', u'CLUSTER_STATION': u'CBOT', u'END_TYPE': u'SINGLE_READ', u'BARCODE_COMPLEXITY_CHECKER': u'OK', u'CREATED_ON_CS': u'2014-01-23 12:00:00 +0100', u'CONTACT_PERSON_EMAIL': u'deni.subasic@imls.uzh.ch', u'INVOICE': u'false', 'LANE': u'140124_SN792_0311_AC36GVACXX:2', u'PREPARED_BY': u'Deni', u'LIBRARY_PROCESSING_FAILED': u'false', u'CONTACT_PERSON_NAME': u'Deni Subasic', u'REQUIRED_LANES': u'1', u'NM_DNA': u'0', u'CYCLES_REQUESTED_BY_CUSTOMER': u'58', u'LIBRARY_PROCESSING_POSSIBLE': u'false', u'PRINCIPAL_INVESTIGATOR_NAME': u'Michael Hengartner', u'NANO_DROP': u'CONCND3300', u'AFFILIATION': u'OTHER', u'DNA_CONCENTRATION_OF_LIBRARY': u'2', u'EXTERNAL_SAMPLE_NAME': u'Pool 1(1-12)', u'BIOLOGICAL_SAMPLE_ARRIVED': u'2013-12-17 12:00:00 +0100', u'UL_EB_MISEQ': u'0', u'KIT': u'NONE', u'PRINCIPAL_INVESTIGATOR_EMAIL': u'michael.hengartner@imls.uzh.ch', u'UL_DNA': u'0', u'NUMBER_OF_ATTACHMENTS': u'8', u'SAMPLE_KIND': u'PROCESSED_DNA_LIBRARY', u'CS_PROTOCOL_VERSION': u'v8', u'UL_DNA_MISEQ': u'0'}, u'BSSE_QGF_19935_140124_SN792_0311_AC36GVACXX_3': {u'FRAGMENT_SIZE_PREPARED_ILLUMINA': u'162', u'HOW_OFTEN_SEQUENCED': u'1', u'UNIQUE_BARCODES': u'OK', u'UL_EB': u' 7.9', u'FLOW_CELL_PROPERTIES': u'Illumina RTA Version: 1.17.21.3\nSequencer : QGF HiSeq2000 (Rua)\nRun type: SINGLE_READ\nNumber of cycles: 51\nFLOWCELLTYPE: HiSeq Flow Cell v3\nKit : TruSeq SBS Kit v3', u'CONCENTRATION_PREPARED_ILLUMINA': u'1.01', u'SEQUENCING_APPLICATION': u'SMALL_RNA_SEQ', u'BARCODE': u'CTTGTAA', u'BARCODE_COMPLEXITY_CHECKER': u'No Pool', u'CONTACT_PERSON_EMAIL': u'deni.subasic@imls.uzh.ch', u'INVOICE': u'false', 'LANE': u'140124_SN792_0311_AC36GVACXX:3', u'NCBI_ORGANISM_TAXONOMY': u'9606', u'EXTERNAL_SAMPLE_NAME': u'22_fox-1 asd-1 1', u'CONTACT_PERSON_NAME': u'Deni Subasic', u'UL_EB_MISEQ': u' 5.8', u'NM_DNA': u' 9.59', u'PRINCIPAL_INVESTIGATOR_EMAIL': u'michael.hengartner@imls.uzh.ch', u'UL_DNA': u' 2.1', u'NUMBER_OF_ATTACHMENTS': u'0', u'PRINCIPAL_INVESTIGATOR_NAME': u'Michael Hengartner', u'SAMPLE_KIND': u'PROCESSED_DNA_LIBRARY', u'UL_STOCK': u'10', u'AFFILIATION': u'OTHER', u'UL_DNA_MISEQ': u' 4.2'}, u'BSSE_QGF_20037_140124_SN792_0311_AC36GVACXX_8': {u'QC_AT_DBSSE': u'false', u'UNIQUE_BARCODES': u'OK', u'UL_EB': u'0', u'FLOW_CELL_PROPERTIES': u'Illumina RTA Version: 1.17.21.3\nSequencer : QGF HiSeq2000 (Rua)\nRun type: SINGLE_READ\nNumber of cycles: 51\nFLOWCELLTYPE: HiSeq Flow Cell v3\nKit : TruSeq SBS Kit v3', u'CELL_PLASTICITY_SYSTEMSX': u'false', u'NCBI_ORGANISM_TAXONOMY': u'27434', u'LIBRARY_PROCESSING_SUCCESSFUL': u'false', u'HOW_OFTEN_SEQUENCED': u'1', u'BAREBACKED': u'false', u'SEQUENCING_APPLICATION': u'RNA_SEQ', u'BARCODE': u'CGATGTA', u'BARCODE_COMPLEXITY_CHECKER': u'No Pool', u'CONTACT_PERSON_EMAIL': u'minwu@ethz.ch', u'INVOICE': u'false', 'LANE': u'140124_SN792_0311_AC36GVACXX:8', u'LIBRARY_PROCESSING_FAILED': u'false', u'CONTACT_PERSON_NAME': u'Min Wu', u'NM_DNA': u'0', u'LIBRARY_PROCESSING_POSSIBLE': u'false', u'NOTES': u'TruSeq Strande mRNA sample Prep Kit', u'PRINCIPAL_INVESTIGATOR_NAME': u'Mathias K\xf6lliker', u'AFFILIATION': u'OTHER', u'EXTERNAL_SAMPLE_NAME': u'14An', u'UL_EB_MISEQ': u'0', u'UL_DNA': u'0', u'PRINCIPAL_INVESTIGATOR_EMAIL': u'mathias.koelliker@unibas.ch', u'NUMBER_OF_ATTACHMENTS': u'0', u'SAMPLE_KIND': u'TOTAL_RNA', u'UL_DNA_MISEQ': u'0'}, u'BSSE_QGF_20044_140124_SN792_0311_AC36GVACXX_8': {u'QC_AT_DBSSE': u'false', u'UNIQUE_BARCODES': u'OK', u'UL_EB': u'0', u'FLOW_CELL_PROPERTIES': u'Illumina RTA Version: 1.17.21.3\nSequencer : QGF HiSeq2000 (Rua)\nRun type: SINGLE_READ\nNumber of cycles: 51\nFLOWCELLTYPE: HiSeq Flow Cell v3\nKit : TruSeq SBS Kit v3', u'CELL_PLASTICITY_SYSTEMSX': u'false', u'NCBI_ORGANISM_TAXONOMY': u'27434', u'LIBRARY_PROCESSING_SUCCESSFUL': u'false', u'HOW_OFTEN_SEQUENCED': u'1', u'BAREBACKED': u'false', u'SEQUENCING_APPLICATION': u'RNA_SEQ', u'BARCODE': u'AGTTCCG', u'BARCODE_COMPLEXITY_CHECKER': u'No Pool', u'CONTACT_PERSON_EMAIL': u'minwu@ethz.ch', u'INVOICE': u'false', 'LANE': u'140124_SN792_0311_AC36GVACXX:8', u'LIBRARY_PROCESSING_FAILED': u'false', u'CONTACT_PERSON_NAME': u'Min Wu', u'NM_DNA': u'0', u'LIBRARY_PROCESSING_POSSIBLE': u'false', u'NOTES': u'TruSeq Strande mRNA sample Prep Kit', u'PRINCIPAL_INVESTIGATOR_NAME': u'Mathias K\xf6lliker', u'AFFILIATION': u'OTHER', u'EXTERNAL_SAMPLE_NAME': u'37Ny', u'UL_EB_MISEQ': u'0', u'UL_DNA': u'0', u'PRINCIPAL_INVESTIGATOR_EMAIL': u'mathias.koelliker@unibas.ch', u'NUMBER_OF_ATTACHMENTS': u'0', u'SAMPLE_KIND': u'TOTAL_RNA', u'UL_DNA_MISEQ': u'0'}, u'BSSE_QGF_20019_140124_SN792_0311_AC36GVACXX_4': {u'QC_AT_DBSSE': u'false', u'UNIQUE_BARCODES': u'OK', u'UL_EB': u'0', u'FLOW_CELL_PROPERTIES': u'Sample got sequenced more than once. Please check the flow lane properties for detailed description!', u'STARTING_AMOUNT_OF_SAMPLE_IN_NG': u'1000', u'CELL_PLASTICITY_SYSTEMSX': u'false', u'NCBI_ORGANISM_TAXONOMY': u'9606', u'LIBRARY_PROCESSING_SUCCESSFUL': u'false', u'HOW_OFTEN_SEQUENCED': u'4', u'BAREBACKED': u'false', u'SEQUENCING_APPLICATION': u'GENOMIC_DNA_SEQ', u'BARCODE': u'GATCAGA', u'BARCODE_COMPLEXITY_CHECKER': u'No Pool', u'CONTACT_PERSON_EMAIL': u'Christine.Fritz@usz.ch', u'INVOICE': u'false', 'LANE': u'140124_SN792_0311_AC36GVACXX:4', u'PREPARED_BY': u'Ina', u'LIBRARY_PROCESSING_FAILED': u'false', u'CONTACT_PERSON_NAME': u'Fritz Christine', u'NM_DNA': u'0', u'LIBRARY_PROCESSING_POSSIBLE': u'false', u'PRINCIPAL_INVESTIGATOR_NAME': u'Peter Wild', u'AFFILIATION': u'OTHER', u'EXTERNAL_SAMPLE_NAME': u'9_G11.838 TA1', u'BIOLOGICAL_SAMPLE_ARRIVED': u'2013-10-29 12:00:00 +0100', u'KIT': u'AGILENT_SURESELECT_ENRICHMENTSYSTEM', u'UL_EB_MISEQ': u'0', u'PRINCIPAL_INVESTIGATOR_EMAIL': u'peter.wild@usz.ch', u'UL_DNA': u'0', u'NUMBER_OF_ATTACHMENTS': u'0', u'SAMPLE_KIND': u'GENOMIC_DNA', u'UL_DNA_MISEQ': u'0'}, u'BSSE_QGF_19926_140124_SN792_0311_AC36GVACXX_3': {u'FRAGMENT_SIZE_PREPARED_ILLUMINA': u'160', u'HOW_OFTEN_SEQUENCED': u'1', u'UNIQUE_BARCODES': u'OK', u'UL_EB': u' 5.8', u'FLOW_CELL_PROPERTIES': u'Illumina RTA Version: 1.17.21.3\nSequencer : QGF HiSeq2000 (Rua)\nRun type: SINGLE_READ\nNumber of cycles: 51\nFLOWCELLTYPE: HiSeq Flow Cell v3\nKit : TruSeq SBS Kit v3', u'CONCENTRATION_PREPARED_ILLUMINA': u'0.49', u'SEQUENCING_APPLICATION': u'SMALL_RNA_SEQ', u'BARCODE': u'ATCACGA', u'BARCODE_COMPLEXITY_CHECKER': u'No Pool', u'CONTACT_PERSON_EMAIL': u'deni.subasic@imls.uzh.ch', u'INVOICE': u'false', 'LANE': u'140124_SN792_0311_AC36GVACXX:3', u'NCBI_ORGANISM_TAXONOMY': u'9606', u'EXTERNAL_SAMPLE_NAME': u'13_wt (N2) 1 (OLD)', u'CONTACT_PERSON_NAME': u'Deni Subasic', u'UL_EB_MISEQ': u' 1.5', u'NM_DNA': u' 4.71', u'PRINCIPAL_INVESTIGATOR_EMAIL': u'michael.hengartner@imls.uzh.ch', u'UL_DNA': u' 4.2', u'NUMBER_OF_ATTACHMENTS': u'0', u'PRINCIPAL_INVESTIGATOR_NAME': u'Michael Hengartner', u'SAMPLE_KIND': u'PROCESSED_DNA_LIBRARY', u'UL_STOCK': u'10', u'AFFILIATION': u'OTHER', u'UL_DNA_MISEQ': u' 8.5'}, u'BSSE_QGF_20021_140124_SN792_0311_AC36GVACXX_4': {u'QC_AT_DBSSE': u'false', u'UNIQUE_BARCODES': u'OK', u'UL_EB': u'0', u'FLOW_CELL_PROPERTIES': u'Sample got sequenced more than once. Please check the flow lane properties for detailed description!', u'STARTING_AMOUNT_OF_SAMPLE_IN_NG': u'1000', u'CELL_PLASTICITY_SYSTEMSX': u'false', u'NCBI_ORGANISM_TAXONOMY': u'9606', u'LIBRARY_PROCESSING_SUCCESSFUL': u'false', u'HOW_OFTEN_SEQUENCED': u'4', u'BAREBACKED': u'false', u'SEQUENCING_APPLICATION': u'GENOMIC_DNA_SEQ', u'BARCODE': u'GGCTACA', u'BARCODE_COMPLEXITY_CHECKER': u'No Pool', u'CONTACT_PERSON_EMAIL': u'Christine.Fritz@usz.ch', u'INVOICE': u'false', 'LANE': u'140124_SN792_0311_AC36GVACXX:4', u'PREPARED_BY': u'Ina', u'LIBRARY_PROCESSING_FAILED': u'false', u'CONTACT_PERSON_NAME': u'Fritz Christine', u'NM_DNA': u'0', u'LIBRARY_PROCESSING_POSSIBLE': u'false', u'PRINCIPAL_INVESTIGATOR_NAME': u'Peter Wild', u'AFFILIATION': u'OTHER', u'EXTERNAL_SAMPLE_NAME': u'11_G09.258 NO', u'BIOLOGICAL_SAMPLE_ARRIVED': u'2013-10-29 12:00:00 +0100', u'KIT': u'AGILENT_SURESELECT_ENRICHMENTSYSTEM', u'UL_EB_MISEQ': u'0', u'PRINCIPAL_INVESTIGATOR_EMAIL': u'peter.wild@usz.ch', u'UL_DNA': u'0', u'NUMBER_OF_ATTACHMENTS': u'0', u'SAMPLE_KIND': u'GENOMIC_DNA', u'UL_DNA_MISEQ': u'0'}, u'BSSE_QGF_19936_140124_SN792_0311_AC36GVACXX_3': {u'FRAGMENT_SIZE_PREPARED_ILLUMINA': u'163', u'HOW_OFTEN_SEQUENCED': u'1', u'UNIQUE_BARCODES': u'OK', u'UL_EB': u' 5.8', u'FLOW_CELL_PROPERTIES': u'Illumina RTA Version: 1.17.21.3\nSequencer : QGF HiSeq2000 (Rua)\nRun type: SINGLE_READ\nNumber of cycles: 51\nFLOWCELLTYPE: HiSeq Flow Cell v3\nKit : TruSeq SBS Kit v3', u'CONCENTRATION_PREPARED_ILLUMINA': u'0.5', u'SEQUENCING_APPLICATION': u'SMALL_RNA_SEQ', u'BARCODE': u'AGTCAAC', u'BARCODE_COMPLEXITY_CHECKER': u'No Pool', u'CONTACT_PERSON_EMAIL': u'deni.subasic@imls.uzh.ch', u'INVOICE': u'false', 'LANE': u'140124_SN792_0311_AC36GVACXX:3', u'NCBI_ORGANISM_TAXONOMY': u'9606', u'EXTERNAL_SAMPLE_NAME': u'23_fox-1 asd-1 2', u'CONTACT_PERSON_NAME': u'Deni Subasic', u'UL_EB_MISEQ': u' 1.5', u'NM_DNA': u' 4.72', u'PRINCIPAL_INVESTIGATOR_EMAIL': u'michael.hengartner@imls.uzh.ch', u'UL_DNA': u' 4.2', u'NUMBER_OF_ATTACHMENTS': u'0', u'PRINCIPAL_INVESTIGATOR_NAME': u'Michael Hengartner', u'SAMPLE_KIND': u'PROCESSED_DNA_LIBRARY', u'UL_STOCK': u'10', u'AFFILIATION': u'OTHER', u'UL_DNA_MISEQ': u' 8.5'}, u'BSSE_QGF_20040_140124_SN792_0311_AC36GVACXX_8': {u'QC_AT_DBSSE': u'false', u'UNIQUE_BARCODES': u'OK', u'UL_EB': u'0', u'FLOW_CELL_PROPERTIES': u'Illumina RTA Version: 1.17.21.3\nSequencer : QGF HiSeq2000 (Rua)\nRun type: SINGLE_READ\nNumber of cycles: 51\nFLOWCELLTYPE: HiSeq Flow Cell v3\nKit : TruSeq SBS Kit v3', u'CELL_PLASTICITY_SYSTEMSX': u'false', u'NCBI_ORGANISM_TAXONOMY': u'27434', u'LIBRARY_PROCESSING_SUCCESSFUL': u'false', u'HOW_OFTEN_SEQUENCED': u'1', u'BAREBACKED': u'false', u'SEQUENCING_APPLICATION': u'RNA_SEQ', u'BARCODE': u'GCCAATA', u'BARCODE_COMPLEXITY_CHECKER': u'No Pool', u'CONTACT_PERSON_EMAIL': u'minwu@ethz.ch', u'INVOICE': u'false', 'LANE': u'140124_SN792_0311_AC36GVACXX:8', u'LIBRARY_PROCESSING_FAILED': u'false', u'CONTACT_PERSON_NAME': u'Min Wu', u'NM_DNA': u'0', u'LIBRARY_PROCESSING_POSSIBLE': u'false', u'NOTES': u'TruSeq Strande mRNA sample Prep Kit', u'PRINCIPAL_INVESTIGATOR_NAME': u'Mathias K\xf6lliker', u'AFFILIATION': u'OTHER', u'EXTERNAL_SAMPLE_NAME': u'37Br', u'UL_EB_MISEQ': u'0', u'UL_DNA': u'0', u'PRINCIPAL_INVESTIGATOR_EMAIL': u'mathias.koelliker@unibas.ch', u'NUMBER_OF_ATTACHMENTS': u'0', u'SAMPLE_KIND': u'TOTAL_RNA', u'UL_DNA_MISEQ': u'0'}, u'BSSE_QGF_19938_140124_SN792_0311_AC36GVACXX_3': {u'QC_AT_DBSSE': u'false', u'UNIQUE_BARCODES': u'OK', u'UL_EB': u'0', u'FLOW_CELL_PROPERTIES': u'Illumina RTA Version: 1.17.21.3\nSequencer : QGF HiSeq2000 (Rua)\nRun type: SINGLE_READ\nNumber of cycles: 51\nFLOWCELLTYPE: HiSeq Flow Cell v3\nKit : TruSeq SBS Kit v3', u'CELL_PLASTICITY_SYSTEMSX': u'false', u'NCBI_ORGANISM_TAXONOMY': u'9606', u'CONCENTRATION_FLOWLANE': u'12', u'LIBRARY_PROCESSING_SUCCESSFUL': u'false', u'HOW_OFTEN_SEQUENCED': u'1', u'BAREBACKED': u'false', u'SEQUENCING_APPLICATION': u'SMALL_RNA_SEQ', u'CLUSTER_STATION': u'CBOT', u'BARCODE_COMPLEXITY_CHECKER': u'OK', u'CREATED_ON_CS': u'2014-01-23 12:00:00 +0100', u'CONTACT_PERSON_EMAIL': u'deni.subasic@imls.uzh.ch', u'INVOICE': u'false', 'LANE': u'140124_SN792_0311_AC36GVACXX:3', u'CLUSTER_GENERATION_KIT_VERSION': u'TRUSEQ_CBOT_HS_V3', u'PREPARED_BY': u'Deni', u'LIBRARY_PROCESSING_FAILED': u'false', u'CONTACT_PERSON_NAME': u'Deni Subasic', u'NM_DNA': u'0', u'LIBRARY_PROCESSING_POSSIBLE': u'false', u'PRINCIPAL_INVESTIGATOR_NAME': u'Michael Hengartner', u'NANO_DROP': u'CONCND3300', u'AFFILIATION': u'OTHER', u'DNA_CONCENTRATION_OF_LIBRARY': u'2', u'EXTERNAL_SAMPLE_NAME': u'Pool 2 (13-24)', u'BIOLOGICAL_SAMPLE_ARRIVED': u'2013-12-17 12:00:00 +0100', u'UL_EB_MISEQ': u'0', u'KIT': u'NONE', u'PRINCIPAL_INVESTIGATOR_EMAIL': u'michael.hengartner@imls.uzh.ch', u'UL_DNA': u'0', u'NUMBER_OF_ATTACHMENTS': u'0', u'SAMPLE_KIND': u'PROCESSED_DNA_LIBRARY', u'CS_PROTOCOL_VERSION': u'v8', u'UL_DNA_MISEQ': u'0'}, u'BSSE_QGF_20026_140124_SN792_0311_AC36GVACXX_4': {u'QC_AT_DBSSE': u'false', u'UNIQUE_BARCODES': u'OK', u'UL_EB': u'0', u'FLOW_CELL_PROPERTIES': u'Illumina RTA Version: 1.17.21.3\nSequencer : QGF HiSeq2000 (Rua)\nRun type: SINGLE_READ\nNumber of cycles: 51\nFLOWCELLTYPE: HiSeq Flow Cell v3\nKit : TruSeq SBS Kit v3', u'CELL_PLASTICITY_SYSTEMSX': u'false', u'NCBI_ORGANISM_TAXONOMY': u'9606', u'CONCENTRATION_FLOWLANE': u'12', u'LIBRARY_PROCESSING_SUCCESSFUL': u'false', u'HOW_OFTEN_SEQUENCED': u'1', u'BAREBACKED': u'false', u'SEQUENCING_APPLICATION': u'GENOMIC_DNA_SEQ', u'CLUSTER_STATION': u'CBOT', u'END_TYPE': u'SINGLE_READ', u'BARCODE_COMPLEXITY_CHECKER': u'OK', u'CREATED_ON_CS': u'2014-01-24 12:00:00 +0100', u'CONTACT_PERSON_EMAIL': u'Christine.Fritz@usz.ch', u'INVOICE': u'false', 'LANE': u'140124_SN792_0311_AC36GVACXX:4', u'CLUSTER_GENERATION_KIT_VERSION': u'TRUSEQ_CBOT_HS_V3', u'PREPARED_BY': u'Ina', u'LIBRARY_PROCESSING_FAILED': u'false', u'CONTACT_PERSON_NAME': u'Fritz Christine', u'REQUIRED_LANES': u'1', u'NM_DNA': u'0', u'CYCLES_REQUESTED_BY_CUSTOMER': u'50', u'LIBRARY_PROCESSING_POSSIBLE': u'false', u'NOTES': u'Test', u'PRINCIPAL_INVESTIGATOR_NAME': u'Peter Wild', u'AFFILIATION': u'OTHER', u'EXTERNAL_SAMPLE_NAME': u'Pool_Exome 23.01.14', u'BIOLOGICAL_SAMPLE_ARRIVED': u'2013-10-29 12:00:00 +0100', u'UL_EB_MISEQ': u'0', u'KIT': u'AGILENT_SURESELECT_ENRICHMENTSYSTEM', u'PRINCIPAL_INVESTIGATOR_EMAIL': u'peter.wild@usz.ch', u'UL_DNA': u'0', u'NUMBER_OF_ATTACHMENTS': u'2', u'SAMPLE_KIND': u'GENOMIC_DNA', u'UL_DNA_MISEQ': u'0'}, u'BSSE_QGF_19921_140124_SN792_0311_AC36GVACXX_2': {u'FRAGMENT_SIZE_PREPARED_ILLUMINA': u'200', u'HOW_OFTEN_SEQUENCED': u'1', u'UNIQUE_BARCODES': u'OK', u'UL_EB': u' 19.1', u'FLOW_CELL_PROPERTIES': u'Illumina RTA Version: 1.17.21.3\nSequencer : QGF HiSeq2000 (Rua)\nRun type: SINGLE_READ\nNumber of cycles: 51\nFLOWCELLTYPE: HiSeq Flow Cell v3\nKit : TruSeq SBS Kit v3', u'CONCENTRATION_PREPARED_ILLUMINA': u'5.91', u'SEQUENCING_APPLICATION': u'SMALL_RNA_SEQ', u'BARCODE': u'GGCTACA', u'BARCODE_COMPLEXITY_CHECKER': u'No Pool', u'CONTACT_PERSON_EMAIL': u'deni.subasic@imls.uzh.ch', u'INVOICE': u'false', 'LANE': u'140124_SN792_0311_AC36GVACXX:2', u'NCBI_ORGANISM_TAXONOMY': u'9606', u'EXTERNAL_SAMPLE_NAME': u'9_58 80 L3', u'CONTACT_PERSON_NAME': u'Deni Subasic', u'UL_EB_MISEQ': u' 18.2', u'NM_DNA': u' 45.46', u'PRINCIPAL_INVESTIGATOR_EMAIL': u'michael.hengartner@imls.uzh.ch', u'UL_DNA': u' 0.9', u'NUMBER_OF_ATTACHMENTS': u'0', u'PRINCIPAL_INVESTIGATOR_NAME': u'Michael Hengartner', u'SAMPLE_KIND': u'PROCESSED_DNA_LIBRARY', u'UL_STOCK': u'20', u'AFFILIATION': u'OTHER', u'UL_DNA_MISEQ': u' 1.8'}, u'BSSE_QGF_20038_140124_SN792_0311_AC36GVACXX_8': {u'QC_AT_DBSSE': u'false', u'UNIQUE_BARCODES': u'OK', u'UL_EB': u'0', u'FLOW_CELL_PROPERTIES': u'Illumina RTA Version: 1.17.21.3\nSequencer : QGF HiSeq2000 (Rua)\nRun type: SINGLE_READ\nNumber of cycles: 51\nFLOWCELLTYPE: HiSeq Flow Cell v3\nKit : TruSeq SBS Kit v3', u'CELL_PLASTICITY_SYSTEMSX': u'false', u'NCBI_ORGANISM_TAXONOMY': u'27434', u'LIBRARY_PROCESSING_SUCCESSFUL': u'false', u'HOW_OFTEN_SEQUENCED': u'1', u'BAREBACKED': u'false', u'SEQUENCING_APPLICATION': u'RNA_SEQ', u'BARCODE': u'TGACCAA', u'BARCODE_COMPLEXITY_CHECKER': u'No Pool', u'CONTACT_PERSON_EMAIL': u'minwu@ethz.ch', u'INVOICE': u'false', 'LANE': u'140124_SN792_0311_AC36GVACXX:8', u'LIBRARY_PROCESSING_FAILED': u'false', u'CONTACT_PERSON_NAME': u'Min Wu', u'NM_DNA': u'0', u'LIBRARY_PROCESSING_POSSIBLE': u'false', u'NOTES': u'TruSeq Strande mRNA sample Prep Kit', u'PRINCIPAL_INVESTIGATOR_NAME': u'Mathias K\xf6lliker', u'AFFILIATION': u'OTHER', u'EXTERNAL_SAMPLE_NAME': u'16Ab', u'UL_EB_MISEQ': u'0', u'UL_DNA': u'0', u'PRINCIPAL_INVESTIGATOR_EMAIL': u'mathias.koelliker@unibas.ch', u'NUMBER_OF_ATTACHMENTS': u'0', u'SAMPLE_KIND': u'TOTAL_RNA', u'UL_DNA_MISEQ': u'0'}, u'BSSE_QGF_20028_140124_SN792_0311_AC36GVACXX_1': {u'QC_AT_DBSSE': u'true', u'FRAGMENT_SIZE_PREPARED_ILLUMINA': u'770', u'UNIQUE_BARCODES': u'OK', u'UL_EB': u' 17.9', u'FLOW_CELL_PROPERTIES': u'Illumina RTA Version: 1.17.21.3\nSequencer : QGF HiSeq2000 (Rua)\nRun type: SINGLE_READ\nNumber of cycles: 51\nFLOWCELLTYPE: HiSeq Flow Cell v3\nKit : TruSeq SBS Kit v3', u'CONCENTRATION_PREPARED_ILLUMINA': u'9.4', u'CELL_PLASTICITY_SYSTEMSX': u'false', u'NCBI_ORGANISM_TAXONOMY': u'3569', u'LIBRARY_PROCESSING_SUCCESSFUL': u'false', u'HOW_OFTEN_SEQUENCED': u'1', u'BAREBACKED': u'false', u'SEQUENCING_APPLICATION': u'GENOMIC_DNA_SEQ', u'END_TYPE': u'PAIRED_END', u'BARCODE': u'TTAGGCA', u'BARCODE_COMPLEXITY_CHECKER': u'No Pool', u'CONTACT_PERSON_EMAIL': u'simone.fior@env.ethz.ch', u'INVOICE': u'false', 'LANE': u'140124_SN792_0311_AC36GVACXX:1', u'PREPARED_BY': u'Simone', u'LIBRARY_PROCESSING_FAILED': u'false', u'CONTACT_PERSON_NAME': u'Fior Simone', u'NM_DNA': u' 18.78', u'CYCLES_REQUESTED_BY_CUSTOMER': u'100', u'LIBRARY_PROCESSING_POSSIBLE': u'false', u'PRINCIPAL_INVESTIGATOR_NAME': u'Alexander Widmer', u'NANO_DROP': u'CONCND3300', u'AFFILIATION': u'OTHER', u'EXTERNAL_SAMPLE_NAME': u'1_Dcar_Unterstalden', u'BIOLOGICAL_SAMPLE_ARRIVED': u'2013-12-16 12:00:00 +0100', u'KIT': u'NONE', u'UL_EB_MISEQ': u' 15.7', u'PRINCIPAL_INVESTIGATOR_EMAIL': u'alex.widmer@env.ethz.ch', u'UL_DNA': u' 2.1', u'NUMBER_OF_ATTACHMENTS': u'1', u'SAMPLE_KIND': u'GENOMIC_DNA', u'UL_STOCK': u'20', u'UL_DNA_MISEQ': u' 4.3'}, u'BSSE_QGF_20034_140124_SN792_0311_AC36GVACXX_1': {u'QC_AT_DBSSE': u'true', u'UNIQUE_BARCODES': u'OK', u'UL_EB': u'0', u'FLOW_CELL_PROPERTIES': u'Illumina RTA Version: 1.17.21.3\nSequencer : QGF HiSeq2000 (Rua)\nRun type: SINGLE_READ\nNumber of cycles: 51\nFLOWCELLTYPE: HiSeq Flow Cell v3\nKit : TruSeq SBS Kit v3', u'CELL_PLASTICITY_SYSTEMSX': u'false', u'NCBI_ORGANISM_TAXONOMY': u'3569', u'LIBRARY_PROCESSING_SUCCESSFUL': u'false', u'HOW_OFTEN_SEQUENCED': u'1', u'BAREBACKED': u'false', u'SEQUENCING_APPLICATION': u'GENOMIC_DNA_SEQ', u'END_TYPE': u'PAIRED_END', u'BARCODE_COMPLEXITY_CHECKER': u'OK', u'CONTACT_PERSON_EMAIL': u'simone.fior@env.ethz.ch', u'INVOICE': u'false', 'LANE': u'140124_SN792_0311_AC36GVACXX:1', u'PREPARED_BY': u'Simone', u'LIBRARY_PROCESSING_FAILED': u'false', u'CONTACT_PERSON_NAME': u'Fior Simone', u'NM_DNA': u'0', u'CYCLES_REQUESTED_BY_CUSTOMER': u'100', u'LIBRARY_PROCESSING_POSSIBLE': u'false', u'PRINCIPAL_INVESTIGATOR_NAME': u'Alexander Widmer', u'NANO_DROP': u'CONCND3300', u'AFFILIATION': u'OTHER', u'DNA_CONCENTRATION_OF_LIBRARY': u'2', u'EXTERNAL_SAMPLE_NAME': u'Pool_Set2_Simone', u'BIOLOGICAL_SAMPLE_ARRIVED': u'2013-12-16 12:00:00 +0100', u'KIT': u'NONE', u'UL_EB_MISEQ': u'0', u'PRINCIPAL_INVESTIGATOR_EMAIL': u'alex.widmer@env.ethz.ch', u'UL_DNA': u'0', u'NUMBER_OF_ATTACHMENTS': u'1', u'SAMPLE_KIND': u'GENOMIC_DNA', u'UL_DNA_MISEQ': u'0'}, u'BSSE_QGF_19917_140124_SN792_0311_AC36GVACXX_2': {u'FRAGMENT_SIZE_PREPARED_ILLUMINA': u'160', u'HOW_OFTEN_SEQUENCED': u'1', u'UNIQUE_BARCODES': u'OK', u'UL_EB': u' 18.6', u'FLOW_CELL_PROPERTIES': u'Illumina RTA Version: 1.17.21.3\nSequencer : QGF HiSeq2000 (Rua)\nRun type: SINGLE_READ\nNumber of cycles: 51\nFLOWCELLTYPE: HiSeq Flow Cell v3\nKit : TruSeq SBS Kit v3', u'CONCENTRATION_PREPARED_ILLUMINA': u'2.9', u'SEQUENCING_APPLICATION': u'SMALL_RNA_SEQ', u'BARCODE': u'ACAGTGA', u'BARCODE_COMPLEXITY_CHECKER': u'No Pool', u'CONTACT_PERSON_EMAIL': u'deni.subasic@imls.uzh.ch', u'INVOICE': u'false', 'LANE': u'140124_SN792_0311_AC36GVACXX:2', u'NCBI_ORGANISM_TAXONOMY': u'9606', u'EXTERNAL_SAMPLE_NAME': u'5_mir-58 L2', u'CONTACT_PERSON_NAME': u'Deni Subasic', u'UL_EB_MISEQ': u' 17.1', u'NM_DNA': u' 27.88', u'PRINCIPAL_INVESTIGATOR_EMAIL': u'michael.hengartner@imls.uzh.ch', u'UL_DNA': u' 1.4', u'NUMBER_OF_ATTACHMENTS': u'0', u'PRINCIPAL_INVESTIGATOR_NAME': u'Michael Hengartner', u'SAMPLE_KIND': u'PROCESSED_DNA_LIBRARY', u'UL_STOCK': u'20', u'AFFILIATION': u'OTHER', u'UL_DNA_MISEQ': u' 2.9'}, u'BSSE_QGF_19918_140124_SN792_0311_AC36GVACXX_2': {u'HOW_OFTEN_SEQUENCED': u'1', u'UNIQUE_BARCODES': u'OK', u'UL_EB': u'0', u'FLOW_CELL_PROPERTIES': u'Illumina RTA Version: 1.17.21.3\nSequencer : QGF HiSeq2000 (Rua)\nRun type: SINGLE_READ\nNumber of cycles: 51\nFLOWCELLTYPE: HiSeq Flow Cell v3\nKit : TruSeq SBS Kit v3', u'SEQUENCING_APPLICATION': u'SMALL_RNA_SEQ', u'BARCODE': u'GCCAATA', u'BARCODE_COMPLEXITY_CHECKER': u'No Pool', u'CONTACT_PERSON_EMAIL': u'deni.subasic@imls.uzh.ch', u'INVOICE': u'false', 'LANE': u'140124_SN792_0311_AC36GVACXX:2', u'NCBI_ORGANISM_TAXONOMY': u'9606', u'EXTERNAL_SAMPLE_NAME': u'6_mir-58 L3', u'CONTACT_PERSON_NAME': u'Deni Subasic', u'UL_EB_MISEQ': u'0', u'NM_DNA': u'0', u'PRINCIPAL_INVESTIGATOR_EMAIL': u'michael.hengartner@imls.uzh.ch', u'UL_DNA': u'0', u'NUMBER_OF_ATTACHMENTS': u'0', u'PRINCIPAL_INVESTIGATOR_NAME': u'Michael Hengartner', u'SAMPLE_KIND': u'PROCESSED_DNA_LIBRARY', u'AFFILIATION': u'OTHER', u'UL_DNA_MISEQ': u'0'}, u'BSSE_QGF_20011_140124_SN792_0311_AC36GVACXX_4': {u'QC_AT_DBSSE': u'false', u'UNIQUE_BARCODES': u'OK', u'UL_EB': u'0', u'FLOW_CELL_PROPERTIES': u'Sample got sequenced more than once. Please check the flow lane properties for detailed description!', u'STARTING_AMOUNT_OF_SAMPLE_IN_NG': u'2000', u'CELL_PLASTICITY_SYSTEMSX': u'false', u'NCBI_ORGANISM_TAXONOMY': u'9606', u'LIBRARY_PROCESSING_SUCCESSFUL': u'false', u'HOW_OFTEN_SEQUENCED': u'4', u'BAREBACKED': u'false', u'SEQUENCING_APPLICATION': u'GENOMIC_DNA_SEQ', u'BARCODE': u'ATCACGA', u'BARCODE_COMPLEXITY_CHECKER': u'No Pool', u'CONTACT_PERSON_EMAIL': u'Christine.Fritz@usz.ch', u'INVOICE': u'false', 'LANE': u'140124_SN792_0311_AC36GVACXX:4', u'PREPARED_BY': u'Ina', u'LIBRARY_PROCESSING_FAILED': u'false', u'CONTACT_PERSON_NAME': u'Fritz Christine', u'NM_DNA': u'0', u'LIBRARY_PROCESSING_POSSIBLE': u'false', u'PRINCIPAL_INVESTIGATOR_NAME': u'Peter Wild', u'AFFILIATION': u'OTHER', u'EXTERNAL_SAMPLE_NAME': u'1_G11.806 NO', u'BIOLOGICAL_SAMPLE_ARRIVED': u'2013-10-29 12:00:00 +0100', u'UL_EB_MISEQ': u'0', u'KIT': u'AGILENT_SURESELECT_ENRICHMENTSYSTEM', u'PRINCIPAL_INVESTIGATOR_EMAIL': u'peter.wild@usz.ch', u'UL_DNA': u'0', u'NUMBER_OF_ATTACHMENTS': u'0', u'SAMPLE_KIND': u'GENOMIC_DNA', u'UL_DNA_MISEQ': u'0'}, u'BSSE_QGF_19915_140124_SN792_0311_AC36GVACXX_2': {u'FRAGMENT_SIZE_PREPARED_ILLUMINA': u'160', u'HOW_OFTEN_SEQUENCED': u'1', u'UNIQUE_BARCODES': u'OK', u'UL_EB': u' 19.0', u'FLOW_CELL_PROPERTIES': u'Illumina RTA Version: 1.17.21.3\nSequencer : QGF HiSeq2000 (Rua)\nRun type: SINGLE_READ\nNumber of cycles: 51\nFLOWCELLTYPE: HiSeq Flow Cell v3\nKit : TruSeq SBS Kit v3', u'CONCENTRATION_PREPARED_ILLUMINA': u'3.99', u'SEQUENCING_APPLICATION': u'SMALL_RNA_SEQ', u'BARCODE': u'TTAGGCA', u'BARCODE_COMPLEXITY_CHECKER': u'No Pool', u'CONTACT_PERSON_EMAIL': u'deni.subasic@imls.uzh.ch', u'INVOICE': u'false', 'LANE': u'140124_SN792_0311_AC36GVACXX:2', u'NCBI_ORGANISM_TAXONOMY': u'9606', u'EXTERNAL_SAMPLE_NAME': u'3_wt L3', u'CONTACT_PERSON_NAME': u'Deni Subasic', u'UL_EB_MISEQ': u' 17.9', u'NM_DNA': u' 38.37', u'PRINCIPAL_INVESTIGATOR_EMAIL': u'michael.hengartner@imls.uzh.ch', u'UL_DNA': u' 1.0', u'NUMBER_OF_ATTACHMENTS': u'0', u'PRINCIPAL_INVESTIGATOR_NAME': u'Michael Hengartner', u'SAMPLE_KIND': u'PROCESSED_DNA_LIBRARY', u'UL_STOCK': u'20', u'AFFILIATION': u'OTHER', u'UL_DNA_MISEQ': u' 2.1'}, u'BSSE_QGF_19916_140124_SN792_0311_AC36GVACXX_2': {u'FRAGMENT_SIZE_PREPARED_ILLUMINA': u'160', u'HOW_OFTEN_SEQUENCED': u'1', u'UNIQUE_BARCODES': u'OK', u'UL_EB': u' 18.5', u'FLOW_CELL_PROPERTIES': u'Illumina RTA Version: 1.17.21.3\nSequencer : QGF HiSeq2000 (Rua)\nRun type: SINGLE_READ\nNumber of cycles: 51\nFLOWCELLTYPE: HiSeq Flow Cell v3\nKit : TruSeq SBS Kit v3', u'CONCENTRATION_PREPARED_ILLUMINA': u'2.83', u'SEQUENCING_APPLICATION': u'SMALL_RNA_SEQ', u'BARCODE': u'TGACCAA', u'BARCODE_COMPLEXITY_CHECKER': u'No Pool', u'CONTACT_PERSON_EMAIL': u'deni.subasic@imls.uzh.ch', u'INVOICE': u'false', 'LANE': u'140124_SN792_0311_AC36GVACXX:2', u'NCBI_ORGANISM_TAXONOMY': u'9606', u'EXTERNAL_SAMPLE_NAME': u'4_mir-58 L1', u'CONTACT_PERSON_NAME': u'Deni Subasic', u'UL_EB_MISEQ': u' 17.1', u'NM_DNA': u' 27.21', u'PRINCIPAL_INVESTIGATOR_EMAIL': u'michael.hengartner@imls.uzh.ch', u'UL_DNA': u' 1.5', u'NUMBER_OF_ATTACHMENTS': u'0', u'PRINCIPAL_INVESTIGATOR_NAME': u'Michael Hengartner', u'SAMPLE_KIND': u'PROCESSED_DNA_LIBRARY', u'UL_STOCK': u'20', u'AFFILIATION': u'OTHER', u'UL_DNA_MISEQ': u' 2.9'}, u'BSSE_QGF_19932_140124_SN792_0311_AC36GVACXX_3': {u'FRAGMENT_SIZE_PREPARED_ILLUMINA': u'161', u'HOW_OFTEN_SEQUENCED': u'1', u'UNIQUE_BARCODES': u'OK', u'UL_EB': u'0', u'FLOW_CELL_PROPERTIES': u'Illumina RTA Version: 1.17.21.3\nSequencer : QGF HiSeq2000 (Rua)\nRun type: SINGLE_READ\nNumber of cycles: 51\nFLOWCELLTYPE: HiSeq Flow Cell v3\nKit : TruSeq SBS Kit v3', u'SEQUENCING_APPLICATION': u'SMALL_RNA_SEQ', u'BARCODE': u'CAGATCA', u'BARCODE_COMPLEXITY_CHECKER': u'No Pool', u'CONTACT_PERSON_EMAIL': u'deni.subasic@imls.uzh.ch', u'INVOICE': u'false', 'LANE': u'140124_SN792_0311_AC36GVACXX:3', u'NCBI_ORGANISM_TAXONOMY': u'9606', u'EXTERNAL_SAMPLE_NAME': u'19_fox-1 1', u'CONTACT_PERSON_NAME': u'Deni Subasic', u'UL_EB_MISEQ': u'0', u'NM_DNA': u'0', u'PRINCIPAL_INVESTIGATOR_EMAIL': u'michael.hengartner@imls.uzh.ch', u'UL_DNA': u'0', u'NUMBER_OF_ATTACHMENTS': u'0', u'PRINCIPAL_INVESTIGATOR_NAME': u'Michael Hengartner', u'SAMPLE_KIND': u'PROCESSED_DNA_LIBRARY', u'AFFILIATION': u'OTHER', u'UL_DNA_MISEQ': u'0'}, u'BSSE_QGF_20031_140124_SN792_0311_AC36GVACXX_1': {u'QC_AT_DBSSE': u'true', u'FRAGMENT_SIZE_PREPARED_ILLUMINA': u'740', u'UNIQUE_BARCODES': u'OK', u'UL_EB': u' 18.3', u'FLOW_CELL_PROPERTIES': u'Illumina RTA Version: 1.17.21.3\nSequencer : QGF HiSeq2000 (Rua)\nRun type: SINGLE_READ\nNumber of cycles: 51\nFLOWCELLTYPE: HiSeq Flow Cell v3\nKit : TruSeq SBS Kit v3', u'CONCENTRATION_PREPARED_ILLUMINA': u'11.6', u'CELL_PLASTICITY_SYSTEMSX': u'false', u'NCBI_ORGANISM_TAXONOMY': u'3569', u'LIBRARY_PROCESSING_SUCCESSFUL': u'false', u'HOW_OFTEN_SEQUENCED': u'1', u'BAREBACKED': u'false', u'SEQUENCING_APPLICATION': u'GENOMIC_DNA_SEQ', u'END_TYPE': u'PAIRED_END', u'BARCODE': u'GTTTCGG', u'BARCODE_COMPLEXITY_CHECKER': u'No Pool', u'CONTACT_PERSON_EMAIL': u'simone.fior@env.ethz.ch', u'INVOICE': u'false', 'LANE': u'140124_SN792_0311_AC36GVACXX:1', u'PREPARED_BY': u'Simone', u'LIBRARY_PROCESSING_FAILED': u'false', u'CONTACT_PERSON_NAME': u'Fior Simone', u'NM_DNA': u' 24.12', u'CYCLES_REQUESTED_BY_CUSTOMER': u'100', u'LIBRARY_PROCESSING_POSSIBLE': u'false', u'PRINCIPAL_INVESTIGATOR_NAME': u'Alexander Widmer', u'NANO_DROP': u'CONCND3300', u'AFFILIATION': u'OTHER', u'EXTERNAL_SAMPLE_NAME': u'4_Dcar_Simplonpass', u'BIOLOGICAL_SAMPLE_ARRIVED': u'2013-12-16 12:00:00 +0100', u'KIT': u'NONE', u'UL_EB_MISEQ': u' 16.7', u'PRINCIPAL_INVESTIGATOR_EMAIL': u'alex.widmer@env.ethz.ch', u'UL_DNA': u' 1.7', u'NUMBER_OF_ATTACHMENTS': u'0', u'SAMPLE_KIND': u'GENOMIC_DNA', u'UL_STOCK': u'20', u'UL_DNA_MISEQ': u' 3.3'}, u'BSSE_QGF_20014_140124_SN792_0311_AC36GVACXX_4': {u'QC_AT_DBSSE': u'false', u'UNIQUE_BARCODES': u'OK', u'UL_EB': u'0', u'FLOW_CELL_PROPERTIES': u'Sample got sequenced more than once. Please check the flow lane properties for detailed description!', u'STARTING_AMOUNT_OF_SAMPLE_IN_NG': u'2000', u'CELL_PLASTICITY_SYSTEMSX': u'false', u'NCBI_ORGANISM_TAXONOMY': u'9606', u'LIBRARY_PROCESSING_SUCCESSFUL': u'false', u'HOW_OFTEN_SEQUENCED': u'4', u'BAREBACKED': u'false', u'SEQUENCING_APPLICATION': u'GENOMIC_DNA_SEQ', u'BARCODE': u'TGACCAA', u'BARCODE_COMPLEXITY_CHECKER': u'No Pool', u'CONTACT_PERSON_EMAIL': u'Christine.Fritz@usz.ch', u'INVOICE': u'false', 'LANE': u'140124_SN792_0311_AC36GVACXX:4', u'PREPARED_BY': u'Ina', u'LIBRARY_PROCESSING_FAILED': u'false', u'CONTACT_PERSON_NAME': u'Fritz Christine', u'NM_DNA': u'0', u'LIBRARY_PROCESSING_POSSIBLE': u'false', u'PRINCIPAL_INVESTIGATOR_NAME': u'Peter Wild', u'AFFILIATION': u'OTHER', u'EXTERNAL_SAMPLE_NAME': u'4_G08.792 TA1', u'BIOLOGICAL_SAMPLE_ARRIVED': u'2013-10-29 12:00:00 +0100', u'KIT': u'AGILENT_SURESELECT_ENRICHMENTSYSTEM', u'UL_EB_MISEQ': u'0', u'PRINCIPAL_INVESTIGATOR_EMAIL': u'peter.wild@usz.ch', u'UL_DNA': u'0', u'NUMBER_OF_ATTACHMENTS': u'0', u'SAMPLE_KIND': u'GENOMIC_DNA', u'UL_DNA_MISEQ': u'0'}, u'BSSE_QGF_20045_140124_SN792_0311_AC36GVACXX_8': {u'QC_AT_DBSSE': u'false', u'UNIQUE_BARCODES': u'OK', u'UL_EB': u'0', u'FLOW_CELL_PROPERTIES': u'Illumina RTA Version: 1.17.21.3\nSequencer : QGF HiSeq2000 (Rua)\nRun type: SINGLE_READ\nNumber of cycles: 51\nFLOWCELLTYPE: HiSeq Flow Cell v3\nKit : TruSeq SBS Kit v3', u'CELL_PLASTICITY_SYSTEMSX': u'false', u'NCBI_ORGANISM_TAXONOMY': u'27434', u'LIBRARY_PROCESSING_SUCCESSFUL': u'false', u'HOW_OFTEN_SEQUENCED': u'1', u'BAREBACKED': u'false', u'SEQUENCING_APPLICATION': u'RNA_SEQ', u'BARCODE_COMPLEXITY_CHECKER': u'OK', u'CONTACT_PERSON_EMAIL': u'minwu@ethz.ch', u'INVOICE': u'false', 'LANE': u'140124_SN792_0311_AC36GVACXX:8', u'LIBRARY_PROCESSING_FAILED': u'false', u'CONTACT_PERSON_NAME': u'Min Wu', u'NM_DNA': u'0', u'LIBRARY_PROCESSING_POSSIBLE': u'false', u'NOTES': u'TruSeq Strande mRNA sample Prep Kit', u'PRINCIPAL_INVESTIGATOR_NAME': u'Mathias K\xf6lliker', u'AFFILIATION': u'OTHER', u'EXTERNAL_SAMPLE_NAME': u'Pool1_Min Wu_TruSeq Str.', u'UL_EB_MISEQ': u'0', u'UL_DNA': u'0', u'PRINCIPAL_INVESTIGATOR_EMAIL': u'mathias.koelliker@unibas.ch', u'NUMBER_OF_ATTACHMENTS': u'0', u'SAMPLE_KIND': u'TOTAL_RNA', u'UL_DNA_MISEQ': u'0'}, u'BSSE_QGF_19931_140124_SN792_0311_AC36GVACXX_3': {u'HOW_OFTEN_SEQUENCED': u'1', u'UNIQUE_BARCODES': u'OK', u'UL_EB': u'0', u'FLOW_CELL_PROPERTIES': u'Illumina RTA Version: 1.17.21.3\nSequencer : QGF HiSeq2000 (Rua)\nRun type: SINGLE_READ\nNumber of cycles: 51\nFLOWCELLTYPE: HiSeq Flow Cell v3\nKit : TruSeq SBS Kit v3', u'SEQUENCING_APPLICATION': u'SMALL_RNA_SEQ', u'BARCODE': u'GCCAATA', u'BARCODE_COMPLEXITY_CHECKER': u'No Pool', u'CONTACT_PERSON_EMAIL': u'deni.subasic@imls.uzh.ch', u'INVOICE': u'false', 'LANE': u'140124_SN792_0311_AC36GVACXX:3', u'NCBI_ORGANISM_TAXONOMY': u'9606', u'EXTERNAL_SAMPLE_NAME': u'18_asd-1 3 (OLD)', u'CONTACT_PERSON_NAME': u'Deni Subasic', u'UL_EB_MISEQ': u'0', u'NM_DNA': u'0', u'PRINCIPAL_INVESTIGATOR_EMAIL': u'michael.hengartner@imls.uzh.ch', u'UL_DNA': u'0', u'NUMBER_OF_ATTACHMENTS': u'0', u'PRINCIPAL_INVESTIGATOR_NAME': u'Michael Hengartner', u'SAMPLE_KIND': u'PROCESSED_DNA_LIBRARY', u'AFFILIATION': u'OTHER', u'UL_DNA_MISEQ': u'0'}, u'BSSE_QGF_19933_140124_SN792_0311_AC36GVACXX_3': {u'FRAGMENT_SIZE_PREPARED_ILLUMINA': u'161', u'HOW_OFTEN_SEQUENCED': u'1', u'UNIQUE_BARCODES': u'OK', u'UL_EB': u' 8.6', u'FLOW_CELL_PROPERTIES': u'Illumina RTA Version: 1.17.21.3\nSequencer : QGF HiSeq2000 (Rua)\nRun type: SINGLE_READ\nNumber of cycles: 51\nFLOWCELLTYPE: HiSeq Flow Cell v3\nKit : TruSeq SBS Kit v3', u'CONCENTRATION_PREPARED_ILLUMINA': u'1.45', u'SEQUENCING_APPLICATION': u'SMALL_RNA_SEQ', u'BARCODE': u'ACTTGAA', u'BARCODE_COMPLEXITY_CHECKER': u'No Pool', u'CONTACT_PERSON_EMAIL': u'deni.subasic@imls.uzh.ch', u'INVOICE': u'false', 'LANE': u'140124_SN792_0311_AC36GVACXX:3', u'NCBI_ORGANISM_TAXONOMY': u'9606', u'EXTERNAL_SAMPLE_NAME': u'20_fox-1 2', u'CONTACT_PERSON_NAME': u'Deni Subasic', u'UL_EB_MISEQ': u' 7.1', u'NM_DNA': u' 13.86', u'PRINCIPAL_INVESTIGATOR_EMAIL': u'michael.hengartner@imls.uzh.ch', u'UL_DNA': u' 1.4', u'NUMBER_OF_ATTACHMENTS': u'0', u'PRINCIPAL_INVESTIGATOR_NAME': u'Michael Hengartner', u'SAMPLE_KIND': u'PROCESSED_DNA_LIBRARY', u'UL_STOCK': u'10', u'AFFILIATION': u'OTHER', u'UL_DNA_MISEQ': u' 2.9'}, u'BSSE_QGF_19913_140124_SN792_0311_AC36GVACXX_2': {u'FRAGMENT_SIZE_PREPARED_ILLUMINA': u'163', u'HOW_OFTEN_SEQUENCED': u'1', u'UNIQUE_BARCODES': u'OK', u'UL_EB': u' 8.3', u'FLOW_CELL_PROPERTIES': u'Illumina RTA Version: 1.17.21.3\nSequencer : QGF HiSeq2000 (Rua)\nRun type: SINGLE_READ\nNumber of cycles: 51\nFLOWCELLTYPE: HiSeq Flow Cell v3\nKit : TruSeq SBS Kit v3', u'CONCENTRATION_PREPARED_ILLUMINA': u'1.22', u'SEQUENCING_APPLICATION': u'SMALL_RNA_SEQ', u'BARCODE': u'ATCACGA', u'BARCODE_COMPLEXITY_CHECKER': u'No Pool', u'CONTACT_PERSON_EMAIL': u'deni.subasic@imls.uzh.ch', u'INVOICE': u'false', 'LANE': u'140124_SN792_0311_AC36GVACXX:2', u'NCBI_ORGANISM_TAXONOMY': u'9606', u'EXTERNAL_SAMPLE_NAME': u'1_wt L1', u'CONTACT_PERSON_NAME': u'Deni Subasic', u'UL_EB_MISEQ': u' 6.5', u'NM_DNA': u' 11.51', u'PRINCIPAL_INVESTIGATOR_EMAIL': u'michael.hengartner@imls.uzh.ch', u'UL_DNA': u' 1.7', u'NUMBER_OF_ATTACHMENTS': u'0', u'PRINCIPAL_INVESTIGATOR_NAME': u'Michael Hengartner', u'SAMPLE_KIND': u'PROCESSED_DNA_LIBRARY', u'UL_STOCK': u'10', u'AFFILIATION': u'OTHER', u'UL_DNA_MISEQ': u' 3.5'}, u'BSSE_QGF_19922_140124_SN792_0311_AC36GVACXX_2': {u'FRAGMENT_SIZE_PREPARED_ILLUMINA': u'163', u'HOW_OFTEN_SEQUENCED': u'1', u'UNIQUE_BARCODES': u'OK', u'UL_EB': u' 7.8', u'FLOW_CELL_PROPERTIES': u'Illumina RTA Version: 1.17.21.3\nSequencer : QGF HiSeq2000 (Rua)\nRun type: SINGLE_READ\nNumber of cycles: 51\nFLOWCELLTYPE: HiSeq Flow Cell v3\nKit : TruSeq SBS Kit v3', u'CONCENTRATION_PREPARED_ILLUMINA': u'0.97', u'SEQUENCING_APPLICATION': u'SMALL_RNA_SEQ', u'BARCODE': u'CTTGTAA', u'BARCODE_COMPLEXITY_CHECKER': u'No Pool', u'CONTACT_PERSON_EMAIL': u'deni.subasic@imls.uzh.ch', u'INVOICE': u'false', 'LANE': u'140124_SN792_0311_AC36GVACXX:2', u'NCBI_ORGANISM_TAXONOMY': u'9606', u'EXTERNAL_SAMPLE_NAME': u'10_Q L1', u'CONTACT_PERSON_NAME': u'Deni Subasic', u'UL_EB_MISEQ': u' 5.6', u'NM_DNA': u' 9.16', u'PRINCIPAL_INVESTIGATOR_EMAIL': u'michael.hengartner@imls.uzh.ch', u'UL_DNA': u' 2.2', u'NUMBER_OF_ATTACHMENTS': u'0', u'PRINCIPAL_INVESTIGATOR_NAME': u'Michael Hengartner', u'SAMPLE_KIND': u'PROCESSED_DNA_LIBRARY', u'UL_STOCK': u'10', u'AFFILIATION': u'OTHER', u'UL_DNA_MISEQ': u' 4.4'}, u'BSSE_QGF_20032_140124_SN792_0311_AC36GVACXX_1': {u'QC_AT_DBSSE': u'true', u'FRAGMENT_SIZE_PREPARED_ILLUMINA': u'870', u'UNIQUE_BARCODES': u'OK', u'UL_EB': u' 18.4', u'FLOW_CELL_PROPERTIES': u'Illumina RTA Version: 1.17.21.3\nSequencer : QGF HiSeq2000 (Rua)\nRun type: SINGLE_READ\nNumber of cycles: 51\nFLOWCELLTYPE: HiSeq Flow Cell v3\nKit : TruSeq SBS Kit v3', u'CONCENTRATION_PREPARED_ILLUMINA': u'13.8', u'CELL_PLASTICITY_SYSTEMSX': u'false', u'NCBI_ORGANISM_TAXONOMY': u'3569', u'LIBRARY_PROCESSING_SUCCESSFUL': u'false', u'HOW_OFTEN_SEQUENCED': u'1', u'BAREBACKED': u'false', u'SEQUENCING_APPLICATION': u'GENOMIC_DNA_SEQ', u'END_TYPE': u'PAIRED_END', u'BARCODE': u'CGTACGT', u'BARCODE_COMPLEXITY_CHECKER': u'No Pool', u'CONTACT_PERSON_EMAIL': u'simone.fior@env.ethz.ch', u'INVOICE': u'false', 'LANE': u'140124_SN792_0311_AC36GVACXX:1', u'PREPARED_BY': u'Simone', u'LIBRARY_PROCESSING_FAILED': u'false', u'CONTACT_PERSON_NAME': u'Fior Simone', u'NM_DNA': u' 24.40', u'CYCLES_REQUESTED_BY_CUSTOMER': u'100', u'LIBRARY_PROCESSING_POSSIBLE': u'false', u'PRINCIPAL_INVESTIGATOR_NAME': u'Alexander Widmer', u'NANO_DROP': u'CONCND3300', u'AFFILIATION': u'OTHER', u'EXTERNAL_SAMPLE_NAME': u'5_Dcar_Faldumalp', u'BIOLOGICAL_SAMPLE_ARRIVED': u'2013-12-16 12:00:00 +0100', u'KIT': u'NONE', u'UL_EB_MISEQ': u' 16.7', u'PRINCIPAL_INVESTIGATOR_EMAIL': u'alex.widmer@env.ethz.ch', u'UL_DNA': u' 1.6', u'NUMBER_OF_ATTACHMENTS': u'0', u'SAMPLE_KIND': u'GENOMIC_DNA', u'UL_STOCK': u'20', u'UL_DNA_MISEQ': u' 3.3'}, u'BSSE_QGF_19920_140124_SN792_0311_AC36GVACXX_2': {u'FRAGMENT_SIZE_PREPARED_ILLUMINA': u'162', u'HOW_OFTEN_SEQUENCED': u'1', u'UNIQUE_BARCODES': u'OK', u'UL_EB': u' 16.9', u'FLOW_CELL_PROPERTIES': u'Illumina RTA Version: 1.17.21.3\nSequencer : QGF HiSeq2000 (Rua)\nRun type: SINGLE_READ\nNumber of cycles: 51\nFLOWCELLTYPE: HiSeq Flow Cell v3\nKit : TruSeq SBS Kit v3', u'CONCENTRATION_PREPARED_ILLUMINA': u'1.38', u'SEQUENCING_APPLICATION': u'SMALL_RNA_SEQ', u'BARCODE': u'ACTTGAA', u'BARCODE_COMPLEXITY_CHECKER': u'No Pool', u'CONTACT_PERSON_EMAIL': u'deni.subasic@imls.uzh.ch', u'INVOICE': u'false', 'LANE': u'140124_SN792_0311_AC36GVACXX:2', u'NCBI_ORGANISM_TAXONOMY': u'9606', u'EXTERNAL_SAMPLE_NAME': u'8_58 80 L2', u'CONTACT_PERSON_NAME': u'Deni Subasic', u'UL_EB_MISEQ': u' 13.9', u'NM_DNA': u' 13.11', u'PRINCIPAL_INVESTIGATOR_EMAIL': u'michael.hengartner@imls.uzh.ch', u'UL_DNA': u' 3.1', u'NUMBER_OF_ATTACHMENTS': u'0', u'PRINCIPAL_INVESTIGATOR_NAME': u'Michael Hengartner', u'SAMPLE_KIND': u'PROCESSED_DNA_LIBRARY', u'UL_STOCK': u'20', u'AFFILIATION': u'OTHER', u'UL_DNA_MISEQ': u' 6.1'}, u'BSSE_QGF_19927_140124_SN792_0311_AC36GVACXX_3': {u'FRAGMENT_SIZE_PREPARED_ILLUMINA': u'160', u'HOW_OFTEN_SEQUENCED': u'1', u'UNIQUE_BARCODES': u'OK', u'UL_EB': u' 6.0', u'FLOW_CELL_PROPERTIES': u'Illumina RTA Version: 1.17.21.3\nSequencer : QGF HiSeq2000 (Rua)\nRun type: SINGLE_READ\nNumber of cycles: 51\nFLOWCELLTYPE: HiSeq Flow Cell v3\nKit : TruSeq SBS Kit v3', u'CONCENTRATION_PREPARED_ILLUMINA': u'0.52', u'SEQUENCING_APPLICATION': u'SMALL_RNA_SEQ', u'BARCODE': u'CGATGTA', u'BARCODE_COMPLEXITY_CHECKER': u'No Pool', u'CONTACT_PERSON_EMAIL': u'deni.subasic@imls.uzh.ch', u'INVOICE': u'false', 'LANE': u'140124_SN792_0311_AC36GVACXX:3', u'NCBI_ORGANISM_TAXONOMY': u'9606', u'EXTERNAL_SAMPLE_NAME': u'14_wt (N2) 2 (OLD)', u'CONTACT_PERSON_NAME': u'Deni Subasic', u'UL_EB_MISEQ': u' 2.0', u'NM_DNA': u' 5.00', u'PRINCIPAL_INVESTIGATOR_EMAIL': u'michael.hengartner@imls.uzh.ch', u'UL_DNA': u' 4.0', u'NUMBER_OF_ATTACHMENTS': u'0', u'PRINCIPAL_INVESTIGATOR_NAME': u'Michael Hengartner', u'SAMPLE_KIND': u'PROCESSED_DNA_LIBRARY', u'UL_STOCK': u'10', u'AFFILIATION': u'OTHER', u'UL_DNA_MISEQ': u' 8.0'}} - self.samplesPerLaneDict3 = {u'8': 9, u'1': 7, u'5': 1, u'7': 1, u'2': 13, u'6': 1, u'3': 13, u'4': 14} - self.flowCellName3 = 'C36GVACXX' - - def test_createHiseqSampleSheet_PhiX_and_NoIndex (self): - ''' - Case1: we have Phix and a non-barcoded sample in the same lane - Only one sample is allowed per lane - ''' - - sampleSheetDict1, testFile = sampleSheetFile = createHiseqSampleSheet(self.parentDict, self.flowCellDict, - self.samplesPerLaneDict, self.flowCellName, self.configMap, self.logger, self.parser) - - d1 = {u'6_BSSE_QGF_16255_140127_SN792_0312_AC36DWACXX_6': [u'C36DWACXX,6,BSSE_QGF_16255_140127_SN792_0312_AC36DWACXX_6,481459, ,Ga_lib_37,N,SINGLE_READ_151,ETHZ_D-BSSE,140127_SN792_0312_AC36DWACXX_6'], - u'5_BSSE_QGF_19988_140127_SN792_0312_AC36DWACXX_5': [u'C36DWACXX,5,BSSE_QGF_19988_140127_SN792_0312_AC36DWACXX_5,481459,ACAGTG,201,Y,SINGLE_READ_151,ETHZ_D-BSSE,140127_SN792_0312_AC36DWACXX_5'], - u'!': ['FCID,Lane,SampleID,SampleRef,Index,Description,Control,Recipe,Operator,SampleProject'], - u'4_BSSE_QGF_16254_140127_SN792_0312_AC36DWACXX_4': [u'C36DWACXX,4,BSSE_QGF_16254_140127_SN792_0312_AC36DWACXX_4,481459, ,Ga_lib_36,N,SINGLE_READ_151,ETHZ_D-BSSE,140127_SN792_0312_AC36DWACXX_4'], - u'7_BSSE_QGF_16256_140127_SN792_0312_AC36DWACXX_7': [u'C36DWACXX,7,BSSE_QGF_16256_140127_SN792_0312_AC36DWACXX_7,481459, ,Ga_lib_38,N,SINGLE_READ_151,ETHZ_D-BSSE,140127_SN792_0312_AC36DWACXX_7'], - u'8_BSSE_QGF_16257_140127_SN792_0312_AC36DWACXX_8': [u'C36DWACXX,8,BSSE_QGF_16257_140127_SN792_0312_AC36DWACXX_8,481459, ,Ga_lib_39,N,SINGLE_READ_151,ETHZ_D-BSSE,140127_SN792_0312_AC36DWACXX_8'], - u'5_BSSE_QGF_19989_140127_SN792_0312_AC36DWACXX_5': [u'C36DWACXX,5,BSSE_QGF_19989_140127_SN792_0312_AC36DWACXX_5,481459,GTGAAA,293,Y,SINGLE_READ_151,ETHZ_D-BSSE,140127_SN792_0312_AC36DWACXX_5'], - u'1_BSSE_QGF_16251_140127_SN792_0312_AC36DWACXX_1': [u'C36DWACXX,1,BSSE_QGF_16251_140127_SN792_0312_AC36DWACXX_1,481459, ,Ga_lib_33,N,SINGLE_READ_151,ETHZ_D-BSSE,140127_SN792_0312_AC36DWACXX_1'], - u'2_BSSE_QGF_16252_140127_SN792_0312_AC36DWACXX_2': [u'C36DWACXX,2,BSSE_QGF_16252_140127_SN792_0312_AC36DWACXX_2,481459, ,Ga_lib_34,N,SINGLE_READ_151,ETHZ_D-BSSE,140127_SN792_0312_AC36DWACXX_2'], - u'3_BSSE_QGF_16253_140127_SN792_0312_AC36DWACXX_3': [u'C36DWACXX,3,BSSE_QGF_16253_140127_SN792_0312_AC36DWACXX_3,481459, ,Ga_lib_35,N,SINGLE_READ_151,ETHZ_D-BSSE,140127_SN792_0312_AC36DWACXX_3']} - - if (sampleSheetDict1 != d1): - self.fail("Dictionaries do not match!") - - - def test_createHiseqSampleSheet_PhiX_plus_Index (self): - ''' - Case2: We have several indexed samples plus a PhiX in the lane - ''' - - sampleSheetDict2, testFile = sampleSheetFile = createHiseqSampleSheet(self.parentDict2, self.flowCellDict2, - self.samplesPerLaneDict2, self.flowCellName2, self.configMap, self.logger, self.parser) - - d2 = {u'1_BSSE_QGF_20262_140219_M01761_0057_000000000_A825W_1': [u'000000000-A825W,1,BSSE_QGF_20262_140219_M01761_0057_000000000_A825W_1,1773,CAGAGAG-AGAGTAG,G01666,N,PAIRED_END_251,ETHZ_D-BSSE,140219_M01761_0057_000000000_A825W_1'], - u'1_BSSE_QGF_20258_140219_M01761_0057_000000000_A825W_1': [u'000000000-A825W,1,BSSE_QGF_20258_140219_M01761_0057_000000000_A825W_1,1773,TCCTGAG-CTAAGCC,G01662,N,PAIRED_END_251,ETHZ_D-BSSE,140219_M01761_0057_000000000_A825W_1'], - u'1_BSSE_QGF_20255_140219_M01761_0057_000000000_A825W_1': [u'000000000-A825W,1,BSSE_QGF_20255_140219_M01761_0057_000000000_A825W_1,1773,TAAGGCG-GTAAGGA,G01659,N,PAIRED_END_251,ETHZ_D-BSSE,140219_M01761_0057_000000000_A825W_1'], - u'1_BSSE_QGF_20259_140219_M01761_0057_000000000_A825W_1': [u'000000000-A825W,1,BSSE_QGF_20259_140219_M01761_0057_000000000_A825W_1,1773,GGACTCC-TAGATCG,G01663,N,PAIRED_END_251,ETHZ_D-BSSE,140219_M01761_0057_000000000_A825W_1'], - u'1_BSSE_QGF_20266_140219_M01761_0057_000000000_A825W_1': [u'000000000-A825W,1,BSSE_QGF_20266_140219_M01761_0057_000000000_A825W_1,1773,GTAGAGG-CTAAGCC,G01670,N,PAIRED_END_251,ETHZ_D-BSSE,140219_M01761_0057_000000000_A825W_1'], - u'!': ['FCID,Lane,SampleID,SampleRef,Index,Description,Control,Recipe,Operator,SampleProject'], - u'1_BSSE_QGF_20263_140219_M01761_0057_000000000_A825W_1': [u'000000000-A825W,1,BSSE_QGF_20263_140219_M01761_0057_000000000_A825W_1,1773,GCTACGC-ACTGCAT,G01667,N,PAIRED_END_251,ETHZ_D-BSSE,140219_M01761_0057_000000000_A825W_1'], - u'1_BSSE_QGF_20261_140219_M01761_0057_000000000_A825W_1': [u'000000000-A825W,1,BSSE_QGF_20261_140219_M01761_0057_000000000_A825W_1,1773,CTCTCTA-TATCCTC,G01665,N,PAIRED_END_251,ETHZ_D-BSSE,140219_M01761_0057_000000000_A825W_1'], - u'1_BSSE_QGF_20264_140219_M01761_0057_000000000_A825W_1': [u'000000000-A825W,1,BSSE_QGF_20264_140219_M01761_0057_000000000_A825W_1,1773,CGAGGCT-ACTGCAT,G01668,N,PAIRED_END_251,ETHZ_D-BSSE,140219_M01761_0057_000000000_A825W_1'], - u'1_BSSE_QGF_20257_140219_M01761_0057_000000000_A825W_1': [u'000000000-A825W,1,BSSE_QGF_20257_140219_M01761_0057_000000000_A825W_1,1773,AGGCAGA-AAGGAGT,G01661,N,PAIRED_END_251,ETHZ_D-BSSE,140219_M01761_0057_000000000_A825W_1'], - u'1_BSSE_QGF_20265_140219_M01761_0057_000000000_A825W_1': [u'000000000-A825W,1,BSSE_QGF_20265_140219_M01761_0057_000000000_A825W_1,1773,AAGAGGC-AAGGAGT,G01669,N,PAIRED_END_251,ETHZ_D-BSSE,140219_M01761_0057_000000000_A825W_1'], - u'1_BSSE_QGF_20256_140219_M01761_0057_000000000_A825W_1': [u'000000000-A825W,1,BSSE_QGF_20256_140219_M01761_0057_000000000_A825W_1,1773,CGTACTA-ACTGCAT,G01660,N,PAIRED_END_251,ETHZ_D-BSSE,140219_M01761_0057_000000000_A825W_1'], - u'1_BSSE_QGF_20260_140219_M01761_0057_000000000_A825W_1': [u'000000000-A825W,1,BSSE_QGF_20260_140219_M01761_0057_000000000_A825W_1,1773,TAGGCAT-CTCTCTA,G01664,N,PAIRED_END_251,ETHZ_D-BSSE,140219_M01761_0057_000000000_A825W_1']} - - if (sampleSheetDict2 != d2): - self.fail("Dictionaries do not match!") - - - def test_createHiseqSampleSheet_Lane5_PhiX (self): - ''' - Case3: "Normal" use case with Lane #5 as a PhiX Control lane - ''' - sampleSheetDict3, testFile = sampleSheetFile = createHiseqSampleSheet(self.parentDict3, self.flowCellDict3, - self.samplesPerLaneDict3, self.flowCellName3, self.configMap, self.logger, self.parser) - - d3 = {u'4_BSSE_QGF_20018_140124_SN792_0311_AC36GVACXX_4': [u'C36GVACXX,4,BSSE_QGF_20018_140124_SN792_0311_AC36GVACXX_4,9606,ACTTGA,8_G11_838_NO,N,SINGLE_READ_51,ETHZ_D-BSSE,140124_SN792_0311_AC36GVACXX_4'], - u'5_BSSE_QGF_16028_140124_SN792_0311_AC36GVACXX_5': [u'C36GVACXX,5,BSSE_QGF_16028_140124_SN792_0311_AC36GVACXX_5,10847, ,PhiX,Y,SINGLE_READ_51,ETHZ_D-BSSE,140124_SN792_0311_AC36GVACXX_5'], - u'4_BSSE_QGF_20014_140124_SN792_0311_AC36GVACXX_4': [u'C36GVACXX,4,BSSE_QGF_20014_140124_SN792_0311_AC36GVACXX_4,9606,TGACCA,4_G08_792_TA1,N,SINGLE_READ_51,ETHZ_D-BSSE,140124_SN792_0311_AC36GVACXX_4'], - u'3_BSSE_QGF_19933_140124_SN792_0311_AC36GVACXX_3': [u'C36GVACXX,3,BSSE_QGF_19933_140124_SN792_0311_AC36GVACXX_3,9606,ACTTGA,20_fox_1_2,N,SINGLE_READ_51,ETHZ_D-BSSE,140124_SN792_0311_AC36GVACXX_3'], - u'8_BSSE_QGF_20041_140124_SN792_0311_AC36GVACXX_8': [u'C36GVACXX,8,BSSE_QGF_20041_140124_SN792_0311_AC36GVACXX_8,27434,CAGATC,16Ny,N,SINGLE_READ_51,ETHZ_D-BSSE,140124_SN792_0311_AC36GVACXX_8'], - u'6_BSSE_QGF_19956_140124_SN792_0311_AC36GVACXX_6': [u'C36GVACXX,6,BSSE_QGF_19956_140124_SN792_0311_AC36GVACXX_6,9606, ,Ina_PseudoUridination,N,SINGLE_READ_51,ETHZ_D-BSSE,140124_SN792_0311_AC36GVACXX_6'], - u'2_BSSE_QGF_19918_140124_SN792_0311_AC36GVACXX_2': [u'C36GVACXX,2,BSSE_QGF_19918_140124_SN792_0311_AC36GVACXX_2,9606,GCCAAT,6_mir_58_L3,N,SINGLE_READ_51,ETHZ_D-BSSE,140124_SN792_0311_AC36GVACXX_2'], - u'2_BSSE_QGF_19916_140124_SN792_0311_AC36GVACXX_2': [u'C36GVACXX,2,BSSE_QGF_19916_140124_SN792_0311_AC36GVACXX_2,9606,TGACCA,4_mir_58_L1,N,SINGLE_READ_51,ETHZ_D-BSSE,140124_SN792_0311_AC36GVACXX_2'], - u'3_BSSE_QGF_19927_140124_SN792_0311_AC36GVACXX_3': [u'C36GVACXX,3,BSSE_QGF_19927_140124_SN792_0311_AC36GVACXX_3,9606,CGATGT,14_wt_N2_2_OLD_,N,SINGLE_READ_51,ETHZ_D-BSSE,140124_SN792_0311_AC36GVACXX_3'], - u'2_BSSE_QGF_19913_140124_SN792_0311_AC36GVACXX_2': [u'C36GVACXX,2,BSSE_QGF_19913_140124_SN792_0311_AC36GVACXX_2,9606,ATCACG,1_wt_L1,N,SINGLE_READ_51,ETHZ_D-BSSE,140124_SN792_0311_AC36GVACXX_2'], - u'3_BSSE_QGF_19929_140124_SN792_0311_AC36GVACXX_3': [u'C36GVACXX,3,BSSE_QGF_19929_140124_SN792_0311_AC36GVACXX_3,9606,TGACCA,16_asd_1_1_OLD_,N,SINGLE_READ_51,ETHZ_D-BSSE,140124_SN792_0311_AC36GVACXX_3'], - u'8_BSSE_QGF_20037_140124_SN792_0311_AC36GVACXX_8': [u'C36GVACXX,8,BSSE_QGF_20037_140124_SN792_0311_AC36GVACXX_8,27434,CGATGT,14An,N,SINGLE_READ_51,ETHZ_D-BSSE,140124_SN792_0311_AC36GVACXX_8'], - u'4_BSSE_QGF_20025_140124_SN792_0311_AC36GVACXX_4': [u'C36GVACXX,4,BSSE_QGF_20025_140124_SN792_0311_AC36GVACXX_4,9606,GAAACC,15_G12_336_TA2,N,SINGLE_READ_51,ETHZ_D-BSSE,140124_SN792_0311_AC36GVACXX_4'], - u'4_BSSE_QGF_20020_140124_SN792_0311_AC36GVACXX_4': [u'C36GVACXX,4,BSSE_QGF_20020_140124_SN792_0311_AC36GVACXX_4,9606,TAGCTT,10_G11_838_TA2,N,SINGLE_READ_51,ETHZ_D-BSSE,140124_SN792_0311_AC36GVACXX_4'], - u'4_BSSE_QGF_20016_140124_SN792_0311_AC36GVACXX_4': [u'C36GVACXX,4,BSSE_QGF_20016_140124_SN792_0311_AC36GVACXX_4,9606,GCCAAT,6_G09_245_NO,N,SINGLE_READ_51,ETHZ_D-BSSE,140124_SN792_0311_AC36GVACXX_4'], - u'7_BSSE_QGF_19956_140124_SN792_0311_AC36GVACXX_7': [u'C36GVACXX,7,BSSE_QGF_19956_140124_SN792_0311_AC36GVACXX_7,9606, ,Ina_PseudoUridination,N,SINGLE_READ_51,ETHZ_D-BSSE,140124_SN792_0311_AC36GVACXX_7'], - u'2_BSSE_QGF_19922_140124_SN792_0311_AC36GVACXX_2': [u'C36GVACXX,2,BSSE_QGF_19922_140124_SN792_0311_AC36GVACXX_2,9606,CTTGTA,10_Q_L1,N,SINGLE_READ_51,ETHZ_D-BSSE,140124_SN792_0311_AC36GVACXX_2'], - u'1_BSSE_QGF_20033_140124_SN792_0311_AC36GVACXX_1': [u'C36GVACXX,1,BSSE_QGF_20033_140124_SN792_0311_AC36GVACXX_1,3569,ATTCCT,6_Dcar_Niedergampel,N,SINGLE_READ_51,ETHZ_D-BSSE,140124_SN792_0311_AC36GVACXX_1'], - u'4_BSSE_QGF_20017_140124_SN792_0311_AC36GVACXX_4': [u'C36GVACXX,4,BSSE_QGF_20017_140124_SN792_0311_AC36GVACXX_4,9606,CAGATC,7_G09_245_TA1,N,SINGLE_READ_51,ETHZ_D-BSSE,140124_SN792_0311_AC36GVACXX_4'], - u'1_BSSE_QGF_20030_140124_SN792_0311_AC36GVACXX_1': [u'C36GVACXX,1,BSSE_QGF_20030_140124_SN792_0311_AC36GVACXX_1,3569,GTGGCC,3_Dcar_Gibidumsee,N,SINGLE_READ_51,ETHZ_D-BSSE,140124_SN792_0311_AC36GVACXX_1'], - u'8_BSSE_QGF_20043_140124_SN792_0311_AC36GVACXX_8': [u'C36GVACXX,8,BSSE_QGF_20043_140124_SN792_0311_AC36GVACXX_8,27434,AGTCAA,14Ny,N,SINGLE_READ_51,ETHZ_D-BSSE,140124_SN792_0311_AC36GVACXX_8'], - u'3_BSSE_QGF_19926_140124_SN792_0311_AC36GVACXX_3': [u'C36GVACXX,3,BSSE_QGF_19926_140124_SN792_0311_AC36GVACXX_3,9606,ATCACG,13_wt_N2_1_OLD_,N,SINGLE_READ_51,ETHZ_D-BSSE,140124_SN792_0311_AC36GVACXX_3'], - u'1_BSSE_QGF_20029_140124_SN792_0311_AC36GVACXX_1': [u'C36GVACXX,1,BSSE_QGF_20029_140124_SN792_0311_AC36GVACXX_1,3569,GATCAG,2_Dcar_Grengiols,N,SINGLE_READ_51,ETHZ_D-BSSE,140124_SN792_0311_AC36GVACXX_1'], - u'3_BSSE_QGF_19936_140124_SN792_0311_AC36GVACXX_3': [u'C36GVACXX,3,BSSE_QGF_19936_140124_SN792_0311_AC36GVACXX_3,9606,AGTCAA,23_fox_1_asd_1_2,N,SINGLE_READ_51,ETHZ_D-BSSE,140124_SN792_0311_AC36GVACXX_3'], - u'3_BSSE_QGF_19935_140124_SN792_0311_AC36GVACXX_3': [u'C36GVACXX,3,BSSE_QGF_19935_140124_SN792_0311_AC36GVACXX_3,9606,CTTGTA,22_fox_1_asd_1_1,N,SINGLE_READ_51,ETHZ_D-BSSE,140124_SN792_0311_AC36GVACXX_3'], - u'2_BSSE_QGF_19921_140124_SN792_0311_AC36GVACXX_2': [u'C36GVACXX,2,BSSE_QGF_19921_140124_SN792_0311_AC36GVACXX_2,9606,GGCTAC,9_58_80_L3,N,SINGLE_READ_51,ETHZ_D-BSSE,140124_SN792_0311_AC36GVACXX_2'], - u'8_BSSE_QGF_20038_140124_SN792_0311_AC36GVACXX_8': [u'C36GVACXX,8,BSSE_QGF_20038_140124_SN792_0311_AC36GVACXX_8,27434,TGACCA,16Ab,N,SINGLE_READ_51,ETHZ_D-BSSE,140124_SN792_0311_AC36GVACXX_8'], - u'8_BSSE_QGF_20044_140124_SN792_0311_AC36GVACXX_8': [u'C36GVACXX,8,BSSE_QGF_20044_140124_SN792_0311_AC36GVACXX_8,27434,AGTTCC,37Ny,N,SINGLE_READ_51,ETHZ_D-BSSE,140124_SN792_0311_AC36GVACXX_8'], - u'4_BSSE_QGF_20012_140124_SN792_0311_AC36GVACXX_4': [u'C36GVACXX,4,BSSE_QGF_20012_140124_SN792_0311_AC36GVACXX_4,9606,CGATGT,2_G11_806_TA1,N,SINGLE_READ_51,ETHZ_D-BSSE,140124_SN792_0311_AC36GVACXX_4'], - u'!': ['FCID,Lane,SampleID,SampleRef,Index,Description,Control,Recipe,Operator,SampleProject'], - u'2_BSSE_QGF_19919_140124_SN792_0311_AC36GVACXX_2': [u'C36GVACXX,2,BSSE_QGF_19919_140124_SN792_0311_AC36GVACXX_2,9606,CAGATC,7_58_80_L1,N,SINGLE_READ_51,ETHZ_D-BSSE,140124_SN792_0311_AC36GVACXX_2'], - u'3_BSSE_QGF_19928_140124_SN792_0311_AC36GVACXX_3': [u'C36GVACXX,3,BSSE_QGF_19928_140124_SN792_0311_AC36GVACXX_3,9606,TTAGGC,15_wt_N2_3_OLD_,N,SINGLE_READ_51,ETHZ_D-BSSE,140124_SN792_0311_AC36GVACXX_3'], - u'3_BSSE_QGF_19932_140124_SN792_0311_AC36GVACXX_3': [u'C36GVACXX,3,BSSE_QGF_19932_140124_SN792_0311_AC36GVACXX_3,9606,CAGATC,19_fox_1_1,N,SINGLE_READ_51,ETHZ_D-BSSE,140124_SN792_0311_AC36GVACXX_3'], - u'8_BSSE_QGF_20039_140124_SN792_0311_AC36GVACXX_8': [u'C36GVACXX,8,BSSE_QGF_20039_140124_SN792_0311_AC36GVACXX_8,27434,ACAGTG,22Ab,N,SINGLE_READ_51,ETHZ_D-BSSE,140124_SN792_0311_AC36GVACXX_8'], - u'2_BSSE_QGF_19917_140124_SN792_0311_AC36GVACXX_2': [u'C36GVACXX,2,BSSE_QGF_19917_140124_SN792_0311_AC36GVACXX_2,9606,ACAGTG,5_mir_58_L2,N,SINGLE_READ_51,ETHZ_D-BSSE,140124_SN792_0311_AC36GVACXX_2'], - u'4_BSSE_QGF_20024_140124_SN792_0311_AC36GVACXX_4': [u'C36GVACXX,4,BSSE_QGF_20024_140124_SN792_0311_AC36GVACXX_4,9606,CAAAAG,14_G12_336_TA1,N,SINGLE_READ_51,ETHZ_D-BSSE,140124_SN792_0311_AC36GVACXX_4'], - u'4_BSSE_QGF_20019_140124_SN792_0311_AC36GVACXX_4': [u'C36GVACXX,4,BSSE_QGF_20019_140124_SN792_0311_AC36GVACXX_4,9606,GATCAG,9_G11_838_TA1,N,SINGLE_READ_51,ETHZ_D-BSSE,140124_SN792_0311_AC36GVACXX_4'], - u'1_BSSE_QGF_20031_140124_SN792_0311_AC36GVACXX_1': [u'C36GVACXX,1,BSSE_QGF_20031_140124_SN792_0311_AC36GVACXX_1,3569,GTTTCG,4_Dcar_Simplonpass,N,SINGLE_READ_51,ETHZ_D-BSSE,140124_SN792_0311_AC36GVACXX_1'], - u'4_BSSE_QGF_20011_140124_SN792_0311_AC36GVACXX_4': [u'C36GVACXX,4,BSSE_QGF_20011_140124_SN792_0311_AC36GVACXX_4,9606,ATCACG,1_G11_806_NO,N,SINGLE_READ_51,ETHZ_D-BSSE,140124_SN792_0311_AC36GVACXX_4'], - u'4_BSSE_QGF_20021_140124_SN792_0311_AC36GVACXX_4': [u'C36GVACXX,4,BSSE_QGF_20021_140124_SN792_0311_AC36GVACXX_4,9606,GGCTAC,11_G09_258_NO,N,SINGLE_READ_51,ETHZ_D-BSSE,140124_SN792_0311_AC36GVACXX_4'], - u'2_BSSE_QGF_19924_140124_SN792_0311_AC36GVACXX_2': [u'C36GVACXX,2,BSSE_QGF_19924_140124_SN792_0311_AC36GVACXX_2,9606,AGTTCC,12_Q_L3,N,SINGLE_READ_51,ETHZ_D-BSSE,140124_SN792_0311_AC36GVACXX_2'], - u'2_BSSE_QGF_19923_140124_SN792_0311_AC36GVACXX_2': [u'C36GVACXX,2,BSSE_QGF_19923_140124_SN792_0311_AC36GVACXX_2,9606,AGTCAA,11_Q_L2,N,SINGLE_READ_51,ETHZ_D-BSSE,140124_SN792_0311_AC36GVACXX_2'], - u'2_BSSE_QGF_19914_140124_SN792_0311_AC36GVACXX_2': [u'C36GVACXX,2,BSSE_QGF_19914_140124_SN792_0311_AC36GVACXX_2,9606,CGATGT,2_wt_L2,N,SINGLE_READ_51,ETHZ_D-BSSE,140124_SN792_0311_AC36GVACXX_2'], - u'3_BSSE_QGF_19931_140124_SN792_0311_AC36GVACXX_3': [u'C36GVACXX,3,BSSE_QGF_19931_140124_SN792_0311_AC36GVACXX_3,9606,GCCAAT,18_asd_1_3_OLD_,N,SINGLE_READ_51,ETHZ_D-BSSE,140124_SN792_0311_AC36GVACXX_3'], - u'1_BSSE_QGF_20032_140124_SN792_0311_AC36GVACXX_1': [u'C36GVACXX,1,BSSE_QGF_20032_140124_SN792_0311_AC36GVACXX_1,3569,CGTACG,5_Dcar_Faldumalp,N,SINGLE_READ_51,ETHZ_D-BSSE,140124_SN792_0311_AC36GVACXX_1'], - u'4_BSSE_QGF_20013_140124_SN792_0311_AC36GVACXX_4': [u'C36GVACXX,4,BSSE_QGF_20013_140124_SN792_0311_AC36GVACXX_4,9606,TTAGGC,3_G11_806_TA2,N,SINGLE_READ_51,ETHZ_D-BSSE,140124_SN792_0311_AC36GVACXX_4'], - u'3_BSSE_QGF_19934_140124_SN792_0311_AC36GVACXX_3': [u'C36GVACXX,3,BSSE_QGF_19934_140124_SN792_0311_AC36GVACXX_3,9606,GGCTAC,21_fox_1_3,N,SINGLE_READ_51,ETHZ_D-BSSE,140124_SN792_0311_AC36GVACXX_3'], - u'3_BSSE_QGF_19937_140124_SN792_0311_AC36GVACXX_3': [u'C36GVACXX,3,BSSE_QGF_19937_140124_SN792_0311_AC36GVACXX_3,9606,AGTTCC,24_fox_1_asd_1_3,N,SINGLE_READ_51,ETHZ_D-BSSE,140124_SN792_0311_AC36GVACXX_3'], - u'2_BSSE_QGF_19915_140124_SN792_0311_AC36GVACXX_2': [u'C36GVACXX,2,BSSE_QGF_19915_140124_SN792_0311_AC36GVACXX_2,9606,TTAGGC,3_wt_L3,N,SINGLE_READ_51,ETHZ_D-BSSE,140124_SN792_0311_AC36GVACXX_2'], - u'4_BSSE_QGF_20015_140124_SN792_0311_AC36GVACXX_4': [u'C36GVACXX,4,BSSE_QGF_20015_140124_SN792_0311_AC36GVACXX_4,9606,ACAGTG,5_G08_792_NO,N,SINGLE_READ_51,ETHZ_D-BSSE,140124_SN792_0311_AC36GVACXX_4'], - u'2_BSSE_QGF_19920_140124_SN792_0311_AC36GVACXX_2': [u'C36GVACXX,2,BSSE_QGF_19920_140124_SN792_0311_AC36GVACXX_2,9606,ACTTGA,8_58_80_L2,N,SINGLE_READ_51,ETHZ_D-BSSE,140124_SN792_0311_AC36GVACXX_2'], - u'1_BSSE_QGF_20028_140124_SN792_0311_AC36GVACXX_1': [u'C36GVACXX,1,BSSE_QGF_20028_140124_SN792_0311_AC36GVACXX_1,3569,TTAGGC,1_Dcar_Unterstalden,N,SINGLE_READ_51,ETHZ_D-BSSE,140124_SN792_0311_AC36GVACXX_1'], - u'8_BSSE_QGF_20040_140124_SN792_0311_AC36GVACXX_8': [u'C36GVACXX,8,BSSE_QGF_20040_140124_SN792_0311_AC36GVACXX_8,27434,GCCAAT,37Br,N,SINGLE_READ_51,ETHZ_D-BSSE,140124_SN792_0311_AC36GVACXX_8'], - u'3_BSSE_QGF_19930_140124_SN792_0311_AC36GVACXX_3': [u'C36GVACXX,3,BSSE_QGF_19930_140124_SN792_0311_AC36GVACXX_3,9606,ACAGTG,17_asd_1_2_OLD_,N,SINGLE_READ_51,ETHZ_D-BSSE,140124_SN792_0311_AC36GVACXX_3'], - u'8_BSSE_QGF_20042_140124_SN792_0311_AC36GVACXX_8': [u'C36GVACXX,8,BSSE_QGF_20042_140124_SN792_0311_AC36GVACXX_8,27434,CTTGTA,26Ny,N,SINGLE_READ_51,ETHZ_D-BSSE,140124_SN792_0311_AC36GVACXX_8']} - - if (sampleSheetDict3 != d3): - self.fail("Dictionaries do not match!") - - def tearDown(self): - pass - -suite = unittest.TestLoader().loadTestsFromTestCase(TestCreateHiseqSampleSheet) -unittest.TextTestRunner(verbosity=2).run(suite) \ No newline at end of file diff --git a/deep_sequencing_unit/source/Jython/createSampleSheet_Illumina_NGS.py b/deep_sequencing_unit/source/Jython/createSampleSheet_Illumina_NGS.py deleted file mode 100644 index 327c19822c288f3c82f159943b7e93d01d401195..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/source/Jython/createSampleSheet_Illumina_NGS.py +++ /dev/null @@ -1,507 +0,0 @@ -''' -@copyright: -Copyright 2013 ETH Zuerich, CISD - -@license: -Licensed under the Apache License, Version 2.0 (the 'License'); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - -http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an 'AS IS' BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. - -@author: -Manuel Kohler - -@description: -Creates the SampleSheet.csv out of values from openBIS for Demultiplexing -used in the Illumina pipeline (configureBclToFastq.pl) - -@attention: -Runs under Jython - -@note: -Takes into account to replace special characters with an underscore so that the Illumina script -does not fail - -HiSeq Header Description -======================== -Column Header Description -FCID Flow cell ID -Lane Positive integer, indicating the lane number (1-8) -SampleID ID of the sample -SampleRef The reference used for alignment for the sample -Index Index sequences. Multiple index reads are separated by a hyphen (for example, ACCAGTAA-GGACATGA). -Description Description of the sample -Control Y indicates this lane is a control lane, N means sample -Recipe Recipe used during sequencing -Operator Name or ID of the operator -SampleProject The project the sample belongs to -''' - -from __future__ import with_statement -import os -import logging -import re -import sys -import string -import smtplib -import operator -from ConfigParser import SafeConfigParser -from optparse import OptionParser -from datetime import * - -from ch.systemsx.cisd.openbis.dss.client.api.v1 import OpenbisServiceFacadeFactory -from ch.systemsx.cisd.openbis.generic.shared.api.v1.dto import SearchCriteria -from ch.systemsx.cisd.openbis.generic.shared.api.v1.dto import SearchSubCriteria -from java.util import EnumSet -from ch.systemsx.cisd.openbis.generic.shared.api.v1.dto import SampleFetchOption - -lineending = {'win32':'\r\n', 'linux':'\n', 'mac':'\r'} -COMMA = ',' -SAMPLETYPE = 'SAMPLETYPE' - -def getLaneAncestors(service, lane, logger): - ''' - Gets all ancestors and corresponding properties of a sample - ''' - fetchOptions = EnumSet.of(SampleFetchOption.ANCESTORS, SampleFetchOption.PROPERTIES) - sc = SearchCriteria(); - sc.addMatchClause(SearchCriteria.MatchClause.createAttributeMatch(SearchCriteria.MatchClauseAttribute.CODE, lane)); - dList = service.searchForSamples(sc, fetchOptions) - - def recursiveSamples(list, codeList, propertyDict): - ''' - Recursively walks through the sample tree and write the sample codes - to a list and the properties into a dictionary. The sample code is - the key, the properties are the values - ''' - - for element in list: - elementCode = element.getCode() - codeList.append(elementCode) - elementProperties = element.getProperties() - - tmpDict = {} - - for eP in elementProperties: - tmpDict[eP] = elementProperties[eP] - - tmpDict[SAMPLETYPE] = element.getSampleTypeCode() - propertyDict[elementCode] = tmpDict - - elementParents = element.getParents() - - if (elementParents.size() > 0): - recursiveSamples(elementParents, codeList, propertyDict) - - codeList = [] - propertyDict = {} - - recursiveSamples(dList, codeList, propertyDict) - - logger.info(codeList) - logger.info(propertyDict) - - return codeList, propertyDict - - -def login(configDict, logger): - logger.info('Logging into ' + configDict['openbisServer']) - try: - service = OpenbisServiceFacadeFactory.tryCreate(configDict['openbisUserName'], - configDict['openbisPassword'], - configDict['openbisServer'], - configDict['connectionTimeout']) - except BaseException: - print ('Could not connect to ' + configDict['openbisServer'] + '. Please check if the server ' + - 'address is OK, the firewall is not blocking the communication, or openBIS is down.') - - return service - -def logout (service, logger): - service.logout() - logger.info('Logged out') - -def setUpLogger(logPath, logLevel=logging.INFO): - logFileName = 'createSampleSheet' - d = datetime.now() - logFileName = logFileName + '_' + d.strftime('%Y-%m-%d_%H_%M_%S') + '.log' - logging.basicConfig(filename=logPath + logFileName, - format='%(asctime)s [%(levelname)s] %(message)s', level=logLevel) - logger = logging.getLogger(logFileName) - return logger - -def parseOptions(logger): - logger.info('Parsing command line parameters') - parser = OptionParser(version='%prog 1.0') - parser.add_option('-f', '--flowcell', - dest='flowcell', - help='The flowcell which is used to create the SampleSheet.csv', - metavar='<flowcell>') - parser.add_option('-l', '--lineending', - dest='lineending', - type='choice', - action='store', - choices=['win32', 'linux', 'mac'], - default='linux', - help='Specify end of line separator: win32, linux, mac. Default: linux' , - metavar='<lineending>') - parser.add_option('-o', '--outdir', - dest='outdir', - default='./', - help='Specify the ouput directory. Default: ./' , - metavar='<outdir>') - parser.add_option('-s', '--singlelane', - dest='singlelane', - default=False, - action='store_true', - help='Creates a single Sample Sheet for each lane. Default: False') - parser.add_option('-d', '--debug', - dest='debug', - default=False, - action='store_true', - help='Verbose debug logging. Default: False') - parser.add_option('-v', '--verbose', - dest='verbose', - default=False, - action='store_true', - help='Write Sample Sheet to stout. Default: False') - - (options, args) = parser.parse_args() - - if options.outdir[-1] <> '/': - options.outdir = options.outdir + '/' - - if options.flowcell is None: - parser.print_help() - exit(-1) - return options - -def parseConfigurationFile(logger, propertyFile='etc/createSampleSheet_Illumina_NGS.properties'): - ''' - Parses the given config files and returns the values - ''' - logger.info('Reading config file ' + propertyFile) - config = SafeConfigParser() - config.read(propertyFile) - config.sections() - return config - -def readConfig(logger): - - GENERAL = 'GENERAL' - OPENBIS = 'OPENBIS' - ILLUMINA = 'ILLUMINA' - - configDict = {} - - configParameters = parseConfigurationFile(logger) - - configDict['facilityName'] = configParameters.get(GENERAL, 'facilityName') - configDict['facilityNameShort'] = configParameters.get(GENERAL, 'facilityNameShort') - configDict['facilityInstitution'] = configParameters.get(GENERAL, 'facilityInstitution') - configDict['sampleSheetFileName'] = configParameters.get(GENERAL, 'sampleSheetFileName') - configDict['separator'] = configParameters.get(GENERAL, 'separator') - configDict['indexSeparator'] = configParameters.get(GENERAL, 'indexSeparator') - - configDict['openbisUserName'] = configParameters.get(OPENBIS, 'openbisUserName') - configDict['openbisPassword'] = configParameters.get(OPENBIS, 'openbisPassword', raw=True) - configDict['openbisServer'] = configParameters.get(OPENBIS, 'openbisServer') - configDict['connectionTimeout'] = configParameters.getint(OPENBIS, 'connectionTimeout') - configDict['illuminaFlowCellTypeName'] = configParameters.get(OPENBIS, 'illuminaFlowCellTypeName') - - configDict['illuminaFlowLaneTypeName'] = configParameters.get(OPENBIS, 'illuminaFlowLaneTypeName') - configDict['libraryPoolTypeName'] = configParameters.get(OPENBIS, 'libraryPoolTypeName') - configDict['libraryTypeName'] = configParameters.get(OPENBIS, 'libraryTypeName') - configDict['rawTypeName'] = configParameters.get(OPENBIS, 'rawTypeName') - configDict['masterTypeName'] = configParameters.get(OPENBIS, 'masterTypeName') - configDict['index1Name'] = configParameters.get(OPENBIS, 'index1Name') - configDict['index2Name'] = configParameters.get(OPENBIS, 'index2Name') - configDict['operator'] = configParameters.get(OPENBIS, 'operator') - configDict['endType'] = configParameters.get(OPENBIS, 'endType') - configDict['lengthIndex1'] = configParameters.get(OPENBIS, 'lengthIndex1') - configDict['lengthIndex2'] = configParameters.get(OPENBIS, 'lengthIndex2') - - configDict['endType'] = configParameters.get(OPENBIS, 'endType') - configDict['cycles'] = configParameters.get(OPENBIS, 'cycles') - configDict['runFolderName'] = configParameters.get(OPENBIS, 'runFolderName') - configDict['ncbiOrganismTaxonomy'] = configParameters.get(OPENBIS, 'ncbiOrganismTaxonomy') - configDict['externalSampleName'] = configParameters.get(OPENBIS, 'externalSampleName') - - configDict['phixNcbiCode'] = configParameters.getint(OPENBIS, 'phixNcbiCode') - - configDict['hiSeqNames'] = configParameters.get(ILLUMINA, 'hiSeqNames') - configDict['hiSeqHeader'] = configParameters.get(ILLUMINA, 'hiSeqHeader') - - return configDict - -def sanitizeString(myString): - return re.sub('[^A-Za-z0-9]+', '_', myString) - -def getVocabulary(vocabularyCode): - ''' Returns the vocabulary terms and vocabulary labels of a vocabulary in a dictionary - specified by the parameter vocabularyCode - ''' - terms = [] - vocabularies = service.listVocabularies() - vocabularyDict = {} - for vocabulary in vocabularies: - if (vocabulary.getCode() == vocabularyCode): - terms = vocabulary.getTerms() - if terms: - for term in terms: - vocabularyDict[term.getCode()] = term.getLabel() - else: - print ('No vocabulary found for ' + vocabularyCode) - return vocabularyDict - -def getFlowCell (illuminaFlowCellTypeName, flowCellName, service, logger): - ''' - Getting the the matching FlowCell - ''' - sc = SearchCriteria(); - sc.addMatchClause(SearchCriteria.MatchClause.createAttributeMatch(SearchCriteria.MatchClauseAttribute.TYPE, illuminaFlowCellTypeName)); - sc.addMatchClause(SearchCriteria.MatchClause.createAttributeMatch(SearchCriteria.MatchClauseAttribute.CODE, flowCellName)); - foundSample = service.searchForSamples(sc) - try: - assert foundSample.size() == 1 - except AssertionError: - print (str(foundSample.size()) + ' flow cells found which match.') - exit(1) - - logger.info('Found ' + foundSample[0].getCode() + ' in openBIS') - # Search for contained samples - sampleSc = SearchCriteria() - sampleSc.addSubCriteria(SearchSubCriteria.createSampleContainerCriteria(sc)) - foundContainedSamples = service.searchForSamples(sampleSc) - - return foundSample[0], foundContainedSamples - - -def getParents(sampleName, service): - ''' - Returns a list of parents of a sample - ''' - sc = SearchCriteria(); - sc.addMatchClause(SearchCriteria.MatchClause.createAttributeMatch(SearchCriteria.MatchClauseAttribute.CODE, sampleName)); - foundSample = service.searchForSamples(sc) - - # set the criteria for getting the parents when providing the child name - sampleSc = SearchCriteria() - sampleSc.addSubCriteria(SearchSubCriteria.createSampleChildCriteria(sc)) - foundParentSamples = service.searchForSamples(sampleSc) - - return foundParentSamples - -def getContainedSampleProperties(logger, containedSamples, service): - ''' - Takes a java.util.ArrayList of contained samples, retrieves the parents and their properties and returns it - as a dictionary. The key is the sample name, the value is a dictionary of the properties - ''' - laneParentDict = {} - - for lane in containedSamples: - parents = getParents (lane.getCode(), service) - - for parent in parents: - parentCode = parent.getCode() - parentProperties = parent.getProperties() - - propertyDict = {} - for property in parentProperties: - propertyDict[property] = parentProperties.get(property) - - propertyDict['LANE'] = lane.getCode() - propertyDict['SAMPLE_TYPE'] = parent.getSampleTypeCode() - myKey = sanitizeString(lane.getCode() + '_' + parentCode) - laneParentDict[myKey] = propertyDict - - logger.info('Found ' + str(len(laneParentDict)) + ' samples on the flow cell.') - return laneParentDict - - -def convertSampleToDict(foundFlowCell, configDict): - ''' - converts <type 'ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.Sample'> to a python dict - ''' - flowCellDict = {} - fcProperties = foundFlowCell.getProperties() - for property in fcProperties: - flowCellDict[property] = fcProperties.get(property) - flowCellDict['Name'] = foundFlowCell.getIdentifier().split('/')[-1] - flowCellDict['CODE'] = foundFlowCell.getCode() - return flowCellDict - -def writeSampleSheet(configDict, flowCellName, sortedSampleSheetList, myoptions, logger, fileName): - ''' - Write the given list of class sampleSheetLine to a csv file - ''' - newline = lineending[myoptions.lineending] - myFile = fileName + '_' + flowCellName + '.csv' - try: - with open(myFile, 'w') as sampleSheetFile: - sampleSheetFile.write(configDict['hiSeqHeader'] + newline) - for laneElement in sortedSampleSheetList: - for indexElement in laneElement: - if myoptions.verbose: - print indexElement - sampleSheetFile.write(indexElement.__str__() + newline) - logger.info('Writing file ' + myFile) - - except IOError: - logger.error('File error: ' + str(err)) - print ('File error: ' + str(err)) - - -def writeSampleSheetPerLane(configDict, flowCellName, sortedSampleSheetList, myoptions, logger, fileName): - ''' - Write the given list of class sampleSheetLine to multiple csv files - ''' - newline = lineending[myoptions.lineending] - - for laneElement in sortedSampleSheetList: - lane = sortedSampleSheetList.index(laneElement) + 1 - myFile = fileName + '_' + flowCellName + '_' + str(lane) +'.csv' - try: - with open(myFile, 'w') as sampleSheetFile: - sampleSheetFile.write(configDict['hiSeqHeader'] + newline) - for indexElement in laneElement: - if myoptions.verbose: - print indexElement - sampleSheetFile.write(indexElement.__str__() + newline) - - logger.info('Writing file ' + myFile) - - except IOError: - logger.error('File error: ' + str(err)) - print ('File error: ' + str(err)) - - - -class sampleSheetLine: - ''' - Represents one line in a Illumina Sample Sheet - ''' - - def __init__(self, fcId='', lane=0, sampleId='', sampleRef='', index='', description='', - control='', recipe='', operator='', sampleProject=''): - self.fcId = fcId - self.lane = lane - self.sampleId = sampleId - self.sampleRef = sampleRef - self.index = index - self.description = description - self.control = control - self.recipe = recipe - self.operator = operator - self.sampleProject = sampleProject - - def __repr__(self): - return self.__str__() - - def __str__(self): - return str(self.fcId) + COMMA + str(self.lane) + COMMA + str(self.sampleId) + COMMA + \ - str(self.sampleRef) + COMMA + str(self.index) + COMMA + str(self.description) + COMMA + \ - str(self.control) + COMMA + str(self.recipe) + COMMA + str(self.operator) + COMMA + \ - str(self.sampleProject) - -def main(): - ''' - Main script - ''' - demuxPenalty = -1 - print datetime.now() - - logger = setUpLogger('log/') - logger.info('Started Creation of Sample Sheet...') - - myoptions = parseOptions(logger) - if myoptions.debug: - logger.setLevel(logging.DEBUG) - - flowCellName = myoptions.flowcell - configDict = readConfig(logger) - service = login(configDict, logger) - - foundFlowCell, containedSamples = getFlowCell(configDict['illuminaFlowCellTypeName'], flowCellName, service, logger) - flowCellName = foundFlowCell.getCode() - flowCellDict = convertSampleToDict(foundFlowCell, configDict) - - index1ReadLength = int(flowCellDict[configDict['lengthIndex1']]) + demuxPenalty - indexRead2Length = int(flowCellDict[configDict['lengthIndex2']]) + demuxPenalty - - laneParentDict = getContainedSampleProperties(logger, containedSamples, service) - - sortedParentList = laneParentDict.keys() - sortedParentList.sort() - - sampleSheetList = [] - - for laneKey in sortedParentList: - lane = laneParentDict[laneKey]['LANE'] - logger.info('Processing Lane '+ lane) - codeList, propertyDict = getLaneAncestors(service, lane, logger) - - ssLine = sampleSheetLine (operator=configDict['facilityInstitution']) - ssLineList = [] - - for code in codeList: - sampleProperties = propertyDict[code] - - # Precedence of the EXTERNAL_SAMPLE_NAME property is: - # RAW_SAMPLE -> LIBRARY -> LIBRARY_POOL - try: - ssLine.description = sanitizeString(sampleProperties[configDict['externalSampleName']]) - except: - pass - - if sampleProperties[SAMPLETYPE] == configDict['libraryTypeName']: - - index = '' - - if configDict['index1Name'] in sampleProperties and index1ReadLength > 0: - index = sampleProperties[configDict['index1Name']][0:index1ReadLength] - - if configDict['index2Name'] in sampleProperties and indexRead2Length > 0: - index = index + configDict['indexSeparator'] + sampleProperties[configDict['index2Name']][0:indexRead2Length] - - ssLine.fcId = flowCellName - ssLine.lane = lane[-1] - ssLine.sampleId = code + '_' + flowCellDict[configDict['runFolderName']] + '_' + ssLine.lane - ssLine.index = index - - if sampleProperties[SAMPLETYPE] == configDict['masterTypeName']: - ssLine.sampleRef = sampleProperties[configDict['ncbiOrganismTaxonomy']] - - # Check if PhiX Control - if int(ssLine.sampleRef) == configDict['phixNcbiCode']: - ssLine.control = 'Y' - else: - ssLine.control = 'N' - - ssLine.recipe = flowCellDict[configDict['endType']] + '_' + flowCellDict[configDict['cycles']] - ssLine.sampleProject = flowCellDict[configDict['runFolderName']] + '_' + ssLine.lane - - ssLineList.append(ssLine) - ssLine = sampleSheetLine (operator=configDict['facilityInstitution']) - - sampleSheetList.append(ssLineList) - - if myoptions.singlelane: - writeSampleSheetPerLane (configDict, flowCellName, sampleSheetList, myoptions, logger, fileName=myoptions.outdir + - configDict['sampleSheetFileName']) - else: - writeSampleSheet(configDict, flowCellName, sampleSheetList, myoptions, logger, fileName=myoptions.outdir + - configDict['sampleSheetFileName']) - - logout(service, logger) - print datetime.now() - -if __name__ == "__main__": - main() diff --git a/deep_sequencing_unit/source/Jython/createSampleSheet_Illumina_NGS_Test.py b/deep_sequencing_unit/source/Jython/createSampleSheet_Illumina_NGS_Test.py deleted file mode 100644 index a6f6db94500b18fb803fb03be7656f9602b3147a..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/source/Jython/createSampleSheet_Illumina_NGS_Test.py +++ /dev/null @@ -1,45 +0,0 @@ -import unittest -import re -from createSampleSheet_Illumina_NGS import * - -class TestsanitizeString(unittest.TestCase): - - def testDefault(self): - self.assertEqual(sanitizeString('abc#a$v%c^D&P-'), 'abc_a_v_c_D_P_') - - def testOnlySpecialChars(self): - self.assertEqual(sanitizeString('@#$%^&*('), '_') - - -class TestGetFlowCell(unittest.TestCase): - - def setUp(self): - self.logger = setUpLogger('log/') - configDict = readConfig(self.logger) - self.service = OpenbisServiceFacadeFactory.tryCreate(configDict['openbisUserName'], - configDict['openbisPassword'], - configDict['openbisServer'], - configDict['connectionTimeout']) - print('Ran SetUp...') - - - def testGetFlowCell (self): - - myCode = 'D1W0VACXX' - foundFlowCell, containedSamples = getFlowCell ('ILLUMINA_FLOW_CELL', myCode, self.service, self.logger) - - self.assertEqual(foundFlowCell.getCode(), myCode) - self.assertEqual(containedSamples.size(), 8) - - fcProp = foundFlowCell.getProperties() - self.assertEqual(fcProp['SEQUENCER'], 'SN792') - - def tearDown(self): - self.service.logout() - self.logger.info('Logged out') - -def main(): - unittest.main() - -if __name__ == '__main__': - main() \ No newline at end of file diff --git a/deep_sequencing_unit/source/Jython/createSampleSheet_bcl2fastq.py b/deep_sequencing_unit/source/Jython/createSampleSheet_bcl2fastq.py deleted file mode 100644 index a3b321c76f3b40a4eccaf3e885484926b87029c5..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/source/Jython/createSampleSheet_bcl2fastq.py +++ /dev/null @@ -1,786 +0,0 @@ -''' -@copyright: -Copyright 2016 ETH Zuerich, SIS - -@license: -Licensed under the Apache License, Version 2.0 (the 'License'); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - -http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an 'AS IS' BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. - -@author: -Manuel Kohler - -@description: -Creates the SampleSheet.csv out of values from openBIS for Demultiplexing -used in the Illumina pipeline (bcl2fastq) - -@attention: -Runs under Jython - -@note: -Takes into account to replace special characters with an underscore so that the Illumina script -does not fail - -HiSeq Header Description -======================== -Column Header Description -FCID Flow cell ID -Lane Positive integer, indicating the lane number (1-8) -SampleID ID of the sample -SampleRef The reference used for alignment for the sample -Index Index sequences. Multiple index reads are separated by a hyphen (for example, ACCAGTAA-GGACATGA). -Description Description of the sample -Control Y indicates this lane is a control lane, N means sample -Recipe Recipe used during sequencing -Operator Name or ID of the operator -SampleProject The project the sample belongs to -''' - -import os -import logging -import re -import sys -import string -import smtplib -import argparse -from ConfigParser import SafeConfigParser -from datetime import * -from collections import OrderedDict - -from email.MIMEMultipart import MIMEMultipart -from email.MIMEBase import MIMEBase -from email.MIMEText import MIMEText -from email.Utils import COMMASPACE, formatdate -from email import Encoders - -from ch.systemsx.cisd.openbis.dss.client.api.v1 import OpenbisServiceFacadeFactory -from ch.systemsx.cisd.openbis.generic.shared.api.v1.dto import SearchCriteria -from ch.systemsx.cisd.openbis.generic.shared.api.v1.dto import SearchSubCriteria - -lineending = {'win32':'\r\n', 'linux':'\n', 'mac':'\r'} -COMMA = ',' -CSV = ".csv" - - -class Sequencers: - HISEQ_4000, HISEQ_3000, HISEQ_2500, HISEQ_2000, HISEQ_X, NEXTSEQ_500, MISEQ , UNIDENTIFIED = \ - ('Illumina HiSeq 4000', 'Illumina HiSeq 3000', 'Illumina HiSeq 2500', 'Illumina HiSeq 2000', - 'Illumina HiSeq X', 'Illumina NextSeq 500', 'Illumina MiSeq', 'Unidentified') -HISEQ_LIST = [Sequencers.HISEQ_2000, Sequencers.HISEQ_2500, Sequencers.HISEQ_3000, Sequencers.HISEQ_4000, Sequencers.HISEQ_X] - - -def login(logger, config_dict): - logger.info('Logging into ' + config_dict['openbisServer']) - service = OpenbisServiceFacadeFactory.tryCreate(config_dict['openbisUserName'], - config_dict['openbisPassword'], - config_dict['openbisServer'], - config_dict['connectionTimeout']) - return service - - -def logout (service, logger): - service.logout() - logger.info('Logged out') - - -def setUpLogger(logPath, logLevel=logging.INFO): - logFileName = 'create_sample_sheet_dict' - d = datetime.now() - logFileName = logFileName + '_' + d.strftime('%Y-%m-%d_%H_%M_%S') + '.log' - logging.basicConfig(filename=logPath + logFileName, - format='%(asctime)s [%(levelname)s] %(message)s', level=logLevel) - logger = logging.getLogger(logFileName) - return logger - - -def parseOptions(logger): - logger.info('Parsing command line parameters') - parser = argparse.ArgumentParser(version='%prog 1.0', description='Process some integers.') - parser.add_argument('-f', '--flowcell', - dest='flowcell', - help='The flowcell which is used to create the SampleSheet.csv', - metavar='<flowcell>') - parser.add_argument('-m', '--mailist', - dest='maillist', - default=False, - action='store_true', - help='Generated Sample Sheet will be addtionally sent as email to the defined list of recipients') - parser.add_argument('-l', '--lineending', - dest='lineending', - action='store', - choices=['win32', 'linux', 'mac'], - default='win32', - help='Specify end of line separator: win32, linux, mac. Default: win32' , - metavar='<lineending>') - parser.add_argument('-o', '--outdir', - dest='outdir', - default='./', - help='Specify the ouput directory. Default: ./' , - metavar='<outdir>') - parser.add_argument('-s', '--singlelane', - dest='singlelane', - default=True, - action='store_true', - help='Creates a single Sample Sheet for each lane. Default: False') - parser.add_argument('-d', '--debug', - dest='debug', - default=False, - action='store_true', - help='Verbose debug logging. Default: False') - parser.add_argument('--verbose', - dest='verbose', - default=False, - action='store_true', - help='Write Sample Sheet to stout. Default: False') - - args = parser.parse_args() - - if args.outdir[-1] <> '/': - args.outdir = args.outdir + '/' - - if args.flowcell is None: - parser.print_help() - exit(-1) - return args - - -def parseConfigurationFile(propertyFile='etc/createSampleSheet.properties'): - ''' - Parses the given config files and returns the values - ''' - config = SafeConfigParser() - config.read(propertyFile) - config.sections() - return config - - -def readConfig(logger): - GENERAL = 'GENERAL' - OPENBIS = 'OPENBIS' - ILLUMINA = 'ILLUMINA' - - logger.info('Reading config file') - config_dict = {} - - configParameters = parseConfigurationFile() - config_dict['facilityName'] = configParameters.get(GENERAL, 'facilityName') - config_dict['facilityNameShort'] = configParameters.get(GENERAL, 'facilityNameShort') - config_dict['facilityInstitution'] = configParameters.get(GENERAL, 'facilityInstitution') - config_dict['mailList'] = configParameters.get(GENERAL, 'mailList') - config_dict['mailFrom'] = configParameters.get(GENERAL, 'mailFrom') - config_dict['smptHost'] = configParameters.get(GENERAL, 'smptHost') - config_dict['SampleSheetFileName'] = configParameters.get(GENERAL, 'SampleSheetFileName') - config_dict['separator'] = configParameters.get(GENERAL, 'separator') - config_dict['indexSeparator'] = configParameters.get(GENERAL, 'indexSeparator') - - config_dict['openbisUserName'] = configParameters.get(OPENBIS, 'openbisUserName') - config_dict['openbisPassword'] = configParameters.get(OPENBIS, 'openbisPassword', raw=True) - config_dict['openbisServer'] = configParameters.get(OPENBIS, 'openbisServer') - config_dict['connectionTimeout'] = configParameters.getint(OPENBIS, 'connectionTimeout') - config_dict['illuminaFlowCellTypeName'] = configParameters.get(OPENBIS, 'illuminaFlowCellTypeName') - config_dict['index1Name'] = configParameters.get(OPENBIS, 'index1Name') - config_dict['index2Name'] = configParameters.get(OPENBIS, 'index2Name') - config_dict['index1Length'] = configParameters.get(OPENBIS, 'index1Length') - config_dict['index2Length'] = configParameters.get(OPENBIS, 'index2Length') - config_dict['endType'] = configParameters.get(OPENBIS, 'endType') - config_dict['cycles'] = configParameters.get(OPENBIS, 'cycles') - config_dict['controlLane'] = configParameters.get(OPENBIS, 'controlLane') - config_dict['ncbi'] = configParameters.get(OPENBIS, 'ncbi') - config_dict['externalSampleName'] = configParameters.get(OPENBIS, 'externalSampleName') - config_dict['laneCount'] = configParameters.get(OPENBIS, 'laneCount') - config_dict['kit'] = configParameters.get(OPENBIS, 'kit') - config_dict['10XSampleType'] = configParameters.get(OPENBIS, '10XSampleType') - config_dict['10XIndexSet'] = configParameters.get(OPENBIS, '10XIndexSet') - config_dict['recovered_cells'] = configParameters.get(OPENBIS, 'recovered_cells') - - config_dict['headerSection'] = configParameters.get(ILLUMINA, 'headerSection') - config_dict['readsSection'] = configParameters.get(ILLUMINA, 'readsSection') - config_dict['settingsSection'] = configParameters.get(ILLUMINA, 'settingsSection') - config_dict['dataSectionSingleRead'] = configParameters.get(ILLUMINA, 'dataSectionSingleRead') - config_dict['dataSectionDualRead'] = configParameters.get(ILLUMINA, 'dataSectionDualRead') - config_dict['workflow'] = configParameters.get(ILLUMINA, 'workflow') - config_dict['application'] = configParameters.get(ILLUMINA, 'application') - config_dict['chemistry'] = configParameters.get(ILLUMINA, 'chemistry') - - config_dict['truSeqAdapter1'] = configParameters.get(ILLUMINA, 'truSeqAdapter1') - config_dict['truSeqAdapter2'] = configParameters.get(ILLUMINA, 'truSeqAdapter2') - config_dict['nexteraAdapter'] = configParameters.get(ILLUMINA, 'nexteraAdapter') - config_dict['iemFileVersion'] = configParameters.get(ILLUMINA, 'iemFileVersion') - - config_dict['configureBclToFastqPath'] = configParameters.get(ILLUMINA, 'configureBclToFastqPath') - config_dict['failedReads'] = configParameters.get(ILLUMINA, 'failedReads') - config_dict['clusterCount'] = configParameters.get(ILLUMINA, 'clusterCount') - config_dict['clusterCountNumber'] = configParameters.get(ILLUMINA, 'clusterCountNumber') - config_dict['outputDir'] = configParameters.get(ILLUMINA, 'outputDir') - config_dict['sampleSheetName'] = configParameters.get(ILLUMINA, 'sampleSheetName') - config_dict['baseMask'] = configParameters.get(ILLUMINA, 'baseMask') - - return config_dict - - -def getDate(): - d = datetime.now() - return d.strftime('%A, %d of %B %Y') - - -def sanitize_string(myString): - return re.sub('[^A-Za-z0-9]+', '_', myString) - - -def get_vocabulary(vocabulary_code, service): - """ - Returns the vocabulary terms and vocabulary labels of a vocabulary in a dictionary - specified by the parameter vocabularyCode - """ - - terms = [] - vocabularies = service.listVocabularies() - vocabulary_dict = {} - for vocabulary in vocabularies: - if vocabulary.getCode() == vocabulary_code: - terms = vocabulary.getTerms() - if terms: - for term in terms: - vocabulary_dict[term.getCode()] = term.getLabel() - else: - print ('No vocabulary found for ' + vocabulary_code) -# print(vocabulary_dict) - return vocabulary_dict - - -def send_email(emails, flowCellName, config_dict, logger, subject, body, files=""): - """ - Send out an email to the specified recipients - """ - COMMASPACE = ', ' - emails_list = emails.split() - - msg = MIMEMultipart() - msg['From'] = config_dict['mailFrom'] - msg['To'] = COMMASPACE.join(emails_list) - msg['Date'] = formatdate(localtime=True) - msg['Subject'] = subject - - msg.attach(MIMEText(body)) - - for f in files: - part = MIMEBase('application', 'octet-stream') - part.set_payload(open(f, 'rb').read()) - Encoders.encode_base64(part) - part.add_header('Content-Disposition', 'attachment; filename="%s"' % os.path.basename(f)) - msg.attach(part) - - smtp = smtplib.SMTP(config_dict['smptHost']) - smtp.sendmail(config_dict['mailFrom'], emails_list, msg.as_string()) - smtp.close() - logger.info('Sent email to ' + COMMASPACE.join(emails_list)) - - -def get_flowcell (illuminaFlowCellTypeName, flowCellName, service, logger): - """ - Getting the the matching FlowCell - """ - sc = SearchCriteria(); - sc.addMatchClause(SearchCriteria.MatchClause.createAttributeMatch(SearchCriteria.MatchClauseAttribute.TYPE, illuminaFlowCellTypeName)); - sc.addMatchClause(SearchCriteria.MatchClause.createAttributeMatch(SearchCriteria.MatchClauseAttribute.CODE, flowCellName)); - foundSample = service.searchForSamples(sc) - try: - assert foundSample.size() == 1 - except AssertionError: - print (str(foundSample.size()) + ' flow cells found which match.') - exit(1) - - logger.info('Found ' + foundSample[0].getCode() + ' in openBIS') - # Search for contained samples - sampleSc = SearchCriteria() - sampleSc.addSubCriteria(SearchSubCriteria.createSampleContainerCriteria(sc)) - foundContainedSamples = service.searchForSamples(sampleSc) - - return foundSample[0], foundContainedSamples - - -def get_reverse_complement(sequence): - lookup_table = {'A': 'T', 'T': 'A', 'G': 'C', 'C': 'G'} - reverse_complement = '' - for nucleotide in reversed(sequence): - reverse_complement += lookup_table[nucleotide] - return reverse_complement - - -def get_model(run_id): - """ - Guesses the sequencer model from the run folder name - - Current Naming schema for Illumina run folders, as far as I know, - no documentation found on this, Illumina introduced a field called - <InstrumentID> on the NextSeq runParameters.xml. That might be an - option for the future. Alternatively a combination of the fields - <ApplicationName> and <ApplicationVersion>. - - MiSeq: 150130_M01761_0114_000000000-ACUR0 - NextSeq: 150202_NS500318_0047_AH3KLMBGXX - HiSeq 2000: 130919_SN792_0281_BD2CHRACXX - HiSeq 2500: 150203_D00535_0052_AC66RWANXX - HiSeq 3000: 150724_J00121_0017_AH2VYMBBXX - HiSeq 4000: 150210_K00111_0013_AH2372BBXX - HiSeq X: 141121_ST-E00107_0356_AH00C3CCXX - """ - date, machine_id, run_number, fc_string = os.path.basename(run_id).split("_") - - if machine_id.startswith("NS"): - model = Sequencers.NEXTSEQ_500 - elif machine_id.startswith("M"): - model = Sequencers.MISEQ - elif machine_id.startswith("D"): - model = Sequencers.HISEQ_2500 - elif machine_id.startswith("SN"): - model = Sequencers.HISEQ_2000 - elif machine_id.startswith("J"): - model = Sequencers.HISEQ_3000 - elif machine_id.startswith("K"): - model = Sequencers.HISEQ_4000 - elif machine_id.startswith("ST"): - model = Sequencers.HISEQ_X - else: - model = Sequencers.UNIDENTIFIED - return model - - -def get_parents(sampleName, service): - """ - Returns a list of parents of a sample - """ - sc = SearchCriteria(); - sc.addMatchClause(SearchCriteria.MatchClause.createAttributeMatch(SearchCriteria.MatchClauseAttribute.CODE, sampleName)); - foundSample = service.searchForSamples(sc) - - try: - assert foundSample.size() == 1 - except AssertionError: - print (str(foundSample.size()) + ' flow lanes found which match.') - - # set the criteria for getting the parents when providing the child name - sampleSc = SearchCriteria() - sampleSc.addSubCriteria(SearchSubCriteria.createSampleChildCriteria(sc)) - foundParentSamples = service.searchForSamples(sampleSc) - - return foundParentSamples - - -def get_lane_sample_properties(lane, service, config_dict): - parentDict = {} - parents = get_parents (lane.getCode(), service) - - try: - assert parents.size() >= 1 - except AssertionError: - pass - - for parent in parents: - parentCode = parent.getCode() - parentProperties = parent.getProperties() - propertyDict = {} - for property in parentProperties: - propertyDict[property] = parentProperties.get(property) - - propertyDict['LANE'] = lane.getCode() - - myKey = sanitize_string(parentCode + '_' + lane.getCode()) - parentDict[myKey] = propertyDict - - return parentDict - - - -def get_contained_sample_properties(contained_samples, service, config_dict): - """ - Takes a list of contained samples, retrieves the parents and their properties and returns it - as a dictionary. The key is the sample name, the value is a list of the properties - - Additionally a dictionary with the lane (key) and the number of samples (value) is returned - """ - parentDict = {} - samplesPerLaneDict = {} - barcodesPerLaneDict = {} - - for lane in contained_samples: - parents = get_parents (lane.getCode(), service) - - try: - assert parents.size() >= 1 - except AssertionError: - pass -# print (str(parents.size()) + ' parents found for lane ' + lane.getCode()) - - samplesPerLaneDict[lane.getCode()[-1]] = len(parents) - - for parent in parents: - parentCode = parent.getCode() - parentProperties = parent.getProperties() - propertyDict = {} - for property in parentProperties: - propertyDict[property] = parentProperties.get(property) - - propertyDict['LANE'] = lane.getCode() - plain_lane = lane.getCode().split(':')[-1] - - try: - if barcodesPerLaneDict.has_key(plain_lane): - barcodesPerLaneDict[plain_lane].append(propertyDict[config_dict['index1Name']]) - else: - barcodesPerLaneDict[plain_lane] = [propertyDict[config_dict['index1Name']]] - except: - pass - - try: - if barcodesPerLaneDict.has_key(plain_lane): - barcodesPerLaneDict[plain_lane].append(propertyDict[config_dict['10XIndexSet']]) - else: - barcodesPerLaneDict[plain_lane] = [propertyDict[config_dict['10XIndexSet']]] - except: - pass - - myKey = sanitize_string(parentCode + '_' + lane.getCode()) - parentDict[myKey] = propertyDict - - return parentDict, samplesPerLaneDict, barcodesPerLaneDict - - -def transform_sample_to_dict(foundFlowCell): - """ - converts <type 'ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.Sample'> to a python dict - """ - flowCellDict = {} - fcProperties = foundFlowCell.getProperties() - - for property in fcProperties: - flowCellDict[property] = fcProperties.get(property) - flowCellDict['Project'] = foundFlowCell.getExperimentIdentifierOrNull().split('/')[-1] - flowCellDict['Name'] = foundFlowCell.getIdentifier().split('/')[-1] - return flowCellDict - - -def write_sample_sheet_single_lane(model, ordered_sample_sheet_dict, flowCellDict, index_length_dict, - parentDict, config_dict, myoptions, logger, csv_file): - - newline = lineending[myoptions.lineending] - - if (model is Sequencers.NEXTSEQ_500): - lane_number = 2 - else: - lane_number = int(flowCellDict[config_dict['laneCount']]) + 1 - - for lane in range(1, lane_number): - header_list = create_header_section (model, config_dict, parentDict, flowCellDict, index_length_dict, lane) - per_lane_dict = [ordered_sample_sheet_dict[key] for key in ordered_sample_sheet_dict.keys() if int(key[0]) == lane] - csv_file_path = myoptions.outdir + csv_file + "_" + str(lane) + CSV - try: - with open(csv_file_path, 'wb') as sample_sheet_file: - for header_element in header_list: - sample_sheet_file.write(header_element + newline) - if myoptions.verbose: - print(header_element + newline) - for sample in per_lane_dict: - sample_sheet_file.write(str(sample[0]) + newline) - if myoptions.verbose: - print(str(sample[0]) + newline) - except IOError: - logger.error('File error: ' + str(err)) - print ('File error: ' + str(err)) - -def write_marker_file(flowCellDict, myoptions): - marker_file_path = myoptions.outdir + ".10x_run_" + flowCellDict['Name'] - with open(marker_file_path, 'wb') as marker_file: - for flowcell_prop in flowCellDict: - marker_file.write(flowcell_prop) - - -def create_header_section (model, config_dict, parentDict, flowCellDict, index_length_dict, lane): - - kitsDict = {"CHIP_SEQ_SAMPLE_PREP" : ["", ""], - "TRUSEQ_RNA_SAMPLEPREPKIT_V2_ILLUMINA" : ["A", "TruSeq LT"], - "NEXTERA_XT_DNA_SAMPLE_PREPARATION_KIT_ILLUMINA" : ["S", "Nextera XT"], - "TRUSEQ_CHIP_SAMPLE_PREP_KIT" : ["A", "TruSeq LT"], - "MRNA_SEQ_SAMPLE_PREP" : ["", ""], - "TRUSEQRNA_SAMPLE_PREP_KIT" : ["A", "TruSeq LT"], - "NEBNEXT_DNA_SAMPLE_PREP_MASTER_MIX_SET1" : ["A", "TruSeq LT"], - "NEBNEXT_CHIP-SEQ_LIBRARY_PREP_REAGENT_SET" : ["A", "TruSeq LT"], - "RIBOZERO_SCRIPTSEQ_MRNA-SEQ_KIT" : ["", ""], - "NEXTERA_DNA_SAMPLE_PREPARATION_KIT_ILLUMINA" : ["N", "Nextera"], - "GENOMICDNA_SAMPLE_PREP" : ["", ""], - "AGILENT_SURESELECTXT_AUTOMATEDLIBRARYPREP" : ["", ""], - "TRUSEQ_DNA_SAMPLE_PREP_KIT" : ["A", "TruSeq LT"], - "NEXTERA_DNA_SAMPLE_PREP_KITS" : ["N", "Nextera"], - "AGILENT_SURESELECT_ENRICHMENTSYSTEM" : ["", ""], - "TRUSEQ_DNA_SAMPLE_PREP_KIT_V2" : ["A", "TruSeq LT"], - "AGILENT_SURESELECT_HUMAN_ALL_EXON_V5_UTRS" : ["", ""], - "POLYA_SCRIPTSEQ_MRNA-SEQ_KIT" : ["", ""], - "AGILENT_SURESELECTXT2_MOUSE_ALL_EXON" : ["", ""], - "PAIRED_END_DNA_SAMPLE_PREP" : ["", ""], - "NEXTERA_DNA_SAMPLE_PREP_KIT_BUFFER_HMW" : ["N", "Nextera"] - } - - separator = config_dict['separator'] - header_list = [] - - len_index1 = index_length_dict[int(lane)][0] - len_index2 = index_length_dict[int(lane)][1] - - # here we take the first sample to determine the Sample Prep Kit - try: - assay = kitsDict [parentDict.itervalues().next()[config_dict['kit']]][1] - except: -# print "No Kit set for sample. Will not set the assay value in the sample sheet" - assay = "" - - header_section = config_dict['headerSection'].split(separator) - header_section.reverse() - header_list = [header_section.pop().strip()] - header_list.append(header_section.pop().strip() + separator + config_dict['iemFileVersion']) - header_list.append(header_section.pop().strip() + separator + config_dict['facilityInstitution']) - header_list.append(header_section.pop().strip() + separator + config_dict['facilityName']) - header_list.append(header_section.pop().strip() + separator + flowCellDict['Name']) - header_list.append(header_section.pop().strip() + separator + datetime.now().strftime('%m/%d/%Y')) - header_list.append(header_section.pop().strip() + separator + config_dict['workflow']) - header_list.append(header_section.pop().strip() + separator + config_dict['application']) - header_list.append(header_section.pop().strip() + separator + assay) - header_list.append(header_section.pop().strip() + separator + flowCellDict[config_dict['endType']] + '_' + flowCellDict[config_dict['cycles']]) - header_list.append(header_section.pop().strip() + separator + config_dict['chemistry']) -# if config_dict['10XIndexSet']: -# header_list.append(config_dict['recovered_cells']) - header_list.append('') - - reads_section = config_dict['readsSection'].split(separator) - reads_section.reverse() - header_list.append(reads_section.pop()) - header_list.append(flowCellDict[config_dict['cycles']]) - if (flowCellDict[config_dict['endType']] == 'PAIRED_END'): - header_list.append(flowCellDict[config_dict['cycles']]) - header_list.append('') - - settings_section = config_dict['settingsSection'].split(separator) - settings_section.reverse() - header_list.append(settings_section.pop()) -# if ('nextera' in assay.lower()): -# header_list.append(config_dict['nexteraAdapter']) -# if ('truseq' in assay.lower()): -# header_list.append(config_dict['truSeqAdapter1']) -# header_list.append(config_dict['truSeqAdapter2']) - header_list.append('') - - if int(flowCellDict['INDEXREAD2']) > 0 and len_index2 > 0: - SeqDataSection = config_dict['dataSectionDualRead'].split(',') - else: - SeqDataSection = config_dict['dataSectionSingleRead'].split(',') - - SeqDataSection.reverse() - header_list.append(SeqDataSection.pop()) - - if model in Sequencers.NEXTSEQ_500: - # leaving out the 'Lane', as there are four but treat them as one - header_list.append(','.join(SeqDataSection.pop().strip().split()[1:])) - else: - header_list.append(','.join(SeqDataSection.pop().strip().split())) - - return header_list - - -def verify_index_length (parentDict, flowCellDict, config_dict, logger): - - index_length_dict = {} - verified_per_lane_dict = [] - - flowcell_len_index1 = int(flowCellDict['INDEXREAD']) - flowcell_len_index2 = int(flowCellDict['INDEXREAD2']) - - logger.info("Flowcell has index length [" + str(flowcell_len_index1) + ", " + str(flowcell_len_index2) + "]") - - for lane in range(1, int(flowCellDict['LANECOUNT']) + 1): - index1_set = set () - index2_set = set () - index1_length = 0 - index2_length = 0 - - logger.info("Lane: " + str(lane)) - per_lane_list = [parentDict[key] for key in parentDict.keys() if int(key[-1]) == lane] - - for sample in per_lane_list: - # If no index then just skip this sample - if (config_dict['index1Name'] not in sample) or (sample[config_dict['index1Name']] == 'NOINDEX'): - continue - index1 = sample[config_dict['index1Name']] - index2 = "" - if config_dict['index2Name'] in sample: - index2 = sample[config_dict['index2Name']] - - index1_set.add(len(index1)) - if index2: - index2_set.add(len(index2)) - else: - index2_set.add(0) - - # adding the index length of the flow cell to make sure that dual-indexed - # samples also work on a single-indexed run - index1_set.add(flowcell_len_index1) - index2_set.add(flowcell_len_index2) - - if index1_set: - index1_length = min(index1_set) - if index2_set: - index2_length = min(index2_set) - - index_length_dict[lane] = [index1_length, index2_length] - logger.info("Index1 Length Set: " + str(index1_set)) - logger.info("Index2 Length Set: " + str(index2_set)) - logger.info("Final length of index1 " + str(index1_length)) - logger.info("Final length of index2 " + str(index2_length)) - # print("Lane " + str(lane) + " [" + str(index1_length) + "," + str(index2_length) + "]") - - return index_length_dict - - -def create_sample_sheet_dict(service, barcodesPerLaneDict, containedSamples, samplesPerLaneDict, model, parentDict, index_length_dict, flowCellDict, - config_dict, index1Vocabulary, index2Vocabulary, flowCellName, logger): - - sampleSheetDict = {} - _10_run = False - separator = config_dict['separator'] - - for lane in containedSamples: - lane_sample_properties = get_lane_sample_properties(lane, service, config_dict) - lane_int = lane.getCode().split(':')[-1] - single_index_set = False - - try: - logger.info(barcodesPerLaneDict[lane_int]) - except: - print("No index found for lane " + str(lane_int) + ". Using the first sample which is not phix.") - for key in lane_sample_properties.keys(): - if lane_sample_properties[key][u'NCBI_ORGANISM_TAXONOMY'] != u'10847' and not single_index_set: - index1 = "" - lane_string = "" - if model in HISEQ_LIST or model in Sequencers.MISEQ: - lane_string = lane_int + separator - - line = separator.join([lane_string + key, key + '_' + sanitize_string(lane_sample_properties[key][config_dict['externalSampleName']]), "", "", "", "", key, ""]) - sampleSheetDict[lane_int + '_' + key] = [line] - single_index_set = True - - - for key in lane_sample_properties.keys(): - - # If no index or 'NOINDEX' assigned then just skip this sample - if ((config_dict['index1Name'] not in lane_sample_properties[key] or lane_sample_properties[key][config_dict['index1Name']] == 'NOINDEX') and - config_dict['10XIndexSet'] not in lane_sample_properties[key]): - continue - - index1 = "" - index2 = "" - - if config_dict['index1Name'] in lane_sample_properties[key]: - index1 = lane_sample_properties[key][config_dict['index1Name']] - len_index1 = index_length_dict[int(lane_int)][0] - - if config_dict['10XIndexSet'] in lane_sample_properties[key]: - index1 = lane_sample_properties[key][config_dict['10XIndexSet']] - # Do not modify the index length, as these are index sets provided by 10x - len_index1 = len(index1) - _10_run = True - - if config_dict['index2Name'] in lane_sample_properties[key]: - index2 = lane_sample_properties[key][config_dict['index2Name']] - # Not needed, won't use it any more - indexNumber = index2Vocabulary[lane_sample_properties[key][config_dict['index2Name']]].split()[2] - - # try: - # kit = lane_sample_properties[key][config_dict['kit']] - # prefix = kitsDict[kit][0] - # except: - # prefix = "" - - len_index2 = index_length_dict[int(lane_int)][1] - - lane_string = "" - if model in HISEQ_LIST or model in Sequencers.MISEQ: - lane_string = lane_int + separator - - if int(flowCellDict['INDEXREAD2']) > 0 and len_index2 > 0: - if model in Sequencers.NEXTSEQ_500: - index2_processed = get_reverse_complement(index2[0:len_index2]) - else: - index2_processed = index2 - - line = separator.join([lane_string + key, - key + '_' + sanitize_string(lane_sample_properties[key][config_dict['externalSampleName']]) + '_' + index1[0:len_index1] + '_' + index2[0:len_index2], - "", "", "", index1[0:len_index1], "", index2_processed, key, ""]) - sampleSheetDict[lane_int + '_' + key] = [line] - - else: - line = separator.join([lane_string + key, key + '_' + sanitize_string(lane_sample_properties[key][config_dict['externalSampleName']]) + '_' + index1[0:len_index1], - "", "", "", index1[0:len_index1], key, ""]) - sampleSheetDict[lane_int + '_' + key] = [line] - - csv_file_name = config_dict['SampleSheetFileName'] + '_' + flowCellName - ordered_sample_sheet_dict = OrderedDict(sorted(sampleSheetDict.items(), key=lambda t: t[0])) - - return _10_run, ordered_sample_sheet_dict, csv_file_name - -''' -Main script -''' - -def main (): - - logger = setUpLogger('log/') - logger.info('Started Creation of Sample Sheet...') - - myoptions = parseOptions(logger) - - if myoptions.debug: - logger.setLevel(logging.DEBUG) - - flowCellName = myoptions.flowcell - config_dict = readConfig(logger) - service = login(logger, config_dict) - - foundFlowCell, containedSamples = get_flowcell(config_dict['illuminaFlowCellTypeName'], flowCellName, - service, logger) - parentDict, samplesPerLaneDict, barcodesPerLaneDict = get_contained_sample_properties(containedSamples, service, config_dict) - flowCellName = foundFlowCell.getCode() - flowCellDict = transform_sample_to_dict(foundFlowCell) - model = get_model(flowCellDict['RUN_NAME_FOLDER']) - if not myoptions.verbose: - print("Auto-detected: " + model) - logger.info("Auto-detected: " + model) - - index1Vocabulary = get_vocabulary(config_dict['index1Name'], service) - index2Vocabulary = get_vocabulary(config_dict['index2Name'], service) - index_length_dict = verify_index_length(parentDict, flowCellDict, config_dict, logger) - _10_run, ordered_sample_sheet_dict, csv_file_name = create_sample_sheet_dict(service, barcodesPerLaneDict, containedSamples, - samplesPerLaneDict, model, parentDict, index_length_dict, - flowCellDict, config_dict, index1Vocabulary, index2Vocabulary, - flowCellName, logger) - if len(ordered_sample_sheet_dict) < len(containedSamples): - subject = "Warning: Creation of Sample Sheet (" + flowCellName + ") failed. No indices found." - body = "Warning: No parents/libraries assigned to one of the flowlanes of " + flowCellName + \ - ". Either it is a non-indexed lane or the parents are not set.\n" + \ - "Check in the following map for missing lanes:\n" + str(ordered_sample_sheet_dict) - send_email(config_dict['mailList'], flowCellName, config_dict, logger, subject, body) - else: - write_sample_sheet_single_lane(model, ordered_sample_sheet_dict, flowCellDict, index_length_dict, - parentDict, config_dict, myoptions, logger, csv_file_name) - if _10_run: - write_marker_file(flowCellDict, myoptions) - - logout(service, logger) - -if __name__ == "__main__": - main() diff --git a/deep_sequencing_unit/source/Jython/createSampleSheet_bcl2fastq.sh b/deep_sequencing_unit/source/Jython/createSampleSheet_bcl2fastq.sh deleted file mode 100755 index 5c44c2ff891ce61ba725c6aec175077601bd5abe..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/source/Jython/createSampleSheet_bcl2fastq.sh +++ /dev/null @@ -1,30 +0,0 @@ -#!/bin/bash -# -# Launch script for CISD openBIS Create Sample Sheet for Illumina NGS -# Runs on Unix / Linux systems. -# ------------------------------------------------------------------------- - -JYTHON_FILE=createSampleSheet_bcl2fastq.py - -# -# change to installation directory -# -bin=$0 -if [ -L $bin ]; then - bin=`dirname $bin`/`readlink $bin` -fi -WD=`dirname $bin` -cd $WD -SCRIPT=./`basename $0` - -if [ "$JAVA_HOME" != "" ]; then - JAVA_BIN="$JAVA_HOME/bin/java" -else - JAVA_BIN="java" -fi - -ALL_JAVA_OPTS="-Djavax.net.ssl.trustStore=etc/openBIS.keystore $JAVA_OPTS" - -LIB="lib" -# echo "Starting Sample Sheet Creator for openBIS Illumina NGS" -${JAVA_BIN} ${ALL_JAVA_OPTS} -cp ${LIB}/commons-codec.jar:${LIB}/commons-httpclient.jar:${LIB}/commons-logging.jar:${LIB}/dss_client.jar:${LIB}/spring.jar:${LIB}/stream-supporting-httpinvoker.jar:${LIB}/jython27-2.7.0.jar org.python27.util.jython $JYTHON_FILE "$@" diff --git a/deep_sequencing_unit/source/Jython/createSampleSheet_bcl2fastq_Test.py b/deep_sequencing_unit/source/Jython/createSampleSheet_bcl2fastq_Test.py deleted file mode 100644 index 772faceddad1a221ff11a3e305a2a875a1a0930e..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/source/Jython/createSampleSheet_bcl2fastq_Test.py +++ /dev/null @@ -1,575 +0,0 @@ -import unittest -import re -# import pytest -from createSampleSheet_bcl2fastq import * - -def getTodayDate(): - from datetime import date - d = date.today() - return d.strftime("%m/%d/%Y") - - -class test_sanitize_string(unittest.TestCase): - - - def testDefault(self): - self.assertEqual(sanitize_string('abc#a$v%c^D&P-'), 'abc_a_v_c_D_P_') - - - def testOnlySpecialChars(self): - self.assertEqual(sanitize_string('@#$%^&*('), '_') - - -class test_get_model(unittest.TestCase): - - - def test_HiseqX(self): - self.assertEqual(get_model('141121_ST-E00107_0356_AH00C3CCXX'), Sequencers.HISEQ_X) - - - def test_expectError(self): - self.assertNotEqual(get_model('150724_J00121_0017_AH2VYMBBXX'), Sequencers.NEXTSEQ_500) - - -class test_get_reverse_complement(unittest.TestCase): - - - def test_happyCase(self): - self.assertEqual(get_reverse_complement('ACTGAATTTT'), 'AAAATTCAGT', 'Reverse complement is faulty') - - - def test_failingCase(self): - self.assertNotEqual(get_reverse_complement('ACTG'), 'CAGA') - - - -class create_sample_sheet_C7GMNANXX(unittest.TestCase): - """ - HiSeq 2500, PAIRED_END, Dual Index - - """ - - def setUp(self): - self.myCode = 'C7GMNANXX' - self.logger = setUpLogger('log/') - self.config_dict = readConfig(self.logger) - - import argparse - import shlex - parser = argparse.ArgumentParser() - - parser.add_argument('--flowcell') - parser.add_argument('--lineending') - parser.add_argument('--outdir') - parser.add_argument('--verbose') - - cmd_string = ['--flowcell', self.myCode, '--lineending', 'win32', '--outdir', '../../targets/playground', '--verbose', 'false'] - self.options = parser.parse_args(cmd_string) - - self.service = OpenbisServiceFacadeFactory.tryCreate(self.config_dict['openbisUserName'], - self.config_dict['openbisPassword'], - self.config_dict['openbisServer'], - self.config_dict['connectionTimeout']) - - self.flowcell, self.containedSamples = get_flowcell('ILLUMINA_FLOW_CELL', - self.myCode, self.service, self.logger) - self.flowCellDict = transform_sample_to_dict(self.flowcell) - self.parentDict, self.samplesPerLaneDict, self.barcodesPerLaneDict = get_contained_sample_properties( - self.containedSamples, self.service, self.config_dict) - self.flowCellName = self.flowcell.getCode() - self.index1Vocabulary = get_vocabulary(self.config_dict['index1Name'], self.service) - self.index2Vocabulary = get_vocabulary(self.config_dict['index2Name'], self.service) - self.index_length_dict = verify_index_length(self.parentDict, self.flowCellDict, self.config_dict, self.logger) - self.model = get_model(self.flowCellDict['RUN_NAME_FOLDER']) - - - def test_get_flowCell (self): - self.assertEqual(self.flowcell.getCode(), self.myCode) - self.assertEqual(self.containedSamples.size(), 8) - - fcProp = self.flowcell.getProperties() - self.assertEqual(fcProp['SEQUENCER'], 'D00535') - self.assertEqual(self.flowCellDict['FLOWCELLTYPE'], 'HiSeq Flow Cell v4') - - - def test_get_contained_sample_properties(self): - self.assertEqual(self.parentDict['BSSE_QGF_34778_C7GMNANXX_1']['BARCODE'], 'GTCCGC') - self.assertEqual(self.samplesPerLaneDict['2'], 23) - - - def test_get_vocabulary(self): - self.assertEqual(self.index1Vocabulary['CACTCAA'], 'Illumina A032 CACTCAA') - self.assertEqual(self.index2Vocabulary['GTAAGGAG'],'Index2 (i5) 505 GTAAGGAG') - - - def test_verify_index_length(self): - self.assertDictEqual(self.index_length_dict, {6: [6, 0], 5: [6, 0], 7: [8, 8], 8: [8, 8], 3: [8, 0], 2: [6, 0], 1: [6, 0], 4: [8, 0]}) - - - def test_create_sample_sheet_dict(self): - - self.model = get_model(self.flowCellDict['RUN_NAME_FOLDER']) - - self.ordered_sample_sheet_dict, self.csv_file_name = create_sample_sheet_dict(self.service, self.barcodesPerLaneDict, self.containedSamples, self.samplesPerLaneDict, self.model, self.parentDict, - self.index_length_dict, self.flowCellDict, self.config_dict, self.index1Vocabulary, - self.index2Vocabulary, self.flowCellName, self.logger) - - self.ordered_sample_sheet_dict['5_BSSE_QGF_32303_C7GMNANXX_5'] = \ - [u'5,BSSE_QGF_32303_C7GMNANXX_5,BSSE_QGF_32303_C7GMNANXX_5_TR_EG_1_GGCTAC,,,SureSelectXT,GGCTAC,BSSE_QGF_32303_C7GMNANXX_5,'] - - self.ordered_sample_sheet_dict['5_BSSE_QGF_36788_C7GMNANXX_5'] = \ - [u'5,BSSE_QGF_36788_C7GMNANXX_5,BSSE_QGF_36788_C7GMNANXX_5_G_33_run2_TAAGGC,,,N701,TAAGGC,BSSE_QGF_36788_C7GMNANXX_5,'] - - self.ordered_sample_sheet_dict['BSSE_QGF_32281_C7GMNANXX_8']= \ - [u'8,BSSE_QGF_32281_C7GMNANXX_8,BSSE_QGF_32281_C7GMNANXX_8_F2_18_3_P162Nextera_TAGGCATG_CTATTAAG,,,N706,TAGGCATG,518,CTATTAAG,BSSE_QGF_32281_C7GMNANXX_8,'] - - - def test_create_header_section(self): - - self.date = getTodayDate() - self.create_header_section = create_header_section(self.model, self.config_dict, self.parentDict, self.flowCellDict, self.index_length_dict, 5) - self.assertListEqual(self.create_header_section, ['[Header]', 'IEMFileVersion,4', 'Investigator Name,ETHZ_D-BSSE', - 'Project Name,Genomics Facility Basel', u'Experiment Name,C7GMNANXX', - 'Date,'+ self.date, 'Workflow,GenerateFASTQ', 'Application,FASTQ Only', - 'Assay,', u'Description,PAIRED_END_126', 'Chemistry,Default', '', '[Reads]', - u'126', u'126', '', '[Settings]', '', '[Data]', - 'Lane,Sample_ID,Sample_Name,Sample_Plate,Sample_Well,I7_Index_ID,index,Sample_Project,Description']) - - self.create_header_section = create_header_section(self.model, self.config_dict, self.parentDict, self.flowCellDict, self.index_length_dict, 8) - self.assertListEqual(self.create_header_section, ['[Header]', 'IEMFileVersion,4', 'Investigator Name,ETHZ_D-BSSE', 'Project Name,Genomics Facility Basel', - u'Experiment Name,C7GMNANXX', 'Date,'+ self.date, 'Workflow,GenerateFASTQ', 'Application,FASTQ Only', - 'Assay,', u'Description,PAIRED_END_126', 'Chemistry,Default', '', '[Reads]', u'126', u'126', '', - '[Settings]', '', '[Data]', 'Lane,Sample_ID,Sample_Name,Sample_Plate,Sample_Well,I7_Index_ID,index,I5_Index_ID,index2,Sample_Project,Description']) - - - def test_write_sample_sheet_single_lane(self): - self.model = get_model(self.flowCellDict['RUN_NAME_FOLDER']) - - self.ordered_sample_sheet_dict, self.csv_file_name = create_sample_sheet_dict(self.service, self.barcodesPerLaneDict, self.containedSamples, self.samplesPerLaneDict, self.model, self.parentDict, - self.index_length_dict, self.flowCellDict, self.config_dict, self.index1Vocabulary, - self.index2Vocabulary, self.flowCellName, self.logger) - - write_sample_sheet_single_lane(self.model, self.ordered_sample_sheet_dict, self.flowCellDict, self.index_length_dict, - self.parentDict, self.config_dict, self.options, self.logger, self.csv_file_name) - - def tearDown(self): - self.service.logout() - self.logger.info('Logged out') - - - - - - -class create_sample_sheet_C7P5KANXX(unittest.TestCase): - """ - HiSeq 2500, SINGLE_READ, Dual Index - - """ - - - def setUp(self): - self.myCode = 'C7P5KANXX' - self.logger = setUpLogger('log/') - self.config_dict = readConfig(self.logger) - - import argparse - import shlex - parser = argparse.ArgumentParser() - - parser.add_argument('--flowcell') - parser.add_argument('--lineending') - parser.add_argument('--outdir') - parser.add_argument('--verbose') - - - cmd_string = ['--flowcell', self.myCode, '--lineending', 'win32', '--outdir', '../../targets/playground', '--verbose', 'false'] - self.options = parser.parse_args(cmd_string) - - self.service = OpenbisServiceFacadeFactory.tryCreate(self.config_dict['openbisUserName'], - self.config_dict['openbisPassword'], - self.config_dict['openbisServer'], - self.config_dict['connectionTimeout']) - - self.flowcell, self.containedSamples = get_flowcell('ILLUMINA_FLOW_CELL', - self.myCode, self.service, self.logger) - self.flowCellDict = transform_sample_to_dict(self.flowcell) - self.parentDict, self.samplesPerLaneDict, self.barcodesPerLaneDict = get_contained_sample_properties( - self.containedSamples, self.service, self.config_dict) - self.flowCellName = self.flowcell.getCode() - self.index1Vocabulary = get_vocabulary(self.config_dict['index1Name'], self.service) - self.index2Vocabulary = get_vocabulary(self.config_dict['index2Name'], self.service) - self.index_length_dict = verify_index_length(self.parentDict, self.flowCellDict, self.config_dict, self.logger) - - - def test_get_flowCell (self): - self.assertEqual(self.flowcell.getCode(), self.myCode) - self.assertEqual(self.containedSamples.size(), 8) - - fcProp = self.flowcell.getProperties() - self.assertEqual(fcProp['SEQUENCER'], 'D00404') - self.assertEqual(self.flowCellDict['FLOWCELLTYPE'], 'HiSeq Flow Cell v4') - - - def test_get_contained_sample_properties(self): - self.assertEqual(self.parentDict['BSSE_QGF_36781_C7P5KANXX_8']['BARCODE'], 'CTTGTAA') - self.assertEqual(self.parentDict['BSSE_QGF_36779_C7P5KANXX_8']['NCBI_ORGANISM_TAXONOMY'], '10090') - self.assertEqual(self.samplesPerLaneDict['8'], 6) - - def test_verify_index_length(self): - self.assertDictEqual(self.index_length_dict, {6: [8, 8], 5: [8, 8], 7: [8, 8], 8: [7, 7], 3: [8, 8], 2: [8, 8], 1: [8, 8], 4: [8, 8]}) - - - def test_create_sample_sheet_dict(self): - - self.model = get_model(self.flowCellDict['RUN_NAME_FOLDER']) - - self.ordered_sample_sheet_dict, self.csv_file_name = create_sample_sheet_dict(self.service, self.barcodesPerLaneDict, self.containedSamples, self.samplesPerLaneDict, self.model, self.parentDict, - self.index_length_dict, self.flowCellDict, self.config_dict, self.index1Vocabulary, - self.index2Vocabulary, self.flowCellName, self.logger) - - self.assertDictEqual(self.ordered_sample_sheet_dict, - {u'8_BSSE_QGF_36781_C7P5KANXX_8': [u'8,BSSE_QGF_36781_C7P5KANXX_8,BSSE_QGF_36781_C7P5KANXX_8_Ribomethseq_mousecerebellum_comparison_CTTGTAA_NOINDEX,,,,CTTGTAA,,NOINDEX,BSSE_QGF_36781_C7P5KANXX_8,'], - u'8_BSSE_QGF_36780_C7P5KANXX_8': [u'8,BSSE_QGF_36780_C7P5KANXX_8,BSSE_QGF_36780_C7P5KANXX_8_Ribomethseq_HEK_comparison_GCCAATA_NOINDEX,,,,GCCAATA,,NOINDEX,BSSE_QGF_36780_C7P5KANXX_8,'], - u'8_BSSE_QGF_36552_C7P5KANXX_8': [u'8,BSSE_QGF_36552_C7P5KANXX_8,BSSE_QGF_36552_C7P5KANXX_8_CLIP_444_1_TGACCAA_NOINDEX,,,,TGACCAA,,NOINDEX,BSSE_QGF_36552_C7P5KANXX_8,'], - u'8_BSSE_QGF_36779_C7P5KANXX_8': [u'8,BSSE_QGF_36779_C7P5KANXX_8,BSSE_QGF_36779_C7P5KANXX_8_HITS_CLIP_Fibrillarin_mouseNeurons_2_CAGATCA_NOINDEX,,,,CAGATCA,,NOINDEX,BSSE_QGF_36779_C7P5KANXX_8,']}) - - - def test_create_header_section(self): - self.date = getTodayDate() - - self.model = get_model(self.flowCellDict['RUN_NAME_FOLDER']) - self.create_header_section = create_header_section(self.model, self.config_dict, self.parentDict, self.flowCellDict, self.index_length_dict, 5) - self.assertListEqual(self.create_header_section, ['[Header]', 'IEMFileVersion,4', 'Investigator Name,ETHZ_D-BSSE', - 'Project Name,Genomics Facility Basel', u'Experiment Name,C7P5KANXX', - 'Date,'+ self.date, 'Workflow,GenerateFASTQ', 'Application,FASTQ Only', - 'Assay,', u'Description,SINGLE_READ_51', 'Chemistry,Default', '', - '[Reads]', u'51', '', '[Settings]', '', '[Data]', - 'Lane,Sample_ID,Sample_Name,Sample_Plate,Sample_Well,I7_Index_ID,index,I5_Index_ID,index2,Sample_Project,Description']) - - def test_write_sample_sheet_single_lane(self): - self.model = get_model(self.flowCellDict['RUN_NAME_FOLDER']) - - self.ordered_sample_sheet_dict, self.csv_file_name = create_sample_sheet_dict(self.service, self.barcodesPerLaneDict, self.containedSamples, self.samplesPerLaneDict, self.model, self.parentDict, - self.index_length_dict, self.flowCellDict, self.config_dict, self.index1Vocabulary, - self.index2Vocabulary, self.flowCellName, self.logger) - - write_sample_sheet_single_lane(self.model, self.ordered_sample_sheet_dict, self.flowCellDict, self.index_length_dict, - self.parentDict, self.config_dict, self.options, self.logger, self.csv_file_name) - - def tearDown(self): - self.service.logout() - self.logger.info('Logged out') - - -class create_sample_sheet_HJWC3BGXX(unittest.TestCase): - """ - NextSeq, SINGLE_READ, Single index - """ - - - def setUp(self): - self.myCode = 'HJWC3BGXX' - self.logger = setUpLogger('log/') - self.config_dict = readConfig(self.logger) - - import argparse - import shlex - parser = argparse.ArgumentParser() - - parser.add_argument('--flowcell') - parser.add_argument('--lineending') - parser.add_argument('--outdir') - parser.add_argument('--verbose') - - cmd_string = ['--flowcell', self.myCode, '--lineending', 'win32', '--outdir', '../../targets/playground', '--verbose', 'false'] - self.options = parser.parse_args(cmd_string) - - self.service = OpenbisServiceFacadeFactory.tryCreate(self.config_dict['openbisUserName'], - self.config_dict['openbisPassword'], - self.config_dict['openbisServer'], - self.config_dict['connectionTimeout']) - - self.flowcell, self.containedSamples = get_flowcell('ILLUMINA_FLOW_CELL', - self.myCode, self.service, self.logger) - self.flowCellDict = transform_sample_to_dict(self.flowcell) - self.parentDict, self.samplesPerLaneDict, self.barcodesPerLaneDict = get_contained_sample_properties( - self.containedSamples, self.service, self.config_dict) - self.flowCellName = self.flowcell.getCode() - self.index1Vocabulary = get_vocabulary(self.config_dict['index1Name'], self.service) - self.index2Vocabulary = get_vocabulary(self.config_dict['index2Name'], self.service) - self.index_length_dict = verify_index_length(self.parentDict, self.flowCellDict, self.config_dict, self.logger) - - - def test_get_flowCell (self): - self.assertEqual(self.flowcell.getCode(), self.myCode) - self.assertEqual(self.containedSamples.size(), 1) - - fcProp = self.flowcell.getProperties() - self.assertEqual(fcProp['SEQUENCER'], 'NS500318') - self.assertEqual(self.flowCellDict['ILLUMINA_PIPELINE_VERSION'], '2.4.6') - - - def test_get_contained_sample_properties(self): - self.assertEqual(self.parentDict['BSSE_QGF_37091_HJWC3BGXX_1']['BARCODE'], 'AGTCAAC') - self.assertEqual(self.parentDict['BSSE_QGF_37100_HJWC3BGXX_1']['NCBI_ORGANISM_TAXONOMY'], '9606') - self.assertEqual(self.samplesPerLaneDict['1'], 18) - - def test_verify_index_length(self): - self.assertDictEqual(self.index_length_dict, {3: [6, 0], 2: [6, 0], 1: [6, 0], 4: [6, 0]}) - - - def test_create_sample_sheet_dict(self): - - self.model = get_model(self.flowCellDict['RUN_NAME_FOLDER']) - - self.ordered_sample_sheet_dict, self.csv_file_name = create_sample_sheet_dict(self.service, self.barcodesPerLaneDict, self.containedSamples, self.samplesPerLaneDict, self.model, self.parentDict, - self.index_length_dict, self.flowCellDict, self.config_dict, self.index1Vocabulary, - self.index2Vocabulary, self.flowCellName, self.logger) - - self.assertDictEqual(self.ordered_sample_sheet_dict, - {u'1_BSSE_QGF_37098_HJWC3BGXX_1': [u'BSSE_QGF_37098_HJWC3BGXX_1,BSSE_QGF_37098_HJWC3BGXX_1_TB_358_PQR_2_0_GTTTCG,,,,GTTTCG,BSSE_QGF_37098_HJWC3BGXX_1,'], - u'1_BSSE_QGF_37093_HJWC3BGXX_1': [u'BSSE_QGF_37093_HJWC3BGXX_1,BSSE_QGF_37093_HJWC3BGXX_1_TB_356_PQR_1_0_ATGTCA,,,,ATGTCA,BSSE_QGF_37093_HJWC3BGXX_1,'], - u'1_BSSE_QGF_37094_HJWC3BGXX_1': [u'BSSE_QGF_37094_HJWC3BGXX_1,BSSE_QGF_37094_HJWC3BGXX_1_TB_357_BKM_1_0_CCGTCC,,,,CCGTCC,BSSE_QGF_37094_HJWC3BGXX_1,'], - u'1_BSSE_QGF_37095_HJWC3BGXX_1': [u'BSSE_QGF_37095_HJWC3BGXX_1,BSSE_QGF_37095_HJWC3BGXX_1_TB_356_MTD_1_0_GTCCGC,,,,GTCCGC,BSSE_QGF_37095_HJWC3BGXX_1,'], - u'1_BSSE_QGF_37087_HJWC3BGXX_1': [u'BSSE_QGF_37087_HJWC3BGXX_1,BSSE_QGF_37087_HJWC3BGXX_1_TB_355_DMSO1_GATCAG,,,,GATCAG,BSSE_QGF_37087_HJWC3BGXX_1,'], - u'1_BSSE_QGF_37096_HJWC3BGXX_1': [u'BSSE_QGF_37096_HJWC3BGXX_1,BSSE_QGF_37096_HJWC3BGXX_1_TB_358_GDC_1_0_GTGAAA,,,,GTGAAA,BSSE_QGF_37096_HJWC3BGXX_1,'], - u'1_BSSE_QGF_37092_HJWC3BGXX_1': [u'BSSE_QGF_37092_HJWC3BGXX_1,BSSE_QGF_37092_HJWC3BGXX_1_TB_357_COL_0_05_AGTTCC,,,,AGTTCC,BSSE_QGF_37092_HJWC3BGXX_1,'], - u'1_BSSE_QGF_37088_HJWC3BGXX_1': [u'BSSE_QGF_37088_HJWC3BGXX_1,BSSE_QGF_37088_HJWC3BGXX_1_TB_355_PQR_0_5_TAGCTT,,,,TAGCTT,BSSE_QGF_37088_HJWC3BGXX_1,'], - u'1_BSSE_QGF_37089_HJWC3BGXX_1': [u'BSSE_QGF_37089_HJWC3BGXX_1,BSSE_QGF_37089_HJWC3BGXX_1_TB_359_BKM_0_5_1_GGCTAC,,,,GGCTAC,BSSE_QGF_37089_HJWC3BGXX_1,'], - u'1_BSSE_QGF_37101_HJWC3BGXX_1': [u'BSSE_QGF_37101_HJWC3BGXX_1,BSSE_QGF_37101_HJWC3BGXX_1_TB_357_GDC_2_0_ACTGAT,,,,ACTGAT,BSSE_QGF_37101_HJWC3BGXX_1,'], - u'1_BSSE_QGF_37090_HJWC3BGXX_1': [u'BSSE_QGF_37090_HJWC3BGXX_1,BSSE_QGF_37090_HJWC3BGXX_1_TB_358_MTD_0_5_CTTGTA,,,,CTTGTA,BSSE_QGF_37090_HJWC3BGXX_1,'], - u'1_BSSE_QGF_37099_HJWC3BGXX_1': [u'BSSE_QGF_37099_HJWC3BGXX_1,BSSE_QGF_37099_HJWC3BGXX_1_TB_360_BKM_2_0_1_CGTACG,,,,CGTACG,BSSE_QGF_37099_HJWC3BGXX_1,'], - u'1_BSSE_QGF_37091_HJWC3BGXX_1': [u'BSSE_QGF_37091_HJWC3BGXX_1,BSSE_QGF_37091_HJWC3BGXX_1_TB_358_GDC_0_5_AGTCAA,,,,AGTCAA,BSSE_QGF_37091_HJWC3BGXX_1,'], - u'1_BSSE_QGF_37102_HJWC3BGXX_1': [u'BSSE_QGF_37102_HJWC3BGXX_1,BSSE_QGF_37102_HJWC3BGXX_1_TB_361_COL_0_2_1_ATTCCT,,,,ATTCCT,BSSE_QGF_37102_HJWC3BGXX_1,'], - u'1_BSSE_QGF_37100_HJWC3BGXX_1': [u'BSSE_QGF_37100_HJWC3BGXX_1,BSSE_QGF_37100_HJWC3BGXX_1_TB_357_MTD_2_0_GAGTGG,,,,GAGTGG,BSSE_QGF_37100_HJWC3BGXX_1,'], - u'1_BSSE_QGF_37097_HJWC3BGXX_1': [u'BSSE_QGF_37097_HJWC3BGXX_1,BSSE_QGF_37097_HJWC3BGXX_1_TB_358_COL_0_1_GTGGCC,,,,GTGGCC,BSSE_QGF_37097_HJWC3BGXX_1,']}) - - def test_create_header_section(self): - self.model = get_model(self.flowCellDict['RUN_NAME_FOLDER']) - lane = 1 - self.date = getTodayDate() - self.create_header_section = create_header_section(self.model, self.config_dict, self.parentDict, self.flowCellDict, self.index_length_dict, lane) - self.assertListEqual(self.create_header_section, ['[Header]', 'IEMFileVersion,4', 'Investigator Name,ETHZ_D-BSSE', 'Project Name,Genomics Facility Basel', - u'Experiment Name,HJWC3BGXX', 'Date,' + self.date, 'Workflow,GenerateFASTQ', 'Application,FASTQ Only', - 'Assay,', u'Description,SINGLE_READ_81', 'Chemistry,Default', '', '[Reads]', u'81', '', '[Settings]', '', - '[Data]', 'Sample_ID,Sample_Name,Sample_Plate,Sample_Well,I7_Index_ID,index,Sample_Project,Description']) - - def test_write_sample_sheet_single_lane(self): - self.model = get_model(self.flowCellDict['RUN_NAME_FOLDER']) - - self.ordered_sample_sheet_dict, self.csv_file_name = create_sample_sheet_dict(self.service, self.barcodesPerLaneDict, self.containedSamples, self.samplesPerLaneDict, self.model, self.parentDict, - self.index_length_dict, self.flowCellDict, self.config_dict, self.index1Vocabulary, - self.index2Vocabulary, self.flowCellName, self.logger) - - write_sample_sheet_single_lane(self.model, self.ordered_sample_sheet_dict, self.flowCellDict, self.index_length_dict, - self.parentDict, self.config_dict, self.options, self.logger, self.csv_file_name) - - def tearDown(self): - self.service.logout() - self.logger.info('Logged out') - - -class create_sample_sheet_000000000_AH5W3(unittest.TestCase): - """ - MiSeq, PAIRED_END, Single Index - """ - - - def setUp(self): - self.myCode = '000000000-AH5W3' - self.logger = setUpLogger('log/') - self.config_dict = readConfig(self.logger) - - import argparse - import shlex - parser = argparse.ArgumentParser() - - parser.add_argument('--flowcell') - parser.add_argument('--lineending') - parser.add_argument('--outdir') - parser.add_argument('--verbose') - - - cmd_string = ['--flowcell', self.myCode, '--lineending', 'win32', '--outdir', '../../targets/playground', '--verbose', 'true'] - self.options = parser.parse_args(cmd_string) - - self.service = OpenbisServiceFacadeFactory.tryCreate(self.config_dict['openbisUserName'], - self.config_dict['openbisPassword'], - self.config_dict['openbisServer'], - self.config_dict['connectionTimeout']) - - self.flowcell, self.containedSamples = get_flowcell('ILLUMINA_FLOW_CELL', - self.myCode, self.service, self.logger) - self.flowCellDict = transform_sample_to_dict(self.flowcell) - self.parentDict, self.samplesPerLaneDict, self.barcodesPerLaneDict = get_contained_sample_properties( - self.containedSamples, self.service, self.config_dict) - self.flowCellName = self.flowcell.getCode() - self.index1Vocabulary = get_vocabulary(self.config_dict['index1Name'], self.service) - self.index2Vocabulary = get_vocabulary(self.config_dict['index2Name'], self.service) - self.index_length_dict = verify_index_length(self.parentDict, self.flowCellDict, self.config_dict, self.logger) - - - def test_get_flowCell (self): - self.assertEqual(self.flowcell.getCode(), self.myCode) - self.assertEqual(self.containedSamples.size(), 1) - - fcProp = self.flowcell.getProperties() - self.assertEqual(fcProp['SEQUENCER'], 'M01761') - self.assertEqual(self.flowCellDict['ILLUMINA_PIPELINE_VERSION'], '1.18.54') - - - def test_get_contained_sample_properties(self): - self.assertEqual(self.parentDict['BSSE_QGF_36763_000000000_AH5W3_1']['BARCODE'], 'ATGTCAG') - self.assertEqual(self.parentDict['BSSE_QGF_36761_000000000_AH5W3_1']['NCBI_ORGANISM_TAXONOMY'], '10090') - self.assertEqual(self.samplesPerLaneDict['1'], 10) - - def test_verify_index_length(self): - self.assertDictEqual(self.index_length_dict,{1: [6, 0]}) - - - def test_create_sample_sheet_dict(self): - - self.model = get_model(self.flowCellDict['RUN_NAME_FOLDER']) - - self.ordered_sample_sheet_dict, self.csv_file_name = create_sample_sheet_dict(self.service, self.barcodesPerLaneDict, self.containedSamples, self.samplesPerLaneDict, self.model, self.parentDict, - self.index_length_dict, self.flowCellDict, self.config_dict, self.index1Vocabulary, - self.index2Vocabulary, self.flowCellName, self.logger) - - - self.assertDictEqual(self.ordered_sample_sheet_dict, - {u'1_BSSE_QGF_36763_000000000_AH5W3_1': [u'1,BSSE_QGF_36763_000000000_AH5W3_1,BSSE_QGF_36763_000000000_AH5W3_1_H7_PRE_Idx_15_ATGTCA,,,,ATGTCA,BSSE_QGF_36763_000000000_AH5W3_1,'], - u'1_BSSE_QGF_36765_000000000_AH5W3_1': [u'1,BSSE_QGF_36765_000000000_AH5W3_1,BSSE_QGF_36765_000000000_AH5W3_1_H8_NBC_Idx_16_CCGTCC,,,,CCGTCC,BSSE_QGF_36765_000000000_AH5W3_1,'], - u'1_BSSE_QGF_36768_000000000_AH5W3_1': [u'1,BSSE_QGF_36768_000000000_AH5W3_1,BSSE_QGF_36768_000000000_AH5W3_1_H8_BMPC_Idx_19_GTGAAA,,,,GTGAAA,BSSE_QGF_36768_000000000_AH5W3_1,'], - u'1_BSSE_QGF_36767_000000000_AH5W3_1': [u'1,BSSE_QGF_36767_000000000_AH5W3_1,BSSE_QGF_36767_000000000_AH5W3_1_H8_PRE_Idx_20_GTGGCC,,,,GTGGCC,BSSE_QGF_36767_000000000_AH5W3_1,'], - u'1_BSSE_QGF_36766_000000000_AH5W3_1': [u'1,BSSE_QGF_36766_000000000_AH5W3_1,BSSE_QGF_36766_000000000_AH5W3_1_H8_SPC_Idx_18_GTCCGC,,,,GTCCGC,BSSE_QGF_36766_000000000_AH5W3_1,'], - u'1_BSSE_QGF_36761_000000000_AH5W3_1': [u'1,BSSE_QGF_36761_000000000_AH5W3_1,BSSE_QGF_36761_000000000_AH5W3_1_H7_NBC_Idx_12_CTTGTA,,,,CTTGTA,BSSE_QGF_36761_000000000_AH5W3_1,'], - u'1_BSSE_QGF_36762_000000000_AH5W3_1': [u'1,BSSE_QGF_36762_000000000_AH5W3_1,BSSE_QGF_36762_000000000_AH5W3_1_H7_SPC_Idx_13_AGTCAA,,,,AGTCAA,BSSE_QGF_36762_000000000_AH5W3_1,'], - u'1_BSSE_QGF_36764_000000000_AH5W3_1': [u'1,BSSE_QGF_36764_000000000_AH5W3_1,BSSE_QGF_36764_000000000_AH5W3_1_H7_BMPC_Idx_14_AGTTCC,,,,AGTTCC,BSSE_QGF_36764_000000000_AH5W3_1,']}) - - - def test_create_header_section(self): - self.model = get_model(self.flowCellDict['RUN_NAME_FOLDER']) - lane = 1 - self.date = getTodayDate() - self.create_header_section = create_header_section(self.model, self.config_dict, self.parentDict, self.flowCellDict, self.index_length_dict, lane) - self.assertListEqual(self.create_header_section, ['[Header]', 'IEMFileVersion,4', 'Investigator Name,ETHZ_D-BSSE', 'Project Name,Genomics Facility Basel', - u'Experiment Name,000000000-AH5W3', 'Date,' + self.date, 'Workflow,GenerateFASTQ', 'Application,FASTQ Only', - 'Assay,', u'Description,PAIRED_END_301', 'Chemistry,Default', '', '[Reads]', u'301', u'301', '', '[Settings]', '', - '[Data]', 'Lane,Sample_ID,Sample_Name,Sample_Plate,Sample_Well,I7_Index_ID,index,Sample_Project,Description']) - - def test_write_sample_sheet_single_lane(self): - self.model = get_model(self.flowCellDict['RUN_NAME_FOLDER']) - - self.ordered_sample_sheet_dict, self.csv_file_name = create_sample_sheet_dict(self.service, self.barcodesPerLaneDict, self.containedSamples, self.samplesPerLaneDict, self.model, self.parentDict, - self.index_length_dict, self.flowCellDict, self.config_dict, self.index1Vocabulary, - self.index2Vocabulary, self.flowCellName, self.logger) - - write_sample_sheet_single_lane(self.model, self.ordered_sample_sheet_dict, self.flowCellDict, self.index_length_dict, - self.parentDict, self.config_dict, self.options, self.logger, self.csv_file_name) - - def tearDown(self): - self.service.logout() - self.logger.info('Logged out') - - - -class create_sample_sheet_H32NFBCXX(unittest.TestCase): - """ - HiSeq 2500 Rapid Run with no indices - """ - - - def setUp(self): - self.myCode = 'H32NFBCXX' - self.logger = setUpLogger('log/') - self.config_dict = readConfig(self.logger) - - import argparse - import shlex - parser = argparse.ArgumentParser() - - parser.add_argument('--flowcell') - parser.add_argument('--lineending') - parser.add_argument('--outdir') - parser.add_argument('--verbose') - - cmd_string = ['--flowcell', self.myCode, '--lineending', 'win32', '--outdir', '../../targets/playground', '--verbose', 'false'] - self.options = parser.parse_args(cmd_string) - - self.service = OpenbisServiceFacadeFactory.tryCreate(self.config_dict['openbisUserName'], - self.config_dict['openbisPassword'], - self.config_dict['openbisServer'], - self.config_dict['connectionTimeout']) - - self.flowcell, self.containedSamples = get_flowcell('ILLUMINA_FLOW_CELL', - self.myCode, self.service, self.logger) - self.flowCellDict = transform_sample_to_dict(self.flowcell) - self.parentDict, self.samplesPerLaneDict, self.barcodesPerLaneDict = get_contained_sample_properties( - self.containedSamples, self.service, self.config_dict) - self.flowCellName = self.flowcell.getCode() - self.index1Vocabulary = get_vocabulary(self.config_dict['index1Name'], self.service) - self.index2Vocabulary = get_vocabulary(self.config_dict['index2Name'], self.service) - self.index_length_dict = verify_index_length(self.parentDict, self.flowCellDict, self.config_dict, self.logger) - - - def test_get_flowCell (self): - self.assertEqual(self.flowcell.getCode(), self.myCode) - self.assertEqual(self.containedSamples.size(), 2) - - fcProp = self.flowcell.getProperties() - self.assertEqual(fcProp['SEQUENCER'], u'D00535') - self.assertEqual(self.flowCellDict['ILLUMINA_PIPELINE_VERSION'], '1.18.64') - - - def test_get_contained_sample_properties(self): - self.assertNotIn(self.parentDict['BSSE_QGF_29352_H32NFBCXX_1'],['BARCODE']) -# self.assertEqual(self.parentDict['BSSE_QGF_29352_H32NFBCXX_1']['NCBI_ORGANISM_TAXONOMY'], '32644') -# self.assertEqual(self.samplesPerLaneDict['1'], 2) - - def test_verify_index_length(self): - self.assertDictEqual(self.index_length_dict,{1: [7, 0], 2:[7, 0]}) - - - def test_create_sample_sheet_dict(self): - - self.model = get_model(self.flowCellDict['RUN_NAME_FOLDER']) - - self.ordered_sample_sheet_dict, self.csv_file_name = create_sample_sheet_dict(self.service, self.barcodesPerLaneDict, self.containedSamples, self.samplesPerLaneDict, self.model, self.parentDict, - self.index_length_dict, self.flowCellDict, self.config_dict, self.index1Vocabulary, - self.index2Vocabulary, self.flowCellName, self.logger) - - self.assertDictEqual(self.ordered_sample_sheet_dict, - {u'1_BSSE_QGF_29352_H32NFBCXX_1': [u'1,BSSE_QGF_29352_H32NFBCXX_1,BSSE_QGF_29352_H32NFBCXX_1_Lib_Amph_4,,,,,BSSE_QGF_29352_H32NFBCXX_1,'], - u'2_BSSE_QGF_29352_H32NFBCXX_2': [u'2,BSSE_QGF_29352_H32NFBCXX_2,BSSE_QGF_29352_H32NFBCXX_2_Lib_Amph_4,,,,,BSSE_QGF_29352_H32NFBCXX_2,']}) - - def test_create_header_section(self): - self.model = get_model(self.flowCellDict['RUN_NAME_FOLDER']) - lane = 1 - self.date = getTodayDate() - self.create_header_section = create_header_section(self.model, self.config_dict, self.parentDict, self.flowCellDict, self.index_length_dict, lane) - self.assertListEqual(self.create_header_section, ['[Header]', 'IEMFileVersion,4', 'Investigator Name,ETHZ_D-BSSE', 'Project Name,Genomics Facility Basel', - u'Experiment Name,H32NFBCXX', 'Date,' + self.date, 'Workflow,GenerateFASTQ', 'Application,FASTQ Only', - 'Assay,', u'Description,SINGLE_READ_201', 'Chemistry,Default', '', '[Reads]', u'201', '', '[Settings]', '', - '[Data]', 'Lane,Sample_ID,Sample_Name,Sample_Plate,Sample_Well,I7_Index_ID,index,Sample_Project,Description']) - - def test_write_sample_sheet_single_lane(self): - self.model = get_model(self.flowCellDict['RUN_NAME_FOLDER']) - - self.ordered_sample_sheet_dict, self.csv_file_name = create_sample_sheet_dict(self.service, self.barcodesPerLaneDict, self.containedSamples, self.samplesPerLaneDict, self.model, self.parentDict, - self.index_length_dict, self.flowCellDict, self.config_dict, self.index1Vocabulary, - self.index2Vocabulary, self.flowCellName, self.logger) - - write_sample_sheet_single_lane(self.model, self.ordered_sample_sheet_dict, self.flowCellDict, self.index_length_dict, - self.parentDict, self.config_dict, self.options, self.logger, self.csv_file_name) - - def tearDown(self): - self.service.logout() - self.logger.info('Logged out') - - -def main(): - unittest.main() - -if __name__ == '__main__': - main() \ No newline at end of file diff --git a/deep_sequencing_unit/source/Jython/createSampleSheet_miseq.py b/deep_sequencing_unit/source/Jython/createSampleSheet_miseq.py deleted file mode 100644 index 558b4a74816d864dba71c180e1d7ebbc6fb92767..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/source/Jython/createSampleSheet_miseq.py +++ /dev/null @@ -1,589 +0,0 @@ -''' -@copyright: -Copyright 2012 ETH Zuerich, CISD - -@license: -Licensed under the Apache License, Version 2.0 (the 'License'); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - -http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an 'AS IS' BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. - -@author: -Manuel Kohler - -@description: -Creates the SampleSheet.csv out of values from openBIS for Demultiplexing -used in the Illumina pipeline (configureBclToFastq.pl) - -@attention: -Runs under Jython - -@note: -Takes into account to replace special characters with an underscore so that the Illumina script -does not fail - -HiSeq Header Description -======================== -Column Header Description -FCID Flow cell ID -Lane Positive integer, indicating the lane number (1-8) -SampleID ID of the sample -SampleRef The reference used for alignment for the sample -Index Index sequences. Multiple index reads are separated by a hyphen (for example, ACCAGTAA-GGACATGA). -Description Description of the sample -Control Y indicates this lane is a control lane, N means sample -Recipe Recipe used during sequencing -Operator Name or ID of the operator -SampleProject The project the sample belongs to -''' - -from __future__ import with_statement -import os -import logging -import re -import sys -import string -import smtplib -from ConfigParser import SafeConfigParser -from optparse import OptionParser -from datetime import * - -from email.MIMEMultipart import MIMEMultipart -from email.MIMEBase import MIMEBase -from email.MIMEText import MIMEText -from email.Utils import COMMASPACE, formatdate -from email import Encoders - -from ch.systemsx.cisd.openbis.dss.client.api.v1 import OpenbisServiceFacadeFactory -from ch.systemsx.cisd.openbis.generic.shared.api.v1.dto import SearchCriteria -from ch.systemsx.cisd.openbis.generic.shared.api.v1.dto import SearchSubCriteria - -lineending = {'win32':'\r\n', 'linux':'\n', 'mac':'\r'} -COMMA = ',' - -def login(logger, configMap): - logger.info('Logging into ' + configMap['openbisServer']) - service = OpenbisServiceFacadeFactory.tryCreate(configMap['openbisUserName'], - configMap['openbisPassword'], - configMap['openbisServer'], - configMap['connectionTimeout']) - return service - -def logout (service, logger): - service.logout() - logger.info('Logged out') - -def setUpLogger(logPath, logLevel=logging.INFO): - logFileName = 'createSampleSheet' - d = datetime.now() - logFileName = logFileName + '_' + d.strftime('%Y-%m-%d_%H_%M_%S') + '.log' - logging.basicConfig(filename=logPath + logFileName, - format='%(asctime)s [%(levelname)s] %(message)s', level=logLevel) - logger = logging.getLogger(logFileName) - return logger - -def parseOptions(logger): - logger.info('Parsing command line parameters') - parser = OptionParser(version='%prog 1.0') - parser.add_option('-f', '--flowcell', - dest='flowcell', - help='The flowcell which is used to create the SampleSheet.csv', - metavar='<flowcell>') - parser.add_option('-m', '--mailist', - dest='maillist', - default=False, - action='store_true', - help='Generated Sample Sheet will be addtionally sent as email to the defined list of recipients', - metavar='<maillist>') - parser.add_option('-l', '--lineending', - dest='lineending', - type='choice', - action='store', - choices=['win32', 'linux', 'mac'], - default='win32', - help='Specify end of line separator: win32, linux, mac. Default: win32' , - metavar='<lineending>') - parser.add_option('-o', '--outdir', - dest='outdir', - default='./', - help='Specify the ouput directory. Default: ./' , - metavar='<outdir>') - parser.add_option('-s', '--singlelane', - dest='singlelane', - default=False, - action='store_true', - help='Creates a single Sample Sheet for each lane. Default: False') - parser.add_option('-d', '--debug', - dest='debug', - default=False, - action='store_true', - help='Verbose debug logging. Default: False') - parser.add_option('-v', '--verbose', - dest='verbose', - default=False, - action='store_true', - help='Write Sample Sheet to stout. Default: False') - - - (options, args) = parser.parse_args() - - if options.outdir[-1] <> '/': - options.outdir = options.outdir + '/' - - if options.flowcell is None: - parser.print_help() - exit(-1) - return options - -def parseConfigurationFile(propertyFile='etc/createSampleSheet.properties'): - ''' - Parses the given config files and returns the values - ''' - config = SafeConfigParser() - config.read(propertyFile) - config.sections() - return config - -def readConfig(logger): - GENERAL = 'GENERAL' - OPENBIS = 'OPENBIS' - ILLUMINA = 'ILLUMINA' - - logger.info('Reading config file') - configMap = {} - - configParameters = parseConfigurationFile() - configMap['facilityName'] = configParameters.get(GENERAL, 'facilityName') - configMap['facilityNameShort'] = configParameters.get(GENERAL, 'facilityNameShort') - configMap['facilityInstitution'] = configParameters.get(GENERAL, 'facilityInstitution') - configMap['mailList'] = configParameters.get(GENERAL, 'mailList') - configMap['mailFrom'] = configParameters.get(GENERAL, 'mailFrom') - configMap['smptHost'] = configParameters.get(GENERAL, 'smptHost') - configMap['SampleSheetFileName'] = configParameters.get(GENERAL, 'SampleSheetFileName') - configMap['separator'] = configParameters.get(GENERAL, 'separator') - configMap['indexSeparator'] = configParameters.get(GENERAL, 'indexSeparator') - - configMap['openbisUserName'] = configParameters.get(OPENBIS, 'openbisUserName') - configMap['openbisPassword'] = configParameters.get(OPENBIS, 'openbisPassword', raw=True) - configMap['openbisServer'] = configParameters.get(OPENBIS, 'openbisServer') - configMap['connectionTimeout'] = configParameters.getint(OPENBIS, 'connectionTimeout') - configMap['illuminaFlowCellTypeName'] = configParameters.get(OPENBIS, 'illuminaFlowCellTypeName') - configMap['index1Name'] = configParameters.get(OPENBIS, 'index1Name') - configMap['index2Name'] = configParameters.get(OPENBIS, 'index2Name') - configMap['index1Length'] = configParameters.get(OPENBIS, 'index1Length') - configMap['index2Length'] = configParameters.get(OPENBIS, 'index2Length') - configMap['endType'] = configParameters.get(OPENBIS, 'endType') - configMap['cycles'] = configParameters.get(OPENBIS, 'cycles') - configMap['controlLane'] = configParameters.get(OPENBIS, 'controlLane') - configMap['ncbi'] = configParameters.get(OPENBIS, 'ncbi') - configMap['externalSampleName'] = configParameters.get(OPENBIS, 'externalSampleName') - configMap['laneCount'] = configParameters.get(OPENBIS, 'laneCount') - configMap['kit'] = configParameters.get(OPENBIS, 'kit') - - configMap['hiSeqNames'] = configParameters.get(ILLUMINA, 'hiSeqNames') - configMap['miSeqNames'] = configParameters.get(ILLUMINA, 'miSeqNames') - configMap['hiSeqHeader'] = configParameters.get(ILLUMINA, 'hiSeqHeader') - - configMap['miSeqHeaderSection'] = configParameters.get(ILLUMINA, 'miSeqHeaderSection') - configMap['miSeqReadsSection'] = configParameters.get(ILLUMINA, 'miSeqReadsSection') - configMap['miSeqSettingsSection'] = configParameters.get(ILLUMINA, 'miSeqSettingsSection') - configMap['miSeqDataSectionSingleRead'] = configParameters.get(ILLUMINA, 'miSeqDataSectionSingleRead') - configMap['miSeqDataSectionDualRead'] = configParameters.get(ILLUMINA, 'miSeqDataSectionDualRead') - configMap['miSeqWorkflow'] = configParameters.get(ILLUMINA, 'miSeqWorkflow') - configMap['miSeqApplication'] = configParameters.get(ILLUMINA, 'miSeqApplication') - configMap['miSeqChemistry'] = configParameters.get(ILLUMINA, 'miSeqChemistry') - - configMap['truSeqAdapter1'] = configParameters.get(ILLUMINA, 'truSeqAdapter1') - configMap['truSeqAdapter2'] = configParameters.get(ILLUMINA, 'truSeqAdapter2') - configMap['nexteraAdapter'] = configParameters.get(ILLUMINA, 'nexteraAdapter') - configMap['iemFileVersion'] = configParameters.get(ILLUMINA, 'iemFileVersion') - - configMap['configureBclToFastqPath'] = configParameters.get(ILLUMINA, 'configureBclToFastqPath') - configMap['failedReads'] = configParameters.get(ILLUMINA, 'failedReads') - configMap['clusterCount'] = configParameters.get(ILLUMINA, 'clusterCount') - configMap['clusterCountNumber'] = configParameters.get(ILLUMINA, 'clusterCountNumber') - configMap['outputDir'] = configParameters.get(ILLUMINA, 'outputDir') - configMap['sampleSheetName'] = configParameters.get(ILLUMINA, 'sampleSheetName') - configMap['baseMask'] = configParameters.get(ILLUMINA, 'baseMask') - - return configMap - -def getDate(): - d = datetime.now() - return d.strftime('%A, %d of %B %Y') - -def sanitizeString(myString): - return re.sub('[^A-Za-z0-9]+', '_', myString) - -def getVocabulary(vocabularyCode, service): - ''' Returns the vocabulary terms and vocabulary labels of a vocabulary in a dictionary - specified by the parameter vocabularyCode - ''' - terms = [] - vocabularies = service.listVocabularies() - vocabularyDict = {} - for vocabulary in vocabularies: - if (vocabulary.getCode() == vocabularyCode): - terms = vocabulary.getTerms() - if terms: - for term in terms: - vocabularyDict[term.getCode()] = term.getLabel() - else: - print ('No vocabulary found for ' + vocabularyCode) - return vocabularyDict - -def sendMail(emails, files, flowCellName, configMap, logger): - ''' - Send out an email to the specified recipients - ''' - COMMASPACE = ', ' - listofEmails = emails.split() - - msg = MIMEMultipart() - msg['From'] = configMap['mailFrom'] - msg['To'] = COMMASPACE.join(listofEmails) - msg['Date'] = formatdate(localtime=True) - msg['Subject'] = 'Generated Sample Sheet for flowcell ' + flowCellName - - msg.attach(MIMEText('Sample Sheet for ' + flowCellName + ' attached.')) - - for f in files: - part = MIMEBase('application', 'octet-stream') - part.set_payload(open(f, 'rb').read()) - Encoders.encode_base64(part) - part.add_header('Content-Disposition', 'attachment; filename="%s"' % os.path.basename(f)) - msg.attach(part) - - smtp = smtplib.SMTP(configMap['smptHost']) - smtp.sendmail(configMap['mailFrom'], listofEmails, msg.as_string()) - smtp.close() - logger.info('Sent email to ' + COMMASPACE.join(listofEmails)) - - -def getFlowCell (illuminaFlowCellTypeName, flowCellName, service, logger): - ''' - Getting the the matching FlowCell - ''' - sc = SearchCriteria(); - sc.addMatchClause(SearchCriteria.MatchClause.createAttributeMatch(SearchCriteria.MatchClauseAttribute.TYPE, illuminaFlowCellTypeName)); - sc.addMatchClause(SearchCriteria.MatchClause.createAttributeMatch(SearchCriteria.MatchClauseAttribute.CODE, flowCellName)); - foundSample = service.searchForSamples(sc) - try: - assert foundSample.size() == 1 - except AssertionError: - print (str(foundSample.size()) + ' flow cells found which match.') - exit(1) - - logger.info('Found ' + foundSample[0].getCode() + ' in openBIS') - # Search for contained samples - sampleSc = SearchCriteria() - sampleSc.addSubCriteria(SearchSubCriteria.createSampleContainerCriteria(sc)) - foundContainedSamples = service.searchForSamples(sampleSc) - - return foundSample[0], foundContainedSamples - - -def getParents(sampleName, service): - ''' - Returns a list of parents of a sample - ''' - sc = SearchCriteria(); - sc.addMatchClause(SearchCriteria.MatchClause.createAttributeMatch(SearchCriteria.MatchClauseAttribute.CODE, sampleName)); - foundSample = service.searchForSamples(sc) - - try: - assert foundSample.size() == 1 - except AssertionError: - print (str(foundSample.size()) + ' flow lanes found which match.') - - # set the criteria for getting the parents when providing the child name - sampleSc = SearchCriteria() - sampleSc.addSubCriteria(SearchSubCriteria.createSampleChildCriteria(sc)) - foundParentSamples = service.searchForSamples(sampleSc) - - return foundParentSamples - -def getContainedSampleProperties(containedSamples, service): - - # TODO: update description and function name - ''' - Takes a list of contained samples, retrieves the parents and their properties and returns it - as a dictionary. The key is the sample name, the value is a list of the properties - - Additionally a dictionary with the lane (key) and the number of samples (value) is returned - ''' - parentDict = {} - samplesPerLaneDict = {} - - for lane in containedSamples: - parents = getParents (lane.getCode(), service) - - try: - assert parents.size() >= 1 - except AssertionError: - print (str(parents.size()) + ' parents found for lane ' + lane.getCode()) - - samplesPerLaneDict[lane.getCode()[-1]] = len(parents) - - for parent in parents: - parentCode = parent.getCode() - parentProperties = parent.getProperties() - propertyDict = {} - for property in parentProperties: - propertyDict[property] = parentProperties.get(property) - - propertyDict['LANE'] = lane.getCode() - - myKey = sanitizeString(parentCode + '_' + lane.getCode()) - parentDict[myKey] = propertyDict - - return parentDict, samplesPerLaneDict - - -def convertSampleToDict(foundFlowCell): - ''' - converts <type 'ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.Sample'> to a python dict - ''' - flowCellDict = {} - fcProperties = foundFlowCell.getProperties() - for property in fcProperties: - flowCellDict[property] = fcProperties.get(property) - flowCellDict['Project'] = foundFlowCell.getExperimentIdentifierOrNull().split('/')[-1] - flowCellDict['Name'] = foundFlowCell.getIdentifier().split('/')[-1] - return flowCellDict - - -def pickleDemultiplexCommandList(logger, demultiplexCommandList, fileName): - import pickle - - try: - with open(fileName, 'w') as pickleDemux: - pickle.dump(demultiplexCommandList, pickleDemux) - logger.info('Writing file ' + fileName) - except IOError, err: - logger.error('File error: ' + str(err)) - print ('File error: ' + str(err)) - - -def writeMiSeqSampleSheet(sampleSheetDict, headerList, flowCellName, myoptions, logger, fileName): - ''' - Writes the given dictionary to a csv file. The order does not matter. As the header is not fixed - we first need to write the headerList in the file. This is specific to MiSeq - ''' - newline = lineending[myoptions.lineending] - try: - with open(fileName, 'wb') as sampleSheetFile: - for listElement in headerList: - if myoptions.verbose: - print listElement - sampleSheetFile.write(listElement + newline) - for sample in sampleSheetDict: - if myoptions.verbose: - print sampleSheetDict[sample][0] - sampleSheetFile.write(sampleSheetDict[sample][0] + newline) - - logger.info('Writing file ' + fileName) - - except IOError: - logger.error('File error: ' + str(err)) - print ('File error: ' + str(err)) - - return fileName - -def get_reverse_complement(sequence): - lookup_table = {'A': 'T', 'T': 'A', 'G': 'C', 'C': 'G'} - reverse_complement = '' - for nucleotide in reversed(sequence): - reverse_complement += lookup_table[nucleotide] - return reverse_complement - - -def createMiSeqSampleSheet(parentDict, flowCellDict, configMap, index1Vocabulary, index2Vocabulary, - flowCellName, logger, myoptions): - ''' - ''' - - kitsDict = {"CHIP_SEQ_SAMPLE_PREP" : ["",""], - "TRUSEQ_RNA_SAMPLEPREPKIT_V2_ILLUMINA" : ["A","TruSeq LT"], - "NEXTERA_XT_DNA_SAMPLE_PREPARATION_KIT_ILLUMINA" : ["S", "Nextera XT"], - "TRUSEQ_CHIP_SAMPLE_PREP_KIT" : ["A","TruSeq LT"], - "MRNA_SEQ_SAMPLE_PREP" : ["",""], - "TRUSEQRNA_SAMPLE_PREP_KIT" : ["A","TruSeq LT"], - "NEBNEXT_DNA_SAMPLE_PREP_MASTER_MIX_SET1" : ["A","TruSeq LT"], - "NEBNEXT_CHIP-SEQ_LIBRARY_PREP_REAGENT_SET" : ["A","TruSeq LT"], - "RIBOZERO_SCRIPTSEQ_MRNA-SEQ_KIT" : ["",""], - "NEXTERA_DNA_SAMPLE_PREPARATION_KIT_ILLUMINA" : ["N", "Nextera"], - "GENOMICDNA_SAMPLE_PREP" : ["",""], - "AGILENT_SURESELECTXT_AUTOMATEDLIBRARYPREP" : ["",""], - "TRUSEQ_DNA_SAMPLE_PREP_KIT" : ["A","TruSeq LT"], - "NEXTERA_DNA_SAMPLE_PREP_KITS" : ["N", "Nextera"], - "AGILENT_SURESELECT_ENRICHMENTSYSTEM" : ["",""], - "TRUSEQ_DNA_SAMPLE_PREP_KIT_V2" : ["A","TruSeq LT"], - "AGILENT_SURESELECT_HUMAN_ALL_EXON_V5_UTRS" : ["",""], - "POLYA_SCRIPTSEQ_MRNA-SEQ_KIT" : ["",""], - "AGILENT_SURESELECTXT2_MOUSE_ALL_EXON" : ["",""], - "PAIRED_END_DNA_SAMPLE_PREP" : ["",""], - "NEXTERA_DNA_SAMPLE_PREP_KIT_BUFFER_HMW" : ["N", "Nextera"] - } - - sampleSheetDict = {} - headerList = [] - - # here we take the fisrat sample to determine the Sample Prep Kit - try: - assay = kitsDict [parentDict.itervalues().next()[configMap['kit']]][1] - except: - print "No Kit set for sample. Will not set the assay value in the sample sheet" - assay = "" - pass - - separator = configMap['separator'] - - miSeqHeaderSection = configMap['miSeqHeaderSection'].split(separator) - miSeqHeaderSection.reverse() - headerList = [miSeqHeaderSection.pop().strip()] - headerList.append(miSeqHeaderSection.pop().strip() + separator + configMap['iemFileVersion']) - headerList.append(miSeqHeaderSection.pop().strip() + separator + configMap['facilityInstitution']) - headerList.append(miSeqHeaderSection.pop().strip() + separator + configMap['facilityName']) - headerList.append(miSeqHeaderSection.pop().strip() + separator + flowCellDict['Name']) - headerList.append(miSeqHeaderSection.pop().strip() + separator + datetime.now().strftime('%m/%d/%Y')) - headerList.append(miSeqHeaderSection.pop().strip() + separator + configMap['miSeqWorkflow']) - headerList.append(miSeqHeaderSection.pop().strip() + separator + configMap['miSeqApplication']) - headerList.append(miSeqHeaderSection.pop().strip() + separator + assay) - headerList.append(miSeqHeaderSection.pop().strip() + separator + flowCellDict[configMap['endType']] + '_' + flowCellDict[configMap['cycles']]) - headerList.append(miSeqHeaderSection.pop().strip() + separator + configMap['miSeqChemistry']) - headerList.append('') - - miSeqReadsSection = configMap['miSeqReadsSection'].split(separator) - miSeqReadsSection.reverse() - headerList.append(miSeqReadsSection.pop()) - headerList.append(flowCellDict[configMap['cycles']]) - if (flowCellDict[configMap['endType']] == 'PAIRED_END'): - headerList.append(flowCellDict[configMap['cycles']]) - headerList.append('') - - miSeqSettingsSection = configMap['miSeqSettingsSection'].split(separator) - miSeqSettingsSection.reverse() - headerList.append(miSeqSettingsSection.pop()) - if ('nextera' in assay.lower()): - headerList.append(configMap['nexteraAdapter']) - if ('truseq' in assay.lower()): - headerList.append(configMap['truSeqAdapter1']) - headerList.append(configMap['truSeqAdapter2']) - headerList.append('') - - if int(flowCellDict['INDEXREAD2']) > 0: - miSeqDataSection = configMap['miSeqDataSectionDualRead'].split(',') - else: - miSeqDataSection = configMap['miSeqDataSectionSingleRead'].split(',') - - miSeqDataSection.reverse() - headerList.append(miSeqDataSection.pop()) - headerList.append(','.join(miSeqDataSection.pop().strip().split())) - - for key in parentDict.keys(): - lane = parentDict[key]['LANE'][-1:] - # If no index then just skip this sample - if configMap['index1Name'] not in parentDict[key]: - continue - index1 = parentDict[key][configMap['index1Name']] - - if configMap['index2Name'] in parentDict[key]: - index2 = parentDict[key][configMap['index2Name']] - indexNumber = index2Vocabulary[parentDict[key][configMap['index2Name']]].split()[2] - - try: - kit = parentDict[key][configMap['kit']] - prefix = kitsDict[kit][0] - except: - print "Missing Kit on " + str(key) - prefix = "" - - len_index1 = int(flowCellDict['INDEXREAD']) - len_index2 = int(flowCellDict['INDEXREAD2']) - - if int(flowCellDict['INDEXREAD2']) > 0: - sampleSheetDict[lane + '_' + key] = [key + separator - + key + '_' + sanitizeString(parentDict[key][configMap['externalSampleName']]) + '_' + index1[0:len_index1] + '_' + index2[0:len_index2] + separator - + separator - + separator - + index1Vocabulary[index1].split()[1] + separator - + index1[0:len_index1] + separator - + prefix + indexNumber + separator - + get_reverse_complement(index2[0:len_index2]) + separator - + key + separator - ] - else: - sampleSheetDict[lane + '_' + key] = [key + separator - + key + '_' + sanitizeString(parentDict[key][configMap['externalSampleName']]) + '_' + index1[0:len_index1] + separator - + separator - + separator - + index1Vocabulary[index1].split()[1] + separator - + index1[0:len_index1] + separator - + key + separator - ] - - myFileName = myoptions.outdir + configMap['SampleSheetFileName'] + '_' + \ - flowCellName + '.csv' - - sampleSheetFile = writeMiSeqSampleSheet(sampleSheetDict, headerList, flowCellName, - myoptions, logger, fileName=myFileName) - return sampleSheetFile - -''' -Main script -''' -def main (): - - logger = setUpLogger('log/') - logger.info('Started Creation of Sample Sheet...') - - myoptions = parseOptions(logger) - - if myoptions.debug: - logger.setLevel(logging.DEBUG) - - flowCellName = myoptions.flowcell - configMap = readConfig(logger) - service = login(logger, configMap) - - foundFlowCell, containedSamples = getFlowCell(configMap['illuminaFlowCellTypeName'], flowCellName, - service, logger) - parentDict, samplesPerLaneDict = getContainedSampleProperties(containedSamples, service) - logger.info('Found ' + str(len(parentDict)) + ' samples on the flow cell ' + flowCellName) - - flowCellName = foundFlowCell.getCode() - if '-' in flowCellName: - flowCellName = flowCellName.split('_')[3] - elif len(flowCellName) > 12: - flowCellName = flowCellName.split('_')[3][1:] - else: - pass - - flowCellDict = convertSampleToDict(foundFlowCell) - - hiseqList = configMap['hiSeqNames'].split() - miseqList = configMap['miSeqNames'].split() - - runFolderName = flowCellDict['Name'] - - index1Vocabulary = getVocabulary(configMap['index1Name'], service) - index2Vocabulary = getVocabulary(configMap['index2Name'], service) - SampleSheetFile = createMiSeqSampleSheet(parentDict, flowCellDict, configMap, - index1Vocabulary, index2Vocabulary, flowCellName, logger, myoptions) - - if myoptions.maillist: - sendMail(configMap['mailList'], [SampleSheetFile], flowCellName, configMap, logger) - - logout(service, logger) - - -if __name__ == "__main__": - main() diff --git a/deep_sequencing_unit/source/Jython/createSampleSheet_nextseq.py b/deep_sequencing_unit/source/Jython/createSampleSheet_nextseq.py deleted file mode 100644 index fa1517dbac01f5544330c21b6a472a9dc7c23a36..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/source/Jython/createSampleSheet_nextseq.py +++ /dev/null @@ -1,596 +0,0 @@ -''' -@copyright: -Copyright 2012 ETH Zuerich, CISD - -@license: -Licensed under the Apache License, Version 2.0 (the 'License'); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - -http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an 'AS IS' BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. - -@author: -Manuel Kohler - -@description: -Creates the SampleSheet.csv out of values from openBIS for Demultiplexing -used in the Illumina pipeline (configureBclToFastq.pl) - -@attention: -Runs under Jython - -@note: -Takes into account to replace special characters with an underscore so that the Illumina script -does not fail - -HiSeq Header Description -======================== -Column Header Description -FCID Flow cell ID -Lane Positive integer, indicating the lane number (1-8) -SampleID ID of the sample -SampleRef The reference used for alignment for the sample -Index Index sequences. Multiple index reads are separated by a hyphen (for example, ACCAGTAA-GGACATGA). -Description Description of the sample -Control Y indicates this lane is a control lane, N means sample -Recipe Recipe used during sequencing -Operator Name or ID of the operator -SampleProject The project the sample belongs to -''' - -from __future__ import with_statement -import os -import logging -import re -import sys -import string -import smtplib -from ConfigParser import SafeConfigParser -from optparse import OptionParser -from datetime import * - -from email.MIMEMultipart import MIMEMultipart -from email.MIMEBase import MIMEBase -from email.MIMEText import MIMEText -from email.Utils import COMMASPACE, formatdate -from email import Encoders - -from ch.systemsx.cisd.openbis.dss.client.api.v1 import OpenbisServiceFacadeFactory -from ch.systemsx.cisd.openbis.generic.shared.api.v1.dto import SearchCriteria -from ch.systemsx.cisd.openbis.generic.shared.api.v1.dto import SearchSubCriteria - -lineending = {'win32':'\r\n', 'linux':'\n', 'mac':'\r'} -COMMA = ',' - -def login(logger, configMap): - logger.info('Logging into ' + configMap['openbisServer']) - service = OpenbisServiceFacadeFactory.tryCreate(configMap['openbisUserName'], - configMap['openbisPassword'], - configMap['openbisServer'], - configMap['connectionTimeout']) - return service - -def logout (service, logger): - service.logout() - logger.info('Logged out') - -def setUpLogger(logPath, logLevel=logging.INFO): - logFileName = 'createSampleSheet' - d = datetime.now() - logFileName = logFileName + '_' + d.strftime('%Y-%m-%d_%H_%M_%S') + '.log' - logging.basicConfig(filename=logPath + logFileName, - format='%(asctime)s [%(levelname)s] %(message)s', level=logLevel) - logger = logging.getLogger(logFileName) - return logger - -def parseOptions(logger): - logger.info('Parsing command line parameters') - parser = OptionParser(version='%prog 1.0') - parser.add_option('-f', '--flowcell', - dest='flowcell', - help='The flowcell which is used to create the SampleSheet.csv', - metavar='<flowcell>') - parser.add_option('-m', '--mailist', - dest='maillist', - default=False, - action='store_true', - help='Generated Sample Sheet will be addtionally sent as email to the defined list of recipients', - metavar='<maillist>') - parser.add_option('-l', '--lineending', - dest='lineending', - type='choice', - action='store', - choices=['win32', 'linux', 'mac'], - default='win32', - help='Specify end of line separator: win32, linux, mac. Default: win32' , - metavar='<lineending>') - parser.add_option('-o', '--outdir', - dest='outdir', - default='./', - help='Specify the ouput directory. Default: ./' , - metavar='<outdir>') - parser.add_option('-s', '--singlelane', - dest='singlelane', - default=False, - action='store_true', - help='Creates a single Sample Sheet for each lane. Default: False') - parser.add_option('-d', '--debug', - dest='debug', - default=False, - action='store_true', - help='Verbose debug logging. Default: False') - parser.add_option('-v', '--verbose', - dest='verbose', - default=False, - action='store_true', - help='Write Sample Sheet to stout. Default: False') - - - (options, args) = parser.parse_args() - - if options.outdir[-1] <> '/': - options.outdir = options.outdir + '/' - - if options.flowcell is None: - parser.print_help() - exit(-1) - return options - -def parseConfigurationFile(propertyFile='etc/createSampleSheet.properties'): - ''' - Parses the given config files and returns the values - ''' - config = SafeConfigParser() - config.read(propertyFile) - config.sections() - return config - -def readConfig(logger): - GENERAL = 'GENERAL' - OPENBIS = 'OPENBIS' - ILLUMINA = 'ILLUMINA' - - logger.info('Reading config file') - configMap = {} - - configParameters = parseConfigurationFile() - configMap['facilityName'] = configParameters.get(GENERAL, 'facilityName') - configMap['facilityNameShort'] = configParameters.get(GENERAL, 'facilityNameShort') - configMap['facilityInstitution'] = configParameters.get(GENERAL, 'facilityInstitution') - configMap['mailList'] = configParameters.get(GENERAL, 'mailList') - configMap['mailFrom'] = configParameters.get(GENERAL, 'mailFrom') - configMap['smptHost'] = configParameters.get(GENERAL, 'smptHost') - configMap['SampleSheetFileName'] = configParameters.get(GENERAL, 'SampleSheetFileName') - configMap['separator'] = configParameters.get(GENERAL, 'separator') - configMap['indexSeparator'] = configParameters.get(GENERAL, 'indexSeparator') - - configMap['openbisUserName'] = configParameters.get(OPENBIS, 'openbisUserName') - configMap['openbisPassword'] = configParameters.get(OPENBIS, 'openbisPassword', raw=True) - configMap['openbisServer'] = configParameters.get(OPENBIS, 'openbisServer') - configMap['connectionTimeout'] = configParameters.getint(OPENBIS, 'connectionTimeout') - configMap['illuminaFlowCellTypeName'] = configParameters.get(OPENBIS, 'illuminaFlowCellTypeName') - configMap['index1Name'] = configParameters.get(OPENBIS, 'index1Name') - configMap['index2Name'] = configParameters.get(OPENBIS, 'index2Name') - configMap['index1Length'] = configParameters.get(OPENBIS, 'index1Length') - configMap['index2Length'] = configParameters.get(OPENBIS, 'index2Length') - configMap['endType'] = configParameters.get(OPENBIS, 'endType') - configMap['cycles'] = configParameters.get(OPENBIS, 'cycles') - configMap['controlLane'] = configParameters.get(OPENBIS, 'controlLane') - configMap['ncbi'] = configParameters.get(OPENBIS, 'ncbi') - configMap['externalSampleName'] = configParameters.get(OPENBIS, 'externalSampleName') - configMap['laneCount'] = configParameters.get(OPENBIS, 'laneCount') - configMap['kit'] = configParameters.get(OPENBIS, 'kit') - - configMap['hiSeqNames'] = configParameters.get(ILLUMINA, 'hiSeqNames') - configMap['miSeqNames'] = configParameters.get(ILLUMINA, 'miSeqNames') - configMap['hiSeqHeader'] = configParameters.get(ILLUMINA, 'hiSeqHeader') - - configMap['miSeqHeaderSection'] = configParameters.get(ILLUMINA, 'miSeqHeaderSection') - configMap['miSeqReadsSection'] = configParameters.get(ILLUMINA, 'miSeqReadsSection') - configMap['miSeqSettingsSection'] = configParameters.get(ILLUMINA, 'miSeqSettingsSection') - configMap['miSeqDataSectionSingleRead'] = configParameters.get(ILLUMINA, 'miSeqDataSectionSingleRead') - configMap['miSeqDataSectionDualRead'] = configParameters.get(ILLUMINA, 'miSeqDataSectionDualRead') - configMap['miSeqWorkflow'] = configParameters.get(ILLUMINA, 'miSeqWorkflow') - configMap['miSeqApplication'] = configParameters.get(ILLUMINA, 'miSeqApplication') - configMap['miSeqChemistry'] = configParameters.get(ILLUMINA, 'miSeqChemistry') - - configMap['nextSeqDataSectionSingleRead'] = configParameters.get(ILLUMINA, 'nextSeqDataSectionSingleRead') - configMap['nextSeqDataSectionDualRead'] = configParameters.get(ILLUMINA, 'nextSeqDataSectionDualRead') - - configMap['truSeqAdapter1'] = configParameters.get(ILLUMINA, 'truSeqAdapter1') - configMap['truSeqAdapter2'] = configParameters.get(ILLUMINA, 'truSeqAdapter2') - configMap['nexteraAdapter'] = configParameters.get(ILLUMINA, 'nexteraAdapter') - configMap['iemFileVersion'] = configParameters.get(ILLUMINA, 'iemFileVersion') - - configMap['configureBclToFastqPath'] = configParameters.get(ILLUMINA, 'configureBclToFastqPath') - configMap['failedReads'] = configParameters.get(ILLUMINA, 'failedReads') - configMap['clusterCount'] = configParameters.get(ILLUMINA, 'clusterCount') - configMap['clusterCountNumber'] = configParameters.get(ILLUMINA, 'clusterCountNumber') - configMap['outputDir'] = configParameters.get(ILLUMINA, 'outputDir') - configMap['sampleSheetName'] = configParameters.get(ILLUMINA, 'sampleSheetName') - configMap['baseMask'] = configParameters.get(ILLUMINA, 'baseMask') - - return configMap - -def getDate(): - d = datetime.now() - return d.strftime('%A, %d of %B %Y') - -def sanitizeString(myString): - return re.sub('[^A-Za-z0-9]+', '_', myString) - -def getVocabulary(vocabularyCode, service): - ''' Returns the vocabulary terms and vocabulary labels of a vocabulary in a dictionary - specified by the parameter vocabularyCode - ''' - terms = [] - vocabularies = service.listVocabularies() - vocabularyDict = {} - for vocabulary in vocabularies: - if (vocabulary.getCode() == vocabularyCode): - terms = vocabulary.getTerms() - if terms: - for term in terms: - vocabularyDict[term.getCode()] = term.getLabel() - else: - print ('No vocabulary found for ' + vocabularyCode) - return vocabularyDict - -def sendMail(emails, files, flowCellName, configMap, logger): - ''' - Send out an email to the specified recipients - ''' - COMMASPACE = ', ' - listofEmails = emails.split() - - msg = MIMEMultipart() - msg['From'] = configMap['mailFrom'] - msg['To'] = COMMASPACE.join(listofEmails) - msg['Date'] = formatdate(localtime=True) - msg['Subject'] = 'Generated Sample Sheet for flowcell ' + flowCellName - - msg.attach(MIMEText('Sample Sheet for ' + flowCellName + ' attached.')) - - for f in files: - part = MIMEBase('application', 'octet-stream') - part.set_payload(open(f, 'rb').read()) - Encoders.encode_base64(part) - part.add_header('Content-Disposition', 'attachment; filename="%s"' % os.path.basename(f)) - msg.attach(part) - - smtp = smtplib.SMTP(configMap['smptHost']) - smtp.sendmail(configMap['mailFrom'], listofEmails, msg.as_string()) - smtp.close() - logger.info('Sent email to ' + COMMASPACE.join(listofEmails)) - - -def getFlowCell (illuminaFlowCellTypeName, flowCellName, service, logger): - ''' - Getting the the matching FlowCell - ''' - sc = SearchCriteria(); - sc.addMatchClause(SearchCriteria.MatchClause.createAttributeMatch(SearchCriteria.MatchClauseAttribute.TYPE, illuminaFlowCellTypeName)); - sc.addMatchClause(SearchCriteria.MatchClause.createAttributeMatch(SearchCriteria.MatchClauseAttribute.CODE, flowCellName)); - foundSample = service.searchForSamples(sc) - try: - assert foundSample.size() == 1 - except AssertionError: - print (str(foundSample.size()) + ' flow cells found which match.') - exit(1) - - logger.info('Found ' + foundSample[0].getCode() + ' in openBIS') - # Search for contained samples - sampleSc = SearchCriteria() - sampleSc.addSubCriteria(SearchSubCriteria.createSampleContainerCriteria(sc)) - foundContainedSamples = service.searchForSamples(sampleSc) - - return foundSample[0], foundContainedSamples - - -def getParents(sampleName, service): - ''' - Returns a list of parents of a sample - ''' - sc = SearchCriteria(); - sc.addMatchClause(SearchCriteria.MatchClause.createAttributeMatch(SearchCriteria.MatchClauseAttribute.CODE, sampleName)); - foundSample = service.searchForSamples(sc) - - try: - assert foundSample.size() == 1 - except AssertionError: - print (str(foundSample.size()) + ' flow lanes found which match.') - - # set the criteria for getting the parents when providing the child name - sampleSc = SearchCriteria() - sampleSc.addSubCriteria(SearchSubCriteria.createSampleChildCriteria(sc)) - foundParentSamples = service.searchForSamples(sampleSc) - - return foundParentSamples - -def getContainedSampleProperties(containedSamples, service): - - # TODO: update description and function name - ''' - Takes a list of contained samples, retrieves the parents and their properties and returns it - as a dictionary. The key is the sample name, the value is a list of the properties - - Additionally a dictionary with the lane (key) and the number of samples (value) is returned - ''' - parentDict = {} - samplesPerLaneDict = {} - - for lane in containedSamples: - parents = getParents (lane.getCode(), service) - - try: - assert parents.size() >= 1 - except AssertionError: - print (str(parents.size()) + ' parents found for lane ' + lane.getCode()) - - samplesPerLaneDict[lane.getCode()[-1]] = len(parents) - - for parent in parents: - parentCode = parent.getCode() - parentProperties = parent.getProperties() - propertyDict = {} - for property in parentProperties: - propertyDict[property] = parentProperties.get(property) - - propertyDict['LANE'] = lane.getCode() - - myKey = sanitizeString(parentCode + '_' + lane.getCode()) - parentDict[myKey] = propertyDict - - return parentDict, samplesPerLaneDict - - -def convertSampleToDict(foundFlowCell): - ''' - converts <type 'ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.Sample'> to a python dict - ''' - flowCellDict = {} - fcProperties = foundFlowCell.getProperties() - for property in fcProperties: - flowCellDict[property] = fcProperties.get(property) - flowCellDict['Project'] = foundFlowCell.getExperimentIdentifierOrNull().split('/')[-1] - flowCellDict['Name'] = foundFlowCell.getIdentifier().split('/')[-1] - return flowCellDict - - -def pickleDemultiplexCommandList(logger, demultiplexCommandList, fileName): - import pickle - - try: - with open(fileName, 'w') as pickleDemux: - pickle.dump(demultiplexCommandList, pickleDemux) - logger.info('Writing file ' + fileName) - except IOError, err: - logger.error('File error: ' + str(err)) - print ('File error: ' + str(err)) - - -def writeMiSeqSampleSheet(sampleSheetDict, headerList, flowCellName, myoptions, logger, fileName): - ''' - Writes the given dictionary to a csv file. The order does not matter. As the header is not fixed - we first need to write the headerList in the file. This is specific to MiSeq - ''' - newline = lineending[myoptions.lineending] - try: - with open(fileName, 'wb') as sampleSheetFile: - for listElement in headerList: - if myoptions.verbose: - print listElement - sampleSheetFile.write(listElement + newline) - for sample in sampleSheetDict: - if myoptions.verbose: - print sampleSheetDict[sample][0] - sampleSheetFile.write(sampleSheetDict[sample][0] + newline) - - logger.info('Writing file ' + fileName) - - except IOError: - logger.error('File error: ' + str(err)) - print ('File error: ' + str(err)) - - return fileName - -def get_reverse_complement(sequence): - lookup_table = {'A': 'T', 'T': 'A', 'G': 'C', 'C': 'G'} - reverse_complement = '' - for nucleotide in reversed(sequence): - reverse_complement += lookup_table[nucleotide] - return reverse_complement - - -def createSampleSheet(parentDict, flowCellDict, configMap, index1Vocabulary, index2Vocabulary, - flowCellName, logger, myoptions): - ''' - ''' - - kitsDict = {"CHIP_SEQ_SAMPLE_PREP" : ["",""], - "TRUSEQ_RNA_SAMPLEPREPKIT_V2_ILLUMINA" : ["A","TruSeq LT"], - "NEXTERA_XT_DNA_SAMPLE_PREPARATION_KIT_ILLUMINA" : ["S", "Nextera XT"], - "TRUSEQ_CHIP_SAMPLE_PREP_KIT" : ["A","TruSeq LT"], - "MRNA_SEQ_SAMPLE_PREP" : ["",""], - "TRUSEQRNA_SAMPLE_PREP_KIT" : ["A","TruSeq LT"], - "NEBNEXT_DNA_SAMPLE_PREP_MASTER_MIX_SET1" : ["A","TruSeq LT"], - "NEBNEXT_CHIP-SEQ_LIBRARY_PREP_REAGENT_SET" : ["A","TruSeq LT"], - "RIBOZERO_SCRIPTSEQ_MRNA-SEQ_KIT" : ["",""], - "NEXTERA_DNA_SAMPLE_PREPARATION_KIT_ILLUMINA" : ["N", "Nextera"], - "GENOMICDNA_SAMPLE_PREP" : ["",""], - "AGILENT_SURESELECTXT_AUTOMATEDLIBRARYPREP" : ["",""], - "TRUSEQ_DNA_SAMPLE_PREP_KIT" : ["A","TruSeq LT"], - "NEXTERA_DNA_SAMPLE_PREP_KITS" : ["N", "Nextera"], - "AGILENT_SURESELECT_ENRICHMENTSYSTEM" : ["",""], - "TRUSEQ_DNA_SAMPLE_PREP_KIT_V2" : ["A","TruSeq LT"], - "AGILENT_SURESELECT_HUMAN_ALL_EXON_V5_UTRS" : ["",""], - "POLYA_SCRIPTSEQ_MRNA-SEQ_KIT" : ["",""], - "AGILENT_SURESELECTXT2_MOUSE_ALL_EXON" : ["",""], - "PAIRED_END_DNA_SAMPLE_PREP" : ["",""], - "NEXTERA_DNA_SAMPLE_PREP_KIT_BUFFER_HMW" : ["N", "Nextera"] - } - - sampleSheetDict = {} - headerList = [] - - # here we take the fisrat sample to determine the Sample Prep Kit - try: - assay = kitsDict [parentDict.itervalues().next()[configMap['kit']]][1] - except: - print "No Kit set for sample. Will not set the assay value in the sample sheet" - assay = "" - pass - - separator = configMap['separator'] - - miSeqHeaderSection = configMap['miSeqHeaderSection'].split(separator) - miSeqHeaderSection.reverse() - headerList = [miSeqHeaderSection.pop().strip()] - headerList.append(miSeqHeaderSection.pop().strip() + separator + configMap['iemFileVersion']) - headerList.append(miSeqHeaderSection.pop().strip() + separator + configMap['facilityInstitution']) - headerList.append(miSeqHeaderSection.pop().strip() + separator + configMap['facilityName']) - headerList.append(miSeqHeaderSection.pop().strip() + separator + flowCellDict['Name']) - headerList.append(miSeqHeaderSection.pop().strip() + separator + datetime.now().strftime('%m/%d/%Y')) - headerList.append(miSeqHeaderSection.pop().strip() + separator + configMap['miSeqWorkflow']) - headerList.append(miSeqHeaderSection.pop().strip() + separator + configMap['miSeqApplication']) - headerList.append(miSeqHeaderSection.pop().strip() + separator + assay) - headerList.append(miSeqHeaderSection.pop().strip() + separator + flowCellDict[configMap['endType']] + '_' + flowCellDict[configMap['cycles']]) - headerList.append(miSeqHeaderSection.pop().strip() + separator + configMap['miSeqChemistry']) - headerList.append('') - - miSeqReadsSection = configMap['miSeqReadsSection'].split(separator) - miSeqReadsSection.reverse() - headerList.append(miSeqReadsSection.pop()) - headerList.append(flowCellDict[configMap['cycles']]) - if (flowCellDict[configMap['endType']] == 'PAIRED_END'): - headerList.append(flowCellDict[configMap['cycles']]) - headerList.append('') - - miSeqSettingsSection = configMap['miSeqSettingsSection'].split(separator) - miSeqSettingsSection.reverse() - headerList.append(miSeqSettingsSection.pop()) - if ('nextera' in assay.lower()): - headerList.append(configMap['nexteraAdapter']) - if ('truseq' in assay.lower()): - headerList.append(configMap['truSeqAdapter1']) - headerList.append(configMap['truSeqAdapter2']) - headerList.append('') - - if int(flowCellDict['INDEXREAD2']) > 0: - miSeqDataSection = configMap['nextSeqDataSectionDualRead'].split(',') - else: - miSeqDataSection = configMap['nextSeqDataSectionSingleRead'].split(',') - - miSeqDataSection.reverse() - headerList.append(miSeqDataSection.pop()) - headerList.append(','.join(miSeqDataSection.pop().strip().split())) - - for key in parentDict.keys(): - lane = parentDict[key]['LANE'][-1:] - # If no index then just skip this sample - if (configMap['index1Name'] not in parentDict[key]) or (parentDict[key][configMap['index1Name']] == 'NOINDEX'): - continue - index1 = parentDict[key][configMap['index1Name']] - - if configMap['index2Name'] in parentDict[key]: - index2 = parentDict[key][configMap['index2Name']] - indexNumber = index2Vocabulary[parentDict[key][configMap['index2Name']]].split()[2] - - try: - kit = parentDict[key][configMap['kit']] - prefix = kitsDict[kit][0] - except: - print "Missing Kit on " + str(key) - prefix = "" - - len_index1 = int(flowCellDict['INDEXREAD']) - len_index2 = int(flowCellDict['INDEXREAD2']) - - if int(flowCellDict['INDEXREAD2']) > 0: - sampleSheetDict[lane + '_' + key] = [ - lane + separator - + key + separator - + key + '_' + sanitizeString(parentDict[key][configMap['externalSampleName']]) + '_' + index1[0:len_index1] + '_' + index2[0:len_index2] + separator - + separator - + separator - + index1Vocabulary[index1].split()[1] + separator - + index1[0:len_index1] + separator - + prefix + indexNumber + separator - + get_reverse_complement(index2[0:len_index2]) + separator - + key + separator - ] - else: - sampleSheetDict[lane + '_' + key] = [ - lane + separator - + key + separator - + key + '_' + sanitizeString(parentDict[key][configMap['externalSampleName']]) + '_' + index1[0:len_index1] + separator - + separator - + separator - + index1Vocabulary[index1].split()[1] + separator - + index1[0:len_index1] + separator - + key + separator - ] - - myFileName = myoptions.outdir + configMap['SampleSheetFileName'] + '_' + \ - flowCellName + '.csv' - - sampleSheetFile = writeMiSeqSampleSheet(sampleSheetDict, headerList, flowCellName, - myoptions, logger, fileName=myFileName) - return sampleSheetFile - -''' -Main script -''' -def main (): - - logger = setUpLogger('log/') - logger.info('Started Creation of Sample Sheet...') - - myoptions = parseOptions(logger) - - if myoptions.debug: - logger.setLevel(logging.DEBUG) - - flowCellName = myoptions.flowcell - configMap = readConfig(logger) - service = login(logger, configMap) - - foundFlowCell, containedSamples = getFlowCell(configMap['illuminaFlowCellTypeName'], flowCellName, - service, logger) - parentDict, samplesPerLaneDict = getContainedSampleProperties(containedSamples, service) - logger.info('Found ' + str(len(parentDict)) + ' samples on the flow cell ' + flowCellName) - - flowCellName = foundFlowCell.getCode() - if '-' in flowCellName: - flowCellName = flowCellName.split('_')[3] - elif len(flowCellName) > 12: - flowCellName = flowCellName.split('_')[3][1:] - else: - pass - - flowCellDict = convertSampleToDict(foundFlowCell) - - hiseqList = configMap['hiSeqNames'].split() - miseqList = configMap['miSeqNames'].split() - - runFolderName = flowCellDict['Name'] - - index1Vocabulary = getVocabulary(configMap['index1Name'], service) - index2Vocabulary = getVocabulary(configMap['index2Name'], service) - SampleSheetFile = createSampleSheet(parentDict, flowCellDict, configMap, - index1Vocabulary, index2Vocabulary, flowCellName, logger, myoptions) - - if myoptions.maillist: - sendMail(configMap['mailList'], [SampleSheetFile], flowCellName, configMap, logger) - - logout(service, logger) - - -if __name__ == "__main__": - main() diff --git a/deep_sequencing_unit/source/Jython/createSampleSheet_nov.py b/deep_sequencing_unit/source/Jython/createSampleSheet_nov.py deleted file mode 100644 index a6da0077a0ab9d39b3c075d9fab26ea1da410162..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/source/Jython/createSampleSheet_nov.py +++ /dev/null @@ -1,409 +0,0 @@ -''' -@copyright: -Copyright 2012 ETH Zuerich, CISD - -@license: -Licensed under the Apache License, Version 2.0 (the 'License'); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - -http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an 'AS IS' BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. - -@author: -Manuel Kohler - -@description: -Creates the SampleSheet.csv out of values from openBIS for Demultiplexing -used in the Illumina pipeline (configureBclToFastq.pl) - -@attention: -Runs under Jython - -@note: -Takes into account to replace special characters with an underscore so that the Illumina script -does not fail - -HiSeq Header Description -======================== -Column Header Description -FCID Flow cell ID -Lane Positive integer, indicating the lane number (1-8) -SampleID ID of the sample -SampleRef The reference used for alignment for the sample -Index Index sequences. Multiple index reads are separated by a hyphen (for example, ACCAGTAA-GGACATGA). -Description Description of the sample -Control Y indicates this lane is a control lane, N means sample -Recipe Recipe used during sequencing -Operator Name or ID of the operator -SampleProject The project the sample belongs to -''' - -from __future__ import with_statement -import os -import logging -import re -import sys -import string -import smtplib -from ConfigParser import SafeConfigParser -from optparse import OptionParser -from datetime import * - -from ch.systemsx.cisd.openbis.dss.client.api.v1 import OpenbisServiceFacadeFactory -from ch.systemsx.cisd.openbis.generic.shared.api.v1.dto import SearchCriteria -from ch.systemsx.cisd.openbis.generic.shared.api.v1.dto import SearchSubCriteria -from java.util import EnumSet - -lineending = {'win32':'\r\n', 'linux':'\n', 'mac':'\r'} -COMMA = ',' - -def login(configMap, logger): - logger.info('Logging into ' + configMap['openbisServer']) - try: - service = OpenbisServiceFacadeFactory.tryCreate(configMap['openbisUserName'], - configMap['openbisPassword'], - configMap['openbisServer'], - configMap['connectionTimeout']) - except: - raise ('Could not connect to ' + configMap['openbisServer'] + '. Please check if the server ' + - 'address is OK, the firewall is not blocking the communication or openBIS is down.') - - return service - -def logout (service, logger): - service.logout() - logger.info('Logged out') - -def setUpLogger(logPath, logLevel=logging.INFO): - logFileName = 'createSampleSheet' - d = datetime.now() - logFileName = logFileName + '_' + d.strftime('%Y-%m-%d_%H_%M_%S') + '.log' - logging.basicConfig(filename=logPath + logFileName, - format='%(asctime)s [%(levelname)s] %(message)s', level=logLevel) - logger = logging.getLogger(logFileName) - return logger - -def parseOptions(logger): - logger.info('Parsing command line parameters') - parser = OptionParser(version='%prog 1.0') - parser.add_option('-f', '--flowcell', - dest='flowcell', - help='The flowcell which is used to create the SampleSheet.csv', - metavar='<flowcell>') - parser.add_option('-l', '--lineending', - dest='lineending', - type='choice', - action='store', - choices=['win32', 'linux', 'mac'], - default='linux', - help='Specify end of line separator: win32, linux, mac. Default: linux' , - metavar='<lineending>') - parser.add_option('-o', '--outdir', - dest='outdir', - default='./', - help='Specify the ouput directory. Default: ./' , - metavar='<outdir>') - parser.add_option('-d', '--debug', - dest='debug', - default=False, - action='store_true', - help='Verbose debug logging. Default: False') - parser.add_option('-v', '--verbose', - dest='verbose', - default=False, - action='store_true', - help='Write Sample Sheet to stout. Default: False') - - (options, args) = parser.parse_args() - - if options.outdir[-1] <> '/': - options.outdir = options.outdir + '/' - - if options.flowcell is None: - parser.print_help() - exit(-1) - return options - -def parseConfigurationFile(logger, propertyFile='etc/createSampleSheet_nov.properties'): - ''' - Parses the given config files and returns the values - ''' - logger.info('Reading config file ' + propertyFile) - config = SafeConfigParser() - config.read(propertyFile) - config.sections() - return config - -def readConfig(logger): - - GENERAL = 'GENERAL' - OPENBIS = 'OPENBIS' - ILLUMINA = 'ILLUMINA' - - configMap = {} - - configParameters = parseConfigurationFile(logger) - - configMap['facilityName'] = configParameters.get(GENERAL, 'facilityName') - configMap['facilityNameShort'] = configParameters.get(GENERAL, 'facilityNameShort') - configMap['facilityInstitution'] = configParameters.get(GENERAL, 'facilityInstitution') - configMap['sampleSheetFileName'] = configParameters.get(GENERAL, 'sampleSheetFileName') - configMap['lanePrefix'] = configParameters.get(GENERAL, 'lanePrefix') - configMap['separator'] = configParameters.get(GENERAL, 'separator') - configMap['indexSeparator'] = configParameters.get(GENERAL, 'indexSeparator') - - configMap['openbisUserName'] = configParameters.get(OPENBIS, 'openbisUserName') - configMap['openbisPassword'] = configParameters.get(OPENBIS, 'openbisPassword', raw=True) - configMap['openbisServer'] = configParameters.get(OPENBIS, 'openbisServer') - configMap['connectionTimeout'] = configParameters.getint(OPENBIS, 'connectionTimeout') - configMap['illuminaFlowCellTypeName'] = configParameters.get(OPENBIS, 'illuminaFlowCellTypeName') - configMap['index1Name'] = configParameters.get(OPENBIS, 'index1Name') - configMap['index2Name'] = configParameters.get(OPENBIS, 'index2Name') - configMap['species'] = configParameters.get(OPENBIS, 'species') - configMap['sampleName'] = configParameters.get(OPENBIS, 'sampleName') - configMap['operator'] = configParameters.get(OPENBIS, 'operator') - configMap['endType'] = configParameters.get(OPENBIS, 'endType') - configMap['readLength'] = configParameters.get(OPENBIS, 'readLength') - configMap['lengthIndex1'] = configParameters.get(OPENBIS, 'lengthIndex1') - configMap['lengthIndex2'] = configParameters.get(OPENBIS, 'lengthIndex2') - configMap['gaNumber'] = configParameters.get(OPENBIS, 'gaNumber') - - configMap['hiSeqNames'] = configParameters.get(ILLUMINA, 'hiSeqNames') - configMap['hiSeqHeader'] = configParameters.get(ILLUMINA, 'hiSeqHeader') - - return configMap - -def sanitizeString(myString): - return re.sub('[^A-Za-z0-9]+', '_', myString) - -def getVocabulary(vocabularyCode): - ''' Returns the vocabulary terms and vocabulary labels of a vocabulary in a dictionary - specified by the parameter vocabularyCode - ''' - terms = [] - vocabularies = service.listVocabularies() - vocabularyDict = {} - for vocabulary in vocabularies: - if (vocabulary.getCode() == vocabularyCode): - terms = vocabulary.getTerms() - if terms: - for term in terms: - vocabularyDict[term.getCode()] = term.getLabel() - else: - print ('No vocabulary found for ' + vocabularyCode) - return vocabularyDict - -def getFlowCell (illuminaFlowCellTypeName, flowCellName, service, logger): - ''' - Getting the the matching FlowCell - ''' - sc = SearchCriteria(); - sc.addMatchClause(SearchCriteria.MatchClause.createAttributeMatch(SearchCriteria.MatchClauseAttribute.TYPE, illuminaFlowCellTypeName)); - sc.addMatchClause(SearchCriteria.MatchClause.createAttributeMatch(SearchCriteria.MatchClauseAttribute.CODE, flowCellName)); - foundSample = service.searchForSamples(sc) - try: - assert foundSample.size() == 1 - except AssertionError: - print (str(foundSample.size()) + ' flow cells found which match.') - exit(1) - - logger.info('Found ' + foundSample[0].getCode() + ' in openBIS') - # Search for contained samples - sampleSc = SearchCriteria() - sampleSc.addSubCriteria(SearchSubCriteria.createSampleContainerCriteria(sc)) - foundContainedSamples = service.searchForSamples(sampleSc) - - return foundSample[0], foundContainedSamples - - -def getParents(sampleName, service): - ''' - Returns a list of parents of a sample - ''' - sc = SearchCriteria(); - sc.addMatchClause(SearchCriteria.MatchClause.createAttributeMatch(SearchCriteria.MatchClauseAttribute.CODE, sampleName)); - foundSample = service.searchForSamples(sc) - - # set the criteria for getting the parents when providing the child name - sampleSc = SearchCriteria() - sampleSc.addSubCriteria(SearchSubCriteria.createSampleChildCriteria(sc)) - foundParentSamples = service.searchForSamples(sampleSc) - - return foundParentSamples - -def getContainedSampleProperties(logger, containedSamples, service): - ''' - Takes a list of contained samples, retrieves the parents and their properties and returns it - as a dictionary. The key is the sample name, the value is a list of the properties - ''' - laneParentDict = {} - - for lane in containedSamples: - parents = getParents (lane.getCode(), service) - - for parent in parents: - parentCode = parent.getCode() - parentProperties = parent.getProperties() - - propertyDict = {} - for property in parentProperties: - propertyDict[property] = parentProperties.get(property) - - propertyDict['LANE'] = lane.getCode() - propertyDict['SAMPLE_TYPE'] = parent.getSampleTypeCode() - myKey = sanitizeString(parentCode + '_' + lane.getCode()) - laneParentDict[myKey] = propertyDict - - logger.info('Found ' + str(len(laneParentDict)) + ' samples on the flow cell.') - return laneParentDict - - -def convertSampleToDict(foundFlowCell, configMap): - ''' - converts <type 'ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.Sample'> to a python dict - ''' - flowCellDict = {} - fcProperties = foundFlowCell.getProperties() - for property in fcProperties: - flowCellDict[property] = fcProperties.get(property) - flowCellDict['Name'] = foundFlowCell.getIdentifier().split('/')[-1] - flowCellDict['CODE'] = foundFlowCell.getCode() - return flowCellDict - -def getIndex(indx1, indx2, index1ReadLength, indexRead2Length, properties, configMap): - if indx1 in properties and index1ReadLength > 0: - index = properties[indx1][0:index1ReadLength] - else: - index = '' - if indx2 in properties and indexRead2Length > 0: - index = index + configMap['indexSeparator'] + properties[indx2][0:index1ReadLength] - return index - - -def getSampleProperties(parentsKey, service, logger): - for sample in parentsKey: - sampleProperties = sample.getProperties() - logger.debug(sample.getSampleTypeCode() + ' ' + sample.getCode()) - parentSamples = getParents(sample.getCode(), service) - for parentSample in parentSamples: - logger.debug(parentSample.getSampleTypeCode() + ' ' + parentSample.getCode()) - parentSampleProperties = parentSample.getProperties() - - return parentSample, parentSampleProperties - - -def createSampleSheetDict(configMap, control, sampleSheetDict, flowCellName, flowCellOperator, - end_type, cycles, lane, gaNumber, index, sample, sampleProperties, library): - sampleSheetDict[lane + '_' + sample.getCode()] = [ - flowCellName + COMMA + lane + COMMA + library.getCode() + COMMA + - sampleProperties[configMap['species']] + COMMA + index + COMMA + - sanitizeString(sampleProperties[configMap['sampleName']]) + COMMA + control + COMMA + - end_type + '_' + cycles + COMMA + flowCellOperator + COMMA + gaNumber] - -def createHiseqSampleSheet(laneParentDict, flowCellDict, configMap, service, logger, myoptions): - ''' - Builds up a dictionary with all entries in the Sample Sheet - ''' - control = 'N' - # the illlumina pipeline uses always one base less than the sequencer is sequencing - demultiplexIndexLengthPenalty = 0 - - sampleSheetDict = {} - # Making sure this is on the top of the Sample Sheet - sampleSheetDict[u'!'] = ([configMap['hiSeqHeader']]) - - indx1 = configMap['index1Name'] - indx2 = configMap['index2Name'] - - flowCellName = flowCellDict['CODE'] - flowCellOperator = flowCellDict[configMap['operator']] - end_type = flowCellDict[configMap['endType']] - cycles = flowCellDict[configMap['readLength']] - index1ReadLength = int(flowCellDict[configMap['lengthIndex1']]) + demultiplexIndexLengthPenalty - indexRead2Length = int(flowCellDict[configMap['lengthIndex2']]) + demultiplexIndexLengthPenalty - - for key in laneParentDict.keys(): - lane = laneParentDict[key]['LANE'][-1:] - properties = laneParentDict[key] - sampleName = laneParentDict[key]['LIBRARYID'] - - # already Library with index - if indx1 in properties: - gaNumber = laneParentDict[key][configMap['gaNumber']] - index = getIndex(indx1, indx2, index1ReadLength, indexRead2Length, properties, configMap) - sample, sampleProperties = getSampleProperties(getParents(sampleName, service), service, logger) - - createSampleSheetDict(configMap, control, sampleSheetDict, flowCellName, flowCellOperator, - end_type, cycles, lane, gaNumber, index, sample, sampleProperties) - else: - for library in getParents(sampleName, service): - libraryProperties = library.getProperties() - gaNumber = libraryProperties[configMap['gaNumber']] - if not gaNumber: - logger.warning('No GA number found for ' + library.getCode()) - index = getIndex(indx1, indx2, index1ReadLength, indexRead2Length, libraryProperties, configMap) - if not index: - logger.warning('No index found for ' + library.getCode()) - sample, sampleProperties = getSampleProperties(getParents(library.getCode(), service), service, logger) - - createSampleSheetDict(configMap, control, sampleSheetDict, flowCellName, flowCellOperator, - end_type, cycles, lane, gaNumber, index, sample, sampleProperties, library) - - logger.debug(sampleSheetDict) - sortedSampleSheetList = sampleSheetDict.keys() - sortedSampleSheetList.sort() - writeSampleSheet(flowCellName, sampleSheetDict, sortedSampleSheetList, myoptions, logger, fileName=myoptions.outdir + - configMap['sampleSheetFileName']) - -def writeSampleSheet(flowCellName, sampleSheetDict, sortedSampleSheetList, myoptions, logger, fileName): - ''' - Write the given dictionary to a csv file - ''' - newline = lineending[myoptions.lineending] - myFile = fileName + '_' + flowCellName + '.csv' - try: - with open(myFile, 'w') as sampleSheetFile: - for listElement in sortedSampleSheetList: - if myoptions.verbose: - print sampleSheetDict[listElement][0] - sampleSheetFile.write(sampleSheetDict[listElement][0] + newline) - - logger.info('Writing file ' + myFile) - - except IOError: - logger.error('File error: ' + str(err)) - print ('File error: ' + str(err)) - - -def main(): - ''' - Main script - ''' - logger = setUpLogger('log/') - logger.info('Started Creation of Sample Sheet...') - - myoptions = parseOptions(logger) - if myoptions.debug: - logger.setLevel(logging.DEBUG) - - flowCellName = myoptions.flowcell - configMap = readConfig(logger) - service = login(configMap, logger) - - foundFlowCell, containedSamples = getFlowCell(configMap['illuminaFlowCellTypeName'], flowCellName, service, logger) - flowCellName = foundFlowCell.getCode() - flowCellDict = convertSampleToDict(foundFlowCell, configMap) - - laneParentDict = getContainedSampleProperties(logger, containedSamples, service) - createHiseqSampleSheet(laneParentDict, flowCellDict, configMap, service, logger, myoptions) - - logout(service, logger) - -if __name__ == "__main__": - main() diff --git a/deep_sequencing_unit/source/Jython/create_QGF_Invoices.py b/deep_sequencing_unit/source/Jython/create_QGF_Invoices.py deleted file mode 100644 index 804dcceef7295fd49bbb979d0bfaacd83666fa0b..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/source/Jython/create_QGF_Invoices.py +++ /dev/null @@ -1,403 +0,0 @@ -''' - Copyright 2012 ETH Zuerich, CISD - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - ''' - -''' -@author Manuel Kohler - -Creates Excel-based invoices for the Quantitative Genomics Facility, -D-BSSE, ETH Zurich - -''' - -import os -import re -import sys -from datetime import * -from java.io import FileOutputStream -from org.apache.poi.hssf.usermodel import HSSFWorkbook -from org.apache.poi.poifs.filesystem import POIFSFileSystem -from org.apache.poi.xssf.usermodel import XSSFWorkbook -from ch.systemsx.cisd.openbis.dss.client.api.v1 import OpenbisServiceFacadeFactory -from ch.systemsx.cisd.openbis.generic.shared.api.v1.dto import SearchCriteria -from ch.systemsx.cisd.openbis.generic.shared.api.v1.dto import SearchSubCriteria - - -facilityName = "Quantitative Genomics Facility" -facilityInstitution = "D-BSSE, ETHZ" -facilityNameShort = "QGF" -subHeader = "Detailed Sample Overview" -PRINCIPAL_INVESTIGATOR = "Principal Investigator" -CONTACT_PERSON = "Contact person" -FLOW_CELL_ID = "Flow Cell ID" -defaultFonts = "Calibri" - -excelFormats = {"xls": "HSSFWorkbook()" , "xlsx": "XSSFWorkbook()"} - -columnHeaders = ["EXTERNAL_SAMPLE_NAME", "BARCODE", "BIOLOGICAL_SAMPLE_ARRIVED", "KIT_PREPARED", - "KIT", "FRAGMENT_SIZE_PREPARED_ILLUMINA", "CONCENTRATION_PREPARED_ILLUMINA", - "NOTES", "PRICE"] - -columnHeadersMap = {"EXTERNAL_SAMPLE_NAME": "Sample Name", - "BARCODE": "Index", - "BIOLOGICAL_SAMPLE_ARRIVED": "Received", - "PREPARED_BY" : "Prepared by", - "FRAGMENT_SIZE_PREPARED_ILLUMINA" : "Frag Size", - "CONCENTRATION_PREPARED_ILLUMINA" : "Conc", - "NOTES" : "Notes", - "PRICE" : "Price"} - -fcPropertyList = ["SEQUENCER", "FLOW_CELL_SEQUENCED_ON", "END_TYPE", "ILLUMINA_PIPELINE_VERSION", - "CYCLES_REQUESTED_BY_CUSTOMER", "FLOWCELLTYPE", "SBS_KIT"] - -dataSetFileNameEntitySeparator = ":" - -outputPath = "/local0/openbis/invoices" - -invoicePropertyName = "INVOICE" -pIPropertyName = "PRINCIPAL_INVESTIGATOR_NAME" -contactPersonNamePropertyName = "CONTACT_PERSON_NAME" - -''' -class invoiceDataSet: - def __init__(self): - self.code = '' - self.externalSampleName = '' - self.sampleID = '' - self.biologicalSampleArrived = '' - self.preparedBy = '' - self.preparedDate = '' - self.kitUsed = '' - self.fragmentSizePrepared = '' - self.concentrationPrepared = '' - self.dataTransferred = '' - self.price = '' - - - def setDefaultHeader(self): - code = "Sample code" - externalSampleName = "External Sample Name" - sampleID = "Internal #" - biologicalSampleArrived = "Received" - preparedBy = "Prepared by" - preparedDate = "Prepared on" - kitUsed = "Kit used" - fragmentSizePrepared = "Fragment size prepared in bp" - concentrationPrepared = "concentration prepared in ul/ng" - dataTransferred = "Data transferred" - price = "Price excl. VAT" -''' - -class flowCell: - def __init__(self): - self.id = '' - self.sequencer = '' - self.flowCellSequencedOn = '' - self.endType = '' - self.illuminaPipelineVersion = '' - self.cyclesRequestedByCustomer = '' - self.flowCellType = '' - self.sbsKit = '' - - - -class uniqueRow(): - ''' - Little helper class which ensures the unique use of a row - ''' - def __init__(self): - self.row = -1 - - def getNextRow (self): - self.row += 1 - return self.row - - def setRow(self, rowNumber): - self.row = rowNumber - return self.row - -class uniqueColumn(): - ''' - Little helper class which ensures the unique use of a column - ''' - def __init__(self): - self.column = -1 - - def getCurrentColumn(self): - return self.column - - def getNextColumn (self): - self.column += 1 - return self.column - - def setColumn(self, columnNumber): - self.column = columnNumber - return self.column - -def getDate(): - d = datetime.now() - return d.strftime("%A, %d of %B %Y") - -def setFont(wb, fontSize = 10): - font = wb.createFont() - font.setFontHeightInPoints(fontSize) - font.setFontName(defaultFonts) - font.setItalic(False) - font.setStrikeout(False) - # Fonts are set into a style so create a new one to use. - style = wb.createCellStyle() - style.setFont(font) - return style - - -def getVocabulary(vocabularyCode): - ''' Returns the vocabulary term and vocabulary label of a vocabulary specified by the parameter - vocabularyCode in a map''' - - vocabularies = service.listVocabularies() - vocabularyMap = {} - for vocabulary in vocabularies: - if (vocabulary.getCode() == vocabularyCode): - terms = vocabulary.getTerms() - for term in terms: - vocabularyMap[term.getCode()] = term.getLabel() - return vocabularyMap - - -def getNonbilledSamples (sampleType): - '''Getting all samples where no Invoice was sent - @param param: Sample Type which we are looking for - ''' - - sc = SearchCriteria(); - sc.addMatchClause(SearchCriteria.MatchClause.createAttributeMatch(SearchCriteria.MatchClauseAttribute.TYPE, sampleType)); - sc.addMatchClause(SearchCriteria.MatchClause.createPropertyMatch(invoicePropertyName, "false")); - foundSamples = service.searchForSamples(sc) - return foundSamples - -def groupByPi (sampleList): - principalInvestigatorDict = {} - - for sample in sampleList: - pI = sample.getProperties().get(pIPropertyName) - if principalInvestigatorDict.has_key(pI): - principalInvestigatorDict[pI].append(sample) - else: - principalInvestigatorDict[pI] = [sample] - return principalInvestigatorDict - -def groupByContactPerson (sampleList): - groupedByPersonDict = {} - - for sample in sampleList: - contact = sample.getProperties().get(contactPersonNamePropertyName) - if groupedByPersonDict.has_key(contact): - groupedByPersonDict[contact].append(sample) - else: - groupedByPersonDict[contact] = [sample] - return groupedByPersonDict - -def getContainer(sample): - - flowcell = None - - parentSearchCriteria = SearchCriteria() - # define Parent - parentSearchCriteria.addMatchClause(SearchCriteria.MatchClause.createAttributeMatch(SearchCriteria.MatchClauseAttribute.CODE, sample.getCode())) - childrenSearchCriteria = SearchCriteria() - # we look for children with this parent - childrenSearchCriteria.addSubCriteria(SearchSubCriteria.createSampleParentCriteria(parentSearchCriteria)) - children = service.searchForSamples(childrenSearchCriteria) - - for child in children: - child = child.getCode() - try: - containerName, lane = child.split(dataSetFileNameEntitySeparator) - except: - # No container - containerName = "" - lane = "" - - if containerName <> "": - containerSearch = SearchCriteria() - containerSearch.addMatchClause(SearchCriteria.MatchClause.createAttributeMatch(SearchCriteria.MatchClauseAttribute.CODE, containerName)) - containerList = service.searchForSamples(containerSearch) - - for container in containerList: - flowcell = flowCell () - flowcell.id = containerName - '''flowcell.sequencer = container.getProperties().get("SEQUENCER") - flowcell.flowCellSequencedOn = container.getProperties().get("FLOW_CELL_SEQUENCED_ON") - flowcell.endType = container.getProperties().get("END_TYPE") - flowcell.illuminaPipelineVersion = container.getProperties().get("ILLUMINA_PIPELINE_VERSION") - flowcell.cyclesRequestedByCustomer = container.getProperties().get("CYCLES_REQUESTED_BY_CUSTOMER") - flowcell.flowCellType = container.getProperties().get("FLOWCELLTYPE") - flowcell.sbsKit = container.getProperties().get("SBS_KIT") ''' - return flowcell - -def writeExcel(piName, groupedByPersonDict, format = "xls"): - ''' - ''' - - myRows = uniqueRow() - kitVocabulary = getVocabulary("KIT") - setOfFlowcells = set () - - def writeHeader(): - # Write header - row = sheet.createRow(myRows.getNextRow()) - row.createCell(0).setCellValue(facilityName + ", " + facilityInstitution) - row.getCell(0).setCellStyle(setFont(wb, 14)) - row1 = sheet.createRow(myRows.getNextRow()) - row1.createCell(0).setCellValue(getDate()) - row1.getCell(0).setCellStyle(setFont(wb, 10)) - - - def createRow(key = "", value = "", rowNumber = 0, fontSize = 10): - ''' - ''' - if rowNumber == 0: - row = sheet.createRow(myRows.getNextRow()) - else: - row = rowNumber - row.createCell(0).setCellValue(key) - row.createCell(1).setCellValue(value) - row.getCell(0).setCellStyle(setFont(wb, fontSize)) - row.getCell(1).setCellStyle(setFont(wb, fontSize)) - return row - - def writeFooter(sheet): - footer = sheet.getFooter() - footer.setRight("generated on " + datetime.now().strftime("%H:%M - %d.%m.%Y")) - - wb = (eval(excelFormats[format])) - createHelper = wb.getCreationHelper() - sheet = wb.createSheet(facilityNameShort) - # 3/2 = 150 percent magnification when opening the workbook - sheet.setZoom(3, 2) - - writeHeader() - createRow(PRINCIPAL_INVESTIGATOR, piName) - contactrow = myRows.setRow(myRows.getNextRow()) - - for contactPerson in groupedByPersonDict: - myColumns = uniqueColumn() - createRow(CONTACT_PERSON, contactPerson, 0, 14) - - sampleList = groupedByPersonDict[contactPerson] - - sampleHeader = sheet.createRow(myRows.getNextRow()) - sampleHeader.createCell(myColumns.getNextColumn()).setCellValue("Flow Cell") - sampleHeader.getCell(myColumns.getCurrentColumn()).setCellStyle(setFont(wb, 10)) - sampleHeader.createCell(myColumns.getNextColumn()).setCellValue("Sample Code") - sampleHeader.getCell(myColumns.getCurrentColumn()).setCellStyle(setFont(wb, 10)) - for c in columnHeaders: - sampleHeader.createCell(myColumns.getNextColumn()).setCellValue(c) - sampleHeader.getCell(myColumns.getCurrentColumn()).setCellStyle(setFont(wb, 10)) - - for singleSample in sampleList: - singleSampleColumns = uniqueColumn() - fc = getContainer(singleSample) - - rowN = sheet.createRow(myRows.getNextRow()) - contactrow += 3 - - code = singleSample.getCode() - if fc is not None: - rowN.createCell(singleSampleColumns.getNextColumn()).setCellValue(fc.id) - rowN.getCell(singleSampleColumns.getCurrentColumn()).setCellStyle(setFont(wb, 10)) - setOfFlowcells.add(fc.id) - rowN.createCell(singleSampleColumns.getNextColumn()).setCellValue(code) - rowN.getCell(singleSampleColumns.getCurrentColumn()).setCellStyle(setFont(wb, 10)) - - for column in columnHeaders: - if column == "KIT": - if singleSample.getProperties().get(column) is not None: - val = kitVocabulary[singleSample.getProperties().get(column)] - else: - val = singleSample.getProperties().get(column) - rowN.createCell(singleSampleColumns.getNextColumn()).setCellValue(val) - rowN.getCell(singleSampleColumns.getCurrentColumn()).setCellStyle(setFont(wb, 10)) - - createRow() - - - createRow("Flow Cell Details", "", 0, 14) - - for FC in setOfFlowcells: - containerSearch = SearchCriteria() - containerSearch.addMatchClause(SearchCriteria.MatchClause.createAttributeMatch(SearchCriteria.MatchClauseAttribute.CODE, FC)) - containerList = service.searchForSamples(containerSearch) - - print (len(containerList)) - - for container in containerList: - #index = containerList.index(container) - #createRow("Number",index+1) - createRow(FLOW_CELL_ID, FC) - for property in fcPropertyList: - createRow(property, container.getProperties().get(property)) - createRow() - - # adjust width - for i in range(0, 20): - sheet.autoSizeColumn(i) - - # set layout to landscape - sheet.getPrintSetup().setLandscape(True) - - writeFooter(sheet) - - # Write the output to a file - fileOut = FileOutputStream(outputPath + "/" + facilityNameShort + "_" + piName.replace(" ", "_") + - datetime.now().strftime("_%d_%m_%Y.") + format) - wb.write(fileOut); - fileOut.close(); - -def progressBar(toolbar_width = 40): - ''' - ''' - # setup toolbar - sys.stdout.write("[%s]" % (" " * toolbar_width)) - sys.stdout.flush() - sys.stdout.write("\b" * (toolbar_width + 1)) # return to start of line, after '[' - - -''' -Main script -''' - -# for now setting the format by hand -format = "xlsx" - -service = OpenbisServiceFacadeFactory.tryCreate("openBISUsername", "password", "https://my-openbis.bsse.ethz.ch:8443", 5000) - -foundSamples = getNonbilledSamples("ILLUMINA_SEQUENCING") -groupByPiDict = groupByPi(foundSamples) - -print "Found " + str(len(groupByPiDict)) + " Principal Investigators" - -progressBar(len(groupByPiDict)) - -for principalInvestigator in groupByPiDict: - groupedByPersonDict = groupByContactPerson(groupByPiDict[principalInvestigator]) - # create an Excel file for each PI - writeExcel(principalInvestigator, groupedByPersonDict, format) - sys.stdout.write("*") - sys.stdout.flush() -sys.stdout.write("\n") - -service.logout() -print("DONE") diff --git a/deep_sequencing_unit/source/Jython/create_QGF_Invoices.sh b/deep_sequencing_unit/source/Jython/create_QGF_Invoices.sh deleted file mode 100755 index 28e4b1259933ba0408b5541d6b5571cc3871e5f8..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/source/Jython/create_QGF_Invoices.sh +++ /dev/null @@ -1,4 +0,0 @@ -LIB=lib/ -CLASSPATH=lib/ -cd lib -java -cp dss_client.jar:jython.jar:stream-supporting-httpinvoker.jar:spring.jar:commons-logging.jar:commons-httpclient.jar:commons-codec.jar:commons-lang.jar:log5j.jar:poi-3.7-20101029.jar:poi-ooxml-3.7-20101029.jar:poi-ooxml-schemas-3.7-20101029.jar org.python.util.jython ../create_QGF_Invoices.py diff --git a/deep_sequencing_unit/source/Jython/create_QGF_Invoices_simplified.py b/deep_sequencing_unit/source/Jython/create_QGF_Invoices_simplified.py deleted file mode 100644 index 125add0755a83c87296ca81b4f5f96804a86c794..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/source/Jython/create_QGF_Invoices_simplified.py +++ /dev/null @@ -1,629 +0,0 @@ -# -*- coding: utf-8 -*- -''' -Copyright 2016 ETH Zuerich, CISD - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. - -@author Manuel Kohler - -@description: -Creates Excel-based invoices for the Quantitative Genomics Facility, -D-BSSE, ETH Zurich - -@attention: -Runs under Jython - -@note: - -''' - -import os -import re -import sys -import logging -import collections -from datetime import * -from ConfigParser import SafeConfigParser -from optparse import OptionParser -from java.io import FileOutputStream -from org.apache.poi.hssf.usermodel import HSSFWorkbook -from org.apache.poi.hssf.usermodel import HeaderFooter -from org.apache.poi.poifs.filesystem import POIFSFileSystem -from org.apache.poi.xssf.usermodel import XSSFWorkbook -from ch.systemsx.cisd.openbis.dss.client.api.v1 import OpenbisServiceFacadeFactory -from ch.systemsx.cisd.openbis.generic.shared.api.v1.dto import SearchCriteria -from ch.systemsx.cisd.openbis.generic.shared.api.v1.dto import SearchSubCriteria -from java.util import EnumSet -from java.util import TreeMap -from ch.systemsx.cisd.openbis.generic.shared.api.v1.dto import SampleFetchOption - -excelFormats = {"xls": "HSSFWorkbook()" , "xlsx": "XSSFWorkbook()"} - -column_headers_tuple = (("EXTERNAL_SAMPLE_NAME", "Sample Name"), - ("BARCODE", "Index"), - ("INDEX2", "Index2"), - ("PREPARED_BY", "Prepared by"), - ("KIT", "Kit"), - ("QC_AT_DBSSE", "QC at D-BSSE"), - ("CONTACT_PERSON_NAME", "Contact Person"), - ("NOTES", "Notes"), - ("BIOLOGICAL_SAMPLE_ARRIVED", "Received") - ) - -# Keep the order of the tuples -column_headers_dict = collections.OrderedDict(column_headers_tuple) - -class uniqueRow(): - ''' - Little helper class which ensures the unique use of a row - ''' - def __init__(self): - self.row = -1 - - def getNextRow (self): - self.row += 1 - return self.row - - def setRow(self, rowNumber): - self.row = rowNumber - return self.row - -class uniqueColumn(): - ''' - Little helper class which ensures the unique use of a column - ''' - def __init__(self): - self.column = -1 - - def getCurrentColumn(self): - return self.column - - def getNextColumn (self): - self.column += 1 - return self.column - - def setColumn(self, columnNumber): - self.column = columnNumber - return self.column - -def getDate(): - d = datetime.now() - return d.strftime("%A, %d-%B-%Y") - - -def setFont(wb, configMap, fontSize=10, boldness=False, underline=False): - font = wb.createFont() - font.setFontHeightInPoints(fontSize) - font.setFontName(configMap["defaultFonts"]) - font.setItalic(False) - font.setStrikeout(False) - font.setBold(boldness) - if underline: - font.setUnderline(font.U_SINGLE); - # Fonts are set into a style so create a new one to use. - style = wb.createCellStyle() - style.setFont(font) - return style - - -def getVocabulary(service, vocabularyCode): - ''' Returns the vocabulary term and vocabulary label of a vocabulary specified by the parameter - vocabularyCode in a map''' - - vocabularies = service.listVocabularies() - vocabularyMap = {} - for vocabulary in vocabularies: - if (vocabulary.getCode() == vocabularyCode): - terms = vocabulary.getTerms() - for term in terms: - vocabularyMap[term.getCode()] = term.getLabel() - return vocabularyMap - - -def identify_sequencer(sequencer_code): - sequencer_map = {"M": "MiSeq", "N": "NextSeq"} - if (sequencer_code[0] in sequencer_map): - return sequencer_map[sequencer_code[0]] - else: - return "HiSeq" - - -def merge_two_dicts(x, y): - '''Given two dicts, merge them into a new dict as a shallow copy.''' - z = x.copy() - z.update(y) - return z - - -def camel_case_string(string): - full_name = "" - for split in string.split("_"): - full_name += split[0].upper() + split[1:] + " " - return full_name.strip() - - -def writeHeader(sheet, myRows, wb, configMap, piName, piSpace): - # Write header - row = sheet.createRow(myRows.getNextRow()) - row.createCell(0).setCellValue(configMap["facilityName"] + ", " + configMap["facilityInstitution"]) - row.getCell(0).setCellStyle(setFont(wb, configMap, 10, True)) - row1 = sheet.createRow(myRows.getNextRow()) - row1.createCell(0).setCellValue(getDate()) - row1.getCell(0).setCellStyle(setFont(wb, configMap, 10, True)) - - createRow(configMap, wb, sheet, myRows, "Principal Investigator", camel_case_string(piName), 0, 10, True, columnspace=1) - createRow(configMap, wb, sheet, myRows,"Data Space", piSpace, 0, 10, True, columnspace=1) - createRow(configMap, wb, sheet, myRows) - createRow(configMap, wb, sheet, myRows,"Samples", "", 0, 10, True, True) - - -def createRow(configMap, wb, sheet, myRows, key="", value="", rowNumber=0, fontSize=10, boldness=False, underline=False, columnspace=0): - if rowNumber == 0: - row = sheet.createRow(myRows.getNextRow()) - else: - row = rowNumber - row.createCell(0).setCellValue(key) - row.createCell(1+columnspace).setCellValue(value) - row.getCell(0).setCellStyle(setFont(wb, configMap, fontSize, boldness, underline)) - row.getCell(1+columnspace).setCellStyle(setFont(wb, configMap, fontSize, boldness, underline)) - return row - - -def writeXLSHeader (configMap, service, sheet): - header = sheet.getHeader() - header.setCenter(configMap["facilityName"] + "\n" + datetime.now().strftime("%d-%B-%Y")) - - -def writeXLSFooter(service, sheet): - footer = sheet.getFooter() - footer.setCenter( "Page " + HeaderFooter.page() + " of " + HeaderFooter.numPages() ) - #footer.setRight("generated on " + datetime.now().strftime("%H:%M - %d.%m.%Y")) - - -def write_flowcell_details(configMap, flowCellProperties, myRows, sequencerVocabulary, runModeVocabulary, flowcell, wb, sheet, createRow): - createRow(configMap, wb, sheet, myRows) - createRow(configMap, wb, sheet, myRows) - createRow(configMap, wb, sheet, myRows) - createRow(configMap, wb, sheet, myRows) - createRow(configMap, wb, sheet, myRows, "Flow Cell Details", "", 0, 14, columnspace=1) - createRow(configMap, wb, sheet, myRows, "Flow Cell", flowcell, columnspace=1) - for property in flowCellProperties: - if (property == "SEQUENCER"): - val = sequencerVocabulary[flowCellProperties[property]] - else: - val = flowCellProperties[property] - if (property == "RUN_MODE"): - val = runModeVocabulary[flowCellProperties[property]] - else: - val = flowCellProperties[property] - createRow(configMap, wb, sheet, myRows, property, val, columnspace=1) - - createRow(configMap, wb, sheet, myRows) - - - -def write_samples(configMap, myRows, wb, sheet, setFont, sample, sampleValues, working_column_headers_dict, lane, write_lane=False): - - singleSampleColumns = uniqueColumn() - rowN = sheet.createRow(myRows.getNextRow()) - - if write_lane: - rowN.createCell(singleSampleColumns.getNextColumn()).setCellValue(str(sampleValues['LANE'])) - rowN.getCell(singleSampleColumns.getCurrentColumn()).setCellStyle(setFont(wb, configMap, 10)) - rowN.createCell(singleSampleColumns.getNextColumn()).setCellValue(configMap['sampleCodePrefix'] + sample.split("_")[1]) - else: - rowN.createCell(singleSampleColumns.getNextColumn()).setCellValue(configMap['sampleCodePrefix'] + sample) - - rowN.getCell(singleSampleColumns.getCurrentColumn()).setCellStyle(setFont(wb, configMap, 10)) - for code, label in working_column_headers_dict.iteritems(): - if (code == 'BIOLOGICAL_SAMPLE_ARRIVED'): - try: - value = sampleValues[code].split(" ")[0] - except: - value = "" - else: - try: - value = sampleValues[code] - except: - value = "" - rowN.createCell(singleSampleColumns.getNextColumn()).setCellValue(value) - rowN.getCell(singleSampleColumns.getCurrentColumn()).setCellStyle(setFont(wb, configMap, 10)) - - return value - - -def filter_on_nonexisting_columns(regular_samples, check_empty_columns_dict): - for key, value_dict in sorted(regular_samples.iteritems()): - for code, count in check_empty_columns_dict.iteritems(): - if code in value_dict: - check_empty_columns_dict[code] = check_empty_columns_dict[code] + 1 - - return check_empty_columns_dict - - - -def write_intermediate_section(configMap, flowCellProperties, myRows, wb, sheet): - createRow(configMap, wb, sheet, myRows) - createRow(configMap, wb, sheet, myRows) - createRow(configMap, wb, sheet, myRows) - sequencer = identify_sequencer(flowCellProperties["SEQUENCER"]) - createRow(configMap, wb, sheet, myRows, key=sequencer + " sequencing", value="", rowNumber=0, fontSize=10, boldness=True, underline=True, columnspace=0) - createRow(configMap, wb, sheet, myRows, "Run Folder Name", flowCellProperties["RUN_NAME_FOLDER"], 0, 10, True) - createRow(configMap, wb, sheet, myRows) - createRow(configMap, wb, sheet, myRows) - - - -def write_sample_column_header(configMap, working_column_headers_dict, myRows, wb, sheet, write_lane=False): - myColumns = uniqueColumn() - sampleHeader = sheet.createRow(myRows.getNextRow()) - - if write_lane: - sampleHeader.createCell(myColumns.getNextColumn()).setCellValue("Flowcell:Lane") - sampleHeader.getCell(myColumns.getCurrentColumn()).setCellStyle(setFont(wb, configMap, 10, True)) - - sampleHeader.createCell(myColumns.getNextColumn()).setCellValue("Sample Code") - sampleHeader.getCell(myColumns.getCurrentColumn()).setCellStyle(setFont(wb, configMap, 10, True)) - for code, label in working_column_headers_dict.iteritems(): - sampleHeader.createCell(myColumns.getNextColumn()).setCellValue(label) - sampleHeader.getCell(myColumns.getCurrentColumn()).setCellStyle(setFont(wb, configMap, 10, True)) - - - -def writeExcel(myoptions, configMap, service, piName, laneDict, sampleDict, piDict, - piSpace, flowCellProperties, flowcellName, logger,format="xls"): - ''' - Writes out all data to an Excel file - ''' - accumulated_pi_dict = {} - pool_samples = {} - regular_samples = {} - check_empty_columns_dict = {"INDEX2": 0, "NOTES": 0, "BIOLOGICAL_SAMPLE_ARRIVED": 0} - working_column_headers_dict = column_headers_dict.copy() - - myRows = uniqueRow() - sequencerVocabulary = getVocabulary(service, "SEQUENCER") - runModeVocabulary = getVocabulary(service, "RUN_MODE_VOCABULARY") - setOfFlowcells = set () - try: - # expecting the old running folder name - runDate, seqId, runningNumber, flowcell = flowCellProperties["RUN_NAME_FOLDER"].split("_") - flowcell = flowcell[1:] - except: - flowcell = flowcellName - - wb = (eval(excelFormats[format])) - createHelper = wb.getCreationHelper() - sheet = wb.createSheet(configMap["facilityNameShort"]) - # 4/3 = 133 percent magnification when opening the workbook - sheet.setZoom(4, 3) - - writeHeader(sheet, myRows, wb, configMap, piName, piSpace) - - listofLanes = piDict[piName] - listofLanes.sort() - logger.debug(listofLanes) - - for lane in listofLanes: - for sample_code in sampleDict[lane]: - sampleValues = sampleDict[lane][sample_code] - - # if there is a shared lane do not mix them - if (sanitizeString(sampleValues['PRINCIPAL_INVESTIGATOR_NAME']) != sanitizeString(piName)): - continue - - # Find the Pools: - try: - if sampleValues['BARCODE'] != 'NOINDEX': - regular_samples[sample_code] = sampleValues - else: - pool_samples[lane + "_" + sample_code] = sampleValues - except: - if sampleValues.has_key('10X_INDEX_SET'): - regular_samples[sample_code] = sampleValues - elif int(sampleValues['NCBI_ORGANISM_TAXONOMY']) != 10847: - pool_samples[lane + "_" + sample_code] = sampleValues - else: - regular_samples[sample_code] = sampleValues - - logger.debug("Found {0} samples.".format(len(regular_samples))) - logger.debug("Found {0} pools.".format(len(pool_samples))) - - merged_regular_pool = merge_two_dicts(regular_samples, pool_samples) - check_empty_columns_dict = filter_on_nonexisting_columns(merged_regular_pool, check_empty_columns_dict) - - for key, values in check_empty_columns_dict.iteritems(): - if values == 0: - logger.debug("Popped! " + key) - working_column_headers_dict.pop(key) - - logger.debug("check_empty_columns_dict: {0}".format(check_empty_columns_dict)) - - write_sample_column_header(configMap, working_column_headers_dict, myRows, wb, sheet) - for reg_sample in sorted(regular_samples): - value = write_samples(configMap, myRows, wb, sheet, setFont, reg_sample, regular_samples[reg_sample], working_column_headers_dict, lane) - - write_intermediate_section(configMap, flowCellProperties, myRows, wb, sheet) - - write_sample_column_header(configMap, working_column_headers_dict, myRows, wb, sheet, write_lane=True) - for pool in sorted(pool_samples): - value = write_samples(configMap, myRows, wb, sheet, setFont, pool, pool_samples[pool], working_column_headers_dict, lane, write_lane=True) - - write_flowcell_details(configMap, flowCellProperties, myRows, sequencerVocabulary, runModeVocabulary, flowcell, wb, sheet, createRow) - - # adjust width - for i in range(0, 20): - sheet.autoSizeColumn(i) - - # set layout to landscape - #sheet.getPrintSetup().setLandscape(True) - - #left_margin_inches = sheet.getMargin(sheet.LeftMargin) - #right_margin_inches = sheet.getMargin(sheet.RightMargin) - - sheet.setMargin(sheet.LeftMargin, 0.5) - sheet.setMargin(sheet.RightMargin, 0.5) - - writeXLSFooter(service, sheet) - writeXLSHeader(configMap, service, sheet) - - # sanitizeString(piName) + datetime.now().strftime("_%d_%m_%Y.") + format - # Write the output to a file - fileName = myoptions.outdir + configMap["facilityNameShort"] + "_" + flowcell + "_" + \ - sanitizeString(piName) + "." + format - fileOut = FileOutputStream(fileName) - # need this print for use as an openBIS webapp - print fileName - - wb.write(fileOut); - fileOut.close(); - - -def sanitizeString(myString): - myString = myString.replace(u'ä', 'ae') - myString = myString.replace(u'ü', 'ue') - myString = myString.replace(u'ö', 'oe') - return re.sub('[^A-Za-z0-9]+', '_', myString.strip()).lower() - - -def setUpLogger(logPath, logLevel=logging.INFO): - logFileName = 'createInvoices' - d = datetime.now() - logFileName = logFileName + '_' + d.strftime('%Y-%m-%d_%H_%M_%S') + '.log' - logging.basicConfig(filename=logPath + logFileName, - format='%(asctime)s [%(levelname)s] %(message)s', level=logLevel) - logger = logging.getLogger(logFileName) - return logger - - -def parseConfigurationFile(propertyFile='etc/service.properties'): - ''' - Parses the given config files and returns the values - ''' - config = SafeConfigParser() - config.read(propertyFile) - config.sections() - return config - -def readConfig(logger): - GENERAL = 'GENERAL' - OPENBIS = 'OPENBIS' - EXCEL = 'EXCEL' - - logger.info('Reading config file') - configMap = {} - - configParameters = parseConfigurationFile() - configMap['facilityName'] = configParameters.get(GENERAL, 'facilityName') - configMap['facilityNameShort'] = configParameters.get(GENERAL, 'facilityNameShort') - configMap['facilityInstitution'] = configParameters.get(GENERAL, 'facilityInstitution') - configMap['mailList'] = configParameters.get(GENERAL, 'mailList') - configMap['mailFrom'] = configParameters.get(GENERAL, 'mailFrom') - configMap['smptHost'] = configParameters.get(GENERAL, 'smptHost') - configMap['separator'] = configParameters.get(GENERAL, 'separator') - configMap['indexSeparator'] = configParameters.get(GENERAL, 'indexSeparator') - - configMap['openbisUserName'] = configParameters.get(OPENBIS, 'openbisUserName') - configMap['openbisPassword'] = configParameters.get(OPENBIS, 'openbisPassword', raw=True) - configMap['openbisServer'] = configParameters.get(OPENBIS, 'openbisServer') - configMap['connectionTimeout'] = configParameters.getint(OPENBIS, 'connectionTimeout') - configMap['pIPropertyName'] = configParameters.get(OPENBIS, 'pIPropertyName') - configMap['sampleCodePrefix'] = configParameters.get(OPENBIS, 'sampleCodePrefix') - - configMap['defaultFonts'] = configParameters.get(EXCEL, 'defaultFonts') - - return configMap - -def login(logger, configMap): - logger.info('Logging into ' + configMap['openbisServer']) - service = OpenbisServiceFacadeFactory.tryCreate(configMap['openbisUserName'], - configMap['openbisPassword'], - configMap['openbisServer'], - configMap['connectionTimeout']) - return service - -def parseOptions(logger): - logger.info('Parsing command line parameters') - parser = OptionParser(version='%prog 1.0') - parser.add_option('-f', '--flowcell', - dest='flowcell', - help='The flowcell which is used to create the SampleSheet.csv', - metavar='<flowcell>') - parser.add_option('-o', '--outdir', - dest='outdir', - default='./', - help='Specify the ouput directory. Default: ./' , - metavar='<outdir>') - parser.add_option('-d', '--debug', - dest='debug', - default=False, - action='store_true', - help='Verbose debug logging. Default: False') - - (options, args) = parser.parse_args() - - if options.outdir[-1] <> '/': - options.outdir = options.outdir + '/' - - if options.flowcell is None: - parser.print_help() - exit(-1) - return options - - -def getFLowcellData(service, configMap, flowcell, logger): - - laneCodeList = [] - fetchOptions = EnumSet.of(SampleFetchOption.ANCESTORS, SampleFetchOption.PROPERTIES) - - sc = SearchCriteria(); - sc.addMatchClause(SearchCriteria.MatchClause.createAttributeMatch(SearchCriteria.MatchClauseAttribute.CODE, flowcell)); - fcList = service.searchForSamples(sc, fetchOptions) - if not fcList: - print("No flowcell found with code: " + flowcell) - sys.exit() - - scContained = SearchCriteria() - scContained.addMatchClause(SearchCriteria.MatchClause.createAttributeMatch(SearchCriteria.MatchClauseAttribute.CODE, flowcell)); - - scContainedMain = SearchCriteria(); - scContainedMain.addSubCriteria(SearchSubCriteria.createSampleContainerCriteria(scContained)) - - containedSamples = service.searchForSamples(scContainedMain) - - for lane in containedSamples: - laneCode = lane.getCode() - laneCodeList.append(laneCode) - logger.debug("Found lane " + laneCode + " in flow cell") - logger.info("All lanes found: " + str(laneCodeList)) - - for p in fcList: - flowCellProperties = p.getProperties() - - numberOfLanes = int(flowCellProperties['LANECOUNT']) - - foundLaneNumber = containedSamples.size() - if (foundLaneNumber > numberOfLanes): - numberOfLanes = foundLaneNumber - logger.info("Found " + str(foundLaneNumber) + " lanes! This differs from the lane number " + - "registered in the flow cell. --> Lanes got splitted!") - - laneDict = {} - sampleDict = {} - piDict = {} - spaceDict = {} - invoiceDict = {} - - for lane in laneCodeList: - myLane = lane - laneSc = SearchCriteria(); - laneSc.addMatchClause(SearchCriteria.MatchClause.createAttributeMatch(SearchCriteria.MatchClauseAttribute.CODE, myLane)); - laneList = service.searchForSamples(laneSc, fetchOptions) - logger.debug("Length of laneList for " + myLane + " is " + str(len(laneList))) - - for l in laneList: - laneProperties = l.getProperties() - laneDict[lane] = laneProperties - laneParents = l.getParents() - - s = {} - for samples in laneParents: - sampleCode = samples.getCode() - sampleProperties = samples.getProperties() - - sample_properties_dict={} - for key, value in sampleProperties.iteritems(): - sample_properties_dict[key] = value - - - sample_properties_dict["LANE"] = lane - s[sampleCode.split("-")[-1]] = sample_properties_dict - sampleDict[lane] = s - pi = sanitizeString(sample_properties_dict[configMap["pIPropertyName"]]) - try: - invoiceProperty = sample_properties_dict['INVOICE'] - except: - # Can happen when sample was registered via Excel, the boolean value is not set in the DB - logger.info("Sample {0} has no property 'Invoice'. Setting it to false".format(sampleCode)) - invoiceProperty = 'false' - # if sample got created via Excel upload, the property could be not set, which is represented by None - if (invoiceProperty is None): - invoiceProperty = 'false' - sentInvoice = {'true': True, 'false': False}.get(invoiceProperty.lower()) - logger.debug("PI for " + sampleCode + ": " + pi) - logger.debug("Invoice sent for " + sampleCode + ": " + str(sentInvoice)) - - if piDict.has_key(pi): - piDict[pi].append(lane) - # Making the lanes unique - piDict[pi] = list(set(piDict[pi])) - else: - piDict[pi] = [lane] - spaceDict[pi] = l.getSpaceCode() - - if not sentInvoice: - if invoiceDict.has_key(pi): - invoiceDict[pi].append(lane) - # Making the lanes unique - invoiceDict[pi] = list(set(invoiceDict[pi])) - else: - invoiceDict[pi] = [lane] - - - logger.debug(spaceDict) - - logger.info("Found the following PIs on the lanes: ") - logger.info(piDict) - logger.info("Found the following PIs with non-invoiced samples : ") - logger.info(invoiceDict) - - # simply sort the hashmap - treeMap = TreeMap (flowCellProperties) - return laneDict, sampleDict, piDict, treeMap, spaceDict, invoiceDict - - -''' -Main script -''' - -def main(): - - # for now setting the format by hand - format = "xlsx" - magicString = "@Invoice@" - - logger = setUpLogger('log/') - logger.info('Started Creation Invoices...') - - myoptions = parseOptions(logger) - configMap = readConfig(logger) - if myoptions.debug: - logger.setLevel(logging.DEBUG) - - service = login(logger, configMap) - flowcellName = myoptions.flowcell - laneDict, sampleDict, piDict, flowCellProperties, spaceDict, invoiceDict = getFLowcellData(service, configMap, flowcellName, logger) - - for piName in piDict: - # create an Excel file for each PI - writeExcel(myoptions, configMap, service, piName, laneDict, sampleDict, - piDict, spaceDict[piName], flowCellProperties, - flowcellName, logger, format) - - for invoicePi in invoiceDict: - print (magicString + invoicePi) - - service.logout() - -if __name__ == "__main__": - main() diff --git a/deep_sequencing_unit/source/Jython/duplicateBarcodeChecker.py b/deep_sequencing_unit/source/Jython/duplicateBarcodeChecker.py deleted file mode 100644 index e39e569845fa5b792327b43b24d9c3795f58cd64..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/source/Jython/duplicateBarcodeChecker.py +++ /dev/null @@ -1,104 +0,0 @@ -import smtplib -import string -import copy - -def sendMail(registratorEmail, indexStrings='', sampleIdentifier='', additionalText=''): - ''' - Send out an email to the specified recipients - ''' - COMMASPACE = ", " - - loe = ["manuel.kohler@bsse.ethz.ch"] - if registratorEmail and registratorEmail not in loe: - loe.append(registratorEmail) - - TO = COMMASPACE.join(loe) - SUBJECT = "WARNING! For pooled sample " + sampleIdentifier - FROM = "qgf@openbis-dsu.ethz.ch" - HOST = "smtp0.ethz.ch" - text = "Sample: "+ sampleIdentifier + "\nBarcode: " + indexStrings + "\n" + additionalText - BODY = string.join(( - "From: %s" % FROM, - "To: %s" % TO, - "Subject: %s" % SUBJECT , - "", - text - ), "\r\n") - server = smtplib.SMTP(HOST) - server.sendmail(FROM, [TO], BODY) - server.quit() - -def checkDuplicateBarcodes(): - ''' - 'parents' are a HashSet of SamplePropertyPE - ''' - VOCABULARY_INDEX1 = 'BARCODE' - VOCABULARY_INDEX2 = 'INDEX2' - - SUCCESS_MESSAGE="OK" - registratorEmail = entity.entityPE().registrator.email - poolName = entity.entityPE().sampleIdentifier - - listofIndices = [] - listofIndices2 = [] - returnString = " " - - for e in entity.entityPE().parents: - for s in e.properties: - - if s.entityTypePropertyType.propertyType.simpleCode == VOCABULARY_INDEX1: - index = s.getVocabularyTerm().code - listofIndices.append(index) - - if s.entityTypePropertyType.propertyType.simpleCode == VOCABULARY_INDEX2: - index = s.getVocabularyTerm().code - listofIndices2.append(index) - - sampleIdentifier = e.sampleIdentifier - - # if dual-indexed - if listofIndices2: - dualIndexList = [] - if len(listofIndices) != len(listofIndices2): - indices = "\nIndex1 :" + str(listofIndices) + "\nIndex2: " + str(listofIndices2) - returnString = "Dual indexing assignment is not complete for pool sample " + str(poolName) - sendMail(registratorEmail, indices , str(poolName), returnString) - return returnString - - # build up a list of dual indices - for l in range(len(listofIndices)): - try: - dualIndexList.insert(l, [listofIndices[l], listofIndices2[l]]) - except: - pass - - # copy, needed by the for loop - dualIndexListOrig = copy.deepcopy(dualIndexList) - - for dualIndex in dualIndexListOrig: - dualIndexList.remove(dualIndex) - if dualIndex in dualIndexList: - returnString = "WARNING! You assigned duplicate indices \n " + str(dualIndex) + \ - " in the dual-indexed pooled sample!" - sendMail(registratorEmail, str(dualIndex), str(poolName), returnString) - return returnString - else: - returnString = SUCCESS_MESSAGE - return returnString - - # else single index - else: - uniqueList=list(set(listofIndices)) - if len(listofIndices) != len(uniqueList): - for index in uniqueList: - listofIndices.remove(index) - returnString = "WARNING! You assigned duplicate indices \n " + str(listofIndices) + \ - " in the single-indexed pooled sample!" - sendMail(registratorEmail, str(listofIndices), str(poolName), returnString) - else: - returnString = SUCCESS_MESSAGE - return returnString - -def calculate(): - """Main script function. The result will be used as the value of appropriate dynamic property.""" - return checkDuplicateBarcodes() diff --git a/deep_sequencing_unit/source/Python/bam2wig.py b/deep_sequencing_unit/source/Python/bam2wig.py deleted file mode 100644 index be4d750b593e40c12267f342074e31908b3925bf..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/source/Python/bam2wig.py +++ /dev/null @@ -1,51 +0,0 @@ -#!/usr/bin/env python -''' -Creates a Wiggle file out of a BAM file - -Prerequisites: -- BAM index file, create with 'samtools index <bamfile.bam>' -- BAM file must be sorted, sort with 'samtools sort <bamfile.bam> bamfile.sorted' - -Documentation says: 'If an index for a BAM file exists (.bai), it will be opened automatically. -Without an index random access to reads via fetch() and pileup() is disabled.' - -@author: Manuel Kohler -@copyright: ETH Zurich -@precondition: Working pysam egg -''' - -import sys, pysam - -#def bam2wig(): -# '''Usage: python bam2wig <bamfile>''' -# -# if sys.argv[1] == '': -# print(my_function.__doc__) -# sys.exit(1) -# else: -bamfile_name = sys.argv[1] -# -try: - with pysam.Samfile(bamfile_name, 'rb') as bamfile: - wigfile_name = bamfile_name.replace('.bam', '.wig') - wigfile = open(wigfile_name, 'w') - - header_full = 'track type=wiggle_0 name=' + wigfile_name - variable_wig = 'variableStep chrom=' - - print >> wigfile, header_full - print ('Number of genes: ') + str(bamfile.nreferences) - for gene_names in range(bamfile.nreferences): - try: - print (bamfile.getrname(gene_names)) - '''UCSC conformity''' - if bamfile.getrname(gene_names) == 'dmel_mitochondrion_genome': - print >> wigfile, variable_wig + "M" - else: - print >> wigfile, variable_wig + bamfile.getrname(gene_names) - for pile in bamfile.pileup(bamfile.getrname(gene_names)): - print >> wigfile, pile.pos + 1, pile.n - except ValueError as valerr: - print ('Value error ' + str(valerr)) -except IOError as err: - print (bam_file + 'not found! ' + str(err)) diff --git a/deep_sequencing_unit/source/Python/calculateCRC32.py b/deep_sequencing_unit/source/Python/calculateCRC32.py deleted file mode 100644 index a60eefe6b6e0a792f128be86f9b23829dfe14a44..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/source/Python/calculateCRC32.py +++ /dev/null @@ -1,56 +0,0 @@ -#! /usr/bin/env python -''' -@copyright: -Copyright 2012 ETH Zuerich, CISD - - @license: - Licensed under the Apache License, Version 2.0 (the 'License'); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an 'AS IS' BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - - @author: - Manuel Kohler - - @description: - Calulates the crc32 checksum of a file and returns it in a hexadecimal number -''' - -import zlib -from optparse import OptionParser - - -def parseOptions(): - parser = OptionParser(version='%prog 1.0') - parser.add_option('-f', '--file', dest='file', - help='File for calculation of crc32 checksum', - metavar='<file>') - - (options, args) = parser.parse_args() - if options.file is None: - parser.print_help() - exit(-1) - return options - - -def crc(fileName): - prev = 0 - for eachLine in open(fileName,"rb"): - prev = zlib.crc32(eachLine, prev) - return "%X"%(prev & 0xFFFFFFFF) - -def main(): - - myoptions = parseOptions() - value = crc(myoptions.file) - print(value) - -if __name__ == "__main__": - main() diff --git a/deep_sequencing_unit/source/Python/concatenatePdfs.py b/deep_sequencing_unit/source/Python/concatenatePdfs.py deleted file mode 100644 index 715ca5e670e744d9e1a9c84d7efeb7d444351712..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/source/Python/concatenatePdfs.py +++ /dev/null @@ -1,70 +0,0 @@ -#!/usr/bin/python -''' -Concatenates several pdfs in a given directory depending -on the lane number in the file name. -This number is defined as the last number in the file name -separated by '_' -The concatenated file will be named: -flow_cell + '_' + lane + '_quality.pdf' - -@author: Manuel Kohler -@copyright: ETH Zurich -@precondition: Working pdftk installation -''' - -import os -import fnmatch -import subprocess -from optparse import OptionParser - -PDFTK = '/usr/local/dsu/pdftk-1.41/pdftk/pdftk' -LANES = 8 - -class pdfList(list): - def __init__ (self, lane, pdfs=[]): - list.__init__([]) - self.lane = lane - self.extend(pdfs) - -def options(): - parser = OptionParser() - parser.add_option("-p", "--path", dest="path", action="store", type="string", - help="Path of the fastq files", metavar="PATH") - (options, args) = parser.parse_args() - return (options.path) - -def concatenatePdfs(file_list, lane): - # take the first list element as a reference for the final pdf name - flow_cell = '_'.join(file_list[0].split('_', 4)[0:4]) - print(flow_cell) - new_name = flow_cell + '_' + lane + '_quality.pdf' - args = [PDFTK, 'cat', 'output', new_name] - [args.insert(1, i) for i in file_list] - a = subprocess.Popen(args) - a.wait() - [os.remove(file) for file in file_list] - -def createPdfList (lane): - path = options() - # create pdf list depending on lane - ll = 'lane' + lane - vars()[ll] = pdfList(lane) - - for file in os.listdir(path): - if fnmatch.fnmatch(file, '*.pdf'): - for l in (file.split('_')[4]): - if (l == lane): - (vars()[ll]).append(file) - vars()[ll].sort() - return (vars()[ll]) - -def __main__(): - list_of_pdfs = [] - for i in range(1, LANES + 1): - l = createPdfList(str(i)) - list_of_pdfs.append(l) - - [concatenatePdfs(list_of_pdfs[i], list_of_pdfs[i].lane) for i in range(len(list_of_pdfs))] - print("DONE...") - -__main__() diff --git a/deep_sequencing_unit/source/Python/fastq_quality.py b/deep_sequencing_unit/source/Python/fastq_quality.py deleted file mode 100755 index 80064b84e5d2f1d895ca7f045a12a85203e84eb4..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/source/Python/fastq_quality.py +++ /dev/null @@ -1,42 +0,0 @@ -#!/links/application/dsu/Python-3.2/python - -''' -Docu -''' - -import subprocess -import shlex -import os -import fnmatch -import concurrent.futures - -rscriptPath = '/links/application/dsu/R-scripts' -pwd = os.getcwd() -pattern = '*.fastq.gz' -rscript = '/links/application/dsu/R-2.13.2/bin/Rscript' -concatenationScript='/links/application/dsu/bin/concatenate_pdfs.py' -maxConcurrentJobs=5 - -def run_me(fastqFile): - (path, file) = os.path.split(fastqFile) - os.chdir(path) - args = rscript + ' --vanilla ' + rscriptPath + '/' + 'fastq_quality.R ' + file - #print(args) - SplitArgs = shlex.split(args) - p = subprocess.Popen(SplitArgs) - p.wait() - #subprocess.Popen(concatenationScript) - -def findFiles (pattern): - matches = [] - for root, dirnames, filenames in os.walk(pwd): - for filename in fnmatch.filter(filenames, pattern): - matches.append(os.path.join(root, filename)) - return matches - -def callR(): - matchingFiles = findFiles(pattern) - with concurrent.futures.ThreadPoolExecutor(max_workers=maxConcurrentJobs) as executor: - out = [executor.submit(run_me, lane) - for lane in matchingFiles] -callR() diff --git a/deep_sequencing_unit/source/Python/fastqc_plots.py b/deep_sequencing_unit/source/Python/fastqc_plots.py deleted file mode 100755 index 693e00b2b6438d39089030b869c6ce1d09abe708..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/source/Python/fastqc_plots.py +++ /dev/null @@ -1,67 +0,0 @@ -#!/links/application/dsu/Python-3.2/python - -import subprocess -import collections -import os -import fnmatch -import concurrent.futures -import logging -from datetime import * - -fastqcBinary ='/links/application/dsu/FastQC/fastqc' -outDir = '../fastqc' -threads = '10' -cmdLine = [fastqcBinary, '--outdir', outDir, '--quiet', '--casava', '--nogroup', '--threads', threads] - -pwd = os.getcwd() -pattern = '*.fastq.gz' -maxConcurrentJobs=5 - -def setUpLogger(logPath): - d=datetime.now() - logFileName = '/fastqc_' + d.strftime("%Y-%m-%d_%H_%M_%S") + '.log' - logging.basicConfig(filename=logPath + logFileName, format='%(asctime)s %(message)s', level=logging.DEBUG) - -def run_me(path,files): - ''' - Builds up the final command and runs it using the subprocess module - ''' - os.chdir(path) - - filesToProcess = [] - for file in files: - filesToProcess.append(os.path.join(path, file)) - - logging.info('Processing '+ str(filesToProcess)) - - p = subprocess.Popen(cmdLine + filesToProcess) - p.wait() - -def findPaths (pattern): - ''' - Finds all files matching the given pattern and writes the result in a - dictionary with the path as the key and the list of files as the value - ''' - fileDict = {} - for root, dirnames, filenames in os.walk(pwd): - for filename in fnmatch.filter(filenames, pattern): - if (root in fileDict): - fileDict[root].append(filename) - else: - fileDict[root] = [filename] - return fileDict - -def callCommandLine(): - ''' - Calls a command line program with maxConcurrentJobs in parallel - ''' - matchingPaths = findPaths(pattern) - for path in matchingPaths.items(): - if (not os.path.isdir(outDir)): - os.makedirs(outDir) - - with concurrent.futures.ThreadPoolExecutor(max_workers=maxConcurrentJobs) as executor: - out = [executor.submit(run_me, path, files) - for path,files in matchingPaths.items()] - -callCommandLine() diff --git a/deep_sequencing_unit/source/Python/filterOnQualityForFastqGzip.py b/deep_sequencing_unit/source/Python/filterOnQualityForFastqGzip.py deleted file mode 100644 index 9c434a9bdcb51f8d45eb0ab529377479e3f09bce..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/source/Python/filterOnQualityForFastqGzip.py +++ /dev/null @@ -1,58 +0,0 @@ -#!/usr/local/dsu/Python-3.2/python -''' -Usage: python filter_on_quality_for_gzip.py <fastqfile>o -Reqires bcltofastq converted gzipped fastq file which are generated -by the Illumina pipeline Casava 1.8+ - -@author: Manuel Kohler -@copyright: ETH Zurich -@precondition: gzip -''' - -import gzip -import sys -import argparse - - -def parseCommandLine(): - parser = argparse.ArgumentParser(description='Counts the filtered and ' + - 'non-filtered read of a gzipped fastq file') - parser.add_argument('-i', '--input_file', dest='fastq_file', action='store', - required=True, help='Which fastq.gz file you want to process?') - parser.add_argument('-o', '--output', dest='output', action='store', default='fastq_stats', - type=str, help='Output file name') - parser.add_argument('-f', '--format', dest='format', action='store', default='txt', - type=str, choices=['txt', 'json', 'both'], help='Output format') - - args = parser.parse_args() - return(args) - -line_number = 1 -new_line = 1 -is_filtered = 0 - -def formatNumber(n): - return ('{:>20}'.format('{:,}'.format(n))) - -def calulatePercentage(v1, v2): - return round(100 * (v1 / (v1 + v2)), 2) - -args = parseCommandLine() - -with gzip.open(args.fastq_file, 'rb') as file: - for line in file: - if (line_number == new_line): - # fastq quadruples - new_line = line_number + 4 - l = line.decode('utf8') - #print(l.split(':')[7]) - if (l.split(':')[7] == 'Y'): - is_filtered += 1 - line_number += 1 - -unfiltered = ((line_number - 1) / 4) - is_filtered -print('File: ' + args.fastq_file) -print(str(formatNumber(int(unfiltered))) + ' number of non-filtered reads (GOOD)') -print(str(formatNumber(is_filtered)) + ' number of filtered reads (BAD)') -print(str(formatNumber(calulatePercentage(unfiltered, is_filtered))) + ' % of non-filtered reads (GOOD)') -print(str(formatNumber(calulatePercentage(is_filtered, unfiltered))) + ' % of filtered reads (BAD)') diff --git a/deep_sequencing_unit/source/Python/filter_on_quality_for_gzip.py b/deep_sequencing_unit/source/Python/filter_on_quality_for_gzip.py deleted file mode 100644 index 9194ecc999f0334f1b4397838f0f95c295587f2c..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/source/Python/filter_on_quality_for_gzip.py +++ /dev/null @@ -1,58 +0,0 @@ -#!/usr/local/dsu/Python-3.2/python -''' -Usage: python filter_on_quality_for_gzip.py <fastqfilei.gz> -Reqires bcltofastq converted gzipped fastq file which are generated -by the Illumina pipeline Casava 1.8+ - -@author: Manuel Kohler -@copyright: ETH Zurich -@precondition: gzip -''' - -import gzip -import sys -import argparse - - -def parseCommandLine(): - parser = argparse.ArgumentParser(description='Counts the filtered and ' + - 'non-filtered read of a gzipped fastq file') - parser.add_argument('-i', '--input_file', dest='fastq_file', action='store', - required=True, help='Which fastq.gz file you want to process?') - parser.add_argument('-o', '--output', dest='output', action='store', default='fastq_stats', - type=str, help='Output file name') - parser.add_argument('-f', '--format', dest='format', action='store', default='txt', - type=str, choices=['txt', 'json', 'both'], help='Output format') - - args = parser.parse_args() - return(args) - -line_number = 1 -new_line = 1 -is_filtered = 0 - -def formatNumber(n): - return ('{:>20}'.format('{:,}'.format(n))) - -def calulatePercentage(v1, v2): - return round(100 * (v1 / (v1 + v2)), 2) - -args = parseCommandLine() - -with gzip.open(args.fastq_file, 'rb') as file: - for line in file: - if (line_number == new_line): - # fastq quadruples - new_line = line_number + 4 - l = line.decode('utf8') - #print(l.split(':')[7]) - if (l.split(':')[7] == 'Y'): - is_filtered += 1 - line_number += 1 - -unfiltered = ((line_number - 1) / 4) - is_filtered -print('File: ' + args.fastq_file) -print(str(formatNumber(int(unfiltered))) + ' number of non-filtered reads (GOOD)') -print(str(formatNumber(is_filtered)) + ' number of filtered reads (BAD)') -print(str(formatNumber(calulatePercentage(unfiltered, is_filtered))) + ' % of non-filtered reads (GOOD)') -print(str(formatNumber(calulatePercentage(is_filtered, unfiltered))) + ' % of filtered reads (BAD)') diff --git a/deep_sequencing_unit/source/Python/rename_file.py b/deep_sequencing_unit/source/Python/rename_file.py deleted file mode 100644 index f47eefb4120ba3819ec133a3cf33972e7c16200c..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/source/Python/rename_file.py +++ /dev/null @@ -1,41 +0,0 @@ -#!/usr/local/dsu/Python-3.2/python - -''' -Just a litlle helper function which can rename files given a regex and replace -this with another string - -''' - -import os -import re -import argparse - -def parseCommandLine(): - parser = argparse.ArgumentParser(description='Renames files and removes a given ' + - 'regex from the file name') - parser.add_argument('-d', '--directory', dest='dir', action='store', - required=True, help='Directory conatining the files') - parser.add_argument('-r', '--regex', dest='regular_expression', action='store', - required=True, type=str, help='Regex which should be removed from file name') - parser.add_argument('-w', '--with', dest='replacement', action='store', - required=True, type=str, help='replacement string') - - args = parser.parse_args() - return(args) - - -def ren(old, replace, replacement): - new = re.sub(replace, replacement, old) - if (new != old): - print ("rename: " + old + " to " + new) - os.rename(old, new) - else: - print(old + " left unchanged!") - -args = parseCommandLine() - -os.chdir(args.dir) -list_of_files = os.listdir(args.dir) -list_of_files.sort() -[ren(file, args.regular_expression, args.replacement) for file in list_of_files ] -print('*** ' + str(len(list_of_files)) + " files processed ***") diff --git a/deep_sequencing_unit/source/Python/solexaQa.py b/deep_sequencing_unit/source/Python/solexaQa.py deleted file mode 100644 index e95dd73616e5b3718e52c53cabd915541a878ca6..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/source/Python/solexaQa.py +++ /dev/null @@ -1,54 +0,0 @@ -#!/usr/bin/env python -''' -Python Wrapper for a perl based program. -Generates tile based quality graphics - -Output: pdf -@author: Manuel Kohler -@copyright: ETH Zurich -@precondition: Working pdftk and SolexaQA.pl binaries - -''' - -import subprocess -import shlex -import os -import sys -from optparse import OptionParser - -SCRIPT = "/usr/local/dsu/bin/SolexaQA/SolexaQA.pl" -PDFTK = '/usr/local/dsu/pdftk-1.41/pdftk/pdftk' - -parser = OptionParser() -parser.add_option("-p", "--path", dest="path", action="store", type="string", - help="Path of the fastq files", metavar="PATH") -parser.add_option("-v", dest="verbose", action="store_true", - help="tell me all") -(options, args) = parser.parse_args() -path = options.path -os.chdir(path) - -listdir = os.listdir(path) -for file in listdir: - if file.endswith('fastq'): - args = SCRIPT + " -sanger " + path + "/" + file - Newargs = shlex.split(args) - p = subprocess.Popen(Newargs) - p.wait() - #convert -page A4 ETHZ_BSSE_110204_62Y8YAAXX_7.fastq.png ETHZ_BSSE_110204_62Y8YAAXX_7.fastq_TileStatistics_A4.pdf - convert = ['convert', '-page', 'A4', file + '.png', file + '.png.pdf'] - c = subprocess.Popen(convert) - c.wait() - #rm *.matrix *.segments *.quality *.png - os.remove(file + '.matrix') - os.remove(file + '.segments') - os.remove(file + '.quality') - os.remove(file + '.png') - - files = file + '.segments.hist.pdf', file + '.quality.pdf', file + '.png.pdf' - assemble = [ PDFTK, 'cat', 'output', file.replace('.', '_', 1) + '_SolexaQA.pdf'] - [assemble.insert(1, i) for i in files] - a = subprocess.Popen(assemble) - a.wait() - [os.remove(f) for f in files] -print("Finished...") diff --git a/deep_sequencing_unit/source/R/CreatePerCycleReadQuality.R b/deep_sequencing_unit/source/R/CreatePerCycleReadQuality.R deleted file mode 100644 index 81c41ec7e0eec77fe5bc9982e91549e0ab16f52d..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/source/R/CreatePerCycleReadQuality.R +++ /dev/null @@ -1,12 +0,0 @@ -library(multicore) -library(ShortRead) -args <- commandArgs(TRUE) -reads <- readFastq(args[1]) -if (length(reads) > 1000000) { - reads <- sample(reads,1000000) # if more than a million reads, sample randomly -} -qual <- FastqQuality(quality(quality(reads))) # get quality scores -readM <- as(qual, "matrix") # convert scores to matrix -pdf(file=paste(args[1],"boxplot.pdf", sep="_")) # Save box plot as boxplot.pdf in current folder -boxplot(readM, outline = FALSE, main="Per Cycle Read Quality", sub=args[1], xlab="Cycle", ylab="Phred Quality", col="grey") -dev.off() \ No newline at end of file diff --git a/deep_sequencing_unit/source/R/barcodeDistribution.R b/deep_sequencing_unit/source/R/barcodeDistribution.R deleted file mode 100644 index 33b7a9c2670265cb0777641e3a472fbba6723665..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/source/R/barcodeDistribution.R +++ /dev/null @@ -1,113 +0,0 @@ -library("ShortRead") - -# Collect arguments -args <- commandArgs(TRUE) -print(args) -path <- (args[1]) -flowcell <- (args[2]) -pattern <- (args[3]) -#flowcell <- "C3CFPACXX" -#path <- "/Users/kohleman/PycharmProjects/qgf/barcodeDistribution/testData" -#pattern <- 'lane4' -filenames <- list.files(path, pattern=pattern, full.names=TRUE) -totalIndexList <- "" - -plotTopIndices <- function (topIndices, xName="", path) { - - # Creates a barplot out of a data frame. - # - # Args: - # topIndices: data.frame which must have the columns - # 'totalIndexList' and 'Freq' - # xName: Name for the x-axes (xlab) - # - # Returns: - # an image/ a pdf - - fileName <- (paste(xName,".pdf", sep="")) - fileFullPath <- (file.path(path, fileName)) - - pdf(file=fileFullPath) - par(mfcol=c(1, 1)) - countLength<- nchar(toString(max(topIndices$Freq))) - - par(las=2) - par(mar=c(5,8,4,2)) # increase y-axis margin. - - b <- barplot(topIndices$Freq, main="Top 15 indices distribution", xlab=paste("Count of Indices for", xName), horiz=TRUE, - names=topIndices$totalIndexList, cex.names=.75, las=1) - text(cex=.75, x=topIndices$Freq/2, y=b, labels=topIndices$Freq, xpd=TRUE) - dev.off() -} - -# ----------------------------------------------------------------------------- - -multmerge <- function(datalist, mergeBy){ - # Merges a list if data frames by the 'mergeBy' parameter - Reduce(function(...) {merge(..., by = mergeBy, all=TRUE)}, datalist) -} - -# returns string w/o leading or trailing whitespace -trim <- function (x) gsub("^\\s+|\\s+$", "", x) - -# ----------------------------------------------------------------------------- - -streamFASTQ <- function (file, verbose = TRUE) { - - fileBaseName <- basename(file) - strm <- FastqStreamer(file, readerBlockSize=1e7) - if (verbose) { - print (paste("Opening " ,fileBaseName)) - } - s <- unlist(strsplit(fileBaseName, "_")) - - repeat { - fq <- yield(strm) - if (length(fq) == 0) - break - - #print (fq) - #print(sread(fq)) - #print(quality(fq)) - - header <- id(fq) - a <- (as.character(header)) - split <- (strsplit(a, ":")) - indexList <- lapply(split, function(x) strsplit(x, ":")[10]) - indices <- unlist(indexList) - - totalIndexList <- c(totalIndexList, indices) - } - - close(strm) - - counts <- as.data.frame(table(totalIndexList)) - sortedCounts <- counts[order(- counts$Freq), ] - - return (sortedCounts) -} - -ldf <- lapply(filenames, streamFASTQ) - -# if there are more than one FASTQ file we do some more stuff -if (length(ldf) > 1) { - list1 <- multmerge(ldf, "totalIndexList") - # Replacing all NAs with 0 - list1 [is.na(list1)] <- 0 - # sum up the values row-wise for each column, but leave out the first column - list1$Freq<- apply(list1[,c(-1)],1,sum) -} else { - print ("Only one FASTQ found") - list1 <- ldf[[1]] -} - -subList <- list1[c("totalIndexList","Freq")] -orderedDf <- subList[with(subList, order(- Freq)), ] -topIndices <- orderedDf[1:15, ] -#print (topIndices) - -fileBaseName <- paste(flowcell, unlist(strsplit(basename(filenames[1]), "_"))[1], sep="_") -#fileBaseName <- trim(fileBaseName) -plotTopIndices (topIndices, fileBaseName, path) - -#write.table(list1, file = "list1.csv", sep = ",", col.names = NA, qmethod = "double") diff --git a/deep_sequencing_unit/source/R/createQaReport.R b/deep_sequencing_unit/source/R/createQaReport.R deleted file mode 100644 index 3463d50a994ffec72eb714ea867e4ae955e93650..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/source/R/createQaReport.R +++ /dev/null @@ -1,7 +0,0 @@ -require(multicore) -require (ShortRead) -args <- commandArgs(TRUE) -fastq_file <- args[1] -qa <- qa(getwd(),args[1], type="fastq") -report_dest <- paste(fastq_file, "ShortRead_qa", sep="_") -qa_report <- report (qa, dest=report_dest , type="html") \ No newline at end of file diff --git a/deep_sequencing_unit/source/R/fastq_quality.R b/deep_sequencing_unit/source/R/fastq_quality.R deleted file mode 100644 index 58beca8601860a8b2d7a6a8a69e9e50ac50fffcf..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/source/R/fastq_quality.R +++ /dev/null @@ -1,101 +0,0 @@ -# Needs ShortRead_1.11.42 or higher -# -# @author Manuel Kohler -# ETHZ Zurich, 2011 - -require(ShortRead) -require(RColorBrewer) -#require(RSvgDevice) - -args <- commandArgs(TRUE) - -loadFile <- function(args) { - file <- args[1] -} - -splitPathAndFileName <- function(fullPath) { - # Splits a full path into path and file name and returns it as a list - - fastqFileOnly <- basename(fullPath) - pathOnly <- dirname(fullPath) - return (c(pathOnly, fastqFileOnly)) -} - - -subSampledReads <- function(fastqFile, samples=1e7, blocksize=2e9) { - # needed ShortRead_1.11.42 - fastqFile - fqSub <- FastqSampler(fastqFile, n=samples, readerBlockSize=blocksize, verbose=FALSE) - subReads <- yield(fqSub) - return (subReads) -} - -boxPlotPerCycle <- function() { - # Boxplot for per cycle Phred quality - qual <- FastqQuality(quality(quality(subReads))) # get quality scores - readM <- as(qual, "matrix") # convert scores to matrix - boxplot(readM, outline = FALSE, main="Per Cycle Read Quality", sub=fastq_only, - xlab="Cycle", ylab="Phred Quality", col=brewer.pal(11, "Spectral")[1]) - return (boxplot) -} - -nucleotidesPerCyclePlot <- function() { - # Nucleotide distribution per cycle - a <-alphabetByCycle(sread(subReads)) - cycles <- dim(a)[2] - total_number_bases_first_cycle <- a[,1][[1]]+ a[,1][[2]]+a[,1][[3]]+ a[,1][[4]] - + a[,1][[5]] - n <- c(names(a[1,1]),names(a[2,1]), names(a[3,1]), names(a[4,1]), - names(a[15,1])) - par(xpd=T, mar=par()$mar+c(0,0,0,4)) - barplot(a, main="Numbers of nucleotides per cycle", sub=fastq_only, - ylab="Absolute number", col=heat.colors(5), names.arg=c(1:cycles)) - legend(cycles+10, total_number_bases_first_cycle, n, fill=heat.colors(5)) - return (barplot) -} - -cumOccurencesPlot <- function() { - # Taken from - # http://www.bioconductor.org/help/workflows/high-throughput-sequencing/ - # Calculate and plot cumulative reads vs. occurrences - - #seq <- readFastq(subReads) - tbl <- tables(subReads)[[2]] - xy <- xyplot(cumsum(nReads * nOccurrences) ~ nOccurrences, tbl, - scales=list(x=list(log=TRUE)), main=fastq_only, type="b", pch=20, - xlab="Number of Occurrences", - ylab="Cumulative Number of Reads") - return(xy) -} - - -plotPdf <- function (plotObject) { - pdf(file=paste(fastq_file, "quality.pdf", sep="_")) - plotObject - dev.off() -} - -plotSvg <- function (plotObject) { - devSVG(file = paste(fastq_file,"quality.svg", sep="_"), width = 10, - height = 8, bg = "white", fg = "black", onefile=TRUE, xmlHeader=TRUE) - plotObject - dev.off() -} - -# MAIN ######################################################################## - -fastq_file <- loadFile(args) -subReads <- subSampledReads(fastq_file) - -fastqFilePathVector <- splitPathAndFileName(fastq_file) -fastq_only <- fastqFilePathVector[2] - -pdf(file=paste(fastq_file,"quality.pdf", sep="_"), paper="a4") - box <- boxPlotPerCycle() - nuc <- nucleotidesPerCyclePlot() - -dev.off() - -#plotPdf(box) -#plotPdf(nuc) -#plotPdf(cumOccurencesPlot()) diff --git a/deep_sequencing_unit/source/R/nucleotidesPerCycle.R b/deep_sequencing_unit/source/R/nucleotidesPerCycle.R deleted file mode 100644 index f30016232c793479bbdf628e86e94f1f85000031..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/source/R/nucleotidesPerCycle.R +++ /dev/null @@ -1,14 +0,0 @@ -library(multicore) -library(ShortRead) -args <- commandArgs(TRUE) -reads <- readFastq(args[1]) - -a <-alphabetByCycle(sread(reads)) -cycles <- dim(a)[2] -total_number_bases_first_cycle <- a[,1][[1]]+ a[,1][[2]]+a[,1][[3]]+ a[,1][[4]]+ a[,1][[5]] -n <- c(names(a[1,1]),names(a[2,1]), names(a[3,1]), names(a[4,1]), names(a[15,1])) -pdf(file=paste(args[1],"nuc_per_cycle.pdf", sep="_")) # Save box plot as boxplot.pdf in current folder -par(xpd=T, mar=par()$mar+c(0,0,0,4)) -barplot(a, main="Numbers of nucleotides per cycle", sub=args[1], ylab="Absolute number", col=heat.colors(5), names.arg=c(1:cycles)) -legend(cycles+10, total_number_bases_first_cycle, n, fill=heat.colors(5)) -dev.off() \ No newline at end of file diff --git a/deep_sequencing_unit/source/R/numberOfOccurrences.R b/deep_sequencing_unit/source/R/numberOfOccurrences.R deleted file mode 100644 index 4183dd9eb2b42a6a9527dddfa65af6053e976062..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/source/R/numberOfOccurrences.R +++ /dev/null @@ -1,19 +0,0 @@ -# Taken from http://www.bioconductor.org/help/workflows/high-throughput-sequencing/ - -## Load packages; also loads Biostrings, IRanges, ... -library(multicore) -library(ShortRead) - -args <- commandArgs(TRUE) -seq <- readFastq(args[1]) - -pdf(file=paste(args[1],"NumberOfOccurrences.pdf", sep="_")) - -## Calculate and plot cumulative reads vs. occurrences -tbl <- tables(seq)[[2]] -xyplot(cumsum(nReads * nOccurrences) ~ nOccurrences, tbl, -scales=list(x=list(log=TRUE)), main=args[1], type="b", pch=20, -xlab="Number of Occurrences", -ylab="Cumulative Number of Reads") - -dev.off() \ No newline at end of file diff --git a/deep_sequencing_unit/source/SQL/DBM_postgres_trigger.sql b/deep_sequencing_unit/source/SQL/DBM_postgres_trigger.sql deleted file mode 100644 index c2fead97618dcd189d4e3b15752fa31b1ce1a29c..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/source/SQL/DBM_postgres_trigger.sql +++ /dev/null @@ -1,31 +0,0 @@ -CREATE OR REPLACE FUNCTION set_dbm_relations() RETURNS trigger AS $dbm_relations$ -DECLARE - groups RECORD; - next_ag_id tech_id; - next_ra_id tech_id; - space_id tech_id; - robert_user_id int := 240; - florian_user_id int := 404; - role authorization_role := 'OBSERVER'; - dbm_string varchar:= 'DBM%'; -BEGIN - - FOR groups IN SELECT code FROM spaces WHERE code LIKE dbm_string EXCEPT ALL - SELECT code FROM authorization_groups WHERE code LIKE dbm_string LOOP - SELECT nextval('authorization_group_id_seq') INTO next_ag_id; - INSERT INTO authorization_groups (id, code, pers_id_registerer) VALUES (next_ag_id, groups.code, 1); - INSERT INTO authorization_group_persons (ag_id, pers_id) VALUES (next_ag_id, robert_user_id); - INSERT INTO authorization_group_persons (ag_id, pers_id) VALUES (next_ag_id, florian_user_id); - - SELECT id FROM spaces WHERE code=groups.code INTO space_id; - SELECT nextval('role_assignment_id_seq') INTO next_ra_id; - INSERT INTO role_assignments (id, role_code, space_id, pers_id_registerer, ag_id_grantee) VALUES (next_ra_id, role, space_id, 1, next_ag_id); - END LOOP; - RETURN NULL; -END; -$dbm_relations$ LANGUAGE plpgsql; - --- DROP TRIGGER IF EXISTS dbm_relations ON spaces; - -CREATE TRIGGER dbm_relations AFTER INSERT ON spaces -FOR EACH ROW EXECUTE PROCEDURE set_dbm_relations(); \ No newline at end of file diff --git a/deep_sequencing_unit/source/bash/CreatePerCycleReadQuality.sh b/deep_sequencing_unit/source/bash/CreatePerCycleReadQuality.sh deleted file mode 100644 index 6eb5ad9ec0b84993f5afe0c64efe3c4efc60dfa0..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/source/bash/CreatePerCycleReadQuality.sh +++ /dev/null @@ -1,26 +0,0 @@ -#!/bin/bash - -R_SCRIP_PATH=/usr/local/dsu/R-scripts - -for i in `ls -1 *.fastq` -do - Rscript --vanilla $R_SCRIP_PATH/CreatePerCycleReadQuality.R $i & - FC_NAME=`echo $i | cut -f1 -d \. | cut -f1-4 -d _` -done - -wait $! - -sleep 180 - -/usr/local/dsu/pdftk-1.41/pdftk/pdftk *.pdf cat output "${FC_NAME}_ALL_boxplots.pdf" - -for i in 1 2 3 4 6 7 8 -do - if [ -f "${FC_NAME}_${i}.fastq_boxplot.pdf" ]; then - /usr/local/dsu/pdftk-1.41/pdftk/pdftk "${FC_NAME}_${i}.fastq_boxplot.pdf" "${FC_NAME}_5.fastq_boxplot.pdf" cat output "${FC_NAME}_${i}_boxplot.pdf" - rm "${FC_NAME}_${i}.fastq_boxplot.pdf" - fi -done -mv ${FC_NAME}_5.fastq_boxplot.pdf ${FC_NAME}_5_boxplot.pdf - -echo DONE diff --git a/deep_sequencing_unit/source/bash/RTA_check_on_missing_images.sh b/deep_sequencing_unit/source/bash/RTA_check_on_missing_images.sh deleted file mode 100755 index 0fbaca5ebc32e393d43e3b9a584fdabb8b793700..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/source/bash/RTA_check_on_missing_images.sh +++ /dev/null @@ -1,63 +0,0 @@ -#!/bin/bash -# Checks on missing pictures in the 'Images' folder of the new Illumina Pipeline 1.4 -# July 2009 -# Author: Manuel Kohler -# Needs one parameter to specify the number of cycles which may vary - -export NUMBER_OF_CYCLES=$1 -export NUMBER_OF_LANES=8 -export NUMBER_OF_TILES_PER_LANE=100 -export NUMBER_OF_IMAGES_PER_TILE=2 -export IMAGES_PER_CYCLE=$[ ${NUMBER_OF_TILES_PER_LANE}*${NUMBER_OF_IMAGES_PER_TILE} ] -#---------------------------------------------- -export RUN_BASE=/array0/Incoming/Runs -export LATEST_FOLDER=`ls -1tr $RUN_BASE | tail -1` -#export IMAGE_PATH=$RUN_BASE/$LATEST_FOLDER/Images -export IMAGE_PATH=$2 -#---------------------------------------------- -export MAILX="/bin/mail" -export MAIL_LIST="manuel.kohler@bsse.ethz.ch" -#---------------------------------------------- -export BOX=`uname -n` -export PRG=`basename $0` -export USAGE="Usage: ${PRG} <Number_of_cycles> <Image_Path>" -export DAY=`date |cut -c1-3` -export BUILDSTAMP=`date '+%Y.%m.%d_%H_%M'` -export MISSING_IMAGES=$IMAGE_PATH/missing_images_${BUILDSTAMP}.txt -#---------------------------------------------- -if [ -z "${NUMBER_OF_CYCLES}" -o -z "${IMAGE_PATH}" ] -then - echo "${USAGE}" - exit 1 -fi -#---------------------------------------------- -echo -e "Checking $IMAGE_PATH as Image Folders" -echo -e "Looking for $IMAGES_PER_CYCLE Images in $NUMBER_OF_CYCLES cycle folders..." - -# Create a reference file -for j in cnf cif; do - for (( k = 1; k <= $NUMBER_OF_TILES_PER_LANE; k++ )); do - echo \_$k.$j >> $IMAGE_PATH/image_reference.txt; - done -done -#---------------------------------------------- -for i in $IMAGE_PATH/L00*; do - for c in $i/*; do - NUMBER=`ls -1 $c | wc -l`; - if [ $NUMBER -ne ${IMAGES_PER_CYCLE} ]; - then - echo $c - ls -1 $c > $IMAGE_PATH/incomplete_files.txt -# cat $IMAGE_PATH/incomplete_files.txt | cut -d "_" -f3- | sort -n > $IMAGE_PATH/incomplete_files-s.txt - diff $IMAGE_PATH/incomplete_files.txt $IMAGE_PATH/image_reference.txt; - fi - done; -done > $IMAGE_PATH/missing.txt -#---------------------------------------------- -sed '/^[0-9]/d' $IMAGE_PATH/missing.txt > $IMAGE_PATH/missing_tmp.txt -sed 's/^> //' $IMAGE_PATH/missing_tmp.txt > $MISSING_IMAGES -#---------------------------------------------- -#rm $IMAGE_PATH/image_reference.txt $IMAGE_PATH/incomplete_files.txt -#---------------------------------------------- -$MAILX -s "Missing Images in last GA run on $BOX discovered! ( ${MISSING_IMAGES} )" $MAIL_LIST < ${MISSING_IMAGES} -exit 0; diff --git a/deep_sequencing_unit/source/bash/add_p.sh b/deep_sequencing_unit/source/bash/add_p.sh deleted file mode 100755 index 45a01b3495c1f51b7fc40441628a207dc66496d6..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/source/bash/add_p.sh +++ /dev/null @@ -1,8 +0,0 @@ -#!/bin/bash -# Simply adds a 'p' to the int and nse files - -for i in `ls *int*`; do - #j=`echo $i | cut -c 1-16` - mv $i $i.p - #echo -e "Moving $i to $j"; -done diff --git a/deep_sequencing_unit/source/bash/check_on_missing_images.sh b/deep_sequencing_unit/source/bash/check_on_missing_images.sh deleted file mode 100755 index f2f7bb5e292546c5a4ef7c94dd1bcbb1a590024d..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/source/bash/check_on_missing_images.sh +++ /dev/null @@ -1,62 +0,0 @@ -#!/bin/bash -# Checks on missing pictures in the 'Images' folder of the new Illumina Pipeline 1.4 -# July 2009 -# Author: Manuel Kohler -# Needs one parameter to specify the number of cycles which may vary - -export NUMBER_OF_CYCLES=$1 -export NUMBER_OF_LANES=8 -export NUMBER_OF_TILES_PER_LANE=100 -export NUMBER_OF_IMAGES_PER_TILE=4 -export IMAGES_PER_CYCLE=$[ ${NUMBER_OF_TILES_PER_LANE}*${NUMBER_OF_IMAGES_PER_TILE} ] -#---------------------------------------------- -export RUN_BASE=/array0/Runs -export LATEST_FOLDER=`ls -1tr $RUN_BASE | tail -1` -export IMAGE_PATH=$RUN_BASE/$LATEST_FOLDER/Images -#---------------------------------------------- -export MAILX="/bin/mailx" -export MAIL_LIST="manuel.kohler@bsse.ethz.ch" -#---------------------------------------------- -export BOX=`uname -n` -export PRG=`basename $0` -export USAGE="Usage: ${PRG} <Number_of_cycles>" -export DAY=`date |cut -c1-3` -export BUILDSTAMP=`date '+%Y.%m.%d_%H_%M'` -export MISSING_IMAGES=$IMAGE_PATH/missing_images_${BUILDSTAMP}.txt -#---------------------------------------------- -if [ -z "${NUMBER_OF_CYCLES}" ] -then - echo "${USAGE}" - exit 1 -fi -#---------------------------------------------- -echo -e "Checking $IMAGE_PATH as Image Folders" -echo -e "Looking for $IMAGES_PER_CYCLE Images in $NUMBER_OF_CYCLES cycle folders..." - -# Create a reference file -for (( k = 1; k <= $NUMBER_OF_TILES_PER_LANE; k++ )); do - for j in a c g t; do - echo $k\_$j.tif >> $IMAGE_PATH/image_reference.txt; - done -done -#---------------------------------------------- -for i in $IMAGE_PATH/L00*; do - for c in $i/*; do - NUMBER=`ls -1 $c | wc -l`; - if [ $NUMBER -ne ${IMAGES_PER_CYCLE} ]; - then - echo $c - ls -1 $c > $IMAGE_PATH/incomplete_files.txt - cat $IMAGE_PATH/incomplete_files.txt | cut -d "_" -f3- | sort -n > $IMAGE_PATH/incomplete_files-s.txt - diff $IMAGE_PATH/incomplete_files-s.txt $IMAGE_PATH/image_reference.txt; - fi - done; -done > $IMAGE_PATH/missing.txt -#---------------------------------------------- -sed '/^[0-9]/d' $IMAGE_PATH/missing.txt > $IMAGE_PATH/missing_tmp.txt -sed 's/^> //' $IMAGE_PATH/missing_tmp.txt > $MISSING_IMAGES -#---------------------------------------------- -rm $IMAGE_PATH/image_reference.txt $IMAGE_PATH/incomplete_files.txt $IMAGE_PATH/incomplete_files-s.txt $IMAGE_PATH/missing.txt $IMAGE_PATH/missing_tmp.txt -#---------------------------------------------- -$MAILX -s "Missing Images in last GA run on $BOX discovered! ( ${MISSING_IMAGES} )" $MAIL_LIST < ${MISSING_IMAGES} -exit 0; diff --git a/deep_sequencing_unit/source/bash/check_read_numbers.sh b/deep_sequencing_unit/source/bash/check_read_numbers.sh deleted file mode 100644 index 7bf8cf3ccc545af119558e8209d360f3a5d5aaf7..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/source/bash/check_read_numbers.sh +++ /dev/null @@ -1,26 +0,0 @@ -#!/bin/bash - -export RUN_BASE=/net/bs-dsu-data/array0/dsu/runs/ellac -export LATEST_FOLDER=`ls -1dtr $RUN_BASE/*XX* | tail -1` -export FC=`echo $LATEST_FOLDER | cut -f8 -d/` -export NUMBER_OF_TILES=`cat $LATEST_FOLDER/Data/Intensities/RTAConfiguration.xml | grep TilesPerLane | cut -d \> -f2 | cut -d \< -f1` -export MAILX=/bin/mailx -export MAIL_LIST="manuel.kohler@bsse.ethz.ch" -export SUMMARY_FILE=$LATEST_FOLDER/Data/Intensities/BaseCalls/GERALD*/Summary.xml -export SRF_INFO_OUTPUT=$LATEST_FOLDER/Data/Intensities/BaseCalls/Srf/srf_info.txt - - -cat $SRF_INFO_OUTPUT | grep GOOD | cut -f 4 -d " " > numbers -j=0 -for i in `cat numbers`; do n[j]=$i; j=$j+1 ;done - -grep -A 279 \<LaneResultsSummary\> $SUMMARY_FILE | grep -A 1 \<clusterCountPF\> | grep mean | cut -f 2 -d \< | cut -f2 -d \> > summary_temp -j=0 -for i in `cat summary_temp`; do echo $i*$NUMBER_OF_TILES| bc -l >> summary_numbers ; done -for i in `cat summary_numbers`; do sn[j]=$i j=$j+1; done - -for k in {0..7}; do echo ${sn[$k]}-${n[$k]} | bc >> difference; done - -$MAILX -s "Flow Cell $FC: Number comparison of srf_info and Eland Summary" < difference $MAIL_LIST - -rm difference summary_numbers summary_temp numbers diff --git a/deep_sequencing_unit/source/bash/cif2txt.sh b/deep_sequencing_unit/source/bash/cif2txt.sh deleted file mode 100755 index c9c114c7d5fb69c4d2d570a8eaa95ae2404655bd..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/source/bash/cif2txt.sh +++ /dev/null @@ -1,51 +0,0 @@ -# Manuel Kohler 2009, CISD, ETH ZŸrich -# wrapper for the cifToTxt binary provided by Illumina - -#Usage: cifToTxt [options] - -#Command line options: -# -h [ --help ] produce help message and exit -# -I [ --IPAR ] generate IPAR data -# -N [ --noise ] convert noise instead of intensities -# -l [ --lane ] arg identifier of the lane (1, 2, 3, ..., 8) -# -t [ --tile ] arg identifier of the tile (1, 2, 3, ..., 110) -# -r [ --repeat ] arg (=1) identifier of the repeat (1, 2, ...) -# -f [ --first-cycle ] arg (=1) first cycle to use (1-based) -# -n [ --number-of-cycles ] arg number of cycles to convert -# -i [ --input-dir ] arg (=.) directory where the CIF directories are located -# -o [ --output-dir ] arg (=.) directory where the output file should be -# written -# -c [ --compression ] arg where arg=bzip2|gzip|none. The data compression -# format used for the output file. -#!/bin/bash - -INTENSITY_FOLDER=$1 -CYCLES=$2 -NUMBER_OF_TILES=$3 -NUMBER_OF_LANES=8 -#INT_NSE_DIR=$1/int_nse -PRG=`basename $0` -USAGE="Usage: ${PRG} <Path_to_Intensity_Folder> <Number_of_Cycles> <Number_of_Tiles>\n\nEXAMPLE: ${PRG} /array0/Runs/090720_42HUDAAXX/Data/Intensities/ 38 120" - -if [ -z "${INTENSITY_FOLDER}" -o -z "${CYCLES}" -o -z "${NUMBER_OF_TILES}" ] -then - echo -e "${USAGE}" - exit 1 -fi - - -# INT_NSE_DIR there? -[ -d $INT_NSE_DIR ] || mkdir -p $INT_NSE_DIR - -for (( t = 1; t <= $NUMBER_OF_TILES; t++ )); do - for (( l = 1; l <= $NUMBER_OF_LANES; l++ )); do - echo Lane $l Tile $t; - # Convert Signal cif to int - /dsf/GAPipeline/bin/cifToTxt -l $l -t $t -n $CYCLES -i $INTENSITY_FOLDER -o $INTENSITY_FOLDER -c none & - # Convert Noise cnf to nse (additional -N) - /dsf/GAPipeline/bin/cifToTxt -N -l $l -t $t -n $CYCLES -i $INTENSITY_FOLDER -o $INTENSITY_FOLDER -c none & - done - # wait for the processes to end after calling 8 Lanes - wait $! - sleep 3 -done \ No newline at end of file diff --git a/deep_sequencing_unit/source/bash/convert_template.sh b/deep_sequencing_unit/source/bash/convert_template.sh deleted file mode 100755 index 9e4c5d8afbdabd51ca340fc35a6452056274104d..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/source/bash/convert_template.sh +++ /dev/null @@ -1,3 +0,0 @@ -#!/bin/bash -#Usage: eland2wig <chromosomes> <trackname> <fragmentsize> <windowsize> <strand> -eland2wig drosmel.genome Lane5 160 10 0 <s_5_export.txt | gzip - -9 >s_5.wig.gz diff --git a/deep_sequencing_unit/source/bash/createQaReport.sh b/deep_sequencing_unit/source/bash/createQaReport.sh deleted file mode 100644 index 1da680cf906a3b36560affaddc897bebbe3c1ef9..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/source/bash/createQaReport.sh +++ /dev/null @@ -1,10 +0,0 @@ -#!/bin/bash - -R_SCRIP_PATH=/usr/local/dsu/R-scripts - -for i in `ls -1 *.fastq` -do - Rscript --vanilla $R_SCRIP_PATH/createQaReport.R $i & -done -wait $! -echo * DONE * diff --git a/deep_sequencing_unit/source/bash/create_srfs.sh b/deep_sequencing_unit/source/bash/create_srfs.sh deleted file mode 100644 index 75456ff40739784e7ce9897c04587d955cb2bec8..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/source/bash/create_srfs.sh +++ /dev/null @@ -1,79 +0,0 @@ -#!/bin/bash -# Processing steps needed from the Illumina Output to the SRF files - -export RUN_BASE=/net/bs-dsu-data/array0/dsu/processing -export LATEST_FOLDER=`ls -1dtr $RUN_BASE/*XX* | tail -1` -export INTENSITY_FOLDER=Data/Intensities -export BUSTARD=/usr/local/dsu/GAPipeline/bin/bustard.py -export CONFIG_FILE=$LATEST_FOLDER/$INTENSITY_FOLDER/config.txt -export CIF2TXT=/usr/local/dsu/bin/cif2txt.sh -export LANES2SRF=/usr/local/dsu/bin/lanes2srf_RTA -export NUMBER_OF_LANES=`cat $LATEST_FOLDER/$INTENSITY_FOLDER/RTAConfiguration.xml | grep NumberOfLanes | cut -d \> -f2 | cut -d \< -f1` -export NUMBER_OF_TILES=`cat $LATEST_FOLDER/$INTENSITY_FOLDER/RTAConfiguration.xml | grep TilesPerLane | cut -d \> -f2 | cut -d \< -f1` -export PAIRED_END=`cat $LATEST_FOLDER/$INTENSITY_FOLDER/RTAConfiguration.xml | grep IsPairedEndRun | cut -d \> -f2 | cut -d \< -f1` -export NUMBER_OF_CYCLES=`ls -1tr $LATEST_FOLDER/$INTENSITY_FOLDER/L00$NUMBER_OF_LANES/ | tail -1 | cut -d . -f1 | cut -d C -f2` -export MAILX=/bin/mailx -export MAIL_LIST="manuel.kohler@bsse.ethz.ch" -export RM=/bin/rm -export MAKE=/usr/bin/make - -export PRG=`basename $0` -export USAGE="Usage: ${PRG} <Path_to_Run_Base> <Number_of_Lanes> \n\nEXAMPLE: ${PRG} /array0/Runs/ 8" - -if [ -z "${RUN_BASE}" -o -z "${NUMBER_OF_LANES}" ] -then - echo "${USAGE}" - exit 1 -fi - -cd $LATEST_FOLDER/$INTENSITY_FOLDER - -echo "5:ELAND_GENOME /array0/Genomes/PhiX" > $CONFIG_FILE -if $PAIRED_END; - then echo "5:ANALYSIS eland_pair" >> $CONFIG_FILE; - else echo "5:ANALYSIS eland_extended" >> $CONFIG_FILE; -fi -echo "ELAND_MULTIPLE_INSTANCES 8" >> $CONFIG_FILE -echo "EMAIL_LIST manuel.kohler@bsse.ethz.ch" >> $CONFIG_FILE - -/usr/local/dsu/GAPipeline/bin/GERALD.pl config.txt --FLOW_CELL v4 --EXPT_DIR BaseCalls/ --make -cd BaseCalls/GERALD* -make -j 8 all - -#$BUSTARD --CIF . --GERALD=$CONFIG_FILE --control-lane=5 --make - -#cd Bustard* -#echo "Starting parallel make..." - -#make recursive -j 15 2>seq_make.err >seq_make.log -cd $LATEST_FOLDER/$INTENSITY_FOLDER/BaseCalls - -$CIF2TXT $LATEST_FOLDER/$INTENSITY_FOLDER $NUMBER_OF_CYCLES $NUMBER_OF_TILES - -#$LANES2SRF $LATEST_FOLDER/$INTENSITY_FOLDER/BaseCalls $NUMBER_OF_LANES -#$LANES2SRF /net/bs-dsu-data/array0/dsu/processing/091208_433DAAXX/Data/Intensities/BaseCalls/ 8 - -export SRF_DIR=Srf -#export ILLUMINA2SRF=/usr/local/dsu/bin/illumina2srf -export ILLUMINA2SRF=/usr/local/bin/illumina2srf -export LF=`echo $LATEST_FOLDER | cut -d / -f7` - -[ -d $SRF_DIR ] || mkdir $SRF_DIR -#for (( a=1; a<=$NUMBER_OF_LANES; a++ )); do -# echo "Starting SRF $a" - $ILLUMINA2SRF -clobber -b -o $SRF_DIR/"ETHZ_BSSE_"$LF"_1.srf" $LATEST_FOLDER/$INTENSITY_FOLDER/BaseCalls/s_1_*_qseq.txt & - $ILLUMINA2SRF -clobber -b -o $SRF_DIR/"ETHZ_BSSE_"$LF"_2.srf" $LATEST_FOLDER/$INTENSITY_FOLDER/BaseCalls/s_2_*_qseq.txt & - $ILLUMINA2SRF -clobber -b -o $SRF_DIR/"ETHZ_BSSE_"$LF"_3.srf" $LATEST_FOLDER/$INTENSITY_FOLDER/BaseCalls/s_3_*_qseq.txt & - $ILLUMINA2SRF -clobber -b -o $SRF_DIR/"ETHZ_BSSE_"$LF"_4.srf" $LATEST_FOLDER/$INTENSITY_FOLDER/BaseCalls/s_4_*_qseq.txt & - $ILLUMINA2SRF -clobber -b -o $SRF_DIR/"ETHZ_BSSE_"$LF"_5.srf" $LATEST_FOLDER/$INTENSITY_FOLDER/BaseCalls/s_5_*_qseq.txt & - $ILLUMINA2SRF -clobber -b -o $SRF_DIR/"ETHZ_BSSE_"$LF"_6.srf" $LATEST_FOLDER/$INTENSITY_FOLDER/BaseCalls/s_6_*_qseq.txt & - $ILLUMINA2SRF -clobber -b -o $SRF_DIR/"ETHZ_BSSE_"$LF"_7.srf" $LATEST_FOLDER/$INTENSITY_FOLDER/BaseCalls/s_7_*_qseq.txt & - $ILLUMINA2SRF -clobber -b -o $SRF_DIR/"ETHZ_BSSE_"$LF"_8.srf" $LATEST_FOLDER/$INTENSITY_FOLDER/BaseCalls/s_8_*_qseq.txt & - wait $! -#done - - -# clean up -#chmod -R 755 $LATEST_FOLDER - -echo -e "SRF creation finished for $LATEST_FOLDER :-)" | $MAILX -s "SRF creation finished for $LATEST_FOLDER :-)" $MAIL_LIST \ No newline at end of file diff --git a/deep_sequencing_unit/source/bash/createmd5sums b/deep_sequencing_unit/source/bash/createmd5sums deleted file mode 100755 index 53fa57968705d14da30c47592e140ecd2e414f4c..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/source/bash/createmd5sums +++ /dev/null @@ -1,18 +0,0 @@ -#!/bin/bash -cd Data -echo Checksumming Lane 1 -find . -type f | grep -Ev '/s_[2345678][^/]*$' | xargs md5sum >s_1.md5 -echo Checksumming Lane 2 -find . -type f | grep -Ev '/s_[1345678][^/]*$' | xargs md5sum >s_2.md5 -echo Checksumming Lane 3 -find . -type f | grep -Ev '/s_[1245678][^/]*$' | xargs md5sum >s_3.md5 -echo Checksumming Lane 4 -find . -type f | grep -Ev '/s_[1235678][^/]*$' | xargs md5sum >s_4.md5 -echo Checksumming Lane 5 -find . -type f | grep -Ev '/s_[1234678][^/]*$' | xargs md5sum >s_5.md5 -echo Checksumming Lane 6 -find . -type f | grep -Ev '/s_[1234578][^/]*$' | xargs md5sum >s_6.md5 -echo Checksumming Lane 7 -find . -type f | grep -Ev '/s_[1234568][^/]*$' | xargs md5sum >s_7.md5 -echo Checksumming Lane 8 -find . -type f | grep -Ev '/s_[1234567][^/]*$' | xargs md5sum >s_8.md5 \ No newline at end of file diff --git a/deep_sequencing_unit/source/bash/datamover_post.sh b/deep_sequencing_unit/source/bash/datamover_post.sh deleted file mode 100644 index 3659af90cc13290a0b5b17a3830008e92eef823a..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/source/bash/datamover_post.sh +++ /dev/null @@ -1,10 +0,0 @@ -#!/bin/bash - -RM=/usr/bin/rm - -ssh bs-isvr01-s.ethz.ch /net/bs-bsse/local0/local/dsu/bin/create_srfs.sh - -# get rid of the intensity and noise files generated for the srfs -$RM /array0/dsu/processing/*/Data/Intensities/*int* /array0/dsu/processing/*/Data/Intensities/*nse* - -rsync /array0/dsu/processing/* /array0/dsu/dss/incoming \ No newline at end of file diff --git a/deep_sequencing_unit/source/bash/do-sync.sh b/deep_sequencing_unit/source/bash/do-sync.sh deleted file mode 100755 index 0ec88d12147025446bae4211e78ecc7027709526..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/source/bash/do-sync.sh +++ /dev/null @@ -1,45 +0,0 @@ -#!/bin/bash - -ADD_ARG=$1 - -STOR=bs-ssvr01 -RUN=$(basename $(pwd)) -cd /array0/Runs/${RUN} || exit 1 - -DEST_BSSE="dsf/Samples" -DEST_FMI="dsf-fmi/Samples" -DEST_BZ="dsf-biozentrum" -DEST_UB="dsf-unibs" -DEST_C1="dsf-customer1" -DEST_C2="dsf-customer2" -DEST_C3="dsf-customer3" - -DEST1="${STOR}::${DEST_BZ}" -DEST2="${STOR}::${DEST_BZ}" -DEST3="${STOR}::${DEST_BZ}" -DEST4="${STOR}::${DEST_BZ}" -DEST5="${STOR}::${DEST_BSSE}" -DEST6="${STOR}::${DEST_BZ}" -DEST7="${STOR}::${DEST_BZ}" -DEST8="${STOR}::${DEST_FMI}" - -# Lane -LANE1="UB-DE-257" -LANE2="UB-DE-258" -LANE3="UB-DE-259" -LANE4="UB-DE-260" -LANE6="UB-DE-261" -LANE7="UB-DE-262" -LANE8="FMI-HG-263" -# Lane 5 BSSE Control Lane -LANE5="BSSE-IN-134" - -rsync -xav --delete --delete-excluded --exclude "*-tmp-*" --exclude "Images" --exclude "*~" --exclude "s_[2345678]*" Data/ ${DEST1}/${LANE1}-${RUN}-1 --stats $ADD_ARG -rsync -xav --delete --delete-excluded --exclude "*-tmp-*" --exclude "Images" --exclude "*~" --exclude "s_[1345678]*" Data/ ${DEST2}/${LANE2}-${RUN}-2 --stats $ADD_ARG -rsync -xav --delete --delete-excluded --exclude "*-tmp-*" --exclude "Images" --exclude "*~" --exclude "s_[1245678]*" Data/ ${DEST3}/${LANE3}-${RUN}-3 --stats $ADD_ARG -rsync -xav --delete --delete-excluded --exclude "*-tmp-*" --exclude "Images" --exclude "*~" --exclude "s_[1235678]*" Data/ ${DEST4}/${LANE4}-${RUN}-4 --stats $ADD_ARG -rsync -xav --delete --delete-excluded --exclude "*-tmp-*" --exclude "Images" --exclude "*~" --exclude "s_[1234678]*" Data/ ${DEST5}/${LANE5}-${RUN}-5 --stats $ADD_ARG -rsync -xav --delete --delete-excluded --exclude "*-tmp-*" --exclude "Images" --exclude "*~" --exclude "s_[1234578]*" Data/ ${DEST6}/${LANE6}-${RUN}-6 --stats $ADD_ARG -rsync -xav --delete --delete-excluded --exclude "*-tmp-*" --exclude "Images" --exclude "*~" --exclude "s_[1234568]*" Data/ ${DEST7}/${LANE7}-${RUN}-7 --stats $ADD_ARG -rsync -xav --delete --delete-excluded --exclude "*-tmp-*" --exclude "Images" --exclude "*~" --exclude "s_[1234567]*" Data/ ${DEST8}/${LANE8}-${RUN}-8 --stats $ADD_ARG -# dirvish-timestemp diff --git a/deep_sequencing_unit/source/bash/ellac_create_srfs.sh b/deep_sequencing_unit/source/bash/ellac_create_srfs.sh deleted file mode 100755 index 9f306c0446c46a6ba4ae1804a6197240258ab9a6..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/source/bash/ellac_create_srfs.sh +++ /dev/null @@ -1,150 +0,0 @@ -#!/bin/bash -# Processing steps needed from the Illumina Output to the SRF files - -export SEQUENCER=ellac -export RUN_BASE=/net/bs-dsu-data/array0/dsu/runs/$SEQUENCER -export LATEST_FOLDER=`ls -1dtr $RUN_BASE/*XX* | tail -1` -export INTENSITY_FOLDER=Data/Intensities -export BUSTARD=/usr/local/dsu/GAPipeline/bin/bustard.py -export CONFIG_FILE=$LATEST_FOLDER/$INTENSITY_FOLDER/config.txt -export CIF2TXT=/usr/local/dsu/bin/cif2txt.sh -export LANES2SRF=/usr/local/dsu/bin/lanes2srf_RTA -export MAILX=/bin/mailx -export MAIL_LIST="manuel.kohler@bsse.ethz.ch" -export RM=/bin/rm -export MAKE=/usr/bin/make -export GERALD=/usr/local/CASAVA-1.7.0/bin/GERALD.pl -export LF=`echo $LATEST_FOLDER | cut -d / -f8` -export RUN_COMPLETED=$LATEST_FOLDER/Run.completed -export ANALYSIS_STARTED=$LATEST_FOLDER/Analysis.started -export OPENBIS_SERVER=http://openbis-dsu.bsse.ethz.ch:8080/openbis/openbis -export PROCESSING=/net/bs-dsu-data/array0/dsu/processing -export BCL=/usr/local/dsu/OLB/OLB-1.8.0/bin/setupBclToQseq.py - -export PRG=`basename $0` -export USAGE="Usage: ${PRG} <Path_to_Run_Base> <Number_of_Lanes> \n\nEXAMPLE: ${PRG} /array0/Runs/ 8" - -#if [ -z "${RUN_BASE}" -o -z "${NUMBER_OF_LANES}" ] -#then -# echo "${USAGE}" -# exit 1 -#fi - -function gerald_basic { - cd $LATEST_FOLDER/$INTENSITY_FOLDER - export PAIRED_END=`cat $LATEST_FOLDER/$INTENSITY_FOLDER/RTAConfiguration.xml | grep IsPairedEndRun | cut -d \> -f2 | cut -d \< -f1` - echo "5:ELAND_GENOME /array0/Genomes/PhiX" > $CONFIG_FILE - if $PAIRED_END; - then echo "5:ANALYSIS eland_pair" >> $CONFIG_FILE; - else echo "5:ANALYSIS eland_extended" >> $CONFIG_FILE; - fi - echo "ELAND_SET_SIZE 8" >> $CONFIG_FILE - echo "EMAIL_LIST manuel.kohler@bsse.ethz.ch" >> $CONFIG_FILE - $GERALD $CONFIG_FILE --EXPT_DIR $LATEST_FOLDER/$INTENSITY_FOLDER/BaseCalls --OUT_DIR $LATEST_FOLDER/$INTENSITY_FOLDER/BaseCalls/GERALD --make - cd $LATEST_FOLDER/$INTENSITY_FOLDER/GERALD - make -j 10 all - /usr/local/dsu/bin/check_read_numbers.sh $SEQUENCER -} - -function gerald { - cd $LATEST_FOLDER/$INTENSITY_FOLDER - /usr/local/dsu/openbis-property-client/client/lib/properties.sh $OPENBIS_SERVER $LF - sleep 5 - mv /usr/local/dsu/openbis-property-client/client/lib/config.txt $CONFIG_FILE - mv /usr/local/dsu/openbis-property-client/client/lib/bowtie.txt $LATEST_FOLDER/$INTENSITY_FOLDER -# chmod -R 755 BaseCalls - mkdir -p $PROCESSING/$LF/BaseCalls - $GERALD $CONFIG_FILE --EXPT_DIR $LATEST_FOLDER/$INTENSITY_FOLDER/BaseCalls --OUT_DIR $PROCESSING/$LF/GERALD --make - cd $PROCESSING/$LF/GERALD - make -j 10 all - wait $! - chmod -R 755 . - rsync -av ../GERALD $LATEST_FOLDER/$INTENSITY_FOLDER/BaseCalls/ - rm -rf $PROCESSING/$LF - /usr/local/dsu/bin/check_read_numbers.sh $SEQUENCER -# rm -rf Temp -} - -function bowtie { - /usr/local/dsu/bin/openBIS_bowtie_alignment.sh -} - - -# no longer needed with the use of the RTA -function bustard { - $BUSTARD --CIF . --GERALD=$CONFIG_FILE --control-lane=5 --make - cd Bustard* - echo "Starting parallel make..." - make recursive -j 15 2>seq_make.err >seq_make.log -} - - -function cif2txt { - cd $LATEST_FOLDER/$INTENSITY_FOLDER/BaseCalls - $CIF2TXT $LATEST_FOLDER/$INTENSITY_FOLDER $NUMBER_OF_CYCLES $NUMBER_OF_TILES - -} - - -function bcl2qseq { - export LF=`echo $LATEST_FOLDER | cut -d / -f8` - $BCL -i $LATEST_FOLDER/$INTENSITY_FOLDER/BaseCalls/ -p $LATEST_FOLDER/$INTENSITY_FOLDER -o /net/bs-dsu-data/array0/dsu/processing/$LF --in-place --overwrite - cd $PROCESSING/$LF - make -j15 - chmod -R 755 . - rsync -av . $LATEST_FOLDER/$INTENSITY_FOLDER/BaseCalls - rm -rf $PROCESSING/$LF -} - - -function create_srf { - export SRF_DIR=Srf - export ILLUMINA2SRF=/usr/local/bin/illumina2srf - export LF=`echo $LATEST_FOLDER | cut -d / -f8` - - cd $LATEST_FOLDER/$INTENSITY_FOLDER/BaseCalls - [ -d $SRF_DIR ] || mkdir $SRF_DIR - $ILLUMINA2SRF -clobber -b -o $SRF_DIR/"ETHZ_BSSE_"$LF"_1.srf" $LATEST_FOLDER/$INTENSITY_FOLDER/BaseCalls/s_1_*_qseq.txt - $ILLUMINA2SRF -clobber -b -o $SRF_DIR/"ETHZ_BSSE_"$LF"_2.srf" $LATEST_FOLDER/$INTENSITY_FOLDER/BaseCalls/s_2_*_qseq.txt & - $ILLUMINA2SRF -clobber -b -o $SRF_DIR/"ETHZ_BSSE_"$LF"_3.srf" $LATEST_FOLDER/$INTENSITY_FOLDER/BaseCalls/s_3_*_qseq.txt & - $ILLUMINA2SRF -clobber -b -o $SRF_DIR/"ETHZ_BSSE_"$LF"_4.srf" $LATEST_FOLDER/$INTENSITY_FOLDER/BaseCalls/s_4_*_qseq.txt & - $ILLUMINA2SRF -clobber -b -o $SRF_DIR/"ETHZ_BSSE_"$LF"_5.srf" $LATEST_FOLDER/$INTENSITY_FOLDER/BaseCalls/s_5_*_qseq.txt & - $ILLUMINA2SRF -clobber -b -o $SRF_DIR/"ETHZ_BSSE_"$LF"_6.srf" $LATEST_FOLDER/$INTENSITY_FOLDER/BaseCalls/s_6_*_qseq.txt & - $ILLUMINA2SRF -clobber -b -o $SRF_DIR/"ETHZ_BSSE_"$LF"_7.srf" $LATEST_FOLDER/$INTENSITY_FOLDER/BaseCalls/s_7_*_qseq.txt & - $ILLUMINA2SRF -clobber -b -o $SRF_DIR/"ETHZ_BSSE_"$LF"_8.srf" $LATEST_FOLDER/$INTENSITY_FOLDER/BaseCalls/s_8_*_qseq.txt & - wait $! - echo sleeping for 600 secs... - sleep 600 - echo creating srf_info.txt... - for i in `ls -1 ${SRF_DIR}/*.srf`; do - /usr/local/bin/srf_info -l1 $i >> ${SRF_DIR}/srf_info.txt; - done - echo creating fastqs... - cd ${SRF_DIR} - /usr/local/dsu/bin/create_fastq.sh - echo removing int and nse files ... - rm $LATEST_FOLDER/$INTENSITY_FOLDER/*int* $LATEST_FOLDER/$INTENSITY_FOLDER/*nse* -} - -if [ -f $ANALYSIS_STARTED ];then - echo "Analysis already started/done" - exit 255 -fi - -if [ -f $RUN_COMPLETED ];then - touch $ANALYSIS_STARTED - echo "Run completed! Starting Analysis..." - export NUMBER_OF_LANES=`cat $LATEST_FOLDER/$INTENSITY_FOLDER/RTAConfiguration.xml | grep NumberOfLanes | cut -d \> -f2 | cut -d \< -f1` - export NUMBER_OF_TILES=`cat $LATEST_FOLDER/$INTENSITY_FOLDER/RTAConfiguration.xml | grep TilesPerLane | cut -d \> -f2 | cut -d \< -f1` - export PAIRED_END=`cat $LATEST_FOLDER/$INTENSITY_FOLDER/RTAConfiguration.xml | grep IsPairedEndRun | cut -d \> -f2 | cut -d \< -f1` - export NUMBER_OF_CYCLES=`cat $LATEST_FOLDER/$INTENSITY_FOLDER/RTAConfiguration.xml | grep MaxCycles | cut -d \> -f2 | cut -d \< -f1` - sleep 600 - - cif2txt - bcl2qseq - create_srf - gerald_basic - #gerald - #bowtie -fi - diff --git a/deep_sequencing_unit/source/bash/goat_with_missing_tiles.sh b/deep_sequencing_unit/source/bash/goat_with_missing_tiles.sh deleted file mode 100755 index 0141a08b95f4f5d6f21a0bf05064339e39c9a56f..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/source/bash/goat_with_missing_tiles.sh +++ /dev/null @@ -1,13 +0,0 @@ -#!/bin/bash - - -RUN_DIR=/dsf/Analysis/Runs/090701_426LKAAXX/ -MISSING_TILES=--tiles=s_1_000[1-9],s_1_00[1-5][0-9],s_1_006[0-1],s_1_006[3-9],s_1_00[7-9][0-9],s_1_0100,s_2,s_3_000[1-9],s_3_00[1-4][0-9],s_3_0050,s_3_005[3-9],s_3_00[6-7][0-9],s_3_008[0-8],s_3_009[0-9],s_3_0100,s_4,s_5_000[1-9],s_5_00[1-3][0-9],s_5_0040,s_5_004[2-9],s_5_005[0-9],s_5_006[0-2],s_5_0064,s_5_006[6-7],s_5_0069,s_5_00[7-9][0-9],s_5_0100,s_6_000[1-9],s_6_00[1-2][0-9],s_6_003[0-8],s_6_00[4-9][0-9],s_6_0100,s_7_000[1-9],s_7_00[1-4][0-9],s_7_005[0-2],s_7_005[4-5],s_7_005[7-9],s_7_00[6-9][0-9],s_7_0100,s_8_000[1-9],s_8_00[1-6][0-9],s_8_007[0-8],s_8_0081,s_8_008[4-9],s_8_009[0-9],s_8_0100 -GOAT=/dsf/GAPipeline-1.4.0/bin/goat_pipeline.py -#CONTROL_LANE=--control-lane=5 - -cd $RUN_DIR -echo Started: `date` -$GOAT --control-lane=5 $MISSING_TILES ./ --make - -echo Finished: `date` diff --git a/deep_sequencing_unit/source/bash/illumina2srf-pre1.3 b/deep_sequencing_unit/source/bash/illumina2srf-pre1.3 deleted file mode 100755 index 9fb2a5e45d7aedd7ec24657b9d1ec7cd4deace80..0000000000000000000000000000000000000000 Binary files a/deep_sequencing_unit/source/bash/illumina2srf-pre1.3 and /dev/null differ diff --git a/deep_sequencing_unit/source/bash/lanes2srf b/deep_sequencing_unit/source/bash/lanes2srf deleted file mode 100755 index 15dbeec03123bafe208db5335c54b6731b46a2bb..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/source/bash/lanes2srf +++ /dev/null @@ -1,7 +0,0 @@ -#!/bin/bash -SRF_DIR=Srf -[ -d $SRF_DIR ] || mkdir -p $SRF_DIR ] -for a in 1 2 3 4 5 6 7 8; do - echo Converting Lane $a to SRF - time /dsf/illumina2srf -I -b -o $SRF_DIR/s_${a}.srf s_${a}_*_qseq.txt ; -done diff --git a/deep_sequencing_unit/source/bash/lanes2srf-pre1.3 b/deep_sequencing_unit/source/bash/lanes2srf-pre1.3 deleted file mode 100755 index 2d035d0a16370661438cfc084897b7c20c71dd0b..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/source/bash/lanes2srf-pre1.3 +++ /dev/null @@ -1,6 +0,0 @@ -#!/bin/bash -mkdir Srf -for a in 1 2 3 4 5 6 7 8; do - echo Converting Lane $a to SRF - time illumina2srf -r -p -C 0.6 -o Srf/s_${a}.srf -N %r:%l:%t: -n %x:%y s_${a}_*_seq.txt ; -done diff --git a/deep_sequencing_unit/source/bash/lanes2srf_RTA b/deep_sequencing_unit/source/bash/lanes2srf_RTA deleted file mode 100755 index 16617c2ba2ee045abb14d646ff80a210122115ea..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/source/bash/lanes2srf_RTA +++ /dev/null @@ -1,21 +0,0 @@ -#!/bin/bash - -export BUSTARD=$1 -export NUMBER_OF_LANES=$2 -export SRF_DIR=Srf -export ILLUMINA2SRF=/usr/local/dsu/bin/illumina2srf - -export PRG=`basename $0` -export USAGE="Usage: ${PRG} <Path_to_Bustard_Folder> <Number_of_Lanes> \n\nEXAMPLE: ${PRG} /array0/Runs/090720_42HUDAAXX/Data/Intensities/Bustard/ 8" - -if [ -z "${BUSTARD}" -o -z "${NUMBER_OF_LANES}" ] -then - echo "${USAGE}" - exit 1 -fi - -[ -d $SRF_DIR ] || mkdir $SRF_DIR -for (( a=1; a<=$NUMBER_OF_LANES; a++ )); do - echo Converting Lane $a to SRF - $ILLUMINA2SRF -b -o $SRF_DIR/s_${a}.srf $BUSTARD/s_${a}_*_qseq.txt & -done \ No newline at end of file diff --git a/deep_sequencing_unit/source/bash/rm_p.sh b/deep_sequencing_unit/source/bash/rm_p.sh deleted file mode 100755 index edd0d46ad0892e9963bdc8ad1946cfd6f9199060..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/source/bash/rm_p.sh +++ /dev/null @@ -1,8 +0,0 @@ -#!/bin/bash -# Simply removes the p from the int and nse files - -for i in `ls *.p`; do - j=`echo $i | cut -c 1-16` - mv $i $j - echo -e "Moving $i to $j"; -done diff --git a/deep_sequencing_unit/source/core-plugins/core-plugins.properties b/deep_sequencing_unit/source/core-plugins/core-plugins.properties deleted file mode 100644 index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..0000000000000000000000000000000000000000 diff --git a/deep_sequencing_unit/source/core-plugins/downloader/1/as/webapps/downloader/html/body-style.css b/deep_sequencing_unit/source/core-plugins/downloader/1/as/webapps/downloader/html/body-style.css deleted file mode 100644 index 451a137bcce18633e77e08da3c7ddad5974717fd..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/source/core-plugins/downloader/1/as/webapps/downloader/html/body-style.css +++ /dev/null @@ -1,60 +0,0 @@ - -input { -border: 0px solid; -height: 25px; -border-color:#000000; -outline: none; -font: 18px "Trebuchet MS"; -} - -body { font: 14px "Trebuchet MS", sans-serif; } - -h1 { -font: 16px; -color:#999999; - } -h3 { font: 12px; } - -.greytext {font: 18px "Trebuchet MS";} -.greytext:link {color:#BDBDBD; text-decoration:none} -.greytext:visited {color:#BDBDBD; text-decoration:none} -.greytext:active {color:#BDBDBD; text-decoration:none} -.greytext:hover {color:#000000; text-decoration:none} -.greytext input {color:#999999; text-decoration:none} - - -.box { -background-color: white; -text-rendering: optimizeLegibility; --webkit-border-radius: 6px; -height: 50px; -width: 480px; -margin-top: 30px; -padding: 8px 8px 8px 50px; -border: 3px solid #999999; -box-sizing: border-box; --webkit-box-sizing: border-box; --moz-box-sizing: border-box; -border-radius: 6px 6px 6px 6px; -} - -.loginname { -background-image: url(images/sprite.png); -background-repeat: no-repeat; -background-position: 5px 10px; -} - -.password { -background-image: url(images/sprite.png); -background-repeat: no-repeat; -background-position: 5px -30px; -} - -.loginbutton { -margin-top: 30px; -} - -div -{ -} - diff --git a/deep_sequencing_unit/source/core-plugins/downloader/1/as/webapps/downloader/html/button.css b/deep_sequencing_unit/source/core-plugins/downloader/1/as/webapps/downloader/html/button.css deleted file mode 100644 index cbb0dec6eb3132f86dc443b5a654b261c8047b40..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/source/core-plugins/downloader/1/as/webapps/downloader/html/button.css +++ /dev/null @@ -1,39 +0,0 @@ -button { - font: 18px "Trebuchet MS"; - background-color: #222; - background-image: -moz-linear-gradient(top, rgba(255,255,255,.25), rgba(255,255,255,.11)); - background-image: -webkit-gradient(linear,left top,left bottom,color-stop(0, rgba(255,255,255,.25)),color-stop(1, rgba(255,255,255,.11))); - background-image: -webkit-linear-gradient(rgba(255,255,255,.25), rgba(255,255,255,.11)); - color: #fff; - text-rendering: optimizeLegibility; - text-shadow: 0 -1px 1px #222; - padding: 3px 5px 3px 5px; - border: 0; - border-radius: 6px; - border-bottom: 1px solid #222; - margin: 0; - -moz-box-shadow: 0 1px 3px #999; - -webkit-box-shadow: 0 1px 3px #999; - box-shadow: 0 1px 3px #999; - width: 150px; -} - -button.first { - border-top-left-radius: 6px; - border-bottom-left-radius: 6px; -} - -button.last { - border-top-right-radius: 6px; - border-bottom-right-radius: 6px; -} - -button.active { - background-color: rgb(65,102,133); -} - -button:hover { - background-color: grey; - cursor: pointer; -} - diff --git a/deep_sequencing_unit/source/core-plugins/downloader/1/as/webapps/downloader/html/d3.js b/deep_sequencing_unit/source/core-plugins/downloader/1/as/webapps/downloader/html/d3.js deleted file mode 100755 index 13abb6dbc6f9665c005209b8e09d0dc97266d1f7..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/source/core-plugins/downloader/1/as/webapps/downloader/html/d3.js +++ /dev/null @@ -1,4013 +0,0 @@ -(function(){if (!Date.now) Date.now = function() { - return +new Date; -}; -try { - document.createElement("div").style.setProperty("opacity", 0, ""); -} catch (error) { - var d3_style_prototype = CSSStyleDeclaration.prototype, - d3_style_setProperty = d3_style_prototype.setProperty; - d3_style_prototype.setProperty = function(name, value, priority) { - d3_style_setProperty.call(this, name, value + "", priority); - }; -} -d3 = {version: "2.1.3"}; // semver -var d3_arraySubclass = [].__proto__? - -// Until ECMAScript supports array subclassing, prototype injection works well. -function(array, prototype) { - array.__proto__ = prototype; -}: - -// And if your browser doesn't support __proto__, we'll use direct extension. -function(array, prototype) { - for (var property in prototype) array[property] = prototype[property]; -}; -function d3_this() { - return this; -} -d3.functor = function(v) { - return typeof v === "function" ? v : function() { return v; }; -}; -// A getter-setter method that preserves the appropriate `this` context. -d3.rebind = function(object, method) { - return function() { - var x = method.apply(object, arguments); - return arguments.length ? object : x; - }; -}; -d3.ascending = function(a, b) { - return a < b ? -1 : a > b ? 1 : a >= b ? 0 : NaN; -}; -d3.descending = function(a, b) { - return b < a ? -1 : b > a ? 1 : b >= a ? 0 : NaN; -}; -d3.min = function(array, f) { - var i = -1, - n = array.length, - a, - b; - if (arguments.length === 1) { - while (++i < n && ((a = array[i]) == null || a != a)) a = undefined; - while (++i < n) if ((b = array[i]) != null && a > b) a = b; - } else { - while (++i < n && ((a = f.call(array, array[i], i)) == null || a != a)) a = undefined; - while (++i < n) if ((b = f.call(array, array[i], i)) != null && a > b) a = b; - } - return a; -}; -d3.max = function(array, f) { - var i = -1, - n = array.length, - a, - b; - if (arguments.length === 1) { - while (++i < n && ((a = array[i]) == null || a != a)) a = undefined; - while (++i < n) if ((b = array[i]) != null && b > a) a = b; - } else { - while (++i < n && ((a = f.call(array, array[i], i)) == null || a != a)) a = undefined; - while (++i < n) if ((b = f.call(array, array[i], i)) != null && b > a) a = b; - } - return a; -}; -d3.sum = function(array, f) { - var s = 0, - n = array.length, - a, - i = -1; - - if (arguments.length === 1) { - while (++i < n) if (!isNaN(a = +array[i])) s += a; - } else { - while (++i < n) if (!isNaN(a = +f.call(array, array[i], i))) s += a; - } - - return s; -}; -// R-7 per <http://en.wikipedia.org/wiki/Quantile> -d3.quantile = function(values, p) { - var H = (values.length - 1) * p + 1, - h = Math.floor(H), - v = values[h - 1], - e = H - h; - return e ? v + e * (values[h] - v) : v; -}; -d3.zip = function() { - if (!(n = arguments.length)) return []; - for (var i = -1, m = d3.min(arguments, d3_zipLength), zips = new Array(m); ++i < m;) { - for (var j = -1, n, zip = zips[i] = new Array(n); ++j < n;) { - zip[j] = arguments[j][i]; - } - } - return zips; -}; - -function d3_zipLength(d) { - return d.length; -} -// Locate the insertion point for x in a to maintain sorted order. The -// arguments lo and hi may be used to specify a subset of the array which should -// be considered; by default the entire array is used. If x is already present -// in a, the insertion point will be before (to the left of) any existing -// entries. The return value is suitable for use as the first argument to -// `array.splice` assuming that a is already sorted. -// -// The returned insertion point i partitions the array a into two halves so that -// all v < x for v in a[lo:i] for the left side and all v >= x for v in a[i:hi] -// for the right side. -d3.bisectLeft = function(a, x, lo, hi) { - if (arguments.length < 3) lo = 0; - if (arguments.length < 4) hi = a.length; - while (lo < hi) { - var mid = (lo + hi) >> 1; - if (a[mid] < x) lo = mid + 1; - else hi = mid; - } - return lo; -}; - -// Similar to bisectLeft, but returns an insertion point which comes after (to -// the right of) any existing entries of x in a. -// -// The returned insertion point i partitions the array into two halves so that -// all v <= x for v in a[lo:i] for the left side and all v > x for v in a[i:hi] -// for the right side. -d3.bisect = -d3.bisectRight = function(a, x, lo, hi) { - if (arguments.length < 3) lo = 0; - if (arguments.length < 4) hi = a.length; - while (lo < hi) { - var mid = (lo + hi) >> 1; - if (x < a[mid]) hi = mid; - else lo = mid + 1; - } - return lo; -}; -d3.first = function(array, f) { - var i = 0, - n = array.length, - a = array[0], - b; - if (arguments.length === 1) f = d3.ascending; - while (++i < n) { - if (f.call(array, a, b = array[i]) > 0) { - a = b; - } - } - return a; -}; -d3.last = function(array, f) { - var i = 0, - n = array.length, - a = array[0], - b; - if (arguments.length === 1) f = d3.ascending; - while (++i < n) { - if (f.call(array, a, b = array[i]) <= 0) { - a = b; - } - } - return a; -}; -d3.nest = function() { - var nest = {}, - keys = [], - sortKeys = [], - sortValues, - rollup; - - function map(array, depth) { - if (depth >= keys.length) return rollup - ? rollup.call(nest, array) : (sortValues - ? array.sort(sortValues) - : array); - - var i = -1, - n = array.length, - key = keys[depth++], - keyValue, - object, - o = {}; - - while (++i < n) { - if ((keyValue = key(object = array[i])) in o) { - o[keyValue].push(object); - } else { - o[keyValue] = [object]; - } - } - - for (keyValue in o) { - o[keyValue] = map(o[keyValue], depth); - } - - return o; - } - - function entries(map, depth) { - if (depth >= keys.length) return map; - - var a = [], - sortKey = sortKeys[depth++], - key; - - for (key in map) { - a.push({key: key, values: entries(map[key], depth)}); - } - - if (sortKey) a.sort(function(a, b) { - return sortKey(a.key, b.key); - }); - - return a; - } - - nest.map = function(array) { - return map(array, 0); - }; - - nest.entries = function(array) { - return entries(map(array, 0), 0); - }; - - nest.key = function(d) { - keys.push(d); - return nest; - }; - - // Specifies the order for the most-recently specified key. - // Note: only applies to entries. Map keys are unordered! - nest.sortKeys = function(order) { - sortKeys[keys.length - 1] = order; - return nest; - }; - - // Specifies the order for leaf values. - // Applies to both maps and entries array. - nest.sortValues = function(order) { - sortValues = order; - return nest; - }; - - nest.rollup = function(f) { - rollup = f; - return nest; - }; - - return nest; -}; -d3.keys = function(map) { - var keys = []; - for (var key in map) keys.push(key); - return keys; -}; -d3.values = function(map) { - var values = []; - for (var key in map) values.push(map[key]); - return values; -}; -d3.entries = function(map) { - var entries = []; - for (var key in map) entries.push({key: key, value: map[key]}); - return entries; -}; -d3.permute = function(array, indexes) { - var permutes = [], - i = -1, - n = indexes.length; - while (++i < n) permutes[i] = array[indexes[i]]; - return permutes; -}; -d3.merge = function(arrays) { - return Array.prototype.concat.apply([], arrays); -}; -d3.split = function(array, f) { - var arrays = [], - values = [], - value, - i = -1, - n = array.length; - if (arguments.length < 2) f = d3_splitter; - while (++i < n) { - if (f.call(values, value = array[i], i)) { - values = []; - } else { - if (!values.length) arrays.push(values); - values.push(value); - } - } - return arrays; -}; - -function d3_splitter(d) { - return d == null; -} -function d3_collapse(s) { - return s.replace(/(^\s+)|(\s+$)/g, "").replace(/\s+/g, " "); -} -/** - * @param {number} start - * @param {number=} stop - * @param {number=} step - */ -d3.range = function(start, stop, step) { - if (arguments.length < 3) { - step = 1; - if (arguments.length < 2) { - stop = start; - start = 0; - } - } - if ((stop - start) / step == Infinity) throw new Error("infinite range"); - var range = [], - i = -1, - j; - if (step < 0) while ((j = start + step * ++i) > stop) range.push(j); - else while ((j = start + step * ++i) < stop) range.push(j); - return range; -}; -d3.requote = function(s) { - return s.replace(d3_requote_re, "\\$&"); -}; - -var d3_requote_re = /[\\\^\$\*\+\?\|\[\]\(\)\.\{\}]/g; -d3.round = function(x, n) { - return n - ? Math.round(x * Math.pow(10, n)) * Math.pow(10, -n) - : Math.round(x); -}; -d3.xhr = function(url, mime, callback) { - var req = new XMLHttpRequest; - if (arguments.length < 3) callback = mime; - else if (mime && req.overrideMimeType) req.overrideMimeType(mime); - req.open("GET", url, true); - req.onreadystatechange = function() { - if (req.readyState === 4) callback(req.status < 300 ? req : null); - }; - req.send(null); -}; -d3.text = function(url, mime, callback) { - function ready(req) { - callback(req && req.responseText); - } - if (arguments.length < 3) { - callback = mime; - mime = null; - } - d3.xhr(url, mime, ready); -}; -d3.json = function(url, callback) { - d3.text(url, "application/json", function(text) { - callback(text ? JSON.parse(text) : null); - }); -}; -d3.html = function(url, callback) { - d3.text(url, "text/html", function(text) { - if (text != null) { // Treat empty string as valid HTML. - var range = document.createRange(); - range.selectNode(document.body); - text = range.createContextualFragment(text); - } - callback(text); - }); -}; -d3.xml = function(url, mime, callback) { - function ready(req) { - callback(req && req.responseXML); - } - if (arguments.length < 3) { - callback = mime; - mime = null; - } - d3.xhr(url, mime, ready); -}; -d3.ns = { - - prefix: { - svg: "http://www.w3.org/2000/svg", - xhtml: "http://www.w3.org/1999/xhtml", - xlink: "http://www.w3.org/1999/xlink", - xml: "http://www.w3.org/XML/1998/namespace", - xmlns: "http://www.w3.org/2000/xmlns/" - }, - - qualify: function(name) { - var i = name.indexOf(":"); - return i < 0 ? name : { - space: d3.ns.prefix[name.substring(0, i)], - local: name.substring(i + 1) - }; - } - -}; -/** @param {...string} types */ -d3.dispatch = function(types) { - var dispatch = {}, - type; - for (var i = 0, n = arguments.length; i < n; i++) { - type = arguments[i]; - dispatch[type] = d3_dispatch(type); - } - return dispatch; -}; - -function d3_dispatch(type) { - var dispatch = {}, - listeners = []; - - dispatch.add = function(listener) { - for (var i = 0; i < listeners.length; i++) { - if (listeners[i].listener == listener) return dispatch; // already registered - } - listeners.push({listener: listener, on: true}); - return dispatch; - }; - - dispatch.remove = function(listener) { - for (var i = 0; i < listeners.length; i++) { - var l = listeners[i]; - if (l.listener == listener) { - l.on = false; - listeners = listeners.slice(0, i).concat(listeners.slice(i + 1)); - break; - } - } - return dispatch; - }; - - dispatch.dispatch = function() { - var ls = listeners; // defensive reference - for (var i = 0, n = ls.length; i < n; i++) { - var l = ls[i]; - if (l.on) l.listener.apply(this, arguments); - } - }; - - return dispatch; -}; -// TODO align -d3.format = function(specifier) { - var match = d3_format_re.exec(specifier), - fill = match[1] || " ", - sign = match[3] || "", - zfill = match[5], - width = +match[6], - comma = match[7], - precision = match[8], - type = match[9], - percentage = false, - integer = false; - - if (precision) precision = precision.substring(1); - - if (zfill) { - fill = "0"; // TODO align = "="; - if (comma) width -= Math.floor((width - 1) / 4); - } - - switch (type) { - case "n": comma = true; type = "g"; break; - case "%": percentage = true; type = "f"; break; - case "p": percentage = true; type = "r"; break; - case "d": integer = true; precision = "0"; break; - } - - type = d3_format_types[type] || d3_format_typeDefault; - - return function(value) { - var number = percentage ? value * 100 : +value, - negative = (number < 0) && (number = -number) ? "\u2212" : sign; - - // Return the empty string for floats formatted as ints. - if (integer && (number % 1)) return ""; - - // Convert the input value to the desired precision. - value = type(number, precision); - - // If the fill character is 0, the sign and group is applied after the fill. - if (zfill) { - var length = value.length + negative.length; - if (length < width) value = new Array(width - length + 1).join(fill) + value; - if (comma) value = d3_format_group(value); - value = negative + value; - } - - // Otherwise (e.g., space-filling), the sign and group is applied before. - else { - if (comma) value = d3_format_group(value); - value = negative + value; - var length = value.length; - if (length < width) value = new Array(width - length + 1).join(fill) + value; - } - if (percentage) value += "%"; - - return value; - }; -}; - -// [[fill]align][sign][#][0][width][,][.precision][type] -var d3_format_re = /(?:([^{])?([<>=^]))?([+\- ])?(#)?(0)?([0-9]+)?(,)?(\.[0-9]+)?([a-zA-Z%])?/; - -var d3_format_types = { - g: function(x, p) { return x.toPrecision(p); }, - e: function(x, p) { return x.toExponential(p); }, - f: function(x, p) { return x.toFixed(p); }, - r: function(x, p) { - var n = 1 + Math.floor(1e-15 + Math.log(x) / Math.LN10); - return d3.round(x, p - n).toFixed(Math.max(0, Math.min(20, p - n))); - } -}; - -function d3_format_typeDefault(x) { - return x + ""; -} - -// Apply comma grouping for thousands. -function d3_format_group(value) { - var i = value.lastIndexOf("."), - f = i >= 0 ? value.substring(i) : (i = value.length, ""), - t = []; - while (i > 0) t.push(value.substring(i -= 3, i + 3)); - return t.reverse().join(",") + f; -} -/* - * TERMS OF USE - EASING EQUATIONS - * - * Open source under the BSD License. - * - * Copyright 2001 Robert Penner - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * - Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * - * - Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * - Neither the name of the author nor the names of contributors may be used to - * endorse or promote products derived from this software without specific - * prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - */ - -var d3_ease_quad = d3_ease_poly(2), - d3_ease_cubic = d3_ease_poly(3); - -var d3_ease = { - linear: function() { return d3_ease_linear; }, - poly: d3_ease_poly, - quad: function() { return d3_ease_quad; }, - cubic: function() { return d3_ease_cubic; }, - sin: function() { return d3_ease_sin; }, - exp: function() { return d3_ease_exp; }, - circle: function() { return d3_ease_circle; }, - elastic: d3_ease_elastic, - back: d3_ease_back, - bounce: function() { return d3_ease_bounce; } -}; - -var d3_ease_mode = { - "in": function(f) { return f; }, - "out": d3_ease_reverse, - "in-out": d3_ease_reflect, - "out-in": function(f) { return d3_ease_reflect(d3_ease_reverse(f)); } -}; - -d3.ease = function(name) { - var i = name.indexOf("-"), - t = i >= 0 ? name.substring(0, i) : name, - m = i >= 0 ? name.substring(i + 1) : "in"; - return d3_ease_clamp(d3_ease_mode[m](d3_ease[t].apply(null, Array.prototype.slice.call(arguments, 1)))); -}; - -function d3_ease_clamp(f) { - return function(t) { - return t <= 0 ? 0 : t >= 1 ? 1 : f(t); - }; -} - -function d3_ease_reverse(f) { - return function(t) { - return 1 - f(1 - t); - }; -} - -function d3_ease_reflect(f) { - return function(t) { - return .5 * (t < .5 ? f(2 * t) : (2 - f(2 - 2 * t))); - }; -} - -function d3_ease_linear(t) { - return t; -} - -function d3_ease_poly(e) { - return function(t) { - return Math.pow(t, e); - } -} - -function d3_ease_sin(t) { - return 1 - Math.cos(t * Math.PI / 2); -} - -function d3_ease_exp(t) { - return Math.pow(2, 10 * (t - 1)); -} - -function d3_ease_circle(t) { - return 1 - Math.sqrt(1 - t * t); -} - -function d3_ease_elastic(a, p) { - var s; - if (arguments.length < 2) p = 0.45; - if (arguments.length < 1) { a = 1; s = p / 4; } - else s = p / (2 * Math.PI) * Math.asin(1 / a); - return function(t) { - return 1 + a * Math.pow(2, 10 * -t) * Math.sin((t - s) * 2 * Math.PI / p); - }; -} - -function d3_ease_back(s) { - if (!s) s = 1.70158; - return function(t) { - return t * t * ((s + 1) * t - s); - }; -} - -function d3_ease_bounce(t) { - return t < 1 / 2.75 ? 7.5625 * t * t - : t < 2 / 2.75 ? 7.5625 * (t -= 1.5 / 2.75) * t + .75 - : t < 2.5 / 2.75 ? 7.5625 * (t -= 2.25 / 2.75) * t + .9375 - : 7.5625 * (t -= 2.625 / 2.75) * t + .984375; -} -d3.event = null; -d3.interpolate = function(a, b) { - var i = d3.interpolators.length, f; - while (--i >= 0 && !(f = d3.interpolators[i](a, b))); - return f; -}; - -d3.interpolateNumber = function(a, b) { - b -= a; - return function(t) { return a + b * t; }; -}; - -d3.interpolateRound = function(a, b) { - b -= a; - return function(t) { return Math.round(a + b * t); }; -}; - -d3.interpolateString = function(a, b) { - var m, // current match - i, // current index - j, // current index (for coallescing) - s0 = 0, // start index of current string prefix - s1 = 0, // end index of current string prefix - s = [], // string constants and placeholders - q = [], // number interpolators - n, // q.length - o; - - // Reset our regular expression! - d3_interpolate_number.lastIndex = 0; - - // Find all numbers in b. - for (i = 0; m = d3_interpolate_number.exec(b); ++i) { - if (m.index) s.push(b.substring(s0, s1 = m.index)); - q.push({i: s.length, x: m[0]}); - s.push(null); - s0 = d3_interpolate_number.lastIndex; - } - if (s0 < b.length) s.push(b.substring(s0)); - - // Find all numbers in a. - for (i = 0, n = q.length; (m = d3_interpolate_number.exec(a)) && i < n; ++i) { - o = q[i]; - if (o.x == m[0]) { // The numbers match, so coallesce. - if (o.i) { - if (s[o.i + 1] == null) { // This match is followed by another number. - s[o.i - 1] += o.x; - s.splice(o.i, 1); - for (j = i + 1; j < n; ++j) q[j].i--; - } else { // This match is followed by a string, so coallesce twice. - s[o.i - 1] += o.x + s[o.i + 1]; - s.splice(o.i, 2); - for (j = i + 1; j < n; ++j) q[j].i -= 2; - } - } else { - if (s[o.i + 1] == null) { // This match is followed by another number. - s[o.i] = o.x; - } else { // This match is followed by a string, so coallesce twice. - s[o.i] = o.x + s[o.i + 1]; - s.splice(o.i + 1, 1); - for (j = i + 1; j < n; ++j) q[j].i--; - } - } - q.splice(i, 1); - n--; - i--; - } else { - o.x = d3.interpolateNumber(parseFloat(m[0]), parseFloat(o.x)); - } - } - - // Remove any numbers in b not found in a. - while (i < n) { - o = q.pop(); - if (s[o.i + 1] == null) { // This match is followed by another number. - s[o.i] = o.x; - } else { // This match is followed by a string, so coallesce twice. - s[o.i] = o.x + s[o.i + 1]; - s.splice(o.i + 1, 1); - } - n--; - } - - // Special optimization for only a single match. - if (s.length === 1) { - return s[0] == null ? q[0].x : function() { return b; }; - } - - // Otherwise, interpolate each of the numbers and rejoin the string. - return function(t) { - for (i = 0; i < n; ++i) s[(o = q[i]).i] = o.x(t); - return s.join(""); - }; -}; - -d3.interpolateRgb = function(a, b) { - a = d3.rgb(a); - b = d3.rgb(b); - var ar = a.r, - ag = a.g, - ab = a.b, - br = b.r - ar, - bg = b.g - ag, - bb = b.b - ab; - return function(t) { - return "rgb(" + Math.round(ar + br * t) - + "," + Math.round(ag + bg * t) - + "," + Math.round(ab + bb * t) - + ")"; - }; -}; - -// interpolates HSL space, but outputs RGB string (for compatibility) -d3.interpolateHsl = function(a, b) { - a = d3.hsl(a); - b = d3.hsl(b); - var h0 = a.h, - s0 = a.s, - l0 = a.l, - h1 = b.h - h0, - s1 = b.s - s0, - l1 = b.l - l0; - return function(t) { - return d3_hsl_rgb(h0 + h1 * t, s0 + s1 * t, l0 + l1 * t).toString(); - }; -}; - -d3.interpolateArray = function(a, b) { - var x = [], - c = [], - na = a.length, - nb = b.length, - n0 = Math.min(a.length, b.length), - i; - for (i = 0; i < n0; ++i) x.push(d3.interpolate(a[i], b[i])); - for (; i < na; ++i) c[i] = a[i]; - for (; i < nb; ++i) c[i] = b[i]; - return function(t) { - for (i = 0; i < n0; ++i) c[i] = x[i](t); - return c; - }; -}; - -d3.interpolateObject = function(a, b) { - var i = {}, - c = {}, - k; - for (k in a) { - if (k in b) { - i[k] = d3_interpolateByName(k)(a[k], b[k]); - } else { - c[k] = a[k]; - } - } - for (k in b) { - if (!(k in a)) { - c[k] = b[k]; - } - } - return function(t) { - for (k in i) c[k] = i[k](t); - return c; - }; -} - -var d3_interpolate_number = /[-+]?(?:\d+\.\d+|\d+\.|\.\d+|\d+)(?:[eE][-]?\d+)?/g, - d3_interpolate_rgb = {background: 1, fill: 1, stroke: 1}; - -function d3_interpolateByName(n) { - return n in d3_interpolate_rgb || /\bcolor\b/.test(n) - ? d3.interpolateRgb - : d3.interpolate; -} - -d3.interpolators = [ - d3.interpolateObject, - function(a, b) { return (b instanceof Array) && d3.interpolateArray(a, b); }, - function(a, b) { return (typeof b === "string") && d3.interpolateString(String(a), b); }, - function(a, b) { return (typeof b === "string" ? b in d3_rgb_names || /^(#|rgb\(|hsl\()/.test(b) : b instanceof d3_Rgb || b instanceof d3_Hsl) && d3.interpolateRgb(String(a), b); }, - function(a, b) { return (typeof b === "number") && d3.interpolateNumber(+a, b); } -]; -function d3_uninterpolateNumber(a, b) { - b = b - (a = +a) ? 1 / (b - a) : 0; - return function(x) { return (x - a) * b; }; -} - -function d3_uninterpolateClamp(a, b) { - b = b - (a = +a) ? 1 / (b - a) : 0; - return function(x) { return Math.max(0, Math.min(1, (x - a) * b)); }; -} -d3.rgb = function(r, g, b) { - return arguments.length === 1 - ? d3_rgb_parse("" + r, d3_rgb, d3_hsl_rgb) - : d3_rgb(~~r, ~~g, ~~b); -}; - -function d3_rgb(r, g, b) { - return new d3_Rgb(r, g, b); -} - -function d3_Rgb(r, g, b) { - this.r = r; - this.g = g; - this.b = b; -} - -d3_Rgb.prototype.brighter = function(k) { - k = Math.pow(0.7, arguments.length ? k : 1); - var r = this.r, - g = this.g, - b = this.b, - i = 30; - if (!r && !g && !b) return d3_rgb(i, i, i); - if (r && r < i) r = i; - if (g && g < i) g = i; - if (b && b < i) b = i; - return d3_rgb( - Math.min(255, Math.floor(r / k)), - Math.min(255, Math.floor(g / k)), - Math.min(255, Math.floor(b / k))); -}; - -d3_Rgb.prototype.darker = function(k) { - k = Math.pow(0.7, arguments.length ? k : 1); - return d3_rgb( - Math.max(0, Math.floor(k * this.r)), - Math.max(0, Math.floor(k * this.g)), - Math.max(0, Math.floor(k * this.b))); -}; - -d3_Rgb.prototype.hsl = function() { - return d3_rgb_hsl(this.r, this.g, this.b); -}; - -d3_Rgb.prototype.toString = function() { - return "#" + d3_rgb_hex(this.r) + d3_rgb_hex(this.g) + d3_rgb_hex(this.b); -}; - -function d3_rgb_hex(v) { - return v < 0x10 ? "0" + v.toString(16) : v.toString(16); -} - -function d3_rgb_parse(format, rgb, hsl) { - var r = 0, // red channel; int in [0, 255] - g = 0, // green channel; int in [0, 255] - b = 0, // blue channel; int in [0, 255] - m1, // CSS color specification match - m2, // CSS color specification type (e.g., rgb) - name; - - /* Handle hsl, rgb. */ - m1 = /([a-z]+)\((.*)\)/i.exec(format); - if (m1) { - m2 = m1[2].split(","); - switch (m1[1]) { - case "hsl": { - return hsl( - parseFloat(m2[0]), // degrees - parseFloat(m2[1]) / 100, // percentage - parseFloat(m2[2]) / 100 // percentage - ); - } - case "rgb": { - return rgb( - d3_rgb_parseNumber(m2[0]), - d3_rgb_parseNumber(m2[1]), - d3_rgb_parseNumber(m2[2]) - ); - } - } - } - - /* Named colors. */ - if (name = d3_rgb_names[format]) return rgb(name.r, name.g, name.b); - - /* Hexadecimal colors: #rgb and #rrggbb. */ - if (format != null && format.charAt(0) === "#") { - if (format.length === 4) { - r = format.charAt(1); r += r; - g = format.charAt(2); g += g; - b = format.charAt(3); b += b; - } else if (format.length === 7) { - r = format.substring(1, 3); - g = format.substring(3, 5); - b = format.substring(5, 7); - } - r = parseInt(r, 16); - g = parseInt(g, 16); - b = parseInt(b, 16); - } - - return rgb(r, g, b); -} - -function d3_rgb_hsl(r, g, b) { - var min = Math.min(r /= 255, g /= 255, b /= 255), - max = Math.max(r, g, b), - d = max - min, - h, - s, - l = (max + min) / 2; - if (d) { - s = l < .5 ? d / (max + min) : d / (2 - max - min); - if (r == max) h = (g - b) / d + (g < b ? 6 : 0); - else if (g == max) h = (b - r) / d + 2; - else h = (r - g) / d + 4; - h *= 60; - } else { - s = h = 0; - } - return d3_hsl(h, s, l); -} - -function d3_rgb_parseNumber(c) { // either integer or percentage - var f = parseFloat(c); - return c.charAt(c.length - 1) === "%" ? Math.round(f * 2.55) : f; -} - -var d3_rgb_names = { - aliceblue: "#f0f8ff", - antiquewhite: "#faebd7", - aqua: "#00ffff", - aquamarine: "#7fffd4", - azure: "#f0ffff", - beige: "#f5f5dc", - bisque: "#ffe4c4", - black: "#000000", - blanchedalmond: "#ffebcd", - blue: "#0000ff", - blueviolet: "#8a2be2", - brown: "#a52a2a", - burlywood: "#deb887", - cadetblue: "#5f9ea0", - chartreuse: "#7fff00", - chocolate: "#d2691e", - coral: "#ff7f50", - cornflowerblue: "#6495ed", - cornsilk: "#fff8dc", - crimson: "#dc143c", - cyan: "#00ffff", - darkblue: "#00008b", - darkcyan: "#008b8b", - darkgoldenrod: "#b8860b", - darkgray: "#a9a9a9", - darkgreen: "#006400", - darkgrey: "#a9a9a9", - darkkhaki: "#bdb76b", - darkmagenta: "#8b008b", - darkolivegreen: "#556b2f", - darkorange: "#ff8c00", - darkorchid: "#9932cc", - darkred: "#8b0000", - darksalmon: "#e9967a", - darkseagreen: "#8fbc8f", - darkslateblue: "#483d8b", - darkslategray: "#2f4f4f", - darkslategrey: "#2f4f4f", - darkturquoise: "#00ced1", - darkviolet: "#9400d3", - deeppink: "#ff1493", - deepskyblue: "#00bfff", - dimgray: "#696969", - dimgrey: "#696969", - dodgerblue: "#1e90ff", - firebrick: "#b22222", - floralwhite: "#fffaf0", - forestgreen: "#228b22", - fuchsia: "#ff00ff", - gainsboro: "#dcdcdc", - ghostwhite: "#f8f8ff", - gold: "#ffd700", - goldenrod: "#daa520", - gray: "#808080", - green: "#008000", - greenyellow: "#adff2f", - grey: "#808080", - honeydew: "#f0fff0", - hotpink: "#ff69b4", - indianred: "#cd5c5c", - indigo: "#4b0082", - ivory: "#fffff0", - khaki: "#f0e68c", - lavender: "#e6e6fa", - lavenderblush: "#fff0f5", - lawngreen: "#7cfc00", - lemonchiffon: "#fffacd", - lightblue: "#add8e6", - lightcoral: "#f08080", - lightcyan: "#e0ffff", - lightgoldenrodyellow: "#fafad2", - lightgray: "#d3d3d3", - lightgreen: "#90ee90", - lightgrey: "#d3d3d3", - lightpink: "#ffb6c1", - lightsalmon: "#ffa07a", - lightseagreen: "#20b2aa", - lightskyblue: "#87cefa", - lightslategray: "#778899", - lightslategrey: "#778899", - lightsteelblue: "#b0c4de", - lightyellow: "#ffffe0", - lime: "#00ff00", - limegreen: "#32cd32", - linen: "#faf0e6", - magenta: "#ff00ff", - maroon: "#800000", - mediumaquamarine: "#66cdaa", - mediumblue: "#0000cd", - mediumorchid: "#ba55d3", - mediumpurple: "#9370db", - mediumseagreen: "#3cb371", - mediumslateblue: "#7b68ee", - mediumspringgreen: "#00fa9a", - mediumturquoise: "#48d1cc", - mediumvioletred: "#c71585", - midnightblue: "#191970", - mintcream: "#f5fffa", - mistyrose: "#ffe4e1", - moccasin: "#ffe4b5", - navajowhite: "#ffdead", - navy: "#000080", - oldlace: "#fdf5e6", - olive: "#808000", - olivedrab: "#6b8e23", - orange: "#ffa500", - orangered: "#ff4500", - orchid: "#da70d6", - palegoldenrod: "#eee8aa", - palegreen: "#98fb98", - paleturquoise: "#afeeee", - palevioletred: "#db7093", - papayawhip: "#ffefd5", - peachpuff: "#ffdab9", - peru: "#cd853f", - pink: "#ffc0cb", - plum: "#dda0dd", - powderblue: "#b0e0e6", - purple: "#800080", - red: "#ff0000", - rosybrown: "#bc8f8f", - royalblue: "#4169e1", - saddlebrown: "#8b4513", - salmon: "#fa8072", - sandybrown: "#f4a460", - seagreen: "#2e8b57", - seashell: "#fff5ee", - sienna: "#a0522d", - silver: "#c0c0c0", - skyblue: "#87ceeb", - slateblue: "#6a5acd", - slategray: "#708090", - slategrey: "#708090", - snow: "#fffafa", - springgreen: "#00ff7f", - steelblue: "#4682b4", - tan: "#d2b48c", - teal: "#008080", - thistle: "#d8bfd8", - tomato: "#ff6347", - turquoise: "#40e0d0", - violet: "#ee82ee", - wheat: "#f5deb3", - white: "#ffffff", - whitesmoke: "#f5f5f5", - yellow: "#ffff00", - yellowgreen: "#9acd32" -}; - -for (var d3_rgb_name in d3_rgb_names) { - d3_rgb_names[d3_rgb_name] = d3_rgb_parse( - d3_rgb_names[d3_rgb_name], - d3_rgb, - d3_hsl_rgb); -} -d3.hsl = function(h, s, l) { - return arguments.length === 1 - ? d3_rgb_parse("" + h, d3_rgb_hsl, d3_hsl) - : d3_hsl(+h, +s, +l); -}; - -function d3_hsl(h, s, l) { - return new d3_Hsl(h, s, l); -} - -function d3_Hsl(h, s, l) { - this.h = h; - this.s = s; - this.l = l; -} - -d3_Hsl.prototype.brighter = function(k) { - k = Math.pow(0.7, arguments.length ? k : 1); - return d3_hsl(this.h, this.s, this.l / k); -}; - -d3_Hsl.prototype.darker = function(k) { - k = Math.pow(0.7, arguments.length ? k : 1); - return d3_hsl(this.h, this.s, k * this.l); -}; - -d3_Hsl.prototype.rgb = function() { - return d3_hsl_rgb(this.h, this.s, this.l); -}; - -d3_Hsl.prototype.toString = function() { - return "hsl(" + this.h + "," + this.s * 100 + "%," + this.l * 100 + "%)"; -}; - -function d3_hsl_rgb(h, s, l) { - var m1, - m2; - - /* Some simple corrections for h, s and l. */ - h = h % 360; if (h < 0) h += 360; - s = s < 0 ? 0 : s > 1 ? 1 : s; - l = l < 0 ? 0 : l > 1 ? 1 : l; - - /* From FvD 13.37, CSS Color Module Level 3 */ - m2 = l <= .5 ? l * (1 + s) : l + s - l * s; - m1 = 2 * l - m2; - - function v(h) { - if (h > 360) h -= 360; - else if (h < 0) h += 360; - if (h < 60) return m1 + (m2 - m1) * h / 60; - if (h < 180) return m2; - if (h < 240) return m1 + (m2 - m1) * (240 - h) / 60; - return m1; - } - - function vv(h) { - return Math.round(v(h) * 255); - } - - return d3_rgb(vv(h + 120), vv(h), vv(h - 120)); -} -function d3_selection(groups) { - d3_arraySubclass(groups, d3_selectionPrototype); - return groups; -} - -var d3_select = function(s, n) { return n.querySelector(s); }, - d3_selectAll = function(s, n) { return n.querySelectorAll(s); }; - -// Prefer Sizzle, if available. -if (typeof Sizzle === "function") { - d3_select = function(s, n) { return Sizzle(s, n)[0]; }; - d3_selectAll = function(s, n) { return Sizzle.uniqueSort(Sizzle(s, n)); }; -} - -var d3_selectionPrototype = []; - -d3.selection = function() { - return d3_selectionRoot; -}; - -d3.selection.prototype = d3_selectionPrototype; -d3_selectionPrototype.select = function(selector) { - var subgroups = [], - subgroup, - subnode, - group, - node; - - if (typeof selector !== "function") selector = d3_selection_selector(selector); - - for (var j = -1, m = this.length; ++j < m;) { - subgroups.push(subgroup = []); - subgroup.parentNode = (group = this[j]).parentNode; - for (var i = -1, n = group.length; ++i < n;) { - if (node = group[i]) { - subgroup.push(subnode = selector.call(node, node.__data__, i)); - if (subnode && "__data__" in node) subnode.__data__ = node.__data__; - } else { - subgroup.push(null); - } - } - } - - return d3_selection(subgroups); -}; - -function d3_selection_selector(selector) { - return function() { - return d3_select(selector, this); - }; -} -d3_selectionPrototype.selectAll = function(selector) { - var subgroups = [], - subgroup, - node; - - if (typeof selector !== "function") selector = d3_selection_selectorAll(selector); - - for (var j = -1, m = this.length; ++j < m;) { - for (var group = this[j], i = -1, n = group.length; ++i < n;) { - if (node = group[i]) { - subgroups.push(subgroup = selector.call(node, node.__data__, i)); - subgroup.parentNode = node; - } - } - } - - return d3_selection(subgroups); -}; - -function d3_selection_selectorAll(selector) { - return function() { - return d3_selectAll(selector, this); - }; -} -d3_selectionPrototype.attr = function(name, value) { - name = d3.ns.qualify(name); - - // If no value is specified, return the first value. - if (arguments.length < 2) { - var node = this.node(); - return name.local - ? node.getAttributeNS(name.space, name.local) - : node.getAttribute(name); - } - - function attrNull() { - this.removeAttribute(name); - } - - function attrNullNS() { - this.removeAttributeNS(name.space, name.local); - } - - function attrConstant() { - this.setAttribute(name, value); - } - - function attrConstantNS() { - this.setAttributeNS(name.space, name.local, value); - } - - function attrFunction() { - var x = value.apply(this, arguments); - if (x == null) this.removeAttribute(name); - else this.setAttribute(name, x); - } - - function attrFunctionNS() { - var x = value.apply(this, arguments); - if (x == null) this.removeAttributeNS(name.space, name.local); - else this.setAttributeNS(name.space, name.local, x); - } - - return this.each(value == null - ? (name.local ? attrNullNS : attrNull) : (typeof value === "function" - ? (name.local ? attrFunctionNS : attrFunction) - : (name.local ? attrConstantNS : attrConstant))); -}; -d3_selectionPrototype.classed = function(name, value) { - var re = new RegExp("(^|\\s+)" + d3.requote(name) + "(\\s+|$)", "g"); - - // If no value is specified, return the first value. - if (arguments.length < 2) { - var node = this.node(); - if (c = node.classList) return c.contains(name); - var c = node.className; - re.lastIndex = 0; - return re.test(c.baseVal != null ? c.baseVal : c); - } - - function classedAdd() { - if (c = this.classList) return c.add(name); - var c = this.className, - cb = c.baseVal != null, - cv = cb ? c.baseVal : c; - re.lastIndex = 0; - if (!re.test(cv)) { - cv = d3_collapse(cv + " " + name); - if (cb) c.baseVal = cv; - else this.className = cv; - } - } - - function classedRemove() { - if (c = this.classList) return c.remove(name); - var c = this.className, - cb = c.baseVal != null, - cv = cb ? c.baseVal : c; - cv = d3_collapse(cv.replace(re, " ")); - if (cb) c.baseVal = cv; - else this.className = cv; - } - - function classedFunction() { - (value.apply(this, arguments) - ? classedAdd - : classedRemove).call(this); - } - - return this.each(typeof value === "function" - ? classedFunction : value - ? classedAdd - : classedRemove); -}; -d3_selectionPrototype.style = function(name, value, priority) { - if (arguments.length < 3) priority = ""; - - // If no value is specified, return the first value. - if (arguments.length < 2) return window - .getComputedStyle(this.node(), null) - .getPropertyValue(name); - - function styleNull() { - this.style.removeProperty(name); - } - - function styleConstant() { - this.style.setProperty(name, value, priority); - } - - function styleFunction() { - var x = value.apply(this, arguments); - if (x == null) this.style.removeProperty(name); - else this.style.setProperty(name, x, priority); - } - - return this.each(value == null - ? styleNull : (typeof value === "function" - ? styleFunction : styleConstant)); -}; -d3_selectionPrototype.property = function(name, value) { - - // If no value is specified, return the first value. - if (arguments.length < 2) return this.node()[name]; - - function propertyNull() { - delete this[name]; - } - - function propertyConstant() { - this[name] = value; - } - - function propertyFunction() { - var x = value.apply(this, arguments); - if (x == null) delete this[name]; - else this[name] = x; - } - - return this.each(value == null - ? propertyNull : (typeof value === "function" - ? propertyFunction : propertyConstant)); -}; -d3_selectionPrototype.text = function(value) { - return arguments.length < 1 ? this.node().textContent - : (this.each(typeof value === "function" - ? function() { this.textContent = value.apply(this, arguments); } - : function() { this.textContent = value; })); -}; -d3_selectionPrototype.html = function(value) { - return arguments.length < 1 ? this.node().innerHTML - : (this.each(typeof value === "function" - ? function() { this.innerHTML = value.apply(this, arguments); } - : function() { this.innerHTML = value; })); -}; -// TODO append(node)? -// TODO append(function)? -d3_selectionPrototype.append = function(name) { - name = d3.ns.qualify(name); - - function append() { - return this.appendChild(document.createElement(name)); - } - - function appendNS() { - return this.appendChild(document.createElementNS(name.space, name.local)); - } - - return this.select(name.local ? appendNS : append); -}; -// TODO insert(node, function)? -// TODO insert(function, string)? -// TODO insert(function, function)? -d3_selectionPrototype.insert = function(name, before) { - name = d3.ns.qualify(name); - - function insert() { - return this.insertBefore( - document.createElement(name), - d3_select(before, this)); - } - - function insertNS() { - return this.insertBefore( - document.createElementNS(name.space, name.local), - d3_select(before, this)); - } - - return this.select(name.local ? insertNS : insert); -}; -// TODO remove(selector)? -// TODO remove(node)? -// TODO remove(function)? -d3_selectionPrototype.remove = function() { - return this.each(function() { - var parent = this.parentNode; - if (parent) parent.removeChild(this); - }); -}; -// TODO data(null) for clearing data? -d3_selectionPrototype.data = function(data, join) { - var enter = [], - update = [], - exit = []; - - function bind(group, groupData) { - var i, - n = group.length, - m = groupData.length, - n0 = Math.min(n, m), - n1 = Math.max(n, m), - updateNodes = [], - enterNodes = [], - exitNodes = [], - node, - nodeData; - - if (join) { - var nodeByKey = {}, - keys = [], - key, - j = groupData.length; - - for (i = -1; ++i < n;) { - key = join.call(node = group[i], node.__data__, i); - if (key in nodeByKey) { - exitNodes[j++] = node; // duplicate key - } else { - nodeByKey[key] = node; - } - keys.push(key); - } - - for (i = -1; ++i < m;) { - node = nodeByKey[key = join.call(groupData, nodeData = groupData[i], i)]; - if (node) { - node.__data__ = nodeData; - updateNodes[i] = node; - enterNodes[i] = exitNodes[i] = null; - } else { - enterNodes[i] = d3_selection_dataNode(nodeData); - updateNodes[i] = exitNodes[i] = null; - } - delete nodeByKey[key]; - } - - for (i = -1; ++i < n;) { - if (keys[i] in nodeByKey) { - exitNodes[i] = group[i]; - } - } - } else { - for (i = -1; ++i < n0;) { - node = group[i]; - nodeData = groupData[i]; - if (node) { - node.__data__ = nodeData; - updateNodes[i] = node; - enterNodes[i] = exitNodes[i] = null; - } else { - enterNodes[i] = d3_selection_dataNode(nodeData); - updateNodes[i] = exitNodes[i] = null; - } - } - for (; i < m; ++i) { - enterNodes[i] = d3_selection_dataNode(groupData[i]); - updateNodes[i] = exitNodes[i] = null; - } - for (; i < n1; ++i) { - exitNodes[i] = group[i]; - enterNodes[i] = updateNodes[i] = null; - } - } - - enterNodes.update - = updateNodes; - - enterNodes.parentNode - = updateNodes.parentNode - = exitNodes.parentNode - = group.parentNode; - - enter.push(enterNodes); - update.push(updateNodes); - exit.push(exitNodes); - } - - var i = -1, - n = this.length, - group; - if (typeof data === "function") { - while (++i < n) { - bind(group = this[i], data.call(group, group.parentNode.__data__, i)); - } - } else { - while (++i < n) { - bind(group = this[i], data); - } - } - - var selection = d3_selection(update); - selection.enter = function() { return d3_selection_enter(enter); }; - selection.exit = function() { return d3_selection(exit); }; - return selection; -}; - -function d3_selection_dataNode(data) { - return {__data__: data}; -} -function d3_selection_enter(selection) { - d3_arraySubclass(selection, d3_selection_enterPrototype); - return selection; -} - -var d3_selection_enterPrototype = []; - -d3_selection_enterPrototype.append = d3_selectionPrototype.append; -d3_selection_enterPrototype.insert = d3_selectionPrototype.insert; -d3_selection_enterPrototype.empty = d3_selectionPrototype.empty; -d3_selection_enterPrototype.select = function(selector) { - var subgroups = [], - subgroup, - subnode, - upgroup, - group, - node; - - for (var j = -1, m = this.length; ++j < m;) { - upgroup = (group = this[j]).update; - subgroups.push(subgroup = []); - subgroup.parentNode = group.parentNode; - for (var i = -1, n = group.length; ++i < n;) { - if (node = group[i]) { - subgroup.push(upgroup[i] = subnode = selector.call(group.parentNode, node.__data__, i)); - subnode.__data__ = node.__data__; - } else { - subgroup.push(null); - } - } - } - - return d3_selection(subgroups); -}; -// TODO preserve null elements to maintain index? -d3_selectionPrototype.filter = function(filter) { - var subgroups = [], - subgroup, - group, - node; - - for (var j = 0, m = this.length; j < m; j++) { - subgroups.push(subgroup = []); - subgroup.parentNode = (group = this[j]).parentNode; - for (var i = 0, n = group.length; i < n; i++) { - if ((node = group[i]) && filter.call(node, node.__data__, i)) { - subgroup.push(node); - } - } - } - - return d3_selection(subgroups); -}; -d3_selectionPrototype.map = function(map) { - return this.each(function() { - this.__data__ = map.apply(this, arguments); - }); -}; -d3_selectionPrototype.sort = function(comparator) { - comparator = d3_selection_sortComparator.apply(this, arguments); - for (var j = 0, m = this.length; j < m; j++) { - for (var group = this[j].sort(comparator), i = 1, n = group.length, prev = group[0]; i < n; i++) { - var node = group[i]; - if (node) { - if (prev) prev.parentNode.insertBefore(node, prev.nextSibling); - prev = node; - } - } - } - return this; -}; - -function d3_selection_sortComparator(comparator) { - if (!arguments.length) comparator = d3.ascending; - return function(a, b) { - return comparator(a && a.__data__, b && b.__data__); - }; -} -// type can be namespaced, e.g., "click.foo" -// listener can be null for removal -d3_selectionPrototype.on = function(type, listener, capture) { - if (arguments.length < 3) capture = false; - - // parse the type specifier - var name = "__on" + type, i = type.indexOf("."); - if (i > 0) type = type.substring(0, i); - - // if called with only one argument, return the current listener - if (arguments.length < 2) return (i = this.node()[name]) && i._; - - // remove the old event listener, and add the new event listener - return this.each(function(d, i) { - var node = this; - - if (node[name]) node.removeEventListener(type, node[name], capture); - if (listener) node.addEventListener(type, node[name] = l, capture); - - // wrapped event listener that preserves i - function l(e) { - var o = d3.event; // Events can be reentrant (e.g., focus). - d3.event = e; - try { - listener.call(node, node.__data__, i); - } finally { - d3.event = o; - } - } - - // stash the unwrapped listener for retrieval - l._ = listener; - }); -}; -d3_selectionPrototype.each = function(callback) { - for (var j = -1, m = this.length; ++j < m;) { - for (var group = this[j], i = -1, n = group.length; ++i < n;) { - var node = group[i]; - if (node) callback.call(node, node.__data__, i, j); - } - } - return this; -}; -// -// Note: assigning to the arguments array simultaneously changes the value of -// the corresponding argument! -// -// TODO The `this` argument probably shouldn't be the first argument to the -// callback, anyway, since it's redundant. However, that will require a major -// version bump due to backwards compatibility, so I'm not changing it right -// away. -// -d3_selectionPrototype.call = function(callback) { - callback.apply(this, (arguments[0] = this, arguments)); - return this; -}; -d3_selectionPrototype.empty = function() { - return !this.node(); -}; -d3_selectionPrototype.node = function(callback) { - for (var j = 0, m = this.length; j < m; j++) { - for (var group = this[j], i = 0, n = group.length; i < n; i++) { - var node = group[i]; - if (node) return node; - } - } - return null; -}; -d3_selectionPrototype.transition = function() { - var subgroups = [], - subgroup, - node; - - for (var j = -1, m = this.length; ++j < m;) { - subgroups.push(subgroup = []); - for (var group = this[j], i = -1, n = group.length; ++i < n;) { - subgroup.push((node = group[i]) ? {node: node, delay: 0, duration: 250} : null); - } - } - - return d3_transition(subgroups, d3_transitionInheritId || ++d3_transitionId); -}; -var d3_selectionRoot = d3_selection([[document]]); - -d3_selectionRoot[0].parentNode = document.documentElement; - -// TODO fast singleton implementation! -d3.select = function(selector) { - return typeof selector === "string" - ? d3_selectionRoot.select(selector) - : d3_selection([[selector]]); // assume node -}; - -d3.selectAll = function(selector) { - return typeof selector === "string" - ? d3_selectionRoot.selectAll(selector) - : d3_selection([selector]); // assume node[] -}; -function d3_transition(groups, id) { - d3_arraySubclass(groups, d3_transitionPrototype); - - var tweens = {}, - event = d3.dispatch("start", "end"), - ease = d3_transitionEase, - then = Date.now(); - - groups.id = id; - - groups.tween = function(name, tween) { - if (arguments.length < 2) return tweens[name]; - if (tween == null) delete tweens[name]; - else tweens[name] = tween; - return groups; - }; - - groups.ease = function(value) { - if (!arguments.length) return ease; - ease = typeof value === "function" ? value : d3.ease.apply(d3, arguments); - return groups; - }; - - groups.each = function(type, listener) { - if (arguments.length < 2) return d3_transition_each.call(groups, type); - event[type].add(listener); - return groups; - }; - - d3.timer(function(elapsed) { - groups.each(function(d, i, j) { - var tweened = [], - node = this, - delay = groups[j][i].delay, - duration = groups[j][i].duration, - lock = node.__transition__ || (node.__transition__ = {active: 0, count: 0}); - - ++lock.count; - - delay <= elapsed ? start(elapsed) : d3.timer(start, delay, then); - - function start(elapsed) { - if (lock.active > id) return stop(); - lock.active = id; - - for (var tween in tweens) { - if (tween = tweens[tween].call(node, d, i)) { - tweened.push(tween); - } - } - - event.start.dispatch.call(node, d, i); - if (!tick(elapsed)) d3.timer(tick, 0, then); - return 1; - } - - function tick(elapsed) { - if (lock.active !== id) return stop(); - - var t = (elapsed - delay) / duration, - e = ease(t), - n = tweened.length; - - while (n > 0) { - tweened[--n].call(node, e); - } - - if (t >= 1) { - stop(); - d3_transitionInheritId = id; - event.end.dispatch.call(node, d, i); - d3_transitionInheritId = 0; - return 1; - } - } - - function stop() { - if (!--lock.count) delete node.__transition__; - return 1; - } - }); - return 1; - }, 0, then); - - return groups; -} - -function d3_transitionTween(b) { - return typeof b === "function" - ? function(d, i, a) { var v = b.call(this, d, i) + ""; return a != v && d3.interpolate(a, v); } - : (b = b + "", function(d, i, a) { return a != b && d3.interpolate(a, b); }); -} - -var d3_transitionPrototype = [], - d3_transitionId = 0, - d3_transitionInheritId = 0, - d3_transitionEase = d3.ease("cubic-in-out"); - -d3_transitionPrototype.call = d3_selectionPrototype.call; - -d3.transition = function() { - return d3_selectionRoot.transition(); -}; - -d3.transition.prototype = d3_transitionPrototype; -d3_transitionPrototype.select = function(selector) { - var subgroups = [], - subgroup, - subnode, - node; - - if (typeof selector !== "function") selector = d3_selection_selector(selector); - - for (var j = -1, m = this.length; ++j < m;) { - subgroups.push(subgroup = []); - for (var group = this[j], i = -1, n = group.length; ++i < n;) { - if ((node = group[i]) && (subnode = selector.call(node.node, node.node.__data__, i))) { - if ("__data__" in node.node) subnode.__data__ = node.node.__data__; - subgroup.push({node: subnode, delay: node.delay, duration: node.duration}); - } else { - subgroup.push(null); - } - } - } - - return d3_transition(subgroups, this.id).ease(this.ease()); -}; -d3_transitionPrototype.selectAll = function(selector) { - var subgroups = [], - subgroup, - node; - - if (typeof selector !== "function") selector = d3_selection_selectorAll(selector); - - for (var j = -1, m = this.length; ++j < m;) { - for (var group = this[j], i = -1, n = group.length; ++i < n;) { - if (node = group[i]) { - subgroups.push(subgroup = selector.call(node.node, node.node.__data__, i)); - for (var k = -1, o = subgroup.length; ++k < o;) { - subgroup[k] = {node: subgroup[k], delay: node.delay, duration: node.duration}; - } - } - } - } - - return d3_transition(subgroups, this.id).ease(this.ease()); -}; -d3_transitionPrototype.attr = function(name, value) { - return this.attrTween(name, d3_transitionTween(value)); -}; - -d3_transitionPrototype.attrTween = function(name, tween) { - name = d3.ns.qualify(name); - - function attrTween(d, i) { - var f = tween.call(this, d, i, this.getAttribute(name)); - return f && function(t) { - this.setAttribute(name, f(t)); - }; - } - - function attrTweenNS(d, i) { - var f = tween.call(this, d, i, this.getAttributeNS(name.space, name.local)); - return f && function(t) { - this.setAttributeNS(name.space, name.local, f(t)); - }; - } - - return this.tween("attr." + name, name.local ? attrTweenNS : attrTween); -}; -d3_transitionPrototype.style = function(name, value, priority) { - if (arguments.length < 3) priority = ""; - return this.styleTween(name, d3_transitionTween(value), priority); -}; - -d3_transitionPrototype.styleTween = function(name, tween, priority) { - if (arguments.length < 3) priority = ""; - return this.tween("style." + name, function(d, i) { - var f = tween.call(this, d, i, window.getComputedStyle(this, null).getPropertyValue(name)); - return f && function(t) { - this.style.setProperty(name, f(t), priority); - }; - }); -}; -d3_transitionPrototype.text = function(value) { - return this.tween("text", function(d, i) { - this.textContent = typeof value === "function" - ? value.call(this, d, i) - : value; - }); -}; -d3_transitionPrototype.remove = function() { - return this.each("end", function() { - var p; - if (!this.__transition__ && (p = this.parentNode)) p.removeChild(this); - }); -}; -d3_transitionPrototype.delay = function(value) { - var groups = this; - return groups.each(typeof value === "function" - ? function(d, i, j) { groups[j][i].delay = +value.apply(this, arguments); } - : (value = +value, function(d, i, j) { groups[j][i].delay = value; })); -}; -d3_transitionPrototype.duration = function(value) { - var groups = this; - return groups.each(typeof value === "function" - ? function(d, i, j) { groups[j][i].duration = +value.apply(this, arguments); } - : (value = +value, function(d, i, j) { groups[j][i].duration = value; })); -}; -function d3_transition_each(callback) { - for (var j = 0, m = this.length; j < m; j++) { - for (var group = this[j], i = 0, n = group.length; i < n; i++) { - var node = group[i]; - if (node) callback.call(node = node.node, node.__data__, i, j); - } - } - return this; -} -d3_transitionPrototype.transition = function() { - return this.select(d3_this); -}; -var d3_timer_queue = null, - d3_timer_interval, // is an interval (or frame) active? - d3_timer_timeout; // is a timeout active? - -// The timer will continue to fire until callback returns true. -d3.timer = function(callback, delay, then) { - var found = false, - t0, - t1 = d3_timer_queue; - - if (arguments.length < 3) { - if (arguments.length < 2) delay = 0; - else if (!isFinite(delay)) return; - then = Date.now(); - } - - // See if the callback's already in the queue. - while (t1) { - if (t1.callback === callback) { - t1.then = then; - t1.delay = delay; - found = true; - break; - } - t0 = t1; - t1 = t1.next; - } - - // Otherwise, add the callback to the queue. - if (!found) d3_timer_queue = { - callback: callback, - then: then, - delay: delay, - next: d3_timer_queue - }; - - // Start animatin'! - if (!d3_timer_interval) { - d3_timer_timeout = clearTimeout(d3_timer_timeout); - d3_timer_interval = 1; - d3_timer_frame(d3_timer_step); - } -} - -function d3_timer_step() { - var elapsed, - now = Date.now(), - t1 = d3_timer_queue; - - while (t1) { - elapsed = now - t1.then; - if (elapsed >= t1.delay) t1.flush = t1.callback(elapsed); - t1 = t1.next; - } - - var delay = d3_timer_flush() - now; - if (delay > 24) { - if (isFinite(delay)) { - clearTimeout(d3_timer_timeout); - d3_timer_timeout = setTimeout(d3_timer_step, delay); - } - d3_timer_interval = 0; - } else { - d3_timer_interval = 1; - d3_timer_frame(d3_timer_step); - } -} - -d3.timer.flush = function() { - var elapsed, - now = Date.now(), - t1 = d3_timer_queue; - - while (t1) { - elapsed = now - t1.then; - if (!t1.delay) t1.flush = t1.callback(elapsed); - t1 = t1.next; - } - - d3_timer_flush(); -}; - -// Flush after callbacks, to avoid concurrent queue modification. -function d3_timer_flush() { - var t0 = null, - t1 = d3_timer_queue, - then = Infinity; - while (t1) { - if (t1.flush) { - t1 = t0 ? t0.next = t1.next : d3_timer_queue = t1.next; - } else { - then = Math.min(then, t1.then + t1.delay); - t1 = (t0 = t1).next; - } - } - return then; -} - -var d3_timer_frame = window.requestAnimationFrame - || window.webkitRequestAnimationFrame - || window.mozRequestAnimationFrame - || window.oRequestAnimationFrame - || window.msRequestAnimationFrame - || function(callback) { setTimeout(callback, 17); }; -function d3_noop() {} -d3.scale = {}; - -function d3_scaleExtent(domain) { - var start = domain[0], stop = domain[domain.length - 1]; - return start < stop ? [start, stop] : [stop, start]; -} -function d3_scale_nice(domain, nice) { - var i0 = 0, - i1 = domain.length - 1, - x0 = domain[i0], - x1 = domain[i1], - dx; - - if (x1 < x0) { - dx = i0; i0 = i1; i1 = dx; - dx = x0; x0 = x1; x1 = dx; - } - - nice = nice(x1 - x0); - domain[i0] = nice.floor(x0); - domain[i1] = nice.ceil(x1); - return domain; -} - -function d3_scale_niceDefault() { - return Math; -} -d3.scale.linear = function() { - return d3_scale_linear([0, 1], [0, 1], d3.interpolate, false); -}; - -function d3_scale_linear(domain, range, interpolate, clamp) { - var output, - input; - - function rescale() { - var linear = domain.length == 2 ? d3_scale_bilinear : d3_scale_polylinear, - uninterpolate = clamp ? d3_uninterpolateClamp : d3_uninterpolateNumber; - output = linear(domain, range, uninterpolate, interpolate); - input = linear(range, domain, uninterpolate, d3.interpolate); - return scale; - } - - function scale(x) { - return output(x); - } - - // Note: requires range is coercible to number! - scale.invert = function(y) { - return input(y); - }; - - scale.domain = function(x) { - if (!arguments.length) return domain; - domain = x.map(Number); - return rescale(); - }; - - scale.range = function(x) { - if (!arguments.length) return range; - range = x; - return rescale(); - }; - - scale.rangeRound = function(x) { - return scale.range(x).interpolate(d3.interpolateRound); - }; - - scale.clamp = function(x) { - if (!arguments.length) return clamp; - clamp = x; - return rescale(); - }; - - scale.interpolate = function(x) { - if (!arguments.length) return interpolate; - interpolate = x; - return rescale(); - }; - - scale.ticks = function(m) { - return d3_scale_linearTicks(domain, m); - }; - - scale.tickFormat = function(m) { - return d3_scale_linearTickFormat(domain, m); - }; - - scale.nice = function() { - d3_scale_nice(domain, d3_scale_linearNice); - return rescale(); - }; - - scale.copy = function() { - return d3_scale_linear(domain, range, interpolate, clamp); - }; - - return rescale(); -}; - -function d3_scale_linearRebind(scale, linear) { - scale.range = d3.rebind(scale, linear.range); - scale.rangeRound = d3.rebind(scale, linear.rangeRound); - scale.interpolate = d3.rebind(scale, linear.interpolate); - scale.clamp = d3.rebind(scale, linear.clamp); - return scale; -} - -function d3_scale_linearNice(dx) { - dx = Math.pow(10, Math.round(Math.log(dx) / Math.LN10) - 1); - return { - floor: function(x) { return Math.floor(x / dx) * dx; }, - ceil: function(x) { return Math.ceil(x / dx) * dx; } - }; -} - -// TODO Dates? Ugh. -function d3_scale_linearTickRange(domain, m) { - var extent = d3_scaleExtent(domain), - span = extent[1] - extent[0], - step = Math.pow(10, Math.floor(Math.log(span / m) / Math.LN10)), - err = m / span * step; - - // Filter ticks to get closer to the desired count. - if (err <= .15) step *= 10; - else if (err <= .35) step *= 5; - else if (err <= .75) step *= 2; - - // Round start and stop values to step interval. - extent[0] = Math.ceil(extent[0] / step) * step; - extent[1] = Math.floor(extent[1] / step) * step + step * .5; // inclusive - extent[2] = step; - return extent; -} - -function d3_scale_linearTicks(domain, m) { - return d3.range.apply(d3, d3_scale_linearTickRange(domain, m)); -} - -function d3_scale_linearTickFormat(domain, m) { - return d3.format(",." + Math.max(0, -Math.floor(Math.log(d3_scale_linearTickRange(domain, m)[2]) / Math.LN10 + .01)) + "f"); -} -function d3_scale_bilinear(domain, range, uninterpolate, interpolate) { - var u = uninterpolate(domain[0], domain[1]), - i = interpolate(range[0], range[1]); - return function(x) { - return i(u(x)); - }; -} -function d3_scale_polylinear(domain, range, uninterpolate, interpolate) { - var u = [], - i = [], - j = 0, - n = domain.length; - - while (++j < n) { - u.push(uninterpolate(domain[j - 1], domain[j])); - i.push(interpolate(range[j - 1], range[j])); - } - - return function(x) { - var j = d3.bisect(domain, x, 1, domain.length - 1) - 1; - return i[j](u[j](x)); - }; -} -d3.scale.log = function() { - return d3_scale_log(d3.scale.linear(), d3_scale_logp); -}; - -function d3_scale_log(linear, log) { - var pow = log.pow; - - function scale(x) { - return linear(log(x)); - } - - scale.invert = function(x) { - return pow(linear.invert(x)); - }; - - scale.domain = function(x) { - if (!arguments.length) return linear.domain().map(pow); - log = x[0] < 0 ? d3_scale_logn : d3_scale_logp; - pow = log.pow; - linear.domain(x.map(log)); - return scale; - }; - - scale.nice = function() { - linear.domain(d3_scale_nice(linear.domain(), d3_scale_niceDefault)); - return scale; - }; - - scale.ticks = function() { - var extent = d3_scaleExtent(linear.domain()), - ticks = []; - if (extent.every(isFinite)) { - var i = Math.floor(extent[0]), - j = Math.ceil(extent[1]), - u = pow(extent[0]), - v = pow(extent[1]); - if (log === d3_scale_logn) { - ticks.push(pow(i)); - for (; i++ < j;) for (var k = 9; k > 0; k--) ticks.push(pow(i) * k); - } else { - for (; i < j; i++) for (var k = 1; k < 10; k++) ticks.push(pow(i) * k); - ticks.push(pow(i)); - } - for (i = 0; ticks[i] < u; i++) {} // strip small values - for (j = ticks.length; ticks[j - 1] > v; j--) {} // strip big values - ticks = ticks.slice(i, j); - } - return ticks; - }; - - scale.tickFormat = function() { - return d3_scale_logTickFormat; - }; - - scale.copy = function() { - return d3_scale_log(linear.copy(), log); - }; - - return d3_scale_linearRebind(scale, linear); -}; - -function d3_scale_logp(x) { - return Math.log(x) / Math.LN10; -} - -function d3_scale_logn(x) { - return -Math.log(-x) / Math.LN10; -} - -d3_scale_logp.pow = function(x) { - return Math.pow(10, x); -}; - -d3_scale_logn.pow = function(x) { - return -Math.pow(10, -x); -}; - -function d3_scale_logTickFormat(d) { - return d.toPrecision(1); -} -d3.scale.pow = function() { - return d3_scale_pow(d3.scale.linear(), 1); -}; - -function d3_scale_pow(linear, exponent) { - var powp = d3_scale_powPow(exponent), - powb = d3_scale_powPow(1 / exponent); - - function scale(x) { - return linear(powp(x)); - } - - scale.invert = function(x) { - return powb(linear.invert(x)); - }; - - scale.domain = function(x) { - if (!arguments.length) return linear.domain().map(powb); - linear.domain(x.map(powp)); - return scale; - }; - - scale.ticks = function(m) { - return d3_scale_linearTicks(scale.domain(), m); - }; - - scale.tickFormat = function(m) { - return d3_scale_linearTickFormat(scale.domain(), m); - }; - - scale.nice = function() { - return scale.domain(d3_scale_nice(scale.domain(), d3_scale_linearNice)); - }; - - scale.exponent = function(x) { - if (!arguments.length) return exponent; - var domain = scale.domain(); - powp = d3_scale_powPow(exponent = x); - powb = d3_scale_powPow(1 / exponent); - return scale.domain(domain); - }; - - scale.copy = function() { - return d3_scale_pow(linear.copy(), exponent); - }; - - return d3_scale_linearRebind(scale, linear); -}; - -function d3_scale_powPow(e) { - return function(x) { - return x < 0 ? -Math.pow(-x, e) : Math.pow(x, e); - }; -} -d3.scale.sqrt = function() { - return d3.scale.pow().exponent(.5); -}; -d3.scale.ordinal = function() { - return d3_scale_ordinal([], {t: "range", x: []}); -}; - -function d3_scale_ordinal(domain, ranger) { - var index, - range, - rangeBand; - - function scale(x) { - return range[((index[x] || (index[x] = domain.push(x))) - 1) % range.length]; - } - - scale.domain = function(x) { - if (!arguments.length) return domain; - domain = []; - index = {}; - var i = -1, n = x.length, xi; - while (++i < n) if (!index[xi = x[i]]) index[xi] = domain.push(xi); - return scale[ranger.t](ranger.x, ranger.p); - }; - - scale.range = function(x) { - if (!arguments.length) return range; - range = x; - rangeBand = 0; - ranger = {t: "range", x: x}; - return scale; - }; - - scale.rangePoints = function(x, padding) { - if (arguments.length < 2) padding = 0; - var start = x[0], - stop = x[1], - step = (stop - start) / (domain.length - 1 + padding); - range = domain.length < 2 ? [(start + stop) / 2] : d3.range(start + step * padding / 2, stop + step / 2, step); - rangeBand = 0; - ranger = {t: "rangePoints", x: x, p: padding}; - return scale; - }; - - scale.rangeBands = function(x, padding) { - if (arguments.length < 2) padding = 0; - var start = x[0], - stop = x[1], - step = (stop - start) / (domain.length + padding); - range = d3.range(start + step * padding, stop, step); - rangeBand = step * (1 - padding); - ranger = {t: "rangeBands", x: x, p: padding}; - return scale; - }; - - scale.rangeRoundBands = function(x, padding) { - if (arguments.length < 2) padding = 0; - var start = x[0], - stop = x[1], - step = Math.floor((stop - start) / (domain.length + padding)), - err = stop - start - (domain.length - padding) * step; - range = d3.range(start + Math.round(err / 2), stop, step); - rangeBand = Math.round(step * (1 - padding)); - ranger = {t: "rangeRoundBands", x: x, p: padding}; - return scale; - }; - - scale.rangeBand = function() { - return rangeBand; - }; - - scale.copy = function() { - return d3_scale_ordinal(domain, ranger); - }; - - return scale.domain(domain); -}; -/* - * This product includes color specifications and designs developed by Cynthia - * Brewer (http://colorbrewer.org/). See lib/colorbrewer for more information. - */ - -d3.scale.category10 = function() { - return d3.scale.ordinal().range(d3_category10); -}; - -d3.scale.category20 = function() { - return d3.scale.ordinal().range(d3_category20); -}; - -d3.scale.category20b = function() { - return d3.scale.ordinal().range(d3_category20b); -}; - -d3.scale.category20c = function() { - return d3.scale.ordinal().range(d3_category20c); -}; - -var d3_category10 = [ - "#1f77b4", "#ff7f0e", "#2ca02c", "#d62728", "#9467bd", - "#8c564b", "#e377c2", "#7f7f7f", "#bcbd22", "#17becf" -]; - -var d3_category20 = [ - "#1f77b4", "#aec7e8", - "#ff7f0e", "#ffbb78", - "#2ca02c", "#98df8a", - "#d62728", "#ff9896", - "#9467bd", "#c5b0d5", - "#8c564b", "#c49c94", - "#e377c2", "#f7b6d2", - "#7f7f7f", "#c7c7c7", - "#bcbd22", "#dbdb8d", - "#17becf", "#9edae5" -]; - -var d3_category20b = [ - "#393b79", "#5254a3", "#6b6ecf", "#9c9ede", - "#637939", "#8ca252", "#b5cf6b", "#cedb9c", - "#8c6d31", "#bd9e39", "#e7ba52", "#e7cb94", - "#843c39", "#ad494a", "#d6616b", "#e7969c", - "#7b4173", "#a55194", "#ce6dbd", "#de9ed6" -]; - -var d3_category20c = [ - "#3182bd", "#6baed6", "#9ecae1", "#c6dbef", - "#e6550d", "#fd8d3c", "#fdae6b", "#fdd0a2", - "#31a354", "#74c476", "#a1d99b", "#c7e9c0", - "#756bb1", "#9e9ac8", "#bcbddc", "#dadaeb", - "#636363", "#969696", "#bdbdbd", "#d9d9d9" -]; -d3.scale.quantile = function() { - return d3_scale_quantile([], []); -}; - -function d3_scale_quantile(domain, range) { - var thresholds; - - function rescale() { - var k = 0, - n = domain.length, - q = range.length; - thresholds = []; - while (++k < q) thresholds[k - 1] = d3.quantile(domain, k / q); - return scale; - } - - function scale(x) { - if (isNaN(x = +x)) return NaN; - return range[d3.bisect(thresholds, x)]; - } - - scale.domain = function(x) { - if (!arguments.length) return domain; - domain = x.filter(function(d) { return !isNaN(d); }).sort(d3.ascending); - return rescale(); - }; - - scale.range = function(x) { - if (!arguments.length) return range; - range = x; - return rescale(); - }; - - scale.quantiles = function() { - return thresholds; - }; - - scale.copy = function() { - return d3_scale_quantile(domain, range); // copy on write! - }; - - return rescale(); -}; -d3.scale.quantize = function() { - return d3_scale_quantize(0, 1, [0, 1]); -}; - -function d3_scale_quantize(x0, x1, range) { - var kx, i; - - function scale(x) { - return range[Math.max(0, Math.min(i, Math.floor(kx * (x - x0))))]; - } - - function rescale() { - kx = range.length / (x1 - x0); - i = range.length - 1; - return scale; - } - - scale.domain = function(x) { - if (!arguments.length) return [x0, x1]; - x0 = +x[0]; - x1 = +x[x.length - 1]; - return rescale(); - }; - - scale.range = function(x) { - if (!arguments.length) return range; - range = x; - return rescale(); - }; - - scale.copy = function() { - return d3_scale_quantize(x0, x1, range); // copy on write - }; - - return rescale(); -}; -d3.svg = {}; -d3.svg.arc = function() { - var innerRadius = d3_svg_arcInnerRadius, - outerRadius = d3_svg_arcOuterRadius, - startAngle = d3_svg_arcStartAngle, - endAngle = d3_svg_arcEndAngle; - - function arc() { - var r0 = innerRadius.apply(this, arguments), - r1 = outerRadius.apply(this, arguments), - a0 = startAngle.apply(this, arguments) + d3_svg_arcOffset, - a1 = endAngle.apply(this, arguments) + d3_svg_arcOffset, - da = (a1 < a0 && (da = a0, a0 = a1, a1 = da), a1 - a0), - df = da < Math.PI ? "0" : "1", - c0 = Math.cos(a0), - s0 = Math.sin(a0), - c1 = Math.cos(a1), - s1 = Math.sin(a1); - return da >= d3_svg_arcMax - ? (r0 - ? "M0," + r1 - + "A" + r1 + "," + r1 + " 0 1,1 0," + (-r1) - + "A" + r1 + "," + r1 + " 0 1,1 0," + r1 - + "M0," + r0 - + "A" + r0 + "," + r0 + " 0 1,0 0," + (-r0) - + "A" + r0 + "," + r0 + " 0 1,0 0," + r0 - + "Z" - : "M0," + r1 - + "A" + r1 + "," + r1 + " 0 1,1 0," + (-r1) - + "A" + r1 + "," + r1 + " 0 1,1 0," + r1 - + "Z") - : (r0 - ? "M" + r1 * c0 + "," + r1 * s0 - + "A" + r1 + "," + r1 + " 0 " + df + ",1 " + r1 * c1 + "," + r1 * s1 - + "L" + r0 * c1 + "," + r0 * s1 - + "A" + r0 + "," + r0 + " 0 " + df + ",0 " + r0 * c0 + "," + r0 * s0 - + "Z" - : "M" + r1 * c0 + "," + r1 * s0 - + "A" + r1 + "," + r1 + " 0 " + df + ",1 " + r1 * c1 + "," + r1 * s1 - + "L0,0" - + "Z"); - } - - arc.innerRadius = function(v) { - if (!arguments.length) return innerRadius; - innerRadius = d3.functor(v); - return arc; - }; - - arc.outerRadius = function(v) { - if (!arguments.length) return outerRadius; - outerRadius = d3.functor(v); - return arc; - }; - - arc.startAngle = function(v) { - if (!arguments.length) return startAngle; - startAngle = d3.functor(v); - return arc; - }; - - arc.endAngle = function(v) { - if (!arguments.length) return endAngle; - endAngle = d3.functor(v); - return arc; - }; - - arc.centroid = function() { - var r = (innerRadius.apply(this, arguments) - + outerRadius.apply(this, arguments)) / 2, - a = (startAngle.apply(this, arguments) - + endAngle.apply(this, arguments)) / 2 + d3_svg_arcOffset; - return [Math.cos(a) * r, Math.sin(a) * r]; - }; - - return arc; -}; - -var d3_svg_arcOffset = -Math.PI / 2, - d3_svg_arcMax = 2 * Math.PI - 1e-6; - -function d3_svg_arcInnerRadius(d) { - return d.innerRadius; -} - -function d3_svg_arcOuterRadius(d) { - return d.outerRadius; -} - -function d3_svg_arcStartAngle(d) { - return d.startAngle; -} - -function d3_svg_arcEndAngle(d) { - return d.endAngle; -} -function d3_svg_line(projection) { - var x = d3_svg_lineX, - y = d3_svg_lineY, - interpolate = "linear", - interpolator = d3_svg_lineInterpolators[interpolate], - tension = .7; - - function line(d) { - return d.length < 1 ? null : "M" + interpolator(projection(d3_svg_linePoints(this, d, x, y)), tension); - } - - line.x = function(v) { - if (!arguments.length) return x; - x = v; - return line; - }; - - line.y = function(v) { - if (!arguments.length) return y; - y = v; - return line; - }; - - line.interpolate = function(v) { - if (!arguments.length) return interpolate; - interpolator = d3_svg_lineInterpolators[interpolate = v]; - return line; - }; - - line.tension = function(v) { - if (!arguments.length) return tension; - tension = v; - return line; - }; - - return line; -} - -d3.svg.line = function() { - return d3_svg_line(Object); -}; - -// Converts the specified array of data into an array of points -// (x-y tuples), by evaluating the specified `x` and `y` functions on each -// data point. The `this` context of the evaluated functions is the specified -// "self" object; each function is passed the current datum and index. -function d3_svg_linePoints(self, d, x, y) { - var points = [], - i = -1, - n = d.length, - fx = typeof x === "function", - fy = typeof y === "function", - value; - if (fx && fy) { - while (++i < n) points.push([ - x.call(self, value = d[i], i), - y.call(self, value, i) - ]); - } else if (fx) { - while (++i < n) points.push([x.call(self, d[i], i), y]); - } else if (fy) { - while (++i < n) points.push([x, y.call(self, d[i], i)]); - } else { - while (++i < n) points.push([x, y]); - } - return points; -} - -// The default `x` property, which references d[0]. -function d3_svg_lineX(d) { - return d[0]; -} - -// The default `y` property, which references d[1]. -function d3_svg_lineY(d) { - return d[1]; -} - -// The various interpolators supported by the `line` class. -var d3_svg_lineInterpolators = { - "linear": d3_svg_lineLinear, - "step-before": d3_svg_lineStepBefore, - "step-after": d3_svg_lineStepAfter, - "basis": d3_svg_lineBasis, - "basis-open": d3_svg_lineBasisOpen, - "basis-closed": d3_svg_lineBasisClosed, - "bundle": d3_svg_lineBundle, - "cardinal": d3_svg_lineCardinal, - "cardinal-open": d3_svg_lineCardinalOpen, - "cardinal-closed": d3_svg_lineCardinalClosed, - "monotone": d3_svg_lineMonotone -}; - -// Linear interpolation; generates "L" commands. -function d3_svg_lineLinear(points) { - var path = [], - i = 0, - n = points.length, - p = points[0]; - path.push(p[0], ",", p[1]); - while (++i < n) path.push("L", (p = points[i])[0], ",", p[1]); - return path.join(""); -} - -// Step interpolation; generates "H" and "V" commands. -function d3_svg_lineStepBefore(points) { - var path = [], - i = 0, - n = points.length, - p = points[0]; - path.push(p[0], ",", p[1]); - while (++i < n) path.push("V", (p = points[i])[1], "H", p[0]); - return path.join(""); -} - -// Step interpolation; generates "H" and "V" commands. -function d3_svg_lineStepAfter(points) { - var path = [], - i = 0, - n = points.length, - p = points[0]; - path.push(p[0], ",", p[1]); - while (++i < n) path.push("H", (p = points[i])[0], "V", p[1]); - return path.join(""); -} - -// Open cardinal spline interpolation; generates "C" commands. -function d3_svg_lineCardinalOpen(points, tension) { - return points.length < 4 - ? d3_svg_lineLinear(points) - : points[1] + d3_svg_lineHermite(points.slice(1, points.length - 1), - d3_svg_lineCardinalTangents(points, tension)); -} - -// Closed cardinal spline interpolation; generates "C" commands. -function d3_svg_lineCardinalClosed(points, tension) { - return points.length < 3 - ? d3_svg_lineLinear(points) - : points[0] + d3_svg_lineHermite((points.push(points[0]), points), - d3_svg_lineCardinalTangents([points[points.length - 2]] - .concat(points, [points[1]]), tension)); -} - -// Cardinal spline interpolation; generates "C" commands. -function d3_svg_lineCardinal(points, tension, closed) { - return points.length < 3 - ? d3_svg_lineLinear(points) - : points[0] + d3_svg_lineHermite(points, - d3_svg_lineCardinalTangents(points, tension)); -} - -// Hermite spline construction; generates "C" commands. -function d3_svg_lineHermite(points, tangents) { - if (tangents.length < 1 - || (points.length != tangents.length - && points.length != tangents.length + 2)) { - return d3_svg_lineLinear(points); - } - - var quad = points.length != tangents.length, - path = "", - p0 = points[0], - p = points[1], - t0 = tangents[0], - t = t0, - pi = 1; - - if (quad) { - path += "Q" + (p[0] - t0[0] * 2 / 3) + "," + (p[1] - t0[1] * 2 / 3) - + "," + p[0] + "," + p[1]; - p0 = points[1]; - pi = 2; - } - - if (tangents.length > 1) { - t = tangents[1]; - p = points[pi]; - pi++; - path += "C" + (p0[0] + t0[0]) + "," + (p0[1] + t0[1]) - + "," + (p[0] - t[0]) + "," + (p[1] - t[1]) - + "," + p[0] + "," + p[1]; - for (var i = 2; i < tangents.length; i++, pi++) { - p = points[pi]; - t = tangents[i]; - path += "S" + (p[0] - t[0]) + "," + (p[1] - t[1]) - + "," + p[0] + "," + p[1]; - } - } - - if (quad) { - var lp = points[pi]; - path += "Q" + (p[0] + t[0] * 2 / 3) + "," + (p[1] + t[1] * 2 / 3) - + "," + lp[0] + "," + lp[1]; - } - - return path; -} - -// Generates tangents for a cardinal spline. -function d3_svg_lineCardinalTangents(points, tension) { - var tangents = [], - a = (1 - tension) / 2, - p0, - p1 = points[0], - p2 = points[1], - i = 1, - n = points.length; - while (++i < n) { - p0 = p1; - p1 = p2; - p2 = points[i]; - tangents.push([a * (p2[0] - p0[0]), a * (p2[1] - p0[1])]); - } - return tangents; -} - -// B-spline interpolation; generates "C" commands. -function d3_svg_lineBasis(points) { - if (points.length < 3) return d3_svg_lineLinear(points); - var path = [], - i = 1, - n = points.length, - pi = points[0], - x0 = pi[0], - y0 = pi[1], - px = [x0, x0, x0, (pi = points[1])[0]], - py = [y0, y0, y0, pi[1]]; - path.push(x0, ",", y0); - d3_svg_lineBasisBezier(path, px, py); - while (++i < n) { - pi = points[i]; - px.shift(); px.push(pi[0]); - py.shift(); py.push(pi[1]); - d3_svg_lineBasisBezier(path, px, py); - } - i = -1; - while (++i < 2) { - px.shift(); px.push(pi[0]); - py.shift(); py.push(pi[1]); - d3_svg_lineBasisBezier(path, px, py); - } - return path.join(""); -} - -// Open B-spline interpolation; generates "C" commands. -function d3_svg_lineBasisOpen(points) { - if (points.length < 4) return d3_svg_lineLinear(points); - var path = [], - i = -1, - n = points.length, - pi, - px = [0], - py = [0]; - while (++i < 3) { - pi = points[i]; - px.push(pi[0]); - py.push(pi[1]); - } - path.push(d3_svg_lineDot4(d3_svg_lineBasisBezier3, px) - + "," + d3_svg_lineDot4(d3_svg_lineBasisBezier3, py)); - --i; while (++i < n) { - pi = points[i]; - px.shift(); px.push(pi[0]); - py.shift(); py.push(pi[1]); - d3_svg_lineBasisBezier(path, px, py); - } - return path.join(""); -} - -// Closed B-spline interpolation; generates "C" commands. -function d3_svg_lineBasisClosed(points) { - var path, - i = -1, - n = points.length, - m = n + 4, - pi, - px = [], - py = []; - while (++i < 4) { - pi = points[i % n]; - px.push(pi[0]); - py.push(pi[1]); - } - path = [ - d3_svg_lineDot4(d3_svg_lineBasisBezier3, px), ",", - d3_svg_lineDot4(d3_svg_lineBasisBezier3, py) - ]; - --i; while (++i < m) { - pi = points[i % n]; - px.shift(); px.push(pi[0]); - py.shift(); py.push(pi[1]); - d3_svg_lineBasisBezier(path, px, py); - } - return path.join(""); -} - -function d3_svg_lineBundle(points, tension) { - var n = points.length - 1, - x0 = points[0][0], - y0 = points[0][1], - dx = points[n][0] - x0, - dy = points[n][1] - y0, - i = -1, - p, - t; - while (++i <= n) { - p = points[i]; - t = i / n; - p[0] = tension * p[0] + (1 - tension) * (x0 + t * dx); - p[1] = tension * p[1] + (1 - tension) * (y0 + t * dy); - } - return d3_svg_lineBasis(points); -} - -// Returns the dot product of the given four-element vectors. -function d3_svg_lineDot4(a, b) { - return a[0] * b[0] + a[1] * b[1] + a[2] * b[2] + a[3] * b[3]; -} - -// Matrix to transform basis (b-spline) control points to bezier -// control points. Derived from FvD 11.2.8. -var d3_svg_lineBasisBezier1 = [0, 2/3, 1/3, 0], - d3_svg_lineBasisBezier2 = [0, 1/3, 2/3, 0], - d3_svg_lineBasisBezier3 = [0, 1/6, 2/3, 1/6]; - -// Pushes a "C" Bézier curve onto the specified path array, given the -// two specified four-element arrays which define the control points. -function d3_svg_lineBasisBezier(path, x, y) { - path.push( - "C", d3_svg_lineDot4(d3_svg_lineBasisBezier1, x), - ",", d3_svg_lineDot4(d3_svg_lineBasisBezier1, y), - ",", d3_svg_lineDot4(d3_svg_lineBasisBezier2, x), - ",", d3_svg_lineDot4(d3_svg_lineBasisBezier2, y), - ",", d3_svg_lineDot4(d3_svg_lineBasisBezier3, x), - ",", d3_svg_lineDot4(d3_svg_lineBasisBezier3, y)); -} - -// Computes the slope from points p0 to p1. -function d3_svg_lineSlope(p0, p1) { - return (p1[1] - p0[1]) / (p1[0] - p0[0]); -} - -// Compute three-point differences for the given points. -// http://en.wikipedia.org/wiki/Cubic_Hermite_spline#Finite_difference -function d3_svg_lineFiniteDifferences(points) { - var i = 0, - j = points.length - 1, - m = [], - p0 = points[0], - p1 = points[1], - d = m[0] = d3_svg_lineSlope(p0, p1); - while (++i < j) { - m[i] = d + (d = d3_svg_lineSlope(p0 = p1, p1 = points[i + 1])); - } - m[i] = d; - return m; -} - -// Interpolates the given points using Fritsch-Carlson Monotone cubic Hermite -// interpolation. Returns an array of tangent vectors. For details, see -// http://en.wikipedia.org/wiki/Monotone_cubic_interpolation -function d3_svg_lineMonotoneTangents(points) { - var tangents = [], - d, - a, - b, - s, - m = d3_svg_lineFiniteDifferences(points), - i = -1, - j = points.length - 1; - - // The first two steps are done by computing finite-differences: - // 1. Compute the slopes of the secant lines between successive points. - // 2. Initialize the tangents at every point as the average of the secants. - - // Then, for each segment… - while (++i < j) { - d = d3_svg_lineSlope(points[i], points[i + 1]); - - // 3. If two successive yk = y{k + 1} are equal (i.e., d is zero), then set - // mk = m{k + 1} = 0 as the spline connecting these points must be flat to - // preserve monotonicity. Ignore step 4 and 5 for those k. - - if (Math.abs(d) < 1e-6) { - m[i] = m[i + 1] = 0; - } else { - // 4. Let ak = mk / dk and bk = m{k + 1} / dk. - a = m[i] / d; - b = m[i + 1] / d; - - // 5. Prevent overshoot and ensure monotonicity by restricting the - // magnitude of vector <ak, bk> to a circle of radius 3. - s = a * a + b * b; - if (s > 9) { - s = d * 3 / Math.sqrt(s); - m[i] = s * a; - m[i + 1] = s * b; - } - } - } - - // Compute the normalized tangent vector from the slopes. Note that if x is - // not monotonic, it's possible that the slope will be infinite, so we protect - // against NaN by setting the coordinate to zero. - i = -1; while (++i <= j) { - s = (points[Math.min(j, i + 1)][0] - points[Math.max(0, i - 1)][0]) - / (6 * (1 + m[i] * m[i])); - tangents.push([s || 0, m[i] * s || 0]); - } - - return tangents; -} - -function d3_svg_lineMonotone(points) { - return points.length < 3 - ? d3_svg_lineLinear(points) - : points[0] + - d3_svg_lineHermite(points, d3_svg_lineMonotoneTangents(points)); -} -d3.svg.line.radial = function() { - var line = d3_svg_line(d3_svg_lineRadial); - line.radius = line.x, delete line.x; - line.angle = line.y, delete line.y; - return line; -}; - -function d3_svg_lineRadial(points) { - var point, - i = -1, - n = points.length, - r, - a; - while (++i < n) { - point = points[i]; - r = point[0]; - a = point[1] + d3_svg_arcOffset; - point[0] = r * Math.cos(a); - point[1] = r * Math.sin(a); - } - return points; -} -function d3_svg_area(projection) { - var x0 = d3_svg_lineX, - x1 = d3_svg_lineX, - y0 = 0, - y1 = d3_svg_lineY, - interpolate = "linear", - interpolator = d3_svg_lineInterpolators[interpolate], - tension = .7; - - function area(d) { - if (d.length < 1) return null; - var points0 = d3_svg_linePoints(this, d, x0, y0), - points1 = d3_svg_linePoints(this, d, x0 === x1 ? d3_svg_areaX(points0) : x1, y0 === y1 ? d3_svg_areaY(points0) : y1); - return "M" + interpolator(projection(points1), tension) - + "L" + interpolator(projection(points0.reverse()), tension) - + "Z"; - } - - area.x = function(x) { - if (!arguments.length) return x1; - x0 = x1 = x; - return area; - }; - - area.x0 = function(x) { - if (!arguments.length) return x0; - x0 = x; - return area; - }; - - area.x1 = function(x) { - if (!arguments.length) return x1; - x1 = x; - return area; - }; - - area.y = function(y) { - if (!arguments.length) return y1; - y0 = y1 = y; - return area; - }; - - area.y0 = function(y) { - if (!arguments.length) return y0; - y0 = y; - return area; - }; - - area.y1 = function(y) { - if (!arguments.length) return y1; - y1 = y; - return area; - }; - - area.interpolate = function(x) { - if (!arguments.length) return interpolate; - interpolator = d3_svg_lineInterpolators[interpolate = x]; - return area; - }; - - area.tension = function(x) { - if (!arguments.length) return tension; - tension = x; - return area; - }; - - return area; -} - -d3.svg.area = function() { - return d3_svg_area(Object); -}; - -function d3_svg_areaX(points) { - return function(d, i) { - return points[i][0]; - }; -} - -function d3_svg_areaY(points) { - return function(d, i) { - return points[i][1]; - }; -} -d3.svg.area.radial = function() { - var area = d3_svg_area(d3_svg_lineRadial); - area.radius = area.x, delete area.x; - area.innerRadius = area.x0, delete area.x0; - area.outerRadius = area.x1, delete area.x1; - area.angle = area.y, delete area.y; - area.startAngle = area.y0, delete area.y0; - area.endAngle = area.y1, delete area.y1; - return area; -}; -d3.svg.chord = function() { - var source = d3_svg_chordSource, - target = d3_svg_chordTarget, - radius = d3_svg_chordRadius, - startAngle = d3_svg_arcStartAngle, - endAngle = d3_svg_arcEndAngle; - - // TODO Allow control point to be customized. - - function chord(d, i) { - var s = subgroup(this, source, d, i), - t = subgroup(this, target, d, i); - return "M" + s.p0 - + arc(s.r, s.p1) + (equals(s, t) - ? curve(s.r, s.p1, s.r, s.p0) - : curve(s.r, s.p1, t.r, t.p0) - + arc(t.r, t.p1) - + curve(t.r, t.p1, s.r, s.p0)) - + "Z"; - } - - function subgroup(self, f, d, i) { - var subgroup = f.call(self, d, i), - r = radius.call(self, subgroup, i), - a0 = startAngle.call(self, subgroup, i) + d3_svg_arcOffset, - a1 = endAngle.call(self, subgroup, i) + d3_svg_arcOffset; - return { - r: r, - a0: a0, - a1: a1, - p0: [r * Math.cos(a0), r * Math.sin(a0)], - p1: [r * Math.cos(a1), r * Math.sin(a1)] - }; - } - - function equals(a, b) { - return a.a0 == b.a0 && a.a1 == b.a1; - } - - function arc(r, p) { - return "A" + r + "," + r + " 0 0,1 " + p; - } - - function curve(r0, p0, r1, p1) { - return "Q 0,0 " + p1; - } - - chord.radius = function(v) { - if (!arguments.length) return radius; - radius = d3.functor(v); - return chord; - }; - - chord.source = function(v) { - if (!arguments.length) return source; - source = d3.functor(v); - return chord; - }; - - chord.target = function(v) { - if (!arguments.length) return target; - target = d3.functor(v); - return chord; - }; - - chord.startAngle = function(v) { - if (!arguments.length) return startAngle; - startAngle = d3.functor(v); - return chord; - }; - - chord.endAngle = function(v) { - if (!arguments.length) return endAngle; - endAngle = d3.functor(v); - return chord; - }; - - return chord; -}; - -function d3_svg_chordSource(d) { - return d.source; -} - -function d3_svg_chordTarget(d) { - return d.target; -} - -function d3_svg_chordRadius(d) { - return d.radius; -} - -function d3_svg_chordStartAngle(d) { - return d.startAngle; -} - -function d3_svg_chordEndAngle(d) { - return d.endAngle; -} -d3.svg.diagonal = function() { - var source = d3_svg_chordSource, - target = d3_svg_chordTarget, - projection = d3_svg_diagonalProjection; - - function diagonal(d, i) { - var p0 = source.call(this, d, i), - p3 = target.call(this, d, i), - m = (p0.y + p3.y) / 2, - p = [p0, {x: p0.x, y: m}, {x: p3.x, y: m}, p3]; - p = p.map(projection); - return "M" + p[0] + "C" + p[1] + " " + p[2] + " " + p[3]; - } - - diagonal.source = function(x) { - if (!arguments.length) return source; - source = d3.functor(x); - return diagonal; - }; - - diagonal.target = function(x) { - if (!arguments.length) return target; - target = d3.functor(x); - return diagonal; - }; - - diagonal.projection = function(x) { - if (!arguments.length) return projection; - projection = x; - return diagonal; - }; - - return diagonal; -}; - -function d3_svg_diagonalProjection(d) { - return [d.x, d.y]; -} -d3.svg.diagonal.radial = function() { - var diagonal = d3.svg.diagonal(), - projection = d3_svg_diagonalProjection, - projection_ = diagonal.projection; - - diagonal.projection = function(x) { - return arguments.length - ? projection_(d3_svg_diagonalRadialProjection(projection = x)) - : projection; - }; - - return diagonal; -}; - -function d3_svg_diagonalRadialProjection(projection) { - return function() { - var d = projection.apply(this, arguments), - r = d[0], - a = d[1] + d3_svg_arcOffset; - return [r * Math.cos(a), r * Math.sin(a)]; - }; -} -d3.svg.mouse = function(container) { - return d3_svg_mousePoint(container, d3.event); -}; - -// https://bugs.webkit.org/show_bug.cgi?id=44083 -var d3_mouse_bug44083 = /WebKit/.test(navigator.userAgent) ? -1 : 0; - -function d3_svg_mousePoint(container, e) { - var point = (container.ownerSVGElement || container).createSVGPoint(); - if ((d3_mouse_bug44083 < 0) && (window.scrollX || window.scrollY)) { - var svg = d3.select(document.body) - .append("svg:svg") - .style("position", "absolute") - .style("top", 0) - .style("left", 0); - var ctm = svg[0][0].getScreenCTM(); - d3_mouse_bug44083 = !(ctm.f || ctm.e); - svg.remove(); - } - if (d3_mouse_bug44083) { - point.x = e.pageX; - point.y = e.pageY; - } else { - point.x = e.clientX; - point.y = e.clientY; - } - point = point.matrixTransform(container.getScreenCTM().inverse()); - return [point.x, point.y]; -}; -d3.svg.touches = function(container) { - var touches = d3.event.touches; - return touches ? Array.prototype.map.call(touches, function(touch) { - var point = d3_svg_mousePoint(container, touch); - point.identifier = touch.identifier; - return point; - }) : []; -}; -d3.svg.symbol = function() { - var type = d3_svg_symbolType, - size = d3_svg_symbolSize; - - function symbol(d, i) { - return (d3_svg_symbols[type.call(this, d, i)] - || d3_svg_symbols.circle) - (size.call(this, d, i)); - } - - symbol.type = function(x) { - if (!arguments.length) return type; - type = d3.functor(x); - return symbol; - }; - - // size of symbol in square pixels - symbol.size = function(x) { - if (!arguments.length) return size; - size = d3.functor(x); - return symbol; - }; - - return symbol; -}; - -function d3_svg_symbolSize() { - return 64; -} - -function d3_svg_symbolType() { - return "circle"; -} - -// TODO cross-diagonal? -var d3_svg_symbols = { - "circle": function(size) { - var r = Math.sqrt(size / Math.PI); - return "M0," + r - + "A" + r + "," + r + " 0 1,1 0," + (-r) - + "A" + r + "," + r + " 0 1,1 0," + r - + "Z"; - }, - "cross": function(size) { - var r = Math.sqrt(size / 5) / 2; - return "M" + -3 * r + "," + -r - + "H" + -r - + "V" + -3 * r - + "H" + r - + "V" + -r - + "H" + 3 * r - + "V" + r - + "H" + r - + "V" + 3 * r - + "H" + -r - + "V" + r - + "H" + -3 * r - + "Z"; - }, - "diamond": function(size) { - var ry = Math.sqrt(size / (2 * d3_svg_symbolTan30)), - rx = ry * d3_svg_symbolTan30; - return "M0," + -ry - + "L" + rx + ",0" - + " 0," + ry - + " " + -rx + ",0" - + "Z"; - }, - "square": function(size) { - var r = Math.sqrt(size) / 2; - return "M" + -r + "," + -r - + "L" + r + "," + -r - + " " + r + "," + r - + " " + -r + "," + r - + "Z"; - }, - "triangle-down": function(size) { - var rx = Math.sqrt(size / d3_svg_symbolSqrt3), - ry = rx * d3_svg_symbolSqrt3 / 2; - return "M0," + ry - + "L" + rx +"," + -ry - + " " + -rx + "," + -ry - + "Z"; - }, - "triangle-up": function(size) { - var rx = Math.sqrt(size / d3_svg_symbolSqrt3), - ry = rx * d3_svg_symbolSqrt3 / 2; - return "M0," + -ry - + "L" + rx +"," + ry - + " " + -rx + "," + ry - + "Z"; - } -}; - -d3.svg.symbolTypes = d3.keys(d3_svg_symbols); - -var d3_svg_symbolSqrt3 = Math.sqrt(3), - d3_svg_symbolTan30 = Math.tan(30 * Math.PI / 180); -d3.svg.axis = function() { - var scale = d3.scale.linear(), - orient = "bottom", - tickMajorSize = 6, - tickMinorSize = 6, - tickEndSize = 6, - tickPadding = 3, - tickArguments_ = [10], - tickFormat_, - tickSubdivide = 0; - - function axis(selection) { - selection.each(function(d, i, j) { - var g = d3.select(this); - - // Ticks. - var ticks = scale.ticks.apply(scale, tickArguments_), - tickFormat = tickFormat_ == null ? scale.tickFormat.apply(scale, tickArguments_) : tickFormat_; - - // Minor ticks. - var subticks = d3_svg_axisSubdivide(scale, ticks, tickSubdivide), - subtick = g.selectAll(".minor").data(subticks, String), - subtickEnter = subtick.enter().insert("svg:line", "g").attr("class", "tick minor").style("opacity", 1e-6), - subtickExit = transition(subtick.exit()).style("opacity", 1e-6).remove(), - subtickUpdate = transition(subtick).style("opacity", 1); - - // Major ticks. - var tick = g.selectAll("g").data(ticks, String), - tickEnter = tick.enter().insert("svg:g", "path").style("opacity", 1e-6), - tickExit = transition(tick.exit()).style("opacity", 1e-6).remove(), - tickUpdate = transition(tick).style("opacity", 1), - tickTransform; - - // Domain. - var range = d3_scaleExtent(scale.range()), - path = g.selectAll(".domain").data([0]), - pathEnter = path.enter().append("svg:path").attr("class", "domain"), - pathUpdate = transition(path); - - // Stash the new scale and grab the old scale. - var scale0 = this.__chart__ || scale; - this.__chart__ = scale.copy(); - - tickEnter.append("svg:line").attr("class", "tick"); - tickEnter.append("svg:text"); - tickUpdate.select("text").text(tickFormat); - - switch (orient) { - case "bottom": { - tickTransform = d3_svg_axisX; - subtickUpdate.attr("y2", tickMinorSize); - tickEnter.select("text").attr("dy", ".71em").attr("text-anchor", "middle"); - tickUpdate.select("line").attr("y2", tickMajorSize); - tickUpdate.select("text").attr("y", Math.max(tickMajorSize, 0) + tickPadding); - pathUpdate.attr("d", "M" + range[0] + "," + tickEndSize + "V0H" + range[1] + "V" + tickEndSize); - break; - } - case "top": { - tickTransform = d3_svg_axisX; - subtickUpdate.attr("y2", -tickMinorSize); - tickEnter.select("text").attr("text-anchor", "middle"); - tickUpdate.select("line").attr("y2", -tickMajorSize); - tickUpdate.select("text").attr("y", -(Math.max(tickMajorSize, 0) + tickPadding)); - pathUpdate.attr("d", "M" + range[0] + "," + -tickEndSize + "V0H" + range[1] + "V" + -tickEndSize); - break; - } - case "left": { - tickTransform = d3_svg_axisY; - subtickUpdate.attr("x2", -tickMinorSize); - tickEnter.select("text").attr("dy", ".32em").attr("text-anchor", "end"); - tickUpdate.select("line").attr("x2", -tickMajorSize); - tickUpdate.select("text").attr("x", -(Math.max(tickMajorSize, 0) + tickPadding)); - pathUpdate.attr("d", "M" + -tickEndSize + "," + range[0] + "H0V" + range[1] + "H" + -tickEndSize); - break; - } - case "right": { - tickTransform = d3_svg_axisY; - subtickUpdate.attr("x2", tickMinorSize); - tickEnter.select("text").attr("dy", ".32em"); - tickUpdate.select("line").attr("x2", tickMajorSize); - tickUpdate.select("text").attr("x", Math.max(tickMajorSize, 0) + tickPadding); - pathUpdate.attr("d", "M" + tickEndSize + "," + range[0] + "H0V" + range[1] + "H" + tickEndSize); - break; - } - } - - tickEnter.call(tickTransform, scale0); - tickUpdate.call(tickTransform, scale); - tickExit.call(tickTransform, scale); - - subtickEnter.call(tickTransform, scale0); - subtickUpdate.call(tickTransform, scale); - subtickExit.call(tickTransform, scale); - - function transition(o) { - return selection.delay ? o.transition() - .delay(selection[j][i].delay) - .duration(selection[j][i].duration) - .ease(selection.ease()) : o; - } - }); - } - - axis.scale = function(x) { - if (!arguments.length) return scale; - scale = x; - return axis; - }; - - axis.orient = function(x) { - if (!arguments.length) return orient; - orient = x; - return axis; - }; - - axis.ticks = function() { - if (!arguments.length) return tickArguments_; - tickArguments_ = arguments; - return axis; - }; - - axis.tickFormat = function(x) { - if (!arguments.length) return tickFormat_; - tickFormat_ = x; - return axis; - }; - - axis.tickSize = function(x, y, z) { - if (!arguments.length) return tickMajorSize; - var n = arguments.length - 1; - tickMajorSize = +x; - tickMinorSize = n > 1 ? +y : tickMajorSize; - tickEndSize = n > 0 ? +arguments[n] : tickMajorSize; - return axis; - }; - - axis.tickPadding = function(x) { - if (!arguments.length) return tickPadding; - tickPadding = +x; - return axis; - }; - - axis.tickSubdivide = function(x) { - if (!arguments.length) return tickSubdivide; - tickSubdivide = +x; - return axis; - }; - - return axis; -}; - -function d3_svg_axisX(selection, x) { - selection.attr("transform", function(d) { return "translate(" + x(d) + ",0)"; }); -} - -function d3_svg_axisY(selection, y) { - selection.attr("transform", function(d) { return "translate(0," + y(d) + ")"; }); -} - -function d3_svg_axisSubdivide(scale, ticks, m) { - subticks = []; - if (m && ticks.length > 1) { - var extent = d3_scaleExtent(scale.domain()), - subticks, - i = -1, - n = ticks.length, - d = (ticks[1] - ticks[0]) / ++m, - j, - v; - while (++i < n) { - for (j = m; --j > 0;) { - if ((v = +ticks[i] - j * d) >= extent[0]) { - subticks.push(v); - } - } - } - for (--i, j = 0; ++j < m && (v = +ticks[i] + j * d) < extent[1];) { - subticks.push(v); - } - } - return subticks; -} -d3.behavior = {}; -d3.behavior.drag = function() { - var event = d3.dispatch("drag", "dragstart", "dragend"); - - function drag() { - this - .on("mousedown.drag", mousedown) - .on("touchstart.drag", mousedown); - - d3.select(window) - .on("mousemove.drag", d3_behavior_dragMove) - .on("touchmove.drag", d3_behavior_dragMove) - .on("mouseup.drag", d3_behavior_dragUp, true) - .on("touchend.drag", d3_behavior_dragUp, true) - .on("click.drag", d3_behavior_dragClick, true); - } - - // snapshot the local context for subsequent dispatch - function start() { - d3_behavior_dragEvent = event; - d3_behavior_dragOffset = d3_behavior_dragPoint((d3_behavior_dragTarget = this).parentNode); - d3_behavior_dragMoved = 0; - d3_behavior_dragArguments = arguments; - } - - function mousedown() { - start.apply(this, arguments); - d3_behavior_dragDispatch("dragstart"); - } - - drag.on = function(type, listener) { - event[type].add(listener); - return drag; - }; - - return drag; -}; - -var d3_behavior_dragEvent, - d3_behavior_dragTarget, - d3_behavior_dragArguments, - d3_behavior_dragOffset, - d3_behavior_dragMoved, - d3_behavior_dragStopClick; - -function d3_behavior_dragDispatch(type) { - var o = d3.event, p = d3_behavior_dragTarget.parentNode, dx = 0, dy = 0; - - if (p) { - p = d3_behavior_dragPoint(p); - dx = p[0] - d3_behavior_dragOffset[0]; - dy = p[1] - d3_behavior_dragOffset[1]; - d3_behavior_dragOffset = p; - d3_behavior_dragMoved |= dx | dy; - } - - try { - d3.event = {dx: dx, dy: dy}; - d3_behavior_dragEvent[type].dispatch.apply(d3_behavior_dragTarget, d3_behavior_dragArguments); - } finally { - d3.event = o; - } - - o.preventDefault(); -} - -function d3_behavior_dragPoint(container) { - return d3.event.touches - ? d3.svg.touches(container)[0] - : d3.svg.mouse(container); -} - -function d3_behavior_dragMove() { - if (!d3_behavior_dragTarget) return; - var parent = d3_behavior_dragTarget.parentNode; - - // O NOES! The drag element was removed from the DOM. - if (!parent) return d3_behavior_dragUp(); - - d3_behavior_dragDispatch("drag"); - d3_behavior_dragCancel(); -} - -function d3_behavior_dragUp() { - if (!d3_behavior_dragTarget) return; - d3_behavior_dragDispatch("dragend"); - d3_behavior_dragTarget = null; - - // If the node was moved, prevent the mouseup from propagating. - // Also prevent the subsequent click from propagating (e.g., for anchors). - if (d3_behavior_dragMoved) { - d3_behavior_dragStopClick = true; - d3_behavior_dragCancel(); - } -} - -function d3_behavior_dragClick() { - if (d3_behavior_dragStopClick) { - d3_behavior_dragCancel(); - d3_behavior_dragStopClick = false; - } -} - -function d3_behavior_dragCancel() { - d3.event.stopPropagation(); - d3.event.preventDefault(); -} -// TODO unbind zoom behavior? -// TODO unbind listener? -d3.behavior.zoom = function() { - var xyz = [0, 0, 0], - event = d3.dispatch("zoom"); - - function zoom() { - this - .on("mousedown.zoom", mousedown) - .on("mousewheel.zoom", mousewheel) - .on("DOMMouseScroll.zoom", mousewheel) - .on("dblclick.zoom", dblclick) - .on("touchstart.zoom", touchstart); - - d3.select(window) - .on("mousemove.zoom", d3_behavior_zoomMousemove) - .on("mouseup.zoom", d3_behavior_zoomMouseup) - .on("touchmove.zoom", d3_behavior_zoomTouchmove) - .on("touchend.zoom", d3_behavior_zoomTouchup) - .on("click.zoom", d3_behavior_zoomClick, true); - } - - // snapshot the local context for subsequent dispatch - function start() { - d3_behavior_zoomXyz = xyz; - d3_behavior_zoomDispatch = event.zoom.dispatch; - d3_behavior_zoomTarget = this; - d3_behavior_zoomArguments = arguments; - } - - function mousedown() { - start.apply(this, arguments); - d3_behavior_zoomPanning = d3_behavior_zoomLocation(d3.svg.mouse(d3_behavior_zoomTarget)); - d3_behavior_zoomMoved = false; - d3.event.preventDefault(); - window.focus(); - } - - // store starting mouse location - function mousewheel() { - start.apply(this, arguments); - if (!d3_behavior_zoomZooming) d3_behavior_zoomZooming = d3_behavior_zoomLocation(d3.svg.mouse(d3_behavior_zoomTarget)); - d3_behavior_zoomTo(d3_behavior_zoomDelta() + xyz[2], d3.svg.mouse(d3_behavior_zoomTarget), d3_behavior_zoomZooming); - } - - function dblclick() { - start.apply(this, arguments); - var mouse = d3.svg.mouse(d3_behavior_zoomTarget); - d3_behavior_zoomTo(d3.event.shiftKey ? Math.ceil(xyz[2] - 1) : Math.floor(xyz[2] + 1), mouse, d3_behavior_zoomLocation(mouse)); - } - - // doubletap detection - function touchstart() { - start.apply(this, arguments); - var touches = d3_behavior_zoomTouchup(), - touch, - now = Date.now(); - if ((touches.length === 1) && (now - d3_behavior_zoomLast < 300)) { - d3_behavior_zoomTo(1 + Math.floor(xyz[2]), touch = touches[0], d3_behavior_zoomLocations[touch.identifier]); - } - d3_behavior_zoomLast = now; - } - - zoom.on = function(type, listener) { - event[type].add(listener); - return zoom; - }; - - return zoom; -}; - -var d3_behavior_zoomDiv, - d3_behavior_zoomPanning, - d3_behavior_zoomZooming, - d3_behavior_zoomLocations = {}, // identifier -> location - d3_behavior_zoomLast = 0, - d3_behavior_zoomXyz, - d3_behavior_zoomDispatch, - d3_behavior_zoomTarget, - d3_behavior_zoomArguments, - d3_behavior_zoomMoved, - d3_behavior_zoomStopClick; - -function d3_behavior_zoomLocation(point) { - return [ - point[0] - d3_behavior_zoomXyz[0], - point[1] - d3_behavior_zoomXyz[1], - d3_behavior_zoomXyz[2] - ]; -} - -// detect the pixels that would be scrolled by this wheel event -function d3_behavior_zoomDelta() { - - // mousewheel events are totally broken! - // https://bugs.webkit.org/show_bug.cgi?id=40441 - // not only that, but Chrome and Safari differ in re. to acceleration! - if (!d3_behavior_zoomDiv) { - d3_behavior_zoomDiv = d3.select("body").append("div") - .style("visibility", "hidden") - .style("top", 0) - .style("height", 0) - .style("width", 0) - .style("overflow-y", "scroll") - .append("div") - .style("height", "2000px") - .node().parentNode; - } - - var e = d3.event, delta; - try { - d3_behavior_zoomDiv.scrollTop = 1000; - d3_behavior_zoomDiv.dispatchEvent(e); - delta = 1000 - d3_behavior_zoomDiv.scrollTop; - } catch (error) { - delta = e.wheelDelta || (-e.detail * 5); - } - - return delta * .005; -} - -// Note: Since we don't rotate, it's possible for the touches to become -// slightly detached from their original positions. Thus, we recompute the -// touch points on touchend as well as touchstart! -function d3_behavior_zoomTouchup() { - var touches = d3.svg.touches(d3_behavior_zoomTarget), - i = -1, - n = touches.length, - touch; - while (++i < n) d3_behavior_zoomLocations[(touch = touches[i]).identifier] = d3_behavior_zoomLocation(touch); - return touches; -} - -function d3_behavior_zoomTouchmove() { - var touches = d3.svg.touches(d3_behavior_zoomTarget); - switch (touches.length) { - - // single-touch pan - case 1: { - var touch = touches[0]; - d3_behavior_zoomTo(d3_behavior_zoomXyz[2], touch, d3_behavior_zoomLocations[touch.identifier]); - break; - } - - // double-touch pan + zoom - case 2: { - var p0 = touches[0], - p1 = touches[1], - p2 = [(p0[0] + p1[0]) / 2, (p0[1] + p1[1]) / 2], - l0 = d3_behavior_zoomLocations[p0.identifier], - l1 = d3_behavior_zoomLocations[p1.identifier], - l2 = [(l0[0] + l1[0]) / 2, (l0[1] + l1[1]) / 2, l0[2]]; - d3_behavior_zoomTo(Math.log(d3.event.scale) / Math.LN2 + l0[2], p2, l2); - break; - } - } -} - -function d3_behavior_zoomMousemove() { - d3_behavior_zoomZooming = null; - if (d3_behavior_zoomPanning) { - d3_behavior_zoomMoved = true; - d3_behavior_zoomTo(d3_behavior_zoomXyz[2], d3.svg.mouse(d3_behavior_zoomTarget), d3_behavior_zoomPanning); - } -} - -function d3_behavior_zoomMouseup() { - if (d3_behavior_zoomPanning) { - if (d3_behavior_zoomMoved) d3_behavior_zoomStopClick = true; - d3_behavior_zoomMousemove(); - d3_behavior_zoomPanning = null; - } -} - -function d3_behavior_zoomClick() { - if (d3_behavior_zoomStopClick) { - d3.event.stopPropagation(); - d3.event.preventDefault(); - d3_behavior_zoomStopClick = false; - } -} - -function d3_behavior_zoomTo(z, x0, x1) { - var K = Math.pow(2, (d3_behavior_zoomXyz[2] = z) - x1[2]), - x = d3_behavior_zoomXyz[0] = x0[0] - K * x1[0], - y = d3_behavior_zoomXyz[1] = x0[1] - K * x1[1], - o = d3.event, // Events can be reentrant (e.g., focus). - k = Math.pow(2, z); - - d3.event = { - scale: k, - translate: [x, y], - transform: function(sx, sy) { - if (sx) transform(sx, x); - if (sy) transform(sy, y); - } - }; - - function transform(scale, o) { - var domain = scale.__domain || (scale.__domain = scale.domain()), - range = scale.range().map(function(v) { return (v - o) / k; }); - scale.domain(domain).domain(range.map(scale.invert)); - } - - try { - d3_behavior_zoomDispatch.apply(d3_behavior_zoomTarget, d3_behavior_zoomArguments); - } finally { - d3.event = o; - } - - o.preventDefault(); -} -})(); diff --git a/deep_sequencing_unit/source/core-plugins/downloader/1/as/webapps/downloader/html/d3.layout.js b/deep_sequencing_unit/source/core-plugins/downloader/1/as/webapps/downloader/html/d3.layout.js deleted file mode 100755 index 6cc1d7161677597ae7f718a4c0cafb90a240a56a..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/source/core-plugins/downloader/1/as/webapps/downloader/html/d3.layout.js +++ /dev/null @@ -1,1865 +0,0 @@ -(function(){d3.layout = {}; -// Implements hierarchical edge bundling using Holten's algorithm. For each -// input link, a path is computed that travels through the tree, up the parent -// hierarchy to the least common ancestor, and then back down to the destination -// node. Each path is simply an array of nodes. -d3.layout.bundle = function() { - return function(links) { - var paths = [], - i = -1, - n = links.length; - while (++i < n) paths.push(d3_layout_bundlePath(links[i])); - return paths; - }; -}; - -function d3_layout_bundlePath(link) { - var start = link.source, - end = link.target, - lca = d3_layout_bundleLeastCommonAncestor(start, end), - points = [start]; - while (start !== lca) { - start = start.parent; - points.push(start); - } - var k = points.length; - while (end !== lca) { - points.splice(k, 0, end); - end = end.parent; - } - return points; -} - -function d3_layout_bundleAncestors(node) { - var ancestors = [], - parent = node.parent; - while (parent != null) { - ancestors.push(node); - node = parent; - parent = parent.parent; - } - ancestors.push(node); - return ancestors; -} - -function d3_layout_bundleLeastCommonAncestor(a, b) { - if (a === b) return a; - var aNodes = d3_layout_bundleAncestors(a), - bNodes = d3_layout_bundleAncestors(b), - aNode = aNodes.pop(), - bNode = bNodes.pop(), - sharedNode = null; - while (aNode === bNode) { - sharedNode = aNode; - aNode = aNodes.pop(); - bNode = bNodes.pop(); - } - return sharedNode; -} -d3.layout.chord = function() { - var chord = {}, - chords, - groups, - matrix, - n, - padding = 0, - sortGroups, - sortSubgroups, - sortChords; - - function relayout() { - var subgroups = {}, - groupSums = [], - groupIndex = d3.range(n), - subgroupIndex = [], - k, - x, - x0, - i, - j; - - chords = []; - groups = []; - - // Compute the sum. - k = 0, i = -1; while (++i < n) { - x = 0, j = -1; while (++j < n) { - x += matrix[i][j]; - } - groupSums.push(x); - subgroupIndex.push(d3.range(n)); - k += x; - } - - // Sort groups… - if (sortGroups) { - groupIndex.sort(function(a, b) { - return sortGroups(groupSums[a], groupSums[b]); - }); - } - - // Sort subgroups… - if (sortSubgroups) { - subgroupIndex.forEach(function(d, i) { - d.sort(function(a, b) { - return sortSubgroups(matrix[i][a], matrix[i][b]); - }); - }); - } - - // Convert the sum to scaling factor for [0, 2pi]. - // TODO Allow start and end angle to be specified. - // TODO Allow padding to be specified as percentage? - k = (2 * Math.PI - padding * n) / k; - - // Compute the start and end angle for each group and subgroup. - x = 0, i = -1; while (++i < n) { - x0 = x, j = -1; while (++j < n) { - var di = groupIndex[i], - dj = subgroupIndex[i][j], - v = matrix[di][dj]; - subgroups[di + "-" + dj] = { - index: di, - subindex: dj, - startAngle: x, - endAngle: x += v * k, - value: v - }; - } - groups.push({ - index: di, - startAngle: x0, - endAngle: x, - value: (x - x0) / k - }); - x += padding; - } - - // Generate chords for each (non-empty) subgroup-subgroup link. - i = -1; while (++i < n) { - j = i - 1; while (++j < n) { - var source = subgroups[i + "-" + j], - target = subgroups[j + "-" + i]; - if (source.value || target.value) { - chords.push(source.value < target.value - ? {source: target, target: source} - : {source: source, target: target}); - } - } - } - - if (sortChords) resort(); - } - - function resort() { - chords.sort(function(a, b) { - return sortChords(a.target.value, b.target.value); - }); - } - - chord.matrix = function(x) { - if (!arguments.length) return matrix; - n = (matrix = x) && matrix.length; - chords = groups = null; - return chord; - }; - - chord.padding = function(x) { - if (!arguments.length) return padding; - padding = x; - chords = groups = null; - return chord; - }; - - chord.sortGroups = function(x) { - if (!arguments.length) return sortGroups; - sortGroups = x; - chords = groups = null; - return chord; - }; - - chord.sortSubgroups = function(x) { - if (!arguments.length) return sortSubgroups; - sortSubgroups = x; - chords = null; - return chord; - }; - - chord.sortChords = function(x) { - if (!arguments.length) return sortChords; - sortChords = x; - if (chords) resort(); - return chord; - }; - - chord.chords = function() { - if (!chords) relayout(); - return chords; - }; - - chord.groups = function() { - if (!groups) relayout(); - return groups; - }; - - return chord; -}; -// A rudimentary force layout using Gauss-Seidel. -d3.layout.force = function() { - var force = {}, - event = d3.dispatch("tick"), - size = [1, 1], - drag, - alpha, - friction = .9, - linkDistance = d3_layout_forceLinkDistance, - linkStrength = d3_layout_forceLinkStrength, - charge = -30, - gravity = .1, - theta = .8, - interval, - nodes = [], - links = [], - distances, - strengths; - - function repulse(node, kc) { - return function(quad, x1, y1, x2, y2) { - if (quad.point !== node) { - var dx = quad.cx - node.x, - dy = quad.cy - node.y, - dn = 1 / Math.sqrt(dx * dx + dy * dy); - - /* Barnes-Hut criterion. */ - if ((x2 - x1) * dn < theta) { - var k = kc * quad.count * dn * dn; - node.px -= dx * k; - node.py -= dy * k; - return true; - } - - if (quad.point && isFinite(dn)) { - var k = kc * dn * dn; - node.px -= dx * k; - node.py -= dy * k; - } - } - }; - } - - function tick() { - var n = nodes.length, - m = links.length, - q, - i, // current index - o, // current object - s, // current source - t, // current target - l, // current distance - k, // current force - x, // x-distance - y; // y-distance - - // gauss-seidel relaxation for links - for (i = 0; i < m; ++i) { - o = links[i]; - s = o.source; - t = o.target; - x = t.x - s.x; - y = t.y - s.y; - if (l = (x * x + y * y)) { - l = alpha * strengths[i] * ((l = Math.sqrt(l)) - distances[i]) / l; - x *= l; - y *= l; - t.x -= x * (k = s.weight / (t.weight + s.weight)); - t.y -= y * k; - s.x += x * (k = 1 - k); - s.y += y * k; - } - } - - // apply gravity forces - if (k = alpha * gravity) { - x = size[0] / 2; - y = size[1] / 2; - i = -1; if (k) while (++i < n) { - o = nodes[i]; - o.x += (x - o.x) * k; - o.y += (y - o.y) * k; - } - } - - // compute quadtree center of mass and apply charge forces - if (k = alpha * charge) { - d3_layout_forceAccumulate(q = d3.geom.quadtree(nodes)); - i = -1; while (++i < n) { - if (!(o = nodes[i]).fixed) { - q.visit(repulse(o, k)); - } - } - } - - // position verlet integration - i = -1; while (++i < n) { - o = nodes[i]; - if (o.fixed) { - o.x = o.px; - o.y = o.py; - } else { - o.x -= (o.px - (o.px = o.x)) * friction; - o.y -= (o.py - (o.py = o.y)) * friction; - } - } - - event.tick.dispatch({type: "tick", alpha: alpha}); - - // simulated annealing, basically - return (alpha *= .99) < .005; - } - - force.on = function(type, listener) { - event[type].add(listener); - return force; - }; - - force.nodes = function(x) { - if (!arguments.length) return nodes; - nodes = x; - return force; - }; - - force.links = function(x) { - if (!arguments.length) return links; - links = x; - return force; - }; - - force.size = function(x) { - if (!arguments.length) return size; - size = x; - return force; - }; - - force.linkDistance = function(x) { - if (!arguments.length) return linkDistance; - linkDistance = d3.functor(x); - return force; - }; - - // For backwards-compatibility. - force.distance = force.linkDistance; - - force.linkStrength = function(x) { - if (!arguments.length) return linkStrength; - linkStrength = d3.functor(x); - return force; - }; - - force.friction = function(x) { - if (!arguments.length) return friction; - friction = x; - return force; - }; - - force.charge = function(x) { - if (!arguments.length) return charge; - charge = x; - return force; - }; - - force.gravity = function(x) { - if (!arguments.length) return gravity; - gravity = x; - return force; - }; - - force.theta = function(x) { - if (!arguments.length) return theta; - theta = x; - return force; - }; - - force.start = function() { - var i, - j, - n = nodes.length, - m = links.length, - w = size[0], - h = size[1], - neighbors, - o; - - for (i = 0; i < n; ++i) { - (o = nodes[i]).index = i; - o.weight = 0; - } - - distances = []; - strengths = []; - for (i = 0; i < m; ++i) { - o = links[i]; - if (typeof o.source == "number") o.source = nodes[o.source]; - if (typeof o.target == "number") o.target = nodes[o.target]; - distances[i] = linkDistance.call(this, o, i); - strengths[i] = linkStrength.call(this, o, i); - ++o.source.weight; - ++o.target.weight; - } - - for (i = 0; i < n; ++i) { - o = nodes[i]; - if (isNaN(o.x)) o.x = position("x", w); - if (isNaN(o.y)) o.y = position("y", h); - if (isNaN(o.px)) o.px = o.x; - if (isNaN(o.py)) o.py = o.y; - } - - // initialize node position based on first neighbor - function position(dimension, size) { - var neighbors = neighbor(i), - j = -1, - m = neighbors.length, - x; - while (++j < m) if (!isNaN(x = neighbors[j][dimension])) return x; - return Math.random() * size; - } - - // initialize neighbors lazily - function neighbor() { - if (!neighbors) { - neighbors = []; - for (j = 0; j < n; ++j) { - neighbors[j] = []; - } - for (j = 0; j < m; ++j) { - var o = links[j]; - neighbors[o.source.index].push(o.target); - neighbors[o.target.index].push(o.source); - } - } - return neighbors[i]; - } - - return force.resume(); - }; - - force.resume = function() { - alpha = .1; - d3.timer(tick); - return force; - }; - - force.stop = function() { - alpha = 0; - return force; - }; - - // use `node.call(force.drag)` to make nodes draggable - force.drag = function() { - if (!drag) drag = d3.behavior.drag() - .on("dragstart", dragstart) - .on("drag", d3_layout_forceDrag) - .on("dragend", d3_layout_forceDragEnd); - - this.on("mouseover.force", d3_layout_forceDragOver) - .on("mouseout.force", d3_layout_forceDragOut) - .call(drag); - }; - - function dragstart(d) { - d3_layout_forceDragOver(d3_layout_forceDragNode = d); - d3_layout_forceDragForce = force; - } - - return force; -}; - -var d3_layout_forceDragForce, - d3_layout_forceDragNode; - -function d3_layout_forceDragOver(d) { - d.fixed |= 2; -} - -function d3_layout_forceDragOut(d) { - if (d !== d3_layout_forceDragNode) d.fixed &= 1; -} - -function d3_layout_forceDragEnd() { - d3_layout_forceDrag(); - d3_layout_forceDragNode.fixed &= 1; - d3_layout_forceDragForce = d3_layout_forceDragNode = null; -} - -function d3_layout_forceDrag() { - d3_layout_forceDragNode.px += d3.event.dx; - d3_layout_forceDragNode.py += d3.event.dy; - d3_layout_forceDragForce.resume(); // restart annealing -} - -function d3_layout_forceAccumulate(quad) { - var cx = 0, - cy = 0; - quad.count = 0; - if (!quad.leaf) { - var nodes = quad.nodes, - n = nodes.length, - i = -1, - c; - while (++i < n) { - c = nodes[i]; - if (c == null) continue; - d3_layout_forceAccumulate(c); - quad.count += c.count; - cx += c.count * c.cx; - cy += c.count * c.cy; - } - } - if (quad.point) { - // jitter internal nodes that are coincident - if (!quad.leaf) { - quad.point.x += Math.random() - .5; - quad.point.y += Math.random() - .5; - } - quad.count++; - cx += quad.point.x; - cy += quad.point.y; - } - quad.cx = cx / quad.count; - quad.cy = cy / quad.count; -} - -function d3_layout_forceLinkDistance(link) { - return 20; -} - -function d3_layout_forceLinkStrength(link) { - return 1; -} -d3.layout.partition = function() { - var hierarchy = d3.layout.hierarchy(), - size = [1, 1]; // width, height - - function position(node, x, dx, dy) { - var children = node.children; - node.x = x; - node.y = node.depth * dy; - node.dx = dx; - node.dy = dy; - if (children) { - var i = -1, - n = children.length, - c, - d; - dx = node.value ? dx / node.value : 0; - while (++i < n) { - position(c = children[i], x, d = c.value * dx, dy); - x += d; - } - } - } - - function depth(node) { - var children = node.children, - d = 0; - if (children) { - var i = -1, - n = children.length; - while (++i < n) d = Math.max(d, depth(children[i])); - } - return 1 + d; - } - - function partition(d, i) { - var nodes = hierarchy.call(this, d, i); - position(nodes[0], 0, size[0], size[1] / depth(nodes[0])); - return nodes; - } - - partition.size = function(x) { - if (!arguments.length) return size; - size = x; - return partition; - }; - - return d3_layout_hierarchyRebind(partition, hierarchy); -}; -d3.layout.pie = function() { - var value = Number, - sort = null, - startAngle = 0, - endAngle = 2 * Math.PI; - - function pie(data, i) { - - // Compute the start angle. - var a = +(typeof startAngle === "function" - ? startAngle.apply(this, arguments) - : startAngle); - - // Compute the angular range (end - start). - var k = (typeof endAngle === "function" - ? endAngle.apply(this, arguments) - : endAngle) - startAngle; - - // Optionally sort the data. - var index = d3.range(data.length); - if (sort != null) index.sort(function(i, j) { - return sort(data[i], data[j]); - }); - - // Compute the numeric values for each data element. - var values = data.map(value); - - // Convert k into a scale factor from value to angle, using the sum. - k /= values.reduce(function(p, d) { return p + d; }, 0); - - // Compute the arcs! - var arcs = index.map(function(i) { - return { - data: data[i], - value: d = values[i], - startAngle: a, - endAngle: a += d * k - }; - }); - - // Return the arcs in the original data's order. - return data.map(function(d, i) { - return arcs[index[i]]; - }); - } - - /** - * Specifies the value function *x*, which returns a nonnegative numeric value - * for each datum. The default value function is `Number`. The value function - * is passed two arguments: the current datum and the current index. - */ - pie.value = function(x) { - if (!arguments.length) return value; - value = x; - return pie; - }; - - /** - * Specifies a sort comparison operator *x*. The comparator is passed two data - * elements from the data array, a and b; it returns a negative value if a is - * less than b, a positive value if a is greater than b, and zero if a equals - * b. - */ - pie.sort = function(x) { - if (!arguments.length) return sort; - sort = x; - return pie; - }; - - /** - * Specifies the overall start angle of the pie chart. Defaults to 0. The - * start angle can be specified either as a constant or as a function; in the - * case of a function, it is evaluated once per array (as opposed to per - * element). - */ - pie.startAngle = function(x) { - if (!arguments.length) return startAngle; - startAngle = x; - return pie; - }; - - /** - * Specifies the overall end angle of the pie chart. Defaults to 2Ï€. The - * end angle can be specified either as a constant or as a function; in the - * case of a function, it is evaluated once per array (as opposed to per - * element). - */ - pie.endAngle = function(x) { - if (!arguments.length) return endAngle; - endAngle = x; - return pie; - }; - - return pie; -}; -// data is two-dimensional array of x,y; we populate y0 -d3.layout.stack = function() { - var values = Object, - order = d3_layout_stackOrders["default"], - offset = d3_layout_stackOffsets["zero"], - out = d3_layout_stackOut, - x = d3_layout_stackX, - y = d3_layout_stackY; - - function stack(data, index) { - - // Convert series to canonical two-dimensional representation. - var series = data.map(function(d, i) { - return values.call(stack, d, i); - }); - - // Convert each series to canonical [[x,y]] representation. - var points = series.map(function(d, i) { - return d.map(function(v, i) { - return [x.call(stack, v, i), y.call(stack, v, i)]; - }); - }); - - // Compute the order of series, and permute them. - var orders = order.call(stack, points, index); - series = d3.permute(series, orders); - points = d3.permute(points, orders); - - // Compute the baseline… - var offsets = offset.call(stack, points, index); - - // And propagate it to other series. - var n = series.length, - m = series[0].length, - i, - j, - o; - for (j = 0; j < m; ++j) { - out.call(stack, series[0][j], o = offsets[j], points[0][j][1]); - for (i = 1; i < n; ++i) { - out.call(stack, series[i][j], o += points[i - 1][j][1], points[i][j][1]); - } - } - - return data; - } - - stack.values = function(x) { - if (!arguments.length) return values; - values = x; - return stack; - }; - - stack.order = function(x) { - if (!arguments.length) return order; - order = typeof x === "function" ? x : d3_layout_stackOrders[x]; - return stack; - }; - - stack.offset = function(x) { - if (!arguments.length) return offset; - offset = typeof x === "function" ? x : d3_layout_stackOffsets[x]; - return stack; - }; - - stack.x = function(z) { - if (!arguments.length) return x; - x = z; - return stack; - }; - - stack.y = function(z) { - if (!arguments.length) return y; - y = z; - return stack; - }; - - stack.out = function(z) { - if (!arguments.length) return out; - out = z; - return stack; - }; - - return stack; -} - -function d3_layout_stackX(d) { - return d.x; -} - -function d3_layout_stackY(d) { - return d.y; -} - -function d3_layout_stackOut(d, y0, y) { - d.y0 = y0; - d.y = y; -} - -var d3_layout_stackOrders = { - - "inside-out": function(data) { - var n = data.length, - i, - j, - max = data.map(d3_layout_stackMaxIndex), - sums = data.map(d3_layout_stackReduceSum), - index = d3.range(n).sort(function(a, b) { return max[a] - max[b]; }), - top = 0, - bottom = 0, - tops = [], - bottoms = []; - for (i = 0; i < n; ++i) { - j = index[i]; - if (top < bottom) { - top += sums[j]; - tops.push(j); - } else { - bottom += sums[j]; - bottoms.push(j); - } - } - return bottoms.reverse().concat(tops); - }, - - "reverse": function(data) { - return d3.range(data.length).reverse(); - }, - - "default": function(data) { - return d3.range(data.length); - } - -}; - -var d3_layout_stackOffsets = { - - "silhouette": function(data) { - var n = data.length, - m = data[0].length, - sums = [], - max = 0, - i, - j, - o, - y0 = []; - for (j = 0; j < m; ++j) { - for (i = 0, o = 0; i < n; i++) o += data[i][j][1]; - if (o > max) max = o; - sums.push(o); - } - for (j = 0; j < m; ++j) { - y0[j] = (max - sums[j]) / 2; - } - return y0; - }, - - "wiggle": function(data) { - var n = data.length, - x = data[0], - m = x.length, - max = 0, - i, - j, - k, - s1, - s2, - s3, - dx, - o, - o0, - y0 = []; - y0[0] = o = o0 = 0; - for (j = 1; j < m; ++j) { - for (i = 0, s1 = 0; i < n; ++i) s1 += data[i][j][1]; - for (i = 0, s2 = 0, dx = x[j][0] - x[j - 1][0]; i < n; ++i) { - for (k = 0, s3 = (data[i][j][1] - data[i][j - 1][1]) / (2 * dx); k < i; ++k) { - s3 += (data[k][j][1] - data[k][j - 1][1]) / dx; - } - s2 += s3 * data[i][j][1]; - } - y0[j] = o -= s1 ? s2 / s1 * dx : 0; - if (o < o0) o0 = o; - } - for (j = 0; j < m; ++j) y0[j] -= o0; - return y0; - }, - - "expand": function(data) { - var n = data.length, - m = data[0].length, - k = 1 / n, - i, - j, - o, - y0 = []; - for (j = 0; j < m; ++j) { - for (i = 0, o = 0; i < n; i++) o += data[i][j][1]; - if (o) for (i = 0; i < n; i++) data[i][j][1] /= o; - else for (i = 0; i < n; i++) data[i][j][1] = k; - } - for (j = 0; j < m; ++j) y0[j] = 0; - return y0; - }, - - "zero": function(data) { - var j = -1, - m = data[0].length, - y0 = []; - while (++j < m) y0[j] = 0; - return y0; - } - -}; - -function d3_layout_stackMaxIndex(array) { - var i = 1, - j = 0, - v = array[0][1], - k, - n = array.length; - for (; i < n; ++i) { - if ((k = array[i][1]) > v) { - j = i; - v = k; - } - } - return j; -} - -function d3_layout_stackReduceSum(d) { - return d.reduce(d3_layout_stackSum, 0); -} - -function d3_layout_stackSum(p, d) { - return p + d[1]; -} -d3.layout.histogram = function() { - var frequency = true, - valuer = Number, - ranger = d3_layout_histogramRange, - binner = d3_layout_histogramBinSturges; - - function histogram(data, i) { - var bins = [], - values = data.map(valuer, this), - range = ranger.call(this, values, i), - thresholds = binner.call(this, range, values, i), - bin, - i = -1, - n = values.length, - m = thresholds.length - 1, - k = frequency ? 1 : 1 / n, - x; - - // Initialize the bins. - while (++i < m) { - bin = bins[i] = []; - bin.dx = thresholds[i + 1] - (bin.x = thresholds[i]); - bin.y = 0; - } - - // Fill the bins, ignoring values outside the range. - i = -1; while(++i < n) { - x = values[i]; - if ((x >= range[0]) && (x <= range[1])) { - bin = bins[d3.bisect(thresholds, x, 1, m) - 1]; - bin.y += k; - bin.push(data[i]); - } - } - - return bins; - } - - // Specifies how to extract a value from the associated data. The default - // value function is `Number`, which is equivalent to the identity function. - histogram.value = function(x) { - if (!arguments.length) return valuer; - valuer = x; - return histogram; - }; - - // Specifies the range of the histogram. Values outside the specified range - // will be ignored. The argument `x` may be specified either as a two-element - // array representing the minimum and maximum value of the range, or as a - // function that returns the range given the array of values and the current - // index `i`. The default range is the extent (minimum and maximum) of the - // values. - histogram.range = function(x) { - if (!arguments.length) return ranger; - ranger = d3.functor(x); - return histogram; - }; - - // Specifies how to bin values in the histogram. The argument `x` may be - // specified as a number, in which case the range of values will be split - // uniformly into the given number of bins. Or, `x` may be an array of - // threshold values, defining the bins; the specified array must contain the - // rightmost (upper) value, thus specifying n + 1 values for n bins. Or, `x` - // may be a function which is evaluated, being passed the range, the array of - // values, and the current index `i`, returning an array of thresholds. The - // default bin function will divide the values into uniform bins using - // Sturges' formula. - histogram.bins = function(x) { - if (!arguments.length) return binner; - binner = typeof x === "number" - ? function(range) { return d3_layout_histogramBinFixed(range, x); } - : d3.functor(x); - return histogram; - }; - - // Specifies whether the histogram's `y` value is a count (frequency) or a - // probability (density). The default value is true. - histogram.frequency = function(x) { - if (!arguments.length) return frequency; - frequency = !!x; - return histogram; - }; - - return histogram; -}; - -function d3_layout_histogramBinSturges(range, values) { - return d3_layout_histogramBinFixed(range, Math.ceil(Math.log(values.length) / Math.LN2 + 1)); -} - -function d3_layout_histogramBinFixed(range, n) { - var x = -1, - b = +range[0], - m = (range[1] - b) / n, - f = []; - while (++x <= n) f[x] = m * x + b; - return f; -} - -function d3_layout_histogramRange(values) { - return [d3.min(values), d3.max(values)]; -} -d3.layout.hierarchy = function() { - var sort = d3_layout_hierarchySort, - children = d3_layout_hierarchyChildren, - value = d3_layout_hierarchyValue; - - // Recursively compute the node depth and value. - // Also converts the data representation into a standard hierarchy structure. - function recurse(data, depth, nodes) { - var childs = children.call(hierarchy, data, depth), - node = d3_layout_hierarchyInline ? data : {data: data}; - node.depth = depth; - nodes.push(node); - if (childs) { - var i = -1, - n = childs.length, - c = node.children = [], - v = 0, - j = depth + 1; - while (++i < n) { - d = recurse(childs[i], j, nodes); - d.parent = node; - c.push(d); - v += d.value; - } - if (sort) c.sort(sort); - if (value) node.value = v; - } else if (value) { - node.value = +value.call(hierarchy, data, depth) || 0; - } - return node; - } - - // Recursively re-evaluates the node value. - function revalue(node, depth) { - var children = node.children, - v = 0; - if (children) { - var i = -1, - n = children.length, - j = depth + 1; - while (++i < n) v += revalue(children[i], j); - } else if (value) { - v = +value.call(hierarchy, d3_layout_hierarchyInline ? node : node.data, depth) || 0; - } - if (value) node.value = v; - return v; - } - - function hierarchy(d) { - var nodes = []; - recurse(d, 0, nodes); - return nodes; - } - - hierarchy.sort = function(x) { - if (!arguments.length) return sort; - sort = x; - return hierarchy; - }; - - hierarchy.children = function(x) { - if (!arguments.length) return children; - children = x; - return hierarchy; - }; - - hierarchy.value = function(x) { - if (!arguments.length) return value; - value = x; - return hierarchy; - }; - - // Re-evaluates the `value` property for the specified hierarchy. - hierarchy.revalue = function(root) { - revalue(root, 0); - return root; - }; - - return hierarchy; -}; - -// A method assignment helper for hierarchy subclasses. -function d3_layout_hierarchyRebind(object, hierarchy) { - object.sort = d3.rebind(object, hierarchy.sort); - object.children = d3.rebind(object, hierarchy.children); - object.links = d3_layout_hierarchyLinks; - object.value = d3.rebind(object, hierarchy.value); - - // If the new API is used, enabling inlining. - object.nodes = function(d) { - d3_layout_hierarchyInline = true; - return (object.nodes = object)(d); - }; - - return object; -} - -function d3_layout_hierarchyChildren(d) { - return d.children; -} - -function d3_layout_hierarchyValue(d) { - return d.value; -} - -function d3_layout_hierarchySort(a, b) { - return b.value - a.value; -} - -// Returns an array source+target objects for the specified nodes. -function d3_layout_hierarchyLinks(nodes) { - return d3.merge(nodes.map(function(parent) { - return (parent.children || []).map(function(child) { - return {source: parent, target: child}; - }); - })); -} - -// For backwards-compatibility, don't enable inlining by default. -var d3_layout_hierarchyInline = false; -d3.layout.pack = function() { - var hierarchy = d3.layout.hierarchy().sort(d3_layout_packSort), - size = [1, 1]; - - function pack(d, i) { - var nodes = hierarchy.call(this, d, i), - root = nodes[0]; - - // Recursively compute the layout. - root.x = 0; - root.y = 0; - d3_layout_packTree(root); - - // Scale the layout to fit the requested size. - var w = size[0], - h = size[1], - k = 1 / Math.max(2 * root.r / w, 2 * root.r / h); - d3_layout_packTransform(root, w / 2, h / 2, k); - - return nodes; - } - - pack.size = function(x) { - if (!arguments.length) return size; - size = x; - return pack; - }; - - return d3_layout_hierarchyRebind(pack, hierarchy); -}; - -function d3_layout_packSort(a, b) { - return a.value - b.value; -} - -function d3_layout_packInsert(a, b) { - var c = a._pack_next; - a._pack_next = b; - b._pack_prev = a; - b._pack_next = c; - c._pack_prev = b; -} - -function d3_layout_packSplice(a, b) { - a._pack_next = b; - b._pack_prev = a; -} - -function d3_layout_packIntersects(a, b) { - var dx = b.x - a.x, - dy = b.y - a.y, - dr = a.r + b.r; - return (dr * dr - dx * dx - dy * dy) > .001; // within epsilon -} - -function d3_layout_packCircle(nodes) { - var xMin = Infinity, - xMax = -Infinity, - yMin = Infinity, - yMax = -Infinity, - n = nodes.length, - a, b, c, j, k; - - function bound(node) { - xMin = Math.min(node.x - node.r, xMin); - xMax = Math.max(node.x + node.r, xMax); - yMin = Math.min(node.y - node.r, yMin); - yMax = Math.max(node.y + node.r, yMax); - } - - // Create node links. - nodes.forEach(d3_layout_packLink); - - // Create first node. - a = nodes[0]; - a.x = -a.r; - a.y = 0; - bound(a); - - // Create second node. - if (n > 1) { - b = nodes[1]; - b.x = b.r; - b.y = 0; - bound(b); - - // Create third node and build chain. - if (n > 2) { - c = nodes[2]; - d3_layout_packPlace(a, b, c); - bound(c); - d3_layout_packInsert(a, c); - a._pack_prev = c; - d3_layout_packInsert(c, b); - b = a._pack_next; - - // Now iterate through the rest. - for (var i = 3; i < n; i++) { - d3_layout_packPlace(a, b, c = nodes[i]); - - // Search for the closest intersection. - var isect = 0, s1 = 1, s2 = 1; - for (j = b._pack_next; j !== b; j = j._pack_next, s1++) { - if (d3_layout_packIntersects(j, c)) { - isect = 1; - break; - } - } - if (isect == 1) { - for (k = a._pack_prev; k !== j._pack_prev; k = k._pack_prev, s2++) { - if (d3_layout_packIntersects(k, c)) { - if (s2 < s1) { - isect = -1; - j = k; - } - break; - } - } - } - - // Update node chain. - if (isect == 0) { - d3_layout_packInsert(a, c); - b = c; - bound(c); - } else if (isect > 0) { - d3_layout_packSplice(a, j); - b = j; - i--; - } else { // isect < 0 - d3_layout_packSplice(j, b); - a = j; - i--; - } - } - } - } - - // Re-center the circles and return the encompassing radius. - var cx = (xMin + xMax) / 2, - cy = (yMin + yMax) / 2, - cr = 0; - for (var i = 0; i < n; i++) { - var node = nodes[i]; - node.x -= cx; - node.y -= cy; - cr = Math.max(cr, node.r + Math.sqrt(node.x * node.x + node.y * node.y)); - } - - // Remove node links. - nodes.forEach(d3_layout_packUnlink); - - return cr; -} - -function d3_layout_packLink(node) { - node._pack_next = node._pack_prev = node; -} - -function d3_layout_packUnlink(node) { - delete node._pack_next; - delete node._pack_prev; -} - -function d3_layout_packTree(node) { - var children = node.children; - if (children) { - children.forEach(d3_layout_packTree); - node.r = d3_layout_packCircle(children); - } else { - node.r = Math.sqrt(node.value); - } -} - -function d3_layout_packTransform(node, x, y, k) { - var children = node.children; - node.x = (x += k * node.x); - node.y = (y += k * node.y); - node.r *= k; - if (children) { - var i = -1, n = children.length; - while (++i < n) d3_layout_packTransform(children[i], x, y, k); - } -} - -function d3_layout_packPlace(a, b, c) { - var da = b.r + c.r, - db = a.r + c.r, - dx = b.x - a.x, - dy = b.y - a.y, - dc = Math.sqrt(dx * dx + dy * dy), - cos = (db * db + dc * dc - da * da) / (2 * db * dc), - theta = Math.acos(cos), - x = cos * db, - h = Math.sin(theta) * db; - dx /= dc; - dy /= dc; - c.x = a.x + x * dx + h * dy; - c.y = a.y + x * dy - h * dx; -} -// Implements a hierarchical layout using the cluster (or dendogram) algorithm. -d3.layout.cluster = function() { - var hierarchy = d3.layout.hierarchy().sort(null).value(null), - separation = d3_layout_treeSeparation, - size = [1, 1]; // width, height - - function cluster(d, i) { - var nodes = hierarchy.call(this, d, i), - root = nodes[0], - previousNode, - x = 0, - kx, - ky; - - // First walk, computing the initial x & y values. - d3_layout_treeVisitAfter(root, function(node) { - if (node.children) { - node.x = d3_layout_clusterX(node.children); - node.y = d3_layout_clusterY(node.children); - } else { - node.x = previousNode ? x += separation(node, previousNode) : 0; - node.y = 0; - previousNode = node; - } - }); - - // Compute the left-most, right-most, and depth-most nodes for extents. - var left = d3_layout_clusterLeft(root), - right = d3_layout_clusterRight(root), - x0 = left.x - separation(left, right) / 2, - x1 = right.x + separation(right, left) / 2; - - // Second walk, normalizing x & y to the desired size. - d3_layout_treeVisitAfter(root, function(node) { - node.x = (node.x - x0) / (x1 - x0) * size[0]; - node.y = (1 - node.y / root.y) * size[1]; - }); - - return nodes; - } - - cluster.separation = function(x) { - if (!arguments.length) return separation; - separation = x; - return cluster; - }; - - cluster.size = function(x) { - if (!arguments.length) return size; - size = x; - return cluster; - }; - - return d3_layout_hierarchyRebind(cluster, hierarchy); -}; - -function d3_layout_clusterY(children) { - return 1 + d3.max(children, function(child) { - return child.y; - }); -} - -function d3_layout_clusterX(children) { - return children.reduce(function(x, child) { - return x + child.x; - }, 0) / children.length; -} - -function d3_layout_clusterLeft(node) { - var children = node.children; - return children ? d3_layout_clusterLeft(children[0]) : node; -} - -function d3_layout_clusterRight(node) { - var children = node.children; - return children ? d3_layout_clusterRight(children[children.length - 1]) : node; -} -// Node-link tree diagram using the Reingold-Tilford "tidy" algorithm -d3.layout.tree = function() { - var hierarchy = d3.layout.hierarchy().sort(null).value(null), - separation = d3_layout_treeSeparation, - size = [1, 1]; // width, height - - function tree(d, i) { - var nodes = hierarchy.call(this, d, i), - root = nodes[0]; - - function firstWalk(node, previousSibling) { - var children = node.children, - layout = node._tree; - if (children && (n = children.length)) { - var n, - firstChild = children[0], - previousChild, - ancestor = firstChild, - child, - i = -1; - while (++i < n) { - child = children[i]; - firstWalk(child, previousChild); - ancestor = apportion(child, previousChild, ancestor); - previousChild = child; - } - d3_layout_treeShift(node); - var midpoint = .5 * (firstChild._tree.prelim + child._tree.prelim); - if (previousSibling) { - layout.prelim = previousSibling._tree.prelim + separation(node, previousSibling); - layout.mod = layout.prelim - midpoint; - } else { - layout.prelim = midpoint; - } - } else { - if (previousSibling) { - layout.prelim = previousSibling._tree.prelim + separation(node, previousSibling); - } - } - } - - function secondWalk(node, x) { - node.x = node._tree.prelim + x; - var children = node.children; - if (children) { - var i = -1, - n = children.length; - x += node._tree.mod; - while (++i < n) { - secondWalk(children[i], x); - } - } - } - - function apportion(node, previousSibling, ancestor) { - if (previousSibling) { - var vip = node, - vop = node, - vim = previousSibling, - vom = node.parent.children[0], - sip = vip._tree.mod, - sop = vop._tree.mod, - sim = vim._tree.mod, - som = vom._tree.mod, - shift; - while (vim = d3_layout_treeRight(vim), vip = d3_layout_treeLeft(vip), vim && vip) { - vom = d3_layout_treeLeft(vom); - vop = d3_layout_treeRight(vop); - vop._tree.ancestor = node; - shift = vim._tree.prelim + sim - vip._tree.prelim - sip + separation(vim, vip); - if (shift > 0) { - d3_layout_treeMove(d3_layout_treeAncestor(vim, node, ancestor), node, shift); - sip += shift; - sop += shift; - } - sim += vim._tree.mod; - sip += vip._tree.mod; - som += vom._tree.mod; - sop += vop._tree.mod; - } - if (vim && !d3_layout_treeRight(vop)) { - vop._tree.thread = vim; - vop._tree.mod += sim - sop; - } - if (vip && !d3_layout_treeLeft(vom)) { - vom._tree.thread = vip; - vom._tree.mod += sip - som; - ancestor = node; - } - } - return ancestor; - } - - // Initialize temporary layout variables. - d3_layout_treeVisitAfter(root, function(node, previousSibling) { - node._tree = { - ancestor: node, - prelim: 0, - mod: 0, - change: 0, - shift: 0, - number: previousSibling ? previousSibling._tree.number + 1 : 0 - }; - }); - - // Compute the layout using Buchheim et al.'s algorithm. - firstWalk(root); - secondWalk(root, -root._tree.prelim); - - // Compute the left-most, right-most, and depth-most nodes for extents. - var left = d3_layout_treeSearch(root, d3_layout_treeLeftmost), - right = d3_layout_treeSearch(root, d3_layout_treeRightmost), - deep = d3_layout_treeSearch(root, d3_layout_treeDeepest), - x0 = left.x - separation(left, right) / 2, - x1 = right.x + separation(right, left) / 2, - y1 = deep.depth || 1; - - // Clear temporary layout variables; transform x and y. - d3_layout_treeVisitAfter(root, function(node) { - node.x = (node.x - x0) / (x1 - x0) * size[0]; - node.y = node.depth / y1 * size[1]; - delete node._tree; - }); - - return nodes; - } - - tree.separation = function(x) { - if (!arguments.length) return separation; - separation = x; - return tree; - }; - - tree.size = function(x) { - if (!arguments.length) return size; - size = x; - return tree; - }; - - return d3_layout_hierarchyRebind(tree, hierarchy); -}; - -function d3_layout_treeSeparation(a, b) { - return a.parent == b.parent ? 1 : 2; -} - -// function d3_layout_treeSeparationRadial(a, b) { -// return (a.parent == b.parent ? 1 : 2) / a.depth; -// } - -function d3_layout_treeLeft(node) { - return node.children ? node.children[0] : node._tree.thread; -} - -function d3_layout_treeRight(node) { - return node.children ? node.children[node.children.length - 1] : node._tree.thread; -} - -function d3_layout_treeSearch(node, compare) { - var children = node.children; - if (children) { - var child, - n = children.length, - i = -1; - while (++i < n) { - if (compare(child = d3_layout_treeSearch(children[i], compare), node) > 0) { - node = child; - } - } - } - return node; -} - -function d3_layout_treeRightmost(a, b) { - return a.x - b.x; -} - -function d3_layout_treeLeftmost(a, b) { - return b.x - a.x; -} - -function d3_layout_treeDeepest(a, b) { - return a.depth - b.depth; -} - -function d3_layout_treeVisitAfter(node, callback) { - function visit(node, previousSibling) { - var children = node.children; - if (children) { - var child, - previousChild = null, - i = -1, - n = children.length; - while (++i < n) { - child = children[i]; - visit(child, previousChild); - previousChild = child; - } - } - callback(node, previousSibling); - } - visit(node, null); -} - -function d3_layout_treeShift(node) { - var shift = 0, - change = 0, - children = node.children, - i = children.length, - child; - while (--i >= 0) { - child = children[i]._tree; - child.prelim += shift; - child.mod += shift; - shift += child.shift + (change += child.change); - } -} - -function d3_layout_treeMove(ancestor, node, shift) { - ancestor = ancestor._tree; - node = node._tree; - var change = shift / (node.number - ancestor.number); - ancestor.change += change; - node.change -= change; - node.shift += shift; - node.prelim += shift; - node.mod += shift; -} - -function d3_layout_treeAncestor(vim, node, ancestor) { - return vim._tree.ancestor.parent == node.parent - ? vim._tree.ancestor - : ancestor; -} -// Squarified Treemaps by Mark Bruls, Kees Huizing, and Jarke J. van Wijk -// Modified to support a target aspect ratio by Jeff Heer -d3.layout.treemap = function() { - var hierarchy = d3.layout.hierarchy(), - round = Math.round, - size = [1, 1], // width, height - padding = null, - pad = d3_layout_treemapPadNull, - sticky = false, - stickies, - ratio = 0.5 * (1 + Math.sqrt(5)); // golden ratio - - // Compute the area for each child based on value & scale. - function scale(children, k) { - var i = -1, - n = children.length, - child, - area; - while (++i < n) { - area = (child = children[i]).value * (k < 0 ? 0 : k); - child.area = isNaN(area) || area <= 0 ? 0 : area; - } - } - - // Recursively arranges the specified node's children into squarified rows. - function squarify(node) { - if (!node.children) return; - var rect = pad(node), - row = [], - children = node.children.slice(), // copy-on-write - child, - best = Infinity, // the best row score so far - score, // the current row score - u = Math.min(rect.dx, rect.dy), // initial orientation - n; - scale(children, rect.dx * rect.dy / node.value); - row.area = 0; - while ((n = children.length) > 0) { - row.push(child = children[n - 1]); - row.area += child.area; - if ((score = worst(row, u)) <= best) { // continue with this orientation - children.pop(); - best = score; - } else { // abort, and try a different orientation - row.area -= row.pop().area; - position(row, u, rect, false); - u = Math.min(rect.dx, rect.dy); - row.length = row.area = 0; - best = Infinity; - } - } - if (row.length) { - position(row, u, rect, true); - row.length = row.area = 0; - } - node.children.forEach(squarify); - } - - // Recursively resizes the specified node's children into existing rows. - // Preserves the existing layout! - function stickify(node) { - if (!node.children) return; - var rect = pad(node), - children = node.children.slice(), // copy-on-write - child, - row = []; - scale(children, rect.dx * rect.dy / node.value); - row.area = 0; - while (child = children.pop()) { - row.push(child); - row.area += child.area; - if (child.z != null) { - position(row, child.z ? rect.dx : rect.dy, rect, !children.length); - row.length = row.area = 0; - } - } - node.children.forEach(stickify); - } - - // Computes the score for the specified row, as the worst aspect ratio. - function worst(row, u) { - var s = row.area, - r, - rmax = 0, - rmin = Infinity, - i = -1, - n = row.length; - while (++i < n) { - if (!(r = row[i].area)) continue; - if (r < rmin) rmin = r; - if (r > rmax) rmax = r; - } - s *= s; - u *= u; - return s - ? Math.max((u * rmax * ratio) / s, s / (u * rmin * ratio)) - : Infinity; - } - - // Positions the specified row of nodes. Modifies `rect`. - function position(row, u, rect, flush) { - var i = -1, - n = row.length, - x = rect.x, - y = rect.y, - v = u ? round(row.area / u) : 0, - o; - if (u == rect.dx) { // horizontal subdivision - if (flush || v > rect.dy) v = v ? rect.dy : 0; // over+underflow - while (++i < n) { - o = row[i]; - o.x = x; - o.y = y; - o.dy = v; - x += o.dx = v ? round(o.area / v) : 0; - } - o.z = true; - o.dx += rect.x + rect.dx - x; // rounding error - rect.y += v; - rect.dy -= v; - } else { // vertical subdivision - if (flush || v > rect.dx) v = v ? rect.dx : 0; // over+underflow - while (++i < n) { - o = row[i]; - o.x = x; - o.y = y; - o.dx = v; - y += o.dy = v ? round(o.area / v) : 0; - } - o.z = false; - o.dy += rect.y + rect.dy - y; // rounding error - rect.x += v; - rect.dx -= v; - } - } - - function treemap(d) { - var nodes = stickies || hierarchy(d), - root = nodes[0]; - root.x = 0; - root.y = 0; - root.dx = size[0]; - root.dy = size[1]; - if (stickies) hierarchy.revalue(root); - scale([root], root.dx * root.dy / root.value); - (stickies ? stickify : squarify)(root); - if (sticky) stickies = nodes; - return nodes; - } - - treemap.size = function(x) { - if (!arguments.length) return size; - size = x; - return treemap; - }; - - treemap.padding = function(x) { - if (!arguments.length) return padding; - - function padFunction(node) { - var p = x.call(treemap, node, node.depth); - return p == null - ? d3_layout_treemapPadNull(node) - : d3_layout_treemapPad(node, typeof p === "number" ? [p, p, p, p] : p); - } - - function padConstant(node) { - return d3_layout_treemapPad(node, x); - } - - var type; - pad = (padding = x) == null ? d3_layout_treemapPadNull - : (type = typeof x) === "function" ? padFunction - : type === "number" ? (x = [x, x, x, x], padConstant) - : padConstant; - return treemap; - }; - - treemap.round = function(x) { - if (!arguments.length) return round != Number; - round = x ? Math.round : Number; - return treemap; - }; - - treemap.sticky = function(x) { - if (!arguments.length) return sticky; - sticky = x; - stickies = null; - return treemap; - }; - - treemap.ratio = function(x) { - if (!arguments.length) return ratio; - ratio = x; - return treemap; - }; - - return d3_layout_hierarchyRebind(treemap, hierarchy); -}; - -function d3_layout_treemapPadNull(node) { - return {x: node.x, y: node.y, dx: node.dx, dy: node.dy}; -} - -function d3_layout_treemapPad(node, padding) { - var x = node.x + padding[3], - y = node.y + padding[0], - dx = node.dx - padding[1] - padding[3], - dy = node.dy - padding[0] - padding[2]; - if (dx < 0) { x += dx / 2; dx = 0; } - if (dy < 0) { y += dy / 2; dy = 0; } - return {x: x, y: y, dx: dx, dy: dy}; -} -})(); diff --git a/deep_sequencing_unit/source/core-plugins/downloader/1/as/webapps/downloader/html/d3.time.js b/deep_sequencing_unit/source/core-plugins/downloader/1/as/webapps/downloader/html/d3.time.js deleted file mode 100644 index e1c0831c88e2984fbabc189a5347238bde72abb2..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/source/core-plugins/downloader/1/as/webapps/downloader/html/d3.time.js +++ /dev/null @@ -1,692 +0,0 @@ -(function(){d3.time = {}; - -var d3_time = Date; -d3.time.format = function(template) { - var n = template.length; - - function format(date) { - var string = [], - i = -1, - j = 0, - c, - f; - while (++i < n) { - if (template.charCodeAt(i) == 37) { - string.push( - template.substring(j, i), - (f = d3_time_formats[c = template.charAt(++i)]) - ? f(date) : c); - j = i + 1; - } - } - string.push(template.substring(j, i)); - return string.join(""); - } - - format.parse = function(string) { - var date = new d3_time(1900, 0, 1), - i = d3_time_parse(date, template, string, 0); - if (i != string.length) return null; - if (date.hour12) { - var hours = date.getHours() % 12; - date.setHours(date.hour12pm ? hours + 12 : hours); - } - delete date.hour12; - delete date.hour12pm; - return date; - }; - - format.toString = function() { - return template; - }; - - return format; -}; - -function d3_time_parse(date, template, string, j) { - var c, - p, - i = 0, - n = template.length, - m = string.length; - while (i < n) { - if (j >= m) return -1; - c = template.charCodeAt(i++); - if (c == 37) { - p = d3_time_parsers[template.charAt(i++)]; - if (!p || ((j = p(date, string, j)) < 0)) return -1; - } else if (c != string.charCodeAt(j++)) { - return -1; - } - } - return j; -} - -var d3_time_zfill2 = d3.format("02d"), - d3_time_zfill3 = d3.format("03d"), - d3_time_zfill4 = d3.format("04d"), - d3_time_sfill2 = d3.format("2d"); - -var d3_time_formats = { - a: function(d) { return d3_time_weekdays[d.getDay()].substring(0, 3); }, - A: function(d) { return d3_time_weekdays[d.getDay()]; }, - b: function(d) { return d3_time_months[d.getMonth()].substring(0, 3); }, - B: function(d) { return d3_time_months[d.getMonth()]; }, - c: d3.time.format("%a %b %e %H:%M:%S %Y"), - d: function(d) { return d3_time_zfill2(d.getDate()); }, - e: function(d) { return d3_time_sfill2(d.getDate()); }, - H: function(d) { return d3_time_zfill2(d.getHours()); }, - I: function(d) { return d3_time_zfill2(d.getHours() % 12 || 12); }, - j: d3_time_dayOfYear, - L: function(d) { return d3_time_zfill3(d.getMilliseconds()); }, - m: function(d) { return d3_time_zfill2(d.getMonth() + 1); }, - M: function(d) { return d3_time_zfill2(d.getMinutes()); }, - p: function(d) { return d.getHours() >= 12 ? "PM" : "AM"; }, - S: function(d) { return d3_time_zfill2(d.getSeconds()); }, - U: d3_time_weekNumberSunday, - w: function(d) { return d.getDay(); }, - W: d3_time_weekNumberMonday, - x: d3.time.format("%m/%d/%y"), - X: d3.time.format("%H:%M:%S"), - y: function(d) { return d3_time_zfill2(d.getFullYear() % 100); }, - Y: function(d) { return d3_time_zfill4(d.getFullYear() % 10000); }, - Z: d3_time_zone, - "%": function(d) { return "%"; } -}; - -var d3_time_parsers = { - a: d3_time_parseWeekdayAbbrev, - A: d3_time_parseWeekday, - b: d3_time_parseMonthAbbrev, - B: d3_time_parseMonth, - c: d3_time_parseLocaleFull, - d: d3_time_parseDay, - e: d3_time_parseDay, - H: d3_time_parseHour24, - I: d3_time_parseHour12, - // j: function(d, s, i) { /*TODO day of year [001,366] */ return i; }, - L: d3_time_parseMilliseconds, - m: d3_time_parseMonthNumber, - M: d3_time_parseMinutes, - p: d3_time_parseAmPm, - S: d3_time_parseSeconds, - // U: function(d, s, i) { /*TODO week number (sunday) [00,53] */ return i; }, - // w: function(d, s, i) { /*TODO weekday [0,6] */ return i; }, - // W: function(d, s, i) { /*TODO week number (monday) [00,53] */ return i; }, - x: d3_time_parseLocaleDate, - X: d3_time_parseLocaleTime, - y: d3_time_parseYear, - Y: d3_time_parseFullYear - // , - // Z: function(d, s, i) { /*TODO time zone */ return i; }, - // "%": function(d, s, i) { /*TODO literal % */ return i; } -}; - -// Note: weekday is validated, but does not set the date. -function d3_time_parseWeekdayAbbrev(date, string, i) { - return string.substring(i, i += 3).toLowerCase() in d3_time_weekdayAbbrevLookup ? i : -1; -} - -var d3_time_weekdayAbbrevLookup = { - sun: 3, - mon: 3, - tue: 3, - wed: 3, - thu: 3, - fri: 3, - sat: 3 -}; - -// Note: weekday is validated, but does not set the date. -function d3_time_parseWeekday(date, string, i) { - d3_time_weekdayRe.lastIndex = 0; - var n = d3_time_weekdayRe.exec(string.substring(i, i + 10)); - return n ? i += n[0].length : -1; -} - -var d3_time_weekdayRe = /^(?:Sunday|Monday|Tuesday|Wednesday|Thursday|Friday|Saturday)/ig; - -var d3_time_weekdays = [ - "Sunday", - "Monday", - "Tuesday", - "Wednesday", - "Thursday", - "Friday", - "Saturday" -]; - -function d3_time_parseMonthAbbrev(date, string, i) { - var n = d3_time_monthAbbrevLookup[string.substring(i, i += 3).toLowerCase()]; - return n == null ? -1 : (date.setMonth(n), i); -} - -var d3_time_monthAbbrevLookup = { - jan: 0, - feb: 1, - mar: 2, - apr: 3, - may: 4, - jun: 5, - jul: 6, - aug: 7, - sep: 8, - oct: 9, - nov: 10, - dec: 11 -}; - -function d3_time_parseMonth(date, string, i) { - d3_time_monthRe.lastIndex = 0; - var n = d3_time_monthRe.exec(string.substring(i, i + 12)); - return n ? (date.setMonth(d3_time_monthLookup[n[0].toLowerCase()]), i += n[0].length) : -1; -} - -var d3_time_monthRe = /^(?:January|February|March|April|May|June|July|August|September|October|November|December)/ig; - -var d3_time_monthLookup = { - january: 0, - february: 1, - march: 2, - april: 3, - may: 4, - june: 5, - july: 6, - august: 7, - september: 8, - october: 9, - november: 10, - december: 11 -}; - -var d3_time_months = [ - "January", - "February", - "March", - "April", - "May", - "June", - "July", - "August", - "September", - "October", - "November", - "December" -]; - -function d3_time_parseLocaleFull(date, string, i) { - return d3_time_parse(date, d3_time_formats.c.toString(), string, i); -} - -function d3_time_parseLocaleDate(date, string, i) { - return d3_time_parse(date, d3_time_formats.x.toString(), string, i); -} - -function d3_time_parseLocaleTime(date, string, i) { - return d3_time_parse(date, d3_time_formats.X.toString(), string, i); -} - -function d3_time_parseFullYear(date, string, i) { - d3_time_numberRe.lastIndex = 0; - var n = d3_time_numberRe.exec(string.substring(i, i + 4)); - return n ? (date.setFullYear(n[0]), i += n[0].length) : -1; -} - -function d3_time_parseYear(date, string, i) { - d3_time_numberRe.lastIndex = 0; - var n = d3_time_numberRe.exec(string.substring(i, i + 2)); - return n ? (date.setFullYear(d3_time_century() + +n[0]), i += n[0].length) : -1; -} - -function d3_time_century() { - return ~~(new Date().getFullYear() / 1000) * 1000; -} - -function d3_time_parseMonthNumber(date, string, i) { - d3_time_numberRe.lastIndex = 0; - var n = d3_time_numberRe.exec(string.substring(i, i + 2)); - return n ? (date.setMonth(n[0] - 1), i += n[0].length) : -1; -} - -function d3_time_parseDay(date, string, i) { - d3_time_numberRe.lastIndex = 0; - var n = d3_time_numberRe.exec(string.substring(i, i + 2)); - return n ? (date.setDate(+n[0]), i += n[0].length) : -1; -} - -// Note: we don't validate that the hour is in the range [0,23]. -function d3_time_parseHour24(date, string, i) { - d3_time_numberRe.lastIndex = 0; - var n = d3_time_numberRe.exec(string.substring(i, i + 2)); - return n ? (date.setHours(+n[0]), i += n[0].length) : -1; -} - -// Note: we don't validate that the hour is in the range [1,12]. -function d3_time_parseHour12(date, string, i) { - date.hour12 = true; - return d3_time_parseHour24(date, string, i); -} - -function d3_time_parseMinutes(date, string, i) { - d3_time_numberRe.lastIndex = 0; - var n = d3_time_numberRe.exec(string.substring(i, i + 2)); - return n ? (date.setMinutes(+n[0]), i += n[0].length) : -1; -} - -function d3_time_parseSeconds(date, string, i) { - d3_time_numberRe.lastIndex = 0; - var n = d3_time_numberRe.exec(string.substring(i, i + 2)); - return n ? (date.setSeconds(+n[0]), i += n[0].length) : -1; -} - -function d3_time_parseMilliseconds(date, string, i) { - d3_time_numberRe.lastIndex = 0; - var n = d3_time_numberRe.exec(string.substring(i, i + 3)); - return n ? (date.setMilliseconds(+n[0]), i += n[0].length) : -1; -} - -// Note: we don't look at the next directive. -var d3_time_numberRe = /\s*\d+/; - -function d3_time_parseAmPm(date, string, i) { - var n = d3_time_amPmLookup[string.substring(i, i += 2).toLowerCase()]; - return n == null ? -1 : (date.hour12pm = n, i); -} - -var d3_time_amPmLookup = { - am: 0, - pm: 1 -}; - -function d3_time_year(d) { - return new d3_time(d.getFullYear(), 0, 1); -} - -function d3_time_daysElapsed(d0, d1) { - return ~~((d1 - d0) / 864e5 - (d1.getTimezoneOffset() - d0.getTimezoneOffset()) / 1440); -} - -function d3_time_dayOfYear(d) { - return d3_time_zfill3(1 + d3_time_daysElapsed(d3_time_year(d), d)); -} - -function d3_time_weekNumberSunday(d) { - var d0 = d3_time_year(d); - return d3_time_zfill2(~~((d3_time_daysElapsed(d0, d) + d0.getDay()) / 7)); -} - -function d3_time_weekNumberMonday(d) { - var d0 = d3_time_year(d); - return d3_time_zfill2(~~((d3_time_daysElapsed(d0, d) + (d0.getDay() + 6) % 7) / 7)); -} - -// TODO table of time zone offset names? -function d3_time_zone(d) { - var z = d.getTimezoneOffset(), - zs = z > 0 ? "-" : "+", - zh = ~~(Math.abs(z) / 60), - zm = Math.abs(z) % 60; - return zs + d3_time_zfill2(zh) + d3_time_zfill2(zm); -} -d3.time.format.utc = function(template) { - var local = d3.time.format(template); - - function format(date) { - try { - d3_time = d3_time_format_utc; - var utc = new d3_time(); - utc._ = date; - return local(utc); - } finally { - d3_time = Date; - } - } - - format.parse = function(string) { - try { - d3_time = d3_time_format_utc; - var date = local.parse(string); - return date && date._; - } finally { - d3_time = Date; - } - }; - - format.toString = local.toString; - - return format; -}; - -function d3_time_format_utc() { - this._ = new Date(Date.UTC.apply(this, arguments)); -} - -d3_time_format_utc.prototype = { - getDate: function() { return this._.getUTCDate(); }, - getDay: function() { return this._.getUTCDay(); }, - getFullYear: function() { return this._.getUTCFullYear(); }, - getHours: function() { return this._.getUTCHours(); }, - getMilliseconds: function() { return this._.getUTCMilliseconds(); }, - getMinutes: function() { return this._.getUTCMinutes(); }, - getMonth: function() { return this._.getUTCMonth(); }, - getSeconds: function() { return this._.getUTCSeconds(); }, - getTimezoneOffset: function() { return 0; }, - valueOf: function() { return this._.getTime(); }, - setDate: function(x) { this._.setUTCDate(x); }, - setDay: function(x) { this._.setUTCDay(x); }, - setFullYear: function(x) { this._.setUTCFullYear(x); }, - setHours: function(x) { this._.setUTCHours(x); }, - setMilliseconds: function(x) { this._.setUTCMilliseconds(x); }, - setMinutes: function(x) { this._.setUTCMinutes(x); }, - setMonth: function(x) { this._.setUTCMonth(x); }, - setSeconds: function(x) { this._.setUTCSeconds(x); } -}; -var d3_time_formatIso = d3.time.format.utc("%Y-%m-%dT%H:%M:%S.%LZ"); - -d3.time.format.iso = Date.prototype.toISOString ? d3_time_formatIsoNative : d3_time_formatIso; - -function d3_time_formatIsoNative(date) { - return date.toISOString(); -} - -d3_time_formatIsoNative.parse = function(string) { - return new Date(string); -}; - -d3_time_formatIsoNative.toString = d3_time_formatIso.toString; -function d3_time_range(floor, step, number) { - return function(t0, t1, dt) { - var time = floor(t0), times = []; - if (time < t0) step(time); - if (dt > 1) { - while (time < t1) { - var date = new Date(+time); - if (!(number(date) % dt)) times.push(date); - step(time); - } - } else { - while (time < t1) times.push(new Date(+time)), step(time); - } - return times; - }; -} -d3.time.second = function(date) { - return new Date(~~(date / 1e3) * 1e3); -}; - -d3.time.second.utc = d3.time.second; -d3.time.seconds = d3_time_range(d3.time.second, function(date) { - date.setTime(date.getTime() + 1e3); -}, function(date) { - return date.getSeconds(); -}); - -d3.time.seconds.utc = d3.time.seconds; -d3.time.minute = function(date) { - return new Date(~~(date / 6e4) * 6e4); -}; - -d3.time.minute.utc = d3.time.minute;d3.time.minutes = d3_time_range(d3.time.minute, d3_time_minutesStep, function(date) { - return date.getMinutes(); -}); - -d3.time.minutes.utc = d3_time_range(d3.time.minute, d3_time_minutesStep, function(date) { - return date.getUTCMinutes(); -}); - -function d3_time_minutesStep(date) { - date.setTime(date.getTime() + 6e4); // assumes no leap seconds -} -d3.time.hour = function(date) { - var offset = date.getTimezoneOffset() / 60; - return new Date((~~(date / 36e5 - offset) + offset) * 36e5); -}; - -d3.time.hour.utc = function(date) { - return new Date(~~(date / 36e5) * 36e5); -}; -d3.time.hours = d3_time_range(d3.time.hour, d3_time_hoursStep, function(date) { - return date.getHours(); -}); - -d3.time.hours.utc = d3_time_range(d3.time.hour.utc, d3_time_hoursStep, function(date) { - return date.getUTCHours(); -}); - -function d3_time_hoursStep(date) { - date.setTime(date.getTime() + 36e5); -} -d3.time.day = function(date) { - return new Date(date.getFullYear(), date.getMonth(), date.getDate()); -}; - -d3.time.day.utc = function(date) { - return new Date(~~(date / 864e5) * 864e5); -}; -d3.time.days = d3_time_range(d3.time.day, function(date) { - date.setDate(date.getDate() + 1); -}, function(date) { - return date.getDate() - 1; -}); - -d3.time.days.utc = d3_time_range(d3.time.day.utc, function(date) { - date.setUTCDate(date.getUTCDate() + 1); -}, function(date) { - return date.getUTCDate() - 1; -}); -d3.time.week = function(date) { - (date = d3.time.day(date)).setDate(date.getDate() - date.getDay()); - return date; -}; - -d3.time.week.utc = function(date) { - (date = d3.time.day.utc(date)).setUTCDate(date.getUTCDate() - date.getUTCDay()); - return date; -}; -d3.time.weeks = d3_time_range(d3.time.week, function(date) { - date.setDate(date.getDate() + 7); -}, function(date) { - return ~~((date - new Date(date.getFullYear(), 0, 1)) / 6048e5); -}); - -d3.time.weeks.utc = d3_time_range(d3.time.week.utc, function(date) { - date.setUTCDate(date.getUTCDate() + 7); -}, function(date) { - return ~~((date - Date.UTC(date.getUTCFullYear(), 0, 1)) / 6048e5); -}); -d3.time.month = function(date) { - return new Date(date.getFullYear(), date.getMonth(), 1); -}; - -d3.time.month.utc = function(date) { - return new Date(Date.UTC(date.getUTCFullYear(), date.getUTCMonth(), 1)); -}; -d3.time.months = d3_time_range(d3.time.month, function(date) { - date.setMonth(date.getMonth() + 1); -}, function(date) { - return date.getMonth(); -}); - -d3.time.months.utc = d3_time_range(d3.time.month.utc, function(date) { - date.setUTCMonth(date.getUTCMonth() + 1); -}, function(date) { - return date.getUTCMonth(); -}); -d3.time.year = function(date) { - return new Date(date.getFullYear(), 0, 1); -}; - -d3.time.year.utc = function(date) { - return new Date(Date.UTC(date.getUTCFullYear(), 0, 1)); -}; -d3.time.years = d3_time_range(d3.time.year, function(date) { - date.setFullYear(date.getFullYear() + 1); -}, function(date) { - return date.getFullYear(); -}); - -d3.time.years.utc = d3_time_range(d3.time.year.utc, function(date) { - date.setUTCFullYear(date.getUTCFullYear() + 1); -}, function(date) { - return date.getUTCFullYear(); -}); -// TODO nice -function d3_time_scale(linear, methods, format) { - - function scale(x) { - return linear(x); - } - - scale.invert = function(x) { - return d3_time_scaleDate(linear.invert(x)); - }; - - scale.domain = function(x) { - if (!arguments.length) return linear.domain().map(d3_time_scaleDate); - linear.domain(x); - return scale; - }; - - scale.ticks = function(m, k) { - var extent = d3_time_scaleExtent(scale.domain()); - if (typeof m !== "function") { - var span = extent[1] - extent[0], - target = span / m, - i = d3.bisect(d3_time_scaleSteps, target, 1, d3_time_scaleSteps.length - 1); - if (Math.log(target / d3_time_scaleSteps[i - 1]) < Math.log(d3_time_scaleSteps[i] / target)) --i; - m = methods[i]; - k = m[1]; - m = m[0]; - } - return m(extent[0], extent[1], k); - }; - - scale.tickFormat = function() { - return format; - }; - - scale.copy = function() { - return d3_time_scale(linear.copy(), methods, format); - }; - - // TOOD expose d3_scale_linear_rebind? - scale.range = d3.rebind(scale, linear.range); - scale.rangeRound = d3.rebind(scale, linear.rangeRound); - scale.interpolate = d3.rebind(scale, linear.interpolate); - scale.clamp = d3.rebind(scale, linear.clamp); - - return scale; -} - -// TODO expose d3_scaleExtent? -function d3_time_scaleExtent(domain) { - var start = domain[0], stop = domain[domain.length - 1]; - return start < stop ? [start, stop] : [stop, start]; -} - -function d3_time_scaleDate(t) { - return new Date(t); -} - -function d3_time_scaleFormat(formats) { - return function(date) { - var i = formats.length - 1, f = formats[i]; - while (!f[1](date)) f = formats[--i]; - return f[0](date); - }; -} - -var d3_time_scaleSteps = [ - 1e3, // 1-second - 5e3, // 5-second - 15e3, // 15-second - 3e4, // 30-second - 6e4, // 1-minute - 3e5, // 5-minute - 9e5, // 15-minute - 18e5, // 30-minute - 36e5, // 1-hour - 108e5, // 3-hour - 216e5, // 6-hour - 432e5, // 12-hour - 864e5, // 1-day - 1728e5, // 2-day - 6048e5, // 1-week - 1728e6, // 1-month - 7776e6, // 3-month - 31536e6 // 1-year -]; - -var d3_time_scaleLocalMethods = [ - [d3.time.seconds, 1], - [d3.time.seconds, 5], - [d3.time.seconds, 15], - [d3.time.seconds, 30], - [d3.time.minutes, 1], - [d3.time.minutes, 5], - [d3.time.minutes, 15], - [d3.time.minutes, 30], - [d3.time.hours, 1], - [d3.time.hours, 3], - [d3.time.hours, 6], - [d3.time.hours, 12], - [d3.time.days, 1], - [d3.time.days, 2], - [d3.time.weeks, 1], - [d3.time.months, 1], - [d3.time.months, 3], - [d3.time.years, 1] -]; - -var d3_time_scaleLocalFormats = [ - [d3.time.format("%Y"), function(d) { return true; }], - [d3.time.format("%B"), function(d) { return d.getMonth(); }], - [d3.time.format("%b %d"), function(d) { return d.getDate() != 1; }], - [d3.time.format("%a %d"), function(d) { return d.getDay() && d.getDate() != 1; }], - [d3.time.format("%I %p"), function(d) { return d.getHours(); }], - [d3.time.format("%I:%M"), function(d) { return d.getMinutes(); }], - [d3.time.format(":%S"), function(d) { return d.getSeconds() || d.getMilliseconds(); }] -]; - -var d3_time_scaleLocalFormat = d3_time_scaleFormat(d3_time_scaleLocalFormats); - -d3.time.scale = function() { - return d3_time_scale(d3.scale.linear(), d3_time_scaleLocalMethods, d3_time_scaleLocalFormat); -}; -var d3_time_scaleUTCMethods = [ - [d3.time.seconds.utc, 1], - [d3.time.seconds.utc, 5], - [d3.time.seconds.utc, 15], - [d3.time.seconds.utc, 30], - [d3.time.minutes.utc, 1], - [d3.time.minutes.utc, 5], - [d3.time.minutes.utc, 15], - [d3.time.minutes.utc, 30], - [d3.time.hours.utc, 1], - [d3.time.hours.utc, 3], - [d3.time.hours.utc, 6], - [d3.time.hours.utc, 12], - [d3.time.days.utc, 1], - [d3.time.days.utc, 2], - [d3.time.weeks.utc, 1], - [d3.time.months.utc, 1], - [d3.time.months.utc, 3], - [d3.time.years.utc, 1] -]; - -var d3_time_scaleUTCFormats = [ - [d3.time.format.utc("%Y"), function(d) { return true; }], - [d3.time.format.utc("%B"), function(d) { return d.getUTCMonth(); }], - [d3.time.format.utc("%b %d"), function(d) { return d.getUTCDate() != 1; }], - [d3.time.format.utc("%a %d"), function(d) { return d.getUTCDay() && d.getUTCDate() != 1; }], - [d3.time.format.utc("%I %p"), function(d) { return d.getUTCHours(); }], - [d3.time.format.utc("%I:%M"), function(d) { return d.getUTCMinutes(); }], - [d3.time.format.utc(":%S"), function(d) { return d.getUTCSeconds() || d.getUTCMilliseconds(); }] -]; - -var d3_time_scaleUTCFormat = d3_time_scaleFormat(d3_time_scaleUTCFormats); - -d3.time.scale.utc = function() { - return d3_time_scale(d3.scale.linear(), d3_time_scaleUTCMethods, d3_time_scaleUTCFormat); -}; -})(); diff --git a/deep_sequencing_unit/source/core-plugins/downloader/1/as/webapps/downloader/html/images/openBIS_Logo.svg b/deep_sequencing_unit/source/core-plugins/downloader/1/as/webapps/downloader/html/images/openBIS_Logo.svg deleted file mode 100644 index 70ac6c77f2774a5a5e8f6875e3c8ae1acb8e952a..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/source/core-plugins/downloader/1/as/webapps/downloader/html/images/openBIS_Logo.svg +++ /dev/null @@ -1,68 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- Generator: Adobe Illustrator 15.0.2, SVG Export Plug-In . SVG Version: 6.00 Build 0) --> -<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> -<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" - width="400.023px" height="174.566px" viewBox="0 0 400.023 174.566" enable-background="new 0 0 400.023 174.566" - xml:space="preserve"> -<g id="Layer_1"> - <g> - <text transform="matrix(1 0 0 1 46.4854 154.2764)"><tspan x="0" y="0" fill="#010101" font-family="'HelveticaNeue-Bold'" font-size="93.505" letter-spacing="-4">open</tspan><tspan x="204.679" y="0" fill="#231F20" font-family="'HelveticaNeue'" font-size="93.505">BIS</tspan></text> - <rect x="204.234" y="158.748" fill="none" width="192.64" height="14.936"/> - <text transform="matrix(1 0 0 1 204.2329 169.876)" fill="#010101" font-family="'HelveticaNeue'" font-size="15.5842">Biology Information System</text> - <g> - <g> - <g> - <g> - <polygon fill="#068172" points="125.213,81.967 141.416,98.167 147.252,92.333 131.053,76.132 125.213,76.132 "/> - </g> - <g> - <g> - <polygon fill="#068172" points="120.206,81.967 104.005,98.167 98.168,92.333 114.368,76.132 120.206,76.132 "/> - </g> - <g> - <polygon fill="#068172" points="120.206,65.286 104.005,49.084 98.168,54.92 114.368,71.12 120.206,71.12 "/> - </g> - </g> - </g> - <g> - <polygon fill="#068172" points="125.213,65.286 141.416,49.084 147.252,54.92 131.053,71.12 125.213,71.12 "/> - </g> - </g> - <g> - <g> - <polygon fill="#A4A4A4" points="76.131,16.201 92.331,0 98.168,5.836 81.969,22.036 76.13,22.036 "/> - </g> - <g> - <g> - <polygon fill="#ADACAF" points="76.131,32.882 92.331,49.084 98.168,43.247 81.969,27.048 76.13,27.048 "/> - </g> - <g> - <g> - <polygon fill="#ADACAF" points="71.122,32.882 54.921,49.084 49.084,43.247 65.283,27.048 71.123,27.048 "/> - </g> - <g> - <polygon fill="#ADACAF" points="71.122,16.201 54.921,0 49.084,5.836 65.283,22.036 71.123,22.036 "/> - </g> - </g> - </g> - </g> - <g> - <g> - <polygon fill="#ADACAF" points="27.046,65.286 43.247,49.084 49.083,54.92 32.884,71.12 27.045,71.12 "/> - </g> - <g> - <polygon fill="#ADACAF" points="27.046,81.967 43.247,98.167 49.083,92.333 32.884,76.132 27.045,76.132 "/> - </g> - <g> - <polygon fill="#ADACAF" points="22.038,81.967 5.837,98.167 0,92.333 16.199,76.132 22.038,76.132 "/> - </g> - <g> - <polygon fill="#ADACAF" points="22.038,65.286 5.837,49.084 0,54.92 16.199,71.12 22.038,71.12 "/> - </g> - </g> - </g> - </g> -</g> -<g id="Layer_2"> -</g> -</svg> diff --git a/deep_sequencing_unit/source/core-plugins/downloader/1/as/webapps/downloader/html/images/sprite.png b/deep_sequencing_unit/source/core-plugins/downloader/1/as/webapps/downloader/html/images/sprite.png deleted file mode 100644 index b9e19ef18acf68223cf6878c397ffa47ae933478..0000000000000000000000000000000000000000 Binary files a/deep_sequencing_unit/source/core-plugins/downloader/1/as/webapps/downloader/html/images/sprite.png and /dev/null differ diff --git a/deep_sequencing_unit/source/core-plugins/downloader/1/as/webapps/downloader/html/index.html b/deep_sequencing_unit/source/core-plugins/downloader/1/as/webapps/downloader/html/index.html deleted file mode 100644 index f7fb7d9adfb1e711b1ad3947c20f488a214ced42..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/source/core-plugins/downloader/1/as/webapps/downloader/html/index.html +++ /dev/null @@ -1,9 +0,0 @@ -<!DOCTYPE html> -<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-US" lang="en-US"> -<head> - <meta http-equiv="content-type" content="text/html; charset=utf-8" /> - <meta HTTP-EQUIV="REFRESH" content="0; url=openbis-dsu-downloader.html"> -</head> -<body> -</body> -</html> diff --git a/deep_sequencing_unit/source/core-plugins/downloader/1/as/webapps/downloader/html/openbis-dsu-downloader.html b/deep_sequencing_unit/source/core-plugins/downloader/1/as/webapps/downloader/html/openbis-dsu-downloader.html deleted file mode 100644 index 081ee156543d79c368ce89f8eb59d376dc204917..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/source/core-plugins/downloader/1/as/webapps/downloader/html/openbis-dsu-downloader.html +++ /dev/null @@ -1,835 +0,0 @@ -<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> -<html xmlns="http://www.w3.org/1999/xhtml"> -<head> - <title>Quantitative Genomics Facility</title> - - <meta http-equiv="X-UA-Compatible" content="IE=Edge" /> - <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> - <meta name="google" value="notranslate"> - - <link type="text/css" rel="stylesheet" href="body-style.css" /> - <link type="text/css" rel="stylesheet" href="button.css" /> - <link type="text/css" rel="stylesheet" href="tree.css" /> - <script type="text/javascript" src="d3.js"></script> - <script type="text/javascript" src="d3.layout.js"></script> - <script type="text/javascript" src="d3.time.js"></script> - <script type="text/javascript" src="/openbis/resources/js/jquery.js"></script> - <script type="text/javascript" src="/openbis/resources/js/openbis.js"></script> - <script type="text/javascript" src="/openbis/resources/js/openbis-action-deferrer.js"></script> - <script type="text/javascript" src="openbis-dsu.js"></script> - <!-- To speed development, cache the requests --> - <!-- <script type="text/javascript" src="/openbis/resources/js/openbis-request-cache.js"></script> --> - <script> - -dsu = new openbis_dsu('/openbis/openbis', '/datastore_server'); - -//After logout the URL redirected to, just go to current URL in this case -var logouturl = $(location).attr('href'); - -// A helper function for drawing the lines between nodes -var diagonal = d3.svg.diagonal().projection(function(d) { return [d.y, d.x] }); - -// The tree visualization -var vis; - -// The node inspectors -var inspectors; - -var inspectorsWidth = 500; - -// The root of the tree -var root = { code : "QGF", label: "QGF", children : [], type: 'ROOT' }; - -// The inspected elements -var inspected = []; - -// A date formatter for grouping samples by registration year / month -var yearmonthformat = d3.time.format("%Y-%m"); - -/// -/// FUNCTIONS FOR PUTTING DATA INTO THE TREE -/// - -function initTree(){ - dsu.retrieveSequencingSamples(function(data){ - addSamplesToTree(data.result); - showSpaces(); - updateDiagram(500); - }); -} - -function addSamplesToTree(samples) -{ - if (samples == null){ - return; - } - - // Create sample nodes - samples = samples.map(function(sample) { - return { - code : sample.permId, - label: sample.properties["EXTERNAL_SAMPLE_NAME"] + " [" + sample.code + "]", - bis: sample, - type: 'SAMPLE' - } - }); - - sortArray(samples, 'code', false); - - // Create sample group nodes (group by registration date) - var sampleGroupsMap = []; - var sampleGroups = []; - - samples.forEach(function(sample) { - var date = yearmonthformat(new Date(sample.bis.registrationDetails.registrationDate)); - var sampleGroup = sampleGroupsMap[date]; - - if (undefined === sampleGroup) { - sampleGroup = { - code: date, - label: date, - samples: [], - type: 'SAMPLE_GROUP' - }; - sampleGroupsMap[date] = sampleGroup; - sampleGroups.push(sampleGroup); - } - sampleGroup.samples.push(sample); - }); - - // Sort sample groups from newest to oldest - sortArray(sampleGroups, 'code', false); - - // Create space nodes - var isFirstSampleGroup = true; - sampleGroups.forEach(function(sampleGroup){ - var spacesMap = []; - var spaces = []; - - sampleGroup.samples.forEach(function(sample){ - var spaceCode = sample.bis.spaceCode; - var space = spacesMap[spaceCode]; - - if(undefined == space){ - space = { - code: sampleGroup.code + "#" + spaceCode, - label: spaceCode, - _children: [], - type: 'SPACE' - } - spacesMap[spaceCode] = space; - spaces.push(space); - } - space._children.push(sample); - }); - - // Sort spacees - spaces.sort(function(space1, space2) { - if (space1.label == space2.label) return 0; - return (space1.label < space2.label) ? -1 : 1; - }); - - if(spaces.length > 1){ - sortArray(spaces, 'label', true); - sampleGroup._children = spaces; - }else{ - sampleGroup._children = sampleGroup.samples; - } - - if(isFirstSampleGroup){ - openAllForNode(sampleGroup); - isFirstSampleGroup = false; - } - }); - - if (samples.length > 0){ - root.children = sampleGroups; - } - -} - -function getAppHeight(){ - return Math.max($(window).height() - 50, getVisibleLeafsCountForNode(root) * 20); -} - -function getAppWidth(){ - return $(window).width(); -} - -function closeAll(){ - root.children.forEach(function(sampleGroup){ - closeAllForNode(sampleGroup); - }); - - if(inspected.length > 0){ - var inspectedCopy = inspected.slice(0); - inspectedCopy.forEach(function(elem){ - if(elem.inspected){ - toggle_inspected(elem); - } - }); - }else{ - updateDiagram(500); - } -} - -function closeAllForNode(node){ - closeChildren(node); - getChildren(node).forEach(function(child){ - closeAllForNode(child); - }); -} - -function openAllForNode(node){ - openChildren(node); - getChildren(node).forEach(function(child){ - openAllForNode(child); - }); -} - -function getVisibleLeafsCountForNode(node){ - if(node.children){ - var count = 0; - node.children.forEach(function(child){ - count += getVisibleLeafsCountForNode(child); - }); - return count; - }else{ - return 1; - } -} - -function getVisibleLabelsMaxLength(node){ - if(node.children){ - var length = 0; - node.children.forEach(function(child){ - var childLength = getVisibleLabelsMaxLength(child); - if(childLength > length){ - length = childLength; - } - }); - return length; - }else{ - return node.label.length * 13; - } -} - -function showSpaces() -{ - // Don't show anything yet, just initialize the visualization - createVis(); -} - - -var didCreateVis = false; - -/** - * Create the DOM elements to store the visualization (tree + inspectors) - */ -function createVis() -{ - if (didCreateVis) return; - - // Create a div to house the tree visualization and the inspectors - visgroup = d3.select("#main").append("div"); - - // An svg element for the tree visualization - vis = visgroup.append("svg:svg") - .attr("id","mainVis") - .append("svg:g") - .attr("transform", "translate(40, 0)"); - - var legend = vis.append("svg:g") - .attr("class","legend") - .attr("transform", "translate(-30, 0)"); - - var legendSeq = legend.append("svg:g").attr("class","sequenced").attr("transform","translate(0, 20)"); - legendSeq.append("svg:circle").attr("r", 5.5); - legendSeq.append("svg:text").text("Sequenced").attr("dx", 10).attr("dy",4); - - var legendNotSeq = legend.append("svg:g").attr("class","notsequenced").attr("transform","translate(0, 40)"); - legendNotSeq.append("svg:circle").attr("r", 5.5); - legendNotSeq.append("svg:text").text("Not Sequenced").attr("dx", 10).attr("dy",4); - - // An element for the inspectors. - inspectors = visgroup.append("span") - .attr("id","inspectorsContainer") - .style("width", + inspectorsWidth + "px") - .style("position", "relative") - .style("overflow", "auto") - .style("float", "right") - .style("top", "20px") - .style("display", "none"); - - didCreateVis = true; -} - - -/** - * Draw / update the tree - */ -function updateDiagram(duration) -{ - log('Updating diagram'); - - var inspectorsSize = inspected.length > 0 ? inspectorsWidth : 0; - var labelsSize = getVisibleLabelsMaxLength(root); - - var treeWidth = Math.max(300, getAppWidth() - inspectorsSize - labelsSize); - var treeHeight = Math.max(100, getAppHeight()); - - var visWidth = treeWidth + labelsSize - 20; - var visHeight = treeHeight; - - var mainWidth = visWidth + inspectorsSize; - var mainHeight = visHeight; - - // Adjust a size of the vis - d3.select("#mainVis") - .attr("width", visWidth) - .attr("height", visHeight); - - d3.select("#main") - .style("width", mainWidth) - .style("height", mainHeight); - - // Adjust a size of the tree - tree = d3.layout.tree().size([treeHeight, treeWidth]) - - // Update the root and compute the new layout - var nodes = tree.nodes(root); - - // Draw / update the links - var link = vis.selectAll("path.link").data(tree.links(nodes), function(d) { return d.code }); - - link.enter().append("svg:path") - .attr("class", "link") - .attr("d", function(d) { - var y0 = (null != d.source.y0) ? d.source.y0 : d.source.y; - var x0 = (null != d.source.x0) ? d.source.x0 : d.source.x; - var o = {x: x0, y: y0}; - return diagonal({source: o, target: o}); - }) - .transition() - .duration(duration) - .attr("d", diagonal); - - link.transition() - .duration(duration) - .attr("d", diagonal); - - link.exit().transition() - .duration(duration) - .attr("d", function(d) { - var y0 = (null != d.source.y0) ? d.source.y0 : d.source.y; - var x0 = (null != d.source.x0) ? d.source.x0 : d.source.x; - var o = {x: x0, y: y0}; - return diagonal({source: o, target: o}); - }) - .remove(); - - // Draw / update the nodes - var node = vis.selectAll("g.node").data(nodes, function(d) { return d.code }); - - var nodeEnter = - node.enter().append("svg:g") - .attr("class", classForNode) - .attr("transform", translateSrc) - .on("click", toggle_open); - - nodeEnter.append("svg:circle") - .attr("r", 5.5); - - nodeEnter.append("svg:text") - .attr("dx", function(d) { return hasChildren(d) ? -8 : 8 }) - .attr("dy", 3) - .attr("text-anchor", function(d) { return getTextAnchorType(d) }) - .text(function(d) { return d.label }); - - nodeEnter - .transition() - .duration(duration) - .attr("transform", translateDst); - - - // Transition nodes to their new position. - node.transition() - .duration(duration) - .attr("class", classForNode) - .attr("transform", translateDst); - - // Move the text elements to the appropriate position - node.selectAll("text").transition() - .duration(duration) - .attr("dx", function(d) { return hasChildren(d) ? -8 : 8 }) - .attr("text-anchor", function(d) { return getTextAnchorType(d) }); - - node.exit().transition() - .duration(duration) - .attr("transform", translateSrc) - .remove(); -} - -function classForNode(d) { - // Use whether the node has open children or not to compute the class - var cssClass = "node " + d.type; - if (d.inspected) cssClass = cssClass + " inspected"; - if(d.hasFilesLoaded){ - if (d.hasFiles) { - cssClass = cssClass + " sequenced"; - } else { - cssClass = cssClass + " notsequenced"; - } - } - return cssClass; -} - -function translateSrc(d) -{ - var translate; - if (d.parent != undefined) { - var y0 = (null != d.parent.y0) ? d.parent.y0 : d.parent.y; - var x0 = (null != d.parent.x0) ? d.parent.x0 : d.parent.x; - translate = "translate(" + y0 + "," + x0 + ")"; - } else { - translate = "translate(" + 0 + "," + 0 + ")"; - } - - return translate; -} - -function translateDst(d) -{ - d.x0 = d.x; - d.y0 = d.y; - var translate = "translate(" + d.y + "," + d.x + ")"; - - return translate; -} - -function getChildren(d){ - if(d.children != null){ - return d.children; - }else if(d._children != null){ - return d._children; - }else{ - return []; - } -} - -function hasChildren(d) -{ - return d.children != null || d._children != null; -} - -function hasChildrenOpen(d){ - return d.children != null; -} - -function hasChildrenClosed(d){ - return d._children != null; -} - -function closeChildren(d){ - if(hasChildrenOpen(d)){ - d._children = d.children; - d.children = null; - } -} - -function openChildren(d){ - if(hasChildrenClosed(d)){ - d.children = d._children; - d._children = null; - - var hasSampleChildren = d.children && d.children[0].type == 'SAMPLE'; - - if(hasSampleChildren && !d.hasFilesLoaded && !d.hasFilesLoading){ - d.hasFilesLoading = true; - - // Get datasets for each sequencing sample - var sampleDeferrer = - new openbisActionDeferrer( - function() { - log("Loaded HAS_FILES for all samples"); - d.hasFilesLoaded = true; - d.hasFilesLoading = false; - updateDiagram(500); - }, - d.children.map(function(samp) { return samp.bis.code; })); - - d.children.forEach(function(sample) { - loadHasFilesForSample(sample, function(){ - sampleDeferrer.dependencyCompleted(sample.bis.code); - }); - }); - } - } -} - -function loadHasFilesForSample(sample, callback){ - dsu.retrieveDataSetsForSequencingSample(sample, function(data) { - var datasets = data.result; - - log("Got " + (datasets ? datasets.length : 0) + " datasets for sample: " + sample.bis.code); - - if (!datasets || datasets.length == 0){ - sample.hasFiles = false; - sample.hasFilesLoaded = true; - callback(); - }else{ - var listFiles = function(dataset){ - dsu.server.listFilesForDataSet(dataset.code, "/", true, function(data) { - var files = data.result; - - log("Got " + (files ? files.length : 0) + " files for sample: " + sample.bis.code + " dataset: " + dataset.code); - - if (!files || files.length == 0) { - if(datasets.length > 0){ - log("Sample: " + sample.bis.code + " no files found yet - will try in the next dataset"); - listFiles(datasets.pop()); - }else{ - log("Sample: " + sample.bis.code + " HAS_NO_FILES"); - sample.hasFiles = false; - sample.hasFilesLoaded = true; - callback(); - } - }else{ - log("Sample: " + sample.bis.code + " HAS_FILES"); - sample.hasFiles = true; - sample.hasFilesLoaded = true; - callback(); - } - }); - }; - listFiles(datasets.pop()); - } - }); -} - -function loadFilesForSample(sample, callback){ - dsu.retrieveDataSetsForSequencingSample(sample, function(data) { - var datasets = data.result; - - log("Got " + (datasets ? datasets.length : 0) + " datasets for sample: " + sample.bis.code); - - if (!datasets || datasets.length == 0){ - sample.files = []; - sample.filesLoaded = true; - callback(); - }else{ - sample.datasets = data.result.map(function(bisds) { return {bis : bisds} }); - sample.files = []; - sample.filesLoaded = false; - - // Get all the files from the sequencing sample's datasets - var datasetDeferrer = - new openbisActionDeferrer( - function() { - log("Loaded ALL datasets' files for sample: " + sample.bis.code); - sortArray(sample.files, 'label', true); - sample.filesLoaded = true; - callback(); - }, - sample.datasets.map(function(ds) { return ds.bis.code; })); - - sample.datasets.forEach(function(ds) { - dsu.server.listFilesForDataSet(ds.bis.code, "/", true, function(data) { - log("Got " + (data.result ? data.result.length : 0) + " files for sample: " + sample.bis.code + " dataset: " + ds.bis.code); - - if (!data.result || data.result.length == 0) { - datasetDeferrer.dependencyCompleted(ds.bis.code); - return; - } - data.result.forEach(function (file) { - file.dataset = ds; - file.label = file.pathInListing.split("/").pop(); - }); - - data.result = data.result.filter(function(file) { - var regex= /gz/; - return (regex.test(file.pathInListing) & !file.isDirectory); }); - sample.files = sample.files.concat(data.result); - datasetDeferrer.dependencyCompleted(ds.bis.code); - }) - }); - } - }); -} - -function getTextAnchorType(d){ - return d.type == 'SAMPLE' ? 'start' : 'end'; -} - -// Toggle children on click. -function toggle_open(d) { - if (!hasChildren(d)) { - d.svgNode = this; - return toggle_inspected.call(this, d); - } - - if (hasChildrenOpen(d)) { - closeChildren(d); - } else { - openChildren(d); - } - updateDiagram(500); -} - -/** - * Draw / update node inspectors - */ -function updateInspectors(duration) -{ - // Draw / update the inspectors - var inspector = inspectors.selectAll("div.inspector").data(inspected, function (d) { return d.code }); - var box = inspector.enter().append("div") - .attr("class", "inspector") - .text(function(d) { return d.label }); - - box.append("span") - .attr("class", "close") - .on("click", toggle_inspected) - .text("x"); - - var propsTable = box.append("table").attr("class", "properties"); - propsTable.selectAll("tr").data(function(d) { return props_to_pairs(d.bis.properties) }) - .enter() - .append("tr") - .selectAll("td").data(function(d) { return d }).enter() - .append("td") - .attr("class", "property") - .style("opacity", "0") - .text(function(d) { return d }) - .transition() - .style("opacity", "1"); - - var downloadTable = inspector.selectAll("table.downloads").data(function(d) { return [d] }); - - downloadTable - .enter() - .append("table") - .attr("width", "100%") - .attr("class", "downloads"); - - // Add a caption, but make sure there is just one (this does not work with select()) - downloadTable.selectAll("caption") - .data(downloadTableCaption) - .enter() - .append("caption").text(function(d) { return d; }); - - // We just want to see non-directories here - var downloadTableRow = downloadTable.selectAll("tr").data(filesForSequencingSample, function(d) { return d.pathInDataSet }); - downloadTableRow - .enter() - .append("tr") - .append("td") - .style("text-align", "left") - .on("click", downloadTableFile) - .text(function(d) { return d.label; }); - downloadTableRow - .exit() - .transition() - .duration(duration) - .style("opacity", "0") - .remove(); - - inspector.exit().transition() - .duration(duration) - .style("opacity", "0") - .remove(); -} - -// Toggle children on click. -function toggle_inspected(d) { - var count = inspected.length; - - if (d.inspected) { - var index = inspected.indexOf(d) - if (index > -1) inspected.splice(index, 1); - d.inspected = false; - d3.select(d.svgNode).attr("class", classForNode(d)) - } else { - d.inspected = true; - inspected.push(d); - d3.select(d.svgNode).attr("class", classForNode(d)) - if(!d.filesLoaded){ - loadFilesForSample(d, function(){ - updateInspectors(500); - }); - } - } - - if(inspected.length > 0){ - $("#inspectorsContainer").show(); - }else{ - $("#inspectorsContainer").hide(); - } - - if(count == 0 && inspected.length > 0 || count > 0 && inspected.length == 0){ - updateDiagram(500); - setTimeout(function(){ - updateInspectors(500); - }, 500); - }else{ - updateInspectors(500); - } -} - -function sortArray(array, sortingFieldName, ascending){ - array.sort(function(item1, item2){ - var value1 = item1[sortingFieldName]; - var value2 = item2[sortingFieldName]; - - if(value1){ - value1 = new String(value1).toLowerCase(); - } - if(value2){ - value2 = new String(value2).toLowerCase(); - } - - if(ascending){ - return (value1 >= value2) ? 1: -1; - }else{ - return (value1 <= value2) ? 1: -1; - } - }); -} - -/** - * Convert properties to pairs - */ -function props_to_pairs(d) -{ - var pairs = []; - for (var prop in d) { - var pair = [prop, d[prop]]; - pairs.push(pair); - } - pairs.sort(function(a, b) { - if (a[0] == b[0]) return 0; - // Sort in reverse lexicographical - return (a[0] < b[0]) ? -1 : 1; - }); - return pairs; -} - - -function downloadTableCaption(d) -{ - if(d.filesLoaded){ - if(d.files && d.files.length > 0){ - return ["Files"] - }else{ - return ["Not Yet Sequenced"]; - } - } -} - -function downloadTableFile(d) -{ - // If there is no dataset, this is just a marker for loading - if (!d.dataset) return; - - var action = function(data) { - try { - document.location.href = data.result - } catch (err) { - // just ignore errors - } - }; - dsu.server.getDownloadUrlForFileForDataSet(d.dataset.bis.code, d.pathInDataSet, action); -} - -function filesForSequencingSample(d) -{ - return d.filesLoaded ? d.files : [{ label : "Loading..." }]; -} - -function enterApp(data) -{ - if(data.result == null){ - alert("Login or password incorrect"); - $("#loginname").focus(); - return; - } - - $("#login-form-div").hide(); - $("#main").show(); - - initTree(); - - $('#openbis-logo').height(30); - $('#openbis-logo').hide(); - -} - - -$(document).ready(function() { - if ( $.browser.msie ) { - alert("Currently no Internet Explorer is supported!"); - } - $('#main').hide() - - $('#logout-button').click(function() { - dsu.server.logout(function(data) {$(location).attr('href',logouturl)}); - }); - - $('#login-form').submit(function() { - dsu.server.login( $.trim($('#loginname').val()), $.trim($('#password').val()), function(data) { enterApp(data) }) - }); - - dsu.server.ifRestoredSessionActive(function(data) { enterApp(data) }); -}); - -// set the focus -function onPageLoad(){ - if(loginname.value.length==0) { - $("#loginname").focus(); - } - else { - $("#login-button").focus(); - } -} - -function log(msg){ - /* - if(console){ - console.log(msg); - } - */ -} - - - </script> -</head> -<body onload="onPageLoad()"> -<img id="openbis-logo" src="images/openBIS_Logo.svg" alt="openBIS" style="position: absolute; left: 330px; top: 230px; height: 70px;"/> -<link rel="shortcut icon" href="../images/favicon.ico" /> -<link rel="icon" type="image/png" href="../images/favicon.png" /> - -<div id="login-form-div"> - <h1>BSSE - Quantitative Genomics Facility</h1> - <form id="login-form" action="javascript:"> - <div class="box greytext loginname"> - <input value="Login Name" type="text" required="required" maxlength="40" size="40" onfocus="this.value=(this.value=='Login Name') ? '' : this.value;" onblur="this.value=(this.value=='') ? 'Login Name' : this.value;" id="loginname"> </input> - </div> - <div class="box greytext password"> - <input value="Password" id="password" type="password" required="required" size="40" onfocus="this.value=(this.value=='Password') ? '' : this.value;" onblur="this.value=(this.value=='') ? 'Password' : this.value;" id="password"> </input> - </div> - <div class="loginbutton"> - <button id="login-button" type="submit">Login</button> - </div> - <br> - <a href="https://crowd-bsse.ethz.ch/crowd/console/forgottenlogindetails!default.action" id="resetpassword" class="greytext">Reset password</a> - </form> -</div> - -<div id="main"> - <div id="button-group"> - <button id="logout-button">Logout</button> - <button id="close-all-button" onclick="closeAll();">Close All</button> - </div> -</div> -</body> -</html> diff --git a/deep_sequencing_unit/source/core-plugins/downloader/1/as/webapps/downloader/html/openbis-dsu.js b/deep_sequencing_unit/source/core-plugins/downloader/1/as/webapps/downloader/html/openbis-dsu.js deleted file mode 100644 index 52e7336254ad191bc7f4756967e79f55ab1faa58..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/source/core-plugins/downloader/1/as/webapps/downloader/html/openbis-dsu.js +++ /dev/null @@ -1,103 +0,0 @@ -/** - * openbis-dsu.js - * OpenBIS-DSU API - * - * A DSU-specific API for accessing openBIS. Depends on openbis.js. - * @author Chandrasekhar Ramakrishnan - */ - -/** - * The openbis_dsu object provides a dsu-specific interface to openbis. - * - * It creates objects for projects, experiments, samples, and datasets. These objects - * are designed to be passed on to GUI libraries (like d3). The openbis version of each - * object is stored in the bis variable. - * @constructor - */ -function openbis_dsu(url, dssUrl) { - this.server = new openbis(url, dssUrl); -} - -/** - * Request the sequencing samples for a project - */ -openbis_dsu.prototype.retrieveSequencingSamples = function(action) -{ - var sampleCriteria = - { - matchClauses : - [ {"@type":"AttributeMatchClause", - attribute : "TYPE", - fieldType : "ATTRIBUTE", - desiredValue : "ILLUMINA_SEQUENCING" - } ], - operator : "MATCH_ALL_CLAUSES" - }; - - this.server.searchForSamples(sampleCriteria, action); -} - -/** - * Get the flow lanes for a sequencing sample. - */ -openbis_dsu.prototype.retrieveFlowLanesForSequencingSample = function(sample, action) -{ - var projectCode = null; - - if(sample.bis.experimentIdentifierOrNull){ - var experimentIdentifierRegexp = /\/(.*)\/(.*)\/(.*)/g; - var experimentIdentifierMatch = experimentIdentifierRegexp.exec(sample.bis.experimentIdentifierOrNull); - projectCode = experimentIdentifierMatch[2]; - }else{ - action(null); - return; - } - - var experimentCriteria = - { - targetEntityKind : "EXPERIMENT", - criteria : { - matchClauses : - [ {"@type":"AttributeMatchClause", - "attribute":"PROJECT", - "fieldType":"ATTRIBUTE", - "desiredValue": projectCode - } ] - } - }; - - var parentCriteria = - { - targetEntityKind : "SAMPLE_PARENT", - criteria : { - matchClauses : - [ {"@type":"AttributeMatchClause", - "attribute":"CODE", - "fieldType":"ATTRIBUTE", - "desiredValue": sample.bis.code - } ] - } - }; - - var sampleCriteria = - { - subCriterias : [ experimentCriteria, parentCriteria ], - matchClauses : - [ {"@type":"AttributeMatchClause", - attribute : "TYPE", - fieldType : "ATTRIBUTE", - desiredValue : "ILLUMINA_FLOW_LANE" - } ], - operator : "MATCH_ALL_CLAUSES" - }; - - this.server.searchForSamples(sampleCriteria, action) -} - -/** - * Get all data sets connected to a sequencing sample - */ -openbis_dsu.prototype.retrieveDataSetsForSequencingSample = function(sequencing, action) -{ - this.server.listDataSetsForSample(sequencing.bis, false, action); -} diff --git a/deep_sequencing_unit/source/core-plugins/downloader/1/as/webapps/downloader/html/tree.css b/deep_sequencing_unit/source/core-plugins/downloader/1/as/webapps/downloader/html/tree.css deleted file mode 100644 index 8617fd5fb4d0a93f7aa04745e085ed69e070c865..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/source/core-plugins/downloader/1/as/webapps/downloader/html/tree.css +++ /dev/null @@ -1,138 +0,0 @@ -.node circle { - fill: #fff; - stroke: #444444; - stroke-width: 1.5px; -} - -.node { - font: 14px "Verdana", sans-serif; - z-index: 1; - cursor: pointer; - left: -15px; -} - -.node:hover circle{ - fill: #444444; -} - -.node:hover{ - font-weight: bold; -} - -.link { - fill: none; - stroke: #ccc; - stroke-width: 1.5px; - z-index: -1; -} - -.SAMPLE.inspected { - font-weight: bold -} - -.SAMPLE.sequenced circle { - stroke: DarkGreen; -} - -.SAMPLE.sequenced:hover circle { - fill: DarkGreen; -} - -.SAMPLE.notsequenced circle { - stroke: DarkRed; -} - -.SAMPLE.notsequenced:hover circle { - fill: DarkRed; -} - -/* Inspector */ - -div.inspector { - font: 14px "Verdana", sans-serif; - padding: 10px; - border: 1px solid gray; - margin: 10px 2px; - font-weight: bold; -} - -.property { - font-size: 10px; -} - -.properties { - width: 100%; -} - -.properties tr:nth-child(odd) { - background-color:#eee; -} - -.properties tr:nth-child(even) { - background-color:#fff; -} - -.close { - float: right; -} - -.close:hover { - opacity: 0.5; - color: #AAA; - cursor: pointer; -} - -.downloads { - color: black; - background-color: #E3E3E3; -} - -table.downloads { - font-family: "Trebuchet MS", sans-serif; - font-size: 14px; - table-layout: fixed; - border-collapse: collapse; - margin: 0px; - padding: 0px; -} - -/* -.downloads caption { - text-align: left; -} -*/ - -.downloads tr { - padding: 0px; -} - -.downloads td { - border: 2px solid #FFFFFF; - padding: 2px; -} - -.downloads td:hover { - cursor: pointer; - text-decoration: underline -} - -input:focus{ -background-color: white; -} - -/* Legend */ - -.legend .sequenced circle { - font: 14px "Verdana", sans-serif; - stroke-width: 1.5px; - fill: white; - stroke: DarkGreen; -} - -.legend .notsequenced circle { - font: 14px "Verdana", sans-serif; - stroke-width: 1.5px; - fill: white; - stroke: DarkRed; -} - diff --git a/deep_sequencing_unit/source/core-plugins/downloader/1/as/webapps/downloader/plugin.properties b/deep_sequencing_unit/source/core-plugins/downloader/1/as/webapps/downloader/plugin.properties deleted file mode 100644 index cb40f34f644331e58c2af13a14c7ff10d778153d..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/source/core-plugins/downloader/1/as/webapps/downloader/plugin.properties +++ /dev/null @@ -1,3 +0,0 @@ -# The properties file for an example webapps plugin -# This file has no properties defined because none need to be defined. -webapp-folder = html diff --git a/deep_sequencing_unit/source/core-plugins/illumina-ngs/1/as/initialize-master-data.py b/deep_sequencing_unit/source/core-plugins/illumina-ngs/1/as/initialize-master-data.py deleted file mode 100644 index 5321fedca37c87f6a564c7edbfd3bf2b22522160..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/source/core-plugins/illumina-ngs/1/as/initialize-master-data.py +++ /dev/null @@ -1,3385 +0,0 @@ -# -*- coding: utf-8 -*- -import ch.systemsx.cisd.openbis.generic.server.jython.api.v1.DataType as DataType - -tr = service.transaction() - - -file_type_FASTQ_PHRED_64 = tr.getOrCreateNewFileFormatType('FASTQ_PHRED_64') -file_type_FASTQ_PHRED_64.setDescription('FastQ Format with PHRED+64 quality values (as deliverd by Illumina GA Pipeline >= 1.3)') - -vocabulary_AGILENT_KIT = tr.getOrCreateNewVocabulary('AGILENT_KIT') -vocabulary_AGILENT_KIT.setDescription(None) -vocabulary_AGILENT_KIT.setUrlTemplate(None) -vocabulary_AGILENT_KIT.setManagedInternally(False) -vocabulary_AGILENT_KIT.setInternalNamespace(False) -vocabulary_AGILENT_KIT.setChosenFromList(True) - -vocabulary_term_AGILENT_KIT_AGILENT_DNA_KIT_1000 = tr.createNewVocabularyTerm('AGILENT_DNA_KIT_1000') -vocabulary_term_AGILENT_KIT_AGILENT_DNA_KIT_1000.setDescription(None) -vocabulary_term_AGILENT_KIT_AGILENT_DNA_KIT_1000.setLabel(None) -vocabulary_term_AGILENT_KIT_AGILENT_DNA_KIT_1000.setOrdinal(1) -vocabulary_AGILENT_KIT.addTerm(vocabulary_term_AGILENT_KIT_AGILENT_DNA_KIT_1000) - -vocabulary_term_AGILENT_KIT_AGILENT_HIGH_SENSITIVITY_DNA_KIT = tr.createNewVocabularyTerm('AGILENT_HIGH_SENSITIVITY_DNA_KIT') -vocabulary_term_AGILENT_KIT_AGILENT_HIGH_SENSITIVITY_DNA_KIT.setDescription(None) -vocabulary_term_AGILENT_KIT_AGILENT_HIGH_SENSITIVITY_DNA_KIT.setLabel(None) -vocabulary_term_AGILENT_KIT_AGILENT_HIGH_SENSITIVITY_DNA_KIT.setOrdinal(2) -vocabulary_AGILENT_KIT.addTerm(vocabulary_term_AGILENT_KIT_AGILENT_HIGH_SENSITIVITY_DNA_KIT) - -vocabulary_ALIGNMENT_SOFTWARE = tr.getOrCreateNewVocabulary('ALIGNMENT_SOFTWARE') -vocabulary_ALIGNMENT_SOFTWARE.setDescription('If an alignment is requested, which software package should be use?') -vocabulary_ALIGNMENT_SOFTWARE.setUrlTemplate(None) -vocabulary_ALIGNMENT_SOFTWARE.setManagedInternally(False) -vocabulary_ALIGNMENT_SOFTWARE.setInternalNamespace(False) -vocabulary_ALIGNMENT_SOFTWARE.setChosenFromList(True) - -vocabulary_term_ALIGNMENT_SOFTWARE_NOT_NEEDED = tr.createNewVocabularyTerm('NOT_NEEDED') -vocabulary_term_ALIGNMENT_SOFTWARE_NOT_NEEDED.setDescription(None) -vocabulary_term_ALIGNMENT_SOFTWARE_NOT_NEEDED.setLabel(None) -vocabulary_term_ALIGNMENT_SOFTWARE_NOT_NEEDED.setOrdinal(1) -vocabulary_ALIGNMENT_SOFTWARE.addTerm(vocabulary_term_ALIGNMENT_SOFTWARE_NOT_NEEDED) - -vocabulary_term_ALIGNMENT_SOFTWARE_ELAND = tr.createNewVocabularyTerm('ELAND') -vocabulary_term_ALIGNMENT_SOFTWARE_ELAND.setDescription(None) -vocabulary_term_ALIGNMENT_SOFTWARE_ELAND.setLabel(None) -vocabulary_term_ALIGNMENT_SOFTWARE_ELAND.setOrdinal(2) -vocabulary_ALIGNMENT_SOFTWARE.addTerm(vocabulary_term_ALIGNMENT_SOFTWARE_ELAND) - -vocabulary_term_ALIGNMENT_SOFTWARE_MAQ = tr.createNewVocabularyTerm('MAQ') -vocabulary_term_ALIGNMENT_SOFTWARE_MAQ.setDescription(None) -vocabulary_term_ALIGNMENT_SOFTWARE_MAQ.setLabel(None) -vocabulary_term_ALIGNMENT_SOFTWARE_MAQ.setOrdinal(3) -vocabulary_ALIGNMENT_SOFTWARE.addTerm(vocabulary_term_ALIGNMENT_SOFTWARE_MAQ) - -vocabulary_term_ALIGNMENT_SOFTWARE_BWA = tr.createNewVocabularyTerm('BWA') -vocabulary_term_ALIGNMENT_SOFTWARE_BWA.setDescription(None) -vocabulary_term_ALIGNMENT_SOFTWARE_BWA.setLabel(None) -vocabulary_term_ALIGNMENT_SOFTWARE_BWA.setOrdinal(4) -vocabulary_ALIGNMENT_SOFTWARE.addTerm(vocabulary_term_ALIGNMENT_SOFTWARE_BWA) - -vocabulary_term_ALIGNMENT_SOFTWARE_NOVOALIGN = tr.createNewVocabularyTerm('NOVOALIGN') -vocabulary_term_ALIGNMENT_SOFTWARE_NOVOALIGN.setDescription(None) -vocabulary_term_ALIGNMENT_SOFTWARE_NOVOALIGN.setLabel(None) -vocabulary_term_ALIGNMENT_SOFTWARE_NOVOALIGN.setOrdinal(6) -vocabulary_ALIGNMENT_SOFTWARE.addTerm(vocabulary_term_ALIGNMENT_SOFTWARE_NOVOALIGN) - -vocabulary_term_ALIGNMENT_SOFTWARE_BOWTIE = tr.createNewVocabularyTerm('BOWTIE') -vocabulary_term_ALIGNMENT_SOFTWARE_BOWTIE.setDescription(None) -vocabulary_term_ALIGNMENT_SOFTWARE_BOWTIE.setLabel(None) -vocabulary_term_ALIGNMENT_SOFTWARE_BOWTIE.setOrdinal(7) -vocabulary_ALIGNMENT_SOFTWARE.addTerm(vocabulary_term_ALIGNMENT_SOFTWARE_BOWTIE) - -vocabulary_CASAVA_VERSION = tr.getOrCreateNewVocabulary('CASAVA_VERSION') -vocabulary_CASAVA_VERSION.setDescription('Post analyzing software') -vocabulary_CASAVA_VERSION.setUrlTemplate(None) -vocabulary_CASAVA_VERSION.setManagedInternally(False) -vocabulary_CASAVA_VERSION.setInternalNamespace(False) -vocabulary_CASAVA_VERSION.setChosenFromList(True) - -vocabulary_term_CASAVA_VERSION_18 = tr.createNewVocabularyTerm('1.8') -vocabulary_term_CASAVA_VERSION_18.setDescription(None) -vocabulary_term_CASAVA_VERSION_18.setLabel(None) -vocabulary_term_CASAVA_VERSION_18.setOrdinal(1) -vocabulary_CASAVA_VERSION.addTerm(vocabulary_term_CASAVA_VERSION_18) - -vocabulary_term_CASAVA_VERSION_17 = tr.createNewVocabularyTerm('1.7') -vocabulary_term_CASAVA_VERSION_17.setDescription(None) -vocabulary_term_CASAVA_VERSION_17.setLabel(None) -vocabulary_term_CASAVA_VERSION_17.setOrdinal(2) -vocabulary_CASAVA_VERSION.addTerm(vocabulary_term_CASAVA_VERSION_17) - -vocabulary_CLUSTER_GENERATION_KIT_VERSION = tr.getOrCreateNewVocabulary('CLUSTER_GENERATION_KIT_VERSION') -vocabulary_CLUSTER_GENERATION_KIT_VERSION.setDescription('Version of the Cluster Generation Kit') -vocabulary_CLUSTER_GENERATION_KIT_VERSION.setUrlTemplate(None) -vocabulary_CLUSTER_GENERATION_KIT_VERSION.setManagedInternally(False) -vocabulary_CLUSTER_GENERATION_KIT_VERSION.setInternalNamespace(False) -vocabulary_CLUSTER_GENERATION_KIT_VERSION.setChosenFromList(True) - -vocabulary_term_CLUSTER_GENERATION_KIT_VERSION_TRUSEQ_CBOT_HS_V3 = tr.createNewVocabularyTerm('TRUSEQ_CBOT_HS_V3') -vocabulary_term_CLUSTER_GENERATION_KIT_VERSION_TRUSEQ_CBOT_HS_V3.setDescription(None) -vocabulary_term_CLUSTER_GENERATION_KIT_VERSION_TRUSEQ_CBOT_HS_V3.setLabel('TruSeq cBot-HS v3') -vocabulary_term_CLUSTER_GENERATION_KIT_VERSION_TRUSEQ_CBOT_HS_V3.setOrdinal(1) -vocabulary_CLUSTER_GENERATION_KIT_VERSION.addTerm(vocabulary_term_CLUSTER_GENERATION_KIT_VERSION_TRUSEQ_CBOT_HS_V3) - -vocabulary_term_CLUSTER_GENERATION_KIT_VERSION_TRUSEQ_CBOT_HS_V25 = tr.createNewVocabularyTerm('TRUSEQ_CBOT_HS_V2.5') -vocabulary_term_CLUSTER_GENERATION_KIT_VERSION_TRUSEQ_CBOT_HS_V25.setDescription(None) -vocabulary_term_CLUSTER_GENERATION_KIT_VERSION_TRUSEQ_CBOT_HS_V25.setLabel('TruSeq cBot-HS v2.5') -vocabulary_term_CLUSTER_GENERATION_KIT_VERSION_TRUSEQ_CBOT_HS_V25.setOrdinal(2) -vocabulary_CLUSTER_GENERATION_KIT_VERSION.addTerm(vocabulary_term_CLUSTER_GENERATION_KIT_VERSION_TRUSEQ_CBOT_HS_V25) - -vocabulary_term_CLUSTER_GENERATION_KIT_VERSION_TRUSEQ_CBOT_GA_V2 = tr.createNewVocabularyTerm('TRUSEQ_CBOT_GA_V2') -vocabulary_term_CLUSTER_GENERATION_KIT_VERSION_TRUSEQ_CBOT_GA_V2.setDescription(None) -vocabulary_term_CLUSTER_GENERATION_KIT_VERSION_TRUSEQ_CBOT_GA_V2.setLabel('TrueSeq cBot-GA v2') -vocabulary_term_CLUSTER_GENERATION_KIT_VERSION_TRUSEQ_CBOT_GA_V2.setOrdinal(3) -vocabulary_CLUSTER_GENERATION_KIT_VERSION.addTerm(vocabulary_term_CLUSTER_GENERATION_KIT_VERSION_TRUSEQ_CBOT_GA_V2) - -vocabulary_term_CLUSTER_GENERATION_KIT_VERSION_TRUSEQ_CS_GA_V5 = tr.createNewVocabularyTerm('TRUSEQ_CS_GA_V5') -vocabulary_term_CLUSTER_GENERATION_KIT_VERSION_TRUSEQ_CS_GA_V5.setDescription(None) -vocabulary_term_CLUSTER_GENERATION_KIT_VERSION_TRUSEQ_CS_GA_V5.setLabel('TrueSeq CS-GA v5') -vocabulary_term_CLUSTER_GENERATION_KIT_VERSION_TRUSEQ_CS_GA_V5.setOrdinal(4) -vocabulary_CLUSTER_GENERATION_KIT_VERSION.addTerm(vocabulary_term_CLUSTER_GENERATION_KIT_VERSION_TRUSEQ_CS_GA_V5) - -vocabulary_term_CLUSTER_GENERATION_KIT_VERSION_V5 = tr.createNewVocabularyTerm('V5') -vocabulary_term_CLUSTER_GENERATION_KIT_VERSION_V5.setDescription(None) -vocabulary_term_CLUSTER_GENERATION_KIT_VERSION_V5.setLabel(None) -vocabulary_term_CLUSTER_GENERATION_KIT_VERSION_V5.setOrdinal(5) -vocabulary_CLUSTER_GENERATION_KIT_VERSION.addTerm(vocabulary_term_CLUSTER_GENERATION_KIT_VERSION_V5) - -vocabulary_term_CLUSTER_GENERATION_KIT_VERSION_V4 = tr.createNewVocabularyTerm('V4') -vocabulary_term_CLUSTER_GENERATION_KIT_VERSION_V4.setDescription(None) -vocabulary_term_CLUSTER_GENERATION_KIT_VERSION_V4.setLabel(None) -vocabulary_term_CLUSTER_GENERATION_KIT_VERSION_V4.setOrdinal(6) -vocabulary_CLUSTER_GENERATION_KIT_VERSION.addTerm(vocabulary_term_CLUSTER_GENERATION_KIT_VERSION_V4) - -vocabulary_term_CLUSTER_GENERATION_KIT_VERSION_V2 = tr.createNewVocabularyTerm('V2') -vocabulary_term_CLUSTER_GENERATION_KIT_VERSION_V2.setDescription(None) -vocabulary_term_CLUSTER_GENERATION_KIT_VERSION_V2.setLabel(None) -vocabulary_term_CLUSTER_GENERATION_KIT_VERSION_V2.setOrdinal(7) -vocabulary_CLUSTER_GENERATION_KIT_VERSION.addTerm(vocabulary_term_CLUSTER_GENERATION_KIT_VERSION_V2) - -vocabulary_CLUSTER_STATION = tr.getOrCreateNewVocabulary('CLUSTER_STATION') -vocabulary_CLUSTER_STATION.setDescription('Cluster Station') -vocabulary_CLUSTER_STATION.setUrlTemplate(None) -vocabulary_CLUSTER_STATION.setManagedInternally(False) -vocabulary_CLUSTER_STATION.setInternalNamespace(False) -vocabulary_CLUSTER_STATION.setChosenFromList(True) - -vocabulary_term_CLUSTER_STATION_CBOT = tr.createNewVocabularyTerm('CBOT') -vocabulary_term_CLUSTER_STATION_CBOT.setDescription(None) -vocabulary_term_CLUSTER_STATION_CBOT.setLabel('cBot') -vocabulary_term_CLUSTER_STATION_CBOT.setOrdinal(1) -vocabulary_CLUSTER_STATION.addTerm(vocabulary_term_CLUSTER_STATION_CBOT) - -vocabulary_term_CLUSTER_STATION_CBOT2 = tr.createNewVocabularyTerm('CBOT2') -vocabulary_term_CLUSTER_STATION_CBOT2.setDescription('Second cBot') -vocabulary_term_CLUSTER_STATION_CBOT2.setLabel('cBot2') -vocabulary_term_CLUSTER_STATION_CBOT2.setOrdinal(2) -vocabulary_CLUSTER_STATION.addTerm(vocabulary_term_CLUSTER_STATION_CBOT2) - -vocabulary_CLUSTER_STATION_SOFTWARE_VERSION = tr.getOrCreateNewVocabulary('CLUSTER_STATION_SOFTWARE_VERSION') -vocabulary_CLUSTER_STATION_SOFTWARE_VERSION.setDescription(None) -vocabulary_CLUSTER_STATION_SOFTWARE_VERSION.setUrlTemplate(None) -vocabulary_CLUSTER_STATION_SOFTWARE_VERSION.setManagedInternally(False) -vocabulary_CLUSTER_STATION_SOFTWARE_VERSION.setInternalNamespace(False) -vocabulary_CLUSTER_STATION_SOFTWARE_VERSION.setChosenFromList(True) - -vocabulary_term_CLUSTER_STATION_SOFTWARE_VERSION_CBOT_14360 = tr.createNewVocabularyTerm('CBOT_1.4.36.0') -vocabulary_term_CLUSTER_STATION_SOFTWARE_VERSION_CBOT_14360.setDescription(None) -vocabulary_term_CLUSTER_STATION_SOFTWARE_VERSION_CBOT_14360.setLabel('cBot 1.4.36.0') -vocabulary_term_CLUSTER_STATION_SOFTWARE_VERSION_CBOT_14360.setOrdinal(1) -vocabulary_CLUSTER_STATION_SOFTWARE_VERSION.addTerm(vocabulary_term_CLUSTER_STATION_SOFTWARE_VERSION_CBOT_14360) - -vocabulary_term_CLUSTER_STATION_SOFTWARE_VERSION_GALAXY_06 = tr.createNewVocabularyTerm('GALAXY_0.6') -vocabulary_term_CLUSTER_STATION_SOFTWARE_VERSION_GALAXY_06.setDescription('Old Cluster Station') -vocabulary_term_CLUSTER_STATION_SOFTWARE_VERSION_GALAXY_06.setLabel('Galaxy 0.6 Build 98') -vocabulary_term_CLUSTER_STATION_SOFTWARE_VERSION_GALAXY_06.setOrdinal(2) -vocabulary_CLUSTER_STATION_SOFTWARE_VERSION.addTerm(vocabulary_term_CLUSTER_STATION_SOFTWARE_VERSION_GALAXY_06) - -vocabulary_term_CLUSTER_STATION_SOFTWARE_VERSION_NOT_KNOWN = tr.createNewVocabularyTerm('NOT_KNOWN') -vocabulary_term_CLUSTER_STATION_SOFTWARE_VERSION_NOT_KNOWN.setDescription(None) -vocabulary_term_CLUSTER_STATION_SOFTWARE_VERSION_NOT_KNOWN.setLabel(None) -vocabulary_term_CLUSTER_STATION_SOFTWARE_VERSION_NOT_KNOWN.setOrdinal(3) -vocabulary_CLUSTER_STATION_SOFTWARE_VERSION.addTerm(vocabulary_term_CLUSTER_STATION_SOFTWARE_VERSION_NOT_KNOWN) - -vocabulary_CONTROL_LANE = tr.getOrCreateNewVocabulary('CONTROL_LANE') -vocabulary_CONTROL_LANE.setDescription(None) -vocabulary_CONTROL_LANE.setUrlTemplate(None) -vocabulary_CONTROL_LANE.setManagedInternally(False) -vocabulary_CONTROL_LANE.setInternalNamespace(False) -vocabulary_CONTROL_LANE.setChosenFromList(True) - -vocabulary_term_CONTROL_LANE_1 = tr.createNewVocabularyTerm('1') -vocabulary_term_CONTROL_LANE_1.setDescription(None) -vocabulary_term_CONTROL_LANE_1.setLabel(None) -vocabulary_term_CONTROL_LANE_1.setOrdinal(1) -vocabulary_CONTROL_LANE.addTerm(vocabulary_term_CONTROL_LANE_1) - -vocabulary_term_CONTROL_LANE_2 = tr.createNewVocabularyTerm('2') -vocabulary_term_CONTROL_LANE_2.setDescription(None) -vocabulary_term_CONTROL_LANE_2.setLabel(None) -vocabulary_term_CONTROL_LANE_2.setOrdinal(2) -vocabulary_CONTROL_LANE.addTerm(vocabulary_term_CONTROL_LANE_2) - -vocabulary_term_CONTROL_LANE_3 = tr.createNewVocabularyTerm('3') -vocabulary_term_CONTROL_LANE_3.setDescription(None) -vocabulary_term_CONTROL_LANE_3.setLabel(None) -vocabulary_term_CONTROL_LANE_3.setOrdinal(3) -vocabulary_CONTROL_LANE.addTerm(vocabulary_term_CONTROL_LANE_3) - -vocabulary_term_CONTROL_LANE_4 = tr.createNewVocabularyTerm('4') -vocabulary_term_CONTROL_LANE_4.setDescription(None) -vocabulary_term_CONTROL_LANE_4.setLabel(None) -vocabulary_term_CONTROL_LANE_4.setOrdinal(4) -vocabulary_CONTROL_LANE.addTerm(vocabulary_term_CONTROL_LANE_4) - -vocabulary_term_CONTROL_LANE_5 = tr.createNewVocabularyTerm('5') -vocabulary_term_CONTROL_LANE_5.setDescription(None) -vocabulary_term_CONTROL_LANE_5.setLabel(None) -vocabulary_term_CONTROL_LANE_5.setOrdinal(5) -vocabulary_CONTROL_LANE.addTerm(vocabulary_term_CONTROL_LANE_5) - -vocabulary_term_CONTROL_LANE_6 = tr.createNewVocabularyTerm('6') -vocabulary_term_CONTROL_LANE_6.setDescription(None) -vocabulary_term_CONTROL_LANE_6.setLabel(None) -vocabulary_term_CONTROL_LANE_6.setOrdinal(6) -vocabulary_CONTROL_LANE.addTerm(vocabulary_term_CONTROL_LANE_6) - -vocabulary_term_CONTROL_LANE_7 = tr.createNewVocabularyTerm('7') -vocabulary_term_CONTROL_LANE_7.setDescription(None) -vocabulary_term_CONTROL_LANE_7.setLabel(None) -vocabulary_term_CONTROL_LANE_7.setOrdinal(7) -vocabulary_CONTROL_LANE.addTerm(vocabulary_term_CONTROL_LANE_7) - -vocabulary_term_CONTROL_LANE_8 = tr.createNewVocabularyTerm('8') -vocabulary_term_CONTROL_LANE_8.setDescription(None) -vocabulary_term_CONTROL_LANE_8.setLabel(None) -vocabulary_term_CONTROL_LANE_8.setOrdinal(8) -vocabulary_CONTROL_LANE.addTerm(vocabulary_term_CONTROL_LANE_8) - -vocabulary_term_CONTROL_LANE_NONE = tr.createNewVocabularyTerm('NONE') -vocabulary_term_CONTROL_LANE_NONE.setDescription(None) -vocabulary_term_CONTROL_LANE_NONE.setLabel(None) -vocabulary_term_CONTROL_LANE_NONE.setOrdinal(9) -vocabulary_CONTROL_LANE.addTerm(vocabulary_term_CONTROL_LANE_NONE) - -vocabulary_term_CONTROL_LANE_0 = tr.createNewVocabularyTerm('0') -vocabulary_term_CONTROL_LANE_0.setDescription(None) -vocabulary_term_CONTROL_LANE_0.setLabel(None) -vocabulary_term_CONTROL_LANE_0.setOrdinal(10) -vocabulary_CONTROL_LANE.addTerm(vocabulary_term_CONTROL_LANE_0) - -vocabulary_CYCLES = tr.getOrCreateNewVocabulary('CYCLES') -vocabulary_CYCLES.setDescription('Number of cycles') -vocabulary_CYCLES.setUrlTemplate(None) -vocabulary_CYCLES.setManagedInternally(False) -vocabulary_CYCLES.setInternalNamespace(False) -vocabulary_CYCLES.setChosenFromList(True) - -vocabulary_term_CYCLES_36 = tr.createNewVocabularyTerm('36') -vocabulary_term_CYCLES_36.setDescription(None) -vocabulary_term_CYCLES_36.setLabel(None) -vocabulary_term_CYCLES_36.setOrdinal(1) -vocabulary_CYCLES.addTerm(vocabulary_term_CYCLES_36) - -vocabulary_term_CYCLES_50 = tr.createNewVocabularyTerm('50') -vocabulary_term_CYCLES_50.setDescription(None) -vocabulary_term_CYCLES_50.setLabel(None) -vocabulary_term_CYCLES_50.setOrdinal(2) -vocabulary_CYCLES.addTerm(vocabulary_term_CYCLES_50) - -vocabulary_term_CYCLES_76 = tr.createNewVocabularyTerm('76') -vocabulary_term_CYCLES_76.setDescription(None) -vocabulary_term_CYCLES_76.setLabel(None) -vocabulary_term_CYCLES_76.setOrdinal(3) -vocabulary_CYCLES.addTerm(vocabulary_term_CYCLES_76) - -vocabulary_term_CYCLES_101 = tr.createNewVocabularyTerm('101') -vocabulary_term_CYCLES_101.setDescription(None) -vocabulary_term_CYCLES_101.setLabel(None) -vocabulary_term_CYCLES_101.setOrdinal(4) -vocabulary_CYCLES.addTerm(vocabulary_term_CYCLES_101) - -vocabulary_term_CYCLES_51 = tr.createNewVocabularyTerm('51') -vocabulary_term_CYCLES_51.setDescription(None) -vocabulary_term_CYCLES_51.setLabel(None) -vocabulary_term_CYCLES_51.setOrdinal(5) -vocabulary_CYCLES.addTerm(vocabulary_term_CYCLES_51) - -vocabulary_term_CYCLES_58 = tr.createNewVocabularyTerm('58') -vocabulary_term_CYCLES_58.setDescription(None) -vocabulary_term_CYCLES_58.setLabel(None) -vocabulary_term_CYCLES_58.setOrdinal(6) -vocabulary_CYCLES.addTerm(vocabulary_term_CYCLES_58) - -vocabulary_term_CYCLES_125 = tr.createNewVocabularyTerm('125') -vocabulary_term_CYCLES_125.setDescription(None) -vocabulary_term_CYCLES_125.setLabel(None) -vocabulary_term_CYCLES_125.setOrdinal(7) -vocabulary_CYCLES.addTerm(vocabulary_term_CYCLES_125) - -vocabulary_term_CYCLES_151 = tr.createNewVocabularyTerm('151') -vocabulary_term_CYCLES_151.setDescription(None) -vocabulary_term_CYCLES_151.setLabel(None) -vocabulary_term_CYCLES_151.setOrdinal(8) -vocabulary_CYCLES.addTerm(vocabulary_term_CYCLES_151) - -vocabulary_term_CYCLES_100 = tr.createNewVocabularyTerm('100') -vocabulary_term_CYCLES_100.setDescription(None) -vocabulary_term_CYCLES_100.setLabel(None) -vocabulary_term_CYCLES_100.setOrdinal(9) -vocabulary_CYCLES.addTerm(vocabulary_term_CYCLES_100) - -vocabulary_term_CYCLES_108 = tr.createNewVocabularyTerm('108') -vocabulary_term_CYCLES_108.setDescription(None) -vocabulary_term_CYCLES_108.setLabel(None) -vocabulary_term_CYCLES_108.setOrdinal(10) -vocabulary_CYCLES.addTerm(vocabulary_term_CYCLES_108) - -vocabulary_term_CYCLES_150 = tr.createNewVocabularyTerm('150') -vocabulary_term_CYCLES_150.setDescription(None) -vocabulary_term_CYCLES_150.setLabel(None) -vocabulary_term_CYCLES_150.setOrdinal(11) -vocabulary_CYCLES.addTerm(vocabulary_term_CYCLES_150) - -vocabulary_term_CYCLES_49 = tr.createNewVocabularyTerm('49') -vocabulary_term_CYCLES_49.setDescription(None) -vocabulary_term_CYCLES_49.setLabel(None) -vocabulary_term_CYCLES_49.setOrdinal(12) -vocabulary_CYCLES.addTerm(vocabulary_term_CYCLES_49) - -vocabulary_term_CYCLES_55 = tr.createNewVocabularyTerm('55') -vocabulary_term_CYCLES_55.setDescription(None) -vocabulary_term_CYCLES_55.setLabel(None) -vocabulary_term_CYCLES_55.setOrdinal(13) -vocabulary_CYCLES.addTerm(vocabulary_term_CYCLES_55) - -vocabulary_END_TYPE = tr.getOrCreateNewVocabulary('END_TYPE') -vocabulary_END_TYPE.setDescription('Sequencing method') -vocabulary_END_TYPE.setUrlTemplate(None) -vocabulary_END_TYPE.setManagedInternally(False) -vocabulary_END_TYPE.setInternalNamespace(False) -vocabulary_END_TYPE.setChosenFromList(True) - -vocabulary_term_END_TYPE_SINGLE_READ = tr.createNewVocabularyTerm('SINGLE_READ') -vocabulary_term_END_TYPE_SINGLE_READ.setDescription(None) -vocabulary_term_END_TYPE_SINGLE_READ.setLabel(None) -vocabulary_term_END_TYPE_SINGLE_READ.setOrdinal(1) -vocabulary_END_TYPE.addTerm(vocabulary_term_END_TYPE_SINGLE_READ) - -vocabulary_term_END_TYPE_PAIRED_END = tr.createNewVocabularyTerm('PAIRED_END') -vocabulary_term_END_TYPE_PAIRED_END.setDescription(None) -vocabulary_term_END_TYPE_PAIRED_END.setLabel(None) -vocabulary_term_END_TYPE_PAIRED_END.setOrdinal(2) -vocabulary_END_TYPE.addTerm(vocabulary_term_END_TYPE_PAIRED_END) - -vocabulary_EXPERIMENT_DESIGN = tr.getOrCreateNewVocabulary('EXPERIMENT_DESIGN') -vocabulary_EXPERIMENT_DESIGN.setDescription('General Intent') -vocabulary_EXPERIMENT_DESIGN.setUrlTemplate(None) -vocabulary_EXPERIMENT_DESIGN.setManagedInternally(False) -vocabulary_EXPERIMENT_DESIGN.setInternalNamespace(False) -vocabulary_EXPERIMENT_DESIGN.setChosenFromList(True) - -vocabulary_term_EXPERIMENT_DESIGN_BINDING_SITE_IDENTIFICATION = tr.createNewVocabularyTerm('BINDING_SITE_IDENTIFICATION') -vocabulary_term_EXPERIMENT_DESIGN_BINDING_SITE_IDENTIFICATION.setDescription(None) -vocabulary_term_EXPERIMENT_DESIGN_BINDING_SITE_IDENTIFICATION.setLabel('Binding Site Identification') -vocabulary_term_EXPERIMENT_DESIGN_BINDING_SITE_IDENTIFICATION.setOrdinal(1) -vocabulary_EXPERIMENT_DESIGN.addTerm(vocabulary_term_EXPERIMENT_DESIGN_BINDING_SITE_IDENTIFICATION) - -vocabulary_term_EXPERIMENT_DESIGN_CHROMATIN_MARKS = tr.createNewVocabularyTerm('CHROMATIN_MARKS') -vocabulary_term_EXPERIMENT_DESIGN_CHROMATIN_MARKS.setDescription(None) -vocabulary_term_EXPERIMENT_DESIGN_CHROMATIN_MARKS.setLabel('Chromatin Marks') -vocabulary_term_EXPERIMENT_DESIGN_CHROMATIN_MARKS.setOrdinal(2) -vocabulary_EXPERIMENT_DESIGN.addTerm(vocabulary_term_EXPERIMENT_DESIGN_CHROMATIN_MARKS) - -vocabulary_term_EXPERIMENT_DESIGN_COMPARATIVE_GENOMIC_HYBRIDIZATION = tr.createNewVocabularyTerm('COMPARATIVE_GENOMIC_HYBRIDIZATION') -vocabulary_term_EXPERIMENT_DESIGN_COMPARATIVE_GENOMIC_HYBRIDIZATION.setDescription(None) -vocabulary_term_EXPERIMENT_DESIGN_COMPARATIVE_GENOMIC_HYBRIDIZATION.setLabel('Comparative Genomic Hybridization') -vocabulary_term_EXPERIMENT_DESIGN_COMPARATIVE_GENOMIC_HYBRIDIZATION.setOrdinal(3) -vocabulary_EXPERIMENT_DESIGN.addTerm(vocabulary_term_EXPERIMENT_DESIGN_COMPARATIVE_GENOMIC_HYBRIDIZATION) - -vocabulary_term_EXPERIMENT_DESIGN_DIFFERENTIAL_EXPRESSION = tr.createNewVocabularyTerm('DIFFERENTIAL_EXPRESSION') -vocabulary_term_EXPERIMENT_DESIGN_DIFFERENTIAL_EXPRESSION.setDescription(None) -vocabulary_term_EXPERIMENT_DESIGN_DIFFERENTIAL_EXPRESSION.setLabel('Differential Expression') -vocabulary_term_EXPERIMENT_DESIGN_DIFFERENTIAL_EXPRESSION.setOrdinal(4) -vocabulary_EXPERIMENT_DESIGN.addTerm(vocabulary_term_EXPERIMENT_DESIGN_DIFFERENTIAL_EXPRESSION) - -vocabulary_term_EXPERIMENT_DESIGN_DIFFERENTIAL_SPLICING = tr.createNewVocabularyTerm('DIFFERENTIAL_SPLICING') -vocabulary_term_EXPERIMENT_DESIGN_DIFFERENTIAL_SPLICING.setDescription(None) -vocabulary_term_EXPERIMENT_DESIGN_DIFFERENTIAL_SPLICING.setLabel('Differential Splicing') -vocabulary_term_EXPERIMENT_DESIGN_DIFFERENTIAL_SPLICING.setOrdinal(5) -vocabulary_EXPERIMENT_DESIGN.addTerm(vocabulary_term_EXPERIMENT_DESIGN_DIFFERENTIAL_SPLICING) - -vocabulary_term_EXPERIMENT_DESIGN_EXPRESSION = tr.createNewVocabularyTerm('EXPRESSION') -vocabulary_term_EXPERIMENT_DESIGN_EXPRESSION.setDescription(None) -vocabulary_term_EXPERIMENT_DESIGN_EXPRESSION.setLabel('Expression') -vocabulary_term_EXPERIMENT_DESIGN_EXPRESSION.setOrdinal(6) -vocabulary_EXPERIMENT_DESIGN.addTerm(vocabulary_term_EXPERIMENT_DESIGN_EXPRESSION) - -vocabulary_term_EXPERIMENT_DESIGN_SEQUENCE_ENRICHMENT = tr.createNewVocabularyTerm('SEQUENCE_ENRICHMENT') -vocabulary_term_EXPERIMENT_DESIGN_SEQUENCE_ENRICHMENT.setDescription(None) -vocabulary_term_EXPERIMENT_DESIGN_SEQUENCE_ENRICHMENT.setLabel('Sequence Enrichment') -vocabulary_term_EXPERIMENT_DESIGN_SEQUENCE_ENRICHMENT.setOrdinal(7) -vocabulary_EXPERIMENT_DESIGN.addTerm(vocabulary_term_EXPERIMENT_DESIGN_SEQUENCE_ENRICHMENT) - -vocabulary_term_EXPERIMENT_DESIGN_TRANSCRIPT_IDENTIFICATION = tr.createNewVocabularyTerm('TRANSCRIPT_IDENTIFICATION') -vocabulary_term_EXPERIMENT_DESIGN_TRANSCRIPT_IDENTIFICATION.setDescription(None) -vocabulary_term_EXPERIMENT_DESIGN_TRANSCRIPT_IDENTIFICATION.setLabel('Transcript Identification') -vocabulary_term_EXPERIMENT_DESIGN_TRANSCRIPT_IDENTIFICATION.setOrdinal(8) -vocabulary_EXPERIMENT_DESIGN.addTerm(vocabulary_term_EXPERIMENT_DESIGN_TRANSCRIPT_IDENTIFICATION) - -vocabulary_term_EXPERIMENT_DESIGN_OTHER = tr.createNewVocabularyTerm('OTHER') -vocabulary_term_EXPERIMENT_DESIGN_OTHER.setDescription(None) -vocabulary_term_EXPERIMENT_DESIGN_OTHER.setLabel('Other') -vocabulary_term_EXPERIMENT_DESIGN_OTHER.setOrdinal(9) -vocabulary_EXPERIMENT_DESIGN.addTerm(vocabulary_term_EXPERIMENT_DESIGN_OTHER) - -vocabulary_INDEX1 = tr.getOrCreateNewVocabulary('INDEX1') -vocabulary_INDEX1.setDescription('Index 1 for Illumina Indexing') -vocabulary_INDEX1.setUrlTemplate(None) -vocabulary_INDEX1.setManagedInternally(False) -vocabulary_INDEX1.setInternalNamespace(False) -vocabulary_INDEX1.setChosenFromList(True) - -vocabulary_term_INDEX1_ATCACGA = tr.createNewVocabularyTerm('ATCACGA') -vocabulary_term_INDEX1_ATCACGA.setDescription('Illumina, Nextera or Scriptseq') -vocabulary_term_INDEX1_ATCACGA.setLabel('Index1 ATCACGA') -vocabulary_term_INDEX1_ATCACGA.setOrdinal(1) -vocabulary_INDEX1.addTerm(vocabulary_term_INDEX1_ATCACGA) - -vocabulary_term_INDEX1_CGATGTA = tr.createNewVocabularyTerm('CGATGTA') -vocabulary_term_INDEX1_CGATGTA.setDescription('Illumina, Nextera or Scriptseq') -vocabulary_term_INDEX1_CGATGTA.setLabel('Index2 CGATGTA') -vocabulary_term_INDEX1_CGATGTA.setOrdinal(2) -vocabulary_INDEX1.addTerm(vocabulary_term_INDEX1_CGATGTA) - -vocabulary_term_INDEX1_TTAGGCA = tr.createNewVocabularyTerm('TTAGGCA') -vocabulary_term_INDEX1_TTAGGCA.setDescription('Illumina, Nextera or Scriptseq') -vocabulary_term_INDEX1_TTAGGCA.setLabel('Index3 TTAGGCA') -vocabulary_term_INDEX1_TTAGGCA.setOrdinal(3) -vocabulary_INDEX1.addTerm(vocabulary_term_INDEX1_TTAGGCA) - -vocabulary_term_INDEX1_TGACCAA = tr.createNewVocabularyTerm('TGACCAA') -vocabulary_term_INDEX1_TGACCAA.setDescription('Illumina, Nextera or Scriptseq') -vocabulary_term_INDEX1_TGACCAA.setLabel('Index4 TGACCAA') -vocabulary_term_INDEX1_TGACCAA.setOrdinal(4) -vocabulary_INDEX1.addTerm(vocabulary_term_INDEX1_TGACCAA) - -vocabulary_term_INDEX1_ACAGTGA = tr.createNewVocabularyTerm('ACAGTGA') -vocabulary_term_INDEX1_ACAGTGA.setDescription('Illumina, Nextera or Scriptseq') -vocabulary_term_INDEX1_ACAGTGA.setLabel('Index5 ACAGTGA') -vocabulary_term_INDEX1_ACAGTGA.setOrdinal(5) -vocabulary_INDEX1.addTerm(vocabulary_term_INDEX1_ACAGTGA) - -vocabulary_term_INDEX1_GCCAATA = tr.createNewVocabularyTerm('GCCAATA') -vocabulary_term_INDEX1_GCCAATA.setDescription('Illumina, Nextera or Scriptseq') -vocabulary_term_INDEX1_GCCAATA.setLabel('Index6 GCCAATA') -vocabulary_term_INDEX1_GCCAATA.setOrdinal(6) -vocabulary_INDEX1.addTerm(vocabulary_term_INDEX1_GCCAATA) - -vocabulary_term_INDEX1_CAGATCA = tr.createNewVocabularyTerm('CAGATCA') -vocabulary_term_INDEX1_CAGATCA.setDescription('Illumina, Nextera or Scriptseq') -vocabulary_term_INDEX1_CAGATCA.setLabel('Index7 CAGATCA') -vocabulary_term_INDEX1_CAGATCA.setOrdinal(7) -vocabulary_INDEX1.addTerm(vocabulary_term_INDEX1_CAGATCA) - -vocabulary_term_INDEX1_ACTTGAA = tr.createNewVocabularyTerm('ACTTGAA') -vocabulary_term_INDEX1_ACTTGAA.setDescription('Illumina, Nextera or Scriptseq') -vocabulary_term_INDEX1_ACTTGAA.setLabel('Index8 ACTTGAA') -vocabulary_term_INDEX1_ACTTGAA.setOrdinal(8) -vocabulary_INDEX1.addTerm(vocabulary_term_INDEX1_ACTTGAA) - -vocabulary_term_INDEX1_GATCAGA = tr.createNewVocabularyTerm('GATCAGA') -vocabulary_term_INDEX1_GATCAGA.setDescription('Illumina, Nextera or Scriptseq') -vocabulary_term_INDEX1_GATCAGA.setLabel('Index9 GATCAGA') -vocabulary_term_INDEX1_GATCAGA.setOrdinal(9) -vocabulary_INDEX1.addTerm(vocabulary_term_INDEX1_GATCAGA) - -vocabulary_term_INDEX1_TAGCTTA = tr.createNewVocabularyTerm('TAGCTTA') -vocabulary_term_INDEX1_TAGCTTA.setDescription('Illumina, Nextera or Scriptseq') -vocabulary_term_INDEX1_TAGCTTA.setLabel('Index10 TAGCTTA') -vocabulary_term_INDEX1_TAGCTTA.setOrdinal(10) -vocabulary_INDEX1.addTerm(vocabulary_term_INDEX1_TAGCTTA) - -vocabulary_term_INDEX1_GGCTACA = tr.createNewVocabularyTerm('GGCTACA') -vocabulary_term_INDEX1_GGCTACA.setDescription('Illumina, Nextera or Scriptseq') -vocabulary_term_INDEX1_GGCTACA.setLabel('Index11 GGCTACA') -vocabulary_term_INDEX1_GGCTACA.setOrdinal(11) -vocabulary_INDEX1.addTerm(vocabulary_term_INDEX1_GGCTACA) - -vocabulary_term_INDEX1_CTTGTAA = tr.createNewVocabularyTerm('CTTGTAA') -vocabulary_term_INDEX1_CTTGTAA.setDescription('Illumina, Nextera or Scriptseq') -vocabulary_term_INDEX1_CTTGTAA.setLabel('Index12 CTTGTAA') -vocabulary_term_INDEX1_CTTGTAA.setOrdinal(12) -vocabulary_INDEX1.addTerm(vocabulary_term_INDEX1_CTTGTAA) - -vocabulary_term_INDEX1_AGATACA = tr.createNewVocabularyTerm('AGATACA') -vocabulary_term_INDEX1_AGATACA.setDescription('Illumina, Nextera or Scriptseq') -vocabulary_term_INDEX1_AGATACA.setLabel('Index13 AGATAC') -vocabulary_term_INDEX1_AGATACA.setOrdinal(13) -vocabulary_INDEX1.addTerm(vocabulary_term_INDEX1_AGATACA) - -vocabulary_term_INDEX1_AGTTCCG = tr.createNewVocabularyTerm('AGTTCCG') -vocabulary_term_INDEX1_AGTTCCG.setDescription('Illumina, Nextera or Scriptseq') -vocabulary_term_INDEX1_AGTTCCG.setLabel('Index14 AGTTCCG') -vocabulary_term_INDEX1_AGTTCCG.setOrdinal(14) -vocabulary_INDEX1.addTerm(vocabulary_term_INDEX1_AGTTCCG) - -vocabulary_term_INDEX1_ATGTCAG = tr.createNewVocabularyTerm('ATGTCAG') -vocabulary_term_INDEX1_ATGTCAG.setDescription('Illumina, Nextera or Scriptseq') -vocabulary_term_INDEX1_ATGTCAG.setLabel('Index15 ATGTCAG') -vocabulary_term_INDEX1_ATGTCAG.setOrdinal(15) -vocabulary_INDEX1.addTerm(vocabulary_term_INDEX1_ATGTCAG) - -vocabulary_term_INDEX1_CCGTCCC = tr.createNewVocabularyTerm('CCGTCCC') -vocabulary_term_INDEX1_CCGTCCC.setDescription('Illumina, Nextera or Scriptseq') -vocabulary_term_INDEX1_CCGTCCC.setLabel('Index16 CCGTCCC') -vocabulary_term_INDEX1_CCGTCCC.setOrdinal(16) -vocabulary_INDEX1.addTerm(vocabulary_term_INDEX1_CCGTCCC) - -vocabulary_term_INDEX1_GTCCGCA = tr.createNewVocabularyTerm('GTCCGCA') -vocabulary_term_INDEX1_GTCCGCA.setDescription('Illumina, Nextera or Scriptseq') -vocabulary_term_INDEX1_GTCCGCA.setLabel('Index18 GTCCGCA') -vocabulary_term_INDEX1_GTCCGCA.setOrdinal(17) -vocabulary_INDEX1.addTerm(vocabulary_term_INDEX1_GTCCGCA) - -vocabulary_term_INDEX1_GTGAAAC = tr.createNewVocabularyTerm('GTGAAAC') -vocabulary_term_INDEX1_GTGAAAC.setDescription('Illumina, Nextera or Scriptseq') -vocabulary_term_INDEX1_GTGAAAC.setLabel('Index19 GTGAAAC') -vocabulary_term_INDEX1_GTGAAAC.setOrdinal(18) -vocabulary_INDEX1.addTerm(vocabulary_term_INDEX1_GTGAAAC) - -vocabulary_term_INDEX1_GTGGCCT = tr.createNewVocabularyTerm('GTGGCCT') -vocabulary_term_INDEX1_GTGGCCT.setDescription('Illumina, Nextera or Scriptseq') -vocabulary_term_INDEX1_GTGGCCT.setLabel('Index20 GTGGCCT') -vocabulary_term_INDEX1_GTGGCCT.setOrdinal(19) -vocabulary_INDEX1.addTerm(vocabulary_term_INDEX1_GTGGCCT) - -vocabulary_term_INDEX1_GTTTCGG = tr.createNewVocabularyTerm('GTTTCGG') -vocabulary_term_INDEX1_GTTTCGG.setDescription('Illumina, Nextera or Scriptseq') -vocabulary_term_INDEX1_GTTTCGG.setLabel('Index21 GTTTCGG') -vocabulary_term_INDEX1_GTTTCGG.setOrdinal(20) -vocabulary_INDEX1.addTerm(vocabulary_term_INDEX1_GTTTCGG) - -vocabulary_term_INDEX1_CGTACGT = tr.createNewVocabularyTerm('CGTACGT') -vocabulary_term_INDEX1_CGTACGT.setDescription('Illumina, Nextera or Scriptseq') -vocabulary_term_INDEX1_CGTACGT.setLabel('Index22 CGTACGT') -vocabulary_term_INDEX1_CGTACGT.setOrdinal(21) -vocabulary_INDEX1.addTerm(vocabulary_term_INDEX1_CGTACGT) - -vocabulary_term_INDEX1_GAGTGGA = tr.createNewVocabularyTerm('GAGTGGA') -vocabulary_term_INDEX1_GAGTGGA.setDescription('Illumina, Nextera or Scriptseq') -vocabulary_term_INDEX1_GAGTGGA.setLabel('Index23 GAGTGGA') -vocabulary_term_INDEX1_GAGTGGA.setOrdinal(22) -vocabulary_INDEX1.addTerm(vocabulary_term_INDEX1_GAGTGGA) - -vocabulary_term_INDEX1_ACTGATA = tr.createNewVocabularyTerm('ACTGATA') -vocabulary_term_INDEX1_ACTGATA.setDescription('Illumina, Nextera or Scriptseq') -vocabulary_term_INDEX1_ACTGATA.setLabel('Index25 ACTGATA') -vocabulary_term_INDEX1_ACTGATA.setOrdinal(23) -vocabulary_INDEX1.addTerm(vocabulary_term_INDEX1_ACTGATA) - -vocabulary_term_INDEX1_ATTCCTT = tr.createNewVocabularyTerm('ATTCCTT') -vocabulary_term_INDEX1_ATTCCTT.setDescription('Illumina, Nextera or Scriptseq') -vocabulary_term_INDEX1_ATTCCTT.setLabel('Index27 ATTCCTT') -vocabulary_term_INDEX1_ATTCCTT.setOrdinal(24) -vocabulary_INDEX1.addTerm(vocabulary_term_INDEX1_ATTCCTT) - -vocabulary_term_INDEX1_TAAGGCGA = tr.createNewVocabularyTerm('TAAGGCGA') -vocabulary_term_INDEX1_TAAGGCGA.setDescription('Nextera DNA') -vocabulary_term_INDEX1_TAAGGCGA.setLabel('Index1 (i7) N701 TAAGGCGA') -vocabulary_term_INDEX1_TAAGGCGA.setOrdinal(25) -vocabulary_INDEX1.addTerm(vocabulary_term_INDEX1_TAAGGCGA) - -vocabulary_term_INDEX1_CGTACTAG = tr.createNewVocabularyTerm('CGTACTAG') -vocabulary_term_INDEX1_CGTACTAG.setDescription('Nextera DNA') -vocabulary_term_INDEX1_CGTACTAG.setLabel('Index1 (i7) N702 CGTACTAG') -vocabulary_term_INDEX1_CGTACTAG.setOrdinal(26) -vocabulary_INDEX1.addTerm(vocabulary_term_INDEX1_CGTACTAG) - -vocabulary_term_INDEX1_AGGCAGAA = tr.createNewVocabularyTerm('AGGCAGAA') -vocabulary_term_INDEX1_AGGCAGAA.setDescription('Nextera DNA') -vocabulary_term_INDEX1_AGGCAGAA.setLabel('Index1 (i7) N703 AGGCAGAA') -vocabulary_term_INDEX1_AGGCAGAA.setOrdinal(27) -vocabulary_INDEX1.addTerm(vocabulary_term_INDEX1_AGGCAGAA) - -vocabulary_term_INDEX1_TCCTGAGC = tr.createNewVocabularyTerm('TCCTGAGC') -vocabulary_term_INDEX1_TCCTGAGC.setDescription('Nextera DNA') -vocabulary_term_INDEX1_TCCTGAGC.setLabel('Index1 (i7) N704 TCCTGAGC') -vocabulary_term_INDEX1_TCCTGAGC.setOrdinal(28) -vocabulary_INDEX1.addTerm(vocabulary_term_INDEX1_TCCTGAGC) - -vocabulary_term_INDEX1_GGACTCCT = tr.createNewVocabularyTerm('GGACTCCT') -vocabulary_term_INDEX1_GGACTCCT.setDescription('Nextera DNA') -vocabulary_term_INDEX1_GGACTCCT.setLabel('Index1 (i7) N705 GGACTCCT') -vocabulary_term_INDEX1_GGACTCCT.setOrdinal(29) -vocabulary_INDEX1.addTerm(vocabulary_term_INDEX1_GGACTCCT) - -vocabulary_term_INDEX1_TAGGCATG = tr.createNewVocabularyTerm('TAGGCATG') -vocabulary_term_INDEX1_TAGGCATG.setDescription('Nextera DNA') -vocabulary_term_INDEX1_TAGGCATG.setLabel('Index1 (i7) N706 TAGGCATG') -vocabulary_term_INDEX1_TAGGCATG.setOrdinal(30) -vocabulary_INDEX1.addTerm(vocabulary_term_INDEX1_TAGGCATG) - -vocabulary_term_INDEX1_CTCTCTAC = tr.createNewVocabularyTerm('CTCTCTAC') -vocabulary_term_INDEX1_CTCTCTAC.setDescription('Nextera DNA') -vocabulary_term_INDEX1_CTCTCTAC.setLabel('Index1 (i7) N707 CTCTCTAC') -vocabulary_term_INDEX1_CTCTCTAC.setOrdinal(31) -vocabulary_INDEX1.addTerm(vocabulary_term_INDEX1_CTCTCTAC) - -vocabulary_term_INDEX1_CAGAGAGG = tr.createNewVocabularyTerm('CAGAGAGG') -vocabulary_term_INDEX1_CAGAGAGG.setDescription('Nextera DNA') -vocabulary_term_INDEX1_CAGAGAGG.setLabel('Index1 (i7) N708 CAGAGAGG') -vocabulary_term_INDEX1_CAGAGAGG.setOrdinal(32) -vocabulary_INDEX1.addTerm(vocabulary_term_INDEX1_CAGAGAGG) - -vocabulary_term_INDEX1_GCTACGCT = tr.createNewVocabularyTerm('GCTACGCT') -vocabulary_term_INDEX1_GCTACGCT.setDescription('Nextera DNA') -vocabulary_term_INDEX1_GCTACGCT.setLabel('Index1 (i7) N709 GCTACGCT') -vocabulary_term_INDEX1_GCTACGCT.setOrdinal(33) -vocabulary_INDEX1.addTerm(vocabulary_term_INDEX1_GCTACGCT) - -vocabulary_term_INDEX1_CGAGGCTG = tr.createNewVocabularyTerm('CGAGGCTG') -vocabulary_term_INDEX1_CGAGGCTG.setDescription('Nextera DNA') -vocabulary_term_INDEX1_CGAGGCTG.setLabel('Index1 (i7) N710 CGAGGCTG') -vocabulary_term_INDEX1_CGAGGCTG.setOrdinal(34) -vocabulary_INDEX1.addTerm(vocabulary_term_INDEX1_CGAGGCTG) - -vocabulary_term_INDEX1_AAGAGGCA = tr.createNewVocabularyTerm('AAGAGGCA') -vocabulary_term_INDEX1_AAGAGGCA.setDescription('Nextera DNA') -vocabulary_term_INDEX1_AAGAGGCA.setLabel('Index1 (i7) N711 AAGAGGCA') -vocabulary_term_INDEX1_AAGAGGCA.setOrdinal(35) -vocabulary_INDEX1.addTerm(vocabulary_term_INDEX1_AAGAGGCA) - -vocabulary_term_INDEX1_GTAGAGGA = tr.createNewVocabularyTerm('GTAGAGGA') -vocabulary_term_INDEX1_GTAGAGGA.setDescription('Nextera DNA') -vocabulary_term_INDEX1_GTAGAGGA.setLabel('Index1 (i7) N712 GTAGAGGA') -vocabulary_term_INDEX1_GTAGAGGA.setOrdinal(36) -vocabulary_INDEX1.addTerm(vocabulary_term_INDEX1_GTAGAGGA) - -vocabulary_term_INDEX1_AAGACTA = tr.createNewVocabularyTerm('AAGACTA') -vocabulary_term_INDEX1_AAGACTA.setDescription(None) -vocabulary_term_INDEX1_AAGACTA.setLabel('02 AAGACT') -vocabulary_term_INDEX1_AAGACTA.setOrdinal(37) -vocabulary_INDEX1.addTerm(vocabulary_term_INDEX1_AAGACTA) - -vocabulary_term_INDEX1_ACTTCAA = tr.createNewVocabularyTerm('ACTTCAA') -vocabulary_term_INDEX1_ACTTCAA.setDescription(None) -vocabulary_term_INDEX1_ACTTCAA.setLabel('10 ACTTCA') -vocabulary_term_INDEX1_ACTTCAA.setOrdinal(38) -vocabulary_INDEX1.addTerm(vocabulary_term_INDEX1_ACTTCAA) - -vocabulary_term_INDEX1_AGGTTGA = tr.createNewVocabularyTerm('AGGTTGA') -vocabulary_term_INDEX1_AGGTTGA.setDescription(None) -vocabulary_term_INDEX1_AGGTTGA.setLabel('17 AGGTTG') -vocabulary_term_INDEX1_AGGTTGA.setOrdinal(39) -vocabulary_INDEX1.addTerm(vocabulary_term_INDEX1_AGGTTGA) - -vocabulary_term_INDEX1_TTCGTCA = tr.createNewVocabularyTerm('TTCGTCA') -vocabulary_term_INDEX1_TTCGTCA.setDescription(None) -vocabulary_term_INDEX1_TTCGTCA.setLabel('17 TTCGTCA') -vocabulary_term_INDEX1_TTCGTCA.setOrdinal(40) -vocabulary_INDEX1.addTerm(vocabulary_term_INDEX1_TTCGTCA) - -vocabulary_term_INDEX1_AGCATAA = tr.createNewVocabularyTerm('AGCATAA') -vocabulary_term_INDEX1_AGCATAA.setDescription(None) -vocabulary_term_INDEX1_AGCATAA.setLabel('20 AGCATAA') -vocabulary_term_INDEX1_AGCATAA.setOrdinal(41) -vocabulary_INDEX1.addTerm(vocabulary_term_INDEX1_AGCATAA) - -vocabulary_term_INDEX1_ATACGCA = tr.createNewVocabularyTerm('ATACGCA') -vocabulary_term_INDEX1_ATACGCA.setDescription(None) -vocabulary_term_INDEX1_ATACGCA.setLabel('20 ATACGC') -vocabulary_term_INDEX1_ATACGCA.setOrdinal(42) -vocabulary_INDEX1.addTerm(vocabulary_term_INDEX1_ATACGCA) - -vocabulary_term_INDEX1_CAGATGA = tr.createNewVocabularyTerm('CAGATGA') -vocabulary_term_INDEX1_CAGATGA.setDescription(None) -vocabulary_term_INDEX1_CAGATGA.setLabel('28 CAGATG') -vocabulary_term_INDEX1_CAGATGA.setOrdinal(43) -vocabulary_INDEX1.addTerm(vocabulary_term_INDEX1_CAGATGA) - -vocabulary_term_INDEX1_CCGAATA = tr.createNewVocabularyTerm('CCGAATA') -vocabulary_term_INDEX1_CCGAATA.setDescription(None) -vocabulary_term_INDEX1_CCGAATA.setLabel('34 CCGAAT') -vocabulary_term_INDEX1_CCGAATA.setOrdinal(44) -vocabulary_INDEX1.addTerm(vocabulary_term_INDEX1_CCGAATA) - -vocabulary_term_INDEX1_CGCTCGA = tr.createNewVocabularyTerm('CGCTCGA') -vocabulary_term_INDEX1_CGCTCGA.setDescription(None) -vocabulary_term_INDEX1_CGCTCGA.setLabel('43 CGCTCG') -vocabulary_term_INDEX1_CGCTCGA.setOrdinal(45) -vocabulary_INDEX1.addTerm(vocabulary_term_INDEX1_CGCTCGA) - -vocabulary_term_INDEX1_CGTATTA = tr.createNewVocabularyTerm('CGTATTA') -vocabulary_term_INDEX1_CGTATTA.setDescription(None) -vocabulary_term_INDEX1_CGTATTA.setLabel('45 CGTATT') -vocabulary_term_INDEX1_CGTATTA.setOrdinal(46) -vocabulary_INDEX1.addTerm(vocabulary_term_INDEX1_CGTATTA) - -vocabulary_term_INDEX1_CCATGAA = tr.createNewVocabularyTerm('CCATGAA') -vocabulary_term_INDEX1_CCATGAA.setDescription(None) -vocabulary_term_INDEX1_CCATGAA.setLabel('50 CCATGAA') -vocabulary_term_INDEX1_CCATGAA.setOrdinal(47) -vocabulary_INDEX1.addTerm(vocabulary_term_INDEX1_CCATGAA) - -vocabulary_term_INDEX1_CTGACCA = tr.createNewVocabularyTerm('CTGACCA') -vocabulary_term_INDEX1_CTGACCA.setDescription(None) -vocabulary_term_INDEX1_CTGACCA.setLabel('50 CTGACC') -vocabulary_term_INDEX1_CTGACCA.setOrdinal(48) -vocabulary_INDEX1.addTerm(vocabulary_term_INDEX1_CTGACCA) - -vocabulary_term_INDEX1_GAAGCCA = tr.createNewVocabularyTerm('GAAGCCA') -vocabulary_term_INDEX1_GAAGCCA.setDescription(None) -vocabulary_term_INDEX1_GAAGCCA.setLabel('52 GAAGCC') -vocabulary_term_INDEX1_GAAGCCA.setOrdinal(49) -vocabulary_INDEX1.addTerm(vocabulary_term_INDEX1_GAAGCCA) - -vocabulary_term_INDEX1_GCTGAAA = tr.createNewVocabularyTerm('GCTGAAA') -vocabulary_term_INDEX1_GCTGAAA.setDescription(None) -vocabulary_term_INDEX1_GCTGAAA.setLabel('59 GCTGAA') -vocabulary_term_INDEX1_GCTGAAA.setOrdinal(50) -vocabulary_INDEX1.addTerm(vocabulary_term_INDEX1_GCTGAAA) - -vocabulary_term_INDEX1_GTCGCGA = tr.createNewVocabularyTerm('GTCGCGA') -vocabulary_term_INDEX1_GTCGCGA.setDescription(None) -vocabulary_term_INDEX1_GTCGCGA.setLabel('64 GTCGCG') -vocabulary_term_INDEX1_GTCGCGA.setOrdinal(51) -vocabulary_INDEX1.addTerm(vocabulary_term_INDEX1_GTCGCGA) - -vocabulary_term_INDEX1_TAAGATA = tr.createNewVocabularyTerm('TAAGATA') -vocabulary_term_INDEX1_TAAGATA.setDescription(None) -vocabulary_term_INDEX1_TAAGATA.setLabel('65 TAAGAT') -vocabulary_term_INDEX1_TAAGATA.setOrdinal(52) -vocabulary_INDEX1.addTerm(vocabulary_term_INDEX1_TAAGATA) - -vocabulary_term_INDEX1_GCGCTGA = tr.createNewVocabularyTerm('GCGCTGA') -vocabulary_term_INDEX1_GCGCTGA.setDescription(None) -vocabulary_term_INDEX1_GCGCTGA.setLabel('66 GCGCTGA') -vocabulary_term_INDEX1_GCGCTGA.setOrdinal(53) -vocabulary_INDEX1.addTerm(vocabulary_term_INDEX1_GCGCTGA) - -vocabulary_term_INDEX1_TATCGTA = tr.createNewVocabularyTerm('TATCGTA') -vocabulary_term_INDEX1_TATCGTA.setDescription(None) -vocabulary_term_INDEX1_TATCGTA.setLabel('66 TATCGT') -vocabulary_term_INDEX1_TATCGTA.setOrdinal(54) -vocabulary_INDEX1.addTerm(vocabulary_term_INDEX1_TATCGTA) - -vocabulary_term_INDEX1_TCCTACA = tr.createNewVocabularyTerm('TCCTACA') -vocabulary_term_INDEX1_TCCTACA.setDescription(None) -vocabulary_term_INDEX1_TCCTACA.setLabel('68 TCCTAC') -vocabulary_term_INDEX1_TCCTACA.setOrdinal(55) -vocabulary_INDEX1.addTerm(vocabulary_term_INDEX1_TCCTACA) - -vocabulary_term_INDEX1_TCTATAA = tr.createNewVocabularyTerm('TCTATAA') -vocabulary_term_INDEX1_TCTATAA.setDescription(None) -vocabulary_term_INDEX1_TCTATAA.setLabel('70 TCTATA') -vocabulary_term_INDEX1_TCTATAA.setOrdinal(56) -vocabulary_INDEX1.addTerm(vocabulary_term_INDEX1_TCTATAA) - -vocabulary_term_INDEX1_TTACTTA = tr.createNewVocabularyTerm('TTACTTA') -vocabulary_term_INDEX1_TTACTTA.setDescription(None) -vocabulary_term_INDEX1_TTACTTA.setLabel('74 TTACTT') -vocabulary_term_INDEX1_TTACTTA.setOrdinal(57) -vocabulary_INDEX1.addTerm(vocabulary_term_INDEX1_TTACTTA) - -vocabulary_term_INDEX1_TTCCGAA = tr.createNewVocabularyTerm('TTCCGAA') -vocabulary_term_INDEX1_TTCCGAA.setDescription(None) -vocabulary_term_INDEX1_TTCCGAA.setLabel('75 TTCCGA') -vocabulary_term_INDEX1_TTCCGAA.setOrdinal(58) -vocabulary_INDEX1.addTerm(vocabulary_term_INDEX1_TTCCGAA) - -vocabulary_term_INDEX1_ATGTCAA = tr.createNewVocabularyTerm('ATGTCAA') -vocabulary_term_INDEX1_ATGTCAA.setDescription(None) -vocabulary_term_INDEX1_ATGTCAA.setLabel('DNA Adapter 15') -vocabulary_term_INDEX1_ATGTCAA.setOrdinal(59) -vocabulary_INDEX1.addTerm(vocabulary_term_INDEX1_ATGTCAA) - -vocabulary_term_INDEX1_CCGTCCA = tr.createNewVocabularyTerm('CCGTCCA') -vocabulary_term_INDEX1_CCGTCCA.setDescription(None) -vocabulary_term_INDEX1_CCGTCCA.setLabel('DNA Adapter 16') -vocabulary_term_INDEX1_CCGTCCA.setOrdinal(60) -vocabulary_INDEX1.addTerm(vocabulary_term_INDEX1_CCGTCCA) - -vocabulary_term_INDEX1_GTAGAGA = tr.createNewVocabularyTerm('GTAGAGA') -vocabulary_term_INDEX1_GTAGAGA.setDescription(None) -vocabulary_term_INDEX1_GTAGAGA.setLabel('DNA Adapter 17') -vocabulary_term_INDEX1_GTAGAGA.setOrdinal(61) -vocabulary_INDEX1.addTerm(vocabulary_term_INDEX1_GTAGAGA) - -vocabulary_term_INDEX1_GTGAAAA = tr.createNewVocabularyTerm('GTGAAAA') -vocabulary_term_INDEX1_GTGAAAA.setDescription(None) -vocabulary_term_INDEX1_GTGAAAA.setLabel('DNA Adapter 19') -vocabulary_term_INDEX1_GTGAAAA.setOrdinal(62) -vocabulary_INDEX1.addTerm(vocabulary_term_INDEX1_GTGAAAA) - -vocabulary_term_INDEX1_GTGGCCA = tr.createNewVocabularyTerm('GTGGCCA') -vocabulary_term_INDEX1_GTGGCCA.setDescription(None) -vocabulary_term_INDEX1_GTGGCCA.setLabel('DNA Adapter 20') -vocabulary_term_INDEX1_GTGGCCA.setOrdinal(63) -vocabulary_INDEX1.addTerm(vocabulary_term_INDEX1_GTGGCCA) - -vocabulary_term_INDEX1_GTTTCGA = tr.createNewVocabularyTerm('GTTTCGA') -vocabulary_term_INDEX1_GTTTCGA.setDescription(None) -vocabulary_term_INDEX1_GTTTCGA.setLabel('DNA Adapter 21') -vocabulary_term_INDEX1_GTTTCGA.setOrdinal(64) -vocabulary_INDEX1.addTerm(vocabulary_term_INDEX1_GTTTCGA) - -vocabulary_term_INDEX1_CGTACGA = tr.createNewVocabularyTerm('CGTACGA') -vocabulary_term_INDEX1_CGTACGA.setDescription(None) -vocabulary_term_INDEX1_CGTACGA.setLabel('DNA Adapter 22') -vocabulary_term_INDEX1_CGTACGA.setOrdinal(65) -vocabulary_INDEX1.addTerm(vocabulary_term_INDEX1_CGTACGA) - -vocabulary_term_INDEX1_GGTAGCA = tr.createNewVocabularyTerm('GGTAGCA') -vocabulary_term_INDEX1_GGTAGCA.setDescription(None) -vocabulary_term_INDEX1_GGTAGCA.setLabel('DNA Adapter 24') -vocabulary_term_INDEX1_GGTAGCA.setOrdinal(66) -vocabulary_INDEX1.addTerm(vocabulary_term_INDEX1_GGTAGCA) - -vocabulary_term_INDEX1_ATGAGCA = tr.createNewVocabularyTerm('ATGAGCA') -vocabulary_term_INDEX1_ATGAGCA.setDescription(None) -vocabulary_term_INDEX1_ATGAGCA.setLabel('DNA Adapter 26') -vocabulary_term_INDEX1_ATGAGCA.setOrdinal(67) -vocabulary_INDEX1.addTerm(vocabulary_term_INDEX1_ATGAGCA) - -vocabulary_term_INDEX1_ATTCCTA = tr.createNewVocabularyTerm('ATTCCTA') -vocabulary_term_INDEX1_ATTCCTA.setDescription(None) -vocabulary_term_INDEX1_ATTCCTA.setLabel('DNA Adapter 27') -vocabulary_term_INDEX1_ATTCCTA.setOrdinal(68) -vocabulary_INDEX1.addTerm(vocabulary_term_INDEX1_ATTCCTA) - -vocabulary_term_INDEX1_CAAAAGA = tr.createNewVocabularyTerm('CAAAAGA') -vocabulary_term_INDEX1_CAAAAGA.setDescription(None) -vocabulary_term_INDEX1_CAAAAGA.setLabel('DNA Adapter 28') -vocabulary_term_INDEX1_CAAAAGA.setOrdinal(69) -vocabulary_INDEX1.addTerm(vocabulary_term_INDEX1_CAAAAGA) - -vocabulary_term_INDEX1_CAACTAA = tr.createNewVocabularyTerm('CAACTAA') -vocabulary_term_INDEX1_CAACTAA.setDescription(None) -vocabulary_term_INDEX1_CAACTAA.setLabel('DNA Adapter 29') -vocabulary_term_INDEX1_CAACTAA.setOrdinal(70) -vocabulary_INDEX1.addTerm(vocabulary_term_INDEX1_CAACTAA) - -vocabulary_term_INDEX1_CACCGGA = tr.createNewVocabularyTerm('CACCGGA') -vocabulary_term_INDEX1_CACCGGA.setDescription(None) -vocabulary_term_INDEX1_CACCGGA.setLabel('DNA Adapter 30') -vocabulary_term_INDEX1_CACCGGA.setOrdinal(71) -vocabulary_INDEX1.addTerm(vocabulary_term_INDEX1_CACCGGA) - -vocabulary_term_INDEX1_CACGATA = tr.createNewVocabularyTerm('CACGATA') -vocabulary_term_INDEX1_CACGATA.setDescription(None) -vocabulary_term_INDEX1_CACGATA.setLabel('DNA Adapter 31') -vocabulary_term_INDEX1_CACGATA.setOrdinal(72) -vocabulary_INDEX1.addTerm(vocabulary_term_INDEX1_CACGATA) - -vocabulary_term_INDEX1_CACTCAA = tr.createNewVocabularyTerm('CACTCAA') -vocabulary_term_INDEX1_CACTCAA.setDescription(None) -vocabulary_term_INDEX1_CACTCAA.setLabel('DNA Adapter 32') -vocabulary_term_INDEX1_CACTCAA.setOrdinal(73) -vocabulary_INDEX1.addTerm(vocabulary_term_INDEX1_CACTCAA) - -vocabulary_term_INDEX1_CAGGCGA = tr.createNewVocabularyTerm('CAGGCGA') -vocabulary_term_INDEX1_CAGGCGA.setDescription(None) -vocabulary_term_INDEX1_CAGGCGA.setLabel('DNA Adapter 33') -vocabulary_term_INDEX1_CAGGCGA.setOrdinal(74) -vocabulary_INDEX1.addTerm(vocabulary_term_INDEX1_CAGGCGA) - -vocabulary_term_INDEX1_CATGGCA = tr.createNewVocabularyTerm('CATGGCA') -vocabulary_term_INDEX1_CATGGCA.setDescription(None) -vocabulary_term_INDEX1_CATGGCA.setLabel('DNA Adapter 34') -vocabulary_term_INDEX1_CATGGCA.setOrdinal(75) -vocabulary_INDEX1.addTerm(vocabulary_term_INDEX1_CATGGCA) - -vocabulary_term_INDEX1_CATTTTA = tr.createNewVocabularyTerm('CATTTTA') -vocabulary_term_INDEX1_CATTTTA.setDescription(None) -vocabulary_term_INDEX1_CATTTTA.setLabel('DNA Adapter 35') -vocabulary_term_INDEX1_CATTTTA.setOrdinal(76) -vocabulary_INDEX1.addTerm(vocabulary_term_INDEX1_CATTTTA) - -vocabulary_term_INDEX1_CCAACAA = tr.createNewVocabularyTerm('CCAACAA') -vocabulary_term_INDEX1_CCAACAA.setDescription(None) -vocabulary_term_INDEX1_CCAACAA.setLabel('DNA Adapter 36') -vocabulary_term_INDEX1_CCAACAA.setOrdinal(77) -vocabulary_INDEX1.addTerm(vocabulary_term_INDEX1_CCAACAA) - -vocabulary_term_INDEX1_CGGAATA = tr.createNewVocabularyTerm('CGGAATA') -vocabulary_term_INDEX1_CGGAATA.setDescription(None) -vocabulary_term_INDEX1_CGGAATA.setLabel('DNA Adapter 37') -vocabulary_term_INDEX1_CGGAATA.setOrdinal(78) -vocabulary_INDEX1.addTerm(vocabulary_term_INDEX1_CGGAATA) - -vocabulary_term_INDEX1_CTAGCTA = tr.createNewVocabularyTerm('CTAGCTA') -vocabulary_term_INDEX1_CTAGCTA.setDescription(None) -vocabulary_term_INDEX1_CTAGCTA.setLabel('DNA Adapter 38') -vocabulary_term_INDEX1_CTAGCTA.setOrdinal(79) -vocabulary_INDEX1.addTerm(vocabulary_term_INDEX1_CTAGCTA) - -vocabulary_term_INDEX1_CTATACA = tr.createNewVocabularyTerm('CTATACA') -vocabulary_term_INDEX1_CTATACA.setDescription(None) -vocabulary_term_INDEX1_CTATACA.setLabel('DNA Adapter 39') -vocabulary_term_INDEX1_CTATACA.setOrdinal(80) -vocabulary_INDEX1.addTerm(vocabulary_term_INDEX1_CTATACA) - -vocabulary_term_INDEX1_CTCAGAA = tr.createNewVocabularyTerm('CTCAGAA') -vocabulary_term_INDEX1_CTCAGAA.setDescription(None) -vocabulary_term_INDEX1_CTCAGAA.setLabel('DNA Adapter 40') -vocabulary_term_INDEX1_CTCAGAA.setOrdinal(81) -vocabulary_INDEX1.addTerm(vocabulary_term_INDEX1_CTCAGAA) - -vocabulary_term_INDEX1_GACGACA = tr.createNewVocabularyTerm('GACGACA') -vocabulary_term_INDEX1_GACGACA.setDescription(None) -vocabulary_term_INDEX1_GACGACA.setLabel('DNA Adapter 41') -vocabulary_term_INDEX1_GACGACA.setOrdinal(82) -vocabulary_INDEX1.addTerm(vocabulary_term_INDEX1_GACGACA) - -vocabulary_term_INDEX1_TAATCGA = tr.createNewVocabularyTerm('TAATCGA') -vocabulary_term_INDEX1_TAATCGA.setDescription(None) -vocabulary_term_INDEX1_TAATCGA.setLabel('DNA Adapter 42') -vocabulary_term_INDEX1_TAATCGA.setOrdinal(83) -vocabulary_INDEX1.addTerm(vocabulary_term_INDEX1_TAATCGA) - -vocabulary_term_INDEX1_TACAGCA = tr.createNewVocabularyTerm('TACAGCA') -vocabulary_term_INDEX1_TACAGCA.setDescription(None) -vocabulary_term_INDEX1_TACAGCA.setLabel('DNA Adapter 43') -vocabulary_term_INDEX1_TACAGCA.setOrdinal(84) -vocabulary_INDEX1.addTerm(vocabulary_term_INDEX1_TACAGCA) - -vocabulary_term_INDEX1_TATAATA = tr.createNewVocabularyTerm('TATAATA') -vocabulary_term_INDEX1_TATAATA.setDescription(None) -vocabulary_term_INDEX1_TATAATA.setLabel('DNA Adapter 44') -vocabulary_term_INDEX1_TATAATA.setOrdinal(85) -vocabulary_INDEX1.addTerm(vocabulary_term_INDEX1_TATAATA) - -vocabulary_term_INDEX1_TCATTCA = tr.createNewVocabularyTerm('TCATTCA') -vocabulary_term_INDEX1_TCATTCA.setDescription(None) -vocabulary_term_INDEX1_TCATTCA.setLabel('DNA Adapter 45') -vocabulary_term_INDEX1_TCATTCA.setOrdinal(86) -vocabulary_INDEX1.addTerm(vocabulary_term_INDEX1_TCATTCA) - -vocabulary_term_INDEX1_TCCCGAA = tr.createNewVocabularyTerm('TCCCGAA') -vocabulary_term_INDEX1_TCCCGAA.setDescription(None) -vocabulary_term_INDEX1_TCCCGAA.setLabel('DNA Adapter 46') -vocabulary_term_INDEX1_TCCCGAA.setOrdinal(87) -vocabulary_INDEX1.addTerm(vocabulary_term_INDEX1_TCCCGAA) - -vocabulary_term_INDEX1_TCGAAGA = tr.createNewVocabularyTerm('TCGAAGA') -vocabulary_term_INDEX1_TCGAAGA.setDescription(None) -vocabulary_term_INDEX1_TCGAAGA.setLabel('DNA Adapter 47') -vocabulary_term_INDEX1_TCGAAGA.setOrdinal(88) -vocabulary_INDEX1.addTerm(vocabulary_term_INDEX1_TCGAAGA) - -vocabulary_term_INDEX1_TCGGCAA = tr.createNewVocabularyTerm('TCGGCAA') -vocabulary_term_INDEX1_TCGGCAA.setDescription(None) -vocabulary_term_INDEX1_TCGGCAA.setLabel('DNA Adapter 48') -vocabulary_term_INDEX1_TCGGCAA.setOrdinal(89) -vocabulary_INDEX1.addTerm(vocabulary_term_INDEX1_TCGGCAA) - -vocabulary_term_INDEX1_AGTCAAC = tr.createNewVocabularyTerm('AGTCAAC') -vocabulary_term_INDEX1_AGTCAAC.setDescription(None) -vocabulary_term_INDEX1_AGTCAAC.setLabel('Index13 AGTCAAC') -vocabulary_term_INDEX1_AGTCAAC.setOrdinal(90) -vocabulary_INDEX1.addTerm(vocabulary_term_INDEX1_AGTCAAC) - -vocabulary_term_INDEX1_AATGCGA = tr.createNewVocabularyTerm('AATGCGA') -vocabulary_term_INDEX1_AATGCGA.setDescription(None) -vocabulary_term_INDEX1_AATGCGA.setLabel('Lib AATGCGA') -vocabulary_term_INDEX1_AATGCGA.setOrdinal(91) -vocabulary_INDEX1.addTerm(vocabulary_term_INDEX1_AATGCGA) - -vocabulary_INDEX2 = tr.getOrCreateNewVocabulary('INDEX2') -vocabulary_INDEX2.setDescription('Index 2 for Illumina Dual Indexing') -vocabulary_INDEX2.setUrlTemplate(None) -vocabulary_INDEX2.setManagedInternally(False) -vocabulary_INDEX2.setInternalNamespace(False) -vocabulary_INDEX2.setChosenFromList(True) - -vocabulary_term_INDEX2_TAGATCGC = tr.createNewVocabularyTerm('TAGATCGC') -vocabulary_term_INDEX2_TAGATCGC.setDescription('Nextera DNA') -vocabulary_term_INDEX2_TAGATCGC.setLabel('Index2 (i5) N501 TAGATCGC') -vocabulary_term_INDEX2_TAGATCGC.setOrdinal(1) -vocabulary_INDEX2.addTerm(vocabulary_term_INDEX2_TAGATCGC) - -vocabulary_term_INDEX2_CTCTCTAT = tr.createNewVocabularyTerm('CTCTCTAT') -vocabulary_term_INDEX2_CTCTCTAT.setDescription('Nextera DNA') -vocabulary_term_INDEX2_CTCTCTAT.setLabel('Index2 (i5) N502 CTCTCTAT') -vocabulary_term_INDEX2_CTCTCTAT.setOrdinal(2) -vocabulary_INDEX2.addTerm(vocabulary_term_INDEX2_CTCTCTAT) - -vocabulary_term_INDEX2_TATCCTCT = tr.createNewVocabularyTerm('TATCCTCT') -vocabulary_term_INDEX2_TATCCTCT.setDescription('Nextera DNA') -vocabulary_term_INDEX2_TATCCTCT.setLabel('Index2 (i5) N503 TATCCTCT') -vocabulary_term_INDEX2_TATCCTCT.setOrdinal(3) -vocabulary_INDEX2.addTerm(vocabulary_term_INDEX2_TATCCTCT) - -vocabulary_term_INDEX2_AGAGTAGA = tr.createNewVocabularyTerm('AGAGTAGA') -vocabulary_term_INDEX2_AGAGTAGA.setDescription('Nextera DNA') -vocabulary_term_INDEX2_AGAGTAGA.setLabel('Index2 (i5) N504 AGAGTAGA') -vocabulary_term_INDEX2_AGAGTAGA.setOrdinal(4) -vocabulary_INDEX2.addTerm(vocabulary_term_INDEX2_AGAGTAGA) - -vocabulary_term_INDEX2_GTAAGGAG = tr.createNewVocabularyTerm('GTAAGGAG') -vocabulary_term_INDEX2_GTAAGGAG.setDescription('Nextera DNA') -vocabulary_term_INDEX2_GTAAGGAG.setLabel('Index2 (i5) N505 GTAAGGAG') -vocabulary_term_INDEX2_GTAAGGAG.setOrdinal(5) -vocabulary_INDEX2.addTerm(vocabulary_term_INDEX2_GTAAGGAG) - -vocabulary_term_INDEX2_ACTGCATA = tr.createNewVocabularyTerm('ACTGCATA') -vocabulary_term_INDEX2_ACTGCATA.setDescription('Nextera DNA') -vocabulary_term_INDEX2_ACTGCATA.setLabel('Index2 (i5) N506 ACTGCATA') -vocabulary_term_INDEX2_ACTGCATA.setOrdinal(6) -vocabulary_INDEX2.addTerm(vocabulary_term_INDEX2_ACTGCATA) - -vocabulary_term_INDEX2_AAGGAGTA = tr.createNewVocabularyTerm('AAGGAGTA') -vocabulary_term_INDEX2_AAGGAGTA.setDescription('Nextera DNA') -vocabulary_term_INDEX2_AAGGAGTA.setLabel('Index2 (i5) N507 AAGGAGTA') -vocabulary_term_INDEX2_AAGGAGTA.setOrdinal(7) -vocabulary_INDEX2.addTerm(vocabulary_term_INDEX2_AAGGAGTA) - -vocabulary_term_INDEX2_CTAAGCCT = tr.createNewVocabularyTerm('CTAAGCCT') -vocabulary_term_INDEX2_CTAAGCCT.setDescription('Nextera DNA') -vocabulary_term_INDEX2_CTAAGCCT.setLabel('Index2 (i5) N508 CTAAGCCT') -vocabulary_term_INDEX2_CTAAGCCT.setOrdinal(8) -vocabulary_INDEX2.addTerm(vocabulary_term_INDEX2_CTAAGCCT) - -vocabulary_KIT = tr.getOrCreateNewVocabulary('KIT') -vocabulary_KIT.setDescription('Illumina Kit used for preparation') -vocabulary_KIT.setUrlTemplate(None) -vocabulary_KIT.setManagedInternally(False) -vocabulary_KIT.setInternalNamespace(False) -vocabulary_KIT.setChosenFromList(True) - -vocabulary_term_KIT_CHIP_SEQ_SAMPLE_PREP = tr.createNewVocabularyTerm('CHIP_SEQ_SAMPLE_PREP') -vocabulary_term_KIT_CHIP_SEQ_SAMPLE_PREP.setDescription(None) -vocabulary_term_KIT_CHIP_SEQ_SAMPLE_PREP.setLabel('ChIP-Seq Sample Preparation Kit') -vocabulary_term_KIT_CHIP_SEQ_SAMPLE_PREP.setOrdinal(1) -vocabulary_KIT.addTerm(vocabulary_term_KIT_CHIP_SEQ_SAMPLE_PREP) - -vocabulary_term_KIT_NEBNEXT_DNA_SAMPLE_PREP_MASTER_MIX_SET1 = tr.createNewVocabularyTerm('NEBNEXT_DNA_SAMPLE_PREP_MASTER_MIX_SET1') -vocabulary_term_KIT_NEBNEXT_DNA_SAMPLE_PREP_MASTER_MIX_SET1.setDescription(None) -vocabulary_term_KIT_NEBNEXT_DNA_SAMPLE_PREP_MASTER_MIX_SET1.setLabel('NEB Genomic DNA Sample Preparation Kit') -vocabulary_term_KIT_NEBNEXT_DNA_SAMPLE_PREP_MASTER_MIX_SET1.setOrdinal(2) -vocabulary_KIT.addTerm(vocabulary_term_KIT_NEBNEXT_DNA_SAMPLE_PREP_MASTER_MIX_SET1) - -vocabulary_term_KIT_GENOMICDNA_SAMPLE_PREP = tr.createNewVocabularyTerm('GENOMICDNA_SAMPLE_PREP') -vocabulary_term_KIT_GENOMICDNA_SAMPLE_PREP.setDescription(None) -vocabulary_term_KIT_GENOMICDNA_SAMPLE_PREP.setLabel('Illumina Genomic DNA Sample Preparation Kit') -vocabulary_term_KIT_GENOMICDNA_SAMPLE_PREP.setOrdinal(3) -vocabulary_KIT.addTerm(vocabulary_term_KIT_GENOMICDNA_SAMPLE_PREP) - -vocabulary_term_KIT_PAIRED_END_DNA_SAMPLE_PREP = tr.createNewVocabularyTerm('PAIRED_END_DNA_SAMPLE_PREP') -vocabulary_term_KIT_PAIRED_END_DNA_SAMPLE_PREP.setDescription(None) -vocabulary_term_KIT_PAIRED_END_DNA_SAMPLE_PREP.setLabel('Paired End DNA Sample Prep Oligo Kit') -vocabulary_term_KIT_PAIRED_END_DNA_SAMPLE_PREP.setOrdinal(4) -vocabulary_KIT.addTerm(vocabulary_term_KIT_PAIRED_END_DNA_SAMPLE_PREP) - -vocabulary_term_KIT_MRNA_SEQ_SAMPLE_PREP = tr.createNewVocabularyTerm('MRNA_SEQ_SAMPLE_PREP') -vocabulary_term_KIT_MRNA_SEQ_SAMPLE_PREP.setDescription(None) -vocabulary_term_KIT_MRNA_SEQ_SAMPLE_PREP.setLabel('mRNA-Seq Sample Preparation Kit') -vocabulary_term_KIT_MRNA_SEQ_SAMPLE_PREP.setOrdinal(5) -vocabulary_KIT.addTerm(vocabulary_term_KIT_MRNA_SEQ_SAMPLE_PREP) - -vocabulary_term_KIT_RIBOZERO_SCRIPTSEQ_MRNASEQ_KIT = tr.createNewVocabularyTerm('RIBOZERO_SCRIPTSEQ_MRNA-SEQ_KIT') -vocabulary_term_KIT_RIBOZERO_SCRIPTSEQ_MRNASEQ_KIT.setDescription(None) -vocabulary_term_KIT_RIBOZERO_SCRIPTSEQ_MRNASEQ_KIT.setLabel('RiboZero ScriptSeq mRNA-Seq_Epicentre-kit') -vocabulary_term_KIT_RIBOZERO_SCRIPTSEQ_MRNASEQ_KIT.setOrdinal(6) -vocabulary_KIT.addTerm(vocabulary_term_KIT_RIBOZERO_SCRIPTSEQ_MRNASEQ_KIT) - -vocabulary_term_KIT_POLYA_SCRIPTSEQ_MRNASEQ_KIT = tr.createNewVocabularyTerm('POLYA_SCRIPTSEQ_MRNA-SEQ_KIT') -vocabulary_term_KIT_POLYA_SCRIPTSEQ_MRNASEQ_KIT.setDescription(None) -vocabulary_term_KIT_POLYA_SCRIPTSEQ_MRNASEQ_KIT.setLabel('PolyA(Beads) ScriptSeq mRNA-Seq_Epicentre-kit') -vocabulary_term_KIT_POLYA_SCRIPTSEQ_MRNASEQ_KIT.setOrdinal(7) -vocabulary_KIT.addTerm(vocabulary_term_KIT_POLYA_SCRIPTSEQ_MRNASEQ_KIT) - -vocabulary_term_KIT_NEXTERA_DNA_SAMPLE_PREP_KITS = tr.createNewVocabularyTerm('NEXTERA_DNA_SAMPLE_PREP_KITS') -vocabulary_term_KIT_NEXTERA_DNA_SAMPLE_PREP_KITS.setDescription(None) -vocabulary_term_KIT_NEXTERA_DNA_SAMPLE_PREP_KITS.setLabel('Nextera Genomic DNA Sample Preparation Kit BufferLMW(Epicentre)') -vocabulary_term_KIT_NEXTERA_DNA_SAMPLE_PREP_KITS.setOrdinal(8) -vocabulary_KIT.addTerm(vocabulary_term_KIT_NEXTERA_DNA_SAMPLE_PREP_KITS) - -vocabulary_term_KIT_NEXTERA_DNA_SAMPLE_PREP_KIT_BUFFER_HMW = tr.createNewVocabularyTerm('NEXTERA_DNA_SAMPLE_PREP_KIT_BUFFER_HMW') -vocabulary_term_KIT_NEXTERA_DNA_SAMPLE_PREP_KIT_BUFFER_HMW.setDescription(None) -vocabulary_term_KIT_NEXTERA_DNA_SAMPLE_PREP_KIT_BUFFER_HMW.setLabel('Nextera Genomic DNA Sample Preparation Kit BufferHMW(Epicentre)') -vocabulary_term_KIT_NEXTERA_DNA_SAMPLE_PREP_KIT_BUFFER_HMW.setOrdinal(9) -vocabulary_KIT.addTerm(vocabulary_term_KIT_NEXTERA_DNA_SAMPLE_PREP_KIT_BUFFER_HMW) - -vocabulary_term_KIT_AGILENT_SURESELECT_ENRICHMENTSYSTEM = tr.createNewVocabularyTerm('AGILENT_SURESELECT_ENRICHMENTSYSTEM') -vocabulary_term_KIT_AGILENT_SURESELECT_ENRICHMENTSYSTEM.setDescription(None) -vocabulary_term_KIT_AGILENT_SURESELECT_ENRICHMENTSYSTEM.setLabel('Agilent_SureSelect_EnrichmentSystem') -vocabulary_term_KIT_AGILENT_SURESELECT_ENRICHMENTSYSTEM.setOrdinal(10) -vocabulary_KIT.addTerm(vocabulary_term_KIT_AGILENT_SURESELECT_ENRICHMENTSYSTEM) - -vocabulary_term_KIT_TRUSEQRNA_SAMPLE_PREP_KIT = tr.createNewVocabularyTerm('TRUSEQRNA_SAMPLE_PREP_KIT') -vocabulary_term_KIT_TRUSEQRNA_SAMPLE_PREP_KIT.setDescription(None) -vocabulary_term_KIT_TRUSEQRNA_SAMPLE_PREP_KIT.setLabel('TruSeq_RNA_SamplePrepKit_Illumina') -vocabulary_term_KIT_TRUSEQRNA_SAMPLE_PREP_KIT.setOrdinal(11) -vocabulary_KIT.addTerm(vocabulary_term_KIT_TRUSEQRNA_SAMPLE_PREP_KIT) - -vocabulary_term_KIT_TRUSEQ_DNA_SAMPLE_PREP_KIT = tr.createNewVocabularyTerm('TRUSEQ_DNA_SAMPLE_PREP_KIT') -vocabulary_term_KIT_TRUSEQ_DNA_SAMPLE_PREP_KIT.setDescription(None) -vocabulary_term_KIT_TRUSEQ_DNA_SAMPLE_PREP_KIT.setLabel('TruSeq_DNA_SamplePrepKit_Illumina') -vocabulary_term_KIT_TRUSEQ_DNA_SAMPLE_PREP_KIT.setOrdinal(12) -vocabulary_KIT.addTerm(vocabulary_term_KIT_TRUSEQ_DNA_SAMPLE_PREP_KIT) - -vocabulary_term_KIT_NONE = tr.createNewVocabularyTerm('NONE') -vocabulary_term_KIT_NONE.setDescription(None) -vocabulary_term_KIT_NONE.setLabel('None (Already prepared)') -vocabulary_term_KIT_NONE.setOrdinal(13) -vocabulary_KIT.addTerm(vocabulary_term_KIT_NONE) - -vocabulary_MACS_VERSION = tr.getOrCreateNewVocabulary('MACS_VERSION') -vocabulary_MACS_VERSION.setDescription('Used MACS version for Peak Calling') -vocabulary_MACS_VERSION.setUrlTemplate(None) -vocabulary_MACS_VERSION.setManagedInternally(False) -vocabulary_MACS_VERSION.setInternalNamespace(False) -vocabulary_MACS_VERSION.setChosenFromList(True) - -vocabulary_term_MACS_VERSION_140RC2 = tr.createNewVocabularyTerm('1.4.0RC2') -vocabulary_term_MACS_VERSION_140RC2.setDescription(None) -vocabulary_term_MACS_VERSION_140RC2.setLabel('macs14 1.4.0rc2 20110214 (Valentine)') -vocabulary_term_MACS_VERSION_140RC2.setOrdinal(1) -vocabulary_MACS_VERSION.addTerm(vocabulary_term_MACS_VERSION_140RC2) - -vocabulary_term_MACS_VERSION_1371 = tr.createNewVocabularyTerm('1.3.7.1') -vocabulary_term_MACS_VERSION_1371.setDescription(None) -vocabulary_term_MACS_VERSION_1371.setLabel('macs 1.3.7.1 (Oktoberfest, bug fixed #1)') -vocabulary_term_MACS_VERSION_1371.setOrdinal(2) -vocabulary_MACS_VERSION.addTerm(vocabulary_term_MACS_VERSION_1371) - -vocabulary_MISMATCH_IN_INDEX = tr.getOrCreateNewVocabulary('MISMATCH_IN_INDEX') -vocabulary_MISMATCH_IN_INDEX.setDescription('Mismatch in Index allowed') -vocabulary_MISMATCH_IN_INDEX.setUrlTemplate(None) -vocabulary_MISMATCH_IN_INDEX.setManagedInternally(False) -vocabulary_MISMATCH_IN_INDEX.setInternalNamespace(False) -vocabulary_MISMATCH_IN_INDEX.setChosenFromList(True) - -vocabulary_term_MISMATCH_IN_INDEX_NONE = tr.createNewVocabularyTerm('NONE') -vocabulary_term_MISMATCH_IN_INDEX_NONE.setDescription(None) -vocabulary_term_MISMATCH_IN_INDEX_NONE.setLabel(None) -vocabulary_term_MISMATCH_IN_INDEX_NONE.setOrdinal(1) -vocabulary_MISMATCH_IN_INDEX.addTerm(vocabulary_term_MISMATCH_IN_INDEX_NONE) - -vocabulary_term_MISMATCH_IN_INDEX_ONE = tr.createNewVocabularyTerm('ONE') -vocabulary_term_MISMATCH_IN_INDEX_ONE.setDescription(None) -vocabulary_term_MISMATCH_IN_INDEX_ONE.setLabel(None) -vocabulary_term_MISMATCH_IN_INDEX_ONE.setOrdinal(2) -vocabulary_MISMATCH_IN_INDEX.addTerm(vocabulary_term_MISMATCH_IN_INDEX_ONE) - -vocabulary_NANO_DROP = tr.getOrCreateNewVocabulary('NANO_DROP') -vocabulary_NANO_DROP.setDescription('Device for measuring the total amount of genetic material contained in the probe') -vocabulary_NANO_DROP.setUrlTemplate(None) -vocabulary_NANO_DROP.setManagedInternally(False) -vocabulary_NANO_DROP.setInternalNamespace(False) -vocabulary_NANO_DROP.setChosenFromList(True) - -vocabulary_term_NANO_DROP_CONCND3300 = tr.createNewVocabularyTerm('CONCND3300') -vocabulary_term_NANO_DROP_CONCND3300.setDescription(None) -vocabulary_term_NANO_DROP_CONCND3300.setLabel('Conc Nano Drop 3300') -vocabulary_term_NANO_DROP_CONCND3300.setOrdinal(1) -vocabulary_NANO_DROP.addTerm(vocabulary_term_NANO_DROP_CONCND3300) - -vocabulary_term_NANO_DROP_CONCND1000 = tr.createNewVocabularyTerm('CONCND1000') -vocabulary_term_NANO_DROP_CONCND1000.setDescription(None) -vocabulary_term_NANO_DROP_CONCND1000.setLabel('Conc Nano Drop 1000') -vocabulary_term_NANO_DROP_CONCND1000.setOrdinal(2) -vocabulary_NANO_DROP.addTerm(vocabulary_term_NANO_DROP_CONCND1000) - -vocabulary_term_NANO_DROP_CONCND2000 = tr.createNewVocabularyTerm('CONCND2000') -vocabulary_term_NANO_DROP_CONCND2000.setDescription(None) -vocabulary_term_NANO_DROP_CONCND2000.setLabel('Conc Nano Drop 2000') -vocabulary_term_NANO_DROP_CONCND2000.setOrdinal(3) -vocabulary_NANO_DROP.addTerm(vocabulary_term_NANO_DROP_CONCND2000) - -vocabulary_NCBI_TAXONOMY = tr.getOrCreateNewVocabulary('NCBI_TAXONOMY') -vocabulary_NCBI_TAXONOMY.setDescription(None) -vocabulary_NCBI_TAXONOMY.setUrlTemplate('http://www.ncbi.nlm.nih.gov/Taxonomy/Browser/wwwtax.cgi?id=$term$') -vocabulary_NCBI_TAXONOMY.setManagedInternally(False) -vocabulary_NCBI_TAXONOMY.setInternalNamespace(False) -vocabulary_NCBI_TAXONOMY.setChosenFromList(True) - -vocabulary_term_NCBI_TAXONOMY_10090 = tr.createNewVocabularyTerm('10090') -vocabulary_term_NCBI_TAXONOMY_10090.setDescription('Genbank common name: house mouse\ Inherited blast name: rodents') -vocabulary_term_NCBI_TAXONOMY_10090.setLabel('Mus musculus') -vocabulary_term_NCBI_TAXONOMY_10090.setOrdinal(1) -vocabulary_NCBI_TAXONOMY.addTerm(vocabulary_term_NCBI_TAXONOMY_10090) - -vocabulary_term_NCBI_TAXONOMY_9606 = tr.createNewVocabularyTerm('9606') -vocabulary_term_NCBI_TAXONOMY_9606.setDescription('Genbank common name: human\ Inherited blast name: primates') -vocabulary_term_NCBI_TAXONOMY_9606.setLabel('Homo sapiens') -vocabulary_term_NCBI_TAXONOMY_9606.setOrdinal(2) -vocabulary_NCBI_TAXONOMY.addTerm(vocabulary_term_NCBI_TAXONOMY_9606) - -vocabulary_term_NCBI_TAXONOMY_7227 = tr.createNewVocabularyTerm('7227') -vocabulary_term_NCBI_TAXONOMY_7227.setDescription('Genbank common name: fruit fly\ Inherited blast name: flies') -vocabulary_term_NCBI_TAXONOMY_7227.setLabel('Drosophila melanogaster') -vocabulary_term_NCBI_TAXONOMY_7227.setOrdinal(3) -vocabulary_NCBI_TAXONOMY.addTerm(vocabulary_term_NCBI_TAXONOMY_7227) - -vocabulary_term_NCBI_TAXONOMY_6239 = tr.createNewVocabularyTerm('6239') -vocabulary_term_NCBI_TAXONOMY_6239.setDescription('Inherited blast name: nematodes') -vocabulary_term_NCBI_TAXONOMY_6239.setLabel('Caenorhabditis elegans') -vocabulary_term_NCBI_TAXONOMY_6239.setOrdinal(4) -vocabulary_NCBI_TAXONOMY.addTerm(vocabulary_term_NCBI_TAXONOMY_6239) - -vocabulary_term_NCBI_TAXONOMY_4932 = tr.createNewVocabularyTerm('4932') -vocabulary_term_NCBI_TAXONOMY_4932.setDescription('Genbank common name: baker\'s yeast\ Inherited blast name: ascomycetes') -vocabulary_term_NCBI_TAXONOMY_4932.setLabel('Saccharomyces cerevisiae') -vocabulary_term_NCBI_TAXONOMY_4932.setOrdinal(5) -vocabulary_NCBI_TAXONOMY.addTerm(vocabulary_term_NCBI_TAXONOMY_4932) - -vocabulary_term_NCBI_TAXONOMY_10116 = tr.createNewVocabularyTerm('10116') -vocabulary_term_NCBI_TAXONOMY_10116.setDescription('Genbank common name: Norway rat\ Inherited blast name: rodents') -vocabulary_term_NCBI_TAXONOMY_10116.setLabel('Rattus norvegicus') -vocabulary_term_NCBI_TAXONOMY_10116.setOrdinal(6) -vocabulary_NCBI_TAXONOMY.addTerm(vocabulary_term_NCBI_TAXONOMY_10116) - -vocabulary_term_NCBI_TAXONOMY_6669 = tr.createNewVocabularyTerm('6669') -vocabulary_term_NCBI_TAXONOMY_6669.setDescription('Genbank common name: common water flea\ Inherited blast name: crustaceans') -vocabulary_term_NCBI_TAXONOMY_6669.setLabel('Daphnia pulex') -vocabulary_term_NCBI_TAXONOMY_6669.setOrdinal(7) -vocabulary_NCBI_TAXONOMY.addTerm(vocabulary_term_NCBI_TAXONOMY_6669) - -vocabulary_term_NCBI_TAXONOMY_562 = tr.createNewVocabularyTerm('562') -vocabulary_term_NCBI_TAXONOMY_562.setDescription('Inherited blast name: enterobacteria') -vocabulary_term_NCBI_TAXONOMY_562.setLabel('Escherichia coli') -vocabulary_term_NCBI_TAXONOMY_562.setOrdinal(8) -vocabulary_NCBI_TAXONOMY.addTerm(vocabulary_term_NCBI_TAXONOMY_562) - -vocabulary_term_NCBI_TAXONOMY_623 = tr.createNewVocabularyTerm('623') -vocabulary_term_NCBI_TAXONOMY_623.setDescription('Inherited blast name: enterobacteria') -vocabulary_term_NCBI_TAXONOMY_623.setLabel('Shigella flexneri') -vocabulary_term_NCBI_TAXONOMY_623.setOrdinal(9) -vocabulary_NCBI_TAXONOMY.addTerm(vocabulary_term_NCBI_TAXONOMY_623) - -vocabulary_term_NCBI_TAXONOMY_10847 = tr.createNewVocabularyTerm('10847') -vocabulary_term_NCBI_TAXONOMY_10847.setDescription('Inherited blast name: viruses') -vocabulary_term_NCBI_TAXONOMY_10847.setLabel('Enterobacteria phage phiX174') -vocabulary_term_NCBI_TAXONOMY_10847.setOrdinal(10) -vocabulary_NCBI_TAXONOMY.addTerm(vocabulary_term_NCBI_TAXONOMY_10847) - -vocabulary_term_NCBI_TAXONOMY_190650 = tr.createNewVocabularyTerm('190650') -vocabulary_term_NCBI_TAXONOMY_190650.setDescription('Inherited blast name: a-proteobacteria') -vocabulary_term_NCBI_TAXONOMY_190650.setLabel('Caulobacter crescentus CB15') -vocabulary_term_NCBI_TAXONOMY_190650.setOrdinal(11) -vocabulary_NCBI_TAXONOMY.addTerm(vocabulary_term_NCBI_TAXONOMY_190650) - -vocabulary_term_NCBI_TAXONOMY_8113 = tr.createNewVocabularyTerm('8113') -vocabulary_term_NCBI_TAXONOMY_8113.setDescription('Genbank common name: cichlids\ Inherited blast name: bony fishes') -vocabulary_term_NCBI_TAXONOMY_8113.setLabel('Cichlidae') -vocabulary_term_NCBI_TAXONOMY_8113.setOrdinal(12) -vocabulary_NCBI_TAXONOMY.addTerm(vocabulary_term_NCBI_TAXONOMY_8113) - -vocabulary_term_NCBI_TAXONOMY_481459 = tr.createNewVocabularyTerm('481459') -vocabulary_term_NCBI_TAXONOMY_481459.setDescription('Genbank common name: three-spined stickleback\ Inherited blast name: bony fishes') -vocabulary_term_NCBI_TAXONOMY_481459.setLabel('Gasterosteus aculeatus aculeatus') -vocabulary_term_NCBI_TAXONOMY_481459.setOrdinal(13) -vocabulary_NCBI_TAXONOMY.addTerm(vocabulary_term_NCBI_TAXONOMY_481459) - -vocabulary_term_NCBI_TAXONOMY_282301 = tr.createNewVocabularyTerm('282301') -vocabulary_term_NCBI_TAXONOMY_282301.setDescription('Inherited blast name: flatworms') -vocabulary_term_NCBI_TAXONOMY_282301.setLabel('Macrostomum lignano') -vocabulary_term_NCBI_TAXONOMY_282301.setOrdinal(14) -vocabulary_NCBI_TAXONOMY.addTerm(vocabulary_term_NCBI_TAXONOMY_282301) - -vocabulary_term_NCBI_TAXONOMY_99287 = tr.createNewVocabularyTerm('99287') -vocabulary_term_NCBI_TAXONOMY_99287.setDescription('Inherited blast name: enterobacteria') -vocabulary_term_NCBI_TAXONOMY_99287.setLabel('Salmonella enterica subsp. enterica serovar Typhimurium str. LT2') -vocabulary_term_NCBI_TAXONOMY_99287.setOrdinal(15) -vocabulary_NCBI_TAXONOMY.addTerm(vocabulary_term_NCBI_TAXONOMY_99287) - -vocabulary_term_NCBI_TAXONOMY_4896 = tr.createNewVocabularyTerm('4896') -vocabulary_term_NCBI_TAXONOMY_4896.setDescription('Genbank common name: fission yeast\ Inherited blast name: ascomycetes') -vocabulary_term_NCBI_TAXONOMY_4896.setLabel('Schizosaccharomyces pombe') -vocabulary_term_NCBI_TAXONOMY_4896.setOrdinal(16) -vocabulary_NCBI_TAXONOMY.addTerm(vocabulary_term_NCBI_TAXONOMY_4896) - -vocabulary_term_NCBI_TAXONOMY_4897 = tr.createNewVocabularyTerm('4897') -vocabulary_term_NCBI_TAXONOMY_4897.setDescription('Inherited blast name: ascomycetes') -vocabulary_term_NCBI_TAXONOMY_4897.setLabel('Schizosaccharomyces japonicus') -vocabulary_term_NCBI_TAXONOMY_4897.setOrdinal(17) -vocabulary_NCBI_TAXONOMY.addTerm(vocabulary_term_NCBI_TAXONOMY_4897) - -vocabulary_term_NCBI_TAXONOMY_7955 = tr.createNewVocabularyTerm('7955') -vocabulary_term_NCBI_TAXONOMY_7955.setDescription('Genbank common name: zebrafish\ Inherited blast name: bony fishes') -vocabulary_term_NCBI_TAXONOMY_7955.setLabel('Danio rerio') -vocabulary_term_NCBI_TAXONOMY_7955.setOrdinal(18) -vocabulary_NCBI_TAXONOMY.addTerm(vocabulary_term_NCBI_TAXONOMY_7955) - -vocabulary_term_NCBI_TAXONOMY_3702 = tr.createNewVocabularyTerm('3702') -vocabulary_term_NCBI_TAXONOMY_3702.setDescription('Genbank common name: thale cress\ Inherited blast name: eudicots') -vocabulary_term_NCBI_TAXONOMY_3702.setLabel('Arabidopsis thaliana') -vocabulary_term_NCBI_TAXONOMY_3702.setOrdinal(19) -vocabulary_NCBI_TAXONOMY.addTerm(vocabulary_term_NCBI_TAXONOMY_3702) - -vocabulary_term_NCBI_TAXONOMY_225322 = tr.createNewVocabularyTerm('225322') -vocabulary_term_NCBI_TAXONOMY_225322.setDescription('Bacterium which infects Daphnia\ Pasteuria ramosa Metchnikoff 1888 (Approved Lists 1980) emend. Starr et al. 1986\ Ebert D, Rainey P, Embley TM, Scholz D. Development, life\ cycle, ultrastructure and phylogenetic position of Pasteuria ramosa Metchnikoff 1888: rediscovery of an obligate \ endoparasite of Daphnia magna Straus. Philos Trans R Soc \ Lond Ser B. 1996;351:1689.') -vocabulary_term_NCBI_TAXONOMY_225322.setLabel('Pasteuria ramosa') -vocabulary_term_NCBI_TAXONOMY_225322.setOrdinal(20) -vocabulary_NCBI_TAXONOMY.addTerm(vocabulary_term_NCBI_TAXONOMY_225322) - -vocabulary_term_NCBI_TAXONOMY_9913 = tr.createNewVocabularyTerm('9913') -vocabulary_term_NCBI_TAXONOMY_9913.setDescription('Genbank common name: cattle\ Inherited blast name: even-toed ungulates') -vocabulary_term_NCBI_TAXONOMY_9913.setLabel('Bos taurus') -vocabulary_term_NCBI_TAXONOMY_9913.setOrdinal(21) -vocabulary_NCBI_TAXONOMY.addTerm(vocabulary_term_NCBI_TAXONOMY_9913) - -vocabulary_term_NCBI_TAXONOMY_9823 = tr.createNewVocabularyTerm('9823') -vocabulary_term_NCBI_TAXONOMY_9823.setDescription('Genbank common name: pig\ Inherited blast name: even-toed ungulates') -vocabulary_term_NCBI_TAXONOMY_9823.setLabel('Sus scrofa') -vocabulary_term_NCBI_TAXONOMY_9823.setOrdinal(22) -vocabulary_NCBI_TAXONOMY.addTerm(vocabulary_term_NCBI_TAXONOMY_9823) - -vocabulary_term_NCBI_TAXONOMY_9940 = tr.createNewVocabularyTerm('9940') -vocabulary_term_NCBI_TAXONOMY_9940.setDescription('Genbank common name: sheep\ Inherited blast name: even-toed ungulates') -vocabulary_term_NCBI_TAXONOMY_9940.setLabel('Ovis aries') -vocabulary_term_NCBI_TAXONOMY_9940.setOrdinal(23) -vocabulary_NCBI_TAXONOMY.addTerm(vocabulary_term_NCBI_TAXONOMY_9940) - -vocabulary_term_NCBI_TAXONOMY_9925 = tr.createNewVocabularyTerm('9925') -vocabulary_term_NCBI_TAXONOMY_9925.setDescription('Genbank common name: goat\ Inherited blast name: even-toed ungulates') -vocabulary_term_NCBI_TAXONOMY_9925.setLabel('Capra hircus') -vocabulary_term_NCBI_TAXONOMY_9925.setOrdinal(24) -vocabulary_NCBI_TAXONOMY.addTerm(vocabulary_term_NCBI_TAXONOMY_9925) - -vocabulary_term_NCBI_TAXONOMY_8153 = tr.createNewVocabularyTerm('8153') -vocabulary_term_NCBI_TAXONOMY_8153.setDescription('Common name: cichlid fish') -vocabulary_term_NCBI_TAXONOMY_8153.setLabel('Haplochromis burtoni') -vocabulary_term_NCBI_TAXONOMY_8153.setOrdinal(25) -vocabulary_NCBI_TAXONOMY.addTerm(vocabulary_term_NCBI_TAXONOMY_8153) - -vocabulary_term_NCBI_TAXONOMY_61818 = tr.createNewVocabularyTerm('61818') -vocabulary_term_NCBI_TAXONOMY_61818.setDescription('Common name: bony fish') -vocabulary_term_NCBI_TAXONOMY_61818.setLabel('Amphilophus (nicaraguan)') -vocabulary_term_NCBI_TAXONOMY_61818.setOrdinal(26) -vocabulary_NCBI_TAXONOMY.addTerm(vocabulary_term_NCBI_TAXONOMY_61818) - -vocabulary_term_NCBI_TAXONOMY_35525 = tr.createNewVocabularyTerm('35525') -vocabulary_term_NCBI_TAXONOMY_35525.setDescription('Common name: water flea') -vocabulary_term_NCBI_TAXONOMY_35525.setLabel('Daphnia Magna') -vocabulary_term_NCBI_TAXONOMY_35525.setOrdinal(27) -vocabulary_NCBI_TAXONOMY.addTerm(vocabulary_term_NCBI_TAXONOMY_35525) - -vocabulary_term_NCBI_TAXONOMY_4081 = tr.createNewVocabularyTerm('4081') -vocabulary_term_NCBI_TAXONOMY_4081.setDescription('Common Name: tomato') -vocabulary_term_NCBI_TAXONOMY_4081.setLabel('Solanum lycopersicum (tomato)') -vocabulary_term_NCBI_TAXONOMY_4081.setOrdinal(28) -vocabulary_NCBI_TAXONOMY.addTerm(vocabulary_term_NCBI_TAXONOMY_4081) - -vocabulary_term_NCBI_TAXONOMY_13068 = tr.createNewVocabularyTerm('13068') -vocabulary_term_NCBI_TAXONOMY_13068.setDescription('Common name: earwig') -vocabulary_term_NCBI_TAXONOMY_13068.setLabel('Forficula auricularia (earwig)') -vocabulary_term_NCBI_TAXONOMY_13068.setOrdinal(29) -vocabulary_NCBI_TAXONOMY.addTerm(vocabulary_term_NCBI_TAXONOMY_13068) - -vocabulary_term_NCBI_TAXONOMY_3569 = tr.createNewVocabularyTerm('3569') -vocabulary_term_NCBI_TAXONOMY_3569.setDescription('Genbank common name: clove pink') -vocabulary_term_NCBI_TAXONOMY_3569.setLabel('Dianthus') -vocabulary_term_NCBI_TAXONOMY_3569.setOrdinal(30) -vocabulary_NCBI_TAXONOMY.addTerm(vocabulary_term_NCBI_TAXONOMY_3569) - -vocabulary_term_NCBI_TAXONOMY_3573 = tr.createNewVocabularyTerm('3573') -vocabulary_term_NCBI_TAXONOMY_3573.setDescription('Genbank common name: campions\ Inherited blast name: eudicots') -vocabulary_term_NCBI_TAXONOMY_3573.setLabel('Silene') -vocabulary_term_NCBI_TAXONOMY_3573.setOrdinal(31) -vocabulary_NCBI_TAXONOMY.addTerm(vocabulary_term_NCBI_TAXONOMY_3573) - -vocabulary_term_NCBI_TAXONOMY_32644 = tr.createNewVocabularyTerm('32644') -vocabulary_term_NCBI_TAXONOMY_32644.setDescription('Inherited blast name: unclassified') -vocabulary_term_NCBI_TAXONOMY_32644.setLabel('unidentified') -vocabulary_term_NCBI_TAXONOMY_32644.setOrdinal(32) -vocabulary_NCBI_TAXONOMY.addTerm(vocabulary_term_NCBI_TAXONOMY_32644) - -vocabulary_PIPELINE_VERSION = tr.getOrCreateNewVocabulary('PIPELINE_VERSION') -vocabulary_PIPELINE_VERSION.setDescription('With which pipeline version has the data been analyzed?') -vocabulary_PIPELINE_VERSION.setUrlTemplate(None) -vocabulary_PIPELINE_VERSION.setManagedInternally(False) -vocabulary_PIPELINE_VERSION.setInternalNamespace(False) -vocabulary_PIPELINE_VERSION.setChosenFromList(True) - -vocabulary_term_PIPELINE_VERSION_11348 = tr.createNewVocabularyTerm('1.13.48') -vocabulary_term_PIPELINE_VERSION_11348.setDescription(None) -vocabulary_term_PIPELINE_VERSION_11348.setLabel('RTA 1.13.48') -vocabulary_term_PIPELINE_VERSION_11348.setOrdinal(1) -vocabulary_PIPELINE_VERSION.addTerm(vocabulary_term_PIPELINE_VERSION_11348) - -vocabulary_term_PIPELINE_VERSION_11242 = tr.createNewVocabularyTerm('1.12.4.2') -vocabulary_term_PIPELINE_VERSION_11242.setDescription('Real Time Analysis in combination with HCS 1.4.8') -vocabulary_term_PIPELINE_VERSION_11242.setLabel('RTA 1.12.4.2 (HiSeq 2000)') -vocabulary_term_PIPELINE_VERSION_11242.setOrdinal(2) -vocabulary_PIPELINE_VERSION.addTerm(vocabulary_term_PIPELINE_VERSION_11242) - -vocabulary_term_PIPELINE_VERSION_112 = tr.createNewVocabularyTerm('1.12') -vocabulary_term_PIPELINE_VERSION_112.setDescription('Real Time Analysis 1.12 HiSeq 2000') -vocabulary_term_PIPELINE_VERSION_112.setLabel('RTA 1.12') -vocabulary_term_PIPELINE_VERSION_112.setOrdinal(4) -vocabulary_PIPELINE_VERSION.addTerm(vocabulary_term_PIPELINE_VERSION_112) - -vocabulary_term_PIPELINE_VERSION_19 = tr.createNewVocabularyTerm('1.9') -vocabulary_term_PIPELINE_VERSION_19.setDescription('Real Time Analysis 1.9') -vocabulary_term_PIPELINE_VERSION_19.setLabel('RTA 1.9 (GA IIx)') -vocabulary_term_PIPELINE_VERSION_19.setOrdinal(5) -vocabulary_PIPELINE_VERSION.addTerm(vocabulary_term_PIPELINE_VERSION_19) - -vocabulary_term_PIPELINE_VERSION_RTA_18 = tr.createNewVocabularyTerm('RTA_1.8') -vocabulary_term_PIPELINE_VERSION_RTA_18.setDescription('Real Time Analysis 1.8') -vocabulary_term_PIPELINE_VERSION_RTA_18.setLabel('RTA 1.8') -vocabulary_term_PIPELINE_VERSION_RTA_18.setOrdinal(6) -vocabulary_PIPELINE_VERSION.addTerm(vocabulary_term_PIPELINE_VERSION_RTA_18) - -vocabulary_term_PIPELINE_VERSION_RTA_16 = tr.createNewVocabularyTerm('RTA_1.6') -vocabulary_term_PIPELINE_VERSION_RTA_16.setDescription('Real Time Analysis 1.6') -vocabulary_term_PIPELINE_VERSION_RTA_16.setLabel('RTA 1.6') -vocabulary_term_PIPELINE_VERSION_RTA_16.setOrdinal(7) -vocabulary_PIPELINE_VERSION.addTerm(vocabulary_term_PIPELINE_VERSION_RTA_16) - -vocabulary_term_PIPELINE_VERSION_RTA_15 = tr.createNewVocabularyTerm('RTA_1.5') -vocabulary_term_PIPELINE_VERSION_RTA_15.setDescription(None) -vocabulary_term_PIPELINE_VERSION_RTA_15.setLabel('RTA 1.5') -vocabulary_term_PIPELINE_VERSION_RTA_15.setOrdinal(8) -vocabulary_PIPELINE_VERSION.addTerm(vocabulary_term_PIPELINE_VERSION_RTA_15) - -vocabulary_term_PIPELINE_VERSION_RTA_14150 = tr.createNewVocabularyTerm('RTA_1.4.15.0') -vocabulary_term_PIPELINE_VERSION_RTA_14150.setDescription(None) -vocabulary_term_PIPELINE_VERSION_RTA_14150.setLabel('RTA 1.4.15.0') -vocabulary_term_PIPELINE_VERSION_RTA_14150.setOrdinal(9) -vocabulary_PIPELINE_VERSION.addTerm(vocabulary_term_PIPELINE_VERSION_RTA_14150) - -vocabulary_term_PIPELINE_VERSION_15 = tr.createNewVocabularyTerm('1.5') -vocabulary_term_PIPELINE_VERSION_15.setDescription(None) -vocabulary_term_PIPELINE_VERSION_15.setLabel(None) -vocabulary_term_PIPELINE_VERSION_15.setOrdinal(10) -vocabulary_PIPELINE_VERSION.addTerm(vocabulary_term_PIPELINE_VERSION_15) - -vocabulary_term_PIPELINE_VERSION_14 = tr.createNewVocabularyTerm('1.4') -vocabulary_term_PIPELINE_VERSION_14.setDescription(None) -vocabulary_term_PIPELINE_VERSION_14.setLabel(None) -vocabulary_term_PIPELINE_VERSION_14.setOrdinal(11) -vocabulary_PIPELINE_VERSION.addTerm(vocabulary_term_PIPELINE_VERSION_14) - -vocabulary_term_PIPELINE_VERSION_132 = tr.createNewVocabularyTerm('1.3.2') -vocabulary_term_PIPELINE_VERSION_132.setDescription(None) -vocabulary_term_PIPELINE_VERSION_132.setLabel(None) -vocabulary_term_PIPELINE_VERSION_132.setOrdinal(12) -vocabulary_PIPELINE_VERSION.addTerm(vocabulary_term_PIPELINE_VERSION_132) - -vocabulary_term_PIPELINE_VERSION_10 = tr.createNewVocabularyTerm('1.0') -vocabulary_term_PIPELINE_VERSION_10.setDescription(None) -vocabulary_term_PIPELINE_VERSION_10.setLabel(None) -vocabulary_term_PIPELINE_VERSION_10.setOrdinal(13) -vocabulary_PIPELINE_VERSION.addTerm(vocabulary_term_PIPELINE_VERSION_10) - -vocabulary_term_PIPELINE_VERSION_PRE_10 = tr.createNewVocabularyTerm('PRE_1.0') -vocabulary_term_PIPELINE_VERSION_PRE_10.setDescription('Before Pipeline Version 1.0') -vocabulary_term_PIPELINE_VERSION_PRE_10.setLabel(None) -vocabulary_term_PIPELINE_VERSION_PRE_10.setOrdinal(14) -vocabulary_PIPELINE_VERSION.addTerm(vocabulary_term_PIPELINE_VERSION_PRE_10) - -vocabulary_term_PIPELINE_VERSION_NONE = tr.createNewVocabularyTerm('NONE') -vocabulary_term_PIPELINE_VERSION_NONE.setDescription(None) -vocabulary_term_PIPELINE_VERSION_NONE.setLabel(None) -vocabulary_term_PIPELINE_VERSION_NONE.setOrdinal(15) -vocabulary_PIPELINE_VERSION.addTerm(vocabulary_term_PIPELINE_VERSION_NONE) - -vocabulary_REQUIRED_LANES = tr.getOrCreateNewVocabulary('REQUIRED_LANES') -vocabulary_REQUIRED_LANES.setDescription('Amount of lanes needed for this probe') -vocabulary_REQUIRED_LANES.setUrlTemplate(None) -vocabulary_REQUIRED_LANES.setManagedInternally(False) -vocabulary_REQUIRED_LANES.setInternalNamespace(False) -vocabulary_REQUIRED_LANES.setChosenFromList(True) - -vocabulary_term_REQUIRED_LANES_1 = tr.createNewVocabularyTerm('1') -vocabulary_term_REQUIRED_LANES_1.setDescription(None) -vocabulary_term_REQUIRED_LANES_1.setLabel(None) -vocabulary_term_REQUIRED_LANES_1.setOrdinal(1) -vocabulary_REQUIRED_LANES.addTerm(vocabulary_term_REQUIRED_LANES_1) - -vocabulary_term_REQUIRED_LANES_2 = tr.createNewVocabularyTerm('2') -vocabulary_term_REQUIRED_LANES_2.setDescription(None) -vocabulary_term_REQUIRED_LANES_2.setLabel(None) -vocabulary_term_REQUIRED_LANES_2.setOrdinal(2) -vocabulary_REQUIRED_LANES.addTerm(vocabulary_term_REQUIRED_LANES_2) - -vocabulary_term_REQUIRED_LANES_3 = tr.createNewVocabularyTerm('3') -vocabulary_term_REQUIRED_LANES_3.setDescription(None) -vocabulary_term_REQUIRED_LANES_3.setLabel(None) -vocabulary_term_REQUIRED_LANES_3.setOrdinal(3) -vocabulary_REQUIRED_LANES.addTerm(vocabulary_term_REQUIRED_LANES_3) - -vocabulary_term_REQUIRED_LANES_4 = tr.createNewVocabularyTerm('4') -vocabulary_term_REQUIRED_LANES_4.setDescription(None) -vocabulary_term_REQUIRED_LANES_4.setLabel(None) -vocabulary_term_REQUIRED_LANES_4.setOrdinal(4) -vocabulary_REQUIRED_LANES.addTerm(vocabulary_term_REQUIRED_LANES_4) - -vocabulary_term_REQUIRED_LANES_5 = tr.createNewVocabularyTerm('5') -vocabulary_term_REQUIRED_LANES_5.setDescription(None) -vocabulary_term_REQUIRED_LANES_5.setLabel(None) -vocabulary_term_REQUIRED_LANES_5.setOrdinal(5) -vocabulary_REQUIRED_LANES.addTerm(vocabulary_term_REQUIRED_LANES_5) - -vocabulary_term_REQUIRED_LANES_6 = tr.createNewVocabularyTerm('6') -vocabulary_term_REQUIRED_LANES_6.setDescription(None) -vocabulary_term_REQUIRED_LANES_6.setLabel(None) -vocabulary_term_REQUIRED_LANES_6.setOrdinal(6) -vocabulary_REQUIRED_LANES.addTerm(vocabulary_term_REQUIRED_LANES_6) - -vocabulary_term_REQUIRED_LANES_7 = tr.createNewVocabularyTerm('7') -vocabulary_term_REQUIRED_LANES_7.setDescription(None) -vocabulary_term_REQUIRED_LANES_7.setLabel(None) -vocabulary_term_REQUIRED_LANES_7.setOrdinal(7) -vocabulary_REQUIRED_LANES.addTerm(vocabulary_term_REQUIRED_LANES_7) - -vocabulary_term_REQUIRED_LANES_8 = tr.createNewVocabularyTerm('8') -vocabulary_term_REQUIRED_LANES_8.setDescription(None) -vocabulary_term_REQUIRED_LANES_8.setLabel(None) -vocabulary_term_REQUIRED_LANES_8.setOrdinal(8) -vocabulary_REQUIRED_LANES.addTerm(vocabulary_term_REQUIRED_LANES_8) - -vocabulary_term_REQUIRED_LANES_9 = tr.createNewVocabularyTerm('9') -vocabulary_term_REQUIRED_LANES_9.setDescription(None) -vocabulary_term_REQUIRED_LANES_9.setLabel(None) -vocabulary_term_REQUIRED_LANES_9.setOrdinal(9) -vocabulary_REQUIRED_LANES.addTerm(vocabulary_term_REQUIRED_LANES_9) - -vocabulary_term_REQUIRED_LANES_10 = tr.createNewVocabularyTerm('10') -vocabulary_term_REQUIRED_LANES_10.setDescription(None) -vocabulary_term_REQUIRED_LANES_10.setLabel(None) -vocabulary_term_REQUIRED_LANES_10.setOrdinal(10) -vocabulary_REQUIRED_LANES.addTerm(vocabulary_term_REQUIRED_LANES_10) - -vocabulary_term_REQUIRED_LANES_11 = tr.createNewVocabularyTerm('11') -vocabulary_term_REQUIRED_LANES_11.setDescription(None) -vocabulary_term_REQUIRED_LANES_11.setLabel(None) -vocabulary_term_REQUIRED_LANES_11.setOrdinal(11) -vocabulary_REQUIRED_LANES.addTerm(vocabulary_term_REQUIRED_LANES_11) - -vocabulary_term_REQUIRED_LANES_12 = tr.createNewVocabularyTerm('12') -vocabulary_term_REQUIRED_LANES_12.setDescription(None) -vocabulary_term_REQUIRED_LANES_12.setLabel(None) -vocabulary_term_REQUIRED_LANES_12.setOrdinal(12) -vocabulary_REQUIRED_LANES.addTerm(vocabulary_term_REQUIRED_LANES_12) - -vocabulary_term_REQUIRED_LANES_13 = tr.createNewVocabularyTerm('13') -vocabulary_term_REQUIRED_LANES_13.setDescription(None) -vocabulary_term_REQUIRED_LANES_13.setLabel(None) -vocabulary_term_REQUIRED_LANES_13.setOrdinal(13) -vocabulary_REQUIRED_LANES.addTerm(vocabulary_term_REQUIRED_LANES_13) - -vocabulary_term_REQUIRED_LANES_14 = tr.createNewVocabularyTerm('14') -vocabulary_term_REQUIRED_LANES_14.setDescription(None) -vocabulary_term_REQUIRED_LANES_14.setLabel(None) -vocabulary_term_REQUIRED_LANES_14.setOrdinal(14) -vocabulary_REQUIRED_LANES.addTerm(vocabulary_term_REQUIRED_LANES_14) - -vocabulary_term_REQUIRED_LANES_15 = tr.createNewVocabularyTerm('15') -vocabulary_term_REQUIRED_LANES_15.setDescription(None) -vocabulary_term_REQUIRED_LANES_15.setLabel(None) -vocabulary_term_REQUIRED_LANES_15.setOrdinal(15) -vocabulary_REQUIRED_LANES.addTerm(vocabulary_term_REQUIRED_LANES_15) - -vocabulary_term_REQUIRED_LANES_16 = tr.createNewVocabularyTerm('16') -vocabulary_term_REQUIRED_LANES_16.setDescription(None) -vocabulary_term_REQUIRED_LANES_16.setLabel(None) -vocabulary_term_REQUIRED_LANES_16.setOrdinal(16) -vocabulary_REQUIRED_LANES.addTerm(vocabulary_term_REQUIRED_LANES_16) - -vocabulary_SAMPLE_LIBRARY_SELECTION = tr.getOrCreateNewVocabulary('SAMPLE_LIBRARY_SELECTION') -vocabulary_SAMPLE_LIBRARY_SELECTION.setDescription('Describes whether any method was used to select and/or enrich the material being sequenced.') -vocabulary_SAMPLE_LIBRARY_SELECTION.setUrlTemplate(None) -vocabulary_SAMPLE_LIBRARY_SELECTION.setManagedInternally(False) -vocabulary_SAMPLE_LIBRARY_SELECTION.setInternalNamespace(False) -vocabulary_SAMPLE_LIBRARY_SELECTION.setChosenFromList(True) - -vocabulary_term_SAMPLE_LIBRARY_SELECTION_CHIP = tr.createNewVocabularyTerm('CHIP') -vocabulary_term_SAMPLE_LIBRARY_SELECTION_CHIP.setDescription('Chromatin immunoprecipitation') -vocabulary_term_SAMPLE_LIBRARY_SELECTION_CHIP.setLabel('ChIP') -vocabulary_term_SAMPLE_LIBRARY_SELECTION_CHIP.setOrdinal(1) -vocabulary_SAMPLE_LIBRARY_SELECTION.addTerm(vocabulary_term_SAMPLE_LIBRARY_SELECTION_CHIP) - -vocabulary_term_SAMPLE_LIBRARY_SELECTION_MNASE = tr.createNewVocabularyTerm('MNASE') -vocabulary_term_SAMPLE_LIBRARY_SELECTION_MNASE.setDescription('Micrococcal Nuclease (MNase) digestion') -vocabulary_term_SAMPLE_LIBRARY_SELECTION_MNASE.setLabel('MNase') -vocabulary_term_SAMPLE_LIBRARY_SELECTION_MNASE.setOrdinal(2) -vocabulary_SAMPLE_LIBRARY_SELECTION.addTerm(vocabulary_term_SAMPLE_LIBRARY_SELECTION_MNASE) - -vocabulary_term_SAMPLE_LIBRARY_SELECTION_RESTRICTION_DIGEST = tr.createNewVocabularyTerm('RESTRICTION_DIGEST') -vocabulary_term_SAMPLE_LIBRARY_SELECTION_RESTRICTION_DIGEST.setDescription('Restriction enzyme digestion') -vocabulary_term_SAMPLE_LIBRARY_SELECTION_RESTRICTION_DIGEST.setLabel('Restriction Digest') -vocabulary_term_SAMPLE_LIBRARY_SELECTION_RESTRICTION_DIGEST.setOrdinal(3) -vocabulary_SAMPLE_LIBRARY_SELECTION.addTerm(vocabulary_term_SAMPLE_LIBRARY_SELECTION_RESTRICTION_DIGEST) - -vocabulary_term_SAMPLE_LIBRARY_SELECTION_5METHYLCYTIDINE_ANTIBODY = tr.createNewVocabularyTerm('5-METHYLCYTIDINE_ANTIBODY') -vocabulary_term_SAMPLE_LIBRARY_SELECTION_5METHYLCYTIDINE_ANTIBODY.setDescription('Methylated DNA immunoprecipitation') -vocabulary_term_SAMPLE_LIBRARY_SELECTION_5METHYLCYTIDINE_ANTIBODY.setLabel('5-methylcytidine antibody') -vocabulary_term_SAMPLE_LIBRARY_SELECTION_5METHYLCYTIDINE_ANTIBODY.setOrdinal(4) -vocabulary_SAMPLE_LIBRARY_SELECTION.addTerm(vocabulary_term_SAMPLE_LIBRARY_SELECTION_5METHYLCYTIDINE_ANTIBODY) - -vocabulary_term_SAMPLE_LIBRARY_SELECTION_RANDOM = tr.createNewVocabularyTerm('RANDOM') -vocabulary_term_SAMPLE_LIBRARY_SELECTION_RANDOM.setDescription('Random shearing only') -vocabulary_term_SAMPLE_LIBRARY_SELECTION_RANDOM.setLabel('RANDOM') -vocabulary_term_SAMPLE_LIBRARY_SELECTION_RANDOM.setOrdinal(5) -vocabulary_SAMPLE_LIBRARY_SELECTION.addTerm(vocabulary_term_SAMPLE_LIBRARY_SELECTION_RANDOM) - -vocabulary_term_SAMPLE_LIBRARY_SELECTION_MF = tr.createNewVocabularyTerm('MF') -vocabulary_term_SAMPLE_LIBRARY_SELECTION_MF.setDescription('Methyl Filtrated') -vocabulary_term_SAMPLE_LIBRARY_SELECTION_MF.setLabel('MF') -vocabulary_term_SAMPLE_LIBRARY_SELECTION_MF.setOrdinal(6) -vocabulary_SAMPLE_LIBRARY_SELECTION.addTerm(vocabulary_term_SAMPLE_LIBRARY_SELECTION_MF) - -vocabulary_term_SAMPLE_LIBRARY_SELECTION_MSLL = tr.createNewVocabularyTerm('MSLL') -vocabulary_term_SAMPLE_LIBRARY_SELECTION_MSLL.setDescription('Methylation Spanning Linking Library') -vocabulary_term_SAMPLE_LIBRARY_SELECTION_MSLL.setLabel('MSLL') -vocabulary_term_SAMPLE_LIBRARY_SELECTION_MSLL.setOrdinal(7) -vocabulary_SAMPLE_LIBRARY_SELECTION.addTerm(vocabulary_term_SAMPLE_LIBRARY_SELECTION_MSLL) - -vocabulary_term_SAMPLE_LIBRARY_SELECTION_HMPR = tr.createNewVocabularyTerm('HMPR') -vocabulary_term_SAMPLE_LIBRARY_SELECTION_HMPR.setDescription('Hypo-methylated partial restriction digest') -vocabulary_term_SAMPLE_LIBRARY_SELECTION_HMPR.setLabel('HMPR') -vocabulary_term_SAMPLE_LIBRARY_SELECTION_HMPR.setOrdinal(8) -vocabulary_SAMPLE_LIBRARY_SELECTION.addTerm(vocabulary_term_SAMPLE_LIBRARY_SELECTION_HMPR) - -vocabulary_term_SAMPLE_LIBRARY_SELECTION_CDNA = tr.createNewVocabularyTerm('CDNA') -vocabulary_term_SAMPLE_LIBRARY_SELECTION_CDNA.setDescription('complementary DNA') -vocabulary_term_SAMPLE_LIBRARY_SELECTION_CDNA.setLabel('cDNA') -vocabulary_term_SAMPLE_LIBRARY_SELECTION_CDNA.setOrdinal(9) -vocabulary_SAMPLE_LIBRARY_SELECTION.addTerm(vocabulary_term_SAMPLE_LIBRARY_SELECTION_CDNA) - -vocabulary_term_SAMPLE_LIBRARY_SELECTION_PCR = tr.createNewVocabularyTerm('PCR') -vocabulary_term_SAMPLE_LIBRARY_SELECTION_PCR.setDescription('Source material was selected by designed primers') -vocabulary_term_SAMPLE_LIBRARY_SELECTION_PCR.setLabel('PCR') -vocabulary_term_SAMPLE_LIBRARY_SELECTION_PCR.setOrdinal(10) -vocabulary_SAMPLE_LIBRARY_SELECTION.addTerm(vocabulary_term_SAMPLE_LIBRARY_SELECTION_PCR) - -vocabulary_term_SAMPLE_LIBRARY_SELECTION_RANDOM_PCR = tr.createNewVocabularyTerm('RANDOM_PCR') -vocabulary_term_SAMPLE_LIBRARY_SELECTION_RANDOM_PCR.setDescription('Source material was selected by randomly generated primers') -vocabulary_term_SAMPLE_LIBRARY_SELECTION_RANDOM_PCR.setLabel('RANDOM PCR') -vocabulary_term_SAMPLE_LIBRARY_SELECTION_RANDOM_PCR.setOrdinal(11) -vocabulary_SAMPLE_LIBRARY_SELECTION.addTerm(vocabulary_term_SAMPLE_LIBRARY_SELECTION_RANDOM_PCR) - -vocabulary_term_SAMPLE_LIBRARY_SELECTION_RTPCR = tr.createNewVocabularyTerm('RT-PCR') -vocabulary_term_SAMPLE_LIBRARY_SELECTION_RTPCR.setDescription('Source material was selected by reverse transcription PCR') -vocabulary_term_SAMPLE_LIBRARY_SELECTION_RTPCR.setLabel('RT-PCR') -vocabulary_term_SAMPLE_LIBRARY_SELECTION_RTPCR.setOrdinal(12) -vocabulary_SAMPLE_LIBRARY_SELECTION.addTerm(vocabulary_term_SAMPLE_LIBRARY_SELECTION_RTPCR) - -vocabulary_term_SAMPLE_LIBRARY_SELECTION_CFS = tr.createNewVocabularyTerm('CF-S') -vocabulary_term_SAMPLE_LIBRARY_SELECTION_CFS.setDescription('Cot-filtered single/low-copy genomic DNA') -vocabulary_term_SAMPLE_LIBRARY_SELECTION_CFS.setLabel('CF-S') -vocabulary_term_SAMPLE_LIBRARY_SELECTION_CFS.setOrdinal(13) -vocabulary_SAMPLE_LIBRARY_SELECTION.addTerm(vocabulary_term_SAMPLE_LIBRARY_SELECTION_CFS) - -vocabulary_term_SAMPLE_LIBRARY_SELECTION_CFM = tr.createNewVocabularyTerm('CF-M') -vocabulary_term_SAMPLE_LIBRARY_SELECTION_CFM.setDescription('Cot-filtered moderately repetitive genomic DNA') -vocabulary_term_SAMPLE_LIBRARY_SELECTION_CFM.setLabel('CF-M') -vocabulary_term_SAMPLE_LIBRARY_SELECTION_CFM.setOrdinal(14) -vocabulary_SAMPLE_LIBRARY_SELECTION.addTerm(vocabulary_term_SAMPLE_LIBRARY_SELECTION_CFM) - -vocabulary_term_SAMPLE_LIBRARY_SELECTION_CFH = tr.createNewVocabularyTerm('CF-H') -vocabulary_term_SAMPLE_LIBRARY_SELECTION_CFH.setDescription('Cot-filtered highly repetitive genomic DNA') -vocabulary_term_SAMPLE_LIBRARY_SELECTION_CFH.setLabel('CF-H') -vocabulary_term_SAMPLE_LIBRARY_SELECTION_CFH.setOrdinal(15) -vocabulary_SAMPLE_LIBRARY_SELECTION.addTerm(vocabulary_term_SAMPLE_LIBRARY_SELECTION_CFH) - -vocabulary_term_SAMPLE_LIBRARY_SELECTION_CFT = tr.createNewVocabularyTerm('CF-T') -vocabulary_term_SAMPLE_LIBRARY_SELECTION_CFT.setDescription('Cot-filtered theoretical single-copy genomic DNA') -vocabulary_term_SAMPLE_LIBRARY_SELECTION_CFT.setLabel('CF-T') -vocabulary_term_SAMPLE_LIBRARY_SELECTION_CFT.setOrdinal(16) -vocabulary_SAMPLE_LIBRARY_SELECTION.addTerm(vocabulary_term_SAMPLE_LIBRARY_SELECTION_CFT) - -vocabulary_term_SAMPLE_LIBRARY_SELECTION_OTHER = tr.createNewVocabularyTerm('OTHER') -vocabulary_term_SAMPLE_LIBRARY_SELECTION_OTHER.setDescription(None) -vocabulary_term_SAMPLE_LIBRARY_SELECTION_OTHER.setLabel('other') -vocabulary_term_SAMPLE_LIBRARY_SELECTION_OTHER.setOrdinal(17) -vocabulary_SAMPLE_LIBRARY_SELECTION.addTerm(vocabulary_term_SAMPLE_LIBRARY_SELECTION_OTHER) - -vocabulary_term_SAMPLE_LIBRARY_SELECTION_UNSPECIFIED = tr.createNewVocabularyTerm('UNSPECIFIED') -vocabulary_term_SAMPLE_LIBRARY_SELECTION_UNSPECIFIED.setDescription(None) -vocabulary_term_SAMPLE_LIBRARY_SELECTION_UNSPECIFIED.setLabel('unspecified') -vocabulary_term_SAMPLE_LIBRARY_SELECTION_UNSPECIFIED.setOrdinal(18) -vocabulary_SAMPLE_LIBRARY_SELECTION.addTerm(vocabulary_term_SAMPLE_LIBRARY_SELECTION_UNSPECIFIED) - -vocabulary_SAMPLE_LIBRARY_SOURCE_VOC = tr.getOrCreateNewVocabulary('SAMPLE_LIBRARY_SOURCE_VOC') -vocabulary_SAMPLE_LIBRARY_SOURCE_VOC.setDescription(None) -vocabulary_SAMPLE_LIBRARY_SOURCE_VOC.setUrlTemplate(None) -vocabulary_SAMPLE_LIBRARY_SOURCE_VOC.setManagedInternally(False) -vocabulary_SAMPLE_LIBRARY_SOURCE_VOC.setInternalNamespace(False) -vocabulary_SAMPLE_LIBRARY_SOURCE_VOC.setChosenFromList(True) - -vocabulary_term_SAMPLE_LIBRARY_SOURCE_VOC_GENOMIC = tr.createNewVocabularyTerm('GENOMIC') -vocabulary_term_SAMPLE_LIBRARY_SOURCE_VOC_GENOMIC.setDescription(None) -vocabulary_term_SAMPLE_LIBRARY_SOURCE_VOC_GENOMIC.setLabel(None) -vocabulary_term_SAMPLE_LIBRARY_SOURCE_VOC_GENOMIC.setOrdinal(1) -vocabulary_SAMPLE_LIBRARY_SOURCE_VOC.addTerm(vocabulary_term_SAMPLE_LIBRARY_SOURCE_VOC_GENOMIC) - -vocabulary_term_SAMPLE_LIBRARY_SOURCE_VOC_NONGENOMIC = tr.createNewVocabularyTerm('NON-GENOMIC') -vocabulary_term_SAMPLE_LIBRARY_SOURCE_VOC_NONGENOMIC.setDescription(None) -vocabulary_term_SAMPLE_LIBRARY_SOURCE_VOC_NONGENOMIC.setLabel(None) -vocabulary_term_SAMPLE_LIBRARY_SOURCE_VOC_NONGENOMIC.setOrdinal(2) -vocabulary_SAMPLE_LIBRARY_SOURCE_VOC.addTerm(vocabulary_term_SAMPLE_LIBRARY_SOURCE_VOC_NONGENOMIC) - -vocabulary_term_SAMPLE_LIBRARY_SOURCE_VOC_SYNTHETIC = tr.createNewVocabularyTerm('SYNTHETIC') -vocabulary_term_SAMPLE_LIBRARY_SOURCE_VOC_SYNTHETIC.setDescription(None) -vocabulary_term_SAMPLE_LIBRARY_SOURCE_VOC_SYNTHETIC.setLabel(None) -vocabulary_term_SAMPLE_LIBRARY_SOURCE_VOC_SYNTHETIC.setOrdinal(3) -vocabulary_SAMPLE_LIBRARY_SOURCE_VOC.addTerm(vocabulary_term_SAMPLE_LIBRARY_SOURCE_VOC_SYNTHETIC) - -vocabulary_term_SAMPLE_LIBRARY_SOURCE_VOC_VIRAL = tr.createNewVocabularyTerm('VIRAL') -vocabulary_term_SAMPLE_LIBRARY_SOURCE_VOC_VIRAL.setDescription(None) -vocabulary_term_SAMPLE_LIBRARY_SOURCE_VOC_VIRAL.setLabel(None) -vocabulary_term_SAMPLE_LIBRARY_SOURCE_VOC_VIRAL.setOrdinal(4) -vocabulary_SAMPLE_LIBRARY_SOURCE_VOC.addTerm(vocabulary_term_SAMPLE_LIBRARY_SOURCE_VOC_VIRAL) - -vocabulary_term_SAMPLE_LIBRARY_SOURCE_VOC_RNA = tr.createNewVocabularyTerm('RNA') -vocabulary_term_SAMPLE_LIBRARY_SOURCE_VOC_RNA.setDescription(None) -vocabulary_term_SAMPLE_LIBRARY_SOURCE_VOC_RNA.setLabel(None) -vocabulary_term_SAMPLE_LIBRARY_SOURCE_VOC_RNA.setOrdinal(5) -vocabulary_SAMPLE_LIBRARY_SOURCE_VOC.addTerm(vocabulary_term_SAMPLE_LIBRARY_SOURCE_VOC_RNA) - -vocabulary_term_SAMPLE_LIBRARY_SOURCE_VOC_OTHER = tr.createNewVocabularyTerm('OTHER') -vocabulary_term_SAMPLE_LIBRARY_SOURCE_VOC_OTHER.setDescription(None) -vocabulary_term_SAMPLE_LIBRARY_SOURCE_VOC_OTHER.setLabel(None) -vocabulary_term_SAMPLE_LIBRARY_SOURCE_VOC_OTHER.setOrdinal(6) -vocabulary_SAMPLE_LIBRARY_SOURCE_VOC.addTerm(vocabulary_term_SAMPLE_LIBRARY_SOURCE_VOC_OTHER) - -vocabulary_SAMPLE_LIBRARY_STRATEGY = tr.getOrCreateNewVocabulary('SAMPLE_LIBRARY_STRATEGY') -vocabulary_SAMPLE_LIBRARY_STRATEGY.setDescription('Sequencing technique for this library.') -vocabulary_SAMPLE_LIBRARY_STRATEGY.setUrlTemplate(None) -vocabulary_SAMPLE_LIBRARY_STRATEGY.setManagedInternally(False) -vocabulary_SAMPLE_LIBRARY_STRATEGY.setInternalNamespace(False) -vocabulary_SAMPLE_LIBRARY_STRATEGY.setChosenFromList(True) - -vocabulary_term_SAMPLE_LIBRARY_STRATEGY_CHIPSEQ = tr.createNewVocabularyTerm('CHIP-SEQ') -vocabulary_term_SAMPLE_LIBRARY_STRATEGY_CHIPSEQ.setDescription('Direct sequencing of chromatin immunoprecipitates') -vocabulary_term_SAMPLE_LIBRARY_STRATEGY_CHIPSEQ.setLabel('ChIP-Seq') -vocabulary_term_SAMPLE_LIBRARY_STRATEGY_CHIPSEQ.setOrdinal(1) -vocabulary_SAMPLE_LIBRARY_STRATEGY.addTerm(vocabulary_term_SAMPLE_LIBRARY_STRATEGY_CHIPSEQ) - -vocabulary_term_SAMPLE_LIBRARY_STRATEGY_RNASEQ = tr.createNewVocabularyTerm('RNA-SEQ') -vocabulary_term_SAMPLE_LIBRARY_STRATEGY_RNASEQ.setDescription('RNA sequencing') -vocabulary_term_SAMPLE_LIBRARY_STRATEGY_RNASEQ.setLabel('RNA-Seq') -vocabulary_term_SAMPLE_LIBRARY_STRATEGY_RNASEQ.setOrdinal(2) -vocabulary_SAMPLE_LIBRARY_STRATEGY.addTerm(vocabulary_term_SAMPLE_LIBRARY_STRATEGY_RNASEQ) - -vocabulary_term_SAMPLE_LIBRARY_STRATEGY_MEDIPSEQ = tr.createNewVocabularyTerm('MEDIP-SEQ') -vocabulary_term_SAMPLE_LIBRARY_STRATEGY_MEDIPSEQ.setDescription('Methylated DNA immunoprecipitation sequencing') -vocabulary_term_SAMPLE_LIBRARY_STRATEGY_MEDIPSEQ.setLabel('MeDIP-Seq') -vocabulary_term_SAMPLE_LIBRARY_STRATEGY_MEDIPSEQ.setOrdinal(3) -vocabulary_SAMPLE_LIBRARY_STRATEGY.addTerm(vocabulary_term_SAMPLE_LIBRARY_STRATEGY_MEDIPSEQ) - -vocabulary_term_SAMPLE_LIBRARY_STRATEGY_MNASESEQ = tr.createNewVocabularyTerm('MNASE-SEQ') -vocabulary_term_SAMPLE_LIBRARY_STRATEGY_MNASESEQ.setDescription('Direct sequencing following MNase digestion') -vocabulary_term_SAMPLE_LIBRARY_STRATEGY_MNASESEQ.setLabel('MNase-Seq') -vocabulary_term_SAMPLE_LIBRARY_STRATEGY_MNASESEQ.setOrdinal(4) -vocabulary_SAMPLE_LIBRARY_STRATEGY.addTerm(vocabulary_term_SAMPLE_LIBRARY_STRATEGY_MNASESEQ) - -vocabulary_term_SAMPLE_LIBRARY_STRATEGY_MRESEQ = tr.createNewVocabularyTerm('MRE-SEQ') -vocabulary_term_SAMPLE_LIBRARY_STRATEGY_MRESEQ.setDescription('Methylation-sensitive restriction enzyme sequencing') -vocabulary_term_SAMPLE_LIBRARY_STRATEGY_MRESEQ.setLabel('MRE-Seq') -vocabulary_term_SAMPLE_LIBRARY_STRATEGY_MRESEQ.setOrdinal(5) -vocabulary_SAMPLE_LIBRARY_STRATEGY.addTerm(vocabulary_term_SAMPLE_LIBRARY_STRATEGY_MRESEQ) - -vocabulary_term_SAMPLE_LIBRARY_STRATEGY_EST = tr.createNewVocabularyTerm('EST') -vocabulary_term_SAMPLE_LIBRARY_STRATEGY_EST.setDescription('Single pass sequencing of cDNA templates') -vocabulary_term_SAMPLE_LIBRARY_STRATEGY_EST.setLabel('EST') -vocabulary_term_SAMPLE_LIBRARY_STRATEGY_EST.setOrdinal(6) -vocabulary_SAMPLE_LIBRARY_STRATEGY.addTerm(vocabulary_term_SAMPLE_LIBRARY_STRATEGY_EST) - -vocabulary_term_SAMPLE_LIBRARY_STRATEGY_FLCDNA = tr.createNewVocabularyTerm('FL-CDNA') -vocabulary_term_SAMPLE_LIBRARY_STRATEGY_FLCDNA.setDescription('Full-length sequencing of cDNA templates') -vocabulary_term_SAMPLE_LIBRARY_STRATEGY_FLCDNA.setLabel('FL-cDNA') -vocabulary_term_SAMPLE_LIBRARY_STRATEGY_FLCDNA.setOrdinal(7) -vocabulary_SAMPLE_LIBRARY_STRATEGY.addTerm(vocabulary_term_SAMPLE_LIBRARY_STRATEGY_FLCDNA) - -vocabulary_term_SAMPLE_LIBRARY_STRATEGY_CTS = tr.createNewVocabularyTerm('CTS') -vocabulary_term_SAMPLE_LIBRARY_STRATEGY_CTS.setDescription('Concatenated Tag Sequencing') -vocabulary_term_SAMPLE_LIBRARY_STRATEGY_CTS.setLabel('CTS') -vocabulary_term_SAMPLE_LIBRARY_STRATEGY_CTS.setOrdinal(8) -vocabulary_SAMPLE_LIBRARY_STRATEGY.addTerm(vocabulary_term_SAMPLE_LIBRARY_STRATEGY_CTS) - -vocabulary_term_SAMPLE_LIBRARY_STRATEGY_BARCODE = tr.createNewVocabularyTerm('BARCODE') -vocabulary_term_SAMPLE_LIBRARY_STRATEGY_BARCODE.setDescription('Sequencing of products that have been tagged with a short identifying sequence (barcode)') -vocabulary_term_SAMPLE_LIBRARY_STRATEGY_BARCODE.setLabel('BARCODE') -vocabulary_term_SAMPLE_LIBRARY_STRATEGY_BARCODE.setOrdinal(9) -vocabulary_SAMPLE_LIBRARY_STRATEGY.addTerm(vocabulary_term_SAMPLE_LIBRARY_STRATEGY_BARCODE) - -vocabulary_term_SAMPLE_LIBRARY_STRATEGY_CLONEEND = tr.createNewVocabularyTerm('CLONEEND') -vocabulary_term_SAMPLE_LIBRARY_STRATEGY_CLONEEND.setDescription('"Clone end (5\', 3\', or both) sequencing"') -vocabulary_term_SAMPLE_LIBRARY_STRATEGY_CLONEEND.setLabel('CLONEEND') -vocabulary_term_SAMPLE_LIBRARY_STRATEGY_CLONEEND.setOrdinal(10) -vocabulary_SAMPLE_LIBRARY_STRATEGY.addTerm(vocabulary_term_SAMPLE_LIBRARY_STRATEGY_CLONEEND) - -vocabulary_term_SAMPLE_LIBRARY_STRATEGY_WGS = tr.createNewVocabularyTerm('WGS') -vocabulary_term_SAMPLE_LIBRARY_STRATEGY_WGS.setDescription('Whole genome shotgun') -vocabulary_term_SAMPLE_LIBRARY_STRATEGY_WGS.setLabel('WGS') -vocabulary_term_SAMPLE_LIBRARY_STRATEGY_WGS.setOrdinal(11) -vocabulary_SAMPLE_LIBRARY_STRATEGY.addTerm(vocabulary_term_SAMPLE_LIBRARY_STRATEGY_WGS) - -vocabulary_term_SAMPLE_LIBRARY_STRATEGY_WCS = tr.createNewVocabularyTerm('WCS') -vocabulary_term_SAMPLE_LIBRARY_STRATEGY_WCS.setDescription('Whole chromosome (or other replicon) shotgun') -vocabulary_term_SAMPLE_LIBRARY_STRATEGY_WCS.setLabel('WCS') -vocabulary_term_SAMPLE_LIBRARY_STRATEGY_WCS.setOrdinal(12) -vocabulary_SAMPLE_LIBRARY_STRATEGY.addTerm(vocabulary_term_SAMPLE_LIBRARY_STRATEGY_WCS) - -vocabulary_term_SAMPLE_LIBRARY_STRATEGY_CLONE = tr.createNewVocabularyTerm('CLONE') -vocabulary_term_SAMPLE_LIBRARY_STRATEGY_CLONE.setDescription('Genomic clone based (hierarchical) sequencing') -vocabulary_term_SAMPLE_LIBRARY_STRATEGY_CLONE.setLabel('CLONE') -vocabulary_term_SAMPLE_LIBRARY_STRATEGY_CLONE.setOrdinal(13) -vocabulary_SAMPLE_LIBRARY_STRATEGY.addTerm(vocabulary_term_SAMPLE_LIBRARY_STRATEGY_CLONE) - -vocabulary_term_SAMPLE_LIBRARY_STRATEGY_POOLCLONE = tr.createNewVocabularyTerm('POOLCLONE') -vocabulary_term_SAMPLE_LIBRARY_STRATEGY_POOLCLONE.setDescription('Shotgun of pooled clones (usually BACs and Fosmids)') -vocabulary_term_SAMPLE_LIBRARY_STRATEGY_POOLCLONE.setLabel('POOLCLONE') -vocabulary_term_SAMPLE_LIBRARY_STRATEGY_POOLCLONE.setOrdinal(14) -vocabulary_SAMPLE_LIBRARY_STRATEGY.addTerm(vocabulary_term_SAMPLE_LIBRARY_STRATEGY_POOLCLONE) - -vocabulary_term_SAMPLE_LIBRARY_STRATEGY_AMPLICON = tr.createNewVocabularyTerm('AMPLICON') -vocabulary_term_SAMPLE_LIBRARY_STRATEGY_AMPLICON.setDescription('Sequencing of overlapping or distinct PCR or RT-PCR products') -vocabulary_term_SAMPLE_LIBRARY_STRATEGY_AMPLICON.setLabel('AMPLICON') -vocabulary_term_SAMPLE_LIBRARY_STRATEGY_AMPLICON.setOrdinal(15) -vocabulary_SAMPLE_LIBRARY_STRATEGY.addTerm(vocabulary_term_SAMPLE_LIBRARY_STRATEGY_AMPLICON) - -vocabulary_term_SAMPLE_LIBRARY_STRATEGY_FINISHING = tr.createNewVocabularyTerm('FINISHING') -vocabulary_term_SAMPLE_LIBRARY_STRATEGY_FINISHING.setDescription('Sequencing intended to finish (close) gaps in existing coverage') -vocabulary_term_SAMPLE_LIBRARY_STRATEGY_FINISHING.setLabel('FINISHING') -vocabulary_term_SAMPLE_LIBRARY_STRATEGY_FINISHING.setOrdinal(16) -vocabulary_SAMPLE_LIBRARY_STRATEGY.addTerm(vocabulary_term_SAMPLE_LIBRARY_STRATEGY_FINISHING) - -vocabulary_term_SAMPLE_LIBRARY_STRATEGY_OTHER = tr.createNewVocabularyTerm('OTHER') -vocabulary_term_SAMPLE_LIBRARY_STRATEGY_OTHER.setDescription('Library strategy not listed') -vocabulary_term_SAMPLE_LIBRARY_STRATEGY_OTHER.setLabel('OTHER') -vocabulary_term_SAMPLE_LIBRARY_STRATEGY_OTHER.setOrdinal(17) -vocabulary_SAMPLE_LIBRARY_STRATEGY.addTerm(vocabulary_term_SAMPLE_LIBRARY_STRATEGY_OTHER) - -vocabulary_SAMPLE_MOLECULE = tr.getOrCreateNewVocabulary('SAMPLE_MOLECULE') -vocabulary_SAMPLE_MOLECULE.setDescription(None) -vocabulary_SAMPLE_MOLECULE.setUrlTemplate(None) -vocabulary_SAMPLE_MOLECULE.setManagedInternally(False) -vocabulary_SAMPLE_MOLECULE.setInternalNamespace(False) -vocabulary_SAMPLE_MOLECULE.setChosenFromList(True) - -vocabulary_term_SAMPLE_MOLECULE_TOTAL_RNA = tr.createNewVocabularyTerm('TOTAL_RNA') -vocabulary_term_SAMPLE_MOLECULE_TOTAL_RNA.setDescription(None) -vocabulary_term_SAMPLE_MOLECULE_TOTAL_RNA.setLabel(None) -vocabulary_term_SAMPLE_MOLECULE_TOTAL_RNA.setOrdinal(1) -vocabulary_SAMPLE_MOLECULE.addTerm(vocabulary_term_SAMPLE_MOLECULE_TOTAL_RNA) - -vocabulary_term_SAMPLE_MOLECULE_POLYA_RNA = tr.createNewVocabularyTerm('POLYA_RNA') -vocabulary_term_SAMPLE_MOLECULE_POLYA_RNA.setDescription(None) -vocabulary_term_SAMPLE_MOLECULE_POLYA_RNA.setLabel(None) -vocabulary_term_SAMPLE_MOLECULE_POLYA_RNA.setOrdinal(2) -vocabulary_SAMPLE_MOLECULE.addTerm(vocabulary_term_SAMPLE_MOLECULE_POLYA_RNA) - -vocabulary_term_SAMPLE_MOLECULE_CYTOPLASMIC_RNA = tr.createNewVocabularyTerm('CYTOPLASMIC_RNA') -vocabulary_term_SAMPLE_MOLECULE_CYTOPLASMIC_RNA.setDescription(None) -vocabulary_term_SAMPLE_MOLECULE_CYTOPLASMIC_RNA.setLabel(None) -vocabulary_term_SAMPLE_MOLECULE_CYTOPLASMIC_RNA.setOrdinal(3) -vocabulary_SAMPLE_MOLECULE.addTerm(vocabulary_term_SAMPLE_MOLECULE_CYTOPLASMIC_RNA) - -vocabulary_term_SAMPLE_MOLECULE_NUCLEAR_RNA = tr.createNewVocabularyTerm('NUCLEAR_RNA') -vocabulary_term_SAMPLE_MOLECULE_NUCLEAR_RNA.setDescription(None) -vocabulary_term_SAMPLE_MOLECULE_NUCLEAR_RNA.setLabel(None) -vocabulary_term_SAMPLE_MOLECULE_NUCLEAR_RNA.setOrdinal(4) -vocabulary_SAMPLE_MOLECULE.addTerm(vocabulary_term_SAMPLE_MOLECULE_NUCLEAR_RNA) - -vocabulary_term_SAMPLE_MOLECULE_GENOMIC_DNA = tr.createNewVocabularyTerm('GENOMIC_DNA') -vocabulary_term_SAMPLE_MOLECULE_GENOMIC_DNA.setDescription(None) -vocabulary_term_SAMPLE_MOLECULE_GENOMIC_DNA.setLabel(None) -vocabulary_term_SAMPLE_MOLECULE_GENOMIC_DNA.setOrdinal(5) -vocabulary_SAMPLE_MOLECULE.addTerm(vocabulary_term_SAMPLE_MOLECULE_GENOMIC_DNA) - -vocabulary_term_SAMPLE_MOLECULE_PROTEIN = tr.createNewVocabularyTerm('PROTEIN') -vocabulary_term_SAMPLE_MOLECULE_PROTEIN.setDescription(None) -vocabulary_term_SAMPLE_MOLECULE_PROTEIN.setLabel(None) -vocabulary_term_SAMPLE_MOLECULE_PROTEIN.setOrdinal(6) -vocabulary_SAMPLE_MOLECULE.addTerm(vocabulary_term_SAMPLE_MOLECULE_PROTEIN) - -vocabulary_term_SAMPLE_MOLECULE_OTHER = tr.createNewVocabularyTerm('OTHER') -vocabulary_term_SAMPLE_MOLECULE_OTHER.setDescription(None) -vocabulary_term_SAMPLE_MOLECULE_OTHER.setLabel(None) -vocabulary_term_SAMPLE_MOLECULE_OTHER.setOrdinal(7) -vocabulary_SAMPLE_MOLECULE.addTerm(vocabulary_term_SAMPLE_MOLECULE_OTHER) - -vocabulary_SAMPLE_TYPE = tr.getOrCreateNewVocabulary('SAMPLE_TYPE') -vocabulary_SAMPLE_TYPE.setDescription('Type of sample delivered by the customer') -vocabulary_SAMPLE_TYPE.setUrlTemplate(None) -vocabulary_SAMPLE_TYPE.setManagedInternally(False) -vocabulary_SAMPLE_TYPE.setInternalNamespace(False) -vocabulary_SAMPLE_TYPE.setChosenFromList(True) - -vocabulary_term_SAMPLE_TYPE_GENOMIC_DNA = tr.createNewVocabularyTerm('GENOMIC_DNA') -vocabulary_term_SAMPLE_TYPE_GENOMIC_DNA.setDescription(None) -vocabulary_term_SAMPLE_TYPE_GENOMIC_DNA.setLabel(None) -vocabulary_term_SAMPLE_TYPE_GENOMIC_DNA.setOrdinal(1) -vocabulary_SAMPLE_TYPE.addTerm(vocabulary_term_SAMPLE_TYPE_GENOMIC_DNA) - -vocabulary_term_SAMPLE_TYPE_SMALL_RNA = tr.createNewVocabularyTerm('SMALL_RNA') -vocabulary_term_SAMPLE_TYPE_SMALL_RNA.setDescription(None) -vocabulary_term_SAMPLE_TYPE_SMALL_RNA.setLabel(None) -vocabulary_term_SAMPLE_TYPE_SMALL_RNA.setOrdinal(2) -vocabulary_SAMPLE_TYPE.addTerm(vocabulary_term_SAMPLE_TYPE_SMALL_RNA) - -vocabulary_term_SAMPLE_TYPE_TOTAL_RNA = tr.createNewVocabularyTerm('TOTAL_RNA') -vocabulary_term_SAMPLE_TYPE_TOTAL_RNA.setDescription(None) -vocabulary_term_SAMPLE_TYPE_TOTAL_RNA.setLabel(None) -vocabulary_term_SAMPLE_TYPE_TOTAL_RNA.setOrdinal(3) -vocabulary_SAMPLE_TYPE.addTerm(vocabulary_term_SAMPLE_TYPE_TOTAL_RNA) - -vocabulary_term_SAMPLE_TYPE_CHIP = tr.createNewVocabularyTerm('CHIP') -vocabulary_term_SAMPLE_TYPE_CHIP.setDescription(None) -vocabulary_term_SAMPLE_TYPE_CHIP.setLabel(None) -vocabulary_term_SAMPLE_TYPE_CHIP.setOrdinal(4) -vocabulary_SAMPLE_TYPE.addTerm(vocabulary_term_SAMPLE_TYPE_CHIP) - -vocabulary_term_SAMPLE_TYPE_VIRAL = tr.createNewVocabularyTerm('VIRAL') -vocabulary_term_SAMPLE_TYPE_VIRAL.setDescription(None) -vocabulary_term_SAMPLE_TYPE_VIRAL.setLabel(None) -vocabulary_term_SAMPLE_TYPE_VIRAL.setOrdinal(5) -vocabulary_SAMPLE_TYPE.addTerm(vocabulary_term_SAMPLE_TYPE_VIRAL) - -vocabulary_term_SAMPLE_TYPE_SYNTHETIC = tr.createNewVocabularyTerm('SYNTHETIC') -vocabulary_term_SAMPLE_TYPE_SYNTHETIC.setDescription(None) -vocabulary_term_SAMPLE_TYPE_SYNTHETIC.setLabel(None) -vocabulary_term_SAMPLE_TYPE_SYNTHETIC.setOrdinal(6) -vocabulary_SAMPLE_TYPE.addTerm(vocabulary_term_SAMPLE_TYPE_SYNTHETIC) - -vocabulary_term_SAMPLE_TYPE_FRAGMENTED_GENOMIC_DNA = tr.createNewVocabularyTerm('FRAGMENTED_GENOMIC_DNA') -vocabulary_term_SAMPLE_TYPE_FRAGMENTED_GENOMIC_DNA.setDescription(None) -vocabulary_term_SAMPLE_TYPE_FRAGMENTED_GENOMIC_DNA.setLabel(None) -vocabulary_term_SAMPLE_TYPE_FRAGMENTED_GENOMIC_DNA.setOrdinal(7) -vocabulary_SAMPLE_TYPE.addTerm(vocabulary_term_SAMPLE_TYPE_FRAGMENTED_GENOMIC_DNA) - -vocabulary_term_SAMPLE_TYPE_MRNA = tr.createNewVocabularyTerm('MRNA') -vocabulary_term_SAMPLE_TYPE_MRNA.setDescription(None) -vocabulary_term_SAMPLE_TYPE_MRNA.setLabel(None) -vocabulary_term_SAMPLE_TYPE_MRNA.setOrdinal(8) -vocabulary_SAMPLE_TYPE.addTerm(vocabulary_term_SAMPLE_TYPE_MRNA) - -vocabulary_term_SAMPLE_TYPE_OTHER = tr.createNewVocabularyTerm('OTHER') -vocabulary_term_SAMPLE_TYPE_OTHER.setDescription(None) -vocabulary_term_SAMPLE_TYPE_OTHER.setLabel(None) -vocabulary_term_SAMPLE_TYPE_OTHER.setOrdinal(9) -vocabulary_SAMPLE_TYPE.addTerm(vocabulary_term_SAMPLE_TYPE_OTHER) - -vocabulary_term_SAMPLE_TYPE_PROCESSED_DNA_LIBRARY = tr.createNewVocabularyTerm('PROCESSED_DNA_LIBRARY') -vocabulary_term_SAMPLE_TYPE_PROCESSED_DNA_LIBRARY.setDescription(None) -vocabulary_term_SAMPLE_TYPE_PROCESSED_DNA_LIBRARY.setLabel(None) -vocabulary_term_SAMPLE_TYPE_PROCESSED_DNA_LIBRARY.setOrdinal(10) -vocabulary_SAMPLE_TYPE.addTerm(vocabulary_term_SAMPLE_TYPE_PROCESSED_DNA_LIBRARY) - -vocabulary_term_SAMPLE_TYPE_BISULFITE_CHIP = tr.createNewVocabularyTerm('BISULFITE_CHIP') -vocabulary_term_SAMPLE_TYPE_BISULFITE_CHIP.setDescription(None) -vocabulary_term_SAMPLE_TYPE_BISULFITE_CHIP.setLabel(None) -vocabulary_term_SAMPLE_TYPE_BISULFITE_CHIP.setOrdinal(11) -vocabulary_SAMPLE_TYPE.addTerm(vocabulary_term_SAMPLE_TYPE_BISULFITE_CHIP) - -vocabulary_term_SAMPLE_TYPE_NONGENOMIC = tr.createNewVocabularyTerm('NON-GENOMIC') -vocabulary_term_SAMPLE_TYPE_NONGENOMIC.setDescription(None) -vocabulary_term_SAMPLE_TYPE_NONGENOMIC.setLabel(None) -vocabulary_term_SAMPLE_TYPE_NONGENOMIC.setOrdinal(12) -vocabulary_SAMPLE_TYPE.addTerm(vocabulary_term_SAMPLE_TYPE_NONGENOMIC) - -vocabulary_SBS_SEQUENCING_KIT_VERSION = tr.getOrCreateNewVocabulary('SBS_SEQUENCING_KIT_VERSION') -vocabulary_SBS_SEQUENCING_KIT_VERSION.setDescription('Version of the Sequencing by Synthesis (SBS) Kit') -vocabulary_SBS_SEQUENCING_KIT_VERSION.setUrlTemplate(None) -vocabulary_SBS_SEQUENCING_KIT_VERSION.setManagedInternally(False) -vocabulary_SBS_SEQUENCING_KIT_VERSION.setInternalNamespace(False) -vocabulary_SBS_SEQUENCING_KIT_VERSION.setChosenFromList(True) - -vocabulary_term_SBS_SEQUENCING_KIT_VERSION_TRUSEQ_V5 = tr.createNewVocabularyTerm('TRUSEQ_V5') -vocabulary_term_SBS_SEQUENCING_KIT_VERSION_TRUSEQ_V5.setDescription(None) -vocabulary_term_SBS_SEQUENCING_KIT_VERSION_TRUSEQ_V5.setLabel('TruSeq v5') -vocabulary_term_SBS_SEQUENCING_KIT_VERSION_TRUSEQ_V5.setOrdinal(1) -vocabulary_SBS_SEQUENCING_KIT_VERSION.addTerm(vocabulary_term_SBS_SEQUENCING_KIT_VERSION_TRUSEQ_V5) - -vocabulary_term_SBS_SEQUENCING_KIT_VERSION_V5 = tr.createNewVocabularyTerm('V5') -vocabulary_term_SBS_SEQUENCING_KIT_VERSION_V5.setDescription(None) -vocabulary_term_SBS_SEQUENCING_KIT_VERSION_V5.setLabel(None) -vocabulary_term_SBS_SEQUENCING_KIT_VERSION_V5.setOrdinal(2) -vocabulary_SBS_SEQUENCING_KIT_VERSION.addTerm(vocabulary_term_SBS_SEQUENCING_KIT_VERSION_V5) - -vocabulary_term_SBS_SEQUENCING_KIT_VERSION_V4 = tr.createNewVocabularyTerm('V4') -vocabulary_term_SBS_SEQUENCING_KIT_VERSION_V4.setDescription(None) -vocabulary_term_SBS_SEQUENCING_KIT_VERSION_V4.setLabel(None) -vocabulary_term_SBS_SEQUENCING_KIT_VERSION_V4.setOrdinal(3) -vocabulary_SBS_SEQUENCING_KIT_VERSION.addTerm(vocabulary_term_SBS_SEQUENCING_KIT_VERSION_V4) - -vocabulary_term_SBS_SEQUENCING_KIT_VERSION_V3 = tr.createNewVocabularyTerm('V3') -vocabulary_term_SBS_SEQUENCING_KIT_VERSION_V3.setDescription(None) -vocabulary_term_SBS_SEQUENCING_KIT_VERSION_V3.setLabel(None) -vocabulary_term_SBS_SEQUENCING_KIT_VERSION_V3.setOrdinal(4) -vocabulary_SBS_SEQUENCING_KIT_VERSION.addTerm(vocabulary_term_SBS_SEQUENCING_KIT_VERSION_V3) - -vocabulary_term_SBS_SEQUENCING_KIT_VERSION_SBS_HS_V3 = tr.createNewVocabularyTerm('SBS_HS_V3') -vocabulary_term_SBS_SEQUENCING_KIT_VERSION_SBS_HS_V3.setDescription(None) -vocabulary_term_SBS_SEQUENCING_KIT_VERSION_SBS_HS_V3.setLabel('TruSeq SBS HS v3') -vocabulary_term_SBS_SEQUENCING_KIT_VERSION_SBS_HS_V3.setOrdinal(5) -vocabulary_SBS_SEQUENCING_KIT_VERSION.addTerm(vocabulary_term_SBS_SEQUENCING_KIT_VERSION_SBS_HS_V3) - -vocabulary_SCS_PROTOCOL_VERSION = tr.getOrCreateNewVocabulary('SCS_PROTOCOL_VERSION') -vocabulary_SCS_PROTOCOL_VERSION.setDescription('THE Illumina protocol') -vocabulary_SCS_PROTOCOL_VERSION.setUrlTemplate(None) -vocabulary_SCS_PROTOCOL_VERSION.setManagedInternally(False) -vocabulary_SCS_PROTOCOL_VERSION.setInternalNamespace(False) -vocabulary_SCS_PROTOCOL_VERSION.setChosenFromList(True) - -vocabulary_term_SCS_PROTOCOL_VERSION_V8 = tr.createNewVocabularyTerm('V8') -vocabulary_term_SCS_PROTOCOL_VERSION_V8.setDescription(None) -vocabulary_term_SCS_PROTOCOL_VERSION_V8.setLabel(None) -vocabulary_term_SCS_PROTOCOL_VERSION_V8.setOrdinal(1) -vocabulary_SCS_PROTOCOL_VERSION.addTerm(vocabulary_term_SCS_PROTOCOL_VERSION_V8) - -vocabulary_term_SCS_PROTOCOL_VERSION_V6 = tr.createNewVocabularyTerm('V6') -vocabulary_term_SCS_PROTOCOL_VERSION_V6.setDescription(None) -vocabulary_term_SCS_PROTOCOL_VERSION_V6.setLabel(None) -vocabulary_term_SCS_PROTOCOL_VERSION_V6.setOrdinal(2) -vocabulary_SCS_PROTOCOL_VERSION.addTerm(vocabulary_term_SCS_PROTOCOL_VERSION_V6) - -vocabulary_term_SCS_PROTOCOL_VERSION_V7 = tr.createNewVocabularyTerm('V7') -vocabulary_term_SCS_PROTOCOL_VERSION_V7.setDescription(None) -vocabulary_term_SCS_PROTOCOL_VERSION_V7.setLabel(None) -vocabulary_term_SCS_PROTOCOL_VERSION_V7.setOrdinal(3) -vocabulary_SCS_PROTOCOL_VERSION.addTerm(vocabulary_term_SCS_PROTOCOL_VERSION_V7) - -vocabulary_SCS_SOFTWARE_VERSION = tr.getOrCreateNewVocabulary('SCS_SOFTWARE_VERSION') -vocabulary_SCS_SOFTWARE_VERSION.setDescription('Software version of the Sequencing PC attached to the GA') -vocabulary_SCS_SOFTWARE_VERSION.setUrlTemplate(None) -vocabulary_SCS_SOFTWARE_VERSION.setManagedInternally(False) -vocabulary_SCS_SOFTWARE_VERSION.setInternalNamespace(False) -vocabulary_SCS_SOFTWARE_VERSION.setChosenFromList(True) - -vocabulary_term_SCS_SOFTWARE_VERSION_HCS_1515 = tr.createNewVocabularyTerm('HCS_1.5.15') -vocabulary_term_SCS_SOFTWARE_VERSION_HCS_1515.setDescription(None) -vocabulary_term_SCS_SOFTWARE_VERSION_HCS_1515.setLabel('HCS 1.5.15/1.13.48') -vocabulary_term_SCS_SOFTWARE_VERSION_HCS_1515.setOrdinal(1) -vocabulary_SCS_SOFTWARE_VERSION.addTerm(vocabulary_term_SCS_SOFTWARE_VERSION_HCS_1515) - -vocabulary_term_SCS_SOFTWARE_VERSION_HCS_145 = tr.createNewVocabularyTerm('HCS_1.4.5') -vocabulary_term_SCS_SOFTWARE_VERSION_HCS_145.setDescription(None) -vocabulary_term_SCS_SOFTWARE_VERSION_HCS_145.setLabel('HCS 1.4.5/RTA 1.12.4') -vocabulary_term_SCS_SOFTWARE_VERSION_HCS_145.setOrdinal(2) -vocabulary_SCS_SOFTWARE_VERSION.addTerm(vocabulary_term_SCS_SOFTWARE_VERSION_HCS_145) - -vocabulary_term_SCS_SOFTWARE_VERSION_HCS_14 = tr.createNewVocabularyTerm('HCS_1.4') -vocabulary_term_SCS_SOFTWARE_VERSION_HCS_14.setDescription(None) -vocabulary_term_SCS_SOFTWARE_VERSION_HCS_14.setLabel('HCS 1.4/RTA 1.12') -vocabulary_term_SCS_SOFTWARE_VERSION_HCS_14.setOrdinal(3) -vocabulary_SCS_SOFTWARE_VERSION.addTerm(vocabulary_term_SCS_SOFTWARE_VERSION_HCS_14) - -vocabulary_term_SCS_SOFTWARE_VERSION_210 = tr.createNewVocabularyTerm('2.10') -vocabulary_term_SCS_SOFTWARE_VERSION_210.setDescription(None) -vocabulary_term_SCS_SOFTWARE_VERSION_210.setLabel('2.10/RTA 1.13.48') -vocabulary_term_SCS_SOFTWARE_VERSION_210.setOrdinal(4) -vocabulary_SCS_SOFTWARE_VERSION.addTerm(vocabulary_term_SCS_SOFTWARE_VERSION_210) - -vocabulary_term_SCS_SOFTWARE_VERSION_29 = tr.createNewVocabularyTerm('2.9') -vocabulary_term_SCS_SOFTWARE_VERSION_29.setDescription(None) -vocabulary_term_SCS_SOFTWARE_VERSION_29.setLabel('2.9/RTA2.9') -vocabulary_term_SCS_SOFTWARE_VERSION_29.setOrdinal(5) -vocabulary_SCS_SOFTWARE_VERSION.addTerm(vocabulary_term_SCS_SOFTWARE_VERSION_29) - -vocabulary_term_SCS_SOFTWARE_VERSION_28 = tr.createNewVocabularyTerm('2.8') -vocabulary_term_SCS_SOFTWARE_VERSION_28.setDescription(None) -vocabulary_term_SCS_SOFTWARE_VERSION_28.setLabel('2.8/RTA 1.8') -vocabulary_term_SCS_SOFTWARE_VERSION_28.setOrdinal(6) -vocabulary_SCS_SOFTWARE_VERSION.addTerm(vocabulary_term_SCS_SOFTWARE_VERSION_28) - -vocabulary_term_SCS_SOFTWARE_VERSION_26 = tr.createNewVocabularyTerm('2.6') -vocabulary_term_SCS_SOFTWARE_VERSION_26.setDescription(None) -vocabulary_term_SCS_SOFTWARE_VERSION_26.setLabel('2.6/RTA 1.6 (no longer in use)') -vocabulary_term_SCS_SOFTWARE_VERSION_26.setOrdinal(7) -vocabulary_SCS_SOFTWARE_VERSION.addTerm(vocabulary_term_SCS_SOFTWARE_VERSION_26) - -vocabulary_term_SCS_SOFTWARE_VERSION_25 = tr.createNewVocabularyTerm('2.5') -vocabulary_term_SCS_SOFTWARE_VERSION_25.setDescription(None) -vocabulary_term_SCS_SOFTWARE_VERSION_25.setLabel('2.5 (no longer in use)') -vocabulary_term_SCS_SOFTWARE_VERSION_25.setOrdinal(8) -vocabulary_SCS_SOFTWARE_VERSION.addTerm(vocabulary_term_SCS_SOFTWARE_VERSION_25) - -vocabulary_term_SCS_SOFTWARE_VERSION_24 = tr.createNewVocabularyTerm('2.4') -vocabulary_term_SCS_SOFTWARE_VERSION_24.setDescription(None) -vocabulary_term_SCS_SOFTWARE_VERSION_24.setLabel('2.4 (no longer in use)') -vocabulary_term_SCS_SOFTWARE_VERSION_24.setOrdinal(9) -vocabulary_SCS_SOFTWARE_VERSION.addTerm(vocabulary_term_SCS_SOFTWARE_VERSION_24) - -vocabulary_SEQUENCER = tr.getOrCreateNewVocabulary('SEQUENCER') -vocabulary_SEQUENCER.setDescription('Which Sequencer was used?') -vocabulary_SEQUENCER.setUrlTemplate(None) -vocabulary_SEQUENCER.setManagedInternally(False) -vocabulary_SEQUENCER.setInternalNamespace(False) -vocabulary_SEQUENCER.setChosenFromList(True) - -vocabulary_term_SEQUENCER_HISEQ2500 = tr.createNewVocabularyTerm('HISEQ2500') -vocabulary_term_SEQUENCER_HISEQ2500.setDescription(None) -vocabulary_term_SEQUENCER_HISEQ2500.setLabel(None) -vocabulary_term_SEQUENCER_HISEQ2500.setOrdinal(3) -vocabulary_SEQUENCER.addTerm(vocabulary_term_SEQUENCER_HISEQ2500) - -vocabulary_term_SEQUENCER_HISEQ2000 = tr.createNewVocabularyTerm('HISEQ2000') -vocabulary_term_SEQUENCER_HISEQ2000.setDescription(None) -vocabulary_term_SEQUENCER_HISEQ2000.setLabel(None) -vocabulary_term_SEQUENCER_HISEQ2000.setOrdinal(4) -vocabulary_SEQUENCER.addTerm(vocabulary_term_SEQUENCER_HISEQ2000) - -vocabulary_SEQUENCING_APPLICATION = tr.getOrCreateNewVocabulary('SEQUENCING_APPLICATION') -vocabulary_SEQUENCING_APPLICATION.setDescription('Type of experiment of the High Throughput Sequencing applications') -vocabulary_SEQUENCING_APPLICATION.setUrlTemplate(None) -vocabulary_SEQUENCING_APPLICATION.setManagedInternally(False) -vocabulary_SEQUENCING_APPLICATION.setInternalNamespace(False) -vocabulary_SEQUENCING_APPLICATION.setChosenFromList(True) - -vocabulary_term_SEQUENCING_APPLICATION_SMALL_RNA_SEQ = tr.createNewVocabularyTerm('SMALL_RNA_SEQ') -vocabulary_term_SEQUENCING_APPLICATION_SMALL_RNA_SEQ.setDescription(None) -vocabulary_term_SEQUENCING_APPLICATION_SMALL_RNA_SEQ.setLabel(None) -vocabulary_term_SEQUENCING_APPLICATION_SMALL_RNA_SEQ.setOrdinal(1) -vocabulary_SEQUENCING_APPLICATION.addTerm(vocabulary_term_SEQUENCING_APPLICATION_SMALL_RNA_SEQ) - -vocabulary_term_SEQUENCING_APPLICATION_RNA_SEQ = tr.createNewVocabularyTerm('RNA_SEQ') -vocabulary_term_SEQUENCING_APPLICATION_RNA_SEQ.setDescription(None) -vocabulary_term_SEQUENCING_APPLICATION_RNA_SEQ.setLabel(None) -vocabulary_term_SEQUENCING_APPLICATION_RNA_SEQ.setOrdinal(2) -vocabulary_SEQUENCING_APPLICATION.addTerm(vocabulary_term_SEQUENCING_APPLICATION_RNA_SEQ) - -vocabulary_term_SEQUENCING_APPLICATION_GENOMIC_DNA_SEQ = tr.createNewVocabularyTerm('GENOMIC_DNA_SEQ') -vocabulary_term_SEQUENCING_APPLICATION_GENOMIC_DNA_SEQ.setDescription(None) -vocabulary_term_SEQUENCING_APPLICATION_GENOMIC_DNA_SEQ.setLabel(None) -vocabulary_term_SEQUENCING_APPLICATION_GENOMIC_DNA_SEQ.setOrdinal(3) -vocabulary_SEQUENCING_APPLICATION.addTerm(vocabulary_term_SEQUENCING_APPLICATION_GENOMIC_DNA_SEQ) - -vocabulary_term_SEQUENCING_APPLICATION_CHIP_SEQ = tr.createNewVocabularyTerm('CHIP_SEQ') -vocabulary_term_SEQUENCING_APPLICATION_CHIP_SEQ.setDescription(None) -vocabulary_term_SEQUENCING_APPLICATION_CHIP_SEQ.setLabel(None) -vocabulary_term_SEQUENCING_APPLICATION_CHIP_SEQ.setOrdinal(4) -vocabulary_SEQUENCING_APPLICATION.addTerm(vocabulary_term_SEQUENCING_APPLICATION_CHIP_SEQ) - -exp_type_HT_SEQUENCING = tr.getOrCreateNewExperimentType('HT_SEQUENCING') -exp_type_HT_SEQUENCING.setDescription('High Throughput Sequencing (e.g. Illumina HiSeq, Illumina GA)') - -samp_type_ILLUMINA_FLOW_CELL = tr.getOrCreateNewSampleType('ILLUMINA_FLOW_CELL') -samp_type_ILLUMINA_FLOW_CELL.setDescription('Container of ILLUMINA_FLOW_LANES') -samp_type_ILLUMINA_FLOW_CELL.setListable(True) -samp_type_ILLUMINA_FLOW_CELL.setShowContainer(False) -samp_type_ILLUMINA_FLOW_CELL.setShowParents(False) -samp_type_ILLUMINA_FLOW_CELL.setSubcodeUnique(False) -samp_type_ILLUMINA_FLOW_CELL.setAutoGeneratedCode(False) -samp_type_ILLUMINA_FLOW_CELL.setGeneratedCodePrefix('FLOWCELL-') - -samp_type_ILLUMINA_FLOW_LANE = tr.getOrCreateNewSampleType('ILLUMINA_FLOW_LANE') -samp_type_ILLUMINA_FLOW_LANE.setDescription('Child of LIBRARY or POOL') -samp_type_ILLUMINA_FLOW_LANE.setListable(True) -samp_type_ILLUMINA_FLOW_LANE.setShowContainer(True) -samp_type_ILLUMINA_FLOW_LANE.setShowParents(True) -samp_type_ILLUMINA_FLOW_LANE.setSubcodeUnique(False) -samp_type_ILLUMINA_FLOW_LANE.setAutoGeneratedCode(False) -samp_type_ILLUMINA_FLOW_LANE.setGeneratedCodePrefix('FLOWLANE-') - -samp_type_LIBRARY = tr.getOrCreateNewSampleType('LIBRARY') -samp_type_LIBRARY.setDescription('Child of RAW and potential parent of POOL') -samp_type_LIBRARY.setListable(True) -samp_type_LIBRARY.setShowContainer(False) -samp_type_LIBRARY.setShowParents(True) -samp_type_LIBRARY.setSubcodeUnique(False) -samp_type_LIBRARY.setAutoGeneratedCode(True) -samp_type_LIBRARY.setGeneratedCodePrefix('QGF-LIBRARY-') - -samp_type_MASTER = tr.getOrCreateNewSampleType('MASTER') -samp_type_MASTER.setDescription('Sample Type holding Master Data and a parent to RAW') -samp_type_MASTER.setListable(True) -samp_type_MASTER.setShowContainer(False) -samp_type_MASTER.setShowParents(False) -samp_type_MASTER.setSubcodeUnique(False) -samp_type_MASTER.setAutoGeneratedCode(True) -samp_type_MASTER.setGeneratedCodePrefix('QGF-MASTER-') - -samp_type_POOL = tr.getOrCreateNewSampleType('POOL') -samp_type_POOL.setDescription('Child of several LIBRARY samples, used for multiplexing') -samp_type_POOL.setListable(True) -samp_type_POOL.setShowContainer(False) -samp_type_POOL.setShowParents(True) -samp_type_POOL.setSubcodeUnique(False) -samp_type_POOL.setAutoGeneratedCode(True) -samp_type_POOL.setGeneratedCodePrefix('QGF-POOL-') - -samp_type_RAW = tr.getOrCreateNewSampleType('RAW') -samp_type_RAW.setDescription('Child of MASTER') -samp_type_RAW.setListable(True) -samp_type_RAW.setShowContainer(False) -samp_type_RAW.setShowParents(True) -samp_type_RAW.setSubcodeUnique(False) -samp_type_RAW.setAutoGeneratedCode(True) -samp_type_RAW.setGeneratedCodePrefix('QGF-RAW-') - -data_set_type_ALIGNMENT = tr.getOrCreateNewDataSetType('ALIGNMENT') -data_set_type_ALIGNMENT.setDescription('Aligner ouput, ideally bam/sam') - -data_set_type_BASECALL_STATS = tr.getOrCreateNewDataSetType('BASECALL_STATS') -data_set_type_BASECALL_STATS.setDescription('Base Call Statistics from the Illumina Pipeline (configureBclToFastq.pl)') - -data_set_type_BIGWIGGLE = tr.getOrCreateNewDataSetType('BIGWIGGLE') -data_set_type_BIGWIGGLE.setDescription('Visualization') - -data_set_type_ELAND_ALIGNMENT = tr.getOrCreateNewDataSetType('ELAND_ALIGNMENT') -data_set_type_ELAND_ALIGNMENT.setDescription('Illumina Eland Alignment Output') - -data_set_type_FASTQ_GZ = tr.getOrCreateNewDataSetType('FASTQ_GZ') -data_set_type_FASTQ_GZ.setDescription('Gzipped Fastq file produced by Casava 1.8+') - -data_set_type_ILLUMINA_GA_OUTPUT = tr.getOrCreateNewDataSetType('ILLUMINA_GA_OUTPUT') -data_set_type_ILLUMINA_GA_OUTPUT.setDescription('The directory structure as produced by the Illumina GA Pipeline (whatever Illumina spits out)\ ') - -data_set_type_ILLUMINA_HISEQ_OUTPUT = tr.getOrCreateNewDataSetType('ILLUMINA_HISEQ_OUTPUT') -data_set_type_ILLUMINA_HISEQ_OUTPUT.setDescription('HiSeq2000 Output') - -data_set_type_MACS_OUTPUT = tr.getOrCreateNewDataSetType('MACS_OUTPUT') -data_set_type_MACS_OUTPUT.setDescription('MACS Peak Caller output') - -data_set_type_QUALITY_JPGS = tr.getOrCreateNewDataSetType('QUALITY_JPGS') -data_set_type_QUALITY_JPGS.setDescription('R generated Quality plots') - -data_set_type_QUALITY_PDFS = tr.getOrCreateNewDataSetType('QUALITY_PDFS') -data_set_type_QUALITY_PDFS.setDescription('R generated pdfs showing quality data') - -data_set_type_QUALITY_SVG = tr.getOrCreateNewDataSetType('QUALITY_SVG') -data_set_type_QUALITY_SVG.setDescription('R generated Quality plots') - -data_set_type_RUNINFO = tr.getOrCreateNewDataSetType('RUNINFO') -data_set_type_RUNINFO.setDescription('Run statstics: Status.html and Status_Files folder') - -data_set_type_THUMBNAILS = tr.getOrCreateNewDataSetType('THUMBNAILS') -data_set_type_THUMBNAILS.setDescription('Thumbnails provided by the Illumina software') - -data_set_type_TSV = tr.getOrCreateNewDataSetType('TSV') -data_set_type_TSV.setDescription('Tab separated files') - -prop_type_AGILENT_KIT = tr.getOrCreateNewPropertyType('AGILENT_KIT', DataType.CONTROLLEDVOCABULARY) -prop_type_AGILENT_KIT.setLabel('Agilent Kit') -prop_type_AGILENT_KIT.setManagedInternally(False) -prop_type_AGILENT_KIT.setInternalNamespace(False) - -prop_type_AGILENT_KIT.setVocabulary(vocabulary_AGILENT_KIT) - -prop_type_ALIGNMENT_SOFTWARE = tr.getOrCreateNewPropertyType('ALIGNMENT_SOFTWARE', DataType.CONTROLLEDVOCABULARY) -prop_type_ALIGNMENT_SOFTWARE.setLabel('Alignment software') -prop_type_ALIGNMENT_SOFTWARE.setManagedInternally(False) -prop_type_ALIGNMENT_SOFTWARE.setInternalNamespace(False) - -prop_type_ALIGNMENT_SOFTWARE.setVocabulary(vocabulary_ALIGNMENT_SOFTWARE) - -prop_type_ANALYSIS_FINISHED = tr.getOrCreateNewPropertyType('ANALYSIS_FINISHED', DataType.TIMESTAMP) -prop_type_ANALYSIS_FINISHED.setLabel('Analysis finished') -prop_type_ANALYSIS_FINISHED.setManagedInternally(False) -prop_type_ANALYSIS_FINISHED.setInternalNamespace(False) - - -prop_type_BARCODE = tr.getOrCreateNewPropertyType('BARCODE', DataType.CONTROLLEDVOCABULARY) -prop_type_BARCODE.setLabel('Index 1') -prop_type_BARCODE.setManagedInternally(False) -prop_type_BARCODE.setInternalNamespace(False) - -prop_type_BARCODE.setVocabulary(vocabulary_INDEX1) - -prop_type_BARCODES = tr.getOrCreateNewPropertyType('BARCODES', DataType.MULTILINE_VARCHAR) -prop_type_BARCODES.setLabel('Adaptor and Barcodes') -prop_type_BARCODES.setManagedInternally(False) -prop_type_BARCODES.setInternalNamespace(False) - - -prop_type_BARCODE_COMPLEXITY_CHECKER = tr.getOrCreateNewPropertyType('BARCODE_COMPLEXITY_CHECKER', DataType.MULTILINE_VARCHAR) -prop_type_BARCODE_COMPLEXITY_CHECKER.setLabel('Barcode_Complexity_Checker') -prop_type_BARCODE_COMPLEXITY_CHECKER.setManagedInternally(False) -prop_type_BARCODE_COMPLEXITY_CHECKER.setInternalNamespace(False) - - -prop_type_BARCODE_LENGTH = tr.getOrCreateNewPropertyType('BARCODE_LENGTH', DataType.INTEGER) -prop_type_BARCODE_LENGTH.setLabel('Barcode Length (+ recognition site)') -prop_type_BARCODE_LENGTH.setManagedInternally(False) -prop_type_BARCODE_LENGTH.setInternalNamespace(False) - - -prop_type_BAREBACKED = tr.getOrCreateNewPropertyType('BAREBACKED', DataType.BOOLEAN) -prop_type_BAREBACKED.setLabel('Barebacked?') -prop_type_BAREBACKED.setManagedInternally(False) -prop_type_BAREBACKED.setInternalNamespace(False) - - -prop_type_BASESCOVERED = tr.getOrCreateNewPropertyType('BASESCOVERED', DataType.INTEGER) -prop_type_BASESCOVERED.setLabel('bases Covered') -prop_type_BASESCOVERED.setManagedInternally(False) -prop_type_BASESCOVERED.setInternalNamespace(False) - - -prop_type_BIOLOGICAL_SAMPLE_ARRIVED = tr.getOrCreateNewPropertyType('BIOLOGICAL_SAMPLE_ARRIVED', DataType.TIMESTAMP) -prop_type_BIOLOGICAL_SAMPLE_ARRIVED.setLabel('Arrival Date of Biological Sample') -prop_type_BIOLOGICAL_SAMPLE_ARRIVED.setManagedInternally(False) -prop_type_BIOLOGICAL_SAMPLE_ARRIVED.setInternalNamespace(False) - - -prop_type_CALCLUATED_EXAMPLE = tr.getOrCreateNewPropertyType('CALCLUATED_EXAMPLE', DataType.REAL) -prop_type_CALCLUATED_EXAMPLE.setLabel('Calcluated_example') -prop_type_CALCLUATED_EXAMPLE.setManagedInternally(False) -prop_type_CALCLUATED_EXAMPLE.setInternalNamespace(False) - - -prop_type_CASAVA_VERSION = tr.getOrCreateNewPropertyType('CASAVA_VERSION', DataType.CONTROLLEDVOCABULARY) -prop_type_CASAVA_VERSION.setLabel('Casava Version') -prop_type_CASAVA_VERSION.setManagedInternally(False) -prop_type_CASAVA_VERSION.setInternalNamespace(False) - -prop_type_CASAVA_VERSION.setVocabulary(vocabulary_CASAVA_VERSION) - -prop_type_CELL_PLASTICITY_SYSTEMSX = tr.getOrCreateNewPropertyType('CELL_PLASTICITY_SYSTEMSX', DataType.BOOLEAN) -prop_type_CELL_PLASTICITY_SYSTEMSX.setLabel('Cell Plasticity (SystemsX)') -prop_type_CELL_PLASTICITY_SYSTEMSX.setManagedInternally(False) -prop_type_CELL_PLASTICITY_SYSTEMSX.setInternalNamespace(False) - - -prop_type_CHROMCOUNT = tr.getOrCreateNewPropertyType('CHROMCOUNT', DataType.INTEGER) -prop_type_CHROMCOUNT.setLabel('chrom Count') -prop_type_CHROMCOUNT.setManagedInternally(False) -prop_type_CHROMCOUNT.setInternalNamespace(False) - - -prop_type_CLUSTER_GENERATION_KIT_VERSION = tr.getOrCreateNewPropertyType('CLUSTER_GENERATION_KIT_VERSION', DataType.CONTROLLEDVOCABULARY) -prop_type_CLUSTER_GENERATION_KIT_VERSION.setLabel('CS Generation Kit Version') -prop_type_CLUSTER_GENERATION_KIT_VERSION.setManagedInternally(False) -prop_type_CLUSTER_GENERATION_KIT_VERSION.setInternalNamespace(False) - -prop_type_CLUSTER_GENERATION_KIT_VERSION.setVocabulary(vocabulary_CLUSTER_GENERATION_KIT_VERSION) - -prop_type_CLUSTER_STATION = tr.getOrCreateNewPropertyType('CLUSTER_STATION', DataType.CONTROLLEDVOCABULARY) -prop_type_CLUSTER_STATION.setLabel('Cluster Station') -prop_type_CLUSTER_STATION.setManagedInternally(False) -prop_type_CLUSTER_STATION.setInternalNamespace(False) - -prop_type_CLUSTER_STATION.setVocabulary(vocabulary_CLUSTER_STATION) - -prop_type_CLUSTER_STATION_SOFTWARE_VERSION = tr.getOrCreateNewPropertyType('CLUSTER_STATION_SOFTWARE_VERSION', DataType.CONTROLLEDVOCABULARY) -prop_type_CLUSTER_STATION_SOFTWARE_VERSION.setLabel('CS Software version') -prop_type_CLUSTER_STATION_SOFTWARE_VERSION.setManagedInternally(False) -prop_type_CLUSTER_STATION_SOFTWARE_VERSION.setInternalNamespace(False) - -prop_type_CLUSTER_STATION_SOFTWARE_VERSION.setVocabulary(vocabulary_CLUSTER_STATION_SOFTWARE_VERSION) - -prop_type_CONCENTRATION_FLOWLANE = tr.getOrCreateNewPropertyType('CONCENTRATION_FLOWLANE', DataType.REAL) -prop_type_CONCENTRATION_FLOWLANE.setLabel('Concentration in flow lane [pM]') -prop_type_CONCENTRATION_FLOWLANE.setManagedInternally(False) -prop_type_CONCENTRATION_FLOWLANE.setInternalNamespace(False) - - -prop_type_CONCENTRATION_ORIGINAL_ILLUMINA = tr.getOrCreateNewPropertyType('CONCENTRATION_ORIGINAL_ILLUMINA', DataType.REAL) -prop_type_CONCENTRATION_ORIGINAL_ILLUMINA.setLabel(u'Concentration (original) [ng/\u03bcl]') -prop_type_CONCENTRATION_ORIGINAL_ILLUMINA.setManagedInternally(False) -prop_type_CONCENTRATION_ORIGINAL_ILLUMINA.setInternalNamespace(False) - - -prop_type_CONCENTRATION_PREPARED_ILLUMINA = tr.getOrCreateNewPropertyType('CONCENTRATION_PREPARED_ILLUMINA', DataType.REAL) -prop_type_CONCENTRATION_PREPARED_ILLUMINA.setLabel(u'Concentration (prepared) [ng/\u03bcl]') -prop_type_CONCENTRATION_PREPARED_ILLUMINA.setManagedInternally(False) -prop_type_CONCENTRATION_PREPARED_ILLUMINA.setInternalNamespace(False) - - -prop_type_CONCENTRATION_TOTAL = tr.getOrCreateNewPropertyType('CONCENTRATION_TOTAL', DataType.INTEGER) -prop_type_CONCENTRATION_TOTAL.setLabel(u'DNA concentration of library (ng/\u03bcl)') -prop_type_CONCENTRATION_TOTAL.setManagedInternally(False) -prop_type_CONCENTRATION_TOTAL.setInternalNamespace(False) - - -prop_type_CONC_IF_SAMPLE_PROCESSED_DNA_LIBRARY = tr.getOrCreateNewPropertyType('CONC_IF_SAMPLE_PROCESSED_DNA_LIBRARY', DataType.INTEGER) -prop_type_CONC_IF_SAMPLE_PROCESSED_DNA_LIBRARY.setLabel('Conc. if sample="proc. DNA library" (nM)') -prop_type_CONC_IF_SAMPLE_PROCESSED_DNA_LIBRARY.setManagedInternally(False) -prop_type_CONC_IF_SAMPLE_PROCESSED_DNA_LIBRARY.setInternalNamespace(False) - - -prop_type_CONTACT_PERSON_EMAIL = tr.getOrCreateNewPropertyType('CONTACT_PERSON_EMAIL', DataType.VARCHAR) -prop_type_CONTACT_PERSON_EMAIL.setLabel('Email of Contact Person') -prop_type_CONTACT_PERSON_EMAIL.setManagedInternally(False) -prop_type_CONTACT_PERSON_EMAIL.setInternalNamespace(False) - - -prop_type_CONTACT_PERSON_NAME = tr.getOrCreateNewPropertyType('CONTACT_PERSON_NAME', DataType.VARCHAR) -prop_type_CONTACT_PERSON_NAME.setLabel('Name of Contact Person') -prop_type_CONTACT_PERSON_NAME.setManagedInternally(False) -prop_type_CONTACT_PERSON_NAME.setInternalNamespace(False) - - -prop_type_CONTROL_LANE = tr.getOrCreateNewPropertyType('CONTROL_LANE', DataType.CONTROLLEDVOCABULARY) -prop_type_CONTROL_LANE.setLabel('Control Lane') -prop_type_CONTROL_LANE.setManagedInternally(False) -prop_type_CONTROL_LANE.setInternalNamespace(False) - -prop_type_CONTROL_LANE.setVocabulary(vocabulary_CONTROL_LANE) - -prop_type_CREATED_ON_CS = tr.getOrCreateNewPropertyType('CREATED_ON_CS', DataType.TIMESTAMP) -prop_type_CREATED_ON_CS.setLabel('Clustering date') -prop_type_CREATED_ON_CS.setManagedInternally(False) -prop_type_CREATED_ON_CS.setInternalNamespace(False) - - -prop_type_CS_PROTOCOL_VERSION = tr.getOrCreateNewPropertyType('CS_PROTOCOL_VERSION', DataType.VARCHAR) -prop_type_CS_PROTOCOL_VERSION.setLabel('CS Protocol Version') -prop_type_CS_PROTOCOL_VERSION.setManagedInternally(False) -prop_type_CS_PROTOCOL_VERSION.setInternalNamespace(False) - - -prop_type_CYCLES = tr.getOrCreateNewPropertyType('CYCLES', DataType.INTEGER) -prop_type_CYCLES.setLabel('Number of Cycles') -prop_type_CYCLES.setManagedInternally(False) -prop_type_CYCLES.setInternalNamespace(False) - - -prop_type_CYCLES_REQUESTED_BY_CUSTOMER = tr.getOrCreateNewPropertyType('CYCLES_REQUESTED_BY_CUSTOMER', DataType.CONTROLLEDVOCABULARY) -prop_type_CYCLES_REQUESTED_BY_CUSTOMER.setLabel('Cycles') -prop_type_CYCLES_REQUESTED_BY_CUSTOMER.setManagedInternally(False) -prop_type_CYCLES_REQUESTED_BY_CUSTOMER.setInternalNamespace(False) - -prop_type_CYCLES_REQUESTED_BY_CUSTOMER.setVocabulary(vocabulary_CYCLES) - -prop_type_DATA_TRANSFERRED = tr.getOrCreateNewPropertyType('DATA_TRANSFERRED', DataType.TIMESTAMP) -prop_type_DATA_TRANSFERRED.setLabel('Data transferred') -prop_type_DATA_TRANSFERRED.setManagedInternally(False) -prop_type_DATA_TRANSFERRED.setInternalNamespace(False) - - -prop_type_DESCRIPTION = tr.getOrCreateNewPropertyType('DESCRIPTION', DataType.VARCHAR) -prop_type_DESCRIPTION.setLabel('Description') -prop_type_DESCRIPTION.setManagedInternally(False) -prop_type_DESCRIPTION.setInternalNamespace(False) - - -prop_type_DNA_CONCENTRATION_OF_LIBRARY = tr.getOrCreateNewPropertyType('DNA_CONCENTRATION_OF_LIBRARY', DataType.INTEGER) -prop_type_DNA_CONCENTRATION_OF_LIBRARY.setLabel('DNA concentration of library (nM)') -prop_type_DNA_CONCENTRATION_OF_LIBRARY.setManagedInternally(False) -prop_type_DNA_CONCENTRATION_OF_LIBRARY.setInternalNamespace(False) - - -prop_type_END_TYPE = tr.getOrCreateNewPropertyType('END_TYPE', DataType.CONTROLLEDVOCABULARY) -prop_type_END_TYPE.setLabel('Paired End / Single Read') -prop_type_END_TYPE.setManagedInternally(False) -prop_type_END_TYPE.setInternalNamespace(False) - -prop_type_END_TYPE.setVocabulary(vocabulary_END_TYPE) - -prop_type_EXPERIMENT_DESIGN = tr.getOrCreateNewPropertyType('EXPERIMENT_DESIGN', DataType.CONTROLLEDVOCABULARY) -prop_type_EXPERIMENT_DESIGN.setLabel('Experiment Design') -prop_type_EXPERIMENT_DESIGN.setManagedInternally(False) -prop_type_EXPERIMENT_DESIGN.setInternalNamespace(False) - -prop_type_EXPERIMENT_DESIGN.setVocabulary(vocabulary_EXPERIMENT_DESIGN) - -prop_type_EXTERNAL_SAMPLE_NAME = tr.getOrCreateNewPropertyType('EXTERNAL_SAMPLE_NAME', DataType.VARCHAR) -prop_type_EXTERNAL_SAMPLE_NAME.setLabel('External Sample Name') -prop_type_EXTERNAL_SAMPLE_NAME.setManagedInternally(False) -prop_type_EXTERNAL_SAMPLE_NAME.setInternalNamespace(False) - - -prop_type_FLOWCELLTYPE = tr.getOrCreateNewPropertyType('FLOWCELLTYPE', DataType.VARCHAR) -prop_type_FLOWCELLTYPE.setLabel('Flow Cell Type') -prop_type_FLOWCELLTYPE.setManagedInternally(False) -prop_type_FLOWCELLTYPE.setInternalNamespace(False) - - -prop_type_FLOW_CELL_SEQUENCED_ON = tr.getOrCreateNewPropertyType('FLOW_CELL_SEQUENCED_ON', DataType.TIMESTAMP) -prop_type_FLOW_CELL_SEQUENCED_ON.setLabel('Sequencing date') -prop_type_FLOW_CELL_SEQUENCED_ON.setManagedInternally(False) -prop_type_FLOW_CELL_SEQUENCED_ON.setInternalNamespace(False) - - -prop_type_FRAGMENT_SIZE_PREPARED_ILLUMINA = tr.getOrCreateNewPropertyType('FRAGMENT_SIZE_PREPARED_ILLUMINA', DataType.INTEGER) -prop_type_FRAGMENT_SIZE_PREPARED_ILLUMINA.setLabel('Fragment Size (prepared) [base (pairs)]') -prop_type_FRAGMENT_SIZE_PREPARED_ILLUMINA.setManagedInternally(False) -prop_type_FRAGMENT_SIZE_PREPARED_ILLUMINA.setInternalNamespace(False) - - -prop_type_ILLUMINA_PIPELINE_VERSION = tr.getOrCreateNewPropertyType('ILLUMINA_PIPELINE_VERSION', DataType.CONTROLLEDVOCABULARY) -prop_type_ILLUMINA_PIPELINE_VERSION.setLabel('Pipeline Version') -prop_type_ILLUMINA_PIPELINE_VERSION.setManagedInternally(False) -prop_type_ILLUMINA_PIPELINE_VERSION.setInternalNamespace(False) - -prop_type_ILLUMINA_PIPELINE_VERSION.setVocabulary(vocabulary_PIPELINE_VERSION) - -prop_type_INDEX2 = tr.getOrCreateNewPropertyType('INDEX2', DataType.CONTROLLEDVOCABULARY) -prop_type_INDEX2.setLabel('Index 2') -prop_type_INDEX2.setManagedInternally(False) -prop_type_INDEX2.setInternalNamespace(False) - -prop_type_INDEX2.setVocabulary(vocabulary_INDEX2) - -prop_type_INDEXREAD = tr.getOrCreateNewPropertyType('INDEXREAD', DataType.INTEGER) -prop_type_INDEXREAD.setLabel('Length of Index Read1') -prop_type_INDEXREAD.setManagedInternally(False) -prop_type_INDEXREAD.setInternalNamespace(False) - - -prop_type_INDEXREAD2 = tr.getOrCreateNewPropertyType('INDEXREAD2', DataType.INTEGER) -prop_type_INDEXREAD2.setLabel('Length of Index Read2') -prop_type_INDEXREAD2.setManagedInternally(False) -prop_type_INDEXREAD2.setInternalNamespace(False) - - -prop_type_INVOICE = tr.getOrCreateNewPropertyType('INVOICE', DataType.BOOLEAN) -prop_type_INVOICE.setLabel('Invoice sent?') -prop_type_INVOICE.setManagedInternally(False) -prop_type_INVOICE.setInternalNamespace(False) - - -prop_type_ISCOMPRESSED = tr.getOrCreateNewPropertyType('ISCOMPRESSED', DataType.BOOLEAN) -prop_type_ISCOMPRESSED.setLabel('Is Compressed') -prop_type_ISCOMPRESSED.setManagedInternally(False) -prop_type_ISCOMPRESSED.setInternalNamespace(False) - - -prop_type_ISSUED_COMMAND = tr.getOrCreateNewPropertyType('ISSUED_COMMAND', DataType.MULTILINE_VARCHAR) -prop_type_ISSUED_COMMAND.setLabel('Issued Command') -prop_type_ISSUED_COMMAND.setManagedInternally(False) -prop_type_ISSUED_COMMAND.setInternalNamespace(False) - - -prop_type_ISSWAPPED = tr.getOrCreateNewPropertyType('ISSWAPPED', DataType.INTEGER) -prop_type_ISSWAPPED.setLabel('Is byte swapped') -prop_type_ISSWAPPED.setManagedInternally(False) -prop_type_ISSWAPPED.setInternalNamespace(False) - - -prop_type_KIT = tr.getOrCreateNewPropertyType('KIT', DataType.CONTROLLEDVOCABULARY) -prop_type_KIT.setLabel('Library preparation kit') -prop_type_KIT.setManagedInternally(False) -prop_type_KIT.setInternalNamespace(False) - -prop_type_KIT.setVocabulary(vocabulary_KIT) - -prop_type_KIT_ARRIVED = tr.getOrCreateNewPropertyType('KIT_ARRIVED', DataType.TIMESTAMP) -prop_type_KIT_ARRIVED.setLabel('Kit arrived') -prop_type_KIT_ARRIVED.setManagedInternally(False) -prop_type_KIT_ARRIVED.setInternalNamespace(False) - - -prop_type_KIT_PREPARED = tr.getOrCreateNewPropertyType('KIT_PREPARED', DataType.TIMESTAMP) -prop_type_KIT_PREPARED.setLabel('Sample processed') -prop_type_KIT_PREPARED.setManagedInternally(False) -prop_type_KIT_PREPARED.setInternalNamespace(False) - - -prop_type_LANECOUNT = tr.getOrCreateNewPropertyType('LANECOUNT', DataType.INTEGER) -prop_type_LANECOUNT.setLabel('Lane Count') -prop_type_LANECOUNT.setManagedInternally(False) -prop_type_LANECOUNT.setInternalNamespace(False) - - -prop_type_LIBRARY_PROCESSING_FAILED = tr.getOrCreateNewPropertyType('LIBRARY_PROCESSING_FAILED', DataType.BOOLEAN) -prop_type_LIBRARY_PROCESSING_FAILED.setLabel('Library processing failed') -prop_type_LIBRARY_PROCESSING_FAILED.setManagedInternally(False) -prop_type_LIBRARY_PROCESSING_FAILED.setInternalNamespace(False) - - -prop_type_LIBRARY_PROCESSING_POSSIBLE = tr.getOrCreateNewPropertyType('LIBRARY_PROCESSING_POSSIBLE', DataType.BOOLEAN) -prop_type_LIBRARY_PROCESSING_POSSIBLE.setLabel('Library Processing possible') -prop_type_LIBRARY_PROCESSING_POSSIBLE.setManagedInternally(False) -prop_type_LIBRARY_PROCESSING_POSSIBLE.setInternalNamespace(False) - - -prop_type_LIBRARY_PROCESSING_SUCCESSFUL = tr.getOrCreateNewPropertyType('LIBRARY_PROCESSING_SUCCESSFUL', DataType.BOOLEAN) -prop_type_LIBRARY_PROCESSING_SUCCESSFUL.setLabel('Library processing successful') -prop_type_LIBRARY_PROCESSING_SUCCESSFUL.setManagedInternally(False) -prop_type_LIBRARY_PROCESSING_SUCCESSFUL.setInternalNamespace(False) - - -prop_type_LOT = tr.getOrCreateNewPropertyType('LOT', DataType.INTEGER) -prop_type_LOT.setLabel('Kit Lot #') -prop_type_LOT.setManagedInternally(False) -prop_type_LOT.setInternalNamespace(False) - - -prop_type_MACS_VERSION = tr.getOrCreateNewPropertyType('MACS_VERSION', DataType.CONTROLLEDVOCABULARY) -prop_type_MACS_VERSION.setLabel('MACS VERSION') -prop_type_MACS_VERSION.setManagedInternally(False) -prop_type_MACS_VERSION.setInternalNamespace(False) - -prop_type_MACS_VERSION.setVocabulary(vocabulary_MACS_VERSION) - -prop_type_MAPPED_READS = tr.getOrCreateNewPropertyType('MAPPED_READS', DataType.INTEGER) -prop_type_MAPPED_READS.setLabel('Mapped reads') -prop_type_MAPPED_READS.setManagedInternally(False) -prop_type_MAPPED_READS.setInternalNamespace(False) - - -prop_type_MAX = tr.getOrCreateNewPropertyType('MAX', DataType.REAL) -prop_type_MAX.setLabel('Maximum') -prop_type_MAX.setManagedInternally(False) -prop_type_MAX.setInternalNamespace(False) - - -prop_type_MEAN = tr.getOrCreateNewPropertyType('MEAN', DataType.REAL) -prop_type_MEAN.setLabel('Mean') -prop_type_MEAN.setManagedInternally(False) -prop_type_MEAN.setInternalNamespace(False) - - -prop_type_MIN = tr.getOrCreateNewPropertyType('MIN', DataType.REAL) -prop_type_MIN.setLabel('Minimum') -prop_type_MIN.setManagedInternally(False) -prop_type_MIN.setInternalNamespace(False) - - -prop_type_MISMATCH_IN_INDEX = tr.getOrCreateNewPropertyType('MISMATCH_IN_INDEX', DataType.CONTROLLEDVOCABULARY) -prop_type_MISMATCH_IN_INDEX.setLabel('Mismatch in Index') -prop_type_MISMATCH_IN_INDEX.setManagedInternally(False) -prop_type_MISMATCH_IN_INDEX.setInternalNamespace(False) - -prop_type_MISMATCH_IN_INDEX.setVocabulary(vocabulary_MISMATCH_IN_INDEX) - -prop_type_NANO_DROP = tr.getOrCreateNewPropertyType('NANO_DROP', DataType.CONTROLLEDVOCABULARY) -prop_type_NANO_DROP.setLabel('Nano Drop') -prop_type_NANO_DROP.setManagedInternally(False) -prop_type_NANO_DROP.setInternalNamespace(False) - -prop_type_NANO_DROP.setVocabulary(vocabulary_NANO_DROP) - -prop_type_NCBI_ORGANISM_TAXONOMY = tr.getOrCreateNewPropertyType('NCBI_ORGANISM_TAXONOMY', DataType.CONTROLLEDVOCABULARY) -prop_type_NCBI_ORGANISM_TAXONOMY.setLabel('Organism (NCBI Taxonomy)') -prop_type_NCBI_ORGANISM_TAXONOMY.setManagedInternally(False) -prop_type_NCBI_ORGANISM_TAXONOMY.setInternalNamespace(False) - -prop_type_NCBI_ORGANISM_TAXONOMY.setVocabulary(vocabulary_NCBI_TAXONOMY) - -prop_type_NM_DNA = tr.getOrCreateNewPropertyType('NM_DNA', DataType.REAL) -prop_type_NM_DNA.setLabel('Calculated DNA concentration of library (nM)') -prop_type_NM_DNA.setManagedInternally(False) -prop_type_NM_DNA.setInternalNamespace(False) - - -prop_type_NOTES = tr.getOrCreateNewPropertyType('NOTES', DataType.MULTILINE_VARCHAR) -prop_type_NOTES.setLabel('Notes') -prop_type_NOTES.setManagedInternally(False) -prop_type_NOTES.setInternalNamespace(False) - - -prop_type_NOTES_CUSTOMER = tr.getOrCreateNewPropertyType('NOTES_CUSTOMER', DataType.MULTILINE_VARCHAR) -prop_type_NOTES_CUSTOMER.setLabel('Notes Customer') -prop_type_NOTES_CUSTOMER.setManagedInternally(False) -prop_type_NOTES_CUSTOMER.setInternalNamespace(False) - - -prop_type_NUMBER_OF_ATTACHMENTS = tr.getOrCreateNewPropertyType('NUMBER_OF_ATTACHMENTS', DataType.INTEGER) -prop_type_NUMBER_OF_ATTACHMENTS.setLabel('Number of Attachments') -prop_type_NUMBER_OF_ATTACHMENTS.setManagedInternally(False) -prop_type_NUMBER_OF_ATTACHMENTS.setInternalNamespace(False) - - -prop_type_ORGANISM_FREE = tr.getOrCreateNewPropertyType('ORGANISM_FREE', DataType.VARCHAR) -prop_type_ORGANISM_FREE.setLabel('Organism (if OTHER)') -prop_type_ORGANISM_FREE.setManagedInternally(False) -prop_type_ORGANISM_FREE.setInternalNamespace(False) - - -prop_type_OTRS = tr.getOrCreateNewPropertyType('OTRS', DataType.INTEGER) -prop_type_OTRS.setLabel('OTRS ID #') -prop_type_OTRS.setManagedInternally(False) -prop_type_OTRS.setInternalNamespace(False) - - -prop_type_PAIRED_END_KIT = tr.getOrCreateNewPropertyType('PAIRED_END_KIT', DataType.VARCHAR) -prop_type_PAIRED_END_KIT.setLabel('Paired End Kit') -prop_type_PAIRED_END_KIT.setManagedInternally(False) -prop_type_PAIRED_END_KIT.setInternalNamespace(False) - - -prop_type_PERCENTAGE_ONE_MISMATCH_READS_INDEX = tr.getOrCreateNewPropertyType('PERCENTAGE_ONE_MISMATCH_READS_INDEX', DataType.REAL) -prop_type_PERCENTAGE_ONE_MISMATCH_READS_INDEX.setLabel('% One Mismatch Reads (Index)') -prop_type_PERCENTAGE_ONE_MISMATCH_READS_INDEX.setManagedInternally(False) -prop_type_PERCENTAGE_ONE_MISMATCH_READS_INDEX.setInternalNamespace(False) - - -prop_type_PERCENTAGE_PASSED_FILTERING = tr.getOrCreateNewPropertyType('PERCENTAGE_PASSED_FILTERING', DataType.REAL) -prop_type_PERCENTAGE_PASSED_FILTERING.setLabel('% Passes Illumina Filtering (PF)') -prop_type_PERCENTAGE_PASSED_FILTERING.setManagedInternally(False) -prop_type_PERCENTAGE_PASSED_FILTERING.setInternalNamespace(False) - - -prop_type_PERCENTAGE_PERFECT_INDEX_READS = tr.getOrCreateNewPropertyType('PERCENTAGE_PERFECT_INDEX_READS', DataType.REAL) -prop_type_PERCENTAGE_PERFECT_INDEX_READS.setLabel('% Perfect Index Reads') -prop_type_PERCENTAGE_PERFECT_INDEX_READS.setManagedInternally(False) -prop_type_PERCENTAGE_PERFECT_INDEX_READS.setInternalNamespace(False) - - -prop_type_PERCENTAGE_RAW_CLUSTERS_PER_LANE = tr.getOrCreateNewPropertyType('PERCENTAGE_RAW_CLUSTERS_PER_LANE', DataType.REAL) -prop_type_PERCENTAGE_RAW_CLUSTERS_PER_LANE.setLabel('% of raw clusters per lane') -prop_type_PERCENTAGE_RAW_CLUSTERS_PER_LANE.setManagedInternally(False) -prop_type_PERCENTAGE_RAW_CLUSTERS_PER_LANE.setInternalNamespace(False) - - -prop_type_PREPARED_BY = tr.getOrCreateNewPropertyType('PREPARED_BY', DataType.VARCHAR) -prop_type_PREPARED_BY.setLabel('Prepared by') -prop_type_PREPARED_BY.setManagedInternally(False) -prop_type_PREPARED_BY.setInternalNamespace(False) - - -prop_type_PRIMARYDATASIZE = tr.getOrCreateNewPropertyType('PRIMARYDATASIZE', DataType.INTEGER) -prop_type_PRIMARYDATASIZE.setLabel('primary Data Size') -prop_type_PRIMARYDATASIZE.setManagedInternally(False) -prop_type_PRIMARYDATASIZE.setInternalNamespace(False) - - -prop_type_PRIMARYINDEXSIZE = tr.getOrCreateNewPropertyType('PRIMARYINDEXSIZE', DataType.INTEGER) -prop_type_PRIMARYINDEXSIZE.setLabel('primary Index Size') -prop_type_PRIMARYINDEXSIZE.setManagedInternally(False) -prop_type_PRIMARYINDEXSIZE.setInternalNamespace(False) - - -prop_type_PRINCIPAL_INVESTIGATOR_EMAIL = tr.getOrCreateNewPropertyType('PRINCIPAL_INVESTIGATOR_EMAIL', DataType.VARCHAR) -prop_type_PRINCIPAL_INVESTIGATOR_EMAIL.setLabel('Email of Principal Investigator') -prop_type_PRINCIPAL_INVESTIGATOR_EMAIL.setManagedInternally(False) -prop_type_PRINCIPAL_INVESTIGATOR_EMAIL.setInternalNamespace(False) - - -prop_type_PRINCIPAL_INVESTIGATOR_NAME = tr.getOrCreateNewPropertyType('PRINCIPAL_INVESTIGATOR_NAME', DataType.VARCHAR) -prop_type_PRINCIPAL_INVESTIGATOR_NAME.setLabel('Name of Principal Investigator') -prop_type_PRINCIPAL_INVESTIGATOR_NAME.setManagedInternally(False) -prop_type_PRINCIPAL_INVESTIGATOR_NAME.setInternalNamespace(False) - - -prop_type_REQUIRED_LANES = tr.getOrCreateNewPropertyType('REQUIRED_LANES', DataType.CONTROLLEDVOCABULARY) -prop_type_REQUIRED_LANES.setLabel('Number of Required Lanes') -prop_type_REQUIRED_LANES.setManagedInternally(False) -prop_type_REQUIRED_LANES.setInternalNamespace(False) - -prop_type_REQUIRED_LANES.setVocabulary(vocabulary_REQUIRED_LANES) - -prop_type_SAMPLE_CHARACTERISTICS = tr.getOrCreateNewPropertyType('SAMPLE_CHARACTERISTICS', DataType.MULTILINE_VARCHAR) -prop_type_SAMPLE_CHARACTERISTICS.setLabel('Sample characteristics') -prop_type_SAMPLE_CHARACTERISTICS.setManagedInternally(False) -prop_type_SAMPLE_CHARACTERISTICS.setInternalNamespace(False) - - -prop_type_SAMPLE_DATA_PROCESSING = tr.getOrCreateNewPropertyType('SAMPLE_DATA_PROCESSING', DataType.MULTILINE_VARCHAR) -prop_type_SAMPLE_DATA_PROCESSING.setLabel('Sample Data Processing') -prop_type_SAMPLE_DATA_PROCESSING.setManagedInternally(False) -prop_type_SAMPLE_DATA_PROCESSING.setInternalNamespace(False) - - -prop_type_SAMPLE_EXTRACT_PROTOCOL = tr.getOrCreateNewPropertyType('SAMPLE_EXTRACT_PROTOCOL', DataType.MULTILINE_VARCHAR) -prop_type_SAMPLE_EXTRACT_PROTOCOL.setLabel('Sample Extract Protocol') -prop_type_SAMPLE_EXTRACT_PROTOCOL.setManagedInternally(False) -prop_type_SAMPLE_EXTRACT_PROTOCOL.setInternalNamespace(False) - - -prop_type_SAMPLE_ID = tr.getOrCreateNewPropertyType('SAMPLE_ID', DataType.VARCHAR) -prop_type_SAMPLE_ID.setLabel('Sample ID') -prop_type_SAMPLE_ID.setManagedInternally(False) -prop_type_SAMPLE_ID.setInternalNamespace(False) - - -prop_type_SAMPLE_KIND = tr.getOrCreateNewPropertyType('SAMPLE_KIND', DataType.CONTROLLEDVOCABULARY) -prop_type_SAMPLE_KIND.setLabel('Sample Kind') -prop_type_SAMPLE_KIND.setManagedInternally(False) -prop_type_SAMPLE_KIND.setInternalNamespace(False) - -prop_type_SAMPLE_KIND.setVocabulary(vocabulary_SAMPLE_TYPE) - -prop_type_SAMPLE_LIBRARY_SELECTION = tr.getOrCreateNewPropertyType('SAMPLE_LIBRARY_SELECTION', DataType.CONTROLLEDVOCABULARY) -prop_type_SAMPLE_LIBRARY_SELECTION.setLabel('Sample Library Selection') -prop_type_SAMPLE_LIBRARY_SELECTION.setManagedInternally(False) -prop_type_SAMPLE_LIBRARY_SELECTION.setInternalNamespace(False) - -prop_type_SAMPLE_LIBRARY_SELECTION.setVocabulary(vocabulary_SAMPLE_LIBRARY_SELECTION) - -prop_type_SAMPLE_LIBRARY_SOURCE = tr.getOrCreateNewPropertyType('SAMPLE_LIBRARY_SOURCE', DataType.CONTROLLEDVOCABULARY) -prop_type_SAMPLE_LIBRARY_SOURCE.setLabel('Sample Library Source') -prop_type_SAMPLE_LIBRARY_SOURCE.setManagedInternally(False) -prop_type_SAMPLE_LIBRARY_SOURCE.setInternalNamespace(False) - -prop_type_SAMPLE_LIBRARY_SOURCE.setVocabulary(vocabulary_SAMPLE_LIBRARY_SOURCE_VOC) - -prop_type_SAMPLE_LIBRARY_STRATEGY = tr.getOrCreateNewPropertyType('SAMPLE_LIBRARY_STRATEGY', DataType.CONTROLLEDVOCABULARY) -prop_type_SAMPLE_LIBRARY_STRATEGY.setLabel('Sample Library Strategy') -prop_type_SAMPLE_LIBRARY_STRATEGY.setManagedInternally(False) -prop_type_SAMPLE_LIBRARY_STRATEGY.setInternalNamespace(False) - -prop_type_SAMPLE_LIBRARY_STRATEGY.setVocabulary(vocabulary_SAMPLE_LIBRARY_STRATEGY) - -prop_type_SAMPLE_MOLECULE = tr.getOrCreateNewPropertyType('SAMPLE_MOLECULE', DataType.CONTROLLEDVOCABULARY) -prop_type_SAMPLE_MOLECULE.setLabel('Sample molecule') -prop_type_SAMPLE_MOLECULE.setManagedInternally(False) -prop_type_SAMPLE_MOLECULE.setInternalNamespace(False) - -prop_type_SAMPLE_MOLECULE.setVocabulary(vocabulary_SAMPLE_MOLECULE) - -prop_type_SAMPLE_SOURCE_NAME = tr.getOrCreateNewPropertyType('SAMPLE_SOURCE_NAME', DataType.VARCHAR) -prop_type_SAMPLE_SOURCE_NAME.setLabel('Sample Source Name') -prop_type_SAMPLE_SOURCE_NAME.setManagedInternally(False) -prop_type_SAMPLE_SOURCE_NAME.setInternalNamespace(False) - - -prop_type_SAMTOOLS_FLAGSTAT = tr.getOrCreateNewPropertyType('SAMTOOLS_FLAGSTAT', DataType.MULTILINE_VARCHAR) -prop_type_SAMTOOLS_FLAGSTAT.setLabel('Samtools Flagstat Output') -prop_type_SAMTOOLS_FLAGSTAT.setManagedInternally(False) -prop_type_SAMTOOLS_FLAGSTAT.setInternalNamespace(False) - - -prop_type_SBS_KIT = tr.getOrCreateNewPropertyType('SBS_KIT', DataType.VARCHAR) -prop_type_SBS_KIT.setLabel('SBS Kit') -prop_type_SBS_KIT.setManagedInternally(False) -prop_type_SBS_KIT.setInternalNamespace(False) - - -prop_type_SBS_SEQUENCING_KIT_VERSION = tr.getOrCreateNewPropertyType('SBS_SEQUENCING_KIT_VERSION', DataType.CONTROLLEDVOCABULARY) -prop_type_SBS_SEQUENCING_KIT_VERSION.setLabel('SBS Sequencing Kit Version') -prop_type_SBS_SEQUENCING_KIT_VERSION.setManagedInternally(False) -prop_type_SBS_SEQUENCING_KIT_VERSION.setInternalNamespace(False) - -prop_type_SBS_SEQUENCING_KIT_VERSION.setVocabulary(vocabulary_SBS_SEQUENCING_KIT_VERSION) - -prop_type_SCRIPT_TYPE = tr.getOrCreateNewPropertyType('SCRIPT_TYPE', DataType.REAL) -prop_type_SCRIPT_TYPE.setLabel('Script Type') -prop_type_SCRIPT_TYPE.setManagedInternally(False) -prop_type_SCRIPT_TYPE.setInternalNamespace(False) - - -prop_type_SCS_PROTOCOL_VERSION = tr.getOrCreateNewPropertyType('SCS_PROTOCOL_VERSION', DataType.CONTROLLEDVOCABULARY) -prop_type_SCS_PROTOCOL_VERSION.setLabel('SCS Protocol Version') -prop_type_SCS_PROTOCOL_VERSION.setManagedInternally(False) -prop_type_SCS_PROTOCOL_VERSION.setInternalNamespace(False) - -prop_type_SCS_PROTOCOL_VERSION.setVocabulary(vocabulary_SCS_PROTOCOL_VERSION) - -prop_type_SCS_SOFTWARE_VERSION = tr.getOrCreateNewPropertyType('SCS_SOFTWARE_VERSION', DataType.CONTROLLEDVOCABULARY) -prop_type_SCS_SOFTWARE_VERSION.setLabel('SCS Software Version') -prop_type_SCS_SOFTWARE_VERSION.setManagedInternally(False) -prop_type_SCS_SOFTWARE_VERSION.setInternalNamespace(False) - -prop_type_SCS_SOFTWARE_VERSION.setVocabulary(vocabulary_SCS_SOFTWARE_VERSION) - -prop_type_SEQUENCER = tr.getOrCreateNewPropertyType('SEQUENCER', DataType.CONTROLLEDVOCABULARY) -prop_type_SEQUENCER.setLabel('Sequencer') -prop_type_SEQUENCER.setManagedInternally(False) -prop_type_SEQUENCER.setInternalNamespace(False) - -prop_type_SEQUENCER.setVocabulary(vocabulary_SEQUENCER) - -prop_type_SEQUENCER_FINISHED = tr.getOrCreateNewPropertyType('SEQUENCER_FINISHED', DataType.TIMESTAMP) -prop_type_SEQUENCER_FINISHED.setLabel('Sequencer finished') -prop_type_SEQUENCER_FINISHED.setManagedInternally(False) -prop_type_SEQUENCER_FINISHED.setInternalNamespace(False) - - -prop_type_SEQUENCING_APPLICATION = tr.getOrCreateNewPropertyType('SEQUENCING_APPLICATION', DataType.CONTROLLEDVOCABULARY) -prop_type_SEQUENCING_APPLICATION.setLabel('Sequencing Application') -prop_type_SEQUENCING_APPLICATION.setManagedInternally(False) -prop_type_SEQUENCING_APPLICATION.setInternalNamespace(False) - -prop_type_SEQUENCING_APPLICATION.setVocabulary(vocabulary_SEQUENCING_APPLICATION) - -prop_type_STARTING_AMOUNT_OF_SAMPLE_IN_NG = tr.getOrCreateNewPropertyType('STARTING_AMOUNT_OF_SAMPLE_IN_NG', DataType.REAL) -prop_type_STARTING_AMOUNT_OF_SAMPLE_IN_NG.setLabel('Starting amount of sample (ng)') -prop_type_STARTING_AMOUNT_OF_SAMPLE_IN_NG.setManagedInternally(False) -prop_type_STARTING_AMOUNT_OF_SAMPLE_IN_NG.setInternalNamespace(False) - - -prop_type_STD = tr.getOrCreateNewPropertyType('STD', DataType.REAL) -prop_type_STD.setLabel('Standard deviation') -prop_type_STD.setManagedInternally(False) -prop_type_STD.setInternalNamespace(False) - - -prop_type_SURFACECOUNT = tr.getOrCreateNewPropertyType('SURFACECOUNT', DataType.INTEGER) -prop_type_SURFACECOUNT.setLabel('Surface Count') -prop_type_SURFACECOUNT.setManagedInternally(False) -prop_type_SURFACECOUNT.setInternalNamespace(False) - - -prop_type_SWATHCOUNT = tr.getOrCreateNewPropertyType('SWATHCOUNT', DataType.INTEGER) -prop_type_SWATHCOUNT.setLabel('Swath Count') -prop_type_SWATHCOUNT.setManagedInternally(False) -prop_type_SWATHCOUNT.setInternalNamespace(False) - - -prop_type_TILECOUNT = tr.getOrCreateNewPropertyType('TILECOUNT', DataType.INTEGER) -prop_type_TILECOUNT.setLabel('Tile Count') -prop_type_TILECOUNT.setManagedInternally(False) -prop_type_TILECOUNT.setInternalNamespace(False) - - -prop_type_TOTAL_READS = tr.getOrCreateNewPropertyType('TOTAL_READS', DataType.INTEGER) -prop_type_TOTAL_READS.setLabel('Total reads') -prop_type_TOTAL_READS.setManagedInternally(False) -prop_type_TOTAL_READS.setInternalNamespace(False) - - -prop_type_UL_DNA = tr.getOrCreateNewPropertyType('UL_DNA', DataType.REAL) -prop_type_UL_DNA.setLabel('Calculated ul DNA for 2nM stock') -prop_type_UL_DNA.setManagedInternally(False) -prop_type_UL_DNA.setInternalNamespace(False) - - -prop_type_UL_EB = tr.getOrCreateNewPropertyType('UL_EB', DataType.REAL) -prop_type_UL_EB.setLabel('Calculated ul EB for 2nM stock ') -prop_type_UL_EB.setManagedInternally(False) -prop_type_UL_EB.setInternalNamespace(False) - - -prop_type_UL_STOCK = tr.getOrCreateNewPropertyType('UL_STOCK', DataType.INTEGER) -prop_type_UL_STOCK.setLabel('ul of 2nM stock') -prop_type_UL_STOCK.setManagedInternally(False) -prop_type_UL_STOCK.setInternalNamespace(False) - - -prop_type_UNIQUE_BARCODES = tr.getOrCreateNewPropertyType('UNIQUE_BARCODES', DataType.VARCHAR) -prop_type_UNIQUE_BARCODES.setLabel('Unique Barcodes in Pool?') -prop_type_UNIQUE_BARCODES.setManagedInternally(False) -prop_type_UNIQUE_BARCODES.setInternalNamespace(False) - - -prop_type_VERSION = tr.getOrCreateNewPropertyType('VERSION', DataType.VARCHAR) -prop_type_VERSION.setLabel('Version') -prop_type_VERSION.setManagedInternally(False) -prop_type_VERSION.setInternalNamespace(False) - - -prop_type_YIELD_MBASES = tr.getOrCreateNewPropertyType('YIELD_MBASES', DataType.INTEGER) -prop_type_YIELD_MBASES.setLabel('Yield(Mbases)') -prop_type_YIELD_MBASES.setManagedInternally(False) -prop_type_YIELD_MBASES.setInternalNamespace(False) - - -prop_type_ZOOMLEVELS = tr.getOrCreateNewPropertyType('ZOOMLEVELS', DataType.INTEGER) -prop_type_ZOOMLEVELS.setLabel('zoom Levels') -prop_type_ZOOMLEVELS.setManagedInternally(False) -prop_type_ZOOMLEVELS.setInternalNamespace(False) - - -assignment_DATA_SET_ALIGNMENT_ALIGNMENT_SOFTWARE = tr.assignPropertyType(data_set_type_ALIGNMENT, prop_type_ALIGNMENT_SOFTWARE) -assignment_DATA_SET_ALIGNMENT_ALIGNMENT_SOFTWARE.setMandatory(False) -assignment_DATA_SET_ALIGNMENT_ALIGNMENT_SOFTWARE.setSection(None) -assignment_DATA_SET_ALIGNMENT_ALIGNMENT_SOFTWARE.setPositionInForms(3) - -assignment_DATA_SET_ALIGNMENT_VERSION = tr.assignPropertyType(data_set_type_ALIGNMENT, prop_type_VERSION) -assignment_DATA_SET_ALIGNMENT_VERSION.setMandatory(False) -assignment_DATA_SET_ALIGNMENT_VERSION.setSection(None) -assignment_DATA_SET_ALIGNMENT_VERSION.setPositionInForms(4) - -assignment_DATA_SET_ALIGNMENT_NOTES = tr.assignPropertyType(data_set_type_ALIGNMENT, prop_type_NOTES) -assignment_DATA_SET_ALIGNMENT_NOTES.setMandatory(False) -assignment_DATA_SET_ALIGNMENT_NOTES.setSection(None) -assignment_DATA_SET_ALIGNMENT_NOTES.setPositionInForms(5) - -assignment_DATA_SET_ALIGNMENT_SAMTOOLS_FLAGSTAT = tr.assignPropertyType(data_set_type_ALIGNMENT, prop_type_SAMTOOLS_FLAGSTAT) -assignment_DATA_SET_ALIGNMENT_SAMTOOLS_FLAGSTAT.setMandatory(False) -assignment_DATA_SET_ALIGNMENT_SAMTOOLS_FLAGSTAT.setSection(None) -assignment_DATA_SET_ALIGNMENT_SAMTOOLS_FLAGSTAT.setPositionInForms(6) - -assignment_DATA_SET_ALIGNMENT_MAPPED_READS = tr.assignPropertyType(data_set_type_ALIGNMENT, prop_type_MAPPED_READS) -assignment_DATA_SET_ALIGNMENT_MAPPED_READS.setMandatory(False) -assignment_DATA_SET_ALIGNMENT_MAPPED_READS.setSection(None) -assignment_DATA_SET_ALIGNMENT_MAPPED_READS.setPositionInForms(7) - -assignment_DATA_SET_ALIGNMENT_TOTAL_READS = tr.assignPropertyType(data_set_type_ALIGNMENT, prop_type_TOTAL_READS) -assignment_DATA_SET_ALIGNMENT_TOTAL_READS.setMandatory(False) -assignment_DATA_SET_ALIGNMENT_TOTAL_READS.setSection(None) -assignment_DATA_SET_ALIGNMENT_TOTAL_READS.setPositionInForms(8) - -assignment_DATA_SET_ALIGNMENT_ISSUED_COMMAND = tr.assignPropertyType(data_set_type_ALIGNMENT, prop_type_ISSUED_COMMAND) -assignment_DATA_SET_ALIGNMENT_ISSUED_COMMAND.setMandatory(False) -assignment_DATA_SET_ALIGNMENT_ISSUED_COMMAND.setSection(None) -assignment_DATA_SET_ALIGNMENT_ISSUED_COMMAND.setPositionInForms(9) - -assignment_DATA_SET_BASECALL_STATS_MISMATCH_IN_INDEX = tr.assignPropertyType(data_set_type_BASECALL_STATS, prop_type_MISMATCH_IN_INDEX) -assignment_DATA_SET_BASECALL_STATS_MISMATCH_IN_INDEX.setMandatory(False) -assignment_DATA_SET_BASECALL_STATS_MISMATCH_IN_INDEX.setSection(None) -assignment_DATA_SET_BASECALL_STATS_MISMATCH_IN_INDEX.setPositionInForms(3) - -assignment_DATA_SET_BIGWIGGLE_NOTES = tr.assignPropertyType(data_set_type_BIGWIGGLE, prop_type_NOTES) -assignment_DATA_SET_BIGWIGGLE_NOTES.setMandatory(False) -assignment_DATA_SET_BIGWIGGLE_NOTES.setSection(None) -assignment_DATA_SET_BIGWIGGLE_NOTES.setPositionInForms(3) - -assignment_DATA_SET_BIGWIGGLE_VERSION = tr.assignPropertyType(data_set_type_BIGWIGGLE, prop_type_VERSION) -assignment_DATA_SET_BIGWIGGLE_VERSION.setMandatory(False) -assignment_DATA_SET_BIGWIGGLE_VERSION.setSection(None) -assignment_DATA_SET_BIGWIGGLE_VERSION.setPositionInForms(4) - -assignment_DATA_SET_BIGWIGGLE_ISCOMPRESSED = tr.assignPropertyType(data_set_type_BIGWIGGLE, prop_type_ISCOMPRESSED) -assignment_DATA_SET_BIGWIGGLE_ISCOMPRESSED.setMandatory(False) -assignment_DATA_SET_BIGWIGGLE_ISCOMPRESSED.setSection(None) -assignment_DATA_SET_BIGWIGGLE_ISCOMPRESSED.setPositionInForms(5) - -assignment_DATA_SET_BIGWIGGLE_ISSWAPPED = tr.assignPropertyType(data_set_type_BIGWIGGLE, prop_type_ISSWAPPED) -assignment_DATA_SET_BIGWIGGLE_ISSWAPPED.setMandatory(False) -assignment_DATA_SET_BIGWIGGLE_ISSWAPPED.setSection(None) -assignment_DATA_SET_BIGWIGGLE_ISSWAPPED.setPositionInForms(6) - -assignment_DATA_SET_BIGWIGGLE_PRIMARYDATASIZE = tr.assignPropertyType(data_set_type_BIGWIGGLE, prop_type_PRIMARYDATASIZE) -assignment_DATA_SET_BIGWIGGLE_PRIMARYDATASIZE.setMandatory(False) -assignment_DATA_SET_BIGWIGGLE_PRIMARYDATASIZE.setSection(None) -assignment_DATA_SET_BIGWIGGLE_PRIMARYDATASIZE.setPositionInForms(7) - -assignment_DATA_SET_BIGWIGGLE_PRIMARYINDEXSIZE = tr.assignPropertyType(data_set_type_BIGWIGGLE, prop_type_PRIMARYINDEXSIZE) -assignment_DATA_SET_BIGWIGGLE_PRIMARYINDEXSIZE.setMandatory(False) -assignment_DATA_SET_BIGWIGGLE_PRIMARYINDEXSIZE.setSection(None) -assignment_DATA_SET_BIGWIGGLE_PRIMARYINDEXSIZE.setPositionInForms(8) - -assignment_DATA_SET_BIGWIGGLE_ZOOMLEVELS = tr.assignPropertyType(data_set_type_BIGWIGGLE, prop_type_ZOOMLEVELS) -assignment_DATA_SET_BIGWIGGLE_ZOOMLEVELS.setMandatory(False) -assignment_DATA_SET_BIGWIGGLE_ZOOMLEVELS.setSection(None) -assignment_DATA_SET_BIGWIGGLE_ZOOMLEVELS.setPositionInForms(9) - -assignment_DATA_SET_BIGWIGGLE_CHROMCOUNT = tr.assignPropertyType(data_set_type_BIGWIGGLE, prop_type_CHROMCOUNT) -assignment_DATA_SET_BIGWIGGLE_CHROMCOUNT.setMandatory(False) -assignment_DATA_SET_BIGWIGGLE_CHROMCOUNT.setSection(None) -assignment_DATA_SET_BIGWIGGLE_CHROMCOUNT.setPositionInForms(10) - -assignment_DATA_SET_BIGWIGGLE_BASESCOVERED = tr.assignPropertyType(data_set_type_BIGWIGGLE, prop_type_BASESCOVERED) -assignment_DATA_SET_BIGWIGGLE_BASESCOVERED.setMandatory(False) -assignment_DATA_SET_BIGWIGGLE_BASESCOVERED.setSection(None) -assignment_DATA_SET_BIGWIGGLE_BASESCOVERED.setPositionInForms(11) - -assignment_DATA_SET_BIGWIGGLE_MEAN = tr.assignPropertyType(data_set_type_BIGWIGGLE, prop_type_MEAN) -assignment_DATA_SET_BIGWIGGLE_MEAN.setMandatory(False) -assignment_DATA_SET_BIGWIGGLE_MEAN.setSection(None) -assignment_DATA_SET_BIGWIGGLE_MEAN.setPositionInForms(12) - -assignment_DATA_SET_BIGWIGGLE_MIN = tr.assignPropertyType(data_set_type_BIGWIGGLE, prop_type_MIN) -assignment_DATA_SET_BIGWIGGLE_MIN.setMandatory(False) -assignment_DATA_SET_BIGWIGGLE_MIN.setSection(None) -assignment_DATA_SET_BIGWIGGLE_MIN.setPositionInForms(13) - -assignment_DATA_SET_BIGWIGGLE_MAX = tr.assignPropertyType(data_set_type_BIGWIGGLE, prop_type_MAX) -assignment_DATA_SET_BIGWIGGLE_MAX.setMandatory(False) -assignment_DATA_SET_BIGWIGGLE_MAX.setSection(None) -assignment_DATA_SET_BIGWIGGLE_MAX.setPositionInForms(14) - -assignment_DATA_SET_BIGWIGGLE_STD = tr.assignPropertyType(data_set_type_BIGWIGGLE, prop_type_STD) -assignment_DATA_SET_BIGWIGGLE_STD.setMandatory(False) -assignment_DATA_SET_BIGWIGGLE_STD.setSection(None) -assignment_DATA_SET_BIGWIGGLE_STD.setPositionInForms(15) - -assignment_DATA_SET_FASTQ_GZ_NOTES = tr.assignPropertyType(data_set_type_FASTQ_GZ, prop_type_NOTES) -assignment_DATA_SET_FASTQ_GZ_NOTES.setMandatory(False) -assignment_DATA_SET_FASTQ_GZ_NOTES.setSection(None) -assignment_DATA_SET_FASTQ_GZ_NOTES.setPositionInForms(3) - -assignment_DATA_SET_FASTQ_GZ_YIELD_MBASES = tr.assignPropertyType(data_set_type_FASTQ_GZ, prop_type_YIELD_MBASES) -assignment_DATA_SET_FASTQ_GZ_YIELD_MBASES.setMandatory(False) -assignment_DATA_SET_FASTQ_GZ_YIELD_MBASES.setSection(None) -assignment_DATA_SET_FASTQ_GZ_YIELD_MBASES.setPositionInForms(4) - -assignment_DATA_SET_FASTQ_GZ_PERCENTAGE_PASSED_FILTERING = tr.assignPropertyType(data_set_type_FASTQ_GZ, prop_type_PERCENTAGE_PASSED_FILTERING) -assignment_DATA_SET_FASTQ_GZ_PERCENTAGE_PASSED_FILTERING.setMandatory(False) -assignment_DATA_SET_FASTQ_GZ_PERCENTAGE_PASSED_FILTERING.setSection(None) -assignment_DATA_SET_FASTQ_GZ_PERCENTAGE_PASSED_FILTERING.setPositionInForms(5) - -assignment_DATA_SET_FASTQ_GZ_BARCODE = tr.assignPropertyType(data_set_type_FASTQ_GZ, prop_type_BARCODE) -assignment_DATA_SET_FASTQ_GZ_BARCODE.setMandatory(False) -assignment_DATA_SET_FASTQ_GZ_BARCODE.setSection(None) -assignment_DATA_SET_FASTQ_GZ_BARCODE.setPositionInForms(6) - -assignment_DATA_SET_FASTQ_GZ_PERCENTAGE_RAW_CLUSTERS_PER_LANE = tr.assignPropertyType(data_set_type_FASTQ_GZ, prop_type_PERCENTAGE_RAW_CLUSTERS_PER_LANE) -assignment_DATA_SET_FASTQ_GZ_PERCENTAGE_RAW_CLUSTERS_PER_LANE.setMandatory(False) -assignment_DATA_SET_FASTQ_GZ_PERCENTAGE_RAW_CLUSTERS_PER_LANE.setSection(None) -assignment_DATA_SET_FASTQ_GZ_PERCENTAGE_RAW_CLUSTERS_PER_LANE.setPositionInForms(7) - -assignment_DATA_SET_FASTQ_GZ_PERCENTAGE_PERFECT_INDEX_READS = tr.assignPropertyType(data_set_type_FASTQ_GZ, prop_type_PERCENTAGE_PERFECT_INDEX_READS) -assignment_DATA_SET_FASTQ_GZ_PERCENTAGE_PERFECT_INDEX_READS.setMandatory(False) -assignment_DATA_SET_FASTQ_GZ_PERCENTAGE_PERFECT_INDEX_READS.setSection(None) -assignment_DATA_SET_FASTQ_GZ_PERCENTAGE_PERFECT_INDEX_READS.setPositionInForms(8) - -assignment_DATA_SET_FASTQ_GZ_PERCENTAGE_ONE_MISMATCH_READS_INDEX = tr.assignPropertyType(data_set_type_FASTQ_GZ, prop_type_PERCENTAGE_ONE_MISMATCH_READS_INDEX) -assignment_DATA_SET_FASTQ_GZ_PERCENTAGE_ONE_MISMATCH_READS_INDEX.setMandatory(False) -assignment_DATA_SET_FASTQ_GZ_PERCENTAGE_ONE_MISMATCH_READS_INDEX.setSection(None) -assignment_DATA_SET_FASTQ_GZ_PERCENTAGE_ONE_MISMATCH_READS_INDEX.setPositionInForms(9) - -assignment_EXPERIMENT_HT_SEQUENCING_EXPERIMENT_DESIGN = tr.assignPropertyType(exp_type_HT_SEQUENCING, prop_type_EXPERIMENT_DESIGN) -assignment_EXPERIMENT_HT_SEQUENCING_EXPERIMENT_DESIGN.setMandatory(False) -assignment_EXPERIMENT_HT_SEQUENCING_EXPERIMENT_DESIGN.setSection(None) -assignment_EXPERIMENT_HT_SEQUENCING_EXPERIMENT_DESIGN.setPositionInForms(3) - -assignment_SAMPLE_ILLUMINA_FLOW_CELL_SEQUENCER = tr.assignPropertyType(samp_type_ILLUMINA_FLOW_CELL, prop_type_SEQUENCER) -assignment_SAMPLE_ILLUMINA_FLOW_CELL_SEQUENCER.setMandatory(False) -assignment_SAMPLE_ILLUMINA_FLOW_CELL_SEQUENCER.setSection(None) -assignment_SAMPLE_ILLUMINA_FLOW_CELL_SEQUENCER.setPositionInForms(4) - -assignment_SAMPLE_ILLUMINA_FLOW_CELL_END_TYPE = tr.assignPropertyType(samp_type_ILLUMINA_FLOW_CELL, prop_type_END_TYPE) -assignment_SAMPLE_ILLUMINA_FLOW_CELL_END_TYPE.setMandatory(False) -assignment_SAMPLE_ILLUMINA_FLOW_CELL_END_TYPE.setSection(None) -assignment_SAMPLE_ILLUMINA_FLOW_CELL_END_TYPE.setPositionInForms(6) - -assignment_SAMPLE_ILLUMINA_FLOW_CELL_FLOW_CELL_SEQUENCED_ON = tr.assignPropertyType(samp_type_ILLUMINA_FLOW_CELL, prop_type_FLOW_CELL_SEQUENCED_ON) -assignment_SAMPLE_ILLUMINA_FLOW_CELL_FLOW_CELL_SEQUENCED_ON.setMandatory(False) -assignment_SAMPLE_ILLUMINA_FLOW_CELL_FLOW_CELL_SEQUENCED_ON.setSection(None) -assignment_SAMPLE_ILLUMINA_FLOW_CELL_FLOW_CELL_SEQUENCED_ON.setPositionInForms(7) - -assignment_SAMPLE_ILLUMINA_FLOW_CELL_SEQUENCER_FINISHED = tr.assignPropertyType(samp_type_ILLUMINA_FLOW_CELL, prop_type_SEQUENCER_FINISHED) -assignment_SAMPLE_ILLUMINA_FLOW_CELL_SEQUENCER_FINISHED.setMandatory(False) -assignment_SAMPLE_ILLUMINA_FLOW_CELL_SEQUENCER_FINISHED.setSection(None) -assignment_SAMPLE_ILLUMINA_FLOW_CELL_SEQUENCER_FINISHED.setPositionInForms(8) - -assignment_SAMPLE_ILLUMINA_FLOW_CELL_ILLUMINA_PIPELINE_VERSION = tr.assignPropertyType(samp_type_ILLUMINA_FLOW_CELL, prop_type_ILLUMINA_PIPELINE_VERSION) -assignment_SAMPLE_ILLUMINA_FLOW_CELL_ILLUMINA_PIPELINE_VERSION.setMandatory(False) -assignment_SAMPLE_ILLUMINA_FLOW_CELL_ILLUMINA_PIPELINE_VERSION.setSection(None) -assignment_SAMPLE_ILLUMINA_FLOW_CELL_ILLUMINA_PIPELINE_VERSION.setPositionInForms(9) - -assignment_SAMPLE_ILLUMINA_FLOW_CELL_CYCLES_REQUESTED_BY_CUSTOMER = tr.assignPropertyType(samp_type_ILLUMINA_FLOW_CELL, prop_type_CYCLES_REQUESTED_BY_CUSTOMER) -assignment_SAMPLE_ILLUMINA_FLOW_CELL_CYCLES_REQUESTED_BY_CUSTOMER.setMandatory(False) -assignment_SAMPLE_ILLUMINA_FLOW_CELL_CYCLES_REQUESTED_BY_CUSTOMER.setSection(None) -assignment_SAMPLE_ILLUMINA_FLOW_CELL_CYCLES_REQUESTED_BY_CUSTOMER.setPositionInForms(10) - -assignment_SAMPLE_ILLUMINA_FLOW_CELL_INDEXREAD = tr.assignPropertyType(samp_type_ILLUMINA_FLOW_CELL, prop_type_INDEXREAD) -assignment_SAMPLE_ILLUMINA_FLOW_CELL_INDEXREAD.setMandatory(False) -assignment_SAMPLE_ILLUMINA_FLOW_CELL_INDEXREAD.setSection(None) -assignment_SAMPLE_ILLUMINA_FLOW_CELL_INDEXREAD.setPositionInForms(11) - -assignment_SAMPLE_ILLUMINA_FLOW_CELL_INDEXREAD2 = tr.assignPropertyType(samp_type_ILLUMINA_FLOW_CELL, prop_type_INDEXREAD2) -assignment_SAMPLE_ILLUMINA_FLOW_CELL_INDEXREAD2.setMandatory(False) -assignment_SAMPLE_ILLUMINA_FLOW_CELL_INDEXREAD2.setSection(None) -assignment_SAMPLE_ILLUMINA_FLOW_CELL_INDEXREAD2.setPositionInForms(12) - -assignment_SAMPLE_ILLUMINA_FLOW_CELL_CONTROL_LANE = tr.assignPropertyType(samp_type_ILLUMINA_FLOW_CELL, prop_type_CONTROL_LANE) -assignment_SAMPLE_ILLUMINA_FLOW_CELL_CONTROL_LANE.setMandatory(False) -assignment_SAMPLE_ILLUMINA_FLOW_CELL_CONTROL_LANE.setSection(None) -assignment_SAMPLE_ILLUMINA_FLOW_CELL_CONTROL_LANE.setPositionInForms(13) - -assignment_SAMPLE_ILLUMINA_FLOW_CELL_FLOWCELLTYPE = tr.assignPropertyType(samp_type_ILLUMINA_FLOW_CELL, prop_type_FLOWCELLTYPE) -assignment_SAMPLE_ILLUMINA_FLOW_CELL_FLOWCELLTYPE.setMandatory(False) -assignment_SAMPLE_ILLUMINA_FLOW_CELL_FLOWCELLTYPE.setSection(None) -assignment_SAMPLE_ILLUMINA_FLOW_CELL_FLOWCELLTYPE.setPositionInForms(14) - -assignment_SAMPLE_ILLUMINA_FLOW_CELL_LANECOUNT = tr.assignPropertyType(samp_type_ILLUMINA_FLOW_CELL, prop_type_LANECOUNT) -assignment_SAMPLE_ILLUMINA_FLOW_CELL_LANECOUNT.setMandatory(False) -assignment_SAMPLE_ILLUMINA_FLOW_CELL_LANECOUNT.setSection(None) -assignment_SAMPLE_ILLUMINA_FLOW_CELL_LANECOUNT.setPositionInForms(15) - -assignment_SAMPLE_ILLUMINA_FLOW_CELL_SURFACECOUNT = tr.assignPropertyType(samp_type_ILLUMINA_FLOW_CELL, prop_type_SURFACECOUNT) -assignment_SAMPLE_ILLUMINA_FLOW_CELL_SURFACECOUNT.setMandatory(False) -assignment_SAMPLE_ILLUMINA_FLOW_CELL_SURFACECOUNT.setSection(None) -assignment_SAMPLE_ILLUMINA_FLOW_CELL_SURFACECOUNT.setPositionInForms(16) - -assignment_SAMPLE_ILLUMINA_FLOW_CELL_SWATHCOUNT = tr.assignPropertyType(samp_type_ILLUMINA_FLOW_CELL, prop_type_SWATHCOUNT) -assignment_SAMPLE_ILLUMINA_FLOW_CELL_SWATHCOUNT.setMandatory(False) -assignment_SAMPLE_ILLUMINA_FLOW_CELL_SWATHCOUNT.setSection(None) -assignment_SAMPLE_ILLUMINA_FLOW_CELL_SWATHCOUNT.setPositionInForms(17) - -assignment_SAMPLE_ILLUMINA_FLOW_CELL_TILECOUNT = tr.assignPropertyType(samp_type_ILLUMINA_FLOW_CELL, prop_type_TILECOUNT) -assignment_SAMPLE_ILLUMINA_FLOW_CELL_TILECOUNT.setMandatory(False) -assignment_SAMPLE_ILLUMINA_FLOW_CELL_TILECOUNT.setSection(None) -assignment_SAMPLE_ILLUMINA_FLOW_CELL_TILECOUNT.setPositionInForms(18) - -assignment_SAMPLE_ILLUMINA_FLOW_CELL_SBS_KIT = tr.assignPropertyType(samp_type_ILLUMINA_FLOW_CELL, prop_type_SBS_KIT) -assignment_SAMPLE_ILLUMINA_FLOW_CELL_SBS_KIT.setMandatory(False) -assignment_SAMPLE_ILLUMINA_FLOW_CELL_SBS_KIT.setSection(None) -assignment_SAMPLE_ILLUMINA_FLOW_CELL_SBS_KIT.setPositionInForms(19) - -assignment_SAMPLE_ILLUMINA_FLOW_CELL_PAIRED_END_KIT = tr.assignPropertyType(samp_type_ILLUMINA_FLOW_CELL, prop_type_PAIRED_END_KIT) -assignment_SAMPLE_ILLUMINA_FLOW_CELL_PAIRED_END_KIT.setMandatory(False) -assignment_SAMPLE_ILLUMINA_FLOW_CELL_PAIRED_END_KIT.setSection(None) -assignment_SAMPLE_ILLUMINA_FLOW_CELL_PAIRED_END_KIT.setPositionInForms(20) - -assignment_SAMPLE_ILLUMINA_FLOW_CELL_ANALYSIS_FINISHED = tr.assignPropertyType(samp_type_ILLUMINA_FLOW_CELL, prop_type_ANALYSIS_FINISHED) -assignment_SAMPLE_ILLUMINA_FLOW_CELL_ANALYSIS_FINISHED.setMandatory(False) -assignment_SAMPLE_ILLUMINA_FLOW_CELL_ANALYSIS_FINISHED.setSection(None) -assignment_SAMPLE_ILLUMINA_FLOW_CELL_ANALYSIS_FINISHED.setPositionInForms(22) - -assignment_SAMPLE_ILLUMINA_FLOW_CELL_NOTES = tr.assignPropertyType(samp_type_ILLUMINA_FLOW_CELL, prop_type_NOTES) -assignment_SAMPLE_ILLUMINA_FLOW_CELL_NOTES.setMandatory(False) -assignment_SAMPLE_ILLUMINA_FLOW_CELL_NOTES.setSection(None) -assignment_SAMPLE_ILLUMINA_FLOW_CELL_NOTES.setPositionInForms(23) - -assignment_SAMPLE_ILLUMINA_FLOW_LANE_DATA_TRANSFERRED = tr.assignPropertyType(samp_type_ILLUMINA_FLOW_LANE, prop_type_DATA_TRANSFERRED) -assignment_SAMPLE_ILLUMINA_FLOW_LANE_DATA_TRANSFERRED.setMandatory(False) -assignment_SAMPLE_ILLUMINA_FLOW_LANE_DATA_TRANSFERRED.setSection(None) -assignment_SAMPLE_ILLUMINA_FLOW_LANE_DATA_TRANSFERRED.setPositionInForms(3) - -assignment_SAMPLE_ILLUMINA_FLOW_LANE_CLUSTER_STATION = tr.assignPropertyType(samp_type_ILLUMINA_FLOW_LANE, prop_type_CLUSTER_STATION) -assignment_SAMPLE_ILLUMINA_FLOW_LANE_CLUSTER_STATION.setMandatory(False) -assignment_SAMPLE_ILLUMINA_FLOW_LANE_CLUSTER_STATION.setSection(None) -assignment_SAMPLE_ILLUMINA_FLOW_LANE_CLUSTER_STATION.setPositionInForms(7) - -assignment_SAMPLE_ILLUMINA_FLOW_LANE_CREATED_ON_CS = tr.assignPropertyType(samp_type_ILLUMINA_FLOW_LANE, prop_type_CREATED_ON_CS) -assignment_SAMPLE_ILLUMINA_FLOW_LANE_CREATED_ON_CS.setMandatory(False) -assignment_SAMPLE_ILLUMINA_FLOW_LANE_CREATED_ON_CS.setSection(None) -assignment_SAMPLE_ILLUMINA_FLOW_LANE_CREATED_ON_CS.setPositionInForms(8) - -assignment_SAMPLE_ILLUMINA_FLOW_LANE_CS_PROTOCOL_VERSION = tr.assignPropertyType(samp_type_ILLUMINA_FLOW_LANE, prop_type_CS_PROTOCOL_VERSION) -assignment_SAMPLE_ILLUMINA_FLOW_LANE_CS_PROTOCOL_VERSION.setMandatory(False) -assignment_SAMPLE_ILLUMINA_FLOW_LANE_CS_PROTOCOL_VERSION.setSection(None) -assignment_SAMPLE_ILLUMINA_FLOW_LANE_CS_PROTOCOL_VERSION.setPositionInForms(9) - -assignment_SAMPLE_ILLUMINA_FLOW_LANE_CLUSTER_GENERATION_KIT_VERSION = tr.assignPropertyType(samp_type_ILLUMINA_FLOW_LANE, prop_type_CLUSTER_GENERATION_KIT_VERSION) -assignment_SAMPLE_ILLUMINA_FLOW_LANE_CLUSTER_GENERATION_KIT_VERSION.setMandatory(False) -assignment_SAMPLE_ILLUMINA_FLOW_LANE_CLUSTER_GENERATION_KIT_VERSION.setSection(None) -assignment_SAMPLE_ILLUMINA_FLOW_LANE_CLUSTER_GENERATION_KIT_VERSION.setPositionInForms(10) - -assignment_SAMPLE_ILLUMINA_FLOW_LANE_CLUSTER_STATION_SOFTWARE_VERSION = tr.assignPropertyType(samp_type_ILLUMINA_FLOW_LANE, prop_type_CLUSTER_STATION_SOFTWARE_VERSION) -assignment_SAMPLE_ILLUMINA_FLOW_LANE_CLUSTER_STATION_SOFTWARE_VERSION.setMandatory(False) -assignment_SAMPLE_ILLUMINA_FLOW_LANE_CLUSTER_STATION_SOFTWARE_VERSION.setSection(None) -assignment_SAMPLE_ILLUMINA_FLOW_LANE_CLUSTER_STATION_SOFTWARE_VERSION.setPositionInForms(11) - -assignment_SAMPLE_ILLUMINA_FLOW_LANE_CONCENTRATION_FLOWLANE = tr.assignPropertyType(samp_type_ILLUMINA_FLOW_LANE, prop_type_CONCENTRATION_FLOWLANE) -assignment_SAMPLE_ILLUMINA_FLOW_LANE_CONCENTRATION_FLOWLANE.setMandatory(False) -assignment_SAMPLE_ILLUMINA_FLOW_LANE_CONCENTRATION_FLOWLANE.setSection(None) -assignment_SAMPLE_ILLUMINA_FLOW_LANE_CONCENTRATION_FLOWLANE.setPositionInForms(12) - -assignment_SAMPLE_ILLUMINA_FLOW_LANE_SCS_PROTOCOL_VERSION = tr.assignPropertyType(samp_type_ILLUMINA_FLOW_LANE, prop_type_SCS_PROTOCOL_VERSION) -assignment_SAMPLE_ILLUMINA_FLOW_LANE_SCS_PROTOCOL_VERSION.setMandatory(False) -assignment_SAMPLE_ILLUMINA_FLOW_LANE_SCS_PROTOCOL_VERSION.setSection(None) -assignment_SAMPLE_ILLUMINA_FLOW_LANE_SCS_PROTOCOL_VERSION.setPositionInForms(13) - -assignment_SAMPLE_ILLUMINA_FLOW_LANE_SBS_SEQUENCING_KIT_VERSION = tr.assignPropertyType(samp_type_ILLUMINA_FLOW_LANE, prop_type_SBS_SEQUENCING_KIT_VERSION) -assignment_SAMPLE_ILLUMINA_FLOW_LANE_SBS_SEQUENCING_KIT_VERSION.setMandatory(False) -assignment_SAMPLE_ILLUMINA_FLOW_LANE_SBS_SEQUENCING_KIT_VERSION.setSection(None) -assignment_SAMPLE_ILLUMINA_FLOW_LANE_SBS_SEQUENCING_KIT_VERSION.setPositionInForms(14) - -assignment_SAMPLE_ILLUMINA_FLOW_LANE_NOTES = tr.assignPropertyType(samp_type_ILLUMINA_FLOW_LANE, prop_type_NOTES) -assignment_SAMPLE_ILLUMINA_FLOW_LANE_NOTES.setMandatory(False) -assignment_SAMPLE_ILLUMINA_FLOW_LANE_NOTES.setSection(None) -assignment_SAMPLE_ILLUMINA_FLOW_LANE_NOTES.setPositionInForms(15) - -assignment_DATA_SET_ILLUMINA_GA_OUTPUT_SAMPLE_KIND = tr.assignPropertyType(data_set_type_ILLUMINA_GA_OUTPUT, prop_type_SAMPLE_KIND) -assignment_DATA_SET_ILLUMINA_GA_OUTPUT_SAMPLE_KIND.setMandatory(False) -assignment_DATA_SET_ILLUMINA_GA_OUTPUT_SAMPLE_KIND.setSection(None) -assignment_DATA_SET_ILLUMINA_GA_OUTPUT_SAMPLE_KIND.setPositionInForms(3) - -assignment_DATA_SET_ILLUMINA_HISEQ_OUTPUT_CASAVA_VERSION = tr.assignPropertyType(data_set_type_ILLUMINA_HISEQ_OUTPUT, prop_type_CASAVA_VERSION) -assignment_DATA_SET_ILLUMINA_HISEQ_OUTPUT_CASAVA_VERSION.setMandatory(False) -assignment_DATA_SET_ILLUMINA_HISEQ_OUTPUT_CASAVA_VERSION.setSection(None) -assignment_DATA_SET_ILLUMINA_HISEQ_OUTPUT_CASAVA_VERSION.setPositionInForms(3) - -assignment_SAMPLE_LIBRARY_BARCODE = tr.assignPropertyType(samp_type_LIBRARY, prop_type_BARCODE) -assignment_SAMPLE_LIBRARY_BARCODE.setMandatory(False) -assignment_SAMPLE_LIBRARY_BARCODE.setSection(None) -assignment_SAMPLE_LIBRARY_BARCODE.setPositionInForms(2) - -assignment_SAMPLE_LIBRARY_INDEX2 = tr.assignPropertyType(samp_type_LIBRARY, prop_type_INDEX2) -assignment_SAMPLE_LIBRARY_INDEX2.setMandatory(False) -assignment_SAMPLE_LIBRARY_INDEX2.setSection(None) -assignment_SAMPLE_LIBRARY_INDEX2.setPositionInForms(3) - -assignment_SAMPLE_LIBRARY_CONCENTRATION_PREPARED_ILLUMINA = tr.assignPropertyType(samp_type_LIBRARY, prop_type_CONCENTRATION_PREPARED_ILLUMINA) -assignment_SAMPLE_LIBRARY_CONCENTRATION_PREPARED_ILLUMINA.setMandatory(False) -assignment_SAMPLE_LIBRARY_CONCENTRATION_PREPARED_ILLUMINA.setSection(None) -assignment_SAMPLE_LIBRARY_CONCENTRATION_PREPARED_ILLUMINA.setPositionInForms(4) - -assignment_SAMPLE_LIBRARY_PREPARED_BY = tr.assignPropertyType(samp_type_LIBRARY, prop_type_PREPARED_BY) -assignment_SAMPLE_LIBRARY_PREPARED_BY.setMandatory(False) -assignment_SAMPLE_LIBRARY_PREPARED_BY.setSection(None) -assignment_SAMPLE_LIBRARY_PREPARED_BY.setPositionInForms(5) - -assignment_SAMPLE_LIBRARY_KIT_PREPARED = tr.assignPropertyType(samp_type_LIBRARY, prop_type_KIT_PREPARED) -assignment_SAMPLE_LIBRARY_KIT_PREPARED.setMandatory(False) -assignment_SAMPLE_LIBRARY_KIT_PREPARED.setSection(None) -assignment_SAMPLE_LIBRARY_KIT_PREPARED.setPositionInForms(6) - -assignment_SAMPLE_LIBRARY_KIT = tr.assignPropertyType(samp_type_LIBRARY, prop_type_KIT) -assignment_SAMPLE_LIBRARY_KIT.setMandatory(False) -assignment_SAMPLE_LIBRARY_KIT.setSection(None) -assignment_SAMPLE_LIBRARY_KIT.setPositionInForms(7) - -assignment_SAMPLE_LIBRARY_LOT = tr.assignPropertyType(samp_type_LIBRARY, prop_type_LOT) -assignment_SAMPLE_LIBRARY_LOT.setMandatory(False) -assignment_SAMPLE_LIBRARY_LOT.setSection(None) -assignment_SAMPLE_LIBRARY_LOT.setPositionInForms(8) - -assignment_SAMPLE_LIBRARY_STARTING_AMOUNT_OF_SAMPLE_IN_NG = tr.assignPropertyType(samp_type_LIBRARY, prop_type_STARTING_AMOUNT_OF_SAMPLE_IN_NG) -assignment_SAMPLE_LIBRARY_STARTING_AMOUNT_OF_SAMPLE_IN_NG.setMandatory(False) -assignment_SAMPLE_LIBRARY_STARTING_AMOUNT_OF_SAMPLE_IN_NG.setSection(None) -assignment_SAMPLE_LIBRARY_STARTING_AMOUNT_OF_SAMPLE_IN_NG.setPositionInForms(9) - -assignment_SAMPLE_LIBRARY_DNA_CONCENTRATION_OF_LIBRARY = tr.assignPropertyType(samp_type_LIBRARY, prop_type_DNA_CONCENTRATION_OF_LIBRARY) -assignment_SAMPLE_LIBRARY_DNA_CONCENTRATION_OF_LIBRARY.setMandatory(False) -assignment_SAMPLE_LIBRARY_DNA_CONCENTRATION_OF_LIBRARY.setSection(None) -assignment_SAMPLE_LIBRARY_DNA_CONCENTRATION_OF_LIBRARY.setPositionInForms(10) - -assignment_SAMPLE_LIBRARY_NANO_DROP = tr.assignPropertyType(samp_type_LIBRARY, prop_type_NANO_DROP) -assignment_SAMPLE_LIBRARY_NANO_DROP.setMandatory(False) -assignment_SAMPLE_LIBRARY_NANO_DROP.setSection(None) -assignment_SAMPLE_LIBRARY_NANO_DROP.setPositionInForms(11) - -assignment_SAMPLE_LIBRARY_AGILENT_KIT = tr.assignPropertyType(samp_type_LIBRARY, prop_type_AGILENT_KIT) -assignment_SAMPLE_LIBRARY_AGILENT_KIT.setMandatory(False) -assignment_SAMPLE_LIBRARY_AGILENT_KIT.setSection(None) -assignment_SAMPLE_LIBRARY_AGILENT_KIT.setPositionInForms(12) - -assignment_SAMPLE_LIBRARY_LIBRARY_PROCESSING_SUCCESSFUL = tr.assignPropertyType(samp_type_LIBRARY, prop_type_LIBRARY_PROCESSING_SUCCESSFUL) -assignment_SAMPLE_LIBRARY_LIBRARY_PROCESSING_SUCCESSFUL.setMandatory(False) -assignment_SAMPLE_LIBRARY_LIBRARY_PROCESSING_SUCCESSFUL.setSection(None) -assignment_SAMPLE_LIBRARY_LIBRARY_PROCESSING_SUCCESSFUL.setPositionInForms(13) - -assignment_SAMPLE_LIBRARY_DATA_TRANSFERRED = tr.assignPropertyType(samp_type_LIBRARY, prop_type_DATA_TRANSFERRED) -assignment_SAMPLE_LIBRARY_DATA_TRANSFERRED.setMandatory(False) -assignment_SAMPLE_LIBRARY_DATA_TRANSFERRED.setSection(None) -assignment_SAMPLE_LIBRARY_DATA_TRANSFERRED.setPositionInForms(14) - -assignment_SAMPLE_LIBRARY_INVOICE = tr.assignPropertyType(samp_type_LIBRARY, prop_type_INVOICE) -assignment_SAMPLE_LIBRARY_INVOICE.setMandatory(False) -assignment_SAMPLE_LIBRARY_INVOICE.setSection(None) -assignment_SAMPLE_LIBRARY_INVOICE.setPositionInForms(15) - -assignment_SAMPLE_LIBRARY_NOTES = tr.assignPropertyType(samp_type_LIBRARY, prop_type_NOTES) -assignment_SAMPLE_LIBRARY_NOTES.setMandatory(False) -assignment_SAMPLE_LIBRARY_NOTES.setSection(None) -assignment_SAMPLE_LIBRARY_NOTES.setPositionInForms(16) - -assignment_DATA_SET_MACS_OUTPUT_MACS_VERSION = tr.assignPropertyType(data_set_type_MACS_OUTPUT, prop_type_MACS_VERSION) -assignment_DATA_SET_MACS_OUTPUT_MACS_VERSION.setMandatory(False) -assignment_DATA_SET_MACS_OUTPUT_MACS_VERSION.setSection(None) -assignment_DATA_SET_MACS_OUTPUT_MACS_VERSION.setPositionInForms(3) - -assignment_DATA_SET_MACS_OUTPUT_NOTES = tr.assignPropertyType(data_set_type_MACS_OUTPUT, prop_type_NOTES) -assignment_DATA_SET_MACS_OUTPUT_NOTES.setMandatory(False) -assignment_DATA_SET_MACS_OUTPUT_NOTES.setSection(None) -assignment_DATA_SET_MACS_OUTPUT_NOTES.setPositionInForms(4) - -assignment_SAMPLE_MASTER_CONTACT_PERSON_NAME = tr.assignPropertyType(samp_type_MASTER, prop_type_CONTACT_PERSON_NAME) -assignment_SAMPLE_MASTER_CONTACT_PERSON_NAME.setMandatory(False) -assignment_SAMPLE_MASTER_CONTACT_PERSON_NAME.setSection(None) -assignment_SAMPLE_MASTER_CONTACT_PERSON_NAME.setPositionInForms(2) - -assignment_SAMPLE_MASTER_CONTACT_PERSON_EMAIL = tr.assignPropertyType(samp_type_MASTER, prop_type_CONTACT_PERSON_EMAIL) -assignment_SAMPLE_MASTER_CONTACT_PERSON_EMAIL.setMandatory(False) -assignment_SAMPLE_MASTER_CONTACT_PERSON_EMAIL.setSection(None) -assignment_SAMPLE_MASTER_CONTACT_PERSON_EMAIL.setPositionInForms(3) - -assignment_SAMPLE_MASTER_PRINCIPAL_INVESTIGATOR_NAME = tr.assignPropertyType(samp_type_MASTER, prop_type_PRINCIPAL_INVESTIGATOR_NAME) -assignment_SAMPLE_MASTER_PRINCIPAL_INVESTIGATOR_NAME.setMandatory(False) -assignment_SAMPLE_MASTER_PRINCIPAL_INVESTIGATOR_NAME.setSection(None) -assignment_SAMPLE_MASTER_PRINCIPAL_INVESTIGATOR_NAME.setPositionInForms(4) - -assignment_SAMPLE_MASTER_PRINCIPAL_INVESTIGATOR_EMAIL = tr.assignPropertyType(samp_type_MASTER, prop_type_PRINCIPAL_INVESTIGATOR_EMAIL) -assignment_SAMPLE_MASTER_PRINCIPAL_INVESTIGATOR_EMAIL.setMandatory(False) -assignment_SAMPLE_MASTER_PRINCIPAL_INVESTIGATOR_EMAIL.setSection(None) -assignment_SAMPLE_MASTER_PRINCIPAL_INVESTIGATOR_EMAIL.setPositionInForms(5) - -assignment_SAMPLE_MASTER_EXTERNAL_SAMPLE_NAME = tr.assignPropertyType(samp_type_MASTER, prop_type_EXTERNAL_SAMPLE_NAME) -assignment_SAMPLE_MASTER_EXTERNAL_SAMPLE_NAME.setMandatory(False) -assignment_SAMPLE_MASTER_EXTERNAL_SAMPLE_NAME.setSection(None) -assignment_SAMPLE_MASTER_EXTERNAL_SAMPLE_NAME.setPositionInForms(6) - -assignment_SAMPLE_MASTER_BIOLOGICAL_SAMPLE_ARRIVED = tr.assignPropertyType(samp_type_MASTER, prop_type_BIOLOGICAL_SAMPLE_ARRIVED) -assignment_SAMPLE_MASTER_BIOLOGICAL_SAMPLE_ARRIVED.setMandatory(False) -assignment_SAMPLE_MASTER_BIOLOGICAL_SAMPLE_ARRIVED.setSection(None) -assignment_SAMPLE_MASTER_BIOLOGICAL_SAMPLE_ARRIVED.setPositionInForms(7) - -assignment_SAMPLE_MASTER_SAMPLE_KIND = tr.assignPropertyType(samp_type_MASTER, prop_type_SAMPLE_KIND) -assignment_SAMPLE_MASTER_SAMPLE_KIND.setMandatory(False) -assignment_SAMPLE_MASTER_SAMPLE_KIND.setSection(None) -assignment_SAMPLE_MASTER_SAMPLE_KIND.setPositionInForms(8) - -assignment_SAMPLE_MASTER_SEQUENCING_APPLICATION = tr.assignPropertyType(samp_type_MASTER, prop_type_SEQUENCING_APPLICATION) -assignment_SAMPLE_MASTER_SEQUENCING_APPLICATION.setMandatory(False) -assignment_SAMPLE_MASTER_SEQUENCING_APPLICATION.setSection(None) -assignment_SAMPLE_MASTER_SEQUENCING_APPLICATION.setPositionInForms(9) - -assignment_SAMPLE_MASTER_NCBI_ORGANISM_TAXONOMY = tr.assignPropertyType(samp_type_MASTER, prop_type_NCBI_ORGANISM_TAXONOMY) -assignment_SAMPLE_MASTER_NCBI_ORGANISM_TAXONOMY.setMandatory(False) -assignment_SAMPLE_MASTER_NCBI_ORGANISM_TAXONOMY.setSection(None) -assignment_SAMPLE_MASTER_NCBI_ORGANISM_TAXONOMY.setPositionInForms(10) - -assignment_SAMPLE_RAW_CONCENTRATION_ORIGINAL_ILLUMINA = tr.assignPropertyType(samp_type_RAW, prop_type_CONCENTRATION_ORIGINAL_ILLUMINA) -assignment_SAMPLE_RAW_CONCENTRATION_ORIGINAL_ILLUMINA.setMandatory(False) -assignment_SAMPLE_RAW_CONCENTRATION_ORIGINAL_ILLUMINA.setSection(None) -assignment_SAMPLE_RAW_CONCENTRATION_ORIGINAL_ILLUMINA.setPositionInForms(2) - -assignment_SAMPLE_RAW_CYCLES_REQUESTED_BY_CUSTOMER = tr.assignPropertyType(samp_type_RAW, prop_type_CYCLES_REQUESTED_BY_CUSTOMER) -assignment_SAMPLE_RAW_CYCLES_REQUESTED_BY_CUSTOMER.setMandatory(False) -assignment_SAMPLE_RAW_CYCLES_REQUESTED_BY_CUSTOMER.setSection(None) -assignment_SAMPLE_RAW_CYCLES_REQUESTED_BY_CUSTOMER.setPositionInForms(3) - -assignment_SAMPLE_RAW_LIBRARY_PROCESSING_POSSIBLE = tr.assignPropertyType(samp_type_RAW, prop_type_LIBRARY_PROCESSING_POSSIBLE) -assignment_SAMPLE_RAW_LIBRARY_PROCESSING_POSSIBLE.setMandatory(False) -assignment_SAMPLE_RAW_LIBRARY_PROCESSING_POSSIBLE.setSection(None) -assignment_SAMPLE_RAW_LIBRARY_PROCESSING_POSSIBLE.setPositionInForms(4) - -assignment_SAMPLE_RAW_PREPARED_BY = tr.assignPropertyType(samp_type_RAW, prop_type_PREPARED_BY) -assignment_SAMPLE_RAW_PREPARED_BY.setMandatory(False) -assignment_SAMPLE_RAW_PREPARED_BY.setSection(None) -assignment_SAMPLE_RAW_PREPARED_BY.setPositionInForms(5) - -assignment_SAMPLE_RAW_KIT_PREPARED = tr.assignPropertyType(samp_type_RAW, prop_type_KIT_PREPARED) -assignment_SAMPLE_RAW_KIT_PREPARED.setMandatory(False) -assignment_SAMPLE_RAW_KIT_PREPARED.setSection(None) -assignment_SAMPLE_RAW_KIT_PREPARED.setPositionInForms(6) - -assignment_SAMPLE_RAW_INVOICE = tr.assignPropertyType(samp_type_RAW, prop_type_INVOICE) -assignment_SAMPLE_RAW_INVOICE.setMandatory(False) -assignment_SAMPLE_RAW_INVOICE.setSection(None) -assignment_SAMPLE_RAW_INVOICE.setPositionInForms(7) - -assignment_SAMPLE_RAW_NOTES = tr.assignPropertyType(samp_type_RAW, prop_type_NOTES) -assignment_SAMPLE_RAW_NOTES.setMandatory(False) -assignment_SAMPLE_RAW_NOTES.setSection(None) -assignment_SAMPLE_RAW_NOTES.setPositionInForms(8) diff --git a/deep_sequencing_unit/source/core-plugins/illumina-ngs/1/dss/data-sources/.gitignore b/deep_sequencing_unit/source/core-plugins/illumina-ngs/1/dss/data-sources/.gitignore deleted file mode 100644 index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..0000000000000000000000000000000000000000 diff --git a/deep_sequencing_unit/source/core-plugins/illumina-ngs/1/dss/drop-boxes/create-flowcell-dropbox/create-flowcell-dropbox.py b/deep_sequencing_unit/source/core-plugins/illumina-ngs/1/dss/drop-boxes/create-flowcell-dropbox/create-flowcell-dropbox.py deleted file mode 100755 index 9b7f600f561382c7cae1cb15e101a614c23086c7..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/source/core-plugins/illumina-ngs/1/dss/drop-boxes/create-flowcell-dropbox/create-flowcell-dropbox.py +++ /dev/null @@ -1,195 +0,0 @@ -''' -@copyright: -2012 ETH Zuerich, CISD - -@license: -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - -http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. - -@description: -Parses the two Illumina provided files 'runParameters.xml' and 'RunInfo.xml' -and creates one Sample of type 'ILLUMINA_FLOW_CELL' and sets Sample properties -from those two XML files. Additionally the number of lanes are read out and -are created as contained samples of type 'ILLUMINA_FLOW_LANE'. - -@note: -print statements go to: <openBIS_HOME>/datastore_server/log/startup_log.txt -expected incoming Name for HiSeq runs: 110715_SN792_0054_BC035RACXX -expected incoming Name for GAII runs: 110812_6353WAAXX - -@author: -Manuel Kohler -''' - -import os -import shutil -from time import * -from datetime import * -import xml.etree.ElementTree as etree -from ch.systemsx.cisd.openbis.generic.shared.api.v1.dto import SearchCriteria - -IS_HISEQ_RUN=False -RUNPARAMETERS = 'runParameters.xml' -RUNINFO = 'RunInfo.xml' -FLOWCELL_SPACE='TEST' -FLOWCELL_PROJECT='TEST-PROJECT' -EXPERIMENT_TYPE_CODE='HT_SEQUENCING' - -FLOWCELL_PROJECT_ID = "/%(FLOWCELL_SPACE)s/%(FLOWCELL_PROJECT)s" % vars() - -# Mapping between XML file naming and used in here -RUNPARAMETERS_XML = {'FLOWCELL':'Flowcell', 'RTAVERSION':'RTAVersion', - 'CONTROLLANE':'ControlLane', 'SBS':'Sbs', 'INDEX':'Index', - 'CYCLES_REQUESTED_BY_CUSTOMER':'Read1', 'PE':'Pe'} -RUNINFO_XML = {'LANECOUNT':'LaneCount', 'SURFACECOUNT':'SurfaceCount', - 'SWATHCOUNT':'SwathCount', 'TILECOUNT':'TileCount'} -INSTRUMENT = {'SN792':'HISEQ2500'} - -class parseXmlFile: - - def __init__(self, xmlFile): - self.xmlFile = xmlFile - self.tree = etree.parse(self.xmlFile) - self.root = self.tree.getroot() - - def getXmlElement (self, elementName): - ''' - Returns the text value of a given XML element - ''' - for e in self.root.getchildren(): - element = e.find(elementName) - if element is None: - return 'None' - else: - return element.text - - def getAllchildren (self, elementName): - ''' - finds all children of a given XML Element and returns them as list - ''' - for e in self.root.getchildren(): - # the '//' means look recursively for all children not only direct ones - childList = self.tree.findall('//' + elementName) - return childList - -# ----------------------------------------------------------------------------- - -def create_openbis_timestamp (): - ''' - Create an openBIS conform timestamp - ''' - tz=localtime()[3]-gmtime()[3] - d=datetime.now() - return d.strftime("%Y-%m-%d %H:%M:%S GMT"+"%+.2d" % tz+":00") - -# ----------------------------------------------------------------------------- - -def registerFlowLane(transaction, a_lane, name, newFlowCell): - ''' - Registers a new Flow lane - ''' - newFlowLane = transaction.createNewSample('/' + FLOWCELL_SPACE + '/' + name + ':' + str(a_lane), "ILLUMINA_FLOW_LANE") - newFlowLane.setContainer(newFlowCell) - -# ----------------------------------------------------------------------------- - -def process(transaction): - - incoming = transaction.getIncoming() - incomingPath = incoming.getAbsolutePath() - - # Get the incoming name - name = incoming.getName() - - split=name.split("_") - if (len(split) == 4): - IS_HISEQ_RUN=True - if (len(split) == 2): - pass - - # Search for the sample and check if there is already sample with this name - search_service = transaction.getSearchService() - sc = SearchCriteria() - sc.addMatchClause(SearchCriteria.MatchClause.createAttributeMatch(SearchCriteria.MatchClauseAttribute.CODE, name)); - foundSamples = search_service.searchForSamples(sc) - if foundSamples.size() > 0: - raise NameError('Already found a Flow Cell with the following name: '+ name) - - # Parse the RunInfo.xml file - runInfo = parseXmlFile(incomingPath + '/' + RUNINFO) - - # Create a new Flow Cell and set the experiment - project = transaction.getProject(FLOWCELL_PROJECT_ID) - if project == None: - space = transaction.getSpace(FLOWCELL_SPACE) - if space == None: - space = transaction.createNewSpace(FLOWCELL_SPACE, None) - space.setDescription("A test space") - project = transaction.createNewProject(FLOWCELL_PROJECT_ID) - project.setDescription("A demo project") - expID = FLOWCELL_PROJECT_ID + '/' + datetime.now().strftime("%Y.%m") - exp = transaction.getExperiment(expID) - if exp == None: - exp = transaction.createNewExperiment(expID, EXPERIMENT_TYPE_CODE) - newFlowCell = transaction.createNewSample('/' + FLOWCELL_SPACE + '/' + name, "ILLUMINA_FLOW_CELL") - newFlowCell.setExperiment(exp) - - if IS_HISEQ_RUN: - run = runInfo.getAllchildren('Run')[0].attrib - if (run['Id'] != name): - raise NameError('Flowcell names do not match between directory name '+ name + - ' and ' + RUNINFO + 'property file: ' + run['Id']) - - # The HiSeq is providing more infos, which we will parse here: - runParameters = parseXmlFile(incomingPath + '/' + RUNPARAMETERS) - - newFlowCell.setPropertyValue("ILLUMINA_PIPELINE_VERSION", runParameters.getXmlElement(RUNPARAMETERS_XML['RTAVERSION'])) - newFlowCell.setPropertyValue("FLOWCELLTYPE", runParameters.getXmlElement(RUNPARAMETERS_XML['FLOWCELL'])) - newFlowCell.setPropertyValue("CONTROL_LANE", runParameters.getXmlElement(RUNPARAMETERS_XML['CONTROLLANE'])) - newFlowCell.setPropertyValue("SBS_KIT", runParameters.getXmlElement(RUNPARAMETERS_XML['SBS'])) - - read1 = runParameters.getAllchildren('Read1') - newFlowCell.setPropertyValue("CYCLES_REQUESTED_BY_CUSTOMER", read1[0].text) - - read2 = runParameters.getAllchildren('Read2') - if (str(read2[0].text) == '0'): - newFlowCell.setPropertyValue("END_TYPE", "SINGLE_READ") - else: - newFlowCell.setPropertyValue("END_TYPE", "PAIRED_END") - newFlowCell.setPropertyValue("PAIRED_END_KIT", runParameters.getXmlElement(RUNPARAMETERS_XML['PE'])) - - indexRead1 = runParameters.getAllchildren('IndexRead1') - newFlowCell.setPropertyValue("INDEXREAD", indexRead1[0].text) - - indexRead2 = runParameters.getAllchildren('IndexRead2') - newFlowCell.setPropertyValue("INDEXREAD2", indexRead2[0].text) - - def setFcProperty(searchId, dict): - children = runInfo.getAllchildren(searchId) - for element in (dict): - if (element <> '') and (dict[element] <> ''): - newFlowCell.setPropertyValue(element, children[0].attrib[dict[element]]) - - setFcProperty('FlowcellLayout', RUNINFO_XML) - - sequencer = runInfo.getAllchildren('Instrument') - newFlowCell.setPropertyValue("SEQUENCER", INSTRUMENT[sequencer[0].text]) - - newFlowCell.setPropertyValue("FLOW_CELL_SEQUENCED_ON", create_openbis_timestamp()) - if IS_HISEQ_RUN: - maxLanes = runInfo.getAllchildren('FlowcellLayout')[0].attrib[RUNINFO_XML['LANECOUNT']] - else: - maxLanes = len(runInfo.getAllchildren('Tiles')[0]) - - [registerFlowLane(transaction, lane, name, newFlowCell) for lane in range(1,int(maxLanes)+1)] - - shutil.rmtree(incomingPath) diff --git a/deep_sequencing_unit/source/core-plugins/illumina-ngs/1/dss/drop-boxes/create-flowcell-dropbox/plugin.properties b/deep_sequencing_unit/source/core-plugins/illumina-ngs/1/dss/drop-boxes/create-flowcell-dropbox/plugin.properties deleted file mode 100644 index 9480a66c84c38984df15ad5e4db32cb15c5a88c0..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/source/core-plugins/illumina-ngs/1/dss/drop-boxes/create-flowcell-dropbox/plugin.properties +++ /dev/null @@ -1,12 +0,0 @@ -# -# Drop box for creating a flow cell based on runParameters.xml and RunInfo.xml created by an -# Illumina HiSeq -# -# Variables: -# incoming-root-dir -# Path to the directory which contains incoming directories for drop boxes. -incoming-dir = ${incoming-root-dir}/incoming-create-flowcell -incoming-data-completeness-condition = auto-detection -top-level-data-set-handler = ch.systemsx.cisd.etlserver.registrator.api.v2.JythonTopLevelDataSetHandlerV2 -script-path = create-flowcell-dropbox.py -storage-processor = ch.systemsx.cisd.etlserver.DefaultStorageProcessor diff --git a/deep_sequencing_unit/source/core-plugins/illumina-ngs/1/dss/drop-boxes/create-flowcell-hiseq/create-flowcell-hiseq.py b/deep_sequencing_unit/source/core-plugins/illumina-ngs/1/dss/drop-boxes/create-flowcell-hiseq/create-flowcell-hiseq.py deleted file mode 100644 index a63f60f88c06e93d7f9acaea991ec988d2940467..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/source/core-plugins/illumina-ngs/1/dss/drop-boxes/create-flowcell-hiseq/create-flowcell-hiseq.py +++ /dev/null @@ -1,194 +0,0 @@ -''' -@copyright: -2012 ETH Zuerich, CISD - -@license: -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - -http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. - -@description: -Parses the two Illumina provided files 'runParameters.xml' and 'RunInfo.xml' -and creates one Sample of type 'ILLUMINA_FLOW_CELL' and sets Sample properties -from those two XML files. Additionally the number of lanes are read out and -are created as contained samples of type 'ILLUMINA_FLOW_LANE'. - -@note: -print statements go to: <openBIS_HOME>/datastore_server/log/startup_log.txt -expected incoming Name for HiSeq runs: 110715_SN792_0054_BC035RACXX -expected incoming Name for GAII runs: 110812_6353WAAXX - -@author: -Manuel Kohler -''' - -import os -import shutil -from time import * -from datetime import * -import xml.etree.ElementTree as etree -from ch.systemsx.cisd.openbis.generic.shared.api.v1.dto import SearchCriteria - -IS_HISEQ_RUN=False -RUNPARAMETERS = 'runParameters.xml' -RUNINFO = 'RunInfo.xml' -FLOWCELL_SPACE='BSSE_FLOWCELLS' -FLOWCELL_PROJECT='FLOWCELLS' -EXPERIMENT_TYPE_CODE='HT_SEQUENCING' - -FLOWCELL_PROJECT_ID = "/%(FLOWCELL_SPACE)s/%(FLOWCELL_PROJECT)s" % vars() - -# Mapping between XML file naming and used in here -RUNPARAMETERS_XML = {'FLOWCELL':'Flowcell', 'RTAVERSION':'RTAVersion', - 'CONTROLLANE':'ControlLane', 'SBS':'Sbs', 'INDEX':'Index', - 'CYCLES_REQUESTED_BY_CUSTOMER':'Read1', 'PE':'Pe'} -RUNINFO_XML = {'LANECOUNT':'LaneCount', 'SURFACECOUNT':'SurfaceCount', - 'SWATHCOUNT':'SwathCount', 'TILECOUNT':'TileCount'} - -class parseXmlFile: - - def __init__(self, xmlFile): - self.xmlFile = xmlFile - self.tree = etree.parse(self.xmlFile) - self.root = self.tree.getroot() - - def getXmlElement (self, elementName): - ''' - Returns the text value of a given XML element - ''' - for e in self.root.getchildren(): - element = e.find(elementName) - if element is None: - return 'None' - else: - return element.text - - def getAllchildren (self, elementName): - ''' - finds all children of a given XML Element and returns them as list - ''' - for e in self.root.getchildren(): - # the '//' means look recursively for all children not only direct ones - childList = self.tree.findall('//' + elementName) - return childList - -# ----------------------------------------------------------------------------- - -def create_openbis_timestamp (): - ''' - Create an openBIS conform timestamp - ''' - tz=localtime()[3]-gmtime()[3] - d=datetime.now() - return d.strftime("%Y-%m-%d %H:%M:%S GMT"+"%+.2d" % tz+":00") - -# ----------------------------------------------------------------------------- - -def registerFlowLane(transaction, a_lane, name, newFlowCell): - ''' - Registers a new Flow lane - ''' - newFlowLane = transaction.createNewSample('/' + FLOWCELL_SPACE + '/' + name + ':' + str(a_lane), "ILLUMINA_FLOW_LANE") - newFlowLane.setContainer(newFlowCell) - -# ----------------------------------------------------------------------------- - -def process(transaction): - - incoming = transaction.getIncoming() - incomingPath = incoming.getAbsolutePath() - - # Get the incoming name - name = incoming.getName() - - split=name.split("_") - if (len(split) == 4): - IS_HISEQ_RUN=True - if (len(split) == 2): - pass - - # Search for the sample and check if there is already sample with this name - search_service = transaction.getSearchService() - sc = SearchCriteria() - sc.addMatchClause(SearchCriteria.MatchClause.createAttributeMatch(SearchCriteria.MatchClauseAttribute.CODE, name)); - foundSamples = search_service.searchForSamples(sc) - if foundSamples.size() > 0: - raise NameError('Already found a Flow Cell with the following name: '+ name) - - # Parse the RunInfo.xml file - runInfo = parseXmlFile(incomingPath + '/' + RUNINFO) - - # Create a new Flow Cell and set the experiment - project = transaction.getProject(FLOWCELL_PROJECT_ID) - if project == None: - space = transaction.getSpace(FLOWCELL_SPACE) - if space == None: - space = transaction.createNewSpace(FLOWCELL_SPACE, None) - space.setDescription("A test space") - project = transaction.createNewProject(FLOWCELL_PROJECT_ID) - project.setDescription("A demo project") - expID = FLOWCELL_PROJECT_ID + '/' + datetime.now().strftime("%Y.%m") - exp = transaction.getExperiment(expID) - if exp == None: - exp = transaction.createNewExperiment(expID, EXPERIMENT_TYPE_CODE) - newFlowCell = transaction.createNewSample('/' + FLOWCELL_SPACE + '/' + name, "ILLUMINA_FLOW_CELL") - newFlowCell.setExperiment(exp) - - if IS_HISEQ_RUN: - run = runInfo.getAllchildren('Run')[0].attrib - if (run['Id'] != name): - raise NameError('Flowcell names do not match between directory name '+ name + - ' and ' + RUNINFO + 'property file: ' + run['Id']) - - # The HiSeq is providing more infos, which we will parse here: - runParameters = parseXmlFile(incomingPath + '/' + RUNPARAMETERS) - - newFlowCell.setPropertyValue("ILLUMINA_PIPELINE_VERSION", runParameters.getXmlElement(RUNPARAMETERS_XML['RTAVERSION'])) - newFlowCell.setPropertyValue("FLOWCELLTYPE", runParameters.getXmlElement(RUNPARAMETERS_XML['FLOWCELL'])) - newFlowCell.setPropertyValue("CONTROL_LANE", runParameters.getXmlElement(RUNPARAMETERS_XML['CONTROLLANE'])) - newFlowCell.setPropertyValue("SBS_KIT", runParameters.getXmlElement(RUNPARAMETERS_XML['SBS'])) - - read1 = runParameters.getAllchildren('Read1') - newFlowCell.setPropertyValue("CYCLES_REQUESTED_BY_CUSTOMER", read1[0].text) - - read2 = runParameters.getAllchildren('Read2') - if (str(read2[0].text) == '0'): - newFlowCell.setPropertyValue("END_TYPE", "SINGLE_READ") - else: - newFlowCell.setPropertyValue("END_TYPE", "PAIRED_END") - newFlowCell.setPropertyValue("PAIRED_END_KIT", runParameters.getXmlElement(RUNPARAMETERS_XML['PE'])) - - indexRead1 = runParameters.getAllchildren('IndexRead1') - newFlowCell.setPropertyValue("INDEXREAD", indexRead1[0].text) - - indexRead2 = runParameters.getAllchildren('IndexRead2') - newFlowCell.setPropertyValue("INDEXREAD2", indexRead2[0].text) - - def setFcProperty(searchId, dict): - children = runInfo.getAllchildren(searchId) - for element in (dict): - if (element <> '') and (dict[element] <> ''): - newFlowCell.setPropertyValue(element, children[0].attrib[dict[element]]) - - setFcProperty('FlowcellLayout', RUNINFO_XML) - - sequencer = runInfo.getAllchildren('Instrument') - newFlowCell.setPropertyValue("SEQUENCER", sequencer[0].text) - - newFlowCell.setPropertyValue("FLOW_CELL_SEQUENCED_ON", create_openbis_timestamp()) - if IS_HISEQ_RUN: - maxLanes = runInfo.getAllchildren('FlowcellLayout')[0].attrib[RUNINFO_XML['LANECOUNT']] - else: - maxLanes = len(runInfo.getAllchildren('Tiles')[0]) - - [registerFlowLane(transaction, lane, name, newFlowCell) for lane in range(1,int(maxLanes)+1)] - - shutil.rmtree(incomingPath) diff --git a/deep_sequencing_unit/source/core-plugins/illumina-ngs/1/dss/drop-boxes/create-flowcell-hiseq/plugin.properties b/deep_sequencing_unit/source/core-plugins/illumina-ngs/1/dss/drop-boxes/create-flowcell-hiseq/plugin.properties deleted file mode 100644 index 5c56666b206b67339b5155b80f2d5812c1ac34b0..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/source/core-plugins/illumina-ngs/1/dss/drop-boxes/create-flowcell-hiseq/plugin.properties +++ /dev/null @@ -1,12 +0,0 @@ -# -# Drop box for creating a flow cell based on runParameters.xml and RunInfo.xml created by an -# Illumina HiSeq -# -# Variables: -# incoming-root-dir -# Path to the directory which contains incoming directories for drop boxes. -incoming-dir = ${incoming-root-dir}/create-flowcell-hiseq -incoming-data-completeness-condition = marker-file -top-level-data-set-handler = ch.systemsx.cisd.etlserver.registrator.api.v2.JythonTopLevelDataSetHandlerV2 -script-path = create-flowcell-hiseq.py -storage-processor = ch.systemsx.cisd.etlserver.DefaultStorageProcessor diff --git a/deep_sequencing_unit/source/core-plugins/illumina-ngs/1/dss/drop-boxes/create-flowcell-miseq/create-flow-cell-miseq.py b/deep_sequencing_unit/source/core-plugins/illumina-ngs/1/dss/drop-boxes/create-flowcell-miseq/create-flow-cell-miseq.py deleted file mode 100755 index 6188431519df407b9b7749b2a0a4c8d4f58a26ed..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/source/core-plugins/illumina-ngs/1/dss/drop-boxes/create-flowcell-miseq/create-flow-cell-miseq.py +++ /dev/null @@ -1,199 +0,0 @@ -''' -@copyright: -2012 ETH Zuerich, CISD - -@license: -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - -http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. - -@description: -Parses the two Illumina provided files 'RunParameters.xml' and 'RunInfo.xml' -and creates one Sample of type 'ILLUMINA_FLOW_CELL' and sets Sample properties -from those two XML files. Additionally the number of lanes are read out and -are created as contained samples of type 'ILLUMINA_FLOW_LANE'. - -@note: -print statements go to: <openBIS_HOME>/datastore_server/log/startup_log.txt -expected incoming Name for MiSeq runs: 120726_M00721_0011_A000000000-A1FVF - -@author: -Manuel Kohler -''' - -import os -import shutil -from time import * -from datetime import * -import xml.etree.ElementTree as etree -from ch.systemsx.cisd.openbis.generic.shared.api.v1.dto import SearchCriteria - -RUNPARAMETERS = 'RunParameters.xml' -#RUNPARAMETERS = 'runParameters.xml' -RUNINFO = 'RunInfo.xml' -FLOWCELL_SPACE='/BSSE_FLOWCELLS/' -FLOWCELL_PROJECT='FLOWCELLS/' -EXPERIMENT_TYPE_CODE='HT_SEQUENCING' - -# Mapping between XML file naming and openBIS properties - -RUNINFO_XML = {'LANECOUNT':'LaneCount', 'SURFACECOUNT':'SurfaceCount', - 'SWATHCOUNT':'SwathCount', 'TILECOUNT':'TileCount'} - -#------------------------------------------------------------------------------ - -class parseXmlFile: - - def __init__(self, xmlFile): - self.xmlFile = xmlFile - self.tree = etree.parse(self.xmlFile) - self.root = self.tree.getroot() - - def getXmlElement (self, elementName): - ''' - Returns the text value of a given XML element - ''' - for e in self.root.getchildren(): - element = e.find(elementName) - if element is None: - return 'None' - else: - return element.text - - def getAllchildren (self, elementName): - ''' - finds all children of a given XML Element and returns them as list - ''' - for e in self.root.getchildren(): - # the '//' means look recursively for all children not only direct ones - childList = self.tree.findall('//' + elementName) - return childList - -# ----------------------------------------------------------------------------- - -def create_openbis_timestamp (): - ''' - Create an openBIS conform timestamp - ''' - tz=localtime()[3]-gmtime()[3] - d=datetime.now() - return d.strftime("%Y-%m-%d %H:%M:%S GMT"+"%+.2d" % tz+":00") - -# ----------------------------------------------------------------------------- - -def registerFlowLane(a_lane, transaction, name, newFlowCell): - ''' - Registers a new Flow lane - ''' - newFlowLane = transaction.createNewSample(FLOWCELL_SPACE + name + ':' + str(a_lane), "ILLUMINA_FLOW_LANE") - newFlowLane.setContainer(newFlowCell) - -# ----------------------------------------------------------------------------- -def process(transaction): - - incoming = transaction.getIncoming() - incomingPath = incoming.getAbsolutePath() - - name = incoming.getName() - # ['120726', 'M00721', '0011', 'A000000000-A1FVF'] - runDate, MiseqID, runningNumber, trayAndFcId = name.split("_") - tray = trayAndFcId[0] - fcId = trayAndFcId[1:] - - # ----------------------------------------------------------------------------- - - # Search for the sample and check if there is already sample with this name - search_service = transaction.getSearchService() - sc = SearchCriteria() - sc.addMatchClause(SearchCriteria.MatchClause.createAttributeMatch(SearchCriteria.MatchClauseAttribute.CODE, name)); - foundSamples = search_service.searchForSamples(sc) - if foundSamples.size() > 0: - raise NameError('Already found a Flow Cell with the following name: '+ name) - - # Parse the RunInfo.xml file - runInfo = parseXmlFile(incomingPath + '/' + RUNINFO) - - # Create a new Flow Cell and set the experiment - newFlowCell = transaction.createNewSample(FLOWCELL_SPACE + name, "ILLUMINA_FLOW_CELL") - exp = transaction.getExperiment(FLOWCELL_SPACE + FLOWCELL_PROJECT + datetime.now().strftime("%Y.%m")) - if exp == None: - exp = transaction.createNewExperiment(FLOWCELL_SPACE + FLOWCELL_PROJECT + datetime.now().strftime("%Y.%m"), - EXPERIMENT_TYPE_CODE) - newFlowCell.setExperiment(exp) - - run = runInfo.getAllchildren('Run')[0].attrib - if (run['Id'] != name): - raise NameError('Flowcell names do not match between directory name '+ name + - ' and ' + RUNINFO + 'property file: ' + run['Id']) - - runParameters = parseXmlFile(incomingPath + '/' + RUNPARAMETERS) - RTAversion = (runParameters.getAllchildren('RTAVersion'))[0].text - print RTAversion - newFlowCell.setPropertyValue("ILLUMINA_PIPELINE_VERSION", RTAversion) - - def setFcProperty(searchId, dict): - children = runInfo.getAllchildren(searchId) - for element in (dict): - if (element <> '') and (dict[element] <> ''): - newFlowCell.setPropertyValue(element, children[0].attrib[dict[element]]) - - # Reading out <FlowcellLayout LaneCount="1" SurfaceCount="1" SwathCount="1" TileCount="12" /> - setFcProperty('FlowcellLayout', RUNINFO_XML) - - sequencer = runInfo.getAllchildren('Instrument') - newFlowCell.setPropertyValue("SEQUENCER", sequencer[0].text) - - readMap = {} - reads = runInfo.getAllchildren('Reads') - read = reads[0].findall('Read') - - for r in read: - cycles = r.get('NumCycles', 'str') - number = r.get('Number', 'str') - isIndexed = r.get('IsIndexedRead', 'str') - readMap[number] = [cycles, isIndexed] - - # example of readMap: {'1': ['151', 'N'], '2': ['8', 'Y'], '3': ['8', 'Y'], '4': ['151', 'N']} - - newFlowCell.setPropertyValue("CYCLES_REQUESTED_BY_CUSTOMER", readMap['1'][0]) - - indexCount = 0 - readCount = 0 - - for e in readMap: - if readMap[e][1] == 'Y': - indexCount += 1 - else: - readCount += 1 - - if indexCount == 2: - newFlowCell.setPropertyValue("END_TYPE", "PAIRED_END") - else: - newFlowCell.setPropertyValue("END_TYPE", "SINGLE_READ") - - try: - newFlowCell.setPropertyValue("INDEXREAD", readMap['2'][0]) - except: - newFlowCell.setPropertyValue("INDEXREAD", '0') - - try: - newFlowCell.setPropertyValue("INDEXREAD2", readMap['3'][0]) - except: - newFlowCell.setPropertyValue("INDEXREAD2", '0') - - newFlowCell.setPropertyValue("FLOW_CELL_SEQUENCED_ON", create_openbis_timestamp()) - - # get the number of lanes - maxLanes = runInfo.getAllchildren('FlowcellLayout')[0].attrib[RUNINFO_XML['LANECOUNT']] - - [registerFlowLane(lane, transaction, name, newFlowCell) for lane in range(1,int(maxLanes)+1)] - - shutil.rmtree(incomingPath) diff --git a/deep_sequencing_unit/source/core-plugins/illumina-ngs/1/dss/drop-boxes/create-flowcell-miseq/plugin.properties b/deep_sequencing_unit/source/core-plugins/illumina-ngs/1/dss/drop-boxes/create-flowcell-miseq/plugin.properties deleted file mode 100644 index 1c15a550f60a5266f40912eb11e6d005eee4ab2f..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/source/core-plugins/illumina-ngs/1/dss/drop-boxes/create-flowcell-miseq/plugin.properties +++ /dev/null @@ -1,12 +0,0 @@ -# -# Drop box for creating a flow cell -# -# Variables: -# incoming-root-dir -# Path to the directory which contains incoming directories for drop boxes. -incoming-dir = ${incoming-root-dir}/dss/create-flowcell-miseq -incoming-data-completeness-condition = marker-file -top-level-data-set-handler = ch.systemsx.cisd.etlserver.registrator.api.v2.JythonTopLevelDataSetHandlerV2 -script-path = create-flow-cell-miseq.py -storage-processor = ch.systemsx.cisd.etlserver.DefaultStorageProcessor - diff --git a/deep_sequencing_unit/source/core-plugins/illumina-ngs/1/dss/drop-boxes/read-demultiplex-stats/plugin.properties b/deep_sequencing_unit/source/core-plugins/illumina-ngs/1/dss/drop-boxes/read-demultiplex-stats/plugin.properties deleted file mode 100644 index 1337bde948b0645c9713e3268dabd486e21275d3..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/source/core-plugins/illumina-ngs/1/dss/drop-boxes/read-demultiplex-stats/plugin.properties +++ /dev/null @@ -1,10 +0,0 @@ -# -# Variables: -# incoming-root-dir -# Path to the directory which contains incoming directories for drop boxes. -incoming-dir = ${incoming-root-dir}/read-demultiplex-stats -incoming-data-completeness-condition = marker-file -top-level-data-set-handler = ch.systemsx.cisd.etlserver.registrator.api.v2.JythonTopLevelDataSetHandlerV2 -script-path = read-demultiplex-stats.py -storage-processor = ch.systemsx.cisd.etlserver.DefaultStorageProcessor - diff --git a/deep_sequencing_unit/source/core-plugins/illumina-ngs/1/dss/drop-boxes/read-demultiplex-stats/read-demultiplex-stats.py b/deep_sequencing_unit/source/core-plugins/illumina-ngs/1/dss/drop-boxes/read-demultiplex-stats/read-demultiplex-stats.py deleted file mode 100755 index df7c525e37c4de61929203b8c7b7cea8d7649f77..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/source/core-plugins/illumina-ngs/1/dss/drop-boxes/read-demultiplex-stats/read-demultiplex-stats.py +++ /dev/null @@ -1,538 +0,0 @@ -''' - @copyright: 2012 ETH Zuerich, CISD - - @license: - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - - -@author: Manuel Kohler - -XML Structur which is processed: - -<?xml version="1.0"?> -<Summary> - <Lane index="8"> - <Sample index="lane8"> - <Barcode index="Undetermined"> - <Tile index="1101"> - <Read index="1"> - <Raw> - <Yield>1921250</Yield> - <YieldQ30>949680</YieldQ30> - <ClusterCount>38425</ClusterCount> - <ClusterCount0MismatchBarcode>0</ClusterCount0MismatchBarcode> - <ClusterCount1MismatchBarcode>0</ClusterCount1MismatchBarcode> - <QualityScoreSum>40995660</QualityScoreSum> - </Raw> - <Pf> - <Yield>945450</Yield> - <YieldQ30>854815</YieldQ30> - <ClusterCount>18909</ClusterCount> - <ClusterCount0MismatchBarcode>0</ClusterCount0MismatchBarcode> - <ClusterCount1MismatchBarcode>0</ClusterCount1MismatchBarcode> - <QualityScoreSum>33815505</QualityScoreSum> - </Pf> - </Read> - </Tile> - [...] - -@note: -print statements go to: <openBIS_HOME>/datastore_server/log/startup_log.txt -''' - -import time -import os -import fnmatch -import xml.etree.ElementTree as etree -from ch.systemsx.cisd.openbis.generic.shared.api.v1.dto import SearchCriteria -from ch.systemsx.cisd.openbis.generic.shared.api.v1.dto import SearchSubCriteria - - -class parseXmlFile: - - def __init__(self, xmlFile): - self.xmlFile = xmlFile - self.tree = etree.parse(self.xmlFile) - self.root = self.tree.getroot() - -# ----------------------------------------------------------------------------- - -class qcValues(object): - def __init__(self, Yield = 0, YieldQ30 = 0, ClusterCount = 0, - ClusterCount0MismatchBarcode = 0, ClusterCount1MismatchBarcode = 0, - QualityScoreSum = 0, *args, **kwargs): - self.Yield = Yield - self.YieldQ30 = YieldQ30 - self.ClusterCount = ClusterCount - self.ClusterCount0MismatchBarcode = ClusterCount0MismatchBarcode - self.ClusterCount1MismatchBarcode = ClusterCount1MismatchBarcode - self.QualityScoreSum = QualityScoreSum - - def __str__(self): - return "Yield: %s, YieldQ30: %s, ClusterCount: %s, ClusterCount0MismatchBarcode: %s," \ - " CusterCount1MismatchBarcode: %s, QualityScoreSum: %s" \ - % (self.Yield, self.YieldQ30, self.ClusterCount, self.ClusterCount0MismatchBarcode, - self.ClusterCount1MismatchBarcode, self.QualityScoreSum) - -class sample: - def __init__(self, Lane = 0, Sample = '', Barcode = '', Tile = '', Read = '', rawqc = qcValues([]), - pfqc = qcValues([]), *args, **kwargs): - self.Lane = Lane - self.Sample = Sample - self.Barcode = Barcode - self.Tile = Tile - self.Read = Read - self.rawqc = rawqc - self.pfqc = pfqc - - def __str__(self): - return "Lane: %s, Sample: %s, Barcode: %s, Tile: %s, Read: %s, rawqc: %s, pfqc: %s" \ - % (self.Lane, self.Sample, self.Barcode, self.Tile, self.Read, self.rawqc, self.pfqc) - -# ----------------------------------------------------------------------------- - -class Statistics: - def __init__(self, lane = 0, sampleName = "", index1 = "NoIndex", index2 = "NoIndex", pfYieldSum = 0, - rawYieldSum = 0, pfPercentage = 0.0, rawReadsSum = 0, pfReadsSum = 0, - pfYieldQ30Sum = 0, qualityScoreSum = 0, rawPercentageReadsPerLane = 0.0, - pfYieldQ30Percentage = 0.0, pfsumQualityScore = 0, pfmeanQualityScore = 0.0): - self.lane = lane - self.sampleName = sampleName - self.index1 = index1 - self.index2 = index2 - self.pfYieldSum = pfYieldSum - self.rawYieldSum = rawYieldSum - self.pfPercentage = pfPercentage - self.rawReadsSum = rawReadsSum - self.pfReadsSum = pfReadsSum - self.pfYieldQ30Sum = pfYieldQ30Sum - self.qualityScoreSum = qualityScoreSum - self.rawPercentageReadsPerLane = rawPercentageReadsPerLane - self.pfYieldQ30Percentage = pfYieldQ30Percentage - self.pfsumQualityScore = pfsumQualityScore - self.pfmeanQualityScore = pfmeanQualityScore - - def __str__(self): - return "lane: %s, sampleName: %s, index1: %s, index2: %s, pfYieldSum: %s, pfPercentage: %s," \ - " rawReadsSum: %s, pfReadsSum: %s," \ - " rawPercentageReadsPerLane: %s, pfYieldQ30Percentage: %s," \ - " pfmeanQualityScore: %s" \ - % (self.lane, self.sampleName, self.index1, self.index2, self.pfYieldSum, self.pfPercentage, - self.rawReadsSum, self.pfReadsSum, - self.rawPercentageReadsPerLane, self.pfYieldQ30Percentage, self.pfmeanQualityScore) - - def calculatePercentagePF (self, rawYield = 0, pfYield = 1): - try: - return round(float(pfYield) / float(rawYield) * 100, 2) - except: - return 0.0 - - def calulateMeanQualityScore (self, pfqualityScoreSum = 0, pfYield = 1): - try: - return round (float(pfqualityScoreSum) / float(pfYield), 2) - except: - return 0.0 - - def calculateYieldQ30Percentage (self, pfYieldQ30 = 0, pfYield = 1): - try: - return round (float(pfYieldQ30) / float(pfYield) * 100, 2) - except: - return 0.0 - -# ----------------------------------------------------------------------------- - -def xml2Memory(DEMULTIPLEX_XML): - ''' - Parse the XML file and put all values in a memory structure: - List of: - lane, sample, barcode, tile, read, qcRawList, qcPfList - ''' - - RAW_TAG = "Raw" - PF_TAG = "Pf" - - sampleList = [] - - xml = parseXmlFile(DEMULTIPLEX_XML) - r = xml.tree.getroot() - - for lane in r.getchildren(): - for mysample in lane: - for barcode in mysample: - for tile in barcode: - for read in tile: - - qcRaw = qcValues() - qcPf = qcValues() - qcRawList = [] - qcPfList = [] - - # Read out the Raw fields - raw = read.find(RAW_TAG) - for child in raw.getchildren(): - # equivalent to a Java reflection - setattr(qcRaw, child.tag, int(child.text)) - - # Read out the Pf fields - pf = read.find(PF_TAG) - for child in pf.getchildren(): - # equivalent to a Java reflection - setattr(qcPf, child.tag, int(child.text)) - - qcRawList.append(qcRaw) - qcPfList.append(qcPf) - - singleElement = sample () - - setattr(singleElement, lane.tag, lane.attrib) - setattr(singleElement, mysample.tag, mysample.attrib) - setattr(singleElement, barcode.tag, barcode.attrib) - setattr(singleElement, tile.tag, tile.attrib) - setattr(singleElement, read.tag, read.attrib) - singleElement.rawqc = qcRawList - singleElement.pfqc = qcPfList - - sampleList.append(singleElement) - return sampleList - -# ----------------------------------------------------------------------------- - -def calculateStatistics(listofSamples): - ''' - Structure of 'listofSamples' - Lane: {'index': '6'}, Sample: {'index': 'BSSE-QGF-3524_C0NKPACXX'}, Barcode: {'index': 'TGACCA'}, - Tile: {'index': '2307'}, Read: {'index': '1'}, rawqc:<mem>, pfqc:<mem> - ''' - - numberOfTiles = len(listofSamples) - - tile = sample() - raw = qcValues () - pf = qcValues () - stats = Statistics() - - for tile in listofSamples: - raw = tile.rawqc[0] - pf = tile.pfqc[0] - - stats.pfYieldSum += pf.Yield - stats.rawYieldSum += raw.Yield - stats.rawReadsSum += raw.ClusterCount - stats.pfReadsSum += pf.ClusterCount - stats.pfYieldQ30Sum += pf.YieldQ30 - stats.qualityScoreSum += pf.QualityScoreSum - - # Can not be set here, needs to be calculated later - #stats.rawPercentageReadsPerLane = rawPercentageReadsPerLane - stats.pfPercentage = stats.calculatePercentagePF(stats.rawYieldSum, stats.pfYieldSum) - stats.pfYieldQ30Percentage = stats.calculateYieldQ30Percentage(stats.pfYieldQ30Sum, stats.pfYieldSum) - stats.pfmeanQualityScore = stats.calulateMeanQualityScore(stats.qualityScoreSum, stats.pfYieldSum) - stats.lane = listofSamples[0].Lane.values()[0] - stats.sampleName = listofSamples[0].Sample.values()[0] - index = listofSamples[0].Barcode.values()[0] - try: - stats.index1, stats.index2 = index.split("-") - except: - stats.index1 = index - return stats - -# ----------------------------------------------------------------------------- - - -def rawReadSumPerSamples(stat): - ''' - Creates a dictionary with the lanes as keys - The values are a list where the elements are a dictionary again. - This dictionary has the sample names as key and the RawReadSum as value. - - Example: - {4': [{'BSSE-QGF-3434_C0NKPACXX': 248999502}], '7': [{'lane7': 123921974}, - {'BSSE-QGF-3527_C0NKPACXX': 38587703}, {'BSSE-QGF-3529_C0NKPACXX': 30130893}, - {'BSSE-QGF-3528_C0NKPACXX': 34519296}, {'BSSE-QGF-3526_C0NKPACXX': 34980179}]} - ''' - - laneDict = {} - for e in stat: - if e.lane not in laneDict: - laneDict[e.lane] = [{e.sampleName:e.rawReadsSum}] - else: - laneDict[e.lane].append({e.sampleName:e.rawReadsSum}) - return laneDict - -# ----------------------------------------------------------------------------- - -def createSumRawReadsPerLane(laneDict): - ''' - Creates a dictionary with lane as key and sum of Raw Reads as value: - {'1': 183180877, '3': 244968562, '2': 191496395, '5': 193466239, '4': 248999502, - '7': 262140045, '6': 257136830, '8': 209948449} - ''' - sumRawReadsDict = {} - for lane in laneDict: - sumRawReads = 0 - for sampleNameDict in laneDict[lane]: - sumRawReads += sampleNameDict.values()[0] - - sumRawReadsDict[lane] = sumRawReads - return sumRawReadsDict - -# ----------------------------------------------------------------------------- - -def createPercentagePerLane(laneDict, sumRawReadsDict): - ''' - Creates a dictionary with the sample Name as key and the percentage of raw reads related to - all reads in the same lane - {'lane7': 47.27, 'BSSE-QGF-3433_C0NKPACXX': 100.0, 'BSSE-QGF-3666_C0NKPACXX': 54.12} - ''' - - relRawReadsDict = {} - for lane in laneDict: - for sampleName in laneDict[lane]: - relRawReadsDict[sampleName.keys()[0]] = round(float(sampleName.values()[0]) / - float(sumRawReadsDict[lane]) * 100, 2) - return relRawReadsDict - -# ----------------------------------------------------------------------------- - -def locate(pattern, root): - '''Locate all files matching supplied filename pattern in and below - supplied root directory.''' - for path, dirs, files in os.walk(os.path.abspath(root)): - for filename in fnmatch.filter(files, pattern): - yield os.path.join(path, filename) - -# ----------------------------------------------------------------------------- - -def getVocabulary(transaction, vocabularyCode): - - vocabularyTermList = [] - vocabulary = transaction.getSearchService().searchForVocabulary(vocabularyCode) - if (vocabulary is None): - print 'VOCABULARY %s does not exist' % (vocabularyCode) - else: - print "Getting VOCABULARY: " + vocabulary.getCode() - for term in vocabulary.getTerms(): - vocabularyTermList.append(term.getCode()) - vocabularyTermList.sort() - return vocabularyTermList - -# ----------------------------------------------------------------------------- - -def getFlowCellMetaData (transaction,flowCellId): - - def sortedDictValues(adict): - keys = adict.keys() - keys.sort() - return map(adict.get, keys) - - search = transaction.getSearchService() - sc = SearchCriteria() - print('Searching FlowCell: '+ str(flowCellId)) - sc.addMatchClause(SearchCriteria.MatchClause.createAttributeMatch(SearchCriteria.MatchClauseAttribute.CODE, flowCellId)); - foundFlowCells = search.searchForSamples(sc) - - try: - assert foundFlowCells.size() == 1 - except AssertionError: - print (str(foundFlowCells.size()) + \ - ' flow cells found which match the criterias: '+ flowCellId) - - fcPropertiesDict = {} - fcPropertyTypes = [] - - fcProperties = foundFlowCells[0].getSample().getProperties() - for property in fcProperties: - code = property.getPropertyType().getSimpleCode() - fcPropertyTypes.append(code) - fcPropertiesDict[code] = property.getValue() - - fcPropertyTypes.sort() - return fcPropertiesDict, fcPropertyTypes - - -# ----------------------------------------------------------------------------- - -def process(transaction): - ''' - Main - ''' - - FASTQ_DATA_SET_TYPE='FASTQ_GZ' - DEMUX_FILE='Flowcell_demux_summary.xml' - NO_INDEX='NOINDEX' - UNDETERMINED='UNDETERMINED' - - incomingPath = transaction.getIncoming().getPath() - name = transaction.getIncoming().getName() - - print('\n'+time.ctime()) - - fcPropertiesDict, fcPropertyTypes = getFlowCellMetaData(transaction, name) - print fcPropertiesDict - print fcPropertyTypes - - search_service = transaction.getSearchService() - - FileGenerator= locate(DEMUX_FILE, incomingPath) - DEMULTIPLEX_XML = FileGenerator.next() - - sampleList = xml2Memory(DEMULTIPLEX_XML) - - sa = sample() - sampleDict = {} - - # key = sample name, value = sample() - for element in range(0, len(sampleList)): - sa = sampleList[element] - # Check if new sample - if (sa.Sample is not sampleList[element - 1].Sample): - sampleName = sa.Sample.values()[0] - sampleDict[sampleName] = [sa] - else: - sampleDict[sampleName].append(sa) - - stat = [calculateStatistics(sampleDict[mysample]) for mysample in sampleDict] - - # calculate the relative amount of reads per index - laneDict = rawReadSumPerSamples(stat) - sumRawReadsDict = createSumRawReadsPerLane(laneDict) - relRawReadsDict = createPercentagePerLane(laneDict, sumRawReadsDict) - - # set the values in the object - for mye in stat: - mye.rawPercentageReadsPerLane = relRawReadsDict[mye.sampleName] - - def sampleSearch(Code=''): - sc = SearchCriteria() - numberOfLanes = 0 - sc.addMatchClause(SearchCriteria.MatchClause.createAttributeMatch(SearchCriteria.MatchClauseAttribute.CODE, Code)); - search_service = transaction.getSearchService() - foundSample = search_service.searchForSamples(sc) - if foundSample.size() > 0: - # Search for contained samples - sampleSc = SearchCriteria() - sampleSc.addSubCriteria(SearchSubCriteria.createSampleContainerCriteria(sc)) - foundContainedSamples = search_service.searchForSamples(sampleSc) - numberOfLanes = foundContainedSamples.size() - return foundSample, foundContainedSamples, numberOfLanes - -#-------------------------------------------------------------------------------------------------------------------------------------- - - def searchDataSetsofSample(sample, index1, index2, DATA_SET_TYPE): - sc = SearchCriteria() - sc.addMatchClause(SearchCriteria.MatchClause.createAttributeMatch(SearchCriteria.MatchClauseAttribute.CODE, sample)); - search_service = transaction.getSearchService() - foundSample = search_service.searchForSamples(sc) - - dataSetSc = SearchCriteria() - # set the Search Criteria to an OR condition, default is AND - #dataSetSc.setOperator(SearchCriteria.SearchOperator.MATCH_ANY_CLAUSES) - dataSetSc.addMatchClause(SearchCriteria.MatchClause.createAttributeMatch(SearchCriteria.MatchClauseAttribute.TYPE, DATA_SET_TYPE)) - dataSetSc.addMatchClause(SearchCriteria.MatchClause.createPropertyMatch("BARCODE", index1 )) - dataSetSc.addMatchClause(SearchCriteria.MatchClause.createPropertyMatch("INDEX2", index2)) - dataSetSc.addSubCriteria(SearchSubCriteria.createSampleCriteria(sc)) - foundDataSets = search_service.searchForDataSets(dataSetSc) - print "foundDataSets.size() "+ str(foundDataSets.size()) - for ds in foundDataSets: - print "Index1 for found Data Set" + ds.getDataSetCode() + " " + ds.getPropertyValue('BARCODE') - print "Index2 for found Data Set" + ds.getDataSetCode() + " " + ds.getPropertyValue('INDEX2') - - return foundDataSets - -#-------------------------------------------------------------------------------------------------------------------------------------- - - def getIndexesofDataSetsofSample(sample, DATA_SET_TYPE): - - index1List = [] - index2List = [] - sc = SearchCriteria() - sc.addMatchClause(SearchCriteria.MatchClause.createAttributeMatch(SearchCriteria.MatchClauseAttribute.CODE, sample)); - search_service = transaction.getSearchService() - foundSample = search_service.searchForSamples(sc) - - dataSetSc = SearchCriteria() - dataSetSc.addMatchClause(SearchCriteria.MatchClause.createAttributeMatch(SearchCriteria.MatchClauseAttribute.TYPE, DATA_SET_TYPE)) - dataSetSc.addSubCriteria(SearchSubCriteria.createSampleCriteria(sc)) - foundDataSets = search_service.searchForDataSets(dataSetSc) - for ds in foundDataSets: - index1List.append(ds.getPropertyValue('BARCODE')) - index2List.append(ds.getPropertyValue('INDEX2')) - return index1List, index2List - - - flowcell, lanes, numberOfLanes = sampleSearch(name) - - index1Length = fcPropertiesDict['INDEXREAD'] - index2Length = fcPropertiesDict['INDEXREAD2'] - - for mystat in stat: - laneCode = flowcell[0].getCode() + ":" + mystat.lane - searchIndex1 = mystat.index1.upper() - searchIndex2 = mystat.index2.upper() - print '\n' - print mystat - - index1List, index2List = getIndexesofDataSetsofSample(laneCode, FASTQ_DATA_SET_TYPE) - print "Searching for "+ searchIndex1 + " in " + str(index1List) - print "Searching for "+ searchIndex2 + " in " + str(index2List) - - if searchIndex1 not in (NO_INDEX): - if searchIndex1 not in (UNDETERMINED): - if index1Length > 7: - searchIndex1 = [ index1 for index1 in index1List if searchIndex1 in index1] - else: - searchIndex1 = [ index1 for index1 in index1List if searchIndex1 in index1[:-1]] - try: - searchIndex1 = searchIndex1[0] - except: - searchIndex1 = 'MISSING' - else: - searchIndex1 = NO_INDEX - if searchIndex2 not in (NO_INDEX): - if searchIndex2 not in (UNDETERMINED): - if index2Length > 7: - searchIndex2 = [ index2 for index2 in index2List if searchIndex2 in index2] - else: - searchIndex2 = [ index2 for index2 in index2List if searchIndex2 in index2[:-1]] - try: - searchIndex2 = searchIndex2[0] - except: - searchIndex1 = 'MISSING' - else: - searchIndex2 = NO_INDEX - - print "searchIndex1 " + str(searchIndex1) - print "searchIndex2 " + str(searchIndex2) - - # Search for a data set with those two indices - DataSet = searchDataSetsofSample(laneCode, searchIndex1, searchIndex2, FASTQ_DATA_SET_TYPE) - try: - assert DataSet.size() == 1 - except AssertionError: - print (str(DataSet.size()) + ' data sets found which match the criterias: '+ - str(laneCode), searchIndex1, searchIndex2) - continue - - sa = transaction.getDataSetForUpdate(DataSet[0].getDataSetCode()) - sa.setPropertyValue('YIELD_MBASES', str(mystat.pfYieldSum)) - sa.setPropertyValue('RAW_YIELD_MBASES', str(mystat.rawYieldSum)) - sa.setPropertyValue('PERCENTAGE_PASSED_FILTERING',str(mystat.pfPercentage)) - sa.setPropertyValue('PF_READS_SUM',str(mystat.pfReadsSum)) - sa.setPropertyValue('RAW_READS_SUM',str(mystat.rawReadsSum)) - sa.setPropertyValue('PERCENTAGE_RAW_CLUSTERS_PER_LANE', str(mystat.rawPercentageReadsPerLane)) - sa.setPropertyValue('PFYIELDQ30PERCENTAGE', str(mystat.pfYieldQ30Percentage)) - sa.setPropertyValue('PFMEANQUALITYSCORE', str(mystat.pfmeanQualityScore)) - - print "Modified data sets properties of: " + DataSet[0].getDataSetCode() - - print "DONE" diff --git a/deep_sequencing_unit/source/core-plugins/illumina-ngs/1/dss/drop-boxes/read-rta-timestamp/plugin.properties b/deep_sequencing_unit/source/core-plugins/illumina-ngs/1/dss/drop-boxes/read-rta-timestamp/plugin.properties deleted file mode 100644 index ef56111b768f0d12631d249469e5c942506f01f0..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/source/core-plugins/illumina-ngs/1/dss/drop-boxes/read-rta-timestamp/plugin.properties +++ /dev/null @@ -1,11 +0,0 @@ -# -# Drop box for registering a flow cell output as a data set -# -# Variables: -# incoming-root-dir -# Path to the directory which contains incoming directories for drop boxes. -incoming-dir = ${incoming-root-dir}/read-rta-timestamp -incoming-data-completeness-condition = marker-file -top-level-data-set-handler = ch.systemsx.cisd.etlserver.registrator.api.v2.JythonTopLevelDataSetHandlerV2 -script-path = read-rta-timestamp.py -storage-processor = ch.systemsx.cisd.etlserver.DefaultStorageProcessor diff --git a/deep_sequencing_unit/source/core-plugins/illumina-ngs/1/dss/drop-boxes/read-rta-timestamp/read-rta-timestamp.py b/deep_sequencing_unit/source/core-plugins/illumina-ngs/1/dss/drop-boxes/read-rta-timestamp/read-rta-timestamp.py deleted file mode 100644 index 1e68261b6dee7ad488c351a00203215175081ce5..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/source/core-plugins/illumina-ngs/1/dss/drop-boxes/read-rta-timestamp/read-rta-timestamp.py +++ /dev/null @@ -1,45 +0,0 @@ -import os -import shutil -from time import * -from datetime import * -from ch.systemsx.cisd.openbis.generic.shared.api.v1.dto import SearchCriteria - -MarkerGAComplete = 'RTAComplete.txt' -MarkerHiSeqComplete = 'RTAComplete.txt' - -def createOpenbisTimeStamp(file): - ''' - Creates a openBIS compatible time stamp of a file time stamp - ''' - mtime = os.path.getmtime(file) - lt = localtime(mtime) - tz = localtime().tm_hour - gmtime().tm_hour - return (strftime("%Y-%m-%d %H:%M:%S GMT" + "%+.2d" % tz + ":00", lt)) - -# ----------------------------------------------------------------------------- - -def process(transaction): - - incomingPath = transaction.getIncoming().getAbsolutePath() - # Get the incoming name - name = transaction.getIncoming().getName() - - split=name.split("_") - if (len(split) == 4): - IS_HISEQ_RUN=True - Markerfile = incomingPath + "/" + MarkerHiSeqComplete - if (len(split) == 2): - Markerfile = incomingPath + "/" + MarkerGAComplete - - - # Search for the sample and check if there is already sample with this name - search_service = transaction.getSearchService() - sc = SearchCriteria() - sc.addMatchClause(SearchCriteria.MatchClause.createAttributeMatch(SearchCriteria.MatchClauseAttribute.CODE, name)); - foundSamples = search_service.searchForSamples(sc) - - if foundSamples.size() > 0: - sa = transaction.getSampleForUpdate(foundSamples[0].getSampleIdentifier()) - sa.setPropertyValue("SEQUENCER_FINISHED", createOpenbisTimeStamp(Markerfile)) - - shutil.rmtree(incomingPath) diff --git a/deep_sequencing_unit/source/core-plugins/illumina-ngs/1/dss/drop-boxes/register-basecall-stats/plugin.properties b/deep_sequencing_unit/source/core-plugins/illumina-ngs/1/dss/drop-boxes/register-basecall-stats/plugin.properties deleted file mode 100644 index d6e67945db5bcce4a1f3f1fa0c109a5d12b2544a..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/source/core-plugins/illumina-ngs/1/dss/drop-boxes/register-basecall-stats/plugin.properties +++ /dev/null @@ -1,11 +0,0 @@ -# -# Drop box for registering a flow cell output as a data set -# -# Variables: -# incoming-root-dir -# Path to the directory which contains incoming directories for drop boxes. -incoming-dir = ${incoming-root-dir}/register-basecall-stats -incoming-data-completeness-condition = marker-file -top-level-data-set-handler = ch.systemsx.cisd.etlserver.registrator.api.v2.JythonTopLevelDataSetHandlerV2 -script-path = register-basecall-stats.py -storage-processor = ch.systemsx.cisd.etlserver.DefaultStorageProcessor diff --git a/deep_sequencing_unit/source/core-plugins/illumina-ngs/1/dss/drop-boxes/register-basecall-stats/register-basecall-stats.py b/deep_sequencing_unit/source/core-plugins/illumina-ngs/1/dss/drop-boxes/register-basecall-stats/register-basecall-stats.py deleted file mode 100644 index 6efcd1eb5df94f044d973b3016379402ce66e1b6..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/source/core-plugins/illumina-ngs/1/dss/drop-boxes/register-basecall-stats/register-basecall-stats.py +++ /dev/null @@ -1,72 +0,0 @@ -''' -@copyright: -2012 ETH Zuerich, CISD - -@license: -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - -http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. - -@description: -Registers an incoming directory as a data set in openBIS. The name of the directory is used to -search for the matching sample. - -@note: -print statements go to: <openBIS_HOME>/datastore_server/log/startup_log.txt -expected incoming Name for HiSeq runs: 110715_SN792_0054_BC035RACXX -expected incoming Name for GAII runs: 110812_6353WAAXX -expected incoming Name for MiSeq runs: 121218_M00721_0017_000000000-A0T19 - -@author: -Manuel Kohler -''' - -import os -from ch.systemsx.cisd.openbis.generic.shared.api.v1.dto import SearchCriteria -from ch.systemsx.cisd.openbis.generic.shared.api.v1.dto import SearchSubCriteria - -def process(transaction): - - incomingPath = transaction.getIncoming().getPath() - incomingFolder = transaction.getIncoming().getName() - - folders=os.listdir(incomingPath) - - # expected incoming Name, e.g.: 110715_SN792_0054_BC035RACXX - - # Create a data set and set type - dataSet = transaction.createNewDataSet("BASECALL_STATS") - dataSet.setMeasuredData(False) - - dataSet.setPropertyValue("MISMATCH_IN_INDEX", "NONE") - - # Get the search service - search_service = transaction.getSearchService() - - # Add the incoming file into the data set - transaction.moveFile(incomingPath, dataSet) - - # Search for the sample - sc = SearchCriteria() - sc.addMatchClause(SearchCriteria.MatchClause.createAttributeMatch(SearchCriteria.MatchClauseAttribute.CODE, incomingPath)) - foundSamples = search_service.searchForSamples(sc) - - - if foundSamples.size() > 0: - dataSet.setSample(foundSamples[0]) - - # Search for another data set of the same sample - #dataSetSc = SearchCriteria() - #dataSetSc.addMatchClause(SearchCriteria.MatchClause.createAttributeMatch(SearchCriteria.MatchClauseAttribute.TYPE, 'ILLUMINA_HISEQ_OUTPUT')) - #dataSetSc.addSubCriteria(SearchSubCriteria.createSampleCriteria(sc)) - #foundDataSets = search_service.searchForDataSets(dataSetSc) - #if foundDataSets.size() > 0: - # dataSet.setParentDatasets([ds.getDataSetCode() for ds in foundDataSets]) diff --git a/deep_sequencing_unit/source/core-plugins/illumina-ngs/1/dss/drop-boxes/register-bigwig/plugin.properties b/deep_sequencing_unit/source/core-plugins/illumina-ngs/1/dss/drop-boxes/register-bigwig/plugin.properties deleted file mode 100644 index 26d6bb1da8dcadf2f6be9b6359117a8c8d039a2f..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/source/core-plugins/illumina-ngs/1/dss/drop-boxes/register-bigwig/plugin.properties +++ /dev/null @@ -1,10 +0,0 @@ -# -# Variables: -# incoming-root-dir -# Path to the directory which contains incoming directories for drop boxes. -incoming-dir = ${incoming-root-dir}/register-bigwig/ -incoming-data-completeness-condition = marker-file -top-level-data-set-handler = ch.systemsx.cisd.etlserver.registrator.api.v2.JythonTopLevelDataSetHandlerV2 -script-path = register-bigwig.py -storage-processor = ch.systemsx.cisd.etlserver.DefaultStorageProcessor - diff --git a/deep_sequencing_unit/source/core-plugins/illumina-ngs/1/dss/drop-boxes/register-bigwig/register-bigwig.py b/deep_sequencing_unit/source/core-plugins/illumina-ngs/1/dss/drop-boxes/register-bigwig/register-bigwig.py deleted file mode 100755 index 31a0863709fb07a6f23a4912221d41763388ffd9..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/source/core-plugins/illumina-ngs/1/dss/drop-boxes/register-bigwig/register-bigwig.py +++ /dev/null @@ -1,140 +0,0 @@ -''' -@copyright: -2012 ETH Zuerich, CISD - -@license: -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - -http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. - -@note: -print statements go to: <openBIS_HOME>/datastore_server/log/startup_log.txt -expected incoming Name for HiSeq runs: 110715_SN792_0054_BC035RACXX -expected incoming Name for GAII runs: 110812_6353WAAXX - -@author: -Manuel Kohler -''' - -import os -import fnmatch -import re -from ch.systemsx.cisd.openbis.generic.shared.api.v1.dto import SearchCriteria -from ch.systemsx.cisd.openbis.generic.shared.api.v1.dto import SearchSubCriteria - -FOLDER='/links/shared/dsu/dss/register-bigwig/' -BIGWIGINFO='/links/application/dsu/bigWig/bigWigInfo ' -BW_PATTERN='*.bw' - -matches = [] - -# ----------------------------------------------------------------------------- - -def listSearch (myList, searchString): - ''' - Searches for a given String in a list. - Only lines matching the start of a line a considerd as a match - ''' - matches = [] - for i in range (0, len(myList)): - if(re.match(searchString, myList[i])): - matches.append(myList[i]) - return (matches) - -# ----------------------------------------------------------------------------- - -def translateBoolean (value): - if (value.lower() == 'yes') | (value.lower() =='y'): - return True - else: - return False - -def sanitizeInt (intNumber): - return intNumber.replace(',','') - -# ----------------------------------------------------------------------------- - -def convertListToDict(prop): - d={} - for i in range(0,len(prop)-1): - lineSplit = prop[i].split(':') - d[lineSplit[0].strip()] = lineSplit[1].strip() - return(d) - -# ----------------------------------------------------------------------------- - -def process(transaction): - - incomingPath = transaction.getIncoming().getPath() - name = transaction.getIncoming().getName() - - # Create a data set and set type - dataSet = transaction.createNewDataSet("BIGWIGGLE") - dataSet.setMeasuredData(False) - - # expected: - # Project_110907_SN792_0059_AC012FACXX_3/BSSE-DSU-1662_CGATGTA_L003_R1_001_sorted.bw - split=name.split('_') - if (len(split) == 6): - incoming_sample=split[1]+ '_'+ split[2] + '_' + split[3] + '_' + split[4]+ ':' + split[-1] - if (len(split) ==4): - incoming_sample=split[1]+ '_'+ split[2] + ':' + split[-1] - - # Looking for BWs: - for root, dirnames, filenames in os.walk(FOLDER + name): - for filename in fnmatch.filter(filenames, BW_PATTERN): - matches.append(os.path.join(root, filename)) - - # Extract values from a samtools view and set the results as DataSet properties - # Command: samtools view -H ETHZ_BSSE_110429_63558AAXX_1_sorted.bam - - arguments = BIGWIGINFO + matches[0] - #print('Arguments: '+ arguments) - cmdResult=os.popen(arguments).read() - - properties=cmdResult.split("\n") - dictProp = convertListToDict(properties) - #print(dictProp) - - dataSet.setPropertyValue("VERSION", dictProp['version']) - dataSet.setPropertyValue("ISCOMPRESSED", str(translateBoolean(dictProp['isCompressed']))) - dataSet.setPropertyValue("ISSWAPPED", dictProp['isSwapped']) - dataSet.setPropertyValue("PRIMARYDATASIZE", sanitizeInt(dictProp['primaryDataSize'])) - dataSet.setPropertyValue("PRIMARYINDEXSIZE", sanitizeInt(dictProp['primaryIndexSize'])) - dataSet.setPropertyValue("ZOOMLEVELS", dictProp['zoomLevels']) - dataSet.setPropertyValue("CHROMCOUNT", dictProp['chromCount']) - dataSet.setPropertyValue("BASESCOVERED", sanitizeInt(dictProp['basesCovered'])) - dataSet.setPropertyValue("MEAN", dictProp['mean']) - dataSet.setPropertyValue("MIN", dictProp['min']) - dataSet.setPropertyValue("MAX", dictProp['max']) - dataSet.setPropertyValue("STD", dictProp['std']) - - # Add the incoming file into the data set - transaction.moveFile(incomingPath, dataSet) - - # Get the search service - search_service = transaction.getSearchService() - - # Search for the sample - sc = SearchCriteria() - sc.addMatchClause(SearchCriteria.MatchClause.createAttributeMatch(SearchCriteria.MatchClauseAttribute.CODE, incoming_sample)); - foundSamples = search_service.searchForSamples(sc) - - if foundSamples.size() > 0: - dataSet.setSample(foundSamples[0]) - - # Search for parent data set of the same sample - dataSetSc = SearchCriteria() - dataSetSc.addMatchClause(SearchCriteria.MatchClause.createAttributeMatch(SearchCriteria.MatchClauseAttribute.TYPE, 'FASTQ_GZ')) - dataSetSc.addSubCriteria(SearchSubCriteria.createSampleCriteria(sc)) - foundDataSets = search_service.searchForDataSets(dataSetSc) - if foundDataSets.size() > 0: - dataSet.setParentDatasets([ds.getDataSetCode() for ds in foundDataSets]) diff --git a/deep_sequencing_unit/source/core-plugins/illumina-ngs/1/dss/drop-boxes/register-bowtie/plugin.properties b/deep_sequencing_unit/source/core-plugins/illumina-ngs/1/dss/drop-boxes/register-bowtie/plugin.properties deleted file mode 100644 index f0fac2c142a23dfcfcc5e3fb1a9946f4fd182fb6..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/source/core-plugins/illumina-ngs/1/dss/drop-boxes/register-bowtie/plugin.properties +++ /dev/null @@ -1,11 +0,0 @@ -# -# Drop box for registering a flow cell output as a data set -# -# Variables: -# incoming-root-dir -# Path to the directory which contains incoming directories for drop boxes. -incoming-dir = ${incoming-root-dir}/register-bowtie -incoming-data-completeness-condition = marker-file -top-level-data-set-handler = ch.systemsx.cisd.etlserver.registrator.api.v2.JythonTopLevelDataSetHandlerV2 -script-path = register-bowtie.py -storage-processor = ch.systemsx.cisd.etlserver.DefaultStorageProcessor diff --git a/deep_sequencing_unit/source/core-plugins/illumina-ngs/1/dss/drop-boxes/register-bowtie/register-bowtie.py b/deep_sequencing_unit/source/core-plugins/illumina-ngs/1/dss/drop-boxes/register-bowtie/register-bowtie.py deleted file mode 100644 index 11f72f74fafb4fe45fc87e703982f83be83cd2ce..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/source/core-plugins/illumina-ngs/1/dss/drop-boxes/register-bowtie/register-bowtie.py +++ /dev/null @@ -1,130 +0,0 @@ -''' -This is handling bowtie-BAM files and extracts some properties from the BAM header and -the samtools flagstat command. The results are formatted and attached as a property -to the openBIS DataSet. -Prerequisites are the DataSetType: ALIGNMENT and -the following properties assigned to the DataSetType mentioned above: -ALIGNMENT_SOFTWARE, ISSUED_COMMAND, SAMTOOLS_FLAGSTAT, -TOTAL_READS, MAPPED_READS - -Obviously you need a working samtools binary - -Uses 'flagstat' and 'view -H' -''' - -import os -import fnmatch -import re -from ch.systemsx.cisd.openbis.generic.shared.api.v1.dto import SearchCriteria -from ch.systemsx.cisd.openbis.generic.shared.api.v1.dto import SearchSubCriteria - -FOLDER='/links/shared/dsu/dss/register-bowtie/' -SAMTOOLS='/links/application/dsu/samtools/samtools' -BAM_PATTERN='*.bam' - -matches = [] -searchStrings = ['@PG'] -programList = [] - -# ----------------------------------------------------------------------------- - -def listSearch (myList, searchString): - ''' - Searches for a given String in a list. - Only lines matching the start of a line a considerd as a match - ''' - matches = [] - for i in range (0, len(myList)): - if(re.match(searchString, myList[i])): - matches.append(myList[i]) - return (matches) - -# ----------------------------------------------------------------------------- - -def programParameters (programList): - ''' - Extracts the aligner datils from the bam header - ''' - elements = {} - for program in range(0, len(programList)): - line = programList[program].split('\t') - - for element in range (1, len(line)): - key, value = line[element].split(":") - elements[key] = value - - return elements - -# ----------------------------------------------------------------------------- - -def process(transaction): - - incomingPath = transaction.getIncoming().getName() - - dataSet = transaction.createNewDataSet("ALIGNMENT") - dataSet.setMeasuredData(False) - - # Get the incoming name - # expected: - # Project_110907_SN792_0059_AC012FACXX_3/Sample_BSSE-DSU-1662/BSSE-DSU-1662_CGATGTA_L003_R1_001_sorted.bam - split=incomingPath.split('_') - if (len(split) == 6): - incoming_sample=split[1]+ '_'+ split[2] + '_' + split[3] + '_' + split[4]+ ':' + split[-1] - if (len(split) ==4): - incoming_sample=split[1]+ '_'+ split[2] + ':' + split[-1] - - # Looking for BAMS: - for root, dirnames, filenames in os.walk(FOLDER + incomingPath): - for filename in fnmatch.filter(filenames, BAM_PATTERN): - matches.append(os.path.join(root, filename)) - - # Extract values from a samtools view and set the results as DataSet properties - # Command: samtools view -H ETHZ_BSSE_110429_63558AAXX_1_sorted.bam - - arguments = SAMTOOLS + ' view -H ' + matches[0] - print('Arguments: '+ arguments) - cmdResult=os.popen(arguments).read() - - properties=cmdResult.split("\n") - for s in range (0, len(searchStrings)): - programList = listSearch (properties, searchStrings[s]) - print(programList) - - e = programParameters (programList) - - dataSet.setPropertyValue("ALIGNMENT_SOFTWARE", e['ID']) - dataSet.setPropertyValue("VERSION", e['VN']) - dataSet.setPropertyValue("ISSUED_COMMAND", e['CL']) - - - arguments = SAMTOOLS + ' flagstat ' + matches[0] - - cmdResult=os.popen(arguments).read() - totalReads=cmdResult.split('\n')[0].split(' ')[0] - mappedReads=cmdResult.split('\n')[2].split(' ')[0] - - dataSet.setPropertyValue("SAMTOOLS_FLAGSTAT", cmdResult) - dataSet.setPropertyValue("TOTAL_READS", totalReads) - dataSet.setPropertyValue("MAPPED_READS", mappedReads) - - # Add the incoming file into the data set - transaction.moveFile(incomingPath, dataSet) - - # Get the search service - search_service = transaction.getSearchService() - - # Search for the sample - sc = SearchCriteria() - sc.addMatchClause(SearchCriteria.MatchClause.createAttributeMatch(SearchCriteria.MatchClauseAttribute.CODE, incoming_sample)); - foundSamples = search_service.searchForSamples(sc) - - if foundSamples.size() > 0: - dataSet.setSample(foundSamples[0]) - - # Search for parent data set of the same sample - dataSetSc = SearchCriteria() - dataSetSc.addMatchClause(SearchCriteria.MatchClause.createAttributeMatch(SearchCriteria.MatchClauseAttribute.TYPE, 'FASTQ_GZ')) - dataSetSc.addSubCriteria(SearchSubCriteria.createSampleCriteria(sc)) - foundDataSets = search_service.searchForDataSets(dataSetSc) - if foundDataSets.size() > 0: - dataSet.setParentDatasets([ds.getDataSetCode() for ds in foundDataSets]) diff --git a/deep_sequencing_unit/source/core-plugins/illumina-ngs/1/dss/drop-boxes/register-fastqc/plugin.properties b/deep_sequencing_unit/source/core-plugins/illumina-ngs/1/dss/drop-boxes/register-fastqc/plugin.properties deleted file mode 100644 index 353a2b7aa8a30b04423e2ffb0645814123ce71f4..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/source/core-plugins/illumina-ngs/1/dss/drop-boxes/register-fastqc/plugin.properties +++ /dev/null @@ -1,11 +0,0 @@ -# -# Drop box for registering a flow cell output as a data set -# -# Variables: -# incoming-root-dir -# Path to the directory which contains incoming directories for drop boxes. -incoming-dir = ${incoming-root-dir}/register-fastqc -incoming-data-completeness-condition = marker-file -top-level-data-set-handler = ch.systemsx.cisd.etlserver.registrator.api.v2.JythonTopLevelDataSetHandlerV2 -script-path = register-fastqc.py -storage-processor = ch.systemsx.cisd.etlserver.DefaultStorageProcessor diff --git a/deep_sequencing_unit/source/core-plugins/illumina-ngs/1/dss/drop-boxes/register-fastqc/register-fastqc.py b/deep_sequencing_unit/source/core-plugins/illumina-ngs/1/dss/drop-boxes/register-fastqc/register-fastqc.py deleted file mode 100644 index 26c09f2d4afb5c1a474d8a595efa86334371ce69..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/source/core-plugins/illumina-ngs/1/dss/drop-boxes/register-fastqc/register-fastqc.py +++ /dev/null @@ -1,73 +0,0 @@ -''' -@copyright: -2012 ETH Zuerich, CISD - -@license: -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - -http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. - -@note -print statements go to: <openBIS_HOME>/datastore_server/log/startup_log.txt -Expects as incoming folder: Project_120427_SN792_0110_AD0YCGACXX_1 - -@author: -Manuel Kohler -''' - -import os -import shutil -from ch.systemsx.cisd.openbis.generic.shared.api.v1.dto import SearchCriteria -from ch.systemsx.cisd.openbis.generic.shared.api.v1.dto import SearchSubCriteria - -def renameFiles(dir, flowcellName): - print dir - print flowcellName - for root, dirs, files in os.walk(dir): - for file in files: - print root + file - os.rename(root + '/' + file, root + "/" + flowcellName + "_" + file) - - -def process(transaction): - - incomingPath = transaction.getIncoming().getPath() - incomingFolder = transaction.getIncoming().getName() - - fcAndLane = incomingFolder.split("_",1)[-1] - flowCell, flowLane = fcAndLane.rsplit("_",1) - print flowLane - - # Get the search service - search_service = transaction.getSearchService() - - # Search for the sample - sc = SearchCriteria() - sc.addMatchClause(SearchCriteria.MatchClause.createAttributeMatch(SearchCriteria.MatchClauseAttribute.CODE, flowCell)) - foundSamples = search_service.searchForSamples(sc) - - if foundSamples.size() > 0: - - # Search for another data set of the same sample and make it a child of it - sampleSc = SearchCriteria() - sampleSc.addSubCriteria(SearchSubCriteria.createSampleContainerCriteria(sc)) - foundContainedSamples = search_service.searchForSamples(sampleSc) - if foundContainedSamples.size() > 0: - dataSet = transaction.createNewDataSet("FASTQC") - dataSet.setMeasuredData(False) - for indx in range(0, len(foundContainedSamples)): - lane = foundContainedSamples[indx].getCode().split(':')[-1] - print lane - if (flowLane == lane): - dataSet.setSample(foundContainedSamples[indx]) - # Add the incoming file into the data set - transaction.moveFile(incomingPath + "/fastqc/", dataSet) - break diff --git a/deep_sequencing_unit/source/core-plugins/illumina-ngs/1/dss/drop-boxes/register-flowcell-dropbox/plugin.properties b/deep_sequencing_unit/source/core-plugins/illumina-ngs/1/dss/drop-boxes/register-flowcell-dropbox/plugin.properties deleted file mode 100644 index 9c4e3bbc2c1fb133d0252bd6b50036a083078b02..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/source/core-plugins/illumina-ngs/1/dss/drop-boxes/register-flowcell-dropbox/plugin.properties +++ /dev/null @@ -1,11 +0,0 @@ -# -# Drop box for registering a flow cell output as a data set -# -# Variables: -# incoming-root-dir -# Path to the directory which contains incoming directories for drop boxes. -incoming-dir = ${incoming-root-dir}/incoming-register-flowcell -incoming-data-completeness-condition = auto-detection -top-level-data-set-handler = ch.systemsx.cisd.etlserver.registrator.api.v2.JythonTopLevelDataSetHandlerV2 -script-path = register-flowcell-dropbox.py -storage-processor = ch.systemsx.cisd.etlserver.DefaultStorageProcessor diff --git a/deep_sequencing_unit/source/core-plugins/illumina-ngs/1/dss/drop-boxes/register-flowcell-dropbox/register-flowcell-dropbox.py b/deep_sequencing_unit/source/core-plugins/illumina-ngs/1/dss/drop-boxes/register-flowcell-dropbox/register-flowcell-dropbox.py deleted file mode 100644 index 48c1f20c76e8b29fb433e5f8fbc8d8b1d65ef42c..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/source/core-plugins/illumina-ngs/1/dss/drop-boxes/register-flowcell-dropbox/register-flowcell-dropbox.py +++ /dev/null @@ -1,66 +0,0 @@ -''' -@copyright: -2012 ETH Zuerich, CISD - -@license: -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - -http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. - -@description: -Registers an incoming directory as a data set in openBIS. The name of the directory is used to -search for the matching sample. - -@note: -print statements go to: <openBIS_HOME>/datastore_server/log/startup_log.txt -expected incoming Name for HiSeq runs: 110715_SN792_0054_BC035RACXX -expected incoming Name for GAII runs: 110812_6353WAAXX - -@author: -Manuel Kohler -''' - -from ch.systemsx.cisd.openbis.generic.shared.api.v1.dto import SearchCriteria - -IS_HISEQ_RUN = False - -DATASET_TYPE_HISEQ = "ILLUMINA_HISEQ_OUTPUT" -DATASET_TYPE_GA = "ILLUMINA_GA_OUTPUT" - -def process(transaction): - - incomingPath = transaction.getIncoming().getAbsolutePath() - - # Get the incoming name - name = transaction.getIncoming().getName() - - split = name.split("_") - if (len(split) == 4): - dataSet = transaction.createNewDataSet(DATASET_TYPE_HISEQ) - IS_HISEQ_RUN = True - if (len(split) == 2): - dataSet = transaction.createNewDataSet(DATASET_TYPE_GA) - - # Create a data set and set type - dataSet.setMeasuredData(False) - - # Get the search service - search_service = transaction.getSearchService() - - # Search for the sample - sc = SearchCriteria() - sc.addMatchClause(SearchCriteria.MatchClause.createAttributeMatch(SearchCriteria.MatchClauseAttribute.CODE, name)); - foundSamples = search_service.searchForSamples(sc) - - if foundSamples.size() > 0: - # Add the incoming file into the data set - transaction.moveFile(incomingPath, dataSet) - dataSet.setSample(foundSamples[0]) diff --git a/deep_sequencing_unit/source/core-plugins/illumina-ngs/1/dss/drop-boxes/register-flowcell-hiseq/plugin.properties b/deep_sequencing_unit/source/core-plugins/illumina-ngs/1/dss/drop-boxes/register-flowcell-hiseq/plugin.properties deleted file mode 100644 index 8730e628162fd815db73599ea7cf4b7025b6a00b..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/source/core-plugins/illumina-ngs/1/dss/drop-boxes/register-flowcell-hiseq/plugin.properties +++ /dev/null @@ -1,12 +0,0 @@ -# -# Drop box for registering a flow cell output as a data set -# -# Variables: -# incoming-root-dir -# Path to the directory which contains incoming directories for drop boxes. -incoming-dir = ${incoming-root-dir}/register-flowcell-hiseq -#incoming-dir = /links/sonas/cisd/store/incoming-flowCell -incoming-data-completeness-condition = marker-file -top-level-data-set-handler = ch.systemsx.cisd.etlserver.registrator.api.v2.JythonTopLevelDataSetHandlerV2 -script-path = register-flowcell-hiseq.py -storage-processor = ch.systemsx.cisd.etlserver.DefaultStorageProcessor diff --git a/deep_sequencing_unit/source/core-plugins/illumina-ngs/1/dss/drop-boxes/register-flowcell-hiseq/register-flowcell-hiseq.py b/deep_sequencing_unit/source/core-plugins/illumina-ngs/1/dss/drop-boxes/register-flowcell-hiseq/register-flowcell-hiseq.py deleted file mode 100644 index 3048b4473d30543fbcadf3fb4ee8063aed05f926..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/source/core-plugins/illumina-ngs/1/dss/drop-boxes/register-flowcell-hiseq/register-flowcell-hiseq.py +++ /dev/null @@ -1,97 +0,0 @@ -''' -@copyright: -2012 ETH Zuerich, CISD - -@license: -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - -http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. - -@description: -Registers an incoming directory as a data set in openBIS. The name of the directory is used to -search for the matching sample. - -@note: -print statements go to: <openBIS_HOME>/datastore_server/log/startup_log.txt -expected incoming Name for HiSeq runs: 110715_SN792_0054_BC035RACXX -expected incoming Name for GAII runs: 110812_6353WAAXX - -@author: -Manuel Kohler -''' - -import os -import shutil -import glob -import xml.etree.ElementTree as etree -from ch.systemsx.cisd.openbis.generic.shared.api.v1.dto import SearchCriteria - -IS_HISEQ_RUN=False - -RUNINFO_FOLDER='/links/shared/dsu/dss/register-runstatistics/' -REGEX_RUNINFO_SAMPLE = '/Data/Status*' -REGEX_RUNINFO_REPORTS = '/Data/reports' -MARKER_STRING='.MARKER_is_finished_' - -def touch_markerfile(filename): - try: - # do a touch - open(filename, 'w').close() - except: - print('Could not touch ' + filename) - - -def process(transaction): - - incomingPath = transaction.getIncoming().getPath() - name = transaction.getIncoming().getName() - - folders=[] - folders=os.listdir(incomingPath) - - split=name.split("_") - if (len(split) == 4): - dataSet = transaction.createNewDataSet("ILLUMINA_HISEQ_OUTPUT") - IS_HISEQ_RUN=True - if (len(split) == 2): - dataSet = transaction.createNewDataSet("ILLUMINA_GA_OUTPUT") - - #move RunInfo into a different drop box - runInfoSample=glob.glob(incomingPath + REGEX_RUNINFO_SAMPLE) - runInfoReport=glob.glob(incomingPath + REGEX_RUNINFO_REPORTS) - runInfoList = runInfoSample + runInfoReport - os.makedirs(RUNINFO_FOLDER + name + '/Data/') - for runInfo in runInfoList: - try: - if os.path.isdir(runInfo): - shutil.copytree(runInfo, RUNINFO_FOLDER + name + '/Data/' + os.path.basename(runInfo)) - else: - shutil.copy2(runInfo, RUNINFO_FOLDER + name + '/Data/') - except (IOError, os.error), why: - print (runInfo, RUNINFO_FOLDER + name, str(why)) - - touch_markerfile(RUNINFO_FOLDER+MARKER_STRING+name) - - # Create a data set and set type - dataSet.setMeasuredData(False) - - # Get the search service - search_service = transaction.getSearchService() - - # Search for the sample - sc = SearchCriteria() - sc.addMatchClause(SearchCriteria.MatchClause.createAttributeMatch(SearchCriteria.MatchClauseAttribute.CODE, name)); - foundSamples = search_service.searchForSamples(sc) - - if foundSamples.size() > 0: - # Add the incoming file into the data set - transaction.moveFile(incomingPath, dataSet) - dataSet.setSample(foundSamples[0]) diff --git a/deep_sequencing_unit/source/core-plugins/illumina-ngs/1/dss/drop-boxes/register-flowcell-miseq/plugin.properties b/deep_sequencing_unit/source/core-plugins/illumina-ngs/1/dss/drop-boxes/register-flowcell-miseq/plugin.properties deleted file mode 100644 index 7f274a70db5ba39005bf8934437666fdbfdccda0..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/source/core-plugins/illumina-ngs/1/dss/drop-boxes/register-flowcell-miseq/plugin.properties +++ /dev/null @@ -1,12 +0,0 @@ -# -# Drop box for registering a flow cell output as a data set -# -# Variables: -# incoming-root-dir -# Path to the directory which contains incoming directories for drop boxes. -incoming-dir = ${incoming-root-dir}/register-flowcell-miseq -incoming-data-completeness-condition = marker-file -top-level-data-set-handler = ch.systemsx.cisd.etlserver.registrator.api.v2.JythonTopLevelDataSetHandlerV2 -script-path = register-flowcell-miseq.py -storage-processor = ch.systemsx.cisd.etlserver.DefaultStorageProcessor - diff --git a/deep_sequencing_unit/source/core-plugins/illumina-ngs/1/dss/drop-boxes/register-flowcell-miseq/register-flowcell-miseq.py b/deep_sequencing_unit/source/core-plugins/illumina-ngs/1/dss/drop-boxes/register-flowcell-miseq/register-flowcell-miseq.py deleted file mode 100644 index c9321e6c87eb162eeee01ea5a05a815d8563bf18..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/source/core-plugins/illumina-ngs/1/dss/drop-boxes/register-flowcell-miseq/register-flowcell-miseq.py +++ /dev/null @@ -1,60 +0,0 @@ -''' -@copyright: -2012 ETH Zuerich, CISD - -@license: -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - -http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. - -@description: -Registers an incoming directory as a data set in openBIS. The name of the directory is used to -search for the matching sample. - -@note: -print statements go to: <openBIS_HOME>/datastore_server/log/startup_log.txt -expected incoming Name for MiSeq runs: 120726_M00721_0011_A000000000-A1FVF - -@author: -Manuel Kohler -''' - -from ch.systemsx.cisd.openbis.generic.shared.api.v1.dto import SearchCriteria - -DATASET_TYPE_MISEQ = "ILLUMINA_MISEQ_OUTPUT" - -def process(transaction): - - incomingPath = transaction.getIncoming().getAbsolutePath() - flowCellId = transaction.getIncoming().getName() - dataSet = transaction.createNewDataSet(DATASET_TYPE_MISEQ) - - # Create a data set and set type - dataSet.setMeasuredData(False) - - # Get the search service - search_service = transaction.getSearchService() - - # Search for the sample - sc = SearchCriteria() - sc.addMatchClause(SearchCriteria.MatchClause.createAttributeMatch(SearchCriteria.MatchClauseAttribute.CODE, flowCellId)); - foundFlowCells = search_service.searchForSamples(sc) - - # Make sure there is only one Flow cell registered with this Flow Cell Name / ID - try: - assert foundFlowCells.size() == 1 - except AssertionError: - print (str(foundFlowCells.size()) + ' flow cells found which match the criterias: '+ flowCellId) - - print (foundFlowCells) - # Add the incoming file into the data set - transaction.moveFile(incomingPath, dataSet) - dataSet.setSample(foundFlowCells[0]) diff --git a/deep_sequencing_unit/source/core-plugins/illumina-ngs/1/dss/drop-boxes/register-lane-hiseq/plugin.properties b/deep_sequencing_unit/source/core-plugins/illumina-ngs/1/dss/drop-boxes/register-lane-hiseq/plugin.properties deleted file mode 100644 index f7523f7cdec8ed261c78152f3007f7bb9947f79b..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/source/core-plugins/illumina-ngs/1/dss/drop-boxes/register-lane-hiseq/plugin.properties +++ /dev/null @@ -1,12 +0,0 @@ -# -# Drop box for registering a flow cell output as a data set -# -# Variables: -# incoming-root-dir -# Path to the directory which contains incoming directories for drop boxes. -incoming-dir = ${incoming-root-dir}/register-lane-hiseq -incoming-data-completeness-condition = marker-file -top-level-data-set-handler = ch.systemsx.cisd.etlserver.registrator.api.v2.JythonTopLevelDataSetHandlerV2 -script-path = register-lane-hiseq.py -storage-processor = ch.systemsx.cisd.etlserver.DefaultStorageProcessor - diff --git a/deep_sequencing_unit/source/core-plugins/illumina-ngs/1/dss/drop-boxes/register-lane-hiseq/register-lane-hiseq.py b/deep_sequencing_unit/source/core-plugins/illumina-ngs/1/dss/drop-boxes/register-lane-hiseq/register-lane-hiseq.py deleted file mode 100755 index 8279053de36ebaeab370e68f70a0352d3dfed7de..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/source/core-plugins/illumina-ngs/1/dss/drop-boxes/register-lane-hiseq/register-lane-hiseq.py +++ /dev/null @@ -1,279 +0,0 @@ -''' -Processes each flow lane of a Sequencing run - -Expects as incoming folder: -Project_<Flow Cell>_<Lane> -e.g.Project_110715_SN792_0054_BC035RACXX_1 or Project_110816_6354LAAXX_1 - -Note: -print statements go to: ~openbis/sprint/datastore_server/log/startup_log.txt -''' - -import os -import fnmatch -import time -import shutil -from time import * -from datetime import * -from ch.systemsx.cisd.openbis.generic.shared.api.v1.dto import SearchCriteria - -FASTQ_GZ_PATTERN = "*.fastq.gz" -METADATA_FILE_SUFFIX = "_metadata.tsv" -AFFILIATION= {'FMI': '/links/shared/dsu/dss/customers/fmi/drop-box/','BIOCENTER_BASEL': '/links/shared/dsu/dss/customers/biozentrum/drop-box/'} -AFFILIATION_PROPERTY_NAME='AFFILIATION' -INDEX1='BARCODE' -INDEX2='INDEX2' -EXTERNAL_SAMPLE_NAME='EXTERNAL_SAMPLE_NAME' - -DEFAULT_INDEX='NoIndex' - -# ------------------------------------------------------------------------------- - -def getFileNames(path): - ''' - Gets all files matching a PATTERN in a path recursively - and returns the result as a list - ''' - matches = [] - for root, dirnames, filenames in os.walk(path): - for filename in fnmatch.filter(filenames, FASTQ_GZ_PATTERN): - matches.append(os.path.join(root, filename)) - matches.sort() - return(matches) - -def writeMetadataFile (fileName, parentPropertyTypes, parentPropertiesMap, fcMetaDataDict, fcMetaDataList): - ''' - Writes a file of meta date related to one sample - ''' - try: - metaDataFile = open(fileName,'w') - for propertyType in parentPropertyTypes: - metaDataFile.write(propertyType.encode('utf-8') + "\t" + - parentPropertiesMap[propertyType].tryGetAsString().encode('utf-8') + "\n") - - metaDataFile.write("\nFLOWCELL PROPERTIES\n".encode('utf-8')) - - for fcMetaData in fcMetaDataList: - metaDataFile.write(fcMetaData.encode('utf-8') + "\t" + - fcMetaDataDict[fcMetaData].tryGetAsString().encode('utf-8') + "\n") - pass - except IOError: - print ('File error, could not write '+ fileName) - finally: - metaDataFile.close() - -def create_openbis_timestamp (): - ''' - Create an openBIS conform timestamp - ''' - tz=localtime()[3]-gmtime()[3] - d=datetime.now() - return d.strftime("%Y-%m-%d %H:%M:%S GMT"+"%+.2d" % tz+":00") - -def extraCopy (affiliation_name, path): - ''' - Handles the extra copies of the data for transfer with datamover via the - bc2 network to the FMI and BIOCENTER - For the BIOCENTER there is a folder created in which all data gets into - ''' - if (affiliation_name in AFFILIATION): - if (affiliation_name == 'BIOCENTER_BASEL'): - dirname = AFFILIATION[affiliation_name] + datetime.now().strftime("%Y-%m-%d") - if not os.path.exists(dirname): - os.mkdir(dirname) - shutil.copy(path, dirname) - else: - shutil.copy(path, AFFILIATION[affiliation_name]) -# ------------------------------------------------------------------------------- - -def getFlowCellMetaData (transaction, flowCellId): - - def sortedDictValues(adict): - keys = adict.keys() - keys.sort() - return map(adict.get, keys) - - search = transaction.getSearchService() - sc = SearchCriteria() - print('Searching FlowCell: '+ str(flowCellId)) - sc.addMatchClause(SearchCriteria.MatchClause.createAttributeMatch(SearchCriteria.MatchClauseAttribute.CODE, flowCellId)); - foundFlowCells = search.searchForSamples(sc) - - try: - assert foundFlowCells.size() == 1 - except AssertionError: - print (str(foundFlowCells.size()) + ' flow cells found which match the criterias: '+ flowCellId) - - fcPropertiesDict = {} - fcPropertyTypes = [] - - fcProperties = foundFlowCells[0].getSample().getProperties() - for property in fcProperties: - code = property.getPropertyType().getSimpleCode() - fcPropertyTypes.append(code) - fcPropertiesDict[code] = property - - fcPropertyTypes.sort() - return fcPropertiesDict, fcPropertyTypes - -# ------------------------------------------------------------------------------- - -def searchParents (search_service, parents): - - # search for the parents - sc = SearchCriteria() - # set the Search Criteria to an OR condition, default is AND - sc.setOperator(SearchCriteria.SearchOperator.MATCH_ANY_CLAUSES) - # Get the codes for all parents - for parent in parents: - parentSubCode = parent.getSubCode() - sc.addMatchClause(SearchCriteria.MatchClause.createAttributeMatch(SearchCriteria.MatchClauseAttribute.CODE, parentSubCode)); - # all parents of the flow lane - foundParents = search_service.searchForSamples(sc) - - return foundParents - -# ------------------------------------------------------------------------------- - - -def process(transaction): - - # useful for debugging: - print(datetime.now()) - - incomingPath = transaction.getIncoming().getAbsolutePath() - name = transaction.getIncoming().getName() - - folders=[] - folders=os.listdir(incomingPath) - - # expected incoming Name, e.g.: Project_110715_SN792_0054_BC035RACXX_1 - split=name.split("_") - if (len(split) == 6): - runningDate = split[1] - sequencerId = split[2] - sequentialNumber = split[3] - hiseqTray = split[4][0] - flowCellId = split[4][1:] - flowLane = split[-1] - incoming_sample=runningDate+ '_'+ sequencerId + '_' + sequentialNumber + '_' + hiseqTray + flowCellId + ':' + flowLane - # expected Project_120112_63537AAXX_1 - if (len(split) ==4): - runningDate = split[1] - flowCellId = split[2] - flowLane = split[-1] - incoming_sample=runningDate+ '_'+ flowCellId + ':' + flowLane - - # Get the search service - search_service = transaction.getSearchService() - - # Search for the incoming_sample which is a Flow Lane - sc = SearchCriteria() - print('Processing sample: '+ str(incoming_sample)) - sc.addMatchClause(SearchCriteria.MatchClause.createAttributeMatch(SearchCriteria.MatchClauseAttribute.CODE, incoming_sample)); - foundSamples = search_service.searchForSamples(sc) - - # there should be only one sample because it is unique within one Flow Cell - if (len(foundSamples) > 1): - raise Exception("More than one sample found! No unique code: " + incoming_sample) - elif (len(foundSamples) == 0): - raise Exception("No matching sample found for: " + incoming_sample) - else : - sample = foundSamples[0].getSample() - parents = sample.getParents() - - foundParents = searchParents(search_service, parents) - - # ------------------------------------------------------------------------------- - - # loop over each Sample folder within a lane - for f in range(0,len(folders)): - # Create a data set and set type - dataSet = transaction.createNewDataSet("FASTQ_GZ") - dataSet.setMeasuredData(False) - dataSet.setPropertyValue(INDEX1, DEFAULT_INDEX) - dataSet.setPropertyValue(INDEX2, DEFAULT_INDEX) - dirName = transaction.createNewDirectory(dataSet,folders[f]) - - # if multiplexed samples then there is more than one folder - pathPerLane = incomingPath + '/' + folders[f] - print ("pathPerLane: " + pathPerLane) - - # get all properties of the parent samples - for foundParent in foundParents: - parent = foundParent.getSample() - # ArrayList - parentProperties = parent.getProperties() - # just get the current code - parentCode = parent.getCode() - #print("Found parent code: "+ parentCode) - - # reformat Java ArrayList and Sort - parentPropertyTypes = [] - parentPropertiesMap = {} - for property in parentProperties: - code = property.getPropertyType().getSimpleCode() - parentPropertyTypes.append(code) - parentPropertiesMap[code] = property - try: - barcode = parentPropertiesMap[INDEX1].tryGetAsString() - if barcode == "NOINDEX": - barcode = DEFAULT_INDEX - else: - barcode.split()[-1][:-1] - except: - barcode = DEFAULT_INDEX - - try: - index2 = parentPropertiesMap[INDEX2].tryGetAsString() - if index2 == "NOINDEX": - index2 = DEFAULT_INDEX - else: - index2.split()[-1][:-1] - except: - index2 = DEFAULT_INDEX - - # just use the first six nucleotides for the naming - completeBarcode=barcode + "-" + index2 - - parentPropertyTypes.sort() - # BSSE-1754_C0364ACXX_CTTGTAA-AACC_L007_R1_001.fastq.gz - # BSSE_QGF_10002_121130_SN792_0189_AD1FBTACXX_1_NoIndex_L001_R1_001.fastq.gz - nameOfFile = parentCode.replace('-','_') + "_" + incoming_sample.replace(':', '_') + "_" + completeBarcode + "_L00" + flowLane +METADATA_FILE_SUFFIX - - print folders[f] - folderSplit = '-'.join(folders[f].split('_')[1:4]) - print "Folder split: " + folderSplit - print str(parentCode) - - if (parentCode == folderSplit): - dataSet.setPropertyValue(INDEX1, barcode) - dataSet.setPropertyValue(INDEX2, index2) - print parentPropertiesMap[EXTERNAL_SAMPLE_NAME].tryGetAsString() - dataSet.setPropertyValue(EXTERNAL_SAMPLE_NAME, parentPropertiesMap[EXTERNAL_SAMPLE_NAME].tryGetAsString()) - print("Creating metadata file:" + nameOfFile) - # get a file from the IDataSetRegistrationTransaction so it is automatically part of the data set - pathToFile = transaction.createNewFile(dataSet, folders[f], nameOfFile) - - fcMetaDataDict, fcMetaDataList = getFlowCellMetaData(transaction, incoming_sample.split(":")[0]) - writeMetadataFile(pathToFile, parentPropertyTypes, parentPropertiesMap, fcMetaDataDict, fcMetaDataList) - - affiliation_name = parentPropertiesMap[AFFILIATION_PROPERTY_NAME].tryGetAsString() - extraCopy (affiliation_name, pathToFile) - - # get all fastqs in this dataSet - fastqFileList=getFileNames(pathPerLane) - - # put the files into the dataSet - affiliation_name = parentPropertiesMap[AFFILIATION_PROPERTY_NAME].tryGetAsString() - for file in fastqFileList: - extraCopy (affiliation_name, file) - # finally add the files to the data set - transaction.moveFile(file , dataSet, folders[f]) - - if foundSamples.size() > 0: - sa = transaction.getSampleForUpdate(foundSamples[0].getSampleIdentifier()) - sa.setPropertyValue("DATA_TRANSFERRED", create_openbis_timestamp()) - dataSet.setSample(foundSamples[0]) - - shutil.rmtree(incomingPath) diff --git a/deep_sequencing_unit/source/core-plugins/illumina-ngs/1/dss/drop-boxes/register-lane-miseq/plugin.properties b/deep_sequencing_unit/source/core-plugins/illumina-ngs/1/dss/drop-boxes/register-lane-miseq/plugin.properties deleted file mode 100644 index 51c2eec3813da5c39b0241cf23c7ccdbcb611655..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/source/core-plugins/illumina-ngs/1/dss/drop-boxes/register-lane-miseq/plugin.properties +++ /dev/null @@ -1,12 +0,0 @@ -# -# Drop box for registering a flow cell output as a data set -# -# Variables: -# incoming-root-dir -# Path to the directory which contains incoming directories for drop boxes. -incoming-dir = ${incoming-root-dir}/register-lane-miseq -incoming-data-completeness-condition = marker-file -top-level-data-set-handler = ch.systemsx.cisd.etlserver.registrator.api.v2.JythonTopLevelDataSetHandlerV2 -script-path = register-lane-miseq.py -storage-processor = ch.systemsx.cisd.etlserver.DefaultStorageProcessor - diff --git a/deep_sequencing_unit/source/core-plugins/illumina-ngs/1/dss/drop-boxes/register-lane-miseq/register-lane-miseq.py b/deep_sequencing_unit/source/core-plugins/illumina-ngs/1/dss/drop-boxes/register-lane-miseq/register-lane-miseq.py deleted file mode 100755 index 5174af1295cd0755705b5ade12fa7e9629416b9d..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/source/core-plugins/illumina-ngs/1/dss/drop-boxes/register-lane-miseq/register-lane-miseq.py +++ /dev/null @@ -1,203 +0,0 @@ -''' -Processes each flow lane of a Sequencing run - -Note: -print statements go to: ~openbis/sprint/datastore_server/log/startup_log.txt -''' - -import os -import fnmatch -import time -import shutil -from time import * -from datetime import * -from itertools import islice, chain -from ch.systemsx.cisd.openbis.generic.shared.api.v1.dto import SearchCriteria - -FASTQ_GZ_PATTERN = "*.fastq.gz" -METADATA_FILE_SUFFIX = "_metadata.tsv" - -# ------------------------------------------------------------------------------- - -def getFileNames(path): - ''' - Gets all files matching a PATTERN in a path recursively - and returns the result as a list - ''' - matches = [] - for root, dirnames, filenames in os.walk(path): - for filename in fnmatch.filter(filenames, FASTQ_GZ_PATTERN): - matches.append(os.path.join(root, filename)) - matches.sort() - return(matches) - -def writeMetadataFile (fileName, parentPropertyTypes, parentPropertiesMap, fcMetaDataDict, fcMetaDataList): - ''' - Writes a file of meta date related to one sample - ''' - try: - metaDataFile = open(fileName,'w') - for propertyType in parentPropertyTypes: - metaDataFile.write(propertyType.encode('utf-8') + "\t" + - parentPropertiesMap[propertyType].tryGetAsString().encode('utf-8') + "\n") - - metaDataFile.write("\nFLOWCELL PROPERTIES\n".encode('utf-8')) - - for fcMetaData in fcMetaDataList: - metaDataFile.write(fcMetaData.encode('utf-8') + "\t" + - fcMetaDataDict[fcMetaData].tryGetAsString().encode('utf-8') + "\n") - pass - except IOError: - print ('File error, could not write '+ fileName) - finally: - metaDataFile.close() - -def create_openbis_timestamp (): - ''' - Create an openBIS conform timestamp - ''' - tz=localtime()[3]-gmtime()[3] - d=datetime.now() - return d.strftime("%Y-%m-%d %H:%M:%S GMT"+"%+.2d" % tz+":00") - -def extraCopy (affiliationName, path): - ''' - Handles the extra copies of the data for transfer with datamover via the - bc2 network to the FMI and BIOCENTER - For the BIOCENTER there is a folder created in which all data gets into - ''' - if (affiliation_name in AFFILIATION): - if (affiliation_name == 'BIOCENTER_BASEL'): - dirname = AFFILIATION[affiliation_name] + datetime.now().strftime("%Y-%m-%d") - if not os.path.exists(dirname): - os.mkdir(dirname) - shutil.copy(path, dirname) - else: - shutil.copy(path, AFFILIATION[affiliation_name]) -# ------------------------------------------------------------------------------- - -def getFlowCellMetaData (flowCellId): - - def sortedDictValues(adict): - keys = adict.keys() - keys.sort() - return map(adict.get, keys) - - search = transaction.getSearchService() - sc = SearchCriteria() - print('Searching FlowCell: '+ str(flowCellId)) - sc.addMatchClause(SearchCriteria.MatchClause.createAttributeMatch(SearchCriteria.MatchClauseAttribute.CODE, flowCellId)); - foundFlowCells = search.searchForSamples(sc) - - try: - assert foundFlowCells.size() == 1 - except AssertionError: - print (str(foundFlowCells.size()) + ' flow cells found which match the criterias: '+ flowCellId) - - fcPropertiesDict = {} - fcPropertyTypes = [] - - fcProperties = foundFlowCells[0].getSample().getProperties() - for property in fcProperties: - code = property.getPropertyType().getSimpleCode() - fcPropertyTypes.append(code) - fcPropertiesDict[code] = property - - fcPropertyTypes.sort() - return fcPropertiesDict, fcPropertyTypes - - -# ------------------------------------------------------------------------------- - -def searchForLane(lane, search_service): - - sc = SearchCriteria() - print('Processing sample: '+ str(lane)) - sc.addMatchClause(SearchCriteria.MatchClause.createAttributeMatch(SearchCriteria.MatchClauseAttribute.CODE, lane)); - foundSamples = search_service.searchForSamples(sc) - - # there should be only one sample because it is unique within one Flow Cell - if (len(foundSamples) > 1): - raise Exception("More than one sample found! No unique code: " + lane) - elif (len(foundSamples) == 0): - raise Exception("No matching sample found for: " + lane) - else : - foundLane = foundSamples[0] - - return foundLane - - -# ------------------------------------------------------------------------------- - -def searchForParents (parents, search_service): - # search for the parents - sc = SearchCriteria() - # set the Search Criteria to an OR condition, default is AND - sc.setOperator(SearchCriteria.SearchOperator.MATCH_ANY_CLAUSES) - # Get the codes for all parents - for parent in parents: - parentSubCode = parent.getSubCode() - sc.addMatchClause(SearchCriteria.MatchClause.createAttributeMatch(SearchCriteria.MatchClauseAttribute.CODE, parentSubCode)); - # all parents of the flow lane - foundParents = search_service.searchForSamples(sc) - return foundParents - - -# ------------------------------------------------------------------------------- -''' -def batch(iterable, size): - sourceiter = iter(iterable) - while True: - batchiter = islice(sourceiter, size) - yield chain([batchiter.next()], batchiter) -''' -# ------------------------------------------------------------------------------- - -def process(transaction): - - # useful for debugging: - print(datetime.now()) - - incomingPath = transaction.getIncoming().getAbsolutePath() - - # Get the incoming name - name = transaction.getIncoming().getName() - miSeqLane = name + ':1' - - # Get the search service - search_service = transaction.getSearchService() - - lane = searchForLane(miSeqLane, search_service) - - # get all fastqs in this dataSet - fastqFileList=getFileNames(incomingPath) - fastqFileList.sort() - - while fastqFileList: - - # Create a data set and set type - dataSet = transaction.createNewDataSet("FASTQ_GZ") - dataSet.setMeasuredData(False) - if len(fastqFileList) == 1: - transaction.moveFile(fastqFileList.pop(0) , dataSet) - else: - try: - currentFullPath , currentFilename = os.path.split(fastqFileList[0]) - nextFullPath , nextFilename = os.path.split(fastqFileList[1]) - - newpath = currentFullPath + "/fastq" - if not os.path.exists(newpath): - os.makedirs(newpath) - - if currentFilename.rsplit('_',2)[0] == nextFilename.rsplit('_',2)[0]: - shutil.move(fastqFileList.pop(0), newpath) - shutil.move(fastqFileList.pop(0), newpath) - transaction.moveFile(newpath , dataSet) - else: - transaction.moveFile(fastqFileList.pop(0) , dataSet) - except: - pass - dataSet.setSample(lane) - - sa = transaction.getSampleForUpdate(lane.getSampleIdentifier()) - sa.setPropertyValue("DATA_TRANSFERRED", create_openbis_timestamp()) diff --git a/deep_sequencing_unit/source/core-plugins/illumina-ngs/1/dss/drop-boxes/register-macs/plugin.properties b/deep_sequencing_unit/source/core-plugins/illumina-ngs/1/dss/drop-boxes/register-macs/plugin.properties deleted file mode 100644 index 9d5511bd58c89dd27ce13ca63e47bf838d542bab..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/source/core-plugins/illumina-ngs/1/dss/drop-boxes/register-macs/plugin.properties +++ /dev/null @@ -1,11 +0,0 @@ -# -# Drop box for registering a flow cell output as a data set -# -# Variables: -# incoming-root-dir -# Path to the directory which contains incoming directories for drop boxes. -incoming-dir = ${incoming-root-dir}/register-macs -incoming-data-completeness-condition = marker-file -top-level-data-set-handler = ch.systemsx.cisd.etlserver.registrator.api.v2.JythonTopLevelDataSetHandlerV2 -script-path = register-macs.py -storage-processor = ch.systemsx.cisd.etlserver.DefaultStorageProcessor diff --git a/deep_sequencing_unit/source/core-plugins/illumina-ngs/1/dss/drop-boxes/register-macs/register-macs.py b/deep_sequencing_unit/source/core-plugins/illumina-ngs/1/dss/drop-boxes/register-macs/register-macs.py deleted file mode 100755 index 17a9d5b074ca2038531cb770bbe4468c25d22225..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/source/core-plugins/illumina-ngs/1/dss/drop-boxes/register-macs/register-macs.py +++ /dev/null @@ -1,22 +0,0 @@ - -def process(transaction): - # Create a data set and set type - dataSet = transaction.createNewDataSet("MACS_OUTPUT") - dataSet.setPropertyValue("MACS_VERSION", "1.4.0RC2") - dataSet.setMeasuredData(False) - - incomingPath = incoming.getAbsolutePath() - - # Add the incoming file into the data set - transaction.moveFile(incomingPath, dataSet) - - # rsplit not in Python 2.2 - #sampleName = ":".join(incomingPath.split("/")[-1].rsplit("_",1)) - flowCell = "_".join((incomingPath.split("/")[-1].split("_")[2:-1])) - lane = (incomingPath.split("/")[-1]).split("_")[-1] - sampleName = flowCell + ":" + lane - - # Set the owner of the data set -- the specified sample - sample = transaction.getSample("/BSSE_BEISEL/" + sampleName) - - dataSet.setSample(sample) diff --git a/deep_sequencing_unit/source/core-plugins/illumina-ngs/1/dss/drop-boxes/register-runstatistics/plugin.properties b/deep_sequencing_unit/source/core-plugins/illumina-ngs/1/dss/drop-boxes/register-runstatistics/plugin.properties deleted file mode 100644 index 8572688f22411a37ed1f5632e4410ad5944c439b..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/source/core-plugins/illumina-ngs/1/dss/drop-boxes/register-runstatistics/plugin.properties +++ /dev/null @@ -1,11 +0,0 @@ -# -# Drop box for registering a flow cell output as a data set -# -# Variables: -# incoming-root-dir -# Path to the directory which contains incoming directories for drop boxes. -incoming-dir = ${incoming-root-dir}/register-runstatistics -incoming-data-completeness-condition = marker-file -top-level-data-set-handler = ch.systemsx.cisd.etlserver.registrator.api.v2.JythonTopLevelDataSetHandlerV2 -script-path = register-runstatistics.py -storage-processor = ch.systemsx.cisd.etlserver.DefaultStorageProcessor diff --git a/deep_sequencing_unit/source/core-plugins/illumina-ngs/1/dss/drop-boxes/register-runstatistics/register-runstatistics.py b/deep_sequencing_unit/source/core-plugins/illumina-ngs/1/dss/drop-boxes/register-runstatistics/register-runstatistics.py deleted file mode 100644 index d7b8b8400d33aa61b42ecf6cee6b7fa3c23d5165..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/source/core-plugins/illumina-ngs/1/dss/drop-boxes/register-runstatistics/register-runstatistics.py +++ /dev/null @@ -1,73 +0,0 @@ -''' -@copyright: -2012 ETH Zuerich, CISD - -@license: -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - -http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. - -@description: -Registers an incoming directory as a data set in openBIS. The name of the directory is used to -search for the matching sample. - -@note: -print statements go to: <openBIS_HOME>/datastore_server/log/startup_log.txt -expected incoming Name for HiSeq runs: 110715_SN792_0054_BC035RACXX -expected incoming Name for GAII runs: 110812_6353WAAXX - -@author: -Manuel Kohler -''' - -import os -import shutil -from ch.systemsx.cisd.openbis.generic.shared.api.v1.dto import SearchCriteria -from ch.systemsx.cisd.openbis.generic.shared.api.v1.dto import SearchSubCriteria - -def process(transaction): - - incomingPath = transaction.getIncoming().getPath() - incomingFolder = transaction.getIncoming().getName() - - folders=[] - folders=os.listdir(incomingPath) - - split=incomingFolder.split("_") - if (len(split) == 4): - IS_HISEQ_RUN=True - if (len(split) == 2): - IS_HISEQ_RUN=False - - # Get the search service - search_service = transaction.getSearchService() - - # Search for the sample - sc = SearchCriteria() - sc.addMatchClause(SearchCriteria.MatchClause.createAttributeMatch(SearchCriteria.MatchClauseAttribute.CODE, incomingFolder)); - foundSamples = search_service.searchForSamples(sc) - - if foundSamples.size() > 0: - - # Search for another data set of the same sample and make it a child of it - sampleSc = SearchCriteria() - sampleSc.addSubCriteria(SearchSubCriteria.createSampleContainerCriteria(sc)) - foundContainedSamples = search_service.searchForSamples(sampleSc) - if foundContainedSamples.size() > 0: - for fcs in range(0,foundContainedSamples.size()): - dataSet = transaction.createNewDataSet("RUNINFO") - dataSet.setMeasuredData(False) - dataSet.setSample(foundContainedSamples[fcs]) - # Add the incoming file into the data set - shutil.copytree(incomingPath, incomingPath + "_" + str(fcs+1)) - transaction.moveFile(incomingPath + "_" + str(fcs+1), dataSet) - - shutil.rmtree(incomingPath) diff --git a/deep_sequencing_unit/source/core-plugins/illumina-ngs/1/dss/drop-boxes/register-thumbnails/plugin.properties b/deep_sequencing_unit/source/core-plugins/illumina-ngs/1/dss/drop-boxes/register-thumbnails/plugin.properties deleted file mode 100644 index 5b89e279f2f7570eaf55c26d183c4a2ff102de2f..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/source/core-plugins/illumina-ngs/1/dss/drop-boxes/register-thumbnails/plugin.properties +++ /dev/null @@ -1,12 +0,0 @@ -# -# Drop box for registering a flow cell output as a data set -# -# Variables: -# incoming-root-dir -# Path to the directory which contains incoming directories for drop boxes. -incoming-dir = ${incoming-root-dir}/register-thumbnails -#incoming-dir = /links/sonas/cisd/store/incoming-flowCell -incoming-data-completeness-condition = marker-file -top-level-data-set-handler = ch.systemsx.cisd.etlserver.registrator.api.v2.JythonTopLevelDataSetHandlerV2 -script-path = register-thumbnails.py -storage-processor = ch.systemsx.cisd.etlserver.DefaultStorageProcessor diff --git a/deep_sequencing_unit/source/core-plugins/illumina-ngs/1/dss/drop-boxes/register-thumbnails/register-thumbnails.py b/deep_sequencing_unit/source/core-plugins/illumina-ngs/1/dss/drop-boxes/register-thumbnails/register-thumbnails.py deleted file mode 100644 index 60937ed4520f013555638718adc54297f27880eb..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/source/core-plugins/illumina-ngs/1/dss/drop-boxes/register-thumbnails/register-thumbnails.py +++ /dev/null @@ -1,55 +0,0 @@ -''' -@copyright: -2012 ETH Zuerich, CISD - -@license: -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - -http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. - -@description: -Registers an incoming directory as a data set in openBIS. The name of the directory is used to -search for the matching sample. - -@note: -print statements go to: <openBIS_HOME>/datastore_server/log/startup_log.txt -expected incoming Name for HiSeq runs: 110715_SN792_0054_BC035RACXX -expected incoming Name for GAII runs: 110812_6353WAAXX - -@author: -Manuel Kohler -''' - -import xml.etree.ElementTree as etree -from ch.systemsx.cisd.openbis.generic.shared.api.v1.dto import SearchCriteria - -def process(transaction): - - incomingPath = transaction.getIncoming().getPath() - name = transaction.getIncoming().getName() - - dataSet = transaction.createNewDataSet("THUMBNAILS") - - # Create a data set and set type - dataSet.setMeasuredData(False) - - # Get the search service - search_service = transaction.getSearchService() - - # Search for the sample - sc = SearchCriteria() - sc.addMatchClause(SearchCriteria.MatchClause.createAttributeMatch(SearchCriteria.MatchClauseAttribute.CODE, name)); - foundSamples = search_service.searchForSamples(sc) - - if foundSamples.size() > 0: - # Add the incoming file into the data set - transaction.moveFile(incomingPath, dataSet) - dataSet.setSample(foundSamples[0]) diff --git a/deep_sequencing_unit/source/core-plugins/illumina-ngs/1/dss/drop-boxes/register-unaligned/plugin.properties b/deep_sequencing_unit/source/core-plugins/illumina-ngs/1/dss/drop-boxes/register-unaligned/plugin.properties deleted file mode 100644 index 9c8c317b60db9215ca0b0c60a150018e92930dc1..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/source/core-plugins/illumina-ngs/1/dss/drop-boxes/register-unaligned/plugin.properties +++ /dev/null @@ -1,11 +0,0 @@ -# -# Drop box for registering a flow cell output as a data set -# -# Variables: -# incoming-root-dir -# Path to the directory which contains incoming directories for drop boxes. -incoming-dir = ${incoming-root-dir}/register-unaligned -incoming-data-completeness-condition = marker-file -top-level-data-set-handler = ch.systemsx.cisd.etlserver.registrator.api.v2.JythonTopLevelDataSetHandlerV2 -script-path = register-unaligned.py -storage-processor = ch.systemsx.cisd.etlserver.DefaultStorageProcessor diff --git a/deep_sequencing_unit/source/core-plugins/illumina-ngs/1/dss/drop-boxes/register-unaligned/register-unaligned.py b/deep_sequencing_unit/source/core-plugins/illumina-ngs/1/dss/drop-boxes/register-unaligned/register-unaligned.py deleted file mode 100755 index 8b82056105601367e3902ecd1510884b1c2e53a1..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/source/core-plugins/illumina-ngs/1/dss/drop-boxes/register-unaligned/register-unaligned.py +++ /dev/null @@ -1,179 +0,0 @@ -''' -@copyright: -2012 ETH Zuerich, CISD - -@license: -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - -http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. - -@description: -Expects as incoming folder: <FlowCell>/Unaligned_no_mismatch - -@note: - -@author: -Manuel Kohler -''' - -import os -import glob -import shutil -import time -from ch.systemsx.cisd.openbis.generic.shared.api.v1.dto import SearchCriteria -from ch.systemsx.cisd.openbis.generic.shared.api.v1.dto import SearchSubCriteria - -BASECALL_STATS_FOLDER = 'Basecall_Stats_' -REGEX_FILES = '*.*' -REGEX_MAKEFILE = 'Make*' -REGEX_LANES='/P*' -REGEX_UNDETERMINED = '/U*/Sample*' -UNALIGNED_FOLDER='Unaligned_no_mismatch' -LANE_FOLDER='/links/shared/dsu/dss/register-lane-hiseq/' -MARKER_STRING='.MARKER_is_finished_' - -def touch_markerfile(filename): - try: - # do a touch - open(filename, 'w').close() - except: - print('Could not touch ' + filename) - -def searchForLaneParents(transaction, sampleCode): - - search_service = transaction.getSearchService() - sc = SearchCriteria() - sc.addMatchClause(SearchCriteria.MatchClause.createAttributeMatch(SearchCriteria.MatchClauseAttribute.CODE, sampleCode)) - foundSamples = search_service.searchForSamples(sc) - # there should be only one sample because it is unique within one Flow Cell - if (len(foundSamples) > 1): - raise Exception("More than one sample found! No unique code: " + sampleCode) - elif (len(foundSamples) == 0): - raise Exception("No matching sample found for: " + sampleCode) - else : - sample = foundSamples[0].getSample() - parents = sample.getParents() - - # search for the parents - sc = SearchCriteria() - # set the Search Criteria to an OR condition, default is AND - sc.setOperator(SearchCriteria.SearchOperator.MATCH_ANY_CLAUSES) - # Get the codes for all parents - for parent in parents: - parentSubCode = parent.getSubCode() - sc.addMatchClause(SearchCriteria.MatchClause.createAttributeMatch(SearchCriteria.MatchClauseAttribute.CODE, parentSubCode)); - # all parents of the flow lane - foundParents = search_service.searchForSamples(sc) - - parentCodeList = [] - - for foundParent in foundParents: - parent = foundParent.getSample() - # ArrayList - parentProperties = parent.getProperties() - # just get the current code - parentCode = parent.getCode() - parentCodeList.append(parentCode) - #print("Found parent code: "+ parentCode) - - return parentCodeList - - -def renameFiles(transaction, dir, flowcellName): - # Limit of Samples when the Sample Code is still used in the renaming. If Number of Samples is - # bigger than this number, we just write the number in the file name. - - MAX_SAMPLES = 20 - FACILITY_CODE = "BSSE_QGF_" - - for root, dirs, files in os.walk(dir): - for file in files: - lane = file.split("_")[0][-1] - if lane.isdigit(): - sampleCode = flowcellName + ":" + lane - print sampleCode - parentCodeList = searchForLaneParents(transaction, sampleCode) - print parentCodeList - length = len(parentCodeList) - if length > MAX_SAMPLES: - # BSSE_QGF_96_samples_C1A8YACXX_Undetermined_L008_R1_001.fastq.gz - os.rename(root + '/' + file, root + "/" + FACILITY_CODE + str(length) + "_samples_" + flowcellName + "_" + file) - else: - # BSSE_QGF_10001_10002_10003_10004_C1A8YACXX_Undetermined_L008_R1_001.fastq.gz - SampleCodeString = "_".join([(e.split("-")[-1]) for e in parentCodeList]) - os.rename(root + '/' + file, root + "/" + FACILITY_CODE + SampleCodeString + "_" + flowcellName + "_" + file) - -def process(transaction): - - incomingPath = transaction.getIncoming().getPath() - name = transaction.getIncoming().getName() - - split=name.split("_") - if (len(split) == 4): - DSTYPE='ILLUMINA_HISEQ_OUTPUT' - flowcell=name.split("_")[-1][1:] - if (len(split) ==2): - DSTYPE='ILLUMINA_GA_OUTPUT' - flowcell=name.split("_")[-1] - - #move Lanes into a different drop box - laneList=glob.glob(incomingPath + '/'+ UNALIGNED_FOLDER + REGEX_LANES) - laneList.sort() - - undeterminedList=glob.glob(incomingPath + '/'+ UNALIGNED_FOLDER + REGEX_UNDETERMINED) - undeterminedList.sort() - - # add the Flow Cell Name to the Undetermined FASTQ files - [renameFiles(transaction, dir, name) for dir in undeterminedList] - - # Multiplexing: - # First move the Undetermined reads to the other ones - [shutil.move(undeterminedLane, laneList[int(undeterminedLane.split('/')[-1][-1])-1] +'/' + undeterminedLane.split('/')[-1]) for undeterminedLane in undeterminedList] - - [shutil.move(lane, LANE_FOLDER+lane.split('/')[-1]) for lane in laneList] - markerFileList = [touch_markerfile(LANE_FOLDER+MARKER_STRING+lane.split('/')[-1]) for lane in laneList] - - # Create a data set and set type - dataSet = transaction.createNewDataSet("BASECALL_STATS") - dataSet.setMeasuredData(False) - - # Build up a list of file which are part of the data set - fileList=glob.glob(incomingPath + '/'+ UNALIGNED_FOLDER + '/' + REGEX_FILES) - [fileList.append(i) for i in glob.glob(incomingPath + '/' + UNALIGNED_FOLDER +'/' +REGEX_MAKEFILE)] - - # Add the incoming file into the data set - transaction.createNewDirectory(dataSet, UNALIGNED_FOLDER) - # move all files is data set - [transaction.moveFile(file, dataSet, UNALIGNED_FOLDER) for file in fileList] - # move base call stat dir into data set - print("flowcell: "+flowcell) - transaction.moveFile(incomingPath + '/' + UNALIGNED_FOLDER + '/' + BASECALL_STATS_FOLDER + flowcell, dataSet, UNALIGNED_FOLDER + '/') - - # Get the search service - search_service = transaction.getSearchService() - - # Search for the sample - sc = SearchCriteria() - sc.addMatchClause(SearchCriteria.MatchClause.createAttributeMatch(SearchCriteria.MatchClauseAttribute.CODE, name)) - foundSamples = search_service.searchForSamples(sc) - - if foundSamples.size() > 0: - dataSet.setSample(foundSamples[0]) - - # Search for another data set of the same sample and make it a child of it - dataSetSc = SearchCriteria() - dataSetSc.addMatchClause(SearchCriteria.MatchClause.createAttributeMatch(SearchCriteria.MatchClauseAttribute.TYPE, DSTYPE)) - dataSetSc.addSubCriteria(SearchSubCriteria.createSampleCriteria(sc)) - foundDataSets = search_service.searchForDataSets(dataSetSc) - if foundDataSets.size() > 0: - dataSet.setParentDatasets([ds.getDataSetCode() for ds in foundDataSets]) - - shutil.rmtree(incomingPath) diff --git a/deep_sequencing_unit/source/core-plugins/illumina-ngs/1/dss/maintenance-tasks/.gitignore b/deep_sequencing_unit/source/core-plugins/illumina-ngs/1/dss/maintenance-tasks/.gitignore deleted file mode 100644 index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..0000000000000000000000000000000000000000 diff --git a/deep_sequencing_unit/source/core-plugins/illumina-ngs/1/dss/reporting-plugins/.gitignore b/deep_sequencing_unit/source/core-plugins/illumina-ngs/1/dss/reporting-plugins/.gitignore deleted file mode 100644 index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..0000000000000000000000000000000000000000 diff --git a/deep_sequencing_unit/source/core-plugins/illumina-ngs/1/dss/services/.gitignore b/deep_sequencing_unit/source/core-plugins/illumina-ngs/1/dss/services/.gitignore deleted file mode 100644 index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..0000000000000000000000000000000000000000 diff --git a/deep_sequencing_unit/source/core-plugins/illumina-ngs/2/as/initialize-master-data.py b/deep_sequencing_unit/source/core-plugins/illumina-ngs/2/as/initialize-master-data.py deleted file mode 100644 index 9ce62f58469461438f83938557a74daffeb40e58..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/source/core-plugins/illumina-ngs/2/as/initialize-master-data.py +++ /dev/null @@ -1,2792 +0,0 @@ -# -*- coding: utf-8 -*- -import ch.systemsx.cisd.openbis.generic.server.jython.api.v1.DataType as DataType - -print ("Importing Master Data...") - -tr = service.transaction() - - -file_type_FASTQ_PHRED_64 = tr.getOrCreateNewFileFormatType('FASTQ_PHRED_64') -file_type_FASTQ_PHRED_64.setDescription('FastQ Format with PHRED+64 quality values (as deliverd by Illumina GA Pipeline >= 1.3)') - -print "Imported 7 File Formats" -vocabulary_AGILENT_KIT = tr.getOrCreateNewVocabulary('AGILENT_KIT') -vocabulary_AGILENT_KIT.setDescription(None) -vocabulary_AGILENT_KIT.setUrlTemplate(None) -vocabulary_AGILENT_KIT.setManagedInternally(False) -vocabulary_AGILENT_KIT.setChosenFromList(True) - -vocabulary_term_AGILENT_KIT_AGILENT_DNA_KIT_1000 = tr.createNewVocabularyTerm('AGILENT_DNA_KIT_1000') -vocabulary_term_AGILENT_KIT_AGILENT_DNA_KIT_1000.setDescription(None) -vocabulary_term_AGILENT_KIT_AGILENT_DNA_KIT_1000.setLabel(None) -vocabulary_term_AGILENT_KIT_AGILENT_DNA_KIT_1000.setOrdinal(1) -vocabulary_AGILENT_KIT.addTerm(vocabulary_term_AGILENT_KIT_AGILENT_DNA_KIT_1000) - -vocabulary_term_AGILENT_KIT_AGILENT_HIGH_SENSITIVITY_DNA_KIT = tr.createNewVocabularyTerm('AGILENT_HIGH_SENSITIVITY_DNA_KIT') -vocabulary_term_AGILENT_KIT_AGILENT_HIGH_SENSITIVITY_DNA_KIT.setDescription(None) -vocabulary_term_AGILENT_KIT_AGILENT_HIGH_SENSITIVITY_DNA_KIT.setLabel(None) -vocabulary_term_AGILENT_KIT_AGILENT_HIGH_SENSITIVITY_DNA_KIT.setOrdinal(2) -vocabulary_AGILENT_KIT.addTerm(vocabulary_term_AGILENT_KIT_AGILENT_HIGH_SENSITIVITY_DNA_KIT) - -vocabulary_ALIGNMENT_SOFTWARE = tr.getOrCreateNewVocabulary('ALIGNMENT_SOFTWARE') -vocabulary_ALIGNMENT_SOFTWARE.setDescription('If an alignment is requested, which software package should be use?') -vocabulary_ALIGNMENT_SOFTWARE.setUrlTemplate(None) -vocabulary_ALIGNMENT_SOFTWARE.setManagedInternally(False) -vocabulary_ALIGNMENT_SOFTWARE.setChosenFromList(True) - -vocabulary_term_ALIGNMENT_SOFTWARE_NOT_NEEDED = tr.createNewVocabularyTerm('NOT_NEEDED') -vocabulary_term_ALIGNMENT_SOFTWARE_NOT_NEEDED.setDescription(None) -vocabulary_term_ALIGNMENT_SOFTWARE_NOT_NEEDED.setLabel(None) -vocabulary_term_ALIGNMENT_SOFTWARE_NOT_NEEDED.setOrdinal(1) -vocabulary_ALIGNMENT_SOFTWARE.addTerm(vocabulary_term_ALIGNMENT_SOFTWARE_NOT_NEEDED) - -vocabulary_term_ALIGNMENT_SOFTWARE_ELAND = tr.createNewVocabularyTerm('ELAND') -vocabulary_term_ALIGNMENT_SOFTWARE_ELAND.setDescription(None) -vocabulary_term_ALIGNMENT_SOFTWARE_ELAND.setLabel(None) -vocabulary_term_ALIGNMENT_SOFTWARE_ELAND.setOrdinal(2) -vocabulary_ALIGNMENT_SOFTWARE.addTerm(vocabulary_term_ALIGNMENT_SOFTWARE_ELAND) - -vocabulary_term_ALIGNMENT_SOFTWARE_MAQ = tr.createNewVocabularyTerm('MAQ') -vocabulary_term_ALIGNMENT_SOFTWARE_MAQ.setDescription(None) -vocabulary_term_ALIGNMENT_SOFTWARE_MAQ.setLabel(None) -vocabulary_term_ALIGNMENT_SOFTWARE_MAQ.setOrdinal(3) -vocabulary_ALIGNMENT_SOFTWARE.addTerm(vocabulary_term_ALIGNMENT_SOFTWARE_MAQ) - -vocabulary_term_ALIGNMENT_SOFTWARE_BWA = tr.createNewVocabularyTerm('BWA') -vocabulary_term_ALIGNMENT_SOFTWARE_BWA.setDescription(None) -vocabulary_term_ALIGNMENT_SOFTWARE_BWA.setLabel(None) -vocabulary_term_ALIGNMENT_SOFTWARE_BWA.setOrdinal(4) -vocabulary_ALIGNMENT_SOFTWARE.addTerm(vocabulary_term_ALIGNMENT_SOFTWARE_BWA) - -vocabulary_term_ALIGNMENT_SOFTWARE_NOVOALIGN = tr.createNewVocabularyTerm('NOVOALIGN') -vocabulary_term_ALIGNMENT_SOFTWARE_NOVOALIGN.setDescription(None) -vocabulary_term_ALIGNMENT_SOFTWARE_NOVOALIGN.setLabel(None) -vocabulary_term_ALIGNMENT_SOFTWARE_NOVOALIGN.setOrdinal(6) -vocabulary_ALIGNMENT_SOFTWARE.addTerm(vocabulary_term_ALIGNMENT_SOFTWARE_NOVOALIGN) - -vocabulary_term_ALIGNMENT_SOFTWARE_BOWTIE = tr.createNewVocabularyTerm('BOWTIE') -vocabulary_term_ALIGNMENT_SOFTWARE_BOWTIE.setDescription(None) -vocabulary_term_ALIGNMENT_SOFTWARE_BOWTIE.setLabel(None) -vocabulary_term_ALIGNMENT_SOFTWARE_BOWTIE.setOrdinal(7) -vocabulary_ALIGNMENT_SOFTWARE.addTerm(vocabulary_term_ALIGNMENT_SOFTWARE_BOWTIE) - -vocabulary_CASAVA_VERSION = tr.getOrCreateNewVocabulary('CASAVA_VERSION') -vocabulary_CASAVA_VERSION.setDescription('Post analyzing software') -vocabulary_CASAVA_VERSION.setUrlTemplate(None) -vocabulary_CASAVA_VERSION.setManagedInternally(False) -vocabulary_CASAVA_VERSION.setChosenFromList(True) - -vocabulary_term_CASAVA_VERSION_18 = tr.createNewVocabularyTerm('1.8') -vocabulary_term_CASAVA_VERSION_18.setDescription(None) -vocabulary_term_CASAVA_VERSION_18.setLabel(None) -vocabulary_term_CASAVA_VERSION_18.setOrdinal(1) -vocabulary_CASAVA_VERSION.addTerm(vocabulary_term_CASAVA_VERSION_18) - -vocabulary_term_CASAVA_VERSION_17 = tr.createNewVocabularyTerm('1.7') -vocabulary_term_CASAVA_VERSION_17.setDescription(None) -vocabulary_term_CASAVA_VERSION_17.setLabel(None) -vocabulary_term_CASAVA_VERSION_17.setOrdinal(2) -vocabulary_CASAVA_VERSION.addTerm(vocabulary_term_CASAVA_VERSION_17) - -vocabulary_CLUSTER_GENERATION_KIT_VERSION = tr.getOrCreateNewVocabulary('CLUSTER_GENERATION_KIT_VERSION') -vocabulary_CLUSTER_GENERATION_KIT_VERSION.setDescription('Version of the Cluster Generation Kit') -vocabulary_CLUSTER_GENERATION_KIT_VERSION.setUrlTemplate(None) -vocabulary_CLUSTER_GENERATION_KIT_VERSION.setManagedInternally(False) -vocabulary_CLUSTER_GENERATION_KIT_VERSION.setChosenFromList(True) - -vocabulary_term_CLUSTER_GENERATION_KIT_VERSION_TRUSEQ_CBOT_HS_V3 = tr.createNewVocabularyTerm('TRUSEQ_CBOT_HS_V3') -vocabulary_term_CLUSTER_GENERATION_KIT_VERSION_TRUSEQ_CBOT_HS_V3.setDescription(None) -vocabulary_term_CLUSTER_GENERATION_KIT_VERSION_TRUSEQ_CBOT_HS_V3.setLabel('TruSeq cBot-HS v3') -vocabulary_term_CLUSTER_GENERATION_KIT_VERSION_TRUSEQ_CBOT_HS_V3.setOrdinal(1) -vocabulary_CLUSTER_GENERATION_KIT_VERSION.addTerm(vocabulary_term_CLUSTER_GENERATION_KIT_VERSION_TRUSEQ_CBOT_HS_V3) - -vocabulary_term_CLUSTER_GENERATION_KIT_VERSION_TRUSEQ_CBOT_HS_V25 = tr.createNewVocabularyTerm('TRUSEQ_CBOT_HS_V2.5') -vocabulary_term_CLUSTER_GENERATION_KIT_VERSION_TRUSEQ_CBOT_HS_V25.setDescription(None) -vocabulary_term_CLUSTER_GENERATION_KIT_VERSION_TRUSEQ_CBOT_HS_V25.setLabel('TruSeq cBot-HS v2.5') -vocabulary_term_CLUSTER_GENERATION_KIT_VERSION_TRUSEQ_CBOT_HS_V25.setOrdinal(2) -vocabulary_CLUSTER_GENERATION_KIT_VERSION.addTerm(vocabulary_term_CLUSTER_GENERATION_KIT_VERSION_TRUSEQ_CBOT_HS_V25) - -vocabulary_term_CLUSTER_GENERATION_KIT_VERSION_TRUSEQ_CBOT_GA_V2 = tr.createNewVocabularyTerm('TRUSEQ_CBOT_GA_V2') -vocabulary_term_CLUSTER_GENERATION_KIT_VERSION_TRUSEQ_CBOT_GA_V2.setDescription(None) -vocabulary_term_CLUSTER_GENERATION_KIT_VERSION_TRUSEQ_CBOT_GA_V2.setLabel('TrueSeq cBot-GA v2') -vocabulary_term_CLUSTER_GENERATION_KIT_VERSION_TRUSEQ_CBOT_GA_V2.setOrdinal(3) -vocabulary_CLUSTER_GENERATION_KIT_VERSION.addTerm(vocabulary_term_CLUSTER_GENERATION_KIT_VERSION_TRUSEQ_CBOT_GA_V2) - -vocabulary_term_CLUSTER_GENERATION_KIT_VERSION_TRUSEQ_CS_GA_V5 = tr.createNewVocabularyTerm('TRUSEQ_CS_GA_V5') -vocabulary_term_CLUSTER_GENERATION_KIT_VERSION_TRUSEQ_CS_GA_V5.setDescription(None) -vocabulary_term_CLUSTER_GENERATION_KIT_VERSION_TRUSEQ_CS_GA_V5.setLabel('TrueSeq CS-GA v5') -vocabulary_term_CLUSTER_GENERATION_KIT_VERSION_TRUSEQ_CS_GA_V5.setOrdinal(4) -vocabulary_CLUSTER_GENERATION_KIT_VERSION.addTerm(vocabulary_term_CLUSTER_GENERATION_KIT_VERSION_TRUSEQ_CS_GA_V5) - -vocabulary_term_CLUSTER_GENERATION_KIT_VERSION_V5 = tr.createNewVocabularyTerm('V5') -vocabulary_term_CLUSTER_GENERATION_KIT_VERSION_V5.setDescription(None) -vocabulary_term_CLUSTER_GENERATION_KIT_VERSION_V5.setLabel(None) -vocabulary_term_CLUSTER_GENERATION_KIT_VERSION_V5.setOrdinal(5) -vocabulary_CLUSTER_GENERATION_KIT_VERSION.addTerm(vocabulary_term_CLUSTER_GENERATION_KIT_VERSION_V5) - -vocabulary_term_CLUSTER_GENERATION_KIT_VERSION_V4 = tr.createNewVocabularyTerm('V4') -vocabulary_term_CLUSTER_GENERATION_KIT_VERSION_V4.setDescription(None) -vocabulary_term_CLUSTER_GENERATION_KIT_VERSION_V4.setLabel(None) -vocabulary_term_CLUSTER_GENERATION_KIT_VERSION_V4.setOrdinal(6) -vocabulary_CLUSTER_GENERATION_KIT_VERSION.addTerm(vocabulary_term_CLUSTER_GENERATION_KIT_VERSION_V4) - -vocabulary_term_CLUSTER_GENERATION_KIT_VERSION_V2 = tr.createNewVocabularyTerm('V2') -vocabulary_term_CLUSTER_GENERATION_KIT_VERSION_V2.setDescription(None) -vocabulary_term_CLUSTER_GENERATION_KIT_VERSION_V2.setLabel(None) -vocabulary_term_CLUSTER_GENERATION_KIT_VERSION_V2.setOrdinal(7) -vocabulary_CLUSTER_GENERATION_KIT_VERSION.addTerm(vocabulary_term_CLUSTER_GENERATION_KIT_VERSION_V2) - -vocabulary_CLUSTER_STATION = tr.getOrCreateNewVocabulary('CLUSTER_STATION') -vocabulary_CLUSTER_STATION.setDescription('Cluster Station') -vocabulary_CLUSTER_STATION.setUrlTemplate(None) -vocabulary_CLUSTER_STATION.setManagedInternally(False) -vocabulary_CLUSTER_STATION.setChosenFromList(True) - -vocabulary_term_CLUSTER_STATION_CBOT = tr.createNewVocabularyTerm('CBOT') -vocabulary_term_CLUSTER_STATION_CBOT.setDescription(None) -vocabulary_term_CLUSTER_STATION_CBOT.setLabel('cBot') -vocabulary_term_CLUSTER_STATION_CBOT.setOrdinal(1) -vocabulary_CLUSTER_STATION.addTerm(vocabulary_term_CLUSTER_STATION_CBOT) - -vocabulary_term_CLUSTER_STATION_CBOT2 = tr.createNewVocabularyTerm('CBOT2') -vocabulary_term_CLUSTER_STATION_CBOT2.setDescription('Second cBot') -vocabulary_term_CLUSTER_STATION_CBOT2.setLabel('cBot2') -vocabulary_term_CLUSTER_STATION_CBOT2.setOrdinal(2) -vocabulary_CLUSTER_STATION.addTerm(vocabulary_term_CLUSTER_STATION_CBOT2) - -vocabulary_CONTROL_LANE = tr.getOrCreateNewVocabulary('CONTROL_LANE') -vocabulary_CONTROL_LANE.setDescription(None) -vocabulary_CONTROL_LANE.setUrlTemplate(None) -vocabulary_CONTROL_LANE.setManagedInternally(False) -vocabulary_CONTROL_LANE.setChosenFromList(True) - -vocabulary_term_CONTROL_LANE_1 = tr.createNewVocabularyTerm('1') -vocabulary_term_CONTROL_LANE_1.setDescription(None) -vocabulary_term_CONTROL_LANE_1.setLabel(None) -vocabulary_term_CONTROL_LANE_1.setOrdinal(1) -vocabulary_CONTROL_LANE.addTerm(vocabulary_term_CONTROL_LANE_1) - -vocabulary_term_CONTROL_LANE_2 = tr.createNewVocabularyTerm('2') -vocabulary_term_CONTROL_LANE_2.setDescription(None) -vocabulary_term_CONTROL_LANE_2.setLabel(None) -vocabulary_term_CONTROL_LANE_2.setOrdinal(2) -vocabulary_CONTROL_LANE.addTerm(vocabulary_term_CONTROL_LANE_2) - -vocabulary_term_CONTROL_LANE_3 = tr.createNewVocabularyTerm('3') -vocabulary_term_CONTROL_LANE_3.setDescription(None) -vocabulary_term_CONTROL_LANE_3.setLabel(None) -vocabulary_term_CONTROL_LANE_3.setOrdinal(3) -vocabulary_CONTROL_LANE.addTerm(vocabulary_term_CONTROL_LANE_3) - -vocabulary_term_CONTROL_LANE_4 = tr.createNewVocabularyTerm('4') -vocabulary_term_CONTROL_LANE_4.setDescription(None) -vocabulary_term_CONTROL_LANE_4.setLabel(None) -vocabulary_term_CONTROL_LANE_4.setOrdinal(4) -vocabulary_CONTROL_LANE.addTerm(vocabulary_term_CONTROL_LANE_4) - -vocabulary_term_CONTROL_LANE_5 = tr.createNewVocabularyTerm('5') -vocabulary_term_CONTROL_LANE_5.setDescription(None) -vocabulary_term_CONTROL_LANE_5.setLabel(None) -vocabulary_term_CONTROL_LANE_5.setOrdinal(5) -vocabulary_CONTROL_LANE.addTerm(vocabulary_term_CONTROL_LANE_5) - -vocabulary_term_CONTROL_LANE_6 = tr.createNewVocabularyTerm('6') -vocabulary_term_CONTROL_LANE_6.setDescription(None) -vocabulary_term_CONTROL_LANE_6.setLabel(None) -vocabulary_term_CONTROL_LANE_6.setOrdinal(6) -vocabulary_CONTROL_LANE.addTerm(vocabulary_term_CONTROL_LANE_6) - -vocabulary_term_CONTROL_LANE_7 = tr.createNewVocabularyTerm('7') -vocabulary_term_CONTROL_LANE_7.setDescription(None) -vocabulary_term_CONTROL_LANE_7.setLabel(None) -vocabulary_term_CONTROL_LANE_7.setOrdinal(7) -vocabulary_CONTROL_LANE.addTerm(vocabulary_term_CONTROL_LANE_7) - -vocabulary_term_CONTROL_LANE_8 = tr.createNewVocabularyTerm('8') -vocabulary_term_CONTROL_LANE_8.setDescription(None) -vocabulary_term_CONTROL_LANE_8.setLabel(None) -vocabulary_term_CONTROL_LANE_8.setOrdinal(8) -vocabulary_CONTROL_LANE.addTerm(vocabulary_term_CONTROL_LANE_8) - -vocabulary_term_CONTROL_LANE_NONE = tr.createNewVocabularyTerm('NONE') -vocabulary_term_CONTROL_LANE_NONE.setDescription(None) -vocabulary_term_CONTROL_LANE_NONE.setLabel(None) -vocabulary_term_CONTROL_LANE_NONE.setOrdinal(9) -vocabulary_CONTROL_LANE.addTerm(vocabulary_term_CONTROL_LANE_NONE) - -vocabulary_term_CONTROL_LANE_0 = tr.createNewVocabularyTerm('0') -vocabulary_term_CONTROL_LANE_0.setDescription(None) -vocabulary_term_CONTROL_LANE_0.setLabel(None) -vocabulary_term_CONTROL_LANE_0.setOrdinal(10) -vocabulary_CONTROL_LANE.addTerm(vocabulary_term_CONTROL_LANE_0) - -vocabulary_END_TYPE = tr.getOrCreateNewVocabulary('END_TYPE') -vocabulary_END_TYPE.setDescription('Sequencing method') -vocabulary_END_TYPE.setUrlTemplate(None) -vocabulary_END_TYPE.setManagedInternally(False) -vocabulary_END_TYPE.setChosenFromList(True) - -vocabulary_term_END_TYPE_SINGLE_READ = tr.createNewVocabularyTerm('SINGLE_READ') -vocabulary_term_END_TYPE_SINGLE_READ.setDescription(None) -vocabulary_term_END_TYPE_SINGLE_READ.setLabel(None) -vocabulary_term_END_TYPE_SINGLE_READ.setOrdinal(1) -vocabulary_END_TYPE.addTerm(vocabulary_term_END_TYPE_SINGLE_READ) - -vocabulary_term_END_TYPE_PAIRED_END = tr.createNewVocabularyTerm('PAIRED_END') -vocabulary_term_END_TYPE_PAIRED_END.setDescription(None) -vocabulary_term_END_TYPE_PAIRED_END.setLabel(None) -vocabulary_term_END_TYPE_PAIRED_END.setOrdinal(2) -vocabulary_END_TYPE.addTerm(vocabulary_term_END_TYPE_PAIRED_END) - -vocabulary_EXPERIMENT_DESIGN = tr.getOrCreateNewVocabulary('EXPERIMENT_DESIGN') -vocabulary_EXPERIMENT_DESIGN.setDescription('General Intent') -vocabulary_EXPERIMENT_DESIGN.setUrlTemplate(None) -vocabulary_EXPERIMENT_DESIGN.setManagedInternally(False) -vocabulary_EXPERIMENT_DESIGN.setChosenFromList(True) - -vocabulary_term_EXPERIMENT_DESIGN_BINDING_SITE_IDENTIFICATION = tr.createNewVocabularyTerm('BINDING_SITE_IDENTIFICATION') -vocabulary_term_EXPERIMENT_DESIGN_BINDING_SITE_IDENTIFICATION.setDescription(None) -vocabulary_term_EXPERIMENT_DESIGN_BINDING_SITE_IDENTIFICATION.setLabel('Binding Site Identification') -vocabulary_term_EXPERIMENT_DESIGN_BINDING_SITE_IDENTIFICATION.setOrdinal(1) -vocabulary_EXPERIMENT_DESIGN.addTerm(vocabulary_term_EXPERIMENT_DESIGN_BINDING_SITE_IDENTIFICATION) - -vocabulary_term_EXPERIMENT_DESIGN_CHROMATIN_MARKS = tr.createNewVocabularyTerm('CHROMATIN_MARKS') -vocabulary_term_EXPERIMENT_DESIGN_CHROMATIN_MARKS.setDescription(None) -vocabulary_term_EXPERIMENT_DESIGN_CHROMATIN_MARKS.setLabel('Chromatin Marks') -vocabulary_term_EXPERIMENT_DESIGN_CHROMATIN_MARKS.setOrdinal(2) -vocabulary_EXPERIMENT_DESIGN.addTerm(vocabulary_term_EXPERIMENT_DESIGN_CHROMATIN_MARKS) - -vocabulary_term_EXPERIMENT_DESIGN_COMPARATIVE_GENOMIC_HYBRIDIZATION = tr.createNewVocabularyTerm('COMPARATIVE_GENOMIC_HYBRIDIZATION') -vocabulary_term_EXPERIMENT_DESIGN_COMPARATIVE_GENOMIC_HYBRIDIZATION.setDescription(None) -vocabulary_term_EXPERIMENT_DESIGN_COMPARATIVE_GENOMIC_HYBRIDIZATION.setLabel('Comparative Genomic Hybridization') -vocabulary_term_EXPERIMENT_DESIGN_COMPARATIVE_GENOMIC_HYBRIDIZATION.setOrdinal(3) -vocabulary_EXPERIMENT_DESIGN.addTerm(vocabulary_term_EXPERIMENT_DESIGN_COMPARATIVE_GENOMIC_HYBRIDIZATION) - -vocabulary_term_EXPERIMENT_DESIGN_DIFFERENTIAL_EXPRESSION = tr.createNewVocabularyTerm('DIFFERENTIAL_EXPRESSION') -vocabulary_term_EXPERIMENT_DESIGN_DIFFERENTIAL_EXPRESSION.setDescription(None) -vocabulary_term_EXPERIMENT_DESIGN_DIFFERENTIAL_EXPRESSION.setLabel('Differential Expression') -vocabulary_term_EXPERIMENT_DESIGN_DIFFERENTIAL_EXPRESSION.setOrdinal(4) -vocabulary_EXPERIMENT_DESIGN.addTerm(vocabulary_term_EXPERIMENT_DESIGN_DIFFERENTIAL_EXPRESSION) - -vocabulary_term_EXPERIMENT_DESIGN_DIFFERENTIAL_SPLICING = tr.createNewVocabularyTerm('DIFFERENTIAL_SPLICING') -vocabulary_term_EXPERIMENT_DESIGN_DIFFERENTIAL_SPLICING.setDescription(None) -vocabulary_term_EXPERIMENT_DESIGN_DIFFERENTIAL_SPLICING.setLabel('Differential Splicing') -vocabulary_term_EXPERIMENT_DESIGN_DIFFERENTIAL_SPLICING.setOrdinal(5) -vocabulary_EXPERIMENT_DESIGN.addTerm(vocabulary_term_EXPERIMENT_DESIGN_DIFFERENTIAL_SPLICING) - -vocabulary_term_EXPERIMENT_DESIGN_EXPRESSION = tr.createNewVocabularyTerm('EXPRESSION') -vocabulary_term_EXPERIMENT_DESIGN_EXPRESSION.setDescription(None) -vocabulary_term_EXPERIMENT_DESIGN_EXPRESSION.setLabel('Expression') -vocabulary_term_EXPERIMENT_DESIGN_EXPRESSION.setOrdinal(6) -vocabulary_EXPERIMENT_DESIGN.addTerm(vocabulary_term_EXPERIMENT_DESIGN_EXPRESSION) - -vocabulary_term_EXPERIMENT_DESIGN_SEQUENCE_ENRICHMENT = tr.createNewVocabularyTerm('SEQUENCE_ENRICHMENT') -vocabulary_term_EXPERIMENT_DESIGN_SEQUENCE_ENRICHMENT.setDescription(None) -vocabulary_term_EXPERIMENT_DESIGN_SEQUENCE_ENRICHMENT.setLabel('Sequence Enrichment') -vocabulary_term_EXPERIMENT_DESIGN_SEQUENCE_ENRICHMENT.setOrdinal(7) -vocabulary_EXPERIMENT_DESIGN.addTerm(vocabulary_term_EXPERIMENT_DESIGN_SEQUENCE_ENRICHMENT) - -vocabulary_term_EXPERIMENT_DESIGN_TRANSCRIPT_IDENTIFICATION = tr.createNewVocabularyTerm('TRANSCRIPT_IDENTIFICATION') -vocabulary_term_EXPERIMENT_DESIGN_TRANSCRIPT_IDENTIFICATION.setDescription(None) -vocabulary_term_EXPERIMENT_DESIGN_TRANSCRIPT_IDENTIFICATION.setLabel('Transcript Identification') -vocabulary_term_EXPERIMENT_DESIGN_TRANSCRIPT_IDENTIFICATION.setOrdinal(8) -vocabulary_EXPERIMENT_DESIGN.addTerm(vocabulary_term_EXPERIMENT_DESIGN_TRANSCRIPT_IDENTIFICATION) - -vocabulary_term_EXPERIMENT_DESIGN_OTHER = tr.createNewVocabularyTerm('OTHER') -vocabulary_term_EXPERIMENT_DESIGN_OTHER.setDescription(None) -vocabulary_term_EXPERIMENT_DESIGN_OTHER.setLabel('Other') -vocabulary_term_EXPERIMENT_DESIGN_OTHER.setOrdinal(9) -vocabulary_EXPERIMENT_DESIGN.addTerm(vocabulary_term_EXPERIMENT_DESIGN_OTHER) - -vocabulary_INDEX1 = tr.getOrCreateNewVocabulary('INDEX1') -vocabulary_INDEX1.setDescription('Index 1 for Illumina Indexing') -vocabulary_INDEX1.setUrlTemplate(None) -vocabulary_INDEX1.setManagedInternally(False) -vocabulary_INDEX1.setChosenFromList(True) - -vocabulary_term_INDEX1_NONE = tr.createNewVocabularyTerm('NONE') -vocabulary_term_INDEX1_NONE.setDescription('No Index') -vocabulary_term_INDEX1_NONE.setLabel(' None') -vocabulary_term_INDEX1_NONE.setOrdinal(1) -vocabulary_INDEX1.addTerm(vocabulary_term_INDEX1_NONE) - -vocabulary_term_INDEX1_ATCACGA = tr.createNewVocabularyTerm('ATCACGA') -vocabulary_term_INDEX1_ATCACGA.setDescription('Illumina, Nextera or Scriptseq') -vocabulary_term_INDEX1_ATCACGA.setLabel('Index1 ATCACGA') -vocabulary_term_INDEX1_ATCACGA.setOrdinal(2) -vocabulary_INDEX1.addTerm(vocabulary_term_INDEX1_ATCACGA) - -vocabulary_term_INDEX1_CGATGTA = tr.createNewVocabularyTerm('CGATGTA') -vocabulary_term_INDEX1_CGATGTA.setDescription('Illumina, Nextera or Scriptseq') -vocabulary_term_INDEX1_CGATGTA.setLabel('Index2 CGATGTA') -vocabulary_term_INDEX1_CGATGTA.setOrdinal(3) -vocabulary_INDEX1.addTerm(vocabulary_term_INDEX1_CGATGTA) - -vocabulary_term_INDEX1_TTAGGCA = tr.createNewVocabularyTerm('TTAGGCA') -vocabulary_term_INDEX1_TTAGGCA.setDescription('Illumina, Nextera or Scriptseq') -vocabulary_term_INDEX1_TTAGGCA.setLabel('Index3 TTAGGCA') -vocabulary_term_INDEX1_TTAGGCA.setOrdinal(4) -vocabulary_INDEX1.addTerm(vocabulary_term_INDEX1_TTAGGCA) - -vocabulary_term_INDEX1_TGACCAA = tr.createNewVocabularyTerm('TGACCAA') -vocabulary_term_INDEX1_TGACCAA.setDescription('Illumina, Nextera or Scriptseq') -vocabulary_term_INDEX1_TGACCAA.setLabel('Index4 TGACCAA') -vocabulary_term_INDEX1_TGACCAA.setOrdinal(5) -vocabulary_INDEX1.addTerm(vocabulary_term_INDEX1_TGACCAA) - -vocabulary_term_INDEX1_ACAGTGA = tr.createNewVocabularyTerm('ACAGTGA') -vocabulary_term_INDEX1_ACAGTGA.setDescription('Illumina, Nextera or Scriptseq') -vocabulary_term_INDEX1_ACAGTGA.setLabel('Index5 ACAGTGA') -vocabulary_term_INDEX1_ACAGTGA.setOrdinal(6) -vocabulary_INDEX1.addTerm(vocabulary_term_INDEX1_ACAGTGA) - -vocabulary_term_INDEX1_GCCAATA = tr.createNewVocabularyTerm('GCCAATA') -vocabulary_term_INDEX1_GCCAATA.setDescription('Illumina, Nextera or Scriptseq') -vocabulary_term_INDEX1_GCCAATA.setLabel('Index6 GCCAATA') -vocabulary_term_INDEX1_GCCAATA.setOrdinal(7) -vocabulary_INDEX1.addTerm(vocabulary_term_INDEX1_GCCAATA) - -vocabulary_term_INDEX1_CAGATCA = tr.createNewVocabularyTerm('CAGATCA') -vocabulary_term_INDEX1_CAGATCA.setDescription('Illumina, Nextera or Scriptseq') -vocabulary_term_INDEX1_CAGATCA.setLabel('Index7 CAGATCA') -vocabulary_term_INDEX1_CAGATCA.setOrdinal(8) -vocabulary_INDEX1.addTerm(vocabulary_term_INDEX1_CAGATCA) - -vocabulary_term_INDEX1_ACTTGAA = tr.createNewVocabularyTerm('ACTTGAA') -vocabulary_term_INDEX1_ACTTGAA.setDescription('Illumina, Nextera or Scriptseq') -vocabulary_term_INDEX1_ACTTGAA.setLabel('Index8 ACTTGAA') -vocabulary_term_INDEX1_ACTTGAA.setOrdinal(9) -vocabulary_INDEX1.addTerm(vocabulary_term_INDEX1_ACTTGAA) - -vocabulary_term_INDEX1_GATCAGA = tr.createNewVocabularyTerm('GATCAGA') -vocabulary_term_INDEX1_GATCAGA.setDescription('Illumina, Nextera or Scriptseq') -vocabulary_term_INDEX1_GATCAGA.setLabel('Index9 GATCAGA') -vocabulary_term_INDEX1_GATCAGA.setOrdinal(10) -vocabulary_INDEX1.addTerm(vocabulary_term_INDEX1_GATCAGA) - -vocabulary_term_INDEX1_TAGCTTA = tr.createNewVocabularyTerm('TAGCTTA') -vocabulary_term_INDEX1_TAGCTTA.setDescription('Illumina, Nextera or Scriptseq') -vocabulary_term_INDEX1_TAGCTTA.setLabel('Index10 TAGCTTA') -vocabulary_term_INDEX1_TAGCTTA.setOrdinal(11) -vocabulary_INDEX1.addTerm(vocabulary_term_INDEX1_TAGCTTA) - -vocabulary_term_INDEX1_GGCTACA = tr.createNewVocabularyTerm('GGCTACA') -vocabulary_term_INDEX1_GGCTACA.setDescription('Illumina, Nextera or Scriptseq') -vocabulary_term_INDEX1_GGCTACA.setLabel('Index11 GGCTACA') -vocabulary_term_INDEX1_GGCTACA.setOrdinal(12) -vocabulary_INDEX1.addTerm(vocabulary_term_INDEX1_GGCTACA) - -vocabulary_term_INDEX1_CTTGTAA = tr.createNewVocabularyTerm('CTTGTAA') -vocabulary_term_INDEX1_CTTGTAA.setDescription('Illumina, Nextera or Scriptseq') -vocabulary_term_INDEX1_CTTGTAA.setLabel('Index12 CTTGTAA') -vocabulary_term_INDEX1_CTTGTAA.setOrdinal(13) -vocabulary_INDEX1.addTerm(vocabulary_term_INDEX1_CTTGTAA) - -vocabulary_term_INDEX1_AGATACA = tr.createNewVocabularyTerm('AGATACA') -vocabulary_term_INDEX1_AGATACA.setDescription('Illumina, Nextera or Scriptseq') -vocabulary_term_INDEX1_AGATACA.setLabel('Index13 AGATAC') -vocabulary_term_INDEX1_AGATACA.setOrdinal(14) -vocabulary_INDEX1.addTerm(vocabulary_term_INDEX1_AGATACA) - -vocabulary_term_INDEX1_AGTTCCG = tr.createNewVocabularyTerm('AGTTCCG') -vocabulary_term_INDEX1_AGTTCCG.setDescription('Illumina, Nextera or Scriptseq') -vocabulary_term_INDEX1_AGTTCCG.setLabel('Index14 AGTTCCG') -vocabulary_term_INDEX1_AGTTCCG.setOrdinal(15) -vocabulary_INDEX1.addTerm(vocabulary_term_INDEX1_AGTTCCG) - -vocabulary_term_INDEX1_ATGTCAG = tr.createNewVocabularyTerm('ATGTCAG') -vocabulary_term_INDEX1_ATGTCAG.setDescription('Illumina, Nextera or Scriptseq') -vocabulary_term_INDEX1_ATGTCAG.setLabel('Index15 ATGTCAG') -vocabulary_term_INDEX1_ATGTCAG.setOrdinal(16) -vocabulary_INDEX1.addTerm(vocabulary_term_INDEX1_ATGTCAG) - -vocabulary_term_INDEX1_CCGTCCC = tr.createNewVocabularyTerm('CCGTCCC') -vocabulary_term_INDEX1_CCGTCCC.setDescription('Illumina, Nextera or Scriptseq') -vocabulary_term_INDEX1_CCGTCCC.setLabel('Index16 CCGTCCC') -vocabulary_term_INDEX1_CCGTCCC.setOrdinal(17) -vocabulary_INDEX1.addTerm(vocabulary_term_INDEX1_CCGTCCC) - -vocabulary_term_INDEX1_GTCCGCA = tr.createNewVocabularyTerm('GTCCGCA') -vocabulary_term_INDEX1_GTCCGCA.setDescription('Illumina, Nextera or Scriptseq') -vocabulary_term_INDEX1_GTCCGCA.setLabel('Index18 GTCCGCA') -vocabulary_term_INDEX1_GTCCGCA.setOrdinal(18) -vocabulary_INDEX1.addTerm(vocabulary_term_INDEX1_GTCCGCA) - -vocabulary_term_INDEX1_GTGAAAC = tr.createNewVocabularyTerm('GTGAAAC') -vocabulary_term_INDEX1_GTGAAAC.setDescription('Illumina, Nextera or Scriptseq') -vocabulary_term_INDEX1_GTGAAAC.setLabel('Index19 GTGAAAC') -vocabulary_term_INDEX1_GTGAAAC.setOrdinal(19) -vocabulary_INDEX1.addTerm(vocabulary_term_INDEX1_GTGAAAC) - -vocabulary_term_INDEX1_GTGGCCT = tr.createNewVocabularyTerm('GTGGCCT') -vocabulary_term_INDEX1_GTGGCCT.setDescription('Illumina, Nextera or Scriptseq') -vocabulary_term_INDEX1_GTGGCCT.setLabel('Index20 GTGGCCT') -vocabulary_term_INDEX1_GTGGCCT.setOrdinal(20) -vocabulary_INDEX1.addTerm(vocabulary_term_INDEX1_GTGGCCT) - -vocabulary_term_INDEX1_GTTTCGG = tr.createNewVocabularyTerm('GTTTCGG') -vocabulary_term_INDEX1_GTTTCGG.setDescription('Illumina, Nextera or Scriptseq') -vocabulary_term_INDEX1_GTTTCGG.setLabel('Index21 GTTTCGG') -vocabulary_term_INDEX1_GTTTCGG.setOrdinal(21) -vocabulary_INDEX1.addTerm(vocabulary_term_INDEX1_GTTTCGG) - -vocabulary_term_INDEX1_CGTACGT = tr.createNewVocabularyTerm('CGTACGT') -vocabulary_term_INDEX1_CGTACGT.setDescription('Illumina, Nextera or Scriptseq') -vocabulary_term_INDEX1_CGTACGT.setLabel('Index22 CGTACGT') -vocabulary_term_INDEX1_CGTACGT.setOrdinal(22) -vocabulary_INDEX1.addTerm(vocabulary_term_INDEX1_CGTACGT) - -vocabulary_term_INDEX1_GAGTGGA = tr.createNewVocabularyTerm('GAGTGGA') -vocabulary_term_INDEX1_GAGTGGA.setDescription('Illumina, Nextera or Scriptseq') -vocabulary_term_INDEX1_GAGTGGA.setLabel('Index23 GAGTGGA') -vocabulary_term_INDEX1_GAGTGGA.setOrdinal(23) -vocabulary_INDEX1.addTerm(vocabulary_term_INDEX1_GAGTGGA) - -vocabulary_term_INDEX1_ACTGATA = tr.createNewVocabularyTerm('ACTGATA') -vocabulary_term_INDEX1_ACTGATA.setDescription('Illumina, Nextera or Scriptseq') -vocabulary_term_INDEX1_ACTGATA.setLabel('Index25 ACTGATA') -vocabulary_term_INDEX1_ACTGATA.setOrdinal(24) -vocabulary_INDEX1.addTerm(vocabulary_term_INDEX1_ACTGATA) - -vocabulary_term_INDEX1_ATTCCTT = tr.createNewVocabularyTerm('ATTCCTT') -vocabulary_term_INDEX1_ATTCCTT.setDescription('Illumina, Nextera or Scriptseq') -vocabulary_term_INDEX1_ATTCCTT.setLabel('Index27 ATTCCTT') -vocabulary_term_INDEX1_ATTCCTT.setOrdinal(25) -vocabulary_INDEX1.addTerm(vocabulary_term_INDEX1_ATTCCTT) - -vocabulary_term_INDEX1_TAAGGCGA = tr.createNewVocabularyTerm('TAAGGCGA') -vocabulary_term_INDEX1_TAAGGCGA.setDescription('Nextera DNA') -vocabulary_term_INDEX1_TAAGGCGA.setLabel('Index1 (i7) N701 TAAGGCGA') -vocabulary_term_INDEX1_TAAGGCGA.setOrdinal(26) -vocabulary_INDEX1.addTerm(vocabulary_term_INDEX1_TAAGGCGA) - -vocabulary_term_INDEX1_CGTACTAG = tr.createNewVocabularyTerm('CGTACTAG') -vocabulary_term_INDEX1_CGTACTAG.setDescription('Nextera DNA') -vocabulary_term_INDEX1_CGTACTAG.setLabel('Index1 (i7) N702 CGTACTAG') -vocabulary_term_INDEX1_CGTACTAG.setOrdinal(27) -vocabulary_INDEX1.addTerm(vocabulary_term_INDEX1_CGTACTAG) - -vocabulary_term_INDEX1_AGGCAGAA = tr.createNewVocabularyTerm('AGGCAGAA') -vocabulary_term_INDEX1_AGGCAGAA.setDescription('Nextera DNA') -vocabulary_term_INDEX1_AGGCAGAA.setLabel('Index1 (i7) N703 AGGCAGAA') -vocabulary_term_INDEX1_AGGCAGAA.setOrdinal(28) -vocabulary_INDEX1.addTerm(vocabulary_term_INDEX1_AGGCAGAA) - -vocabulary_term_INDEX1_TCCTGAGC = tr.createNewVocabularyTerm('TCCTGAGC') -vocabulary_term_INDEX1_TCCTGAGC.setDescription('Nextera DNA') -vocabulary_term_INDEX1_TCCTGAGC.setLabel('Index1 (i7) N704 TCCTGAGC') -vocabulary_term_INDEX1_TCCTGAGC.setOrdinal(29) -vocabulary_INDEX1.addTerm(vocabulary_term_INDEX1_TCCTGAGC) - -vocabulary_term_INDEX1_GGACTCCT = tr.createNewVocabularyTerm('GGACTCCT') -vocabulary_term_INDEX1_GGACTCCT.setDescription('Nextera DNA') -vocabulary_term_INDEX1_GGACTCCT.setLabel('Index1 (i7) N705 GGACTCCT') -vocabulary_term_INDEX1_GGACTCCT.setOrdinal(30) -vocabulary_INDEX1.addTerm(vocabulary_term_INDEX1_GGACTCCT) - -vocabulary_term_INDEX1_TAGGCATG = tr.createNewVocabularyTerm('TAGGCATG') -vocabulary_term_INDEX1_TAGGCATG.setDescription('Nextera DNA') -vocabulary_term_INDEX1_TAGGCATG.setLabel('Index1 (i7) N706 TAGGCATG') -vocabulary_term_INDEX1_TAGGCATG.setOrdinal(31) -vocabulary_INDEX1.addTerm(vocabulary_term_INDEX1_TAGGCATG) - -vocabulary_term_INDEX1_CTCTCTAC = tr.createNewVocabularyTerm('CTCTCTAC') -vocabulary_term_INDEX1_CTCTCTAC.setDescription('Nextera DNA') -vocabulary_term_INDEX1_CTCTCTAC.setLabel('Index1 (i7) N707 CTCTCTAC') -vocabulary_term_INDEX1_CTCTCTAC.setOrdinal(32) -vocabulary_INDEX1.addTerm(vocabulary_term_INDEX1_CTCTCTAC) - -vocabulary_term_INDEX1_CAGAGAGG = tr.createNewVocabularyTerm('CAGAGAGG') -vocabulary_term_INDEX1_CAGAGAGG.setDescription('Nextera DNA') -vocabulary_term_INDEX1_CAGAGAGG.setLabel('Index1 (i7) N708 CAGAGAGG') -vocabulary_term_INDEX1_CAGAGAGG.setOrdinal(33) -vocabulary_INDEX1.addTerm(vocabulary_term_INDEX1_CAGAGAGG) - -vocabulary_term_INDEX1_GCTACGCT = tr.createNewVocabularyTerm('GCTACGCT') -vocabulary_term_INDEX1_GCTACGCT.setDescription('Nextera DNA') -vocabulary_term_INDEX1_GCTACGCT.setLabel('Index1 (i7) N709 GCTACGCT') -vocabulary_term_INDEX1_GCTACGCT.setOrdinal(34) -vocabulary_INDEX1.addTerm(vocabulary_term_INDEX1_GCTACGCT) - -vocabulary_term_INDEX1_CGAGGCTG = tr.createNewVocabularyTerm('CGAGGCTG') -vocabulary_term_INDEX1_CGAGGCTG.setDescription('Nextera DNA') -vocabulary_term_INDEX1_CGAGGCTG.setLabel('Index1 (i7) N710 CGAGGCTG') -vocabulary_term_INDEX1_CGAGGCTG.setOrdinal(35) -vocabulary_INDEX1.addTerm(vocabulary_term_INDEX1_CGAGGCTG) - -vocabulary_term_INDEX1_AAGAGGCA = tr.createNewVocabularyTerm('AAGAGGCA') -vocabulary_term_INDEX1_AAGAGGCA.setDescription('Nextera DNA') -vocabulary_term_INDEX1_AAGAGGCA.setLabel('Index1 (i7) N711 AAGAGGCA') -vocabulary_term_INDEX1_AAGAGGCA.setOrdinal(36) -vocabulary_INDEX1.addTerm(vocabulary_term_INDEX1_AAGAGGCA) - -vocabulary_term_INDEX1_GTAGAGGA = tr.createNewVocabularyTerm('GTAGAGGA') -vocabulary_term_INDEX1_GTAGAGGA.setDescription('Nextera DNA') -vocabulary_term_INDEX1_GTAGAGGA.setLabel('Index1 (i7) N712 GTAGAGGA') -vocabulary_term_INDEX1_GTAGAGGA.setOrdinal(37) -vocabulary_INDEX1.addTerm(vocabulary_term_INDEX1_GTAGAGGA) - -vocabulary_term_INDEX1_AAGACTA = tr.createNewVocabularyTerm('AAGACTA') -vocabulary_term_INDEX1_AAGACTA.setDescription(None) -vocabulary_term_INDEX1_AAGACTA.setLabel('02 AAGACT') -vocabulary_term_INDEX1_AAGACTA.setOrdinal(38) -vocabulary_INDEX1.addTerm(vocabulary_term_INDEX1_AAGACTA) - -vocabulary_term_INDEX1_ACTTCAA = tr.createNewVocabularyTerm('ACTTCAA') -vocabulary_term_INDEX1_ACTTCAA.setDescription(None) -vocabulary_term_INDEX1_ACTTCAA.setLabel('10 ACTTCA') -vocabulary_term_INDEX1_ACTTCAA.setOrdinal(39) -vocabulary_INDEX1.addTerm(vocabulary_term_INDEX1_ACTTCAA) - -vocabulary_term_INDEX1_AGGTTGA = tr.createNewVocabularyTerm('AGGTTGA') -vocabulary_term_INDEX1_AGGTTGA.setDescription(None) -vocabulary_term_INDEX1_AGGTTGA.setLabel('17 AGGTTG') -vocabulary_term_INDEX1_AGGTTGA.setOrdinal(40) -vocabulary_INDEX1.addTerm(vocabulary_term_INDEX1_AGGTTGA) - -vocabulary_term_INDEX1_TTCGTCA = tr.createNewVocabularyTerm('TTCGTCA') -vocabulary_term_INDEX1_TTCGTCA.setDescription(None) -vocabulary_term_INDEX1_TTCGTCA.setLabel('17 TTCGTCA') -vocabulary_term_INDEX1_TTCGTCA.setOrdinal(41) -vocabulary_INDEX1.addTerm(vocabulary_term_INDEX1_TTCGTCA) - -vocabulary_term_INDEX1_AGCATAA = tr.createNewVocabularyTerm('AGCATAA') -vocabulary_term_INDEX1_AGCATAA.setDescription(None) -vocabulary_term_INDEX1_AGCATAA.setLabel('20 AGCATAA') -vocabulary_term_INDEX1_AGCATAA.setOrdinal(42) -vocabulary_INDEX1.addTerm(vocabulary_term_INDEX1_AGCATAA) - -vocabulary_term_INDEX1_ATACGCA = tr.createNewVocabularyTerm('ATACGCA') -vocabulary_term_INDEX1_ATACGCA.setDescription(None) -vocabulary_term_INDEX1_ATACGCA.setLabel('20 ATACGC') -vocabulary_term_INDEX1_ATACGCA.setOrdinal(43) -vocabulary_INDEX1.addTerm(vocabulary_term_INDEX1_ATACGCA) - -vocabulary_term_INDEX1_CAGATGA = tr.createNewVocabularyTerm('CAGATGA') -vocabulary_term_INDEX1_CAGATGA.setDescription(None) -vocabulary_term_INDEX1_CAGATGA.setLabel('28 CAGATG') -vocabulary_term_INDEX1_CAGATGA.setOrdinal(44) -vocabulary_INDEX1.addTerm(vocabulary_term_INDEX1_CAGATGA) - -vocabulary_term_INDEX1_CCGAATA = tr.createNewVocabularyTerm('CCGAATA') -vocabulary_term_INDEX1_CCGAATA.setDescription(None) -vocabulary_term_INDEX1_CCGAATA.setLabel('34 CCGAAT') -vocabulary_term_INDEX1_CCGAATA.setOrdinal(45) -vocabulary_INDEX1.addTerm(vocabulary_term_INDEX1_CCGAATA) - -vocabulary_term_INDEX1_CGCTCGA = tr.createNewVocabularyTerm('CGCTCGA') -vocabulary_term_INDEX1_CGCTCGA.setDescription(None) -vocabulary_term_INDEX1_CGCTCGA.setLabel('43 CGCTCG') -vocabulary_term_INDEX1_CGCTCGA.setOrdinal(46) -vocabulary_INDEX1.addTerm(vocabulary_term_INDEX1_CGCTCGA) - -vocabulary_term_INDEX1_CGTATTA = tr.createNewVocabularyTerm('CGTATTA') -vocabulary_term_INDEX1_CGTATTA.setDescription(None) -vocabulary_term_INDEX1_CGTATTA.setLabel('45 CGTATT') -vocabulary_term_INDEX1_CGTATTA.setOrdinal(47) -vocabulary_INDEX1.addTerm(vocabulary_term_INDEX1_CGTATTA) - -vocabulary_term_INDEX1_CCATGAA = tr.createNewVocabularyTerm('CCATGAA') -vocabulary_term_INDEX1_CCATGAA.setDescription(None) -vocabulary_term_INDEX1_CCATGAA.setLabel('50 CCATGAA') -vocabulary_term_INDEX1_CCATGAA.setOrdinal(48) -vocabulary_INDEX1.addTerm(vocabulary_term_INDEX1_CCATGAA) - -vocabulary_term_INDEX1_CTGACCA = tr.createNewVocabularyTerm('CTGACCA') -vocabulary_term_INDEX1_CTGACCA.setDescription(None) -vocabulary_term_INDEX1_CTGACCA.setLabel('50 CTGACC') -vocabulary_term_INDEX1_CTGACCA.setOrdinal(49) -vocabulary_INDEX1.addTerm(vocabulary_term_INDEX1_CTGACCA) - -vocabulary_term_INDEX1_GAAGCCA = tr.createNewVocabularyTerm('GAAGCCA') -vocabulary_term_INDEX1_GAAGCCA.setDescription(None) -vocabulary_term_INDEX1_GAAGCCA.setLabel('52 GAAGCC') -vocabulary_term_INDEX1_GAAGCCA.setOrdinal(50) -vocabulary_INDEX1.addTerm(vocabulary_term_INDEX1_GAAGCCA) - -vocabulary_term_INDEX1_NOINDEX = tr.createNewVocabularyTerm('NOINDEX') -vocabulary_term_INDEX1_NOINDEX.setDescription(None) -vocabulary_term_INDEX1_NOINDEX.setLabel(None) -vocabulary_term_INDEX1_NOINDEX.setOrdinal(51) -vocabulary_INDEX1.addTerm(vocabulary_term_INDEX1_NOINDEX) - -vocabulary_term_INDEX1_GCTGAAA = tr.createNewVocabularyTerm('GCTGAAA') -vocabulary_term_INDEX1_GCTGAAA.setDescription(None) -vocabulary_term_INDEX1_GCTGAAA.setLabel('59 GCTGAA') -vocabulary_term_INDEX1_GCTGAAA.setOrdinal(52) -vocabulary_INDEX1.addTerm(vocabulary_term_INDEX1_GCTGAAA) - -vocabulary_term_INDEX1_GTCGCGA = tr.createNewVocabularyTerm('GTCGCGA') -vocabulary_term_INDEX1_GTCGCGA.setDescription(None) -vocabulary_term_INDEX1_GTCGCGA.setLabel('64 GTCGCG') -vocabulary_term_INDEX1_GTCGCGA.setOrdinal(53) -vocabulary_INDEX1.addTerm(vocabulary_term_INDEX1_GTCGCGA) - -vocabulary_term_INDEX1_TAAGATA = tr.createNewVocabularyTerm('TAAGATA') -vocabulary_term_INDEX1_TAAGATA.setDescription(None) -vocabulary_term_INDEX1_TAAGATA.setLabel('65 TAAGAT') -vocabulary_term_INDEX1_TAAGATA.setOrdinal(54) -vocabulary_INDEX1.addTerm(vocabulary_term_INDEX1_TAAGATA) - -vocabulary_term_INDEX1_GCGCTGA = tr.createNewVocabularyTerm('GCGCTGA') -vocabulary_term_INDEX1_GCGCTGA.setDescription(None) -vocabulary_term_INDEX1_GCGCTGA.setLabel('66 GCGCTGA') -vocabulary_term_INDEX1_GCGCTGA.setOrdinal(55) -vocabulary_INDEX1.addTerm(vocabulary_term_INDEX1_GCGCTGA) - -vocabulary_term_INDEX1_TATCGTA = tr.createNewVocabularyTerm('TATCGTA') -vocabulary_term_INDEX1_TATCGTA.setDescription(None) -vocabulary_term_INDEX1_TATCGTA.setLabel('66 TATCGT') -vocabulary_term_INDEX1_TATCGTA.setOrdinal(56) -vocabulary_INDEX1.addTerm(vocabulary_term_INDEX1_TATCGTA) - -vocabulary_term_INDEX1_TCCTACA = tr.createNewVocabularyTerm('TCCTACA') -vocabulary_term_INDEX1_TCCTACA.setDescription(None) -vocabulary_term_INDEX1_TCCTACA.setLabel('68 TCCTAC') -vocabulary_term_INDEX1_TCCTACA.setOrdinal(57) -vocabulary_INDEX1.addTerm(vocabulary_term_INDEX1_TCCTACA) - -vocabulary_term_INDEX1_TCTATAA = tr.createNewVocabularyTerm('TCTATAA') -vocabulary_term_INDEX1_TCTATAA.setDescription(None) -vocabulary_term_INDEX1_TCTATAA.setLabel('70 TCTATA') -vocabulary_term_INDEX1_TCTATAA.setOrdinal(58) -vocabulary_INDEX1.addTerm(vocabulary_term_INDEX1_TCTATAA) - -vocabulary_term_INDEX1_TTACTTA = tr.createNewVocabularyTerm('TTACTTA') -vocabulary_term_INDEX1_TTACTTA.setDescription(None) -vocabulary_term_INDEX1_TTACTTA.setLabel('74 TTACTT') -vocabulary_term_INDEX1_TTACTTA.setOrdinal(59) -vocabulary_INDEX1.addTerm(vocabulary_term_INDEX1_TTACTTA) - -vocabulary_term_INDEX1_TTCCGAA = tr.createNewVocabularyTerm('TTCCGAA') -vocabulary_term_INDEX1_TTCCGAA.setDescription(None) -vocabulary_term_INDEX1_TTCCGAA.setLabel('75 TTCCGA') -vocabulary_term_INDEX1_TTCCGAA.setOrdinal(60) -vocabulary_INDEX1.addTerm(vocabulary_term_INDEX1_TTCCGAA) - -vocabulary_term_INDEX1_ATGTCAA = tr.createNewVocabularyTerm('ATGTCAA') -vocabulary_term_INDEX1_ATGTCAA.setDescription(None) -vocabulary_term_INDEX1_ATGTCAA.setLabel('DNA Adapter 15') -vocabulary_term_INDEX1_ATGTCAA.setOrdinal(61) -vocabulary_INDEX1.addTerm(vocabulary_term_INDEX1_ATGTCAA) - -vocabulary_term_INDEX1_CCGTCCA = tr.createNewVocabularyTerm('CCGTCCA') -vocabulary_term_INDEX1_CCGTCCA.setDescription(None) -vocabulary_term_INDEX1_CCGTCCA.setLabel('DNA Adapter 16') -vocabulary_term_INDEX1_CCGTCCA.setOrdinal(62) -vocabulary_INDEX1.addTerm(vocabulary_term_INDEX1_CCGTCCA) - -vocabulary_term_INDEX1_GTAGAGA = tr.createNewVocabularyTerm('GTAGAGA') -vocabulary_term_INDEX1_GTAGAGA.setDescription(None) -vocabulary_term_INDEX1_GTAGAGA.setLabel('DNA Adapter 17') -vocabulary_term_INDEX1_GTAGAGA.setOrdinal(63) -vocabulary_INDEX1.addTerm(vocabulary_term_INDEX1_GTAGAGA) - -vocabulary_term_INDEX1_GTGAAAA = tr.createNewVocabularyTerm('GTGAAAA') -vocabulary_term_INDEX1_GTGAAAA.setDescription(None) -vocabulary_term_INDEX1_GTGAAAA.setLabel('DNA Adapter 19') -vocabulary_term_INDEX1_GTGAAAA.setOrdinal(64) -vocabulary_INDEX1.addTerm(vocabulary_term_INDEX1_GTGAAAA) - -vocabulary_term_INDEX1_GTGGCCA = tr.createNewVocabularyTerm('GTGGCCA') -vocabulary_term_INDEX1_GTGGCCA.setDescription(None) -vocabulary_term_INDEX1_GTGGCCA.setLabel('DNA Adapter 20') -vocabulary_term_INDEX1_GTGGCCA.setOrdinal(65) -vocabulary_INDEX1.addTerm(vocabulary_term_INDEX1_GTGGCCA) - -vocabulary_term_INDEX1_GTTTCGA = tr.createNewVocabularyTerm('GTTTCGA') -vocabulary_term_INDEX1_GTTTCGA.setDescription(None) -vocabulary_term_INDEX1_GTTTCGA.setLabel('DNA Adapter 21') -vocabulary_term_INDEX1_GTTTCGA.setOrdinal(66) -vocabulary_INDEX1.addTerm(vocabulary_term_INDEX1_GTTTCGA) - -vocabulary_term_INDEX1_CGTACGA = tr.createNewVocabularyTerm('CGTACGA') -vocabulary_term_INDEX1_CGTACGA.setDescription(None) -vocabulary_term_INDEX1_CGTACGA.setLabel('DNA Adapter 22') -vocabulary_term_INDEX1_CGTACGA.setOrdinal(67) -vocabulary_INDEX1.addTerm(vocabulary_term_INDEX1_CGTACGA) - -vocabulary_term_INDEX1_GGTAGCA = tr.createNewVocabularyTerm('GGTAGCA') -vocabulary_term_INDEX1_GGTAGCA.setDescription(None) -vocabulary_term_INDEX1_GGTAGCA.setLabel('DNA Adapter 24') -vocabulary_term_INDEX1_GGTAGCA.setOrdinal(68) -vocabulary_INDEX1.addTerm(vocabulary_term_INDEX1_GGTAGCA) - -vocabulary_term_INDEX1_ATGAGCA = tr.createNewVocabularyTerm('ATGAGCA') -vocabulary_term_INDEX1_ATGAGCA.setDescription(None) -vocabulary_term_INDEX1_ATGAGCA.setLabel('DNA Adapter 26') -vocabulary_term_INDEX1_ATGAGCA.setOrdinal(69) -vocabulary_INDEX1.addTerm(vocabulary_term_INDEX1_ATGAGCA) - -vocabulary_term_INDEX1_ATTCCTA = tr.createNewVocabularyTerm('ATTCCTA') -vocabulary_term_INDEX1_ATTCCTA.setDescription(None) -vocabulary_term_INDEX1_ATTCCTA.setLabel('DNA Adapter 27') -vocabulary_term_INDEX1_ATTCCTA.setOrdinal(70) -vocabulary_INDEX1.addTerm(vocabulary_term_INDEX1_ATTCCTA) - -vocabulary_term_INDEX1_CAAAAGA = tr.createNewVocabularyTerm('CAAAAGA') -vocabulary_term_INDEX1_CAAAAGA.setDescription(None) -vocabulary_term_INDEX1_CAAAAGA.setLabel('DNA Adapter 28') -vocabulary_term_INDEX1_CAAAAGA.setOrdinal(71) -vocabulary_INDEX1.addTerm(vocabulary_term_INDEX1_CAAAAGA) - -vocabulary_term_INDEX1_CAACTAA = tr.createNewVocabularyTerm('CAACTAA') -vocabulary_term_INDEX1_CAACTAA.setDescription(None) -vocabulary_term_INDEX1_CAACTAA.setLabel('DNA Adapter 29') -vocabulary_term_INDEX1_CAACTAA.setOrdinal(72) -vocabulary_INDEX1.addTerm(vocabulary_term_INDEX1_CAACTAA) - -vocabulary_term_INDEX1_CACCGGA = tr.createNewVocabularyTerm('CACCGGA') -vocabulary_term_INDEX1_CACCGGA.setDescription(None) -vocabulary_term_INDEX1_CACCGGA.setLabel('DNA Adapter 30') -vocabulary_term_INDEX1_CACCGGA.setOrdinal(73) -vocabulary_INDEX1.addTerm(vocabulary_term_INDEX1_CACCGGA) - -vocabulary_term_INDEX1_CACGATA = tr.createNewVocabularyTerm('CACGATA') -vocabulary_term_INDEX1_CACGATA.setDescription(None) -vocabulary_term_INDEX1_CACGATA.setLabel('DNA Adapter 31') -vocabulary_term_INDEX1_CACGATA.setOrdinal(74) -vocabulary_INDEX1.addTerm(vocabulary_term_INDEX1_CACGATA) - -vocabulary_term_INDEX1_CACTCAA = tr.createNewVocabularyTerm('CACTCAA') -vocabulary_term_INDEX1_CACTCAA.setDescription(None) -vocabulary_term_INDEX1_CACTCAA.setLabel('DNA Adapter 32') -vocabulary_term_INDEX1_CACTCAA.setOrdinal(75) -vocabulary_INDEX1.addTerm(vocabulary_term_INDEX1_CACTCAA) - -vocabulary_term_INDEX1_CAGGCGA = tr.createNewVocabularyTerm('CAGGCGA') -vocabulary_term_INDEX1_CAGGCGA.setDescription(None) -vocabulary_term_INDEX1_CAGGCGA.setLabel('DNA Adapter 33') -vocabulary_term_INDEX1_CAGGCGA.setOrdinal(76) -vocabulary_INDEX1.addTerm(vocabulary_term_INDEX1_CAGGCGA) - -vocabulary_term_INDEX1_CATGGCA = tr.createNewVocabularyTerm('CATGGCA') -vocabulary_term_INDEX1_CATGGCA.setDescription(None) -vocabulary_term_INDEX1_CATGGCA.setLabel('DNA Adapter 34') -vocabulary_term_INDEX1_CATGGCA.setOrdinal(77) -vocabulary_INDEX1.addTerm(vocabulary_term_INDEX1_CATGGCA) - -vocabulary_term_INDEX1_CATTTTA = tr.createNewVocabularyTerm('CATTTTA') -vocabulary_term_INDEX1_CATTTTA.setDescription(None) -vocabulary_term_INDEX1_CATTTTA.setLabel('DNA Adapter 35') -vocabulary_term_INDEX1_CATTTTA.setOrdinal(78) -vocabulary_INDEX1.addTerm(vocabulary_term_INDEX1_CATTTTA) - -vocabulary_term_INDEX1_CCAACAA = tr.createNewVocabularyTerm('CCAACAA') -vocabulary_term_INDEX1_CCAACAA.setDescription(None) -vocabulary_term_INDEX1_CCAACAA.setLabel('DNA Adapter 36') -vocabulary_term_INDEX1_CCAACAA.setOrdinal(79) -vocabulary_INDEX1.addTerm(vocabulary_term_INDEX1_CCAACAA) - -vocabulary_term_INDEX1_CGGAATA = tr.createNewVocabularyTerm('CGGAATA') -vocabulary_term_INDEX1_CGGAATA.setDescription(None) -vocabulary_term_INDEX1_CGGAATA.setLabel('DNA Adapter 37') -vocabulary_term_INDEX1_CGGAATA.setOrdinal(80) -vocabulary_INDEX1.addTerm(vocabulary_term_INDEX1_CGGAATA) - -vocabulary_term_INDEX1_CTAGCTA = tr.createNewVocabularyTerm('CTAGCTA') -vocabulary_term_INDEX1_CTAGCTA.setDescription(None) -vocabulary_term_INDEX1_CTAGCTA.setLabel('DNA Adapter 38') -vocabulary_term_INDEX1_CTAGCTA.setOrdinal(81) -vocabulary_INDEX1.addTerm(vocabulary_term_INDEX1_CTAGCTA) - -vocabulary_term_INDEX1_CTATACA = tr.createNewVocabularyTerm('CTATACA') -vocabulary_term_INDEX1_CTATACA.setDescription(None) -vocabulary_term_INDEX1_CTATACA.setLabel('DNA Adapter 39') -vocabulary_term_INDEX1_CTATACA.setOrdinal(82) -vocabulary_INDEX1.addTerm(vocabulary_term_INDEX1_CTATACA) - -vocabulary_term_INDEX1_CTCAGAA = tr.createNewVocabularyTerm('CTCAGAA') -vocabulary_term_INDEX1_CTCAGAA.setDescription(None) -vocabulary_term_INDEX1_CTCAGAA.setLabel('DNA Adapter 40') -vocabulary_term_INDEX1_CTCAGAA.setOrdinal(83) -vocabulary_INDEX1.addTerm(vocabulary_term_INDEX1_CTCAGAA) - -vocabulary_term_INDEX1_GACGACA = tr.createNewVocabularyTerm('GACGACA') -vocabulary_term_INDEX1_GACGACA.setDescription(None) -vocabulary_term_INDEX1_GACGACA.setLabel('DNA Adapter 41') -vocabulary_term_INDEX1_GACGACA.setOrdinal(84) -vocabulary_INDEX1.addTerm(vocabulary_term_INDEX1_GACGACA) - -vocabulary_term_INDEX1_TAATCGA = tr.createNewVocabularyTerm('TAATCGA') -vocabulary_term_INDEX1_TAATCGA.setDescription(None) -vocabulary_term_INDEX1_TAATCGA.setLabel('DNA Adapter 42') -vocabulary_term_INDEX1_TAATCGA.setOrdinal(85) -vocabulary_INDEX1.addTerm(vocabulary_term_INDEX1_TAATCGA) - -vocabulary_term_INDEX1_TACAGCA = tr.createNewVocabularyTerm('TACAGCA') -vocabulary_term_INDEX1_TACAGCA.setDescription(None) -vocabulary_term_INDEX1_TACAGCA.setLabel('DNA Adapter 43') -vocabulary_term_INDEX1_TACAGCA.setOrdinal(86) -vocabulary_INDEX1.addTerm(vocabulary_term_INDEX1_TACAGCA) - -vocabulary_term_INDEX1_TATAATA = tr.createNewVocabularyTerm('TATAATA') -vocabulary_term_INDEX1_TATAATA.setDescription(None) -vocabulary_term_INDEX1_TATAATA.setLabel('DNA Adapter 44') -vocabulary_term_INDEX1_TATAATA.setOrdinal(87) -vocabulary_INDEX1.addTerm(vocabulary_term_INDEX1_TATAATA) - -vocabulary_term_INDEX1_TCATTCA = tr.createNewVocabularyTerm('TCATTCA') -vocabulary_term_INDEX1_TCATTCA.setDescription(None) -vocabulary_term_INDEX1_TCATTCA.setLabel('DNA Adapter 45') -vocabulary_term_INDEX1_TCATTCA.setOrdinal(88) -vocabulary_INDEX1.addTerm(vocabulary_term_INDEX1_TCATTCA) - -vocabulary_term_INDEX1_TCCCGAA = tr.createNewVocabularyTerm('TCCCGAA') -vocabulary_term_INDEX1_TCCCGAA.setDescription(None) -vocabulary_term_INDEX1_TCCCGAA.setLabel('DNA Adapter 46') -vocabulary_term_INDEX1_TCCCGAA.setOrdinal(89) -vocabulary_INDEX1.addTerm(vocabulary_term_INDEX1_TCCCGAA) - -vocabulary_term_INDEX1_TCGAAGA = tr.createNewVocabularyTerm('TCGAAGA') -vocabulary_term_INDEX1_TCGAAGA.setDescription(None) -vocabulary_term_INDEX1_TCGAAGA.setLabel('DNA Adapter 47') -vocabulary_term_INDEX1_TCGAAGA.setOrdinal(90) -vocabulary_INDEX1.addTerm(vocabulary_term_INDEX1_TCGAAGA) - -vocabulary_term_INDEX1_TCGGCAA = tr.createNewVocabularyTerm('TCGGCAA') -vocabulary_term_INDEX1_TCGGCAA.setDescription(None) -vocabulary_term_INDEX1_TCGGCAA.setLabel('DNA Adapter 48') -vocabulary_term_INDEX1_TCGGCAA.setOrdinal(91) -vocabulary_INDEX1.addTerm(vocabulary_term_INDEX1_TCGGCAA) - -vocabulary_term_INDEX1_AGTCAAC = tr.createNewVocabularyTerm('AGTCAAC') -vocabulary_term_INDEX1_AGTCAAC.setDescription(None) -vocabulary_term_INDEX1_AGTCAAC.setLabel('Index13 AGTCAAC') -vocabulary_term_INDEX1_AGTCAAC.setOrdinal(92) -vocabulary_INDEX1.addTerm(vocabulary_term_INDEX1_AGTCAAC) - -vocabulary_term_INDEX1_AATGCGA = tr.createNewVocabularyTerm('AATGCGA') -vocabulary_term_INDEX1_AATGCGA.setDescription(None) -vocabulary_term_INDEX1_AATGCGA.setLabel('Lib AATGCGA') -vocabulary_term_INDEX1_AATGCGA.setOrdinal(93) -vocabulary_INDEX1.addTerm(vocabulary_term_INDEX1_AATGCGA) - -vocabulary_INDEX2 = tr.getOrCreateNewVocabulary('INDEX2') -vocabulary_INDEX2.setDescription('Index 2 for Illumina Dual Indexing') -vocabulary_INDEX2.setUrlTemplate(None) -vocabulary_INDEX2.setManagedInternally(False) -vocabulary_INDEX2.setChosenFromList(True) - -vocabulary_term_INDEX2_NONE = tr.createNewVocabularyTerm('NONE') -vocabulary_term_INDEX2_NONE.setDescription('No Index') -vocabulary_term_INDEX2_NONE.setLabel('None') -vocabulary_term_INDEX2_NONE.setOrdinal(1) -vocabulary_INDEX2.addTerm(vocabulary_term_INDEX2_NONE) - -vocabulary_term_INDEX2_TAGATCGC = tr.createNewVocabularyTerm('TAGATCGC') -vocabulary_term_INDEX2_TAGATCGC.setDescription('Nextera DNA') -vocabulary_term_INDEX2_TAGATCGC.setLabel('Index2 (i5) N501 TAGATCGC') -vocabulary_term_INDEX2_TAGATCGC.setOrdinal(2) -vocabulary_INDEX2.addTerm(vocabulary_term_INDEX2_TAGATCGC) - -vocabulary_term_INDEX2_CTCTCTAT = tr.createNewVocabularyTerm('CTCTCTAT') -vocabulary_term_INDEX2_CTCTCTAT.setDescription('Nextera DNA') -vocabulary_term_INDEX2_CTCTCTAT.setLabel('Index2 (i5) N502 CTCTCTAT') -vocabulary_term_INDEX2_CTCTCTAT.setOrdinal(3) -vocabulary_INDEX2.addTerm(vocabulary_term_INDEX2_CTCTCTAT) - -vocabulary_term_INDEX2_TATCCTCT = tr.createNewVocabularyTerm('TATCCTCT') -vocabulary_term_INDEX2_TATCCTCT.setDescription('Nextera DNA') -vocabulary_term_INDEX2_TATCCTCT.setLabel('Index2 (i5) N503 TATCCTCT') -vocabulary_term_INDEX2_TATCCTCT.setOrdinal(4) -vocabulary_INDEX2.addTerm(vocabulary_term_INDEX2_TATCCTCT) - -vocabulary_term_INDEX2_AGAGTAGA = tr.createNewVocabularyTerm('AGAGTAGA') -vocabulary_term_INDEX2_AGAGTAGA.setDescription('Nextera DNA') -vocabulary_term_INDEX2_AGAGTAGA.setLabel('Index2 (i5) N504 AGAGTAGA') -vocabulary_term_INDEX2_AGAGTAGA.setOrdinal(5) -vocabulary_INDEX2.addTerm(vocabulary_term_INDEX2_AGAGTAGA) - -vocabulary_term_INDEX2_GTAAGGAG = tr.createNewVocabularyTerm('GTAAGGAG') -vocabulary_term_INDEX2_GTAAGGAG.setDescription('Nextera DNA') -vocabulary_term_INDEX2_GTAAGGAG.setLabel('Index2 (i5) N505 GTAAGGAG') -vocabulary_term_INDEX2_GTAAGGAG.setOrdinal(6) -vocabulary_INDEX2.addTerm(vocabulary_term_INDEX2_GTAAGGAG) - -vocabulary_term_INDEX2_ACTGCATA = tr.createNewVocabularyTerm('ACTGCATA') -vocabulary_term_INDEX2_ACTGCATA.setDescription('Nextera DNA') -vocabulary_term_INDEX2_ACTGCATA.setLabel('Index2 (i5) N506 ACTGCATA') -vocabulary_term_INDEX2_ACTGCATA.setOrdinal(7) -vocabulary_INDEX2.addTerm(vocabulary_term_INDEX2_ACTGCATA) - -vocabulary_term_INDEX2_AAGGAGTA = tr.createNewVocabularyTerm('AAGGAGTA') -vocabulary_term_INDEX2_AAGGAGTA.setDescription('Nextera DNA') -vocabulary_term_INDEX2_AAGGAGTA.setLabel('Index2 (i5) N507 AAGGAGTA') -vocabulary_term_INDEX2_AAGGAGTA.setOrdinal(8) -vocabulary_INDEX2.addTerm(vocabulary_term_INDEX2_AAGGAGTA) - -vocabulary_term_INDEX2_CTAAGCCT = tr.createNewVocabularyTerm('CTAAGCCT') -vocabulary_term_INDEX2_CTAAGCCT.setDescription('Nextera DNA') -vocabulary_term_INDEX2_CTAAGCCT.setLabel('Index2 (i5) N508 CTAAGCCT') -vocabulary_term_INDEX2_CTAAGCCT.setOrdinal(9) -vocabulary_INDEX2.addTerm(vocabulary_term_INDEX2_CTAAGCCT) - -vocabulary_term_INDEX2_NOINDEX = tr.createNewVocabularyTerm('NOINDEX') -vocabulary_term_INDEX2_NOINDEX.setDescription(None) -vocabulary_term_INDEX2_NOINDEX.setLabel(None) -vocabulary_term_INDEX2_NOINDEX.setOrdinal(10) -vocabulary_INDEX2.addTerm(vocabulary_term_INDEX2_NOINDEX) - -vocabulary_KIT = tr.getOrCreateNewVocabulary('KIT') -vocabulary_KIT.setDescription('Illumina Kit used for preparation') -vocabulary_KIT.setUrlTemplate(None) -vocabulary_KIT.setManagedInternally(False) -vocabulary_KIT.setChosenFromList(True) - -vocabulary_term_KIT_CHIP_SEQ_SAMPLE_PREP = tr.createNewVocabularyTerm('CHIP_SEQ_SAMPLE_PREP') -vocabulary_term_KIT_CHIP_SEQ_SAMPLE_PREP.setDescription(None) -vocabulary_term_KIT_CHIP_SEQ_SAMPLE_PREP.setLabel('ChIP-Seq Sample Preparation Kit') -vocabulary_term_KIT_CHIP_SEQ_SAMPLE_PREP.setOrdinal(1) -vocabulary_KIT.addTerm(vocabulary_term_KIT_CHIP_SEQ_SAMPLE_PREP) - -vocabulary_term_KIT_NEBNEXT_DNA_SAMPLE_PREP_MASTER_MIX_SET1 = tr.createNewVocabularyTerm('NEBNEXT_DNA_SAMPLE_PREP_MASTER_MIX_SET1') -vocabulary_term_KIT_NEBNEXT_DNA_SAMPLE_PREP_MASTER_MIX_SET1.setDescription(None) -vocabulary_term_KIT_NEBNEXT_DNA_SAMPLE_PREP_MASTER_MIX_SET1.setLabel('NEB Genomic DNA Sample Preparation Kit') -vocabulary_term_KIT_NEBNEXT_DNA_SAMPLE_PREP_MASTER_MIX_SET1.setOrdinal(2) -vocabulary_KIT.addTerm(vocabulary_term_KIT_NEBNEXT_DNA_SAMPLE_PREP_MASTER_MIX_SET1) - -vocabulary_term_KIT_NEB_CHIP_SEQ_SAMPLE_PREPARATION_KIT = tr.createNewVocabularyTerm('NEB_CHIP_SEQ_SAMPLE_PREPARATION_KIT') -vocabulary_term_KIT_NEB_CHIP_SEQ_SAMPLE_PREPARATION_KIT.setDescription(None) -vocabulary_term_KIT_NEB_CHIP_SEQ_SAMPLE_PREPARATION_KIT.setLabel('NEB_ChIP_Seq_Sample_Preparation_Kit') -vocabulary_term_KIT_NEB_CHIP_SEQ_SAMPLE_PREPARATION_KIT.setOrdinal(3) -vocabulary_KIT.addTerm(vocabulary_term_KIT_NEB_CHIP_SEQ_SAMPLE_PREPARATION_KIT) - -vocabulary_term_KIT_GENOMICDNA_SAMPLE_PREP = tr.createNewVocabularyTerm('GENOMICDNA_SAMPLE_PREP') -vocabulary_term_KIT_GENOMICDNA_SAMPLE_PREP.setDescription(None) -vocabulary_term_KIT_GENOMICDNA_SAMPLE_PREP.setLabel('Illumina Genomic DNA Sample Preparation Kit') -vocabulary_term_KIT_GENOMICDNA_SAMPLE_PREP.setOrdinal(4) -vocabulary_KIT.addTerm(vocabulary_term_KIT_GENOMICDNA_SAMPLE_PREP) - -vocabulary_term_KIT_PAIRED_END_DNA_SAMPLE_PREP = tr.createNewVocabularyTerm('PAIRED_END_DNA_SAMPLE_PREP') -vocabulary_term_KIT_PAIRED_END_DNA_SAMPLE_PREP.setDescription(None) -vocabulary_term_KIT_PAIRED_END_DNA_SAMPLE_PREP.setLabel('Paired End DNA Sample Prep Oligo Kit') -vocabulary_term_KIT_PAIRED_END_DNA_SAMPLE_PREP.setOrdinal(5) -vocabulary_KIT.addTerm(vocabulary_term_KIT_PAIRED_END_DNA_SAMPLE_PREP) - -vocabulary_term_KIT_MRNA_SEQ_SAMPLE_PREP = tr.createNewVocabularyTerm('MRNA_SEQ_SAMPLE_PREP') -vocabulary_term_KIT_MRNA_SEQ_SAMPLE_PREP.setDescription(None) -vocabulary_term_KIT_MRNA_SEQ_SAMPLE_PREP.setLabel('mRNA-Seq Sample Preparation Kit') -vocabulary_term_KIT_MRNA_SEQ_SAMPLE_PREP.setOrdinal(6) -vocabulary_KIT.addTerm(vocabulary_term_KIT_MRNA_SEQ_SAMPLE_PREP) - -vocabulary_term_KIT_RIBOZERO_SCRIPTSEQ_MRNASEQ_KIT = tr.createNewVocabularyTerm('RIBOZERO_SCRIPTSEQ_MRNA-SEQ_KIT') -vocabulary_term_KIT_RIBOZERO_SCRIPTSEQ_MRNASEQ_KIT.setDescription(None) -vocabulary_term_KIT_RIBOZERO_SCRIPTSEQ_MRNASEQ_KIT.setLabel('RiboZero ScriptSeq mRNA-Seq_Epicentre-kit') -vocabulary_term_KIT_RIBOZERO_SCRIPTSEQ_MRNASEQ_KIT.setOrdinal(7) -vocabulary_KIT.addTerm(vocabulary_term_KIT_RIBOZERO_SCRIPTSEQ_MRNASEQ_KIT) - -vocabulary_term_KIT_POLYA_SCRIPTSEQ_MRNASEQ_KIT = tr.createNewVocabularyTerm('POLYA_SCRIPTSEQ_MRNA-SEQ_KIT') -vocabulary_term_KIT_POLYA_SCRIPTSEQ_MRNASEQ_KIT.setDescription(None) -vocabulary_term_KIT_POLYA_SCRIPTSEQ_MRNASEQ_KIT.setLabel('PolyA(Beads) ScriptSeq mRNA-Seq_Epicentre-kit') -vocabulary_term_KIT_POLYA_SCRIPTSEQ_MRNASEQ_KIT.setOrdinal(8) -vocabulary_KIT.addTerm(vocabulary_term_KIT_POLYA_SCRIPTSEQ_MRNASEQ_KIT) - -vocabulary_term_KIT_NEXTERA_DNA_SAMPLE_PREP_KITS = tr.createNewVocabularyTerm('NEXTERA_DNA_SAMPLE_PREP_KITS') -vocabulary_term_KIT_NEXTERA_DNA_SAMPLE_PREP_KITS.setDescription(None) -vocabulary_term_KIT_NEXTERA_DNA_SAMPLE_PREP_KITS.setLabel('Nextera Genomic DNA Sample Preparation Kit BufferLMW(Epicentre)') -vocabulary_term_KIT_NEXTERA_DNA_SAMPLE_PREP_KITS.setOrdinal(9) -vocabulary_KIT.addTerm(vocabulary_term_KIT_NEXTERA_DNA_SAMPLE_PREP_KITS) - -vocabulary_term_KIT_NEXTERA_DNA_SAMPLE_PREP_KIT_BUFFER_HMW = tr.createNewVocabularyTerm('NEXTERA_DNA_SAMPLE_PREP_KIT_BUFFER_HMW') -vocabulary_term_KIT_NEXTERA_DNA_SAMPLE_PREP_KIT_BUFFER_HMW.setDescription(None) -vocabulary_term_KIT_NEXTERA_DNA_SAMPLE_PREP_KIT_BUFFER_HMW.setLabel('Nextera Genomic DNA Sample Preparation Kit BufferHMW(Epicentre)') -vocabulary_term_KIT_NEXTERA_DNA_SAMPLE_PREP_KIT_BUFFER_HMW.setOrdinal(10) -vocabulary_KIT.addTerm(vocabulary_term_KIT_NEXTERA_DNA_SAMPLE_PREP_KIT_BUFFER_HMW) - -vocabulary_term_KIT_AGILENT_SURESELECT_ENRICHMENTSYSTEM = tr.createNewVocabularyTerm('AGILENT_SURESELECT_ENRICHMENTSYSTEM') -vocabulary_term_KIT_AGILENT_SURESELECT_ENRICHMENTSYSTEM.setDescription(None) -vocabulary_term_KIT_AGILENT_SURESELECT_ENRICHMENTSYSTEM.setLabel('Agilent_SureSelect_EnrichmentSystem') -vocabulary_term_KIT_AGILENT_SURESELECT_ENRICHMENTSYSTEM.setOrdinal(11) -vocabulary_KIT.addTerm(vocabulary_term_KIT_AGILENT_SURESELECT_ENRICHMENTSYSTEM) - -vocabulary_term_KIT_TRUSEQRNA_SAMPLE_PREP_KIT = tr.createNewVocabularyTerm('TRUSEQRNA_SAMPLE_PREP_KIT') -vocabulary_term_KIT_TRUSEQRNA_SAMPLE_PREP_KIT.setDescription(None) -vocabulary_term_KIT_TRUSEQRNA_SAMPLE_PREP_KIT.setLabel('TruSeq_RNA_SamplePrepKit_Illumina') -vocabulary_term_KIT_TRUSEQRNA_SAMPLE_PREP_KIT.setOrdinal(12) -vocabulary_KIT.addTerm(vocabulary_term_KIT_TRUSEQRNA_SAMPLE_PREP_KIT) - -vocabulary_term_KIT_TRUESEQ_CHIP_SAMPLE_PREP_KIT = tr.createNewVocabularyTerm('TRUESEQ_CHIP_SAMPLE_PREP_KIT') -vocabulary_term_KIT_TRUESEQ_CHIP_SAMPLE_PREP_KIT.setDescription(None) -vocabulary_term_KIT_TRUESEQ_CHIP_SAMPLE_PREP_KIT.setLabel(None) -vocabulary_term_KIT_TRUESEQ_CHIP_SAMPLE_PREP_KIT.setOrdinal(13) -vocabulary_KIT.addTerm(vocabulary_term_KIT_TRUESEQ_CHIP_SAMPLE_PREP_KIT) - -vocabulary_term_KIT_TRUSEQ_DNA_SAMPLE_PREP_KIT = tr.createNewVocabularyTerm('TRUSEQ_DNA_SAMPLE_PREP_KIT') -vocabulary_term_KIT_TRUSEQ_DNA_SAMPLE_PREP_KIT.setDescription(None) -vocabulary_term_KIT_TRUSEQ_DNA_SAMPLE_PREP_KIT.setLabel('TruSeq_DNA_SamplePrepKit_Illumina') -vocabulary_term_KIT_TRUSEQ_DNA_SAMPLE_PREP_KIT.setOrdinal(14) -vocabulary_KIT.addTerm(vocabulary_term_KIT_TRUSEQ_DNA_SAMPLE_PREP_KIT) - -vocabulary_term_KIT_NONE = tr.createNewVocabularyTerm('NONE') -vocabulary_term_KIT_NONE.setDescription(None) -vocabulary_term_KIT_NONE.setLabel('None (Already prepared)') -vocabulary_term_KIT_NONE.setOrdinal(15) -vocabulary_KIT.addTerm(vocabulary_term_KIT_NONE) - -vocabulary_MACS_VERSION = tr.getOrCreateNewVocabulary('MACS_VERSION') -vocabulary_MACS_VERSION.setDescription('Used MACS version for Peak Calling') -vocabulary_MACS_VERSION.setUrlTemplate(None) -vocabulary_MACS_VERSION.setManagedInternally(False) -vocabulary_MACS_VERSION.setChosenFromList(True) - -vocabulary_term_MACS_VERSION_140RC2 = tr.createNewVocabularyTerm('1.4.0RC2') -vocabulary_term_MACS_VERSION_140RC2.setDescription(None) -vocabulary_term_MACS_VERSION_140RC2.setLabel('macs14 1.4.0rc2 20110214 (Valentine)') -vocabulary_term_MACS_VERSION_140RC2.setOrdinal(1) -vocabulary_MACS_VERSION.addTerm(vocabulary_term_MACS_VERSION_140RC2) - -vocabulary_term_MACS_VERSION_1371 = tr.createNewVocabularyTerm('1.3.7.1') -vocabulary_term_MACS_VERSION_1371.setDescription(None) -vocabulary_term_MACS_VERSION_1371.setLabel('macs 1.3.7.1 (Oktoberfest, bug fixed #1)') -vocabulary_term_MACS_VERSION_1371.setOrdinal(2) -vocabulary_MACS_VERSION.addTerm(vocabulary_term_MACS_VERSION_1371) - -vocabulary_MISMATCH_IN_INDEX = tr.getOrCreateNewVocabulary('MISMATCH_IN_INDEX') -vocabulary_MISMATCH_IN_INDEX.setDescription('Mismatch in Index allowed') -vocabulary_MISMATCH_IN_INDEX.setUrlTemplate(None) -vocabulary_MISMATCH_IN_INDEX.setManagedInternally(False) -vocabulary_MISMATCH_IN_INDEX.setChosenFromList(True) - -vocabulary_term_MISMATCH_IN_INDEX_NONE = tr.createNewVocabularyTerm('NONE') -vocabulary_term_MISMATCH_IN_INDEX_NONE.setDescription(None) -vocabulary_term_MISMATCH_IN_INDEX_NONE.setLabel(None) -vocabulary_term_MISMATCH_IN_INDEX_NONE.setOrdinal(1) -vocabulary_MISMATCH_IN_INDEX.addTerm(vocabulary_term_MISMATCH_IN_INDEX_NONE) - -vocabulary_term_MISMATCH_IN_INDEX_ONE = tr.createNewVocabularyTerm('ONE') -vocabulary_term_MISMATCH_IN_INDEX_ONE.setDescription(None) -vocabulary_term_MISMATCH_IN_INDEX_ONE.setLabel(None) -vocabulary_term_MISMATCH_IN_INDEX_ONE.setOrdinal(2) -vocabulary_MISMATCH_IN_INDEX.addTerm(vocabulary_term_MISMATCH_IN_INDEX_ONE) - -vocabulary_NANO_DROP = tr.getOrCreateNewVocabulary('NANO_DROP') -vocabulary_NANO_DROP.setDescription('Device for measuring the total amount of genetic material contained in the probe') -vocabulary_NANO_DROP.setUrlTemplate(None) -vocabulary_NANO_DROP.setManagedInternally(False) -vocabulary_NANO_DROP.setChosenFromList(True) - -vocabulary_term_NANO_DROP_CONCND3300 = tr.createNewVocabularyTerm('CONCND3300') -vocabulary_term_NANO_DROP_CONCND3300.setDescription(None) -vocabulary_term_NANO_DROP_CONCND3300.setLabel('Conc Nano Drop 3300') -vocabulary_term_NANO_DROP_CONCND3300.setOrdinal(1) -vocabulary_NANO_DROP.addTerm(vocabulary_term_NANO_DROP_CONCND3300) - -vocabulary_term_NANO_DROP_CONCND1000 = tr.createNewVocabularyTerm('CONCND1000') -vocabulary_term_NANO_DROP_CONCND1000.setDescription(None) -vocabulary_term_NANO_DROP_CONCND1000.setLabel('Conc Nano Drop 1000') -vocabulary_term_NANO_DROP_CONCND1000.setOrdinal(2) -vocabulary_NANO_DROP.addTerm(vocabulary_term_NANO_DROP_CONCND1000) - -vocabulary_term_NANO_DROP_CONCND2000 = tr.createNewVocabularyTerm('CONCND2000') -vocabulary_term_NANO_DROP_CONCND2000.setDescription(None) -vocabulary_term_NANO_DROP_CONCND2000.setLabel('Conc Nano Drop 2000') -vocabulary_term_NANO_DROP_CONCND2000.setOrdinal(3) -vocabulary_NANO_DROP.addTerm(vocabulary_term_NANO_DROP_CONCND2000) - -vocabulary_NCBI_TAXONOMY = tr.getOrCreateNewVocabulary('NCBI_TAXONOMY') -vocabulary_NCBI_TAXONOMY.setDescription(None) -vocabulary_NCBI_TAXONOMY.setUrlTemplate('http://www.ncbi.nlm.nih.gov/Taxonomy/Browser/wwwtax.cgi?id=$term$') -vocabulary_NCBI_TAXONOMY.setManagedInternally(False) -vocabulary_NCBI_TAXONOMY.setChosenFromList(True) - -vocabulary_term_NCBI_TAXONOMY_10090 = tr.createNewVocabularyTerm('10090') -vocabulary_term_NCBI_TAXONOMY_10090.setDescription('Genbank common name: house mouse\ Inherited blast name: rodents') -vocabulary_term_NCBI_TAXONOMY_10090.setLabel('Mus musculus') -vocabulary_term_NCBI_TAXONOMY_10090.setOrdinal(1) -vocabulary_NCBI_TAXONOMY.addTerm(vocabulary_term_NCBI_TAXONOMY_10090) - -vocabulary_term_NCBI_TAXONOMY_9606 = tr.createNewVocabularyTerm('9606') -vocabulary_term_NCBI_TAXONOMY_9606.setDescription('Genbank common name: human\ Inherited blast name: primates') -vocabulary_term_NCBI_TAXONOMY_9606.setLabel('Homo sapiens') -vocabulary_term_NCBI_TAXONOMY_9606.setOrdinal(2) -vocabulary_NCBI_TAXONOMY.addTerm(vocabulary_term_NCBI_TAXONOMY_9606) - -vocabulary_term_NCBI_TAXONOMY_7227 = tr.createNewVocabularyTerm('7227') -vocabulary_term_NCBI_TAXONOMY_7227.setDescription('Genbank common name: fruit fly\ Inherited blast name: flies') -vocabulary_term_NCBI_TAXONOMY_7227.setLabel('Drosophila melanogaster') -vocabulary_term_NCBI_TAXONOMY_7227.setOrdinal(3) -vocabulary_NCBI_TAXONOMY.addTerm(vocabulary_term_NCBI_TAXONOMY_7227) - -vocabulary_term_NCBI_TAXONOMY_6239 = tr.createNewVocabularyTerm('6239') -vocabulary_term_NCBI_TAXONOMY_6239.setDescription('Inherited blast name: nematodes') -vocabulary_term_NCBI_TAXONOMY_6239.setLabel('Caenorhabditis elegans') -vocabulary_term_NCBI_TAXONOMY_6239.setOrdinal(4) -vocabulary_NCBI_TAXONOMY.addTerm(vocabulary_term_NCBI_TAXONOMY_6239) - -vocabulary_term_NCBI_TAXONOMY_4932 = tr.createNewVocabularyTerm('4932') -vocabulary_term_NCBI_TAXONOMY_4932.setDescription('Genbank common name: baker\'s yeast\ Inherited blast name: ascomycetes') -vocabulary_term_NCBI_TAXONOMY_4932.setLabel('Saccharomyces cerevisiae') -vocabulary_term_NCBI_TAXONOMY_4932.setOrdinal(5) -vocabulary_NCBI_TAXONOMY.addTerm(vocabulary_term_NCBI_TAXONOMY_4932) - -vocabulary_term_NCBI_TAXONOMY_10116 = tr.createNewVocabularyTerm('10116') -vocabulary_term_NCBI_TAXONOMY_10116.setDescription('Genbank common name: Norway rat\ Inherited blast name: rodents') -vocabulary_term_NCBI_TAXONOMY_10116.setLabel('Rattus norvegicus') -vocabulary_term_NCBI_TAXONOMY_10116.setOrdinal(6) -vocabulary_NCBI_TAXONOMY.addTerm(vocabulary_term_NCBI_TAXONOMY_10116) - -vocabulary_term_NCBI_TAXONOMY_6669 = tr.createNewVocabularyTerm('6669') -vocabulary_term_NCBI_TAXONOMY_6669.setDescription('Genbank common name: common water flea\ Inherited blast name: crustaceans') -vocabulary_term_NCBI_TAXONOMY_6669.setLabel('Daphnia pulex') -vocabulary_term_NCBI_TAXONOMY_6669.setOrdinal(7) -vocabulary_NCBI_TAXONOMY.addTerm(vocabulary_term_NCBI_TAXONOMY_6669) - -vocabulary_term_NCBI_TAXONOMY_562 = tr.createNewVocabularyTerm('562') -vocabulary_term_NCBI_TAXONOMY_562.setDescription('Inherited blast name: enterobacteria') -vocabulary_term_NCBI_TAXONOMY_562.setLabel('Escherichia coli') -vocabulary_term_NCBI_TAXONOMY_562.setOrdinal(8) -vocabulary_NCBI_TAXONOMY.addTerm(vocabulary_term_NCBI_TAXONOMY_562) - -vocabulary_term_NCBI_TAXONOMY_623 = tr.createNewVocabularyTerm('623') -vocabulary_term_NCBI_TAXONOMY_623.setDescription('Inherited blast name: enterobacteria') -vocabulary_term_NCBI_TAXONOMY_623.setLabel('Shigella flexneri') -vocabulary_term_NCBI_TAXONOMY_623.setOrdinal(9) -vocabulary_NCBI_TAXONOMY.addTerm(vocabulary_term_NCBI_TAXONOMY_623) - -vocabulary_term_NCBI_TAXONOMY_10847 = tr.createNewVocabularyTerm('10847') -vocabulary_term_NCBI_TAXONOMY_10847.setDescription('Inherited blast name: viruses') -vocabulary_term_NCBI_TAXONOMY_10847.setLabel('Enterobacteria phage phiX174') -vocabulary_term_NCBI_TAXONOMY_10847.setOrdinal(10) -vocabulary_NCBI_TAXONOMY.addTerm(vocabulary_term_NCBI_TAXONOMY_10847) - -vocabulary_term_NCBI_TAXONOMY_190650 = tr.createNewVocabularyTerm('190650') -vocabulary_term_NCBI_TAXONOMY_190650.setDescription('Inherited blast name: a-proteobacteria') -vocabulary_term_NCBI_TAXONOMY_190650.setLabel('Caulobacter crescentus CB15') -vocabulary_term_NCBI_TAXONOMY_190650.setOrdinal(11) -vocabulary_NCBI_TAXONOMY.addTerm(vocabulary_term_NCBI_TAXONOMY_190650) - -vocabulary_term_NCBI_TAXONOMY_8113 = tr.createNewVocabularyTerm('8113') -vocabulary_term_NCBI_TAXONOMY_8113.setDescription('Genbank common name: cichlids\ Inherited blast name: bony fishes') -vocabulary_term_NCBI_TAXONOMY_8113.setLabel('Cichlidae') -vocabulary_term_NCBI_TAXONOMY_8113.setOrdinal(12) -vocabulary_NCBI_TAXONOMY.addTerm(vocabulary_term_NCBI_TAXONOMY_8113) - -vocabulary_term_NCBI_TAXONOMY_481459 = tr.createNewVocabularyTerm('481459') -vocabulary_term_NCBI_TAXONOMY_481459.setDescription('Genbank common name: three-spined stickleback\ Inherited blast name: bony fishes') -vocabulary_term_NCBI_TAXONOMY_481459.setLabel('Gasterosteus aculeatus aculeatus') -vocabulary_term_NCBI_TAXONOMY_481459.setOrdinal(13) -vocabulary_NCBI_TAXONOMY.addTerm(vocabulary_term_NCBI_TAXONOMY_481459) - -vocabulary_term_NCBI_TAXONOMY_282301 = tr.createNewVocabularyTerm('282301') -vocabulary_term_NCBI_TAXONOMY_282301.setDescription('Inherited blast name: flatworms') -vocabulary_term_NCBI_TAXONOMY_282301.setLabel('Macrostomum lignano') -vocabulary_term_NCBI_TAXONOMY_282301.setOrdinal(14) -vocabulary_NCBI_TAXONOMY.addTerm(vocabulary_term_NCBI_TAXONOMY_282301) - -vocabulary_term_NCBI_TAXONOMY_99287 = tr.createNewVocabularyTerm('99287') -vocabulary_term_NCBI_TAXONOMY_99287.setDescription('Inherited blast name: enterobacteria') -vocabulary_term_NCBI_TAXONOMY_99287.setLabel('Salmonella enterica subsp. enterica serovar Typhimurium str. LT2') -vocabulary_term_NCBI_TAXONOMY_99287.setOrdinal(15) -vocabulary_NCBI_TAXONOMY.addTerm(vocabulary_term_NCBI_TAXONOMY_99287) - -vocabulary_term_NCBI_TAXONOMY_4896 = tr.createNewVocabularyTerm('4896') -vocabulary_term_NCBI_TAXONOMY_4896.setDescription('Genbank common name: fission yeast\ Inherited blast name: ascomycetes') -vocabulary_term_NCBI_TAXONOMY_4896.setLabel('Schizosaccharomyces pombe') -vocabulary_term_NCBI_TAXONOMY_4896.setOrdinal(16) -vocabulary_NCBI_TAXONOMY.addTerm(vocabulary_term_NCBI_TAXONOMY_4896) - -vocabulary_term_NCBI_TAXONOMY_4897 = tr.createNewVocabularyTerm('4897') -vocabulary_term_NCBI_TAXONOMY_4897.setDescription('Inherited blast name: ascomycetes') -vocabulary_term_NCBI_TAXONOMY_4897.setLabel('Schizosaccharomyces japonicus') -vocabulary_term_NCBI_TAXONOMY_4897.setOrdinal(17) -vocabulary_NCBI_TAXONOMY.addTerm(vocabulary_term_NCBI_TAXONOMY_4897) - -vocabulary_term_NCBI_TAXONOMY_7955 = tr.createNewVocabularyTerm('7955') -vocabulary_term_NCBI_TAXONOMY_7955.setDescription('Genbank common name: zebrafish\ Inherited blast name: bony fishes') -vocabulary_term_NCBI_TAXONOMY_7955.setLabel('Danio rerio') -vocabulary_term_NCBI_TAXONOMY_7955.setOrdinal(18) -vocabulary_NCBI_TAXONOMY.addTerm(vocabulary_term_NCBI_TAXONOMY_7955) - -vocabulary_term_NCBI_TAXONOMY_3702 = tr.createNewVocabularyTerm('3702') -vocabulary_term_NCBI_TAXONOMY_3702.setDescription('Genbank common name: thale cress\ Inherited blast name: eudicots') -vocabulary_term_NCBI_TAXONOMY_3702.setLabel('Arabidopsis thaliana') -vocabulary_term_NCBI_TAXONOMY_3702.setOrdinal(19) -vocabulary_NCBI_TAXONOMY.addTerm(vocabulary_term_NCBI_TAXONOMY_3702) - -vocabulary_term_NCBI_TAXONOMY_225322 = tr.createNewVocabularyTerm('225322') -vocabulary_term_NCBI_TAXONOMY_225322.setDescription('Bacterium which infects Daphnia\ Pasteuria ramosa Metchnikoff 1888 (Approved Lists 1980) emend. Starr et al. 1986\ Ebert D, Rainey P, Embley TM, Scholz D. Development, life\ cycle, ultrastructure and phylogenetic position of Pasteuria ramosa Metchnikoff 1888: rediscovery of an obligate \ endoparasite of Daphnia magna Straus. Philos Trans R Soc \ Lond Ser B. 1996;351:1689.') -vocabulary_term_NCBI_TAXONOMY_225322.setLabel('Pasteuria ramosa') -vocabulary_term_NCBI_TAXONOMY_225322.setOrdinal(20) -vocabulary_NCBI_TAXONOMY.addTerm(vocabulary_term_NCBI_TAXONOMY_225322) - -vocabulary_term_NCBI_TAXONOMY_9913 = tr.createNewVocabularyTerm('9913') -vocabulary_term_NCBI_TAXONOMY_9913.setDescription('Genbank common name: cattle\ Inherited blast name: even-toed ungulates') -vocabulary_term_NCBI_TAXONOMY_9913.setLabel('Bos taurus') -vocabulary_term_NCBI_TAXONOMY_9913.setOrdinal(21) -vocabulary_NCBI_TAXONOMY.addTerm(vocabulary_term_NCBI_TAXONOMY_9913) - -vocabulary_term_NCBI_TAXONOMY_9823 = tr.createNewVocabularyTerm('9823') -vocabulary_term_NCBI_TAXONOMY_9823.setDescription('Genbank common name: pig\ Inherited blast name: even-toed ungulates') -vocabulary_term_NCBI_TAXONOMY_9823.setLabel('Sus scrofa') -vocabulary_term_NCBI_TAXONOMY_9823.setOrdinal(22) -vocabulary_NCBI_TAXONOMY.addTerm(vocabulary_term_NCBI_TAXONOMY_9823) - -vocabulary_term_NCBI_TAXONOMY_9940 = tr.createNewVocabularyTerm('9940') -vocabulary_term_NCBI_TAXONOMY_9940.setDescription('Genbank common name: sheep\ Inherited blast name: even-toed ungulates') -vocabulary_term_NCBI_TAXONOMY_9940.setLabel('Ovis aries') -vocabulary_term_NCBI_TAXONOMY_9940.setOrdinal(23) -vocabulary_NCBI_TAXONOMY.addTerm(vocabulary_term_NCBI_TAXONOMY_9940) - -vocabulary_term_NCBI_TAXONOMY_9925 = tr.createNewVocabularyTerm('9925') -vocabulary_term_NCBI_TAXONOMY_9925.setDescription('Genbank common name: goat\ Inherited blast name: even-toed ungulates') -vocabulary_term_NCBI_TAXONOMY_9925.setLabel('Capra hircus') -vocabulary_term_NCBI_TAXONOMY_9925.setOrdinal(24) -vocabulary_NCBI_TAXONOMY.addTerm(vocabulary_term_NCBI_TAXONOMY_9925) - -vocabulary_term_NCBI_TAXONOMY_8153 = tr.createNewVocabularyTerm('8153') -vocabulary_term_NCBI_TAXONOMY_8153.setDescription('Common name: cichlid fish') -vocabulary_term_NCBI_TAXONOMY_8153.setLabel('Haplochromis burtoni') -vocabulary_term_NCBI_TAXONOMY_8153.setOrdinal(25) -vocabulary_NCBI_TAXONOMY.addTerm(vocabulary_term_NCBI_TAXONOMY_8153) - -vocabulary_term_NCBI_TAXONOMY_61818 = tr.createNewVocabularyTerm('61818') -vocabulary_term_NCBI_TAXONOMY_61818.setDescription('Common name: bony fish') -vocabulary_term_NCBI_TAXONOMY_61818.setLabel('Amphilophus (nicaraguan)') -vocabulary_term_NCBI_TAXONOMY_61818.setOrdinal(26) -vocabulary_NCBI_TAXONOMY.addTerm(vocabulary_term_NCBI_TAXONOMY_61818) - -vocabulary_term_NCBI_TAXONOMY_35525 = tr.createNewVocabularyTerm('35525') -vocabulary_term_NCBI_TAXONOMY_35525.setDescription('Common name: water flea') -vocabulary_term_NCBI_TAXONOMY_35525.setLabel('Daphnia Magna') -vocabulary_term_NCBI_TAXONOMY_35525.setOrdinal(27) -vocabulary_NCBI_TAXONOMY.addTerm(vocabulary_term_NCBI_TAXONOMY_35525) - -vocabulary_term_NCBI_TAXONOMY_4081 = tr.createNewVocabularyTerm('4081') -vocabulary_term_NCBI_TAXONOMY_4081.setDescription('Common Name: tomato') -vocabulary_term_NCBI_TAXONOMY_4081.setLabel('Solanum lycopersicum (tomato)') -vocabulary_term_NCBI_TAXONOMY_4081.setOrdinal(28) -vocabulary_NCBI_TAXONOMY.addTerm(vocabulary_term_NCBI_TAXONOMY_4081) - -vocabulary_term_NCBI_TAXONOMY_13068 = tr.createNewVocabularyTerm('13068') -vocabulary_term_NCBI_TAXONOMY_13068.setDescription('Common name: earwig') -vocabulary_term_NCBI_TAXONOMY_13068.setLabel('Forficula auricularia (earwig)') -vocabulary_term_NCBI_TAXONOMY_13068.setOrdinal(29) -vocabulary_NCBI_TAXONOMY.addTerm(vocabulary_term_NCBI_TAXONOMY_13068) - -vocabulary_term_NCBI_TAXONOMY_3569 = tr.createNewVocabularyTerm('3569') -vocabulary_term_NCBI_TAXONOMY_3569.setDescription('Genbank common name: clove pink') -vocabulary_term_NCBI_TAXONOMY_3569.setLabel('Dianthus') -vocabulary_term_NCBI_TAXONOMY_3569.setOrdinal(30) -vocabulary_NCBI_TAXONOMY.addTerm(vocabulary_term_NCBI_TAXONOMY_3569) - -vocabulary_term_NCBI_TAXONOMY_3573 = tr.createNewVocabularyTerm('3573') -vocabulary_term_NCBI_TAXONOMY_3573.setDescription('Genbank common name: campions\ Inherited blast name: eudicots') -vocabulary_term_NCBI_TAXONOMY_3573.setLabel('Silene') -vocabulary_term_NCBI_TAXONOMY_3573.setOrdinal(31) -vocabulary_NCBI_TAXONOMY.addTerm(vocabulary_term_NCBI_TAXONOMY_3573) - -vocabulary_term_NCBI_TAXONOMY_32644 = tr.createNewVocabularyTerm('32644') -vocabulary_term_NCBI_TAXONOMY_32644.setDescription('Inherited blast name: unclassified') -vocabulary_term_NCBI_TAXONOMY_32644.setLabel('unidentified') -vocabulary_term_NCBI_TAXONOMY_32644.setOrdinal(32) -vocabulary_NCBI_TAXONOMY.addTerm(vocabulary_term_NCBI_TAXONOMY_32644) - -vocabulary_term_NCBI_TAXONOMY_0000 = tr.createNewVocabularyTerm('0000') -vocabulary_term_NCBI_TAXONOMY_0000.setDescription(None) -vocabulary_term_NCBI_TAXONOMY_0000.setLabel('OTHER') -vocabulary_term_NCBI_TAXONOMY_0000.setOrdinal(33) -vocabulary_NCBI_TAXONOMY.addTerm(vocabulary_term_NCBI_TAXONOMY_0000) - -vocabulary_PIPELINE_VERSION = tr.getOrCreateNewVocabulary('PIPELINE_VERSION') -vocabulary_PIPELINE_VERSION.setDescription('With which pipeline version has the data been analyzed?') -vocabulary_PIPELINE_VERSION.setUrlTemplate(None) -vocabulary_PIPELINE_VERSION.setManagedInternally(False) -vocabulary_PIPELINE_VERSION.setChosenFromList(True) - -vocabulary_term_PIPELINE_VERSION_11348 = tr.createNewVocabularyTerm('1.13.48') -vocabulary_term_PIPELINE_VERSION_11348.setDescription(None) -vocabulary_term_PIPELINE_VERSION_11348.setLabel('RTA 1.13.48') -vocabulary_term_PIPELINE_VERSION_11348.setOrdinal(1) -vocabulary_PIPELINE_VERSION.addTerm(vocabulary_term_PIPELINE_VERSION_11348) - -vocabulary_term_PIPELINE_VERSION_11242 = tr.createNewVocabularyTerm('1.12.4.2') -vocabulary_term_PIPELINE_VERSION_11242.setDescription('Real Time Analysis in combination with HCS 1.4.8') -vocabulary_term_PIPELINE_VERSION_11242.setLabel('RTA 1.12.4.2 (HiSeq 2000)') -vocabulary_term_PIPELINE_VERSION_11242.setOrdinal(2) -vocabulary_PIPELINE_VERSION.addTerm(vocabulary_term_PIPELINE_VERSION_11242) - -vocabulary_term_PIPELINE_VERSION_112 = tr.createNewVocabularyTerm('1.12') -vocabulary_term_PIPELINE_VERSION_112.setDescription('Real Time Analysis 1.12 HiSeq 2000') -vocabulary_term_PIPELINE_VERSION_112.setLabel('RTA 1.12') -vocabulary_term_PIPELINE_VERSION_112.setOrdinal(3) -vocabulary_PIPELINE_VERSION.addTerm(vocabulary_term_PIPELINE_VERSION_112) - -vocabulary_term_PIPELINE_VERSION_19 = tr.createNewVocabularyTerm('1.9') -vocabulary_term_PIPELINE_VERSION_19.setDescription('Real Time Analysis 1.9') -vocabulary_term_PIPELINE_VERSION_19.setLabel('RTA 1.9 (GA IIx)') -vocabulary_term_PIPELINE_VERSION_19.setOrdinal(4) -vocabulary_PIPELINE_VERSION.addTerm(vocabulary_term_PIPELINE_VERSION_19) - -vocabulary_term_PIPELINE_VERSION_RTA_18 = tr.createNewVocabularyTerm('RTA_1.8') -vocabulary_term_PIPELINE_VERSION_RTA_18.setDescription('Real Time Analysis 1.8') -vocabulary_term_PIPELINE_VERSION_RTA_18.setLabel('RTA 1.8') -vocabulary_term_PIPELINE_VERSION_RTA_18.setOrdinal(5) -vocabulary_PIPELINE_VERSION.addTerm(vocabulary_term_PIPELINE_VERSION_RTA_18) - -vocabulary_term_PIPELINE_VERSION_RTA_16 = tr.createNewVocabularyTerm('RTA_1.6') -vocabulary_term_PIPELINE_VERSION_RTA_16.setDescription('Real Time Analysis 1.6') -vocabulary_term_PIPELINE_VERSION_RTA_16.setLabel('RTA 1.6') -vocabulary_term_PIPELINE_VERSION_RTA_16.setOrdinal(6) -vocabulary_PIPELINE_VERSION.addTerm(vocabulary_term_PIPELINE_VERSION_RTA_16) - -vocabulary_term_PIPELINE_VERSION_RTA_15 = tr.createNewVocabularyTerm('RTA_1.5') -vocabulary_term_PIPELINE_VERSION_RTA_15.setDescription(None) -vocabulary_term_PIPELINE_VERSION_RTA_15.setLabel('RTA 1.5') -vocabulary_term_PIPELINE_VERSION_RTA_15.setOrdinal(7) -vocabulary_PIPELINE_VERSION.addTerm(vocabulary_term_PIPELINE_VERSION_RTA_15) - -vocabulary_term_PIPELINE_VERSION_RTA_14150 = tr.createNewVocabularyTerm('RTA_1.4.15.0') -vocabulary_term_PIPELINE_VERSION_RTA_14150.setDescription(None) -vocabulary_term_PIPELINE_VERSION_RTA_14150.setLabel('RTA 1.4.15.0') -vocabulary_term_PIPELINE_VERSION_RTA_14150.setOrdinal(8) -vocabulary_PIPELINE_VERSION.addTerm(vocabulary_term_PIPELINE_VERSION_RTA_14150) - -vocabulary_term_PIPELINE_VERSION_15 = tr.createNewVocabularyTerm('1.5') -vocabulary_term_PIPELINE_VERSION_15.setDescription(None) -vocabulary_term_PIPELINE_VERSION_15.setLabel(None) -vocabulary_term_PIPELINE_VERSION_15.setOrdinal(9) -vocabulary_PIPELINE_VERSION.addTerm(vocabulary_term_PIPELINE_VERSION_15) - -vocabulary_term_PIPELINE_VERSION_14 = tr.createNewVocabularyTerm('1.4') -vocabulary_term_PIPELINE_VERSION_14.setDescription(None) -vocabulary_term_PIPELINE_VERSION_14.setLabel(None) -vocabulary_term_PIPELINE_VERSION_14.setOrdinal(10) -vocabulary_PIPELINE_VERSION.addTerm(vocabulary_term_PIPELINE_VERSION_14) - -vocabulary_term_PIPELINE_VERSION_132 = tr.createNewVocabularyTerm('1.3.2') -vocabulary_term_PIPELINE_VERSION_132.setDescription(None) -vocabulary_term_PIPELINE_VERSION_132.setLabel(None) -vocabulary_term_PIPELINE_VERSION_132.setOrdinal(11) -vocabulary_PIPELINE_VERSION.addTerm(vocabulary_term_PIPELINE_VERSION_132) - -vocabulary_term_PIPELINE_VERSION_10 = tr.createNewVocabularyTerm('1.0') -vocabulary_term_PIPELINE_VERSION_10.setDescription(None) -vocabulary_term_PIPELINE_VERSION_10.setLabel(None) -vocabulary_term_PIPELINE_VERSION_10.setOrdinal(12) -vocabulary_PIPELINE_VERSION.addTerm(vocabulary_term_PIPELINE_VERSION_10) - -vocabulary_term_PIPELINE_VERSION_PRE_10 = tr.createNewVocabularyTerm('PRE_1.0') -vocabulary_term_PIPELINE_VERSION_PRE_10.setDescription('Before Pipeline Version 1.0') -vocabulary_term_PIPELINE_VERSION_PRE_10.setLabel(None) -vocabulary_term_PIPELINE_VERSION_PRE_10.setOrdinal(13) -vocabulary_PIPELINE_VERSION.addTerm(vocabulary_term_PIPELINE_VERSION_PRE_10) - -vocabulary_term_PIPELINE_VERSION_NONE = tr.createNewVocabularyTerm('NONE') -vocabulary_term_PIPELINE_VERSION_NONE.setDescription(None) -vocabulary_term_PIPELINE_VERSION_NONE.setLabel(None) -vocabulary_term_PIPELINE_VERSION_NONE.setOrdinal(14) -vocabulary_PIPELINE_VERSION.addTerm(vocabulary_term_PIPELINE_VERSION_NONE) - -vocabulary_SAMPLE_TYPE = tr.getOrCreateNewVocabulary('SAMPLE_TYPE') -vocabulary_SAMPLE_TYPE.setDescription('Type of sample delivered by the customer') -vocabulary_SAMPLE_TYPE.setUrlTemplate(None) -vocabulary_SAMPLE_TYPE.setManagedInternally(False) -vocabulary_SAMPLE_TYPE.setChosenFromList(True) - -vocabulary_term_SAMPLE_TYPE_PROCESSED_DNA_LIBRARY = tr.createNewVocabularyTerm('PROCESSED_DNA_LIBRARY') -vocabulary_term_SAMPLE_TYPE_PROCESSED_DNA_LIBRARY.setDescription(None) -vocabulary_term_SAMPLE_TYPE_PROCESSED_DNA_LIBRARY.setLabel(None) -vocabulary_term_SAMPLE_TYPE_PROCESSED_DNA_LIBRARY.setOrdinal(1) -vocabulary_SAMPLE_TYPE.addTerm(vocabulary_term_SAMPLE_TYPE_PROCESSED_DNA_LIBRARY) - -vocabulary_term_SAMPLE_TYPE_POOLED_SAMPLE = tr.createNewVocabularyTerm('POOLED_SAMPLE') -vocabulary_term_SAMPLE_TYPE_POOLED_SAMPLE.setDescription(None) -vocabulary_term_SAMPLE_TYPE_POOLED_SAMPLE.setLabel(None) -vocabulary_term_SAMPLE_TYPE_POOLED_SAMPLE.setOrdinal(2) -vocabulary_SAMPLE_TYPE.addTerm(vocabulary_term_SAMPLE_TYPE_POOLED_SAMPLE) - -vocabulary_term_SAMPLE_TYPE_GENOMIC_DNA = tr.createNewVocabularyTerm('GENOMIC_DNA') -vocabulary_term_SAMPLE_TYPE_GENOMIC_DNA.setDescription(None) -vocabulary_term_SAMPLE_TYPE_GENOMIC_DNA.setLabel(None) -vocabulary_term_SAMPLE_TYPE_GENOMIC_DNA.setOrdinal(3) -vocabulary_SAMPLE_TYPE.addTerm(vocabulary_term_SAMPLE_TYPE_GENOMIC_DNA) - -vocabulary_term_SAMPLE_TYPE_SMALL_RNA = tr.createNewVocabularyTerm('SMALL_RNA') -vocabulary_term_SAMPLE_TYPE_SMALL_RNA.setDescription(None) -vocabulary_term_SAMPLE_TYPE_SMALL_RNA.setLabel(None) -vocabulary_term_SAMPLE_TYPE_SMALL_RNA.setOrdinal(4) -vocabulary_SAMPLE_TYPE.addTerm(vocabulary_term_SAMPLE_TYPE_SMALL_RNA) - -vocabulary_term_SAMPLE_TYPE_TOTAL_RNA = tr.createNewVocabularyTerm('TOTAL_RNA') -vocabulary_term_SAMPLE_TYPE_TOTAL_RNA.setDescription(None) -vocabulary_term_SAMPLE_TYPE_TOTAL_RNA.setLabel(None) -vocabulary_term_SAMPLE_TYPE_TOTAL_RNA.setOrdinal(5) -vocabulary_SAMPLE_TYPE.addTerm(vocabulary_term_SAMPLE_TYPE_TOTAL_RNA) - -vocabulary_term_SAMPLE_TYPE_CHIP = tr.createNewVocabularyTerm('CHIP') -vocabulary_term_SAMPLE_TYPE_CHIP.setDescription(None) -vocabulary_term_SAMPLE_TYPE_CHIP.setLabel(None) -vocabulary_term_SAMPLE_TYPE_CHIP.setOrdinal(6) -vocabulary_SAMPLE_TYPE.addTerm(vocabulary_term_SAMPLE_TYPE_CHIP) - -vocabulary_term_SAMPLE_TYPE_VIRAL = tr.createNewVocabularyTerm('VIRAL') -vocabulary_term_SAMPLE_TYPE_VIRAL.setDescription(None) -vocabulary_term_SAMPLE_TYPE_VIRAL.setLabel(None) -vocabulary_term_SAMPLE_TYPE_VIRAL.setOrdinal(7) -vocabulary_SAMPLE_TYPE.addTerm(vocabulary_term_SAMPLE_TYPE_VIRAL) - -vocabulary_term_SAMPLE_TYPE_SYNTHETIC = tr.createNewVocabularyTerm('SYNTHETIC') -vocabulary_term_SAMPLE_TYPE_SYNTHETIC.setDescription(None) -vocabulary_term_SAMPLE_TYPE_SYNTHETIC.setLabel(None) -vocabulary_term_SAMPLE_TYPE_SYNTHETIC.setOrdinal(8) -vocabulary_SAMPLE_TYPE.addTerm(vocabulary_term_SAMPLE_TYPE_SYNTHETIC) - -vocabulary_term_SAMPLE_TYPE_FRAGMENTED_GENOMIC_DNA = tr.createNewVocabularyTerm('FRAGMENTED_GENOMIC_DNA') -vocabulary_term_SAMPLE_TYPE_FRAGMENTED_GENOMIC_DNA.setDescription(None) -vocabulary_term_SAMPLE_TYPE_FRAGMENTED_GENOMIC_DNA.setLabel(None) -vocabulary_term_SAMPLE_TYPE_FRAGMENTED_GENOMIC_DNA.setOrdinal(9) -vocabulary_SAMPLE_TYPE.addTerm(vocabulary_term_SAMPLE_TYPE_FRAGMENTED_GENOMIC_DNA) - -vocabulary_term_SAMPLE_TYPE_MRNA = tr.createNewVocabularyTerm('MRNA') -vocabulary_term_SAMPLE_TYPE_MRNA.setDescription(None) -vocabulary_term_SAMPLE_TYPE_MRNA.setLabel(None) -vocabulary_term_SAMPLE_TYPE_MRNA.setOrdinal(10) -vocabulary_SAMPLE_TYPE.addTerm(vocabulary_term_SAMPLE_TYPE_MRNA) - -vocabulary_term_SAMPLE_TYPE_OTHER = tr.createNewVocabularyTerm('OTHER') -vocabulary_term_SAMPLE_TYPE_OTHER.setDescription(None) -vocabulary_term_SAMPLE_TYPE_OTHER.setLabel(None) -vocabulary_term_SAMPLE_TYPE_OTHER.setOrdinal(11) -vocabulary_SAMPLE_TYPE.addTerm(vocabulary_term_SAMPLE_TYPE_OTHER) - -vocabulary_term_SAMPLE_TYPE_BISULFITE_CHIP = tr.createNewVocabularyTerm('BISULFITE_CHIP') -vocabulary_term_SAMPLE_TYPE_BISULFITE_CHIP.setDescription(None) -vocabulary_term_SAMPLE_TYPE_BISULFITE_CHIP.setLabel(None) -vocabulary_term_SAMPLE_TYPE_BISULFITE_CHIP.setOrdinal(13) -vocabulary_SAMPLE_TYPE.addTerm(vocabulary_term_SAMPLE_TYPE_BISULFITE_CHIP) - -vocabulary_term_SAMPLE_TYPE_NONGENOMIC = tr.createNewVocabularyTerm('NON-GENOMIC') -vocabulary_term_SAMPLE_TYPE_NONGENOMIC.setDescription(None) -vocabulary_term_SAMPLE_TYPE_NONGENOMIC.setLabel(None) -vocabulary_term_SAMPLE_TYPE_NONGENOMIC.setOrdinal(14) -vocabulary_SAMPLE_TYPE.addTerm(vocabulary_term_SAMPLE_TYPE_NONGENOMIC) - -vocabulary_term_SAMPLE_TYPE_BISULFITE_TREATED = tr.createNewVocabularyTerm('BISULFITE_TREATED') -vocabulary_term_SAMPLE_TYPE_BISULFITE_TREATED.setDescription(None) -vocabulary_term_SAMPLE_TYPE_BISULFITE_TREATED.setLabel(None) -vocabulary_term_SAMPLE_TYPE_BISULFITE_TREATED.setOrdinal(15) -vocabulary_SAMPLE_TYPE.addTerm(vocabulary_term_SAMPLE_TYPE_BISULFITE_TREATED) - -vocabulary_SBS_SEQUENCING_KIT_VERSION = tr.getOrCreateNewVocabulary('SBS_SEQUENCING_KIT_VERSION') -vocabulary_SBS_SEQUENCING_KIT_VERSION.setDescription('Version of the Sequencing by Synthesis (SBS) Kit') -vocabulary_SBS_SEQUENCING_KIT_VERSION.setUrlTemplate(None) -vocabulary_SBS_SEQUENCING_KIT_VERSION.setManagedInternally(False) -vocabulary_SBS_SEQUENCING_KIT_VERSION.setChosenFromList(True) - -vocabulary_term_SBS_SEQUENCING_KIT_VERSION_TRUSEQ_V5 = tr.createNewVocabularyTerm('TRUSEQ_V5') -vocabulary_term_SBS_SEQUENCING_KIT_VERSION_TRUSEQ_V5.setDescription(None) -vocabulary_term_SBS_SEQUENCING_KIT_VERSION_TRUSEQ_V5.setLabel('TruSeq v5') -vocabulary_term_SBS_SEQUENCING_KIT_VERSION_TRUSEQ_V5.setOrdinal(1) -vocabulary_SBS_SEQUENCING_KIT_VERSION.addTerm(vocabulary_term_SBS_SEQUENCING_KIT_VERSION_TRUSEQ_V5) - -vocabulary_term_SBS_SEQUENCING_KIT_VERSION_V5 = tr.createNewVocabularyTerm('V5') -vocabulary_term_SBS_SEQUENCING_KIT_VERSION_V5.setDescription(None) -vocabulary_term_SBS_SEQUENCING_KIT_VERSION_V5.setLabel(None) -vocabulary_term_SBS_SEQUENCING_KIT_VERSION_V5.setOrdinal(2) -vocabulary_SBS_SEQUENCING_KIT_VERSION.addTerm(vocabulary_term_SBS_SEQUENCING_KIT_VERSION_V5) - -vocabulary_term_SBS_SEQUENCING_KIT_VERSION_V4 = tr.createNewVocabularyTerm('V4') -vocabulary_term_SBS_SEQUENCING_KIT_VERSION_V4.setDescription(None) -vocabulary_term_SBS_SEQUENCING_KIT_VERSION_V4.setLabel(None) -vocabulary_term_SBS_SEQUENCING_KIT_VERSION_V4.setOrdinal(3) -vocabulary_SBS_SEQUENCING_KIT_VERSION.addTerm(vocabulary_term_SBS_SEQUENCING_KIT_VERSION_V4) - -vocabulary_term_SBS_SEQUENCING_KIT_VERSION_V3 = tr.createNewVocabularyTerm('V3') -vocabulary_term_SBS_SEQUENCING_KIT_VERSION_V3.setDescription(None) -vocabulary_term_SBS_SEQUENCING_KIT_VERSION_V3.setLabel(None) -vocabulary_term_SBS_SEQUENCING_KIT_VERSION_V3.setOrdinal(4) -vocabulary_SBS_SEQUENCING_KIT_VERSION.addTerm(vocabulary_term_SBS_SEQUENCING_KIT_VERSION_V3) - -vocabulary_term_SBS_SEQUENCING_KIT_VERSION_SBS_HS_V3 = tr.createNewVocabularyTerm('SBS_HS_V3') -vocabulary_term_SBS_SEQUENCING_KIT_VERSION_SBS_HS_V3.setDescription(None) -vocabulary_term_SBS_SEQUENCING_KIT_VERSION_SBS_HS_V3.setLabel('TruSeq SBS HS v3') -vocabulary_term_SBS_SEQUENCING_KIT_VERSION_SBS_HS_V3.setOrdinal(5) -vocabulary_SBS_SEQUENCING_KIT_VERSION.addTerm(vocabulary_term_SBS_SEQUENCING_KIT_VERSION_SBS_HS_V3) - -vocabulary_SEQUENCER = tr.getOrCreateNewVocabulary('SEQUENCER') -vocabulary_SEQUENCER.setDescription('Which Sequencer was used?') -vocabulary_SEQUENCER.setUrlTemplate(None) -vocabulary_SEQUENCER.setManagedInternally(False) -vocabulary_SEQUENCER.setChosenFromList(True) - -vocabulary_term_SEQUENCER_M00721 = tr.createNewVocabularyTerm('M00721') -vocabulary_term_SEQUENCER_M00721.setDescription(None) -vocabulary_term_SEQUENCER_M00721.setLabel('MiSeq') -vocabulary_term_SEQUENCER_M00721.setOrdinal(6) -vocabulary_SEQUENCER.addTerm(vocabulary_term_SEQUENCER_M00721) - -vocabulary_term_SEQUENCER_SN792 = tr.createNewVocabularyTerm('SN792') -vocabulary_term_SEQUENCER_SN792.setDescription(None) -vocabulary_term_SEQUENCER_SN792.setLabel('HiSeq 2000') -vocabulary_term_SEQUENCER_SN792.setOrdinal(7) -vocabulary_SEQUENCER.addTerm(vocabulary_term_SEQUENCER_SN792) - -vocabulary_SEQUENCING_APPLICATION = tr.getOrCreateNewVocabulary('SEQUENCING_APPLICATION') -vocabulary_SEQUENCING_APPLICATION.setDescription('Type of experiment of the High Throughput Sequencing applications') -vocabulary_SEQUENCING_APPLICATION.setUrlTemplate(None) -vocabulary_SEQUENCING_APPLICATION.setManagedInternally(False) -vocabulary_SEQUENCING_APPLICATION.setChosenFromList(True) - -vocabulary_term_SEQUENCING_APPLICATION_SMALL_RNA_SEQ = tr.createNewVocabularyTerm('SMALL_RNA_SEQ') -vocabulary_term_SEQUENCING_APPLICATION_SMALL_RNA_SEQ.setDescription(None) -vocabulary_term_SEQUENCING_APPLICATION_SMALL_RNA_SEQ.setLabel(None) -vocabulary_term_SEQUENCING_APPLICATION_SMALL_RNA_SEQ.setOrdinal(1) -vocabulary_SEQUENCING_APPLICATION.addTerm(vocabulary_term_SEQUENCING_APPLICATION_SMALL_RNA_SEQ) - -vocabulary_term_SEQUENCING_APPLICATION_RNA_SEQ = tr.createNewVocabularyTerm('RNA_SEQ') -vocabulary_term_SEQUENCING_APPLICATION_RNA_SEQ.setDescription(None) -vocabulary_term_SEQUENCING_APPLICATION_RNA_SEQ.setLabel(None) -vocabulary_term_SEQUENCING_APPLICATION_RNA_SEQ.setOrdinal(2) -vocabulary_SEQUENCING_APPLICATION.addTerm(vocabulary_term_SEQUENCING_APPLICATION_RNA_SEQ) - -vocabulary_term_SEQUENCING_APPLICATION_GENOMIC_DNA_SEQ = tr.createNewVocabularyTerm('GENOMIC_DNA_SEQ') -vocabulary_term_SEQUENCING_APPLICATION_GENOMIC_DNA_SEQ.setDescription(None) -vocabulary_term_SEQUENCING_APPLICATION_GENOMIC_DNA_SEQ.setLabel(None) -vocabulary_term_SEQUENCING_APPLICATION_GENOMIC_DNA_SEQ.setOrdinal(3) -vocabulary_SEQUENCING_APPLICATION.addTerm(vocabulary_term_SEQUENCING_APPLICATION_GENOMIC_DNA_SEQ) - -vocabulary_term_SEQUENCING_APPLICATION_CHIP_SEQ = tr.createNewVocabularyTerm('CHIP_SEQ') -vocabulary_term_SEQUENCING_APPLICATION_CHIP_SEQ.setDescription(None) -vocabulary_term_SEQUENCING_APPLICATION_CHIP_SEQ.setLabel(None) -vocabulary_term_SEQUENCING_APPLICATION_CHIP_SEQ.setOrdinal(4) -vocabulary_SEQUENCING_APPLICATION.addTerm(vocabulary_term_SEQUENCING_APPLICATION_CHIP_SEQ) - -vocabulary_YES_NO = tr.getOrCreateNewVocabulary('YES_NO') -vocabulary_YES_NO.setDescription('Just offers YES or NO') -vocabulary_YES_NO.setUrlTemplate(None) -vocabulary_YES_NO.setManagedInternally(False) -vocabulary_YES_NO.setChosenFromList(True) - -vocabulary_term_YES_NO_YES = tr.createNewVocabularyTerm('YES') -vocabulary_term_YES_NO_YES.setDescription(None) -vocabulary_term_YES_NO_YES.setLabel(None) -vocabulary_term_YES_NO_YES.setOrdinal(1) -vocabulary_YES_NO.addTerm(vocabulary_term_YES_NO_YES) - -vocabulary_term_YES_NO_NO = tr.createNewVocabularyTerm('NO') -vocabulary_term_YES_NO_NO.setDescription(None) -vocabulary_term_YES_NO_NO.setLabel(None) -vocabulary_term_YES_NO_NO.setOrdinal(2) -vocabulary_YES_NO.addTerm(vocabulary_term_YES_NO_NO) - -print "Imported 22 Vocabularies" -script_Diff_time = tr.getOrCreateNewScript('Diff_time') -script_Diff_time.setName('Diff_time') -script_Diff_time.setDescription('Calculates the difference of two given dates') -script_Diff_time.setScript('''from datetime import datetime - -def dateTimeSplitter(openbisDate): - dateAndTime, tz = openbisDate.rsplit(" ", 1) - pythonDateTime = datetime.strptime(dateAndTime, "%Y-%m-%d %H:%M:%S") - return pythonDateTime - -def calculate(): - - try: - start = dateTimeSplitter(entity.propertyValue('FLOW_CELL_SEQUENCED_ON')) - end = dateTimeSplitter(entity.propertyValue('SEQUENCER_FINISHED')) - diffTime = end-start - return str(diffTime) - except: - return "N/A" -''') -script_Diff_time.setEntityForScript('SAMPLE') -script_Diff_time.setScriptType('DYNAMIC_PROPERTY') - -script_Has_Parents = tr.getOrCreateNewScript('Has_Parents') -script_Has_Parents.setName('Has_Parents') -script_Has_Parents.setDescription('Check if the Entity has a parent') -script_Has_Parents.setScript('''def validate(entity, isNew): - parents = entity.entityPE().parents - if parents: - return None - else: - return "No Parents have been selected!" -''') -script_Has_Parents.setEntityForScript('SAMPLE') -script_Has_Parents.setScriptType('ENTITY_VALIDATION') - -print "Imported 2 Scripts" -exp_type_HT_SEQUENCING = tr.getOrCreateNewExperimentType('HT_SEQUENCING') -exp_type_HT_SEQUENCING.setDescription('High Throughput Sequencing (e.g. Illumina HiSeq, Illumina GA)') - - -print "Imported 1 Experiment Types" -samp_type_ILLUMINA_FLOW_CELL = tr.getOrCreateNewSampleType('ILLUMINA_FLOW_CELL') -samp_type_ILLUMINA_FLOW_CELL.setDescription('Container of ILLUMINA_FLOW_LANES\ Can be created automatically by a drop box and the properties can be filled from the RunInfo.xml and runParameters.xml files') -samp_type_ILLUMINA_FLOW_CELL.setListable(True) -samp_type_ILLUMINA_FLOW_CELL.setShowContainer(False) -samp_type_ILLUMINA_FLOW_CELL.setShowParents(False) -samp_type_ILLUMINA_FLOW_CELL.setSubcodeUnique(False) -samp_type_ILLUMINA_FLOW_CELL.setAutoGeneratedCode(False) -samp_type_ILLUMINA_FLOW_CELL.setShowParentMetadata(False) -samp_type_ILLUMINA_FLOW_CELL.setGeneratedCodePrefix('FLOWCELL-') - - -samp_type_ILLUMINA_FLOW_LANE = tr.getOrCreateNewSampleType('ILLUMINA_FLOW_LANE') -samp_type_ILLUMINA_FLOW_LANE.setDescription('Child of LIBRARY or POOL') -samp_type_ILLUMINA_FLOW_LANE.setListable(True) -samp_type_ILLUMINA_FLOW_LANE.setShowContainer(True) -samp_type_ILLUMINA_FLOW_LANE.setShowParents(True) -samp_type_ILLUMINA_FLOW_LANE.setSubcodeUnique(False) -samp_type_ILLUMINA_FLOW_LANE.setAutoGeneratedCode(False) -samp_type_ILLUMINA_FLOW_LANE.setShowParentMetadata(True) -samp_type_ILLUMINA_FLOW_LANE.setGeneratedCodePrefix('FLOWLANE-') - - -samp_type_LIBRARY = tr.getOrCreateNewSampleType('LIBRARY') -samp_type_LIBRARY.setDescription('Child of RAW and potential parent of POOL') -samp_type_LIBRARY.setListable(True) -samp_type_LIBRARY.setShowContainer(False) -samp_type_LIBRARY.setShowParents(True) -samp_type_LIBRARY.setSubcodeUnique(False) -samp_type_LIBRARY.setAutoGeneratedCode(True) -samp_type_LIBRARY.setShowParentMetadata(True) -samp_type_LIBRARY.setGeneratedCodePrefix('BSSE-QGF-LIBRARY-') -samp_type_LIBRARY.setValidationScript(script_Has_Parents) - -samp_type_LIBRARY_POOL = tr.getOrCreateNewSampleType('LIBRARY_POOL') -samp_type_LIBRARY_POOL.setDescription('Child of several LIBRARY samples, used for multiplexing') -samp_type_LIBRARY_POOL.setListable(True) -samp_type_LIBRARY_POOL.setShowContainer(False) -samp_type_LIBRARY_POOL.setShowParents(True) -samp_type_LIBRARY_POOL.setSubcodeUnique(False) -samp_type_LIBRARY_POOL.setAutoGeneratedCode(True) -samp_type_LIBRARY_POOL.setShowParentMetadata(True) -samp_type_LIBRARY_POOL.setGeneratedCodePrefix('BSSE-QGF-POOL-') -samp_type_LIBRARY_POOL.setValidationScript(script_Has_Parents) - -samp_type_MASTER_SAMPLE = tr.getOrCreateNewSampleType('MASTER_SAMPLE') -samp_type_MASTER_SAMPLE.setDescription('Sample Type holding Master Data and a parent to RAW') -samp_type_MASTER_SAMPLE.setListable(True) -samp_type_MASTER_SAMPLE.setShowContainer(False) -samp_type_MASTER_SAMPLE.setShowParents(False) -samp_type_MASTER_SAMPLE.setSubcodeUnique(False) -samp_type_MASTER_SAMPLE.setAutoGeneratedCode(True) -samp_type_MASTER_SAMPLE.setShowParentMetadata(False) -samp_type_MASTER_SAMPLE.setGeneratedCodePrefix('BSSE-QGF-MASTER-') - - -samp_type_RAW_SAMPLE = tr.getOrCreateNewSampleType('RAW_SAMPLE') -samp_type_RAW_SAMPLE.setDescription('Child of MASTER') -samp_type_RAW_SAMPLE.setListable(True) -samp_type_RAW_SAMPLE.setShowContainer(False) -samp_type_RAW_SAMPLE.setShowParents(True) -samp_type_RAW_SAMPLE.setSubcodeUnique(False) -samp_type_RAW_SAMPLE.setAutoGeneratedCode(True) -samp_type_RAW_SAMPLE.setShowParentMetadata(True) -samp_type_RAW_SAMPLE.setGeneratedCodePrefix('BSSE-QGF-RAW-') -samp_type_RAW_SAMPLE.setValidationScript(script_Has_Parents) - -print "Imported 6 Sample Types" -data_set_type_ALIGNMENT = tr.getOrCreateNewDataSetType('ALIGNMENT') -data_set_type_ALIGNMENT.setDescription('Aligner ouput, ideally bam/sam') -data_set_type_ALIGNMENT.setMainDataSetPattern(None) -data_set_type_ALIGNMENT.setMainDataSetPath(None) -data_set_type_ALIGNMENT.setDeletionDisallowed(False) - - -data_set_type_BASECALL_STATS = tr.getOrCreateNewDataSetType('BASECALL_STATS') -data_set_type_BASECALL_STATS.setDescription('Base Call Statistics from the Illumina Pipeline (configureBclToFastq.pl)') -data_set_type_BASECALL_STATS.setMainDataSetPattern('original/.*/.*/Demultiplex_Stats.htm') -data_set_type_BASECALL_STATS.setMainDataSetPath(None) -data_set_type_BASECALL_STATS.setDeletionDisallowed(False) - - -data_set_type_BIGWIGGLE = tr.getOrCreateNewDataSetType('BIGWIGGLE') -data_set_type_BIGWIGGLE.setDescription('Visualization') -data_set_type_BIGWIGGLE.setMainDataSetPattern(None) -data_set_type_BIGWIGGLE.setMainDataSetPath(None) -data_set_type_BIGWIGGLE.setDeletionDisallowed(False) - - -data_set_type_ELAND_ALIGNMENT = tr.getOrCreateNewDataSetType('ELAND_ALIGNMENT') -data_set_type_ELAND_ALIGNMENT.setDescription('Illumina Eland Alignment Output') -data_set_type_ELAND_ALIGNMENT.setMainDataSetPattern(None) -data_set_type_ELAND_ALIGNMENT.setMainDataSetPath(None) -data_set_type_ELAND_ALIGNMENT.setDeletionDisallowed(False) - - -data_set_type_FASTQ_GZ = tr.getOrCreateNewDataSetType('FASTQ_GZ') -data_set_type_FASTQ_GZ.setDescription('Gzipped Fastq file produced by Casava 1.8+') -data_set_type_FASTQ_GZ.setMainDataSetPattern(None) -data_set_type_FASTQ_GZ.setMainDataSetPath(None) -data_set_type_FASTQ_GZ.setDeletionDisallowed(False) - - -data_set_type_ILLUMINA_HISEQ_OUTPUT = tr.getOrCreateNewDataSetType('ILLUMINA_HISEQ_OUTPUT') -data_set_type_ILLUMINA_HISEQ_OUTPUT.setDescription('HiSeq2000 Output') -data_set_type_ILLUMINA_HISEQ_OUTPUT.setMainDataSetPattern('original/.*/Data/Status.htm') -data_set_type_ILLUMINA_HISEQ_OUTPUT.setMainDataSetPath(None) -data_set_type_ILLUMINA_HISEQ_OUTPUT.setDeletionDisallowed(False) - - -data_set_type_ILLUMINA_MISEQ_OUTPUT = tr.getOrCreateNewDataSetType('ILLUMINA_MISEQ_OUTPUT') -data_set_type_ILLUMINA_MISEQ_OUTPUT.setDescription('MiSeq Output') -data_set_type_ILLUMINA_MISEQ_OUTPUT.setMainDataSetPattern(None) -data_set_type_ILLUMINA_MISEQ_OUTPUT.setMainDataSetPath(None) -data_set_type_ILLUMINA_MISEQ_OUTPUT.setDeletionDisallowed(False) - - -data_set_type_MACS_OUTPUT = tr.getOrCreateNewDataSetType('MACS_OUTPUT') -data_set_type_MACS_OUTPUT.setDescription('MACS Peak Caller output') -data_set_type_MACS_OUTPUT.setMainDataSetPattern(None) -data_set_type_MACS_OUTPUT.setMainDataSetPath(None) -data_set_type_MACS_OUTPUT.setDeletionDisallowed(False) - - -data_set_type_QUALITY_JPGS = tr.getOrCreateNewDataSetType('QUALITY_JPGS') -data_set_type_QUALITY_JPGS.setDescription('R generated Quality plots') -data_set_type_QUALITY_JPGS.setMainDataSetPattern(None) -data_set_type_QUALITY_JPGS.setMainDataSetPath(None) -data_set_type_QUALITY_JPGS.setDeletionDisallowed(False) - - -data_set_type_QUALITY_PDFS = tr.getOrCreateNewDataSetType('QUALITY_PDFS') -data_set_type_QUALITY_PDFS.setDescription('R generated pdfs showing quality data') -data_set_type_QUALITY_PDFS.setMainDataSetPattern(None) -data_set_type_QUALITY_PDFS.setMainDataSetPath(None) -data_set_type_QUALITY_PDFS.setDeletionDisallowed(False) - - -data_set_type_QUALITY_SVG = tr.getOrCreateNewDataSetType('QUALITY_SVG') -data_set_type_QUALITY_SVG.setDescription('R generated Quality plots') -data_set_type_QUALITY_SVG.setMainDataSetPattern(None) -data_set_type_QUALITY_SVG.setMainDataSetPath(None) -data_set_type_QUALITY_SVG.setDeletionDisallowed(False) - - -data_set_type_RUNINFO = tr.getOrCreateNewDataSetType('RUNINFO') -data_set_type_RUNINFO.setDescription('Run statstics: Status.html and Status_Files folder') -data_set_type_RUNINFO.setMainDataSetPattern('original/.*/Data/Status.htm') -data_set_type_RUNINFO.setMainDataSetPath(None) -data_set_type_RUNINFO.setDeletionDisallowed(False) - - -data_set_type_THUMBNAILS = tr.getOrCreateNewDataSetType('THUMBNAILS') -data_set_type_THUMBNAILS.setDescription('Thumbnails provided by the Illumina software') -data_set_type_THUMBNAILS.setMainDataSetPattern(None) -data_set_type_THUMBNAILS.setMainDataSetPath(None) -data_set_type_THUMBNAILS.setDeletionDisallowed(False) - - -data_set_type_TSV = tr.getOrCreateNewDataSetType('TSV') -data_set_type_TSV.setDescription('Tab separated files') -data_set_type_TSV.setMainDataSetPattern(None) -data_set_type_TSV.setMainDataSetPath(None) -data_set_type_TSV.setDeletionDisallowed(False) - - -print "Imported 15 Data Set Types" -print "Imported 0 Material Types" -prop_type_AGILENT_KIT = tr.getOrCreateNewPropertyType('AGILENT_KIT', DataType.CONTROLLEDVOCABULARY) -prop_type_AGILENT_KIT.setLabel('Agilent Kit') -prop_type_AGILENT_KIT.setManagedInternally(False) - -prop_type_AGILENT_KIT.setVocabulary(vocabulary_AGILENT_KIT) - -prop_type_ALIGNMENT_SOFTWARE = tr.getOrCreateNewPropertyType('ALIGNMENT_SOFTWARE', DataType.CONTROLLEDVOCABULARY) -prop_type_ALIGNMENT_SOFTWARE.setLabel('Alignment software') -prop_type_ALIGNMENT_SOFTWARE.setManagedInternally(False) - -prop_type_ALIGNMENT_SOFTWARE.setVocabulary(vocabulary_ALIGNMENT_SOFTWARE) - -prop_type_ANALYSIS_FINISHED = tr.getOrCreateNewPropertyType('ANALYSIS_FINISHED', DataType.TIMESTAMP) -prop_type_ANALYSIS_FINISHED.setLabel('Analysis finished') -prop_type_ANALYSIS_FINISHED.setManagedInternally(False) - - -prop_type_BARCODE_COMPLEXITY_CHECKER = tr.getOrCreateNewPropertyType('BARCODE_COMPLEXITY_CHECKER', DataType.MULTILINE_VARCHAR) -prop_type_BARCODE_COMPLEXITY_CHECKER.setLabel('Barcode_Complexity_Checker') -prop_type_BARCODE_COMPLEXITY_CHECKER.setManagedInternally(False) - - -prop_type_BASESCOVERED = tr.getOrCreateNewPropertyType('BASESCOVERED', DataType.INTEGER) -prop_type_BASESCOVERED.setLabel('bases Covered') -prop_type_BASESCOVERED.setManagedInternally(False) - - -prop_type_BIOLOGICAL_SAMPLE_ARRIVED = tr.getOrCreateNewPropertyType('BIOLOGICAL_SAMPLE_ARRIVED', DataType.TIMESTAMP) -prop_type_BIOLOGICAL_SAMPLE_ARRIVED.setLabel('Arrival Date of Biological Sample') -prop_type_BIOLOGICAL_SAMPLE_ARRIVED.setManagedInternally(False) - - -prop_type_CASAVA_VERSION = tr.getOrCreateNewPropertyType('CASAVA_VERSION', DataType.CONTROLLEDVOCABULARY) -prop_type_CASAVA_VERSION.setLabel('Casava Version') -prop_type_CASAVA_VERSION.setManagedInternally(False) - -prop_type_CASAVA_VERSION.setVocabulary(vocabulary_CASAVA_VERSION) - -prop_type_CELL_PLASTICITY_SYSTEMSX = tr.getOrCreateNewPropertyType('CELL_PLASTICITY_SYSTEMSX', DataType.BOOLEAN) -prop_type_CELL_PLASTICITY_SYSTEMSX.setLabel('Cell Plasticity (SystemsX)') -prop_type_CELL_PLASTICITY_SYSTEMSX.setManagedInternally(False) - - -prop_type_CHROMCOUNT = tr.getOrCreateNewPropertyType('CHROMCOUNT', DataType.INTEGER) -prop_type_CHROMCOUNT.setLabel('chrom Count') -prop_type_CHROMCOUNT.setManagedInternally(False) - - -prop_type_CLUSTER_GENERATION_KIT_VERSION = tr.getOrCreateNewPropertyType('CLUSTER_GENERATION_KIT_VERSION', DataType.CONTROLLEDVOCABULARY) -prop_type_CLUSTER_GENERATION_KIT_VERSION.setLabel('CS Generation Kit Version') -prop_type_CLUSTER_GENERATION_KIT_VERSION.setManagedInternally(False) - -prop_type_CLUSTER_GENERATION_KIT_VERSION.setVocabulary(vocabulary_CLUSTER_GENERATION_KIT_VERSION) - -prop_type_CLUSTER_STATION = tr.getOrCreateNewPropertyType('CLUSTER_STATION', DataType.CONTROLLEDVOCABULARY) -prop_type_CLUSTER_STATION.setLabel('Cluster Station') -prop_type_CLUSTER_STATION.setManagedInternally(False) - -prop_type_CLUSTER_STATION.setVocabulary(vocabulary_CLUSTER_STATION) - -prop_type_CONCENTRATION = tr.getOrCreateNewPropertyType('CONCENTRATION', DataType.REAL) -prop_type_CONCENTRATION.setLabel(u'Conc. [ng/\u03bcl]') -prop_type_CONCENTRATION.setManagedInternally(False) - - -prop_type_CONCENTRATION_FLOWLANE = tr.getOrCreateNewPropertyType('CONCENTRATION_FLOWLANE', DataType.REAL) -prop_type_CONCENTRATION_FLOWLANE.setLabel('Concentration in flow lane [pM]') -prop_type_CONCENTRATION_FLOWLANE.setManagedInternally(False) - - -prop_type_CONCENTRATION_ORIGINAL_ILLUMINA = tr.getOrCreateNewPropertyType('CONCENTRATION_ORIGINAL_ILLUMINA', DataType.REAL) -prop_type_CONCENTRATION_ORIGINAL_ILLUMINA.setLabel(u'Concentration (original) [ng/\u03bcl]') -prop_type_CONCENTRATION_ORIGINAL_ILLUMINA.setManagedInternally(False) - - -prop_type_CONCENTRATION_PREPARED_ILLUMINA = tr.getOrCreateNewPropertyType('CONCENTRATION_PREPARED_ILLUMINA', DataType.REAL) -prop_type_CONCENTRATION_PREPARED_ILLUMINA.setLabel(u'Concentration (prepared) [ng/\u03bcl]') -prop_type_CONCENTRATION_PREPARED_ILLUMINA.setManagedInternally(False) - - -prop_type_CONTACT_PERSON_EMAIL = tr.getOrCreateNewPropertyType('CONTACT_PERSON_EMAIL', DataType.VARCHAR) -prop_type_CONTACT_PERSON_EMAIL.setLabel('Email of Contact Person') -prop_type_CONTACT_PERSON_EMAIL.setManagedInternally(False) - - -prop_type_CONTACT_PERSON_NAME = tr.getOrCreateNewPropertyType('CONTACT_PERSON_NAME', DataType.VARCHAR) -prop_type_CONTACT_PERSON_NAME.setLabel('Name of Contact Person') -prop_type_CONTACT_PERSON_NAME.setManagedInternally(False) - - -prop_type_CONTROL_LANE = tr.getOrCreateNewPropertyType('CONTROL_LANE', DataType.CONTROLLEDVOCABULARY) -prop_type_CONTROL_LANE.setLabel('Control Lane') -prop_type_CONTROL_LANE.setManagedInternally(False) - -prop_type_CONTROL_LANE.setVocabulary(vocabulary_CONTROL_LANE) - -prop_type_CREATED_ON_CS = tr.getOrCreateNewPropertyType('CREATED_ON_CS', DataType.TIMESTAMP) -prop_type_CREATED_ON_CS.setLabel('Clustering date') -prop_type_CREATED_ON_CS.setManagedInternally(False) - - -prop_type_CS_PROTOCOL_VERSION = tr.getOrCreateNewPropertyType('CS_PROTOCOL_VERSION', DataType.VARCHAR) -prop_type_CS_PROTOCOL_VERSION.setLabel('CS Protocol Version') -prop_type_CS_PROTOCOL_VERSION.setManagedInternally(False) - - -prop_type_CYCLES = tr.getOrCreateNewPropertyType('CYCLES', DataType.INTEGER) -prop_type_CYCLES.setLabel('Cycles') -prop_type_CYCLES.setManagedInternally(False) - - -prop_type_DATA_TRANSFERRED = tr.getOrCreateNewPropertyType('DATA_TRANSFERRED', DataType.TIMESTAMP) -prop_type_DATA_TRANSFERRED.setLabel('Data transferred') -prop_type_DATA_TRANSFERRED.setManagedInternally(False) - - -prop_type_DNA_CONCENTRATION_OF_LIBRARY = tr.getOrCreateNewPropertyType('DNA_CONCENTRATION_OF_LIBRARY', DataType.INTEGER) -prop_type_DNA_CONCENTRATION_OF_LIBRARY.setLabel('DNA concentration of library (nM)') -prop_type_DNA_CONCENTRATION_OF_LIBRARY.setManagedInternally(False) - - -prop_type_DNA_CONCENTRATION_POOL = tr.getOrCreateNewPropertyType('DNA_CONCENTRATION_POOL', DataType.REAL) -prop_type_DNA_CONCENTRATION_POOL.setLabel('DNA conc. [nM] - customer value') -prop_type_DNA_CONCENTRATION_POOL.setManagedInternally(False) - - -prop_type_DNA_CONCENTRATION_QGF = tr.getOrCreateNewPropertyType('DNA_CONCENTRATION_QGF', DataType.REAL) -prop_type_DNA_CONCENTRATION_QGF.setLabel('DNA concentration of Pool [nM]') -prop_type_DNA_CONCENTRATION_QGF.setManagedInternally(False) - - -prop_type_END_TYPE = tr.getOrCreateNewPropertyType('END_TYPE', DataType.CONTROLLEDVOCABULARY) -prop_type_END_TYPE.setLabel('Paired End / Single Read') -prop_type_END_TYPE.setManagedInternally(False) - -prop_type_END_TYPE.setVocabulary(vocabulary_END_TYPE) - -prop_type_EXPERIMENT_DESIGN = tr.getOrCreateNewPropertyType('EXPERIMENT_DESIGN', DataType.CONTROLLEDVOCABULARY) -prop_type_EXPERIMENT_DESIGN.setLabel('Experiment Design') -prop_type_EXPERIMENT_DESIGN.setManagedInternally(False) - -prop_type_EXPERIMENT_DESIGN.setVocabulary(vocabulary_EXPERIMENT_DESIGN) - -prop_type_EXTERNAL_SAMPLE_NAME = tr.getOrCreateNewPropertyType('EXTERNAL_SAMPLE_NAME', DataType.VARCHAR) -prop_type_EXTERNAL_SAMPLE_NAME.setLabel('External Sample Name') -prop_type_EXTERNAL_SAMPLE_NAME.setManagedInternally(False) - - -prop_type_FLOWCELLTYPE = tr.getOrCreateNewPropertyType('FLOWCELLTYPE', DataType.VARCHAR) -prop_type_FLOWCELLTYPE.setLabel('Flow Cell Type') -prop_type_FLOWCELLTYPE.setManagedInternally(False) - - -prop_type_FLOW_CELL_SEQUENCED_ON = tr.getOrCreateNewPropertyType('FLOW_CELL_SEQUENCED_ON', DataType.TIMESTAMP) -prop_type_FLOW_CELL_SEQUENCED_ON.setLabel('Sequencing started') -prop_type_FLOW_CELL_SEQUENCED_ON.setManagedInternally(False) - - -prop_type_FRAGMENT_SIZE_BASE_PAIRS = tr.getOrCreateNewPropertyType('FRAGMENT_SIZE_BASE_PAIRS', DataType.INTEGER) -prop_type_FRAGMENT_SIZE_BASE_PAIRS.setLabel('Fragment Size [base pairs]') -prop_type_FRAGMENT_SIZE_BASE_PAIRS.setManagedInternally(False) - - -prop_type_FRAGMENT_SIZE_PREPARED_ILLUMINA = tr.getOrCreateNewPropertyType('FRAGMENT_SIZE_PREPARED_ILLUMINA', DataType.INTEGER) -prop_type_FRAGMENT_SIZE_PREPARED_ILLUMINA.setLabel('Fragment Size (prepared) [base (pairs)]') -prop_type_FRAGMENT_SIZE_PREPARED_ILLUMINA.setManagedInternally(False) - - -prop_type_ILLUMINA_PIPELINE_VERSION = tr.getOrCreateNewPropertyType('ILLUMINA_PIPELINE_VERSION', DataType.CONTROLLEDVOCABULARY) -prop_type_ILLUMINA_PIPELINE_VERSION.setLabel('Pipeline Version') -prop_type_ILLUMINA_PIPELINE_VERSION.setManagedInternally(False) - -prop_type_ILLUMINA_PIPELINE_VERSION.setVocabulary(vocabulary_PIPELINE_VERSION) - -prop_type_INDEX1 = tr.getOrCreateNewPropertyType('INDEX1', DataType.CONTROLLEDVOCABULARY) -prop_type_INDEX1.setLabel('Index 1') -prop_type_INDEX1.setManagedInternally(False) - -prop_type_INDEX1.setVocabulary(vocabulary_INDEX1) - -prop_type_INDEX2 = tr.getOrCreateNewPropertyType('INDEX2', DataType.CONTROLLEDVOCABULARY) -prop_type_INDEX2.setLabel('Index 2') -prop_type_INDEX2.setManagedInternally(False) - -prop_type_INDEX2.setVocabulary(vocabulary_INDEX2) - -prop_type_INDEXREAD = tr.getOrCreateNewPropertyType('INDEXREAD', DataType.INTEGER) -prop_type_INDEXREAD.setLabel('Length of Index Read1') -prop_type_INDEXREAD.setManagedInternally(False) - - -prop_type_INDEXREAD2 = tr.getOrCreateNewPropertyType('INDEXREAD2', DataType.INTEGER) -prop_type_INDEXREAD2.setLabel('Length of Index Read2') -prop_type_INDEXREAD2.setManagedInternally(False) - - -prop_type_INVOICE = tr.getOrCreateNewPropertyType('INVOICE', DataType.BOOLEAN) -prop_type_INVOICE.setLabel('Invoice sent?') -prop_type_INVOICE.setManagedInternally(False) - - -prop_type_ISCOMPRESSED = tr.getOrCreateNewPropertyType('ISCOMPRESSED', DataType.BOOLEAN) -prop_type_ISCOMPRESSED.setLabel('Is Compressed') -prop_type_ISCOMPRESSED.setManagedInternally(False) - - -prop_type_ISSUED_COMMAND = tr.getOrCreateNewPropertyType('ISSUED_COMMAND', DataType.MULTILINE_VARCHAR) -prop_type_ISSUED_COMMAND.setLabel('Issued Command') -prop_type_ISSUED_COMMAND.setManagedInternally(False) - - -prop_type_ISSWAPPED = tr.getOrCreateNewPropertyType('ISSWAPPED', DataType.INTEGER) -prop_type_ISSWAPPED.setLabel('Is byte swapped') -prop_type_ISSWAPPED.setManagedInternally(False) - - -prop_type_KIT = tr.getOrCreateNewPropertyType('KIT', DataType.CONTROLLEDVOCABULARY) -prop_type_KIT.setLabel('Library preparation kit') -prop_type_KIT.setManagedInternally(False) - -prop_type_KIT.setVocabulary(vocabulary_KIT) - -prop_type_KIT_PREPARED = tr.getOrCreateNewPropertyType('KIT_PREPARED', DataType.TIMESTAMP) -prop_type_KIT_PREPARED.setLabel('Sample processed') -prop_type_KIT_PREPARED.setManagedInternally(False) - - -prop_type_LANECOUNT = tr.getOrCreateNewPropertyType('LANECOUNT', DataType.INTEGER) -prop_type_LANECOUNT.setLabel('Lane Count') -prop_type_LANECOUNT.setManagedInternally(False) - - -prop_type_LIBRARY_PROCESSING_FAILED = tr.getOrCreateNewPropertyType('LIBRARY_PROCESSING_FAILED', DataType.BOOLEAN) -prop_type_LIBRARY_PROCESSING_FAILED.setLabel('Library processing failed') -prop_type_LIBRARY_PROCESSING_FAILED.setManagedInternally(False) - - -prop_type_LIBRARY_PROCESSING_POSSIBLE_YES_NO = tr.getOrCreateNewPropertyType('LIBRARY_PROCESSING_POSSIBLE_YES_NO', DataType.CONTROLLEDVOCABULARY) -prop_type_LIBRARY_PROCESSING_POSSIBLE_YES_NO.setLabel('Library processing possible') -prop_type_LIBRARY_PROCESSING_POSSIBLE_YES_NO.setManagedInternally(False) - -prop_type_LIBRARY_PROCESSING_POSSIBLE_YES_NO.setVocabulary(vocabulary_YES_NO) - -prop_type_LIBRARY_PROCESSING_SUCCESSFUL = tr.getOrCreateNewPropertyType('LIBRARY_PROCESSING_SUCCESSFUL', DataType.BOOLEAN) -prop_type_LIBRARY_PROCESSING_SUCCESSFUL.setLabel('Library processing successful') -prop_type_LIBRARY_PROCESSING_SUCCESSFUL.setManagedInternally(False) - - -prop_type_LOT = tr.getOrCreateNewPropertyType('LOT', DataType.INTEGER) -prop_type_LOT.setLabel('Kit Lot #') -prop_type_LOT.setManagedInternally(False) - - -prop_type_MACS_VERSION = tr.getOrCreateNewPropertyType('MACS_VERSION', DataType.CONTROLLEDVOCABULARY) -prop_type_MACS_VERSION.setLabel('MACS VERSION') -prop_type_MACS_VERSION.setManagedInternally(False) - -prop_type_MACS_VERSION.setVocabulary(vocabulary_MACS_VERSION) - -prop_type_MAPPED_READS = tr.getOrCreateNewPropertyType('MAPPED_READS', DataType.INTEGER) -prop_type_MAPPED_READS.setLabel('Mapped reads') -prop_type_MAPPED_READS.setManagedInternally(False) - - -prop_type_MAX = tr.getOrCreateNewPropertyType('MAX', DataType.REAL) -prop_type_MAX.setLabel('Maximum') -prop_type_MAX.setManagedInternally(False) - - -prop_type_MEAN = tr.getOrCreateNewPropertyType('MEAN', DataType.REAL) -prop_type_MEAN.setLabel('Mean') -prop_type_MEAN.setManagedInternally(False) - - -prop_type_MIN = tr.getOrCreateNewPropertyType('MIN', DataType.REAL) -prop_type_MIN.setLabel('Minimum') -prop_type_MIN.setManagedInternally(False) - - -prop_type_MISMATCH_IN_INDEX = tr.getOrCreateNewPropertyType('MISMATCH_IN_INDEX', DataType.CONTROLLEDVOCABULARY) -prop_type_MISMATCH_IN_INDEX.setLabel('Mismatch in Index') -prop_type_MISMATCH_IN_INDEX.setManagedInternally(False) - -prop_type_MISMATCH_IN_INDEX.setVocabulary(vocabulary_MISMATCH_IN_INDEX) - -prop_type_NANO_DROP = tr.getOrCreateNewPropertyType('NANO_DROP', DataType.CONTROLLEDVOCABULARY) -prop_type_NANO_DROP.setLabel('Nano Drop') -prop_type_NANO_DROP.setManagedInternally(False) - -prop_type_NANO_DROP.setVocabulary(vocabulary_NANO_DROP) - -prop_type_NCBI_ORGANISM_TAXONOMY = tr.getOrCreateNewPropertyType('NCBI_ORGANISM_TAXONOMY', DataType.CONTROLLEDVOCABULARY) -prop_type_NCBI_ORGANISM_TAXONOMY.setLabel('Organism (NCBI Taxonomy)') -prop_type_NCBI_ORGANISM_TAXONOMY.setManagedInternally(False) - -prop_type_NCBI_ORGANISM_TAXONOMY.setVocabulary(vocabulary_NCBI_TAXONOMY) - -prop_type_NM_DNA = tr.getOrCreateNewPropertyType('NM_DNA', DataType.REAL) -prop_type_NM_DNA.setLabel('Calculated DNA concentration of library (nM)') -prop_type_NM_DNA.setManagedInternally(False) - - -prop_type_NOTES = tr.getOrCreateNewPropertyType('NOTES', DataType.MULTILINE_VARCHAR) -prop_type_NOTES.setLabel('Notes') -prop_type_NOTES.setManagedInternally(False) - - -prop_type_NUMBER_OF_ATTACHMENTS = tr.getOrCreateNewPropertyType('NUMBER_OF_ATTACHMENTS', DataType.INTEGER) -prop_type_NUMBER_OF_ATTACHMENTS.setLabel('Number of Attachments') -prop_type_NUMBER_OF_ATTACHMENTS.setManagedInternally(False) - - -prop_type_PAIRED_END_KIT = tr.getOrCreateNewPropertyType('PAIRED_END_KIT', DataType.VARCHAR) -prop_type_PAIRED_END_KIT.setLabel('Paired End Kit') -prop_type_PAIRED_END_KIT.setManagedInternally(False) - - -prop_type_PERCENTAGE_ONE_MISMATCH_READS_INDEX = tr.getOrCreateNewPropertyType('PERCENTAGE_ONE_MISMATCH_READS_INDEX', DataType.REAL) -prop_type_PERCENTAGE_ONE_MISMATCH_READS_INDEX.setLabel('% One Mismatch Reads (Index)') -prop_type_PERCENTAGE_ONE_MISMATCH_READS_INDEX.setManagedInternally(False) - - -prop_type_PERCENTAGE_PASSED_FILTERING = tr.getOrCreateNewPropertyType('PERCENTAGE_PASSED_FILTERING', DataType.REAL) -prop_type_PERCENTAGE_PASSED_FILTERING.setLabel('% Passes Illumina Filtering (PF)') -prop_type_PERCENTAGE_PASSED_FILTERING.setManagedInternally(False) - - -prop_type_PERCENTAGE_PERFECT_INDEX_READS = tr.getOrCreateNewPropertyType('PERCENTAGE_PERFECT_INDEX_READS', DataType.REAL) -prop_type_PERCENTAGE_PERFECT_INDEX_READS.setLabel('% Perfect Index Reads') -prop_type_PERCENTAGE_PERFECT_INDEX_READS.setManagedInternally(False) - - -prop_type_PERCENTAGE_RAW_CLUSTERS_PER_LANE = tr.getOrCreateNewPropertyType('PERCENTAGE_RAW_CLUSTERS_PER_LANE', DataType.REAL) -prop_type_PERCENTAGE_RAW_CLUSTERS_PER_LANE.setLabel('% of raw clusters per lane') -prop_type_PERCENTAGE_RAW_CLUSTERS_PER_LANE.setManagedInternally(False) - - -prop_type_PREPARED_BY = tr.getOrCreateNewPropertyType('PREPARED_BY', DataType.VARCHAR) -prop_type_PREPARED_BY.setLabel('Prepared by') -prop_type_PREPARED_BY.setManagedInternally(False) - - -prop_type_PRIMARYDATASIZE = tr.getOrCreateNewPropertyType('PRIMARYDATASIZE', DataType.INTEGER) -prop_type_PRIMARYDATASIZE.setLabel('primary Data Size') -prop_type_PRIMARYDATASIZE.setManagedInternally(False) - - -prop_type_PRIMARYINDEXSIZE = tr.getOrCreateNewPropertyType('PRIMARYINDEXSIZE', DataType.INTEGER) -prop_type_PRIMARYINDEXSIZE.setLabel('primary Index Size') -prop_type_PRIMARYINDEXSIZE.setManagedInternally(False) - - -prop_type_PRINCIPAL_INVESTIGATOR_EMAIL = tr.getOrCreateNewPropertyType('PRINCIPAL_INVESTIGATOR_EMAIL', DataType.VARCHAR) -prop_type_PRINCIPAL_INVESTIGATOR_EMAIL.setLabel('Email of Principal Investigator') -prop_type_PRINCIPAL_INVESTIGATOR_EMAIL.setManagedInternally(False) - - -prop_type_PRINCIPAL_INVESTIGATOR_NAME = tr.getOrCreateNewPropertyType('PRINCIPAL_INVESTIGATOR_NAME', DataType.VARCHAR) -prop_type_PRINCIPAL_INVESTIGATOR_NAME.setLabel('Name of Principal Investigator') -prop_type_PRINCIPAL_INVESTIGATOR_NAME.setManagedInternally(False) - - -prop_type_QC_AT_DBSSE = tr.getOrCreateNewPropertyType('QC_AT_DBSSE', DataType.CONTROLLEDVOCABULARY) -prop_type_QC_AT_DBSSE.setLabel('QC at D-BSSE') -prop_type_QC_AT_DBSSE.setManagedInternally(False) - -prop_type_QC_AT_DBSSE.setVocabulary(vocabulary_YES_NO) - -prop_type_QC_REQUIRED = tr.getOrCreateNewPropertyType('QC_REQUIRED', DataType.CONTROLLEDVOCABULARY) -prop_type_QC_REQUIRED.setLabel('QC required') -prop_type_QC_REQUIRED.setManagedInternally(False) - -prop_type_QC_REQUIRED.setVocabulary(vocabulary_YES_NO) - -prop_type_RUNNINGTIME = tr.getOrCreateNewPropertyType('RUNNINGTIME', DataType.VARCHAR) -prop_type_RUNNINGTIME.setLabel('Running Time') -prop_type_RUNNINGTIME.setManagedInternally(False) - - -prop_type_RUN_FOLDER_NAME = tr.getOrCreateNewPropertyType('RUN_FOLDER_NAME', DataType.VARCHAR) -prop_type_RUN_FOLDER_NAME.setLabel('Run Folder Name') -prop_type_RUN_FOLDER_NAME.setManagedInternally(False) - - -prop_type_SAMPLE_KIND = tr.getOrCreateNewPropertyType('SAMPLE_KIND', DataType.CONTROLLEDVOCABULARY) -prop_type_SAMPLE_KIND.setLabel('Sample Kind') -prop_type_SAMPLE_KIND.setManagedInternally(False) - -prop_type_SAMPLE_KIND.setVocabulary(vocabulary_SAMPLE_TYPE) - -prop_type_SAMTOOLS_FLAGSTAT = tr.getOrCreateNewPropertyType('SAMTOOLS_FLAGSTAT', DataType.MULTILINE_VARCHAR) -prop_type_SAMTOOLS_FLAGSTAT.setLabel('Samtools Flagstat Output') -prop_type_SAMTOOLS_FLAGSTAT.setManagedInternally(False) - - -prop_type_SBS_KIT = tr.getOrCreateNewPropertyType('SBS_KIT', DataType.VARCHAR) -prop_type_SBS_KIT.setLabel('SBS Kit') -prop_type_SBS_KIT.setManagedInternally(False) - - -prop_type_SBS_SEQUENCING_KIT_VERSION = tr.getOrCreateNewPropertyType('SBS_SEQUENCING_KIT_VERSION', DataType.CONTROLLEDVOCABULARY) -prop_type_SBS_SEQUENCING_KIT_VERSION.setLabel('SBS Sequencing Kit Version') -prop_type_SBS_SEQUENCING_KIT_VERSION.setManagedInternally(False) - -prop_type_SBS_SEQUENCING_KIT_VERSION.setVocabulary(vocabulary_SBS_SEQUENCING_KIT_VERSION) - -prop_type_SEQUENCER = tr.getOrCreateNewPropertyType('SEQUENCER', DataType.CONTROLLEDVOCABULARY) -prop_type_SEQUENCER.setLabel('Sequencer') -prop_type_SEQUENCER.setManagedInternally(False) - -prop_type_SEQUENCER.setVocabulary(vocabulary_SEQUENCER) - -prop_type_SEQUENCER_FINISHED = tr.getOrCreateNewPropertyType('SEQUENCER_FINISHED', DataType.TIMESTAMP) -prop_type_SEQUENCER_FINISHED.setLabel('Sequencer finished') -prop_type_SEQUENCER_FINISHED.setManagedInternally(False) - - -prop_type_STARTING_AMOUNT_OF_SAMPLE_IN_NG = tr.getOrCreateNewPropertyType('STARTING_AMOUNT_OF_SAMPLE_IN_NG', DataType.REAL) -prop_type_STARTING_AMOUNT_OF_SAMPLE_IN_NG.setLabel('Starting amount of sample (ng)') -prop_type_STARTING_AMOUNT_OF_SAMPLE_IN_NG.setManagedInternally(False) - - -prop_type_STD = tr.getOrCreateNewPropertyType('STD', DataType.REAL) -prop_type_STD.setLabel('Standard deviation') -prop_type_STD.setManagedInternally(False) - - -prop_type_SURFACECOUNT = tr.getOrCreateNewPropertyType('SURFACECOUNT', DataType.INTEGER) -prop_type_SURFACECOUNT.setLabel('Surface Count') -prop_type_SURFACECOUNT.setManagedInternally(False) - - -prop_type_SWATHCOUNT = tr.getOrCreateNewPropertyType('SWATHCOUNT', DataType.INTEGER) -prop_type_SWATHCOUNT.setLabel('Swath Count') -prop_type_SWATHCOUNT.setManagedInternally(False) - - -prop_type_TILECOUNT = tr.getOrCreateNewPropertyType('TILECOUNT', DataType.INTEGER) -prop_type_TILECOUNT.setLabel('Tile Count') -prop_type_TILECOUNT.setManagedInternally(False) - - -prop_type_TOTAL_READS = tr.getOrCreateNewPropertyType('TOTAL_READS', DataType.INTEGER) -prop_type_TOTAL_READS.setLabel('Total reads') -prop_type_TOTAL_READS.setManagedInternally(False) - - -prop_type_UL_DNA = tr.getOrCreateNewPropertyType('UL_DNA', DataType.REAL) -prop_type_UL_DNA.setLabel('Calculated ul DNA for 2nM stock') -prop_type_UL_DNA.setManagedInternally(False) - - -prop_type_UL_EB = tr.getOrCreateNewPropertyType('UL_EB', DataType.REAL) -prop_type_UL_EB.setLabel('Calculated ul EB for 2nM stock ') -prop_type_UL_EB.setManagedInternally(False) - - -prop_type_UL_STOCK = tr.getOrCreateNewPropertyType('UL_STOCK', DataType.INTEGER) -prop_type_UL_STOCK.setLabel('ul of 2nM stock') -prop_type_UL_STOCK.setManagedInternally(False) - - -prop_type_UNIQUE_BARCODES = tr.getOrCreateNewPropertyType('UNIQUE_BARCODES', DataType.VARCHAR) -prop_type_UNIQUE_BARCODES.setLabel('Unique Barcodes in Pool?') -prop_type_UNIQUE_BARCODES.setManagedInternally(False) - - -prop_type_VERSION = tr.getOrCreateNewPropertyType('VERSION', DataType.VARCHAR) -prop_type_VERSION.setLabel('Version') -prop_type_VERSION.setManagedInternally(False) - - -prop_type_YIELD_MBASES = tr.getOrCreateNewPropertyType('YIELD_MBASES', DataType.INTEGER) -prop_type_YIELD_MBASES.setLabel('Yield(Mbases)') -prop_type_YIELD_MBASES.setManagedInternally(False) - - -prop_type_ZOOMLEVELS = tr.getOrCreateNewPropertyType('ZOOMLEVELS', DataType.INTEGER) -prop_type_ZOOMLEVELS.setLabel('zoom Levels') -prop_type_ZOOMLEVELS.setManagedInternally(False) - - -print "Imported 92 Property Types" -assignment_DATA_SET_ALIGNMENT_ALIGNMENT_SOFTWARE = tr.assignPropertyType(data_set_type_ALIGNMENT, prop_type_ALIGNMENT_SOFTWARE) -assignment_DATA_SET_ALIGNMENT_ALIGNMENT_SOFTWARE.setMandatory(False) -assignment_DATA_SET_ALIGNMENT_ALIGNMENT_SOFTWARE.setSection(None) -assignment_DATA_SET_ALIGNMENT_ALIGNMENT_SOFTWARE.setPositionInForms(3) - -assignment_DATA_SET_ALIGNMENT_VERSION = tr.assignPropertyType(data_set_type_ALIGNMENT, prop_type_VERSION) -assignment_DATA_SET_ALIGNMENT_VERSION.setMandatory(False) -assignment_DATA_SET_ALIGNMENT_VERSION.setSection(None) -assignment_DATA_SET_ALIGNMENT_VERSION.setPositionInForms(4) - -assignment_DATA_SET_ALIGNMENT_NOTES = tr.assignPropertyType(data_set_type_ALIGNMENT, prop_type_NOTES) -assignment_DATA_SET_ALIGNMENT_NOTES.setMandatory(False) -assignment_DATA_SET_ALIGNMENT_NOTES.setSection(None) -assignment_DATA_SET_ALIGNMENT_NOTES.setPositionInForms(5) - -assignment_DATA_SET_ALIGNMENT_SAMTOOLS_FLAGSTAT = tr.assignPropertyType(data_set_type_ALIGNMENT, prop_type_SAMTOOLS_FLAGSTAT) -assignment_DATA_SET_ALIGNMENT_SAMTOOLS_FLAGSTAT.setMandatory(False) -assignment_DATA_SET_ALIGNMENT_SAMTOOLS_FLAGSTAT.setSection(None) -assignment_DATA_SET_ALIGNMENT_SAMTOOLS_FLAGSTAT.setPositionInForms(6) - -assignment_DATA_SET_ALIGNMENT_MAPPED_READS = tr.assignPropertyType(data_set_type_ALIGNMENT, prop_type_MAPPED_READS) -assignment_DATA_SET_ALIGNMENT_MAPPED_READS.setMandatory(False) -assignment_DATA_SET_ALIGNMENT_MAPPED_READS.setSection(None) -assignment_DATA_SET_ALIGNMENT_MAPPED_READS.setPositionInForms(7) - -assignment_DATA_SET_ALIGNMENT_TOTAL_READS = tr.assignPropertyType(data_set_type_ALIGNMENT, prop_type_TOTAL_READS) -assignment_DATA_SET_ALIGNMENT_TOTAL_READS.setMandatory(False) -assignment_DATA_SET_ALIGNMENT_TOTAL_READS.setSection(None) -assignment_DATA_SET_ALIGNMENT_TOTAL_READS.setPositionInForms(8) - -assignment_DATA_SET_ALIGNMENT_ISSUED_COMMAND = tr.assignPropertyType(data_set_type_ALIGNMENT, prop_type_ISSUED_COMMAND) -assignment_DATA_SET_ALIGNMENT_ISSUED_COMMAND.setMandatory(False) -assignment_DATA_SET_ALIGNMENT_ISSUED_COMMAND.setSection(None) -assignment_DATA_SET_ALIGNMENT_ISSUED_COMMAND.setPositionInForms(9) - -assignment_DATA_SET_BASECALL_STATS_MISMATCH_IN_INDEX = tr.assignPropertyType(data_set_type_BASECALL_STATS, prop_type_MISMATCH_IN_INDEX) -assignment_DATA_SET_BASECALL_STATS_MISMATCH_IN_INDEX.setMandatory(False) -assignment_DATA_SET_BASECALL_STATS_MISMATCH_IN_INDEX.setSection(None) -assignment_DATA_SET_BASECALL_STATS_MISMATCH_IN_INDEX.setPositionInForms(3) - -assignment_DATA_SET_BIGWIGGLE_NOTES = tr.assignPropertyType(data_set_type_BIGWIGGLE, prop_type_NOTES) -assignment_DATA_SET_BIGWIGGLE_NOTES.setMandatory(False) -assignment_DATA_SET_BIGWIGGLE_NOTES.setSection(None) -assignment_DATA_SET_BIGWIGGLE_NOTES.setPositionInForms(3) - -assignment_DATA_SET_BIGWIGGLE_VERSION = tr.assignPropertyType(data_set_type_BIGWIGGLE, prop_type_VERSION) -assignment_DATA_SET_BIGWIGGLE_VERSION.setMandatory(False) -assignment_DATA_SET_BIGWIGGLE_VERSION.setSection(None) -assignment_DATA_SET_BIGWIGGLE_VERSION.setPositionInForms(4) - -assignment_DATA_SET_BIGWIGGLE_ISCOMPRESSED = tr.assignPropertyType(data_set_type_BIGWIGGLE, prop_type_ISCOMPRESSED) -assignment_DATA_SET_BIGWIGGLE_ISCOMPRESSED.setMandatory(False) -assignment_DATA_SET_BIGWIGGLE_ISCOMPRESSED.setSection(None) -assignment_DATA_SET_BIGWIGGLE_ISCOMPRESSED.setPositionInForms(5) - -assignment_DATA_SET_BIGWIGGLE_ISSWAPPED = tr.assignPropertyType(data_set_type_BIGWIGGLE, prop_type_ISSWAPPED) -assignment_DATA_SET_BIGWIGGLE_ISSWAPPED.setMandatory(False) -assignment_DATA_SET_BIGWIGGLE_ISSWAPPED.setSection(None) -assignment_DATA_SET_BIGWIGGLE_ISSWAPPED.setPositionInForms(6) - -assignment_DATA_SET_BIGWIGGLE_PRIMARYDATASIZE = tr.assignPropertyType(data_set_type_BIGWIGGLE, prop_type_PRIMARYDATASIZE) -assignment_DATA_SET_BIGWIGGLE_PRIMARYDATASIZE.setMandatory(False) -assignment_DATA_SET_BIGWIGGLE_PRIMARYDATASIZE.setSection(None) -assignment_DATA_SET_BIGWIGGLE_PRIMARYDATASIZE.setPositionInForms(7) - -assignment_DATA_SET_BIGWIGGLE_PRIMARYINDEXSIZE = tr.assignPropertyType(data_set_type_BIGWIGGLE, prop_type_PRIMARYINDEXSIZE) -assignment_DATA_SET_BIGWIGGLE_PRIMARYINDEXSIZE.setMandatory(False) -assignment_DATA_SET_BIGWIGGLE_PRIMARYINDEXSIZE.setSection(None) -assignment_DATA_SET_BIGWIGGLE_PRIMARYINDEXSIZE.setPositionInForms(8) - -assignment_DATA_SET_BIGWIGGLE_ZOOMLEVELS = tr.assignPropertyType(data_set_type_BIGWIGGLE, prop_type_ZOOMLEVELS) -assignment_DATA_SET_BIGWIGGLE_ZOOMLEVELS.setMandatory(False) -assignment_DATA_SET_BIGWIGGLE_ZOOMLEVELS.setSection(None) -assignment_DATA_SET_BIGWIGGLE_ZOOMLEVELS.setPositionInForms(9) - -assignment_DATA_SET_BIGWIGGLE_CHROMCOUNT = tr.assignPropertyType(data_set_type_BIGWIGGLE, prop_type_CHROMCOUNT) -assignment_DATA_SET_BIGWIGGLE_CHROMCOUNT.setMandatory(False) -assignment_DATA_SET_BIGWIGGLE_CHROMCOUNT.setSection(None) -assignment_DATA_SET_BIGWIGGLE_CHROMCOUNT.setPositionInForms(10) - -assignment_DATA_SET_BIGWIGGLE_BASESCOVERED = tr.assignPropertyType(data_set_type_BIGWIGGLE, prop_type_BASESCOVERED) -assignment_DATA_SET_BIGWIGGLE_BASESCOVERED.setMandatory(False) -assignment_DATA_SET_BIGWIGGLE_BASESCOVERED.setSection(None) -assignment_DATA_SET_BIGWIGGLE_BASESCOVERED.setPositionInForms(11) - -assignment_DATA_SET_BIGWIGGLE_MEAN = tr.assignPropertyType(data_set_type_BIGWIGGLE, prop_type_MEAN) -assignment_DATA_SET_BIGWIGGLE_MEAN.setMandatory(False) -assignment_DATA_SET_BIGWIGGLE_MEAN.setSection(None) -assignment_DATA_SET_BIGWIGGLE_MEAN.setPositionInForms(12) - -assignment_DATA_SET_BIGWIGGLE_MIN = tr.assignPropertyType(data_set_type_BIGWIGGLE, prop_type_MIN) -assignment_DATA_SET_BIGWIGGLE_MIN.setMandatory(False) -assignment_DATA_SET_BIGWIGGLE_MIN.setSection(None) -assignment_DATA_SET_BIGWIGGLE_MIN.setPositionInForms(13) - -assignment_DATA_SET_BIGWIGGLE_MAX = tr.assignPropertyType(data_set_type_BIGWIGGLE, prop_type_MAX) -assignment_DATA_SET_BIGWIGGLE_MAX.setMandatory(False) -assignment_DATA_SET_BIGWIGGLE_MAX.setSection(None) -assignment_DATA_SET_BIGWIGGLE_MAX.setPositionInForms(14) - -assignment_DATA_SET_BIGWIGGLE_STD = tr.assignPropertyType(data_set_type_BIGWIGGLE, prop_type_STD) -assignment_DATA_SET_BIGWIGGLE_STD.setMandatory(False) -assignment_DATA_SET_BIGWIGGLE_STD.setSection(None) -assignment_DATA_SET_BIGWIGGLE_STD.setPositionInForms(15) - -assignment_DATA_SET_FASTQ_GZ_NOTES = tr.assignPropertyType(data_set_type_FASTQ_GZ, prop_type_NOTES) -assignment_DATA_SET_FASTQ_GZ_NOTES.setMandatory(False) -assignment_DATA_SET_FASTQ_GZ_NOTES.setSection(None) -assignment_DATA_SET_FASTQ_GZ_NOTES.setPositionInForms(3) - -assignment_DATA_SET_FASTQ_GZ_YIELD_MBASES = tr.assignPropertyType(data_set_type_FASTQ_GZ, prop_type_YIELD_MBASES) -assignment_DATA_SET_FASTQ_GZ_YIELD_MBASES.setMandatory(False) -assignment_DATA_SET_FASTQ_GZ_YIELD_MBASES.setSection(None) -assignment_DATA_SET_FASTQ_GZ_YIELD_MBASES.setPositionInForms(4) - -assignment_DATA_SET_FASTQ_GZ_PERCENTAGE_PASSED_FILTERING = tr.assignPropertyType(data_set_type_FASTQ_GZ, prop_type_PERCENTAGE_PASSED_FILTERING) -assignment_DATA_SET_FASTQ_GZ_PERCENTAGE_PASSED_FILTERING.setMandatory(False) -assignment_DATA_SET_FASTQ_GZ_PERCENTAGE_PASSED_FILTERING.setSection(None) -assignment_DATA_SET_FASTQ_GZ_PERCENTAGE_PASSED_FILTERING.setPositionInForms(5) - -assignment_DATA_SET_FASTQ_GZ_INDEX1 = tr.assignPropertyType(data_set_type_FASTQ_GZ, prop_type_INDEX1) -assignment_DATA_SET_FASTQ_GZ_INDEX1.setMandatory(False) -assignment_DATA_SET_FASTQ_GZ_INDEX1.setSection(None) -assignment_DATA_SET_FASTQ_GZ_INDEX1.setPositionInForms(6) - -assignment_DATA_SET_FASTQ_GZ_INDEX2 = tr.assignPropertyType(data_set_type_FASTQ_GZ, prop_type_INDEX2) -assignment_DATA_SET_FASTQ_GZ_INDEX2.setMandatory(False) -assignment_DATA_SET_FASTQ_GZ_INDEX2.setSection(None) -assignment_DATA_SET_FASTQ_GZ_INDEX2.setPositionInForms(7) - -assignment_DATA_SET_FASTQ_GZ_PERCENTAGE_RAW_CLUSTERS_PER_LANE = tr.assignPropertyType(data_set_type_FASTQ_GZ, prop_type_PERCENTAGE_RAW_CLUSTERS_PER_LANE) -assignment_DATA_SET_FASTQ_GZ_PERCENTAGE_RAW_CLUSTERS_PER_LANE.setMandatory(False) -assignment_DATA_SET_FASTQ_GZ_PERCENTAGE_RAW_CLUSTERS_PER_LANE.setSection(None) -assignment_DATA_SET_FASTQ_GZ_PERCENTAGE_RAW_CLUSTERS_PER_LANE.setPositionInForms(8) - -assignment_DATA_SET_FASTQ_GZ_PERCENTAGE_PERFECT_INDEX_READS = tr.assignPropertyType(data_set_type_FASTQ_GZ, prop_type_PERCENTAGE_PERFECT_INDEX_READS) -assignment_DATA_SET_FASTQ_GZ_PERCENTAGE_PERFECT_INDEX_READS.setMandatory(False) -assignment_DATA_SET_FASTQ_GZ_PERCENTAGE_PERFECT_INDEX_READS.setSection(None) -assignment_DATA_SET_FASTQ_GZ_PERCENTAGE_PERFECT_INDEX_READS.setPositionInForms(9) - -assignment_DATA_SET_FASTQ_GZ_PERCENTAGE_ONE_MISMATCH_READS_INDEX = tr.assignPropertyType(data_set_type_FASTQ_GZ, prop_type_PERCENTAGE_ONE_MISMATCH_READS_INDEX) -assignment_DATA_SET_FASTQ_GZ_PERCENTAGE_ONE_MISMATCH_READS_INDEX.setMandatory(False) -assignment_DATA_SET_FASTQ_GZ_PERCENTAGE_ONE_MISMATCH_READS_INDEX.setSection(None) -assignment_DATA_SET_FASTQ_GZ_PERCENTAGE_ONE_MISMATCH_READS_INDEX.setPositionInForms(10) - -assignment_EXPERIMENT_HT_SEQUENCING_EXPERIMENT_DESIGN = tr.assignPropertyType(exp_type_HT_SEQUENCING, prop_type_EXPERIMENT_DESIGN) -assignment_EXPERIMENT_HT_SEQUENCING_EXPERIMENT_DESIGN.setMandatory(False) -assignment_EXPERIMENT_HT_SEQUENCING_EXPERIMENT_DESIGN.setSection(None) -assignment_EXPERIMENT_HT_SEQUENCING_EXPERIMENT_DESIGN.setPositionInForms(3) - -assignment_SAMPLE_ILLUMINA_FLOW_CELL_RUN_FOLDER_NAME = tr.assignPropertyType(samp_type_ILLUMINA_FLOW_CELL, prop_type_RUN_FOLDER_NAME) -assignment_SAMPLE_ILLUMINA_FLOW_CELL_RUN_FOLDER_NAME.setMandatory(False) -assignment_SAMPLE_ILLUMINA_FLOW_CELL_RUN_FOLDER_NAME.setSection(None) -assignment_SAMPLE_ILLUMINA_FLOW_CELL_RUN_FOLDER_NAME.setPositionInForms(1) - -assignment_SAMPLE_ILLUMINA_FLOW_CELL_SEQUENCER = tr.assignPropertyType(samp_type_ILLUMINA_FLOW_CELL, prop_type_SEQUENCER) -assignment_SAMPLE_ILLUMINA_FLOW_CELL_SEQUENCER.setMandatory(False) -assignment_SAMPLE_ILLUMINA_FLOW_CELL_SEQUENCER.setSection(None) -assignment_SAMPLE_ILLUMINA_FLOW_CELL_SEQUENCER.setPositionInForms(5) - -assignment_SAMPLE_ILLUMINA_FLOW_CELL_END_TYPE = tr.assignPropertyType(samp_type_ILLUMINA_FLOW_CELL, prop_type_END_TYPE) -assignment_SAMPLE_ILLUMINA_FLOW_CELL_END_TYPE.setMandatory(False) -assignment_SAMPLE_ILLUMINA_FLOW_CELL_END_TYPE.setSection(None) -assignment_SAMPLE_ILLUMINA_FLOW_CELL_END_TYPE.setPositionInForms(7) - -assignment_SAMPLE_ILLUMINA_FLOW_CELL_FLOW_CELL_SEQUENCED_ON = tr.assignPropertyType(samp_type_ILLUMINA_FLOW_CELL, prop_type_FLOW_CELL_SEQUENCED_ON) -assignment_SAMPLE_ILLUMINA_FLOW_CELL_FLOW_CELL_SEQUENCED_ON.setMandatory(False) -assignment_SAMPLE_ILLUMINA_FLOW_CELL_FLOW_CELL_SEQUENCED_ON.setSection(None) -assignment_SAMPLE_ILLUMINA_FLOW_CELL_FLOW_CELL_SEQUENCED_ON.setPositionInForms(8) - -assignment_SAMPLE_ILLUMINA_FLOW_CELL_SEQUENCER_FINISHED = tr.assignPropertyType(samp_type_ILLUMINA_FLOW_CELL, prop_type_SEQUENCER_FINISHED) -assignment_SAMPLE_ILLUMINA_FLOW_CELL_SEQUENCER_FINISHED.setMandatory(False) -assignment_SAMPLE_ILLUMINA_FLOW_CELL_SEQUENCER_FINISHED.setSection(None) -assignment_SAMPLE_ILLUMINA_FLOW_CELL_SEQUENCER_FINISHED.setPositionInForms(9) - -assignment_SAMPLE_ILLUMINA_FLOW_CELL_RUNNINGTIME = tr.assignPropertyType(samp_type_ILLUMINA_FLOW_CELL, prop_type_RUNNINGTIME) -assignment_SAMPLE_ILLUMINA_FLOW_CELL_RUNNINGTIME.setMandatory(False) -assignment_SAMPLE_ILLUMINA_FLOW_CELL_RUNNINGTIME.setSection(None) -assignment_SAMPLE_ILLUMINA_FLOW_CELL_RUNNINGTIME.setPositionInForms(10) -assignment_SAMPLE_ILLUMINA_FLOW_CELL_RUNNINGTIME.setScriptName('Diff_time') -assignment_SAMPLE_ILLUMINA_FLOW_CELL_RUNNINGTIME.setDynamic(True) -assignment_SAMPLE_ILLUMINA_FLOW_CELL_RUNNINGTIME.setManaged(False) -assignment_SAMPLE_ILLUMINA_FLOW_CELL_RUNNINGTIME.setShownEdit(False) - -assignment_SAMPLE_ILLUMINA_FLOW_CELL_ILLUMINA_PIPELINE_VERSION = tr.assignPropertyType(samp_type_ILLUMINA_FLOW_CELL, prop_type_ILLUMINA_PIPELINE_VERSION) -assignment_SAMPLE_ILLUMINA_FLOW_CELL_ILLUMINA_PIPELINE_VERSION.setMandatory(False) -assignment_SAMPLE_ILLUMINA_FLOW_CELL_ILLUMINA_PIPELINE_VERSION.setSection(None) -assignment_SAMPLE_ILLUMINA_FLOW_CELL_ILLUMINA_PIPELINE_VERSION.setPositionInForms(11) - -assignment_SAMPLE_ILLUMINA_FLOW_CELL_CYCLES = tr.assignPropertyType(samp_type_ILLUMINA_FLOW_CELL, prop_type_CYCLES) -assignment_SAMPLE_ILLUMINA_FLOW_CELL_CYCLES.setMandatory(False) -assignment_SAMPLE_ILLUMINA_FLOW_CELL_CYCLES.setSection(None) -assignment_SAMPLE_ILLUMINA_FLOW_CELL_CYCLES.setPositionInForms(14) - -assignment_SAMPLE_ILLUMINA_FLOW_CELL_INDEXREAD = tr.assignPropertyType(samp_type_ILLUMINA_FLOW_CELL, prop_type_INDEXREAD) -assignment_SAMPLE_ILLUMINA_FLOW_CELL_INDEXREAD.setMandatory(False) -assignment_SAMPLE_ILLUMINA_FLOW_CELL_INDEXREAD.setSection(None) -assignment_SAMPLE_ILLUMINA_FLOW_CELL_INDEXREAD.setPositionInForms(17) - -assignment_SAMPLE_ILLUMINA_FLOW_CELL_INDEXREAD2 = tr.assignPropertyType(samp_type_ILLUMINA_FLOW_CELL, prop_type_INDEXREAD2) -assignment_SAMPLE_ILLUMINA_FLOW_CELL_INDEXREAD2.setMandatory(False) -assignment_SAMPLE_ILLUMINA_FLOW_CELL_INDEXREAD2.setSection(None) -assignment_SAMPLE_ILLUMINA_FLOW_CELL_INDEXREAD2.setPositionInForms(18) - -assignment_SAMPLE_ILLUMINA_FLOW_CELL_CONTROL_LANE = tr.assignPropertyType(samp_type_ILLUMINA_FLOW_CELL, prop_type_CONTROL_LANE) -assignment_SAMPLE_ILLUMINA_FLOW_CELL_CONTROL_LANE.setMandatory(False) -assignment_SAMPLE_ILLUMINA_FLOW_CELL_CONTROL_LANE.setSection(None) -assignment_SAMPLE_ILLUMINA_FLOW_CELL_CONTROL_LANE.setPositionInForms(19) - -assignment_SAMPLE_ILLUMINA_FLOW_CELL_FLOWCELLTYPE = tr.assignPropertyType(samp_type_ILLUMINA_FLOW_CELL, prop_type_FLOWCELLTYPE) -assignment_SAMPLE_ILLUMINA_FLOW_CELL_FLOWCELLTYPE.setMandatory(False) -assignment_SAMPLE_ILLUMINA_FLOW_CELL_FLOWCELLTYPE.setSection(None) -assignment_SAMPLE_ILLUMINA_FLOW_CELL_FLOWCELLTYPE.setPositionInForms(20) - -assignment_SAMPLE_ILLUMINA_FLOW_CELL_LANECOUNT = tr.assignPropertyType(samp_type_ILLUMINA_FLOW_CELL, prop_type_LANECOUNT) -assignment_SAMPLE_ILLUMINA_FLOW_CELL_LANECOUNT.setMandatory(False) -assignment_SAMPLE_ILLUMINA_FLOW_CELL_LANECOUNT.setSection(None) -assignment_SAMPLE_ILLUMINA_FLOW_CELL_LANECOUNT.setPositionInForms(21) - -assignment_SAMPLE_ILLUMINA_FLOW_CELL_SURFACECOUNT = tr.assignPropertyType(samp_type_ILLUMINA_FLOW_CELL, prop_type_SURFACECOUNT) -assignment_SAMPLE_ILLUMINA_FLOW_CELL_SURFACECOUNT.setMandatory(False) -assignment_SAMPLE_ILLUMINA_FLOW_CELL_SURFACECOUNT.setSection(None) -assignment_SAMPLE_ILLUMINA_FLOW_CELL_SURFACECOUNT.setPositionInForms(22) - -assignment_SAMPLE_ILLUMINA_FLOW_CELL_SWATHCOUNT = tr.assignPropertyType(samp_type_ILLUMINA_FLOW_CELL, prop_type_SWATHCOUNT) -assignment_SAMPLE_ILLUMINA_FLOW_CELL_SWATHCOUNT.setMandatory(False) -assignment_SAMPLE_ILLUMINA_FLOW_CELL_SWATHCOUNT.setSection(None) -assignment_SAMPLE_ILLUMINA_FLOW_CELL_SWATHCOUNT.setPositionInForms(23) - -assignment_SAMPLE_ILLUMINA_FLOW_CELL_TILECOUNT = tr.assignPropertyType(samp_type_ILLUMINA_FLOW_CELL, prop_type_TILECOUNT) -assignment_SAMPLE_ILLUMINA_FLOW_CELL_TILECOUNT.setMandatory(False) -assignment_SAMPLE_ILLUMINA_FLOW_CELL_TILECOUNT.setSection(None) -assignment_SAMPLE_ILLUMINA_FLOW_CELL_TILECOUNT.setPositionInForms(24) - -assignment_SAMPLE_ILLUMINA_FLOW_CELL_SBS_KIT = tr.assignPropertyType(samp_type_ILLUMINA_FLOW_CELL, prop_type_SBS_KIT) -assignment_SAMPLE_ILLUMINA_FLOW_CELL_SBS_KIT.setMandatory(False) -assignment_SAMPLE_ILLUMINA_FLOW_CELL_SBS_KIT.setSection(None) -assignment_SAMPLE_ILLUMINA_FLOW_CELL_SBS_KIT.setPositionInForms(25) - -assignment_SAMPLE_ILLUMINA_FLOW_CELL_PAIRED_END_KIT = tr.assignPropertyType(samp_type_ILLUMINA_FLOW_CELL, prop_type_PAIRED_END_KIT) -assignment_SAMPLE_ILLUMINA_FLOW_CELL_PAIRED_END_KIT.setMandatory(False) -assignment_SAMPLE_ILLUMINA_FLOW_CELL_PAIRED_END_KIT.setSection(None) -assignment_SAMPLE_ILLUMINA_FLOW_CELL_PAIRED_END_KIT.setPositionInForms(26) - -assignment_SAMPLE_ILLUMINA_FLOW_CELL_CLUSTER_STATION = tr.assignPropertyType(samp_type_ILLUMINA_FLOW_CELL, prop_type_CLUSTER_STATION) -assignment_SAMPLE_ILLUMINA_FLOW_CELL_CLUSTER_STATION.setMandatory(False) -assignment_SAMPLE_ILLUMINA_FLOW_CELL_CLUSTER_STATION.setSection('Clustering') -assignment_SAMPLE_ILLUMINA_FLOW_CELL_CLUSTER_STATION.setPositionInForms(27) - -assignment_SAMPLE_ILLUMINA_FLOW_CELL_CREATED_ON_CS = tr.assignPropertyType(samp_type_ILLUMINA_FLOW_CELL, prop_type_CREATED_ON_CS) -assignment_SAMPLE_ILLUMINA_FLOW_CELL_CREATED_ON_CS.setMandatory(False) -assignment_SAMPLE_ILLUMINA_FLOW_CELL_CREATED_ON_CS.setSection('Clustering') -assignment_SAMPLE_ILLUMINA_FLOW_CELL_CREATED_ON_CS.setPositionInForms(28) - -assignment_SAMPLE_ILLUMINA_FLOW_CELL_CS_PROTOCOL_VERSION = tr.assignPropertyType(samp_type_ILLUMINA_FLOW_CELL, prop_type_CS_PROTOCOL_VERSION) -assignment_SAMPLE_ILLUMINA_FLOW_CELL_CS_PROTOCOL_VERSION.setMandatory(False) -assignment_SAMPLE_ILLUMINA_FLOW_CELL_CS_PROTOCOL_VERSION.setSection('Clustering') -assignment_SAMPLE_ILLUMINA_FLOW_CELL_CS_PROTOCOL_VERSION.setPositionInForms(29) - -assignment_SAMPLE_ILLUMINA_FLOW_CELL_CLUSTER_GENERATION_KIT_VERSION = tr.assignPropertyType(samp_type_ILLUMINA_FLOW_CELL, prop_type_CLUSTER_GENERATION_KIT_VERSION) -assignment_SAMPLE_ILLUMINA_FLOW_CELL_CLUSTER_GENERATION_KIT_VERSION.setMandatory(False) -assignment_SAMPLE_ILLUMINA_FLOW_CELL_CLUSTER_GENERATION_KIT_VERSION.setSection('Clustering') -assignment_SAMPLE_ILLUMINA_FLOW_CELL_CLUSTER_GENERATION_KIT_VERSION.setPositionInForms(30) - -assignment_SAMPLE_ILLUMINA_FLOW_CELL_SBS_SEQUENCING_KIT_VERSION = tr.assignPropertyType(samp_type_ILLUMINA_FLOW_CELL, prop_type_SBS_SEQUENCING_KIT_VERSION) -assignment_SAMPLE_ILLUMINA_FLOW_CELL_SBS_SEQUENCING_KIT_VERSION.setMandatory(False) -assignment_SAMPLE_ILLUMINA_FLOW_CELL_SBS_SEQUENCING_KIT_VERSION.setSection(None) -assignment_SAMPLE_ILLUMINA_FLOW_CELL_SBS_SEQUENCING_KIT_VERSION.setPositionInForms(32) - -assignment_SAMPLE_ILLUMINA_FLOW_CELL_ANALYSIS_FINISHED = tr.assignPropertyType(samp_type_ILLUMINA_FLOW_CELL, prop_type_ANALYSIS_FINISHED) -assignment_SAMPLE_ILLUMINA_FLOW_CELL_ANALYSIS_FINISHED.setMandatory(False) -assignment_SAMPLE_ILLUMINA_FLOW_CELL_ANALYSIS_FINISHED.setSection(None) -assignment_SAMPLE_ILLUMINA_FLOW_CELL_ANALYSIS_FINISHED.setPositionInForms(34) - -assignment_SAMPLE_ILLUMINA_FLOW_CELL_NOTES = tr.assignPropertyType(samp_type_ILLUMINA_FLOW_CELL, prop_type_NOTES) -assignment_SAMPLE_ILLUMINA_FLOW_CELL_NOTES.setMandatory(False) -assignment_SAMPLE_ILLUMINA_FLOW_CELL_NOTES.setSection(None) -assignment_SAMPLE_ILLUMINA_FLOW_CELL_NOTES.setPositionInForms(35) - -assignment_SAMPLE_ILLUMINA_FLOW_LANE_CONCENTRATION_FLOWLANE = tr.assignPropertyType(samp_type_ILLUMINA_FLOW_LANE, prop_type_CONCENTRATION_FLOWLANE) -assignment_SAMPLE_ILLUMINA_FLOW_LANE_CONCENTRATION_FLOWLANE.setMandatory(False) -assignment_SAMPLE_ILLUMINA_FLOW_LANE_CONCENTRATION_FLOWLANE.setSection(None) -assignment_SAMPLE_ILLUMINA_FLOW_LANE_CONCENTRATION_FLOWLANE.setPositionInForms(20) - -assignment_SAMPLE_ILLUMINA_FLOW_LANE_NOTES = tr.assignPropertyType(samp_type_ILLUMINA_FLOW_LANE, prop_type_NOTES) -assignment_SAMPLE_ILLUMINA_FLOW_LANE_NOTES.setMandatory(False) -assignment_SAMPLE_ILLUMINA_FLOW_LANE_NOTES.setSection(None) -assignment_SAMPLE_ILLUMINA_FLOW_LANE_NOTES.setPositionInForms(23) - -assignment_DATA_SET_ILLUMINA_HISEQ_OUTPUT_CASAVA_VERSION = tr.assignPropertyType(data_set_type_ILLUMINA_HISEQ_OUTPUT, prop_type_CASAVA_VERSION) -assignment_DATA_SET_ILLUMINA_HISEQ_OUTPUT_CASAVA_VERSION.setMandatory(False) -assignment_DATA_SET_ILLUMINA_HISEQ_OUTPUT_CASAVA_VERSION.setSection(None) -assignment_DATA_SET_ILLUMINA_HISEQ_OUTPUT_CASAVA_VERSION.setPositionInForms(3) - -assignment_SAMPLE_LIBRARY_EXTERNAL_SAMPLE_NAME = tr.assignPropertyType(samp_type_LIBRARY, prop_type_EXTERNAL_SAMPLE_NAME) -assignment_SAMPLE_LIBRARY_EXTERNAL_SAMPLE_NAME.setMandatory(False) -assignment_SAMPLE_LIBRARY_EXTERNAL_SAMPLE_NAME.setSection(None) -assignment_SAMPLE_LIBRARY_EXTERNAL_SAMPLE_NAME.setPositionInForms(1) - -assignment_SAMPLE_LIBRARY_KIT = tr.assignPropertyType(samp_type_LIBRARY, prop_type_KIT) -assignment_SAMPLE_LIBRARY_KIT.setMandatory(False) -assignment_SAMPLE_LIBRARY_KIT.setSection(None) -assignment_SAMPLE_LIBRARY_KIT.setPositionInForms(2) - -assignment_SAMPLE_LIBRARY_PREPARED_BY = tr.assignPropertyType(samp_type_LIBRARY, prop_type_PREPARED_BY) -assignment_SAMPLE_LIBRARY_PREPARED_BY.setMandatory(False) -assignment_SAMPLE_LIBRARY_PREPARED_BY.setSection(None) -assignment_SAMPLE_LIBRARY_PREPARED_BY.setPositionInForms(3) - -assignment_SAMPLE_LIBRARY_STARTING_AMOUNT_OF_SAMPLE_IN_NG = tr.assignPropertyType(samp_type_LIBRARY, prop_type_STARTING_AMOUNT_OF_SAMPLE_IN_NG) -assignment_SAMPLE_LIBRARY_STARTING_AMOUNT_OF_SAMPLE_IN_NG.setMandatory(False) -assignment_SAMPLE_LIBRARY_STARTING_AMOUNT_OF_SAMPLE_IN_NG.setSection(None) -assignment_SAMPLE_LIBRARY_STARTING_AMOUNT_OF_SAMPLE_IN_NG.setPositionInForms(4) - -assignment_SAMPLE_LIBRARY_INDEX1 = tr.assignPropertyType(samp_type_LIBRARY, prop_type_INDEX1) -assignment_SAMPLE_LIBRARY_INDEX1.setMandatory(False) -assignment_SAMPLE_LIBRARY_INDEX1.setSection(None) -assignment_SAMPLE_LIBRARY_INDEX1.setPositionInForms(7) - -assignment_SAMPLE_LIBRARY_INDEX2 = tr.assignPropertyType(samp_type_LIBRARY, prop_type_INDEX2) -assignment_SAMPLE_LIBRARY_INDEX2.setMandatory(False) -assignment_SAMPLE_LIBRARY_INDEX2.setSection(None) -assignment_SAMPLE_LIBRARY_INDEX2.setPositionInForms(8) - -assignment_SAMPLE_LIBRARY_LOT = tr.assignPropertyType(samp_type_LIBRARY, prop_type_LOT) -assignment_SAMPLE_LIBRARY_LOT.setMandatory(False) -assignment_SAMPLE_LIBRARY_LOT.setSection(None) -assignment_SAMPLE_LIBRARY_LOT.setPositionInForms(9) - -assignment_SAMPLE_LIBRARY_AGILENT_KIT = tr.assignPropertyType(samp_type_LIBRARY, prop_type_AGILENT_KIT) -assignment_SAMPLE_LIBRARY_AGILENT_KIT.setMandatory(False) -assignment_SAMPLE_LIBRARY_AGILENT_KIT.setSection('QC Data') -assignment_SAMPLE_LIBRARY_AGILENT_KIT.setPositionInForms(10) - -assignment_SAMPLE_LIBRARY_FRAGMENT_SIZE_PREPARED_ILLUMINA = tr.assignPropertyType(samp_type_LIBRARY, prop_type_FRAGMENT_SIZE_PREPARED_ILLUMINA) -assignment_SAMPLE_LIBRARY_FRAGMENT_SIZE_PREPARED_ILLUMINA.setMandatory(False) -assignment_SAMPLE_LIBRARY_FRAGMENT_SIZE_PREPARED_ILLUMINA.setSection('QC Data') -assignment_SAMPLE_LIBRARY_FRAGMENT_SIZE_PREPARED_ILLUMINA.setPositionInForms(11) - -assignment_SAMPLE_LIBRARY_NANO_DROP = tr.assignPropertyType(samp_type_LIBRARY, prop_type_NANO_DROP) -assignment_SAMPLE_LIBRARY_NANO_DROP.setMandatory(False) -assignment_SAMPLE_LIBRARY_NANO_DROP.setSection('QC Data') -assignment_SAMPLE_LIBRARY_NANO_DROP.setPositionInForms(12) - -assignment_SAMPLE_LIBRARY_CONCENTRATION_PREPARED_ILLUMINA = tr.assignPropertyType(samp_type_LIBRARY, prop_type_CONCENTRATION_PREPARED_ILLUMINA) -assignment_SAMPLE_LIBRARY_CONCENTRATION_PREPARED_ILLUMINA.setMandatory(False) -assignment_SAMPLE_LIBRARY_CONCENTRATION_PREPARED_ILLUMINA.setSection('QC Data') -assignment_SAMPLE_LIBRARY_CONCENTRATION_PREPARED_ILLUMINA.setPositionInForms(13) - -assignment_SAMPLE_LIBRARY_DNA_CONCENTRATION_OF_LIBRARY = tr.assignPropertyType(samp_type_LIBRARY, prop_type_DNA_CONCENTRATION_OF_LIBRARY) -assignment_SAMPLE_LIBRARY_DNA_CONCENTRATION_OF_LIBRARY.setMandatory(False) -assignment_SAMPLE_LIBRARY_DNA_CONCENTRATION_OF_LIBRARY.setSection('QC Data') -assignment_SAMPLE_LIBRARY_DNA_CONCENTRATION_OF_LIBRARY.setPositionInForms(14) - -assignment_SAMPLE_LIBRARY_LIBRARY_PROCESSING_SUCCESSFUL = tr.assignPropertyType(samp_type_LIBRARY, prop_type_LIBRARY_PROCESSING_SUCCESSFUL) -assignment_SAMPLE_LIBRARY_LIBRARY_PROCESSING_SUCCESSFUL.setMandatory(False) -assignment_SAMPLE_LIBRARY_LIBRARY_PROCESSING_SUCCESSFUL.setSection('QC Data') -assignment_SAMPLE_LIBRARY_LIBRARY_PROCESSING_SUCCESSFUL.setPositionInForms(15) - -assignment_SAMPLE_LIBRARY_LIBRARY_PROCESSING_FAILED = tr.assignPropertyType(samp_type_LIBRARY, prop_type_LIBRARY_PROCESSING_FAILED) -assignment_SAMPLE_LIBRARY_LIBRARY_PROCESSING_FAILED.setMandatory(False) -assignment_SAMPLE_LIBRARY_LIBRARY_PROCESSING_FAILED.setSection('QC Data') -assignment_SAMPLE_LIBRARY_LIBRARY_PROCESSING_FAILED.setPositionInForms(16) - -assignment_SAMPLE_LIBRARY_QC_AT_DBSSE = tr.assignPropertyType(samp_type_LIBRARY, prop_type_QC_AT_DBSSE) -assignment_SAMPLE_LIBRARY_QC_AT_DBSSE.setMandatory(False) -assignment_SAMPLE_LIBRARY_QC_AT_DBSSE.setSection('QC Data') -assignment_SAMPLE_LIBRARY_QC_AT_DBSSE.setPositionInForms(17) - -assignment_SAMPLE_LIBRARY_KIT_PREPARED = tr.assignPropertyType(samp_type_LIBRARY, prop_type_KIT_PREPARED) -assignment_SAMPLE_LIBRARY_KIT_PREPARED.setMandatory(False) -assignment_SAMPLE_LIBRARY_KIT_PREPARED.setSection(None) -assignment_SAMPLE_LIBRARY_KIT_PREPARED.setPositionInForms(18) - -assignment_SAMPLE_LIBRARY_DATA_TRANSFERRED = tr.assignPropertyType(samp_type_LIBRARY, prop_type_DATA_TRANSFERRED) -assignment_SAMPLE_LIBRARY_DATA_TRANSFERRED.setMandatory(False) -assignment_SAMPLE_LIBRARY_DATA_TRANSFERRED.setSection(None) -assignment_SAMPLE_LIBRARY_DATA_TRANSFERRED.setPositionInForms(19) - -assignment_SAMPLE_LIBRARY_INVOICE = tr.assignPropertyType(samp_type_LIBRARY, prop_type_INVOICE) -assignment_SAMPLE_LIBRARY_INVOICE.setMandatory(False) -assignment_SAMPLE_LIBRARY_INVOICE.setSection(None) -assignment_SAMPLE_LIBRARY_INVOICE.setPositionInForms(20) - -assignment_SAMPLE_LIBRARY_NOTES = tr.assignPropertyType(samp_type_LIBRARY, prop_type_NOTES) -assignment_SAMPLE_LIBRARY_NOTES.setMandatory(False) -assignment_SAMPLE_LIBRARY_NOTES.setSection(None) -assignment_SAMPLE_LIBRARY_NOTES.setPositionInForms(33) - -assignment_SAMPLE_LIBRARY_POOL_EXTERNAL_SAMPLE_NAME = tr.assignPropertyType(samp_type_LIBRARY_POOL, prop_type_EXTERNAL_SAMPLE_NAME) -assignment_SAMPLE_LIBRARY_POOL_EXTERNAL_SAMPLE_NAME.setMandatory(False) -assignment_SAMPLE_LIBRARY_POOL_EXTERNAL_SAMPLE_NAME.setSection(None) -assignment_SAMPLE_LIBRARY_POOL_EXTERNAL_SAMPLE_NAME.setPositionInForms(1) - -assignment_SAMPLE_LIBRARY_POOL_PREPARED_BY = tr.assignPropertyType(samp_type_LIBRARY_POOL, prop_type_PREPARED_BY) -assignment_SAMPLE_LIBRARY_POOL_PREPARED_BY.setMandatory(False) -assignment_SAMPLE_LIBRARY_POOL_PREPARED_BY.setSection(None) -assignment_SAMPLE_LIBRARY_POOL_PREPARED_BY.setPositionInForms(2) - -assignment_SAMPLE_LIBRARY_POOL_DNA_CONCENTRATION_POOL = tr.assignPropertyType(samp_type_LIBRARY_POOL, prop_type_DNA_CONCENTRATION_POOL) -assignment_SAMPLE_LIBRARY_POOL_DNA_CONCENTRATION_POOL.setMandatory(False) -assignment_SAMPLE_LIBRARY_POOL_DNA_CONCENTRATION_POOL.setSection(None) -assignment_SAMPLE_LIBRARY_POOL_DNA_CONCENTRATION_POOL.setPositionInForms(3) - -assignment_SAMPLE_LIBRARY_POOL_QC_REQUIRED = tr.assignPropertyType(samp_type_LIBRARY_POOL, prop_type_QC_REQUIRED) -assignment_SAMPLE_LIBRARY_POOL_QC_REQUIRED.setMandatory(False) -assignment_SAMPLE_LIBRARY_POOL_QC_REQUIRED.setSection(None) -assignment_SAMPLE_LIBRARY_POOL_QC_REQUIRED.setPositionInForms(4) - -assignment_SAMPLE_LIBRARY_POOL_AGILENT_KIT = tr.assignPropertyType(samp_type_LIBRARY_POOL, prop_type_AGILENT_KIT) -assignment_SAMPLE_LIBRARY_POOL_AGILENT_KIT.setMandatory(False) -assignment_SAMPLE_LIBRARY_POOL_AGILENT_KIT.setSection('QC Data') -assignment_SAMPLE_LIBRARY_POOL_AGILENT_KIT.setPositionInForms(5) - -assignment_SAMPLE_LIBRARY_POOL_FRAGMENT_SIZE_BASE_PAIRS = tr.assignPropertyType(samp_type_LIBRARY_POOL, prop_type_FRAGMENT_SIZE_BASE_PAIRS) -assignment_SAMPLE_LIBRARY_POOL_FRAGMENT_SIZE_BASE_PAIRS.setMandatory(False) -assignment_SAMPLE_LIBRARY_POOL_FRAGMENT_SIZE_BASE_PAIRS.setSection('QC Data') -assignment_SAMPLE_LIBRARY_POOL_FRAGMENT_SIZE_BASE_PAIRS.setPositionInForms(6) - -assignment_SAMPLE_LIBRARY_POOL_NANO_DROP = tr.assignPropertyType(samp_type_LIBRARY_POOL, prop_type_NANO_DROP) -assignment_SAMPLE_LIBRARY_POOL_NANO_DROP.setMandatory(False) -assignment_SAMPLE_LIBRARY_POOL_NANO_DROP.setSection('QC Data') -assignment_SAMPLE_LIBRARY_POOL_NANO_DROP.setPositionInForms(7) - -assignment_SAMPLE_LIBRARY_POOL_CONCENTRATION = tr.assignPropertyType(samp_type_LIBRARY_POOL, prop_type_CONCENTRATION) -assignment_SAMPLE_LIBRARY_POOL_CONCENTRATION.setMandatory(False) -assignment_SAMPLE_LIBRARY_POOL_CONCENTRATION.setSection('QC Data') -assignment_SAMPLE_LIBRARY_POOL_CONCENTRATION.setPositionInForms(8) - -assignment_SAMPLE_LIBRARY_POOL_DNA_CONCENTRATION_QGF = tr.assignPropertyType(samp_type_LIBRARY_POOL, prop_type_DNA_CONCENTRATION_QGF) -assignment_SAMPLE_LIBRARY_POOL_DNA_CONCENTRATION_QGF.setMandatory(False) -assignment_SAMPLE_LIBRARY_POOL_DNA_CONCENTRATION_QGF.setSection('QC Data') -assignment_SAMPLE_LIBRARY_POOL_DNA_CONCENTRATION_QGF.setPositionInForms(9) - -assignment_SAMPLE_LIBRARY_POOL_INVOICE = tr.assignPropertyType(samp_type_LIBRARY_POOL, prop_type_INVOICE) -assignment_SAMPLE_LIBRARY_POOL_INVOICE.setMandatory(False) -assignment_SAMPLE_LIBRARY_POOL_INVOICE.setSection(None) -assignment_SAMPLE_LIBRARY_POOL_INVOICE.setPositionInForms(10) - -assignment_SAMPLE_LIBRARY_POOL_NOTES = tr.assignPropertyType(samp_type_LIBRARY_POOL, prop_type_NOTES) -assignment_SAMPLE_LIBRARY_POOL_NOTES.setMandatory(False) -assignment_SAMPLE_LIBRARY_POOL_NOTES.setSection(None) -assignment_SAMPLE_LIBRARY_POOL_NOTES.setPositionInForms(11) - -assignment_DATA_SET_MACS_OUTPUT_MACS_VERSION = tr.assignPropertyType(data_set_type_MACS_OUTPUT, prop_type_MACS_VERSION) -assignment_DATA_SET_MACS_OUTPUT_MACS_VERSION.setMandatory(False) -assignment_DATA_SET_MACS_OUTPUT_MACS_VERSION.setSection(None) -assignment_DATA_SET_MACS_OUTPUT_MACS_VERSION.setPositionInForms(3) - -assignment_DATA_SET_MACS_OUTPUT_NOTES = tr.assignPropertyType(data_set_type_MACS_OUTPUT, prop_type_NOTES) -assignment_DATA_SET_MACS_OUTPUT_NOTES.setMandatory(False) -assignment_DATA_SET_MACS_OUTPUT_NOTES.setSection(None) -assignment_DATA_SET_MACS_OUTPUT_NOTES.setPositionInForms(4) - -assignment_SAMPLE_MASTER_SAMPLE_BIOLOGICAL_SAMPLE_ARRIVED = tr.assignPropertyType(samp_type_MASTER_SAMPLE, prop_type_BIOLOGICAL_SAMPLE_ARRIVED) -assignment_SAMPLE_MASTER_SAMPLE_BIOLOGICAL_SAMPLE_ARRIVED.setMandatory(True) -assignment_SAMPLE_MASTER_SAMPLE_BIOLOGICAL_SAMPLE_ARRIVED.setSection(None) -assignment_SAMPLE_MASTER_SAMPLE_BIOLOGICAL_SAMPLE_ARRIVED.setPositionInForms(1) - -assignment_SAMPLE_MASTER_SAMPLE_CONTACT_PERSON_EMAIL = tr.assignPropertyType(samp_type_MASTER_SAMPLE, prop_type_CONTACT_PERSON_EMAIL) -assignment_SAMPLE_MASTER_SAMPLE_CONTACT_PERSON_EMAIL.setMandatory(True) -assignment_SAMPLE_MASTER_SAMPLE_CONTACT_PERSON_EMAIL.setSection(None) -assignment_SAMPLE_MASTER_SAMPLE_CONTACT_PERSON_EMAIL.setPositionInForms(2) - -assignment_SAMPLE_MASTER_SAMPLE_CONTACT_PERSON_NAME = tr.assignPropertyType(samp_type_MASTER_SAMPLE, prop_type_CONTACT_PERSON_NAME) -assignment_SAMPLE_MASTER_SAMPLE_CONTACT_PERSON_NAME.setMandatory(True) -assignment_SAMPLE_MASTER_SAMPLE_CONTACT_PERSON_NAME.setSection(None) -assignment_SAMPLE_MASTER_SAMPLE_CONTACT_PERSON_NAME.setPositionInForms(3) - -assignment_SAMPLE_MASTER_SAMPLE_PRINCIPAL_INVESTIGATOR_EMAIL = tr.assignPropertyType(samp_type_MASTER_SAMPLE, prop_type_PRINCIPAL_INVESTIGATOR_EMAIL) -assignment_SAMPLE_MASTER_SAMPLE_PRINCIPAL_INVESTIGATOR_EMAIL.setMandatory(True) -assignment_SAMPLE_MASTER_SAMPLE_PRINCIPAL_INVESTIGATOR_EMAIL.setSection(None) -assignment_SAMPLE_MASTER_SAMPLE_PRINCIPAL_INVESTIGATOR_EMAIL.setPositionInForms(4) - -assignment_SAMPLE_MASTER_SAMPLE_PRINCIPAL_INVESTIGATOR_NAME = tr.assignPropertyType(samp_type_MASTER_SAMPLE, prop_type_PRINCIPAL_INVESTIGATOR_NAME) -assignment_SAMPLE_MASTER_SAMPLE_PRINCIPAL_INVESTIGATOR_NAME.setMandatory(True) -assignment_SAMPLE_MASTER_SAMPLE_PRINCIPAL_INVESTIGATOR_NAME.setSection(None) -assignment_SAMPLE_MASTER_SAMPLE_PRINCIPAL_INVESTIGATOR_NAME.setPositionInForms(5) - -assignment_SAMPLE_MASTER_SAMPLE_NCBI_ORGANISM_TAXONOMY = tr.assignPropertyType(samp_type_MASTER_SAMPLE, prop_type_NCBI_ORGANISM_TAXONOMY) -assignment_SAMPLE_MASTER_SAMPLE_NCBI_ORGANISM_TAXONOMY.setMandatory(True) -assignment_SAMPLE_MASTER_SAMPLE_NCBI_ORGANISM_TAXONOMY.setSection(None) -assignment_SAMPLE_MASTER_SAMPLE_NCBI_ORGANISM_TAXONOMY.setPositionInForms(7) - -assignment_SAMPLE_MASTER_SAMPLE_SAMPLE_KIND = tr.assignPropertyType(samp_type_MASTER_SAMPLE, prop_type_SAMPLE_KIND) -assignment_SAMPLE_MASTER_SAMPLE_SAMPLE_KIND.setMandatory(True) -assignment_SAMPLE_MASTER_SAMPLE_SAMPLE_KIND.setSection(None) -assignment_SAMPLE_MASTER_SAMPLE_SAMPLE_KIND.setPositionInForms(21) - -assignment_SAMPLE_MASTER_SAMPLE_NOTES = tr.assignPropertyType(samp_type_MASTER_SAMPLE, prop_type_NOTES) -assignment_SAMPLE_MASTER_SAMPLE_NOTES.setMandatory(False) -assignment_SAMPLE_MASTER_SAMPLE_NOTES.setSection(None) -assignment_SAMPLE_MASTER_SAMPLE_NOTES.setPositionInForms(22) - -assignment_SAMPLE_RAW_SAMPLE_EXTERNAL_SAMPLE_NAME = tr.assignPropertyType(samp_type_RAW_SAMPLE, prop_type_EXTERNAL_SAMPLE_NAME) -assignment_SAMPLE_RAW_SAMPLE_EXTERNAL_SAMPLE_NAME.setMandatory(False) -assignment_SAMPLE_RAW_SAMPLE_EXTERNAL_SAMPLE_NAME.setSection(None) -assignment_SAMPLE_RAW_SAMPLE_EXTERNAL_SAMPLE_NAME.setPositionInForms(1) - -assignment_SAMPLE_RAW_SAMPLE_CONCENTRATION_ORIGINAL_ILLUMINA = tr.assignPropertyType(samp_type_RAW_SAMPLE, prop_type_CONCENTRATION_ORIGINAL_ILLUMINA) -assignment_SAMPLE_RAW_SAMPLE_CONCENTRATION_ORIGINAL_ILLUMINA.setMandatory(False) -assignment_SAMPLE_RAW_SAMPLE_CONCENTRATION_ORIGINAL_ILLUMINA.setSection(None) -assignment_SAMPLE_RAW_SAMPLE_CONCENTRATION_ORIGINAL_ILLUMINA.setPositionInForms(4) - -assignment_SAMPLE_RAW_SAMPLE_PREPARED_BY = tr.assignPropertyType(samp_type_RAW_SAMPLE, prop_type_PREPARED_BY) -assignment_SAMPLE_RAW_SAMPLE_PREPARED_BY.setMandatory(False) -assignment_SAMPLE_RAW_SAMPLE_PREPARED_BY.setSection(None) -assignment_SAMPLE_RAW_SAMPLE_PREPARED_BY.setPositionInForms(8) - -assignment_SAMPLE_RAW_SAMPLE_KIT_PREPARED = tr.assignPropertyType(samp_type_RAW_SAMPLE, prop_type_KIT_PREPARED) -assignment_SAMPLE_RAW_SAMPLE_KIT_PREPARED.setMandatory(False) -assignment_SAMPLE_RAW_SAMPLE_KIT_PREPARED.setSection(None) -assignment_SAMPLE_RAW_SAMPLE_KIT_PREPARED.setPositionInForms(9) - -assignment_SAMPLE_RAW_SAMPLE_LIBRARY_PROCESSING_POSSIBLE_YES_NO = tr.assignPropertyType(samp_type_RAW_SAMPLE, prop_type_LIBRARY_PROCESSING_POSSIBLE_YES_NO) -assignment_SAMPLE_RAW_SAMPLE_LIBRARY_PROCESSING_POSSIBLE_YES_NO.setMandatory(False) -assignment_SAMPLE_RAW_SAMPLE_LIBRARY_PROCESSING_POSSIBLE_YES_NO.setSection(None) -assignment_SAMPLE_RAW_SAMPLE_LIBRARY_PROCESSING_POSSIBLE_YES_NO.setPositionInForms(10) - -assignment_SAMPLE_RAW_SAMPLE_NOTES = tr.assignPropertyType(samp_type_RAW_SAMPLE, prop_type_NOTES) -assignment_SAMPLE_RAW_SAMPLE_NOTES.setMandatory(False) -assignment_SAMPLE_RAW_SAMPLE_NOTES.setSection(None) -assignment_SAMPLE_RAW_SAMPLE_NOTES.setPositionInForms(13) - -print "Imported 104 Property Assignments" -print "Imported 0 External DMSs" -print ("Import of Master Data finished.") \ No newline at end of file diff --git a/deep_sequencing_unit/source/core-plugins/illumina-ngs/2/dss/data-sources/.gitignore b/deep_sequencing_unit/source/core-plugins/illumina-ngs/2/dss/data-sources/.gitignore deleted file mode 100644 index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..0000000000000000000000000000000000000000 diff --git a/deep_sequencing_unit/source/core-plugins/illumina-ngs/2/dss/drop-boxes/create-flowcell-hiseq/create-flowcell-hiseq.py b/deep_sequencing_unit/source/core-plugins/illumina-ngs/2/dss/drop-boxes/create-flowcell-hiseq/create-flowcell-hiseq.py deleted file mode 100644 index b306ec30deba598ecc53b0fc0d2f73defc775467..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/source/core-plugins/illumina-ngs/2/dss/drop-boxes/create-flowcell-hiseq/create-flowcell-hiseq.py +++ /dev/null @@ -1,221 +0,0 @@ -''' -@copyright: -2013 ETH Zuerich, CISD - -@license: -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - -http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. - -@description: -Parses the two Illumina provided files 'runParameters.xml' and 'RunInfo.xml' -and creates one Sample of type 'ILLUMINA_FLOW_CELL' and sets Sample properties -from those two XML files. Additionally the number of lanes are read out and -are created as contained samples of type 'ILLUMINA_FLOW_LANE'. - -@note: -print statements go to: <openBIS_HOME>/datastore_server/log/startup_log.txt -expected incoming Name for HiSeq runs: 110715_SN792_0054_BC035RACXX - -structure: -110715_SN792_0054_BC035RACXX/ - runParameters.xml - RunInfo.xml - -The run folder created by the HiSeq sequencer is used to create a new -ILLUMINA_FLOW_CELL in openBIS. The properties are then set by parsing the -two XML files in this folder. - -@author: -Manuel Kohler -''' - -import os -import shutil -from time import * -from datetime import * -import xml.etree.ElementTree as etree -from ch.systemsx.cisd.openbis.generic.shared.api.v1.dto import SearchCriteria - -RUNPARAMETERS = 'runParameters.xml' -RUNINFO = 'RunInfo.xml' -FLOWCELL_SPACE='BSSE_FLOWCELLS' -FLOWCELL_PROJECT='FLOWCELLS' -EXPERIMENT_TYPE_CODE='HT_SEQUENCING' -FLOW_CELL='ILLUMINA_FLOW_CELL' -FLOW_LANE='ILLUMINA_FLOW_LANE' - -FLOWCELL_PROJECT_ID = "/%(FLOWCELL_SPACE)s/%(FLOWCELL_PROJECT)s" % vars() - -# Mapping between XML file naming and used in here -RUNPARAMETERS_XML = {'FLOWCELL':'Flowcell', 'RTAVERSION':'RTAVersion', - 'CONTROLLANE':'ControlLane', 'SBS':'Sbs', 'INDEX':'Index', - 'CYCLES':'Read1', 'PE':'Pe'} -RUNINFO_XML = {'LANECOUNT':'LaneCount', 'SURFACECOUNT':'SurfaceCount', - 'SWATHCOUNT':'SwathCount', 'TILECOUNT':'TileCount'} - -class parseXmlFile: - - def __init__(self, xmlFile): - self.xmlFile = xmlFile - self.tree = etree.parse(self.xmlFile) - self.root = self.tree.getroot() - - def getXmlElement (self, elementName): - ''' - Returns the text value of a given XML element - ''' - for e in self.root.getchildren(): - element = e.find(elementName) - if element is None: - return 'None' - else: - return element.text - - def getAllchildren (self, elementName): - ''' - finds all children of a given XML Element and returns them as list - ''' - for e in self.root.getchildren(): - # the '//' means look recursively for all children not only direct ones - childList = self.tree.findall('//' + elementName) - return childList - -# ----------------------------------------------------------------------------- - -def create_openbis_timestamp (): - ''' - Create an openBIS conform timestamp - ''' - tz=localtime()[3]-gmtime()[3] - d=datetime.now() - return d.strftime("%Y-%m-%d %H:%M:%S GMT"+"%+.2d" % tz+":00") - -# ----------------------------------------------------------------------------- - -def registerFlowLane(transaction, a_lane, flowCellName, newFlowCell, exp, projectSamplesEnabled): - ''' - Registers a new Flow lane - ''' - newFlowLane = createNewSample(transaction, flowCellName + ':' + str(a_lane), FLOW_LANE, projectSamplesEnabled) - newFlowLane.setContainer(newFlowCell) - newFlowLane.setExperiment(exp) - -# ----------------------------------------------------------------------------- - -def createNewSample(transaction, sampleCode, sampleType, projectSamplesEnabled): - ''' - Create a sample with specified code and type. Depending on the flag projectSamplesEnabled - the identifier is constructed differently. - ''' - identifierPrefix = FLOWCELL_PROJECT_ID if projectSamplesEnabled else ('/' + FLOWCELL_SPACE) - return transaction.createNewSample(identifierPrefix + '/' + sampleCode, sampleType) - -# ----------------------------------------------------------------------------- - -def extractFlowCellName (runFolderName): - return runFolderName.split('_')[-1][1:] - -# ----------------------------------------------------------------------------- - -def searchFlowCell (transaction, flowCellName): - ''' - Search for the sample and check if there is already sample with this name - ''' - search_service = transaction.getSearchService() - sc = SearchCriteria() - sc.addMatchClause(SearchCriteria.MatchClause.createAttributeMatch( \ - SearchCriteria.MatchClauseAttribute.CODE, flowCellName)); - foundSamples = search_service.searchForSamples(sc) - if foundSamples.size() > 0: - raise NameError('Already found a flow cell with the following name: '+ flowCellName) - return foundSamples - -# ----------------------------------------------------------------------------- - -def process(transaction): - projectSamplesEnabled = (transaction.serverInformation.get('project-samples-enabled') == 'true') - - incoming = transaction.getIncoming() - incomingPath = incoming.getAbsolutePath() - - runFolderName = incoming.getName() - flowCellName = runFolderName.split('_')[-1][1:] - - searchFlowCell (transaction, flowCellName) - - # Parse the RunInfo.xml file - runInfo = parseXmlFile(incomingPath + '/' + RUNINFO) - - # Create a new Flow Cell and set the experiment - project = transaction.getProject(FLOWCELL_PROJECT_ID) - if project == None: - space = transaction.getSpace(FLOWCELL_SPACE) - if space == None: - space = transaction.createNewSpace(FLOWCELL_SPACE, None) - project = transaction.createNewProject(FLOWCELL_PROJECT_ID) - #expID = FLOWCELL_PROJECT_ID + '/' + datetime.now().strftime("%Y.%m") - expID = FLOWCELL_PROJECT_ID + '/' + "Test-Experiment" - exp = transaction.getExperiment(expID) - if exp == None: - exp = transaction.createNewExperiment(expID, EXPERIMENT_TYPE_CODE) - newFlowCell = createNewSample(transaction, flowCellName, FLOW_CELL, projectSamplesEnabled) - newFlowCell.setExperiment(exp) - - run = runInfo.getAllchildren('Run')[0].attrib - if (extractFlowCellName(run['Id']) != flowCellName): - raise NameError('Flowcell names do not match between directory name '+ flowCellName + - ' and ' + RUNINFO + 'property file: ' + extractFlowCellName(run['Id'])) - - - # The HiSeq is providing more infos in the runParameters.xml, which we will parse here: - runParameters = parseXmlFile(incomingPath + '/' + RUNPARAMETERS) - - newFlowCell.setPropertyValue("RUN_FOLDER_NAME", runFolderName) - newFlowCell.setPropertyValue("ILLUMINA_PIPELINE_VERSION", runParameters.getXmlElement(RUNPARAMETERS_XML['RTAVERSION'])) - newFlowCell.setPropertyValue("FLOWCELLTYPE", runParameters.getXmlElement(RUNPARAMETERS_XML['FLOWCELL'])) - newFlowCell.setPropertyValue("CONTROL_LANE", runParameters.getXmlElement(RUNPARAMETERS_XML['CONTROLLANE'])) - newFlowCell.setPropertyValue("SBS_KIT", runParameters.getXmlElement(RUNPARAMETERS_XML['SBS'])) - - read1 = runParameters.getAllchildren('Read1') - newFlowCell.setPropertyValue("CYCLES", read1[0].text) - - read2 = runParameters.getAllchildren('Read2') - if (str(read2[0].text) == '0'): - newFlowCell.setPropertyValue("END_TYPE", "SINGLE_READ") - else: - newFlowCell.setPropertyValue("END_TYPE", "PAIRED_END") - newFlowCell.setPropertyValue("PAIRED_END_KIT", runParameters.getXmlElement(RUNPARAMETERS_XML['PE'])) - - indexRead1 = runParameters.getAllchildren('IndexRead1') - newFlowCell.setPropertyValue("INDEXREAD", indexRead1[0].text) - - indexRead2 = runParameters.getAllchildren('IndexRead2') - newFlowCell.setPropertyValue("INDEXREAD2", indexRead2[0].text) - - def setFcProperty(searchId, dict): - children = runInfo.getAllchildren(searchId) - for element in (dict): - if (element <> '') and (dict[element] <> ''): - newFlowCell.setPropertyValue(element, children[0].attrib[dict[element]]) - - setFcProperty('FlowcellLayout', RUNINFO_XML) - - sequencer = runInfo.getAllchildren('Instrument') - newFlowCell.setPropertyValue("SEQUENCER", sequencer[0].text) - - newFlowCell.setPropertyValue("FLOW_CELL_SEQUENCED_ON", create_openbis_timestamp()) - try: - maxLanes = runInfo.getAllchildren('FlowcellLayout')[0].attrib[RUNINFO_XML['LANECOUNT']] - except: - maxLanes = len(runInfo.getAllchildren('Tiles')[0]) - - [registerFlowLane(transaction, lane, flowCellName, newFlowCell, exp, projectSamplesEnabled) for lane in range(1,int(maxLanes)+1)] diff --git a/deep_sequencing_unit/source/core-plugins/illumina-ngs/2/dss/drop-boxes/create-flowcell-hiseq/plugin.properties b/deep_sequencing_unit/source/core-plugins/illumina-ngs/2/dss/drop-boxes/create-flowcell-hiseq/plugin.properties deleted file mode 100644 index 5c56666b206b67339b5155b80f2d5812c1ac34b0..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/source/core-plugins/illumina-ngs/2/dss/drop-boxes/create-flowcell-hiseq/plugin.properties +++ /dev/null @@ -1,12 +0,0 @@ -# -# Drop box for creating a flow cell based on runParameters.xml and RunInfo.xml created by an -# Illumina HiSeq -# -# Variables: -# incoming-root-dir -# Path to the directory which contains incoming directories for drop boxes. -incoming-dir = ${incoming-root-dir}/create-flowcell-hiseq -incoming-data-completeness-condition = marker-file -top-level-data-set-handler = ch.systemsx.cisd.etlserver.registrator.api.v2.JythonTopLevelDataSetHandlerV2 -script-path = create-flowcell-hiseq.py -storage-processor = ch.systemsx.cisd.etlserver.DefaultStorageProcessor diff --git a/deep_sequencing_unit/source/core-plugins/illumina-ngs/2/dss/drop-boxes/read-rta-timestamp/plugin.properties b/deep_sequencing_unit/source/core-plugins/illumina-ngs/2/dss/drop-boxes/read-rta-timestamp/plugin.properties deleted file mode 100644 index ef56111b768f0d12631d249469e5c942506f01f0..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/source/core-plugins/illumina-ngs/2/dss/drop-boxes/read-rta-timestamp/plugin.properties +++ /dev/null @@ -1,11 +0,0 @@ -# -# Drop box for registering a flow cell output as a data set -# -# Variables: -# incoming-root-dir -# Path to the directory which contains incoming directories for drop boxes. -incoming-dir = ${incoming-root-dir}/read-rta-timestamp -incoming-data-completeness-condition = marker-file -top-level-data-set-handler = ch.systemsx.cisd.etlserver.registrator.api.v2.JythonTopLevelDataSetHandlerV2 -script-path = read-rta-timestamp.py -storage-processor = ch.systemsx.cisd.etlserver.DefaultStorageProcessor diff --git a/deep_sequencing_unit/source/core-plugins/illumina-ngs/2/dss/drop-boxes/read-rta-timestamp/read-rta-timestamp.py b/deep_sequencing_unit/source/core-plugins/illumina-ngs/2/dss/drop-boxes/read-rta-timestamp/read-rta-timestamp.py deleted file mode 100644 index 2b1687925ade626de3ed19d892ffc37c44d16e1b..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/source/core-plugins/illumina-ngs/2/dss/drop-boxes/read-rta-timestamp/read-rta-timestamp.py +++ /dev/null @@ -1,76 +0,0 @@ -''' -@copyright: -2013 ETH Zuerich, CISD - -@license: -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - -http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. - -@description: -Reads out the time stamp of the file 'RTAComplete.txt' and sets the -property for a finished sequencer called 'SEQUENCER_FINISHED' to the -time stamp of this file. - -@note: -print statements go to: <openBIS_HOME>/datastore_server/log/startup_log.txt -expected incoming Name for HiSeq runs: 110715_SN792_0054_BC035RACXX - -structure: -110715_SN792_0054_BC035RACXX/ - RTAComplete.txt - -@author: -Manuel Kohler -''' - -import os -import shutil -from time import * -from datetime import * -from ch.systemsx.cisd.openbis.generic.shared.api.v1.dto import SearchCriteria - -MarkerHiSeqComplete = 'RTAComplete.txt' - -def createOpenbisTimeStamp(file): - ''' - Creates a openBIS compatible time stamp of a file time stamp - ''' - mtime = os.path.getmtime(file) - lt = localtime(mtime) - tz = localtime().tm_hour - gmtime().tm_hour - return (strftime("%Y-%m-%d %H:%M:%S GMT" + "%+.2d" % tz + ":00", lt)) - -# ----------------------------------------------------------------------------- - -def extractFlowCellName (runFolderName): - return runFolderName.split('_')[-1][1:] - -# ----------------------------------------------------------------------------- - -def process(transaction): - - incomingPath = transaction.getIncoming().getAbsolutePath() - # Get the incoming name - runFolderName = transaction.getIncoming().getName() - flowCellName = extractFlowCellName(runFolderName) - - Markerfile = incomingPath + "/" + MarkerHiSeqComplete - - # Search for the sample and check if there is already sample with this name - search_service = transaction.getSearchService() - sc = SearchCriteria() - sc.addMatchClause(SearchCriteria.MatchClause.createAttributeMatch(SearchCriteria.MatchClauseAttribute.CODE, flowCellName)); - foundSamples = search_service.searchForSamples(sc) - - if foundSamples.size() > 0: - sa = transaction.getSampleForUpdate(foundSamples[0].getSampleIdentifier()) - sa.setPropertyValue("SEQUENCER_FINISHED", createOpenbisTimeStamp(Markerfile)) diff --git a/deep_sequencing_unit/source/core-plugins/illumina-ngs/2/dss/drop-boxes/register-basecall-stats/plugin.properties b/deep_sequencing_unit/source/core-plugins/illumina-ngs/2/dss/drop-boxes/register-basecall-stats/plugin.properties deleted file mode 100644 index d6e67945db5bcce4a1f3f1fa0c109a5d12b2544a..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/source/core-plugins/illumina-ngs/2/dss/drop-boxes/register-basecall-stats/plugin.properties +++ /dev/null @@ -1,11 +0,0 @@ -# -# Drop box for registering a flow cell output as a data set -# -# Variables: -# incoming-root-dir -# Path to the directory which contains incoming directories for drop boxes. -incoming-dir = ${incoming-root-dir}/register-basecall-stats -incoming-data-completeness-condition = marker-file -top-level-data-set-handler = ch.systemsx.cisd.etlserver.registrator.api.v2.JythonTopLevelDataSetHandlerV2 -script-path = register-basecall-stats.py -storage-processor = ch.systemsx.cisd.etlserver.DefaultStorageProcessor diff --git a/deep_sequencing_unit/source/core-plugins/illumina-ngs/2/dss/drop-boxes/register-basecall-stats/register-basecall-stats.py b/deep_sequencing_unit/source/core-plugins/illumina-ngs/2/dss/drop-boxes/register-basecall-stats/register-basecall-stats.py deleted file mode 100644 index 4c47f6a072d2579c03c3def90d8d93a036673c5e..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/source/core-plugins/illumina-ngs/2/dss/drop-boxes/register-basecall-stats/register-basecall-stats.py +++ /dev/null @@ -1,62 +0,0 @@ -''' -@copyright: -2013 ETH Zuerich, CISD - -@license: -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - -http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. - -@description: -Registers an incoming directory as a 'BASECALL_STATS' data set in openBIS. -The name of the directory is used to search for the matching sample. - -@note: -print statements go to: <openBIS_HOME>/datastore_server/log/startup_log.txt -expected incoming Name for HiSeq runs: C035RACXX_1 -expected incoming Name for MiSeq runs: A0T19_1 - -@author: -Manuel Kohler -''' - -import os -from ch.systemsx.cisd.openbis.generic.shared.api.v1.dto import SearchCriteria -from ch.systemsx.cisd.openbis.generic.shared.api.v1.dto import SearchSubCriteria - -# ----------------------------------------------------------------------------- - -def extractFlowCellName (runFolderName): - flowCell, flowLane = runFolderName.split('_') - return flowCell, flowLane - -# ----------------------------------------------------------------------------- - -def process(transaction): - - runFolderName = transaction.getIncoming().getName() - incomingPath = transaction.getIncoming().getPath() - flowCellName, flowLaneName = extractFlowCellName(runFolderName) - - # Create a data set and set type - dataSet = transaction.createNewDataSet("BASECALL_STATS") - dataSet.setMeasuredData(False) - - dataSet.setPropertyValue("MISMATCH_IN_INDEX", "NONE") - - search_service = transaction.getSearchService() - transaction.moveFile(incomingPath, dataSet) - sc = SearchCriteria() - sc.addMatchClause(SearchCriteria.MatchClause.createAttributeMatch(SearchCriteria.MatchClauseAttribute.CODE, flowCellName + ':' + flowLaneName)) - foundSamples = search_service.searchForSamples(sc) - - if foundSamples.size() > 0: - dataSet.setSample(foundSamples[0]) diff --git a/deep_sequencing_unit/source/core-plugins/illumina-ngs/2/dss/drop-boxes/register-flowcell/plugin.properties b/deep_sequencing_unit/source/core-plugins/illumina-ngs/2/dss/drop-boxes/register-flowcell/plugin.properties deleted file mode 100644 index 697c1d5d3cbdc3435f5f06d4dad207e13245d19d..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/source/core-plugins/illumina-ngs/2/dss/drop-boxes/register-flowcell/plugin.properties +++ /dev/null @@ -1,11 +0,0 @@ -# -# Drop box for registering a flow cell output as a data set -# -# Variables: -# incoming-root-dir -# Path to the directory which contains incoming directories for drop boxes. -incoming-dir = ${incoming-root-dir}/register-flowcell-hiseq -incoming-data-completeness-condition = marker-file -top-level-data-set-handler = ch.systemsx.cisd.etlserver.registrator.api.v2.JythonTopLevelDataSetHandlerV2 -script-path = register-flowcell-hiseq.py -storage-processor = ch.systemsx.cisd.etlserver.DefaultStorageProcessor diff --git a/deep_sequencing_unit/source/core-plugins/illumina-ngs/2/dss/drop-boxes/register-flowcell/register-flowcell-hiseq.py b/deep_sequencing_unit/source/core-plugins/illumina-ngs/2/dss/drop-boxes/register-flowcell/register-flowcell-hiseq.py deleted file mode 100644 index 4b2251d72bc09343a150d9909b4d9cb8a78facae..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/source/core-plugins/illumina-ngs/2/dss/drop-boxes/register-flowcell/register-flowcell-hiseq.py +++ /dev/null @@ -1,138 +0,0 @@ -''' -@copyright: -2013 ETH Zuerich, CISD - -@license: -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - -http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. - -@description: -Registers an incoming directory as a data set in openBIS. The name of the directory is used to -search for the matching sample. - -@note: -print statements go to: <openBIS_HOME>/datastore_server/log/startup_log.txt -expected incoming Name for HiSeq runs: 110715_SN792_0054_BC035RACXX -expected incoming Name for GAII runs: 110812_6353WAAXX - -@author: -Manuel Kohler -''' - -import os -import shutil -import glob -import xml.etree.ElementTree as etree -from ch.systemsx.cisd.openbis.generic.shared.api.v1.dto import SearchCriteria - -REGEX_RUNINFO_SAMPLE = '/Data/Status*' -REGEX_RUNINFO_REPORTS = '/Data/reports' -MARKER_STRING = '.MARKER_is_finished_' -RUNSTATISTICS_DROPBOX = 'register-runstatistics' - -# ----------------------------------------------------------------------------- - -def extractRunData (runFolderName, transaction): - ''' - Splits the incoming folder name and extracts infos out of it - HiSeq example: - ['130227', 'SN792', '0211', 'BC1RPGACXX'] - MiSeq example: - ['130227', 'M00721', '0036', '000000000-A3BAV'] - ''' - runDataDict = {} - date, sequencerID, runningNumber, flowCellId = runFolderName.split('_') - runDataDict['date'] = date - runDataDict['sequencerID'] = sequencerID - runDataDict['runningNumber'] = runningNumber - - if not sequencerID.startswith('M'): - runDataDict['compartment'] = flowCellId[0] - runDataDict['flowCellId'] = flowCellId[1:] - dataSet = transaction.createNewDataSet("ILLUMINA_HISEQ_OUTPUT") - else: - runDataDict['flowCellId'] = flowCellId - dataSet = transaction.createNewDataSet("ILLUMINA_MISEQ_OUTPUT") - return runDataDict, dataSet - -# ----------------------------------------------------------------------------- - -def touch_markerfile(filename): - try: - # do a touch - open(filename, 'w').close() - except: - print('Could not touch ' + filename) - -# ----------------------------------------------------------------------------- - -def moveFiles(incomingPath, runDataDict, runStatisticsFolder): - #move RunInfo into a different drop box - runInfoSample=glob.glob(incomingPath + REGEX_RUNINFO_SAMPLE) - runInfoReport=glob.glob(incomingPath + REGEX_RUNINFO_REPORTS) - runInfoList = runInfoSample + runInfoReport - - newPath = runStatisticsFolder + '/' + runDataDict['flowCellId'] + '/Data/' - - os.makedirs(newPath) - for runInfo in runInfoList: - try: - if os.path.isdir(runInfo): - shutil.copytree(runInfo, newPath + os.path.basename(runInfo)) - else: - shutil.copy2(runInfo, newPath) - except (IOError, os.error), why: - print (runInfo, newPath, str(why)) - -# ----------------------------------------------------------------------------- - -def getThreadProperties(transaction): - - threadPropertyDict = {} - threadProperties = transaction.getGlobalState().getThreadParameters().getThreadProperties() - - for key in threadProperties: - try: - threadPropertyDict[key] = threadProperties.getProperty(key) - except: - pass - return threadPropertyDict - -# ----------------------------------------------------------------------------- - -def process(transaction): - - threadPropertyDict = getThreadProperties(transaction) - - incomingPath = transaction.getIncoming().getPath() - runFolderName = transaction.getIncoming().getName() - runDataDict, dataSet = extractRunData(runFolderName, transaction) - - incomingRootDir = threadPropertyDict[u'incoming-root-dir'] - runStatisticsFolder = incomingRootDir + '/' + RUNSTATISTICS_DROPBOX - - moveFiles(incomingPath, runDataDict, runStatisticsFolder) - - touch_markerfile( runStatisticsFolder + '/' + MARKER_STRING + runDataDict['flowCellId']) - - dataSet.setMeasuredData(False) - - search_service = transaction.getSearchService() - sc = SearchCriteria() - sc.addMatchClause(SearchCriteria.MatchClause.createAttributeMatch( \ - SearchCriteria.MatchClauseAttribute.CODE, runDataDict['flowCellId'])); - foundSamples = search_service.searchForSamples(sc) - - if foundSamples.size() > 0: - # Add the incoming file into the data set - transaction.moveFile(incomingPath, dataSet) - dataSet.setSample(foundSamples[0]) diff --git a/deep_sequencing_unit/source/core-plugins/illumina-ngs/2/dss/drop-boxes/register-lane-hiseq/plugin.properties b/deep_sequencing_unit/source/core-plugins/illumina-ngs/2/dss/drop-boxes/register-lane-hiseq/plugin.properties deleted file mode 100644 index f7523f7cdec8ed261c78152f3007f7bb9947f79b..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/source/core-plugins/illumina-ngs/2/dss/drop-boxes/register-lane-hiseq/plugin.properties +++ /dev/null @@ -1,12 +0,0 @@ -# -# Drop box for registering a flow cell output as a data set -# -# Variables: -# incoming-root-dir -# Path to the directory which contains incoming directories for drop boxes. -incoming-dir = ${incoming-root-dir}/register-lane-hiseq -incoming-data-completeness-condition = marker-file -top-level-data-set-handler = ch.systemsx.cisd.etlserver.registrator.api.v2.JythonTopLevelDataSetHandlerV2 -script-path = register-lane-hiseq.py -storage-processor = ch.systemsx.cisd.etlserver.DefaultStorageProcessor - diff --git a/deep_sequencing_unit/source/core-plugins/illumina-ngs/2/dss/drop-boxes/register-lane-hiseq/register-lane-hiseq.py b/deep_sequencing_unit/source/core-plugins/illumina-ngs/2/dss/drop-boxes/register-lane-hiseq/register-lane-hiseq.py deleted file mode 100755 index 848fd08ad3bed11ae5a43fd5919053697dca25f5..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/source/core-plugins/illumina-ngs/2/dss/drop-boxes/register-lane-hiseq/register-lane-hiseq.py +++ /dev/null @@ -1,223 +0,0 @@ -''' -@copyright: -2013 ETH Zuerich, CISD - -@license: -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - -http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. - -@description: -Processes each flow lane of a Sequencing run and attaches the fastq files to -the correct corresponding library samples - -@note: -print statements go to: <openBIS_HOME>/datastore_server/log/startup_log.txt -Expects as incoming folder: -Project_<Flow Cell>_<Lane> -e.g.Project_110715_SN792_0054_BC035RACXX_1 - - -@author: -Manuel Kohler - -Note: -print statements go to: ~openbis/sprint/datastore_server/log/startup_log.txt -''' - -import os -import fnmatch -import time -import shutil -from time import * -from datetime import * -from ch.systemsx.cisd.openbis.generic.shared.api.v1.dto import SearchCriteria - -FASTQ_GZ_PATTERN = "*.fastq.gz" -METADATA_FILE_SUFFIX = "_metadata.tsv" -INDEX1='INDEX1' -INDEX2='INDEX2' -EXTERNAL_SAMPLE_NAME='EXTERNAL_SAMPLE_NAME' - -DEFAULT_INDEX='NoIndex' - -# ------------------------------------------------------------------------------- - -def getFileNames(path): - ''' - Gets all files matching a PATTERN in a path recursively - and returns the result as a list - ''' - matches = [] - for root, dirnames, filenames in os.walk(path): - for filename in fnmatch.filter(filenames, FASTQ_GZ_PATTERN): - matches.append(os.path.join(root, filename)) - matches.sort() - return(matches) - -# ------------------------------------------------------------------------------- - -def writeMetadataFile (fileName, parentPropertyTypes, parentPropertiesMap, fcMetaDataDict, fcMetaDataList): - ''' - Writes a file of meta date related to one sample - ''' - try: - metaDataFile = open(fileName,'w') - for propertyType in parentPropertyTypes: - metaDataFile.write(propertyType.encode('utf-8') + "\t" + - parentPropertiesMap[propertyType].tryGetAsString().encode('utf-8') + "\n") - - metaDataFile.write("\nFLOWCELL PROPERTIES\n".encode('utf-8')) - - for fcMetaData in fcMetaDataList: - metaDataFile.write(fcMetaData.encode('utf-8') + "\t" + - fcMetaDataDict[fcMetaData].tryGetAsString().encode('utf-8') + "\n") - pass - except IOError: - print ('File error, could not write '+ fileName) - finally: - metaDataFile.close() - -# ------------------------------------------------------------------------------- - -def create_openbis_timestamp (): - ''' - Create an openBIS conform timestamp - ''' - tz=localtime()[3]-gmtime()[3] - d=datetime.now() - return d.strftime("%Y-%m-%d %H:%M:%S GMT"+"%+.2d" % tz+":00") - -# ------------------------------------------------------------------------------- - -def getFlowCellMetaData (transaction, flowCellId): - - def sortedDictValues(adict): - keys = adict.keys() - keys.sort() - return map(adict.get, keys) - - search = transaction.getSearchService() - sc = SearchCriteria() - print('Searching FlowCell: '+ str(flowCellId)) - sc.addMatchClause(SearchCriteria.MatchClause.createAttributeMatch(SearchCriteria.MatchClauseAttribute.CODE, flowCellId)); - foundFlowCells = search.searchForSamples(sc) - - try: - assert foundFlowCells.size() == 1 - except AssertionError: - print (str(foundFlowCells.size()) + ' flow cells found which match the criterias: '+ flowCellId) - - fcPropertiesDict = {} - fcPropertyTypes = [] - - fcProperties = foundFlowCells[0].getSample().getProperties() - for property in fcProperties: - code = property.getPropertyType().getSimpleCode() - fcPropertyTypes.append(code) - fcPropertiesDict[code] = property - - fcPropertyTypes.sort() - return fcPropertiesDict, fcPropertyTypes - -# ------------------------------------------------------------------------------- - -def searchSample(search_service, sampleCode): - - sc = SearchCriteria() - sc.addMatchClause(SearchCriteria.MatchClause.createAttributeMatch(SearchCriteria.MatchClauseAttribute.CODE, sampleCode)); - foundSamples = search_service.searchForSamples(sc) - - # there should be only one sample because it is unique - if (len(foundSamples) > 1): - raise Exception("More than one sample found! No unique code: " + sampleCode) - elif (len(foundSamples) == 0): - raise Exception("No matching sample found for: " + sampleCode) - else : - sample = foundSamples[0] - return sample - -# ------------------------------------------------------------------------------- -def process(transaction): - - # useful for debugging: - print ("\n") - print(datetime.now()) - - search_service = transaction.getSearchService() - - incomingPath = transaction.getIncoming().getAbsolutePath() - name = transaction.getIncoming().getName() - - folders=[] - folders=os.listdir(incomingPath) - - # expected incoming Name, e.g.: Project_110715_SN792_0054_BC035RACXX_1 - split=name.split("_") - if (len(split) == 6): - runningDate = split[1] - sequencerId = split[2] - sequentialNumber = split[3] - hiseqTray = split[4][0] - flowCellId = split[4][1:] - flowLane = split[-1] - incoming_sample = flowCellId + ':' + flowLane - # expected Project_120112_63537AAXX_1 - if (len(split) == 4): - runningDate = split[1] - flowCellId = split[2] - flowLane = split[-1] - incoming_sample = flowCellId + ':' + flowLane - - # Search for the incoming_sample which is a Flow Lane - sc = SearchCriteria() - print('Processing sample: '+ str(incoming_sample)) - sc.addMatchClause(SearchCriteria.MatchClause.createAttributeMatch(SearchCriteria.MatchClauseAttribute.CODE, incoming_sample)); - foundSamples = search_service.searchForSamples(sc) - - # there should be only one sample because it is unique within one Flow Cell - if (len(foundSamples) > 1): - raise Exception("More than one sample found! No unique code: " + incoming_sample) - elif (len(foundSamples) == 0): - raise Exception("No matching sample found for: " + incoming_sample) - else : - sample = foundSamples[0].getSample() - parents = sample.getParents() - - # ------------------------------------------------------------------------------- - - # loop over each Sample folder within a lane - for f in range(0,len(folders)): - # Create a data set and set type - dataSet = transaction.createNewDataSet("FASTQ_GZ") - dataSet.setMeasuredData(False) - dataSet.setPropertyValue(INDEX1, DEFAULT_INDEX) - dataSet.setPropertyValue(INDEX2, DEFAULT_INDEX) - dirName = transaction.createNewDirectory(dataSet,folders[f]) - - # if multiplexed samples then there is more than one folder - pathPerLane = incomingPath + '/' + folders[f] - - # get all fastqs in this dataSet - fastqFileList=getFileNames(pathPerLane) - - # put the files into the dataSet - for file in fastqFileList: - sampleCode = '-'.join(file.split('/')[-1].split('_')[:4]) - print "Searching for " + sampleCode - sample = searchSample(search_service, sampleCode) - - # finally add the files to the data set - transaction.moveFile(file , dataSet, folders[f]) - - #sa = transaction.getSampleForUpdate(sample.getSampleIdentifier()) - #sa.setPropertyValue("DATA_TRANSFERRED", create_openbis_timestamp()) - dataSet.setSample(sample) diff --git a/deep_sequencing_unit/source/core-plugins/illumina-ngs/2/dss/drop-boxes/register-runstatistics/plugin.properties b/deep_sequencing_unit/source/core-plugins/illumina-ngs/2/dss/drop-boxes/register-runstatistics/plugin.properties deleted file mode 100644 index 8572688f22411a37ed1f5632e4410ad5944c439b..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/source/core-plugins/illumina-ngs/2/dss/drop-boxes/register-runstatistics/plugin.properties +++ /dev/null @@ -1,11 +0,0 @@ -# -# Drop box for registering a flow cell output as a data set -# -# Variables: -# incoming-root-dir -# Path to the directory which contains incoming directories for drop boxes. -incoming-dir = ${incoming-root-dir}/register-runstatistics -incoming-data-completeness-condition = marker-file -top-level-data-set-handler = ch.systemsx.cisd.etlserver.registrator.api.v2.JythonTopLevelDataSetHandlerV2 -script-path = register-runstatistics.py -storage-processor = ch.systemsx.cisd.etlserver.DefaultStorageProcessor diff --git a/deep_sequencing_unit/source/core-plugins/illumina-ngs/2/dss/drop-boxes/register-runstatistics/register-runstatistics.py b/deep_sequencing_unit/source/core-plugins/illumina-ngs/2/dss/drop-boxes/register-runstatistics/register-runstatistics.py deleted file mode 100644 index c3fc98d03a4a234fc0997fe9d8a85caf8fe5c29b..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/source/core-plugins/illumina-ngs/2/dss/drop-boxes/register-runstatistics/register-runstatistics.py +++ /dev/null @@ -1,57 +0,0 @@ -''' -@copyright: -2013 ETH Zuerich, CISD - -@license: -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - -http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. - -@description: -Registers an incoming directory as a data set in openBIS. The name of -the directory is used to search for the matching sample. - -@note: -print statements go to: <openBIS_HOME>/datastore_server/log/startup_log.txt - -@author: -Manuel Kohler -''' - -import os -import shutil -from ch.systemsx.cisd.openbis.generic.shared.api.v1.dto import SearchCriteria -from ch.systemsx.cisd.openbis.generic.shared.api.v1.dto import SearchSubCriteria - -def process(transaction): - - incomingPath = transaction.getIncoming().getPath() - incomingFolder = transaction.getIncoming().getName() - - search_service = transaction.getSearchService() - sc = SearchCriteria() - sc.addMatchClause(SearchCriteria.MatchClause.createAttributeMatch(SearchCriteria.MatchClauseAttribute.CODE, incomingFolder)); - foundSamples = search_service.searchForSamples(sc) - - if foundSamples.size() > 0: - - # Search for another data set of the same sample and make it a child of it - sampleSc = SearchCriteria() - sampleSc.addSubCriteria(SearchSubCriteria.createSampleContainerCriteria(sc)) - foundContainedSamples = search_service.searchForSamples(sampleSc) - if foundContainedSamples.size() > 0: - for fcs in range(0,foundContainedSamples.size()): - dataSet = transaction.createNewDataSet("RUNINFO") - dataSet.setMeasuredData(False) - dataSet.setSample(foundContainedSamples[fcs]) - # Add the incoming file into the data set - shutil.copytree(incomingPath, incomingPath + "_" + str(fcs+1)) - transaction.moveFile(incomingPath + "_" + str(fcs+1), dataSet) diff --git a/deep_sequencing_unit/source/core-plugins/illumina-ngs/2/dss/drop-boxes/register-unaligned/plugin.properties b/deep_sequencing_unit/source/core-plugins/illumina-ngs/2/dss/drop-boxes/register-unaligned/plugin.properties deleted file mode 100644 index 9c8c317b60db9215ca0b0c60a150018e92930dc1..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/source/core-plugins/illumina-ngs/2/dss/drop-boxes/register-unaligned/plugin.properties +++ /dev/null @@ -1,11 +0,0 @@ -# -# Drop box for registering a flow cell output as a data set -# -# Variables: -# incoming-root-dir -# Path to the directory which contains incoming directories for drop boxes. -incoming-dir = ${incoming-root-dir}/register-unaligned -incoming-data-completeness-condition = marker-file -top-level-data-set-handler = ch.systemsx.cisd.etlserver.registrator.api.v2.JythonTopLevelDataSetHandlerV2 -script-path = register-unaligned.py -storage-processor = ch.systemsx.cisd.etlserver.DefaultStorageProcessor diff --git a/deep_sequencing_unit/source/core-plugins/illumina-ngs/2/dss/drop-boxes/register-unaligned/register-unaligned.py b/deep_sequencing_unit/source/core-plugins/illumina-ngs/2/dss/drop-boxes/register-unaligned/register-unaligned.py deleted file mode 100755 index d9e6b77c95fb1add298ae2000683f9d6c3df97e5..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/source/core-plugins/illumina-ngs/2/dss/drop-boxes/register-unaligned/register-unaligned.py +++ /dev/null @@ -1,185 +0,0 @@ -''' -@copyright: -2013 ETH Zuerich, CISD - -@license: -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - -http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. - -@description: -Splits up this complex data set into two different data sets and -moves the corresponding file into those drop boxes - -@note: -Expects as incoming folder: <FlowCell>/Unaligned_no_mismatch - -@author: -Manuel Kohler -''' - -import os -import glob -import shutil -import time -from ch.systemsx.cisd.openbis.generic.shared.api.v1.dto import SearchCriteria -from ch.systemsx.cisd.openbis.generic.shared.api.v1.dto import SearchSubCriteria - -BASECALL_STATS_FOLDER = 'Basecall_Stats_' -REGEX_FILES = '*.*' -REGEX_MAKEFILE = 'Make*' -REGEX_LANES='/P*' -REGEX_UNDETERMINED = '/U*/Sample*' -UNALIGNED_FOLDER='Unaligned_' -LANE_DROPBOX='register-lane-hiseq' -BASECALL_DROPBOX='register-basecall-stats' -MARKER_STRING='.MARKER_is_finished_' - -# ----------------------------------------------------------------------------- - -def touch_markerfile(filename): - try: - # do a touch - open(filename, 'w').close() - except: - print('Could not touch ' + filename) - -# ----------------------------------------------------------------------------- - -def searchForLaneParents(transaction, sampleCode): - - search_service = transaction.getSearchService() - sc = SearchCriteria() - sc.addMatchClause(SearchCriteria.MatchClause.createAttributeMatch(SearchCriteria.MatchClauseAttribute.CODE, sampleCode)) - foundSamples = search_service.searchForSamples(sc) - # there should be only one sample because it is unique within one Flow Cell - if (len(foundSamples) > 1): - raise Exception("More than one sample found! No unique code: " + sampleCode) - elif (len(foundSamples) == 0): - raise Exception("No matching sample found for: " + sampleCode) - else : - sample = foundSamples[0].getSample() - parents = sample.getParents() - - # search for the parents - sc = SearchCriteria() - # set the Search Criteria to an OR condition, default is AND - sc.setOperator(SearchCriteria.SearchOperator.MATCH_ANY_CLAUSES) - # Get the codes for all parents - for parent in parents: - parentSubCode = parent.getSubCode() - sc.addMatchClause(SearchCriteria.MatchClause.createAttributeMatch(SearchCriteria.MatchClauseAttribute.CODE, parentSubCode)); - # all parents of the flow lane - foundParents = search_service.searchForSamples(sc) - - parentCodeList = [] - - for foundParent in foundParents: - parent = foundParent.getSample() - # ArrayList - parentProperties = parent.getProperties() - # just get the current code - parentCode = parent.getCode() - parentCodeList.append(parentCode) - #print("Found parent code: "+ parentCode) - - return parentCodeList - -# ----------------------------------------------------------------------------- - -def renameFiles(transaction, dir, flowcellName): - # Limit of Samples when the Sample Code is still used in the renaming. If Number of Samples is - # bigger than this number, we just write the number in the file name. - - MAX_SAMPLES = 20 - FACILITY_CODE = "BSSE_QGF_" - - for root, dirs, files in os.walk(dir): - for file in files: - lane = file.split("_")[0][-1] - if lane.isdigit(): - sampleCode = flowcellName + ":" + lane - print sampleCode - parentCodeList = searchForLaneParents(transaction, sampleCode) - print parentCodeList - length = len(parentCodeList) - if length > MAX_SAMPLES: - # BSSE_QGF_96_samples_C1A8YACXX_Undetermined_L008_R1_001.fastq.gz - os.rename(root + '/' + file, root + "/" + FACILITY_CODE + str(length) + "_samples_" + flowcellName + "_" + file) - else: - # BSSE_QGF_10001_10002_10003_10004_C1A8YACXX_Undetermined_L008_R1_001.fastq.gz - SampleCodeString = "_".join([(e.split("-")[-1]) for e in parentCodeList]) - os.rename(root + '/' + file, root + "/" + FACILITY_CODE + SampleCodeString + "_" + flowcellName + "_" + file) - - -# ----------------------------------------------------------------------------- - -def getThreadProperties(transaction): - - threadPropertyDict = {} - threadProperties = transaction.getGlobalState().getThreadParameters().getThreadProperties() - - for key in threadProperties: - try: - threadPropertyDict[key] = threadProperties.getProperty(key) - except: - pass - return threadPropertyDict - -# ----------------------------------------------------------------------------- - -def extractFlowCellName (runFolderName): - return runFolderName.split('_')[-1][1:] - -# ----------------------------------------------------------------------------- - -def process(transaction): - - threadPropertyDict = getThreadProperties(transaction) - incomingRootDir = threadPropertyDict[u'incoming-root-dir'] - laneFolder = incomingRootDir + '/' + LANE_DROPBOX + '/' - basecallStatsFolder = incomingRootDir + '/' + BASECALL_DROPBOX + '/' - - incomingPath = transaction.getIncoming().getPath() - runFolderName = transaction.getIncoming().getName() - fcName = extractFlowCellName(runFolderName) - - # ----------------------------------------------------------------------------- - # move Lanes into a different drop box - laneList=glob.glob(incomingPath + '/'+ UNALIGNED_FOLDER + '*' + REGEX_LANES) - laneList.sort() - - undeterminedList=glob.glob(incomingPath + '/'+ UNALIGNED_FOLDER + '*' + REGEX_UNDETERMINED) - undeterminedList.sort() - - # add the Flow Cell Name to the Undetermined FASTQ files - [renameFiles(transaction, dir, fcName) for dir in undeterminedList] - - # Multiplexing: - # First move the Undetermined reads to the other ones - [shutil.move(undeterminedLane, laneList[int(undeterminedLane.split('/')[-1][-1])-1] +'/' + undeterminedLane.split('/')[-1]) for undeterminedLane in undeterminedList] - - [shutil.move(lane, laneFolder + lane.split('/')[-1]) for lane in laneList] - markerFileList = [touch_markerfile(laneFolder + MARKER_STRING+lane.split('/')[-1]) for lane in laneList] - - # ----------------------------------------------------------------------------- - # move Basecall Stats into a different drop box - - # Build up a list of file which are part of the data set - for lane in xrange(1, len(laneList)+1): - path = incomingPath + '/'+ UNALIGNED_FOLDER + str(lane) + '/' - fileList=glob.glob(path + REGEX_FILES) - [fileList.append(i) for i in glob.glob(path + REGEX_MAKEFILE)] - - dest = fcName + '_' + str(lane) - shutil.copytree(path + BASECALL_STATS_FOLDER + fcName , basecallStatsFolder + dest + '/' + BASECALL_STATS_FOLDER + fcName) - [shutil.move(file, basecallStatsFolder + dest) for file in fileList] - touch_markerfile(basecallStatsFolder + MARKER_STRING + dest) diff --git a/deep_sequencing_unit/source/core-plugins/illumina-ngs/2/dss/maintenance-tasks/.gitignore b/deep_sequencing_unit/source/core-plugins/illumina-ngs/2/dss/maintenance-tasks/.gitignore deleted file mode 100644 index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..0000000000000000000000000000000000000000 diff --git a/deep_sequencing_unit/source/core-plugins/illumina-ngs/2/dss/reporting-plugins/.gitignore b/deep_sequencing_unit/source/core-plugins/illumina-ngs/2/dss/reporting-plugins/.gitignore deleted file mode 100644 index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..0000000000000000000000000000000000000000 diff --git a/deep_sequencing_unit/source/core-plugins/illumina-ngs/2/dss/services/.gitignore b/deep_sequencing_unit/source/core-plugins/illumina-ngs/2/dss/services/.gitignore deleted file mode 100644 index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..0000000000000000000000000000000000000000 diff --git a/deep_sequencing_unit/source/core-plugins/illumina-ngs/package-to-dist b/deep_sequencing_unit/source/core-plugins/illumina-ngs/package-to-dist deleted file mode 100644 index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..0000000000000000000000000000000000000000 diff --git a/deep_sequencing_unit/source/core-plugins/laneStatistics/1/as/webapps/cellStatistics/html/index.html b/deep_sequencing_unit/source/core-plugins/laneStatistics/1/as/webapps/cellStatistics/html/index.html deleted file mode 100644 index 06d40af202ceaebc780abfe701ce3c18dfab3492..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/source/core-plugins/laneStatistics/1/as/webapps/cellStatistics/html/index.html +++ /dev/null @@ -1,248 +0,0 @@ -<!DOCTYPE html> -<html> - <head> - <title>Flowcell Statistics</title> - <script type="text/javascript" src="/openbis/resources/js/d3.v3.min.js"></script> - <script type="text/javascript" src="/openbis/resources/js/d3.layout.js"></script> - <script type="text/javascript" src="/openbis/resources/js/jquery.js"></script> - <script type="text/javascript" src="/openbis/resources/js/openbis.js"></script> - <script type="text/javascript" src="/openbis/resources/js/openbis-dsu.js"></script> - <script type="text/javascript" src="/openbis/resources/js/openbis-action-deferrer.js"></script> - <script type="text/javascript" src="/openbis/resources/js/FileSaver.js"></script> - <link rel="stylesheet" href="//netdna.bootstrapcdn.com/bootstrap/3.0.0-rc1/css/bootstrap.min.css"> - <link rel="stylesheet" type="text/css" href="style.css" /> - </head> - <body> - <script> - - var formatThousands = d3.format(","); - dsu = new openbis_dsu('/openbis/openbis', '/datastore_server'); - var webAppContext = new openbisWebAppContext(); - dsu.server.useSession(webAppContext.getSessionId()); - - var prop; - var flowcellProperties = []; - var myArray = []; - var sumArray = []; - var sumsArray = [] - - loadData() - - /* ------- General functions -------------------------------------------*/ - - // used for sorting by lane of the final array of objects - function compare(a,b) { - if (a.lane < b.lane) - return -1; - if (a.lane > b.lane) - return 1; - return 0; - } - - function isNumber(n) { - return !isNaN(parseFloat(n)) && isFinite(n); - } - - function roundFloat(myFloat) { - return Number(myFloat).toFixed(2); - } - - - /* -------------------------------------------------------------------*/ - -function loadData () { - var dataSetProperties; - var prop; - - dsu.retrieveSample(webAppContext.getEntityIdentifier(), function(response) { - - flowcellProperties = response.result[0].properties; - numberOfLanes = (flowcellProperties.LANECOUNT); - - var sampleCodes = []; - for (i = 1; i <= numberOfLanes; i++) { - sampleCodes.push(webAppContext.entityIdentifier + ":" + i); - } - - var deferrer = new openbisActionDeferrer(function(){ - sumArray.sort(compare); - plotLaneTable (sumArray, true); - downloadButton ("tableStats"); - $("#save_as" + "tableStats").click(function() { submit_download_form("html", "tableStats"); }); - }, sampleCodes); - - sampleCodes.forEach(function(sampleCode){ - dsu.retrieveDataSetsForSample(sampleCode, function(response){ - getProperties(response); - //console.log("got response " + sampleCode); - var sums = calculateSum(myArray, sampleCode, true); - //console.log(sums[0]) - sumArray.push(sums[0]); - myArray = []; - deferrer.dependencyCompleted(sampleCode); - }); - }); - - function getProperties(dataSetProperties) { - for (var i = 0; i < dataSetProperties.result.length; i++) { - myArray.push({ - 'externalSampleName' : dataSetProperties.result[i].properties.EXTERNAL_SAMPLE_NAME, - 'index1': dataSetProperties.result[i].properties.BARCODE, - 'index2': dataSetProperties.result[i].properties.INDEX2, - 'percFilteringPass' : parseFloat(dataSetProperties.result[i].properties.PERCENTAGE_PASSED_FILTERING), - 'rawReadsSum' : dataSetProperties.result[i].properties.RAW_READS_SUM, - 'pfReadsSum' : dataSetProperties.result[i].properties.PF_READS_SUM, - 'rawYieldMbases' : dataSetProperties.result[i].properties.RAW_YIELD_MBASES, - 'yieldMbases' : dataSetProperties.result[i].properties.YIELD_MBASES, - 'percRawClustersPerLane': parseFloat(dataSetProperties.result[i].properties.PERCENTAGE_RAW_CLUSTERS_PER_LANE), - 'pfMeanQualityScore' : parseFloat(dataSetProperties.result[i].properties.PFMEANQUALITYSCORE), - 'pfYieldq30Percentage' : parseFloat(dataSetProperties.result[i].properties.PFYIELDQ30PERCENTAGE) - }); - }; - }; - }); -}; - -function plotLaneTable (sumArray, withNOINDEX) { - - var laneTableStats = d3.select("body") - .append("table") - .attr("id", "tableStats") - .attr("class", "tableStats") - ; - header = {"Lane":1, "# of Samples":1, "Average Passed Filtering (PF)":1, "Sum Raw Reads":1, "Sum PF Reads":1, "Sum Raw Bases":1, - "Sum PF Bases":1, "Average Raw Clusters in % per Index":1, "Average PF Phred Score":1, "Average > 30 Phred Score":1 } - - // create the table header - var thead = laneTableStats.selectAll("th") - .data(d3.keys(header)) - .enter().append("th") - .text(function(d){return d}) - ; - - // create rows - var tr = laneTableStats.selectAll("tr") - .data(sumArray).enter().append("tr") - // cells - var td = tr.selectAll("td") - .data(function(d){return d3.values(d)}) - .enter().append("td") - .text(function(d) {if (isNumber(d)) {return formatThousands(d)}; return d;}) - .style("text-align", function(d){if (isNumber(d)) {return "right"} return "left"}) - ; -} - -function placeholder() { - -var space = d3.select("body") - .append("svg") - .attr("id", "placeholder") - .attr("width", 1500) - .attr("height", 50) - ; -} - -function calculateSum(statisticsArray, sampleCode, withNOINDEX) { - - var sums = [] - var averagePercFilteringPass = 0; - var sumRawReads = 0; - var sumPfReads = 0; - var sumRawYieldMbases = 0; - var sumYieldMbases = 0; - var averagePercRawClustersPerLane = 0; - var averagePfMeanQualityScore = 0; - var averagePfYieldq30Percentage = 0; - - for (var i = 0; i < statisticsArray.length; i++) { - // do not calculate with the NOINDEX reads - if ((typeof (statisticsArray[i].externalSampleName) == 'undefined') && withNOINDEX) { - continue; - } else { - - averagePercFilteringPass = averagePercFilteringPass + parseFloat(statisticsArray[i].percFilteringPass); - sumRawReads = sumRawReads + parseInt(statisticsArray[i].rawReadsSum); - sumPfReads = sumPfReads + parseInt(statisticsArray[i].pfReadsSum); - sumRawYieldMbases = sumRawYieldMbases + parseInt(statisticsArray[i].rawYieldMbases); - sumYieldMbases = sumYieldMbases + parseInt(statisticsArray[i].yieldMbases); - averagePercRawClustersPerLane = averagePercRawClustersPerLane + parseInt(statisticsArray[i].percRawClustersPerLane); - averagePfMeanQualityScore = averagePfMeanQualityScore + parseInt(statisticsArray[i].pfMeanQualityScore); - averagePfYieldq30Percentage = averagePfYieldq30Percentage + parseInt(statisticsArray[i].pfYieldq30Percentage); - } - } - if (withNOINDEX) {penalty = -1} else {penalty = 0} - - // added the Math.max function to make sure that there is no division by zero, - // can happen when a single sample is on a lane (no multiplexing) - averagePercFilteringPass = roundFloat(averagePercFilteringPass / Math.max((statisticsArray.length + penalty),1)); - averagePercRawClustersPerLane = roundFloat(averagePercRawClustersPerLane / Math.max((statisticsArray.length + penalty),1)); - averagePfMeanQualityScore = roundFloat(averagePfMeanQualityScore / Math.max((statisticsArray.length + penalty),1)); - averagePfYieldq30Percentage = roundFloat(averagePfYieldq30Percentage / Math.max((statisticsArray.length + penalty),1)); - - sums.push({ - 'lane' : sampleCode.split("/")[2].split(":")[1], - 'numberOfSamples' : statisticsArray.length, - 'averagePercFilteringPass' : averagePercFilteringPass, - 'rawReadsSum' : sumRawReads, - 'pfReadsSum' : sumPfReads, - 'rawYieldMbases' : sumRawYieldMbases, - 'yieldMbases' : sumYieldMbases, - 'percRawClustersPerLane': averagePercRawClustersPerLane, - 'pfMeanQualityScore' : averagePfMeanQualityScore, - 'pfYieldq30Percentage' : averagePfYieldq30Percentage - }); - return sums; -} - - - function downloadButton (buttonName) { - - var div = d3.select("body").append("button") - .attr("class", "btn-xs") - .attr("type", "submit") - .attr("id", "save_as" + buttonName) - .attr("value", "") - .text("Save") - ; - } - - function submit_download_form(output_format, svgName) - { - var rawSampleName = webAppContext.entityIdentifier - var split = rawSampleName.split(":") - var fc = split[0].split("/")[2] - var lane = split[1] - - // Get the d3js SVG element - var tmp = document.getElementById(svgName); - - if (output_format == "svg") { - - // Extract the data as SVG text string - var svg_xml = "<svg xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">" + (new XMLSerializer).serializeToString(tmp) + "</svg>"; - - var blob = new Blob([svg_xml], {type: "image/svg+xml;charset=utf-8"}); - } - if (output_format == "html") { - var html = "<html> <head> <title></title> <style type=\"text/css\">" + - "table.tableStats { font-family: sans-serif; font-size: 14px; border-collapse:collapse; }" + - ".tableStats th { padding:6px 10px; color:#444; font-weight:bold; text-shadow:1px 1px 1px #fff; border-bottom:2px solid #444; }" + - ".tableStats tr:nth-child(even) { background: WhiteSmoke; }" + - ".tableStats td { padding:0px 10px 10px 10px; }" + - "</style> </head> <body>" + - (new XMLSerializer).serializeToString(tmp) + - "</body> </html>" - var blob = new Blob([html], {type: "image/html;charset=utf-8"}); - } - if (output_format == "png") { - console.log("png") - } - - saveAs(blob, fc + "_" + svgName + "." + output_format); - - } - - </script> - </body> -</html> - diff --git a/deep_sequencing_unit/source/core-plugins/laneStatistics/1/as/webapps/cellStatistics/html/style.css b/deep_sequencing_unit/source/core-plugins/laneStatistics/1/as/webapps/cellStatistics/html/style.css deleted file mode 100644 index 985d8ac6db01436d9b470bd37405ff4fae6ca8cd..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/source/core-plugins/laneStatistics/1/as/webapps/cellStatistics/html/style.css +++ /dev/null @@ -1,47 +0,0 @@ - .axis path, - .axis line { - fill: none; - stroke: #000; - shape-rendering: crispEdges; - } - - .axis text { - font-family: sans-serif; - font-size: 10px; - } - - table.tableStats { - font-family: sans-serif; - font-size: 14px; - border-collapse:collapse; - } - - .tableStats th { - padding:6px 10px; - color:#444; - font-weight:bold; - text-shadow:1px 1px 1px #fff; - border-bottom:2px solid #444; - } - - .tableStats tr:nth-child(even) { - background: WhiteSmoke; - } - .tableStats td { - - padding:0px 10px 10px 10px; - - } - - div.tooltip { - position: absolute; - text-align: center; - width: 100px; - height: 42px; - padding: 2px; - font: 12px sans-serif; - background: LightSalmon; - border: 0px; - border-radius: 8px; - pointer-events: none; - } diff --git a/deep_sequencing_unit/source/core-plugins/laneStatistics/1/as/webapps/cellStatistics/plugin.properties b/deep_sequencing_unit/source/core-plugins/laneStatistics/1/as/webapps/cellStatistics/plugin.properties deleted file mode 100644 index 19629033996f81da35792956c089e964a1dac020..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/source/core-plugins/laneStatistics/1/as/webapps/cellStatistics/plugin.properties +++ /dev/null @@ -1,6 +0,0 @@ -# The properties file for an example webapps plugin -# This file has no properties defined because none need to be defined. -webapp-folder = html -openbisui-contexts = sample-details-view -sample-entity-types = ILLUMINA_FLOW_CELL -label = Flow Cell Statistics diff --git a/deep_sequencing_unit/source/core-plugins/laneStatistics/1/as/webapps/laneStatistics/html/d3.layout.js b/deep_sequencing_unit/source/core-plugins/laneStatistics/1/as/webapps/laneStatistics/html/d3.layout.js deleted file mode 100644 index 3bcbccefe6c45794b8d495bbb0c7ab66e74ffe61..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/source/core-plugins/laneStatistics/1/as/webapps/laneStatistics/html/d3.layout.js +++ /dev/null @@ -1 +0,0 @@ -d3.layout = {}; diff --git a/deep_sequencing_unit/source/core-plugins/laneStatistics/1/as/webapps/laneStatistics/html/d3.v3.min.js b/deep_sequencing_unit/source/core-plugins/laneStatistics/1/as/webapps/laneStatistics/html/d3.v3.min.js deleted file mode 100644 index e61102b596e392618a30b7fb9276e0a5b7b27939..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/source/core-plugins/laneStatistics/1/as/webapps/laneStatistics/html/d3.v3.min.js +++ /dev/null @@ -1,4 +0,0 @@ -(function(){function t(t){return t.target}function n(t){return t.source}function e(t,n){try{for(var e in n)Object.defineProperty(t.prototype,e,{value:n[e],enumerable:!1})}catch(r){t.prototype=n}}function r(t){for(var n=-1,e=t.length,r=[];e>++n;)r.push(t[n]);return r}function u(t){return Array.prototype.slice.call(t)}function i(){}function a(t){return t}function o(){return!0}function c(t){return"function"==typeof t?t:function(){return t}}function l(t,n,e){return function(){var r=e.apply(n,arguments);return arguments.length?t:r}}function s(t){return null!=t&&!isNaN(t)}function f(t){return t.length}function h(t){return t.trim().replace(/\s+/g," ")}function d(t){for(var n=1;t*n%1;)n*=10;return n}function g(t){return 1===t.length?function(n,e){t(null==n?e:null)}:t}function p(t){return t.responseText}function m(t){return JSON.parse(t.responseText)}function v(t){var n=document.createRange();return n.selectNode(document.body),n.createContextualFragment(t.responseText)}function y(t){return t.responseXML}function M(){}function b(t){function n(){for(var n,r=e,u=-1,i=r.length;i>++u;)(n=r[u].on)&&n.apply(this,arguments);return t}var e=[],r=new i;return n.on=function(n,u){var i,a=r.get(n);return 2>arguments.length?a&&a.on:(a&&(a.on=null,e=e.slice(0,i=e.indexOf(a)).concat(e.slice(i+1)),r.remove(n)),u&&e.push(r.set(n,{on:u})),t)},n}function x(t,n){return n-(t?1+Math.floor(Math.log(t+Math.pow(10,1+Math.floor(Math.log(t)/Math.LN10)-n))/Math.LN10):1)}function _(t){return t+""}function w(t,n){var e=Math.pow(10,3*Math.abs(8-n));return{scale:n>8?function(t){return t/e}:function(t){return t*e},symbol:t}}function S(t){return function(n){return 0>=n?0:n>=1?1:t(n)}}function k(t){return function(n){return 1-t(1-n)}}function E(t){return function(n){return.5*(.5>n?t(2*n):2-t(2-2*n))}}function A(t){return t*t}function N(t){return t*t*t}function T(t){if(0>=t)return 0;if(t>=1)return 1;var n=t*t,e=n*t;return 4*(.5>t?e:3*(t-n)+e-.75)}function q(t){return function(n){return Math.pow(n,t)}}function C(t){return 1-Math.cos(t*Ri/2)}function z(t){return Math.pow(2,10*(t-1))}function D(t){return 1-Math.sqrt(1-t*t)}function L(t,n){var e;return 2>arguments.length&&(n=.45),arguments.length?e=n/(2*Ri)*Math.asin(1/t):(t=1,e=n/4),function(r){return 1+t*Math.pow(2,10*-r)*Math.sin(2*(r-e)*Ri/n)}}function F(t){return t||(t=1.70158),function(n){return n*n*((t+1)*n-t)}}function H(t){return 1/2.75>t?7.5625*t*t:2/2.75>t?7.5625*(t-=1.5/2.75)*t+.75:2.5/2.75>t?7.5625*(t-=2.25/2.75)*t+.9375:7.5625*(t-=2.625/2.75)*t+.984375}function R(){d3.event.stopPropagation(),d3.event.preventDefault()}function P(){for(var t,n=d3.event;t=n.sourceEvent;)n=t;return n}function j(t){for(var n=new M,e=0,r=arguments.length;r>++e;)n[arguments[e]]=b(n);return n.of=function(e,r){return function(u){try{var i=u.sourceEvent=d3.event;u.target=t,d3.event=u,n[u.type].apply(e,r)}finally{d3.event=i}}},n}function O(t){var n=[t.a,t.b],e=[t.c,t.d],r=U(n),u=Y(n,e),i=U(I(e,n,-u))||0;n[0]*e[1]<e[0]*n[1]&&(n[0]*=-1,n[1]*=-1,r*=-1,u*=-1),this.rotate=(r?Math.atan2(n[1],n[0]):Math.atan2(-e[0],e[1]))*Oi,this.translate=[t.e,t.f],this.scale=[r,i],this.skew=i?Math.atan2(u,i)*Oi:0}function Y(t,n){return t[0]*n[0]+t[1]*n[1]}function U(t){var n=Math.sqrt(Y(t,t));return n&&(t[0]/=n,t[1]/=n),n}function I(t,n,e){return t[0]+=e*n[0],t[1]+=e*n[1],t}function V(t){return"transform"==t?d3.interpolateTransform:d3.interpolate}function X(t,n){return n=n-(t=+t)?1/(n-t):0,function(e){return(e-t)*n}}function Z(t,n){return n=n-(t=+t)?1/(n-t):0,function(e){return Math.max(0,Math.min(1,(e-t)*n))}}function B(){}function $(t,n,e){return new J(t,n,e)}function J(t,n,e){this.r=t,this.g=n,this.b=e}function G(t){return 16>t?"0"+Math.max(0,t).toString(16):Math.min(255,t).toString(16)}function K(t,n,e){var r,u,i,a=0,o=0,c=0;if(r=/([a-z]+)\((.*)\)/i.exec(t))switch(u=r[2].split(","),r[1]){case"hsl":return e(parseFloat(u[0]),parseFloat(u[1])/100,parseFloat(u[2])/100);case"rgb":return n(nn(u[0]),nn(u[1]),nn(u[2]))}return(i=aa.get(t))?n(i.r,i.g,i.b):(null!=t&&"#"===t.charAt(0)&&(4===t.length?(a=t.charAt(1),a+=a,o=t.charAt(2),o+=o,c=t.charAt(3),c+=c):7===t.length&&(a=t.substring(1,3),o=t.substring(3,5),c=t.substring(5,7)),a=parseInt(a,16),o=parseInt(o,16),c=parseInt(c,16)),n(a,o,c))}function W(t,n,e){var r,u,i=Math.min(t/=255,n/=255,e/=255),a=Math.max(t,n,e),o=a-i,c=(a+i)/2;return o?(u=.5>c?o/(a+i):o/(2-a-i),r=t==a?(n-e)/o+(e>n?6:0):n==a?(e-t)/o+2:(t-n)/o+4,r*=60):u=r=0,en(r,u,c)}function Q(t,n,e){t=tn(t),n=tn(n),e=tn(e);var r=gn((.4124564*t+.3575761*n+.1804375*e)/sa),u=gn((.2126729*t+.7151522*n+.072175*e)/fa),i=gn((.0193339*t+.119192*n+.9503041*e)/ha);return ln(116*u-16,500*(r-u),200*(u-i))}function tn(t){return.04045>=(t/=255)?t/12.92:Math.pow((t+.055)/1.055,2.4)}function nn(t){var n=parseFloat(t);return"%"===t.charAt(t.length-1)?Math.round(2.55*n):n}function en(t,n,e){return new rn(t,n,e)}function rn(t,n,e){this.h=t,this.s=n,this.l=e}function un(t,n,e){function r(t){return t>360?t-=360:0>t&&(t+=360),60>t?i+(a-i)*t/60:180>t?a:240>t?i+(a-i)*(240-t)/60:i}function u(t){return Math.round(255*r(t))}var i,a;return t%=360,0>t&&(t+=360),n=0>n?0:n>1?1:n,e=0>e?0:e>1?1:e,a=.5>=e?e*(1+n):e+n-e*n,i=2*e-a,$(u(t+120),u(t),u(t-120))}function an(t,n,e){return new on(t,n,e)}function on(t,n,e){this.h=t,this.c=n,this.l=e}function cn(t,n,e){return ln(e,Math.cos(t*=ji)*n,Math.sin(t)*n)}function ln(t,n,e){return new sn(t,n,e)}function sn(t,n,e){this.l=t,this.a=n,this.b=e}function fn(t,n,e){var r=(t+16)/116,u=r+n/500,i=r-e/200;return u=dn(u)*sa,r=dn(r)*fa,i=dn(i)*ha,$(pn(3.2404542*u-1.5371385*r-.4985314*i),pn(-.969266*u+1.8760108*r+.041556*i),pn(.0556434*u-.2040259*r+1.0572252*i))}function hn(t,n,e){return an(180*(Math.atan2(e,n)/Ri),Math.sqrt(n*n+e*e),t)}function dn(t){return t>.206893034?t*t*t:(t-4/29)/7.787037}function gn(t){return t>.008856?Math.pow(t,1/3):7.787037*t+4/29}function pn(t){return Math.round(255*(.00304>=t?12.92*t:1.055*Math.pow(t,1/2.4)-.055))}function mn(t){return Ii(t,Ma),t}function vn(t){return function(){return ga(t,this)}}function yn(t){return function(){return pa(t,this)}}function Mn(t,n){function e(){this.removeAttribute(t)}function r(){this.removeAttributeNS(t.space,t.local)}function u(){this.setAttribute(t,n)}function i(){this.setAttributeNS(t.space,t.local,n)}function a(){var e=n.apply(this,arguments);null==e?this.removeAttribute(t):this.setAttribute(t,e)}function o(){var e=n.apply(this,arguments);null==e?this.removeAttributeNS(t.space,t.local):this.setAttributeNS(t.space,t.local,e)}return t=d3.ns.qualify(t),null==n?t.local?r:e:"function"==typeof n?t.local?o:a:t.local?i:u}function bn(t){return RegExp("(?:^|\\s+)"+d3.requote(t)+"(?:\\s+|$)","g")}function xn(t,n){function e(){for(var e=-1;u>++e;)t[e](this,n)}function r(){for(var e=-1,r=n.apply(this,arguments);u>++e;)t[e](this,r)}t=t.trim().split(/\s+/).map(_n);var u=t.length;return"function"==typeof n?r:e}function _n(t){var n=bn(t);return function(e,r){if(u=e.classList)return r?u.add(t):u.remove(t);var u=e.className,i=null!=u.baseVal,a=i?u.baseVal:u;r?(n.lastIndex=0,n.test(a)||(a=h(a+" "+t),i?u.baseVal=a:e.className=a)):a&&(a=h(a.replace(n," ")),i?u.baseVal=a:e.className=a)}}function wn(t,n,e){function r(){this.style.removeProperty(t)}function u(){this.style.setProperty(t,n,e)}function i(){var r=n.apply(this,arguments);null==r?this.style.removeProperty(t):this.style.setProperty(t,r,e)}return null==n?r:"function"==typeof n?i:u}function Sn(t,n){function e(){delete this[t]}function r(){this[t]=n}function u(){var e=n.apply(this,arguments);null==e?delete this[t]:this[t]=e}return null==n?e:"function"==typeof n?u:r}function kn(t){return{__data__:t}}function En(t){return function(){return ya(this,t)}}function An(t){return arguments.length||(t=d3.ascending),function(n,e){return t(n&&n.__data__,e&&e.__data__)}}function Nn(t,n,e){function r(){var n=this[i];n&&(this.removeEventListener(t,n,n.$),delete this[i])}function u(){function u(t){var e=d3.event;d3.event=t,o[0]=a.__data__;try{n.apply(a,o)}finally{d3.event=e}}var a=this,o=Yi(arguments);r.call(this),this.addEventListener(t,this[i]=u,u.$=e),u._=n}var i="__on"+t,a=t.indexOf(".");return a>0&&(t=t.substring(0,a)),n?u:r}function Tn(t,n){for(var e=0,r=t.length;r>e;e++)for(var u,i=t[e],a=0,o=i.length;o>a;a++)(u=i[a])&&n(u,a,e);return t}function qn(t){return Ii(t,xa),t}function Cn(t,n){return Ii(t,wa),t.id=n,t}function zn(t,n,e,r){var u=t.__transition__||(t.__transition__={active:0,count:0}),a=u[e];if(!a){var o=r.time;return a=u[e]={tween:new i,event:d3.dispatch("start","end"),time:o,ease:r.ease,delay:r.delay,duration:r.duration},++u.count,d3.timer(function(r){function i(r){return u.active>e?l():(u.active=e,h.start.call(t,s,n),a.tween.forEach(function(e,r){(r=r.call(t,s,n))&&p.push(r)}),c(r)||d3.timer(c,0,o),1)}function c(r){if(u.active!==e)return l();for(var i=(r-d)/g,a=f(i),o=p.length;o>0;)p[--o].call(t,a);return i>=1?(l(),h.end.call(t,s,n),1):void 0}function l(){return--u.count?delete u[e]:delete t.__transition__,1}var s=t.__data__,f=a.ease,h=a.event,d=a.delay,g=a.duration,p=[];return r>=d?i(r):d3.timer(i,d,o),1},0,o),a}}function Dn(t){return null==t&&(t=""),function(){this.textContent=t}}function Ln(t,n,e,r){var u=t.id;return Tn(t,"function"==typeof e?function(t,i,a){t.__transition__[u].tween.set(n,r(e.call(t,t.__data__,i,a)))}:(e=r(e),function(t){t.__transition__[u].tween.set(n,e)}))}function Fn(){for(var t,n=Date.now(),e=qa;e;)t=n-e.then,t>=e.delay&&(e.flush=e.callback(t)),e=e.next;var r=Hn()-n;r>24?(isFinite(r)&&(clearTimeout(Aa),Aa=setTimeout(Fn,r)),Ea=0):(Ea=1,Ca(Fn))}function Hn(){for(var t=null,n=qa,e=1/0;n;)n.flush?(delete Ta[n.callback.id],n=t?t.next=n.next:qa=n.next):(e=Math.min(e,n.then+n.delay),n=(t=n).next);return e}function Rn(t,n){var e=t.ownerSVGElement||t;if(e.createSVGPoint){var r=e.createSVGPoint();if(0>za&&(window.scrollX||window.scrollY)){e=d3.select(document.body).append("svg").style("position","absolute").style("top",0).style("left",0);var u=e[0][0].getScreenCTM();za=!(u.f||u.e),e.remove()}return za?(r.x=n.pageX,r.y=n.pageY):(r.x=n.clientX,r.y=n.clientY),r=r.matrixTransform(t.getScreenCTM().inverse()),[r.x,r.y]}var i=t.getBoundingClientRect();return[n.clientX-i.left-t.clientLeft,n.clientY-i.top-t.clientTop]}function Pn(){}function jn(t){var n=t[0],e=t[t.length-1];return e>n?[n,e]:[e,n]}function On(t){return t.rangeExtent?t.rangeExtent():jn(t.range())}function Yn(t,n){var e,r=0,u=t.length-1,i=t[r],a=t[u];return i>a&&(e=r,r=u,u=e,e=i,i=a,a=e),(n=n(a-i))&&(t[r]=n.floor(i),t[u]=n.ceil(a)),t}function Un(){return Math}function In(t,n,e,r){function u(){var u=Math.min(t.length,n.length)>2?Gn:Jn,c=r?Z:X;return a=u(t,n,c,e),o=u(n,t,c,d3.interpolate),i}function i(t){return a(t)}var a,o;return i.invert=function(t){return o(t)},i.domain=function(n){return arguments.length?(t=n.map(Number),u()):t},i.range=function(t){return arguments.length?(n=t,u()):n},i.rangeRound=function(t){return i.range(t).interpolate(d3.interpolateRound)},i.clamp=function(t){return arguments.length?(r=t,u()):r},i.interpolate=function(t){return arguments.length?(e=t,u()):e},i.ticks=function(n){return Bn(t,n)},i.tickFormat=function(n){return $n(t,n)},i.nice=function(){return Yn(t,Xn),u()},i.copy=function(){return In(t,n,e,r)},u()}function Vn(t,n){return d3.rebind(t,n,"range","rangeRound","interpolate","clamp")}function Xn(t){return t=Math.pow(10,Math.round(Math.log(t)/Math.LN10)-1),t&&{floor:function(n){return Math.floor(n/t)*t},ceil:function(n){return Math.ceil(n/t)*t}}}function Zn(t,n){var e=jn(t),r=e[1]-e[0],u=Math.pow(10,Math.floor(Math.log(r/n)/Math.LN10)),i=n/r*u;return.15>=i?u*=10:.35>=i?u*=5:.75>=i&&(u*=2),e[0]=Math.ceil(e[0]/u)*u,e[1]=Math.floor(e[1]/u)*u+.5*u,e[2]=u,e}function Bn(t,n){return d3.range.apply(d3,Zn(t,n))}function $n(t,n){return d3.format(",."+Math.max(0,-Math.floor(Math.log(Zn(t,n)[2])/Math.LN10+.01))+"f")}function Jn(t,n,e,r){var u=e(t[0],t[1]),i=r(n[0],n[1]);return function(t){return i(u(t))}}function Gn(t,n,e,r){var u=[],i=[],a=0,o=Math.min(t.length,n.length)-1;for(t[o]<t[0]&&(t=t.slice().reverse(),n=n.slice().reverse());o>=++a;)u.push(e(t[a-1],t[a])),i.push(r(n[a-1],n[a]));return function(n){var e=d3.bisect(t,n,1,o)-1;return i[e](u[e](n))}}function Kn(t,n){function e(e){return t(n(e))}var r=n.pow;return e.invert=function(n){return r(t.invert(n))},e.domain=function(u){return arguments.length?(n=0>u[0]?Qn:Wn,r=n.pow,t.domain(u.map(n)),e):t.domain().map(r)},e.nice=function(){return t.domain(Yn(t.domain(),Un)),e},e.ticks=function(){var e=jn(t.domain()),u=[];if(e.every(isFinite)){var i=Math.floor(e[0]),a=Math.ceil(e[1]),o=r(e[0]),c=r(e[1]);if(n===Qn)for(u.push(r(i));a>i++;)for(var l=9;l>0;l--)u.push(r(i)*l);else{for(;a>i;i++)for(var l=1;10>l;l++)u.push(r(i)*l);u.push(r(i))}for(i=0;o>u[i];i++);for(a=u.length;u[a-1]>c;a--);u=u.slice(i,a)}return u},e.tickFormat=function(t,u){if(2>arguments.length&&(u=Da),!arguments.length)return u;var i,a=Math.max(.1,t/e.ticks().length),o=n===Qn?(i=-1e-12,Math.floor):(i=1e-12,Math.ceil);return function(t){return a>=t/r(o(n(t)+i))?u(t):""}},e.copy=function(){return Kn(t.copy(),n)},Vn(e,t)}function Wn(t){return Math.log(0>t?0:t)/Math.LN10}function Qn(t){return-Math.log(t>0?0:-t)/Math.LN10}function te(t,n){function e(n){return t(r(n))}var r=ne(n),u=ne(1/n);return e.invert=function(n){return u(t.invert(n))},e.domain=function(n){return arguments.length?(t.domain(n.map(r)),e):t.domain().map(u)},e.ticks=function(t){return Bn(e.domain(),t)},e.tickFormat=function(t){return $n(e.domain(),t)},e.nice=function(){return e.domain(Yn(e.domain(),Xn))},e.exponent=function(t){if(!arguments.length)return n;var i=e.domain();return r=ne(n=t),u=ne(1/n),e.domain(i)},e.copy=function(){return te(t.copy(),n)},Vn(e,t)}function ne(t){return function(n){return 0>n?-Math.pow(-n,t):Math.pow(n,t)}}function ee(t,n){function e(n){return a[((u.get(n)||u.set(n,t.push(n)))-1)%a.length]}function r(n,e){return d3.range(t.length).map(function(t){return n+e*t})}var u,a,o;return e.domain=function(r){if(!arguments.length)return t;t=[],u=new i;for(var a,o=-1,c=r.length;c>++o;)u.has(a=r[o])||u.set(a,t.push(a));return e[n.t].apply(e,n.a)},e.range=function(t){return arguments.length?(a=t,o=0,n={t:"range",a:arguments},e):a},e.rangePoints=function(u,i){2>arguments.length&&(i=0);var c=u[0],l=u[1],s=(l-c)/(Math.max(1,t.length-1)+i);return a=r(2>t.length?(c+l)/2:c+s*i/2,s),o=0,n={t:"rangePoints",a:arguments},e},e.rangeBands=function(u,i,c){2>arguments.length&&(i=0),3>arguments.length&&(c=i);var l=u[1]<u[0],s=u[l-0],f=u[1-l],h=(f-s)/(t.length-i+2*c);return a=r(s+h*c,h),l&&a.reverse(),o=h*(1-i),n={t:"rangeBands",a:arguments},e},e.rangeRoundBands=function(u,i,c){2>arguments.length&&(i=0),3>arguments.length&&(c=i);var l=u[1]<u[0],s=u[l-0],f=u[1-l],h=Math.floor((f-s)/(t.length-i+2*c)),d=f-s-(t.length-i)*h;return a=r(s+Math.round(d/2),h),l&&a.reverse(),o=Math.round(h*(1-i)),n={t:"rangeRoundBands",a:arguments},e},e.rangeBand=function(){return o},e.rangeExtent=function(){return jn(n.a[0])},e.copy=function(){return ee(t,n)},e.domain(t)}function re(t,n){function e(){var e=0,i=n.length;for(u=[];i>++e;)u[e-1]=d3.quantile(t,e/i);return r}function r(t){return isNaN(t=+t)?0/0:n[d3.bisect(u,t)]}var u;return r.domain=function(n){return arguments.length?(t=n.filter(function(t){return!isNaN(t)}).sort(d3.ascending),e()):t},r.range=function(t){return arguments.length?(n=t,e()):n},r.quantiles=function(){return u},r.copy=function(){return re(t,n)},e()}function ue(t,n,e){function r(n){return e[Math.max(0,Math.min(a,Math.floor(i*(n-t))))]}function u(){return i=e.length/(n-t),a=e.length-1,r}var i,a;return r.domain=function(e){return arguments.length?(t=+e[0],n=+e[e.length-1],u()):[t,n]},r.range=function(t){return arguments.length?(e=t,u()):e},r.copy=function(){return ue(t,n,e)},u()}function ie(t,n){function e(e){return n[d3.bisect(t,e)]}return e.domain=function(n){return arguments.length?(t=n,e):t},e.range=function(t){return arguments.length?(n=t,e):n},e.copy=function(){return ie(t,n)},e}function ae(t){function n(t){return+t}return n.invert=n,n.domain=n.range=function(e){return arguments.length?(t=e.map(n),n):t},n.ticks=function(n){return Bn(t,n)},n.tickFormat=function(n){return $n(t,n)},n.copy=function(){return ae(t)},n}function oe(t){return t.innerRadius}function ce(t){return t.outerRadius}function le(t){return t.startAngle}function se(t){return t.endAngle}function fe(t){function n(n){function a(){s.push("M",i(t(f),l))}for(var o,s=[],f=[],h=-1,d=n.length,g=c(e),p=c(r);d>++h;)u.call(this,o=n[h],h)?f.push([+g.call(this,o,h),+p.call(this,o,h)]):f.length&&(a(),f=[]);return f.length&&a(),s.length?s.join(""):null}var e=he,r=de,u=o,i=ge,a=i.key,l=.7;return n.x=function(t){return arguments.length?(e=t,n):e},n.y=function(t){return arguments.length?(r=t,n):r},n.defined=function(t){return arguments.length?(u=t,n):u},n.interpolate=function(t){return arguments.length?(a="function"==typeof t?i=t:(i=Oa.get(t)||ge).key,n):a},n.tension=function(t){return arguments.length?(l=t,n):l},n}function he(t){return t[0]}function de(t){return t[1]}function ge(t){return t.join("L")}function pe(t){return ge(t)+"Z"}function me(t){for(var n=0,e=t.length,r=t[0],u=[r[0],",",r[1]];e>++n;)u.push("V",(r=t[n])[1],"H",r[0]);return u.join("")}function ve(t){for(var n=0,e=t.length,r=t[0],u=[r[0],",",r[1]];e>++n;)u.push("H",(r=t[n])[0],"V",r[1]);return u.join("")}function ye(t,n){return 4>t.length?ge(t):t[1]+xe(t.slice(1,t.length-1),_e(t,n))}function Me(t,n){return 3>t.length?ge(t):t[0]+xe((t.push(t[0]),t),_e([t[t.length-2]].concat(t,[t[1]]),n))}function be(t,n){return 3>t.length?ge(t):t[0]+xe(t,_e(t,n))}function xe(t,n){if(1>n.length||t.length!=n.length&&t.length!=n.length+2)return ge(t);var e=t.length!=n.length,r="",u=t[0],i=t[1],a=n[0],o=a,c=1;if(e&&(r+="Q"+(i[0]-2*a[0]/3)+","+(i[1]-2*a[1]/3)+","+i[0]+","+i[1],u=t[1],c=2),n.length>1){o=n[1],i=t[c],c++,r+="C"+(u[0]+a[0])+","+(u[1]+a[1])+","+(i[0]-o[0])+","+(i[1]-o[1])+","+i[0]+","+i[1];for(var l=2;n.length>l;l++,c++)i=t[c],o=n[l],r+="S"+(i[0]-o[0])+","+(i[1]-o[1])+","+i[0]+","+i[1]}if(e){var s=t[c];r+="Q"+(i[0]+2*o[0]/3)+","+(i[1]+2*o[1]/3)+","+s[0]+","+s[1]}return r}function _e(t,n){for(var e,r=[],u=(1-n)/2,i=t[0],a=t[1],o=1,c=t.length;c>++o;)e=i,i=a,a=t[o],r.push([u*(a[0]-e[0]),u*(a[1]-e[1])]);return r}function we(t){if(3>t.length)return ge(t);var n=1,e=t.length,r=t[0],u=r[0],i=r[1],a=[u,u,u,(r=t[1])[0]],o=[i,i,i,r[1]],c=[u,",",i];for(Ne(c,a,o);e>++n;)r=t[n],a.shift(),a.push(r[0]),o.shift(),o.push(r[1]),Ne(c,a,o);for(n=-1;2>++n;)a.shift(),a.push(r[0]),o.shift(),o.push(r[1]),Ne(c,a,o);return c.join("")}function Se(t){if(4>t.length)return ge(t);for(var n,e=[],r=-1,u=t.length,i=[0],a=[0];3>++r;)n=t[r],i.push(n[0]),a.push(n[1]);for(e.push(Ae(Ia,i)+","+Ae(Ia,a)),--r;u>++r;)n=t[r],i.shift(),i.push(n[0]),a.shift(),a.push(n[1]),Ne(e,i,a);return e.join("")}function ke(t){for(var n,e,r=-1,u=t.length,i=u+4,a=[],o=[];4>++r;)e=t[r%u],a.push(e[0]),o.push(e[1]);for(n=[Ae(Ia,a),",",Ae(Ia,o)],--r;i>++r;)e=t[r%u],a.shift(),a.push(e[0]),o.shift(),o.push(e[1]),Ne(n,a,o);return n.join("")}function Ee(t,n){var e=t.length-1;if(e)for(var r,u,i=t[0][0],a=t[0][1],o=t[e][0]-i,c=t[e][1]-a,l=-1;e>=++l;)r=t[l],u=l/e,r[0]=n*r[0]+(1-n)*(i+u*o),r[1]=n*r[1]+(1-n)*(a+u*c);return we(t)}function Ae(t,n){return t[0]*n[0]+t[1]*n[1]+t[2]*n[2]+t[3]*n[3]}function Ne(t,n,e){t.push("C",Ae(Ya,n),",",Ae(Ya,e),",",Ae(Ua,n),",",Ae(Ua,e),",",Ae(Ia,n),",",Ae(Ia,e))}function Te(t,n){return(n[1]-t[1])/(n[0]-t[0])}function qe(t){for(var n=0,e=t.length-1,r=[],u=t[0],i=t[1],a=r[0]=Te(u,i);e>++n;)r[n]=(a+(a=Te(u=i,i=t[n+1])))/2;return r[n]=a,r}function Ce(t){for(var n,e,r,u,i=[],a=qe(t),o=-1,c=t.length-1;c>++o;)n=Te(t[o],t[o+1]),1e-6>Math.abs(n)?a[o]=a[o+1]=0:(e=a[o]/n,r=a[o+1]/n,u=e*e+r*r,u>9&&(u=3*n/Math.sqrt(u),a[o]=u*e,a[o+1]=u*r));for(o=-1;c>=++o;)u=(t[Math.min(c,o+1)][0]-t[Math.max(0,o-1)][0])/(6*(1+a[o]*a[o])),i.push([u||0,a[o]*u||0]);return i}function ze(t){return 3>t.length?ge(t):t[0]+xe(t,Ce(t))}function De(t){for(var n,e,r,u=-1,i=t.length;i>++u;)n=t[u],e=n[0],r=n[1]+Pa,n[0]=e*Math.cos(r),n[1]=e*Math.sin(r);return t}function Le(t){function n(n){function o(){m.push("M",l(t(y),d),h,f(t(v.reverse()),d),"Z")}for(var s,g,p,m=[],v=[],y=[],M=-1,b=n.length,x=c(e),_=c(u),w=e===r?function(){return g}:c(r),S=u===i?function(){return p}:c(i);b>++M;)a.call(this,s=n[M],M)?(v.push([g=+x.call(this,s,M),p=+_.call(this,s,M)]),y.push([+w.call(this,s,M),+S.call(this,s,M)])):v.length&&(o(),v=[],y=[]);return v.length&&o(),m.length?m.join(""):null}var e=he,r=he,u=0,i=de,a=o,l=ge,s=l.key,f=l,h="L",d=.7;return n.x=function(t){return arguments.length?(e=r=t,n):r},n.x0=function(t){return arguments.length?(e=t,n):e},n.x1=function(t){return arguments.length?(r=t,n):r},n.y=function(t){return arguments.length?(u=i=t,n):i},n.y0=function(t){return arguments.length?(u=t,n):u},n.y1=function(t){return arguments.length?(i=t,n):i},n.defined=function(t){return arguments.length?(a=t,n):a},n.interpolate=function(t){return arguments.length?(s="function"==typeof t?l=t:(l=Oa.get(t)||ge).key,f=l.reverse||l,h=l.closed?"M":"L",n):s},n.tension=function(t){return arguments.length?(d=t,n):d},n}function Fe(t){return t.radius}function He(t){return[t.x,t.y]}function Re(t){return function(){var n=t.apply(this,arguments),e=n[0],r=n[1]+Pa;return[e*Math.cos(r),e*Math.sin(r)]}}function Pe(){return 64}function je(){return"circle"}function Oe(t){var n=Math.sqrt(t/Ri);return"M0,"+n+"A"+n+","+n+" 0 1,1 0,"+-n+"A"+n+","+n+" 0 1,1 0,"+n+"Z"}function Ye(t,n){t.attr("transform",function(t){return"translate("+n(t)+",0)"})}function Ue(t,n){t.attr("transform",function(t){return"translate(0,"+n(t)+")"})}function Ie(t,n,e){if(r=[],e&&n.length>1){for(var r,u,i,a=jn(t.domain()),o=-1,c=n.length,l=(n[1]-n[0])/++e;c>++o;)for(u=e;--u>0;)(i=+n[o]-u*l)>=a[0]&&r.push(i);for(--o,u=0;e>++u&&(i=+n[o]+u*l)<a[1];)r.push(i)}return r}function Ve(){Ja||(Ja=d3.select("body").append("div").style("visibility","hidden").style("top",0).style("height",0).style("width",0).style("overflow-y","scroll").append("div").style("height","2000px").node().parentNode);var t,n=d3.event;try{Ja.scrollTop=1e3,Ja.dispatchEvent(n),t=1e3-Ja.scrollTop}catch(e){t=n.wheelDelta||5*-n.detail}return t}function Xe(t){for(var n=t.source,e=t.target,r=Be(n,e),u=[n];n!==r;)n=n.parent,u.push(n);for(var i=u.length;e!==r;)u.splice(i,0,e),e=e.parent;return u}function Ze(t){for(var n=[],e=t.parent;null!=e;)n.push(t),t=e,e=e.parent;return n.push(t),n}function Be(t,n){if(t===n)return t;for(var e=Ze(t),r=Ze(n),u=e.pop(),i=r.pop(),a=null;u===i;)a=u,u=e.pop(),i=r.pop();return a}function $e(t){t.fixed|=2}function Je(t){t.fixed&=1}function Ge(t){t.fixed|=4,t.px=t.x,t.py=t.y}function Ke(t){t.fixed&=3}function We(t,n,e){var r=0,u=0;if(t.charge=0,!t.leaf)for(var i,a=t.nodes,o=a.length,c=-1;o>++c;)i=a[c],null!=i&&(We(i,n,e),t.charge+=i.charge,r+=i.charge*i.cx,u+=i.charge*i.cy);if(t.point){t.leaf||(t.point.x+=Math.random()-.5,t.point.y+=Math.random()-.5);var l=n*e[t.point.index];t.charge+=t.pointCharge=l,r+=l*t.point.x,u+=l*t.point.y}t.cx=r/t.charge,t.cy=u/t.charge}function Qe(){return 20}function tr(){return 1}function nr(t){return t.x}function er(t){return t.y}function rr(t,n,e){t.y0=n,t.y=e}function ur(t){return d3.range(t.length)}function ir(t){for(var n=-1,e=t[0].length,r=[];e>++n;)r[n]=0;return r}function ar(t){for(var n,e=1,r=0,u=t[0][1],i=t.length;i>e;++e)(n=t[e][1])>u&&(r=e,u=n);return r}function or(t){return t.reduce(cr,0)}function cr(t,n){return t+n[1]}function lr(t,n){return sr(t,Math.ceil(Math.log(n.length)/Math.LN2+1))}function sr(t,n){for(var e=-1,r=+t[0],u=(t[1]-r)/n,i=[];n>=++e;)i[e]=u*e+r;return i}function fr(t){return[d3.min(t),d3.max(t)]}function hr(t,n){return d3.rebind(t,n,"sort","children","value"),t.nodes=t,t.links=mr,t}function dr(t){return t.children}function gr(t){return t.value}function pr(t,n){return n.value-t.value}function mr(t){return d3.merge(t.map(function(t){return(t.children||[]).map(function(n){return{source:t,target:n}})}))}function vr(t,n){return t.value-n.value}function yr(t,n){var e=t._pack_next;t._pack_next=n,n._pack_prev=t,n._pack_next=e,e._pack_prev=n}function Mr(t,n){t._pack_next=n,n._pack_prev=t}function br(t,n){var e=n.x-t.x,r=n.y-t.y,u=t.r+n.r;return u*u-e*e-r*r>.001}function xr(t){function n(t){s=Math.min(t.x-t.r,s),f=Math.max(t.x+t.r,f),h=Math.min(t.y-t.r,h),d=Math.max(t.y+t.r,d)}if((e=t.children)&&(l=e.length)){var e,r,u,i,a,o,c,l,s=1/0,f=-1/0,h=1/0,d=-1/0;if(e.forEach(_r),r=e[0],r.x=-r.r,r.y=0,n(r),l>1&&(u=e[1],u.x=u.r,u.y=0,n(u),l>2))for(i=e[2],kr(r,u,i),n(i),yr(r,i),r._pack_prev=i,yr(i,u),u=r._pack_next,a=3;l>a;a++){kr(r,u,i=e[a]);var g=0,p=1,m=1;for(o=u._pack_next;o!==u;o=o._pack_next,p++)if(br(o,i)){g=1;break}if(1==g)for(c=r._pack_prev;c!==o._pack_prev&&!br(c,i);c=c._pack_prev,m++);g?(m>p||p==m&&u.r<r.r?Mr(r,u=o):Mr(r=c,u),a--):(yr(r,i),u=i,n(i))}var v=(s+f)/2,y=(h+d)/2,M=0;for(a=0;l>a;a++)i=e[a],i.x-=v,i.y-=y,M=Math.max(M,i.r+Math.sqrt(i.x*i.x+i.y*i.y));t.r=M,e.forEach(wr)}}function _r(t){t._pack_next=t._pack_prev=t}function wr(t){delete t._pack_next,delete t._pack_prev}function Sr(t,n,e,r){var u=t.children;if(t.x=n+=r*t.x,t.y=e+=r*t.y,t.r*=r,u)for(var i=-1,a=u.length;a>++i;)Sr(u[i],n,e,r)}function kr(t,n,e){var r=t.r+e.r,u=n.x-t.x,i=n.y-t.y;if(r&&(u||i)){var a=n.r+e.r,o=u*u+i*i;a*=a,r*=r;var c=.5+(r-a)/(2*o),l=Math.sqrt(Math.max(0,2*a*(r+o)-(r-=o)*r-a*a))/(2*o);e.x=t.x+c*u+l*i,e.y=t.y+c*i-l*u}else e.x=t.x+r,e.y=t.y}function Er(t){return 1+d3.max(t,function(t){return t.y})}function Ar(t){return t.reduce(function(t,n){return t+n.x},0)/t.length}function Nr(t){var n=t.children;return n&&n.length?Nr(n[0]):t}function Tr(t){var n,e=t.children;return e&&(n=e.length)?Tr(e[n-1]):t}function qr(t,n){return t.parent==n.parent?1:2}function Cr(t){var n=t.children;return n&&n.length?n[0]:t._tree.thread}function zr(t){var n,e=t.children;return e&&(n=e.length)?e[n-1]:t._tree.thread}function Dr(t,n){var e=t.children;if(e&&(u=e.length))for(var r,u,i=-1;u>++i;)n(r=Dr(e[i],n),t)>0&&(t=r);return t}function Lr(t,n){return t.x-n.x}function Fr(t,n){return n.x-t.x}function Hr(t,n){return t.depth-n.depth}function Rr(t,n){function e(t,r){var u=t.children;if(u&&(a=u.length))for(var i,a,o=null,c=-1;a>++c;)i=u[c],e(i,o),o=i;n(t,r)}e(t,null)}function Pr(t){for(var n,e=0,r=0,u=t.children,i=u.length;--i>=0;)n=u[i]._tree,n.prelim+=e,n.mod+=e,e+=n.shift+(r+=n.change)}function jr(t,n,e){t=t._tree,n=n._tree;var r=e/(n.number-t.number);t.change+=r,n.change-=r,n.shift+=e,n.prelim+=e,n.mod+=e}function Or(t,n,e){return t._tree.ancestor.parent==n.parent?t._tree.ancestor:e}function Yr(t){return{x:t.x,y:t.y,dx:t.dx,dy:t.dy}}function Ur(t,n){var e=t.x+n[3],r=t.y+n[0],u=t.dx-n[1]-n[3],i=t.dy-n[0]-n[2];return 0>u&&(e+=u/2,u=0),0>i&&(r+=i/2,i=0),{x:e,y:r,dx:u,dy:i}}function Ir(t,n){function e(t,e){return d3.xhr(t,n,e).response(r)}function r(t){return e.parse(t.responseText)}function u(n){return n.map(i).join(t)}function i(t){return a.test(t)?'"'+t.replace(/\"/g,'""')+'"':t}var a=RegExp('["'+t+"\n]"),o=t.charCodeAt(0);return e.parse=function(t){var n;return e.parseRows(t,function(t){return n?n(t):(n=Function("d","return {"+t.map(function(t,n){return JSON.stringify(t)+": d["+n+"]"}).join(",")+"}"),void 0)})},e.parseRows=function(t,n){function e(){if(s>=l)return a;if(u)return u=!1,i;var n=s;if(34===t.charCodeAt(n)){for(var e=n;l>e++;)if(34===t.charCodeAt(e)){if(34!==t.charCodeAt(e+1))break;++e}s=e+2;var r=t.charCodeAt(e+1);return 13===r?(u=!0,10===t.charCodeAt(e+2)&&++s):10===r&&(u=!0),t.substring(n+1,e).replace(/""/g,'"')}for(;l>s;){var r=t.charCodeAt(s++),c=1;if(10===r)u=!0;else if(13===r)u=!0,10===t.charCodeAt(s)&&(++s,++c);else if(r!==o)continue;return t.substring(n,s-c)}return t.substring(n)}for(var r,u,i={},a={},c=[],l=t.length,s=0,f=0;(r=e())!==a;){for(var h=[];r!==i&&r!==a;)h.push(r),r=e();(!n||(h=n(h,f++)))&&c.push(h)}return c},e.format=function(t){return t.map(u).join("\n")},e}function Vr(t,n){no.hasOwnProperty(t.type)&&no[t.type](t,n)}function Xr(t,n,e){var r,u=-1,i=t.length-e;for(n.lineStart();i>++u;)r=t[u],n.point(r[0],r[1]);n.lineEnd()}function Zr(t,n){var e=-1,r=t.length;for(n.polygonStart();r>++e;)Xr(t[e],n,1);n.polygonEnd()}function Br(t){return[Math.atan2(t[1],t[0]),Math.asin(Math.max(-1,Math.min(1,t[2])))]}function $r(t,n){return Pi>Math.abs(t[0]-n[0])&&Pi>Math.abs(t[1]-n[1])}function Jr(t){var n=t[0],e=t[1],r=Math.cos(e);return[r*Math.cos(n),r*Math.sin(n),Math.sin(e)]}function Gr(t,n){return t[0]*n[0]+t[1]*n[1]+t[2]*n[2]}function Kr(t,n){return[t[1]*n[2]-t[2]*n[1],t[2]*n[0]-t[0]*n[2],t[0]*n[1]-t[1]*n[0]]}function Wr(t,n){t[0]+=n[0],t[1]+=n[1],t[2]+=n[2]}function Qr(t,n){return[t[0]*n,t[1]*n,t[2]*n]}function tu(t){var n=Math.sqrt(t[0]*t[0]+t[1]*t[1]+t[2]*t[2]);t[0]/=n,t[1]/=n,t[2]/=n}function nu(t){function n(n){function r(e,r){e=t(e,r),n.point(e[0],e[1])}function i(){s=0/0,p.point=a,n.lineStart()}function a(r,i){var a=Jr([r,i]),o=t(r,i);e(s,f,l,h,d,g,s=o[0],f=o[1],l=r,h=a[0],d=a[1],g=a[2],u,n),n.point(s,f)}function o(){p.point=r,n.lineEnd()}function c(){var t,r,c,m,v,y,M;i(),p.point=function(n,e){a(t=n,r=e),c=s,m=f,v=h,y=d,M=g,p.point=a},p.lineEnd=function(){e(s,f,l,h,d,g,c,m,t,v,y,M,u,n),p.lineEnd=o,o()}}var l,s,f,h,d,g,p={point:r,lineStart:i,lineEnd:o,polygonStart:function(){n.polygonStart(),p.lineStart=c},polygonEnd:function(){n.polygonEnd(),p.lineStart=i}};return p}function e(n,u,i,a,o,c,l,s,f,h,d,g,p,m){var v=l-n,y=s-u,M=v*v+y*y;if(M>4*r&&p--){var b=a+h,x=o+d,_=c+g,w=Math.sqrt(b*b+x*x+_*_),S=Math.asin(_/=w),k=Pi>Math.abs(Math.abs(_)-1)?(i+f)/2:Math.atan2(x,b),E=t(k,S),A=E[0],N=E[1],T=A-n,q=N-u,C=y*T-v*q;(C*C/M>r||Math.abs((v*T+y*q)/M-.5)>.3)&&(e(n,u,i,a,o,c,A,N,k,b/=w,x/=w,_,p,m),m.point(A,N),e(A,N,k,b,x,_,l,s,f,h,d,g,p,m))}}var r=.5,u=16;return n.precision=function(t){return arguments.length?(u=(r=t*t)>0&&16,n):Math.sqrt(r)},n}function eu(t,n){function e(t,n){var e=Math.sqrt(i-2*u*Math.sin(n))/u;return[e*Math.sin(t*=u),a-e*Math.cos(t)]}var r=Math.sin(t),u=(r+Math.sin(n))/2,i=1+r*(2*u-r),a=Math.sqrt(i)/u;return e.invert=function(t,n){var e=a-n;return[Math.atan2(t,e)/u,Math.asin((i-(t*t+e*e)*u*u)/(2*u))]},e}function ru(t){function n(t,n){r>t&&(r=t),t>i&&(i=t),u>n&&(u=n),n>a&&(a=n)}function e(){o.point=o.lineEnd=Pn}var r,u,i,a,o={point:n,lineStart:Pn,lineEnd:Pn,polygonStart:function(){o.lineEnd=e},polygonEnd:function(){o.point=n}};return function(n){return a=i=-(r=u=1/0),d3.geo.stream(n,t(o)),[[r,u],[i,a]]}}function uu(t,n){if(!uo){++io,t*=ji;var e=Math.cos(n*=ji);ao+=(e*Math.cos(t)-ao)/io,oo+=(e*Math.sin(t)-oo)/io,co+=(Math.sin(n)-co)/io}}function iu(){var t,n;uo=1,au(),uo=2;var e=lo.point;lo.point=function(r,u){e(t=r,n=u)},lo.lineEnd=function(){lo.point(t,n),ou(),lo.lineEnd=ou}}function au(){function t(t,u){t*=ji;var i=Math.cos(u*=ji),a=i*Math.cos(t),o=i*Math.sin(t),c=Math.sin(u),l=Math.atan2(Math.sqrt((l=e*c-r*o)*l+(l=r*a-n*c)*l+(l=n*o-e*a)*l),n*a+e*o+r*c);io+=l,ao+=l*(n+(n=a)),oo+=l*(e+(e=o)),co+=l*(r+(r=c))}var n,e,r;uo>1||(1>uo&&(uo=1,io=ao=oo=co=0),lo.point=function(u,i){u*=ji;var a=Math.cos(i*=ji);n=a*Math.cos(u),e=a*Math.sin(u),r=Math.sin(i),lo.point=t})}function ou(){lo.point=uu}function cu(t,n){var e=Math.cos(t),r=Math.sin(t);return function(u,i,a,o){null!=u?(u=lu(e,u),i=lu(e,i),(a>0?i>u:u>i)&&(u+=2*a*Ri)):(u=t+2*a*Ri,i=t);for(var c,l=a*n,s=u;a>0?s>i:i>s;s-=l)o.point((c=Br([e,-r*Math.cos(s),-r*Math.sin(s)]))[0],c[1])}}function lu(t,n){var e=Jr(n);e[0]-=t,tu(e);var r=Math.acos(Math.max(-1,Math.min(1,-e[1])));return((0>-e[2]?-r:r)+2*Math.PI-Pi)%(2*Math.PI)}function su(t,n,e){return function(r){function u(n,e){t(n,e)&&r.point(n,e)}function i(t,n){m.point(t,n)}function a(){v.point=i,m.lineStart()}function o(){v.point=u,m.lineEnd()}function c(t,n){M.point(t,n),p.push([t,n])}function l(){M.lineStart(),p=[]}function s(){c(p[0][0],p[0][1]),M.lineEnd();var t,n=M.clean(),e=y.buffer(),u=e.length;if(!u)return g=!0,d+=mu(p,-1),p=null,void 0;if(p=null,1&n){t=e[0],h+=mu(t,1);var i,u=t.length-1,a=-1;for(r.lineStart();u>++a;)r.point((i=t[a])[0],i[1]);return r.lineEnd(),void 0}u>1&&2&n&&e.push(e.pop().concat(e.shift())),f.push(e.filter(gu))}var f,h,d,g,p,m=n(r),v={point:u,lineStart:a,lineEnd:o,polygonStart:function(){v.point=c,v.lineStart=l,v.lineEnd=s,g=!1,d=h=0,f=[],r.polygonStart() -},polygonEnd:function(){v.point=u,v.lineStart=a,v.lineEnd=o,f=d3.merge(f),f.length?fu(f,e,r):(-Pi>h||g&&-Pi>d)&&(r.lineStart(),e(null,null,1,r),r.lineEnd()),r.polygonEnd(),f=null},sphere:function(){r.polygonStart(),r.lineStart(),e(null,null,1,r),r.lineEnd(),r.polygonEnd()}},y=pu(),M=n(y);return v}}function fu(t,n,e){var r=[],u=[];if(t.forEach(function(t){var n=t.length;if(!(1>=n)){var e=t[0],i=t[n-1],a={point:e,points:t,other:null,visited:!1,entry:!0,subject:!0},o={point:e,points:[e],other:a,visited:!1,entry:!1,subject:!1};a.other=o,r.push(a),u.push(o),a={point:i,points:[i],other:null,visited:!1,entry:!1,subject:!0},o={point:i,points:[i],other:a,visited:!1,entry:!0,subject:!1},a.other=o,r.push(a),u.push(o)}}),u.sort(du),hu(r),hu(u),r.length)for(var i,a,o,c=r[0];;){for(i=c;i.visited;)if((i=i.next)===c)return;a=i.points,e.lineStart();do{if(i.visited=i.other.visited=!0,i.entry){if(i.subject)for(var l=0;a.length>l;l++)e.point((o=a[l])[0],o[1]);else n(i.point,i.next.point,1,e);i=i.next}else{if(i.subject){a=i.prev.points;for(var l=a.length;--l>=0;)e.point((o=a[l])[0],o[1])}else n(i.point,i.prev.point,-1,e);i=i.prev}i=i.other,a=i.points}while(!i.visited);e.lineEnd()}}function hu(t){if(n=t.length){for(var n,e,r=0,u=t[0];n>++r;)u.next=e=t[r],e.prev=u,u=e;u.next=e=t[0],e.prev=u}}function du(t,n){return(0>(t=t.point)[0]?t[1]-Ri/2-Pi:Ri/2-t[1])-(0>(n=n.point)[0]?n[1]-Ri/2-Pi:Ri/2-n[1])}function gu(t){return t.length>1}function pu(){var t,n=[];return{lineStart:function(){n.push(t=[])},point:function(n,e){t.push([n,e])},lineEnd:Pn,buffer:function(){var e=n;return n=[],t=null,e}}}function mu(t,n){if(!(e=t.length))return 0;for(var e,r,u,i=0,a=0,o=t[0],c=o[0],l=o[1],s=Math.cos(l),f=Math.atan2(n*Math.sin(c)*s,Math.sin(l)),h=1-n*Math.cos(c)*s,d=f;e>++i;)o=t[i],s=Math.cos(l=o[1]),r=Math.atan2(n*Math.sin(c=o[0])*s,Math.sin(l)),u=1-n*Math.cos(c)*s,Pi>Math.abs(h-2)&&Pi>Math.abs(u-2)||(Pi>Math.abs(u)||Pi>Math.abs(h)||(Pi>Math.abs(Math.abs(r-f)-Ri)?u+h>2&&(a+=4*(r-f)):a+=Pi>Math.abs(h-2)?4*(r-d):((3*Ri+r-f)%(2*Ri)-Ri)*(h+u)),d=f,f=r,h=u);return a}function vu(t){var n,e=0/0,r=0/0,u=0/0;return{lineStart:function(){t.lineStart(),n=1},point:function(i,a){var o=i>0?Ri:-Ri,c=Math.abs(i-e);Pi>Math.abs(c-Ri)?(t.point(e,r=(r+a)/2>0?Ri/2:-Ri/2),t.point(u,r),t.lineEnd(),t.lineStart(),t.point(o,r),t.point(i,r),n=0):u!==o&&c>=Ri&&(Pi>Math.abs(e-u)&&(e-=u*Pi),Pi>Math.abs(i-o)&&(i-=o*Pi),r=yu(e,r,i,a),t.point(u,r),t.lineEnd(),t.lineStart(),t.point(o,r),n=0),t.point(e=i,r=a),u=o},lineEnd:function(){t.lineEnd(),e=r=0/0},clean:function(){return 2-n}}}function yu(t,n,e,r){var u,i,a=Math.sin(t-e);return Math.abs(a)>Pi?Math.atan((Math.sin(n)*(i=Math.cos(r))*Math.sin(e)-Math.sin(r)*(u=Math.cos(n))*Math.sin(t))/(u*i*a)):(n+r)/2}function Mu(t,n,e,r){var u;if(null==t)u=e*Ri/2,r.point(-Ri,u),r.point(0,u),r.point(Ri,u),r.point(Ri,0),r.point(Ri,-u),r.point(0,-u),r.point(-Ri,-u),r.point(-Ri,0),r.point(-Ri,u);else if(Math.abs(t[0]-n[0])>Pi){var i=(t[0]<n[0]?1:-1)*Ri;u=e*i/2,r.point(-i,u),r.point(0,u),r.point(i,u)}else r.point(n[0],n[1])}function bu(t){function n(t,n){return Math.cos(t)*Math.cos(n)>i}function e(t){var e,u,i,a;return{lineStart:function(){i=u=!1,a=1},point:function(o,c){var l,s=[o,c],f=n(o,c);!e&&(i=u=f)&&t.lineStart(),f!==u&&(l=r(e,s),($r(e,l)||$r(s,l))&&(s[0]+=Pi,s[1]+=Pi,f=n(s[0],s[1]))),f!==u&&(a=0,(u=f)?(t.lineStart(),l=r(s,e),t.point(l[0],l[1])):(l=r(e,s),t.point(l[0],l[1]),t.lineEnd()),e=l),!f||e&&$r(e,s)||t.point(s[0],s[1]),e=s},lineEnd:function(){u&&t.lineEnd(),e=null},clean:function(){return a|(i&&u)<<1}}}function r(t,n){var e=Jr(t,0),r=Jr(n,0),u=[1,0,0],a=Kr(e,r),o=Gr(a,a),c=a[0],l=o-c*c;if(!l)return t;var s=i*o/l,f=-i*c/l,h=Kr(u,a),d=Qr(u,s),g=Qr(a,f);Wr(d,g);var p=h,m=Gr(d,p),v=Gr(p,p),y=Math.sqrt(m*m-v*(Gr(d,d)-1)),M=Qr(p,(-m-y)/v);return Wr(M,d),Br(M)}var u=t*ji,i=Math.cos(u),a=cu(u,6*ji);return su(n,e,a)}function xu(t,n){function e(e,r){return e=t(e,r),n(e[0],e[1])}return t.invert&&n.invert&&(e.invert=function(e,r){return e=n.invert(e,r),t.invert(e[0],e[1])}),e}function _u(t,n){return[t,n]}function wu(t,n,e){var r=d3.range(t,n-Pi,e).concat(n);return function(t){return r.map(function(n){return[t,n]})}}function Su(t,n,e){var r=d3.range(t,n-Pi,e).concat(n);return function(t){return r.map(function(n){return[n,t]})}}function ku(t,n,e,r){function u(t){var n=Math.sin(t*=d)*g,e=Math.sin(d-t)*g,r=e*l+n*f,u=e*s+n*h,i=e*a+n*c;return[Math.atan2(u,r)/ji,Math.atan2(i,Math.sqrt(r*r+u*u))/ji]}var i=Math.cos(n),a=Math.sin(n),o=Math.cos(r),c=Math.sin(r),l=i*Math.cos(t),s=i*Math.sin(t),f=o*Math.cos(e),h=o*Math.sin(e),d=Math.acos(Math.max(-1,Math.min(1,a*c+i*o*Math.cos(e-t)))),g=1/Math.sin(d);return u.distance=d,u}function Eu(t,n){return[t/(2*Ri),Math.max(-.5,Math.min(.5,Math.log(Math.tan(Ri/4+n/2))/(2*Ri)))]}function Au(t){return"m0,"+t+"a"+t+","+t+" 0 1,1 0,"+-2*t+"a"+t+","+t+" 0 1,1 0,"+2*t+"z"}function Nu(t){var n=nu(function(n,e){return t([n*Oi,e*Oi])});return function(t){return t=n(t),{point:function(n,e){t.point(n*ji,e*ji)},sphere:function(){t.sphere()},lineStart:function(){t.lineStart()},lineEnd:function(){t.lineEnd()},polygonStart:function(){t.polygonStart()},polygonEnd:function(){t.polygonEnd()}}}}function Tu(){function t(t,n){a.push("M",t,",",n,i)}function n(t,n){a.push("M",t,",",n),o.point=e}function e(t,n){a.push("L",t,",",n)}function r(){o.point=t}function u(){a.push("Z")}var i=Au(4.5),a=[],o={point:t,lineStart:function(){o.point=n},lineEnd:r,polygonStart:function(){o.lineEnd=u},polygonEnd:function(){o.lineEnd=r,o.point=t},pointRadius:function(t){return i=Au(t),o},result:function(){if(a.length){var t=a.join("");return a=[],t}}};return o}function qu(t){function n(n,e){t.moveTo(n,e),t.arc(n,e,a,0,2*Ri)}function e(n,e){t.moveTo(n,e),o.point=r}function r(n,e){t.lineTo(n,e)}function u(){o.point=n}function i(){t.closePath()}var a=4.5,o={point:n,lineStart:function(){o.point=e},lineEnd:u,polygonStart:function(){o.lineEnd=i},polygonEnd:function(){o.lineEnd=u,o.point=n},pointRadius:function(t){return a=t,o},result:Pn};return o}function Cu(){function t(t,n){po+=u*t-r*n,r=t,u=n}var n,e,r,u;mo.point=function(i,a){mo.point=t,n=r=i,e=u=a},mo.lineEnd=function(){t(n,e)}}function zu(t,n){uo||(ao+=t,oo+=n,++co)}function Du(){function t(t,r){var u=t-n,i=r-e,a=Math.sqrt(u*u+i*i);ao+=a*(n+t)/2,oo+=a*(e+r)/2,co+=a,n=t,e=r}var n,e;if(1!==uo){if(!(1>uo))return;uo=1,ao=oo=co=0}vo.point=function(r,u){vo.point=t,n=r,e=u}}function Lu(){vo.point=zu}function Fu(){function t(t,n){var e=u*t-r*n;ao+=e*(r+t),oo+=e*(u+n),co+=3*e,r=t,u=n}var n,e,r,u;2>uo&&(uo=2,ao=oo=co=0),vo.point=function(i,a){vo.point=t,n=r=i,e=u=a},vo.lineEnd=function(){t(n,e)}}function Hu(){function t(t,n){if(t*=ji,n*=ji,!(Pi>Math.abs(Math.abs(i)-Ri/2)&&Pi>Math.abs(Math.abs(n)-Ri/2))){var e=Math.cos(n),c=Math.sin(n);if(Pi>Math.abs(i-Ri/2))Mo+=2*(t-r);else{var l=t-u,s=Math.cos(l),f=Math.atan2(Math.sqrt((f=e*Math.sin(l))*f+(f=a*c-o*e*s)*f),o*c+a*e*s),h=(f+Ri+i+n)/4;Mo+=(0>l&&l>-Ri||l>Ri?-4:4)*Math.atan(Math.sqrt(Math.abs(Math.tan(h)*Math.tan(h-f/2)*Math.tan(h-Ri/4-i/2)*Math.tan(h-Ri/4-n/2))))}r=u,u=t,i=n,a=e,o=c}}var n,e,r,u,i,a,o;bo.point=function(c,l){bo.point=t,r=u=(n=c)*ji,i=(e=l)*ji,a=Math.cos(i),o=Math.sin(i)},bo.lineEnd=function(){t(n,e)}}function Ru(t){return Pu(function(){return t})()}function Pu(t){function n(t){return t=a(t[0]*ji,t[1]*ji),[t[0]*s+o,c-t[1]*s]}function e(t){return t=a.invert((t[0]-o)/s,(c-t[1])/s),[t[0]*Oi,t[1]*Oi]}function r(){a=xu(i=Ou(p,m,v),u);var t=u(d,g);return o=f-t[0]*s,c=h+t[1]*s,n}var u,i,a,o,c,l=nu(function(t,n){return t=u(t,n),[t[0]*s+o,c-t[1]*s]}),s=150,f=480,h=250,d=0,g=0,p=0,m=0,v=0,y=so,M=null;return n.stream=function(t){return ju(i,y(l(t)))},n.clipAngle=function(t){return arguments.length?(y=null==t?(M=t,so):bu(M=+t),n):M},n.scale=function(t){return arguments.length?(s=+t,r()):s},n.translate=function(t){return arguments.length?(f=+t[0],h=+t[1],r()):[f,h]},n.center=function(t){return arguments.length?(d=t[0]%360*ji,g=t[1]%360*ji,r()):[d*Oi,g*Oi]},n.rotate=function(t){return arguments.length?(p=t[0]%360*ji,m=t[1]%360*ji,v=t.length>2?t[2]%360*ji:0,r()):[p*Oi,m*Oi,v*Oi]},d3.rebind(n,l,"precision"),function(){return u=t.apply(this,arguments),n.invert=u.invert&&e,r()}}function ju(t,n){return{point:function(e,r){r=t(e*ji,r*ji),e=r[0],n.point(e>Ri?e-2*Ri:-Ri>e?e+2*Ri:e,r[1])},sphere:function(){n.sphere()},lineStart:function(){n.lineStart()},lineEnd:function(){n.lineEnd()},polygonStart:function(){n.polygonStart()},polygonEnd:function(){n.polygonEnd()}}}function Ou(t,n,e){return t?n||e?xu(Uu(t),Iu(n,e)):Uu(t):n||e?Iu(n,e):_u}function Yu(t){return function(n,e){return n+=t,[n>Ri?n-2*Ri:-Ri>n?n+2*Ri:n,e]}}function Uu(t){var n=Yu(t);return n.invert=Yu(-t),n}function Iu(t,n){function e(t,n){var e=Math.cos(n),o=Math.cos(t)*e,c=Math.sin(t)*e,l=Math.sin(n),s=l*r+o*u;return[Math.atan2(c*i-s*a,o*r-l*u),Math.asin(Math.max(-1,Math.min(1,s*i+c*a)))]}var r=Math.cos(t),u=Math.sin(t),i=Math.cos(n),a=Math.sin(n);return e.invert=function(t,n){var e=Math.cos(n),o=Math.cos(t)*e,c=Math.sin(t)*e,l=Math.sin(n),s=l*i-c*a;return[Math.atan2(c*i+l*a,o*r+s*u),Math.asin(Math.max(-1,Math.min(1,s*r-o*u)))]},e}function Vu(t,n){function e(n,e){var r=Math.cos(n),u=Math.cos(e),i=t(r*u);return[i*u*Math.sin(n),i*Math.sin(e)]}return e.invert=function(t,e){var r=Math.sqrt(t*t+e*e),u=n(r),i=Math.sin(u),a=Math.cos(u);return[Math.atan2(t*i,r*a),Math.asin(r&&e*i/r)]},e}function Xu(t,n,e,r){var u,i,a,o,c,l,s;return u=r[t],i=u[0],a=u[1],u=r[n],o=u[0],c=u[1],u=r[e],l=u[0],s=u[1],(s-a)*(o-i)-(c-a)*(l-i)>0}function Zu(t,n,e){return(e[0]-n[0])*(t[1]-n[1])<(e[1]-n[1])*(t[0]-n[0])}function Bu(t,n,e,r){var u=t[0],i=e[0],a=n[0]-u,o=r[0]-i,c=t[1],l=e[1],s=n[1]-c,f=r[1]-l,h=(o*(c-l)-f*(u-i))/(f*a-o*s);return[u+h*a,c+h*s]}function $u(t,n){var e={list:t.map(function(t,n){return{index:n,x:t[0],y:t[1]}}).sort(function(t,n){return t.y<n.y?-1:t.y>n.y?1:t.x<n.x?-1:t.x>n.x?1:0}),bottomSite:null},r={list:[],leftEnd:null,rightEnd:null,init:function(){r.leftEnd=r.createHalfEdge(null,"l"),r.rightEnd=r.createHalfEdge(null,"l"),r.leftEnd.r=r.rightEnd,r.rightEnd.l=r.leftEnd,r.list.unshift(r.leftEnd,r.rightEnd)},createHalfEdge:function(t,n){return{edge:t,side:n,vertex:null,l:null,r:null}},insert:function(t,n){n.l=t,n.r=t.r,t.r.l=n,t.r=n},leftBound:function(t){var n=r.leftEnd;do n=n.r;while(n!=r.rightEnd&&u.rightOf(n,t));return n=n.l},del:function(t){t.l.r=t.r,t.r.l=t.l,t.edge=null},right:function(t){return t.r},left:function(t){return t.l},leftRegion:function(t){return null==t.edge?e.bottomSite:t.edge.region[t.side]},rightRegion:function(t){return null==t.edge?e.bottomSite:t.edge.region[_o[t.side]]}},u={bisect:function(t,n){var e={region:{l:t,r:n},ep:{l:null,r:null}},r=n.x-t.x,u=n.y-t.y,i=r>0?r:-r,a=u>0?u:-u;return e.c=t.x*r+t.y*u+.5*(r*r+u*u),i>a?(e.a=1,e.b=u/r,e.c/=r):(e.b=1,e.a=r/u,e.c/=u),e},intersect:function(t,n){var e=t.edge,r=n.edge;if(!e||!r||e.region.r==r.region.r)return null;var u=e.a*r.b-e.b*r.a;if(1e-10>Math.abs(u))return null;var i,a,o=(e.c*r.b-r.c*e.b)/u,c=(r.c*e.a-e.c*r.a)/u,l=e.region.r,s=r.region.r;l.y<s.y||l.y==s.y&&l.x<s.x?(i=t,a=e):(i=n,a=r);var f=o>=a.region.r.x;return f&&"l"===i.side||!f&&"r"===i.side?null:{x:o,y:c}},rightOf:function(t,n){var e=t.edge,r=e.region.r,u=n.x>r.x;if(u&&"l"===t.side)return 1;if(!u&&"r"===t.side)return 0;if(1===e.a){var i=n.y-r.y,a=n.x-r.x,o=0,c=0;if(!u&&0>e.b||u&&e.b>=0?c=o=i>=e.b*a:(c=n.x+n.y*e.b>e.c,0>e.b&&(c=!c),c||(o=1)),!o){var l=r.x-e.region.l.x;c=e.b*(a*a-i*i)<l*i*(1+2*a/l+e.b*e.b),0>e.b&&(c=!c)}}else{var s=e.c-e.a*n.x,f=n.y-s,h=n.x-r.x,d=s-r.y;c=f*f>h*h+d*d}return"l"===t.side?c:!c},endPoint:function(t,e,r){t.ep[e]=r,t.ep[_o[e]]&&n(t)},distance:function(t,n){var e=t.x-n.x,r=t.y-n.y;return Math.sqrt(e*e+r*r)}},i={list:[],insert:function(t,n,e){t.vertex=n,t.ystar=n.y+e;for(var r=0,u=i.list,a=u.length;a>r;r++){var o=u[r];if(!(t.ystar>o.ystar||t.ystar==o.ystar&&n.x>o.vertex.x))break}u.splice(r,0,t)},del:function(t){for(var n=0,e=i.list,r=e.length;r>n&&e[n]!=t;++n);e.splice(n,1)},empty:function(){return 0===i.list.length},nextEvent:function(t){for(var n=0,e=i.list,r=e.length;r>n;++n)if(e[n]==t)return e[n+1];return null},min:function(){var t=i.list[0];return{x:t.vertex.x,y:t.ystar}},extractMin:function(){return i.list.shift()}};r.init(),e.bottomSite=e.list.shift();for(var a,o,c,l,s,f,h,d,g,p,m,v,y,M=e.list.shift();;)if(i.empty()||(a=i.min()),M&&(i.empty()||M.y<a.y||M.y==a.y&&M.x<a.x))o=r.leftBound(M),c=r.right(o),h=r.rightRegion(o),v=u.bisect(h,M),f=r.createHalfEdge(v,"l"),r.insert(o,f),p=u.intersect(o,f),p&&(i.del(o),i.insert(o,p,u.distance(p,M))),o=f,f=r.createHalfEdge(v,"r"),r.insert(o,f),p=u.intersect(f,c),p&&i.insert(f,p,u.distance(p,M)),M=e.list.shift();else{if(i.empty())break;o=i.extractMin(),l=r.left(o),c=r.right(o),s=r.right(c),h=r.leftRegion(o),d=r.rightRegion(c),m=o.vertex,u.endPoint(o.edge,o.side,m),u.endPoint(c.edge,c.side,m),r.del(o),i.del(c),r.del(c),y="l",h.y>d.y&&(g=h,h=d,d=g,y="r"),v=u.bisect(h,d),f=r.createHalfEdge(v,y),r.insert(l,f),u.endPoint(v,_o[y],m),p=u.intersect(l,f),p&&(i.del(l),i.insert(l,p,u.distance(p,h))),p=u.intersect(f,s),p&&i.insert(f,p,u.distance(p,h))}for(o=r.right(r.leftEnd);o!=r.rightEnd;o=r.right(o))n(o.edge)}function Ju(){return{leaf:!0,nodes:[],point:null}}function Gu(t,n,e,r,u,i){if(!t(n,e,r,u,i)){var a=.5*(e+u),o=.5*(r+i),c=n.nodes;c[0]&&Gu(t,c[0],e,r,a,o),c[1]&&Gu(t,c[1],a,r,u,o),c[2]&&Gu(t,c[2],e,o,a,i),c[3]&&Gu(t,c[3],a,o,u,i)}}function Ku(){this._=new Date(arguments.length>1?Date.UTC.apply(this,arguments):arguments[0])}function Wu(t,n,e,r){for(var u,i,a=0,o=n.length,c=e.length;o>a;){if(r>=c)return-1;if(u=n.charCodeAt(a++),37===u){if(i=Yo[n.charAt(a++)],!i||0>(r=i(t,e,r)))return-1}else if(u!=e.charCodeAt(r++))return-1}return r}function Qu(t){return RegExp("^(?:"+t.map(d3.requote).join("|")+")","i")}function ti(t){for(var n=new i,e=-1,r=t.length;r>++e;)n.set(t[e].toLowerCase(),e);return n}function ni(t,n,e){t+="";var r=t.length;return e>r?Array(e-r+1).join(n)+t:t}function ei(t,n,e){Lo.lastIndex=0;var r=Lo.exec(n.substring(e));return r?e+=r[0].length:-1}function ri(t,n,e){Do.lastIndex=0;var r=Do.exec(n.substring(e));return r?e+=r[0].length:-1}function ui(t,n,e){Ro.lastIndex=0;var r=Ro.exec(n.substring(e));return r?(t.m=Po.get(r[0].toLowerCase()),e+=r[0].length):-1}function ii(t,n,e){Fo.lastIndex=0;var r=Fo.exec(n.substring(e));return r?(t.m=Ho.get(r[0].toLowerCase()),e+=r[0].length):-1}function ai(t,n,e){return Wu(t,""+Oo.c,n,e)}function oi(t,n,e){return Wu(t,""+Oo.x,n,e)}function ci(t,n,e){return Wu(t,""+Oo.X,n,e)}function li(t,n,e){Uo.lastIndex=0;var r=Uo.exec(n.substring(e,e+4));return r?(t.y=+r[0],e+=r[0].length):-1}function si(t,n,e){Uo.lastIndex=0;var r=Uo.exec(n.substring(e,e+2));return r?(t.y=fi(+r[0]),e+=r[0].length):-1}function fi(t){return t+(t>68?1900:2e3)}function hi(t,n,e){Uo.lastIndex=0;var r=Uo.exec(n.substring(e,e+2));return r?(t.m=r[0]-1,e+=r[0].length):-1}function di(t,n,e){Uo.lastIndex=0;var r=Uo.exec(n.substring(e,e+2));return r?(t.d=+r[0],e+=r[0].length):-1}function gi(t,n,e){Uo.lastIndex=0;var r=Uo.exec(n.substring(e,e+2));return r?(t.H=+r[0],e+=r[0].length):-1}function pi(t,n,e){Uo.lastIndex=0;var r=Uo.exec(n.substring(e,e+2));return r?(t.M=+r[0],e+=r[0].length):-1}function mi(t,n,e){Uo.lastIndex=0;var r=Uo.exec(n.substring(e,e+2));return r?(t.S=+r[0],e+=r[0].length):-1}function vi(t,n,e){Uo.lastIndex=0;var r=Uo.exec(n.substring(e,e+3));return r?(t.L=+r[0],e+=r[0].length):-1}function yi(t,n,e){var r=Io.get(n.substring(e,e+=2).toLowerCase());return null==r?-1:(t.p=r,e)}function Mi(t){var n=t.getTimezoneOffset(),e=n>0?"-":"+",r=~~(Math.abs(n)/60),u=Math.abs(n)%60;return e+ni(r,"0",2)+ni(u,"0",2)}function bi(t){return t.toISOString()}function xi(t,n,e){function r(n){var e=t(n),r=i(e,1);return r-n>n-e?e:r}function u(e){return n(e=t(new wo(e-1)),1),e}function i(t,e){return n(t=new wo(+t),e),t}function a(t,r,i){var a=u(t),o=[];if(i>1)for(;r>a;)e(a)%i||o.push(new Date(+a)),n(a,1);else for(;r>a;)o.push(new Date(+a)),n(a,1);return o}function o(t,n,e){try{wo=Ku;var r=new Ku;return r._=t,a(r,n,e)}finally{wo=Date}}t.floor=t,t.round=r,t.ceil=u,t.offset=i,t.range=a;var c=t.utc=_i(t);return c.floor=c,c.round=_i(r),c.ceil=_i(u),c.offset=_i(i),c.range=o,t}function _i(t){return function(n,e){try{wo=Ku;var r=new Ku;return r._=n,t(r,e)._}finally{wo=Date}}}function wi(t,n,e){function r(n){return t(n)}return r.invert=function(n){return ki(t.invert(n))},r.domain=function(n){return arguments.length?(t.domain(n),r):t.domain().map(ki)},r.nice=function(t){return r.domain(Yn(r.domain(),function(){return t}))},r.ticks=function(e,u){var i=Si(r.domain());if("function"!=typeof e){var a=i[1]-i[0],o=a/e,c=d3.bisect(Xo,o);if(c==Xo.length)return n.year(i,e);if(!c)return t.ticks(e).map(ki);Math.log(o/Xo[c-1])<Math.log(Xo[c]/o)&&--c,e=n[c],u=e[1],e=e[0].range}return e(i[0],new Date(+i[1]+1),u)},r.tickFormat=function(){return e},r.copy=function(){return wi(t.copy(),n,e)},d3.rebind(r,t,"range","rangeRound","interpolate","clamp")}function Si(t){var n=t[0],e=t[t.length-1];return e>n?[n,e]:[e,n]}function ki(t){return new Date(t)}function Ei(t){return function(n){for(var e=t.length-1,r=t[e];!r[1](n);)r=t[--e];return r[0](n)}}function Ai(t){var n=new Date(t,0,1);return n.setFullYear(t),n}function Ni(t){var n=t.getFullYear(),e=Ai(n),r=Ai(n+1);return n+(t-e)/(r-e)}function Ti(t){var n=new Date(Date.UTC(t,0,1));return n.setUTCFullYear(t),n}function qi(t){var n=t.getUTCFullYear(),e=Ti(n),r=Ti(n+1);return n+(t-e)/(r-e)}var Ci=".",zi=",",Di=[3,3];Date.now||(Date.now=function(){return+new Date});try{document.createElement("div").style.setProperty("opacity",0,"")}catch(Li){var Fi=CSSStyleDeclaration.prototype,Hi=Fi.setProperty;Fi.setProperty=function(t,n,e){Hi.call(this,t,n+"",e)}}d3={version:"3.0.2"};var Ri=Math.PI,Pi=1e-6,ji=Ri/180,Oi=180/Ri,Yi=u;try{Yi(document.documentElement.childNodes)[0].nodeType}catch(Ui){Yi=r}var Ii=[].__proto__?function(t,n){t.__proto__=n}:function(t,n){for(var e in n)t[e]=n[e]};d3.map=function(t){var n=new i;for(var e in t)n.set(e,t[e]);return n},e(i,{has:function(t){return Vi+t in this},get:function(t){return this[Vi+t]},set:function(t,n){return this[Vi+t]=n},remove:function(t){return t=Vi+t,t in this&&delete this[t]},keys:function(){var t=[];return this.forEach(function(n){t.push(n)}),t},values:function(){var t=[];return this.forEach(function(n,e){t.push(e)}),t},entries:function(){var t=[];return this.forEach(function(n,e){t.push({key:n,value:e})}),t},forEach:function(t){for(var n in this)n.charCodeAt(0)===Xi&&t.call(this,n.substring(1),this[n])}});var Vi="\0",Xi=Vi.charCodeAt(0);d3.functor=c,d3.rebind=function(t,n){for(var e,r=1,u=arguments.length;u>++r;)t[e=arguments[r]]=l(t,n,n[e]);return t},d3.ascending=function(t,n){return n>t?-1:t>n?1:t>=n?0:0/0},d3.descending=function(t,n){return t>n?-1:n>t?1:n>=t?0:0/0},d3.mean=function(t,n){var e,r=t.length,u=0,i=-1,a=0;if(1===arguments.length)for(;r>++i;)s(e=t[i])&&(u+=(e-u)/++a);else for(;r>++i;)s(e=n.call(t,t[i],i))&&(u+=(e-u)/++a);return a?u:void 0},d3.median=function(t,n){return arguments.length>1&&(t=t.map(n)),t=t.filter(s),t.length?d3.quantile(t.sort(d3.ascending),.5):void 0},d3.min=function(t,n){var e,r,u=-1,i=t.length;if(1===arguments.length){for(;i>++u&&(null==(e=t[u])||e!=e);)e=void 0;for(;i>++u;)null!=(r=t[u])&&e>r&&(e=r)}else{for(;i>++u&&(null==(e=n.call(t,t[u],u))||e!=e);)e=void 0;for(;i>++u;)null!=(r=n.call(t,t[u],u))&&e>r&&(e=r)}return e},d3.max=function(t,n){var e,r,u=-1,i=t.length;if(1===arguments.length){for(;i>++u&&(null==(e=t[u])||e!=e);)e=void 0;for(;i>++u;)null!=(r=t[u])&&r>e&&(e=r)}else{for(;i>++u&&(null==(e=n.call(t,t[u],u))||e!=e);)e=void 0;for(;i>++u;)null!=(r=n.call(t,t[u],u))&&r>e&&(e=r)}return e},d3.extent=function(t,n){var e,r,u,i=-1,a=t.length;if(1===arguments.length){for(;a>++i&&(null==(e=u=t[i])||e!=e);)e=u=void 0;for(;a>++i;)null!=(r=t[i])&&(e>r&&(e=r),r>u&&(u=r))}else{for(;a>++i&&(null==(e=u=n.call(t,t[i],i))||e!=e);)e=void 0;for(;a>++i;)null!=(r=n.call(t,t[i],i))&&(e>r&&(e=r),r>u&&(u=r))}return[e,u]},d3.random={normal:function(t,n){var e=arguments.length;return 2>e&&(n=1),1>e&&(t=0),function(){var e,r,u;do e=2*Math.random()-1,r=2*Math.random()-1,u=e*e+r*r;while(!u||u>1);return t+n*e*Math.sqrt(-2*Math.log(u)/u)}},logNormal:function(t,n){var e=arguments.length;2>e&&(n=1),1>e&&(t=0);var r=d3.random.normal();return function(){return Math.exp(t+n*r())}},irwinHall:function(t){return function(){for(var n=0,e=0;t>e;e++)n+=Math.random();return n/t}}},d3.sum=function(t,n){var e,r=0,u=t.length,i=-1;if(1===arguments.length)for(;u>++i;)isNaN(e=+t[i])||(r+=e);else for(;u>++i;)isNaN(e=+n.call(t,t[i],i))||(r+=e);return r},d3.quantile=function(t,n){var e=(t.length-1)*n+1,r=Math.floor(e),u=+t[r-1],i=e-r;return i?u+i*(t[r]-u):u},d3.shuffle=function(t){for(var n,e,r=t.length;r;)e=0|Math.random()*r--,n=t[r],t[r]=t[e],t[e]=n;return t},d3.transpose=function(t){return d3.zip.apply(d3,t)},d3.zip=function(){if(!(r=arguments.length))return[];for(var t=-1,n=d3.min(arguments,f),e=Array(n);n>++t;)for(var r,u=-1,i=e[t]=Array(r);r>++u;)i[u]=arguments[u][t];return e},d3.bisector=function(t){return{left:function(n,e,r,u){for(3>arguments.length&&(r=0),4>arguments.length&&(u=n.length);u>r;){var i=r+u>>>1;e>t.call(n,n[i],i)?r=i+1:u=i}return r},right:function(n,e,r,u){for(3>arguments.length&&(r=0),4>arguments.length&&(u=n.length);u>r;){var i=r+u>>>1;t.call(n,n[i],i)>e?u=i:r=i+1}return r}}};var Zi=d3.bisector(function(t){return t});d3.bisectLeft=Zi.left,d3.bisect=d3.bisectRight=Zi.right,d3.nest=function(){function t(n,o){if(o>=a.length)return r?r.call(u,n):e?n.sort(e):n;for(var c,l,s,f=-1,h=n.length,d=a[o++],g=new i,p={};h>++f;)(s=g.get(c=d(l=n[f])))?s.push(l):g.set(c,[l]);return g.forEach(function(n,e){p[n]=t(e,o)}),p}function n(t,e){if(e>=a.length)return t;var r,u=[],i=o[e++];for(r in t)u.push({key:r,values:n(t[r],e)});return i&&u.sort(function(t,n){return i(t.key,n.key)}),u}var e,r,u={},a=[],o=[];return u.map=function(n){return t(n,0)},u.entries=function(e){return n(t(e,0),0)},u.key=function(t){return a.push(t),u},u.sortKeys=function(t){return o[a.length-1]=t,u},u.sortValues=function(t){return e=t,u},u.rollup=function(t){return r=t,u},u},d3.keys=function(t){var n=[];for(var e in t)n.push(e);return n},d3.values=function(t){var n=[];for(var e in t)n.push(t[e]);return n},d3.entries=function(t){var n=[];for(var e in t)n.push({key:e,value:t[e]});return n},d3.permute=function(t,n){for(var e=[],r=-1,u=n.length;u>++r;)e[r]=t[n[r]];return e},d3.merge=function(t){return Array.prototype.concat.apply([],t)},d3.range=function(t,n,e){if(3>arguments.length&&(e=1,2>arguments.length&&(n=t,t=0)),1/0===(n-t)/e)throw Error("infinite range");var r,u=[],i=d(Math.abs(e)),a=-1;if(t*=i,n*=i,e*=i,0>e)for(;(r=t+e*++a)>n;)u.push(r/i);else for(;n>(r=t+e*++a);)u.push(r/i);return u},d3.requote=function(t){return t.replace(Bi,"\\$&")};var Bi=/[\\\^\$\*\+\?\|\[\]\(\)\.\{\}]/g;d3.round=function(t,n){return n?Math.round(t*(n=Math.pow(10,n)))/n:Math.round(t)},d3.xhr=function(t,n,e){function r(){var t=l.status;!t&&l.responseText||t>=200&&300>t||304===t?i.load.call(u,c.call(u,l)):i.error.call(u,l)}var u={},i=d3.dispatch("progress","load","error"),o={},c=a,l=new(window.XDomainRequest&&/^(http(s)?:)?\/\//.test(t)?XDomainRequest:XMLHttpRequest);return"onload"in l?l.onload=l.onerror=r:l.onreadystatechange=function(){l.readyState>3&&r()},l.onprogress=function(t){var n=d3.event;d3.event=t;try{i.progress.call(u,l)}finally{d3.event=n}},u.header=function(t,n){return t=(t+"").toLowerCase(),2>arguments.length?o[t]:(null==n?delete o[t]:o[t]=n+"",u)},u.mimeType=function(t){return arguments.length?(n=null==t?null:t+"",u):n},u.response=function(t){return c=t,u},["get","post"].forEach(function(t){u[t]=function(){return u.send.apply(u,[t].concat(Yi(arguments)))}}),u.send=function(e,r,i){if(2===arguments.length&&"function"==typeof r&&(i=r,r=null),l.open(e,t,!0),null==n||"accept"in o||(o.accept=n+",*/*"),l.setRequestHeader)for(var a in o)l.setRequestHeader(a,o[a]);return null!=n&&l.overrideMimeType&&l.overrideMimeType(n),null!=i&&u.on("error",i).on("load",function(t){i(null,t)}),l.send(null==r?null:r),u},u.abort=function(){return l.abort(),u},d3.rebind(u,i,"on"),2===arguments.length&&"function"==typeof n&&(e=n,n=null),null==e?u:u.get(g(e))},d3.text=function(){return d3.xhr.apply(d3,arguments).response(p)},d3.json=function(t,n){return d3.xhr(t,"application/json",n).response(m)},d3.html=function(t,n){return d3.xhr(t,"text/html",n).response(v)},d3.xml=function(){return d3.xhr.apply(d3,arguments).response(y)};var $i={svg:"http://www.w3.org/2000/svg",xhtml:"http://www.w3.org/1999/xhtml",xlink:"http://www.w3.org/1999/xlink",xml:"http://www.w3.org/XML/1998/namespace",xmlns:"http://www.w3.org/2000/xmlns/"};d3.ns={prefix:$i,qualify:function(t){var n=t.indexOf(":"),e=t;return n>=0&&(e=t.substring(0,n),t=t.substring(n+1)),$i.hasOwnProperty(e)?{space:$i[e],local:t}:t}},d3.dispatch=function(){for(var t=new M,n=-1,e=arguments.length;e>++n;)t[arguments[n]]=b(t);return t},M.prototype.on=function(t,n){var e=t.indexOf("."),r="";return e>0&&(r=t.substring(e+1),t=t.substring(0,e)),2>arguments.length?this[t].on(r):this[t].on(r,n)},d3.format=function(t){var n=Ji.exec(t),e=n[1]||" ",r=n[2]||">",u=n[3]||"",i=n[4]||"",a=n[5],o=+n[6],c=n[7],l=n[8],s=n[9],f=1,h="",d=!1;switch(l&&(l=+l.substring(1)),(a||"0"===e&&"="===r)&&(a=e="0",r="=",c&&(o-=Math.floor((o-1)/4))),s){case"n":c=!0,s="g";break;case"%":f=100,h="%",s="f";break;case"p":f=100,h="%",s="r";break;case"b":case"o":case"x":case"X":i&&(i="0"+s.toLowerCase());case"c":case"d":d=!0,l=0;break;case"s":f=-1,s="r"}"#"===i&&(i=""),"r"!=s||l||(s="g"),s=Gi.get(s)||_;var g=a&&c;return function(t){if(d&&t%1)return"";var n=0>t||0===t&&0>1/t?(t=-t,"-"):u;if(0>f){var p=d3.formatPrefix(t,l);t=p.scale(t),h=p.symbol}else t*=f;t=s(t,l),!a&&c&&(t=Ki(t));var m=i.length+t.length+(g?0:n.length),v=o>m?Array(m=o-m+1).join(e):"";return g&&(t=Ki(v+t)),Ci&&t.replace(".",Ci),n+=i,("<"===r?n+t+v:">"===r?v+n+t:"^"===r?v.substring(0,m>>=1)+n+t+v.substring(m):n+(g?t:v+t))+h}};var Ji=/(?:([^{])?([<>=^]))?([+\- ])?(#)?(0)?([0-9]+)?(,)?(\.[0-9]+)?([a-zA-Z%])?/,Gi=d3.map({b:function(t){return t.toString(2)},c:function(t){return String.fromCharCode(t)},o:function(t){return t.toString(8)},x:function(t){return t.toString(16)},X:function(t){return t.toString(16).toUpperCase()},g:function(t,n){return t.toPrecision(n)},e:function(t,n){return t.toExponential(n)},f:function(t,n){return t.toFixed(n)},r:function(t,n){return d3.round(t,n=x(t,n)).toFixed(Math.max(0,Math.min(20,n)))}}),Ki=a;if(Di){var Wi=Di.length;Ki=function(t){for(var n=t.lastIndexOf("."),e=n>=0?"."+t.substring(n+1):(n=t.length,""),r=[],u=0,i=Di[0];n>0&&i>0;)r.push(t.substring(n-=i,n+i)),i=Di[u=(u+1)%Wi];return r.reverse().join(zi||"")+e}}var Qi=["y","z","a","f","p","n","μ","m","","k","M","G","T","P","E","Z","Y"].map(w);d3.formatPrefix=function(t,n){var e=0;return t&&(0>t&&(t*=-1),n&&(t=d3.round(t,x(t,n))),e=1+Math.floor(1e-12+Math.log(t)/Math.LN10),e=Math.max(-24,Math.min(24,3*Math.floor((0>=e?e+1:e-1)/3)))),Qi[8+e/3]};var ta=function(){return a},na=d3.map({linear:ta,poly:q,quad:function(){return A},cubic:function(){return N},sin:function(){return C},exp:function(){return z},circle:function(){return D},elastic:L,back:F,bounce:function(){return H}}),ea=d3.map({"in":a,out:k,"in-out":E,"out-in":function(t){return E(k(t))}});d3.ease=function(t){var n=t.indexOf("-"),e=n>=0?t.substring(0,n):t,r=n>=0?t.substring(n+1):"in";return e=na.get(e)||ta,r=ea.get(r)||a,S(r(e.apply(null,Array.prototype.slice.call(arguments,1))))},d3.event=null,d3.transform=function(t){var n=document.createElementNS(d3.ns.prefix.svg,"g");return(d3.transform=function(t){n.setAttribute("transform",t);var e=n.transform.baseVal.consolidate();return new O(e?e.matrix:ra)})(t)},O.prototype.toString=function(){return"translate("+this.translate+")rotate("+this.rotate+")skewX("+this.skew+")scale("+this.scale+")"};var ra={a:1,b:0,c:0,d:1,e:0,f:0};d3.interpolate=function(t,n){for(var e,r=d3.interpolators.length;--r>=0&&!(e=d3.interpolators[r](t,n)););return e},d3.interpolateNumber=function(t,n){return n-=t,function(e){return t+n*e}},d3.interpolateRound=function(t,n){return n-=t,function(e){return Math.round(t+n*e)}},d3.interpolateString=function(t,n){var e,r,u,i,a,o=0,c=0,l=[],s=[];for(ua.lastIndex=0,r=0;e=ua.exec(n);++r)e.index&&l.push(n.substring(o,c=e.index)),s.push({i:l.length,x:e[0]}),l.push(null),o=ua.lastIndex;for(n.length>o&&l.push(n.substring(o)),r=0,i=s.length;(e=ua.exec(t))&&i>r;++r)if(a=s[r],a.x==e[0]){if(a.i)if(null==l[a.i+1])for(l[a.i-1]+=a.x,l.splice(a.i,1),u=r+1;i>u;++u)s[u].i--;else for(l[a.i-1]+=a.x+l[a.i+1],l.splice(a.i,2),u=r+1;i>u;++u)s[u].i-=2;else if(null==l[a.i+1])l[a.i]=a.x;else for(l[a.i]=a.x+l[a.i+1],l.splice(a.i+1,1),u=r+1;i>u;++u)s[u].i--;s.splice(r,1),i--,r--}else a.x=d3.interpolateNumber(parseFloat(e[0]),parseFloat(a.x));for(;i>r;)a=s.pop(),null==l[a.i+1]?l[a.i]=a.x:(l[a.i]=a.x+l[a.i+1],l.splice(a.i+1,1)),i--;return 1===l.length?null==l[0]?s[0].x:function(){return n}:function(t){for(r=0;i>r;++r)l[(a=s[r]).i]=a.x(t);return l.join("")}},d3.interpolateTransform=function(t,n){var e,r=[],u=[],i=d3.transform(t),a=d3.transform(n),o=i.translate,c=a.translate,l=i.rotate,s=a.rotate,f=i.skew,h=a.skew,d=i.scale,g=a.scale;return o[0]!=c[0]||o[1]!=c[1]?(r.push("translate(",null,",",null,")"),u.push({i:1,x:d3.interpolateNumber(o[0],c[0])},{i:3,x:d3.interpolateNumber(o[1],c[1])})):c[0]||c[1]?r.push("translate("+c+")"):r.push(""),l!=s?(l-s>180?s+=360:s-l>180&&(l+=360),u.push({i:r.push(r.pop()+"rotate(",null,")")-2,x:d3.interpolateNumber(l,s)})):s&&r.push(r.pop()+"rotate("+s+")"),f!=h?u.push({i:r.push(r.pop()+"skewX(",null,")")-2,x:d3.interpolateNumber(f,h)}):h&&r.push(r.pop()+"skewX("+h+")"),d[0]!=g[0]||d[1]!=g[1]?(e=r.push(r.pop()+"scale(",null,",",null,")"),u.push({i:e-4,x:d3.interpolateNumber(d[0],g[0])},{i:e-2,x:d3.interpolateNumber(d[1],g[1])})):(1!=g[0]||1!=g[1])&&r.push(r.pop()+"scale("+g+")"),e=u.length,function(t){for(var n,i=-1;e>++i;)r[(n=u[i]).i]=n.x(t);return r.join("")}},d3.interpolateRgb=function(t,n){t=d3.rgb(t),n=d3.rgb(n);var e=t.r,r=t.g,u=t.b,i=n.r-e,a=n.g-r,o=n.b-u;return function(t){return"#"+G(Math.round(e+i*t))+G(Math.round(r+a*t))+G(Math.round(u+o*t))}},d3.interpolateHsl=function(t,n){t=d3.hsl(t),n=d3.hsl(n);var e=t.h,r=t.s,u=t.l,i=n.h-e,a=n.s-r,o=n.l-u;return i>180?i-=360:-180>i&&(i+=360),function(t){return un(e+i*t,r+a*t,u+o*t)+""}},d3.interpolateLab=function(t,n){t=d3.lab(t),n=d3.lab(n);var e=t.l,r=t.a,u=t.b,i=n.l-e,a=n.a-r,o=n.b-u;return function(t){return fn(e+i*t,r+a*t,u+o*t)+""}},d3.interpolateHcl=function(t,n){t=d3.hcl(t),n=d3.hcl(n);var e=t.h,r=t.c,u=t.l,i=n.h-e,a=n.c-r,o=n.l-u;return i>180?i-=360:-180>i&&(i+=360),function(t){return cn(e+i*t,r+a*t,u+o*t)+""}},d3.interpolateArray=function(t,n){var e,r=[],u=[],i=t.length,a=n.length,o=Math.min(t.length,n.length);for(e=0;o>e;++e)r.push(d3.interpolate(t[e],n[e]));for(;i>e;++e)u[e]=t[e];for(;a>e;++e)u[e]=n[e];return function(t){for(e=0;o>e;++e)u[e]=r[e](t);return u}},d3.interpolateObject=function(t,n){var e,r={},u={};for(e in t)e in n?r[e]=V(e)(t[e],n[e]):u[e]=t[e];for(e in n)e in t||(u[e]=n[e]);return function(t){for(e in r)u[e]=r[e](t);return u}};var ua=/[-+]?(?:\d+\.?\d*|\.?\d+)(?:[eE][-+]?\d+)?/g;d3.interpolators=[d3.interpolateObject,function(t,n){return n instanceof Array&&d3.interpolateArray(t,n)},function(t,n){return("string"==typeof t||"string"==typeof n)&&d3.interpolateString(t+"",n+"")},function(t,n){return("string"==typeof n?aa.has(n)||/^(#|rgb\(|hsl\()/.test(n):n instanceof B)&&d3.interpolateRgb(t,n)},function(t,n){return!isNaN(t=+t)&&!isNaN(n=+n)&&d3.interpolateNumber(t,n)}],B.prototype.toString=function(){return this.rgb()+""},d3.rgb=function(t,n,e){return 1===arguments.length?t instanceof J?$(t.r,t.g,t.b):K(""+t,$,un):$(~~t,~~n,~~e)};var ia=J.prototype=new B;ia.brighter=function(t){t=Math.pow(.7,arguments.length?t:1);var n=this.r,e=this.g,r=this.b,u=30;return n||e||r?(n&&u>n&&(n=u),e&&u>e&&(e=u),r&&u>r&&(r=u),$(Math.min(255,Math.floor(n/t)),Math.min(255,Math.floor(e/t)),Math.min(255,Math.floor(r/t)))):$(u,u,u)},ia.darker=function(t){return t=Math.pow(.7,arguments.length?t:1),$(Math.floor(t*this.r),Math.floor(t*this.g),Math.floor(t*this.b)) -},ia.hsl=function(){return W(this.r,this.g,this.b)},ia.toString=function(){return"#"+G(this.r)+G(this.g)+G(this.b)};var aa=d3.map({aliceblue:"#f0f8ff",antiquewhite:"#faebd7",aqua:"#00ffff",aquamarine:"#7fffd4",azure:"#f0ffff",beige:"#f5f5dc",bisque:"#ffe4c4",black:"#000000",blanchedalmond:"#ffebcd",blue:"#0000ff",blueviolet:"#8a2be2",brown:"#a52a2a",burlywood:"#deb887",cadetblue:"#5f9ea0",chartreuse:"#7fff00",chocolate:"#d2691e",coral:"#ff7f50",cornflowerblue:"#6495ed",cornsilk:"#fff8dc",crimson:"#dc143c",cyan:"#00ffff",darkblue:"#00008b",darkcyan:"#008b8b",darkgoldenrod:"#b8860b",darkgray:"#a9a9a9",darkgreen:"#006400",darkgrey:"#a9a9a9",darkkhaki:"#bdb76b",darkmagenta:"#8b008b",darkolivegreen:"#556b2f",darkorange:"#ff8c00",darkorchid:"#9932cc",darkred:"#8b0000",darksalmon:"#e9967a",darkseagreen:"#8fbc8f",darkslateblue:"#483d8b",darkslategray:"#2f4f4f",darkslategrey:"#2f4f4f",darkturquoise:"#00ced1",darkviolet:"#9400d3",deeppink:"#ff1493",deepskyblue:"#00bfff",dimgray:"#696969",dimgrey:"#696969",dodgerblue:"#1e90ff",firebrick:"#b22222",floralwhite:"#fffaf0",forestgreen:"#228b22",fuchsia:"#ff00ff",gainsboro:"#dcdcdc",ghostwhite:"#f8f8ff",gold:"#ffd700",goldenrod:"#daa520",gray:"#808080",green:"#008000",greenyellow:"#adff2f",grey:"#808080",honeydew:"#f0fff0",hotpink:"#ff69b4",indianred:"#cd5c5c",indigo:"#4b0082",ivory:"#fffff0",khaki:"#f0e68c",lavender:"#e6e6fa",lavenderblush:"#fff0f5",lawngreen:"#7cfc00",lemonchiffon:"#fffacd",lightblue:"#add8e6",lightcoral:"#f08080",lightcyan:"#e0ffff",lightgoldenrodyellow:"#fafad2",lightgray:"#d3d3d3",lightgreen:"#90ee90",lightgrey:"#d3d3d3",lightpink:"#ffb6c1",lightsalmon:"#ffa07a",lightseagreen:"#20b2aa",lightskyblue:"#87cefa",lightslategray:"#778899",lightslategrey:"#778899",lightsteelblue:"#b0c4de",lightyellow:"#ffffe0",lime:"#00ff00",limegreen:"#32cd32",linen:"#faf0e6",magenta:"#ff00ff",maroon:"#800000",mediumaquamarine:"#66cdaa",mediumblue:"#0000cd",mediumorchid:"#ba55d3",mediumpurple:"#9370db",mediumseagreen:"#3cb371",mediumslateblue:"#7b68ee",mediumspringgreen:"#00fa9a",mediumturquoise:"#48d1cc",mediumvioletred:"#c71585",midnightblue:"#191970",mintcream:"#f5fffa",mistyrose:"#ffe4e1",moccasin:"#ffe4b5",navajowhite:"#ffdead",navy:"#000080",oldlace:"#fdf5e6",olive:"#808000",olivedrab:"#6b8e23",orange:"#ffa500",orangered:"#ff4500",orchid:"#da70d6",palegoldenrod:"#eee8aa",palegreen:"#98fb98",paleturquoise:"#afeeee",palevioletred:"#db7093",papayawhip:"#ffefd5",peachpuff:"#ffdab9",peru:"#cd853f",pink:"#ffc0cb",plum:"#dda0dd",powderblue:"#b0e0e6",purple:"#800080",red:"#ff0000",rosybrown:"#bc8f8f",royalblue:"#4169e1",saddlebrown:"#8b4513",salmon:"#fa8072",sandybrown:"#f4a460",seagreen:"#2e8b57",seashell:"#fff5ee",sienna:"#a0522d",silver:"#c0c0c0",skyblue:"#87ceeb",slateblue:"#6a5acd",slategray:"#708090",slategrey:"#708090",snow:"#fffafa",springgreen:"#00ff7f",steelblue:"#4682b4",tan:"#d2b48c",teal:"#008080",thistle:"#d8bfd8",tomato:"#ff6347",turquoise:"#40e0d0",violet:"#ee82ee",wheat:"#f5deb3",white:"#ffffff",whitesmoke:"#f5f5f5",yellow:"#ffff00",yellowgreen:"#9acd32"});aa.forEach(function(t,n){aa.set(t,K(n,$,un))}),d3.hsl=function(t,n,e){return 1===arguments.length?t instanceof rn?en(t.h,t.s,t.l):K(""+t,W,en):en(+t,+n,+e)};var oa=rn.prototype=new B;oa.brighter=function(t){return t=Math.pow(.7,arguments.length?t:1),en(this.h,this.s,this.l/t)},oa.darker=function(t){return t=Math.pow(.7,arguments.length?t:1),en(this.h,this.s,t*this.l)},oa.rgb=function(){return un(this.h,this.s,this.l)},d3.hcl=function(t,n,e){return 1===arguments.length?t instanceof on?an(t.h,t.c,t.l):t instanceof sn?hn(t.l,t.a,t.b):hn((t=Q((t=d3.rgb(t)).r,t.g,t.b)).l,t.a,t.b):an(+t,+n,+e)};var ca=on.prototype=new B;ca.brighter=function(t){return an(this.h,this.c,Math.min(100,this.l+la*(arguments.length?t:1)))},ca.darker=function(t){return an(this.h,this.c,Math.max(0,this.l-la*(arguments.length?t:1)))},ca.rgb=function(){return cn(this.h,this.c,this.l).rgb()},d3.lab=function(t,n,e){return 1===arguments.length?t instanceof sn?ln(t.l,t.a,t.b):t instanceof on?cn(t.l,t.c,t.h):Q((t=d3.rgb(t)).r,t.g,t.b):ln(+t,+n,+e)};var la=18,sa=.95047,fa=1,ha=1.08883,da=sn.prototype=new B;da.brighter=function(t){return ln(Math.min(100,this.l+la*(arguments.length?t:1)),this.a,this.b)},da.darker=function(t){return ln(Math.max(0,this.l-la*(arguments.length?t:1)),this.a,this.b)},da.rgb=function(){return fn(this.l,this.a,this.b)};var ga=function(t,n){return n.querySelector(t)},pa=function(t,n){return n.querySelectorAll(t)},ma=document.documentElement,va=ma.matchesSelector||ma.webkitMatchesSelector||ma.mozMatchesSelector||ma.msMatchesSelector||ma.oMatchesSelector,ya=function(t,n){return va.call(t,n)};"function"==typeof Sizzle&&(ga=function(t,n){return Sizzle(t,n)[0]||null},pa=function(t,n){return Sizzle.uniqueSort(Sizzle(t,n))},ya=Sizzle.matchesSelector);var Ma=[];d3.selection=function(){return ba},d3.selection.prototype=Ma,Ma.select=function(t){var n,e,r,u,i=[];"function"!=typeof t&&(t=vn(t));for(var a=-1,o=this.length;o>++a;){i.push(n=[]),n.parentNode=(r=this[a]).parentNode;for(var c=-1,l=r.length;l>++c;)(u=r[c])?(n.push(e=t.call(u,u.__data__,c)),e&&"__data__"in u&&(e.__data__=u.__data__)):n.push(null)}return mn(i)},Ma.selectAll=function(t){var n,e,r=[];"function"!=typeof t&&(t=yn(t));for(var u=-1,i=this.length;i>++u;)for(var a=this[u],o=-1,c=a.length;c>++o;)(e=a[o])&&(r.push(n=Yi(t.call(e,e.__data__,o))),n.parentNode=e);return mn(r)},Ma.attr=function(t,n){if(2>arguments.length){if("string"==typeof t){var e=this.node();return t=d3.ns.qualify(t),t.local?e.getAttributeNS(t.space,t.local):e.getAttribute(t)}for(n in t)this.each(Mn(n,t[n]));return this}return this.each(Mn(t,n))},Ma.classed=function(t,n){if(2>arguments.length){if("string"==typeof t){var e=this.node(),r=(t=t.trim().split(/^|\s+/g)).length,u=-1;if(n=e.classList){for(;r>++u;)if(!n.contains(t[u]))return!1}else for(n=e.className,null!=n.baseVal&&(n=n.baseVal);r>++u;)if(!bn(t[u]).test(n))return!1;return!0}for(n in t)this.each(xn(n,t[n]));return this}return this.each(xn(t,n))},Ma.style=function(t,n,e){var r=arguments.length;if(3>r){if("string"!=typeof t){2>r&&(n="");for(e in t)this.each(wn(e,t[e],n));return this}if(2>r)return getComputedStyle(this.node(),null).getPropertyValue(t);e=""}return this.each(wn(t,n,e))},Ma.property=function(t,n){if(2>arguments.length){if("string"==typeof t)return this.node()[t];for(n in t)this.each(Sn(n,t[n]));return this}return this.each(Sn(t,n))},Ma.text=function(t){return arguments.length?this.each("function"==typeof t?function(){var n=t.apply(this,arguments);this.textContent=null==n?"":n}:null==t?function(){this.textContent=""}:function(){this.textContent=t}):this.node().textContent},Ma.html=function(t){return arguments.length?this.each("function"==typeof t?function(){var n=t.apply(this,arguments);this.innerHTML=null==n?"":n}:null==t?function(){this.innerHTML=""}:function(){this.innerHTML=t}):this.node().innerHTML},Ma.append=function(t){function n(){return this.appendChild(document.createElementNS(this.namespaceURI,t))}function e(){return this.appendChild(document.createElementNS(t.space,t.local))}return t=d3.ns.qualify(t),this.select(t.local?e:n)},Ma.insert=function(t,n){function e(){return this.insertBefore(document.createElementNS(this.namespaceURI,t),ga(n,this))}function r(){return this.insertBefore(document.createElementNS(t.space,t.local),ga(n,this))}return t=d3.ns.qualify(t),this.select(t.local?r:e)},Ma.remove=function(){return this.each(function(){var t=this.parentNode;t&&t.removeChild(this)})},Ma.data=function(t,n){function e(t,e){var r,u,a,o=t.length,f=e.length,h=Math.min(o,f),d=Math.max(o,f),g=[],p=[],m=[];if(n){var v,y=new i,M=[],b=e.length;for(r=-1;o>++r;)v=n.call(u=t[r],u.__data__,r),y.has(v)?m[b++]=u:y.set(v,u),M.push(v);for(r=-1;f>++r;)v=n.call(e,a=e[r],r),y.has(v)?(g[r]=u=y.get(v),u.__data__=a,p[r]=m[r]=null):(p[r]=kn(a),g[r]=m[r]=null),y.remove(v);for(r=-1;o>++r;)y.has(M[r])&&(m[r]=t[r])}else{for(r=-1;h>++r;)u=t[r],a=e[r],u?(u.__data__=a,g[r]=u,p[r]=m[r]=null):(p[r]=kn(a),g[r]=m[r]=null);for(;f>r;++r)p[r]=kn(e[r]),g[r]=m[r]=null;for(;d>r;++r)m[r]=t[r],p[r]=g[r]=null}p.update=g,p.parentNode=g.parentNode=m.parentNode=t.parentNode,c.push(p),l.push(g),s.push(m)}var r,u,a=-1,o=this.length;if(!arguments.length){for(t=Array(o=(r=this[0]).length);o>++a;)(u=r[a])&&(t[a]=u.__data__);return t}var c=qn([]),l=mn([]),s=mn([]);if("function"==typeof t)for(;o>++a;)e(r=this[a],t.call(r,r.parentNode.__data__,a));else for(;o>++a;)e(r=this[a],t);return l.enter=function(){return c},l.exit=function(){return s},l},Ma.datum=function(t){return arguments.length?this.property("__data__",t):this.property("__data__")},Ma.filter=function(t){var n,e,r,u=[];"function"!=typeof t&&(t=En(t));for(var i=0,a=this.length;a>i;i++){u.push(n=[]),n.parentNode=(e=this[i]).parentNode;for(var o=0,c=e.length;c>o;o++)(r=e[o])&&t.call(r,r.__data__,o)&&n.push(r)}return mn(u)},Ma.order=function(){for(var t=-1,n=this.length;n>++t;)for(var e,r=this[t],u=r.length-1,i=r[u];--u>=0;)(e=r[u])&&(i&&i!==e.nextSibling&&i.parentNode.insertBefore(e,i),i=e);return this},Ma.sort=function(t){t=An.apply(this,arguments);for(var n=-1,e=this.length;e>++n;)this[n].sort(t);return this.order()},Ma.on=function(t,n,e){var r=arguments.length;if(3>r){if("string"!=typeof t){2>r&&(n=!1);for(e in t)this.each(Nn(e,t[e],n));return this}if(2>r)return(r=this.node()["__on"+t])&&r._;e=!1}return this.each(Nn(t,n,e))},Ma.each=function(t){return Tn(this,function(n,e,r){t.call(n,n.__data__,e,r)})},Ma.call=function(t){var n=Yi(arguments);return t.apply(n[0]=this,n),this},Ma.empty=function(){return!this.node()},Ma.node=function(){for(var t=0,n=this.length;n>t;t++)for(var e=this[t],r=0,u=e.length;u>r;r++){var i=e[r];if(i)return i}return null},Ma.transition=function(){var t,n,e=_a||++Sa,r=[],u=Object.create(ka);u.time=Date.now();for(var i=-1,a=this.length;a>++i;){r.push(t=[]);for(var o=this[i],c=-1,l=o.length;l>++c;)(n=o[c])&&zn(n,c,e,u),t.push(n)}return Cn(r,e)};var ba=mn([[document]]);ba[0].parentNode=ma,d3.select=function(t){return"string"==typeof t?ba.select(t):mn([[t]])},d3.selectAll=function(t){return"string"==typeof t?ba.selectAll(t):mn([Yi(t)])};var xa=[];d3.selection.enter=qn,d3.selection.enter.prototype=xa,xa.append=Ma.append,xa.insert=Ma.insert,xa.empty=Ma.empty,xa.node=Ma.node,xa.select=function(t){for(var n,e,r,u,i,a=[],o=-1,c=this.length;c>++o;){r=(u=this[o]).update,a.push(n=[]),n.parentNode=u.parentNode;for(var l=-1,s=u.length;s>++l;)(i=u[l])?(n.push(r[l]=e=t.call(u.parentNode,i.__data__,l)),e.__data__=i.__data__):n.push(null)}return mn(a)};var _a,wa=[],Sa=0,ka={ease:T,delay:0,duration:250};wa.call=Ma.call,wa.empty=Ma.empty,wa.node=Ma.node,d3.transition=function(t){return arguments.length?_a?t.transition():t:ba.transition()},d3.transition.prototype=wa,wa.select=function(t){var n,e,r,u=this.id,i=[];"function"!=typeof t&&(t=vn(t));for(var a=-1,o=this.length;o>++a;){i.push(n=[]);for(var c=this[a],l=-1,s=c.length;s>++l;)(r=c[l])&&(e=t.call(r,r.__data__,l))?("__data__"in r&&(e.__data__=r.__data__),zn(e,l,u,r.__transition__[u]),n.push(e)):n.push(null)}return Cn(i,u)},wa.selectAll=function(t){var n,e,r,u,i,a=this.id,o=[];"function"!=typeof t&&(t=yn(t));for(var c=-1,l=this.length;l>++c;)for(var s=this[c],f=-1,h=s.length;h>++f;)if(r=s[f]){i=r.__transition__[a],e=t.call(r,r.__data__,f),o.push(n=[]);for(var d=-1,g=e.length;g>++d;)zn(u=e[d],d,a,i),n.push(u)}return Cn(o,a)},wa.filter=function(t){var n,e,r,u=[];"function"!=typeof t&&(t=En(t));for(var i=0,a=this.length;a>i;i++){u.push(n=[]);for(var e=this[i],o=0,c=e.length;c>o;o++)(r=e[o])&&t.call(r,r.__data__,o)&&n.push(r)}return Cn(u,this.id,this.time).ease(this.ease())},wa.attr=function(t,n){function e(){this.removeAttribute(i)}function r(){this.removeAttributeNS(i.space,i.local)}if(2>arguments.length){for(n in t)this.attr(n,t[n]);return this}var u=V(t),i=d3.ns.qualify(t);return Ln(this,"attr."+t,n,function(t){function n(){var n,e=this.getAttribute(i);return e!==t&&(n=u(e,t),function(t){this.setAttribute(i,n(t))})}function a(){var n,e=this.getAttributeNS(i.space,i.local);return e!==t&&(n=u(e,t),function(t){this.setAttributeNS(i.space,i.local,n(t))})}return null==t?i.local?r:e:(t+="",i.local?a:n)})},wa.attrTween=function(t,n){function e(t,e){var r=n.call(this,t,e,this.getAttribute(u));return r&&function(t){this.setAttribute(u,r(t))}}function r(t,e){var r=n.call(this,t,e,this.getAttributeNS(u.space,u.local));return r&&function(t){this.setAttributeNS(u.space,u.local,r(t))}}var u=d3.ns.qualify(t);return this.tween("attr."+t,u.local?r:e)},wa.style=function(t,n,e){function r(){this.style.removeProperty(t)}var u=arguments.length;if(3>u){if("string"!=typeof t){2>u&&(n="");for(e in t)this.style(e,t[e],n);return this}e=""}var i=V(t);return Ln(this,"style."+t,n,function(n){function u(){var r,u=getComputedStyle(this,null).getPropertyValue(t);return u!==n&&(r=i(u,n),function(n){this.style.setProperty(t,r(n),e)})}return null==n?r:(n+="",u)})},wa.styleTween=function(t,n,e){return 3>arguments.length&&(e=""),this.tween("style."+t,function(r,u){var i=n.call(this,r,u,getComputedStyle(this,null).getPropertyValue(t));return i&&function(n){this.style.setProperty(t,i(n),e)}})},wa.text=function(t){return Ln(this,"text",t,Dn)},wa.remove=function(){return this.each("end.transition",function(){var t;!this.__transition__&&(t=this.parentNode)&&t.removeChild(this)})},wa.ease=function(t){var n=this.id;return 1>arguments.length?this.node().__transition__[n].ease:("function"!=typeof t&&(t=d3.ease.apply(d3,arguments)),Tn(this,function(e){e.__transition__[n].ease=t}))},wa.delay=function(t){var n=this.id;return Tn(this,"function"==typeof t?function(e,r,u){e.__transition__[n].delay=0|t.call(e,e.__data__,r,u)}:(t|=0,function(e){e.__transition__[n].delay=t}))},wa.duration=function(t){var n=this.id;return Tn(this,"function"==typeof t?function(e,r,u){e.__transition__[n].duration=Math.max(1,0|t.call(e,e.__data__,r,u))}:(t=Math.max(1,0|t),function(e){e.__transition__[n].duration=t}))},wa.each=function(t,n){var e=this.id;if(2>arguments.length){var r=ka,u=_a;_a=e,Tn(this,function(n,r,u){ka=n.__transition__[e],t.call(n,n.__data__,r,u)}),ka=r,_a=u}else Tn(this,function(r){r.__transition__[e].event.on(t,n)});return this},wa.transition=function(){for(var t,n,e,r,u=this.id,i=++Sa,a=[],o=0,c=this.length;c>o;o++){a.push(t=[]);for(var n=this[o],l=0,s=n.length;s>l;l++)(e=n[l])&&(r=Object.create(e.__transition__[u]),r.delay+=r.duration,zn(e,l,i,r)),t.push(e)}return Cn(a,i)},wa.tween=function(t,n){var e=this.id;return 2>arguments.length?this.node().__transition__[e].tween.get(t):Tn(this,null==n?function(n){n.__transition__[e].tween.remove(t)}:function(r){r.__transition__[e].tween.set(t,n)})};var Ea,Aa,Na=0,Ta={},qa=null;d3.timer=function(t,n,e){if(3>arguments.length){if(2>arguments.length)n=0;else if(!isFinite(n))return;e=Date.now()}var r=Ta[t.id];r&&r.callback===t?(r.then=e,r.delay=n):Ta[t.id=++Na]=qa={callback:t,then:e,delay:n,next:qa},Ea||(Aa=clearTimeout(Aa),Ea=1,Ca(Fn))},d3.timer.flush=function(){for(var t,n=Date.now(),e=qa;e;)t=n-e.then,e.delay||(e.flush=e.callback(t)),e=e.next;Hn()};var Ca=window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||window.oRequestAnimationFrame||window.msRequestAnimationFrame||function(t){setTimeout(t,17)};d3.mouse=function(t){return Rn(t,P())};var za=/WebKit/.test(navigator.userAgent)?-1:0;d3.touches=function(t,n){return 2>arguments.length&&(n=P().touches),n?Yi(n).map(function(n){var e=Rn(t,n);return e.identifier=n.identifier,e}):[]},d3.scale={},d3.scale.linear=function(){return In([0,1],[0,1],d3.interpolate,!1)},d3.scale.log=function(){return Kn(d3.scale.linear(),Wn)};var Da=d3.format(".0e");Wn.pow=function(t){return Math.pow(10,t)},Qn.pow=function(t){return-Math.pow(10,-t)},d3.scale.pow=function(){return te(d3.scale.linear(),1)},d3.scale.sqrt=function(){return d3.scale.pow().exponent(.5)},d3.scale.ordinal=function(){return ee([],{t:"range",a:[[]]})},d3.scale.category10=function(){return d3.scale.ordinal().range(La)},d3.scale.category20=function(){return d3.scale.ordinal().range(Fa)},d3.scale.category20b=function(){return d3.scale.ordinal().range(Ha)},d3.scale.category20c=function(){return d3.scale.ordinal().range(Ra)};var La=["#1f77b4","#ff7f0e","#2ca02c","#d62728","#9467bd","#8c564b","#e377c2","#7f7f7f","#bcbd22","#17becf"],Fa=["#1f77b4","#aec7e8","#ff7f0e","#ffbb78","#2ca02c","#98df8a","#d62728","#ff9896","#9467bd","#c5b0d5","#8c564b","#c49c94","#e377c2","#f7b6d2","#7f7f7f","#c7c7c7","#bcbd22","#dbdb8d","#17becf","#9edae5"],Ha=["#393b79","#5254a3","#6b6ecf","#9c9ede","#637939","#8ca252","#b5cf6b","#cedb9c","#8c6d31","#bd9e39","#e7ba52","#e7cb94","#843c39","#ad494a","#d6616b","#e7969c","#7b4173","#a55194","#ce6dbd","#de9ed6"],Ra=["#3182bd","#6baed6","#9ecae1","#c6dbef","#e6550d","#fd8d3c","#fdae6b","#fdd0a2","#31a354","#74c476","#a1d99b","#c7e9c0","#756bb1","#9e9ac8","#bcbddc","#dadaeb","#636363","#969696","#bdbdbd","#d9d9d9"];d3.scale.quantile=function(){return re([],[])},d3.scale.quantize=function(){return ue(0,1,[0,1])},d3.scale.threshold=function(){return ie([.5],[0,1])},d3.scale.identity=function(){return ae([0,1])},d3.svg={},d3.svg.arc=function(){function t(){var t=n.apply(this,arguments),i=e.apply(this,arguments),a=r.apply(this,arguments)+Pa,o=u.apply(this,arguments)+Pa,c=(a>o&&(c=a,a=o,o=c),o-a),l=Ri>c?"0":"1",s=Math.cos(a),f=Math.sin(a),h=Math.cos(o),d=Math.sin(o);return c>=ja?t?"M0,"+i+"A"+i+","+i+" 0 1,1 0,"+-i+"A"+i+","+i+" 0 1,1 0,"+i+"M0,"+t+"A"+t+","+t+" 0 1,0 0,"+-t+"A"+t+","+t+" 0 1,0 0,"+t+"Z":"M0,"+i+"A"+i+","+i+" 0 1,1 0,"+-i+"A"+i+","+i+" 0 1,1 0,"+i+"Z":t?"M"+i*s+","+i*f+"A"+i+","+i+" 0 "+l+",1 "+i*h+","+i*d+"L"+t*h+","+t*d+"A"+t+","+t+" 0 "+l+",0 "+t*s+","+t*f+"Z":"M"+i*s+","+i*f+"A"+i+","+i+" 0 "+l+",1 "+i*h+","+i*d+"L0,0"+"Z"}var n=oe,e=ce,r=le,u=se;return t.innerRadius=function(e){return arguments.length?(n=c(e),t):n},t.outerRadius=function(n){return arguments.length?(e=c(n),t):e},t.startAngle=function(n){return arguments.length?(r=c(n),t):r},t.endAngle=function(n){return arguments.length?(u=c(n),t):u},t.centroid=function(){var t=(n.apply(this,arguments)+e.apply(this,arguments))/2,i=(r.apply(this,arguments)+u.apply(this,arguments))/2+Pa;return[Math.cos(i)*t,Math.sin(i)*t]},t};var Pa=-Ri/2,ja=2*Ri-1e-6;d3.svg.line=function(){return fe(a)};var Oa=d3.map({linear:ge,"linear-closed":pe,"step-before":me,"step-after":ve,basis:we,"basis-open":Se,"basis-closed":ke,bundle:Ee,cardinal:be,"cardinal-open":ye,"cardinal-closed":Me,monotone:ze});Oa.forEach(function(t,n){n.key=t,n.closed=/-closed$/.test(t)});var Ya=[0,2/3,1/3,0],Ua=[0,1/3,2/3,0],Ia=[0,1/6,2/3,1/6];d3.svg.line.radial=function(){var t=fe(De);return t.radius=t.x,delete t.x,t.angle=t.y,delete t.y,t},me.reverse=ve,ve.reverse=me,d3.svg.area=function(){return Le(a)},d3.svg.area.radial=function(){var t=Le(De);return t.radius=t.x,delete t.x,t.innerRadius=t.x0,delete t.x0,t.outerRadius=t.x1,delete t.x1,t.angle=t.y,delete t.y,t.startAngle=t.y0,delete t.y0,t.endAngle=t.y1,delete t.y1,t},d3.svg.chord=function(){function e(t,n){var e=r(this,o,t,n),c=r(this,l,t,n);return"M"+e.p0+i(e.r,e.p1,e.a1-e.a0)+(u(e,c)?a(e.r,e.p1,e.r,e.p0):a(e.r,e.p1,c.r,c.p0)+i(c.r,c.p1,c.a1-c.a0)+a(c.r,c.p1,e.r,e.p0))+"Z"}function r(t,n,e,r){var u=n.call(t,e,r),i=s.call(t,u,r),a=f.call(t,u,r)+Pa,o=h.call(t,u,r)+Pa;return{r:i,a0:a,a1:o,p0:[i*Math.cos(a),i*Math.sin(a)],p1:[i*Math.cos(o),i*Math.sin(o)]}}function u(t,n){return t.a0==n.a0&&t.a1==n.a1}function i(t,n,e){return"A"+t+","+t+" 0 "+ +(e>Ri)+",1 "+n}function a(t,n,e,r){return"Q 0,0 "+r}var o=n,l=t,s=Fe,f=le,h=se;return e.radius=function(t){return arguments.length?(s=c(t),e):s},e.source=function(t){return arguments.length?(o=c(t),e):o},e.target=function(t){return arguments.length?(l=c(t),e):l},e.startAngle=function(t){return arguments.length?(f=c(t),e):f},e.endAngle=function(t){return arguments.length?(h=c(t),e):h},e},d3.svg.diagonal=function(){function e(t,n){var e=r.call(this,t,n),a=u.call(this,t,n),o=(e.y+a.y)/2,c=[e,{x:e.x,y:o},{x:a.x,y:o},a];return c=c.map(i),"M"+c[0]+"C"+c[1]+" "+c[2]+" "+c[3]}var r=n,u=t,i=He;return e.source=function(t){return arguments.length?(r=c(t),e):r},e.target=function(t){return arguments.length?(u=c(t),e):u},e.projection=function(t){return arguments.length?(i=t,e):i},e},d3.svg.diagonal.radial=function(){var t=d3.svg.diagonal(),n=He,e=t.projection;return t.projection=function(t){return arguments.length?e(Re(n=t)):n},t},d3.svg.symbol=function(){function t(t,r){return(Va.get(n.call(this,t,r))||Oe)(e.call(this,t,r))}var n=je,e=Pe;return t.type=function(e){return arguments.length?(n=c(e),t):n},t.size=function(n){return arguments.length?(e=c(n),t):e},t};var Va=d3.map({circle:Oe,cross:function(t){var n=Math.sqrt(t/5)/2;return"M"+-3*n+","+-n+"H"+-n+"V"+-3*n+"H"+n+"V"+-n+"H"+3*n+"V"+n+"H"+n+"V"+3*n+"H"+-n+"V"+n+"H"+-3*n+"Z"},diamond:function(t){var n=Math.sqrt(t/(2*Za)),e=n*Za;return"M0,"+-n+"L"+e+",0"+" 0,"+n+" "+-e+",0"+"Z"},square:function(t){var n=Math.sqrt(t)/2;return"M"+-n+","+-n+"L"+n+","+-n+" "+n+","+n+" "+-n+","+n+"Z"},"triangle-down":function(t){var n=Math.sqrt(t/Xa),e=n*Xa/2;return"M0,"+e+"L"+n+","+-e+" "+-n+","+-e+"Z"},"triangle-up":function(t){var n=Math.sqrt(t/Xa),e=n*Xa/2;return"M0,"+-e+"L"+n+","+e+" "+-n+","+e+"Z"}});d3.svg.symbolTypes=Va.keys();var Xa=Math.sqrt(3),Za=Math.tan(30*ji);d3.svg.axis=function(){function t(t){t.each(function(){var t,f=d3.select(this),h=null==l?e.ticks?e.ticks.apply(e,c):e.domain():l,d=null==n?e.tickFormat?e.tickFormat.apply(e,c):String:n,g=Ie(e,h,s),p=f.selectAll(".minor").data(g,String),m=p.enter().insert("line","g").attr("class","tick minor").style("opacity",1e-6),v=d3.transition(p.exit()).style("opacity",1e-6).remove(),y=d3.transition(p).style("opacity",1),M=f.selectAll("g").data(h,String),b=M.enter().insert("g","path").style("opacity",1e-6),x=d3.transition(M.exit()).style("opacity",1e-6).remove(),_=d3.transition(M).style("opacity",1),w=On(e),S=f.selectAll(".domain").data([0]),k=d3.transition(S),E=e.copy(),A=this.__chart__||E;this.__chart__=E,S.enter().append("path").attr("class","domain"),b.append("line").attr("class","tick"),b.append("text");var N=b.select("line"),T=_.select("line"),q=M.select("text").text(d),C=b.select("text"),z=_.select("text");switch(r){case"bottom":t=Ye,m.attr("y2",i),y.attr("x2",0).attr("y2",i),N.attr("y2",u),C.attr("y",Math.max(u,0)+o),T.attr("x2",0).attr("y2",u),z.attr("x",0).attr("y",Math.max(u,0)+o),q.attr("dy",".71em").style("text-anchor","middle"),k.attr("d","M"+w[0]+","+a+"V0H"+w[1]+"V"+a);break;case"top":t=Ye,m.attr("y2",-i),y.attr("x2",0).attr("y2",-i),N.attr("y2",-u),C.attr("y",-(Math.max(u,0)+o)),T.attr("x2",0).attr("y2",-u),z.attr("x",0).attr("y",-(Math.max(u,0)+o)),q.attr("dy","0em").style("text-anchor","middle"),k.attr("d","M"+w[0]+","+-a+"V0H"+w[1]+"V"+-a);break;case"left":t=Ue,m.attr("x2",-i),y.attr("x2",-i).attr("y2",0),N.attr("x2",-u),C.attr("x",-(Math.max(u,0)+o)),T.attr("x2",-u).attr("y2",0),z.attr("x",-(Math.max(u,0)+o)).attr("y",0),q.attr("dy",".32em").style("text-anchor","end"),k.attr("d","M"+-a+","+w[0]+"H0V"+w[1]+"H"+-a);break;case"right":t=Ue,m.attr("x2",i),y.attr("x2",i).attr("y2",0),N.attr("x2",u),C.attr("x",Math.max(u,0)+o),T.attr("x2",u).attr("y2",0),z.attr("x",Math.max(u,0)+o).attr("y",0),q.attr("dy",".32em").style("text-anchor","start"),k.attr("d","M"+a+","+w[0]+"H0V"+w[1]+"H"+a)}if(e.ticks)b.call(t,A),_.call(t,E),x.call(t,E),m.call(t,A),y.call(t,E),v.call(t,E);else{var D=E.rangeBand()/2,L=function(t){return E(t)+D};b.call(t,L),_.call(t,L)}})}var n,e=d3.scale.linear(),r="bottom",u=6,i=6,a=6,o=3,c=[10],l=null,s=0;return t.scale=function(n){return arguments.length?(e=n,t):e},t.orient=function(n){return arguments.length?(r=n,t):r},t.ticks=function(){return arguments.length?(c=arguments,t):c},t.tickValues=function(n){return arguments.length?(l=n,t):l},t.tickFormat=function(e){return arguments.length?(n=e,t):n},t.tickSize=function(n,e){if(!arguments.length)return u;var r=arguments.length-1;return u=+n,i=r>1?+e:u,a=r>0?+arguments[r]:u,t},t.tickPadding=function(n){return arguments.length?(o=+n,t):o},t.tickSubdivide=function(n){return arguments.length?(s=+n,t):s},t},d3.svg.brush=function(){function t(i){i.each(function(){var i,a=d3.select(this),s=a.selectAll(".background").data([0]),f=a.selectAll(".extent").data([0]),h=a.selectAll(".resize").data(l,String);a.style("pointer-events","all").on("mousedown.brush",u).on("touchstart.brush",u),s.enter().append("rect").attr("class","background").style("visibility","hidden").style("cursor","crosshair"),f.enter().append("rect").attr("class","extent").style("cursor","move"),h.enter().append("g").attr("class",function(t){return"resize "+t}).style("cursor",function(t){return Ba[t]}).append("rect").attr("x",function(t){return/[ew]$/.test(t)?-3:null}).attr("y",function(t){return/^[ns]/.test(t)?-3:null}).attr("width",6).attr("height",6).style("visibility","hidden"),h.style("display",t.empty()?"none":null),h.exit().remove(),o&&(i=On(o),s.attr("x",i[0]).attr("width",i[1]-i[0]),e(a)),c&&(i=On(c),s.attr("y",i[0]).attr("height",i[1]-i[0]),r(a)),n(a)})}function n(t){t.selectAll(".resize").attr("transform",function(t){return"translate("+s[+/e$/.test(t)][0]+","+s[+/^s/.test(t)][1]+")"})}function e(t){t.select(".extent").attr("x",s[0][0]),t.selectAll(".extent,.n>rect,.s>rect").attr("width",s[1][0]-s[0][0])}function r(t){t.select(".extent").attr("y",s[0][1]),t.selectAll(".extent,.e>rect,.w>rect").attr("height",s[1][1]-s[0][1])}function u(){function u(){var t=d3.event.changedTouches;return t?d3.touches(v,t)[0]:d3.mouse(v)}function l(){32==d3.event.keyCode&&(S||(p=null,k[0]-=s[1][0],k[1]-=s[1][1],S=2),R())}function f(){32==d3.event.keyCode&&2==S&&(k[0]+=s[1][0],k[1]+=s[1][1],S=0,R())}function h(){var t=u(),i=!1;m&&(t[0]+=m[0],t[1]+=m[1]),S||(d3.event.altKey?(p||(p=[(s[0][0]+s[1][0])/2,(s[0][1]+s[1][1])/2]),k[0]=s[+(t[0]<p[0])][0],k[1]=s[+(t[1]<p[1])][1]):p=null),_&&d(t,o,0)&&(e(b),i=!0),w&&d(t,c,1)&&(r(b),i=!0),i&&(n(b),M({type:"brush",mode:S?"move":"resize"}))}function d(t,n,e){var r,u,a=On(n),o=a[0],c=a[1],l=k[e],f=s[1][e]-s[0][e];return S&&(o-=l,c-=f+l),r=Math.max(o,Math.min(c,t[e])),S?u=(r+=l)+f:(p&&(l=Math.max(o,Math.min(c,2*p[e]-r))),r>l?(u=r,r=l):u=l),s[0][e]!==r||s[1][e]!==u?(i=null,s[0][e]=r,s[1][e]=u,!0):void 0}function g(){h(),b.style("pointer-events","all").selectAll(".resize").style("display",t.empty()?"none":null),d3.select("body").style("cursor",null),E.on("mousemove.brush",null).on("mouseup.brush",null).on("touchmove.brush",null).on("touchend.brush",null).on("keydown.brush",null).on("keyup.brush",null),M({type:"brushend"}),R()}var p,m,v=this,y=d3.select(d3.event.target),M=a.of(v,arguments),b=d3.select(v),x=y.datum(),_=!/^(n|s)$/.test(x)&&o,w=!/^(e|w)$/.test(x)&&c,S=y.classed("extent"),k=u(),E=d3.select(window).on("mousemove.brush",h).on("mouseup.brush",g).on("touchmove.brush",h).on("touchend.brush",g).on("keydown.brush",l).on("keyup.brush",f);if(S)k[0]=s[0][0]-k[0],k[1]=s[0][1]-k[1];else if(x){var A=+/w$/.test(x),N=+/^n/.test(x);m=[s[1-A][0]-k[0],s[1-N][1]-k[1]],k[0]=s[A][0],k[1]=s[N][1]}else d3.event.altKey&&(p=k.slice());b.style("pointer-events","none").selectAll(".resize").style("display",null),d3.select("body").style("cursor",y.style("cursor")),M({type:"brushstart"}),h(),R()}var i,a=j(t,"brushstart","brush","brushend"),o=null,c=null,l=$a[0],s=[[0,0],[0,0]];return t.x=function(n){return arguments.length?(o=n,l=$a[!o<<1|!c],t):o},t.y=function(n){return arguments.length?(c=n,l=$a[!o<<1|!c],t):c},t.extent=function(n){var e,r,u,a,l;return arguments.length?(i=[[0,0],[0,0]],o&&(e=n[0],r=n[1],c&&(e=e[0],r=r[0]),i[0][0]=e,i[1][0]=r,o.invert&&(e=o(e),r=o(r)),e>r&&(l=e,e=r,r=l),s[0][0]=0|e,s[1][0]=0|r),c&&(u=n[0],a=n[1],o&&(u=u[1],a=a[1]),i[0][1]=u,i[1][1]=a,c.invert&&(u=c(u),a=c(a)),u>a&&(l=u,u=a,a=l),s[0][1]=0|u,s[1][1]=0|a),t):(n=i||s,o&&(e=n[0][0],r=n[1][0],i||(e=s[0][0],r=s[1][0],o.invert&&(e=o.invert(e),r=o.invert(r)),e>r&&(l=e,e=r,r=l))),c&&(u=n[0][1],a=n[1][1],i||(u=s[0][1],a=s[1][1],c.invert&&(u=c.invert(u),a=c.invert(a)),u>a&&(l=u,u=a,a=l))),o&&c?[[e,u],[r,a]]:o?[e,r]:c&&[u,a])},t.clear=function(){return i=null,s[0][0]=s[0][1]=s[1][0]=s[1][1]=0,t},t.empty=function(){return o&&s[0][0]===s[1][0]||c&&s[0][1]===s[1][1]},d3.rebind(t,a,"on")};var Ba={n:"ns-resize",e:"ew-resize",s:"ns-resize",w:"ew-resize",nw:"nwse-resize",ne:"nesw-resize",se:"nwse-resize",sw:"nesw-resize"},$a=[["n","e","s","w","nw","ne","se","sw"],["e","w"],["n","s"],[]];d3.behavior={},d3.behavior.drag=function(){function t(){this.on("mousedown.drag",n).on("touchstart.drag",n)}function n(){function t(){var t=o.parentNode;return null!=s?d3.touches(t).filter(function(t){return t.identifier===s})[0]:d3.mouse(t)}function n(){if(!o.parentNode)return u();var n=t(),e=n[0]-f[0],r=n[1]-f[1];h|=e|r,f=n,R(),c({type:"drag",x:n[0]+a[0],y:n[1]+a[1],dx:e,dy:r})}function u(){c({type:"dragend"}),h&&(R(),d3.event.target===l&&d.on("click.drag",i,!0)),d.on(null!=s?"touchmove.drag-"+s:"mousemove.drag",null).on(null!=s?"touchend.drag-"+s:"mouseup.drag",null)}function i(){R(),d.on("click.drag",null)}var a,o=this,c=e.of(o,arguments),l=d3.event.target,s=d3.event.touches?d3.event.changedTouches[0].identifier:null,f=t(),h=0,d=d3.select(window).on(null!=s?"touchmove.drag-"+s:"mousemove.drag",n).on(null!=s?"touchend.drag-"+s:"mouseup.drag",u,!0);r?(a=r.apply(o,arguments),a=[a.x-f[0],a.y-f[1]]):a=[0,0],null==s&&R(),c({type:"dragstart"})}var e=j(t,"drag","dragstart","dragend"),r=null;return t.origin=function(n){return arguments.length?(r=n,t):r},d3.rebind(t,e,"on")},d3.behavior.zoom=function(){function t(){this.on("mousedown.zoom",o).on("mousewheel.zoom",c).on("mousemove.zoom",l).on("DOMMouseScroll.zoom",c).on("dblclick.zoom",s).on("touchstart.zoom",f).on("touchmove.zoom",h).on("touchend.zoom",f)}function n(t){return[(t[0]-b[0])/x,(t[1]-b[1])/x]}function e(t){return[t[0]*x+b[0],t[1]*x+b[1]]}function r(t){x=Math.max(_[0],Math.min(_[1],t))}function u(t,n){n=e(n),b[0]+=t[0]-n[0],b[1]+=t[1]-n[1]}function i(){m&&m.domain(p.range().map(function(t){return(t-b[0])/x}).map(p.invert)),y&&y.domain(v.range().map(function(t){return(t-b[1])/x}).map(v.invert))}function a(t){i(),d3.event.preventDefault(),t({type:"zoom",scale:x,translate:b})}function o(){function t(){l=1,u(d3.mouse(i),f),a(o)}function e(){l&&R(),s.on("mousemove.zoom",null).on("mouseup.zoom",null),l&&d3.event.target===c&&s.on("click.zoom",r,!0)}function r(){R(),s.on("click.zoom",null)}var i=this,o=w.of(i,arguments),c=d3.event.target,l=0,s=d3.select(window).on("mousemove.zoom",t).on("mouseup.zoom",e),f=n(d3.mouse(i));window.focus(),R()}function c(){d||(d=n(d3.mouse(this))),r(Math.pow(2,.002*Ve())*x),u(d3.mouse(this),d),a(w.of(this,arguments))}function l(){d=null}function s(){var t=d3.mouse(this),e=n(t),i=Math.log(x)/Math.LN2;r(Math.pow(2,d3.event.shiftKey?Math.ceil(i)-1:Math.floor(i)+1)),u(t,e),a(w.of(this,arguments))}function f(){var t=d3.touches(this),e=Date.now();if(g=x,d={},t.forEach(function(t){d[t.identifier]=n(t)}),R(),1===t.length){if(500>e-M){var i=t[0],o=n(t[0]);r(2*x),u(i,o),a(w.of(this,arguments))}M=e}}function h(){var t=d3.touches(this),n=t[0],e=d[n.identifier];if(i=t[1]){var i,o=d[i.identifier];n=[(n[0]+i[0])/2,(n[1]+i[1])/2],e=[(e[0]+o[0])/2,(e[1]+o[1])/2],r(d3.event.scale*g)}u(n,e),M=null,a(w.of(this,arguments))}var d,g,p,m,v,y,M,b=[0,0],x=1,_=Ga,w=j(t,"zoom");return t.translate=function(n){return arguments.length?(b=n.map(Number),i(),t):b},t.scale=function(n){return arguments.length?(x=+n,i(),t):x},t.scaleExtent=function(n){return arguments.length?(_=null==n?Ga:n.map(Number),t):_},t.x=function(n){return arguments.length?(m=n,p=n.copy(),b=[0,0],x=1,t):m},t.y=function(n){return arguments.length?(y=n,v=n.copy(),b=[0,0],x=1,t):y},d3.rebind(t,w,"on")};var Ja,Ga=[0,1/0];d3.layout={},d3.layout.bundle=function(){return function(t){for(var n=[],e=-1,r=t.length;r>++e;)n.push(Xe(t[e]));return n}},d3.layout.chord=function(){function t(){var t,l,f,h,d,g={},p=[],m=d3.range(i),v=[];for(e=[],r=[],t=0,h=-1;i>++h;){for(l=0,d=-1;i>++d;)l+=u[h][d];p.push(l),v.push(d3.range(i)),t+=l}for(a&&m.sort(function(t,n){return a(p[t],p[n]) -}),o&&v.forEach(function(t,n){t.sort(function(t,e){return o(u[n][t],u[n][e])})}),t=(2*Ri-s*i)/t,l=0,h=-1;i>++h;){for(f=l,d=-1;i>++d;){var y=m[h],M=v[y][d],b=u[y][M],x=l,_=l+=b*t;g[y+"-"+M]={index:y,subindex:M,startAngle:x,endAngle:_,value:b}}r[y]={index:y,startAngle:f,endAngle:l,value:(l-f)/t},l+=s}for(h=-1;i>++h;)for(d=h-1;i>++d;){var w=g[h+"-"+d],S=g[d+"-"+h];(w.value||S.value)&&e.push(w.value<S.value?{source:S,target:w}:{source:w,target:S})}c&&n()}function n(){e.sort(function(t,n){return c((t.source.value+t.target.value)/2,(n.source.value+n.target.value)/2)})}var e,r,u,i,a,o,c,l={},s=0;return l.matrix=function(t){return arguments.length?(i=(u=t)&&u.length,e=r=null,l):u},l.padding=function(t){return arguments.length?(s=t,e=r=null,l):s},l.sortGroups=function(t){return arguments.length?(a=t,e=r=null,l):a},l.sortSubgroups=function(t){return arguments.length?(o=t,e=null,l):o},l.sortChords=function(t){return arguments.length?(c=t,e&&n(),l):c},l.chords=function(){return e||t(),e},l.groups=function(){return r||t(),r},l},d3.layout.force=function(){function t(t){return function(n,e,r,u){if(n.point!==t){var i=n.cx-t.x,a=n.cy-t.y,o=1/Math.sqrt(i*i+a*a);if(v>(u-e)*o){var c=n.charge*o*o;return t.px-=i*c,t.py-=a*c,!0}if(n.point&&isFinite(o)){var c=n.pointCharge*o*o;t.px-=i*c,t.py-=a*c}}return!n.charge}}function n(t){t.px=d3.event.x,t.py=d3.event.y,l.resume()}var e,r,u,i,o,l={},s=d3.dispatch("start","tick","end"),f=[1,1],h=.9,d=Qe,g=tr,p=-30,m=.1,v=.8,y=[],M=[];return l.tick=function(){if(.005>(r*=.99))return s.end({type:"end",alpha:r=0}),!0;var n,e,a,c,l,d,g,v,b,x=y.length,_=M.length;for(e=0;_>e;++e)a=M[e],c=a.source,l=a.target,v=l.x-c.x,b=l.y-c.y,(d=v*v+b*b)&&(d=r*i[e]*((d=Math.sqrt(d))-u[e])/d,v*=d,b*=d,l.x-=v*(g=c.weight/(l.weight+c.weight)),l.y-=b*g,c.x+=v*(g=1-g),c.y+=b*g);if((g=r*m)&&(v=f[0]/2,b=f[1]/2,e=-1,g))for(;x>++e;)a=y[e],a.x+=(v-a.x)*g,a.y+=(b-a.y)*g;if(p)for(We(n=d3.geom.quadtree(y),r,o),e=-1;x>++e;)(a=y[e]).fixed||n.visit(t(a));for(e=-1;x>++e;)a=y[e],a.fixed?(a.x=a.px,a.y=a.py):(a.x-=(a.px-(a.px=a.x))*h,a.y-=(a.py-(a.py=a.y))*h);s.tick({type:"tick",alpha:r})},l.nodes=function(t){return arguments.length?(y=t,l):y},l.links=function(t){return arguments.length?(M=t,l):M},l.size=function(t){return arguments.length?(f=t,l):f},l.linkDistance=function(t){return arguments.length?(d=c(t),l):d},l.distance=l.linkDistance,l.linkStrength=function(t){return arguments.length?(g=c(t),l):g},l.friction=function(t){return arguments.length?(h=t,l):h},l.charge=function(t){return arguments.length?(p="function"==typeof t?t:+t,l):p},l.gravity=function(t){return arguments.length?(m=t,l):m},l.theta=function(t){return arguments.length?(v=t,l):v},l.alpha=function(t){return arguments.length?(r?r=t>0?t:0:t>0&&(s.start({type:"start",alpha:r=t}),d3.timer(l.tick)),l):r},l.start=function(){function t(t,r){for(var u,i=n(e),a=-1,o=i.length;o>++a;)if(!isNaN(u=i[a][t]))return u;return Math.random()*r}function n(){if(!a){for(a=[],r=0;s>r;++r)a[r]=[];for(r=0;h>r;++r){var t=M[r];a[t.source.index].push(t.target),a[t.target.index].push(t.source)}}return a[e]}var e,r,a,c,s=y.length,h=M.length,m=f[0],v=f[1];for(e=0;s>e;++e)(c=y[e]).index=e,c.weight=0;for(u=[],i=[],e=0;h>e;++e)c=M[e],"number"==typeof c.source&&(c.source=y[c.source]),"number"==typeof c.target&&(c.target=y[c.target]),u[e]=d.call(this,c,e),i[e]=g.call(this,c,e),++c.source.weight,++c.target.weight;for(e=0;s>e;++e)c=y[e],isNaN(c.x)&&(c.x=t("x",m)),isNaN(c.y)&&(c.y=t("y",v)),isNaN(c.px)&&(c.px=c.x),isNaN(c.py)&&(c.py=c.y);if(o=[],"function"==typeof p)for(e=0;s>e;++e)o[e]=+p.call(this,y[e],e);else for(e=0;s>e;++e)o[e]=p;return l.resume()},l.resume=function(){return l.alpha(.1)},l.stop=function(){return l.alpha(0)},l.drag=function(){e||(e=d3.behavior.drag().origin(a).on("dragstart",$e).on("drag",n).on("dragend",Je)),this.on("mouseover.force",Ge).on("mouseout.force",Ke).call(e)},d3.rebind(l,s,"on")},d3.layout.partition=function(){function t(n,e,r,u){var i=n.children;if(n.x=e,n.y=n.depth*u,n.dx=r,n.dy=u,i&&(a=i.length)){var a,o,c,l=-1;for(r=n.value?r/n.value:0;a>++l;)t(o=i[l],e,c=o.value*r,u),e+=c}}function n(t){var e=t.children,r=0;if(e&&(u=e.length))for(var u,i=-1;u>++i;)r=Math.max(r,n(e[i]));return 1+r}function e(e,i){var a=r.call(this,e,i);return t(a[0],0,u[0],u[1]/n(a[0])),a}var r=d3.layout.hierarchy(),u=[1,1];return e.size=function(t){return arguments.length?(u=t,e):u},hr(e,r)},d3.layout.pie=function(){function t(i){var a=i.map(function(e,r){return+n.call(t,e,r)}),o=+("function"==typeof r?r.apply(this,arguments):r),c=(("function"==typeof u?u.apply(this,arguments):u)-r)/d3.sum(a),l=d3.range(i.length);null!=e&&l.sort(e===Ka?function(t,n){return a[n]-a[t]}:function(t,n){return e(i[t],i[n])});var s=[];return l.forEach(function(t){var n;s[t]={data:i[t],value:n=a[t],startAngle:o,endAngle:o+=n*c}}),s}var n=Number,e=Ka,r=0,u=2*Ri;return t.value=function(e){return arguments.length?(n=e,t):n},t.sort=function(n){return arguments.length?(e=n,t):e},t.startAngle=function(n){return arguments.length?(r=n,t):r},t.endAngle=function(n){return arguments.length?(u=n,t):u},t};var Ka={};d3.layout.stack=function(){function t(a,c){var l=a.map(function(e,r){return n.call(t,e,r)}),s=l.map(function(n){return n.map(function(n,e){return[i.call(t,n,e),o.call(t,n,e)]})}),f=e.call(t,s,c);l=d3.permute(l,f),s=d3.permute(s,f);var h,d,g,p=r.call(t,s,c),m=l.length,v=l[0].length;for(d=0;v>d;++d)for(u.call(t,l[0][d],g=p[d],s[0][d][1]),h=1;m>h;++h)u.call(t,l[h][d],g+=s[h-1][d][1],s[h][d][1]);return a}var n=a,e=ur,r=ir,u=rr,i=nr,o=er;return t.values=function(e){return arguments.length?(n=e,t):n},t.order=function(n){return arguments.length?(e="function"==typeof n?n:Wa.get(n)||ur,t):e},t.offset=function(n){return arguments.length?(r="function"==typeof n?n:Qa.get(n)||ir,t):r},t.x=function(n){return arguments.length?(i=n,t):i},t.y=function(n){return arguments.length?(o=n,t):o},t.out=function(n){return arguments.length?(u=n,t):u},t};var Wa=d3.map({"inside-out":function(t){var n,e,r=t.length,u=t.map(ar),i=t.map(or),a=d3.range(r).sort(function(t,n){return u[t]-u[n]}),o=0,c=0,l=[],s=[];for(n=0;r>n;++n)e=a[n],c>o?(o+=i[e],l.push(e)):(c+=i[e],s.push(e));return s.reverse().concat(l)},reverse:function(t){return d3.range(t.length).reverse()},"default":ur}),Qa=d3.map({silhouette:function(t){var n,e,r,u=t.length,i=t[0].length,a=[],o=0,c=[];for(e=0;i>e;++e){for(n=0,r=0;u>n;n++)r+=t[n][e][1];r>o&&(o=r),a.push(r)}for(e=0;i>e;++e)c[e]=(o-a[e])/2;return c},wiggle:function(t){var n,e,r,u,i,a,o,c,l,s=t.length,f=t[0],h=f.length,d=[];for(d[0]=c=l=0,e=1;h>e;++e){for(n=0,u=0;s>n;++n)u+=t[n][e][1];for(n=0,i=0,o=f[e][0]-f[e-1][0];s>n;++n){for(r=0,a=(t[n][e][1]-t[n][e-1][1])/(2*o);n>r;++r)a+=(t[r][e][1]-t[r][e-1][1])/o;i+=a*t[n][e][1]}d[e]=c-=u?i/u*o:0,l>c&&(l=c)}for(e=0;h>e;++e)d[e]-=l;return d},expand:function(t){var n,e,r,u=t.length,i=t[0].length,a=1/u,o=[];for(e=0;i>e;++e){for(n=0,r=0;u>n;n++)r+=t[n][e][1];if(r)for(n=0;u>n;n++)t[n][e][1]/=r;else for(n=0;u>n;n++)t[n][e][1]=a}for(e=0;i>e;++e)o[e]=0;return o},zero:ir});d3.layout.histogram=function(){function t(t,i){for(var a,o,c=[],l=t.map(e,this),s=r.call(this,l,i),f=u.call(this,s,l,i),i=-1,h=l.length,d=f.length-1,g=n?1:1/h;d>++i;)a=c[i]=[],a.dx=f[i+1]-(a.x=f[i]),a.y=0;if(d>0)for(i=-1;h>++i;)o=l[i],o>=s[0]&&s[1]>=o&&(a=c[d3.bisect(f,o,1,d)-1],a.y+=g,a.push(t[i]));return c}var n=!0,e=Number,r=fr,u=lr;return t.value=function(n){return arguments.length?(e=n,t):e},t.range=function(n){return arguments.length?(r=c(n),t):r},t.bins=function(n){return arguments.length?(u="number"==typeof n?function(t){return sr(t,n)}:c(n),t):u},t.frequency=function(e){return arguments.length?(n=!!e,t):n},t},d3.layout.hierarchy=function(){function t(n,a,o){var c=u.call(e,n,a);if(n.depth=a,o.push(n),c&&(l=c.length)){for(var l,s,f=-1,h=n.children=[],d=0,g=a+1;l>++f;)s=t(c[f],g,o),s.parent=n,h.push(s),d+=s.value;r&&h.sort(r),i&&(n.value=d)}else i&&(n.value=+i.call(e,n,a)||0);return n}function n(t,r){var u=t.children,a=0;if(u&&(o=u.length))for(var o,c=-1,l=r+1;o>++c;)a+=n(u[c],l);else i&&(a=+i.call(e,t,r)||0);return i&&(t.value=a),a}function e(n){var e=[];return t(n,0,e),e}var r=pr,u=dr,i=gr;return e.sort=function(t){return arguments.length?(r=t,e):r},e.children=function(t){return arguments.length?(u=t,e):u},e.value=function(t){return arguments.length?(i=t,e):i},e.revalue=function(t){return n(t,0),t},e},d3.layout.pack=function(){function t(t,u){var i=n.call(this,t,u),a=i[0];a.x=0,a.y=0,Rr(a,function(t){t.r=Math.sqrt(t.value)}),Rr(a,xr);var o=r[0],c=r[1],l=Math.max(2*a.r/o,2*a.r/c);if(e>0){var s=e*l/2;Rr(a,function(t){t.r+=s}),Rr(a,xr),Rr(a,function(t){t.r-=s}),l=Math.max(2*a.r/o,2*a.r/c)}return Sr(a,o/2,c/2,1/l),i}var n=d3.layout.hierarchy().sort(vr),e=0,r=[1,1];return t.size=function(n){return arguments.length?(r=n,t):r},t.padding=function(n){return arguments.length?(e=+n,t):e},hr(t,n)},d3.layout.cluster=function(){function t(t,u){var i,a=n.call(this,t,u),o=a[0],c=0;Rr(o,function(t){var n=t.children;n&&n.length?(t.x=Ar(n),t.y=Er(n)):(t.x=i?c+=e(t,i):0,t.y=0,i=t)});var l=Nr(o),s=Tr(o),f=l.x-e(l,s)/2,h=s.x+e(s,l)/2;return Rr(o,function(t){t.x=(t.x-f)/(h-f)*r[0],t.y=(1-(o.y?t.y/o.y:1))*r[1]}),a}var n=d3.layout.hierarchy().sort(null).value(null),e=qr,r=[1,1];return t.separation=function(n){return arguments.length?(e=n,t):e},t.size=function(n){return arguments.length?(r=n,t):r},hr(t,n)},d3.layout.tree=function(){function t(t,u){function i(t,n){var r=t.children,u=t._tree;if(r&&(a=r.length)){for(var a,c,l,s=r[0],f=s,h=-1;a>++h;)l=r[h],i(l,c),f=o(l,c,f),c=l;Pr(t);var d=.5*(s._tree.prelim+l._tree.prelim);n?(u.prelim=n._tree.prelim+e(t,n),u.mod=u.prelim-d):u.prelim=d}else n&&(u.prelim=n._tree.prelim+e(t,n))}function a(t,n){t.x=t._tree.prelim+n;var e=t.children;if(e&&(r=e.length)){var r,u=-1;for(n+=t._tree.mod;r>++u;)a(e[u],n)}}function o(t,n,r){if(n){for(var u,i=t,a=t,o=n,c=t.parent.children[0],l=i._tree.mod,s=a._tree.mod,f=o._tree.mod,h=c._tree.mod;o=zr(o),i=Cr(i),o&&i;)c=Cr(c),a=zr(a),a._tree.ancestor=t,u=o._tree.prelim+f-i._tree.prelim-l+e(o,i),u>0&&(jr(Or(o,t,r),t,u),l+=u,s+=u),f+=o._tree.mod,l+=i._tree.mod,h+=c._tree.mod,s+=a._tree.mod;o&&!zr(a)&&(a._tree.thread=o,a._tree.mod+=f-s),i&&!Cr(c)&&(c._tree.thread=i,c._tree.mod+=l-h,r=t)}return r}var c=n.call(this,t,u),l=c[0];Rr(l,function(t,n){t._tree={ancestor:t,prelim:0,mod:0,change:0,shift:0,number:n?n._tree.number+1:0}}),i(l),a(l,-l._tree.prelim);var s=Dr(l,Fr),f=Dr(l,Lr),h=Dr(l,Hr),d=s.x-e(s,f)/2,g=f.x+e(f,s)/2,p=h.depth||1;return Rr(l,function(t){t.x=(t.x-d)/(g-d)*r[0],t.y=t.depth/p*r[1],delete t._tree}),c}var n=d3.layout.hierarchy().sort(null).value(null),e=qr,r=[1,1];return t.separation=function(n){return arguments.length?(e=n,t):e},t.size=function(n){return arguments.length?(r=n,t):r},hr(t,n)},d3.layout.treemap=function(){function t(t,n){for(var e,r,u=-1,i=t.length;i>++u;)r=(e=t[u]).value*(0>n?0:n),e.area=isNaN(r)||0>=r?0:r}function n(e){var i=e.children;if(i&&i.length){var a,o,c,l=f(e),s=[],h=i.slice(),g=1/0,p="slice"===d?l.dx:"dice"===d?l.dy:"slice-dice"===d?1&e.depth?l.dy:l.dx:Math.min(l.dx,l.dy);for(t(h,l.dx*l.dy/e.value),s.area=0;(c=h.length)>0;)s.push(a=h[c-1]),s.area+=a.area,"squarify"!==d||g>=(o=r(s,p))?(h.pop(),g=o):(s.area-=s.pop().area,u(s,p,l,!1),p=Math.min(l.dx,l.dy),s.length=s.area=0,g=1/0);s.length&&(u(s,p,l,!0),s.length=s.area=0),i.forEach(n)}}function e(n){var r=n.children;if(r&&r.length){var i,a=f(n),o=r.slice(),c=[];for(t(o,a.dx*a.dy/n.value),c.area=0;i=o.pop();)c.push(i),c.area+=i.area,null!=i.z&&(u(c,i.z?a.dx:a.dy,a,!o.length),c.length=c.area=0);r.forEach(e)}}function r(t,n){for(var e,r=t.area,u=0,i=1/0,a=-1,o=t.length;o>++a;)(e=t[a].area)&&(i>e&&(i=e),e>u&&(u=e));return r*=r,n*=n,r?Math.max(n*u*g/r,r/(n*i*g)):1/0}function u(t,n,e,r){var u,i=-1,a=t.length,o=e.x,l=e.y,s=n?c(t.area/n):0;if(n==e.dx){for((r||s>e.dy)&&(s=e.dy);a>++i;)u=t[i],u.x=o,u.y=l,u.dy=s,o+=u.dx=Math.min(e.x+e.dx-o,s?c(u.area/s):0);u.z=!0,u.dx+=e.x+e.dx-o,e.y+=s,e.dy-=s}else{for((r||s>e.dx)&&(s=e.dx);a>++i;)u=t[i],u.x=o,u.y=l,u.dx=s,l+=u.dy=Math.min(e.y+e.dy-l,s?c(u.area/s):0);u.z=!1,u.dy+=e.y+e.dy-l,e.x+=s,e.dx-=s}}function i(r){var u=a||o(r),i=u[0];return i.x=0,i.y=0,i.dx=l[0],i.dy=l[1],a&&o.revalue(i),t([i],i.dx*i.dy/i.value),(a?e:n)(i),h&&(a=u),u}var a,o=d3.layout.hierarchy(),c=Math.round,l=[1,1],s=null,f=Yr,h=!1,d="squarify",g=.5*(1+Math.sqrt(5));return i.size=function(t){return arguments.length?(l=t,i):l},i.padding=function(t){function n(n){var e=t.call(i,n,n.depth);return null==e?Yr(n):Ur(n,"number"==typeof e?[e,e,e,e]:e)}function e(n){return Ur(n,t)}if(!arguments.length)return s;var r;return f=null==(s=t)?Yr:"function"==(r=typeof t)?n:"number"===r?(t=[t,t,t,t],e):e,i},i.round=function(t){return arguments.length?(c=t?Math.round:Number,i):c!=Number},i.sticky=function(t){return arguments.length?(h=t,a=null,i):h},i.ratio=function(t){return arguments.length?(g=t,i):g},i.mode=function(t){return arguments.length?(d=t+"",i):d},hr(i,o)},d3.csv=Ir(",","text/csv"),d3.tsv=Ir(" ","text/tab-separated-values"),d3.geo={},d3.geo.stream=function(t,n){to.hasOwnProperty(t.type)?to[t.type](t,n):Vr(t,n)};var to={Feature:function(t,n){Vr(t.geometry,n)},FeatureCollection:function(t,n){for(var e=t.features,r=-1,u=e.length;u>++r;)Vr(e[r].geometry,n)}},no={Sphere:function(t,n){n.sphere()},Point:function(t,n){var e=t.coordinates;n.point(e[0],e[1])},MultiPoint:function(t,n){for(var e,r=t.coordinates,u=-1,i=r.length;i>++u;)e=r[u],n.point(e[0],e[1])},LineString:function(t,n){Xr(t.coordinates,n,0)},MultiLineString:function(t,n){for(var e=t.coordinates,r=-1,u=e.length;u>++r;)Xr(e[r],n,0)},Polygon:function(t,n){Zr(t.coordinates,n)},MultiPolygon:function(t,n){for(var e=t.coordinates,r=-1,u=e.length;u>++r;)Zr(e[r],n)},GeometryCollection:function(t,n){for(var e=t.geometries,r=-1,u=e.length;u>++r;)Vr(e[r],n)}};d3.geo.albersUsa=function(){function t(t){return n(t)(t)}function n(t){var n=t[0],a=t[1];return a>50?r:-140>n?u:21>a?i:e}var e=d3.geo.albers(),r=d3.geo.albers().rotate([160,0]).center([0,60]).parallels([55,65]),u=d3.geo.albers().rotate([160,0]).center([0,20]).parallels([8,18]),i=d3.geo.albers().rotate([60,0]).center([0,10]).parallels([8,18]);return t.scale=function(n){return arguments.length?(e.scale(n),r.scale(.6*n),u.scale(n),i.scale(1.5*n),t.translate(e.translate())):e.scale()},t.translate=function(n){if(!arguments.length)return e.translate();var a=e.scale(),o=n[0],c=n[1];return e.translate(n),r.translate([o-.4*a,c+.17*a]),u.translate([o-.19*a,c+.2*a]),i.translate([o+.58*a,c+.43*a]),t},t.scale(e.scale())},(d3.geo.albers=function(){var t=29.5*ji,n=45.5*ji,e=Pu(eu),r=e(t,n);return r.parallels=function(r){return arguments.length?e(t=r[0]*ji,n=r[1]*ji):[t*Oi,n*Oi]},r.rotate([98,0]).center([0,38]).scale(1e3)}).raw=eu;var eo=Vu(function(t){return Math.sqrt(2/(1+t))},function(t){return 2*Math.asin(t/2)});(d3.geo.azimuthalEqualArea=function(){return Ru(eo)}).raw=eo;var ro=Vu(function(t){var n=Math.acos(t);return n&&n/Math.sin(n)},a);(d3.geo.azimuthalEquidistant=function(){return Ru(ro)}).raw=ro,d3.geo.bounds=ru(a),d3.geo.centroid=function(t){uo=io=ao=oo=co=0,d3.geo.stream(t,lo);var n;return io&&Math.abs(n=Math.sqrt(ao*ao+oo*oo+co*co))>Pi?[Math.atan2(oo,ao)*Oi,Math.asin(Math.max(-1,Math.min(1,co/n)))*Oi]:void 0};var uo,io,ao,oo,co,lo={sphere:function(){2>uo&&(uo=2,io=ao=oo=co=0)},point:uu,lineStart:au,lineEnd:ou,polygonStart:function(){2>uo&&(uo=2,io=ao=oo=co=0),lo.lineStart=iu},polygonEnd:function(){lo.lineStart=au}};d3.geo.circle=function(){function t(){var t="function"==typeof r?r.apply(this,arguments):r,n=Ou(-t[0]*ji,-t[1]*ji,0).invert,u=[];return e(null,null,1,{point:function(t,e){u.push(t=n(t,e)),t[0]*=Oi,t[1]*=Oi}}),{type:"Polygon",coordinates:[u]}}var n,e,r=[0,0],u=6;return t.origin=function(n){return arguments.length?(r=n,t):r},t.angle=function(r){return arguments.length?(e=cu((n=+r)*ji,u*ji),t):n},t.precision=function(r){return arguments.length?(e=cu(n*ji,(u=+r)*ji),t):u},t.angle(90)};var so=su(o,vu,Mu);(d3.geo.equirectangular=function(){return Ru(_u).scale(250/Ri)}).raw=_u.invert=_u;var fo=Vu(function(t){return 1/t},Math.atan);(d3.geo.gnomonic=function(){return Ru(fo)}).raw=fo,d3.geo.graticule=function(){function t(){return{type:"MultiLineString",coordinates:n()}}function n(){return d3.range(Math.ceil(r/c)*c,e,c).map(a).concat(d3.range(Math.ceil(i/l)*l,u,l).map(o))}var e,r,u,i,a,o,c=22.5,l=c,s=2.5;return t.lines=function(){return n().map(function(t){return{type:"LineString",coordinates:t}})},t.outline=function(){return{type:"Polygon",coordinates:[a(r).concat(o(u).slice(1),a(e).reverse().slice(1),o(i).reverse().slice(1))]}},t.extent=function(n){return arguments.length?(r=+n[0][0],e=+n[1][0],i=+n[0][1],u=+n[1][1],r>e&&(n=r,r=e,e=n),i>u&&(n=i,i=u,u=n),t.precision(s)):[[r,i],[e,u]]},t.step=function(n){return arguments.length?(c=+n[0],l=+n[1],t):[c,l]},t.precision=function(n){return arguments.length?(s=+n,a=wu(i,u,s),o=Su(r,e,s),t):s},t.extent([[-180+Pi,-90+Pi],[180-Pi,90-Pi]])},d3.geo.interpolate=function(t,n){return ku(t[0]*ji,t[1]*ji,n[0]*ji,n[1]*ji)},d3.geo.greatArc=function(){function e(){for(var t=r||a.apply(this,arguments),n=u||o.apply(this,arguments),e=i||d3.geo.interpolate(t,n),u=0,l=c/e.distance,s=[t];1>(u+=l);)s.push(e(u));return s.push(n),{type:"LineString",coordinates:s}}var r,u,i,a=n,o=t,c=6*ji;return e.distance=function(){return(i||d3.geo.interpolate(r||a.apply(this,arguments),u||o.apply(this,arguments))).distance},e.source=function(t){return arguments.length?(a=t,r="function"==typeof t?null:t,i=r&&u?d3.geo.interpolate(r,u):null,e):a},e.target=function(t){return arguments.length?(o=t,u="function"==typeof t?null:t,i=r&&u?d3.geo.interpolate(r,u):null,e):o},e.precision=function(t){return arguments.length?(c=t*ji,e):c/ji},e},Eu.invert=function(t,n){return[2*Ri*t,2*Math.atan(Math.exp(2*Ri*n))-Ri/2]},(d3.geo.mercator=function(){return Ru(Eu).scale(500)}).raw=Eu;var ho=Vu(function(){return 1},Math.asin);(d3.geo.orthographic=function(){return Ru(ho)}).raw=ho,d3.geo.path=function(){function t(t){return t&&d3.geo.stream(t,r(u.pointRadius("function"==typeof i?+i.apply(this,arguments):i))),u.result()}var n,e,r,u,i=4.5;return t.area=function(t){return go=0,d3.geo.stream(t,r(mo)),go},t.centroid=function(t){return uo=ao=oo=co=0,d3.geo.stream(t,r(vo)),co?[ao/co,oo/co]:void 0},t.bounds=function(t){return ru(r)(t)},t.projection=function(e){return arguments.length?(r=(n=e)?e.stream||Nu(e):a,t):n},t.context=function(n){return arguments.length?(u=null==(e=n)?new Tu:new qu(n),t):e},t.pointRadius=function(n){return arguments.length?(i="function"==typeof n?n:+n,t):i},t.projection(d3.geo.albersUsa()).context(null)};var go,po,mo={point:Pn,lineStart:Pn,lineEnd:Pn,polygonStart:function(){po=0,mo.lineStart=Cu},polygonEnd:function(){mo.lineStart=mo.lineEnd=mo.point=Pn,go+=Math.abs(po/2)}},vo={point:zu,lineStart:Du,lineEnd:Lu,polygonStart:function(){vo.lineStart=Fu},polygonEnd:function(){vo.point=zu,vo.lineStart=Du,vo.lineEnd=Lu}};d3.geo.area=function(t){return yo=0,d3.geo.stream(t,bo),yo};var yo,Mo,bo={sphere:function(){yo+=4*Ri},point:Pn,lineStart:Pn,lineEnd:Pn,polygonStart:function(){Mo=0,bo.lineStart=Hu},polygonEnd:function(){yo+=0>Mo?4*Ri+Mo:Mo,bo.lineStart=bo.lineEnd=bo.point=Pn}};d3.geo.projection=Ru,d3.geo.projectionMutator=Pu;var xo=Vu(function(t){return 1/(1+t)},function(t){return 2*Math.atan(t)});(d3.geo.stereographic=function(){return Ru(xo)}).raw=xo,d3.geom={},d3.geom.hull=function(t){if(3>t.length)return[];var n,e,r,u,i,a,o,c,l,s,f=t.length,h=f-1,d=[],g=[],p=0;for(n=1;f>n;++n)t[n][1]<t[p][1]?p=n:t[n][1]==t[p][1]&&(p=t[n][0]<t[p][0]?n:p);for(n=0;f>n;++n)n!==p&&(u=t[n][1]-t[p][1],r=t[n][0]-t[p][0],d.push({angle:Math.atan2(u,r),index:n}));for(d.sort(function(t,n){return t.angle-n.angle}),l=d[0].angle,c=d[0].index,o=0,n=1;h>n;++n)e=d[n].index,l==d[n].angle?(r=t[c][0]-t[p][0],u=t[c][1]-t[p][1],i=t[e][0]-t[p][0],a=t[e][1]-t[p][1],r*r+u*u>=i*i+a*a?d[n].index=-1:(d[o].index=-1,l=d[n].angle,o=n,c=e)):(l=d[n].angle,o=n,c=e);for(g.push(p),n=0,e=0;2>n;++e)-1!==d[e].index&&(g.push(d[e].index),n++);for(s=g.length;h>e;++e)if(-1!==d[e].index){for(;!Xu(g[s-2],g[s-1],d[e].index,t);)--s;g[s++]=d[e].index}var m=[];for(n=0;s>n;++n)m.push(t[g[n]]);return m},d3.geom.polygon=function(t){return t.area=function(){for(var n=0,e=t.length,r=t[e-1][1]*t[0][0]-t[e-1][0]*t[0][1];e>++n;)r+=t[n-1][1]*t[n][0]-t[n-1][0]*t[n][1];return.5*r},t.centroid=function(n){var e,r,u=-1,i=t.length,a=0,o=0,c=t[i-1];for(arguments.length||(n=-1/(6*t.area()));i>++u;)e=c,c=t[u],r=e[0]*c[1]-c[0]*e[1],a+=(e[0]+c[0])*r,o+=(e[1]+c[1])*r;return[a*n,o*n]},t.clip=function(n){for(var e,r,u,i,a,o,c=-1,l=t.length,s=t[l-1];l>++c;){for(e=n.slice(),n.length=0,i=t[c],a=e[(u=e.length)-1],r=-1;u>++r;)o=e[r],Zu(o,s,i)?(Zu(a,s,i)||n.push(Bu(a,o,s,i)),n.push(o)):Zu(a,s,i)&&n.push(Bu(a,o,s,i)),a=o;s=i}return n},t},d3.geom.voronoi=function(t){var n=t.map(function(){return[]}),e=1e6;return $u(t,function(t){var r,u,i,a,o,c;1===t.a&&t.b>=0?(r=t.ep.r,u=t.ep.l):(r=t.ep.l,u=t.ep.r),1===t.a?(o=r?r.y:-e,i=t.c-t.b*o,c=u?u.y:e,a=t.c-t.b*c):(i=r?r.x:-e,o=t.c-t.a*i,a=u?u.x:e,c=t.c-t.a*a);var l=[i,o],s=[a,c];n[t.region.l.index].push(l,s),n[t.region.r.index].push(l,s)}),n=n.map(function(n,e){var r=t[e][0],u=t[e][1],i=n.map(function(t){return Math.atan2(t[0]-r,t[1]-u)});return d3.range(n.length).sort(function(t,n){return i[t]-i[n]}).filter(function(t,n,e){return!n||i[t]-i[e[n-1]]>Pi}).map(function(t){return n[t]})}),n.forEach(function(n,r){var u=n.length;if(!u)return n.push([-e,-e],[-e,e],[e,e],[e,-e]);if(!(u>2)){var i=t[r],a=n[0],o=n[1],c=i[0],l=i[1],s=a[0],f=a[1],h=o[0],d=o[1],g=Math.abs(h-s),p=d-f;if(Pi>Math.abs(p)){var m=f>l?-e:e;n.push([-e,m],[e,m])}else if(Pi>g){var v=s>c?-e:e;n.push([v,-e],[v,e])}else{var m=(s-c)*(d-f)>(h-s)*(f-l)?e:-e,y=Math.abs(p)-g;Pi>Math.abs(y)?n.push([0>p?m:-m,m]):(y>0&&(m*=-1),n.push([-e,m],[e,m]))}}}),n};var _o={l:"r",r:"l"};d3.geom.delaunay=function(t){var n=t.map(function(){return[]}),e=[];return $u(t,function(e){n[e.region.l.index].push(t[e.region.r.index])}),n.forEach(function(n,r){var u=t[r],i=u[0],a=u[1];n.forEach(function(t){t.angle=Math.atan2(t[0]-i,t[1]-a)}),n.sort(function(t,n){return t.angle-n.angle});for(var o=0,c=n.length-1;c>o;o++)e.push([u,n[o],n[o+1]])}),e},d3.geom.quadtree=function(t,n,e,r,u){function i(t,n,e,r,u,i){if(!isNaN(n.x)&&!isNaN(n.y))if(t.leaf){var o=t.point;o?.01>Math.abs(o.x-n.x)+Math.abs(o.y-n.y)?a(t,n,e,r,u,i):(t.point=null,a(t,o,e,r,u,i),a(t,n,e,r,u,i)):t.point=n}else a(t,n,e,r,u,i)}function a(t,n,e,r,u,a){var o=.5*(e+u),c=.5*(r+a),l=n.x>=o,s=n.y>=c,f=(s<<1)+l;t.leaf=!1,t=t.nodes[f]||(t.nodes[f]=Ju()),l?e=o:u=o,s?r=c:a=c,i(t,n,e,r,u,a)}var o,c=-1,l=t.length;if(5>arguments.length)if(3===arguments.length)u=e,r=n,e=n=0;else for(n=e=1/0,r=u=-1/0;l>++c;)o=t[c],n>o.x&&(n=o.x),e>o.y&&(e=o.y),o.x>r&&(r=o.x),o.y>u&&(u=o.y);var s=r-n,f=u-e;s>f?u=e+s:r=n+f;var h=Ju();return h.add=function(t){i(h,t,n,e,r,u)},h.visit=function(t){Gu(t,h,n,e,r,u)},t.forEach(h.add),h},d3.time={};var wo=Date,So=["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"];Ku.prototype={getDate:function(){return this._.getUTCDate()},getDay:function(){return this._.getUTCDay()},getFullYear:function(){return this._.getUTCFullYear()},getHours:function(){return this._.getUTCHours()},getMilliseconds:function(){return this._.getUTCMilliseconds()},getMinutes:function(){return this._.getUTCMinutes()},getMonth:function(){return this._.getUTCMonth()},getSeconds:function(){return this._.getUTCSeconds()},getTime:function(){return this._.getTime()},getTimezoneOffset:function(){return 0},valueOf:function(){return this._.valueOf()},setDate:function(){ko.setUTCDate.apply(this._,arguments)},setDay:function(){ko.setUTCDay.apply(this._,arguments)},setFullYear:function(){ko.setUTCFullYear.apply(this._,arguments)},setHours:function(){ko.setUTCHours.apply(this._,arguments)},setMilliseconds:function(){ko.setUTCMilliseconds.apply(this._,arguments)},setMinutes:function(){ko.setUTCMinutes.apply(this._,arguments)},setMonth:function(){ko.setUTCMonth.apply(this._,arguments)},setSeconds:function(){ko.setUTCSeconds.apply(this._,arguments)},setTime:function(){ko.setTime.apply(this._,arguments)}};var ko=Date.prototype,Eo="%a %b %e %X %Y",Ao="%m/%d/%Y",No="%H:%M:%S",To=["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],qo=["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],Co=["January","February","March","April","May","June","July","August","September","October","November","December"],zo=["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"];d3.time.format=function(t){function n(n){for(var r,u,i,a=[],o=-1,c=0;e>++o;)37===t.charCodeAt(o)&&(a.push(t.substring(c,o)),null!=(u=jo[r=t.charAt(++o)])&&(r=t.charAt(++o)),(i=Oo[r])&&(r=i(n,null==u?"e"===r?" ":"0":u)),a.push(r),c=o+1);return a.push(t.substring(c,o)),a.join("")}var e=t.length;return n.parse=function(n){var e={y:1900,m:0,d:1,H:0,M:0,S:0,L:0},r=Wu(e,t,n,0);if(r!=n.length)return null;"p"in e&&(e.H=e.H%12+12*e.p);var u=new wo;return u.setFullYear(e.y,e.m,e.d),u.setHours(e.H,e.M,e.S,e.L),u},n.toString=function(){return t},n};var Do=Qu(To),Lo=Qu(qo),Fo=Qu(Co),Ho=ti(Co),Ro=Qu(zo),Po=ti(zo),jo={"-":"",_:" ",0:"0"},Oo={a:function(t){return qo[t.getDay()]},A:function(t){return To[t.getDay()]},b:function(t){return zo[t.getMonth()]},B:function(t){return Co[t.getMonth()]},c:d3.time.format(Eo),d:function(t,n){return ni(t.getDate(),n,2)},e:function(t,n){return ni(t.getDate(),n,2)},H:function(t,n){return ni(t.getHours(),n,2)},I:function(t,n){return ni(t.getHours()%12||12,n,2)},j:function(t,n){return ni(1+d3.time.dayOfYear(t),n,3)},L:function(t,n){return ni(t.getMilliseconds(),n,3)},m:function(t,n){return ni(t.getMonth()+1,n,2)},M:function(t,n){return ni(t.getMinutes(),n,2)},p:function(t){return t.getHours()>=12?"PM":"AM"},S:function(t,n){return ni(t.getSeconds(),n,2)},U:function(t,n){return ni(d3.time.sundayOfYear(t),n,2)},w:function(t){return t.getDay()},W:function(t,n){return ni(d3.time.mondayOfYear(t),n,2)},x:d3.time.format(Ao),X:d3.time.format(No),y:function(t,n){return ni(t.getFullYear()%100,n,2)},Y:function(t,n){return ni(t.getFullYear()%1e4,n,4)},Z:Mi,"%":function(){return"%"}},Yo={a:ei,A:ri,b:ui,B:ii,c:ai,d:di,e:di,H:gi,I:gi,L:vi,m:hi,M:pi,p:yi,S:mi,x:oi,X:ci,y:si,Y:li},Uo=/^\s*\d+/,Io=d3.map({am:0,pm:1});d3.time.format.utc=function(t){function n(t){try{wo=Ku;var n=new wo;return n._=t,e(n)}finally{wo=Date}}var e=d3.time.format(t);return n.parse=function(t){try{wo=Ku;var n=e.parse(t);return n&&n._}finally{wo=Date}},n.toString=e.toString,n};var Vo=d3.time.format.utc("%Y-%m-%dT%H:%M:%S.%LZ");d3.time.format.iso=Date.prototype.toISOString?bi:Vo,bi.parse=function(t){var n=new Date(t);return isNaN(n)?null:n},bi.toString=Vo.toString,d3.time.second=xi(function(t){return new wo(1e3*Math.floor(t/1e3))},function(t,n){t.setTime(t.getTime()+1e3*Math.floor(n))},function(t){return t.getSeconds()}),d3.time.seconds=d3.time.second.range,d3.time.seconds.utc=d3.time.second.utc.range,d3.time.minute=xi(function(t){return new wo(6e4*Math.floor(t/6e4))},function(t,n){t.setTime(t.getTime()+6e4*Math.floor(n))},function(t){return t.getMinutes()}),d3.time.minutes=d3.time.minute.range,d3.time.minutes.utc=d3.time.minute.utc.range,d3.time.hour=xi(function(t){var n=t.getTimezoneOffset()/60;return new wo(36e5*(Math.floor(t/36e5-n)+n))},function(t,n){t.setTime(t.getTime()+36e5*Math.floor(n))},function(t){return t.getHours()}),d3.time.hours=d3.time.hour.range,d3.time.hours.utc=d3.time.hour.utc.range,d3.time.day=xi(function(t){var n=new wo(1970,0);return n.setFullYear(t.getFullYear(),t.getMonth(),t.getDate()),n},function(t,n){t.setDate(t.getDate()+n)},function(t){return t.getDate()-1}),d3.time.days=d3.time.day.range,d3.time.days.utc=d3.time.day.utc.range,d3.time.dayOfYear=function(t){var n=d3.time.year(t);return Math.floor((t-n-6e4*(t.getTimezoneOffset()-n.getTimezoneOffset()))/864e5)},So.forEach(function(t,n){t=t.toLowerCase(),n=7-n;var e=d3.time[t]=xi(function(t){return(t=d3.time.day(t)).setDate(t.getDate()-(t.getDay()+n)%7),t},function(t,n){t.setDate(t.getDate()+7*Math.floor(n))},function(t){var e=d3.time.year(t).getDay();return Math.floor((d3.time.dayOfYear(t)+(e+n)%7)/7)-(e!==n)});d3.time[t+"s"]=e.range,d3.time[t+"s"].utc=e.utc.range,d3.time[t+"OfYear"]=function(t){var e=d3.time.year(t).getDay();return Math.floor((d3.time.dayOfYear(t)+(e+n)%7)/7)}}),d3.time.week=d3.time.sunday,d3.time.weeks=d3.time.sunday.range,d3.time.weeks.utc=d3.time.sunday.utc.range,d3.time.weekOfYear=d3.time.sundayOfYear,d3.time.month=xi(function(t){return t=d3.time.day(t),t.setDate(1),t},function(t,n){t.setMonth(t.getMonth()+n)},function(t){return t.getMonth()}),d3.time.months=d3.time.month.range,d3.time.months.utc=d3.time.month.utc.range,d3.time.year=xi(function(t){return t=d3.time.day(t),t.setMonth(0,1),t},function(t,n){t.setFullYear(t.getFullYear()+n)},function(t){return t.getFullYear()}),d3.time.years=d3.time.year.range,d3.time.years.utc=d3.time.year.utc.range;var Xo=[1e3,5e3,15e3,3e4,6e4,3e5,9e5,18e5,36e5,108e5,216e5,432e5,864e5,1728e5,6048e5,2592e6,7776e6,31536e6],Zo=[[d3.time.second,1],[d3.time.second,5],[d3.time.second,15],[d3.time.second,30],[d3.time.minute,1],[d3.time.minute,5],[d3.time.minute,15],[d3.time.minute,30],[d3.time.hour,1],[d3.time.hour,3],[d3.time.hour,6],[d3.time.hour,12],[d3.time.day,1],[d3.time.day,2],[d3.time.week,1],[d3.time.month,1],[d3.time.month,3],[d3.time.year,1]],Bo=[[d3.time.format("%Y"),o],[d3.time.format("%B"),function(t){return t.getMonth()}],[d3.time.format("%b %d"),function(t){return 1!=t.getDate()}],[d3.time.format("%a %d"),function(t){return t.getDay()&&1!=t.getDate()}],[d3.time.format("%I %p"),function(t){return t.getHours()}],[d3.time.format("%I:%M"),function(t){return t.getMinutes()}],[d3.time.format(":%S"),function(t){return t.getSeconds()}],[d3.time.format(".%L"),function(t){return t.getMilliseconds()}]],$o=d3.scale.linear(),Jo=Ei(Bo);Zo.year=function(t,n){return $o.domain(t.map(Ni)).ticks(n).map(Ai)},d3.time.scale=function(){return wi(d3.scale.linear(),Zo,Jo)};var Go=Zo.map(function(t){return[t[0].utc,t[1]]}),Ko=[[d3.time.format.utc("%Y"),o],[d3.time.format.utc("%B"),function(t){return t.getUTCMonth()}],[d3.time.format.utc("%b %d"),function(t){return 1!=t.getUTCDate()}],[d3.time.format.utc("%a %d"),function(t){return t.getUTCDay()&&1!=t.getUTCDate()}],[d3.time.format.utc("%I %p"),function(t){return t.getUTCHours()}],[d3.time.format.utc("%I:%M"),function(t){return t.getUTCMinutes()}],[d3.time.format.utc(":%S"),function(t){return t.getUTCSeconds()}],[d3.time.format.utc(".%L"),function(t){return t.getUTCMilliseconds()}]],Wo=Ei(Ko);Go.year=function(t,n){return $o.domain(t.map(qi)).ticks(n).map(Ti)},d3.time.scale.utc=function(){return wi(d3.scale.linear(),Go,Wo)}})(); \ No newline at end of file diff --git a/deep_sequencing_unit/source/core-plugins/laneStatistics/1/as/webapps/laneStatistics/html/index.html b/deep_sequencing_unit/source/core-plugins/laneStatistics/1/as/webapps/laneStatistics/html/index.html deleted file mode 100644 index ff554adf7c8c20ee2831ddcfb78c00ca2b3901e3..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/source/core-plugins/laneStatistics/1/as/webapps/laneStatistics/html/index.html +++ /dev/null @@ -1,641 +0,0 @@ -<!DOCTYPE html> -<html> - <head> - <title>Lane Statistics</title> - <script type="text/javascript" src="/openbis/resources/js/d3.v3.min.js"></script> - <script type="text/javascript" src="/openbis/resources/js/d3.layout.js"></script> - <script type="text/javascript" src="/openbis/resources/js/jquery.js"></script> - <script type="text/javascript" src="/openbis/resources/js/pie.js"></script> - <script type="text/javascript" src="/openbis/resources/js/openbis.js"></script> - <script type="text/javascript" src="/openbis/resources/js/openbis-dsu.js"></script> - <script type="text/javascript" src="/openbis/resources/js/FileSaver.js"></script> - <link rel="stylesheet" href="//netdna.bootstrapcdn.com/bootstrap/3.0.0-rc1/css/bootstrap.min.css"> - <link rel="stylesheet" type="text/css" href="style.css" /> - <style type="text/css"> - </head> - <body> - <script> - - dsu = new openbis_dsu('/openbis/openbis', '/datastore_server'); - var webAppContext = new openbisWebAppContext(); - dsu.server.useSession(webAppContext.getSessionId()); - - var div = d3.select("body").append("div") - .attr("class", "tooltip") - .style("opacity", 0); - - loadData() - -function loadData () { - statisticsArray = [] - - var dataSetProperties; - dsu.retrieveDataSetsForSample(webAppContext.getEntityIdentifier(), getProperties); - //console.log (statisticsArray) - - function getProperties(dataSetProperties) { - for (var i = 0; i < dataSetProperties.result.length; i++) { - - statisticsArray.push({ - 'externalSampleName' : dataSetProperties.result[i].properties.EXTERNAL_SAMPLE_NAME, - 'index1': dataSetProperties.result[i].properties.BARCODE, - 'index2': dataSetProperties.result[i].properties.INDEX2, - 'percFilteringPass' : parseFloat(dataSetProperties.result[i].properties.PERCENTAGE_PASSED_FILTERING), - 'rawReadsSum' : dataSetProperties.result[i].properties.RAW_READS_SUM, - 'pfReadsSum' : dataSetProperties.result[i].properties.PF_READS_SUM, - 'rawYieldMbases' : dataSetProperties.result[i].properties.RAW_YIELD_MBASES, - 'yieldMbases' : dataSetProperties.result[i].properties.YIELD_MBASES, - 'percRawClustersPerLane': parseFloat(dataSetProperties.result[i].properties.PERCENTAGE_RAW_CLUSTERS_PER_LANE), - 'pfMeanQualityScore' : parseFloat(dataSetProperties.result[i].properties.PFMEANQUALITYSCORE), - 'pfYieldq30Percentage' : parseFloat(dataSetProperties.result[i].properties.PFYIELDQ30PERCENTAGE) - }); - } - - //console.log (statisticsArray.length) - var sums = calculateSum(statisticsArray, true) - var sumsWithNOINDEX = calculateSum(statisticsArray, false) - - if (! isNaN(statisticsArray[0].percFilteringPass)) { - plotLaneTable(sumsWithNOINDEX, false) - placeholder(); - plotLaneTable(sums, true) - placeholder(); - plotTable (statisticsArray); - downloadButton ("tableStats"); - placeholder(); - plotPercFilteringPass (statisticsArray); - downloadButton ("filteredChart"); - plotReadsSum (statisticsArray, sums); - downloadButton ("unfilteredReads"); - plotPercRawClustersPerLane (statisticsArray); - downloadButton ("percRawClusters"); - - $("#save_as" + "tableStats").click(function() { submit_download_form("html", "tableStats"); }); - $("#save_as" + "filteredChart").click(function() { submit_download_form("svg", "filteredChart"); }); - $("#save_as" + "unfilteredReads").click(function() { submit_download_form("svg", "unfilteredReads"); }); - $("#save_as" + "percRawClusters").click(function() { submit_download_form("svg", "percRawClusters"); }); - } - else { - d3.select("body").append("text").text("No data available!") - } - } -} - -colors = ["#FED976", "#FEB24C", "#FD8D3C", "#FC4E2A", "#E31A1C", "#800026", "#610B5E", "#4C0B5F", - "#0B0B61", "#0B4C5F", "#0B5F48","#0B5F1E", "#4C5F0B", "#5F480B", "#5F1E0B", "#5F0B22", - ] -var formatThousands = d3.format(","); - -function isNumber(n) { - return !isNaN(parseFloat(n)) && isFinite(n); -} - -function plotLaneTable (sums, withNOINDEX) { - - d3.select("body").append("text") - .text("Lane Based Summary Table") - .attr("class", "h4"); - - d3.select("body").append("text") - .text(function (){if (withNOINDEX) {return " without NOINDEX";} return " with NOINDEX";}) - .attr("class", "h6"); - - - var laneTableStats = d3.select("body") - .append("table") - .attr("id", "tableLaneStats") - .attr("class", "tableStats") - ; - - header = {"Average Passed Filtering (PF)":1, "Sum Raw Reads":1, "Sum PF Reads":1, "Sum Raw Bases":1, "Sum PF Bases":1, "Average Raw Clusters in % per Index":1, "Average PF Phred Score":1, "Average > 30 Phred Score":1 } - - // create the table header - var thead = laneTableStats.selectAll("th") - .data(d3.keys(header)) - .enter().append("th") - .text(function(d){return d}) - ; - - // fill the table - // create rows - var tr = laneTableStats.selectAll("tr") - .data(sums).enter().append("tr") - - // cells - var td = tr.selectAll("td") - .data(function(d){return d3.values(d)}) - .enter().append("td") - .text(function(d) {if (isNumber(d)) {return formatThousands(d)}; return d;}) - .style("text-align", function(d){if (isNumber(d)) {return "right"} return "left"}) - ; -} - -function plotTable (statisticsArray) { - console.log(statisticsArray) - /* - d3.select("body").append("text") - .text("Index Based Summary Table") - .attr("class", "h4"); - */ - - var tableStats = d3.select("body") - .append("table") - .attr("id", "tableStats") - .attr("class", "tableStats") - ; - - var header={"External Sample Name": "Name given by the customer", - "Index1": "First Index", - "Index2": "Second Index", - "Passed Filtering(PF) in %": "Reads which passed the Illumina Filter", - "Raw Reads": "Number of all Reads", - "PF Reads": "Number of Reads which passed the Illumina Filter", - "Raw Bases": "Number of all Bases", - "PF Bases": "Number of all Bases which passed the Illumina Filter", - "% in Lane": "Percentage of this Index within the Lane", - "Mean Phred Score": "Mean Phred Score (0-40)", - "> 30 Phred Score in %": "How many Bases are above the Phred Score 30(0.001)?" - } - - - // create the table header - var thead = tableStats.selectAll("th") - //.data(d3.keys(statisticsArray[0])) // got replaced with more readable names - .data(d3.keys(header)) - .enter().append("th") - .text(function(d){return d}) - .data(d3.values(header)) - .on("mouseover", function(d) { - div.transition() - .duration(200) - .style("opacity", .9); - div.style("width", "120px") - div.html(d) - .style("left", (d3.event.pageX) + "px") - .style("top", (d3.event.pageY - 42) + "px"); - }) - .on("mouseout", function(d) { - div.transition() - .duration(500) - .style("opacity", 0); - }) - ; - - // fill the table - // create rows - var tr = tableStats.selectAll("tr") - .data(statisticsArray).enter().append("tr") - - // cells - var td = tr.selectAll("td") - .data(function(d){return d3.values(d)}) - .enter().append("td") - .text(function(d) {if (isNumber(d)) {return formatThousands(d)}; return d;}) - //.on("mouseover", function(){d3.select(this).style("background-color", "aliceblue")}) - //.on("mouseout", function(){d3.select(this).style("background-color", "white")}) - .style("text-align", function(d){if (isNumber(d)) {return "right"} return "left"}) - ; - - -} - -function placeholder() { - -var space = d3.select("body") - .append("svg") - .attr("id", "placeholder") - .attr("width", 1500) - .attr("height", 50) - ; -} - - -function plotPercFilteringPass (statisticsArray) { - - if (statisticsArray.length > 60) {var svgWidth = 7000;} - else if (statisticsArray.length > 10) {var svgWidth = 4000;} - else {var svgWidth = 3000;} - - svgWidth = statisticsArray.length * 100 - if (svgWidth < 200) {svgWidth = 300;} - - - var barPadding = 1; - var valuePadding = 0.01; - var agenda = [100,90,80,70,60,50,40,30,20,10,0] - var agendaWidth = 100 - var AgendaWidthOffset = 30 - - var margin = {top: 20, right: 20, bottom: 40, left: 40}, - svgWidth = svgWidth - margin.left - margin.right, - svgHeight = 250 - margin.top - margin.bottom; - - -//d3.select("#ex1").append("svg") - - var svgFilteredChartAgenda = d3.select("body") - .append("svg") - .attr("id", "chartAgenda") - .attr("width", agendaWidth ) - .attr("height", svgHeight + margin.top + margin.bottom) - ; - - var filteredChartAgenda = svgFilteredChartAgenda.selectAll("percFilteringPassChartAgenda") - .data(agenda) - .enter() - .append("rect") - .attr("rx", 3) - .attr("y", function(d, i) { return i * (svgHeight / agenda.length) ;}) - .attr("x", function(d) { return 0; }) - .attr("width", function (d) { return agendaWidth - AgendaWidthOffset }) - .attr("height", function (d) { return svgHeight / agenda.length - barPadding;}) - .attr("fill", function (d) { return "hsla("+ Math.round(d)*1.2 +", 40%, 30%, 1)"}); - - svgFilteredChartAgenda.selectAll("agendaText") - .data(agenda) - .enter() - .append("text") - .text(function(d) { return d + " %"; }) - .attr("fill", function(d) { return "white";}) - .attr("x", function(d) { return (agendaWidth - AgendaWidthOffset)/2 ; }) - .attr("y", function(d, i) { return i * (svgHeight / agenda.length) + (svgHeight / agenda.length - barPadding) / 2 + 3;}) - .attr("font-family", "sans-serif") - .attr("font-size", "10px") - .attr("text-anchor", "middle") - ; - - var svgFilteredChart = d3.select("body") - .append("svg") - .attr("id", "filteredChart") - .attr("width", svgWidth + margin.left + margin.right) - .attr("height", svgHeight + margin.top + margin.bottom) - .append("g") - .attr("transform", "translate(" + margin.left + "," + margin.top + ")") - ; - - svgFilteredChart.append('text') - .text("% passes Illumina Filtering (PF)") - .attr("transform", "translate(" + (svgWidth/2) + "," + (svgHeight - 200) + ")") - .attr("font-family", "sans-serif") - .attr("font-size", "14px") - .attr("text-anchor", "middle") - ; - - var x = d3.scale.ordinal() - .rangeRoundBands([0, svgWidth], valuePadding); - //.rangeRoundBands([0, svgWidth], .001); - - var y = d3.scale.linear() - .range([svgHeight, 0]); - - var xAxis = d3.svg.axis() - .scale(x) - .orient("bottom") - //.tickPadding(25); - - var yAxis = d3.svg.axis() - .scale(y) - .orient("left"); - //.tickFormat(formatPercent); - - //x.domain(statisticsArray.map(function(d) { return d.externalSampleName+": "+d.index1;} )); - x.domain(statisticsArray.map(function(d) { if (d.externalSampleName == undefined ) {return d.index1}; return d.externalSampleName; })); - //y.domain([0, d3.max(statisticsArray, function(d) { return d.percFilteringPass; })]); - y.domain([0, 100]); - - svgFilteredChart.append("g") - .attr("class", "axis") - .attr("transform", "translate(0," + svgHeight + ")") - .call(xAxis); - - var filteredChart = svgFilteredChart.selectAll("percFilteringPassChart") - .data(statisticsArray) - .enter() - .append("rect") - .attr("rx", 3) - .attr ("x", function (d) {return x(d.externalSampleName+d.index1);}) - .attr ("width", x.rangeBand()) - .attr ("y", function (d,i) {return y(d.percFilteringPass);}) - .attr("height", function (d,i) {return svgHeight - y(d.percFilteringPass);}) - .attr("fill", function (d) { return "hsla("+ Math.round(d.percFilteringPass)*1.2 +", 40%, 30%, 1)"}); - - svgFilteredChart.selectAll(".axis text") // select all the text elements for the xaxis - .data(statisticsArray) - .attr ("y", function(d, i) {if (i%2 == 0) {return 8} return 22}); // if index is even the put the text up, else further down - - svgFilteredChart.append("g") - .attr("class", "y axis") - .call(yAxis) - .append("text") - .attr("transform", "rotate(0)") - .attr("x", 16) - .attr("dy", ".71em") - .style("text-anchor", "end") - .text("%"); - - - svgFilteredChart.selectAll("svgFilteredChartText") - .data(statisticsArray) - .enter() - .append("text") - .text(function(d) { return d.percFilteringPass + " %"; }) - .attr("x", function(d, i) { return i * 1/(1+valuePadding)*(svgWidth / statisticsArray.length) + ((svgWidth /statisticsArray.length ) /2) -15; }) - .attr("y", function(d) { - if (d.percFilteringPass < 40) { return svgHeight - d.percFilteringPass - margin.top - margin.bottom; } - return (svgHeight - d.percFilteringPass - margin.bottom) ; - }) - .attr("font-family", "sans-serif") - .attr("font-size", "12px") - .attr("fill", function(d) { if (d.percFilteringPass < 60) { return "black";} - return "white";}) -} - - -function plotReadsSum (statisticsArray, sums){ - - svgWidth = statisticsArray.length * 100 - if (svgWidth < 200) {svgWidth = 300;} - - var formatThousands = d3.format(","); - var colorRange = d3.scale.ordinal() - .range(colors); - - - - var margin = {top: 40, right: 20, bottom: 30, left: 40}, - svgWidth = svgWidth - margin.left - margin.right, - svgHeight = 250 - margin.top - margin.bottom; - - var barPadding = 1; - var valuePadding = 0.01; - - var svgReadsSum = d3.select("body") - .append("svg") - .attr("id", "unfilteredReads") - .attr("width", svgWidth + margin.left + margin.right) - .attr("height", svgHeight + margin.top + margin.bottom) - .append("g") - .attr("transform", "translate(" + margin.left + "," + margin.top + ")") - ; - - var rawReadsSum = 0; - rawReadsSum = sums[0].rawReadsSum - - svgReadsSum.append('text') - .text("Number of raw Reads: " + formatThousands(rawReadsSum)) - .attr("transform", "translate(" + (svgWidth/2) + "," + (svgHeight - 200) + ")") - .attr("font-family", "sans-serif") - .attr("font-size", "14px") - .attr("text-anchor", "middle") - ; - - - var x = d3.scale.ordinal() - .rangeRoundBands([0, svgWidth], valuePadding); - - var y = d3.scale.linear() - .range([svgHeight, 0]); - - var xAxis = d3.svg.axis() - .scale(x) - .orient("bottom"); - - var yAxis = d3.svg.axis() - .scale(y) - .orient("left"); - - x.domain(statisticsArray.map(function(d) { if (d.externalSampleName == undefined ) {return d.index1}; return d.externalSampleName; })); - y.domain([0, d3.max(statisticsArray, function(d) { return d.rawReadsSum - 20; })]); - - svgReadsSum.append("g") - .attr("class", "axis") - .attr("transform", "translate(0," + svgHeight + ")") - .call(xAxis); - - // alternate between minimal padding and high padding of the tick names - svgReadsSum.selectAll(".axis text") // select all the text elements for the xaxis - .data(statisticsArray) - .attr ("y", function(d, i) {if (i%2 == 0) {return 8} return 22}); // if index is even the put the text up, else further down - - - var ReadsSum = svgReadsSum.selectAll("ReadsSum") - .data(statisticsArray) - .enter() - .append("rect") - .attr("rx", 3) - .attr ("x", function (d) {return x(d.externalSampleName+d.index1);}) - .attr ("width", x.rangeBand()) - .attr ("y", function (d,i) {return y(d.rawReadsSum) ;}) - .attr("height", function (d,i) {return svgHeight - y(d.rawReadsSum);}) - // .attr("fill", function (d) { return "hsla("+ Math.round(d.rawReadsSum)*1.2 +", 40%, 30%, 1)"}); - .attr("fill", function(d) { return colorRange(d.rawReadsSum); }) - ; - - svgReadsSum.selectAll("svgReadsSumText") - .data(statisticsArray) - .enter() - .append("text") - .text(function(d) { return formatThousands(d.rawReadsSum); }) - //.attr("x", function(d, i) { return i * 1/(1+valuePadding)*(svgWidth / statisticsArray.length) + ((svgWidth /statisticsArray.length ) /2) -10; }) - .attr ("x", function (d) {return x(d.externalSampleName+d.index1) + 20;}) - .attr("y", function(d) { - return (svgHeight - margin.top - margin.bottom + 20) ; - }) - .attr("font-family", "sans-serif") - .attr("font-size", "10px") - .attr("fill", function(d) { if (d.rawReadsSum < 30000000) { return "black";} - return "black";}) - - ; - -} - -function roundFloat(myFloat) { - return Number(myFloat).toFixed(2); -} - - -function calculateSum(statisticsArray, withNOINDEX) { - - var sums = [] - var averagePercFilteringPass = 0; - var sumRawReads = 0; - var sumPfReads = 0; - var sumRawYieldMbases = 0; - var sumYieldMbases = 0; - var averagePercRawClustersPerLane = 0; - var averagePfMeanQualityScore = 0; - var averagePfYieldq30Percentage = 0; - - for (var i = 0; i < statisticsArray.length; i++) { - // do not calculate with the NOINDEX reads - if ((typeof (statisticsArray[i].externalSampleName) == 'undefined') && withNOINDEX) { - continue; - } else { - - averagePercFilteringPass = averagePercFilteringPass + parseFloat(statisticsArray[i].percFilteringPass); - sumRawReads = sumRawReads + parseInt(statisticsArray[i].rawReadsSum); - sumPfReads = sumPfReads + parseInt(statisticsArray[i].pfReadsSum); - sumRawYieldMbases = sumRawYieldMbases + parseInt(statisticsArray[i].rawYieldMbases); - sumYieldMbases = sumYieldMbases + parseInt(statisticsArray[i].yieldMbases); - averagePercRawClustersPerLane = averagePercRawClustersPerLane + parseInt(statisticsArray[i].percRawClustersPerLane); - averagePfMeanQualityScore = averagePfMeanQualityScore + parseInt(statisticsArray[i].pfMeanQualityScore); - averagePfYieldq30Percentage = averagePfYieldq30Percentage + parseInt(statisticsArray[i].pfYieldq30Percentage); - } - } - if (withNOINDEX) {penalty = -1} else {penalty = 0} - - // added the Math.max function to make sure that there is no division by zero, - // can happen when a single sample is on a lane (no multiplexing) - averagePercFilteringPass = roundFloat(averagePercFilteringPass / Math.max((statisticsArray.length + penalty),1)); - averagePercRawClustersPerLane = roundFloat(averagePercRawClustersPerLane /Math.max((statisticsArray.length + penalty),1)); - averagePfMeanQualityScore = roundFloat(averagePfMeanQualityScore / Math.max((statisticsArray.length + penalty),1)); - averagePfYieldq30Percentage = roundFloat(averagePfYieldq30Percentage / Math.max((statisticsArray.length + penalty),1)); - - sums.push({ - 'averagePercFilteringPass' : averagePercFilteringPass, - 'rawReadsSum' : sumRawReads, - 'pfReadsSum' : sumPfReads, - 'rawYieldMbases' : sumRawYieldMbases, - 'yieldMbases' : sumYieldMbases, - 'percRawClustersPerLane': averagePercRawClustersPerLane, - 'pfMeanQualityScore' : averagePfMeanQualityScore, - 'pfYieldq30Percentage' : averagePfYieldq30Percentage - }); - - //console.log(sums); - return sums; - -} - - -function plotPercRawClustersPerLane (percRawClustersPerLaneArray) { - - var colorRange = d3.scale.ordinal() - .range(colors) - - var margin = {top: 60, right: 20, bottom: 40, left: 40}, - width = 500 - margin.left - margin.right, - height = 500 - margin.top - margin.bottom; - - var radius = Math.min(width, height) / 2; - - var arc = d3.svg.arc() - .outerRadius(radius - 50) - .innerRadius(radius - 90); - - var pie = d3.layout.pie() - .sort(null) - .value(function(d) { return d.percRawClustersPerLane; }); - - var svgPercRawClustersPerLaneChart = d3.select("body").append("svg") - .attr("id", "percRawClusters") - .attr("width", width) - .attr("height", height) - .append("g") - .attr("transform", "translate(" + width / 2 + "," + height / 2+ ")"); - - percRawClustersPerLaneArray.forEach(function(d) { - d.percRawClustersPerLane = +d.percRawClustersPerLane; - }); - - var g = svgPercRawClustersPerLaneChart.selectAll(".arc") - .data(pie(percRawClustersPerLaneArray)) - .enter().append("g") - .attr("class", "arc"); - - g.append("path") - .attr("d", arc) - .style("fill", function(d) { return colorRange(d.data.index1); }); - - g.append("text") - .attr("transform", function(d) { return "translate(" + arc.centroid(d) + ")"; }) - .attr("dy", ".35em") - .style("text-anchor", "middle") - .attr("font-family", "sans-serif") - .attr("font-size", "10px") - .attr("text-anchor", "middle") - .text(function (d) { - var perc = d.data.percRawClustersPerLane + " %"; - if (d.data.externalSampleName == undefined || d.data.externalSampleName.length > 10) {return d.data.index1 + " " + perc} - return d.data.externalSampleName + " " + perc }) - .on("mouseover", function(d) { - div.transition() - .duration(200) - .style("opacity", .9); - div.style("width", Math.max(d.data.externalSampleName.length, d.data.index1.length) * 8 + "px") - div.html(d.data.externalSampleName + "<br/>" + d.data.index1 + "<br/>" + d.data.percRawClustersPerLane + " %") - .style("left", (d3.event.pageX) + "px") - .style("top", (d3.event.pageY - 42) + "px"); - }) - .on("mouseout", function(d) { - div.transition() - .duration(500) - .style("opacity", 0); - }); - - - svgPercRawClustersPerLaneChart.append('text') - .text("% in Lane") - .attr("fill", "black") - .attr("transform", "translate(" + "0" + "," + (height -220) + ")") - .attr("font-family", "sans-serif") - .attr("font-size", "14px") - .attr("text-anchor", "middle") - ; - -} - - -function downloadButton (buttonName) { - - - var div = d3.select("body").append("button") - .attr("class", "btn-xs") - .attr("type", "submit") - .attr("id", "save_as" + buttonName) - .attr("value", "") - .text("Save") - ; -} - - function submit_download_form(output_format, svgName) - { - var rawSampleName = webAppContext.entityIdentifier - var split = rawSampleName.split(":") - var fc = split[0].split("/")[2] - var lane = split[1] - - // Get the d3js SVG element - var tmp = document.getElementById(svgName); - - if (output_format == "svg") { - - // Extract the data as SVG text string - var svg_xml = "<svg xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">" + (new XMLSerializer).serializeToString(tmp) + "</svg>"; - - var blob = new Blob([svg_xml], {type: "image/svg+xml;charset=utf-8"}); - } - if (output_format == "html") { - var html = "<html> <head> <title></title> <style type=\"text/css\">" + - "table.tableStats { font-family: sans-serif; font-size: 14px; border-collapse:collapse; }" + - ".tableStats th { padding:6px 10px; color:#444; font-weight:bold; text-shadow:1px 1px 1px #fff; border-bottom:2px solid #444; }" + - ".tableStats tr:nth-child(even) { background: WhiteSmoke; }" + - ".tableStats td { padding:0px 10px 10px 10px; }" + - "</style> </head> <body>" + - (new XMLSerializer).serializeToString(tmp) + - "</body> </html>" - var blob = new Blob([html], {type: "image/html;charset=utf-8"}); - } - if (output_format == "png") { - console.log("png") - } - - saveAs(blob, fc + "_Lane_" + lane + "_" + svgName + "." + output_format); - - } - - </script> - </body> -</html> - diff --git a/deep_sequencing_unit/source/core-plugins/laneStatistics/1/as/webapps/laneStatistics/html/openbis-dsu.js b/deep_sequencing_unit/source/core-plugins/laneStatistics/1/as/webapps/laneStatistics/html/openbis-dsu.js deleted file mode 100644 index 31b23f083465af5fc39099a2aa8b04e499ec18ae..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/source/core-plugins/laneStatistics/1/as/webapps/laneStatistics/html/openbis-dsu.js +++ /dev/null @@ -1,81 +0,0 @@ -/** - * openbis-dsu.js - * OpenBIS-DSU API - * - * A DSU-specific API for accessing openBIS. Depends on openbis.js. - * @author Chandrasekhar Ramakrishnan - */ - -/** - * The openbis_dsu object provides a dsu-specific interface to openbis. - * - * It creates objects for projects, experiments, samples, and datasets. These objects - * are designed to be passed on to GUI libraries (like d3). The openbis version of each - * object is stored in the bis variable. - * @constructor - */ -function openbis_dsu(url, dssUrl) { - this.server = new openbis(url, dssUrl); -} - -/** - * Request the sequencing samples for a project - */ -openbis_dsu.prototype.retrieveSequencingSamples = function(action) -{ - var sampleCriteria = - { - matchClauses : - [ {"@type":"AttributeMatchClause", - attribute : "TYPE", - fieldType : "ATTRIBUTE", - desiredValue : "ILLUMINA_SEQUENCING" - } ], - operator : "MATCH_ALL_CLAUSES" - }; - - this.server.searchForSamples(sampleCriteria, action); -} - -/** - * Get the data sets for a sample specified by sample identifier - */ -openbis_dsu.prototype.retrieveDataSetsForSample = function(sampleIdentifier, action) -{ - var sampleIdentifierTokens = sampleIdentifier.split("/"); - var sampleCriteria = - { - targetEntityKind : "SAMPLE", - criteria : { - matchClauses : - [ {"@type":"AttributeMatchClause", - "attribute":"CODE", - "fieldType":"ATTRIBUTE", - "desiredValue": sampleIdentifierTokens[2] - }] - } - }; - - var dataSetCriteria = - { - subCriterias : [ sampleCriteria ], - matchClauses : - [ {"@type":"AttributeMatchClause", - attribute : "TYPE", - fieldType : "ATTRIBUTE", - desiredValue : "FASTQ_GZ" - } ], - operator : "MATCH_ALL_CLAUSES" - }; - - this.server.searchForDataSets(dataSetCriteria, action) -} - -/** - * Get all data sets connected to a sequencing sample - */ -openbis_dsu.prototype.retrieveDataSetsForSequencingSample = function(sequencing, action) -{ - this.server.listDataSetsForSample(sequencing.bis, false, action); -} - diff --git a/deep_sequencing_unit/source/core-plugins/laneStatistics/1/as/webapps/laneStatistics/html/pie.js b/deep_sequencing_unit/source/core-plugins/laneStatistics/1/as/webapps/laneStatistics/html/pie.js deleted file mode 100755 index 4d6788a48bf6a97ab6be9b8a15f5638a4b9dab6a..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/source/core-plugins/laneStatistics/1/as/webapps/laneStatistics/html/pie.js +++ /dev/null @@ -1,94 +0,0 @@ -d3.layout.pie = function() { - var value = Number, - sort = d3_layout_pieSortByValue, - startAngle = 0, - endAngle = 2 * Math.PI; - - function pie(data) { - - // Compute the numeric values for each data element. - var values = data.map(function(d, i) { return +value.call(pie, d, i); }); - - // Compute the start angle. - var a = +(typeof startAngle === "function" - ? startAngle.apply(this, arguments) - : startAngle); - - // Compute the angular scale factor: from value to radians. - var k = ((typeof endAngle === "function" - ? endAngle.apply(this, arguments) - : endAngle) - startAngle) - / d3.sum(values); - - // Optionally sort the data. - var index = d3.range(data.length); - if (sort != null) index.sort(sort === d3_layout_pieSortByValue - ? function(i, j) { return values[j] - values[i]; } - : function(i, j) { return sort(data[i], data[j]); }); - - // Compute the arcs! - // They are stored in the original data's order. - var arcs = []; - index.forEach(function(i) { - var d; - arcs[i] = { - data: data[i], - value: d = values[i], - startAngle: a, - endAngle: a += d * k - }; - }); - return arcs; - } - - /** - * Specifies the value function *x*, which returns a nonnegative numeric value - * for each datum. The default value function is `Number`. The value function - * is passed two arguments: the current datum and the current index. - */ - pie.value = function(x) { - if (!arguments.length) return value; - value = x; - return pie; - }; - - /** - * Specifies a sort comparison operator *x*. The comparator is passed two data - * elements from the data array, a and b; it returns a negative value if a is - * less than b, a positive value if a is greater than b, and zero if a equals - * b. - */ - pie.sort = function(x) { - if (!arguments.length) return sort; - sort = x; - return pie; - }; - - /** - * Specifies the overall start angle of the pie chart. Defaults to 0. The - * start angle can be specified either as a constant or as a function; in the - * case of a function, it is evaluated once per array (as opposed to per - * element). - */ - pie.startAngle = function(x) { - if (!arguments.length) return startAngle; - startAngle = x; - return pie; - }; - - /** - * Specifies the overall end angle of the pie chart. Defaults to 2π. The - * end angle can be specified either as a constant or as a function; in the - * case of a function, it is evaluated once per array (as opposed to per - * element). - */ - pie.endAngle = function(x) { - if (!arguments.length) return endAngle; - endAngle = x; - return pie; - }; - - return pie; -}; - -var d3_layout_pieSortByValue = {}; diff --git a/deep_sequencing_unit/source/core-plugins/laneStatistics/1/as/webapps/laneStatistics/html/style.css b/deep_sequencing_unit/source/core-plugins/laneStatistics/1/as/webapps/laneStatistics/html/style.css deleted file mode 100644 index 985d8ac6db01436d9b470bd37405ff4fae6ca8cd..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/source/core-plugins/laneStatistics/1/as/webapps/laneStatistics/html/style.css +++ /dev/null @@ -1,47 +0,0 @@ - .axis path, - .axis line { - fill: none; - stroke: #000; - shape-rendering: crispEdges; - } - - .axis text { - font-family: sans-serif; - font-size: 10px; - } - - table.tableStats { - font-family: sans-serif; - font-size: 14px; - border-collapse:collapse; - } - - .tableStats th { - padding:6px 10px; - color:#444; - font-weight:bold; - text-shadow:1px 1px 1px #fff; - border-bottom:2px solid #444; - } - - .tableStats tr:nth-child(even) { - background: WhiteSmoke; - } - .tableStats td { - - padding:0px 10px 10px 10px; - - } - - div.tooltip { - position: absolute; - text-align: center; - width: 100px; - height: 42px; - padding: 2px; - font: 12px sans-serif; - background: LightSalmon; - border: 0px; - border-radius: 8px; - pointer-events: none; - } diff --git a/deep_sequencing_unit/source/core-plugins/laneStatistics/1/as/webapps/laneStatistics/plugin.properties b/deep_sequencing_unit/source/core-plugins/laneStatistics/1/as/webapps/laneStatistics/plugin.properties deleted file mode 100644 index bbdf23ed3bfb332e348e216fc11eeba1d887f43f..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/source/core-plugins/laneStatistics/1/as/webapps/laneStatistics/plugin.properties +++ /dev/null @@ -1,6 +0,0 @@ -# The properties file for an example webapps plugin -# This file has no properties defined because none need to be defined. -webapp-folder = html -openbisui-contexts = sample-details-view -sample-entity-types = ILLUMINA_FLOW_LANE -label = Lane Statistics (BETA) diff --git a/deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/css/bootstrap-responsive.css b/deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/css/bootstrap-responsive.css deleted file mode 100644 index 06e55c0b45b2d997138bd186cb1bb5788b882016..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/css/bootstrap-responsive.css +++ /dev/null @@ -1,815 +0,0 @@ -/*! - * Bootstrap Responsive v2.0.4 - * - * Copyright 2012 Twitter, Inc - * Licensed under the Apache License v2.0 - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Designed and built with all the love in the world @twitter by @mdo and @fat. - */ - -.clearfix { - *zoom: 1; -} - -.clearfix:before, -.clearfix:after { - display: table; - content: ""; -} - -.clearfix:after { - clear: both; -} - -.hide-text { - font: 0/0 a; - color: transparent; - text-shadow: none; - background-color: transparent; - border: 0; -} - -.input-block-level { - display: block; - width: 100%; - min-height: 28px; - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - -ms-box-sizing: border-box; - box-sizing: border-box; -} - -.hidden { - display: none; - visibility: hidden; -} - -.visible-phone { - display: none !important; -} - -.visible-tablet { - display: none !important; -} - -.hidden-desktop { - display: none !important; -} - -@media (max-width: 767px) { - .visible-phone { - display: inherit !important; - } - .hidden-phone { - display: none !important; - } - .hidden-desktop { - display: inherit !important; - } - .visible-desktop { - display: none !important; - } -} - -@media (min-width: 768px) and (max-width: 979px) { - .visible-tablet { - display: inherit !important; - } - .hidden-tablet { - display: none !important; - } - .hidden-desktop { - display: inherit !important; - } - .visible-desktop { - display: none !important ; - } -} - -@media (max-width: 480px) { - .nav-collapse { - -webkit-transform: translate3d(0, 0, 0); - } - .page-header h1 small { - display: block; - line-height: 18px; - } - input[type="checkbox"], - input[type="radio"] { - border: 1px solid #ccc; - } - .form-horizontal .control-group > label { - float: none; - width: auto; - padding-top: 0; - text-align: left; - } - .form-horizontal .controls { - margin-left: 0; - } - .form-horizontal .control-list { - padding-top: 0; - } - .form-horizontal .form-actions { - padding-right: 10px; - padding-left: 10px; - } - .modal { - position: absolute; - top: 10px; - right: 10px; - left: 10px; - width: auto; - margin: 0; - } - .modal.fade.in { - top: auto; - } - .modal-header .close { - padding: 10px; - margin: -10px; - } - .carousel-caption { - position: static; - } -} - -@media (max-width: 767px) { - body { - padding-right: 20px; - padding-left: 20px; - } - .navbar-fixed-top, - .navbar-fixed-bottom { - margin-right: -20px; - margin-left: -20px; - } - .container-fluid { - padding: 0; - } - .dl-horizontal dt { - float: none; - width: auto; - clear: none; - text-align: left; - } - .dl-horizontal dd { - margin-left: 0; - } - .container { - width: auto; - } - .row-fluid { - width: 100%; - } - .row, - .thumbnails { - margin-left: 0; - } - [class*="span"], - .row-fluid [class*="span"] { - display: block; - float: none; - width: auto; - margin-left: 0; - } - .input-large, - .input-xlarge, - .input-xxlarge, - input[class*="span"], - select[class*="span"], - textarea[class*="span"], - .uneditable-input { - display: block; - width: 100%; - min-height: 28px; - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - -ms-box-sizing: border-box; - box-sizing: border-box; - } - .input-prepend input, - .input-append input, - .input-prepend input[class*="span"], - .input-append input[class*="span"] { - display: inline-block; - width: auto; - } -} - -@media (min-width: 768px) and (max-width: 979px) { - .row { - margin-left: -20px; - *zoom: 1; - } - .row:before, - .row:after { - display: table; - content: ""; - } - .row:after { - clear: both; - } - [class*="span"] { - float: left; - margin-left: 20px; - } - .container, - .navbar-fixed-top .container, - .navbar-fixed-bottom .container { - width: 724px; - } - .span12 { - width: 724px; - } - .span11 { - width: 662px; - } - .span10 { - width: 600px; - } - .span9 { - width: 538px; - } - .span8 { - width: 476px; - } - .span7 { - width: 414px; - } - .span6 { - width: 352px; - } - .span5 { - width: 290px; - } - .span4 { - width: 228px; - } - .span3 { - width: 166px; - } - .span2 { - width: 104px; - } - .span1 { - width: 42px; - } - .offset12 { - margin-left: 764px; - } - .offset11 { - margin-left: 702px; - } - .offset10 { - margin-left: 640px; - } - .offset9 { - margin-left: 578px; - } - .offset8 { - margin-left: 516px; - } - .offset7 { - margin-left: 454px; - } - .offset6 { - margin-left: 392px; - } - .offset5 { - margin-left: 330px; - } - .offset4 { - margin-left: 268px; - } - .offset3 { - margin-left: 206px; - } - .offset2 { - margin-left: 144px; - } - .offset1 { - margin-left: 82px; - } - .row-fluid { - width: 100%; - *zoom: 1; - } - .row-fluid:before, - .row-fluid:after { - display: table; - content: ""; - } - .row-fluid:after { - clear: both; - } - .row-fluid [class*="span"] { - display: block; - float: left; - width: 100%; - min-height: 28px; - margin-left: 2.762430939%; - *margin-left: 2.709239449638298%; - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - -ms-box-sizing: border-box; - box-sizing: border-box; - } - .row-fluid [class*="span"]:first-child { - margin-left: 0; - } - .row-fluid .span12 { - width: 99.999999993%; - *width: 99.9468085036383%; - } - .row-fluid .span11 { - width: 91.436464082%; - *width: 91.38327259263829%; - } - .row-fluid .span10 { - width: 82.87292817100001%; - *width: 82.8197366816383%; - } - .row-fluid .span9 { - width: 74.30939226%; - *width: 74.25620077063829%; - } - .row-fluid .span8 { - width: 65.74585634900001%; - *width: 65.6926648596383%; - } - .row-fluid .span7 { - width: 57.182320438000005%; - *width: 57.129128948638304%; - } - .row-fluid .span6 { - width: 48.618784527%; - *width: 48.5655930376383%; - } - .row-fluid .span5 { - width: 40.055248616%; - *width: 40.0020571266383%; - } - .row-fluid .span4 { - width: 31.491712705%; - *width: 31.4385212156383%; - } - .row-fluid .span3 { - width: 22.928176794%; - *width: 22.874985304638297%; - } - .row-fluid .span2 { - width: 14.364640883%; - *width: 14.311449393638298%; - } - .row-fluid .span1 { - width: 5.801104972%; - *width: 5.747913482638298%; - } - input, - textarea, - .uneditable-input { - margin-left: 0; - } - input.span12, - textarea.span12, - .uneditable-input.span12 { - width: 714px; - } - input.span11, - textarea.span11, - .uneditable-input.span11 { - width: 652px; - } - input.span10, - textarea.span10, - .uneditable-input.span10 { - width: 590px; - } - input.span9, - textarea.span9, - .uneditable-input.span9 { - width: 528px; - } - input.span8, - textarea.span8, - .uneditable-input.span8 { - width: 466px; - } - input.span7, - textarea.span7, - .uneditable-input.span7 { - width: 404px; - } - input.span6, - textarea.span6, - .uneditable-input.span6 { - width: 342px; - } - input.span5, - textarea.span5, - .uneditable-input.span5 { - width: 280px; - } - input.span4, - textarea.span4, - .uneditable-input.span4 { - width: 218px; - } - input.span3, - textarea.span3, - .uneditable-input.span3 { - width: 156px; - } - input.span2, - textarea.span2, - .uneditable-input.span2 { - width: 94px; - } - input.span1, - textarea.span1, - .uneditable-input.span1 { - width: 32px; - } -} - -@media (min-width: 1200px) { - .row { - margin-left: -30px; - *zoom: 1; - } - .row:before, - .row:after { - display: table; - content: ""; - } - .row:after { - clear: both; - } - [class*="span"] { - float: left; - margin-left: 30px; - } - .container, - .navbar-fixed-top .container, - .navbar-fixed-bottom .container { - width: 1170px; - } - .span12 { - width: 1170px; - } - .span11 { - width: 1070px; - } - .span10 { - width: 970px; - } - .span9 { - width: 870px; - } - .span8 { - width: 770px; - } - .span7 { - width: 670px; - } - .span6 { - width: 570px; - } - .span5 { - width: 470px; - } - .span4 { - width: 370px; - } - .span3 { - width: 270px; - } - .span2 { - width: 170px; - } - .span1 { - width: 70px; - } - .offset12 { - margin-left: 1230px; - } - .offset11 { - margin-left: 1130px; - } - .offset10 { - margin-left: 1030px; - } - .offset9 { - margin-left: 930px; - } - .offset8 { - margin-left: 830px; - } - .offset7 { - margin-left: 730px; - } - .offset6 { - margin-left: 630px; - } - .offset5 { - margin-left: 530px; - } - .offset4 { - margin-left: 430px; - } - .offset3 { - margin-left: 330px; - } - .offset2 { - margin-left: 230px; - } - .offset1 { - margin-left: 130px; - } - .row-fluid { - width: 100%; - *zoom: 1; - } - .row-fluid:before, - .row-fluid:after { - display: table; - content: ""; - } - .row-fluid:after { - clear: both; - } - .row-fluid [class*="span"] { - display: block; - float: left; - width: 100%; - min-height: 28px; - margin-left: 2.564102564%; - *margin-left: 2.510911074638298%; - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - -ms-box-sizing: border-box; - box-sizing: border-box; - } - .row-fluid [class*="span"]:first-child { - margin-left: 0; - } - .row-fluid .span12 { - width: 100%; - *width: 99.94680851063829%; - } - .row-fluid .span11 { - width: 91.45299145300001%; - *width: 91.3997999636383%; - } - .row-fluid .span10 { - width: 82.905982906%; - *width: 82.8527914166383%; - } - .row-fluid .span9 { - width: 74.358974359%; - *width: 74.30578286963829%; - } - .row-fluid .span8 { - width: 65.81196581200001%; - *width: 65.7587743226383%; - } - .row-fluid .span7 { - width: 57.264957265%; - *width: 57.2117657756383%; - } - .row-fluid .span6 { - width: 48.717948718%; - *width: 48.6647572286383%; - } - .row-fluid .span5 { - width: 40.170940171000005%; - *width: 40.117748681638304%; - } - .row-fluid .span4 { - width: 31.623931624%; - *width: 31.5707401346383%; - } - .row-fluid .span3 { - width: 23.076923077%; - *width: 23.0237315876383%; - } - .row-fluid .span2 { - width: 14.529914530000001%; - *width: 14.4767230406383%; - } - .row-fluid .span1 { - width: 5.982905983%; - *width: 5.929714493638298%; - } - input, - textarea, - .uneditable-input { - margin-left: 0; - } - input.span12, - textarea.span12, - .uneditable-input.span12 { - width: 1160px; - } - input.span11, - textarea.span11, - .uneditable-input.span11 { - width: 1060px; - } - input.span10, - textarea.span10, - .uneditable-input.span10 { - width: 960px; - } - input.span9, - textarea.span9, - .uneditable-input.span9 { - width: 860px; - } - input.span8, - textarea.span8, - .uneditable-input.span8 { - width: 760px; - } - input.span7, - textarea.span7, - .uneditable-input.span7 { - width: 660px; - } - input.span6, - textarea.span6, - .uneditable-input.span6 { - width: 560px; - } - input.span5, - textarea.span5, - .uneditable-input.span5 { - width: 460px; - } - input.span4, - textarea.span4, - .uneditable-input.span4 { - width: 360px; - } - input.span3, - textarea.span3, - .uneditable-input.span3 { - width: 260px; - } - input.span2, - textarea.span2, - .uneditable-input.span2 { - width: 160px; - } - input.span1, - textarea.span1, - .uneditable-input.span1 { - width: 60px; - } - .thumbnails { - margin-left: -30px; - } - .thumbnails > li { - margin-left: 30px; - } - .row-fluid .thumbnails { - margin-left: 0; - } -} - -@media (max-width: 979px) { - body { - padding-top: 0; - } - .navbar-fixed-top, - .navbar-fixed-bottom { - position: static; - } - .navbar-fixed-top { - margin-bottom: 18px; - } - .navbar-fixed-bottom { - margin-top: 18px; - } - .navbar-fixed-top .navbar-inner, - .navbar-fixed-bottom .navbar-inner { - padding: 5px; - } - .navbar .container { - width: auto; - padding: 0; - } - .navbar .brand { - padding-right: 10px; - padding-left: 10px; - margin: 0 0 0 -5px; - } - .nav-collapse { - clear: both; - } - .nav-collapse .nav { - float: none; - margin: 0 0 9px; - } - .nav-collapse .nav > li { - float: none; - } - .nav-collapse .nav > li > a { - margin-bottom: 2px; - } - .nav-collapse .nav > .divider-vertical { - display: none; - } - .nav-collapse .nav .nav-header { - color: #999999; - text-shadow: none; - } - .nav-collapse .nav > li > a, - .nav-collapse .dropdown-menu a { - padding: 6px 15px; - font-weight: bold; - color: #999999; - -webkit-border-radius: 3px; - -moz-border-radius: 3px; - border-radius: 3px; - } - .nav-collapse .btn { - padding: 4px 10px 4px; - font-weight: normal; - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; - } - .nav-collapse .dropdown-menu li + li a { - margin-bottom: 2px; - } - .nav-collapse .nav > li > a:hover, - .nav-collapse .dropdown-menu a:hover { - background-color: #222222; - } - .nav-collapse.in .btn-group { - padding: 0; - margin-top: 5px; - } - .nav-collapse .dropdown-menu { - position: static; - top: auto; - left: auto; - display: block; - float: none; - max-width: none; - padding: 0; - margin: 0 15px; - background-color: transparent; - border: none; - -webkit-border-radius: 0; - -moz-border-radius: 0; - border-radius: 0; - -webkit-box-shadow: none; - -moz-box-shadow: none; - box-shadow: none; - } - .nav-collapse .dropdown-menu:before, - .nav-collapse .dropdown-menu:after { - display: none; - } - .nav-collapse .dropdown-menu .divider { - display: none; - } - .nav-collapse .navbar-form, - .nav-collapse .navbar-search { - float: none; - padding: 9px 15px; - margin: 9px 0; - border-top: 1px solid #222222; - border-bottom: 1px solid #222222; - -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1); - -moz-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1); - box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1); - } - .navbar .nav-collapse .nav.pull-right { - float: none; - margin-left: 0; - } - .nav-collapse, - .nav-collapse.collapse { - height: 0; - overflow: hidden; - } - .navbar .btn-navbar { - display: block; - } - .navbar-static .navbar-inner { - padding-right: 10px; - padding-left: 10px; - } -} - -@media (min-width: 980px) { - .nav-collapse.collapse { - height: auto !important; - overflow: visible !important; - } -} diff --git a/deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/css/bootstrap.css b/deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/css/bootstrap.css deleted file mode 100644 index 8c6fea7a84edadaebb04c071835bbf7a748f90ac..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/css/bootstrap.css +++ /dev/null @@ -1,4984 +0,0 @@ -/*! - * Bootstrap v2.0.4 - * - * Copyright 2012 Twitter, Inc - * Licensed under the Apache License v2.0 - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Designed and built with all the love in the world @twitter by @mdo and @fat. - */ - -article, -aside, -details, -figcaption, -figure, -footer, -header, -hgroup, -nav, -section { - display: block; -} - -audio, -canvas, -video { - display: inline-block; - *display: inline; - *zoom: 1; -} - -audio:not([controls]) { - display: none; -} - -html { - font-size: 100%; - -webkit-text-size-adjust: 100%; - -ms-text-size-adjust: 100%; -} - -a:focus { - outline: thin dotted #333; - outline: 5px auto -webkit-focus-ring-color; - outline-offset: -2px; -} - -a:hover, -a:active { - outline: 0; -} - -sub, -sup { - position: relative; - font-size: 75%; - line-height: 0; - vertical-align: baseline; -} - -sup { - top: -0.5em; -} - -sub { - bottom: -0.25em; -} - -img { - max-width: 100%; - vertical-align: middle; - border: 0; - -ms-interpolation-mode: bicubic; -} - -#map_canvas img { - max-width: none; -} - -button, -input, -select, -textarea { - margin: 0; - font-size: 100%; - vertical-align: middle; -} - -button, -input { - *overflow: visible; - line-height: normal; -} - -button::-moz-focus-inner, -input::-moz-focus-inner { - padding: 0; - border: 0; -} - -button, -input[type="button"], -input[type="reset"], -input[type="submit"] { - cursor: pointer; - -webkit-appearance: button; -} - -input[type="search"] { - -webkit-box-sizing: content-box; - -moz-box-sizing: content-box; - box-sizing: content-box; - -webkit-appearance: textfield; -} - -input[type="search"]::-webkit-search-decoration, -input[type="search"]::-webkit-search-cancel-button { - -webkit-appearance: none; -} - -textarea { - overflow: auto; - vertical-align: top; -} - -.clearfix { - *zoom: 1; -} - -.clearfix:before, -.clearfix:after { - display: table; - content: ""; -} - -.clearfix:after { - clear: both; -} - -.hide-text { - font: 0/0 a; - color: transparent; - text-shadow: none; - background-color: transparent; - border: 0; -} - -.input-block-level { - display: block; - width: 100%; - min-height: 28px; - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - -ms-box-sizing: border-box; - box-sizing: border-box; -} - -body { - margin: 0; - font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; - font-size: 13px; - line-height: 18px; - color: #333333; - background-color: #ffffff; -} - -a { - color: #0088cc; - text-decoration: none; -} - -a:hover { - color: #005580; - text-decoration: underline; -} - -.row { - margin-left: -20px; - *zoom: 1; -} - -.row:before, -.row:after { - display: table; - content: ""; -} - -.row:after { - clear: both; -} - -[class*="span"] { - float: left; - margin-left: 20px; -} - -.container, -.navbar-fixed-top .container, -.navbar-fixed-bottom .container { - width: 940px; -} - -.span12 { - width: 940px; -} - -.span11 { - width: 860px; -} - -.span10 { - width: 780px; -} - -.span9 { - width: 700px; -} - -.span8 { - width: 620px; -} - -.span7 { - width: 540px; -} - -.span6 { - width: 460px; -} - -.span5 { - width: 380px; -} - -.span4 { - width: 300px; -} - -.span3 { - width: 220px; -} - -.span2 { - width: 140px; -} - -.span1 { - width: 60px; -} - -.offset12 { - margin-left: 980px; -} - -.offset11 { - margin-left: 900px; -} - -.offset10 { - margin-left: 820px; -} - -.offset9 { - margin-left: 740px; -} - -.offset8 { - margin-left: 660px; -} - -.offset7 { - margin-left: 580px; -} - -.offset6 { - margin-left: 500px; -} - -.offset5 { - margin-left: 420px; -} - -.offset4 { - margin-left: 340px; -} - -.offset3 { - margin-left: 260px; -} - -.offset2 { - margin-left: 180px; -} - -.offset1 { - margin-left: 100px; -} - -.row-fluid { - width: 100%; - *zoom: 1; -} - -.row-fluid:before, -.row-fluid:after { - display: table; - content: ""; -} - -.row-fluid:after { - clear: both; -} - -.row-fluid [class*="span"] { - display: block; - float: left; - width: 100%; - min-height: 28px; - margin-left: 2.127659574%; - *margin-left: 2.0744680846382977%; - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - -ms-box-sizing: border-box; - box-sizing: border-box; -} - -.row-fluid [class*="span"]:first-child { - margin-left: 0; -} - -.row-fluid .span12 { - width: 99.99999998999999%; - *width: 99.94680850063828%; -} - -.row-fluid .span11 { - width: 91.489361693%; - *width: 91.4361702036383%; -} - -.row-fluid .span10 { - width: 82.97872339599999%; - *width: 82.92553190663828%; -} - -.row-fluid .span9 { - width: 74.468085099%; - *width: 74.4148936096383%; -} - -.row-fluid .span8 { - width: 65.95744680199999%; - *width: 65.90425531263828%; -} - -.row-fluid .span7 { - width: 57.446808505%; - *width: 57.3936170156383%; -} - -.row-fluid .span6 { - width: 48.93617020799999%; - *width: 48.88297871863829%; -} - -.row-fluid .span5 { - width: 40.425531911%; - *width: 40.3723404216383%; -} - -.row-fluid .span4 { - width: 31.914893614%; - *width: 31.8617021246383%; -} - -.row-fluid .span3 { - width: 23.404255317%; - *width: 23.3510638276383%; -} - -.row-fluid .span2 { - width: 14.89361702%; - *width: 14.8404255306383%; -} - -.row-fluid .span1 { - width: 6.382978723%; - *width: 6.329787233638298%; -} - -.container { - margin-right: auto; - margin-left: auto; - *zoom: 1; -} - -.container:before, -.container:after { - display: table; - content: ""; -} - -.container:after { - clear: both; -} - -.container-fluid { - padding-right: 20px; - padding-left: 20px; - *zoom: 1; -} - -.container-fluid:before, -.container-fluid:after { - display: table; - content: ""; -} - -.container-fluid:after { - clear: both; -} - -p { - margin: 0 0 9px; -} - -p small { - font-size: 11px; - color: #999999; -} - -.lead { - margin-bottom: 18px; - font-size: 20px; - font-weight: 200; - line-height: 27px; -} - -h1, -h2, -h3, -h4, -h5, -h6 { - margin: 0; - font-family: inherit; - font-weight: bold; - color: inherit; - text-rendering: optimizelegibility; -} - -h1 small, -h2 small, -h3 small, -h4 small, -h5 small, -h6 small { - font-weight: normal; - color: #999999; -} - -h1 { - font-size: 30px; - line-height: 36px; -} - -h1 small { - font-size: 18px; -} - -h2 { - font-size: 24px; - line-height: 36px; -} - -h2 small { - font-size: 18px; -} - -h3 { - font-size: 18px; - line-height: 27px; -} - -h3 small { - font-size: 14px; -} - -h4, -h5, -h6 { - line-height: 18px; -} - -h4 { - font-size: 14px; -} - -h4 small { - font-size: 12px; -} - -h5 { - font-size: 12px; -} - -h6 { - font-size: 11px; - color: #999999; - text-transform: uppercase; -} - -.page-header { - padding-bottom: 17px; - margin: 18px 0; - border-bottom: 1px solid #eeeeee; -} - -.page-header h1 { - line-height: 1; -} - -ul, -ol { - padding: 0; - margin: 0 0 9px 25px; -} - -ul ul, -ul ol, -ol ol, -ol ul { - margin-bottom: 0; -} - -ul { - list-style: disc; -} - -ol { - list-style: decimal; -} - -li { - line-height: 18px; -} - -ul.unstyled, -ol.unstyled { - margin-left: 0; - list-style: none; -} - -dl { - margin-bottom: 18px; -} - -dt, -dd { - line-height: 18px; -} - -dt { - font-weight: bold; - line-height: 17px; -} - -dd { - margin-left: 9px; -} - -.dl-horizontal dt { - float: left; - width: 120px; - overflow: hidden; - clear: left; - text-align: right; - text-overflow: ellipsis; - white-space: nowrap; -} - -.dl-horizontal dd { - margin-left: 130px; -} - -hr { - margin: 18px 0; - border: 0; - border-top: 1px solid #eeeeee; - border-bottom: 1px solid #ffffff; -} - -strong { - font-weight: bold; -} - -em { - font-style: italic; -} - -.muted { - color: #999999; -} - -abbr[title] { - cursor: help; - border-bottom: 1px dotted #999999; -} - -abbr.initialism { - font-size: 90%; - text-transform: uppercase; -} - -blockquote { - padding: 0 0 0 15px; - margin: 0 0 18px; - border-left: 5px solid #eeeeee; -} - -blockquote p { - margin-bottom: 0; - font-size: 16px; - font-weight: 300; - line-height: 22.5px; -} - -blockquote small { - display: block; - line-height: 18px; - color: #999999; -} - -blockquote small:before { - content: '\2014 \00A0'; -} - -blockquote.pull-right { - float: right; - padding-right: 15px; - padding-left: 0; - border-right: 5px solid #eeeeee; - border-left: 0; -} - -blockquote.pull-right p, -blockquote.pull-right small { - text-align: right; -} - -q:before, -q:after, -blockquote:before, -blockquote:after { - content: ""; -} - -address { - display: block; - margin-bottom: 18px; - font-style: normal; - line-height: 18px; -} - -small { - font-size: 100%; -} - -cite { - font-style: normal; -} - -code, -pre { - padding: 0 3px 2px; - font-family: Menlo, Monaco, Consolas, "Courier New", monospace; - font-size: 12px; - color: #333333; - -webkit-border-radius: 3px; - -moz-border-radius: 3px; - border-radius: 3px; -} - -code { - padding: 2px 4px; - color: #d14; - background-color: #f7f7f9; - border: 1px solid #e1e1e8; -} - -pre { - display: block; - padding: 8.5px; - margin: 0 0 9px; - font-size: 12.025px; - line-height: 18px; - word-break: break-all; - word-wrap: break-word; - white-space: pre; - white-space: pre-wrap; - background-color: #f5f5f5; - border: 1px solid #ccc; - border: 1px solid rgba(0, 0, 0, 0.15); - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; -} - -pre.prettyprint { - margin-bottom: 18px; -} - -pre code { - padding: 0; - color: inherit; - background-color: transparent; - border: 0; -} - -.pre-scrollable { - max-height: 340px; - overflow-y: scroll; -} - -form { - margin: 0 0 18px; -} - -fieldset { - padding: 0; - margin: 0; - border: 0; -} - -legend { - display: block; - width: 100%; - padding: 0; - margin-bottom: 27px; - font-size: 19.5px; - line-height: 36px; - color: #333333; - border: 0; - border-bottom: 1px solid #e5e5e5; -} - -legend small { - font-size: 13.5px; - color: #999999; -} - -label, -input, -button, -select, -textarea { - font-size: 13px; - font-weight: normal; - line-height: 18px; -} - -input, -button, -select, -textarea { - font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; -} - -label { - display: block; - margin-bottom: 5px; -} - -select, -textarea, -input[type="text"], -input[type="password"], -input[type="datetime"], -input[type="datetime-local"], -input[type="date"], -input[type="month"], -input[type="time"], -input[type="week"], -input[type="number"], -input[type="email"], -input[type="url"], -input[type="search"], -input[type="tel"], -input[type="color"], -.uneditable-input { - display: inline-block; - height: 18px; - padding: 4px; - margin-bottom: 9px; - font-size: 13px; - line-height: 18px; - color: #555555; -} - -input, -textarea { - width: 210px; -} - -textarea { - height: auto; -} - -textarea, -input[type="text"], -input[type="password"], -input[type="datetime"], -input[type="datetime-local"], -input[type="date"], -input[type="month"], -input[type="time"], -input[type="week"], -input[type="number"], -input[type="email"], -input[type="url"], -input[type="search"], -input[type="tel"], -input[type="color"], -.uneditable-input { - background-color: #ffffff; - border: 1px solid #cccccc; - -webkit-border-radius: 3px; - -moz-border-radius: 3px; - border-radius: 3px; - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); - -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); - box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); - -webkit-transition: border linear 0.2s, box-shadow linear 0.2s; - -moz-transition: border linear 0.2s, box-shadow linear 0.2s; - -ms-transition: border linear 0.2s, box-shadow linear 0.2s; - -o-transition: border linear 0.2s, box-shadow linear 0.2s; - transition: border linear 0.2s, box-shadow linear 0.2s; -} - -textarea:focus, -input[type="text"]:focus, -input[type="password"]:focus, -input[type="datetime"]:focus, -input[type="datetime-local"]:focus, -input[type="date"]:focus, -input[type="month"]:focus, -input[type="time"]:focus, -input[type="week"]:focus, -input[type="number"]:focus, -input[type="email"]:focus, -input[type="url"]:focus, -input[type="search"]:focus, -input[type="tel"]:focus, -input[type="color"]:focus, -.uneditable-input:focus { - border-color: rgba(82, 168, 236, 0.8); - outline: 0; - outline: thin dotted \9; - /* IE6-9 */ - - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(82, 168, 236, 0.6); - -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(82, 168, 236, 0.6); - box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(82, 168, 236, 0.6); -} - -input[type="radio"], -input[type="checkbox"] { - margin: 3px 0; - *margin-top: 0; - /* IE7 */ - - line-height: normal; - cursor: pointer; -} - -input[type="submit"], -input[type="reset"], -input[type="button"], -input[type="radio"], -input[type="checkbox"] { - width: auto; -} - -.uneditable-textarea { - width: auto; - height: auto; -} - -select, -input[type="file"] { - height: 28px; - /* In IE7, the height of the select element cannot be changed by height, only font-size */ - - *margin-top: 4px; - /* For IE7, add top margin to align select with labels */ - - line-height: 28px; -} - -select { - width: 220px; - border: 1px solid #bbb; -} - -select[multiple], -select[size] { - height: auto; -} - -select:focus, -input[type="file"]:focus, -input[type="radio"]:focus, -input[type="checkbox"]:focus { - outline: thin dotted #333; - outline: 5px auto -webkit-focus-ring-color; - outline-offset: -2px; -} - -.radio, -.checkbox { - min-height: 18px; - padding-left: 18px; -} - -.radio input[type="radio"], -.checkbox input[type="checkbox"] { - float: left; - margin-left: -18px; -} - -.controls > .radio:first-child, -.controls > .checkbox:first-child { - padding-top: 5px; -} - -.radio.inline, -.checkbox.inline { - display: inline-block; - padding-top: 5px; - margin-bottom: 0; - vertical-align: middle; -} - -.radio.inline + .radio.inline, -.checkbox.inline + .checkbox.inline { - margin-left: 10px; -} - -.input-mini { - width: 60px; -} - -.input-small { - width: 90px; -} - -.input-medium { - width: 150px; -} - -.input-large { - width: 210px; -} - -.input-xlarge { - width: 270px; -} - -.input-xxlarge { - width: 530px; -} - -input[class*="span"], -select[class*="span"], -textarea[class*="span"], -.uneditable-input[class*="span"], -.row-fluid input[class*="span"], -.row-fluid select[class*="span"], -.row-fluid textarea[class*="span"], -.row-fluid .uneditable-input[class*="span"] { - float: none; - margin-left: 0; -} - -.input-append input[class*="span"], -.input-append .uneditable-input[class*="span"], -.input-prepend input[class*="span"], -.input-prepend .uneditable-input[class*="span"], -.row-fluid .input-prepend [class*="span"], -.row-fluid .input-append [class*="span"] { - display: inline-block; -} - -input, -textarea, -.uneditable-input { - margin-left: 0; -} - -input.span12, -textarea.span12, -.uneditable-input.span12 { - width: 930px; -} - -input.span11, -textarea.span11, -.uneditable-input.span11 { - width: 850px; -} - -input.span10, -textarea.span10, -.uneditable-input.span10 { - width: 770px; -} - -input.span9, -textarea.span9, -.uneditable-input.span9 { - width: 690px; -} - -input.span8, -textarea.span8, -.uneditable-input.span8 { - width: 610px; -} - -input.span7, -textarea.span7, -.uneditable-input.span7 { - width: 530px; -} - -input.span6, -textarea.span6, -.uneditable-input.span6 { - width: 450px; -} - -input.span5, -textarea.span5, -.uneditable-input.span5 { - width: 370px; -} - -input.span4, -textarea.span4, -.uneditable-input.span4 { - width: 290px; -} - -input.span3, -textarea.span3, -.uneditable-input.span3 { - width: 210px; -} - -input.span2, -textarea.span2, -.uneditable-input.span2 { - width: 130px; -} - -input.span1, -textarea.span1, -.uneditable-input.span1 { - width: 50px; -} - -input[disabled], -select[disabled], -textarea[disabled], -input[readonly], -select[readonly], -textarea[readonly] { - cursor: not-allowed; - background-color: #eeeeee; - border-color: #ddd; -} - -input[type="radio"][disabled], -input[type="checkbox"][disabled], -input[type="radio"][readonly], -input[type="checkbox"][readonly] { - background-color: transparent; -} - -.control-group.warning > label, -.control-group.warning .help-block, -.control-group.warning .help-inline { - color: #c09853; -} - -.control-group.warning .checkbox, -.control-group.warning .radio, -.control-group.warning input, -.control-group.warning select, -.control-group.warning textarea { - color: #c09853; - border-color: #c09853; -} - -.control-group.warning .checkbox:focus, -.control-group.warning .radio:focus, -.control-group.warning input:focus, -.control-group.warning select:focus, -.control-group.warning textarea:focus { - border-color: #a47e3c; - -webkit-box-shadow: 0 0 6px #dbc59e; - -moz-box-shadow: 0 0 6px #dbc59e; - box-shadow: 0 0 6px #dbc59e; -} - -.control-group.warning .input-prepend .add-on, -.control-group.warning .input-append .add-on { - color: #c09853; - background-color: #fcf8e3; - border-color: #c09853; -} - -.control-group.error > label, -.control-group.error .help-block, -.control-group.error .help-inline { - color: #b94a48; -} - -.control-group.error .checkbox, -.control-group.error .radio, -.control-group.error input, -.control-group.error select, -.control-group.error textarea { - color: #b94a48; - border-color: #b94a48; -} - -.control-group.error .checkbox:focus, -.control-group.error .radio:focus, -.control-group.error input:focus, -.control-group.error select:focus, -.control-group.error textarea:focus { - border-color: #953b39; - -webkit-box-shadow: 0 0 6px #d59392; - -moz-box-shadow: 0 0 6px #d59392; - box-shadow: 0 0 6px #d59392; -} - -.control-group.error .input-prepend .add-on, -.control-group.error .input-append .add-on { - color: #b94a48; - background-color: #f2dede; - border-color: #b94a48; -} - -.control-group.success > label, -.control-group.success .help-block, -.control-group.success .help-inline { - color: #468847; -} - -.control-group.success .checkbox, -.control-group.success .radio, -.control-group.success input, -.control-group.success select, -.control-group.success textarea { - color: #468847; - border-color: #468847; -} - -.control-group.success .checkbox:focus, -.control-group.success .radio:focus, -.control-group.success input:focus, -.control-group.success select:focus, -.control-group.success textarea:focus { - border-color: #356635; - -webkit-box-shadow: 0 0 6px #7aba7b; - -moz-box-shadow: 0 0 6px #7aba7b; - box-shadow: 0 0 6px #7aba7b; -} - -.control-group.success .input-prepend .add-on, -.control-group.success .input-append .add-on { - color: #468847; - background-color: #dff0d8; - border-color: #468847; -} - -input:focus:required:invalid, -textarea:focus:required:invalid, -select:focus:required:invalid { - color: #b94a48; - border-color: #ee5f5b; -} - -input:focus:required:invalid:focus, -textarea:focus:required:invalid:focus, -select:focus:required:invalid:focus { - border-color: #e9322d; - -webkit-box-shadow: 0 0 6px #f8b9b7; - -moz-box-shadow: 0 0 6px #f8b9b7; - box-shadow: 0 0 6px #f8b9b7; -} - -.form-actions { - padding: 17px 20px 18px; - margin-top: 18px; - margin-bottom: 18px; - background-color: #f5f5f5; - border-top: 1px solid #e5e5e5; - *zoom: 1; -} - -.form-actions:before, -.form-actions:after { - display: table; - content: ""; -} - -.form-actions:after { - clear: both; -} - -.uneditable-input { - overflow: hidden; - white-space: nowrap; - cursor: not-allowed; - background-color: #ffffff; - border-color: #eee; - -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.025); - -moz-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.025); - box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.025); -} - -:-moz-placeholder { - color: #999999; -} - -:-ms-input-placeholder { - color: #999999; -} - -::-webkit-input-placeholder { - color: #999999; -} - -.help-block, -.help-inline { - color: #555555; -} - -.help-block { - display: block; - margin-bottom: 9px; -} - -.help-inline { - display: inline-block; - *display: inline; - padding-left: 5px; - vertical-align: middle; - *zoom: 1; -} - -.input-prepend, -.input-append { - margin-bottom: 5px; -} - -.input-prepend input, -.input-append input, -.input-prepend select, -.input-append select, -.input-prepend .uneditable-input, -.input-append .uneditable-input { - position: relative; - margin-bottom: 0; - *margin-left: 0; - vertical-align: middle; - -webkit-border-radius: 0 3px 3px 0; - -moz-border-radius: 0 3px 3px 0; - border-radius: 0 3px 3px 0; -} - -.input-prepend input:focus, -.input-append input:focus, -.input-prepend select:focus, -.input-append select:focus, -.input-prepend .uneditable-input:focus, -.input-append .uneditable-input:focus { - z-index: 2; -} - -.input-prepend .uneditable-input, -.input-append .uneditable-input { - border-left-color: #ccc; -} - -.input-prepend .add-on, -.input-append .add-on { - display: inline-block; - width: auto; - height: 18px; - min-width: 16px; - padding: 4px 5px; - font-weight: normal; - line-height: 18px; - text-align: center; - text-shadow: 0 1px 0 #ffffff; - vertical-align: middle; - background-color: #eeeeee; - border: 1px solid #ccc; -} - -.input-prepend .add-on, -.input-append .add-on, -.input-prepend .btn, -.input-append .btn { - margin-left: -1px; - -webkit-border-radius: 0; - -moz-border-radius: 0; - border-radius: 0; -} - -.input-prepend .active, -.input-append .active { - background-color: #a9dba9; - border-color: #46a546; -} - -.input-prepend .add-on, -.input-prepend .btn { - margin-right: -1px; -} - -.input-prepend .add-on:first-child, -.input-prepend .btn:first-child { - -webkit-border-radius: 3px 0 0 3px; - -moz-border-radius: 3px 0 0 3px; - border-radius: 3px 0 0 3px; -} - -.input-append input, -.input-append select, -.input-append .uneditable-input { - -webkit-border-radius: 3px 0 0 3px; - -moz-border-radius: 3px 0 0 3px; - border-radius: 3px 0 0 3px; -} - -.input-append .uneditable-input { - border-right-color: #ccc; - border-left-color: #eee; -} - -.input-append .add-on:last-child, -.input-append .btn:last-child { - -webkit-border-radius: 0 3px 3px 0; - -moz-border-radius: 0 3px 3px 0; - border-radius: 0 3px 3px 0; -} - -.input-prepend.input-append input, -.input-prepend.input-append select, -.input-prepend.input-append .uneditable-input { - -webkit-border-radius: 0; - -moz-border-radius: 0; - border-radius: 0; -} - -.input-prepend.input-append .add-on:first-child, -.input-prepend.input-append .btn:first-child { - margin-right: -1px; - -webkit-border-radius: 3px 0 0 3px; - -moz-border-radius: 3px 0 0 3px; - border-radius: 3px 0 0 3px; -} - -.input-prepend.input-append .add-on:last-child, -.input-prepend.input-append .btn:last-child { - margin-left: -1px; - -webkit-border-radius: 0 3px 3px 0; - -moz-border-radius: 0 3px 3px 0; - border-radius: 0 3px 3px 0; -} - -.search-query { - padding-right: 14px; - padding-right: 4px \9; - padding-left: 14px; - padding-left: 4px \9; - /* IE7-8 doesn't have border-radius, so don't indent the padding */ - - margin-bottom: 0; - -webkit-border-radius: 14px; - -moz-border-radius: 14px; - border-radius: 14px; -} - -.form-search input, -.form-inline input, -.form-horizontal input, -.form-search textarea, -.form-inline textarea, -.form-horizontal textarea, -.form-search select, -.form-inline select, -.form-horizontal select, -.form-search .help-inline, -.form-inline .help-inline, -.form-horizontal .help-inline, -.form-search .uneditable-input, -.form-inline .uneditable-input, -.form-horizontal .uneditable-input, -.form-search .input-prepend, -.form-inline .input-prepend, -.form-horizontal .input-prepend, -.form-search .input-append, -.form-inline .input-append, -.form-horizontal .input-append { - display: inline-block; - *display: inline; - margin-bottom: 0; - *zoom: 1; -} - -.form-search .hide, -.form-inline .hide, -.form-horizontal .hide { - display: none; -} - -.form-search label, -.form-inline label { - display: inline-block; -} - -.form-search .input-append, -.form-inline .input-append, -.form-search .input-prepend, -.form-inline .input-prepend { - margin-bottom: 0; -} - -.form-search .radio, -.form-search .checkbox, -.form-inline .radio, -.form-inline .checkbox { - padding-left: 0; - margin-bottom: 0; - vertical-align: middle; -} - -.form-search .radio input[type="radio"], -.form-search .checkbox input[type="checkbox"], -.form-inline .radio input[type="radio"], -.form-inline .checkbox input[type="checkbox"] { - float: left; - margin-right: 3px; - margin-left: 0; -} - -.control-group { - margin-bottom: 9px; -} - -legend + .control-group { - margin-top: 18px; - -webkit-margin-top-collapse: separate; -} - -.form-horizontal .control-group { - margin-bottom: 18px; - *zoom: 1; -} - -.form-horizontal .control-group:before, -.form-horizontal .control-group:after { - display: table; - content: ""; -} - -.form-horizontal .control-group:after { - clear: both; -} - -.form-horizontal .control-label { - float: left; - width: 140px; - padding-top: 5px; - text-align: right; -} - -.form-horizontal .controls { - *display: inline-block; - *padding-left: 20px; - margin-left: 160px; - *margin-left: 0; -} - -.form-horizontal .controls:first-child { - *padding-left: 160px; -} - -.form-horizontal .help-block { - margin-top: 9px; - margin-bottom: 0; -} - -.form-horizontal .form-actions { - padding-left: 160px; -} - -table { - max-width: 100%; - background-color: transparent; - border-collapse: collapse; - border-spacing: 0; -} - -.table { - width: 100%; - margin-bottom: 18px; -} - -.table th, -.table td { - padding: 8px; - line-height: 18px; - text-align: left; - vertical-align: top; - border-top: 1px solid #dddddd; -} - -.table th { - font-weight: bold; -} - -.table thead th { - vertical-align: bottom; -} - -.table caption + thead tr:first-child th, -.table caption + thead tr:first-child td, -.table colgroup + thead tr:first-child th, -.table colgroup + thead tr:first-child td, -.table thead:first-child tr:first-child th, -.table thead:first-child tr:first-child td { - border-top: 0; -} - -.table tbody + tbody { - border-top: 2px solid #dddddd; -} - -.table-condensed th, -.table-condensed td { - padding: 4px 5px; -} - -.table-bordered { - border: 1px solid #dddddd; - border-collapse: separate; - *border-collapse: collapsed; - border-left: 0; - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; -} - -.table-bordered th, -.table-bordered td { - border-left: 1px solid #dddddd; -} - -.table-bordered caption + thead tr:first-child th, -.table-bordered caption + tbody tr:first-child th, -.table-bordered caption + tbody tr:first-child td, -.table-bordered colgroup + thead tr:first-child th, -.table-bordered colgroup + tbody tr:first-child th, -.table-bordered colgroup + tbody tr:first-child td, -.table-bordered thead:first-child tr:first-child th, -.table-bordered tbody:first-child tr:first-child th, -.table-bordered tbody:first-child tr:first-child td { - border-top: 0; -} - -.table-bordered thead:first-child tr:first-child th:first-child, -.table-bordered tbody:first-child tr:first-child td:first-child { - -webkit-border-top-left-radius: 4px; - border-top-left-radius: 4px; - -moz-border-radius-topleft: 4px; -} - -.table-bordered thead:first-child tr:first-child th:last-child, -.table-bordered tbody:first-child tr:first-child td:last-child { - -webkit-border-top-right-radius: 4px; - border-top-right-radius: 4px; - -moz-border-radius-topright: 4px; -} - -.table-bordered thead:last-child tr:last-child th:first-child, -.table-bordered tbody:last-child tr:last-child td:first-child { - -webkit-border-radius: 0 0 0 4px; - -moz-border-radius: 0 0 0 4px; - border-radius: 0 0 0 4px; - -webkit-border-bottom-left-radius: 4px; - border-bottom-left-radius: 4px; - -moz-border-radius-bottomleft: 4px; -} - -.table-bordered thead:last-child tr:last-child th:last-child, -.table-bordered tbody:last-child tr:last-child td:last-child { - -webkit-border-bottom-right-radius: 4px; - border-bottom-right-radius: 4px; - -moz-border-radius-bottomright: 4px; -} - -.table-striped tbody tr:nth-child(odd) td, -.table-striped tbody tr:nth-child(odd) th { - background-color: #f9f9f9; -} - -.table tbody tr:hover td, -.table tbody tr:hover th { - background-color: #f5f5f5; -} - -table .span1 { - float: none; - width: 44px; - margin-left: 0; -} - -table .span2 { - float: none; - width: 124px; - margin-left: 0; -} - -table .span3 { - float: none; - width: 204px; - margin-left: 0; -} - -table .span4 { - float: none; - width: 284px; - margin-left: 0; -} - -table .span5 { - float: none; - width: 364px; - margin-left: 0; -} - -table .span6 { - float: none; - width: 444px; - margin-left: 0; -} - -table .span7 { - float: none; - width: 524px; - margin-left: 0; -} - -table .span8 { - float: none; - width: 604px; - margin-left: 0; -} - -table .span9 { - float: none; - width: 684px; - margin-left: 0; -} - -table .span10 { - float: none; - width: 764px; - margin-left: 0; -} - -table .span11 { - float: none; - width: 844px; - margin-left: 0; -} - -table .span12 { - float: none; - width: 924px; - margin-left: 0; -} - -table .span13 { - float: none; - width: 1004px; - margin-left: 0; -} - -table .span14 { - float: none; - width: 1084px; - margin-left: 0; -} - -table .span15 { - float: none; - width: 1164px; - margin-left: 0; -} - -table .span16 { - float: none; - width: 1244px; - margin-left: 0; -} - -table .span17 { - float: none; - width: 1324px; - margin-left: 0; -} - -table .span18 { - float: none; - width: 1404px; - margin-left: 0; -} - -table .span19 { - float: none; - width: 1484px; - margin-left: 0; -} - -table .span20 { - float: none; - width: 1564px; - margin-left: 0; -} - -table .span21 { - float: none; - width: 1644px; - margin-left: 0; -} - -table .span22 { - float: none; - width: 1724px; - margin-left: 0; -} - -table .span23 { - float: none; - width: 1804px; - margin-left: 0; -} - -table .span24 { - float: none; - width: 1884px; - margin-left: 0; -} - -[class^="icon-"], -[class*=" icon-"] { - display: inline-block; - width: 14px; - height: 14px; - *margin-right: .3em; - line-height: 14px; - vertical-align: text-top; - background-image: url("../img/glyphicons-halflings.png"); - background-position: 14px 14px; - background-repeat: no-repeat; -} - -[class^="icon-"]:last-child, -[class*=" icon-"]:last-child { - *margin-left: 0; -} - -.icon-white { - background-image: url("../img/glyphicons-halflings-white.png"); -} - -.icon-glass { - background-position: 0 0; -} - -.icon-music { - background-position: -24px 0; -} - -.icon-search { - background-position: -48px 0; -} - -.icon-envelope { - background-position: -72px 0; -} - -.icon-heart { - background-position: -96px 0; -} - -.icon-star { - background-position: -120px 0; -} - -.icon-star-empty { - background-position: -144px 0; -} - -.icon-user { - background-position: -168px 0; -} - -.icon-film { - background-position: -192px 0; -} - -.icon-th-large { - background-position: -216px 0; -} - -.icon-th { - background-position: -240px 0; -} - -.icon-th-list { - background-position: -264px 0; -} - -.icon-ok { - background-position: -288px 0; -} - -.icon-remove { - background-position: -312px 0; -} - -.icon-zoom-in { - background-position: -336px 0; -} - -.icon-zoom-out { - background-position: -360px 0; -} - -.icon-off { - background-position: -384px 0; -} - -.icon-signal { - background-position: -408px 0; -} - -.icon-cog { - background-position: -432px 0; -} - -.icon-trash { - background-position: -456px 0; -} - -.icon-home { - background-position: 0 -24px; -} - -.icon-file { - background-position: -24px -24px; -} - -.icon-time { - background-position: -48px -24px; -} - -.icon-road { - background-position: -72px -24px; -} - -.icon-download-alt { - background-position: -96px -24px; -} - -.icon-download { - background-position: -120px -24px; -} - -.icon-upload { - background-position: -144px -24px; -} - -.icon-inbox { - background-position: -168px -24px; -} - -.icon-play-circle { - background-position: -192px -24px; -} - -.icon-repeat { - background-position: -216px -24px; -} - -.icon-refresh { - background-position: -240px -24px; -} - -.icon-list-alt { - background-position: -264px -24px; -} - -.icon-lock { - background-position: -287px -24px; -} - -.icon-flag { - background-position: -312px -24px; -} - -.icon-headphones { - background-position: -336px -24px; -} - -.icon-volume-off { - background-position: -360px -24px; -} - -.icon-volume-down { - background-position: -384px -24px; -} - -.icon-volume-up { - background-position: -408px -24px; -} - -.icon-qrcode { - background-position: -432px -24px; -} - -.icon-barcode { - background-position: -456px -24px; -} - -.icon-tag { - background-position: 0 -48px; -} - -.icon-tags { - background-position: -25px -48px; -} - -.icon-book { - background-position: -48px -48px; -} - -.icon-bookmark { - background-position: -72px -48px; -} - -.icon-print { - background-position: -96px -48px; -} - -.icon-camera { - background-position: -120px -48px; -} - -.icon-font { - background-position: -144px -48px; -} - -.icon-bold { - background-position: -167px -48px; -} - -.icon-italic { - background-position: -192px -48px; -} - -.icon-text-height { - background-position: -216px -48px; -} - -.icon-text-width { - background-position: -240px -48px; -} - -.icon-align-left { - background-position: -264px -48px; -} - -.icon-align-center { - background-position: -288px -48px; -} - -.icon-align-right { - background-position: -312px -48px; -} - -.icon-align-justify { - background-position: -336px -48px; -} - -.icon-list { - background-position: -360px -48px; -} - -.icon-indent-left { - background-position: -384px -48px; -} - -.icon-indent-right { - background-position: -408px -48px; -} - -.icon-facetime-video { - background-position: -432px -48px; -} - -.icon-picture { - background-position: -456px -48px; -} - -.icon-pencil { - background-position: 0 -72px; -} - -.icon-map-marker { - background-position: -24px -72px; -} - -.icon-adjust { - background-position: -48px -72px; -} - -.icon-tint { - background-position: -72px -72px; -} - -.icon-edit { - background-position: -96px -72px; -} - -.icon-share { - background-position: -120px -72px; -} - -.icon-check { - background-position: -144px -72px; -} - -.icon-move { - background-position: -168px -72px; -} - -.icon-step-backward { - background-position: -192px -72px; -} - -.icon-fast-backward { - background-position: -216px -72px; -} - -.icon-backward { - background-position: -240px -72px; -} - -.icon-play { - background-position: -264px -72px; -} - -.icon-pause { - background-position: -288px -72px; -} - -.icon-stop { - background-position: -312px -72px; -} - -.icon-forward { - background-position: -336px -72px; -} - -.icon-fast-forward { - background-position: -360px -72px; -} - -.icon-step-forward { - background-position: -384px -72px; -} - -.icon-eject { - background-position: -408px -72px; -} - -.icon-chevron-left { - background-position: -432px -72px; -} - -.icon-chevron-right { - background-position: -456px -72px; -} - -.icon-plus-sign { - background-position: 0 -96px; -} - -.icon-minus-sign { - background-position: -24px -96px; -} - -.icon-remove-sign { - background-position: -48px -96px; -} - -.icon-ok-sign { - background-position: -72px -96px; -} - -.icon-question-sign { - background-position: -96px -96px; -} - -.icon-info-sign { - background-position: -120px -96px; -} - -.icon-screenshot { - background-position: -144px -96px; -} - -.icon-remove-circle { - background-position: -168px -96px; -} - -.icon-ok-circle { - background-position: -192px -96px; -} - -.icon-ban-circle { - background-position: -216px -96px; -} - -.icon-arrow-left { - background-position: -240px -96px; -} - -.icon-arrow-right { - background-position: -264px -96px; -} - -.icon-arrow-up { - background-position: -289px -96px; -} - -.icon-arrow-down { - background-position: -312px -96px; -} - -.icon-share-alt { - background-position: -336px -96px; -} - -.icon-resize-full { - background-position: -360px -96px; -} - -.icon-resize-small { - background-position: -384px -96px; -} - -.icon-plus { - background-position: -408px -96px; -} - -.icon-minus { - background-position: -433px -96px; -} - -.icon-asterisk { - background-position: -456px -96px; -} - -.icon-exclamation-sign { - background-position: 0 -120px; -} - -.icon-gift { - background-position: -24px -120px; -} - -.icon-leaf { - background-position: -48px -120px; -} - -.icon-fire { - background-position: -72px -120px; -} - -.icon-eye-open { - background-position: -96px -120px; -} - -.icon-eye-close { - background-position: -120px -120px; -} - -.icon-warning-sign { - background-position: -144px -120px; -} - -.icon-plane { - background-position: -168px -120px; -} - -.icon-calendar { - background-position: -192px -120px; -} - -.icon-random { - background-position: -216px -120px; -} - -.icon-comment { - background-position: -240px -120px; -} - -.icon-magnet { - background-position: -264px -120px; -} - -.icon-chevron-up { - background-position: -288px -120px; -} - -.icon-chevron-down { - background-position: -313px -119px; -} - -.icon-retweet { - background-position: -336px -120px; -} - -.icon-shopping-cart { - background-position: -360px -120px; -} - -.icon-folder-close { - background-position: -384px -120px; -} - -.icon-folder-open { - background-position: -408px -120px; -} - -.icon-resize-vertical { - background-position: -432px -119px; -} - -.icon-resize-horizontal { - background-position: -456px -118px; -} - -.icon-hdd { - background-position: 0 -144px; -} - -.icon-bullhorn { - background-position: -24px -144px; -} - -.icon-bell { - background-position: -48px -144px; -} - -.icon-certificate { - background-position: -72px -144px; -} - -.icon-thumbs-up { - background-position: -96px -144px; -} - -.icon-thumbs-down { - background-position: -120px -144px; -} - -.icon-hand-right { - background-position: -144px -144px; -} - -.icon-hand-left { - background-position: -168px -144px; -} - -.icon-hand-up { - background-position: -192px -144px; -} - -.icon-hand-down { - background-position: -216px -144px; -} - -.icon-circle-arrow-right { - background-position: -240px -144px; -} - -.icon-circle-arrow-left { - background-position: -264px -144px; -} - -.icon-circle-arrow-up { - background-position: -288px -144px; -} - -.icon-circle-arrow-down { - background-position: -312px -144px; -} - -.icon-globe { - background-position: -336px -144px; -} - -.icon-wrench { - background-position: -360px -144px; -} - -.icon-tasks { - background-position: -384px -144px; -} - -.icon-filter { - background-position: -408px -144px; -} - -.icon-briefcase { - background-position: -432px -144px; -} - -.icon-fullscreen { - background-position: -456px -144px; -} - -.dropup, -.dropdown { - position: relative; -} - -.dropdown-toggle { - *margin-bottom: -3px; -} - -.dropdown-toggle:active, -.open .dropdown-toggle { - outline: 0; -} - -.caret { - display: inline-block; - width: 0; - height: 0; - vertical-align: top; - border-top: 4px solid #000000; - border-right: 4px solid transparent; - border-left: 4px solid transparent; - content: ""; - opacity: 0.3; - filter: alpha(opacity=30); -} - -.dropdown .caret { - margin-top: 8px; - margin-left: 2px; -} - -.dropdown:hover .caret, -.open .caret { - opacity: 1; - filter: alpha(opacity=100); -} - -.dropdown-menu { - position: absolute; - top: 100%; - left: 0; - z-index: 1000; - display: none; - float: left; - min-width: 160px; - padding: 4px 0; - margin: 1px 0 0; - list-style: none; - background-color: #ffffff; - border: 1px solid #ccc; - border: 1px solid rgba(0, 0, 0, 0.2); - *border-right-width: 2px; - *border-bottom-width: 2px; - -webkit-border-radius: 5px; - -moz-border-radius: 5px; - border-radius: 5px; - -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); - -moz-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); - box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); - -webkit-background-clip: padding-box; - -moz-background-clip: padding; - background-clip: padding-box; -} - -.dropdown-menu.pull-right { - right: 0; - left: auto; -} - -.dropdown-menu .divider { - *width: 100%; - height: 1px; - margin: 8px 1px; - *margin: -5px 0 5px; - overflow: hidden; - background-color: #e5e5e5; - border-bottom: 1px solid #ffffff; -} - -.dropdown-menu a { - display: block; - padding: 3px 15px; - clear: both; - font-weight: normal; - line-height: 18px; - color: #333333; - white-space: nowrap; -} - -.dropdown-menu li > a:hover, -.dropdown-menu .active > a, -.dropdown-menu .active > a:hover { - color: #ffffff; - text-decoration: none; - background-color: #0088cc; -} - -.open { - *z-index: 1000; -} - -.open > .dropdown-menu { - display: block; -} - -.pull-right > .dropdown-menu { - right: 0; - left: auto; -} - -.dropup .caret, -.navbar-fixed-bottom .dropdown .caret { - border-top: 0; - border-bottom: 4px solid #000000; - content: "\2191"; -} - -.dropup .dropdown-menu, -.navbar-fixed-bottom .dropdown .dropdown-menu { - top: auto; - bottom: 100%; - margin-bottom: 1px; -} - -.typeahead { - margin-top: 2px; - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; -} - -.well { - min-height: 20px; - padding: 19px; - margin-bottom: 20px; - background-color: #f5f5f5; - border: 1px solid #eee; - border: 1px solid rgba(0, 0, 0, 0.05); - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05); - -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05); - box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05); -} - -.well blockquote { - border-color: #ddd; - border-color: rgba(0, 0, 0, 0.15); -} - -.well-large { - padding: 24px; - -webkit-border-radius: 6px; - -moz-border-radius: 6px; - border-radius: 6px; -} - -.well-small { - padding: 9px; - -webkit-border-radius: 3px; - -moz-border-radius: 3px; - border-radius: 3px; -} - -.fade { - opacity: 0; - -webkit-transition: opacity 0.15s linear; - -moz-transition: opacity 0.15s linear; - -ms-transition: opacity 0.15s linear; - -o-transition: opacity 0.15s linear; - transition: opacity 0.15s linear; -} - -.fade.in { - opacity: 1; -} - -.collapse { - position: relative; - height: 0; - overflow: hidden; - -webkit-transition: height 0.35s ease; - -moz-transition: height 0.35s ease; - -ms-transition: height 0.35s ease; - -o-transition: height 0.35s ease; - transition: height 0.35s ease; -} - -.collapse.in { - height: auto; -} - -.close { - float: right; - font-size: 20px; - font-weight: bold; - line-height: 18px; - color: #000000; - text-shadow: 0 1px 0 #ffffff; - opacity: 0.2; - filter: alpha(opacity=20); -} - -.close:hover { - color: #000000; - text-decoration: none; - cursor: pointer; - opacity: 0.4; - filter: alpha(opacity=40); -} - -button.close { - padding: 0; - cursor: pointer; - background: transparent; - border: 0; - -webkit-appearance: none; -} - -.btn { - display: inline-block; - *display: inline; - padding: 4px 10px 4px; - margin-bottom: 0; - *margin-left: .3em; - font-size: 13px; - line-height: 18px; - *line-height: 20px; - color: #333333; - text-align: center; - text-shadow: 0 1px 1px rgba(255, 255, 255, 0.75); - vertical-align: middle; - cursor: pointer; - background-color: #f5f5f5; - *background-color: #e6e6e6; - background-image: -ms-linear-gradient(top, #ffffff, #e6e6e6); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), to(#e6e6e6)); - background-image: -webkit-linear-gradient(top, #ffffff, #e6e6e6); - background-image: -o-linear-gradient(top, #ffffff, #e6e6e6); - background-image: linear-gradient(top, #ffffff, #e6e6e6); - background-image: -moz-linear-gradient(top, #ffffff, #e6e6e6); - background-repeat: repeat-x; - border: 1px solid #cccccc; - *border: 0; - border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); - border-color: #e6e6e6 #e6e6e6 #bfbfbf; - border-bottom-color: #b3b3b3; - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; - filter: progid:dximagetransform.microsoft.gradient(startColorstr='#ffffff', endColorstr='#e6e6e6', GradientType=0); - filter: progid:dximagetransform.microsoft.gradient(enabled=false); - *zoom: 1; - -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); - -moz-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); - box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); -} - -.btn:hover, -.btn:active, -.btn.active, -.btn.disabled, -.btn[disabled] { - background-color: #e6e6e6; - *background-color: #d9d9d9; -} - -.btn:active, -.btn.active { - background-color: #cccccc \9; -} - -.btn:first-child { - *margin-left: 0; -} - -.btn:hover { - color: #333333; - text-decoration: none; - background-color: #e6e6e6; - *background-color: #d9d9d9; - /* Buttons in IE7 don't get borders, so darken on hover */ - - background-position: 0 -15px; - -webkit-transition: background-position 0.1s linear; - -moz-transition: background-position 0.1s linear; - -ms-transition: background-position 0.1s linear; - -o-transition: background-position 0.1s linear; - transition: background-position 0.1s linear; -} - -.btn:focus { - outline: thin dotted #333; - outline: 5px auto -webkit-focus-ring-color; - outline-offset: -2px; -} - -.btn.active, -.btn:active { - background-color: #e6e6e6; - background-color: #d9d9d9 \9; - background-image: none; - outline: 0; - -webkit-box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05); - -moz-box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05); - box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05); -} - -.btn.disabled, -.btn[disabled] { - cursor: default; - background-color: #e6e6e6; - background-image: none; - opacity: 0.65; - filter: alpha(opacity=65); - -webkit-box-shadow: none; - -moz-box-shadow: none; - box-shadow: none; -} - -.btn-large { - padding: 9px 14px; - font-size: 15px; - line-height: normal; - -webkit-border-radius: 5px; - -moz-border-radius: 5px; - border-radius: 5px; -} - -.btn-large [class^="icon-"] { - margin-top: 1px; -} - -.btn-small { - padding: 5px 9px; - font-size: 11px; - line-height: 16px; -} - -.btn-small [class^="icon-"] { - margin-top: -1px; -} - -.btn-mini { - padding: 2px 6px; - font-size: 11px; - line-height: 14px; -} - -.btn-primary, -.btn-primary:hover, -.btn-warning, -.btn-warning:hover, -.btn-danger, -.btn-danger:hover, -.btn-success, -.btn-success:hover, -.btn-info, -.btn-info:hover, -.btn-inverse, -.btn-inverse:hover { - color: #ffffff; - text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); -} - -.btn-primary.active, -.btn-warning.active, -.btn-danger.active, -.btn-success.active, -.btn-info.active, -.btn-inverse.active { - color: rgba(255, 255, 255, 0.75); -} - -.btn { - border-color: #ccc; - border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); -} - -.btn-primary { - background-color: #0074cc; - *background-color: #0055cc; - background-image: -ms-linear-gradient(top, #0088cc, #0055cc); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#0088cc), to(#0055cc)); - background-image: -webkit-linear-gradient(top, #0088cc, #0055cc); - background-image: -o-linear-gradient(top, #0088cc, #0055cc); - background-image: -moz-linear-gradient(top, #0088cc, #0055cc); - background-image: linear-gradient(top, #0088cc, #0055cc); - background-repeat: repeat-x; - border-color: #0055cc #0055cc #003580; - border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); - filter: progid:dximagetransform.microsoft.gradient(startColorstr='#0088cc', endColorstr='#0055cc', GradientType=0); - filter: progid:dximagetransform.microsoft.gradient(enabled=false); -} - -.btn-primary:hover, -.btn-primary:active, -.btn-primary.active, -.btn-primary.disabled, -.btn-primary[disabled] { - background-color: #0055cc; - *background-color: #004ab3; -} - -.btn-primary:active, -.btn-primary.active { - background-color: #004099 \9; -} - -.btn-warning { - background-color: #faa732; - *background-color: #f89406; - background-image: -ms-linear-gradient(top, #fbb450, #f89406); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#fbb450), to(#f89406)); - background-image: -webkit-linear-gradient(top, #fbb450, #f89406); - background-image: -o-linear-gradient(top, #fbb450, #f89406); - background-image: -moz-linear-gradient(top, #fbb450, #f89406); - background-image: linear-gradient(top, #fbb450, #f89406); - background-repeat: repeat-x; - border-color: #f89406 #f89406 #ad6704; - border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); - filter: progid:dximagetransform.microsoft.gradient(startColorstr='#fbb450', endColorstr='#f89406', GradientType=0); - filter: progid:dximagetransform.microsoft.gradient(enabled=false); -} - -.btn-warning:hover, -.btn-warning:active, -.btn-warning.active, -.btn-warning.disabled, -.btn-warning[disabled] { - background-color: #f89406; - *background-color: #df8505; -} - -.btn-warning:active, -.btn-warning.active { - background-color: #c67605 \9; -} - -.btn-danger { - background-color: #da4f49; - *background-color: #bd362f; - background-image: -ms-linear-gradient(top, #ee5f5b, #bd362f); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ee5f5b), to(#bd362f)); - background-image: -webkit-linear-gradient(top, #ee5f5b, #bd362f); - background-image: -o-linear-gradient(top, #ee5f5b, #bd362f); - background-image: -moz-linear-gradient(top, #ee5f5b, #bd362f); - background-image: linear-gradient(top, #ee5f5b, #bd362f); - background-repeat: repeat-x; - border-color: #bd362f #bd362f #802420; - border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); - filter: progid:dximagetransform.microsoft.gradient(startColorstr='#ee5f5b', endColorstr='#bd362f', GradientType=0); - filter: progid:dximagetransform.microsoft.gradient(enabled=false); -} - -.btn-danger:hover, -.btn-danger:active, -.btn-danger.active, -.btn-danger.disabled, -.btn-danger[disabled] { - background-color: #bd362f; - *background-color: #a9302a; -} - -.btn-danger:active, -.btn-danger.active { - background-color: #942a25 \9; -} - -.btn-success { - background-color: #5bb75b; - *background-color: #51a351; - background-image: -ms-linear-gradient(top, #62c462, #51a351); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#62c462), to(#51a351)); - background-image: -webkit-linear-gradient(top, #62c462, #51a351); - background-image: -o-linear-gradient(top, #62c462, #51a351); - background-image: -moz-linear-gradient(top, #62c462, #51a351); - background-image: linear-gradient(top, #62c462, #51a351); - background-repeat: repeat-x; - border-color: #51a351 #51a351 #387038; - border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); - filter: progid:dximagetransform.microsoft.gradient(startColorstr='#62c462', endColorstr='#51a351', GradientType=0); - filter: progid:dximagetransform.microsoft.gradient(enabled=false); -} - -.btn-success:hover, -.btn-success:active, -.btn-success.active, -.btn-success.disabled, -.btn-success[disabled] { - background-color: #51a351; - *background-color: #499249; -} - -.btn-success:active, -.btn-success.active { - background-color: #408140 \9; -} - -.btn-info { - background-color: #49afcd; - *background-color: #2f96b4; - background-image: -ms-linear-gradient(top, #5bc0de, #2f96b4); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#5bc0de), to(#2f96b4)); - background-image: -webkit-linear-gradient(top, #5bc0de, #2f96b4); - background-image: -o-linear-gradient(top, #5bc0de, #2f96b4); - background-image: -moz-linear-gradient(top, #5bc0de, #2f96b4); - background-image: linear-gradient(top, #5bc0de, #2f96b4); - background-repeat: repeat-x; - border-color: #2f96b4 #2f96b4 #1f6377; - border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); - filter: progid:dximagetransform.microsoft.gradient(startColorstr='#5bc0de', endColorstr='#2f96b4', GradientType=0); - filter: progid:dximagetransform.microsoft.gradient(enabled=false); -} - -.btn-info:hover, -.btn-info:active, -.btn-info.active, -.btn-info.disabled, -.btn-info[disabled] { - background-color: #2f96b4; - *background-color: #2a85a0; -} - -.btn-info:active, -.btn-info.active { - background-color: #24748c \9; -} - -.btn-inverse { - background-color: #414141; - *background-color: #222222; - background-image: -ms-linear-gradient(top, #555555, #222222); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#555555), to(#222222)); - background-image: -webkit-linear-gradient(top, #555555, #222222); - background-image: -o-linear-gradient(top, #555555, #222222); - background-image: -moz-linear-gradient(top, #555555, #222222); - background-image: linear-gradient(top, #555555, #222222); - background-repeat: repeat-x; - border-color: #222222 #222222 #000000; - border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); - filter: progid:dximagetransform.microsoft.gradient(startColorstr='#555555', endColorstr='#222222', GradientType=0); - filter: progid:dximagetransform.microsoft.gradient(enabled=false); -} - -.btn-inverse:hover, -.btn-inverse:active, -.btn-inverse.active, -.btn-inverse.disabled, -.btn-inverse[disabled] { - background-color: #222222; - *background-color: #151515; -} - -.btn-inverse:active, -.btn-inverse.active { - background-color: #080808 \9; -} - -button.btn, -input[type="submit"].btn { - *padding-top: 2px; - *padding-bottom: 2px; -} - -button.btn::-moz-focus-inner, -input[type="submit"].btn::-moz-focus-inner { - padding: 0; - border: 0; -} - -button.btn.btn-large, -input[type="submit"].btn.btn-large { - *padding-top: 7px; - *padding-bottom: 7px; -} - -button.btn.btn-small, -input[type="submit"].btn.btn-small { - *padding-top: 3px; - *padding-bottom: 3px; -} - -button.btn.btn-mini, -input[type="submit"].btn.btn-mini { - *padding-top: 1px; - *padding-bottom: 1px; -} - -.btn-group { - position: relative; - *margin-left: .3em; - *zoom: 1; -} - -.btn-group:before, -.btn-group:after { - display: table; - content: ""; -} - -.btn-group:after { - clear: both; -} - -.btn-group:first-child { - *margin-left: 0; -} - -.btn-group + .btn-group { - margin-left: 5px; -} - -.btn-toolbar { - margin-top: 9px; - margin-bottom: 9px; -} - -.btn-toolbar .btn-group { - display: inline-block; - *display: inline; - /* IE7 inline-block hack */ - - *zoom: 1; -} - -.btn-group > .btn { - position: relative; - float: left; - margin-left: -1px; - -webkit-border-radius: 0; - -moz-border-radius: 0; - border-radius: 0; -} - -.btn-group > .btn:first-child { - margin-left: 0; - -webkit-border-bottom-left-radius: 4px; - border-bottom-left-radius: 4px; - -webkit-border-top-left-radius: 4px; - border-top-left-radius: 4px; - -moz-border-radius-bottomleft: 4px; - -moz-border-radius-topleft: 4px; -} - -.btn-group > .btn:last-child, -.btn-group > .dropdown-toggle { - -webkit-border-top-right-radius: 4px; - border-top-right-radius: 4px; - -webkit-border-bottom-right-radius: 4px; - border-bottom-right-radius: 4px; - -moz-border-radius-topright: 4px; - -moz-border-radius-bottomright: 4px; -} - -.btn-group > .btn.large:first-child { - margin-left: 0; - -webkit-border-bottom-left-radius: 6px; - border-bottom-left-radius: 6px; - -webkit-border-top-left-radius: 6px; - border-top-left-radius: 6px; - -moz-border-radius-bottomleft: 6px; - -moz-border-radius-topleft: 6px; -} - -.btn-group > .btn.large:last-child, -.btn-group > .large.dropdown-toggle { - -webkit-border-top-right-radius: 6px; - border-top-right-radius: 6px; - -webkit-border-bottom-right-radius: 6px; - border-bottom-right-radius: 6px; - -moz-border-radius-topright: 6px; - -moz-border-radius-bottomright: 6px; -} - -.btn-group > .btn:hover, -.btn-group > .btn:focus, -.btn-group > .btn:active, -.btn-group > .btn.active { - z-index: 2; -} - -.btn-group .dropdown-toggle:active, -.btn-group.open .dropdown-toggle { - outline: 0; -} - -.btn-group > .dropdown-toggle { - *padding-top: 4px; - padding-right: 8px; - *padding-bottom: 4px; - padding-left: 8px; - -webkit-box-shadow: inset 1px 0 0 rgba(255, 255, 255, 0.125), inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); - -moz-box-shadow: inset 1px 0 0 rgba(255, 255, 255, 0.125), inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); - box-shadow: inset 1px 0 0 rgba(255, 255, 255, 0.125), inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); -} - -.btn-group > .btn-mini.dropdown-toggle { - padding-right: 5px; - padding-left: 5px; -} - -.btn-group > .btn-small.dropdown-toggle { - *padding-top: 4px; - *padding-bottom: 4px; -} - -.btn-group > .btn-large.dropdown-toggle { - padding-right: 12px; - padding-left: 12px; -} - -.btn-group.open .dropdown-toggle { - background-image: none; - -webkit-box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05); - -moz-box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05); - box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05); -} - -.btn-group.open .btn.dropdown-toggle { - background-color: #e6e6e6; -} - -.btn-group.open .btn-primary.dropdown-toggle { - background-color: #0055cc; -} - -.btn-group.open .btn-warning.dropdown-toggle { - background-color: #f89406; -} - -.btn-group.open .btn-danger.dropdown-toggle { - background-color: #bd362f; -} - -.btn-group.open .btn-success.dropdown-toggle { - background-color: #51a351; -} - -.btn-group.open .btn-info.dropdown-toggle { - background-color: #2f96b4; -} - -.btn-group.open .btn-inverse.dropdown-toggle { - background-color: #222222; -} - -.btn .caret { - margin-top: 7px; - margin-left: 0; -} - -.btn:hover .caret, -.open.btn-group .caret { - opacity: 1; - filter: alpha(opacity=100); -} - -.btn-mini .caret { - margin-top: 5px; -} - -.btn-small .caret { - margin-top: 6px; -} - -.btn-large .caret { - margin-top: 6px; - border-top-width: 5px; - border-right-width: 5px; - border-left-width: 5px; -} - -.dropup .btn-large .caret { - border-top: 0; - border-bottom: 5px solid #000000; -} - -.btn-primary .caret, -.btn-warning .caret, -.btn-danger .caret, -.btn-info .caret, -.btn-success .caret, -.btn-inverse .caret { - border-top-color: #ffffff; - border-bottom-color: #ffffff; - opacity: 0.75; - filter: alpha(opacity=75); -} - -.alert { - padding: 8px 35px 8px 14px; - margin-bottom: 18px; - color: #c09853; - text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5); - background-color: #fcf8e3; - border: 1px solid #fbeed5; - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; -} - -.alert-heading { - color: inherit; -} - -.alert .close { - position: relative; - top: -2px; - right: -21px; - line-height: 18px; -} - -.alert-success { - color: #468847; - background-color: #dff0d8; - border-color: #d6e9c6; -} - -.alert-danger, -.alert-error { - color: #b94a48; - background-color: #f2dede; - border-color: #eed3d7; -} - -.alert-info { - color: #3a87ad; - background-color: #d9edf7; - border-color: #bce8f1; -} - -.alert-block { - padding-top: 14px; - padding-bottom: 14px; -} - -.alert-block > p, -.alert-block > ul { - margin-bottom: 0; -} - -.alert-block p + p { - margin-top: 5px; -} - -.nav { - margin-bottom: 18px; - margin-left: 0; - list-style: none; -} - -.nav > li > a { - display: block; -} - -.nav > li > a:hover { - text-decoration: none; - background-color: #eeeeee; -} - -.nav > .pull-right { - float: right; -} - -.nav .nav-header { - display: block; - padding: 3px 15px; - font-size: 11px; - font-weight: bold; - line-height: 18px; - color: #999999; - text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5); - text-transform: uppercase; -} - -.nav li + .nav-header { - margin-top: 9px; -} - -.nav-list { - padding-right: 15px; - padding-left: 15px; - margin-bottom: 0; -} - -.nav-list > li > a, -.nav-list .nav-header { - margin-right: -15px; - margin-left: -15px; - text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5); -} - -.nav-list > li > a { - padding: 3px 15px; -} - -.nav-list > .active > a, -.nav-list > .active > a:hover { - color: #ffffff; - text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.2); - background-color: #0088cc; -} - -.nav-list [class^="icon-"] { - margin-right: 2px; -} - -.nav-list .divider { - *width: 100%; - height: 1px; - margin: 8px 1px; - *margin: -5px 0 5px; - overflow: hidden; - background-color: #e5e5e5; - border-bottom: 1px solid #ffffff; -} - -.nav-tabs, -.nav-pills { - *zoom: 1; -} - -.nav-tabs:before, -.nav-pills:before, -.nav-tabs:after, -.nav-pills:after { - display: table; - content: ""; -} - -.nav-tabs:after, -.nav-pills:after { - clear: both; -} - -.nav-tabs > li, -.nav-pills > li { - float: left; -} - -.nav-tabs > li > a, -.nav-pills > li > a { - padding-right: 12px; - padding-left: 12px; - margin-right: 2px; - line-height: 14px; -} - -.nav-tabs { - border-bottom: 1px solid #ddd; -} - -.nav-tabs > li { - margin-bottom: -1px; -} - -.nav-tabs > li > a { - padding-top: 8px; - padding-bottom: 8px; - line-height: 18px; - border: 1px solid transparent; - -webkit-border-radius: 4px 4px 0 0; - -moz-border-radius: 4px 4px 0 0; - border-radius: 4px 4px 0 0; -} - -.nav-tabs > li > a:hover { - border-color: #eeeeee #eeeeee #dddddd; -} - -.nav-tabs > .active > a, -.nav-tabs > .active > a:hover { - color: #555555; - cursor: default; - background-color: #ffffff; - border: 1px solid #ddd; - border-bottom-color: transparent; -} - -.nav-pills > li > a { - padding-top: 8px; - padding-bottom: 8px; - margin-top: 2px; - margin-bottom: 2px; - -webkit-border-radius: 5px; - -moz-border-radius: 5px; - border-radius: 5px; -} - -.nav-pills > .active > a, -.nav-pills > .active > a:hover { - color: #ffffff; - background-color: #0088cc; -} - -.nav-stacked > li { - float: none; -} - -.nav-stacked > li > a { - margin-right: 0; -} - -.nav-tabs.nav-stacked { - border-bottom: 0; -} - -.nav-tabs.nav-stacked > li > a { - border: 1px solid #ddd; - -webkit-border-radius: 0; - -moz-border-radius: 0; - border-radius: 0; -} - -.nav-tabs.nav-stacked > li:first-child > a { - -webkit-border-radius: 4px 4px 0 0; - -moz-border-radius: 4px 4px 0 0; - border-radius: 4px 4px 0 0; -} - -.nav-tabs.nav-stacked > li:last-child > a { - -webkit-border-radius: 0 0 4px 4px; - -moz-border-radius: 0 0 4px 4px; - border-radius: 0 0 4px 4px; -} - -.nav-tabs.nav-stacked > li > a:hover { - z-index: 2; - border-color: #ddd; -} - -.nav-pills.nav-stacked > li > a { - margin-bottom: 3px; -} - -.nav-pills.nav-stacked > li:last-child > a { - margin-bottom: 1px; -} - -.nav-tabs .dropdown-menu { - -webkit-border-radius: 0 0 5px 5px; - -moz-border-radius: 0 0 5px 5px; - border-radius: 0 0 5px 5px; -} - -.nav-pills .dropdown-menu { - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; -} - -.nav-tabs .dropdown-toggle .caret, -.nav-pills .dropdown-toggle .caret { - margin-top: 6px; - border-top-color: #0088cc; - border-bottom-color: #0088cc; -} - -.nav-tabs .dropdown-toggle:hover .caret, -.nav-pills .dropdown-toggle:hover .caret { - border-top-color: #005580; - border-bottom-color: #005580; -} - -.nav-tabs .active .dropdown-toggle .caret, -.nav-pills .active .dropdown-toggle .caret { - border-top-color: #333333; - border-bottom-color: #333333; -} - -.nav > .dropdown.active > a:hover { - color: #000000; - cursor: pointer; -} - -.nav-tabs .open .dropdown-toggle, -.nav-pills .open .dropdown-toggle, -.nav > li.dropdown.open.active > a:hover { - color: #ffffff; - background-color: #999999; - border-color: #999999; -} - -.nav li.dropdown.open .caret, -.nav li.dropdown.open.active .caret, -.nav li.dropdown.open a:hover .caret { - border-top-color: #ffffff; - border-bottom-color: #ffffff; - opacity: 1; - filter: alpha(opacity=100); -} - -.tabs-stacked .open > a:hover { - border-color: #999999; -} - -.tabbable { - *zoom: 1; -} - -.tabbable:before, -.tabbable:after { - display: table; - content: ""; -} - -.tabbable:after { - clear: both; -} - -.tab-content { - overflow: auto; -} - -.tabs-below > .nav-tabs, -.tabs-right > .nav-tabs, -.tabs-left > .nav-tabs { - border-bottom: 0; -} - -.tab-content > .tab-pane, -.pill-content > .pill-pane { - display: none; -} - -.tab-content > .active, -.pill-content > .active { - display: block; -} - -.tabs-below > .nav-tabs { - border-top: 1px solid #ddd; -} - -.tabs-below > .nav-tabs > li { - margin-top: -1px; - margin-bottom: 0; -} - -.tabs-below > .nav-tabs > li > a { - -webkit-border-radius: 0 0 4px 4px; - -moz-border-radius: 0 0 4px 4px; - border-radius: 0 0 4px 4px; -} - -.tabs-below > .nav-tabs > li > a:hover { - border-top-color: #ddd; - border-bottom-color: transparent; -} - -.tabs-below > .nav-tabs > .active > a, -.tabs-below > .nav-tabs > .active > a:hover { - border-color: transparent #ddd #ddd #ddd; -} - -.tabs-left > .nav-tabs > li, -.tabs-right > .nav-tabs > li { - float: none; -} - -.tabs-left > .nav-tabs > li > a, -.tabs-right > .nav-tabs > li > a { - min-width: 74px; - margin-right: 0; - margin-bottom: 3px; -} - -.tabs-left > .nav-tabs { - float: left; - margin-right: 19px; - border-right: 1px solid #ddd; -} - -.tabs-left > .nav-tabs > li > a { - margin-right: -1px; - -webkit-border-radius: 4px 0 0 4px; - -moz-border-radius: 4px 0 0 4px; - border-radius: 4px 0 0 4px; -} - -.tabs-left > .nav-tabs > li > a:hover { - border-color: #eeeeee #dddddd #eeeeee #eeeeee; -} - -.tabs-left > .nav-tabs .active > a, -.tabs-left > .nav-tabs .active > a:hover { - border-color: #ddd transparent #ddd #ddd; - *border-right-color: #ffffff; -} - -.tabs-right > .nav-tabs { - float: right; - margin-left: 19px; - border-left: 1px solid #ddd; -} - -.tabs-right > .nav-tabs > li > a { - margin-left: -1px; - -webkit-border-radius: 0 4px 4px 0; - -moz-border-radius: 0 4px 4px 0; - border-radius: 0 4px 4px 0; -} - -.tabs-right > .nav-tabs > li > a:hover { - border-color: #eeeeee #eeeeee #eeeeee #dddddd; -} - -.tabs-right > .nav-tabs .active > a, -.tabs-right > .nav-tabs .active > a:hover { - border-color: #ddd #ddd #ddd transparent; - *border-left-color: #ffffff; -} - -.navbar { - *position: relative; - *z-index: 2; - margin-bottom: 18px; - overflow: visible; -} - -.navbar-inner { - min-height: 40px; - padding-right: 20px; - padding-left: 20px; - background-color: #2c2c2c; - background-image: -moz-linear-gradient(top, #333333, #222222); - background-image: -ms-linear-gradient(top, #333333, #222222); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#333333), to(#222222)); - background-image: -webkit-linear-gradient(top, #333333, #222222); - background-image: -o-linear-gradient(top, #333333, #222222); - background-image: linear-gradient(top, #333333, #222222); - background-repeat: repeat-x; - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; - filter: progid:dximagetransform.microsoft.gradient(startColorstr='#333333', endColorstr='#222222', GradientType=0); - -webkit-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.25), inset 0 -1px 0 rgba(0, 0, 0, 0.1); - -moz-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.25), inset 0 -1px 0 rgba(0, 0, 0, 0.1); - box-shadow: 0 1px 3px rgba(0, 0, 0, 0.25), inset 0 -1px 0 rgba(0, 0, 0, 0.1); -} - -.navbar .container { - width: auto; -} - -.nav-collapse.collapse { - height: auto; -} - -.navbar { - color: #999999; -} - -.navbar .brand:hover { - text-decoration: none; -} - -.navbar .brand { - display: block; - float: left; - padding: 8px 20px 12px; - margin-left: -20px; - font-size: 20px; - font-weight: bold; - line-height: 1; - color: #CACACA; -} - -.navbar .navbar-text { - margin-bottom: 0; - line-height: 40px; -} - -.navbar .navbar-link { - color: #999999; -} - -.navbar .navbar-link:hover { - color: #ffffff; -} - -.navbar .btn, -.navbar .btn-group { - margin-top: 5px; -} - -.navbar .btn-group .btn { - margin: 0; -} - -.navbar-form { - margin-bottom: 0; - *zoom: 1; -} - -.navbar-form:before, -.navbar-form:after { - display: table; - content: ""; -} - -.navbar-form:after { - clear: both; -} - -.navbar-form input, -.navbar-form select, -.navbar-form .radio, -.navbar-form .checkbox { - margin-top: 5px; -} - -.navbar-form input, -.navbar-form select { - display: inline-block; - margin-bottom: 0; -} - -.navbar-form input[type="image"], -.navbar-form input[type="checkbox"], -.navbar-form input[type="radio"] { - margin-top: 3px; -} - -.navbar-form .input-append, -.navbar-form .input-prepend { - margin-top: 6px; - white-space: nowrap; -} - -.navbar-form .input-append input, -.navbar-form .input-prepend input { - margin-top: 0; -} - -.navbar-search { - position: relative; - float: left; - margin-top: 6px; - margin-bottom: 0; -} - -.navbar-search .search-query { - padding: 4px 9px; - font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; - font-size: 13px; - font-weight: normal; - line-height: 1; - color: #ffffff; - background-color: #626262; - border: 1px solid #151515; - -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1), 0 1px 0 rgba(255, 255, 255, 0.15); - -moz-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1), 0 1px 0 rgba(255, 255, 255, 0.15); - box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1), 0 1px 0 rgba(255, 255, 255, 0.15); - -webkit-transition: none; - -moz-transition: none; - -ms-transition: none; - -o-transition: none; - transition: none; -} - -.navbar-search .search-query:-moz-placeholder { - color: #cccccc; -} - -.navbar-search .search-query:-ms-input-placeholder { - color: #cccccc; -} - -.navbar-search .search-query::-webkit-input-placeholder { - color: #cccccc; -} - -.navbar-search .search-query:focus, -.navbar-search .search-query.focused { - padding: 5px 10px; - color: #333333; - text-shadow: 0 1px 0 #ffffff; - background-color: #ffffff; - border: 0; - outline: 0; - -webkit-box-shadow: 0 0 3px rgba(0, 0, 0, 0.15); - -moz-box-shadow: 0 0 3px rgba(0, 0, 0, 0.15); - box-shadow: 0 0 3px rgba(0, 0, 0, 0.15); -} - -.navbar-fixed-top, -.navbar-fixed-bottom { - position: fixed; - right: 0; - left: 0; - z-index: 1030; - margin-bottom: 0; -} - -.navbar-fixed-top .navbar-inner, -.navbar-fixed-bottom .navbar-inner { - padding-right: 0; - padding-left: 0; - -webkit-border-radius: 0; - -moz-border-radius: 0; - border-radius: 0; -} - -.navbar-fixed-top .container, -.navbar-fixed-bottom .container { - width: 940px; -} - -.navbar-fixed-top { - top: 0; -} - -.navbar-fixed-bottom { - bottom: 0; -} - -.navbar .nav { - position: relative; - left: 0; - display: block; - float: left; - margin: 0 10px 0 0; -} - -.navbar .nav.pull-right { - float: right; -} - -.navbar .nav > li { - display: block; - float: left; -} - -.navbar .nav > li > a { - float: none; - padding: 9px 10px 11px; - line-height: 19px; - color: #999999; - text-decoration: none; - text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); -} - -.navbar .btn { - display: inline-block; - padding: 4px 10px 4px; - margin: 5px 5px 6px; - line-height: 18px; -} - -.navbar .btn-group { - padding: 5px 5px 6px; - margin: 0; -} - -.navbar .nav > li > a:hover { - color: #ffffff; - text-decoration: none; - background-color: transparent; -} - -.navbar .nav .active > a, -.navbar .nav .active > a:hover { - color: #ffffff; - text-decoration: none; - background-color: #222222; -} - -.navbar .divider-vertical { - width: 1px; - height: 40px; - margin: 0 9px; - overflow: hidden; - background-color: #222222; - border-right: 1px solid #333333; -} - -.navbar .nav.pull-right { - margin-right: 0; - margin-left: 10px; -} - -.navbar .btn-navbar { - display: none; - float: right; - padding: 7px 10px; - margin-right: 5px; - margin-left: 5px; - background-color: #2c2c2c; - *background-color: #222222; - background-image: -ms-linear-gradient(top, #333333, #222222); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#333333), to(#222222)); - background-image: -webkit-linear-gradient(top, #333333, #222222); - background-image: -o-linear-gradient(top, #333333, #222222); - background-image: linear-gradient(top, #333333, #222222); - background-image: -moz-linear-gradient(top, #333333, #222222); - background-repeat: repeat-x; - border-color: #222222 #222222 #000000; - border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); - filter: progid:dximagetransform.microsoft.gradient(startColorstr='#333333', endColorstr='#222222', GradientType=0); - filter: progid:dximagetransform.microsoft.gradient(enabled=false); - -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.075); - -moz-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.075); - box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.075); -} - -.navbar .btn-navbar:hover, -.navbar .btn-navbar:active, -.navbar .btn-navbar.active, -.navbar .btn-navbar.disabled, -.navbar .btn-navbar[disabled] { - background-color: #222222; - *background-color: #151515; -} - -.navbar .btn-navbar:active, -.navbar .btn-navbar.active { - background-color: #080808 \9; -} - -.navbar .btn-navbar .icon-bar { - display: block; - width: 18px; - height: 2px; - background-color: #f5f5f5; - -webkit-border-radius: 1px; - -moz-border-radius: 1px; - border-radius: 1px; - -webkit-box-shadow: 0 1px 0 rgba(0, 0, 0, 0.25); - -moz-box-shadow: 0 1px 0 rgba(0, 0, 0, 0.25); - box-shadow: 0 1px 0 rgba(0, 0, 0, 0.25); -} - -.btn-navbar .icon-bar + .icon-bar { - margin-top: 3px; -} - -.navbar .dropdown-menu:before { - position: absolute; - top: -7px; - left: 9px; - display: inline-block; - border-right: 7px solid transparent; - border-bottom: 7px solid #ccc; - border-left: 7px solid transparent; - border-bottom-color: rgba(0, 0, 0, 0.2); - content: ''; -} - -.navbar .dropdown-menu:after { - position: absolute; - top: -6px; - left: 10px; - display: inline-block; - border-right: 6px solid transparent; - border-bottom: 6px solid #ffffff; - border-left: 6px solid transparent; - content: ''; -} - -.navbar-fixed-bottom .dropdown-menu:before { - top: auto; - bottom: -7px; - border-top: 7px solid #ccc; - border-bottom: 0; - border-top-color: rgba(0, 0, 0, 0.2); -} - -.navbar-fixed-bottom .dropdown-menu:after { - top: auto; - bottom: -6px; - border-top: 6px solid #ffffff; - border-bottom: 0; -} - -.navbar .nav li.dropdown .dropdown-toggle .caret, -.navbar .nav li.dropdown.open .caret { - border-top-color: #ffffff; - border-bottom-color: #ffffff; -} - -.navbar .nav li.dropdown.active .caret { - opacity: 1; - filter: alpha(opacity=100); -} - -.navbar .nav li.dropdown.open > .dropdown-toggle, -.navbar .nav li.dropdown.active > .dropdown-toggle, -.navbar .nav li.dropdown.open.active > .dropdown-toggle { - background-color: transparent; -} - -.navbar .nav li.dropdown.active > .dropdown-toggle:hover { - color: #ffffff; -} - -.navbar .pull-right .dropdown-menu, -.navbar .dropdown-menu.pull-right { - right: 0; - left: auto; -} - -.navbar .pull-right .dropdown-menu:before, -.navbar .dropdown-menu.pull-right:before { - right: 12px; - left: auto; -} - -.navbar .pull-right .dropdown-menu:after, -.navbar .dropdown-menu.pull-right:after { - right: 13px; - left: auto; -} - -.breadcrumb { - padding: 7px 14px; - margin: 0 0 18px; - list-style: none; - background-color: #fbfbfb; - background-image: -moz-linear-gradient(top, #ffffff, #f5f5f5); - background-image: -ms-linear-gradient(top, #ffffff, #f5f5f5); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), to(#f5f5f5)); - background-image: -webkit-linear-gradient(top, #ffffff, #f5f5f5); - background-image: -o-linear-gradient(top, #ffffff, #f5f5f5); - background-image: linear-gradient(top, #ffffff, #f5f5f5); - background-repeat: repeat-x; - border: 1px solid #ddd; - -webkit-border-radius: 3px; - -moz-border-radius: 3px; - border-radius: 3px; - filter: progid:dximagetransform.microsoft.gradient(startColorstr='#ffffff', endColorstr='#f5f5f5', GradientType=0); - -webkit-box-shadow: inset 0 1px 0 #ffffff; - -moz-box-shadow: inset 0 1px 0 #ffffff; - box-shadow: inset 0 1px 0 #ffffff; -} - -.breadcrumb li { - display: inline-block; - *display: inline; - text-shadow: 0 1px 0 #ffffff; - *zoom: 1; -} - -.breadcrumb .divider { - padding: 0 5px; - color: #999999; -} - -.breadcrumb .active a { - color: #333333; -} - -.pagination { - height: 36px; - margin: 18px 0; -} - -.pagination ul { - display: inline-block; - *display: inline; - margin-bottom: 0; - margin-left: 0; - -webkit-border-radius: 3px; - -moz-border-radius: 3px; - border-radius: 3px; - *zoom: 1; - -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05); - -moz-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05); - box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05); -} - -.pagination li { - display: inline; -} - -.pagination a { - float: left; - padding: 0 14px; - line-height: 34px; - text-decoration: none; - border: 1px solid #ddd; - border-left-width: 0; -} - -.pagination a:hover, -.pagination .active a { - background-color: #f5f5f5; -} - -.pagination .active a { - color: #999999; - cursor: default; -} - -.pagination .disabled span, -.pagination .disabled a, -.pagination .disabled a:hover { - color: #999999; - cursor: default; - background-color: transparent; -} - -.pagination li:first-child a { - border-left-width: 1px; - -webkit-border-radius: 3px 0 0 3px; - -moz-border-radius: 3px 0 0 3px; - border-radius: 3px 0 0 3px; -} - -.pagination li:last-child a { - -webkit-border-radius: 0 3px 3px 0; - -moz-border-radius: 0 3px 3px 0; - border-radius: 0 3px 3px 0; -} - -.pagination-centered { - text-align: center; -} - -.pagination-right { - text-align: right; -} - -.pager { - margin-bottom: 18px; - margin-left: 0; - text-align: center; - list-style: none; - *zoom: 1; -} - -.pager:before, -.pager:after { - display: table; - content: ""; -} - -.pager:after { - clear: both; -} - -.pager li { - display: inline; -} - -.pager a { - display: inline-block; - padding: 5px 14px; - background-color: #fff; - border: 1px solid #ddd; - -webkit-border-radius: 15px; - -moz-border-radius: 15px; - border-radius: 15px; -} - -.pager a:hover { - text-decoration: none; - background-color: #f5f5f5; -} - -.pager .next a { - float: right; -} - -.pager .previous a { - float: left; -} - -.pager .disabled a, -.pager .disabled a:hover { - color: #999999; - cursor: default; - background-color: #fff; -} - -.modal-open .dropdown-menu { - z-index: 2050; -} - -.modal-open .dropdown.open { - *z-index: 2050; -} - -.modal-open .popover { - z-index: 2060; -} - -.modal-open .tooltip { - z-index: 2070; -} - -.modal-backdrop { - position: fixed; - top: 0; - right: 0; - bottom: 0; - left: 0; - z-index: 1040; - background-color: #000000; -} - -.modal-backdrop.fade { - opacity: 0; -} - -.modal-backdrop, -.modal-backdrop.fade.in { - opacity: 0.8; - filter: alpha(opacity=80); -} - -.modal { - position: fixed; - top: 50%; - left: 50%; - z-index: 1050; - width: 560px; - margin: -250px 0 0 -280px; - overflow: auto; - background-color: #ffffff; - border: 1px solid #999; - border: 1px solid rgba(0, 0, 0, 0.3); - *border: 1px solid #999; - -webkit-border-radius: 6px; - -moz-border-radius: 6px; - border-radius: 6px; - -webkit-box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3); - -moz-box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3); - box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3); - -webkit-background-clip: padding-box; - -moz-background-clip: padding-box; - background-clip: padding-box; -} - -.modal.fade { - top: -25%; - -webkit-transition: opacity 0.3s linear, top 0.3s ease-out; - -moz-transition: opacity 0.3s linear, top 0.3s ease-out; - -ms-transition: opacity 0.3s linear, top 0.3s ease-out; - -o-transition: opacity 0.3s linear, top 0.3s ease-out; - transition: opacity 0.3s linear, top 0.3s ease-out; -} - -.modal.fade.in { - top: 50%; -} - -.modal-header { - padding: 9px 15px; - border-bottom: 1px solid #eee; -} - -.modal-header .close { - margin-top: 2px; -} - -.modal-body { - max-height: 400px; - padding: 15px; - overflow-y: auto; -} - -.modal-form { - margin-bottom: 0; -} - -.modal-footer { - padding: 14px 15px 15px; - margin-bottom: 0; - text-align: right; - background-color: #f5f5f5; - border-top: 1px solid #ddd; - -webkit-border-radius: 0 0 6px 6px; - -moz-border-radius: 0 0 6px 6px; - border-radius: 0 0 6px 6px; - *zoom: 1; - -webkit-box-shadow: inset 0 1px 0 #ffffff; - -moz-box-shadow: inset 0 1px 0 #ffffff; - box-shadow: inset 0 1px 0 #ffffff; -} - -.modal-footer:before, -.modal-footer:after { - display: table; - content: ""; -} - -.modal-footer:after { - clear: both; -} - -.modal-footer .btn + .btn { - margin-bottom: 0; - margin-left: 5px; -} - -.modal-footer .btn-group .btn + .btn { - margin-left: -1px; -} - -.tooltip { - position: absolute; - z-index: 1020; - display: block; - padding: 5px; - font-size: 11px; - opacity: 0; - filter: alpha(opacity=0); - visibility: visible; -} - -.tooltip.in { - opacity: 0.8; - filter: alpha(opacity=80); -} - -.tooltip.top { - margin-top: -2px; -} - -.tooltip.right { - margin-left: 2px; -} - -.tooltip.bottom { - margin-top: 2px; -} - -.tooltip.left { - margin-left: -2px; -} - -.tooltip.top .tooltip-arrow { - bottom: 0; - left: 50%; - margin-left: -5px; - border-top: 5px solid #000000; - border-right: 5px solid transparent; - border-left: 5px solid transparent; -} - -.tooltip.left .tooltip-arrow { - top: 50%; - right: 0; - margin-top: -5px; - border-top: 5px solid transparent; - border-bottom: 5px solid transparent; - border-left: 5px solid #000000; -} - -.tooltip.bottom .tooltip-arrow { - top: 0; - left: 50%; - margin-left: -5px; - border-right: 5px solid transparent; - border-bottom: 5px solid #000000; - border-left: 5px solid transparent; -} - -.tooltip.right .tooltip-arrow { - top: 50%; - left: 0; - margin-top: -5px; - border-top: 5px solid transparent; - border-right: 5px solid #000000; - border-bottom: 5px solid transparent; -} - -.tooltip-inner { - max-width: 200px; - padding: 3px 8px; - color: #ffffff; - text-align: center; - text-decoration: none; - background-color: #000000; - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; -} - -.tooltip-arrow { - position: absolute; - width: 0; - height: 0; -} - -.popover { - position: absolute; - top: 0; - left: 0; - z-index: 1010; - display: none; - padding: 5px; -} - -.popover.top { - margin-top: -5px; -} - -.popover.right { - margin-left: 5px; -} - -.popover.bottom { - margin-top: 5px; -} - -.popover.left { - margin-left: -5px; -} - -.popover.top .arrow { - bottom: 0; - left: 50%; - margin-left: -5px; - border-top: 5px solid #000000; - border-right: 5px solid transparent; - border-left: 5px solid transparent; -} - -.popover.right .arrow { - top: 50%; - left: 0; - margin-top: -5px; - border-top: 5px solid transparent; - border-right: 5px solid #000000; - border-bottom: 5px solid transparent; -} - -.popover.bottom .arrow { - top: 0; - left: 50%; - margin-left: -5px; - border-right: 5px solid transparent; - border-bottom: 5px solid #000000; - border-left: 5px solid transparent; -} - -.popover.left .arrow { - top: 50%; - right: 0; - margin-top: -5px; - border-top: 5px solid transparent; - border-bottom: 5px solid transparent; - border-left: 5px solid #000000; -} - -.popover .arrow { - position: absolute; - width: 0; - height: 0; -} - -.popover-inner { - width: 280px; - padding: 3px; - overflow: hidden; - background: #000000; - background: rgba(0, 0, 0, 0.8); - -webkit-border-radius: 6px; - -moz-border-radius: 6px; - border-radius: 6px; - -webkit-box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3); - -moz-box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3); - box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3); -} - -.popover-title { - padding: 9px 15px; - line-height: 1; - background-color: #f5f5f5; - border-bottom: 1px solid #eee; - -webkit-border-radius: 3px 3px 0 0; - -moz-border-radius: 3px 3px 0 0; - border-radius: 3px 3px 0 0; -} - -.popover-content { - padding: 14px; - background-color: #ffffff; - -webkit-border-radius: 0 0 3px 3px; - -moz-border-radius: 0 0 3px 3px; - border-radius: 0 0 3px 3px; - -webkit-background-clip: padding-box; - -moz-background-clip: padding-box; - background-clip: padding-box; -} - -.popover-content p, -.popover-content ul, -.popover-content ol { - margin-bottom: 0; -} - -.thumbnails { - margin-left: -20px; - list-style: none; - *zoom: 1; -} - -.thumbnails:before, -.thumbnails:after { - display: table; - content: ""; -} - -.thumbnails:after { - clear: both; -} - -.row-fluid .thumbnails { - margin-left: 0; -} - -.thumbnails > li { - float: left; - margin-bottom: 18px; - margin-left: 20px; -} - -.thumbnail { - display: block; - padding: 4px; - line-height: 1; - border: 1px solid #ddd; - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; - -webkit-box-shadow: 0 1px 1px rgba(0, 0, 0, 0.075); - -moz-box-shadow: 0 1px 1px rgba(0, 0, 0, 0.075); - box-shadow: 0 1px 1px rgba(0, 0, 0, 0.075); -} - -a.thumbnail:hover { - border-color: #0088cc; - -webkit-box-shadow: 0 1px 4px rgba(0, 105, 214, 0.25); - -moz-box-shadow: 0 1px 4px rgba(0, 105, 214, 0.25); - box-shadow: 0 1px 4px rgba(0, 105, 214, 0.25); -} - -.thumbnail > img { - display: block; - max-width: 100%; - margin-right: auto; - margin-left: auto; -} - -.thumbnail .caption { - padding: 9px; -} - -.label, -.badge { - font-size: 10.998px; - font-weight: bold; - line-height: 14px; - color: #ffffff; - text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); - white-space: nowrap; - vertical-align: baseline; - background-color: #999999; -} - -.label { - padding: 1px 4px 2px; - -webkit-border-radius: 3px; - -moz-border-radius: 3px; - border-radius: 3px; -} - -.badge { - padding: 1px 9px 2px; - -webkit-border-radius: 9px; - -moz-border-radius: 9px; - border-radius: 9px; -} - -a.label:hover, -a.badge:hover { - color: #ffffff; - text-decoration: none; - cursor: pointer; -} - -.label-important, -.badge-important { - background-color: #b94a48; -} - -.label-important[href], -.badge-important[href] { - background-color: #953b39; -} - -.label-warning, -.badge-warning { - background-color: #f89406; -} - -.label-warning[href], -.badge-warning[href] { - background-color: #c67605; -} - -.label-success, -.badge-success { - background-color: #468847; -} - -.label-success[href], -.badge-success[href] { - background-color: #356635; -} - -.label-info, -.badge-info { - background-color: #3a87ad; -} - -.label-info[href], -.badge-info[href] { - background-color: #2d6987; -} - -.label-inverse, -.badge-inverse { - background-color: #333333; -} - -.label-inverse[href], -.badge-inverse[href] { - background-color: #1a1a1a; -} - -@-webkit-keyframes progress-bar-stripes { - from { - background-position: 40px 0; - } - to { - background-position: 0 0; - } -} - -@-moz-keyframes progress-bar-stripes { - from { - background-position: 40px 0; - } - to { - background-position: 0 0; - } -} - -@-ms-keyframes progress-bar-stripes { - from { - background-position: 40px 0; - } - to { - background-position: 0 0; - } -} - -@-o-keyframes progress-bar-stripes { - from { - background-position: 0 0; - } - to { - background-position: 40px 0; - } -} - -@keyframes progress-bar-stripes { - from { - background-position: 40px 0; - } - to { - background-position: 0 0; - } -} - -.progress { - height: 18px; - margin-bottom: 18px; - overflow: hidden; - background-color: #f7f7f7; - background-image: -moz-linear-gradient(top, #f5f5f5, #f9f9f9); - background-image: -ms-linear-gradient(top, #f5f5f5, #f9f9f9); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#f5f5f5), to(#f9f9f9)); - background-image: -webkit-linear-gradient(top, #f5f5f5, #f9f9f9); - background-image: -o-linear-gradient(top, #f5f5f5, #f9f9f9); - background-image: linear-gradient(top, #f5f5f5, #f9f9f9); - background-repeat: repeat-x; - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; - filter: progid:dximagetransform.microsoft.gradient(startColorstr='#f5f5f5', endColorstr='#f9f9f9', GradientType=0); - -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1); - -moz-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1); - box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1); -} - -.progress .bar { - width: 0; - height: 18px; - font-size: 12px; - color: #ffffff; - text-align: center; - text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); - background-color: #0e90d2; - background-image: -moz-linear-gradient(top, #149bdf, #0480be); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#149bdf), to(#0480be)); - background-image: -webkit-linear-gradient(top, #149bdf, #0480be); - background-image: -o-linear-gradient(top, #149bdf, #0480be); - background-image: linear-gradient(top, #149bdf, #0480be); - background-image: -ms-linear-gradient(top, #149bdf, #0480be); - background-repeat: repeat-x; - filter: progid:dximagetransform.microsoft.gradient(startColorstr='#149bdf', endColorstr='#0480be', GradientType=0); - -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15); - -moz-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15); - box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15); - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - -ms-box-sizing: border-box; - box-sizing: border-box; - -webkit-transition: width 0.6s ease; - -moz-transition: width 0.6s ease; - -ms-transition: width 0.6s ease; - -o-transition: width 0.6s ease; - transition: width 0.6s ease; -} - -.progress-striped .bar { - background-color: #149bdf; - background-image: -o-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: -webkit-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: -moz-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: -ms-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent)); - background-image: linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - -webkit-background-size: 40px 40px; - -moz-background-size: 40px 40px; - -o-background-size: 40px 40px; - background-size: 40px 40px; -} - -.progress.active .bar { - -webkit-animation: progress-bar-stripes 2s linear infinite; - -moz-animation: progress-bar-stripes 2s linear infinite; - -ms-animation: progress-bar-stripes 2s linear infinite; - -o-animation: progress-bar-stripes 2s linear infinite; - animation: progress-bar-stripes 2s linear infinite; -} - -.progress-danger .bar { - background-color: #dd514c; - background-image: -moz-linear-gradient(top, #ee5f5b, #c43c35); - background-image: -ms-linear-gradient(top, #ee5f5b, #c43c35); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ee5f5b), to(#c43c35)); - background-image: -webkit-linear-gradient(top, #ee5f5b, #c43c35); - background-image: -o-linear-gradient(top, #ee5f5b, #c43c35); - background-image: linear-gradient(top, #ee5f5b, #c43c35); - background-repeat: repeat-x; - filter: progid:dximagetransform.microsoft.gradient(startColorstr='#ee5f5b', endColorstr='#c43c35', GradientType=0); -} - -.progress-danger.progress-striped .bar { - background-color: #ee5f5b; - background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent)); - background-image: -webkit-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: -moz-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: -ms-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: -o-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); -} - -.progress-success .bar { - background-color: #5eb95e; - background-image: -moz-linear-gradient(top, #62c462, #57a957); - background-image: -ms-linear-gradient(top, #62c462, #57a957); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#62c462), to(#57a957)); - background-image: -webkit-linear-gradient(top, #62c462, #57a957); - background-image: -o-linear-gradient(top, #62c462, #57a957); - background-image: linear-gradient(top, #62c462, #57a957); - background-repeat: repeat-x; - filter: progid:dximagetransform.microsoft.gradient(startColorstr='#62c462', endColorstr='#57a957', GradientType=0); -} - -.progress-success.progress-striped .bar { - background-color: #62c462; - background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent)); - background-image: -webkit-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: -moz-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: -ms-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: -o-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); -} - -.progress-info .bar { - background-color: #4bb1cf; - background-image: -moz-linear-gradient(top, #5bc0de, #339bb9); - background-image: -ms-linear-gradient(top, #5bc0de, #339bb9); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#5bc0de), to(#339bb9)); - background-image: -webkit-linear-gradient(top, #5bc0de, #339bb9); - background-image: -o-linear-gradient(top, #5bc0de, #339bb9); - background-image: linear-gradient(top, #5bc0de, #339bb9); - background-repeat: repeat-x; - filter: progid:dximagetransform.microsoft.gradient(startColorstr='#5bc0de', endColorstr='#339bb9', GradientType=0); -} - -.progress-info.progress-striped .bar { - background-color: #5bc0de; - background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent)); - background-image: -webkit-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: -moz-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: -ms-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: -o-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); -} - -.progress-warning .bar { - background-color: #faa732; - background-image: -moz-linear-gradient(top, #fbb450, #f89406); - background-image: -ms-linear-gradient(top, #fbb450, #f89406); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#fbb450), to(#f89406)); - background-image: -webkit-linear-gradient(top, #fbb450, #f89406); - background-image: -o-linear-gradient(top, #fbb450, #f89406); - background-image: linear-gradient(top, #fbb450, #f89406); - background-repeat: repeat-x; - filter: progid:dximagetransform.microsoft.gradient(startColorstr='#fbb450', endColorstr='#f89406', GradientType=0); -} - -.progress-warning.progress-striped .bar { - background-color: #fbb450; - background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent)); - background-image: -webkit-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: -moz-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: -ms-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: -o-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); -} - -.accordion { - margin-bottom: 18px; -} - -.accordion-group { - margin-bottom: 2px; - border: 1px solid #e5e5e5; - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; -} - -.accordion-heading { - border-bottom: 0; -} - -.accordion-heading .accordion-toggle { - display: block; - padding: 8px 15px; -} - -.accordion-toggle { - cursor: pointer; -} - -.accordion-inner { - padding: 9px 15px; - border-top: 1px solid #e5e5e5; -} - -.carousel { - position: relative; - margin-bottom: 18px; - line-height: 1; -} - -.carousel-inner { - position: relative; - width: 100%; - overflow: hidden; -} - -.carousel .item { - position: relative; - display: none; - -webkit-transition: 0.6s ease-in-out left; - -moz-transition: 0.6s ease-in-out left; - -ms-transition: 0.6s ease-in-out left; - -o-transition: 0.6s ease-in-out left; - transition: 0.6s ease-in-out left; -} - -.carousel .item > img { - display: block; - line-height: 1; -} - -.carousel .active, -.carousel .next, -.carousel .prev { - display: block; -} - -.carousel .active { - left: 0; -} - -.carousel .next, -.carousel .prev { - position: absolute; - top: 0; - width: 100%; -} - -.carousel .next { - left: 100%; -} - -.carousel .prev { - left: -100%; -} - -.carousel .next.left, -.carousel .prev.right { - left: 0; -} - -.carousel .active.left { - left: -100%; -} - -.carousel .active.right { - left: 100%; -} - -.carousel-control { - position: absolute; - top: 40%; - left: 15px; - width: 40px; - height: 40px; - margin-top: -20px; - font-size: 60px; - font-weight: 100; - line-height: 30px; - color: #ffffff; - text-align: center; - background: #222222; - border: 3px solid #ffffff; - -webkit-border-radius: 23px; - -moz-border-radius: 23px; - border-radius: 23px; - opacity: 0.5; - filter: alpha(opacity=50); -} - -.carousel-control.right { - right: 15px; - left: auto; -} - -.carousel-control:hover { - color: #ffffff; - text-decoration: none; - opacity: 0.9; - filter: alpha(opacity=90); -} - -.carousel-caption { - position: absolute; - right: 0; - bottom: 0; - left: 0; - padding: 10px 15px 5px; - background: #333333; - background: rgba(0, 0, 0, 0.75); -} - -.carousel-caption h4, -.carousel-caption p { - color: #ffffff; -} - -.hero-unit { - padding: 60px; - margin-bottom: 30px; - background-color: #eeeeee; - -webkit-border-radius: 6px; - -moz-border-radius: 6px; - border-radius: 6px; -} - -.hero-unit h1 { - margin-bottom: 0; - font-size: 60px; - line-height: 1; - letter-spacing: -1px; - color: inherit; -} - -.hero-unit p { - font-size: 18px; - font-weight: 200; - line-height: 27px; - color: inherit; -} - -.pull-right { - float: right; -} - -.pull-left { - float: left; -} - -.hide { - display: none; -} - -.show { - display: block; -} - -.invisible { - visibility: hidden; -} - diff --git a/deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/css/docs.css b/deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/css/docs.css deleted file mode 100644 index 92a4ec8e67f279f4038380f64ff049ebb03039df..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/css/docs.css +++ /dev/null @@ -1,846 +0,0 @@ -/* Add additional stylesheets below --------------------------------------------------- */ -/* - Bootstrap's documentation styles - Special styles for presenting Bootstrap's documentation and examples -*/ - - -/* Body and structure --------------------------------------------------- */ -body { - position: relative; - padding-top: 90px; - background-color: #fff; - background-image: url(../img/grid-18px-masked.png); - background-repeat: repeat-x; - background-position: 0 40px; -} - - -/* Tweak navbar brand link to be super sleek --------------------------------------------------- */ -.navbar-fixed-top .brand { - padding-right: 0; - padding-left: 0; - margin-left: 20px; - float: right; - font-weight: bold; - color: #000; - text-shadow: 0 1px 0 rgba(255,255,255,.1), 0 0 30px rgba(255,255,255,.125); - -webkit-transition: all .2s linear; - -moz-transition: all .2s linear; - transition: all .2s linear; -} -.navbar-fixed-top .brand:hover { - text-decoration: none; -} - - -/* Space out sub-sections more --------------------------------------------------- */ -section { - padding-top: 60px; -} - -/* Faded out hr */ -hr.soften { - height: 1px; - margin: 54px 0; - background-image: -webkit-linear-gradient(left, rgba(0,0,0,0), rgba(0,0,0,.1), rgba(0,0,0,0)); - background-image: -moz-linear-gradient(left, rgba(0,0,0,0), rgba(0,0,0,.1), rgba(0,0,0,0)); - background-image: -ms-linear-gradient(left, rgba(0,0,0,0), rgba(0,0,0,.1), rgba(0,0,0,0)); - background-image: -o-linear-gradient(left, rgba(0,0,0,0), rgba(0,0,0,.1), rgba(0,0,0,0)); - border: 0; -} - - -/* Jumbotrons --------------------------------------------------- */ -.jumbotron { - position: relative; -} -.jumbotron h1 { - margin-bottom: 9px; - font-size: 81px; - font-weight: bold; - letter-spacing: -1px; - line-height: 1; -} -.jumbotron p { - margin-bottom: 18px; - font-weight: 300; -} -.jumbotron .btn-large { - font-size: 20px; - font-weight: normal; - padding: 14px 24px; - margin-right: 10px; - -webkit-border-radius: 6px; - -moz-border-radius: 6px; - border-radius: 6px; -} -.jumbotron .btn-large small { - font-size: 14px; -} - -/* Masthead (docs home) */ -.masthead { - padding-top: 36px; - margin-bottom: 72px; -} -.masthead h1, -.masthead p { - text-align: center; -} -.masthead h1 { - margin-bottom: 18px; -} -.masthead p { - margin-left: 5%; - margin-right: 5%; - font-size: 30px; - line-height: 36px; -} - - -/* Specific jumbotrons -------------------------- */ -/* supporting docs pages */ -.subhead { - padding-bottom: 0; - margin-bottom: 9px; -} -.subhead h1 { - font-size: 54px; -} - -/* Subnav */ -.subnav { - width: 100%; - height: 36px; - background-color: #eeeeee; /* Old browsers */ - background-repeat: repeat-x; /* Repeat the gradient */ - background-image: -moz-linear-gradient(top, #f5f5f5 0%, #eeeeee 100%); /* FF3.6+ */ - background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#f5f5f5), color-stop(100%,#eeeeee)); /* Chrome,Safari4+ */ - background-image: -webkit-linear-gradient(top, #f5f5f5 0%,#eeeeee 100%); /* Chrome 10+,Safari 5.1+ */ - background-image: -ms-linear-gradient(top, #f5f5f5 0%,#eeeeee 100%); /* IE10+ */ - background-image: -o-linear-gradient(top, #f5f5f5 0%,#eeeeee 100%); /* Opera 11.10+ */ - filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#f5f5f5', endColorstr='#eeeeee',GradientType=0 ); /* IE6-9 */ - background-image: linear-gradient(top, #f5f5f5 0%,#eeeeee 100%); /* W3C */ - border: 1px solid #e5e5e5; - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; -} -.subnav .nav { - margin-bottom: 0; -} -.subnav .nav > li > a { - margin: 0; - padding-top: 11px; - padding-bottom: 11px; - border-left: 1px solid #f5f5f5; - border-right: 1px solid #e5e5e5; - -webkit-border-radius: 0; - -moz-border-radius: 0; - border-radius: 0; -} -.subnav .nav > .active > a, -.subnav .nav > .active > a:hover { - padding-left: 13px; - color: #777; - background-color: #e9e9e9; - border-right-color: #ddd; - border-left: 0; - -webkit-box-shadow: inset 0 3px 5px rgba(0,0,0,.05); - -moz-box-shadow: inset 0 3px 5px rgba(0,0,0,.05); - box-shadow: inset 0 3px 5px rgba(0,0,0,.05); -} -.subnav .nav > .active > a .caret, -.subnav .nav > .active > a:hover .caret { - border-top-color: #777; -} -.subnav .nav > li:first-child > a, -.subnav .nav > li:first-child > a:hover { - border-left: 0; - padding-left: 12px; - -webkit-border-radius: 4px 0 0 4px; - -moz-border-radius: 4px 0 0 4px; - border-radius: 4px 0 0 4px; -} -.subnav .nav > li:last-child > a { - border-right: 0; -} -.subnav .dropdown-menu { - -webkit-border-radius: 0 0 4px 4px; - -moz-border-radius: 0 0 4px 4px; - border-radius: 0 0 4px 4px; -} - -/* Fixed subnav on scroll, but only for 980px and up (sorry IE!) */ -@media (min-width: 980px) { - .subnav-fixed { - position: fixed; - top: 40px; - left: 0; - right: 0; - z-index: 1020; /* 10 less than .navbar-fixed to prevent any overlap */ - border-color: #d5d5d5; - border-width: 0 0 1px; /* drop the border on the fixed edges */ - -webkit-border-radius: 0; - -moz-border-radius: 0; - border-radius: 0; - -webkit-box-shadow: inset 0 1px 0 #fff, 0 1px 5px rgba(0,0,0,.1); - -moz-box-shadow: inset 0 1px 0 #fff, 0 1px 5px rgba(0,0,0,.1); - box-shadow: inset 0 1px 0 #fff, 0 1px 5px rgba(0,0,0,.1); - filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); /* IE6-9 */ - } - .subnav-fixed .nav { - width: 938px; - margin: 0 auto; - padding: 0 1px; - } - .subnav .nav > li:first-child > a, - .subnav .nav > li:first-child > a:hover { - -webkit-border-radius: 0; - -moz-border-radius: 0; - border-radius: 0; - } -} - - -/* Quick links --------------------------------------------------- */ -.bs-links { - margin: 36px 0; -} -.quick-links { - min-height: 30px; - margin: 0; - padding: 5px 20px; - list-style: none; - text-align: center; - overflow: hidden; -} -.quick-links:first-child { - min-height: 0; -} -.quick-links li { - display: inline; - margin: 0 8px; - color: #999; -} -.quick-links .github-btn, -.quick-links .tweet-btn, -.quick-links .follow-btn { - position: relative; - top: 5px; -} - - -/* Marketing section of Overview --------------------------------------------------- */ -.marketing .row { - margin-bottom: 9px; -} -.marketing h1 { - margin: 36px 0 27px; - font-size: 40px; - font-weight: 300; - text-align: center; -} -.marketing h2, -.marketing h3 { - font-weight: 300; -} -.marketing h2 { - font-size: 22px; -} -.marketing p { - margin-right: 10px; -} -.marketing .bs-icon { - float: left; - margin: 7px 10px 0 0; - opacity: .8; -} -.marketing .small-bs-icon { - float: left; - margin: 4px 5px 0 0; -} - - - -/* Footer --------------------------------------------------- */ -.footer { - margin-top: 45px; - padding: 35px 0 36px; - border-top: 1px solid #e5e5e5; -} -.footer p { - margin-bottom: 0; - color: #555; -} - - - -/* Special grid styles --------------------------------------------------- */ -.show-grid { - margin-top: 10px; - margin-bottom: 20px; -} -.show-grid [class*="span"] { - background-color: #eee; - text-align: center; - -webkit-border-radius: 3px; - -moz-border-radius: 3px; - border-radius: 3px; - min-height: 30px; - line-height: 30px; -} -.show-grid:hover [class*="span"] { - background: #ddd; -} -.show-grid .show-grid { - margin-top: 0; - margin-bottom: 0; -} -.show-grid .show-grid [class*="span"] { - background-color: #ccc; -} - - -/* Render mini layout previews --------------------------------------------------- */ -.mini-layout { - border: 1px solid #ddd; - -webkit-border-radius: 6px; - -moz-border-radius: 6px; - border-radius: 6px; - -webkit-box-shadow: 0 1px 2px rgba(0,0,0,.075); - -moz-box-shadow: 0 1px 2px rgba(0,0,0,.075); - box-shadow: 0 1px 2px rgba(0,0,0,.075); -} -.mini-layout { - height: 240px; - margin-bottom: 20px; - padding: 9px; -} -.mini-layout div { - -webkit-border-radius: 3px; - -moz-border-radius: 3px; - border-radius: 3px; -} -.mini-layout .mini-layout-body { - background-color: #dceaf4; - margin: 0 auto; - width: 70%; - height: 240px; -} -.mini-layout.fluid .mini-layout-sidebar, -.mini-layout.fluid .mini-layout-header, -.mini-layout.fluid .mini-layout-body { - float: left; -} -.mini-layout.fluid .mini-layout-sidebar { - background-color: #bbd8e9; - width: 20%; - height: 240px; -} -.mini-layout.fluid .mini-layout-body { - width: 77.5%; - margin-left: 2.5%; -} - - -/* Popover docs --------------------------------------------------- */ -.popover-well { - min-height: 160px; -} -.popover-well .popover { - display: block; -} -.popover-well .popover-wrapper { - width: 50%; - height: 160px; - float: left; - margin-left: 55px; - position: relative; -} -.popover-well .popover-menu-wrapper { - height: 80px; -} -.large-bird { - margin: 5px 0 0 310px; - opacity: .1; -} - - -/* Download page --------------------------------------------------- */ -.download .page-header { - margin-top: 36px; -} -.page-header .toggle-all { - margin-top: 5px; -} - -/* Space out h3s when following a section */ -.download h3 { - margin-bottom: 5px; -} -.download-builder input + h3, -.download-builder .checkbox + h3 { - margin-top: 9px; -} - -/* Fields for variables */ -.download-builder input[type=text] { - margin-bottom: 9px; - font-family: Menlo, Monaco, "Courier New", monospace; - font-size: 12px; - color: #d14; -} -.download-builder input[type=text]:focus { - background-color: #fff; -} - -/* Custom, larger checkbox labels */ -.download .checkbox { - padding: 6px 10px 6px 25px; - color: #555; - background-color: #f9f9f9; - -webkit-border-radius: 3px; - -moz-border-radius: 3px; - border-radius: 3px; - cursor: pointer; -} -.download .checkbox:hover { - color: #333; - background-color: #f5f5f5; -} -.download .checkbox small { - font-size: 12px; - color: #777; -} - -/* Variables section */ -#variables label { - margin-bottom: 0; -} - -/* Giant download button */ -.download-btn { - margin: 36px 0 108px; -} -#download p, -#download h4 { - max-width: 50%; - margin: 0 auto; - color: #999; - text-align: center; -} -#download h4 { - margin-bottom: 0; -} -#download p { - margin-bottom: 18px; -} -.download-btn .btn { - display: block; - width: auto; - padding: 19px 24px; - margin-bottom: 27px; - font-size: 30px; - line-height: 1; - text-align: center; - -webkit-border-radius: 6px; - -moz-border-radius: 6px; - border-radius: 6px; -} - - - -/* Color swatches on LESS docs page --------------------------------------------------- */ -/* Sets the width of the td */ -.swatch-col { - width: 30px; -} -/* Le swatch */ -.swatch { - display: inline-block; - width: 30px; - height: 20px; - margin: -6px 0; - -webkit-border-radius: 3px; - -moz-border-radius: 3px; - border-radius: 3px; -} -/* For white swatches, give a border */ -.swatch-bordered { - width: 28px; - height: 18px; - border: 1px solid #eee; -} - - -/* Misc --------------------------------------------------- */ - -/* Make tables spaced out a bit more */ -h2 + table, -h3 + table, -h4 + table, -h2 + .row { - margin-top: 5px; -} - -/* Example sites showcase */ -.example-sites img { - max-width: 100%; - margin: 0 auto; -} -.marketing-byline { - margin: -18px 0 27px; - font-size: 18px; - font-weight: 300; - line-height: 24px; - color: #999; - text-align: center; -} - -.scrollspy-example { - height: 200px; - overflow: auto; - position: relative; -} - -/* Remove bottom margin on example forms in wells */ -form.well { - padding: 14px; -} - -/* Tighten up spacing */ -.well hr { - margin: 18px 0; -} - -/* Fake the :focus state to demo it */ -.focused { - border-color: rgba(82,168,236,.8); - -webkit-box-shadow: inset 0 1px 3px rgba(0,0,0,.1), 0 0 8px rgba(82,168,236,.6); - -moz-box-shadow: inset 0 1px 3px rgba(0,0,0,.1), 0 0 8px rgba(82,168,236,.6); - box-shadow: inset 0 1px 3px rgba(0,0,0,.1), 0 0 8px rgba(82,168,236,.6); - outline: 0; -} - -/* For input sizes, make them display block */ -.docs-input-sizes select, -.docs-input-sizes input[type=text] { - display: block; - margin-bottom: 9px; -} - -/* Icons -------------------------- */ -.the-icons { - margin-left: 0; - list-style: none; -} -.the-icons i:hover { - background-color: rgba(255,0,0,.25); -} - -/* Eaxmples page -------------------------- */ -.bootstrap-examples .thumbnail { - margin-bottom: 9px; - background-color: #fff; -} - -/* Responsive table -------------------------- */ -.responsive-utilities th small { - display: block; - font-weight: normal; - color: #999; -} -.responsive-utilities tbody th { - font-weight: normal; -} -.responsive-utilities td { - text-align: center; -} -.responsive-utilities td.is-visible { - color: #468847; - background-color: #dff0d8 !important; -} -.responsive-utilities td.is-hidden { - color: #ccc; - background-color: #f9f9f9 !important; -} - -/* Responsive tests -------------------------- */ -.responsive-utilities-test { - margin-top: 5px; - margin-left: 0; - list-style: none; - overflow: hidden; /* clear floats */ -} -.responsive-utilities-test li { - position: relative; - float: left; - width: 25%; - height: 43px; - font-size: 14px; - font-weight: bold; - line-height: 43px; - color: #999; - text-align: center; - border: 1px solid #ddd; - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; -} -.responsive-utilities-test li + li { - margin-left: 10px; -} -.responsive-utilities-test span { - position: absolute; - top: -1px; - left: -1px; - right: -1px; - bottom: -1px; - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; -} -.responsive-utilities-test span { - color: #468847; - background-color: #dff0d8; - border: 1px solid #d6e9c6; -} - - -/* Responsive Docs --------------------------------------------------- */ -@media (max-width: 480px) { - - /* Reduce padding above jumbotron */ - body { - padding-top: 70px; - } - - /* Change up some type stuff */ - h2 { - margin-top: 27px; - } - h2 small { - display: block; - line-height: 18px; - } - h3 { - margin-top: 18px; - } - - /* icons */ - .marketing .bs-icon { - margin: 0; - } - - /* Adjust the jumbotron */ - .jumbotron h1, - .jumbotron p { - text-align: center; - margin-right: 0; - } - .jumbotron h1 { - font-size: 45px; - margin-right: 0; - } - .jumbotron p { - margin-right: 0; - margin-left: 0; - font-size: 18px; - line-height: 24px; - } - .jumbotron .btn { - display: block; - font-size: 18px; - padding: 10px 14px; - margin: 0 auto 10px; - } - /* Masthead (home page jumbotron) */ - .masthead { - padding-top: 0; - } - - /* Don't space out quick links so much */ - .quick-links { - margin: 40px 0 0; - } - /* hide the bullets on mobile since our horizontal space is limited */ - .quick-links .divider { - display: none; - } - - /* center example sites */ - .example-sites { - margin-left: 0; - } - .example-sites > li { - float: none; - display: block; - max-width: 280px; - margin: 0 auto 18px; - text-align: center; - } - .example-sites .thumbnail > img { - max-width: 270px; - } - - table code { - white-space: normal; - word-wrap: break-word; - word-break: break-all; - } - - /* Modal example */ - .modal-example .modal { - position: relative; - top: auto; - right: auto; - bottom: auto; - left: auto; - } - -} - - -@media (max-width: 768px) { - - /* Remove any padding from the body */ - body { - padding-top: 0; - } - - /* Jumbotron buttons */ - .jumbotron .btn { - margin-bottom: 10px; - } - - /* Subnav */ - .subnav { - position: static; - top: auto; - z-index: auto; - width: auto; - height: auto; - background: #fff; /* whole background property since we use a background-image for gradient */ - -webkit-box-shadow: none; - -moz-box-shadow: none; - box-shadow: none; - } - .subnav .nav > li { - float: none; - } - .subnav .nav > li > a { - border: 0; - } - .subnav .nav > li + li > a { - border-top: 1px solid #e5e5e5; - } - .subnav .nav > li:first-child > a, - .subnav .nav > li:first-child > a:hover { - -webkit-border-radius: 4px 4px 0 0; - -moz-border-radius: 4px 4px 0 0; - border-radius: 4px 4px 0 0; - } - - /* Popovers */ - .large-bird { - display: none; - } - .popover-well .popover-wrapper { - margin-left: 0; - } - - /* Space out the show-grid examples */ - .show-grid [class*="span"] { - margin-bottom: 5px; - } - - /* Unfloat the back to top link in footer */ - .footer .pull-right { - float: none; - } - .footer p { - margin-bottom: 9px; - } - -} - - -@media (min-width: 480px) and (max-width: 768px) { - - /* Scale down the jumbotron content */ - .jumbotron h1 { - font-size: 54px; - } - .jumbotron p { - margin-right: 0; - margin-left: 0; - } - -} - - -@media (min-width: 768px) and (max-width: 980px) { - - /* Remove any padding from the body */ - body { - padding-top: 0; - } - - /* Scale down the jumbotron content */ - .jumbotron h1 { - font-size: 72px; - } - -} - - -@media (max-width: 980px) { - - /* Unfloat brand */ - .navbar-fixed-top .brand { - float: left; - margin-left: 0; - padding-left: 10px; - padding-right: 10px; - } - - /* Inline-block quick links for more spacing */ - .quick-links li { - display: inline-block; - margin: 5px; - } - -} - - -/* LARGE DESKTOP SCREENS */ -@media (min-width: 1210px) { - - /* Update subnav container */ - .subnav-fixed .nav { - width: 1168px; /* 2px less to account for left/right borders being removed when in fixed mode */ - } - -} diff --git a/deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/css/openbis.css b/deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/css/openbis.css deleted file mode 100644 index ede4129dde65a7d896b7ba99980d825d01888c2f..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/css/openbis.css +++ /dev/null @@ -1,16 +0,0 @@ -div#login { - position: relative; - top: 60px; -} - -.nav li { - cursor: pointer; -} - -.brand { - cursor: default; -} - -@media print { - @page { size: landscape } -} \ No newline at end of file diff --git a/deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/ico/apple-touch-icon-114-precomposed.png b/deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/ico/apple-touch-icon-114-precomposed.png deleted file mode 100644 index f1c93e6fd97d3ff7d5cf07c69719d0ef7903b428..0000000000000000000000000000000000000000 Binary files a/deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/ico/apple-touch-icon-114-precomposed.png and /dev/null differ diff --git a/deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/ico/apple-touch-icon-144-precomposed.png b/deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/ico/apple-touch-icon-144-precomposed.png deleted file mode 100644 index 3c80087b1e55553b08b721de22876c0469dcd0eb..0000000000000000000000000000000000000000 Binary files a/deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/ico/apple-touch-icon-144-precomposed.png and /dev/null differ diff --git a/deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/ico/apple-touch-icon-57-precomposed.png b/deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/ico/apple-touch-icon-57-precomposed.png deleted file mode 100644 index 34b8dd6bdaa38cb0a057c837ff8d36ace98ebed4..0000000000000000000000000000000000000000 Binary files a/deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/ico/apple-touch-icon-57-precomposed.png and /dev/null differ diff --git a/deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/ico/apple-touch-icon-72-precomposed.png b/deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/ico/apple-touch-icon-72-precomposed.png deleted file mode 100644 index f77bd6c99cf13360dd9b0955c701274f9aba4fc8..0000000000000000000000000000000000000000 Binary files a/deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/ico/apple-touch-icon-72-precomposed.png and /dev/null differ diff --git a/deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/ico/favicon.ico b/deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/ico/favicon.ico deleted file mode 100644 index e1c310e416b7b503c4ebd0855b36b58ae6e3a2fb..0000000000000000000000000000000000000000 Binary files a/deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/ico/favicon.ico and /dev/null differ diff --git a/deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/img/bird.png b/deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/img/bird.png deleted file mode 100644 index 903e4c78ef5b1f79be7aaa5d3d7feb0abfae3a0b..0000000000000000000000000000000000000000 Binary files a/deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/img/bird.png and /dev/null differ diff --git a/deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/img/bootstrap-mdo-sfmoma-01.jpg b/deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/img/bootstrap-mdo-sfmoma-01.jpg deleted file mode 100644 index 135c9babb0431578c5d0bda44a284e8bdd5e3824..0000000000000000000000000000000000000000 Binary files a/deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/img/bootstrap-mdo-sfmoma-01.jpg and /dev/null differ diff --git a/deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/img/bootstrap-mdo-sfmoma-02.jpg b/deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/img/bootstrap-mdo-sfmoma-02.jpg deleted file mode 100644 index 704e5dfe40596bc46f94c336f2d965294879e371..0000000000000000000000000000000000000000 Binary files a/deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/img/bootstrap-mdo-sfmoma-02.jpg and /dev/null differ diff --git a/deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/img/bootstrap-mdo-sfmoma-03.jpg b/deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/img/bootstrap-mdo-sfmoma-03.jpg deleted file mode 100644 index 430fde2cfb6957b0e010889e63355c541f23e4cd..0000000000000000000000000000000000000000 Binary files a/deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/img/bootstrap-mdo-sfmoma-03.jpg and /dev/null differ diff --git a/deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/img/browsers.png b/deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/img/browsers.png deleted file mode 100644 index 73b668d9140ee4371928d95f084ba6fc9b1149be..0000000000000000000000000000000000000000 Binary files a/deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/img/browsers.png and /dev/null differ diff --git a/deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/img/example-sites/fleetio.png b/deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/img/example-sites/fleetio.png deleted file mode 100644 index 9207b0cb805e3cf9f0edceb912fee623a1f9212d..0000000000000000000000000000000000000000 Binary files a/deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/img/example-sites/fleetio.png and /dev/null differ diff --git a/deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/img/example-sites/jshint.png b/deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/img/example-sites/jshint.png deleted file mode 100644 index ac7086de1d41dda2e67698aa300963b332a0f52c..0000000000000000000000000000000000000000 Binary files a/deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/img/example-sites/jshint.png and /dev/null differ diff --git a/deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/img/example-sites/kippt.png b/deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/img/example-sites/kippt.png deleted file mode 100644 index 4afa772ccf73199892bd24c0b6ef0067aa69057f..0000000000000000000000000000000000000000 Binary files a/deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/img/example-sites/kippt.png and /dev/null differ diff --git a/deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/img/example-sites/soundready.png b/deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/img/example-sites/soundready.png deleted file mode 100644 index 2675ff9117779db1ef5ad72091f2aa376270ecc6..0000000000000000000000000000000000000000 Binary files a/deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/img/example-sites/soundready.png and /dev/null differ diff --git a/deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/img/examples/bootstrap-example-fluid.jpg b/deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/img/examples/bootstrap-example-fluid.jpg deleted file mode 100644 index 151b987cb7d16cfef4e12b65cc9f2514889686bc..0000000000000000000000000000000000000000 Binary files a/deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/img/examples/bootstrap-example-fluid.jpg and /dev/null differ diff --git a/deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/img/examples/bootstrap-example-hero.jpg b/deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/img/examples/bootstrap-example-hero.jpg deleted file mode 100644 index cd4a321078634534b389799f8ebad03583a86f2c..0000000000000000000000000000000000000000 Binary files a/deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/img/examples/bootstrap-example-hero.jpg and /dev/null differ diff --git a/deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/img/examples/bootstrap-example-starter.jpg b/deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/img/examples/bootstrap-example-starter.jpg deleted file mode 100644 index 09c8a066d8f295e5331527967a8c0b01e6f975fd..0000000000000000000000000000000000000000 Binary files a/deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/img/examples/bootstrap-example-starter.jpg and /dev/null differ diff --git a/deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/img/github-16px.png b/deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/img/github-16px.png deleted file mode 100644 index c99ab237a7e77fd149fba63e15e3463b387c0689..0000000000000000000000000000000000000000 Binary files a/deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/img/github-16px.png and /dev/null differ diff --git a/deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/img/glyphicons-halflings-white.png b/deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/img/glyphicons-halflings-white.png deleted file mode 100644 index 3bf6484a29d8da269f9bc874b25493a45fae3bae..0000000000000000000000000000000000000000 Binary files a/deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/img/glyphicons-halflings-white.png and /dev/null differ diff --git a/deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/img/glyphicons-halflings.png b/deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/img/glyphicons-halflings.png deleted file mode 100644 index 79bc568c21395d5a5ceab62fadb04457094b2ac7..0000000000000000000000000000000000000000 Binary files a/deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/img/glyphicons-halflings.png and /dev/null differ diff --git a/deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/img/glyphicons/glyphicons_009_magic.png b/deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/img/glyphicons/glyphicons_009_magic.png deleted file mode 100644 index f1cfb3785f3b1a76a3bdb87d9a34345d27705950..0000000000000000000000000000000000000000 Binary files a/deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/img/glyphicons/glyphicons_009_magic.png and /dev/null differ diff --git a/deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/img/glyphicons/glyphicons_042_group.png b/deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/img/glyphicons/glyphicons_042_group.png deleted file mode 100644 index be5c6f94b560661d614e9f1f30b89bdca347bb40..0000000000000000000000000000000000000000 Binary files a/deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/img/glyphicons/glyphicons_042_group.png and /dev/null differ diff --git a/deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/img/glyphicons/glyphicons_079_podium.png b/deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/img/glyphicons/glyphicons_079_podium.png deleted file mode 100644 index 20b7c99b9d44a8c1e61ad0e26e263ff61dd4c1e8..0000000000000000000000000000000000000000 Binary files a/deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/img/glyphicons/glyphicons_079_podium.png and /dev/null differ diff --git a/deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/img/glyphicons/glyphicons_082_roundabout.png b/deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/img/glyphicons/glyphicons_082_roundabout.png deleted file mode 100644 index e3a6487a01f6a41b1edf9687b2db5e0c960add4a..0000000000000000000000000000000000000000 Binary files a/deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/img/glyphicons/glyphicons_082_roundabout.png and /dev/null differ diff --git a/deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/img/glyphicons/glyphicons_155_show_thumbnails.png b/deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/img/glyphicons/glyphicons_155_show_thumbnails.png deleted file mode 100644 index 751e3b7184e58edcd7c05beee1d0f227104f10bc..0000000000000000000000000000000000000000 Binary files a/deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/img/glyphicons/glyphicons_155_show_thumbnails.png and /dev/null differ diff --git a/deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/img/glyphicons/glyphicons_163_iphone.png b/deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/img/glyphicons/glyphicons_163_iphone.png deleted file mode 100644 index 926df7e5506172b27b22895137b5a1058005ffc4..0000000000000000000000000000000000000000 Binary files a/deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/img/glyphicons/glyphicons_163_iphone.png and /dev/null differ diff --git a/deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/img/glyphicons/glyphicons_214_resize_small.png b/deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/img/glyphicons/glyphicons_214_resize_small.png deleted file mode 100644 index 707d9e03e3148636d89aa67a346dd9963be91766..0000000000000000000000000000000000000000 Binary files a/deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/img/glyphicons/glyphicons_214_resize_small.png and /dev/null differ diff --git a/deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/img/glyphicons/glyphicons_266_book_open.png b/deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/img/glyphicons/glyphicons_266_book_open.png deleted file mode 100644 index ab04b4a1b3f47fc15d890af14d510fbd6f876395..0000000000000000000000000000000000000000 Binary files a/deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/img/glyphicons/glyphicons_266_book_open.png and /dev/null differ diff --git a/deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/img/grid-18px-masked.png b/deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/img/grid-18px-masked.png deleted file mode 100644 index 1bc82b03ab97f8173d664744abf93e831fe92a07..0000000000000000000000000000000000000000 Binary files a/deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/img/grid-18px-masked.png and /dev/null differ diff --git a/deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/img/icon-css3.png b/deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/img/icon-css3.png deleted file mode 100644 index 58e107235a8e805f20c87f28d58d9d0614c0b79f..0000000000000000000000000000000000000000 Binary files a/deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/img/icon-css3.png and /dev/null differ diff --git a/deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/img/icon-github.png b/deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/img/icon-github.png deleted file mode 100644 index 1a5fb781e46f35a545f636f6e1039cca61690a2f..0000000000000000000000000000000000000000 Binary files a/deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/img/icon-github.png and /dev/null differ diff --git a/deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/img/icon-html5.png b/deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/img/icon-html5.png deleted file mode 100644 index 1e8788313acfded4f571e27bfdf1a09973323af9..0000000000000000000000000000000000000000 Binary files a/deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/img/icon-html5.png and /dev/null differ diff --git a/deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/img/icon-twitter.png b/deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/img/icon-twitter.png deleted file mode 100644 index a4716545fa6ff394c3b56e52236870268cfb5bc1..0000000000000000000000000000000000000000 Binary files a/deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/img/icon-twitter.png and /dev/null differ diff --git a/deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/img/less-logo-large.png b/deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/img/less-logo-large.png deleted file mode 100644 index cb56637cbf644ede9beee81798343b7116a3480c..0000000000000000000000000000000000000000 Binary files a/deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/img/less-logo-large.png and /dev/null differ diff --git a/deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/img/less-small.png b/deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/img/less-small.png deleted file mode 100644 index 93ea597cb707b6c3f0d9c331459388fa8bdd0848..0000000000000000000000000000000000000000 Binary files a/deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/img/less-small.png and /dev/null differ diff --git a/deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/img/responsive-illustrations.png b/deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/img/responsive-illustrations.png deleted file mode 100644 index 6ca0f07888b8d7ee1a1691d2daa9030d5dae63c0..0000000000000000000000000000000000000000 Binary files a/deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/img/responsive-illustrations.png and /dev/null differ diff --git a/deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/js/README.md b/deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/js/README.md deleted file mode 100644 index b58fa1d40746d3300cba2f6fe703699b9ed00691..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/js/README.md +++ /dev/null @@ -1,106 +0,0 @@ -## 2.0 BOOTSTRAP JS PHILOSOPHY -These are the high-level design rules which guide the development of Bootstrap's plugin apis. - ---- - -### DATA-ATTRIBUTE API - -We believe you should be able to use all plugins provided by Bootstrap purely through the markup API without writing a single line of javascript. - -We acknowledge that this isn't always the most performant and sometimes it may be desirable to turn this functionality off altogether. Therefore, as of 2.0 we provide the ability to disable the data attribute API by unbinding all events on the body namespaced with `'data-api'`. This looks like this: - - $('body').off('.data-api') - -To target a specific plugin, just include the plugins name as a namespace along with the data-api namespace like this: - - $('body').off('.alert.data-api') - ---- - -### PROGRAMATIC API - -We also believe you should be able to use all plugins provided by Bootstrap purely through the JS API. - -All public APIs should be single, chainable methods, and return the collection acted upon. - - $(".btn.danger").button("toggle").addClass("fat") - -All methods should accept an optional options object, a string which targets a particular method, or null which initiates the default behavior: - - $("#myModal").modal() // initialized with defaults - $("#myModal").modal({ keyboard: false }) // initialized with now keyboard - $("#myModal").modal('show') // initializes and invokes show immediately afterqwe2 - ---- - -### OPTIONS - -Options should be sparse and add universal value. We should pick the right defaults. - -All plugins should have a default object which can be modified to effect all instance's default options. The defaults object should be available via `$.fn.plugin.defaults`. - - $.fn.modal.defaults = { … } - -An options definition should take the following form: - - *noun*: *adjective* - describes or modifies a quality of an instance - -examples: - - backdrop: true - keyboard: false - placement: 'top' - ---- - -### EVENTS - -All events should have an infinitive and past participle form. The infinitive is fired just before an action takes place, the past participle on completion of the action. - - show | shown - hide | hidden - ---- - -### CONSTRUCTORS - -Each plugin should expose it's raw constructor on a `Constructor` property -- accessed in the following way: - - - $.fn.popover.Constructor - ---- - -### DATA ACCESSOR - -Each plugin stores a copy of the invoked class on an object. This class instance can be accessed directly through jQuery's data API like this: - - $('[rel=popover]').data('popover') instanceof $.fn.popover.Constructor - ---- - -### DATA ATTRIBUTES - -Data attributes should take the following form: - -- data-{{verb}}={{plugin}} - defines main interaction -- data-target || href^=# - defined on "control" element (if element controls an element other than self) -- data-{{noun}} - defines class instance options - -examples: - - // control other targets - data-toggle="modal" data-target="#foo" - data-toggle="collapse" data-target="#foo" data-parent="#bar" - - // defined on element they control - data-spy="scroll" - - data-dismiss="modal" - data-dismiss="alert" - - data-toggle="dropdown" - - data-toggle="button" - data-toggle="buttons-checkbox" - data-toggle="buttons-radio" \ No newline at end of file diff --git a/deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/js/application.js b/deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/js/application.js deleted file mode 100644 index 6463b902fb1697ff916606b575aec8ff7bbb640f..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/js/application.js +++ /dev/null @@ -1,184 +0,0 @@ -// NOTICE!! DO NOT USE ANY OF THIS JAVASCRIPT -// IT'S ALL JUST JUNK FOR OUR DOCS! -// ++++++++++++++++++++++++++++++++++++++++++ - -!function ($) { - - $(function(){ - - // Disable certain links in docs - $('section [href^=#]').click(function (e) { - e.preventDefault() - }) - - // make code pretty - window.prettyPrint && prettyPrint() - - // add-ons - $('.add-on :checkbox').on('click', function () { - var $this = $(this) - , method = $this.attr('checked') ? 'addClass' : 'removeClass' - $(this).parents('.add-on')[method]('active') - }) - - // position static twipsies for components page - if ($(".twipsies a").length) { - $(window).on('load resize', function () { - $(".twipsies a").each(function () { - $(this) - .tooltip({ - placement: $(this).attr('title') - , trigger: 'manual' - }) - .tooltip('show') - }) - }) - } - - // add tipsies to grid for scaffolding - if ($('#grid-system').length) { - $('#grid-system').tooltip({ - selector: '.show-grid > div' - , title: function () { return $(this).width() + 'px' } - }) - } - - // fix sub nav on scroll - var $win = $(window) - , $nav = $('.subnav') - , navTop = $('.subnav').length && $('.subnav').offset().top - 40 - , isFixed = 0 - - processScroll() - - // hack sad times - holdover until rewrite for 2.1 - $nav.on('click', function () { - if (!isFixed) setTimeout(function () { $win.scrollTop($win.scrollTop() - 47) }, 10) - }) - - $win.on('scroll', processScroll) - - function processScroll() { - var i, scrollTop = $win.scrollTop() - if (scrollTop >= navTop && !isFixed) { - isFixed = 1 - $nav.addClass('subnav-fixed') - } else if (scrollTop <= navTop && isFixed) { - isFixed = 0 - $nav.removeClass('subnav-fixed') - } - } - - // tooltip demo - $('.tooltip-demo.well').tooltip({ - selector: "a[rel=tooltip]" - }) - - $('.tooltip-test').tooltip() - $('.popover-test').popover() - - // popover demo - $("a[rel=popover]") - .popover() - .click(function(e) { - e.preventDefault() - }) - - // button state demo - $('#fat-btn') - .click(function () { - var btn = $(this) - btn.button('loading') - setTimeout(function () { - btn.button('reset') - }, 3000) - }) - - // carousel demo - $('#myCarousel').carousel() - - // javascript build logic - var inputsComponent = $("#components.download input") - , inputsPlugin = $("#plugins.download input") - , inputsVariables = $("#variables.download input") - - // toggle all plugin checkboxes - $('#components.download .toggle-all').on('click', function (e) { - e.preventDefault() - inputsComponent.attr('checked', !inputsComponent.is(':checked')) - }) - - $('#plugins.download .toggle-all').on('click', function (e) { - e.preventDefault() - inputsPlugin.attr('checked', !inputsPlugin.is(':checked')) - }) - - $('#variables.download .toggle-all').on('click', function (e) { - e.preventDefault() - inputsVariables.val('') - }) - - // request built javascript - $('.download-btn').on('click', function () { - - var css = $("#components.download input:checked") - .map(function () { return this.value }) - .toArray() - , js = $("#plugins.download input:checked") - .map(function () { return this.value }) - .toArray() - , vars = {} - , img = ['glyphicons-halflings.png', 'glyphicons-halflings-white.png'] - - $("#variables.download input") - .each(function () { - $(this).val() && (vars[ $(this).prev().text() ] = $(this).val()) - }) - - $.ajax({ - type: 'POST' - , url: /\?dev/.test(window.location) ? 'http://localhost:3000' : 'http://bootstrap.herokuapp.com' - , dataType: 'jsonpi' - , params: { - js: js - , css: css - , vars: vars - , img: img - } - }) - }) - }) - -// Modified from the original jsonpi https://github.com/benvinegar/jquery-jsonpi -$.ajaxTransport('jsonpi', function(opts, originalOptions, jqXHR) { - var url = opts.url; - - return { - send: function(_, completeCallback) { - var name = 'jQuery_iframe_' + jQuery.now() - , iframe, form - - iframe = $('<iframe>') - .attr('name', name) - .appendTo('head') - - form = $('<form>') - .attr('method', opts.type) // GET or POST - .attr('action', url) - .attr('target', name) - - $.each(opts.params, function(k, v) { - - $('<input>') - .attr('type', 'hidden') - .attr('name', k) - .attr('value', typeof v == 'string' ? v : JSON.stringify(v)) - .appendTo(form) - }) - - form.appendTo('body').submit() - } - } -}) - -}(window.jQuery) \ No newline at end of file diff --git a/deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/js/bootstrap-alert.js b/deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/js/bootstrap-alert.js deleted file mode 100644 index 57890a9a281aa54d2e1a306bdaf3b793b476befa..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/js/bootstrap-alert.js +++ /dev/null @@ -1,90 +0,0 @@ -/* ========================================================== - * bootstrap-alert.js v2.0.4 - * http://twitter.github.com/bootstrap/javascript.html#alerts - * ========================================================== - * Copyright 2012 Twitter, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ========================================================== */ - - -!function ($) { - - "use strict"; // jshint ;_; - - - /* ALERT CLASS DEFINITION - * ====================== */ - - var dismiss = '[data-dismiss="alert"]' - , Alert = function (el) { - $(el).on('click', dismiss, this.close) - } - - Alert.prototype.close = function (e) { - var $this = $(this) - , selector = $this.attr('data-target') - , $parent - - if (!selector) { - selector = $this.attr('href') - selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') //strip for ie7 - } - - $parent = $(selector) - - e && e.preventDefault() - - $parent.length || ($parent = $this.hasClass('alert') ? $this : $this.parent()) - - $parent.trigger(e = $.Event('close')) - - if (e.isDefaultPrevented()) return - - $parent.removeClass('in') - - function removeElement() { - $parent - .trigger('closed') - .remove() - } - - $.support.transition && $parent.hasClass('fade') ? - $parent.on($.support.transition.end, removeElement) : - removeElement() - } - - - /* ALERT PLUGIN DEFINITION - * ======================= */ - - $.fn.alert = function (option) { - return this.each(function () { - var $this = $(this) - , data = $this.data('alert') - if (!data) $this.data('alert', (data = new Alert(this))) - if (typeof option == 'string') data[option].call($this) - }) - } - - $.fn.alert.Constructor = Alert - - - /* ALERT DATA-API - * ============== */ - - $(function () { - $('body').on('click.alert.data-api', dismiss, Alert.prototype.close) - }) - -}(window.jQuery); \ No newline at end of file diff --git a/deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/js/bootstrap-button.js b/deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/js/bootstrap-button.js deleted file mode 100644 index 7f187be6206f7aadbe4e87b00a2452e4e057f7bc..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/js/bootstrap-button.js +++ /dev/null @@ -1,96 +0,0 @@ -/* ============================================================ - * bootstrap-button.js v2.0.4 - * http://twitter.github.com/bootstrap/javascript.html#buttons - * ============================================================ - * Copyright 2012 Twitter, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============================================================ */ - - -!function ($) { - - "use strict"; // jshint ;_; - - - /* BUTTON PUBLIC CLASS DEFINITION - * ============================== */ - - var Button = function (element, options) { - this.$element = $(element) - this.options = $.extend({}, $.fn.button.defaults, options) - } - - Button.prototype.setState = function (state) { - var d = 'disabled' - , $el = this.$element - , data = $el.data() - , val = $el.is('input') ? 'val' : 'html' - - state = state + 'Text' - data.resetText || $el.data('resetText', $el[val]()) - - $el[val](data[state] || this.options[state]) - - // push to event loop to allow forms to submit - setTimeout(function () { - state == 'loadingText' ? - $el.addClass(d).attr(d, d) : - $el.removeClass(d).removeAttr(d) - }, 0) - } - - Button.prototype.toggle = function () { - var $parent = this.$element.parent('[data-toggle="buttons-radio"]') - - $parent && $parent - .find('.active') - .removeClass('active') - - this.$element.toggleClass('active') - } - - - /* BUTTON PLUGIN DEFINITION - * ======================== */ - - $.fn.button = function (option) { - return this.each(function () { - var $this = $(this) - , data = $this.data('button') - , options = typeof option == 'object' && option - if (!data) $this.data('button', (data = new Button(this, options))) - if (option == 'toggle') data.toggle() - else if (option) data.setState(option) - }) - } - - $.fn.button.defaults = { - loadingText: 'loading...' - } - - $.fn.button.Constructor = Button - - - /* BUTTON DATA-API - * =============== */ - - $(function () { - $('body').on('click.button.data-api', '[data-toggle^=button]', function ( e ) { - var $btn = $(e.target) - if (!$btn.hasClass('btn')) $btn = $btn.closest('.btn') - $btn.button('toggle') - }) - }) - -}(window.jQuery); \ No newline at end of file diff --git a/deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/js/bootstrap-carousel.js b/deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/js/bootstrap-carousel.js deleted file mode 100644 index 551de589112ff8b083f5f80ba323e58dd1c701ee..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/js/bootstrap-carousel.js +++ /dev/null @@ -1,169 +0,0 @@ -/* ========================================================== - * bootstrap-carousel.js v2.0.4 - * http://twitter.github.com/bootstrap/javascript.html#carousel - * ========================================================== - * Copyright 2012 Twitter, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ========================================================== */ - - -!function ($) { - - "use strict"; // jshint ;_; - - - /* CAROUSEL CLASS DEFINITION - * ========================= */ - - var Carousel = function (element, options) { - this.$element = $(element) - this.options = options - this.options.slide && this.slide(this.options.slide) - this.options.pause == 'hover' && this.$element - .on('mouseenter', $.proxy(this.pause, this)) - .on('mouseleave', $.proxy(this.cycle, this)) - } - - Carousel.prototype = { - - cycle: function (e) { - if (!e) this.paused = false - this.options.interval - && !this.paused - && (this.interval = setInterval($.proxy(this.next, this), this.options.interval)) - return this - } - - , to: function (pos) { - var $active = this.$element.find('.active') - , children = $active.parent().children() - , activePos = children.index($active) - , that = this - - if (pos > (children.length - 1) || pos < 0) return - - if (this.sliding) { - return this.$element.one('slid', function () { - that.to(pos) - }) - } - - if (activePos == pos) { - return this.pause().cycle() - } - - return this.slide(pos > activePos ? 'next' : 'prev', $(children[pos])) - } - - , pause: function (e) { - if (!e) this.paused = true - clearInterval(this.interval) - this.interval = null - return this - } - - , next: function () { - if (this.sliding) return - return this.slide('next') - } - - , prev: function () { - if (this.sliding) return - return this.slide('prev') - } - - , slide: function (type, next) { - var $active = this.$element.find('.active') - , $next = next || $active[type]() - , isCycling = this.interval - , direction = type == 'next' ? 'left' : 'right' - , fallback = type == 'next' ? 'first' : 'last' - , that = this - , e = $.Event('slide') - - this.sliding = true - - isCycling && this.pause() - - $next = $next.length ? $next : this.$element.find('.item')[fallback]() - - if ($next.hasClass('active')) return - - if ($.support.transition && this.$element.hasClass('slide')) { - this.$element.trigger(e) - if (e.isDefaultPrevented()) return - $next.addClass(type) - $next[0].offsetWidth // force reflow - $active.addClass(direction) - $next.addClass(direction) - this.$element.one($.support.transition.end, function () { - $next.removeClass([type, direction].join(' ')).addClass('active') - $active.removeClass(['active', direction].join(' ')) - that.sliding = false - setTimeout(function () { that.$element.trigger('slid') }, 0) - }) - } else { - this.$element.trigger(e) - if (e.isDefaultPrevented()) return - $active.removeClass('active') - $next.addClass('active') - this.sliding = false - this.$element.trigger('slid') - } - - isCycling && this.cycle() - - return this - } - - } - - - /* CAROUSEL PLUGIN DEFINITION - * ========================== */ - - $.fn.carousel = function (option) { - return this.each(function () { - var $this = $(this) - , data = $this.data('carousel') - , options = $.extend({}, $.fn.carousel.defaults, typeof option == 'object' && option) - if (!data) $this.data('carousel', (data = new Carousel(this, options))) - if (typeof option == 'number') data.to(option) - else if (typeof option == 'string' || (option = options.slide)) data[option]() - else if (options.interval) data.cycle() - }) - } - - $.fn.carousel.defaults = { - interval: 5000 - , pause: 'hover' - } - - $.fn.carousel.Constructor = Carousel - - - /* CAROUSEL DATA-API - * ================= */ - - $(function () { - $('body').on('click.carousel.data-api', '[data-slide]', function ( e ) { - var $this = $(this), href - , $target = $($this.attr('data-target') || (href = $this.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '')) //strip for ie7 - , options = !$target.data('modal') && $.extend({}, $target.data(), $this.data()) - $target.carousel(options) - e.preventDefault() - }) - }) - -}(window.jQuery); \ No newline at end of file diff --git a/deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/js/bootstrap-collapse.js b/deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/js/bootstrap-collapse.js deleted file mode 100644 index fbc915b9f96f485889a3cd5b4c9f42d866fa1898..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/js/bootstrap-collapse.js +++ /dev/null @@ -1,157 +0,0 @@ -/* ============================================================= - * bootstrap-collapse.js v2.0.4 - * http://twitter.github.com/bootstrap/javascript.html#collapse - * ============================================================= - * Copyright 2012 Twitter, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============================================================ */ - - -!function ($) { - - "use strict"; // jshint ;_; - - - /* COLLAPSE PUBLIC CLASS DEFINITION - * ================================ */ - - var Collapse = function (element, options) { - this.$element = $(element) - this.options = $.extend({}, $.fn.collapse.defaults, options) - - if (this.options.parent) { - this.$parent = $(this.options.parent) - } - - this.options.toggle && this.toggle() - } - - Collapse.prototype = { - - constructor: Collapse - - , dimension: function () { - var hasWidth = this.$element.hasClass('width') - return hasWidth ? 'width' : 'height' - } - - , show: function () { - var dimension - , scroll - , actives - , hasData - - if (this.transitioning) return - - dimension = this.dimension() - scroll = $.camelCase(['scroll', dimension].join('-')) - actives = this.$parent && this.$parent.find('> .accordion-group > .in') - - if (actives && actives.length) { - hasData = actives.data('collapse') - if (hasData && hasData.transitioning) return - actives.collapse('hide') - hasData || actives.data('collapse', null) - } - - this.$element[dimension](0) - this.transition('addClass', $.Event('show'), 'shown') - this.$element[dimension](this.$element[0][scroll]) - } - - , hide: function () { - var dimension - if (this.transitioning) return - dimension = this.dimension() - this.reset(this.$element[dimension]()) - this.transition('removeClass', $.Event('hide'), 'hidden') - this.$element[dimension](0) - } - - , reset: function (size) { - var dimension = this.dimension() - - this.$element - .removeClass('collapse') - [dimension](size || 'auto') - [0].offsetWidth - - this.$element[size !== null ? 'addClass' : 'removeClass']('collapse') - - return this - } - - , transition: function (method, startEvent, completeEvent) { - var that = this - , complete = function () { - if (startEvent.type == 'show') that.reset() - that.transitioning = 0 - that.$element.trigger(completeEvent) - } - - this.$element.trigger(startEvent) - - if (startEvent.isDefaultPrevented()) return - - this.transitioning = 1 - - this.$element[method]('in') - - $.support.transition && this.$element.hasClass('collapse') ? - this.$element.one($.support.transition.end, complete) : - complete() - } - - , toggle: function () { - this[this.$element.hasClass('in') ? 'hide' : 'show']() - } - - } - - - /* COLLAPSIBLE PLUGIN DEFINITION - * ============================== */ - - $.fn.collapse = function (option) { - return this.each(function () { - var $this = $(this) - , data = $this.data('collapse') - , options = typeof option == 'object' && option - if (!data) $this.data('collapse', (data = new Collapse(this, options))) - if (typeof option == 'string') data[option]() - }) - } - - $.fn.collapse.defaults = { - toggle: true - } - - $.fn.collapse.Constructor = Collapse - - - /* COLLAPSIBLE DATA-API - * ==================== */ - - $(function () { - $('body').on('click.collapse.data-api', '[data-toggle=collapse]', function ( e ) { - var $this = $(this), href - , target = $this.attr('data-target') - || e.preventDefault() - || (href = $this.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '') //strip for ie7 - , option = $(target).data('collapse') ? 'toggle' : $this.data() - $(target).collapse(option) - }) - }) - -}(window.jQuery); \ No newline at end of file diff --git a/deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/js/bootstrap-dropdown.js b/deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/js/bootstrap-dropdown.js deleted file mode 100644 index 454a9684b5273b2aa83e32585aad8327a69231c2..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/js/bootstrap-dropdown.js +++ /dev/null @@ -1,100 +0,0 @@ -/* ============================================================ - * bootstrap-dropdown.js v2.0.4 - * http://twitter.github.com/bootstrap/javascript.html#dropdowns - * ============================================================ - * Copyright 2012 Twitter, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============================================================ */ - - -!function ($) { - - "use strict"; // jshint ;_; - - - /* DROPDOWN CLASS DEFINITION - * ========================= */ - - var toggle = '[data-toggle="dropdown"]' - , Dropdown = function (element) { - var $el = $(element).on('click.dropdown.data-api', this.toggle) - $('html').on('click.dropdown.data-api', function () { - $el.parent().removeClass('open') - }) - } - - Dropdown.prototype = { - - constructor: Dropdown - - , toggle: function (e) { - var $this = $(this) - , $parent - , selector - , isActive - - if ($this.is('.disabled, :disabled')) return - - selector = $this.attr('data-target') - - if (!selector) { - selector = $this.attr('href') - selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') //strip for ie7 - } - - $parent = $(selector) - $parent.length || ($parent = $this.parent()) - - isActive = $parent.hasClass('open') - - clearMenus() - - if (!isActive) $parent.toggleClass('open') - - return false - } - - } - - function clearMenus() { - $(toggle).parent().removeClass('open') - } - - - /* DROPDOWN PLUGIN DEFINITION - * ========================== */ - - $.fn.dropdown = function (option) { - return this.each(function () { - var $this = $(this) - , data = $this.data('dropdown') - if (!data) $this.data('dropdown', (data = new Dropdown(this))) - if (typeof option == 'string') data[option].call($this) - }) - } - - $.fn.dropdown.Constructor = Dropdown - - - /* APPLY TO STANDARD DROPDOWN ELEMENTS - * =================================== */ - - $(function () { - $('html').on('click.dropdown.data-api', clearMenus) - $('body') - .on('click.dropdown', '.dropdown form', function (e) { e.stopPropagation() }) - .on('click.dropdown.data-api', toggle, Dropdown.prototype.toggle) - }) - -}(window.jQuery); \ No newline at end of file diff --git a/deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/js/bootstrap-modal.js b/deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/js/bootstrap-modal.js deleted file mode 100644 index 38fd0c8468ce8a2031f1ec40e3fec0e1bf1b0e55..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/js/bootstrap-modal.js +++ /dev/null @@ -1,218 +0,0 @@ -/* ========================================================= - * bootstrap-modal.js v2.0.4 - * http://twitter.github.com/bootstrap/javascript.html#modals - * ========================================================= - * Copyright 2012 Twitter, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ========================================================= */ - - -!function ($) { - - "use strict"; // jshint ;_; - - - /* MODAL CLASS DEFINITION - * ====================== */ - - var Modal = function (content, options) { - this.options = options - this.$element = $(content) - .delegate('[data-dismiss="modal"]', 'click.dismiss.modal', $.proxy(this.hide, this)) - } - - Modal.prototype = { - - constructor: Modal - - , toggle: function () { - return this[!this.isShown ? 'show' : 'hide']() - } - - , show: function () { - var that = this - , e = $.Event('show') - - this.$element.trigger(e) - - if (this.isShown || e.isDefaultPrevented()) return - - $('body').addClass('modal-open') - - this.isShown = true - - escape.call(this) - backdrop.call(this, function () { - var transition = $.support.transition && that.$element.hasClass('fade') - - if (!that.$element.parent().length) { - that.$element.appendTo(document.body) //don't move modals dom position - } - - that.$element - .show() - - if (transition) { - that.$element[0].offsetWidth // force reflow - } - - that.$element.addClass('in') - - transition ? - that.$element.one($.support.transition.end, function () { that.$element.trigger('shown') }) : - that.$element.trigger('shown') - - }) - } - - , hide: function (e) { - e && e.preventDefault() - - var that = this - - e = $.Event('hide') - - this.$element.trigger(e) - - if (!this.isShown || e.isDefaultPrevented()) return - - this.isShown = false - - $('body').removeClass('modal-open') - - escape.call(this) - - this.$element.removeClass('in') - - $.support.transition && this.$element.hasClass('fade') ? - hideWithTransition.call(this) : - hideModal.call(this) - } - - } - - - /* MODAL PRIVATE METHODS - * ===================== */ - - function hideWithTransition() { - var that = this - , timeout = setTimeout(function () { - that.$element.off($.support.transition.end) - hideModal.call(that) - }, 500) - - this.$element.one($.support.transition.end, function () { - clearTimeout(timeout) - hideModal.call(that) - }) - } - - function hideModal(that) { - this.$element - .hide() - .trigger('hidden') - - backdrop.call(this) - } - - function backdrop(callback) { - var that = this - , animate = this.$element.hasClass('fade') ? 'fade' : '' - - if (this.isShown && this.options.backdrop) { - var doAnimate = $.support.transition && animate - - this.$backdrop = $('<div class="modal-backdrop ' + animate + '" />') - .appendTo(document.body) - - if (this.options.backdrop != 'static') { - this.$backdrop.click($.proxy(this.hide, this)) - } - - if (doAnimate) this.$backdrop[0].offsetWidth // force reflow - - this.$backdrop.addClass('in') - - doAnimate ? - this.$backdrop.one($.support.transition.end, callback) : - callback() - - } else if (!this.isShown && this.$backdrop) { - this.$backdrop.removeClass('in') - - $.support.transition && this.$element.hasClass('fade')? - this.$backdrop.one($.support.transition.end, $.proxy(removeBackdrop, this)) : - removeBackdrop.call(this) - - } else if (callback) { - callback() - } - } - - function removeBackdrop() { - this.$backdrop.remove() - this.$backdrop = null - } - - function escape() { - var that = this - if (this.isShown && this.options.keyboard) { - $(document).on('keyup.dismiss.modal', function ( e ) { - e.which == 27 && that.hide() - }) - } else if (!this.isShown) { - $(document).off('keyup.dismiss.modal') - } - } - - - /* MODAL PLUGIN DEFINITION - * ======================= */ - - $.fn.modal = function (option) { - return this.each(function () { - var $this = $(this) - , data = $this.data('modal') - , options = $.extend({}, $.fn.modal.defaults, $this.data(), typeof option == 'object' && option) - if (!data) $this.data('modal', (data = new Modal(this, options))) - if (typeof option == 'string') data[option]() - else if (options.show) data.show() - }) - } - - $.fn.modal.defaults = { - backdrop: true - , keyboard: true - , show: true - } - - $.fn.modal.Constructor = Modal - - - /* MODAL DATA-API - * ============== */ - - $(function () { - $('body').on('click.modal.data-api', '[data-toggle="modal"]', function ( e ) { - var $this = $(this), href - , $target = $($this.attr('data-target') || (href = $this.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '')) //strip for ie7 - , option = $target.data('modal') ? 'toggle' : $.extend({}, $target.data(), $this.data()) - - e.preventDefault() - $target.modal(option) - }) - }) - -}(window.jQuery); \ No newline at end of file diff --git a/deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/js/bootstrap-popover.js b/deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/js/bootstrap-popover.js deleted file mode 100644 index 39fbe358eb3256e62401e2403735907fbe3f7a75..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/js/bootstrap-popover.js +++ /dev/null @@ -1,98 +0,0 @@ -/* =========================================================== - * bootstrap-popover.js v2.0.4 - * http://twitter.github.com/bootstrap/javascript.html#popovers - * =========================================================== - * Copyright 2012 Twitter, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * =========================================================== */ - - -!function ($) { - - "use strict"; // jshint ;_; - - - /* POPOVER PUBLIC CLASS DEFINITION - * =============================== */ - - var Popover = function ( element, options ) { - this.init('popover', element, options) - } - - - /* NOTE: POPOVER EXTENDS BOOTSTRAP-TOOLTIP.js - ========================================== */ - - Popover.prototype = $.extend({}, $.fn.tooltip.Constructor.prototype, { - - constructor: Popover - - , setContent: function () { - var $tip = this.tip() - , title = this.getTitle() - , content = this.getContent() - - $tip.find('.popover-title')[this.isHTML(title) ? 'html' : 'text'](title) - $tip.find('.popover-content > *')[this.isHTML(content) ? 'html' : 'text'](content) - - $tip.removeClass('fade top bottom left right in') - } - - , hasContent: function () { - return this.getTitle() || this.getContent() - } - - , getContent: function () { - var content - , $e = this.$element - , o = this.options - - content = $e.attr('data-content') - || (typeof o.content == 'function' ? o.content.call($e[0]) : o.content) - - return content - } - - , tip: function () { - if (!this.$tip) { - this.$tip = $(this.options.template) - } - return this.$tip - } - - }) - - - /* POPOVER PLUGIN DEFINITION - * ======================= */ - - $.fn.popover = function (option) { - return this.each(function () { - var $this = $(this) - , data = $this.data('popover') - , options = typeof option == 'object' && option - if (!data) $this.data('popover', (data = new Popover(this, options))) - if (typeof option == 'string') data[option]() - }) - } - - $.fn.popover.Constructor = Popover - - $.fn.popover.defaults = $.extend({} , $.fn.tooltip.defaults, { - placement: 'right' - , content: '' - , template: '<div class="popover"><div class="arrow"></div><div class="popover-inner"><h3 class="popover-title"></h3><div class="popover-content"><p></p></div></div></div>' - }) - -}(window.jQuery); \ No newline at end of file diff --git a/deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/js/bootstrap-scrollspy.js b/deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/js/bootstrap-scrollspy.js deleted file mode 100644 index dce37181267d7d38f9ac1eba70f81dc2f775e21b..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/js/bootstrap-scrollspy.js +++ /dev/null @@ -1,151 +0,0 @@ -/* ============================================================= - * bootstrap-scrollspy.js v2.0.4 - * http://twitter.github.com/bootstrap/javascript.html#scrollspy - * ============================================================= - * Copyright 2012 Twitter, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============================================================== */ - - -!function ($) { - - "use strict"; // jshint ;_; - - - /* SCROLLSPY CLASS DEFINITION - * ========================== */ - - function ScrollSpy( element, options) { - var process = $.proxy(this.process, this) - , $element = $(element).is('body') ? $(window) : $(element) - , href - this.options = $.extend({}, $.fn.scrollspy.defaults, options) - this.$scrollElement = $element.on('scroll.scroll.data-api', process) - this.selector = (this.options.target - || ((href = $(element).attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '')) //strip for ie7 - || '') + ' .nav li > a' - this.$body = $('body') - this.refresh() - this.process() - } - - ScrollSpy.prototype = { - - constructor: ScrollSpy - - , refresh: function () { - var self = this - , $targets - - this.offsets = $([]) - this.targets = $([]) - - $targets = this.$body - .find(this.selector) - .map(function () { - var $el = $(this) - , href = $el.data('target') || $el.attr('href') - , $href = /^#\w/.test(href) && $(href) - return ( $href - && href.length - && [[ $href.position().top, href ]] ) || null - }) - .sort(function (a, b) { return a[0] - b[0] }) - .each(function () { - self.offsets.push(this[0]) - self.targets.push(this[1]) - }) - } - - , process: function () { - var scrollTop = this.$scrollElement.scrollTop() + this.options.offset - , scrollHeight = this.$scrollElement[0].scrollHeight || this.$body[0].scrollHeight - , maxScroll = scrollHeight - this.$scrollElement.height() - , offsets = this.offsets - , targets = this.targets - , activeTarget = this.activeTarget - , i - - if (scrollTop >= maxScroll) { - return activeTarget != (i = targets.last()[0]) - && this.activate ( i ) - } - - for (i = offsets.length; i--;) { - activeTarget != targets[i] - && scrollTop >= offsets[i] - && (!offsets[i + 1] || scrollTop <= offsets[i + 1]) - && this.activate( targets[i] ) - } - } - - , activate: function (target) { - var active - , selector - - this.activeTarget = target - - $(this.selector) - .parent('.active') - .removeClass('active') - - selector = this.selector - + '[data-target="' + target + '"],' - + this.selector + '[href="' + target + '"]' - - active = $(selector) - .parent('li') - .addClass('active') - - if (active.parent('.dropdown-menu')) { - active = active.closest('li.dropdown').addClass('active') - } - - active.trigger('activate') - } - - } - - - /* SCROLLSPY PLUGIN DEFINITION - * =========================== */ - - $.fn.scrollspy = function ( option ) { - return this.each(function () { - var $this = $(this) - , data = $this.data('scrollspy') - , options = typeof option == 'object' && option - if (!data) $this.data('scrollspy', (data = new ScrollSpy(this, options))) - if (typeof option == 'string') data[option]() - }) - } - - $.fn.scrollspy.Constructor = ScrollSpy - - $.fn.scrollspy.defaults = { - offset: 10 - } - - - /* SCROLLSPY DATA-API - * ================== */ - - $(function () { - $('[data-spy="scroll"]').each(function () { - var $spy = $(this) - $spy.scrollspy($spy.data()) - }) - }) - -}(window.jQuery); \ No newline at end of file diff --git a/deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/js/bootstrap-tab.js b/deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/js/bootstrap-tab.js deleted file mode 100644 index d87f35099aef8414b4e86055798f55be23508862..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/js/bootstrap-tab.js +++ /dev/null @@ -1,135 +0,0 @@ -/* ======================================================== - * bootstrap-tab.js v2.0.4 - * http://twitter.github.com/bootstrap/javascript.html#tabs - * ======================================================== - * Copyright 2012 Twitter, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ======================================================== */ - - -!function ($) { - - "use strict"; // jshint ;_; - - - /* TAB CLASS DEFINITION - * ==================== */ - - var Tab = function ( element ) { - this.element = $(element) - } - - Tab.prototype = { - - constructor: Tab - - , show: function () { - var $this = this.element - , $ul = $this.closest('ul:not(.dropdown-menu)') - , selector = $this.attr('data-target') - , previous - , $target - , e - - if (!selector) { - selector = $this.attr('href') - selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') //strip for ie7 - } - - if ( $this.parent('li').hasClass('active') ) return - - previous = $ul.find('.active a').last()[0] - - e = $.Event('show', { - relatedTarget: previous - }) - - $this.trigger(e) - - if (e.isDefaultPrevented()) return - - $target = $(selector) - - this.activate($this.parent('li'), $ul) - this.activate($target, $target.parent(), function () { - $this.trigger({ - type: 'shown' - , relatedTarget: previous - }) - }) - } - - , activate: function ( element, container, callback) { - var $active = container.find('> .active') - , transition = callback - && $.support.transition - && $active.hasClass('fade') - - function next() { - $active - .removeClass('active') - .find('> .dropdown-menu > .active') - .removeClass('active') - - element.addClass('active') - - if (transition) { - element[0].offsetWidth // reflow for transition - element.addClass('in') - } else { - element.removeClass('fade') - } - - if ( element.parent('.dropdown-menu') ) { - element.closest('li.dropdown').addClass('active') - } - - callback && callback() - } - - transition ? - $active.one($.support.transition.end, next) : - next() - - $active.removeClass('in') - } - } - - - /* TAB PLUGIN DEFINITION - * ===================== */ - - $.fn.tab = function ( option ) { - return this.each(function () { - var $this = $(this) - , data = $this.data('tab') - if (!data) $this.data('tab', (data = new Tab(this))) - if (typeof option == 'string') data[option]() - }) - } - - $.fn.tab.Constructor = Tab - - - /* TAB DATA-API - * ============ */ - - $(function () { - $('body').on('click.tab.data-api', '[data-toggle="tab"], [data-toggle="pill"]', function (e) { - e.preventDefault() - $(this).tab('show') - }) - }) - -}(window.jQuery); \ No newline at end of file diff --git a/deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/js/bootstrap-tooltip.js b/deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/js/bootstrap-tooltip.js deleted file mode 100644 index b476f1c4e6dc90f42745881e8929415faf420ad0..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/js/bootstrap-tooltip.js +++ /dev/null @@ -1,275 +0,0 @@ -/* =========================================================== - * bootstrap-tooltip.js v2.0.4 - * http://twitter.github.com/bootstrap/javascript.html#tooltips - * Inspired by the original jQuery.tipsy by Jason Frame - * =========================================================== - * Copyright 2012 Twitter, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ========================================================== */ - - -!function ($) { - - "use strict"; // jshint ;_; - - - /* TOOLTIP PUBLIC CLASS DEFINITION - * =============================== */ - - var Tooltip = function (element, options) { - this.init('tooltip', element, options) - } - - Tooltip.prototype = { - - constructor: Tooltip - - , init: function (type, element, options) { - var eventIn - , eventOut - - this.type = type - this.$element = $(element) - this.options = this.getOptions(options) - this.enabled = true - - if (this.options.trigger != 'manual') { - eventIn = this.options.trigger == 'hover' ? 'mouseenter' : 'focus' - eventOut = this.options.trigger == 'hover' ? 'mouseleave' : 'blur' - this.$element.on(eventIn, this.options.selector, $.proxy(this.enter, this)) - this.$element.on(eventOut, this.options.selector, $.proxy(this.leave, this)) - } - - this.options.selector ? - (this._options = $.extend({}, this.options, { trigger: 'manual', selector: '' })) : - this.fixTitle() - } - - , getOptions: function (options) { - options = $.extend({}, $.fn[this.type].defaults, options, this.$element.data()) - - if (options.delay && typeof options.delay == 'number') { - options.delay = { - show: options.delay - , hide: options.delay - } - } - - return options - } - - , enter: function (e) { - var self = $(e.currentTarget)[this.type](this._options).data(this.type) - - if (!self.options.delay || !self.options.delay.show) return self.show() - - clearTimeout(this.timeout) - self.hoverState = 'in' - this.timeout = setTimeout(function() { - if (self.hoverState == 'in') self.show() - }, self.options.delay.show) - } - - , leave: function (e) { - var self = $(e.currentTarget)[this.type](this._options).data(this.type) - - if (this.timeout) clearTimeout(this.timeout) - if (!self.options.delay || !self.options.delay.hide) return self.hide() - - self.hoverState = 'out' - this.timeout = setTimeout(function() { - if (self.hoverState == 'out') self.hide() - }, self.options.delay.hide) - } - - , show: function () { - var $tip - , inside - , pos - , actualWidth - , actualHeight - , placement - , tp - - if (this.hasContent() && this.enabled) { - $tip = this.tip() - this.setContent() - - if (this.options.animation) { - $tip.addClass('fade') - } - - placement = typeof this.options.placement == 'function' ? - this.options.placement.call(this, $tip[0], this.$element[0]) : - this.options.placement - - inside = /in/.test(placement) - - $tip - .remove() - .css({ top: 0, left: 0, display: 'block' }) - .appendTo(inside ? this.$element : document.body) - - pos = this.getPosition(inside) - - actualWidth = $tip[0].offsetWidth - actualHeight = $tip[0].offsetHeight - - switch (inside ? placement.split(' ')[1] : placement) { - case 'bottom': - tp = {top: pos.top + pos.height, left: pos.left + pos.width / 2 - actualWidth / 2} - break - case 'top': - tp = {top: pos.top - actualHeight, left: pos.left + pos.width / 2 - actualWidth / 2} - break - case 'left': - tp = {top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left - actualWidth} - break - case 'right': - tp = {top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left + pos.width} - break - } - - $tip - .css(tp) - .addClass(placement) - .addClass('in') - } - } - - , isHTML: function(text) { - // html string detection logic adapted from jQuery - return typeof text != 'string' - || ( text.charAt(0) === "<" - && text.charAt( text.length - 1 ) === ">" - && text.length >= 3 - ) || /^(?:[^<]*<[\w\W]+>[^>]*$)/.exec(text) - } - - , setContent: function () { - var $tip = this.tip() - , title = this.getTitle() - - $tip.find('.tooltip-inner')[this.isHTML(title) ? 'html' : 'text'](title) - $tip.removeClass('fade in top bottom left right') - } - - , hide: function () { - var that = this - , $tip = this.tip() - - $tip.removeClass('in') - - function removeWithAnimation() { - var timeout = setTimeout(function () { - $tip.off($.support.transition.end).remove() - }, 500) - - $tip.one($.support.transition.end, function () { - clearTimeout(timeout) - $tip.remove() - }) - } - - $.support.transition && this.$tip.hasClass('fade') ? - removeWithAnimation() : - $tip.remove() - } - - , fixTitle: function () { - var $e = this.$element - if ($e.attr('title') || typeof($e.attr('data-original-title')) != 'string') { - $e.attr('data-original-title', $e.attr('title') || '').removeAttr('title') - } - } - - , hasContent: function () { - return this.getTitle() - } - - , getPosition: function (inside) { - return $.extend({}, (inside ? {top: 0, left: 0} : this.$element.offset()), { - width: this.$element[0].offsetWidth - , height: this.$element[0].offsetHeight - }) - } - - , getTitle: function () { - var title - , $e = this.$element - , o = this.options - - title = $e.attr('data-original-title') - || (typeof o.title == 'function' ? o.title.call($e[0]) : o.title) - - return title - } - - , tip: function () { - return this.$tip = this.$tip || $(this.options.template) - } - - , validate: function () { - if (!this.$element[0].parentNode) { - this.hide() - this.$element = null - this.options = null - } - } - - , enable: function () { - this.enabled = true - } - - , disable: function () { - this.enabled = false - } - - , toggleEnabled: function () { - this.enabled = !this.enabled - } - - , toggle: function () { - this[this.tip().hasClass('in') ? 'hide' : 'show']() - } - - } - - - /* TOOLTIP PLUGIN DEFINITION - * ========================= */ - - $.fn.tooltip = function ( option ) { - return this.each(function () { - var $this = $(this) - , data = $this.data('tooltip') - , options = typeof option == 'object' && option - if (!data) $this.data('tooltip', (data = new Tooltip(this, options))) - if (typeof option == 'string') data[option]() - }) - } - - $.fn.tooltip.Constructor = Tooltip - - $.fn.tooltip.defaults = { - animation: true - , placement: 'top' - , selector: false - , template: '<div class="tooltip"><div class="tooltip-arrow"></div><div class="tooltip-inner"></div></div>' - , trigger: 'hover' - , title: '' - , delay: 0 - } - -}(window.jQuery); diff --git a/deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/js/bootstrap-transition.js b/deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/js/bootstrap-transition.js deleted file mode 100644 index 534182622d017e9aa5d2b5d962efe56643adb0a4..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/js/bootstrap-transition.js +++ /dev/null @@ -1,61 +0,0 @@ -/* =================================================== - * bootstrap-transition.js v2.0.4 - * http://twitter.github.com/bootstrap/javascript.html#transitions - * =================================================== - * Copyright 2012 Twitter, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ========================================================== */ - - -!function ($) { - - $(function () { - - "use strict"; // jshint ;_; - - - /* CSS TRANSITION SUPPORT (http://www.modernizr.com/) - * ======================================================= */ - - $.support.transition = (function () { - - var transitionEnd = (function () { - - var el = document.createElement('bootstrap') - , transEndEventNames = { - 'WebkitTransition' : 'webkitTransitionEnd' - , 'MozTransition' : 'transitionend' - , 'OTransition' : 'oTransitionEnd' - , 'msTransition' : 'MSTransitionEnd' - , 'transition' : 'transitionend' - } - , name - - for (name in transEndEventNames){ - if (el.style[name] !== undefined) { - return transEndEventNames[name] - } - } - - }()) - - return transitionEnd && { - end: transitionEnd - } - - })() - - }) - -}(window.jQuery); \ No newline at end of file diff --git a/deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/js/bootstrap-typeahead.js b/deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/js/bootstrap-typeahead.js deleted file mode 100644 index ad44b90852d5f7472186388254c8c7a48f4ef98b..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/js/bootstrap-typeahead.js +++ /dev/null @@ -1,285 +0,0 @@ -/* ============================================================= - * bootstrap-typeahead.js v2.0.4 - * http://twitter.github.com/bootstrap/javascript.html#typeahead - * ============================================================= - * Copyright 2012 Twitter, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============================================================ */ - - -!function($){ - - "use strict"; // jshint ;_; - - - /* TYPEAHEAD PUBLIC CLASS DEFINITION - * ================================= */ - - var Typeahead = function (element, options) { - this.$element = $(element) - this.options = $.extend({}, $.fn.typeahead.defaults, options) - this.matcher = this.options.matcher || this.matcher - this.sorter = this.options.sorter || this.sorter - this.highlighter = this.options.highlighter || this.highlighter - this.updater = this.options.updater || this.updater - this.$menu = $(this.options.menu).appendTo('body') - this.source = this.options.source - this.shown = false - this.listen() - } - - Typeahead.prototype = { - - constructor: Typeahead - - , select: function () { - var val = this.$menu.find('.active').attr('data-value') - this.$element - .val(this.updater(val)) - .change() - return this.hide() - } - - , updater: function (item) { - return item - } - - , show: function () { - var pos = $.extend({}, this.$element.offset(), { - height: this.$element[0].offsetHeight - }) - - this.$menu.css({ - top: pos.top + pos.height - , left: pos.left - }) - - this.$menu.show() - this.shown = true - return this - } - - , hide: function () { - this.$menu.hide() - this.shown = false - return this - } - - , lookup: function (event) { - var that = this - , items - , q - - this.query = this.$element.val() - - if (!this.query) { - return this.shown ? this.hide() : this - } - - items = $.grep(this.source, function (item) { - return that.matcher(item) - }) - - items = this.sorter(items) - - if (!items.length) { - return this.shown ? this.hide() : this - } - - return this.render(items.slice(0, this.options.items)).show() - } - - , matcher: function (item) { - return ~item.toLowerCase().indexOf(this.query.toLowerCase()) - } - - , sorter: function (items) { - var beginswith = [] - , caseSensitive = [] - , caseInsensitive = [] - , item - - while (item = items.shift()) { - if (!item.toLowerCase().indexOf(this.query.toLowerCase())) beginswith.push(item) - else if (~item.indexOf(this.query)) caseSensitive.push(item) - else caseInsensitive.push(item) - } - - return beginswith.concat(caseSensitive, caseInsensitive) - } - - , highlighter: function (item) { - var query = this.query.replace(/[\-\[\]{}()*+?.,\\\^$|#\s]/g, '\\$&') - return item.replace(new RegExp('(' + query + ')', 'ig'), function ($1, match) { - return '<strong>' + match + '</strong>' - }) - } - - , render: function (items) { - var that = this - - items = $(items).map(function (i, item) { - i = $(that.options.item).attr('data-value', item) - i.find('a').html(that.highlighter(item)) - return i[0] - }) - - items.first().addClass('active') - this.$menu.html(items) - return this - } - - , next: function (event) { - var active = this.$menu.find('.active').removeClass('active') - , next = active.next() - - if (!next.length) { - next = $(this.$menu.find('li')[0]) - } - - next.addClass('active') - } - - , prev: function (event) { - var active = this.$menu.find('.active').removeClass('active') - , prev = active.prev() - - if (!prev.length) { - prev = this.$menu.find('li').last() - } - - prev.addClass('active') - } - - , listen: function () { - this.$element - .on('blur', $.proxy(this.blur, this)) - .on('keypress', $.proxy(this.keypress, this)) - .on('keyup', $.proxy(this.keyup, this)) - - if ($.browser.webkit || $.browser.msie) { - this.$element.on('keydown', $.proxy(this.keypress, this)) - } - - this.$menu - .on('click', $.proxy(this.click, this)) - .on('mouseenter', 'li', $.proxy(this.mouseenter, this)) - } - - , keyup: function (e) { - switch(e.keyCode) { - case 40: // down arrow - case 38: // up arrow - break - - case 9: // tab - case 13: // enter - if (!this.shown) return - this.select() - break - - case 27: // escape - if (!this.shown) return - this.hide() - break - - default: - this.lookup() - } - - e.stopPropagation() - e.preventDefault() - } - - , keypress: function (e) { - if (!this.shown) return - - switch(e.keyCode) { - case 9: // tab - case 13: // enter - case 27: // escape - e.preventDefault() - break - - case 38: // up arrow - if (e.type != 'keydown') break - e.preventDefault() - this.prev() - break - - case 40: // down arrow - if (e.type != 'keydown') break - e.preventDefault() - this.next() - break - } - - e.stopPropagation() - } - - , blur: function (e) { - var that = this - setTimeout(function () { that.hide() }, 150) - } - - , click: function (e) { - e.stopPropagation() - e.preventDefault() - this.select() - } - - , mouseenter: function (e) { - this.$menu.find('.active').removeClass('active') - $(e.currentTarget).addClass('active') - } - - } - - - /* TYPEAHEAD PLUGIN DEFINITION - * =========================== */ - - $.fn.typeahead = function (option) { - return this.each(function () { - var $this = $(this) - , data = $this.data('typeahead') - , options = typeof option == 'object' && option - if (!data) $this.data('typeahead', (data = new Typeahead(this, options))) - if (typeof option == 'string') data[option]() - }) - } - - $.fn.typeahead.defaults = { - source: [] - , items: 8 - , menu: '<ul class="typeahead dropdown-menu"></ul>' - , item: '<li><a href="#"></a></li>' - } - - $.fn.typeahead.Constructor = Typeahead - - - /* TYPEAHEAD DATA-API - * ================== */ - - $(function () { - $('body').on('focus.typeahead.data-api', '[data-provide="typeahead"]', function (e) { - var $this = $(this) - if ($this.data('typeahead')) return - e.preventDefault() - $this.typeahead($this.data()) - }) - }) - -}(window.jQuery); \ No newline at end of file diff --git a/deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/js/bootstrap.js b/deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/js/bootstrap.js deleted file mode 100644 index 5d6e65b82499fd4caa965cb7b8feb2edb6e2cd0a..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/js/bootstrap.js +++ /dev/null @@ -1,1825 +0,0 @@ -/* =================================================== - * bootstrap-transition.js v2.0.4 - * http://twitter.github.com/bootstrap/javascript.html#transitions - * =================================================== - * Copyright 2012 Twitter, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ========================================================== */ - - -!function ($) { - - $(function () { - - "use strict"; // jshint ;_; - - - /* CSS TRANSITION SUPPORT (http://www.modernizr.com/) - * ======================================================= */ - - $.support.transition = (function () { - - var transitionEnd = (function () { - - var el = document.createElement('bootstrap') - , transEndEventNames = { - 'WebkitTransition' : 'webkitTransitionEnd' - , 'MozTransition' : 'transitionend' - , 'OTransition' : 'oTransitionEnd' - , 'msTransition' : 'MSTransitionEnd' - , 'transition' : 'transitionend' - } - , name - - for (name in transEndEventNames){ - if (el.style[name] !== undefined) { - return transEndEventNames[name] - } - } - - }()) - - return transitionEnd && { - end: transitionEnd - } - - })() - - }) - -}(window.jQuery);/* ========================================================== - * bootstrap-alert.js v2.0.4 - * http://twitter.github.com/bootstrap/javascript.html#alerts - * ========================================================== - * Copyright 2012 Twitter, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ========================================================== */ - - -!function ($) { - - "use strict"; // jshint ;_; - - - /* ALERT CLASS DEFINITION - * ====================== */ - - var dismiss = '[data-dismiss="alert"]' - , Alert = function (el) { - $(el).on('click', dismiss, this.close) - } - - Alert.prototype.close = function (e) { - var $this = $(this) - , selector = $this.attr('data-target') - , $parent - - if (!selector) { - selector = $this.attr('href') - selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') //strip for ie7 - } - - $parent = $(selector) - - e && e.preventDefault() - - $parent.length || ($parent = $this.hasClass('alert') ? $this : $this.parent()) - - $parent.trigger(e = $.Event('close')) - - if (e.isDefaultPrevented()) return - - $parent.removeClass('in') - - function removeElement() { - $parent - .trigger('closed') - .remove() - } - - $.support.transition && $parent.hasClass('fade') ? - $parent.on($.support.transition.end, removeElement) : - removeElement() - } - - - /* ALERT PLUGIN DEFINITION - * ======================= */ - - $.fn.alert = function (option) { - return this.each(function () { - var $this = $(this) - , data = $this.data('alert') - if (!data) $this.data('alert', (data = new Alert(this))) - if (typeof option == 'string') data[option].call($this) - }) - } - - $.fn.alert.Constructor = Alert - - - /* ALERT DATA-API - * ============== */ - - $(function () { - $('body').on('click.alert.data-api', dismiss, Alert.prototype.close) - }) - -}(window.jQuery);/* ============================================================ - * bootstrap-button.js v2.0.4 - * http://twitter.github.com/bootstrap/javascript.html#buttons - * ============================================================ - * Copyright 2012 Twitter, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============================================================ */ - - -!function ($) { - - "use strict"; // jshint ;_; - - - /* BUTTON PUBLIC CLASS DEFINITION - * ============================== */ - - var Button = function (element, options) { - this.$element = $(element) - this.options = $.extend({}, $.fn.button.defaults, options) - } - - Button.prototype.setState = function (state) { - var d = 'disabled' - , $el = this.$element - , data = $el.data() - , val = $el.is('input') ? 'val' : 'html' - - state = state + 'Text' - data.resetText || $el.data('resetText', $el[val]()) - - $el[val](data[state] || this.options[state]) - - // push to event loop to allow forms to submit - setTimeout(function () { - state == 'loadingText' ? - $el.addClass(d).attr(d, d) : - $el.removeClass(d).removeAttr(d) - }, 0) - } - - Button.prototype.toggle = function () { - var $parent = this.$element.parent('[data-toggle="buttons-radio"]') - - $parent && $parent - .find('.active') - .removeClass('active') - - this.$element.toggleClass('active') - } - - - /* BUTTON PLUGIN DEFINITION - * ======================== */ - - $.fn.button = function (option) { - return this.each(function () { - var $this = $(this) - , data = $this.data('button') - , options = typeof option == 'object' && option - if (!data) $this.data('button', (data = new Button(this, options))) - if (option == 'toggle') data.toggle() - else if (option) data.setState(option) - }) - } - - $.fn.button.defaults = { - loadingText: 'loading...' - } - - $.fn.button.Constructor = Button - - - /* BUTTON DATA-API - * =============== */ - - $(function () { - $('body').on('click.button.data-api', '[data-toggle^=button]', function ( e ) { - var $btn = $(e.target) - if (!$btn.hasClass('btn')) $btn = $btn.closest('.btn') - $btn.button('toggle') - }) - }) - -}(window.jQuery);/* ========================================================== - * bootstrap-carousel.js v2.0.4 - * http://twitter.github.com/bootstrap/javascript.html#carousel - * ========================================================== - * Copyright 2012 Twitter, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ========================================================== */ - - -!function ($) { - - "use strict"; // jshint ;_; - - - /* CAROUSEL CLASS DEFINITION - * ========================= */ - - var Carousel = function (element, options) { - this.$element = $(element) - this.options = options - this.options.slide && this.slide(this.options.slide) - this.options.pause == 'hover' && this.$element - .on('mouseenter', $.proxy(this.pause, this)) - .on('mouseleave', $.proxy(this.cycle, this)) - } - - Carousel.prototype = { - - cycle: function (e) { - if (!e) this.paused = false - this.options.interval - && !this.paused - && (this.interval = setInterval($.proxy(this.next, this), this.options.interval)) - return this - } - - , to: function (pos) { - var $active = this.$element.find('.active') - , children = $active.parent().children() - , activePos = children.index($active) - , that = this - - if (pos > (children.length - 1) || pos < 0) return - - if (this.sliding) { - return this.$element.one('slid', function () { - that.to(pos) - }) - } - - if (activePos == pos) { - return this.pause().cycle() - } - - return this.slide(pos > activePos ? 'next' : 'prev', $(children[pos])) - } - - , pause: function (e) { - if (!e) this.paused = true - clearInterval(this.interval) - this.interval = null - return this - } - - , next: function () { - if (this.sliding) return - return this.slide('next') - } - - , prev: function () { - if (this.sliding) return - return this.slide('prev') - } - - , slide: function (type, next) { - var $active = this.$element.find('.active') - , $next = next || $active[type]() - , isCycling = this.interval - , direction = type == 'next' ? 'left' : 'right' - , fallback = type == 'next' ? 'first' : 'last' - , that = this - , e = $.Event('slide') - - this.sliding = true - - isCycling && this.pause() - - $next = $next.length ? $next : this.$element.find('.item')[fallback]() - - if ($next.hasClass('active')) return - - if ($.support.transition && this.$element.hasClass('slide')) { - this.$element.trigger(e) - if (e.isDefaultPrevented()) return - $next.addClass(type) - $next[0].offsetWidth // force reflow - $active.addClass(direction) - $next.addClass(direction) - this.$element.one($.support.transition.end, function () { - $next.removeClass([type, direction].join(' ')).addClass('active') - $active.removeClass(['active', direction].join(' ')) - that.sliding = false - setTimeout(function () { that.$element.trigger('slid') }, 0) - }) - } else { - this.$element.trigger(e) - if (e.isDefaultPrevented()) return - $active.removeClass('active') - $next.addClass('active') - this.sliding = false - this.$element.trigger('slid') - } - - isCycling && this.cycle() - - return this - } - - } - - - /* CAROUSEL PLUGIN DEFINITION - * ========================== */ - - $.fn.carousel = function (option) { - return this.each(function () { - var $this = $(this) - , data = $this.data('carousel') - , options = $.extend({}, $.fn.carousel.defaults, typeof option == 'object' && option) - if (!data) $this.data('carousel', (data = new Carousel(this, options))) - if (typeof option == 'number') data.to(option) - else if (typeof option == 'string' || (option = options.slide)) data[option]() - else if (options.interval) data.cycle() - }) - } - - $.fn.carousel.defaults = { - interval: 5000 - , pause: 'hover' - } - - $.fn.carousel.Constructor = Carousel - - - /* CAROUSEL DATA-API - * ================= */ - - $(function () { - $('body').on('click.carousel.data-api', '[data-slide]', function ( e ) { - var $this = $(this), href - , $target = $($this.attr('data-target') || (href = $this.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '')) //strip for ie7 - , options = !$target.data('modal') && $.extend({}, $target.data(), $this.data()) - $target.carousel(options) - e.preventDefault() - }) - }) - -}(window.jQuery);/* ============================================================= - * bootstrap-collapse.js v2.0.4 - * http://twitter.github.com/bootstrap/javascript.html#collapse - * ============================================================= - * Copyright 2012 Twitter, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============================================================ */ - - -!function ($) { - - "use strict"; // jshint ;_; - - - /* COLLAPSE PUBLIC CLASS DEFINITION - * ================================ */ - - var Collapse = function (element, options) { - this.$element = $(element) - this.options = $.extend({}, $.fn.collapse.defaults, options) - - if (this.options.parent) { - this.$parent = $(this.options.parent) - } - - this.options.toggle && this.toggle() - } - - Collapse.prototype = { - - constructor: Collapse - - , dimension: function () { - var hasWidth = this.$element.hasClass('width') - return hasWidth ? 'width' : 'height' - } - - , show: function () { - var dimension - , scroll - , actives - , hasData - - if (this.transitioning) return - - dimension = this.dimension() - scroll = $.camelCase(['scroll', dimension].join('-')) - actives = this.$parent && this.$parent.find('> .accordion-group > .in') - - if (actives && actives.length) { - hasData = actives.data('collapse') - if (hasData && hasData.transitioning) return - actives.collapse('hide') - hasData || actives.data('collapse', null) - } - - this.$element[dimension](0) - this.transition('addClass', $.Event('show'), 'shown') - this.$element[dimension](this.$element[0][scroll]) - } - - , hide: function () { - var dimension - if (this.transitioning) return - dimension = this.dimension() - this.reset(this.$element[dimension]()) - this.transition('removeClass', $.Event('hide'), 'hidden') - this.$element[dimension](0) - } - - , reset: function (size) { - var dimension = this.dimension() - - this.$element - .removeClass('collapse') - [dimension](size || 'auto') - [0].offsetWidth - - this.$element[size !== null ? 'addClass' : 'removeClass']('collapse') - - return this - } - - , transition: function (method, startEvent, completeEvent) { - var that = this - , complete = function () { - if (startEvent.type == 'show') that.reset() - that.transitioning = 0 - that.$element.trigger(completeEvent) - } - - this.$element.trigger(startEvent) - - if (startEvent.isDefaultPrevented()) return - - this.transitioning = 1 - - this.$element[method]('in') - - $.support.transition && this.$element.hasClass('collapse') ? - this.$element.one($.support.transition.end, complete) : - complete() - } - - , toggle: function () { - this[this.$element.hasClass('in') ? 'hide' : 'show']() - } - - } - - - /* COLLAPSIBLE PLUGIN DEFINITION - * ============================== */ - - $.fn.collapse = function (option) { - return this.each(function () { - var $this = $(this) - , data = $this.data('collapse') - , options = typeof option == 'object' && option - if (!data) $this.data('collapse', (data = new Collapse(this, options))) - if (typeof option == 'string') data[option]() - }) - } - - $.fn.collapse.defaults = { - toggle: true - } - - $.fn.collapse.Constructor = Collapse - - - /* COLLAPSIBLE DATA-API - * ==================== */ - - $(function () { - $('body').on('click.collapse.data-api', '[data-toggle=collapse]', function ( e ) { - var $this = $(this), href - , target = $this.attr('data-target') - || e.preventDefault() - || (href = $this.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '') //strip for ie7 - , option = $(target).data('collapse') ? 'toggle' : $this.data() - $(target).collapse(option) - }) - }) - -}(window.jQuery);/* ============================================================ - * bootstrap-dropdown.js v2.0.4 - * http://twitter.github.com/bootstrap/javascript.html#dropdowns - * ============================================================ - * Copyright 2012 Twitter, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============================================================ */ - - -!function ($) { - - "use strict"; // jshint ;_; - - - /* DROPDOWN CLASS DEFINITION - * ========================= */ - - var toggle = '[data-toggle="dropdown"]' - , Dropdown = function (element) { - var $el = $(element).on('click.dropdown.data-api', this.toggle) - $('html').on('click.dropdown.data-api', function () { - $el.parent().removeClass('open') - }) - } - - Dropdown.prototype = { - - constructor: Dropdown - - , toggle: function (e) { - var $this = $(this) - , $parent - , selector - , isActive - - if ($this.is('.disabled, :disabled')) return - - selector = $this.attr('data-target') - - if (!selector) { - selector = $this.attr('href') - selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') //strip for ie7 - } - - $parent = $(selector) - $parent.length || ($parent = $this.parent()) - - isActive = $parent.hasClass('open') - - clearMenus() - - if (!isActive) $parent.toggleClass('open') - - return false - } - - } - - function clearMenus() { - $(toggle).parent().removeClass('open') - } - - - /* DROPDOWN PLUGIN DEFINITION - * ========================== */ - - $.fn.dropdown = function (option) { - return this.each(function () { - var $this = $(this) - , data = $this.data('dropdown') - if (!data) $this.data('dropdown', (data = new Dropdown(this))) - if (typeof option == 'string') data[option].call($this) - }) - } - - $.fn.dropdown.Constructor = Dropdown - - - /* APPLY TO STANDARD DROPDOWN ELEMENTS - * =================================== */ - - $(function () { - $('html').on('click.dropdown.data-api', clearMenus) - $('body') - .on('click.dropdown', '.dropdown form', function (e) { e.stopPropagation() }) - .on('click.dropdown.data-api', toggle, Dropdown.prototype.toggle) - }) - -}(window.jQuery);/* ========================================================= - * bootstrap-modal.js v2.0.4 - * http://twitter.github.com/bootstrap/javascript.html#modals - * ========================================================= - * Copyright 2012 Twitter, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ========================================================= */ - - -!function ($) { - - "use strict"; // jshint ;_; - - - /* MODAL CLASS DEFINITION - * ====================== */ - - var Modal = function (content, options) { - this.options = options - this.$element = $(content) - .delegate('[data-dismiss="modal"]', 'click.dismiss.modal', $.proxy(this.hide, this)) - } - - Modal.prototype = { - - constructor: Modal - - , toggle: function () { - return this[!this.isShown ? 'show' : 'hide']() - } - - , show: function () { - var that = this - , e = $.Event('show') - - this.$element.trigger(e) - - if (this.isShown || e.isDefaultPrevented()) return - - $('body').addClass('modal-open') - - this.isShown = true - - escape.call(this) - backdrop.call(this, function () { - var transition = $.support.transition && that.$element.hasClass('fade') - - if (!that.$element.parent().length) { - that.$element.appendTo(document.body) //don't move modals dom position - } - - that.$element - .show() - - if (transition) { - that.$element[0].offsetWidth // force reflow - } - - that.$element.addClass('in') - - transition ? - that.$element.one($.support.transition.end, function () { that.$element.trigger('shown') }) : - that.$element.trigger('shown') - - }) - } - - , hide: function (e) { - e && e.preventDefault() - - var that = this - - e = $.Event('hide') - - this.$element.trigger(e) - - if (!this.isShown || e.isDefaultPrevented()) return - - this.isShown = false - - $('body').removeClass('modal-open') - - escape.call(this) - - this.$element.removeClass('in') - - $.support.transition && this.$element.hasClass('fade') ? - hideWithTransition.call(this) : - hideModal.call(this) - } - - } - - - /* MODAL PRIVATE METHODS - * ===================== */ - - function hideWithTransition() { - var that = this - , timeout = setTimeout(function () { - that.$element.off($.support.transition.end) - hideModal.call(that) - }, 500) - - this.$element.one($.support.transition.end, function () { - clearTimeout(timeout) - hideModal.call(that) - }) - } - - function hideModal(that) { - this.$element - .hide() - .trigger('hidden') - - backdrop.call(this) - } - - function backdrop(callback) { - var that = this - , animate = this.$element.hasClass('fade') ? 'fade' : '' - - if (this.isShown && this.options.backdrop) { - var doAnimate = $.support.transition && animate - - this.$backdrop = $('<div class="modal-backdrop ' + animate + '" />') - .appendTo(document.body) - - if (this.options.backdrop != 'static') { - this.$backdrop.click($.proxy(this.hide, this)) - } - - if (doAnimate) this.$backdrop[0].offsetWidth // force reflow - - this.$backdrop.addClass('in') - - doAnimate ? - this.$backdrop.one($.support.transition.end, callback) : - callback() - - } else if (!this.isShown && this.$backdrop) { - this.$backdrop.removeClass('in') - - $.support.transition && this.$element.hasClass('fade')? - this.$backdrop.one($.support.transition.end, $.proxy(removeBackdrop, this)) : - removeBackdrop.call(this) - - } else if (callback) { - callback() - } - } - - function removeBackdrop() { - this.$backdrop.remove() - this.$backdrop = null - } - - function escape() { - var that = this - if (this.isShown && this.options.keyboard) { - $(document).on('keyup.dismiss.modal', function ( e ) { - e.which == 27 && that.hide() - }) - } else if (!this.isShown) { - $(document).off('keyup.dismiss.modal') - } - } - - - /* MODAL PLUGIN DEFINITION - * ======================= */ - - $.fn.modal = function (option) { - return this.each(function () { - var $this = $(this) - , data = $this.data('modal') - , options = $.extend({}, $.fn.modal.defaults, $this.data(), typeof option == 'object' && option) - if (!data) $this.data('modal', (data = new Modal(this, options))) - if (typeof option == 'string') data[option]() - else if (options.show) data.show() - }) - } - - $.fn.modal.defaults = { - backdrop: true - , keyboard: true - , show: true - } - - $.fn.modal.Constructor = Modal - - - /* MODAL DATA-API - * ============== */ - - $(function () { - $('body').on('click.modal.data-api', '[data-toggle="modal"]', function ( e ) { - var $this = $(this), href - , $target = $($this.attr('data-target') || (href = $this.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '')) //strip for ie7 - , option = $target.data('modal') ? 'toggle' : $.extend({}, $target.data(), $this.data()) - - e.preventDefault() - $target.modal(option) - }) - }) - -}(window.jQuery);/* =========================================================== - * bootstrap-tooltip.js v2.0.4 - * http://twitter.github.com/bootstrap/javascript.html#tooltips - * Inspired by the original jQuery.tipsy by Jason Frame - * =========================================================== - * Copyright 2012 Twitter, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ========================================================== */ - - -!function ($) { - - "use strict"; // jshint ;_; - - - /* TOOLTIP PUBLIC CLASS DEFINITION - * =============================== */ - - var Tooltip = function (element, options) { - this.init('tooltip', element, options) - } - - Tooltip.prototype = { - - constructor: Tooltip - - , init: function (type, element, options) { - var eventIn - , eventOut - - this.type = type - this.$element = $(element) - this.options = this.getOptions(options) - this.enabled = true - - if (this.options.trigger != 'manual') { - eventIn = this.options.trigger == 'hover' ? 'mouseenter' : 'focus' - eventOut = this.options.trigger == 'hover' ? 'mouseleave' : 'blur' - this.$element.on(eventIn, this.options.selector, $.proxy(this.enter, this)) - this.$element.on(eventOut, this.options.selector, $.proxy(this.leave, this)) - } - - this.options.selector ? - (this._options = $.extend({}, this.options, { trigger: 'manual', selector: '' })) : - this.fixTitle() - } - - , getOptions: function (options) { - options = $.extend({}, $.fn[this.type].defaults, options, this.$element.data()) - - if (options.delay && typeof options.delay == 'number') { - options.delay = { - show: options.delay - , hide: options.delay - } - } - - return options - } - - , enter: function (e) { - var self = $(e.currentTarget)[this.type](this._options).data(this.type) - - if (!self.options.delay || !self.options.delay.show) return self.show() - - clearTimeout(this.timeout) - self.hoverState = 'in' - this.timeout = setTimeout(function() { - if (self.hoverState == 'in') self.show() - }, self.options.delay.show) - } - - , leave: function (e) { - var self = $(e.currentTarget)[this.type](this._options).data(this.type) - - if (this.timeout) clearTimeout(this.timeout) - if (!self.options.delay || !self.options.delay.hide) return self.hide() - - self.hoverState = 'out' - this.timeout = setTimeout(function() { - if (self.hoverState == 'out') self.hide() - }, self.options.delay.hide) - } - - , show: function () { - var $tip - , inside - , pos - , actualWidth - , actualHeight - , placement - , tp - - if (this.hasContent() && this.enabled) { - $tip = this.tip() - this.setContent() - - if (this.options.animation) { - $tip.addClass('fade') - } - - placement = typeof this.options.placement == 'function' ? - this.options.placement.call(this, $tip[0], this.$element[0]) : - this.options.placement - - inside = /in/.test(placement) - - $tip - .remove() - .css({ top: 0, left: 0, display: 'block' }) - .appendTo(inside ? this.$element : document.body) - - pos = this.getPosition(inside) - - actualWidth = $tip[0].offsetWidth - actualHeight = $tip[0].offsetHeight - - switch (inside ? placement.split(' ')[1] : placement) { - case 'bottom': - tp = {top: pos.top + pos.height, left: pos.left + pos.width / 2 - actualWidth / 2} - break - case 'top': - tp = {top: pos.top - actualHeight, left: pos.left + pos.width / 2 - actualWidth / 2} - break - case 'left': - tp = {top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left - actualWidth} - break - case 'right': - tp = {top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left + pos.width} - break - } - - $tip - .css(tp) - .addClass(placement) - .addClass('in') - } - } - - , isHTML: function(text) { - // html string detection logic adapted from jQuery - return typeof text != 'string' - || ( text.charAt(0) === "<" - && text.charAt( text.length - 1 ) === ">" - && text.length >= 3 - ) || /^(?:[^<]*<[\w\W]+>[^>]*$)/.exec(text) - } - - , setContent: function () { - var $tip = this.tip() - , title = this.getTitle() - - $tip.find('.tooltip-inner')[this.isHTML(title) ? 'html' : 'text'](title) - $tip.removeClass('fade in top bottom left right') - } - - , hide: function () { - var that = this - , $tip = this.tip() - - $tip.removeClass('in') - - function removeWithAnimation() { - var timeout = setTimeout(function () { - $tip.off($.support.transition.end).remove() - }, 500) - - $tip.one($.support.transition.end, function () { - clearTimeout(timeout) - $tip.remove() - }) - } - - $.support.transition && this.$tip.hasClass('fade') ? - removeWithAnimation() : - $tip.remove() - } - - , fixTitle: function () { - var $e = this.$element - if ($e.attr('title') || typeof($e.attr('data-original-title')) != 'string') { - $e.attr('data-original-title', $e.attr('title') || '').removeAttr('title') - } - } - - , hasContent: function () { - return this.getTitle() - } - - , getPosition: function (inside) { - return $.extend({}, (inside ? {top: 0, left: 0} : this.$element.offset()), { - width: this.$element[0].offsetWidth - , height: this.$element[0].offsetHeight - }) - } - - , getTitle: function () { - var title - , $e = this.$element - , o = this.options - - title = $e.attr('data-original-title') - || (typeof o.title == 'function' ? o.title.call($e[0]) : o.title) - - return title - } - - , tip: function () { - return this.$tip = this.$tip || $(this.options.template) - } - - , validate: function () { - if (!this.$element[0].parentNode) { - this.hide() - this.$element = null - this.options = null - } - } - - , enable: function () { - this.enabled = true - } - - , disable: function () { - this.enabled = false - } - - , toggleEnabled: function () { - this.enabled = !this.enabled - } - - , toggle: function () { - this[this.tip().hasClass('in') ? 'hide' : 'show']() - } - - } - - - /* TOOLTIP PLUGIN DEFINITION - * ========================= */ - - $.fn.tooltip = function ( option ) { - return this.each(function () { - var $this = $(this) - , data = $this.data('tooltip') - , options = typeof option == 'object' && option - if (!data) $this.data('tooltip', (data = new Tooltip(this, options))) - if (typeof option == 'string') data[option]() - }) - } - - $.fn.tooltip.Constructor = Tooltip - - $.fn.tooltip.defaults = { - animation: true - , placement: 'top' - , selector: false - , template: '<div class="tooltip"><div class="tooltip-arrow"></div><div class="tooltip-inner"></div></div>' - , trigger: 'hover' - , title: '' - , delay: 0 - } - -}(window.jQuery); -/* =========================================================== - * bootstrap-popover.js v2.0.4 - * http://twitter.github.com/bootstrap/javascript.html#popovers - * =========================================================== - * Copyright 2012 Twitter, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * =========================================================== */ - - -!function ($) { - - "use strict"; // jshint ;_; - - - /* POPOVER PUBLIC CLASS DEFINITION - * =============================== */ - - var Popover = function ( element, options ) { - this.init('popover', element, options) - } - - - /* NOTE: POPOVER EXTENDS BOOTSTRAP-TOOLTIP.js - ========================================== */ - - Popover.prototype = $.extend({}, $.fn.tooltip.Constructor.prototype, { - - constructor: Popover - - , setContent: function () { - var $tip = this.tip() - , title = this.getTitle() - , content = this.getContent() - - $tip.find('.popover-title')[this.isHTML(title) ? 'html' : 'text'](title) - $tip.find('.popover-content > *')[this.isHTML(content) ? 'html' : 'text'](content) - - $tip.removeClass('fade top bottom left right in') - } - - , hasContent: function () { - return this.getTitle() || this.getContent() - } - - , getContent: function () { - var content - , $e = this.$element - , o = this.options - - content = $e.attr('data-content') - || (typeof o.content == 'function' ? o.content.call($e[0]) : o.content) - - return content - } - - , tip: function () { - if (!this.$tip) { - this.$tip = $(this.options.template) - } - return this.$tip - } - - }) - - - /* POPOVER PLUGIN DEFINITION - * ======================= */ - - $.fn.popover = function (option) { - return this.each(function () { - var $this = $(this) - , data = $this.data('popover') - , options = typeof option == 'object' && option - if (!data) $this.data('popover', (data = new Popover(this, options))) - if (typeof option == 'string') data[option]() - }) - } - - $.fn.popover.Constructor = Popover - - $.fn.popover.defaults = $.extend({} , $.fn.tooltip.defaults, { - placement: 'right' - , content: '' - , template: '<div class="popover"><div class="arrow"></div><div class="popover-inner"><h3 class="popover-title"></h3><div class="popover-content"><p></p></div></div></div>' - }) - -}(window.jQuery);/* ============================================================= - * bootstrap-scrollspy.js v2.0.4 - * http://twitter.github.com/bootstrap/javascript.html#scrollspy - * ============================================================= - * Copyright 2012 Twitter, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============================================================== */ - - -!function ($) { - - "use strict"; // jshint ;_; - - - /* SCROLLSPY CLASS DEFINITION - * ========================== */ - - function ScrollSpy( element, options) { - var process = $.proxy(this.process, this) - , $element = $(element).is('body') ? $(window) : $(element) - , href - this.options = $.extend({}, $.fn.scrollspy.defaults, options) - this.$scrollElement = $element.on('scroll.scroll.data-api', process) - this.selector = (this.options.target - || ((href = $(element).attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '')) //strip for ie7 - || '') + ' .nav li > a' - this.$body = $('body') - this.refresh() - this.process() - } - - ScrollSpy.prototype = { - - constructor: ScrollSpy - - , refresh: function () { - var self = this - , $targets - - this.offsets = $([]) - this.targets = $([]) - - $targets = this.$body - .find(this.selector) - .map(function () { - var $el = $(this) - , href = $el.data('target') || $el.attr('href') - , $href = /^#\w/.test(href) && $(href) - return ( $href - && href.length - && [[ $href.position().top, href ]] ) || null - }) - .sort(function (a, b) { return a[0] - b[0] }) - .each(function () { - self.offsets.push(this[0]) - self.targets.push(this[1]) - }) - } - - , process: function () { - var scrollTop = this.$scrollElement.scrollTop() + this.options.offset - , scrollHeight = this.$scrollElement[0].scrollHeight || this.$body[0].scrollHeight - , maxScroll = scrollHeight - this.$scrollElement.height() - , offsets = this.offsets - , targets = this.targets - , activeTarget = this.activeTarget - , i - - if (scrollTop >= maxScroll) { - return activeTarget != (i = targets.last()[0]) - && this.activate ( i ) - } - - for (i = offsets.length; i--;) { - activeTarget != targets[i] - && scrollTop >= offsets[i] - && (!offsets[i + 1] || scrollTop <= offsets[i + 1]) - && this.activate( targets[i] ) - } - } - - , activate: function (target) { - var active - , selector - - this.activeTarget = target - - $(this.selector) - .parent('.active') - .removeClass('active') - - selector = this.selector - + '[data-target="' + target + '"],' - + this.selector + '[href="' + target + '"]' - - active = $(selector) - .parent('li') - .addClass('active') - - if (active.parent('.dropdown-menu')) { - active = active.closest('li.dropdown').addClass('active') - } - - active.trigger('activate') - } - - } - - - /* SCROLLSPY PLUGIN DEFINITION - * =========================== */ - - $.fn.scrollspy = function ( option ) { - return this.each(function () { - var $this = $(this) - , data = $this.data('scrollspy') - , options = typeof option == 'object' && option - if (!data) $this.data('scrollspy', (data = new ScrollSpy(this, options))) - if (typeof option == 'string') data[option]() - }) - } - - $.fn.scrollspy.Constructor = ScrollSpy - - $.fn.scrollspy.defaults = { - offset: 10 - } - - - /* SCROLLSPY DATA-API - * ================== */ - - $(function () { - $('[data-spy="scroll"]').each(function () { - var $spy = $(this) - $spy.scrollspy($spy.data()) - }) - }) - -}(window.jQuery);/* ======================================================== - * bootstrap-tab.js v2.0.4 - * http://twitter.github.com/bootstrap/javascript.html#tabs - * ======================================================== - * Copyright 2012 Twitter, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ======================================================== */ - - -!function ($) { - - "use strict"; // jshint ;_; - - - /* TAB CLASS DEFINITION - * ==================== */ - - var Tab = function ( element ) { - this.element = $(element) - } - - Tab.prototype = { - - constructor: Tab - - , show: function () { - var $this = this.element - , $ul = $this.closest('ul:not(.dropdown-menu)') - , selector = $this.attr('data-target') - , previous - , $target - , e - - if (!selector) { - selector = $this.attr('href') - selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') //strip for ie7 - } - - if ( $this.parent('li').hasClass('active') ) return - - previous = $ul.find('.active a').last()[0] - - e = $.Event('show', { - relatedTarget: previous - }) - - $this.trigger(e) - - if (e.isDefaultPrevented()) return - - $target = $(selector) - - this.activate($this.parent('li'), $ul) - this.activate($target, $target.parent(), function () { - $this.trigger({ - type: 'shown' - , relatedTarget: previous - }) - }) - } - - , activate: function ( element, container, callback) { - var $active = container.find('> .active') - , transition = callback - && $.support.transition - && $active.hasClass('fade') - - function next() { - $active - .removeClass('active') - .find('> .dropdown-menu > .active') - .removeClass('active') - - element.addClass('active') - - if (transition) { - element[0].offsetWidth // reflow for transition - element.addClass('in') - } else { - element.removeClass('fade') - } - - if ( element.parent('.dropdown-menu') ) { - element.closest('li.dropdown').addClass('active') - } - - callback && callback() - } - - transition ? - $active.one($.support.transition.end, next) : - next() - - $active.removeClass('in') - } - } - - - /* TAB PLUGIN DEFINITION - * ===================== */ - - $.fn.tab = function ( option ) { - return this.each(function () { - var $this = $(this) - , data = $this.data('tab') - if (!data) $this.data('tab', (data = new Tab(this))) - if (typeof option == 'string') data[option]() - }) - } - - $.fn.tab.Constructor = Tab - - - /* TAB DATA-API - * ============ */ - - $(function () { - $('body').on('click.tab.data-api', '[data-toggle="tab"], [data-toggle="pill"]', function (e) { - e.preventDefault() - $(this).tab('show') - }) - }) - -}(window.jQuery);/* ============================================================= - * bootstrap-typeahead.js v2.0.4 - * http://twitter.github.com/bootstrap/javascript.html#typeahead - * ============================================================= - * Copyright 2012 Twitter, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============================================================ */ - - -!function($){ - - "use strict"; // jshint ;_; - - - /* TYPEAHEAD PUBLIC CLASS DEFINITION - * ================================= */ - - var Typeahead = function (element, options) { - this.$element = $(element) - this.options = $.extend({}, $.fn.typeahead.defaults, options) - this.matcher = this.options.matcher || this.matcher - this.sorter = this.options.sorter || this.sorter - this.highlighter = this.options.highlighter || this.highlighter - this.updater = this.options.updater || this.updater - this.$menu = $(this.options.menu).appendTo('body') - this.source = this.options.source - this.shown = false - this.listen() - } - - Typeahead.prototype = { - - constructor: Typeahead - - , select: function () { - var val = this.$menu.find('.active').attr('data-value') - this.$element - .val(this.updater(val)) - .change() - return this.hide() - } - - , updater: function (item) { - return item - } - - , show: function () { - var pos = $.extend({}, this.$element.offset(), { - height: this.$element[0].offsetHeight - }) - - this.$menu.css({ - top: pos.top + pos.height - , left: pos.left - }) - - this.$menu.show() - this.shown = true - return this - } - - , hide: function () { - this.$menu.hide() - this.shown = false - return this - } - - , lookup: function (event) { - var that = this - , items - , q - - this.query = this.$element.val() - - if (!this.query) { - return this.shown ? this.hide() : this - } - - items = $.grep(this.source, function (item) { - return that.matcher(item) - }) - - items = this.sorter(items) - - if (!items.length) { - return this.shown ? this.hide() : this - } - - return this.render(items.slice(0, this.options.items)).show() - } - - , matcher: function (item) { - return ~item.toLowerCase().indexOf(this.query.toLowerCase()) - } - - , sorter: function (items) { - var beginswith = [] - , caseSensitive = [] - , caseInsensitive = [] - , item - - while (item = items.shift()) { - if (!item.toLowerCase().indexOf(this.query.toLowerCase())) beginswith.push(item) - else if (~item.indexOf(this.query)) caseSensitive.push(item) - else caseInsensitive.push(item) - } - - return beginswith.concat(caseSensitive, caseInsensitive) - } - - , highlighter: function (item) { - var query = this.query.replace(/[\-\[\]{}()*+?.,\\\^$|#\s]/g, '\\$&') - return item.replace(new RegExp('(' + query + ')', 'ig'), function ($1, match) { - return '<strong>' + match + '</strong>' - }) - } - - , render: function (items) { - var that = this - - items = $(items).map(function (i, item) { - i = $(that.options.item).attr('data-value', item) - i.find('a').html(that.highlighter(item)) - return i[0] - }) - - items.first().addClass('active') - this.$menu.html(items) - return this - } - - , next: function (event) { - var active = this.$menu.find('.active').removeClass('active') - , next = active.next() - - if (!next.length) { - next = $(this.$menu.find('li')[0]) - } - - next.addClass('active') - } - - , prev: function (event) { - var active = this.$menu.find('.active').removeClass('active') - , prev = active.prev() - - if (!prev.length) { - prev = this.$menu.find('li').last() - } - - prev.addClass('active') - } - - , listen: function () { - this.$element - .on('blur', $.proxy(this.blur, this)) - .on('keypress', $.proxy(this.keypress, this)) - .on('keyup', $.proxy(this.keyup, this)) - - if ($.browser.webkit || $.browser.msie) { - this.$element.on('keydown', $.proxy(this.keypress, this)) - } - - this.$menu - .on('click', $.proxy(this.click, this)) - .on('mouseenter', 'li', $.proxy(this.mouseenter, this)) - } - - , keyup: function (e) { - switch(e.keyCode) { - case 40: // down arrow - case 38: // up arrow - break - - case 9: // tab - case 13: // enter - if (!this.shown) return - this.select() - break - - case 27: // escape - if (!this.shown) return - this.hide() - break - - default: - this.lookup() - } - - e.stopPropagation() - e.preventDefault() - } - - , keypress: function (e) { - if (!this.shown) return - - switch(e.keyCode) { - case 9: // tab - case 13: // enter - case 27: // escape - e.preventDefault() - break - - case 38: // up arrow - if (e.type != 'keydown') break - e.preventDefault() - this.prev() - break - - case 40: // down arrow - if (e.type != 'keydown') break - e.preventDefault() - this.next() - break - } - - e.stopPropagation() - } - - , blur: function (e) { - var that = this - setTimeout(function () { that.hide() }, 150) - } - - , click: function (e) { - e.stopPropagation() - e.preventDefault() - this.select() - } - - , mouseenter: function (e) { - this.$menu.find('.active').removeClass('active') - $(e.currentTarget).addClass('active') - } - - } - - - /* TYPEAHEAD PLUGIN DEFINITION - * =========================== */ - - $.fn.typeahead = function (option) { - return this.each(function () { - var $this = $(this) - , data = $this.data('typeahead') - , options = typeof option == 'object' && option - if (!data) $this.data('typeahead', (data = new Typeahead(this, options))) - if (typeof option == 'string') data[option]() - }) - } - - $.fn.typeahead.defaults = { - source: [] - , items: 8 - , menu: '<ul class="typeahead dropdown-menu"></ul>' - , item: '<li><a href="#"></a></li>' - } - - $.fn.typeahead.Constructor = Typeahead - - - /* TYPEAHEAD DATA-API - * ================== */ - - $(function () { - $('body').on('focus.typeahead.data-api', '[data-provide="typeahead"]', function (e) { - var $this = $(this) - if ($this.data('typeahead')) return - e.preventDefault() - $this.typeahead($this.data()) - }) - }) - -}(window.jQuery); \ No newline at end of file diff --git a/deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/js/bootstrap.min.js b/deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/js/bootstrap.min.js deleted file mode 100644 index d5ccdee2fe604a800fa79f3a0af886011131dfd1..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/js/bootstrap.min.js +++ /dev/null @@ -1,6 +0,0 @@ -/** -* Bootstrap.js by @fat & @mdo -* Copyright 2012 Twitter, Inc. -* http://www.apache.org/licenses/LICENSE-2.0.txt -*/ -!function(a){a(function(){"use strict",a.support.transition=function(){var a=function(){var a=document.createElement("bootstrap"),b={WebkitTransition:"webkitTransitionEnd",MozTransition:"transitionend",OTransition:"oTransitionEnd",msTransition:"MSTransitionEnd",transition:"transitionend"},c;for(c in b)if(a.style[c]!==undefined)return b[c]}();return a&&{end:a}}()})}(window.jQuery),!function(a){"use strict";var b='[data-dismiss="alert"]',c=function(c){a(c).on("click",b,this.close)};c.prototype.close=function(b){function f(){e.trigger("closed").remove()}var c=a(this),d=c.attr("data-target"),e;d||(d=c.attr("href"),d=d&&d.replace(/.*(?=#[^\s]*$)/,"")),e=a(d),b&&b.preventDefault(),e.length||(e=c.hasClass("alert")?c:c.parent()),e.trigger(b=a.Event("close"));if(b.isDefaultPrevented())return;e.removeClass("in"),a.support.transition&&e.hasClass("fade")?e.on(a.support.transition.end,f):f()},a.fn.alert=function(b){return this.each(function(){var d=a(this),e=d.data("alert");e||d.data("alert",e=new c(this)),typeof b=="string"&&e[b].call(d)})},a.fn.alert.Constructor=c,a(function(){a("body").on("click.alert.data-api",b,c.prototype.close)})}(window.jQuery),!function(a){"use strict";var b=function(b,c){this.$element=a(b),this.options=a.extend({},a.fn.button.defaults,c)};b.prototype.setState=function(a){var b="disabled",c=this.$element,d=c.data(),e=c.is("input")?"val":"html";a+="Text",d.resetText||c.data("resetText",c[e]()),c[e](d[a]||this.options[a]),setTimeout(function(){a=="loadingText"?c.addClass(b).attr(b,b):c.removeClass(b).removeAttr(b)},0)},b.prototype.toggle=function(){var a=this.$element.parent('[data-toggle="buttons-radio"]');a&&a.find(".active").removeClass("active"),this.$element.toggleClass("active")},a.fn.button=function(c){return this.each(function(){var d=a(this),e=d.data("button"),f=typeof c=="object"&&c;e||d.data("button",e=new b(this,f)),c=="toggle"?e.toggle():c&&e.setState(c)})},a.fn.button.defaults={loadingText:"loading..."},a.fn.button.Constructor=b,a(function(){a("body").on("click.button.data-api","[data-toggle^=button]",function(b){var c=a(b.target);c.hasClass("btn")||(c=c.closest(".btn")),c.button("toggle")})})}(window.jQuery),!function(a){"use strict";var b=function(b,c){this.$element=a(b),this.options=c,this.options.slide&&this.slide(this.options.slide),this.options.pause=="hover"&&this.$element.on("mouseenter",a.proxy(this.pause,this)).on("mouseleave",a.proxy(this.cycle,this))};b.prototype={cycle:function(b){return b||(this.paused=!1),this.options.interval&&!this.paused&&(this.interval=setInterval(a.proxy(this.next,this),this.options.interval)),this},to:function(b){var c=this.$element.find(".active"),d=c.parent().children(),e=d.index(c),f=this;if(b>d.length-1||b<0)return;return this.sliding?this.$element.one("slid",function(){f.to(b)}):e==b?this.pause().cycle():this.slide(b>e?"next":"prev",a(d[b]))},pause:function(a){return a||(this.paused=!0),clearInterval(this.interval),this.interval=null,this},next:function(){if(this.sliding)return;return this.slide("next")},prev:function(){if(this.sliding)return;return this.slide("prev")},slide:function(b,c){var d=this.$element.find(".active"),e=c||d[b](),f=this.interval,g=b=="next"?"left":"right",h=b=="next"?"first":"last",i=this,j=a.Event("slide");this.sliding=!0,f&&this.pause(),e=e.length?e:this.$element.find(".item")[h]();if(e.hasClass("active"))return;if(a.support.transition&&this.$element.hasClass("slide")){this.$element.trigger(j);if(j.isDefaultPrevented())return;e.addClass(b),e[0].offsetWidth,d.addClass(g),e.addClass(g),this.$element.one(a.support.transition.end,function(){e.removeClass([b,g].join(" ")).addClass("active"),d.removeClass(["active",g].join(" ")),i.sliding=!1,setTimeout(function(){i.$element.trigger("slid")},0)})}else{this.$element.trigger(j);if(j.isDefaultPrevented())return;d.removeClass("active"),e.addClass("active"),this.sliding=!1,this.$element.trigger("slid")}return f&&this.cycle(),this}},a.fn.carousel=function(c){return this.each(function(){var d=a(this),e=d.data("carousel"),f=a.extend({},a.fn.carousel.defaults,typeof c=="object"&&c);e||d.data("carousel",e=new b(this,f)),typeof c=="number"?e.to(c):typeof c=="string"||(c=f.slide)?e[c]():f.interval&&e.cycle()})},a.fn.carousel.defaults={interval:5e3,pause:"hover"},a.fn.carousel.Constructor=b,a(function(){a("body").on("click.carousel.data-api","[data-slide]",function(b){var c=a(this),d,e=a(c.attr("data-target")||(d=c.attr("href"))&&d.replace(/.*(?=#[^\s]+$)/,"")),f=!e.data("modal")&&a.extend({},e.data(),c.data());e.carousel(f),b.preventDefault()})})}(window.jQuery),!function(a){"use strict";var b=function(b,c){this.$element=a(b),this.options=a.extend({},a.fn.collapse.defaults,c),this.options.parent&&(this.$parent=a(this.options.parent)),this.options.toggle&&this.toggle()};b.prototype={constructor:b,dimension:function(){var a=this.$element.hasClass("width");return a?"width":"height"},show:function(){var b,c,d,e;if(this.transitioning)return;b=this.dimension(),c=a.camelCase(["scroll",b].join("-")),d=this.$parent&&this.$parent.find("> .accordion-group > .in");if(d&&d.length){e=d.data("collapse");if(e&&e.transitioning)return;d.collapse("hide"),e||d.data("collapse",null)}this.$element[b](0),this.transition("addClass",a.Event("show"),"shown"),this.$element[b](this.$element[0][c])},hide:function(){var b;if(this.transitioning)return;b=this.dimension(),this.reset(this.$element[b]()),this.transition("removeClass",a.Event("hide"),"hidden"),this.$element[b](0)},reset:function(a){var b=this.dimension();return this.$element.removeClass("collapse")[b](a||"auto")[0].offsetWidth,this.$element[a!==null?"addClass":"removeClass"]("collapse"),this},transition:function(b,c,d){var e=this,f=function(){c.type=="show"&&e.reset(),e.transitioning=0,e.$element.trigger(d)};this.$element.trigger(c);if(c.isDefaultPrevented())return;this.transitioning=1,this.$element[b]("in"),a.support.transition&&this.$element.hasClass("collapse")?this.$element.one(a.support.transition.end,f):f()},toggle:function(){this[this.$element.hasClass("in")?"hide":"show"]()}},a.fn.collapse=function(c){return this.each(function(){var d=a(this),e=d.data("collapse"),f=typeof c=="object"&&c;e||d.data("collapse",e=new b(this,f)),typeof c=="string"&&e[c]()})},a.fn.collapse.defaults={toggle:!0},a.fn.collapse.Constructor=b,a(function(){a("body").on("click.collapse.data-api","[data-toggle=collapse]",function(b){var c=a(this),d,e=c.attr("data-target")||b.preventDefault()||(d=c.attr("href"))&&d.replace(/.*(?=#[^\s]+$)/,""),f=a(e).data("collapse")?"toggle":c.data();a(e).collapse(f)})})}(window.jQuery),!function(a){function d(){a(b).parent().removeClass("open")}"use strict";var b='[data-toggle="dropdown"]',c=function(b){var c=a(b).on("click.dropdown.data-api",this.toggle);a("html").on("click.dropdown.data-api",function(){c.parent().removeClass("open")})};c.prototype={constructor:c,toggle:function(b){var c=a(this),e,f,g;if(c.is(".disabled, :disabled"))return;return f=c.attr("data-target"),f||(f=c.attr("href"),f=f&&f.replace(/.*(?=#[^\s]*$)/,"")),e=a(f),e.length||(e=c.parent()),g=e.hasClass("open"),d(),g||e.toggleClass("open"),!1}},a.fn.dropdown=function(b){return this.each(function(){var d=a(this),e=d.data("dropdown");e||d.data("dropdown",e=new c(this)),typeof b=="string"&&e[b].call(d)})},a.fn.dropdown.Constructor=c,a(function(){a("html").on("click.dropdown.data-api",d),a("body").on("click.dropdown",".dropdown form",function(a){a.stopPropagation()}).on("click.dropdown.data-api",b,c.prototype.toggle)})}(window.jQuery),!function(a){function c(){var b=this,c=setTimeout(function(){b.$element.off(a.support.transition.end),d.call(b)},500);this.$element.one(a.support.transition.end,function(){clearTimeout(c),d.call(b)})}function d(a){this.$element.hide().trigger("hidden"),e.call(this)}function e(b){var c=this,d=this.$element.hasClass("fade")?"fade":"";if(this.isShown&&this.options.backdrop){var e=a.support.transition&&d;this.$backdrop=a('<div class="modal-backdrop '+d+'" />').appendTo(document.body),this.options.backdrop!="static"&&this.$backdrop.click(a.proxy(this.hide,this)),e&&this.$backdrop[0].offsetWidth,this.$backdrop.addClass("in"),e?this.$backdrop.one(a.support.transition.end,b):b()}else!this.isShown&&this.$backdrop?(this.$backdrop.removeClass("in"),a.support.transition&&this.$element.hasClass("fade")?this.$backdrop.one(a.support.transition.end,a.proxy(f,this)):f.call(this)):b&&b()}function f(){this.$backdrop.remove(),this.$backdrop=null}function g(){var b=this;this.isShown&&this.options.keyboard?a(document).on("keyup.dismiss.modal",function(a){a.which==27&&b.hide()}):this.isShown||a(document).off("keyup.dismiss.modal")}"use strict";var b=function(b,c){this.options=c,this.$element=a(b).delegate('[data-dismiss="modal"]',"click.dismiss.modal",a.proxy(this.hide,this))};b.prototype={constructor:b,toggle:function(){return this[this.isShown?"hide":"show"]()},show:function(){var b=this,c=a.Event("show");this.$element.trigger(c);if(this.isShown||c.isDefaultPrevented())return;a("body").addClass("modal-open"),this.isShown=!0,g.call(this),e.call(this,function(){var c=a.support.transition&&b.$element.hasClass("fade");b.$element.parent().length||b.$element.appendTo(document.body),b.$element.show(),c&&b.$element[0].offsetWidth,b.$element.addClass("in"),c?b.$element.one(a.support.transition.end,function(){b.$element.trigger("shown")}):b.$element.trigger("shown")})},hide:function(b){b&&b.preventDefault();var e=this;b=a.Event("hide"),this.$element.trigger(b);if(!this.isShown||b.isDefaultPrevented())return;this.isShown=!1,a("body").removeClass("modal-open"),g.call(this),this.$element.removeClass("in"),a.support.transition&&this.$element.hasClass("fade")?c.call(this):d.call(this)}},a.fn.modal=function(c){return this.each(function(){var d=a(this),e=d.data("modal"),f=a.extend({},a.fn.modal.defaults,d.data(),typeof c=="object"&&c);e||d.data("modal",e=new b(this,f)),typeof c=="string"?e[c]():f.show&&e.show()})},a.fn.modal.defaults={backdrop:!0,keyboard:!0,show:!0},a.fn.modal.Constructor=b,a(function(){a("body").on("click.modal.data-api",'[data-toggle="modal"]',function(b){var c=a(this),d,e=a(c.attr("data-target")||(d=c.attr("href"))&&d.replace(/.*(?=#[^\s]+$)/,"")),f=e.data("modal")?"toggle":a.extend({},e.data(),c.data());b.preventDefault(),e.modal(f)})})}(window.jQuery),!function(a){"use strict";var b=function(a,b){this.init("tooltip",a,b)};b.prototype={constructor:b,init:function(b,c,d){var e,f;this.type=b,this.$element=a(c),this.options=this.getOptions(d),this.enabled=!0,this.options.trigger!="manual"&&(e=this.options.trigger=="hover"?"mouseenter":"focus",f=this.options.trigger=="hover"?"mouseleave":"blur",this.$element.on(e,this.options.selector,a.proxy(this.enter,this)),this.$element.on(f,this.options.selector,a.proxy(this.leave,this))),this.options.selector?this._options=a.extend({},this.options,{trigger:"manual",selector:""}):this.fixTitle()},getOptions:function(b){return b=a.extend({},a.fn[this.type].defaults,b,this.$element.data()),b.delay&&typeof b.delay=="number"&&(b.delay={show:b.delay,hide:b.delay}),b},enter:function(b){var c=a(b.currentTarget)[this.type](this._options).data(this.type);if(!c.options.delay||!c.options.delay.show)return c.show();clearTimeout(this.timeout),c.hoverState="in",this.timeout=setTimeout(function(){c.hoverState=="in"&&c.show()},c.options.delay.show)},leave:function(b){var c=a(b.currentTarget)[this.type](this._options).data(this.type);this.timeout&&clearTimeout(this.timeout);if(!c.options.delay||!c.options.delay.hide)return c.hide();c.hoverState="out",this.timeout=setTimeout(function(){c.hoverState=="out"&&c.hide()},c.options.delay.hide)},show:function(){var a,b,c,d,e,f,g;if(this.hasContent()&&this.enabled){a=this.tip(),this.setContent(),this.options.animation&&a.addClass("fade"),f=typeof this.options.placement=="function"?this.options.placement.call(this,a[0],this.$element[0]):this.options.placement,b=/in/.test(f),a.remove().css({top:0,left:0,display:"block"}).appendTo(b?this.$element:document.body),c=this.getPosition(b),d=a[0].offsetWidth,e=a[0].offsetHeight;switch(b?f.split(" ")[1]:f){case"bottom":g={top:c.top+c.height,left:c.left+c.width/2-d/2};break;case"top":g={top:c.top-e,left:c.left+c.width/2-d/2};break;case"left":g={top:c.top+c.height/2-e/2,left:c.left-d};break;case"right":g={top:c.top+c.height/2-e/2,left:c.left+c.width}}a.css(g).addClass(f).addClass("in")}},isHTML:function(a){return typeof a!="string"||a.charAt(0)==="<"&&a.charAt(a.length-1)===">"&&a.length>=3||/^(?:[^<]*<[\w\W]+>[^>]*$)/.exec(a)},setContent:function(){var a=this.tip(),b=this.getTitle();a.find(".tooltip-inner")[this.isHTML(b)?"html":"text"](b),a.removeClass("fade in top bottom left right")},hide:function(){function d(){var b=setTimeout(function(){c.off(a.support.transition.end).remove()},500);c.one(a.support.transition.end,function(){clearTimeout(b),c.remove()})}var b=this,c=this.tip();c.removeClass("in"),a.support.transition&&this.$tip.hasClass("fade")?d():c.remove()},fixTitle:function(){var a=this.$element;(a.attr("title")||typeof a.attr("data-original-title")!="string")&&a.attr("data-original-title",a.attr("title")||"").removeAttr("title")},hasContent:function(){return this.getTitle()},getPosition:function(b){return a.extend({},b?{top:0,left:0}:this.$element.offset(),{width:this.$element[0].offsetWidth,height:this.$element[0].offsetHeight})},getTitle:function(){var a,b=this.$element,c=this.options;return a=b.attr("data-original-title")||(typeof c.title=="function"?c.title.call(b[0]):c.title),a},tip:function(){return this.$tip=this.$tip||a(this.options.template)},validate:function(){this.$element[0].parentNode||(this.hide(),this.$element=null,this.options=null)},enable:function(){this.enabled=!0},disable:function(){this.enabled=!1},toggleEnabled:function(){this.enabled=!this.enabled},toggle:function(){this[this.tip().hasClass("in")?"hide":"show"]()}},a.fn.tooltip=function(c){return this.each(function(){var d=a(this),e=d.data("tooltip"),f=typeof c=="object"&&c;e||d.data("tooltip",e=new b(this,f)),typeof c=="string"&&e[c]()})},a.fn.tooltip.Constructor=b,a.fn.tooltip.defaults={animation:!0,placement:"top",selector:!1,template:'<div class="tooltip"><div class="tooltip-arrow"></div><div class="tooltip-inner"></div></div>',trigger:"hover",title:"",delay:0}}(window.jQuery),!function(a){"use strict";var b=function(a,b){this.init("popover",a,b)};b.prototype=a.extend({},a.fn.tooltip.Constructor.prototype,{constructor:b,setContent:function(){var a=this.tip(),b=this.getTitle(),c=this.getContent();a.find(".popover-title")[this.isHTML(b)?"html":"text"](b),a.find(".popover-content > *")[this.isHTML(c)?"html":"text"](c),a.removeClass("fade top bottom left right in")},hasContent:function(){return this.getTitle()||this.getContent()},getContent:function(){var a,b=this.$element,c=this.options;return a=b.attr("data-content")||(typeof c.content=="function"?c.content.call(b[0]):c.content),a},tip:function(){return this.$tip||(this.$tip=a(this.options.template)),this.$tip}}),a.fn.popover=function(c){return this.each(function(){var d=a(this),e=d.data("popover"),f=typeof c=="object"&&c;e||d.data("popover",e=new b(this,f)),typeof c=="string"&&e[c]()})},a.fn.popover.Constructor=b,a.fn.popover.defaults=a.extend({},a.fn.tooltip.defaults,{placement:"right",content:"",template:'<div class="popover"><div class="arrow"></div><div class="popover-inner"><h3 class="popover-title"></h3><div class="popover-content"><p></p></div></div></div>'})}(window.jQuery),!function(a){function b(b,c){var d=a.proxy(this.process,this),e=a(b).is("body")?a(window):a(b),f;this.options=a.extend({},a.fn.scrollspy.defaults,c),this.$scrollElement=e.on("scroll.scroll.data-api",d),this.selector=(this.options.target||(f=a(b).attr("href"))&&f.replace(/.*(?=#[^\s]+$)/,"")||"")+" .nav li > a",this.$body=a("body"),this.refresh(),this.process()}"use strict",b.prototype={constructor:b,refresh:function(){var b=this,c;this.offsets=a([]),this.targets=a([]),c=this.$body.find(this.selector).map(function(){var b=a(this),c=b.data("target")||b.attr("href"),d=/^#\w/.test(c)&&a(c);return d&&c.length&&[[d.position().top,c]]||null}).sort(function(a,b){return a[0]-b[0]}).each(function(){b.offsets.push(this[0]),b.targets.push(this[1])})},process:function(){var a=this.$scrollElement.scrollTop()+this.options.offset,b=this.$scrollElement[0].scrollHeight||this.$body[0].scrollHeight,c=b-this.$scrollElement.height(),d=this.offsets,e=this.targets,f=this.activeTarget,g;if(a>=c)return f!=(g=e.last()[0])&&this.activate(g);for(g=d.length;g--;)f!=e[g]&&a>=d[g]&&(!d[g+1]||a<=d[g+1])&&this.activate(e[g])},activate:function(b){var c,d;this.activeTarget=b,a(this.selector).parent(".active").removeClass("active"),d=this.selector+'[data-target="'+b+'"],'+this.selector+'[href="'+b+'"]',c=a(d).parent("li").addClass("active"),c.parent(".dropdown-menu")&&(c=c.closest("li.dropdown").addClass("active")),c.trigger("activate")}},a.fn.scrollspy=function(c){return this.each(function(){var d=a(this),e=d.data("scrollspy"),f=typeof c=="object"&&c;e||d.data("scrollspy",e=new b(this,f)),typeof c=="string"&&e[c]()})},a.fn.scrollspy.Constructor=b,a.fn.scrollspy.defaults={offset:10},a(function(){a('[data-spy="scroll"]').each(function(){var b=a(this);b.scrollspy(b.data())})})}(window.jQuery),!function(a){"use strict";var b=function(b){this.element=a(b)};b.prototype={constructor:b,show:function(){var b=this.element,c=b.closest("ul:not(.dropdown-menu)"),d=b.attr("data-target"),e,f,g;d||(d=b.attr("href"),d=d&&d.replace(/.*(?=#[^\s]*$)/,""));if(b.parent("li").hasClass("active"))return;e=c.find(".active a").last()[0],g=a.Event("show",{relatedTarget:e}),b.trigger(g);if(g.isDefaultPrevented())return;f=a(d),this.activate(b.parent("li"),c),this.activate(f,f.parent(),function(){b.trigger({type:"shown",relatedTarget:e})})},activate:function(b,c,d){function g(){e.removeClass("active").find("> .dropdown-menu > .active").removeClass("active"),b.addClass("active"),f?(b[0].offsetWidth,b.addClass("in")):b.removeClass("fade"),b.parent(".dropdown-menu")&&b.closest("li.dropdown").addClass("active"),d&&d()}var e=c.find("> .active"),f=d&&a.support.transition&&e.hasClass("fade");f?e.one(a.support.transition.end,g):g(),e.removeClass("in")}},a.fn.tab=function(c){return this.each(function(){var d=a(this),e=d.data("tab");e||d.data("tab",e=new b(this)),typeof c=="string"&&e[c]()})},a.fn.tab.Constructor=b,a(function(){a("body").on("click.tab.data-api",'[data-toggle="tab"], [data-toggle="pill"]',function(b){b.preventDefault(),a(this).tab("show")})})}(window.jQuery),!function(a){"use strict";var b=function(b,c){this.$element=a(b),this.options=a.extend({},a.fn.typeahead.defaults,c),this.matcher=this.options.matcher||this.matcher,this.sorter=this.options.sorter||this.sorter,this.highlighter=this.options.highlighter||this.highlighter,this.updater=this.options.updater||this.updater,this.$menu=a(this.options.menu).appendTo("body"),this.source=this.options.source,this.shown=!1,this.listen()};b.prototype={constructor:b,select:function(){var a=this.$menu.find(".active").attr("data-value");return this.$element.val(this.updater(a)).change(),this.hide()},updater:function(a){return a},show:function(){var b=a.extend({},this.$element.offset(),{height:this.$element[0].offsetHeight});return this.$menu.css({top:b.top+b.height,left:b.left}),this.$menu.show(),this.shown=!0,this},hide:function(){return this.$menu.hide(),this.shown=!1,this},lookup:function(b){var c=this,d,e;return this.query=this.$element.val(),this.query?(d=a.grep(this.source,function(a){return c.matcher(a)}),d=this.sorter(d),d.length?this.render(d.slice(0,this.options.items)).show():this.shown?this.hide():this):this.shown?this.hide():this},matcher:function(a){return~a.toLowerCase().indexOf(this.query.toLowerCase())},sorter:function(a){var b=[],c=[],d=[],e;while(e=a.shift())e.toLowerCase().indexOf(this.query.toLowerCase())?~e.indexOf(this.query)?c.push(e):d.push(e):b.push(e);return b.concat(c,d)},highlighter:function(a){var b=this.query.replace(/[\-\[\]{}()*+?.,\\\^$|#\s]/g,"\\$&");return a.replace(new RegExp("("+b+")","ig"),function(a,b){return"<strong>"+b+"</strong>"})},render:function(b){var c=this;return b=a(b).map(function(b,d){return b=a(c.options.item).attr("data-value",d),b.find("a").html(c.highlighter(d)),b[0]}),b.first().addClass("active"),this.$menu.html(b),this},next:function(b){var c=this.$menu.find(".active").removeClass("active"),d=c.next();d.length||(d=a(this.$menu.find("li")[0])),d.addClass("active")},prev:function(a){var b=this.$menu.find(".active").removeClass("active"),c=b.prev();c.length||(c=this.$menu.find("li").last()),c.addClass("active")},listen:function(){this.$element.on("blur",a.proxy(this.blur,this)).on("keypress",a.proxy(this.keypress,this)).on("keyup",a.proxy(this.keyup,this)),(a.browser.webkit||a.browser.msie)&&this.$element.on("keydown",a.proxy(this.keypress,this)),this.$menu.on("click",a.proxy(this.click,this)).on("mouseenter","li",a.proxy(this.mouseenter,this))},keyup:function(a){switch(a.keyCode){case 40:case 38:break;case 9:case 13:if(!this.shown)return;this.select();break;case 27:if(!this.shown)return;this.hide();break;default:this.lookup()}a.stopPropagation(),a.preventDefault()},keypress:function(a){if(!this.shown)return;switch(a.keyCode){case 9:case 13:case 27:a.preventDefault();break;case 38:if(a.type!="keydown")break;a.preventDefault(),this.prev();break;case 40:if(a.type!="keydown")break;a.preventDefault(),this.next()}a.stopPropagation()},blur:function(a){var b=this;setTimeout(function(){b.hide()},150)},click:function(a){a.stopPropagation(),a.preventDefault(),this.select()},mouseenter:function(b){this.$menu.find(".active").removeClass("active"),a(b.currentTarget).addClass("active")}},a.fn.typeahead=function(c){return this.each(function(){var d=a(this),e=d.data("typeahead"),f=typeof c=="object"&&c;e||d.data("typeahead",e=new b(this,f)),typeof c=="string"&&e[c]()})},a.fn.typeahead.defaults={source:[],items:8,menu:'<ul class="typeahead dropdown-menu"></ul>',item:'<li><a href="#"></a></li>'},a.fn.typeahead.Constructor=b,a(function(){a("body").on("focus.typeahead.data-api",'[data-provide="typeahead"]',function(b){var c=a(this);if(c.data("typeahead"))return;b.preventDefault(),c.typeahead(c.data())})})}(window.jQuery); \ No newline at end of file diff --git a/deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/js/d3/d3.js b/deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/js/d3/d3.js deleted file mode 100644 index d24c2e4c83a2468805def9d830ba19c31c0c5941..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/js/d3/d3.js +++ /dev/null @@ -1,4150 +0,0 @@ -(function(){if (!Date.now) Date.now = function() { - return +new Date; -}; -try { - document.createElement("div").style.setProperty("opacity", 0, ""); -} catch (error) { - var d3_style_prototype = CSSStyleDeclaration.prototype, - d3_style_setProperty = d3_style_prototype.setProperty; - d3_style_prototype.setProperty = function(name, value, priority) { - d3_style_setProperty.call(this, name, value + "", priority); - }; -} -d3 = {version: "2.4.6"}; // semver -var d3_array = d3_arraySlice; // conversion for NodeLists - -function d3_arrayCopy(pseudoarray) { - var i = -1, n = pseudoarray.length, array = []; - while (++i < n) array.push(pseudoarray[i]); - return array; -} - -function d3_arraySlice(pseudoarray) { - return Array.prototype.slice.call(pseudoarray); -} - -try { - d3_array(document.documentElement.childNodes)[0].nodeType; -} catch(e) { - d3_array = d3_arrayCopy; -} - -var d3_arraySubclass = [].__proto__? - -// Until ECMAScript supports array subclassing, prototype injection works well. -function(array, prototype) { - array.__proto__ = prototype; -}: - -// And if your browser doesn't support __proto__, we'll use direct extension. -function(array, prototype) { - for (var property in prototype) array[property] = prototype[property]; -}; -function d3_this() { - return this; -} -d3.functor = function(v) { - return typeof v === "function" ? v : function() { return v; }; -}; -// A getter-setter method that preserves the appropriate `this` context. -d3.rebind = function(object, method) { - return function() { - var x = method.apply(object, arguments); - return arguments.length ? object : x; - }; -}; -d3.ascending = function(a, b) { - return a < b ? -1 : a > b ? 1 : a >= b ? 0 : NaN; -}; -d3.descending = function(a, b) { - return b < a ? -1 : b > a ? 1 : b >= a ? 0 : NaN; -}; -d3.mean = function(array, f) { - var n = array.length, - a, - m = 0, - i = -1, - j = 0; - if (arguments.length === 1) { - while (++i < n) if (d3_number(a = array[i])) m += (a - m) / ++j; - } else { - while (++i < n) if (d3_number(a = f.call(array, array[i], i))) m += (a - m) / ++j; - } - return j ? m : undefined; -}; -d3.median = function(array, f) { - if (arguments.length > 1) array = array.map(f); - array = array.filter(d3_number); - return array.length ? d3.quantile(array.sort(d3.ascending), .5) : undefined; -}; -d3.min = function(array, f) { - var i = -1, - n = array.length, - a, - b; - if (arguments.length === 1) { - while (++i < n && ((a = array[i]) == null || a != a)) a = undefined; - while (++i < n) if ((b = array[i]) != null && a > b) a = b; - } else { - while (++i < n && ((a = f.call(array, array[i], i)) == null || a != a)) a = undefined; - while (++i < n) if ((b = f.call(array, array[i], i)) != null && a > b) a = b; - } - return a; -}; -d3.max = function(array, f) { - var i = -1, - n = array.length, - a, - b; - if (arguments.length === 1) { - while (++i < n && ((a = array[i]) == null || a != a)) a = undefined; - while (++i < n) if ((b = array[i]) != null && b > a) a = b; - } else { - while (++i < n && ((a = f.call(array, array[i], i)) == null || a != a)) a = undefined; - while (++i < n) if ((b = f.call(array, array[i], i)) != null && b > a) a = b; - } - return a; -}; -function d3_number(x) { - return x != null && !isNaN(x); -} -d3.sum = function(array, f) { - var s = 0, - n = array.length, - a, - i = -1; - - if (arguments.length === 1) { - while (++i < n) if (!isNaN(a = +array[i])) s += a; - } else { - while (++i < n) if (!isNaN(a = +f.call(array, array[i], i))) s += a; - } - - return s; -}; -// R-7 per <http://en.wikipedia.org/wiki/Quantile> -d3.quantile = function(values, p) { - var H = (values.length - 1) * p + 1, - h = Math.floor(H), - v = values[h - 1], - e = H - h; - return e ? v + e * (values[h] - v) : v; -}; -d3.zip = function() { - if (!(n = arguments.length)) return []; - for (var i = -1, m = d3.min(arguments, d3_zipLength), zips = new Array(m); ++i < m;) { - for (var j = -1, n, zip = zips[i] = new Array(n); ++j < n;) { - zip[j] = arguments[j][i]; - } - } - return zips; -}; - -function d3_zipLength(d) { - return d.length; -} -// Locate the insertion point for x in a to maintain sorted order. The -// arguments lo and hi may be used to specify a subset of the array which should -// be considered; by default the entire array is used. If x is already present -// in a, the insertion point will be before (to the left of) any existing -// entries. The return value is suitable for use as the first argument to -// `array.splice` assuming that a is already sorted. -// -// The returned insertion point i partitions the array a into two halves so that -// all v < x for v in a[lo:i] for the left side and all v >= x for v in a[i:hi] -// for the right side. -d3.bisectLeft = function(a, x, lo, hi) { - if (arguments.length < 3) lo = 0; - if (arguments.length < 4) hi = a.length; - while (lo < hi) { - var mid = (lo + hi) >> 1; - if (a[mid] < x) lo = mid + 1; - else hi = mid; - } - return lo; -}; - -// Similar to bisectLeft, but returns an insertion point which comes after (to -// the right of) any existing entries of x in a. -// -// The returned insertion point i partitions the array into two halves so that -// all v <= x for v in a[lo:i] for the left side and all v > x for v in a[i:hi] -// for the right side. -d3.bisect = -d3.bisectRight = function(a, x, lo, hi) { - if (arguments.length < 3) lo = 0; - if (arguments.length < 4) hi = a.length; - while (lo < hi) { - var mid = (lo + hi) >> 1; - if (x < a[mid]) hi = mid; - else lo = mid + 1; - } - return lo; -}; -d3.first = function(array, f) { - var i = 0, - n = array.length, - a = array[0], - b; - if (arguments.length === 1) f = d3.ascending; - while (++i < n) { - if (f.call(array, a, b = array[i]) > 0) { - a = b; - } - } - return a; -}; -d3.last = function(array, f) { - var i = 0, - n = array.length, - a = array[0], - b; - if (arguments.length === 1) f = d3.ascending; - while (++i < n) { - if (f.call(array, a, b = array[i]) <= 0) { - a = b; - } - } - return a; -}; -d3.nest = function() { - var nest = {}, - keys = [], - sortKeys = [], - sortValues, - rollup; - - function map(array, depth) { - if (depth >= keys.length) return rollup - ? rollup.call(nest, array) : (sortValues - ? array.sort(sortValues) - : array); - - var i = -1, - n = array.length, - key = keys[depth++], - keyValue, - object, - o = {}; - - while (++i < n) { - if ((keyValue = key(object = array[i])) in o) { - o[keyValue].push(object); - } else { - o[keyValue] = [object]; - } - } - - for (keyValue in o) { - o[keyValue] = map(o[keyValue], depth); - } - - return o; - } - - function entries(map, depth) { - if (depth >= keys.length) return map; - - var a = [], - sortKey = sortKeys[depth++], - key; - - for (key in map) { - a.push({key: key, values: entries(map[key], depth)}); - } - - if (sortKey) a.sort(function(a, b) { - return sortKey(a.key, b.key); - }); - - return a; - } - - nest.map = function(array) { - return map(array, 0); - }; - - nest.entries = function(array) { - return entries(map(array, 0), 0); - }; - - nest.key = function(d) { - keys.push(d); - return nest; - }; - - // Specifies the order for the most-recently specified key. - // Note: only applies to entries. Map keys are unordered! - nest.sortKeys = function(order) { - sortKeys[keys.length - 1] = order; - return nest; - }; - - // Specifies the order for leaf values. - // Applies to both maps and entries array. - nest.sortValues = function(order) { - sortValues = order; - return nest; - }; - - nest.rollup = function(f) { - rollup = f; - return nest; - }; - - return nest; -}; -d3.keys = function(map) { - var keys = []; - for (var key in map) keys.push(key); - return keys; -}; -d3.values = function(map) { - var values = []; - for (var key in map) values.push(map[key]); - return values; -}; -d3.entries = function(map) { - var entries = []; - for (var key in map) entries.push({key: key, value: map[key]}); - return entries; -}; -d3.permute = function(array, indexes) { - var permutes = [], - i = -1, - n = indexes.length; - while (++i < n) permutes[i] = array[indexes[i]]; - return permutes; -}; -d3.merge = function(arrays) { - return Array.prototype.concat.apply([], arrays); -}; -d3.split = function(array, f) { - var arrays = [], - values = [], - value, - i = -1, - n = array.length; - if (arguments.length < 2) f = d3_splitter; - while (++i < n) { - if (f.call(values, value = array[i], i)) { - values = []; - } else { - if (!values.length) arrays.push(values); - values.push(value); - } - } - return arrays; -}; - -function d3_splitter(d) { - return d == null; -} -function d3_collapse(s) { - return s.replace(/(^\s+)|(\s+$)/g, "").replace(/\s+/g, " "); -} -/** - * @param {number} start - * @param {number=} stop - * @param {number=} step - */ -d3.range = function(start, stop, step) { - if (arguments.length < 3) { - step = 1; - if (arguments.length < 2) { - stop = start; - start = 0; - } - } - if ((stop - start) / step == Infinity) throw new Error("infinite range"); - var range = [], - i = -1, - j; - if (step < 0) while ((j = start + step * ++i) > stop) range.push(j); - else while ((j = start + step * ++i) < stop) range.push(j); - return range; -}; -d3.requote = function(s) { - return s.replace(d3_requote_re, "\\$&"); -}; - -var d3_requote_re = /[\\\^\$\*\+\?\|\[\]\(\)\.\{\}]/g; -d3.round = function(x, n) { - return n - ? Math.round(x * Math.pow(10, n)) * Math.pow(10, -n) - : Math.round(x); -}; -d3.xhr = function(url, mime, callback) { - var req = new XMLHttpRequest; - if (arguments.length < 3) callback = mime; - else if (mime && req.overrideMimeType) req.overrideMimeType(mime); - req.open("GET", url, true); - req.onreadystatechange = function() { - if (req.readyState === 4) callback(req.status < 300 ? req : null); - }; - req.send(null); -}; -d3.text = function(url, mime, callback) { - function ready(req) { - callback(req && req.responseText); - } - if (arguments.length < 3) { - callback = mime; - mime = null; - } - d3.xhr(url, mime, ready); -}; -d3.json = function(url, callback) { - d3.text(url, "application/json", function(text) { - callback(text ? JSON.parse(text) : null); - }); -}; -d3.html = function(url, callback) { - d3.text(url, "text/html", function(text) { - if (text != null) { // Treat empty string as valid HTML. - var range = document.createRange(); - range.selectNode(document.body); - text = range.createContextualFragment(text); - } - callback(text); - }); -}; -d3.xml = function(url, mime, callback) { - function ready(req) { - callback(req && req.responseXML); - } - if (arguments.length < 3) { - callback = mime; - mime = null; - } - d3.xhr(url, mime, ready); -}; -d3.ns = { - - prefix: { - svg: "http://www.w3.org/2000/svg", - xhtml: "http://www.w3.org/1999/xhtml", - xlink: "http://www.w3.org/1999/xlink", - xml: "http://www.w3.org/XML/1998/namespace", - xmlns: "http://www.w3.org/2000/xmlns/" - }, - - qualify: function(name) { - var i = name.indexOf(":"); - return i < 0 ? name : { - space: d3.ns.prefix[name.substring(0, i)], - local: name.substring(i + 1) - }; - } - -}; -/** @param {...string} types */ -d3.dispatch = function(types) { - var dispatch = {}, - type; - for (var i = 0, n = arguments.length; i < n; i++) { - type = arguments[i]; - dispatch[type] = d3_dispatch(type); - } - return dispatch; -}; - -function d3_dispatch(type) { - var dispatch = {}, - listeners = []; - - dispatch.add = function(listener) { - for (var i = 0; i < listeners.length; i++) { - if (listeners[i].listener == listener) return dispatch; // already registered - } - listeners.push({listener: listener, on: true}); - return dispatch; - }; - - dispatch.remove = function(listener) { - for (var i = 0; i < listeners.length; i++) { - var l = listeners[i]; - if (l.listener == listener) { - l.on = false; - listeners = listeners.slice(0, i).concat(listeners.slice(i + 1)); - break; - } - } - return dispatch; - }; - - dispatch.dispatch = function() { - var ls = listeners; // defensive reference - for (var i = 0, n = ls.length; i < n; i++) { - var l = ls[i]; - if (l.on) l.listener.apply(this, arguments); - } - }; - - return dispatch; -}; -// TODO align -d3.format = function(specifier) { - var match = d3_format_re.exec(specifier), - fill = match[1] || " ", - sign = match[3] || "", - zfill = match[5], - width = +match[6], - comma = match[7], - precision = match[8], - type = match[9], - scale = 1, - suffix = "", - integer = false; - - if (precision) precision = +precision.substring(1); - - if (zfill) { - fill = "0"; // TODO align = "="; - if (comma) width -= Math.floor((width - 1) / 4); - } - - switch (type) { - case "n": comma = true; type = "g"; break; - case "%": scale = 100; suffix = "%"; type = "f"; break; - case "p": scale = 100; suffix = "%"; type = "r"; break; - case "d": integer = true; precision = 0; break; - case "s": scale = -1; type = "r"; break; - } - - // If no precision is specified for r, fallback to general notation. - if (type == "r" && !precision) type = "g"; - - type = d3_format_types[type] || d3_format_typeDefault; - - return function(value) { - - // Return the empty string for floats formatted as ints. - if (integer && (value % 1)) return ""; - - // Convert negative to positive, and record the sign prefix. - var negative = (value < 0) && (value = -value) ? "\u2212" : sign; - - // Apply the scale, computing it from the value's exponent for si format. - if (scale < 0) { - var prefix = d3.formatPrefix(value, precision); - value *= prefix.scale; - suffix = prefix.symbol; - } else { - value *= scale; - } - - // Convert to the desired precision. - value = type(value, precision); - - // If the fill character is 0, the sign and group is applied after the fill. - if (zfill) { - var length = value.length + negative.length; - if (length < width) value = new Array(width - length + 1).join(fill) + value; - if (comma) value = d3_format_group(value); - value = negative + value; - } - - // Otherwise (e.g., space-filling), the sign and group is applied before. - else { - if (comma) value = d3_format_group(value); - value = negative + value; - var length = value.length; - if (length < width) value = new Array(width - length + 1).join(fill) + value; - } - - return value + suffix; - }; -}; - -// [[fill]align][sign][#][0][width][,][.precision][type] -var d3_format_re = /(?:([^{])?([<>=^]))?([+\- ])?(#)?(0)?([0-9]+)?(,)?(\.[0-9]+)?([a-zA-Z%])?/; - -var d3_format_types = { - g: function(x, p) { return x.toPrecision(p); }, - e: function(x, p) { return x.toExponential(p); }, - f: function(x, p) { return x.toFixed(p); }, - r: function(x, p) { return d3.round(x, p = d3_format_precision(x, p)).toFixed(Math.max(0, Math.min(20, p))); } -}; - -function d3_format_precision(x, p) { - return p - (x ? 1 + Math.floor(Math.log(x + Math.pow(10, 1 + Math.floor(Math.log(x) / Math.LN10) - p)) / Math.LN10) : 1); -} - -function d3_format_typeDefault(x) { - return x + ""; -} - -// Apply comma grouping for thousands. -function d3_format_group(value) { - var i = value.lastIndexOf("."), - f = i >= 0 ? value.substring(i) : (i = value.length, ""), - t = []; - while (i > 0) t.push(value.substring(i -= 3, i + 3)); - return t.reverse().join(",") + f; -} -var d3_formatPrefixes = ["y","z","a","f","p","n","μ","m","","k","M","G","T","P","E","Z","Y"].map(d3_formatPrefix); - -d3.formatPrefix = function(value, precision) { - var i = 0; - if (value) { - if (value < 0) value *= -1; - if (precision) value = d3.round(value, d3_format_precision(value, precision)); - i = 1 + Math.floor(1e-12 + Math.log(value) / Math.LN10); - i = Math.max(-24, Math.min(24, Math.floor((i <= 0 ? i + 1 : i - 1) / 3) * 3)); - } - return d3_formatPrefixes[8 + i / 3]; -}; - -function d3_formatPrefix(d, i) { - return { - scale: Math.pow(10, (8 - i) * 3), - symbol: d - }; -} - -/* - * TERMS OF USE - EASING EQUATIONS - * - * Open source under the BSD License. - * - * Copyright 2001 Robert Penner - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * - Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * - * - Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * - Neither the name of the author nor the names of contributors may be used to - * endorse or promote products derived from this software without specific - * prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - */ - -var d3_ease_quad = d3_ease_poly(2), - d3_ease_cubic = d3_ease_poly(3); - -var d3_ease = { - linear: function() { return d3_ease_linear; }, - poly: d3_ease_poly, - quad: function() { return d3_ease_quad; }, - cubic: function() { return d3_ease_cubic; }, - sin: function() { return d3_ease_sin; }, - exp: function() { return d3_ease_exp; }, - circle: function() { return d3_ease_circle; }, - elastic: d3_ease_elastic, - back: d3_ease_back, - bounce: function() { return d3_ease_bounce; } -}; - -var d3_ease_mode = { - "in": function(f) { return f; }, - "out": d3_ease_reverse, - "in-out": d3_ease_reflect, - "out-in": function(f) { return d3_ease_reflect(d3_ease_reverse(f)); } -}; - -d3.ease = function(name) { - var i = name.indexOf("-"), - t = i >= 0 ? name.substring(0, i) : name, - m = i >= 0 ? name.substring(i + 1) : "in"; - return d3_ease_clamp(d3_ease_mode[m](d3_ease[t].apply(null, Array.prototype.slice.call(arguments, 1)))); -}; - -function d3_ease_clamp(f) { - return function(t) { - return t <= 0 ? 0 : t >= 1 ? 1 : f(t); - }; -} - -function d3_ease_reverse(f) { - return function(t) { - return 1 - f(1 - t); - }; -} - -function d3_ease_reflect(f) { - return function(t) { - return .5 * (t < .5 ? f(2 * t) : (2 - f(2 - 2 * t))); - }; -} - -function d3_ease_linear(t) { - return t; -} - -function d3_ease_poly(e) { - return function(t) { - return Math.pow(t, e); - } -} - -function d3_ease_sin(t) { - return 1 - Math.cos(t * Math.PI / 2); -} - -function d3_ease_exp(t) { - return Math.pow(2, 10 * (t - 1)); -} - -function d3_ease_circle(t) { - return 1 - Math.sqrt(1 - t * t); -} - -function d3_ease_elastic(a, p) { - var s; - if (arguments.length < 2) p = 0.45; - if (arguments.length < 1) { a = 1; s = p / 4; } - else s = p / (2 * Math.PI) * Math.asin(1 / a); - return function(t) { - return 1 + a * Math.pow(2, 10 * -t) * Math.sin((t - s) * 2 * Math.PI / p); - }; -} - -function d3_ease_back(s) { - if (!s) s = 1.70158; - return function(t) { - return t * t * ((s + 1) * t - s); - }; -} - -function d3_ease_bounce(t) { - return t < 1 / 2.75 ? 7.5625 * t * t - : t < 2 / 2.75 ? 7.5625 * (t -= 1.5 / 2.75) * t + .75 - : t < 2.5 / 2.75 ? 7.5625 * (t -= 2.25 / 2.75) * t + .9375 - : 7.5625 * (t -= 2.625 / 2.75) * t + .984375; -} -d3.event = null; -d3.interpolate = function(a, b) { - var i = d3.interpolators.length, f; - while (--i >= 0 && !(f = d3.interpolators[i](a, b))); - return f; -}; - -d3.interpolateNumber = function(a, b) { - b -= a; - return function(t) { return a + b * t; }; -}; - -d3.interpolateRound = function(a, b) { - b -= a; - return function(t) { return Math.round(a + b * t); }; -}; - -d3.interpolateString = function(a, b) { - var m, // current match - i, // current index - j, // current index (for coallescing) - s0 = 0, // start index of current string prefix - s1 = 0, // end index of current string prefix - s = [], // string constants and placeholders - q = [], // number interpolators - n, // q.length - o; - - // Reset our regular expression! - d3_interpolate_number.lastIndex = 0; - - // Find all numbers in b. - for (i = 0; m = d3_interpolate_number.exec(b); ++i) { - if (m.index) s.push(b.substring(s0, s1 = m.index)); - q.push({i: s.length, x: m[0]}); - s.push(null); - s0 = d3_interpolate_number.lastIndex; - } - if (s0 < b.length) s.push(b.substring(s0)); - - // Find all numbers in a. - for (i = 0, n = q.length; (m = d3_interpolate_number.exec(a)) && i < n; ++i) { - o = q[i]; - if (o.x == m[0]) { // The numbers match, so coallesce. - if (o.i) { - if (s[o.i + 1] == null) { // This match is followed by another number. - s[o.i - 1] += o.x; - s.splice(o.i, 1); - for (j = i + 1; j < n; ++j) q[j].i--; - } else { // This match is followed by a string, so coallesce twice. - s[o.i - 1] += o.x + s[o.i + 1]; - s.splice(o.i, 2); - for (j = i + 1; j < n; ++j) q[j].i -= 2; - } - } else { - if (s[o.i + 1] == null) { // This match is followed by another number. - s[o.i] = o.x; - } else { // This match is followed by a string, so coallesce twice. - s[o.i] = o.x + s[o.i + 1]; - s.splice(o.i + 1, 1); - for (j = i + 1; j < n; ++j) q[j].i--; - } - } - q.splice(i, 1); - n--; - i--; - } else { - o.x = d3.interpolateNumber(parseFloat(m[0]), parseFloat(o.x)); - } - } - - // Remove any numbers in b not found in a. - while (i < n) { - o = q.pop(); - if (s[o.i + 1] == null) { // This match is followed by another number. - s[o.i] = o.x; - } else { // This match is followed by a string, so coallesce twice. - s[o.i] = o.x + s[o.i + 1]; - s.splice(o.i + 1, 1); - } - n--; - } - - // Special optimization for only a single match. - if (s.length === 1) { - return s[0] == null ? q[0].x : function() { return b; }; - } - - // Otherwise, interpolate each of the numbers and rejoin the string. - return function(t) { - for (i = 0; i < n; ++i) s[(o = q[i]).i] = o.x(t); - return s.join(""); - }; -}; - -d3.interpolateRgb = function(a, b) { - a = d3.rgb(a); - b = d3.rgb(b); - var ar = a.r, - ag = a.g, - ab = a.b, - br = b.r - ar, - bg = b.g - ag, - bb = b.b - ab; - return function(t) { - return "#" - + d3_rgb_hex(Math.round(ar + br * t)) - + d3_rgb_hex(Math.round(ag + bg * t)) - + d3_rgb_hex(Math.round(ab + bb * t)); - }; -}; - -// interpolates HSL space, but outputs RGB string (for compatibility) -d3.interpolateHsl = function(a, b) { - a = d3.hsl(a); - b = d3.hsl(b); - var h0 = a.h, - s0 = a.s, - l0 = a.l, - h1 = b.h - h0, - s1 = b.s - s0, - l1 = b.l - l0; - return function(t) { - return d3_hsl_rgb(h0 + h1 * t, s0 + s1 * t, l0 + l1 * t).toString(); - }; -}; - -d3.interpolateArray = function(a, b) { - var x = [], - c = [], - na = a.length, - nb = b.length, - n0 = Math.min(a.length, b.length), - i; - for (i = 0; i < n0; ++i) x.push(d3.interpolate(a[i], b[i])); - for (; i < na; ++i) c[i] = a[i]; - for (; i < nb; ++i) c[i] = b[i]; - return function(t) { - for (i = 0; i < n0; ++i) c[i] = x[i](t); - return c; - }; -}; - -d3.interpolateObject = function(a, b) { - var i = {}, - c = {}, - k; - for (k in a) { - if (k in b) { - i[k] = d3_interpolateByName(k)(a[k], b[k]); - } else { - c[k] = a[k]; - } - } - for (k in b) { - if (!(k in a)) { - c[k] = b[k]; - } - } - return function(t) { - for (k in i) c[k] = i[k](t); - return c; - }; -} - -var d3_interpolate_number = /[-+]?(?:\d+\.\d+|\d+\.|\.\d+|\d+)(?:[eE][-]?\d+)?/g, - d3_interpolate_rgb = {background: 1, fill: 1, stroke: 1}; - -function d3_interpolateByName(n) { - return n in d3_interpolate_rgb || /\bcolor\b/.test(n) - ? d3.interpolateRgb - : d3.interpolate; -} - -d3.interpolators = [ - d3.interpolateObject, - function(a, b) { return (b instanceof Array) && d3.interpolateArray(a, b); }, - function(a, b) { return (typeof b === "string") && d3.interpolateString(String(a), b); }, - function(a, b) { return (typeof b === "string" ? b in d3_rgb_names || /^(#|rgb\(|hsl\()/.test(b) : b instanceof d3_Rgb || b instanceof d3_Hsl) && d3.interpolateRgb(String(a), b); }, - function(a, b) { return (typeof b === "number") && d3.interpolateNumber(+a, b); } -]; -function d3_uninterpolateNumber(a, b) { - b = b - (a = +a) ? 1 / (b - a) : 0; - return function(x) { return (x - a) * b; }; -} - -function d3_uninterpolateClamp(a, b) { - b = b - (a = +a) ? 1 / (b - a) : 0; - return function(x) { return Math.max(0, Math.min(1, (x - a) * b)); }; -} -d3.rgb = function(r, g, b) { - return arguments.length === 1 - ? (r instanceof d3_Rgb ? d3_rgb(r.r, r.g, r.b) - : d3_rgb_parse("" + r, d3_rgb, d3_hsl_rgb)) - : d3_rgb(~~r, ~~g, ~~b); -}; - -function d3_rgb(r, g, b) { - return new d3_Rgb(r, g, b); -} - -function d3_Rgb(r, g, b) { - this.r = r; - this.g = g; - this.b = b; -} - -d3_Rgb.prototype.brighter = function(k) { - k = Math.pow(0.7, arguments.length ? k : 1); - var r = this.r, - g = this.g, - b = this.b, - i = 30; - if (!r && !g && !b) return d3_rgb(i, i, i); - if (r && r < i) r = i; - if (g && g < i) g = i; - if (b && b < i) b = i; - return d3_rgb( - Math.min(255, Math.floor(r / k)), - Math.min(255, Math.floor(g / k)), - Math.min(255, Math.floor(b / k))); -}; - -d3_Rgb.prototype.darker = function(k) { - k = Math.pow(0.7, arguments.length ? k : 1); - return d3_rgb( - Math.floor(k * this.r), - Math.floor(k * this.g), - Math.floor(k * this.b)); -}; - -d3_Rgb.prototype.hsl = function() { - return d3_rgb_hsl(this.r, this.g, this.b); -}; - -d3_Rgb.prototype.toString = function() { - return "#" + d3_rgb_hex(this.r) + d3_rgb_hex(this.g) + d3_rgb_hex(this.b); -}; - -function d3_rgb_hex(v) { - return v < 0x10 - ? "0" + Math.max(0, v).toString(16) - : Math.min(255, v).toString(16); -} - -function d3_rgb_parse(format, rgb, hsl) { - var r = 0, // red channel; int in [0, 255] - g = 0, // green channel; int in [0, 255] - b = 0, // blue channel; int in [0, 255] - m1, // CSS color specification match - m2, // CSS color specification type (e.g., rgb) - name; - - /* Handle hsl, rgb. */ - m1 = /([a-z]+)\((.*)\)/i.exec(format); - if (m1) { - m2 = m1[2].split(","); - switch (m1[1]) { - case "hsl": { - return hsl( - parseFloat(m2[0]), // degrees - parseFloat(m2[1]) / 100, // percentage - parseFloat(m2[2]) / 100 // percentage - ); - } - case "rgb": { - return rgb( - d3_rgb_parseNumber(m2[0]), - d3_rgb_parseNumber(m2[1]), - d3_rgb_parseNumber(m2[2]) - ); - } - } - } - - /* Named colors. */ - if (name = d3_rgb_names[format]) return rgb(name.r, name.g, name.b); - - /* Hexadecimal colors: #rgb and #rrggbb. */ - if (format != null && format.charAt(0) === "#") { - if (format.length === 4) { - r = format.charAt(1); r += r; - g = format.charAt(2); g += g; - b = format.charAt(3); b += b; - } else if (format.length === 7) { - r = format.substring(1, 3); - g = format.substring(3, 5); - b = format.substring(5, 7); - } - r = parseInt(r, 16); - g = parseInt(g, 16); - b = parseInt(b, 16); - } - - return rgb(r, g, b); -} - -function d3_rgb_hsl(r, g, b) { - var min = Math.min(r /= 255, g /= 255, b /= 255), - max = Math.max(r, g, b), - d = max - min, - h, - s, - l = (max + min) / 2; - if (d) { - s = l < .5 ? d / (max + min) : d / (2 - max - min); - if (r == max) h = (g - b) / d + (g < b ? 6 : 0); - else if (g == max) h = (b - r) / d + 2; - else h = (r - g) / d + 4; - h *= 60; - } else { - s = h = 0; - } - return d3_hsl(h, s, l); -} - -function d3_rgb_parseNumber(c) { // either integer or percentage - var f = parseFloat(c); - return c.charAt(c.length - 1) === "%" ? Math.round(f * 2.55) : f; -} - -var d3_rgb_names = { - aliceblue: "#f0f8ff", - antiquewhite: "#faebd7", - aqua: "#00ffff", - aquamarine: "#7fffd4", - azure: "#f0ffff", - beige: "#f5f5dc", - bisque: "#ffe4c4", - black: "#000000", - blanchedalmond: "#ffebcd", - blue: "#0000ff", - blueviolet: "#8a2be2", - brown: "#a52a2a", - burlywood: "#deb887", - cadetblue: "#5f9ea0", - chartreuse: "#7fff00", - chocolate: "#d2691e", - coral: "#ff7f50", - cornflowerblue: "#6495ed", - cornsilk: "#fff8dc", - crimson: "#dc143c", - cyan: "#00ffff", - darkblue: "#00008b", - darkcyan: "#008b8b", - darkgoldenrod: "#b8860b", - darkgray: "#a9a9a9", - darkgreen: "#006400", - darkgrey: "#a9a9a9", - darkkhaki: "#bdb76b", - darkmagenta: "#8b008b", - darkolivegreen: "#556b2f", - darkorange: "#ff8c00", - darkorchid: "#9932cc", - darkred: "#8b0000", - darksalmon: "#e9967a", - darkseagreen: "#8fbc8f", - darkslateblue: "#483d8b", - darkslategray: "#2f4f4f", - darkslategrey: "#2f4f4f", - darkturquoise: "#00ced1", - darkviolet: "#9400d3", - deeppink: "#ff1493", - deepskyblue: "#00bfff", - dimgray: "#696969", - dimgrey: "#696969", - dodgerblue: "#1e90ff", - firebrick: "#b22222", - floralwhite: "#fffaf0", - forestgreen: "#228b22", - fuchsia: "#ff00ff", - gainsboro: "#dcdcdc", - ghostwhite: "#f8f8ff", - gold: "#ffd700", - goldenrod: "#daa520", - gray: "#808080", - green: "#008000", - greenyellow: "#adff2f", - grey: "#808080", - honeydew: "#f0fff0", - hotpink: "#ff69b4", - indianred: "#cd5c5c", - indigo: "#4b0082", - ivory: "#fffff0", - khaki: "#f0e68c", - lavender: "#e6e6fa", - lavenderblush: "#fff0f5", - lawngreen: "#7cfc00", - lemonchiffon: "#fffacd", - lightblue: "#add8e6", - lightcoral: "#f08080", - lightcyan: "#e0ffff", - lightgoldenrodyellow: "#fafad2", - lightgray: "#d3d3d3", - lightgreen: "#90ee90", - lightgrey: "#d3d3d3", - lightpink: "#ffb6c1", - lightsalmon: "#ffa07a", - lightseagreen: "#20b2aa", - lightskyblue: "#87cefa", - lightslategray: "#778899", - lightslategrey: "#778899", - lightsteelblue: "#b0c4de", - lightyellow: "#ffffe0", - lime: "#00ff00", - limegreen: "#32cd32", - linen: "#faf0e6", - magenta: "#ff00ff", - maroon: "#800000", - mediumaquamarine: "#66cdaa", - mediumblue: "#0000cd", - mediumorchid: "#ba55d3", - mediumpurple: "#9370db", - mediumseagreen: "#3cb371", - mediumslateblue: "#7b68ee", - mediumspringgreen: "#00fa9a", - mediumturquoise: "#48d1cc", - mediumvioletred: "#c71585", - midnightblue: "#191970", - mintcream: "#f5fffa", - mistyrose: "#ffe4e1", - moccasin: "#ffe4b5", - navajowhite: "#ffdead", - navy: "#000080", - oldlace: "#fdf5e6", - olive: "#808000", - olivedrab: "#6b8e23", - orange: "#ffa500", - orangered: "#ff4500", - orchid: "#da70d6", - palegoldenrod: "#eee8aa", - palegreen: "#98fb98", - paleturquoise: "#afeeee", - palevioletred: "#db7093", - papayawhip: "#ffefd5", - peachpuff: "#ffdab9", - peru: "#cd853f", - pink: "#ffc0cb", - plum: "#dda0dd", - powderblue: "#b0e0e6", - purple: "#800080", - red: "#ff0000", - rosybrown: "#bc8f8f", - royalblue: "#4169e1", - saddlebrown: "#8b4513", - salmon: "#fa8072", - sandybrown: "#f4a460", - seagreen: "#2e8b57", - seashell: "#fff5ee", - sienna: "#a0522d", - silver: "#c0c0c0", - skyblue: "#87ceeb", - slateblue: "#6a5acd", - slategray: "#708090", - slategrey: "#708090", - snow: "#fffafa", - springgreen: "#00ff7f", - steelblue: "#4682b4", - tan: "#d2b48c", - teal: "#008080", - thistle: "#d8bfd8", - tomato: "#ff6347", - turquoise: "#40e0d0", - violet: "#ee82ee", - wheat: "#f5deb3", - white: "#ffffff", - whitesmoke: "#f5f5f5", - yellow: "#ffff00", - yellowgreen: "#9acd32" -}; - -for (var d3_rgb_name in d3_rgb_names) { - d3_rgb_names[d3_rgb_name] = d3_rgb_parse( - d3_rgb_names[d3_rgb_name], - d3_rgb, - d3_hsl_rgb); -} -d3.hsl = function(h, s, l) { - return arguments.length === 1 - ? (h instanceof d3_Hsl ? d3_hsl(h.h, h.s, h.l) - : d3_rgb_parse("" + h, d3_rgb_hsl, d3_hsl)) - : d3_hsl(+h, +s, +l); -}; - -function d3_hsl(h, s, l) { - return new d3_Hsl(h, s, l); -} - -function d3_Hsl(h, s, l) { - this.h = h; - this.s = s; - this.l = l; -} - -d3_Hsl.prototype.brighter = function(k) { - k = Math.pow(0.7, arguments.length ? k : 1); - return d3_hsl(this.h, this.s, this.l / k); -}; - -d3_Hsl.prototype.darker = function(k) { - k = Math.pow(0.7, arguments.length ? k : 1); - return d3_hsl(this.h, this.s, k * this.l); -}; - -d3_Hsl.prototype.rgb = function() { - return d3_hsl_rgb(this.h, this.s, this.l); -}; - -d3_Hsl.prototype.toString = function() { - return this.rgb().toString(); -}; - -function d3_hsl_rgb(h, s, l) { - var m1, - m2; - - /* Some simple corrections for h, s and l. */ - h = h % 360; if (h < 0) h += 360; - s = s < 0 ? 0 : s > 1 ? 1 : s; - l = l < 0 ? 0 : l > 1 ? 1 : l; - - /* From FvD 13.37, CSS Color Module Level 3 */ - m2 = l <= .5 ? l * (1 + s) : l + s - l * s; - m1 = 2 * l - m2; - - function v(h) { - if (h > 360) h -= 360; - else if (h < 0) h += 360; - if (h < 60) return m1 + (m2 - m1) * h / 60; - if (h < 180) return m2; - if (h < 240) return m1 + (m2 - m1) * (240 - h) / 60; - return m1; - } - - function vv(h) { - return Math.round(v(h) * 255); - } - - return d3_rgb(vv(h + 120), vv(h), vv(h - 120)); -} -function d3_selection(groups) { - d3_arraySubclass(groups, d3_selectionPrototype); - return groups; -} - -var d3_select = function(s, n) { return n.querySelector(s); }, - d3_selectAll = function(s, n) { return n.querySelectorAll(s); }; - -// Prefer Sizzle, if available. -if (typeof Sizzle === "function") { - d3_select = function(s, n) { return Sizzle(s, n)[0]; }; - d3_selectAll = function(s, n) { return Sizzle.uniqueSort(Sizzle(s, n)); }; -} - -var d3_selectionPrototype = []; - -d3.selection = function() { - return d3_selectionRoot; -}; - -d3.selection.prototype = d3_selectionPrototype; -d3_selectionPrototype.select = function(selector) { - var subgroups = [], - subgroup, - subnode, - group, - node; - - if (typeof selector !== "function") selector = d3_selection_selector(selector); - - for (var j = -1, m = this.length; ++j < m;) { - subgroups.push(subgroup = []); - subgroup.parentNode = (group = this[j]).parentNode; - for (var i = -1, n = group.length; ++i < n;) { - if (node = group[i]) { - subgroup.push(subnode = selector.call(node, node.__data__, i)); - if (subnode && "__data__" in node) subnode.__data__ = node.__data__; - } else { - subgroup.push(null); - } - } - } - - return d3_selection(subgroups); -}; - -function d3_selection_selector(selector) { - return function() { - return d3_select(selector, this); - }; -} -d3_selectionPrototype.selectAll = function(selector) { - var subgroups = [], - subgroup, - node; - - if (typeof selector !== "function") selector = d3_selection_selectorAll(selector); - - for (var j = -1, m = this.length; ++j < m;) { - for (var group = this[j], i = -1, n = group.length; ++i < n;) { - if (node = group[i]) { - subgroups.push(subgroup = d3_array(selector.call(node, node.__data__, i))); - subgroup.parentNode = node; - } - } - } - - return d3_selection(subgroups); -}; - -function d3_selection_selectorAll(selector) { - return function() { - return d3_selectAll(selector, this); - }; -} -d3_selectionPrototype.attr = function(name, value) { - name = d3.ns.qualify(name); - - // If no value is specified, return the first value. - if (arguments.length < 2) { - var node = this.node(); - return name.local - ? node.getAttributeNS(name.space, name.local) - : node.getAttribute(name); - } - - function attrNull() { - this.removeAttribute(name); - } - - function attrNullNS() { - this.removeAttributeNS(name.space, name.local); - } - - function attrConstant() { - this.setAttribute(name, value); - } - - function attrConstantNS() { - this.setAttributeNS(name.space, name.local, value); - } - - function attrFunction() { - var x = value.apply(this, arguments); - if (x == null) this.removeAttribute(name); - else this.setAttribute(name, x); - } - - function attrFunctionNS() { - var x = value.apply(this, arguments); - if (x == null) this.removeAttributeNS(name.space, name.local); - else this.setAttributeNS(name.space, name.local, x); - } - - return this.each(value == null - ? (name.local ? attrNullNS : attrNull) : (typeof value === "function" - ? (name.local ? attrFunctionNS : attrFunction) - : (name.local ? attrConstantNS : attrConstant))); -}; -d3_selectionPrototype.classed = function(name, value) { - var names = name.split(d3_selection_classedWhitespace), - n = names.length, - i = -1; - if (arguments.length > 1) { - while (++i < n) d3_selection_classed.call(this, names[i], value); - return this; - } else { - while (++i < n) if (!d3_selection_classed.call(this, names[i])) return false; - return true; - } -}; - -var d3_selection_classedWhitespace = /\s+/g; - -function d3_selection_classed(name, value) { - var re = new RegExp("(^|\\s+)" + d3.requote(name) + "(\\s+|$)", "g"); - - // If no value is specified, return the first value. - if (arguments.length < 2) { - var node = this.node(); - if (c = node.classList) return c.contains(name); - var c = node.className; - re.lastIndex = 0; - return re.test(c.baseVal != null ? c.baseVal : c); - } - - function classedAdd() { - if (c = this.classList) return c.add(name); - var c = this.className, - cb = c.baseVal != null, - cv = cb ? c.baseVal : c; - re.lastIndex = 0; - if (!re.test(cv)) { - cv = d3_collapse(cv + " " + name); - if (cb) c.baseVal = cv; - else this.className = cv; - } - } - - function classedRemove() { - if (c = this.classList) return c.remove(name); - var c = this.className, - cb = c.baseVal != null, - cv = cb ? c.baseVal : c; - cv = d3_collapse(cv.replace(re, " ")); - if (cb) c.baseVal = cv; - else this.className = cv; - } - - function classedFunction() { - (value.apply(this, arguments) - ? classedAdd - : classedRemove).call(this); - } - - return this.each(typeof value === "function" - ? classedFunction : value - ? classedAdd - : classedRemove); -} -d3_selectionPrototype.style = function(name, value, priority) { - if (arguments.length < 3) priority = ""; - - // If no value is specified, return the first value. - if (arguments.length < 2) return window - .getComputedStyle(this.node(), null) - .getPropertyValue(name); - - function styleNull() { - this.style.removeProperty(name); - } - - function styleConstant() { - this.style.setProperty(name, value, priority); - } - - function styleFunction() { - var x = value.apply(this, arguments); - if (x == null) this.style.removeProperty(name); - else this.style.setProperty(name, x, priority); - } - - return this.each(value == null - ? styleNull : (typeof value === "function" - ? styleFunction : styleConstant)); -}; -d3_selectionPrototype.property = function(name, value) { - - // If no value is specified, return the first value. - if (arguments.length < 2) return this.node()[name]; - - function propertyNull() { - delete this[name]; - } - - function propertyConstant() { - this[name] = value; - } - - function propertyFunction() { - var x = value.apply(this, arguments); - if (x == null) delete this[name]; - else this[name] = x; - } - - return this.each(value == null - ? propertyNull : (typeof value === "function" - ? propertyFunction : propertyConstant)); -}; -d3_selectionPrototype.text = function(value) { - return arguments.length < 1 ? this.node().textContent - : (this.each(typeof value === "function" - ? function() { this.textContent = value.apply(this, arguments); } - : function() { this.textContent = value; })); -}; -d3_selectionPrototype.html = function(value) { - return arguments.length < 1 ? this.node().innerHTML - : (this.each(typeof value === "function" - ? function() { this.innerHTML = value.apply(this, arguments); } - : function() { this.innerHTML = value; })); -}; -// TODO append(node)? -// TODO append(function)? -d3_selectionPrototype.append = function(name) { - name = d3.ns.qualify(name); - - function append() { - return this.appendChild(document.createElement(name)); - } - - function appendNS() { - return this.appendChild(document.createElementNS(name.space, name.local)); - } - - return this.select(name.local ? appendNS : append); -}; -// TODO insert(node, function)? -// TODO insert(function, string)? -// TODO insert(function, function)? -d3_selectionPrototype.insert = function(name, before) { - name = d3.ns.qualify(name); - - function insert() { - return this.insertBefore( - document.createElement(name), - d3_select(before, this)); - } - - function insertNS() { - return this.insertBefore( - document.createElementNS(name.space, name.local), - d3_select(before, this)); - } - - return this.select(name.local ? insertNS : insert); -}; -// TODO remove(selector)? -// TODO remove(node)? -// TODO remove(function)? -d3_selectionPrototype.remove = function() { - return this.each(function() { - var parent = this.parentNode; - if (parent) parent.removeChild(this); - }); -}; -// TODO data(null) for clearing data? -d3_selectionPrototype.data = function(data, join) { - var enter = [], - update = [], - exit = []; - - function bind(group, groupData) { - var i, - n = group.length, - m = groupData.length, - n0 = Math.min(n, m), - n1 = Math.max(n, m), - updateNodes = [], - enterNodes = [], - exitNodes = [], - node, - nodeData; - - if (join) { - var nodeByKey = {}, - keys = [], - key, - j = groupData.length; - - for (i = -1; ++i < n;) { - key = join.call(node = group[i], node.__data__, i); - if (key in nodeByKey) { - exitNodes[j++] = node; // duplicate key - } else { - nodeByKey[key] = node; - } - keys.push(key); - } - - for (i = -1; ++i < m;) { - node = nodeByKey[key = join.call(groupData, nodeData = groupData[i], i)]; - if (node) { - node.__data__ = nodeData; - updateNodes[i] = node; - enterNodes[i] = exitNodes[i] = null; - } else { - enterNodes[i] = d3_selection_dataNode(nodeData); - updateNodes[i] = exitNodes[i] = null; - } - delete nodeByKey[key]; - } - - for (i = -1; ++i < n;) { - if (keys[i] in nodeByKey) { - exitNodes[i] = group[i]; - } - } - } else { - for (i = -1; ++i < n0;) { - node = group[i]; - nodeData = groupData[i]; - if (node) { - node.__data__ = nodeData; - updateNodes[i] = node; - enterNodes[i] = exitNodes[i] = null; - } else { - enterNodes[i] = d3_selection_dataNode(nodeData); - updateNodes[i] = exitNodes[i] = null; - } - } - for (; i < m; ++i) { - enterNodes[i] = d3_selection_dataNode(groupData[i]); - updateNodes[i] = exitNodes[i] = null; - } - for (; i < n1; ++i) { - exitNodes[i] = group[i]; - enterNodes[i] = updateNodes[i] = null; - } - } - - enterNodes.update - = updateNodes; - - enterNodes.parentNode - = updateNodes.parentNode - = exitNodes.parentNode - = group.parentNode; - - enter.push(enterNodes); - update.push(updateNodes); - exit.push(exitNodes); - } - - var i = -1, - n = this.length, - group; - if (typeof data === "function") { - while (++i < n) { - bind(group = this[i], data.call(group, group.parentNode.__data__, i)); - } - } else { - while (++i < n) { - bind(group = this[i], data); - } - } - - var selection = d3_selection(update); - selection.enter = function() { return d3_selection_enter(enter); }; - selection.exit = function() { return d3_selection(exit); }; - return selection; -}; - -function d3_selection_dataNode(data) { - return {__data__: data}; -} -// TODO preserve null elements to maintain index? -d3_selectionPrototype.filter = function(filter) { - var subgroups = [], - subgroup, - group, - node; - - for (var j = 0, m = this.length; j < m; j++) { - subgroups.push(subgroup = []); - subgroup.parentNode = (group = this[j]).parentNode; - for (var i = 0, n = group.length; i < n; i++) { - if ((node = group[i]) && filter.call(node, node.__data__, i)) { - subgroup.push(node); - } - } - } - - return d3_selection(subgroups); -}; -d3_selectionPrototype.map = function(map) { - return this.each(function() { - this.__data__ = map.apply(this, arguments); - }); -}; -d3_selectionPrototype.sort = function(comparator) { - comparator = d3_selection_sortComparator.apply(this, arguments); - for (var j = 0, m = this.length; j < m; j++) { - for (var group = this[j].sort(comparator), i = 1, n = group.length, prev = group[0]; i < n; i++) { - var node = group[i]; - if (node) { - if (prev) prev.parentNode.insertBefore(node, prev.nextSibling); - prev = node; - } - } - } - return this; -}; - -function d3_selection_sortComparator(comparator) { - if (!arguments.length) comparator = d3.ascending; - return function(a, b) { - return comparator(a && a.__data__, b && b.__data__); - }; -} -// type can be namespaced, e.g., "click.foo" -// listener can be null for removal -d3_selectionPrototype.on = function(type, listener, capture) { - if (arguments.length < 3) capture = false; - - // parse the type specifier - var name = "__on" + type, i = type.indexOf("."); - if (i > 0) type = type.substring(0, i); - - // if called with only one argument, return the current listener - if (arguments.length < 2) return (i = this.node()[name]) && i._; - - // remove the old event listener, and add the new event listener - return this.each(function(d, i) { - var node = this; - - if (node[name]) node.removeEventListener(type, node[name], capture); - if (listener) node.addEventListener(type, node[name] = l, capture); - - // wrapped event listener that preserves i - function l(e) { - var o = d3.event; // Events can be reentrant (e.g., focus). - d3.event = e; - try { - listener.call(node, node.__data__, i); - } finally { - d3.event = o; - } - } - - // stash the unwrapped listener for retrieval - l._ = listener; - }); -}; -d3_selectionPrototype.each = function(callback) { - for (var j = -1, m = this.length; ++j < m;) { - for (var group = this[j], i = -1, n = group.length; ++i < n;) { - var node = group[i]; - if (node) callback.call(node, node.__data__, i, j); - } - } - return this; -}; -// -// Note: assigning to the arguments array simultaneously changes the value of -// the corresponding argument! -// -// TODO The `this` argument probably shouldn't be the first argument to the -// callback, anyway, since it's redundant. However, that will require a major -// version bump due to backwards compatibility, so I'm not changing it right -// away. -// -d3_selectionPrototype.call = function(callback) { - callback.apply(this, (arguments[0] = this, arguments)); - return this; -}; -d3_selectionPrototype.empty = function() { - return !this.node(); -}; -d3_selectionPrototype.node = function(callback) { - for (var j = 0, m = this.length; j < m; j++) { - for (var group = this[j], i = 0, n = group.length; i < n; i++) { - var node = group[i]; - if (node) return node; - } - } - return null; -}; -d3_selectionPrototype.transition = function() { - var subgroups = [], - subgroup, - node; - - for (var j = -1, m = this.length; ++j < m;) { - subgroups.push(subgroup = []); - for (var group = this[j], i = -1, n = group.length; ++i < n;) { - subgroup.push((node = group[i]) ? {node: node, delay: 0, duration: 250} : null); - } - } - - return d3_transition(subgroups, d3_transitionInheritId || ++d3_transitionId, Date.now()); -}; -var d3_selectionRoot = d3_selection([[document]]); - -d3_selectionRoot[0].parentNode = document.documentElement; - -// TODO fast singleton implementation! -// TODO select(function) -d3.select = function(selector) { - return typeof selector === "string" - ? d3_selectionRoot.select(selector) - : d3_selection([[selector]]); // assume node -}; - -// TODO selectAll(function) -d3.selectAll = function(selector) { - return typeof selector === "string" - ? d3_selectionRoot.selectAll(selector) - : d3_selection([d3_array(selector)]); // assume node[] -}; -function d3_selection_enter(selection) { - d3_arraySubclass(selection, d3_selection_enterPrototype); - return selection; -} - -var d3_selection_enterPrototype = []; - -d3_selection_enterPrototype.append = d3_selectionPrototype.append; -d3_selection_enterPrototype.insert = d3_selectionPrototype.insert; -d3_selection_enterPrototype.empty = d3_selectionPrototype.empty; -d3_selection_enterPrototype.node = d3_selectionPrototype.node; -d3_selection_enterPrototype.select = function(selector) { - var subgroups = [], - subgroup, - subnode, - upgroup, - group, - node; - - for (var j = -1, m = this.length; ++j < m;) { - upgroup = (group = this[j]).update; - subgroups.push(subgroup = []); - subgroup.parentNode = group.parentNode; - for (var i = -1, n = group.length; ++i < n;) { - if (node = group[i]) { - subgroup.push(upgroup[i] = subnode = selector.call(group.parentNode, node.__data__, i)); - subnode.__data__ = node.__data__; - } else { - subgroup.push(null); - } - } - } - - return d3_selection(subgroups); -}; -function d3_transition(groups, id, time) { - d3_arraySubclass(groups, d3_transitionPrototype); - - var tweens = {}, - event = d3.dispatch("start", "end"), - ease = d3_transitionEase; - - groups.id = id; - - groups.time = time; - - groups.tween = function(name, tween) { - if (arguments.length < 2) return tweens[name]; - if (tween == null) delete tweens[name]; - else tweens[name] = tween; - return groups; - }; - - groups.ease = function(value) { - if (!arguments.length) return ease; - ease = typeof value === "function" ? value : d3.ease.apply(d3, arguments); - return groups; - }; - - groups.each = function(type, listener) { - if (arguments.length < 2) return d3_transition_each.call(groups, type); - event[type].add(listener); - return groups; - }; - - d3.timer(function(elapsed) { - groups.each(function(d, i, j) { - var tweened = [], - node = this, - delay = groups[j][i].delay, - duration = groups[j][i].duration, - lock = node.__transition__ || (node.__transition__ = {active: 0, count: 0}); - - ++lock.count; - - delay <= elapsed ? start(elapsed) : d3.timer(start, delay, time); - - function start(elapsed) { - if (lock.active > id) return stop(); - lock.active = id; - - for (var tween in tweens) { - if (tween = tweens[tween].call(node, d, i)) { - tweened.push(tween); - } - } - - event.start.dispatch.call(node, d, i); - if (!tick(elapsed)) d3.timer(tick, 0, time); - return 1; - } - - function tick(elapsed) { - if (lock.active !== id) return stop(); - - var t = (elapsed - delay) / duration, - e = ease(t), - n = tweened.length; - - while (n > 0) { - tweened[--n].call(node, e); - } - - if (t >= 1) { - stop(); - d3_transitionInheritId = id; - event.end.dispatch.call(node, d, i); - d3_transitionInheritId = 0; - return 1; - } - } - - function stop() { - if (!--lock.count) delete node.__transition__; - return 1; - } - }); - return 1; - }, 0, time); - - return groups; -} - -var d3_transitionRemove = {}; - -function d3_transitionNull(d, i, a) { - return a != "" && d3_transitionRemove; -} - -function d3_transitionTween(b) { - - function transitionFunction(d, i, a) { - var v = b.call(this, d, i); - return v == null - ? a != "" && d3_transitionRemove - : a != v && d3.interpolate(a, v); - } - - function transitionString(d, i, a) { - return a != b && d3.interpolate(a, b); - } - - return typeof b === "function" ? transitionFunction - : b == null ? d3_transitionNull - : (b += "", transitionString); -} - -var d3_transitionPrototype = [], - d3_transitionId = 0, - d3_transitionInheritId = 0, - d3_transitionEase = d3.ease("cubic-in-out"); - -d3_transitionPrototype.call = d3_selectionPrototype.call; - -d3.transition = function() { - return d3_selectionRoot.transition(); -}; - -d3.transition.prototype = d3_transitionPrototype; -d3_transitionPrototype.select = function(selector) { - var subgroups = [], - subgroup, - subnode, - node; - - if (typeof selector !== "function") selector = d3_selection_selector(selector); - - for (var j = -1, m = this.length; ++j < m;) { - subgroups.push(subgroup = []); - for (var group = this[j], i = -1, n = group.length; ++i < n;) { - if ((node = group[i]) && (subnode = selector.call(node.node, node.node.__data__, i))) { - if ("__data__" in node.node) subnode.__data__ = node.node.__data__; - subgroup.push({node: subnode, delay: node.delay, duration: node.duration}); - } else { - subgroup.push(null); - } - } - } - - return d3_transition(subgroups, this.id, this.time).ease(this.ease()); -}; -d3_transitionPrototype.selectAll = function(selector) { - var subgroups = [], - subgroup, - subnodes, - node; - - if (typeof selector !== "function") selector = d3_selection_selectorAll(selector); - - for (var j = -1, m = this.length; ++j < m;) { - for (var group = this[j], i = -1, n = group.length; ++i < n;) { - if (node = group[i]) { - subnodes = selector.call(node.node, node.node.__data__, i); - subgroups.push(subgroup = []); - for (var k = -1, o = subnodes.length; ++k < o;) { - subgroup.push({node: subnodes[k], delay: node.delay, duration: node.duration}); - } - } - } - } - - return d3_transition(subgroups, this.id, this.time).ease(this.ease()); -}; -d3_transitionPrototype.attr = function(name, value) { - return this.attrTween(name, d3_transitionTween(value)); -}; - -d3_transitionPrototype.attrTween = function(nameNS, tween) { - var name = d3.ns.qualify(nameNS); - - function attrTween(d, i) { - var f = tween.call(this, d, i, this.getAttribute(name)); - return f === d3_transitionRemove - ? (this.removeAttribute(name), null) - : f && function(t) { this.setAttribute(name, f(t)); }; - } - - function attrTweenNS(d, i) { - var f = tween.call(this, d, i, this.getAttributeNS(name.space, name.local)); - return f === d3_transitionRemove - ? (this.removeAttributeNS(name.space, name.local), null) - : f && function(t) { this.setAttributeNS(name.space, name.local, f(t)); }; - } - - return this.tween("attr." + nameNS, name.local ? attrTweenNS : attrTween); -}; -d3_transitionPrototype.style = function(name, value, priority) { - if (arguments.length < 3) priority = ""; - return this.styleTween(name, d3_transitionTween(value), priority); -}; - -d3_transitionPrototype.styleTween = function(name, tween, priority) { - if (arguments.length < 3) priority = ""; - return this.tween("style." + name, function(d, i) { - var f = tween.call(this, d, i, window.getComputedStyle(this, null).getPropertyValue(name)); - return f === d3_transitionRemove - ? (this.style.removeProperty(name), null) - : f && function(t) { this.style.setProperty(name, f(t), priority); }; - }); -}; -d3_transitionPrototype.text = function(value) { - return this.tween("text", function(d, i) { - this.textContent = typeof value === "function" - ? value.call(this, d, i) - : value; - }); -}; -d3_transitionPrototype.remove = function() { - return this.each("end", function() { - var p; - if (!this.__transition__ && (p = this.parentNode)) p.removeChild(this); - }); -}; -d3_transitionPrototype.delay = function(value) { - var groups = this; - return groups.each(typeof value === "function" - ? function(d, i, j) { groups[j][i].delay = +value.apply(this, arguments); } - : (value = +value, function(d, i, j) { groups[j][i].delay = value; })); -}; -d3_transitionPrototype.duration = function(value) { - var groups = this; - return groups.each(typeof value === "function" - ? function(d, i, j) { groups[j][i].duration = +value.apply(this, arguments); } - : (value = +value, function(d, i, j) { groups[j][i].duration = value; })); -}; -function d3_transition_each(callback) { - for (var j = 0, m = this.length; j < m; j++) { - for (var group = this[j], i = 0, n = group.length; i < n; i++) { - var node = group[i]; - if (node) callback.call(node = node.node, node.__data__, i, j); - } - } - return this; -} -d3_transitionPrototype.transition = function() { - return this.select(d3_this); -}; -var d3_timer_queue = null, - d3_timer_interval, // is an interval (or frame) active? - d3_timer_timeout; // is a timeout active? - -// The timer will continue to fire until callback returns true. -d3.timer = function(callback, delay, then) { - var found = false, - t0, - t1 = d3_timer_queue; - - if (arguments.length < 3) { - if (arguments.length < 2) delay = 0; - else if (!isFinite(delay)) return; - then = Date.now(); - } - - // See if the callback's already in the queue. - while (t1) { - if (t1.callback === callback) { - t1.then = then; - t1.delay = delay; - found = true; - break; - } - t0 = t1; - t1 = t1.next; - } - - // Otherwise, add the callback to the queue. - if (!found) d3_timer_queue = { - callback: callback, - then: then, - delay: delay, - next: d3_timer_queue - }; - - // Start animatin'! - if (!d3_timer_interval) { - d3_timer_timeout = clearTimeout(d3_timer_timeout); - d3_timer_interval = 1; - d3_timer_frame(d3_timer_step); - } -} - -function d3_timer_step() { - var elapsed, - now = Date.now(), - t1 = d3_timer_queue; - - while (t1) { - elapsed = now - t1.then; - if (elapsed >= t1.delay) t1.flush = t1.callback(elapsed); - t1 = t1.next; - } - - var delay = d3_timer_flush() - now; - if (delay > 24) { - if (isFinite(delay)) { - clearTimeout(d3_timer_timeout); - d3_timer_timeout = setTimeout(d3_timer_step, delay); - } - d3_timer_interval = 0; - } else { - d3_timer_interval = 1; - d3_timer_frame(d3_timer_step); - } -} - -d3.timer.flush = function() { - var elapsed, - now = Date.now(), - t1 = d3_timer_queue; - - while (t1) { - elapsed = now - t1.then; - if (!t1.delay) t1.flush = t1.callback(elapsed); - t1 = t1.next; - } - - d3_timer_flush(); -}; - -// Flush after callbacks, to avoid concurrent queue modification. -function d3_timer_flush() { - var t0 = null, - t1 = d3_timer_queue, - then = Infinity; - while (t1) { - if (t1.flush) { - t1 = t0 ? t0.next = t1.next : d3_timer_queue = t1.next; - } else { - then = Math.min(then, t1.then + t1.delay); - t1 = (t0 = t1).next; - } - } - return then; -} - -var d3_timer_frame = window.requestAnimationFrame - || window.webkitRequestAnimationFrame - || window.mozRequestAnimationFrame - || window.oRequestAnimationFrame - || window.msRequestAnimationFrame - || function(callback) { setTimeout(callback, 17); }; -function d3_noop() {} -d3.scale = {}; - -function d3_scaleExtent(domain) { - var start = domain[0], stop = domain[domain.length - 1]; - return start < stop ? [start, stop] : [stop, start]; -} -function d3_scale_nice(domain, nice) { - var i0 = 0, - i1 = domain.length - 1, - x0 = domain[i0], - x1 = domain[i1], - dx; - - if (x1 < x0) { - dx = i0; i0 = i1; i1 = dx; - dx = x0; x0 = x1; x1 = dx; - } - - if (dx = x1 - x0) { - nice = nice(dx); - domain[i0] = nice.floor(x0); - domain[i1] = nice.ceil(x1); - } - - return domain; -} - -function d3_scale_niceDefault() { - return Math; -} -d3.scale.linear = function() { - return d3_scale_linear([0, 1], [0, 1], d3.interpolate, false); -}; - -function d3_scale_linear(domain, range, interpolate, clamp) { - var output, - input; - - function rescale() { - var linear = domain.length == 2 ? d3_scale_bilinear : d3_scale_polylinear, - uninterpolate = clamp ? d3_uninterpolateClamp : d3_uninterpolateNumber; - output = linear(domain, range, uninterpolate, interpolate); - input = linear(range, domain, uninterpolate, d3.interpolate); - return scale; - } - - function scale(x) { - return output(x); - } - - // Note: requires range is coercible to number! - scale.invert = function(y) { - return input(y); - }; - - scale.domain = function(x) { - if (!arguments.length) return domain; - domain = x.map(Number); - return rescale(); - }; - - scale.range = function(x) { - if (!arguments.length) return range; - range = x; - return rescale(); - }; - - scale.rangeRound = function(x) { - return scale.range(x).interpolate(d3.interpolateRound); - }; - - scale.clamp = function(x) { - if (!arguments.length) return clamp; - clamp = x; - return rescale(); - }; - - scale.interpolate = function(x) { - if (!arguments.length) return interpolate; - interpolate = x; - return rescale(); - }; - - scale.ticks = function(m) { - return d3_scale_linearTicks(domain, m); - }; - - scale.tickFormat = function(m) { - return d3_scale_linearTickFormat(domain, m); - }; - - scale.nice = function() { - d3_scale_nice(domain, d3_scale_linearNice); - return rescale(); - }; - - scale.copy = function() { - return d3_scale_linear(domain, range, interpolate, clamp); - }; - - return rescale(); -}; - -function d3_scale_linearRebind(scale, linear) { - scale.range = d3.rebind(scale, linear.range); - scale.rangeRound = d3.rebind(scale, linear.rangeRound); - scale.interpolate = d3.rebind(scale, linear.interpolate); - scale.clamp = d3.rebind(scale, linear.clamp); - return scale; -} - -function d3_scale_linearNice(dx) { - dx = Math.pow(10, Math.round(Math.log(dx) / Math.LN10) - 1); - return { - floor: function(x) { return Math.floor(x / dx) * dx; }, - ceil: function(x) { return Math.ceil(x / dx) * dx; } - }; -} - -// TODO Dates? Ugh. -function d3_scale_linearTickRange(domain, m) { - var extent = d3_scaleExtent(domain), - span = extent[1] - extent[0], - step = Math.pow(10, Math.floor(Math.log(span / m) / Math.LN10)), - err = m / span * step; - - // Filter ticks to get closer to the desired count. - if (err <= .15) step *= 10; - else if (err <= .35) step *= 5; - else if (err <= .75) step *= 2; - - // Round start and stop values to step interval. - extent[0] = Math.ceil(extent[0] / step) * step; - extent[1] = Math.floor(extent[1] / step) * step + step * .5; // inclusive - extent[2] = step; - return extent; -} - -function d3_scale_linearTicks(domain, m) { - return d3.range.apply(d3, d3_scale_linearTickRange(domain, m)); -} - -function d3_scale_linearTickFormat(domain, m) { - return d3.format(",." + Math.max(0, -Math.floor(Math.log(d3_scale_linearTickRange(domain, m)[2]) / Math.LN10 + .01)) + "f"); -} -function d3_scale_bilinear(domain, range, uninterpolate, interpolate) { - var u = uninterpolate(domain[0], domain[1]), - i = interpolate(range[0], range[1]); - return function(x) { - return i(u(x)); - }; -} -function d3_scale_polylinear(domain, range, uninterpolate, interpolate) { - var u = [], - i = [], - j = 0, - n = domain.length; - - while (++j < n) { - u.push(uninterpolate(domain[j - 1], domain[j])); - i.push(interpolate(range[j - 1], range[j])); - } - - return function(x) { - var j = d3.bisect(domain, x, 1, domain.length - 1) - 1; - return i[j](u[j](x)); - }; -} -d3.scale.log = function() { - return d3_scale_log(d3.scale.linear(), d3_scale_logp); -}; - -function d3_scale_log(linear, log) { - var pow = log.pow; - - function scale(x) { - return linear(log(x)); - } - - scale.invert = function(x) { - return pow(linear.invert(x)); - }; - - scale.domain = function(x) { - if (!arguments.length) return linear.domain().map(pow); - log = x[0] < 0 ? d3_scale_logn : d3_scale_logp; - pow = log.pow; - linear.domain(x.map(log)); - return scale; - }; - - scale.nice = function() { - linear.domain(d3_scale_nice(linear.domain(), d3_scale_niceDefault)); - return scale; - }; - - scale.ticks = function() { - var extent = d3_scaleExtent(linear.domain()), - ticks = []; - if (extent.every(isFinite)) { - var i = Math.floor(extent[0]), - j = Math.ceil(extent[1]), - u = Math.round(pow(extent[0])), - v = Math.round(pow(extent[1])); - if (log === d3_scale_logn) { - ticks.push(pow(i)); - for (; i++ < j;) for (var k = 9; k > 0; k--) ticks.push(pow(i) * k); - } else { - for (; i < j; i++) for (var k = 1; k < 10; k++) ticks.push(pow(i) * k); - ticks.push(pow(i)); - } - for (i = 0; ticks[i] < u; i++) {} // strip small values - for (j = ticks.length; ticks[j - 1] > v; j--) {} // strip big values - ticks = ticks.slice(i, j); - } - return ticks; - }; - - scale.tickFormat = function(n, format) { - if (arguments.length < 2) format = d3_scale_logFormat; - if (arguments.length < 1) return format; - var k = n / scale.ticks().length, - f = log === d3_scale_logn ? (e = -1e-15, Math.floor) : (e = 1e-15, Math.ceil), - e; - return function(d) { - return d / pow(f(log(d) + e)) < k ? format(d) : ""; - }; - }; - - scale.copy = function() { - return d3_scale_log(linear.copy(), log); - }; - - return d3_scale_linearRebind(scale, linear); -}; - -var d3_scale_logFormat = d3.format("e"); - -function d3_scale_logp(x) { - return Math.log(x) / Math.LN10; -} - -function d3_scale_logn(x) { - return -Math.log(-x) / Math.LN10; -} - -d3_scale_logp.pow = function(x) { - return Math.pow(10, x); -}; - -d3_scale_logn.pow = function(x) { - return -Math.pow(10, -x); -}; -d3.scale.pow = function() { - return d3_scale_pow(d3.scale.linear(), 1); -}; - -function d3_scale_pow(linear, exponent) { - var powp = d3_scale_powPow(exponent), - powb = d3_scale_powPow(1 / exponent); - - function scale(x) { - return linear(powp(x)); - } - - scale.invert = function(x) { - return powb(linear.invert(x)); - }; - - scale.domain = function(x) { - if (!arguments.length) return linear.domain().map(powb); - linear.domain(x.map(powp)); - return scale; - }; - - scale.ticks = function(m) { - return d3_scale_linearTicks(scale.domain(), m); - }; - - scale.tickFormat = function(m) { - return d3_scale_linearTickFormat(scale.domain(), m); - }; - - scale.nice = function() { - return scale.domain(d3_scale_nice(scale.domain(), d3_scale_linearNice)); - }; - - scale.exponent = function(x) { - if (!arguments.length) return exponent; - var domain = scale.domain(); - powp = d3_scale_powPow(exponent = x); - powb = d3_scale_powPow(1 / exponent); - return scale.domain(domain); - }; - - scale.copy = function() { - return d3_scale_pow(linear.copy(), exponent); - }; - - return d3_scale_linearRebind(scale, linear); -}; - -function d3_scale_powPow(e) { - return function(x) { - return x < 0 ? -Math.pow(-x, e) : Math.pow(x, e); - }; -} -d3.scale.sqrt = function() { - return d3.scale.pow().exponent(.5); -}; -d3.scale.ordinal = function() { - return d3_scale_ordinal([], {t: "range", x: []}); -}; - -function d3_scale_ordinal(domain, ranger) { - var index, - range, - rangeBand; - - function scale(x) { - return range[((index[x] || (index[x] = domain.push(x))) - 1) % range.length]; - } - - scale.domain = function(x) { - if (!arguments.length) return domain; - domain = []; - index = {}; - var i = -1, n = x.length, xi; - while (++i < n) if (!index[xi = x[i]]) index[xi] = domain.push(xi); - return scale[ranger.t](ranger.x, ranger.p); - }; - - scale.range = function(x) { - if (!arguments.length) return range; - range = x; - rangeBand = 0; - ranger = {t: "range", x: x}; - return scale; - }; - - scale.rangePoints = function(x, padding) { - if (arguments.length < 2) padding = 0; - var start = x[0], - stop = x[1], - step = (stop - start) / (domain.length - 1 + padding); - range = domain.length < 2 ? [(start + stop) / 2] : d3.range(start + step * padding / 2, stop + step / 2, step); - rangeBand = 0; - ranger = {t: "rangePoints", x: x, p: padding}; - return scale; - }; - - scale.rangeBands = function(x, padding) { - if (arguments.length < 2) padding = 0; - var start = x[0], - stop = x[1], - step = (stop - start) / (domain.length + padding); - range = d3.range(start + step * padding, stop, step); - rangeBand = step * (1 - padding); - ranger = {t: "rangeBands", x: x, p: padding}; - return scale; - }; - - scale.rangeRoundBands = function(x, padding) { - if (arguments.length < 2) padding = 0; - var start = x[0], - stop = x[1], - step = Math.floor((stop - start) / (domain.length + padding)), - err = stop - start - (domain.length - padding) * step; - range = d3.range(start + Math.round(err / 2), stop, step); - rangeBand = Math.round(step * (1 - padding)); - ranger = {t: "rangeRoundBands", x: x, p: padding}; - return scale; - }; - - scale.rangeBand = function() { - return rangeBand; - }; - - scale.copy = function() { - return d3_scale_ordinal(domain, ranger); - }; - - return scale.domain(domain); -}; -/* - * This product includes color specifications and designs developed by Cynthia - * Brewer (http://colorbrewer.org/). See lib/colorbrewer for more information. - */ - -d3.scale.category10 = function() { - return d3.scale.ordinal().range(d3_category10); -}; - -d3.scale.category20 = function() { - return d3.scale.ordinal().range(d3_category20); -}; - -d3.scale.category20b = function() { - return d3.scale.ordinal().range(d3_category20b); -}; - -d3.scale.category20c = function() { - return d3.scale.ordinal().range(d3_category20c); -}; - -var d3_category10 = [ - "#1f77b4", "#ff7f0e", "#2ca02c", "#d62728", "#9467bd", - "#8c564b", "#e377c2", "#7f7f7f", "#bcbd22", "#17becf" -]; - -var d3_category20 = [ - "#1f77b4", "#aec7e8", - "#ff7f0e", "#ffbb78", - "#2ca02c", "#98df8a", - "#d62728", "#ff9896", - "#9467bd", "#c5b0d5", - "#8c564b", "#c49c94", - "#e377c2", "#f7b6d2", - "#7f7f7f", "#c7c7c7", - "#bcbd22", "#dbdb8d", - "#17becf", "#9edae5" -]; - -var d3_category20b = [ - "#393b79", "#5254a3", "#6b6ecf", "#9c9ede", - "#637939", "#8ca252", "#b5cf6b", "#cedb9c", - "#8c6d31", "#bd9e39", "#e7ba52", "#e7cb94", - "#843c39", "#ad494a", "#d6616b", "#e7969c", - "#7b4173", "#a55194", "#ce6dbd", "#de9ed6" -]; - -var d3_category20c = [ - "#3182bd", "#6baed6", "#9ecae1", "#c6dbef", - "#e6550d", "#fd8d3c", "#fdae6b", "#fdd0a2", - "#31a354", "#74c476", "#a1d99b", "#c7e9c0", - "#756bb1", "#9e9ac8", "#bcbddc", "#dadaeb", - "#636363", "#969696", "#bdbdbd", "#d9d9d9" -]; -d3.scale.quantile = function() { - return d3_scale_quantile([], []); -}; - -function d3_scale_quantile(domain, range) { - var thresholds; - - function rescale() { - var k = 0, - n = domain.length, - q = range.length; - thresholds = []; - while (++k < q) thresholds[k - 1] = d3.quantile(domain, k / q); - return scale; - } - - function scale(x) { - if (isNaN(x = +x)) return NaN; - return range[d3.bisect(thresholds, x)]; - } - - scale.domain = function(x) { - if (!arguments.length) return domain; - domain = x.filter(function(d) { return !isNaN(d); }).sort(d3.ascending); - return rescale(); - }; - - scale.range = function(x) { - if (!arguments.length) return range; - range = x; - return rescale(); - }; - - scale.quantiles = function() { - return thresholds; - }; - - scale.copy = function() { - return d3_scale_quantile(domain, range); // copy on write! - }; - - return rescale(); -}; -d3.scale.quantize = function() { - return d3_scale_quantize(0, 1, [0, 1]); -}; - -function d3_scale_quantize(x0, x1, range) { - var kx, i; - - function scale(x) { - return range[Math.max(0, Math.min(i, Math.floor(kx * (x - x0))))]; - } - - function rescale() { - kx = range.length / (x1 - x0); - i = range.length - 1; - return scale; - } - - scale.domain = function(x) { - if (!arguments.length) return [x0, x1]; - x0 = +x[0]; - x1 = +x[x.length - 1]; - return rescale(); - }; - - scale.range = function(x) { - if (!arguments.length) return range; - range = x; - return rescale(); - }; - - scale.copy = function() { - return d3_scale_quantize(x0, x1, range); // copy on write - }; - - return rescale(); -}; -d3.svg = {}; -d3.svg.arc = function() { - var innerRadius = d3_svg_arcInnerRadius, - outerRadius = d3_svg_arcOuterRadius, - startAngle = d3_svg_arcStartAngle, - endAngle = d3_svg_arcEndAngle; - - function arc() { - var r0 = innerRadius.apply(this, arguments), - r1 = outerRadius.apply(this, arguments), - a0 = startAngle.apply(this, arguments) + d3_svg_arcOffset, - a1 = endAngle.apply(this, arguments) + d3_svg_arcOffset, - da = (a1 < a0 && (da = a0, a0 = a1, a1 = da), a1 - a0), - df = da < Math.PI ? "0" : "1", - c0 = Math.cos(a0), - s0 = Math.sin(a0), - c1 = Math.cos(a1), - s1 = Math.sin(a1); - return da >= d3_svg_arcMax - ? (r0 - ? "M0," + r1 - + "A" + r1 + "," + r1 + " 0 1,1 0," + (-r1) - + "A" + r1 + "," + r1 + " 0 1,1 0," + r1 - + "M0," + r0 - + "A" + r0 + "," + r0 + " 0 1,0 0," + (-r0) - + "A" + r0 + "," + r0 + " 0 1,0 0," + r0 - + "Z" - : "M0," + r1 - + "A" + r1 + "," + r1 + " 0 1,1 0," + (-r1) - + "A" + r1 + "," + r1 + " 0 1,1 0," + r1 - + "Z") - : (r0 - ? "M" + r1 * c0 + "," + r1 * s0 - + "A" + r1 + "," + r1 + " 0 " + df + ",1 " + r1 * c1 + "," + r1 * s1 - + "L" + r0 * c1 + "," + r0 * s1 - + "A" + r0 + "," + r0 + " 0 " + df + ",0 " + r0 * c0 + "," + r0 * s0 - + "Z" - : "M" + r1 * c0 + "," + r1 * s0 - + "A" + r1 + "," + r1 + " 0 " + df + ",1 " + r1 * c1 + "," + r1 * s1 - + "L0,0" - + "Z"); - } - - arc.innerRadius = function(v) { - if (!arguments.length) return innerRadius; - innerRadius = d3.functor(v); - return arc; - }; - - arc.outerRadius = function(v) { - if (!arguments.length) return outerRadius; - outerRadius = d3.functor(v); - return arc; - }; - - arc.startAngle = function(v) { - if (!arguments.length) return startAngle; - startAngle = d3.functor(v); - return arc; - }; - - arc.endAngle = function(v) { - if (!arguments.length) return endAngle; - endAngle = d3.functor(v); - return arc; - }; - - arc.centroid = function() { - var r = (innerRadius.apply(this, arguments) - + outerRadius.apply(this, arguments)) / 2, - a = (startAngle.apply(this, arguments) - + endAngle.apply(this, arguments)) / 2 + d3_svg_arcOffset; - return [Math.cos(a) * r, Math.sin(a) * r]; - }; - - return arc; -}; - -var d3_svg_arcOffset = -Math.PI / 2, - d3_svg_arcMax = 2 * Math.PI - 1e-6; - -function d3_svg_arcInnerRadius(d) { - return d.innerRadius; -} - -function d3_svg_arcOuterRadius(d) { - return d.outerRadius; -} - -function d3_svg_arcStartAngle(d) { - return d.startAngle; -} - -function d3_svg_arcEndAngle(d) { - return d.endAngle; -} -function d3_svg_line(projection) { - var x = d3_svg_lineX, - y = d3_svg_lineY, - interpolate = "linear", - interpolator = d3_svg_lineInterpolators[interpolate], - tension = .7; - - function line(d) { - return d.length < 1 ? null : "M" + interpolator(projection(d3_svg_linePoints(this, d, x, y)), tension); - } - - line.x = function(v) { - if (!arguments.length) return x; - x = v; - return line; - }; - - line.y = function(v) { - if (!arguments.length) return y; - y = v; - return line; - }; - - line.interpolate = function(v) { - if (!arguments.length) return interpolate; - interpolator = d3_svg_lineInterpolators[interpolate = v]; - return line; - }; - - line.tension = function(v) { - if (!arguments.length) return tension; - tension = v; - return line; - }; - - return line; -} - -d3.svg.line = function() { - return d3_svg_line(Object); -}; - -// Converts the specified array of data into an array of points -// (x-y tuples), by evaluating the specified `x` and `y` functions on each -// data point. The `this` context of the evaluated functions is the specified -// "self" object; each function is passed the current datum and index. -function d3_svg_linePoints(self, d, x, y) { - var points = [], - i = -1, - n = d.length, - fx = typeof x === "function", - fy = typeof y === "function", - value; - if (fx && fy) { - while (++i < n) points.push([ - x.call(self, value = d[i], i), - y.call(self, value, i) - ]); - } else if (fx) { - while (++i < n) points.push([x.call(self, d[i], i), y]); - } else if (fy) { - while (++i < n) points.push([x, y.call(self, d[i], i)]); - } else { - while (++i < n) points.push([x, y]); - } - return points; -} - -// The default `x` property, which references d[0]. -function d3_svg_lineX(d) { - return d[0]; -} - -// The default `y` property, which references d[1]. -function d3_svg_lineY(d) { - return d[1]; -} - -// The various interpolators supported by the `line` class. -var d3_svg_lineInterpolators = { - "linear": d3_svg_lineLinear, - "step-before": d3_svg_lineStepBefore, - "step-after": d3_svg_lineStepAfter, - "basis": d3_svg_lineBasis, - "basis-open": d3_svg_lineBasisOpen, - "basis-closed": d3_svg_lineBasisClosed, - "bundle": d3_svg_lineBundle, - "cardinal": d3_svg_lineCardinal, - "cardinal-open": d3_svg_lineCardinalOpen, - "cardinal-closed": d3_svg_lineCardinalClosed, - "monotone": d3_svg_lineMonotone -}; - -// Linear interpolation; generates "L" commands. -function d3_svg_lineLinear(points) { - var i = 0, - n = points.length, - p = points[0], - path = [p[0], ",", p[1]]; - while (++i < n) path.push("L", (p = points[i])[0], ",", p[1]); - return path.join(""); -} - -// Step interpolation; generates "H" and "V" commands. -function d3_svg_lineStepBefore(points) { - var i = 0, - n = points.length, - p = points[0], - path = [p[0], ",", p[1]]; - while (++i < n) path.push("V", (p = points[i])[1], "H", p[0]); - return path.join(""); -} - -// Step interpolation; generates "H" and "V" commands. -function d3_svg_lineStepAfter(points) { - var i = 0, - n = points.length, - p = points[0], - path = [p[0], ",", p[1]]; - while (++i < n) path.push("H", (p = points[i])[0], "V", p[1]); - return path.join(""); -} - -// Open cardinal spline interpolation; generates "C" commands. -function d3_svg_lineCardinalOpen(points, tension) { - return points.length < 4 - ? d3_svg_lineLinear(points) - : points[1] + d3_svg_lineHermite(points.slice(1, points.length - 1), - d3_svg_lineCardinalTangents(points, tension)); -} - -// Closed cardinal spline interpolation; generates "C" commands. -function d3_svg_lineCardinalClosed(points, tension) { - return points.length < 3 - ? d3_svg_lineLinear(points) - : points[0] + d3_svg_lineHermite((points.push(points[0]), points), - d3_svg_lineCardinalTangents([points[points.length - 2]] - .concat(points, [points[1]]), tension)); -} - -// Cardinal spline interpolation; generates "C" commands. -function d3_svg_lineCardinal(points, tension, closed) { - return points.length < 3 - ? d3_svg_lineLinear(points) - : points[0] + d3_svg_lineHermite(points, - d3_svg_lineCardinalTangents(points, tension)); -} - -// Hermite spline construction; generates "C" commands. -function d3_svg_lineHermite(points, tangents) { - if (tangents.length < 1 - || (points.length != tangents.length - && points.length != tangents.length + 2)) { - return d3_svg_lineLinear(points); - } - - var quad = points.length != tangents.length, - path = "", - p0 = points[0], - p = points[1], - t0 = tangents[0], - t = t0, - pi = 1; - - if (quad) { - path += "Q" + (p[0] - t0[0] * 2 / 3) + "," + (p[1] - t0[1] * 2 / 3) - + "," + p[0] + "," + p[1]; - p0 = points[1]; - pi = 2; - } - - if (tangents.length > 1) { - t = tangents[1]; - p = points[pi]; - pi++; - path += "C" + (p0[0] + t0[0]) + "," + (p0[1] + t0[1]) - + "," + (p[0] - t[0]) + "," + (p[1] - t[1]) - + "," + p[0] + "," + p[1]; - for (var i = 2; i < tangents.length; i++, pi++) { - p = points[pi]; - t = tangents[i]; - path += "S" + (p[0] - t[0]) + "," + (p[1] - t[1]) - + "," + p[0] + "," + p[1]; - } - } - - if (quad) { - var lp = points[pi]; - path += "Q" + (p[0] + t[0] * 2 / 3) + "," + (p[1] + t[1] * 2 / 3) - + "," + lp[0] + "," + lp[1]; - } - - return path; -} - -// Generates tangents for a cardinal spline. -function d3_svg_lineCardinalTangents(points, tension) { - var tangents = [], - a = (1 - tension) / 2, - p0, - p1 = points[0], - p2 = points[1], - i = 1, - n = points.length; - while (++i < n) { - p0 = p1; - p1 = p2; - p2 = points[i]; - tangents.push([a * (p2[0] - p0[0]), a * (p2[1] - p0[1])]); - } - return tangents; -} - -// B-spline interpolation; generates "C" commands. -function d3_svg_lineBasis(points) { - if (points.length < 3) return d3_svg_lineLinear(points); - var i = 1, - n = points.length, - pi = points[0], - x0 = pi[0], - y0 = pi[1], - px = [x0, x0, x0, (pi = points[1])[0]], - py = [y0, y0, y0, pi[1]], - path = [x0, ",", y0]; - d3_svg_lineBasisBezier(path, px, py); - while (++i < n) { - pi = points[i]; - px.shift(); px.push(pi[0]); - py.shift(); py.push(pi[1]); - d3_svg_lineBasisBezier(path, px, py); - } - i = -1; - while (++i < 2) { - px.shift(); px.push(pi[0]); - py.shift(); py.push(pi[1]); - d3_svg_lineBasisBezier(path, px, py); - } - return path.join(""); -} - -// Open B-spline interpolation; generates "C" commands. -function d3_svg_lineBasisOpen(points) { - if (points.length < 4) return d3_svg_lineLinear(points); - var path = [], - i = -1, - n = points.length, - pi, - px = [0], - py = [0]; - while (++i < 3) { - pi = points[i]; - px.push(pi[0]); - py.push(pi[1]); - } - path.push(d3_svg_lineDot4(d3_svg_lineBasisBezier3, px) - + "," + d3_svg_lineDot4(d3_svg_lineBasisBezier3, py)); - --i; while (++i < n) { - pi = points[i]; - px.shift(); px.push(pi[0]); - py.shift(); py.push(pi[1]); - d3_svg_lineBasisBezier(path, px, py); - } - return path.join(""); -} - -// Closed B-spline interpolation; generates "C" commands. -function d3_svg_lineBasisClosed(points) { - var path, - i = -1, - n = points.length, - m = n + 4, - pi, - px = [], - py = []; - while (++i < 4) { - pi = points[i % n]; - px.push(pi[0]); - py.push(pi[1]); - } - path = [ - d3_svg_lineDot4(d3_svg_lineBasisBezier3, px), ",", - d3_svg_lineDot4(d3_svg_lineBasisBezier3, py) - ]; - --i; while (++i < m) { - pi = points[i % n]; - px.shift(); px.push(pi[0]); - py.shift(); py.push(pi[1]); - d3_svg_lineBasisBezier(path, px, py); - } - return path.join(""); -} - -function d3_svg_lineBundle(points, tension) { - var n = points.length - 1, - x0 = points[0][0], - y0 = points[0][1], - dx = points[n][0] - x0, - dy = points[n][1] - y0, - i = -1, - p, - t; - while (++i <= n) { - p = points[i]; - t = i / n; - p[0] = tension * p[0] + (1 - tension) * (x0 + t * dx); - p[1] = tension * p[1] + (1 - tension) * (y0 + t * dy); - } - return d3_svg_lineBasis(points); -} - -// Returns the dot product of the given four-element vectors. -function d3_svg_lineDot4(a, b) { - return a[0] * b[0] + a[1] * b[1] + a[2] * b[2] + a[3] * b[3]; -} - -// Matrix to transform basis (b-spline) control points to bezier -// control points. Derived from FvD 11.2.8. -var d3_svg_lineBasisBezier1 = [0, 2/3, 1/3, 0], - d3_svg_lineBasisBezier2 = [0, 1/3, 2/3, 0], - d3_svg_lineBasisBezier3 = [0, 1/6, 2/3, 1/6]; - -// Pushes a "C" Bézier curve onto the specified path array, given the -// two specified four-element arrays which define the control points. -function d3_svg_lineBasisBezier(path, x, y) { - path.push( - "C", d3_svg_lineDot4(d3_svg_lineBasisBezier1, x), - ",", d3_svg_lineDot4(d3_svg_lineBasisBezier1, y), - ",", d3_svg_lineDot4(d3_svg_lineBasisBezier2, x), - ",", d3_svg_lineDot4(d3_svg_lineBasisBezier2, y), - ",", d3_svg_lineDot4(d3_svg_lineBasisBezier3, x), - ",", d3_svg_lineDot4(d3_svg_lineBasisBezier3, y)); -} - -// Computes the slope from points p0 to p1. -function d3_svg_lineSlope(p0, p1) { - return (p1[1] - p0[1]) / (p1[0] - p0[0]); -} - -// Compute three-point differences for the given points. -// http://en.wikipedia.org/wiki/Cubic_Hermite_spline#Finite_difference -function d3_svg_lineFiniteDifferences(points) { - var i = 0, - j = points.length - 1, - m = [], - p0 = points[0], - p1 = points[1], - d = m[0] = d3_svg_lineSlope(p0, p1); - while (++i < j) { - m[i] = d + (d = d3_svg_lineSlope(p0 = p1, p1 = points[i + 1])); - } - m[i] = d; - return m; -} - -// Interpolates the given points using Fritsch-Carlson Monotone cubic Hermite -// interpolation. Returns an array of tangent vectors. For details, see -// http://en.wikipedia.org/wiki/Monotone_cubic_interpolation -function d3_svg_lineMonotoneTangents(points) { - var tangents = [], - d, - a, - b, - s, - m = d3_svg_lineFiniteDifferences(points), - i = -1, - j = points.length - 1; - - // The first two steps are done by computing finite-differences: - // 1. Compute the slopes of the secant lines between successive points. - // 2. Initialize the tangents at every point as the average of the secants. - - // Then, for each segment… - while (++i < j) { - d = d3_svg_lineSlope(points[i], points[i + 1]); - - // 3. If two successive yk = y{k + 1} are equal (i.e., d is zero), then set - // mk = m{k + 1} = 0 as the spline connecting these points must be flat to - // preserve monotonicity. Ignore step 4 and 5 for those k. - - if (Math.abs(d) < 1e-6) { - m[i] = m[i + 1] = 0; - } else { - // 4. Let ak = mk / dk and bk = m{k + 1} / dk. - a = m[i] / d; - b = m[i + 1] / d; - - // 5. Prevent overshoot and ensure monotonicity by restricting the - // magnitude of vector <ak, bk> to a circle of radius 3. - s = a * a + b * b; - if (s > 9) { - s = d * 3 / Math.sqrt(s); - m[i] = s * a; - m[i + 1] = s * b; - } - } - } - - // Compute the normalized tangent vector from the slopes. Note that if x is - // not monotonic, it's possible that the slope will be infinite, so we protect - // against NaN by setting the coordinate to zero. - i = -1; while (++i <= j) { - s = (points[Math.min(j, i + 1)][0] - points[Math.max(0, i - 1)][0]) - / (6 * (1 + m[i] * m[i])); - tangents.push([s || 0, m[i] * s || 0]); - } - - return tangents; -} - -function d3_svg_lineMonotone(points) { - return points.length < 3 - ? d3_svg_lineLinear(points) - : points[0] + - d3_svg_lineHermite(points, d3_svg_lineMonotoneTangents(points)); -} -d3.svg.line.radial = function() { - var line = d3_svg_line(d3_svg_lineRadial); - line.radius = line.x, delete line.x; - line.angle = line.y, delete line.y; - return line; -}; - -function d3_svg_lineRadial(points) { - var point, - i = -1, - n = points.length, - r, - a; - while (++i < n) { - point = points[i]; - r = point[0]; - a = point[1] + d3_svg_arcOffset; - point[0] = r * Math.cos(a); - point[1] = r * Math.sin(a); - } - return points; -} -function d3_svg_area(projection) { - var x0 = d3_svg_lineX, - x1 = d3_svg_lineX, - y0 = 0, - y1 = d3_svg_lineY, - interpolate, - i0, - i1, - tension = .7; - - function area(d) { - if (d.length < 1) return null; - var points0 = d3_svg_linePoints(this, d, x0, y0), - points1 = d3_svg_linePoints(this, d, x0 === x1 ? d3_svg_areaX(points0) : x1, y0 === y1 ? d3_svg_areaY(points0) : y1); - return "M" + i0(projection(points1), tension) - + "L" + i1(projection(points0.reverse()), tension) - + "Z"; - } - - area.x = function(x) { - if (!arguments.length) return x1; - x0 = x1 = x; - return area; - }; - - area.x0 = function(x) { - if (!arguments.length) return x0; - x0 = x; - return area; - }; - - area.x1 = function(x) { - if (!arguments.length) return x1; - x1 = x; - return area; - }; - - area.y = function(y) { - if (!arguments.length) return y1; - y0 = y1 = y; - return area; - }; - - area.y0 = function(y) { - if (!arguments.length) return y0; - y0 = y; - return area; - }; - - area.y1 = function(y) { - if (!arguments.length) return y1; - y1 = y; - return area; - }; - - area.interpolate = function(x) { - if (!arguments.length) return interpolate; - i0 = d3_svg_lineInterpolators[interpolate = x]; - i1 = i0.reverse || i0; - return area; - }; - - area.tension = function(x) { - if (!arguments.length) return tension; - tension = x; - return area; - }; - - return area.interpolate("linear"); -} - -d3_svg_lineStepBefore.reverse = d3_svg_lineStepAfter; -d3_svg_lineStepAfter.reverse = d3_svg_lineStepBefore; - -d3.svg.area = function() { - return d3_svg_area(Object); -}; - -function d3_svg_areaX(points) { - return function(d, i) { - return points[i][0]; - }; -} - -function d3_svg_areaY(points) { - return function(d, i) { - return points[i][1]; - }; -} -d3.svg.area.radial = function() { - var area = d3_svg_area(d3_svg_lineRadial); - area.radius = area.x, delete area.x; - area.innerRadius = area.x0, delete area.x0; - area.outerRadius = area.x1, delete area.x1; - area.angle = area.y, delete area.y; - area.startAngle = area.y0, delete area.y0; - area.endAngle = area.y1, delete area.y1; - return area; -}; -d3.svg.chord = function() { - var source = d3_svg_chordSource, - target = d3_svg_chordTarget, - radius = d3_svg_chordRadius, - startAngle = d3_svg_arcStartAngle, - endAngle = d3_svg_arcEndAngle; - - // TODO Allow control point to be customized. - - function chord(d, i) { - var s = subgroup(this, source, d, i), - t = subgroup(this, target, d, i); - return "M" + s.p0 - + arc(s.r, s.p1) + (equals(s, t) - ? curve(s.r, s.p1, s.r, s.p0) - : curve(s.r, s.p1, t.r, t.p0) - + arc(t.r, t.p1) - + curve(t.r, t.p1, s.r, s.p0)) - + "Z"; - } - - function subgroup(self, f, d, i) { - var subgroup = f.call(self, d, i), - r = radius.call(self, subgroup, i), - a0 = startAngle.call(self, subgroup, i) + d3_svg_arcOffset, - a1 = endAngle.call(self, subgroup, i) + d3_svg_arcOffset; - return { - r: r, - a0: a0, - a1: a1, - p0: [r * Math.cos(a0), r * Math.sin(a0)], - p1: [r * Math.cos(a1), r * Math.sin(a1)] - }; - } - - function equals(a, b) { - return a.a0 == b.a0 && a.a1 == b.a1; - } - - function arc(r, p) { - return "A" + r + "," + r + " 0 0,1 " + p; - } - - function curve(r0, p0, r1, p1) { - return "Q 0,0 " + p1; - } - - chord.radius = function(v) { - if (!arguments.length) return radius; - radius = d3.functor(v); - return chord; - }; - - chord.source = function(v) { - if (!arguments.length) return source; - source = d3.functor(v); - return chord; - }; - - chord.target = function(v) { - if (!arguments.length) return target; - target = d3.functor(v); - return chord; - }; - - chord.startAngle = function(v) { - if (!arguments.length) return startAngle; - startAngle = d3.functor(v); - return chord; - }; - - chord.endAngle = function(v) { - if (!arguments.length) return endAngle; - endAngle = d3.functor(v); - return chord; - }; - - return chord; -}; - -function d3_svg_chordSource(d) { - return d.source; -} - -function d3_svg_chordTarget(d) { - return d.target; -} - -function d3_svg_chordRadius(d) { - return d.radius; -} - -function d3_svg_chordStartAngle(d) { - return d.startAngle; -} - -function d3_svg_chordEndAngle(d) { - return d.endAngle; -} -d3.svg.diagonal = function() { - var source = d3_svg_chordSource, - target = d3_svg_chordTarget, - projection = d3_svg_diagonalProjection; - - function diagonal(d, i) { - var p0 = source.call(this, d, i), - p3 = target.call(this, d, i), - m = (p0.y + p3.y) / 2, - p = [p0, {x: p0.x, y: m}, {x: p3.x, y: m}, p3]; - p = p.map(projection); - return "M" + p[0] + "C" + p[1] + " " + p[2] + " " + p[3]; - } - - diagonal.source = function(x) { - if (!arguments.length) return source; - source = d3.functor(x); - return diagonal; - }; - - diagonal.target = function(x) { - if (!arguments.length) return target; - target = d3.functor(x); - return diagonal; - }; - - diagonal.projection = function(x) { - if (!arguments.length) return projection; - projection = x; - return diagonal; - }; - - return diagonal; -}; - -function d3_svg_diagonalProjection(d) { - return [d.x, d.y]; -} -d3.svg.diagonal.radial = function() { - var diagonal = d3.svg.diagonal(), - projection = d3_svg_diagonalProjection, - projection_ = diagonal.projection; - - diagonal.projection = function(x) { - return arguments.length - ? projection_(d3_svg_diagonalRadialProjection(projection = x)) - : projection; - }; - - return diagonal; -}; - -function d3_svg_diagonalRadialProjection(projection) { - return function() { - var d = projection.apply(this, arguments), - r = d[0], - a = d[1] + d3_svg_arcOffset; - return [r * Math.cos(a), r * Math.sin(a)]; - }; -} -d3.svg.mouse = function(container) { - return d3_svg_mousePoint(container, d3.event); -}; - -// https://bugs.webkit.org/show_bug.cgi?id=44083 -var d3_mouse_bug44083 = /WebKit/.test(navigator.userAgent) ? -1 : 0; - -function d3_svg_mousePoint(container, e) { - var point = (container.ownerSVGElement || container).createSVGPoint(); - if ((d3_mouse_bug44083 < 0) && (window.scrollX || window.scrollY)) { - var svg = d3.select(document.body) - .append("svg:svg") - .style("position", "absolute") - .style("top", 0) - .style("left", 0); - var ctm = svg[0][0].getScreenCTM(); - d3_mouse_bug44083 = !(ctm.f || ctm.e); - svg.remove(); - } - if (d3_mouse_bug44083) { - point.x = e.pageX; - point.y = e.pageY; - } else { - point.x = e.clientX; - point.y = e.clientY; - } - point = point.matrixTransform(container.getScreenCTM().inverse()); - return [point.x, point.y]; -}; -d3.svg.touches = function(container) { - var touches = d3.event.touches; - return touches ? d3_array(touches).map(function(touch) { - var point = d3_svg_mousePoint(container, touch); - point.identifier = touch.identifier; - return point; - }) : []; -}; -d3.svg.symbol = function() { - var type = d3_svg_symbolType, - size = d3_svg_symbolSize; - - function symbol(d, i) { - return (d3_svg_symbols[type.call(this, d, i)] - || d3_svg_symbols.circle) - (size.call(this, d, i)); - } - - symbol.type = function(x) { - if (!arguments.length) return type; - type = d3.functor(x); - return symbol; - }; - - // size of symbol in square pixels - symbol.size = function(x) { - if (!arguments.length) return size; - size = d3.functor(x); - return symbol; - }; - - return symbol; -}; - -function d3_svg_symbolSize() { - return 64; -} - -function d3_svg_symbolType() { - return "circle"; -} - -// TODO cross-diagonal? -var d3_svg_symbols = { - "circle": function(size) { - var r = Math.sqrt(size / Math.PI); - return "M0," + r - + "A" + r + "," + r + " 0 1,1 0," + (-r) - + "A" + r + "," + r + " 0 1,1 0," + r - + "Z"; - }, - "cross": function(size) { - var r = Math.sqrt(size / 5) / 2; - return "M" + -3 * r + "," + -r - + "H" + -r - + "V" + -3 * r - + "H" + r - + "V" + -r - + "H" + 3 * r - + "V" + r - + "H" + r - + "V" + 3 * r - + "H" + -r - + "V" + r - + "H" + -3 * r - + "Z"; - }, - "diamond": function(size) { - var ry = Math.sqrt(size / (2 * d3_svg_symbolTan30)), - rx = ry * d3_svg_symbolTan30; - return "M0," + -ry - + "L" + rx + ",0" - + " 0," + ry - + " " + -rx + ",0" - + "Z"; - }, - "square": function(size) { - var r = Math.sqrt(size) / 2; - return "M" + -r + "," + -r - + "L" + r + "," + -r - + " " + r + "," + r - + " " + -r + "," + r - + "Z"; - }, - "triangle-down": function(size) { - var rx = Math.sqrt(size / d3_svg_symbolSqrt3), - ry = rx * d3_svg_symbolSqrt3 / 2; - return "M0," + ry - + "L" + rx +"," + -ry - + " " + -rx + "," + -ry - + "Z"; - }, - "triangle-up": function(size) { - var rx = Math.sqrt(size / d3_svg_symbolSqrt3), - ry = rx * d3_svg_symbolSqrt3 / 2; - return "M0," + -ry - + "L" + rx +"," + ry - + " " + -rx + "," + ry - + "Z"; - } -}; - -d3.svg.symbolTypes = d3.keys(d3_svg_symbols); - -var d3_svg_symbolSqrt3 = Math.sqrt(3), - d3_svg_symbolTan30 = Math.tan(30 * Math.PI / 180); -d3.svg.axis = function() { - var scale = d3.scale.linear(), - orient = "bottom", - tickMajorSize = 6, - tickMinorSize = 6, - tickEndSize = 6, - tickPadding = 3, - tickArguments_ = [10], - tickFormat_, - tickSubdivide = 0; - - function axis(selection) { - selection.each(function(d, i, j) { - var g = d3.select(this); - - // If selection is a transition, create subtransitions. - var transition = selection.delay ? function(o) { - var id = d3_transitionInheritId; - try { - d3_transitionInheritId = selection.id; - return o.transition() - .delay(selection[j][i].delay) - .duration(selection[j][i].duration) - .ease(selection.ease()); - } finally { - d3_transitionInheritId = id; - } - } : Object; - - // Ticks. - var ticks = scale.ticks.apply(scale, tickArguments_), - tickFormat = tickFormat_ == null ? scale.tickFormat.apply(scale, tickArguments_) : tickFormat_; - - // Minor ticks. - var subticks = d3_svg_axisSubdivide(scale, ticks, tickSubdivide), - subtick = g.selectAll(".minor").data(subticks, String), - subtickEnter = subtick.enter().insert("svg:line", "g").attr("class", "tick minor").style("opacity", 1e-6), - subtickExit = transition(subtick.exit()).style("opacity", 1e-6).remove(), - subtickUpdate = transition(subtick).style("opacity", 1); - - // Major ticks. - var tick = g.selectAll("g").data(ticks, String), - tickEnter = tick.enter().insert("svg:g", "path").style("opacity", 1e-6), - tickExit = transition(tick.exit()).style("opacity", 1e-6).remove(), - tickUpdate = transition(tick).style("opacity", 1), - tickTransform; - - // Domain. - var range = d3_scaleExtent(scale.range()), - path = g.selectAll(".domain").data([0]), - pathEnter = path.enter().append("svg:path").attr("class", "domain"), - pathUpdate = transition(path); - - // Stash the new scale and grab the old scale. - var scale0 = this.__chart__ || scale; - this.__chart__ = scale.copy(); - - tickEnter.append("svg:line").attr("class", "tick"); - tickEnter.append("svg:text"); - tickUpdate.select("text").text(tickFormat); - - switch (orient) { - case "bottom": { - tickTransform = d3_svg_axisX; - subtickUpdate.attr("x2", 0).attr("y2", tickMinorSize); - tickUpdate.select("line").attr("x2", 0).attr("y2", tickMajorSize); - tickUpdate.select("text").attr("x", 0).attr("y", Math.max(tickMajorSize, 0) + tickPadding).attr("dy", ".71em").attr("text-anchor", "middle"); - pathUpdate.attr("d", "M" + range[0] + "," + tickEndSize + "V0H" + range[1] + "V" + tickEndSize); - break; - } - case "top": { - tickTransform = d3_svg_axisX; - subtickUpdate.attr("x2", 0).attr("y2", -tickMinorSize); - tickUpdate.select("line").attr("x2", 0).attr("y2", -tickMajorSize); - tickUpdate.select("text").attr("x", 0).attr("y", -(Math.max(tickMajorSize, 0) + tickPadding)).attr("dy", "0em").attr("text-anchor", "middle"); - pathUpdate.attr("d", "M" + range[0] + "," + -tickEndSize + "V0H" + range[1] + "V" + -tickEndSize); - break; - } - case "left": { - tickTransform = d3_svg_axisY; - subtickUpdate.attr("x2", -tickMinorSize).attr("y2", 0); - tickUpdate.select("line").attr("x2", -tickMajorSize).attr("y2", 0); - tickUpdate.select("text").attr("x", -(Math.max(tickMajorSize, 0) + tickPadding)).attr("y", 0).attr("dy", ".32em").attr("text-anchor", "end"); - pathUpdate.attr("d", "M" + -tickEndSize + "," + range[0] + "H0V" + range[1] + "H" + -tickEndSize); - break; - } - case "right": { - tickTransform = d3_svg_axisY; - subtickUpdate.attr("x2", tickMinorSize).attr("y2", 0); - tickUpdate.select("line").attr("x2", tickMajorSize).attr("y2", 0); - tickUpdate.select("text").attr("x", Math.max(tickMajorSize, 0) + tickPadding).attr("y", 0).attr("dy", ".32em").attr("text-anchor", "start"); - pathUpdate.attr("d", "M" + tickEndSize + "," + range[0] + "H0V" + range[1] + "H" + tickEndSize); - break; - } - } - - tickEnter.call(tickTransform, scale0); - tickUpdate.call(tickTransform, scale); - tickExit.call(tickTransform, scale); - - subtickEnter.call(tickTransform, scale0); - subtickUpdate.call(tickTransform, scale); - subtickExit.call(tickTransform, scale); - }); - } - - axis.scale = function(x) { - if (!arguments.length) return scale; - scale = x; - return axis; - }; - - axis.orient = function(x) { - if (!arguments.length) return orient; - orient = x; - return axis; - }; - - axis.ticks = function() { - if (!arguments.length) return tickArguments_; - tickArguments_ = arguments; - return axis; - }; - - axis.tickFormat = function(x) { - if (!arguments.length) return tickFormat_; - tickFormat_ = x; - return axis; - }; - - axis.tickSize = function(x, y, z) { - if (!arguments.length) return tickMajorSize; - var n = arguments.length - 1; - tickMajorSize = +x; - tickMinorSize = n > 1 ? +y : tickMajorSize; - tickEndSize = n > 0 ? +arguments[n] : tickMajorSize; - return axis; - }; - - axis.tickPadding = function(x) { - if (!arguments.length) return tickPadding; - tickPadding = +x; - return axis; - }; - - axis.tickSubdivide = function(x) { - if (!arguments.length) return tickSubdivide; - tickSubdivide = +x; - return axis; - }; - - return axis; -}; - -function d3_svg_axisX(selection, x) { - selection.attr("transform", function(d) { return "translate(" + x(d) + ",0)"; }); -} - -function d3_svg_axisY(selection, y) { - selection.attr("transform", function(d) { return "translate(0," + y(d) + ")"; }); -} - -function d3_svg_axisSubdivide(scale, ticks, m) { - subticks = []; - if (m && ticks.length > 1) { - var extent = d3_scaleExtent(scale.domain()), - subticks, - i = -1, - n = ticks.length, - d = (ticks[1] - ticks[0]) / ++m, - j, - v; - while (++i < n) { - for (j = m; --j > 0;) { - if ((v = +ticks[i] - j * d) >= extent[0]) { - subticks.push(v); - } - } - } - for (--i, j = 0; ++j < m && (v = +ticks[i] + j * d) < extent[1];) { - subticks.push(v); - } - } - return subticks; -} -d3.behavior = {}; -d3.behavior.drag = function() { - var event = d3.dispatch("drag", "dragstart", "dragend"); - - function drag() { - this - .on("mousedown.drag", mousedown) - .on("touchstart.drag", mousedown); - - d3.select(window) - .on("mousemove.drag", d3_behavior_dragMove) - .on("touchmove.drag", d3_behavior_dragMove) - .on("mouseup.drag", d3_behavior_dragUp, true) - .on("touchend.drag", d3_behavior_dragUp, true) - .on("click.drag", d3_behavior_dragClick, true); - } - - // snapshot the local context for subsequent dispatch - function start() { - d3_behavior_dragEvent = event; - d3_behavior_dragEventTarget = d3.event.target; - d3_behavior_dragOffset = d3_behavior_dragPoint((d3_behavior_dragTarget = this).parentNode); - d3_behavior_dragMoved = 0; - d3_behavior_dragArguments = arguments; - } - - function mousedown() { - start.apply(this, arguments); - d3_behavior_dragDispatch("dragstart"); - } - - drag.on = function(type, listener) { - event[type].add(listener); - return drag; - }; - - return drag; -}; - -var d3_behavior_dragEvent, - d3_behavior_dragEventTarget, - d3_behavior_dragTarget, - d3_behavior_dragArguments, - d3_behavior_dragOffset, - d3_behavior_dragMoved, - d3_behavior_dragStopClick; - -function d3_behavior_dragDispatch(type) { - var o = d3.event, p = d3_behavior_dragTarget.parentNode, dx = 0, dy = 0; - - if (p) { - p = d3_behavior_dragPoint(p); - dx = p[0] - d3_behavior_dragOffset[0]; - dy = p[1] - d3_behavior_dragOffset[1]; - d3_behavior_dragOffset = p; - d3_behavior_dragMoved |= dx | dy; - } - - try { - d3.event = {dx: dx, dy: dy}; - d3_behavior_dragEvent[type].dispatch.apply(d3_behavior_dragTarget, d3_behavior_dragArguments); - } finally { - d3.event = o; - } - - o.preventDefault(); -} - -function d3_behavior_dragPoint(container) { - return d3.event.touches - ? d3.svg.touches(container)[0] - : d3.svg.mouse(container); -} - -function d3_behavior_dragMove() { - if (!d3_behavior_dragTarget) return; - var parent = d3_behavior_dragTarget.parentNode; - - // O NOES! The drag element was removed from the DOM. - if (!parent) return d3_behavior_dragUp(); - - d3_behavior_dragDispatch("drag"); - d3_behavior_dragCancel(); -} - -function d3_behavior_dragUp() { - if (!d3_behavior_dragTarget) return; - d3_behavior_dragDispatch("dragend"); - d3_behavior_dragTarget = null; - - // If the node was moved, prevent the mouseup from propagating. - // Also prevent the subsequent click from propagating (e.g., for anchors). - if (d3_behavior_dragMoved && d3_behavior_dragEventTarget === d3.event.target) { - d3_behavior_dragStopClick = true; - d3_behavior_dragCancel(); - } -} - -function d3_behavior_dragClick() { - if (d3_behavior_dragStopClick && d3_behavior_dragEventTarget === d3.event.target) { - d3_behavior_dragCancel(); - d3_behavior_dragStopClick = false; - d3_behavior_dragEventTarget = null; - } -} - -function d3_behavior_dragCancel() { - d3.event.stopPropagation(); - d3.event.preventDefault(); -} -// TODO unbind zoom behavior? -// TODO unbind listener? -d3.behavior.zoom = function() { - var xyz = [0, 0, 0], - event = d3.dispatch("zoom"); - - function zoom() { - this - .on("mousedown.zoom", mousedown) - .on("mousewheel.zoom", mousewheel) - .on("DOMMouseScroll.zoom", mousewheel) - .on("dblclick.zoom", dblclick) - .on("touchstart.zoom", touchstart); - - d3.select(window) - .on("mousemove.zoom", d3_behavior_zoomMousemove) - .on("mouseup.zoom", d3_behavior_zoomMouseup) - .on("touchmove.zoom", d3_behavior_zoomTouchmove) - .on("touchend.zoom", d3_behavior_zoomTouchup) - .on("click.zoom", d3_behavior_zoomClick, true); - } - - // snapshot the local context for subsequent dispatch - function start() { - d3_behavior_zoomXyz = xyz; - d3_behavior_zoomDispatch = event.zoom.dispatch; - d3_behavior_zoomEventTarget = d3.event.target; - d3_behavior_zoomTarget = this; - d3_behavior_zoomArguments = arguments; - } - - function mousedown() { - start.apply(this, arguments); - d3_behavior_zoomPanning = d3_behavior_zoomLocation(d3.svg.mouse(d3_behavior_zoomTarget)); - d3_behavior_zoomMoved = false; - d3.event.preventDefault(); - window.focus(); - } - - // store starting mouse location - function mousewheel() { - start.apply(this, arguments); - if (!d3_behavior_zoomZooming) d3_behavior_zoomZooming = d3_behavior_zoomLocation(d3.svg.mouse(d3_behavior_zoomTarget)); - d3_behavior_zoomTo(d3_behavior_zoomDelta() + xyz[2], d3.svg.mouse(d3_behavior_zoomTarget), d3_behavior_zoomZooming); - } - - function dblclick() { - start.apply(this, arguments); - var mouse = d3.svg.mouse(d3_behavior_zoomTarget); - d3_behavior_zoomTo(d3.event.shiftKey ? Math.ceil(xyz[2] - 1) : Math.floor(xyz[2] + 1), mouse, d3_behavior_zoomLocation(mouse)); - } - - // doubletap detection - function touchstart() { - start.apply(this, arguments); - var touches = d3_behavior_zoomTouchup(), - touch, - now = Date.now(); - if ((touches.length === 1) && (now - d3_behavior_zoomLast < 300)) { - d3_behavior_zoomTo(1 + Math.floor(xyz[2]), touch = touches[0], d3_behavior_zoomLocations[touch.identifier]); - } - d3_behavior_zoomLast = now; - } - - zoom.on = function(type, listener) { - event[type].add(listener); - return zoom; - }; - - return zoom; -}; - -var d3_behavior_zoomDiv, - d3_behavior_zoomPanning, - d3_behavior_zoomZooming, - d3_behavior_zoomLocations = {}, // identifier -> location - d3_behavior_zoomLast = 0, - d3_behavior_zoomXyz, - d3_behavior_zoomDispatch, - d3_behavior_zoomEventTarget, - d3_behavior_zoomTarget, - d3_behavior_zoomArguments, - d3_behavior_zoomMoved, - d3_behavior_zoomStopClick; - -function d3_behavior_zoomLocation(point) { - return [ - point[0] - d3_behavior_zoomXyz[0], - point[1] - d3_behavior_zoomXyz[1], - d3_behavior_zoomXyz[2] - ]; -} - -// detect the pixels that would be scrolled by this wheel event -function d3_behavior_zoomDelta() { - - // mousewheel events are totally broken! - // https://bugs.webkit.org/show_bug.cgi?id=40441 - // not only that, but Chrome and Safari differ in re. to acceleration! - if (!d3_behavior_zoomDiv) { - d3_behavior_zoomDiv = d3.select("body").append("div") - .style("visibility", "hidden") - .style("top", 0) - .style("height", 0) - .style("width", 0) - .style("overflow-y", "scroll") - .append("div") - .style("height", "2000px") - .node().parentNode; - } - - var e = d3.event, delta; - try { - d3_behavior_zoomDiv.scrollTop = 1000; - d3_behavior_zoomDiv.dispatchEvent(e); - delta = 1000 - d3_behavior_zoomDiv.scrollTop; - } catch (error) { - delta = e.wheelDelta || (-e.detail * 5); - } - - return delta * .005; -} - -// Note: Since we don't rotate, it's possible for the touches to become -// slightly detached from their original positions. Thus, we recompute the -// touch points on touchend as well as touchstart! -function d3_behavior_zoomTouchup() { - var touches = d3.svg.touches(d3_behavior_zoomTarget), - i = -1, - n = touches.length, - touch; - while (++i < n) d3_behavior_zoomLocations[(touch = touches[i]).identifier] = d3_behavior_zoomLocation(touch); - return touches; -} - -function d3_behavior_zoomTouchmove() { - var touches = d3.svg.touches(d3_behavior_zoomTarget); - switch (touches.length) { - - // single-touch pan - case 1: { - var touch = touches[0]; - d3_behavior_zoomTo(d3_behavior_zoomXyz[2], touch, d3_behavior_zoomLocations[touch.identifier]); - break; - } - - // double-touch pan + zoom - case 2: { - var p0 = touches[0], - p1 = touches[1], - p2 = [(p0[0] + p1[0]) / 2, (p0[1] + p1[1]) / 2], - l0 = d3_behavior_zoomLocations[p0.identifier], - l1 = d3_behavior_zoomLocations[p1.identifier], - l2 = [(l0[0] + l1[0]) / 2, (l0[1] + l1[1]) / 2, l0[2]]; - d3_behavior_zoomTo(Math.log(d3.event.scale) / Math.LN2 + l0[2], p2, l2); - break; - } - } -} - -function d3_behavior_zoomMousemove() { - d3_behavior_zoomZooming = null; - if (d3_behavior_zoomPanning) { - d3_behavior_zoomMoved = true; - d3_behavior_zoomTo(d3_behavior_zoomXyz[2], d3.svg.mouse(d3_behavior_zoomTarget), d3_behavior_zoomPanning); - } -} - -function d3_behavior_zoomMouseup() { - if (d3_behavior_zoomPanning) { - if (d3_behavior_zoomMoved && d3_behavior_zoomEventTarget === d3.event.target) { - d3_behavior_zoomStopClick = true; - } - d3_behavior_zoomMousemove(); - d3_behavior_zoomPanning = null; - } -} - -function d3_behavior_zoomClick() { - if (d3_behavior_zoomStopClick && d3_behavior_zoomEventTarget === d3.event.target) { - d3.event.stopPropagation(); - d3.event.preventDefault(); - d3_behavior_zoomStopClick = false; - d3_behavior_zoomEventTarget = null; - } -} - -function d3_behavior_zoomTo(z, x0, x1) { - var K = Math.pow(2, (d3_behavior_zoomXyz[2] = z) - x1[2]), - x = d3_behavior_zoomXyz[0] = x0[0] - K * x1[0], - y = d3_behavior_zoomXyz[1] = x0[1] - K * x1[1], - o = d3.event, // Events can be reentrant (e.g., focus). - k = Math.pow(2, z); - - d3.event = { - scale: k, - translate: [x, y], - transform: function(sx, sy) { - if (sx) transform(sx, x); - if (sy) transform(sy, y); - } - }; - - function transform(scale, o) { - var domain = scale.__domain || (scale.__domain = scale.domain()), - range = scale.range().map(function(v) { return (v - o) / k; }); - scale.domain(domain).domain(range.map(scale.invert)); - } - - try { - d3_behavior_zoomDispatch.apply(d3_behavior_zoomTarget, d3_behavior_zoomArguments); - } finally { - d3.event = o; - } - - o.preventDefault(); -} -})(); diff --git a/deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/js/d3/d3.layout.js b/deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/js/d3/d3.layout.js deleted file mode 100644 index f812247e2f46271fef0aff80a078088ecbd905eb..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/js/d3/d3.layout.js +++ /dev/null @@ -1,1892 +0,0 @@ -(function(){d3.layout = {}; -// Implements hierarchical edge bundling using Holten's algorithm. For each -// input link, a path is computed that travels through the tree, up the parent -// hierarchy to the least common ancestor, and then back down to the destination -// node. Each path is simply an array of nodes. -d3.layout.bundle = function() { - return function(links) { - var paths = [], - i = -1, - n = links.length; - while (++i < n) paths.push(d3_layout_bundlePath(links[i])); - return paths; - }; -}; - -function d3_layout_bundlePath(link) { - var start = link.source, - end = link.target, - lca = d3_layout_bundleLeastCommonAncestor(start, end), - points = [start]; - while (start !== lca) { - start = start.parent; - points.push(start); - } - var k = points.length; - while (end !== lca) { - points.splice(k, 0, end); - end = end.parent; - } - return points; -} - -function d3_layout_bundleAncestors(node) { - var ancestors = [], - parent = node.parent; - while (parent != null) { - ancestors.push(node); - node = parent; - parent = parent.parent; - } - ancestors.push(node); - return ancestors; -} - -function d3_layout_bundleLeastCommonAncestor(a, b) { - if (a === b) return a; - var aNodes = d3_layout_bundleAncestors(a), - bNodes = d3_layout_bundleAncestors(b), - aNode = aNodes.pop(), - bNode = bNodes.pop(), - sharedNode = null; - while (aNode === bNode) { - sharedNode = aNode; - aNode = aNodes.pop(); - bNode = bNodes.pop(); - } - return sharedNode; -} -d3.layout.chord = function() { - var chord = {}, - chords, - groups, - matrix, - n, - padding = 0, - sortGroups, - sortSubgroups, - sortChords; - - function relayout() { - var subgroups = {}, - groupSums = [], - groupIndex = d3.range(n), - subgroupIndex = [], - k, - x, - x0, - i, - j; - - chords = []; - groups = []; - - // Compute the sum. - k = 0, i = -1; while (++i < n) { - x = 0, j = -1; while (++j < n) { - x += matrix[i][j]; - } - groupSums.push(x); - subgroupIndex.push(d3.range(n)); - k += x; - } - - // Sort groups… - if (sortGroups) { - groupIndex.sort(function(a, b) { - return sortGroups(groupSums[a], groupSums[b]); - }); - } - - // Sort subgroups… - if (sortSubgroups) { - subgroupIndex.forEach(function(d, i) { - d.sort(function(a, b) { - return sortSubgroups(matrix[i][a], matrix[i][b]); - }); - }); - } - - // Convert the sum to scaling factor for [0, 2pi]. - // TODO Allow start and end angle to be specified. - // TODO Allow padding to be specified as percentage? - k = (2 * Math.PI - padding * n) / k; - - // Compute the start and end angle for each group and subgroup. - x = 0, i = -1; while (++i < n) { - x0 = x, j = -1; while (++j < n) { - var di = groupIndex[i], - dj = subgroupIndex[di][j], - v = matrix[di][dj]; - subgroups[di + "-" + dj] = { - index: di, - subindex: dj, - startAngle: x, - endAngle: x += v * k, - value: v - }; - } - groups.push({ - index: di, - startAngle: x0, - endAngle: x, - value: (x - x0) / k - }); - x += padding; - } - - // Generate chords for each (non-empty) subgroup-subgroup link. - i = -1; while (++i < n) { - j = i - 1; while (++j < n) { - var source = subgroups[i + "-" + j], - target = subgroups[j + "-" + i]; - if (source.value || target.value) { - chords.push(source.value < target.value - ? {source: target, target: source} - : {source: source, target: target}); - } - } - } - - if (sortChords) resort(); - } - - function resort() { - chords.sort(function(a, b) { - return sortChords( - (a.source.value + a.target.value) / 2, - (b.source.value + b.target.value) / 2); - }); - } - - chord.matrix = function(x) { - if (!arguments.length) return matrix; - n = (matrix = x) && matrix.length; - chords = groups = null; - return chord; - }; - - chord.padding = function(x) { - if (!arguments.length) return padding; - padding = x; - chords = groups = null; - return chord; - }; - - chord.sortGroups = function(x) { - if (!arguments.length) return sortGroups; - sortGroups = x; - chords = groups = null; - return chord; - }; - - chord.sortSubgroups = function(x) { - if (!arguments.length) return sortSubgroups; - sortSubgroups = x; - chords = null; - return chord; - }; - - chord.sortChords = function(x) { - if (!arguments.length) return sortChords; - sortChords = x; - if (chords) resort(); - return chord; - }; - - chord.chords = function() { - if (!chords) relayout(); - return chords; - }; - - chord.groups = function() { - if (!groups) relayout(); - return groups; - }; - - return chord; -}; -// A rudimentary force layout using Gauss-Seidel. -d3.layout.force = function() { - var force = {}, - event = d3.dispatch("tick"), - size = [1, 1], - drag, - alpha, - friction = .9, - linkDistance = d3_layout_forceLinkDistance, - linkStrength = d3_layout_forceLinkStrength, - charge = -30, - gravity = .1, - theta = .8, - interval, - nodes = [], - links = [], - distances, - strengths, - charges; - - function repulse(node) { - return function(quad, x1, y1, x2, y2) { - if (quad.point !== node) { - var dx = quad.cx - node.x, - dy = quad.cy - node.y, - dn = 1 / Math.sqrt(dx * dx + dy * dy); - - /* Barnes-Hut criterion. */ - if ((x2 - x1) * dn < theta) { - var k = quad.charge * dn * dn; - node.px -= dx * k; - node.py -= dy * k; - return true; - } - - if (quad.point && isFinite(dn)) { - var k = quad.pointCharge * dn * dn; - node.px -= dx * k; - node.py -= dy * k; - } - } - return !quad.charge; - }; - } - - function tick() { - var n = nodes.length, - m = links.length, - q, - i, // current index - o, // current object - s, // current source - t, // current target - l, // current distance - k, // current force - x, // x-distance - y; // y-distance - - // gauss-seidel relaxation for links - for (i = 0; i < m; ++i) { - o = links[i]; - s = o.source; - t = o.target; - x = t.x - s.x; - y = t.y - s.y; - if (l = (x * x + y * y)) { - l = alpha * strengths[i] * ((l = Math.sqrt(l)) - distances[i]) / l; - x *= l; - y *= l; - t.x -= x * (k = s.weight / (t.weight + s.weight)); - t.y -= y * k; - s.x += x * (k = 1 - k); - s.y += y * k; - } - } - - // apply gravity forces - if (k = alpha * gravity) { - x = size[0] / 2; - y = size[1] / 2; - i = -1; if (k) while (++i < n) { - o = nodes[i]; - o.x += (x - o.x) * k; - o.y += (y - o.y) * k; - } - } - - // compute quadtree center of mass and apply charge forces - if (charge) { - d3_layout_forceAccumulate(q = d3.geom.quadtree(nodes), alpha, charges); - i = -1; while (++i < n) { - if (!(o = nodes[i]).fixed) { - q.visit(repulse(o)); - } - } - } - - // position verlet integration - i = -1; while (++i < n) { - o = nodes[i]; - if (o.fixed) { - o.x = o.px; - o.y = o.py; - } else { - o.x -= (o.px - (o.px = o.x)) * friction; - o.y -= (o.py - (o.py = o.y)) * friction; - } - } - - event.tick.dispatch({type: "tick", alpha: alpha}); - - // simulated annealing, basically - return (alpha *= .99) < .005; - } - - force.on = function(type, listener) { - event[type].add(listener); - return force; - }; - - force.nodes = function(x) { - if (!arguments.length) return nodes; - nodes = x; - return force; - }; - - force.links = function(x) { - if (!arguments.length) return links; - links = x; - return force; - }; - - force.size = function(x) { - if (!arguments.length) return size; - size = x; - return force; - }; - - force.linkDistance = function(x) { - if (!arguments.length) return linkDistance; - linkDistance = d3.functor(x); - return force; - }; - - // For backwards-compatibility. - force.distance = force.linkDistance; - - force.linkStrength = function(x) { - if (!arguments.length) return linkStrength; - linkStrength = d3.functor(x); - return force; - }; - - force.friction = function(x) { - if (!arguments.length) return friction; - friction = x; - return force; - }; - - force.charge = function(x) { - if (!arguments.length) return charge; - charge = typeof x === "function" ? x : +x; - return force; - }; - - force.gravity = function(x) { - if (!arguments.length) return gravity; - gravity = x; - return force; - }; - - force.theta = function(x) { - if (!arguments.length) return theta; - theta = x; - return force; - }; - - force.start = function() { - var i, - j, - n = nodes.length, - m = links.length, - w = size[0], - h = size[1], - neighbors, - o; - - for (i = 0; i < n; ++i) { - (o = nodes[i]).index = i; - o.weight = 0; - } - - distances = []; - strengths = []; - for (i = 0; i < m; ++i) { - o = links[i]; - if (typeof o.source == "number") o.source = nodes[o.source]; - if (typeof o.target == "number") o.target = nodes[o.target]; - distances[i] = linkDistance.call(this, o, i); - strengths[i] = linkStrength.call(this, o, i); - ++o.source.weight; - ++o.target.weight; - } - - for (i = 0; i < n; ++i) { - o = nodes[i]; - if (isNaN(o.x)) o.x = position("x", w); - if (isNaN(o.y)) o.y = position("y", h); - if (isNaN(o.px)) o.px = o.x; - if (isNaN(o.py)) o.py = o.y; - } - - charges = []; - if (typeof charge === "function") { - for (i = 0; i < n; ++i) { - charges[i] = +charge.call(this, nodes[i], i); - } - } else { - for (i = 0; i < n; ++i) { - charges[i] = charge; - } - } - - // initialize node position based on first neighbor - function position(dimension, size) { - var neighbors = neighbor(i), - j = -1, - m = neighbors.length, - x; - while (++j < m) if (!isNaN(x = neighbors[j][dimension])) return x; - return Math.random() * size; - } - - // initialize neighbors lazily - function neighbor() { - if (!neighbors) { - neighbors = []; - for (j = 0; j < n; ++j) { - neighbors[j] = []; - } - for (j = 0; j < m; ++j) { - var o = links[j]; - neighbors[o.source.index].push(o.target); - neighbors[o.target.index].push(o.source); - } - } - return neighbors[i]; - } - - return force.resume(); - }; - - force.resume = function() { - alpha = .1; - d3.timer(tick); - return force; - }; - - force.stop = function() { - alpha = 0; - return force; - }; - - // use `node.call(force.drag)` to make nodes draggable - force.drag = function() { - if (!drag) drag = d3.behavior.drag() - .on("dragstart", dragstart) - .on("drag", d3_layout_forceDrag) - .on("dragend", d3_layout_forceDragEnd); - - this.on("mouseover.force", d3_layout_forceDragOver) - .on("mouseout.force", d3_layout_forceDragOut) - .call(drag); - }; - - function dragstart(d) { - d3_layout_forceDragOver(d3_layout_forceDragNode = d); - d3_layout_forceDragForce = force; - } - - return force; -}; - -var d3_layout_forceDragForce, - d3_layout_forceDragNode; - -function d3_layout_forceDragOver(d) { - d.fixed |= 2; -} - -function d3_layout_forceDragOut(d) { - if (d !== d3_layout_forceDragNode) d.fixed &= 1; -} - -function d3_layout_forceDragEnd() { - d3_layout_forceDrag(); - d3_layout_forceDragNode.fixed &= 1; - d3_layout_forceDragForce = d3_layout_forceDragNode = null; -} - -function d3_layout_forceDrag() { - d3_layout_forceDragNode.px += d3.event.dx; - d3_layout_forceDragNode.py += d3.event.dy; - d3_layout_forceDragForce.resume(); // restart annealing -} - -function d3_layout_forceAccumulate(quad, alpha, charges) { - var cx = 0, - cy = 0; - quad.charge = 0; - if (!quad.leaf) { - var nodes = quad.nodes, - n = nodes.length, - i = -1, - c; - while (++i < n) { - c = nodes[i]; - if (c == null) continue; - d3_layout_forceAccumulate(c, alpha, charges); - quad.charge += c.charge; - cx += c.charge * c.cx; - cy += c.charge * c.cy; - } - } - if (quad.point) { - // jitter internal nodes that are coincident - if (!quad.leaf) { - quad.point.x += Math.random() - .5; - quad.point.y += Math.random() - .5; - } - var k = alpha * charges[quad.point.index]; - quad.charge += quad.pointCharge = k; - cx += k * quad.point.x; - cy += k * quad.point.y; - } - quad.cx = cx / quad.charge; - quad.cy = cy / quad.charge; -} - -function d3_layout_forceLinkDistance(link) { - return 20; -} - -function d3_layout_forceLinkStrength(link) { - return 1; -} -d3.layout.partition = function() { - var hierarchy = d3.layout.hierarchy(), - size = [1, 1]; // width, height - - function position(node, x, dx, dy) { - var children = node.children; - node.x = x; - node.y = node.depth * dy; - node.dx = dx; - node.dy = dy; - if (children && (n = children.length)) { - var i = -1, - n, - c, - d; - dx = node.value ? dx / node.value : 0; - while (++i < n) { - position(c = children[i], x, d = c.value * dx, dy); - x += d; - } - } - } - - function depth(node) { - var children = node.children, - d = 0; - if (children && (n = children.length)) { - var i = -1, - n; - while (++i < n) d = Math.max(d, depth(children[i])); - } - return 1 + d; - } - - function partition(d, i) { - var nodes = hierarchy.call(this, d, i); - position(nodes[0], 0, size[0], size[1] / depth(nodes[0])); - return nodes; - } - - partition.size = function(x) { - if (!arguments.length) return size; - size = x; - return partition; - }; - - return d3_layout_hierarchyRebind(partition, hierarchy); -}; -d3.layout.pie = function() { - var value = Number, - sort = null, - startAngle = 0, - endAngle = 2 * Math.PI; - - function pie(data, i) { - - // Compute the start angle. - var a = +(typeof startAngle === "function" - ? startAngle.apply(this, arguments) - : startAngle); - - // Compute the angular range (end - start). - var k = (typeof endAngle === "function" - ? endAngle.apply(this, arguments) - : endAngle) - startAngle; - - // Optionally sort the data. - var index = d3.range(data.length); - if (sort != null) index.sort(function(i, j) { - return sort(data[i], data[j]); - }); - - // Compute the numeric values for each data element. - var values = data.map(value); - - // Convert k into a scale factor from value to angle, using the sum. - k /= values.reduce(function(p, d) { return p + d; }, 0); - - // Compute the arcs! - var arcs = index.map(function(i) { - return { - data: data[i], - value: d = values[i], - startAngle: a, - endAngle: a += d * k - }; - }); - - // Return the arcs in the original data's order. - return data.map(function(d, i) { - return arcs[index[i]]; - }); - } - - /** - * Specifies the value function *x*, which returns a nonnegative numeric value - * for each datum. The default value function is `Number`. The value function - * is passed two arguments: the current datum and the current index. - */ - pie.value = function(x) { - if (!arguments.length) return value; - value = x; - return pie; - }; - - /** - * Specifies a sort comparison operator *x*. The comparator is passed two data - * elements from the data array, a and b; it returns a negative value if a is - * less than b, a positive value if a is greater than b, and zero if a equals - * b. - */ - pie.sort = function(x) { - if (!arguments.length) return sort; - sort = x; - return pie; - }; - - /** - * Specifies the overall start angle of the pie chart. Defaults to 0. The - * start angle can be specified either as a constant or as a function; in the - * case of a function, it is evaluated once per array (as opposed to per - * element). - */ - pie.startAngle = function(x) { - if (!arguments.length) return startAngle; - startAngle = x; - return pie; - }; - - /** - * Specifies the overall end angle of the pie chart. Defaults to 2Ï€. The - * end angle can be specified either as a constant or as a function; in the - * case of a function, it is evaluated once per array (as opposed to per - * element). - */ - pie.endAngle = function(x) { - if (!arguments.length) return endAngle; - endAngle = x; - return pie; - }; - - return pie; -}; -// data is two-dimensional array of x,y; we populate y0 -d3.layout.stack = function() { - var values = Object, - order = d3_layout_stackOrders["default"], - offset = d3_layout_stackOffsets["zero"], - out = d3_layout_stackOut, - x = d3_layout_stackX, - y = d3_layout_stackY; - - function stack(data, index) { - - // Convert series to canonical two-dimensional representation. - var series = data.map(function(d, i) { - return values.call(stack, d, i); - }); - - // Convert each series to canonical [[x,y]] representation. - var points = series.map(function(d, i) { - return d.map(function(v, i) { - return [x.call(stack, v, i), y.call(stack, v, i)]; - }); - }); - - // Compute the order of series, and permute them. - var orders = order.call(stack, points, index); - series = d3.permute(series, orders); - points = d3.permute(points, orders); - - // Compute the baseline… - var offsets = offset.call(stack, points, index); - - // And propagate it to other series. - var n = series.length, - m = series[0].length, - i, - j, - o; - for (j = 0; j < m; ++j) { - out.call(stack, series[0][j], o = offsets[j], points[0][j][1]); - for (i = 1; i < n; ++i) { - out.call(stack, series[i][j], o += points[i - 1][j][1], points[i][j][1]); - } - } - - return data; - } - - stack.values = function(x) { - if (!arguments.length) return values; - values = x; - return stack; - }; - - stack.order = function(x) { - if (!arguments.length) return order; - order = typeof x === "function" ? x : d3_layout_stackOrders[x]; - return stack; - }; - - stack.offset = function(x) { - if (!arguments.length) return offset; - offset = typeof x === "function" ? x : d3_layout_stackOffsets[x]; - return stack; - }; - - stack.x = function(z) { - if (!arguments.length) return x; - x = z; - return stack; - }; - - stack.y = function(z) { - if (!arguments.length) return y; - y = z; - return stack; - }; - - stack.out = function(z) { - if (!arguments.length) return out; - out = z; - return stack; - }; - - return stack; -} - -function d3_layout_stackX(d) { - return d.x; -} - -function d3_layout_stackY(d) { - return d.y; -} - -function d3_layout_stackOut(d, y0, y) { - d.y0 = y0; - d.y = y; -} - -var d3_layout_stackOrders = { - - "inside-out": function(data) { - var n = data.length, - i, - j, - max = data.map(d3_layout_stackMaxIndex), - sums = data.map(d3_layout_stackReduceSum), - index = d3.range(n).sort(function(a, b) { return max[a] - max[b]; }), - top = 0, - bottom = 0, - tops = [], - bottoms = []; - for (i = 0; i < n; ++i) { - j = index[i]; - if (top < bottom) { - top += sums[j]; - tops.push(j); - } else { - bottom += sums[j]; - bottoms.push(j); - } - } - return bottoms.reverse().concat(tops); - }, - - "reverse": function(data) { - return d3.range(data.length).reverse(); - }, - - "default": function(data) { - return d3.range(data.length); - } - -}; - -var d3_layout_stackOffsets = { - - "silhouette": function(data) { - var n = data.length, - m = data[0].length, - sums = [], - max = 0, - i, - j, - o, - y0 = []; - for (j = 0; j < m; ++j) { - for (i = 0, o = 0; i < n; i++) o += data[i][j][1]; - if (o > max) max = o; - sums.push(o); - } - for (j = 0; j < m; ++j) { - y0[j] = (max - sums[j]) / 2; - } - return y0; - }, - - "wiggle": function(data) { - var n = data.length, - x = data[0], - m = x.length, - max = 0, - i, - j, - k, - s1, - s2, - s3, - dx, - o, - o0, - y0 = []; - y0[0] = o = o0 = 0; - for (j = 1; j < m; ++j) { - for (i = 0, s1 = 0; i < n; ++i) s1 += data[i][j][1]; - for (i = 0, s2 = 0, dx = x[j][0] - x[j - 1][0]; i < n; ++i) { - for (k = 0, s3 = (data[i][j][1] - data[i][j - 1][1]) / (2 * dx); k < i; ++k) { - s3 += (data[k][j][1] - data[k][j - 1][1]) / dx; - } - s2 += s3 * data[i][j][1]; - } - y0[j] = o -= s1 ? s2 / s1 * dx : 0; - if (o < o0) o0 = o; - } - for (j = 0; j < m; ++j) y0[j] -= o0; - return y0; - }, - - "expand": function(data) { - var n = data.length, - m = data[0].length, - k = 1 / n, - i, - j, - o, - y0 = []; - for (j = 0; j < m; ++j) { - for (i = 0, o = 0; i < n; i++) o += data[i][j][1]; - if (o) for (i = 0; i < n; i++) data[i][j][1] /= o; - else for (i = 0; i < n; i++) data[i][j][1] = k; - } - for (j = 0; j < m; ++j) y0[j] = 0; - return y0; - }, - - "zero": function(data) { - var j = -1, - m = data[0].length, - y0 = []; - while (++j < m) y0[j] = 0; - return y0; - } - -}; - -function d3_layout_stackMaxIndex(array) { - var i = 1, - j = 0, - v = array[0][1], - k, - n = array.length; - for (; i < n; ++i) { - if ((k = array[i][1]) > v) { - j = i; - v = k; - } - } - return j; -} - -function d3_layout_stackReduceSum(d) { - return d.reduce(d3_layout_stackSum, 0); -} - -function d3_layout_stackSum(p, d) { - return p + d[1]; -} -d3.layout.histogram = function() { - var frequency = true, - valuer = Number, - ranger = d3_layout_histogramRange, - binner = d3_layout_histogramBinSturges; - - function histogram(data, i) { - var bins = [], - values = data.map(valuer, this), - range = ranger.call(this, values, i), - thresholds = binner.call(this, range, values, i), - bin, - i = -1, - n = values.length, - m = thresholds.length - 1, - k = frequency ? 1 : 1 / n, - x; - - // Initialize the bins. - while (++i < m) { - bin = bins[i] = []; - bin.dx = thresholds[i + 1] - (bin.x = thresholds[i]); - bin.y = 0; - } - - // Fill the bins, ignoring values outside the range. - i = -1; while(++i < n) { - x = values[i]; - if ((x >= range[0]) && (x <= range[1])) { - bin = bins[d3.bisect(thresholds, x, 1, m) - 1]; - bin.y += k; - bin.push(data[i]); - } - } - - return bins; - } - - // Specifies how to extract a value from the associated data. The default - // value function is `Number`, which is equivalent to the identity function. - histogram.value = function(x) { - if (!arguments.length) return valuer; - valuer = x; - return histogram; - }; - - // Specifies the range of the histogram. Values outside the specified range - // will be ignored. The argument `x` may be specified either as a two-element - // array representing the minimum and maximum value of the range, or as a - // function that returns the range given the array of values and the current - // index `i`. The default range is the extent (minimum and maximum) of the - // values. - histogram.range = function(x) { - if (!arguments.length) return ranger; - ranger = d3.functor(x); - return histogram; - }; - - // Specifies how to bin values in the histogram. The argument `x` may be - // specified as a number, in which case the range of values will be split - // uniformly into the given number of bins. Or, `x` may be an array of - // threshold values, defining the bins; the specified array must contain the - // rightmost (upper) value, thus specifying n + 1 values for n bins. Or, `x` - // may be a function which is evaluated, being passed the range, the array of - // values, and the current index `i`, returning an array of thresholds. The - // default bin function will divide the values into uniform bins using - // Sturges' formula. - histogram.bins = function(x) { - if (!arguments.length) return binner; - binner = typeof x === "number" - ? function(range) { return d3_layout_histogramBinFixed(range, x); } - : d3.functor(x); - return histogram; - }; - - // Specifies whether the histogram's `y` value is a count (frequency) or a - // probability (density). The default value is true. - histogram.frequency = function(x) { - if (!arguments.length) return frequency; - frequency = !!x; - return histogram; - }; - - return histogram; -}; - -function d3_layout_histogramBinSturges(range, values) { - return d3_layout_histogramBinFixed(range, Math.ceil(Math.log(values.length) / Math.LN2 + 1)); -} - -function d3_layout_histogramBinFixed(range, n) { - var x = -1, - b = +range[0], - m = (range[1] - b) / n, - f = []; - while (++x <= n) f[x] = m * x + b; - return f; -} - -function d3_layout_histogramRange(values) { - return [d3.min(values), d3.max(values)]; -} -d3.layout.hierarchy = function() { - var sort = d3_layout_hierarchySort, - children = d3_layout_hierarchyChildren, - value = d3_layout_hierarchyValue; - - // Recursively compute the node depth and value. - // Also converts the data representation into a standard hierarchy structure. - function recurse(data, depth, nodes) { - var childs = children.call(hierarchy, data, depth), - node = d3_layout_hierarchyInline ? data : {data: data}; - node.depth = depth; - nodes.push(node); - if (childs && (n = childs.length)) { - var i = -1, - n, - c = node.children = [], - v = 0, - j = depth + 1; - while (++i < n) { - d = recurse(childs[i], j, nodes); - d.parent = node; - c.push(d); - v += d.value; - } - if (sort) c.sort(sort); - if (value) node.value = v; - } else if (value) { - node.value = +value.call(hierarchy, data, depth) || 0; - } - return node; - } - - // Recursively re-evaluates the node value. - function revalue(node, depth) { - var children = node.children, - v = 0; - if (children && (n = children.length)) { - var i = -1, - n, - j = depth + 1; - while (++i < n) v += revalue(children[i], j); - } else if (value) { - v = +value.call(hierarchy, d3_layout_hierarchyInline ? node : node.data, depth) || 0; - } - if (value) node.value = v; - return v; - } - - function hierarchy(d) { - var nodes = []; - recurse(d, 0, nodes); - return nodes; - } - - hierarchy.sort = function(x) { - if (!arguments.length) return sort; - sort = x; - return hierarchy; - }; - - hierarchy.children = function(x) { - if (!arguments.length) return children; - children = x; - return hierarchy; - }; - - hierarchy.value = function(x) { - if (!arguments.length) return value; - value = x; - return hierarchy; - }; - - // Re-evaluates the `value` property for the specified hierarchy. - hierarchy.revalue = function(root) { - revalue(root, 0); - return root; - }; - - return hierarchy; -}; - -// A method assignment helper for hierarchy subclasses. -function d3_layout_hierarchyRebind(object, hierarchy) { - object.sort = d3.rebind(object, hierarchy.sort); - object.children = d3.rebind(object, hierarchy.children); - object.links = d3_layout_hierarchyLinks; - object.value = d3.rebind(object, hierarchy.value); - - // If the new API is used, enabling inlining. - object.nodes = function(d) { - d3_layout_hierarchyInline = true; - return (object.nodes = object)(d); - }; - - return object; -} - -function d3_layout_hierarchyChildren(d) { - return d.children; -} - -function d3_layout_hierarchyValue(d) { - return d.value; -} - -function d3_layout_hierarchySort(a, b) { - return b.value - a.value; -} - -// Returns an array source+target objects for the specified nodes. -function d3_layout_hierarchyLinks(nodes) { - return d3.merge(nodes.map(function(parent) { - return (parent.children || []).map(function(child) { - return {source: parent, target: child}; - }); - })); -} - -// For backwards-compatibility, don't enable inlining by default. -var d3_layout_hierarchyInline = false; -d3.layout.pack = function() { - var hierarchy = d3.layout.hierarchy().sort(d3_layout_packSort), - size = [1, 1]; - - function pack(d, i) { - var nodes = hierarchy.call(this, d, i), - root = nodes[0]; - - // Recursively compute the layout. - root.x = 0; - root.y = 0; - d3_layout_packTree(root); - - // Scale the layout to fit the requested size. - var w = size[0], - h = size[1], - k = 1 / Math.max(2 * root.r / w, 2 * root.r / h); - d3_layout_packTransform(root, w / 2, h / 2, k); - - return nodes; - } - - pack.size = function(x) { - if (!arguments.length) return size; - size = x; - return pack; - }; - - return d3_layout_hierarchyRebind(pack, hierarchy); -}; - -function d3_layout_packSort(a, b) { - return a.value - b.value; -} - -function d3_layout_packInsert(a, b) { - var c = a._pack_next; - a._pack_next = b; - b._pack_prev = a; - b._pack_next = c; - c._pack_prev = b; -} - -function d3_layout_packSplice(a, b) { - a._pack_next = b; - b._pack_prev = a; -} - -function d3_layout_packIntersects(a, b) { - var dx = b.x - a.x, - dy = b.y - a.y, - dr = a.r + b.r; - return (dr * dr - dx * dx - dy * dy) > .001; // within epsilon -} - -function d3_layout_packCircle(nodes) { - var xMin = Infinity, - xMax = -Infinity, - yMin = Infinity, - yMax = -Infinity, - n = nodes.length, - a, b, c, j, k; - - function bound(node) { - xMin = Math.min(node.x - node.r, xMin); - xMax = Math.max(node.x + node.r, xMax); - yMin = Math.min(node.y - node.r, yMin); - yMax = Math.max(node.y + node.r, yMax); - } - - // Create node links. - nodes.forEach(d3_layout_packLink); - - // Create first node. - a = nodes[0]; - a.x = -a.r; - a.y = 0; - bound(a); - - // Create second node. - if (n > 1) { - b = nodes[1]; - b.x = b.r; - b.y = 0; - bound(b); - - // Create third node and build chain. - if (n > 2) { - c = nodes[2]; - d3_layout_packPlace(a, b, c); - bound(c); - d3_layout_packInsert(a, c); - a._pack_prev = c; - d3_layout_packInsert(c, b); - b = a._pack_next; - - // Now iterate through the rest. - for (var i = 3; i < n; i++) { - d3_layout_packPlace(a, b, c = nodes[i]); - - // Search for the closest intersection. - var isect = 0, s1 = 1, s2 = 1; - for (j = b._pack_next; j !== b; j = j._pack_next, s1++) { - if (d3_layout_packIntersects(j, c)) { - isect = 1; - break; - } - } - if (isect == 1) { - for (k = a._pack_prev; k !== j._pack_prev; k = k._pack_prev, s2++) { - if (d3_layout_packIntersects(k, c)) { - if (s2 < s1) { - isect = -1; - j = k; - } - break; - } - } - } - - // Update node chain. - if (isect == 0) { - d3_layout_packInsert(a, c); - b = c; - bound(c); - } else if (isect > 0) { - d3_layout_packSplice(a, j); - b = j; - i--; - } else { // isect < 0 - d3_layout_packSplice(j, b); - a = j; - i--; - } - } - } - } - - // Re-center the circles and return the encompassing radius. - var cx = (xMin + xMax) / 2, - cy = (yMin + yMax) / 2, - cr = 0; - for (var i = 0; i < n; i++) { - var node = nodes[i]; - node.x -= cx; - node.y -= cy; - cr = Math.max(cr, node.r + Math.sqrt(node.x * node.x + node.y * node.y)); - } - - // Remove node links. - nodes.forEach(d3_layout_packUnlink); - - return cr; -} - -function d3_layout_packLink(node) { - node._pack_next = node._pack_prev = node; -} - -function d3_layout_packUnlink(node) { - delete node._pack_next; - delete node._pack_prev; -} - -function d3_layout_packTree(node) { - var children = node.children; - if (children && children.length) { - children.forEach(d3_layout_packTree); - node.r = d3_layout_packCircle(children); - } else { - node.r = Math.sqrt(node.value); - } -} - -function d3_layout_packTransform(node, x, y, k) { - var children = node.children; - node.x = (x += k * node.x); - node.y = (y += k * node.y); - node.r *= k; - if (children) { - var i = -1, n = children.length; - while (++i < n) d3_layout_packTransform(children[i], x, y, k); - } -} - -function d3_layout_packPlace(a, b, c) { - var db = a.r + c.r, - dx = b.x - a.x, - dy = b.y - a.y; - if (db && (dx || dy)) { - var da = b.r + c.r, - dc = Math.sqrt(dx * dx + dy * dy), - cos = Math.max(-1, Math.min(1, (db * db + dc * dc - da * da) / (2 * db * dc))), - theta = Math.acos(cos), - x = cos * (db /= dc), - y = Math.sin(theta) * db; - c.x = a.x + x * dx + y * dy; - c.y = a.y + x * dy - y * dx; - } else { - c.x = a.x + db; - c.y = a.y; - } -} -// Implements a hierarchical layout using the cluster (or dendogram) algorithm. -d3.layout.cluster = function() { - var hierarchy = d3.layout.hierarchy().sort(null).value(null), - separation = d3_layout_treeSeparation, - size = [1, 1]; // width, height - - function cluster(d, i) { - var nodes = hierarchy.call(this, d, i), - root = nodes[0], - previousNode, - x = 0, - kx, - ky; - - // First walk, computing the initial x & y values. - d3_layout_treeVisitAfter(root, function(node) { - var children = node.children; - if (children && children.length) { - node.x = d3_layout_clusterX(children); - node.y = d3_layout_clusterY(children); - } else { - node.x = previousNode ? x += separation(node, previousNode) : 0; - node.y = 0; - previousNode = node; - } - }); - - // Compute the left-most, right-most, and depth-most nodes for extents. - var left = d3_layout_clusterLeft(root), - right = d3_layout_clusterRight(root), - x0 = left.x - separation(left, right) / 2, - x1 = right.x + separation(right, left) / 2; - - // Second walk, normalizing x & y to the desired size. - d3_layout_treeVisitAfter(root, function(node) { - node.x = (node.x - x0) / (x1 - x0) * size[0]; - node.y = (1 - node.y / root.y) * size[1]; - }); - - return nodes; - } - - cluster.separation = function(x) { - if (!arguments.length) return separation; - separation = x; - return cluster; - }; - - cluster.size = function(x) { - if (!arguments.length) return size; - size = x; - return cluster; - }; - - return d3_layout_hierarchyRebind(cluster, hierarchy); -}; - -function d3_layout_clusterY(children) { - return 1 + d3.max(children, function(child) { - return child.y; - }); -} - -function d3_layout_clusterX(children) { - return children.reduce(function(x, child) { - return x + child.x; - }, 0) / children.length; -} - -function d3_layout_clusterLeft(node) { - var children = node.children; - return children && children.length ? d3_layout_clusterLeft(children[0]) : node; -} - -function d3_layout_clusterRight(node) { - var children = node.children, n; - return children && (n = children.length) ? d3_layout_clusterRight(children[n - 1]) : node; -} -// Node-link tree diagram using the Reingold-Tilford "tidy" algorithm -d3.layout.tree = function() { - var hierarchy = d3.layout.hierarchy().sort(null).value(null), - separation = d3_layout_treeSeparation, - size = [1, 1]; // width, height - - function tree(d, i) { - var nodes = hierarchy.call(this, d, i), - root = nodes[0]; - - function firstWalk(node, previousSibling) { - var children = node.children, - layout = node._tree; - if (children && (n = children.length)) { - var n, - firstChild = children[0], - previousChild, - ancestor = firstChild, - child, - i = -1; - while (++i < n) { - child = children[i]; - firstWalk(child, previousChild); - ancestor = apportion(child, previousChild, ancestor); - previousChild = child; - } - d3_layout_treeShift(node); - var midpoint = .5 * (firstChild._tree.prelim + child._tree.prelim); - if (previousSibling) { - layout.prelim = previousSibling._tree.prelim + separation(node, previousSibling); - layout.mod = layout.prelim - midpoint; - } else { - layout.prelim = midpoint; - } - } else { - if (previousSibling) { - layout.prelim = previousSibling._tree.prelim + separation(node, previousSibling); - } - } - } - - function secondWalk(node, x) { - node.x = node._tree.prelim + x; - var children = node.children; - if (children && (n = children.length)) { - var i = -1, - n; - x += node._tree.mod; - while (++i < n) { - secondWalk(children[i], x); - } - } - } - - function apportion(node, previousSibling, ancestor) { - if (previousSibling) { - var vip = node, - vop = node, - vim = previousSibling, - vom = node.parent.children[0], - sip = vip._tree.mod, - sop = vop._tree.mod, - sim = vim._tree.mod, - som = vom._tree.mod, - shift; - while (vim = d3_layout_treeRight(vim), vip = d3_layout_treeLeft(vip), vim && vip) { - vom = d3_layout_treeLeft(vom); - vop = d3_layout_treeRight(vop); - vop._tree.ancestor = node; - shift = vim._tree.prelim + sim - vip._tree.prelim - sip + separation(vim, vip); - if (shift > 0) { - d3_layout_treeMove(d3_layout_treeAncestor(vim, node, ancestor), node, shift); - sip += shift; - sop += shift; - } - sim += vim._tree.mod; - sip += vip._tree.mod; - som += vom._tree.mod; - sop += vop._tree.mod; - } - if (vim && !d3_layout_treeRight(vop)) { - vop._tree.thread = vim; - vop._tree.mod += sim - sop; - } - if (vip && !d3_layout_treeLeft(vom)) { - vom._tree.thread = vip; - vom._tree.mod += sip - som; - ancestor = node; - } - } - return ancestor; - } - - // Initialize temporary layout variables. - d3_layout_treeVisitAfter(root, function(node, previousSibling) { - node._tree = { - ancestor: node, - prelim: 0, - mod: 0, - change: 0, - shift: 0, - number: previousSibling ? previousSibling._tree.number + 1 : 0 - }; - }); - - // Compute the layout using Buchheim et al.'s algorithm. - firstWalk(root); - secondWalk(root, -root._tree.prelim); - - // Compute the left-most, right-most, and depth-most nodes for extents. - var left = d3_layout_treeSearch(root, d3_layout_treeLeftmost), - right = d3_layout_treeSearch(root, d3_layout_treeRightmost), - deep = d3_layout_treeSearch(root, d3_layout_treeDeepest), - x0 = left.x - separation(left, right) / 2, - x1 = right.x + separation(right, left) / 2, - y1 = deep.depth || 1; - - // Clear temporary layout variables; transform x and y. - d3_layout_treeVisitAfter(root, function(node) { - node.x = (node.x - x0) / (x1 - x0) * size[0]; - node.y = node.depth / y1 * size[1]; - delete node._tree; - }); - - return nodes; - } - - tree.separation = function(x) { - if (!arguments.length) return separation; - separation = x; - return tree; - }; - - tree.size = function(x) { - if (!arguments.length) return size; - size = x; - return tree; - }; - - return d3_layout_hierarchyRebind(tree, hierarchy); -}; - -function d3_layout_treeSeparation(a, b) { - return a.parent == b.parent ? 1 : 2; -} - -// function d3_layout_treeSeparationRadial(a, b) { -// return (a.parent == b.parent ? 1 : 2) / a.depth; -// } - -function d3_layout_treeLeft(node) { - var children = node.children; - return children && children.length ? children[0] : node._tree.thread; -} - -function d3_layout_treeRight(node) { - var children = node.children, - n; - return children && (n = children.length) ? children[n - 1] : node._tree.thread; -} - -function d3_layout_treeSearch(node, compare) { - var children = node.children; - if (children && (n = children.length)) { - var child, - n, - i = -1; - while (++i < n) { - if (compare(child = d3_layout_treeSearch(children[i], compare), node) > 0) { - node = child; - } - } - } - return node; -} - -function d3_layout_treeRightmost(a, b) { - return a.x - b.x; -} - -function d3_layout_treeLeftmost(a, b) { - return b.x - a.x; -} - -function d3_layout_treeDeepest(a, b) { - return a.depth - b.depth; -} - -function d3_layout_treeVisitAfter(node, callback) { - function visit(node, previousSibling) { - var children = node.children; - if (children && (n = children.length)) { - var child, - previousChild = null, - i = -1, - n; - while (++i < n) { - child = children[i]; - visit(child, previousChild); - previousChild = child; - } - } - callback(node, previousSibling); - } - visit(node, null); -} - -function d3_layout_treeShift(node) { - var shift = 0, - change = 0, - children = node.children, - i = children.length, - child; - while (--i >= 0) { - child = children[i]._tree; - child.prelim += shift; - child.mod += shift; - shift += child.shift + (change += child.change); - } -} - -function d3_layout_treeMove(ancestor, node, shift) { - ancestor = ancestor._tree; - node = node._tree; - var change = shift / (node.number - ancestor.number); - ancestor.change += change; - node.change -= change; - node.shift += shift; - node.prelim += shift; - node.mod += shift; -} - -function d3_layout_treeAncestor(vim, node, ancestor) { - return vim._tree.ancestor.parent == node.parent - ? vim._tree.ancestor - : ancestor; -} -// Squarified Treemaps by Mark Bruls, Kees Huizing, and Jarke J. van Wijk -// Modified to support a target aspect ratio by Jeff Heer -d3.layout.treemap = function() { - var hierarchy = d3.layout.hierarchy(), - round = Math.round, - size = [1, 1], // width, height - padding = null, - pad = d3_layout_treemapPadNull, - sticky = false, - stickies, - ratio = 0.5 * (1 + Math.sqrt(5)); // golden ratio - - // Compute the area for each child based on value & scale. - function scale(children, k) { - var i = -1, - n = children.length, - child, - area; - while (++i < n) { - area = (child = children[i]).value * (k < 0 ? 0 : k); - child.area = isNaN(area) || area <= 0 ? 0 : area; - } - } - - // Recursively arranges the specified node's children into squarified rows. - function squarify(node) { - var children = node.children; - if (children && children.length) { - var rect = pad(node), - row = [], - remaining = children.slice(), // copy-on-write - child, - best = Infinity, // the best row score so far - score, // the current row score - u = Math.min(rect.dx, rect.dy), // initial orientation - n; - scale(remaining, rect.dx * rect.dy / node.value); - row.area = 0; - while ((n = remaining.length) > 0) { - row.push(child = remaining[n - 1]); - row.area += child.area; - if ((score = worst(row, u)) <= best) { // continue with this orientation - remaining.pop(); - best = score; - } else { // abort, and try a different orientation - row.area -= row.pop().area; - position(row, u, rect, false); - u = Math.min(rect.dx, rect.dy); - row.length = row.area = 0; - best = Infinity; - } - } - if (row.length) { - position(row, u, rect, true); - row.length = row.area = 0; - } - children.forEach(squarify); - } - } - - // Recursively resizes the specified node's children into existing rows. - // Preserves the existing layout! - function stickify(node) { - var children = node.children; - if (children && children.length) { - var rect = pad(node), - remaining = children.slice(), // copy-on-write - child, - row = []; - scale(remaining, rect.dx * rect.dy / node.value); - row.area = 0; - while (child = remaining.pop()) { - row.push(child); - row.area += child.area; - if (child.z != null) { - position(row, child.z ? rect.dx : rect.dy, rect, !remaining.length); - row.length = row.area = 0; - } - } - children.forEach(stickify); - } - } - - // Computes the score for the specified row, as the worst aspect ratio. - function worst(row, u) { - var s = row.area, - r, - rmax = 0, - rmin = Infinity, - i = -1, - n = row.length; - while (++i < n) { - if (!(r = row[i].area)) continue; - if (r < rmin) rmin = r; - if (r > rmax) rmax = r; - } - s *= s; - u *= u; - return s - ? Math.max((u * rmax * ratio) / s, s / (u * rmin * ratio)) - : Infinity; - } - - // Positions the specified row of nodes. Modifies `rect`. - function position(row, u, rect, flush) { - var i = -1, - n = row.length, - x = rect.x, - y = rect.y, - v = u ? round(row.area / u) : 0, - o; - if (u == rect.dx) { // horizontal subdivision - if (flush || v > rect.dy) v = v ? rect.dy : 0; // over+underflow - while (++i < n) { - o = row[i]; - o.x = x; - o.y = y; - o.dy = v; - x += o.dx = v ? round(o.area / v) : 0; - } - o.z = true; - o.dx += rect.x + rect.dx - x; // rounding error - rect.y += v; - rect.dy -= v; - } else { // vertical subdivision - if (flush || v > rect.dx) v = v ? rect.dx : 0; // over+underflow - while (++i < n) { - o = row[i]; - o.x = x; - o.y = y; - o.dx = v; - y += o.dy = v ? round(o.area / v) : 0; - } - o.z = false; - o.dy += rect.y + rect.dy - y; // rounding error - rect.x += v; - rect.dx -= v; - } - } - - function treemap(d) { - var nodes = stickies || hierarchy(d), - root = nodes[0]; - root.x = 0; - root.y = 0; - root.dx = size[0]; - root.dy = size[1]; - if (stickies) hierarchy.revalue(root); - scale([root], root.dx * root.dy / root.value); - (stickies ? stickify : squarify)(root); - if (sticky) stickies = nodes; - return nodes; - } - - treemap.size = function(x) { - if (!arguments.length) return size; - size = x; - return treemap; - }; - - treemap.padding = function(x) { - if (!arguments.length) return padding; - - function padFunction(node) { - var p = x.call(treemap, node, node.depth); - return p == null - ? d3_layout_treemapPadNull(node) - : d3_layout_treemapPad(node, typeof p === "number" ? [p, p, p, p] : p); - } - - function padConstant(node) { - return d3_layout_treemapPad(node, x); - } - - var type; - pad = (padding = x) == null ? d3_layout_treemapPadNull - : (type = typeof x) === "function" ? padFunction - : type === "number" ? (x = [x, x, x, x], padConstant) - : padConstant; - return treemap; - }; - - treemap.round = function(x) { - if (!arguments.length) return round != Number; - round = x ? Math.round : Number; - return treemap; - }; - - treemap.sticky = function(x) { - if (!arguments.length) return sticky; - sticky = x; - stickies = null; - return treemap; - }; - - treemap.ratio = function(x) { - if (!arguments.length) return ratio; - ratio = x; - return treemap; - }; - - return d3_layout_hierarchyRebind(treemap, hierarchy); -}; - -function d3_layout_treemapPadNull(node) { - return {x: node.x, y: node.y, dx: node.dx, dy: node.dy}; -} - -function d3_layout_treemapPad(node, padding) { - var x = node.x + padding[3], - y = node.y + padding[0], - dx = node.dx - padding[1] - padding[3], - dy = node.dy - padding[0] - padding[2]; - if (dx < 0) { x += dx / 2; dx = 0; } - if (dy < 0) { y += dy / 2; dy = 0; } - return {x: x, y: y, dx: dx, dy: dy}; -} -})(); diff --git a/deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/js/d3/d3.time.js b/deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/js/d3/d3.time.js deleted file mode 100644 index e1c0831c88e2984fbabc189a5347238bde72abb2..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/js/d3/d3.time.js +++ /dev/null @@ -1,692 +0,0 @@ -(function(){d3.time = {}; - -var d3_time = Date; -d3.time.format = function(template) { - var n = template.length; - - function format(date) { - var string = [], - i = -1, - j = 0, - c, - f; - while (++i < n) { - if (template.charCodeAt(i) == 37) { - string.push( - template.substring(j, i), - (f = d3_time_formats[c = template.charAt(++i)]) - ? f(date) : c); - j = i + 1; - } - } - string.push(template.substring(j, i)); - return string.join(""); - } - - format.parse = function(string) { - var date = new d3_time(1900, 0, 1), - i = d3_time_parse(date, template, string, 0); - if (i != string.length) return null; - if (date.hour12) { - var hours = date.getHours() % 12; - date.setHours(date.hour12pm ? hours + 12 : hours); - } - delete date.hour12; - delete date.hour12pm; - return date; - }; - - format.toString = function() { - return template; - }; - - return format; -}; - -function d3_time_parse(date, template, string, j) { - var c, - p, - i = 0, - n = template.length, - m = string.length; - while (i < n) { - if (j >= m) return -1; - c = template.charCodeAt(i++); - if (c == 37) { - p = d3_time_parsers[template.charAt(i++)]; - if (!p || ((j = p(date, string, j)) < 0)) return -1; - } else if (c != string.charCodeAt(j++)) { - return -1; - } - } - return j; -} - -var d3_time_zfill2 = d3.format("02d"), - d3_time_zfill3 = d3.format("03d"), - d3_time_zfill4 = d3.format("04d"), - d3_time_sfill2 = d3.format("2d"); - -var d3_time_formats = { - a: function(d) { return d3_time_weekdays[d.getDay()].substring(0, 3); }, - A: function(d) { return d3_time_weekdays[d.getDay()]; }, - b: function(d) { return d3_time_months[d.getMonth()].substring(0, 3); }, - B: function(d) { return d3_time_months[d.getMonth()]; }, - c: d3.time.format("%a %b %e %H:%M:%S %Y"), - d: function(d) { return d3_time_zfill2(d.getDate()); }, - e: function(d) { return d3_time_sfill2(d.getDate()); }, - H: function(d) { return d3_time_zfill2(d.getHours()); }, - I: function(d) { return d3_time_zfill2(d.getHours() % 12 || 12); }, - j: d3_time_dayOfYear, - L: function(d) { return d3_time_zfill3(d.getMilliseconds()); }, - m: function(d) { return d3_time_zfill2(d.getMonth() + 1); }, - M: function(d) { return d3_time_zfill2(d.getMinutes()); }, - p: function(d) { return d.getHours() >= 12 ? "PM" : "AM"; }, - S: function(d) { return d3_time_zfill2(d.getSeconds()); }, - U: d3_time_weekNumberSunday, - w: function(d) { return d.getDay(); }, - W: d3_time_weekNumberMonday, - x: d3.time.format("%m/%d/%y"), - X: d3.time.format("%H:%M:%S"), - y: function(d) { return d3_time_zfill2(d.getFullYear() % 100); }, - Y: function(d) { return d3_time_zfill4(d.getFullYear() % 10000); }, - Z: d3_time_zone, - "%": function(d) { return "%"; } -}; - -var d3_time_parsers = { - a: d3_time_parseWeekdayAbbrev, - A: d3_time_parseWeekday, - b: d3_time_parseMonthAbbrev, - B: d3_time_parseMonth, - c: d3_time_parseLocaleFull, - d: d3_time_parseDay, - e: d3_time_parseDay, - H: d3_time_parseHour24, - I: d3_time_parseHour12, - // j: function(d, s, i) { /*TODO day of year [001,366] */ return i; }, - L: d3_time_parseMilliseconds, - m: d3_time_parseMonthNumber, - M: d3_time_parseMinutes, - p: d3_time_parseAmPm, - S: d3_time_parseSeconds, - // U: function(d, s, i) { /*TODO week number (sunday) [00,53] */ return i; }, - // w: function(d, s, i) { /*TODO weekday [0,6] */ return i; }, - // W: function(d, s, i) { /*TODO week number (monday) [00,53] */ return i; }, - x: d3_time_parseLocaleDate, - X: d3_time_parseLocaleTime, - y: d3_time_parseYear, - Y: d3_time_parseFullYear - // , - // Z: function(d, s, i) { /*TODO time zone */ return i; }, - // "%": function(d, s, i) { /*TODO literal % */ return i; } -}; - -// Note: weekday is validated, but does not set the date. -function d3_time_parseWeekdayAbbrev(date, string, i) { - return string.substring(i, i += 3).toLowerCase() in d3_time_weekdayAbbrevLookup ? i : -1; -} - -var d3_time_weekdayAbbrevLookup = { - sun: 3, - mon: 3, - tue: 3, - wed: 3, - thu: 3, - fri: 3, - sat: 3 -}; - -// Note: weekday is validated, but does not set the date. -function d3_time_parseWeekday(date, string, i) { - d3_time_weekdayRe.lastIndex = 0; - var n = d3_time_weekdayRe.exec(string.substring(i, i + 10)); - return n ? i += n[0].length : -1; -} - -var d3_time_weekdayRe = /^(?:Sunday|Monday|Tuesday|Wednesday|Thursday|Friday|Saturday)/ig; - -var d3_time_weekdays = [ - "Sunday", - "Monday", - "Tuesday", - "Wednesday", - "Thursday", - "Friday", - "Saturday" -]; - -function d3_time_parseMonthAbbrev(date, string, i) { - var n = d3_time_monthAbbrevLookup[string.substring(i, i += 3).toLowerCase()]; - return n == null ? -1 : (date.setMonth(n), i); -} - -var d3_time_monthAbbrevLookup = { - jan: 0, - feb: 1, - mar: 2, - apr: 3, - may: 4, - jun: 5, - jul: 6, - aug: 7, - sep: 8, - oct: 9, - nov: 10, - dec: 11 -}; - -function d3_time_parseMonth(date, string, i) { - d3_time_monthRe.lastIndex = 0; - var n = d3_time_monthRe.exec(string.substring(i, i + 12)); - return n ? (date.setMonth(d3_time_monthLookup[n[0].toLowerCase()]), i += n[0].length) : -1; -} - -var d3_time_monthRe = /^(?:January|February|March|April|May|June|July|August|September|October|November|December)/ig; - -var d3_time_monthLookup = { - january: 0, - february: 1, - march: 2, - april: 3, - may: 4, - june: 5, - july: 6, - august: 7, - september: 8, - october: 9, - november: 10, - december: 11 -}; - -var d3_time_months = [ - "January", - "February", - "March", - "April", - "May", - "June", - "July", - "August", - "September", - "October", - "November", - "December" -]; - -function d3_time_parseLocaleFull(date, string, i) { - return d3_time_parse(date, d3_time_formats.c.toString(), string, i); -} - -function d3_time_parseLocaleDate(date, string, i) { - return d3_time_parse(date, d3_time_formats.x.toString(), string, i); -} - -function d3_time_parseLocaleTime(date, string, i) { - return d3_time_parse(date, d3_time_formats.X.toString(), string, i); -} - -function d3_time_parseFullYear(date, string, i) { - d3_time_numberRe.lastIndex = 0; - var n = d3_time_numberRe.exec(string.substring(i, i + 4)); - return n ? (date.setFullYear(n[0]), i += n[0].length) : -1; -} - -function d3_time_parseYear(date, string, i) { - d3_time_numberRe.lastIndex = 0; - var n = d3_time_numberRe.exec(string.substring(i, i + 2)); - return n ? (date.setFullYear(d3_time_century() + +n[0]), i += n[0].length) : -1; -} - -function d3_time_century() { - return ~~(new Date().getFullYear() / 1000) * 1000; -} - -function d3_time_parseMonthNumber(date, string, i) { - d3_time_numberRe.lastIndex = 0; - var n = d3_time_numberRe.exec(string.substring(i, i + 2)); - return n ? (date.setMonth(n[0] - 1), i += n[0].length) : -1; -} - -function d3_time_parseDay(date, string, i) { - d3_time_numberRe.lastIndex = 0; - var n = d3_time_numberRe.exec(string.substring(i, i + 2)); - return n ? (date.setDate(+n[0]), i += n[0].length) : -1; -} - -// Note: we don't validate that the hour is in the range [0,23]. -function d3_time_parseHour24(date, string, i) { - d3_time_numberRe.lastIndex = 0; - var n = d3_time_numberRe.exec(string.substring(i, i + 2)); - return n ? (date.setHours(+n[0]), i += n[0].length) : -1; -} - -// Note: we don't validate that the hour is in the range [1,12]. -function d3_time_parseHour12(date, string, i) { - date.hour12 = true; - return d3_time_parseHour24(date, string, i); -} - -function d3_time_parseMinutes(date, string, i) { - d3_time_numberRe.lastIndex = 0; - var n = d3_time_numberRe.exec(string.substring(i, i + 2)); - return n ? (date.setMinutes(+n[0]), i += n[0].length) : -1; -} - -function d3_time_parseSeconds(date, string, i) { - d3_time_numberRe.lastIndex = 0; - var n = d3_time_numberRe.exec(string.substring(i, i + 2)); - return n ? (date.setSeconds(+n[0]), i += n[0].length) : -1; -} - -function d3_time_parseMilliseconds(date, string, i) { - d3_time_numberRe.lastIndex = 0; - var n = d3_time_numberRe.exec(string.substring(i, i + 3)); - return n ? (date.setMilliseconds(+n[0]), i += n[0].length) : -1; -} - -// Note: we don't look at the next directive. -var d3_time_numberRe = /\s*\d+/; - -function d3_time_parseAmPm(date, string, i) { - var n = d3_time_amPmLookup[string.substring(i, i += 2).toLowerCase()]; - return n == null ? -1 : (date.hour12pm = n, i); -} - -var d3_time_amPmLookup = { - am: 0, - pm: 1 -}; - -function d3_time_year(d) { - return new d3_time(d.getFullYear(), 0, 1); -} - -function d3_time_daysElapsed(d0, d1) { - return ~~((d1 - d0) / 864e5 - (d1.getTimezoneOffset() - d0.getTimezoneOffset()) / 1440); -} - -function d3_time_dayOfYear(d) { - return d3_time_zfill3(1 + d3_time_daysElapsed(d3_time_year(d), d)); -} - -function d3_time_weekNumberSunday(d) { - var d0 = d3_time_year(d); - return d3_time_zfill2(~~((d3_time_daysElapsed(d0, d) + d0.getDay()) / 7)); -} - -function d3_time_weekNumberMonday(d) { - var d0 = d3_time_year(d); - return d3_time_zfill2(~~((d3_time_daysElapsed(d0, d) + (d0.getDay() + 6) % 7) / 7)); -} - -// TODO table of time zone offset names? -function d3_time_zone(d) { - var z = d.getTimezoneOffset(), - zs = z > 0 ? "-" : "+", - zh = ~~(Math.abs(z) / 60), - zm = Math.abs(z) % 60; - return zs + d3_time_zfill2(zh) + d3_time_zfill2(zm); -} -d3.time.format.utc = function(template) { - var local = d3.time.format(template); - - function format(date) { - try { - d3_time = d3_time_format_utc; - var utc = new d3_time(); - utc._ = date; - return local(utc); - } finally { - d3_time = Date; - } - } - - format.parse = function(string) { - try { - d3_time = d3_time_format_utc; - var date = local.parse(string); - return date && date._; - } finally { - d3_time = Date; - } - }; - - format.toString = local.toString; - - return format; -}; - -function d3_time_format_utc() { - this._ = new Date(Date.UTC.apply(this, arguments)); -} - -d3_time_format_utc.prototype = { - getDate: function() { return this._.getUTCDate(); }, - getDay: function() { return this._.getUTCDay(); }, - getFullYear: function() { return this._.getUTCFullYear(); }, - getHours: function() { return this._.getUTCHours(); }, - getMilliseconds: function() { return this._.getUTCMilliseconds(); }, - getMinutes: function() { return this._.getUTCMinutes(); }, - getMonth: function() { return this._.getUTCMonth(); }, - getSeconds: function() { return this._.getUTCSeconds(); }, - getTimezoneOffset: function() { return 0; }, - valueOf: function() { return this._.getTime(); }, - setDate: function(x) { this._.setUTCDate(x); }, - setDay: function(x) { this._.setUTCDay(x); }, - setFullYear: function(x) { this._.setUTCFullYear(x); }, - setHours: function(x) { this._.setUTCHours(x); }, - setMilliseconds: function(x) { this._.setUTCMilliseconds(x); }, - setMinutes: function(x) { this._.setUTCMinutes(x); }, - setMonth: function(x) { this._.setUTCMonth(x); }, - setSeconds: function(x) { this._.setUTCSeconds(x); } -}; -var d3_time_formatIso = d3.time.format.utc("%Y-%m-%dT%H:%M:%S.%LZ"); - -d3.time.format.iso = Date.prototype.toISOString ? d3_time_formatIsoNative : d3_time_formatIso; - -function d3_time_formatIsoNative(date) { - return date.toISOString(); -} - -d3_time_formatIsoNative.parse = function(string) { - return new Date(string); -}; - -d3_time_formatIsoNative.toString = d3_time_formatIso.toString; -function d3_time_range(floor, step, number) { - return function(t0, t1, dt) { - var time = floor(t0), times = []; - if (time < t0) step(time); - if (dt > 1) { - while (time < t1) { - var date = new Date(+time); - if (!(number(date) % dt)) times.push(date); - step(time); - } - } else { - while (time < t1) times.push(new Date(+time)), step(time); - } - return times; - }; -} -d3.time.second = function(date) { - return new Date(~~(date / 1e3) * 1e3); -}; - -d3.time.second.utc = d3.time.second; -d3.time.seconds = d3_time_range(d3.time.second, function(date) { - date.setTime(date.getTime() + 1e3); -}, function(date) { - return date.getSeconds(); -}); - -d3.time.seconds.utc = d3.time.seconds; -d3.time.minute = function(date) { - return new Date(~~(date / 6e4) * 6e4); -}; - -d3.time.minute.utc = d3.time.minute;d3.time.minutes = d3_time_range(d3.time.minute, d3_time_minutesStep, function(date) { - return date.getMinutes(); -}); - -d3.time.minutes.utc = d3_time_range(d3.time.minute, d3_time_minutesStep, function(date) { - return date.getUTCMinutes(); -}); - -function d3_time_minutesStep(date) { - date.setTime(date.getTime() + 6e4); // assumes no leap seconds -} -d3.time.hour = function(date) { - var offset = date.getTimezoneOffset() / 60; - return new Date((~~(date / 36e5 - offset) + offset) * 36e5); -}; - -d3.time.hour.utc = function(date) { - return new Date(~~(date / 36e5) * 36e5); -}; -d3.time.hours = d3_time_range(d3.time.hour, d3_time_hoursStep, function(date) { - return date.getHours(); -}); - -d3.time.hours.utc = d3_time_range(d3.time.hour.utc, d3_time_hoursStep, function(date) { - return date.getUTCHours(); -}); - -function d3_time_hoursStep(date) { - date.setTime(date.getTime() + 36e5); -} -d3.time.day = function(date) { - return new Date(date.getFullYear(), date.getMonth(), date.getDate()); -}; - -d3.time.day.utc = function(date) { - return new Date(~~(date / 864e5) * 864e5); -}; -d3.time.days = d3_time_range(d3.time.day, function(date) { - date.setDate(date.getDate() + 1); -}, function(date) { - return date.getDate() - 1; -}); - -d3.time.days.utc = d3_time_range(d3.time.day.utc, function(date) { - date.setUTCDate(date.getUTCDate() + 1); -}, function(date) { - return date.getUTCDate() - 1; -}); -d3.time.week = function(date) { - (date = d3.time.day(date)).setDate(date.getDate() - date.getDay()); - return date; -}; - -d3.time.week.utc = function(date) { - (date = d3.time.day.utc(date)).setUTCDate(date.getUTCDate() - date.getUTCDay()); - return date; -}; -d3.time.weeks = d3_time_range(d3.time.week, function(date) { - date.setDate(date.getDate() + 7); -}, function(date) { - return ~~((date - new Date(date.getFullYear(), 0, 1)) / 6048e5); -}); - -d3.time.weeks.utc = d3_time_range(d3.time.week.utc, function(date) { - date.setUTCDate(date.getUTCDate() + 7); -}, function(date) { - return ~~((date - Date.UTC(date.getUTCFullYear(), 0, 1)) / 6048e5); -}); -d3.time.month = function(date) { - return new Date(date.getFullYear(), date.getMonth(), 1); -}; - -d3.time.month.utc = function(date) { - return new Date(Date.UTC(date.getUTCFullYear(), date.getUTCMonth(), 1)); -}; -d3.time.months = d3_time_range(d3.time.month, function(date) { - date.setMonth(date.getMonth() + 1); -}, function(date) { - return date.getMonth(); -}); - -d3.time.months.utc = d3_time_range(d3.time.month.utc, function(date) { - date.setUTCMonth(date.getUTCMonth() + 1); -}, function(date) { - return date.getUTCMonth(); -}); -d3.time.year = function(date) { - return new Date(date.getFullYear(), 0, 1); -}; - -d3.time.year.utc = function(date) { - return new Date(Date.UTC(date.getUTCFullYear(), 0, 1)); -}; -d3.time.years = d3_time_range(d3.time.year, function(date) { - date.setFullYear(date.getFullYear() + 1); -}, function(date) { - return date.getFullYear(); -}); - -d3.time.years.utc = d3_time_range(d3.time.year.utc, function(date) { - date.setUTCFullYear(date.getUTCFullYear() + 1); -}, function(date) { - return date.getUTCFullYear(); -}); -// TODO nice -function d3_time_scale(linear, methods, format) { - - function scale(x) { - return linear(x); - } - - scale.invert = function(x) { - return d3_time_scaleDate(linear.invert(x)); - }; - - scale.domain = function(x) { - if (!arguments.length) return linear.domain().map(d3_time_scaleDate); - linear.domain(x); - return scale; - }; - - scale.ticks = function(m, k) { - var extent = d3_time_scaleExtent(scale.domain()); - if (typeof m !== "function") { - var span = extent[1] - extent[0], - target = span / m, - i = d3.bisect(d3_time_scaleSteps, target, 1, d3_time_scaleSteps.length - 1); - if (Math.log(target / d3_time_scaleSteps[i - 1]) < Math.log(d3_time_scaleSteps[i] / target)) --i; - m = methods[i]; - k = m[1]; - m = m[0]; - } - return m(extent[0], extent[1], k); - }; - - scale.tickFormat = function() { - return format; - }; - - scale.copy = function() { - return d3_time_scale(linear.copy(), methods, format); - }; - - // TOOD expose d3_scale_linear_rebind? - scale.range = d3.rebind(scale, linear.range); - scale.rangeRound = d3.rebind(scale, linear.rangeRound); - scale.interpolate = d3.rebind(scale, linear.interpolate); - scale.clamp = d3.rebind(scale, linear.clamp); - - return scale; -} - -// TODO expose d3_scaleExtent? -function d3_time_scaleExtent(domain) { - var start = domain[0], stop = domain[domain.length - 1]; - return start < stop ? [start, stop] : [stop, start]; -} - -function d3_time_scaleDate(t) { - return new Date(t); -} - -function d3_time_scaleFormat(formats) { - return function(date) { - var i = formats.length - 1, f = formats[i]; - while (!f[1](date)) f = formats[--i]; - return f[0](date); - }; -} - -var d3_time_scaleSteps = [ - 1e3, // 1-second - 5e3, // 5-second - 15e3, // 15-second - 3e4, // 30-second - 6e4, // 1-minute - 3e5, // 5-minute - 9e5, // 15-minute - 18e5, // 30-minute - 36e5, // 1-hour - 108e5, // 3-hour - 216e5, // 6-hour - 432e5, // 12-hour - 864e5, // 1-day - 1728e5, // 2-day - 6048e5, // 1-week - 1728e6, // 1-month - 7776e6, // 3-month - 31536e6 // 1-year -]; - -var d3_time_scaleLocalMethods = [ - [d3.time.seconds, 1], - [d3.time.seconds, 5], - [d3.time.seconds, 15], - [d3.time.seconds, 30], - [d3.time.minutes, 1], - [d3.time.minutes, 5], - [d3.time.minutes, 15], - [d3.time.minutes, 30], - [d3.time.hours, 1], - [d3.time.hours, 3], - [d3.time.hours, 6], - [d3.time.hours, 12], - [d3.time.days, 1], - [d3.time.days, 2], - [d3.time.weeks, 1], - [d3.time.months, 1], - [d3.time.months, 3], - [d3.time.years, 1] -]; - -var d3_time_scaleLocalFormats = [ - [d3.time.format("%Y"), function(d) { return true; }], - [d3.time.format("%B"), function(d) { return d.getMonth(); }], - [d3.time.format("%b %d"), function(d) { return d.getDate() != 1; }], - [d3.time.format("%a %d"), function(d) { return d.getDay() && d.getDate() != 1; }], - [d3.time.format("%I %p"), function(d) { return d.getHours(); }], - [d3.time.format("%I:%M"), function(d) { return d.getMinutes(); }], - [d3.time.format(":%S"), function(d) { return d.getSeconds() || d.getMilliseconds(); }] -]; - -var d3_time_scaleLocalFormat = d3_time_scaleFormat(d3_time_scaleLocalFormats); - -d3.time.scale = function() { - return d3_time_scale(d3.scale.linear(), d3_time_scaleLocalMethods, d3_time_scaleLocalFormat); -}; -var d3_time_scaleUTCMethods = [ - [d3.time.seconds.utc, 1], - [d3.time.seconds.utc, 5], - [d3.time.seconds.utc, 15], - [d3.time.seconds.utc, 30], - [d3.time.minutes.utc, 1], - [d3.time.minutes.utc, 5], - [d3.time.minutes.utc, 15], - [d3.time.minutes.utc, 30], - [d3.time.hours.utc, 1], - [d3.time.hours.utc, 3], - [d3.time.hours.utc, 6], - [d3.time.hours.utc, 12], - [d3.time.days.utc, 1], - [d3.time.days.utc, 2], - [d3.time.weeks.utc, 1], - [d3.time.months.utc, 1], - [d3.time.months.utc, 3], - [d3.time.years.utc, 1] -]; - -var d3_time_scaleUTCFormats = [ - [d3.time.format.utc("%Y"), function(d) { return true; }], - [d3.time.format.utc("%B"), function(d) { return d.getUTCMonth(); }], - [d3.time.format.utc("%b %d"), function(d) { return d.getUTCDate() != 1; }], - [d3.time.format.utc("%a %d"), function(d) { return d.getUTCDay() && d.getUTCDate() != 1; }], - [d3.time.format.utc("%I %p"), function(d) { return d.getUTCHours(); }], - [d3.time.format.utc("%I:%M"), function(d) { return d.getUTCMinutes(); }], - [d3.time.format.utc(":%S"), function(d) { return d.getUTCSeconds() || d.getUTCMilliseconds(); }] -]; - -var d3_time_scaleUTCFormat = d3_time_scaleFormat(d3_time_scaleUTCFormats); - -d3.time.scale.utc = function() { - return d3_time_scale(d3.scale.linear(), d3_time_scaleUTCMethods, d3_time_scaleUTCFormat); -}; -})(); diff --git a/deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/js/dagre/dagre.js b/deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/js/dagre/dagre.js deleted file mode 100644 index 54e90e13fbf88de0f7841f286f5a8cf67c992f0a..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/js/dagre/dagre.js +++ /dev/null @@ -1,4049 +0,0 @@ -/* -Copyright (c) 2012 Chris Pettitt - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. -*/ -(function() { - dagre = {}; -dagre.version = "0.0.6"; -/* - * Directed multi-graph used during layout. - */ -dagre.graph = {}; - -/* - * Creates a new directed multi-graph. This should be invoked with - * `var g = dagre.graph()` and _not_ `var g = new dagre.graph()`. - */ -dagre.graph = function() { - var nodes = {}, - inEdges = {}, - outEdges = {}, - edges = {}, - graph = {}, - idCounter = 0; - - graph.addNode = function(u, value) { - if (graph.hasNode(u)) { - throw new Error("Graph already has node '" + u + "':\n" + graph.toString()); - } - nodes[u] = { id: u, value: value }; - inEdges[u] = {}; - outEdges[u] = {}; - } - - graph.delNode = function(u) { - strictGetNode(u); - - graph.edges(u).forEach(function(e) { graph.delEdge(e); }); - - delete inEdges[u]; - delete outEdges[u]; - delete nodes[u]; - } - - graph.node = function(u) { - return strictGetNode(u).value; - } - - graph.hasNode = function(u) { - return u in nodes; - } - - graph.addEdge = function(e, source, target, value) { - strictGetNode(source); - strictGetNode(target); - - if (e === null) { - e = "_ANON-" + ++idCounter; - } - else if (graph.hasEdge(e)) { - throw new Error("Graph already has edge '" + e + "':\n" + graph.toString()); - } - - edges[e] = { id: e, source: source, target: target, value: value }; - addEdgeToMap(inEdges[target], source, e); - addEdgeToMap(outEdges[source], target, e); - } - - graph.delEdge = function(e) { - var edge = strictGetEdge(e); - delEdgeFromMap(inEdges[edge.target], edge.source, e) - delEdgeFromMap(outEdges[edge.source], edge.target, e) - delete edges[e]; - } - - graph.edge = function(e) { - return strictGetEdge(e).value; - } - - graph.source = function(e) { - return strictGetEdge(e).source; - } - - graph.target = function(e) { - return strictGetEdge(e).target; - } - - graph.hasEdge = function(e) { - return e in edges; - } - - graph.successors = function(u) { - strictGetNode(u); - return keys(outEdges[u]).map(function(v) { return nodes[v].id; }); - } - - graph.predecessors = function(u) { - strictGetNode(u); - return keys(inEdges[u]).map(function(v) { return nodes[v].id; }); - } - - graph.neighbors = function(u) { - strictGetNode(u); - var vs = {}; - keys(outEdges[u]).map(function(v) { vs[v] = true; }); - keys(inEdges[u]).map(function(v) { vs[v] = true; }); - return keys(vs).map(function(v) { return nodes[v].id; }); - } - - graph.nodes = function() { - var nodes = []; - graph.eachNode(function(id, _) { nodes.push(id); }); - return nodes; - } - - graph.eachNode = function(func) { - for (var k in nodes) { - var node = nodes[k]; - func(node.id, node.value); - } - } - - /* - * Return all edges with no arguments, - * the ones that are incident on a node (one argument), - * or all edges from a source to a target (two arguments) - */ - graph.edges = function(u, v) { - var es, sourceEdges; - if (!arguments.length) { - es = []; - graph.eachEdge(function(id) { es.push(id); }); - return es; - } else if (arguments.length === 1) { - return union([graph.inEdges(u), graph.outEdges(u)]); - } else if (arguments.length === 2) { - strictGetNode(u); - strictGetNode(v); - sourceEdges = outEdges[u]; - es = (v in sourceEdges) ? keys(sourceEdges[v].edges) : []; - return es.map(function(e) { return edges[e].id }); - } - }; - - graph.eachEdge = function(func) { - for (var k in edges) { - var edge = edges[k]; - func(edge.id, edge.source, edge.target, edge.value); - } - } - - /* - * Return all in edges to a target node - */ - graph.inEdges = function(target) { - strictGetNode(target); - return concat(values(inEdges[target]).map(function(es) { return keys(es.edges); })); - }; - - /* - * Return all out edges from a source node - */ - graph.outEdges = function(source) { - strictGetNode(source); - return concat(values(outEdges[source]).map(function(es) { return keys(es.edges); })); - }; - - graph.subgraph = function(us) { - var g = dagre.graph(); - us.forEach(function(u) { - g.addNode(u, graph.node(u)); - }); - values(edges).forEach(function(e) { - if (g.hasNode(e.source) && g.hasNode(e.target)) { - g.addEdge(e.id, e.source, e.target, graph.edge(e.id)); - } - }); - return g; - }; - - graph.toString = function() { - var str = "GRAPH:\n"; - str += " Nodes:\n"; - keys(nodes).forEach(function(u) { - str += " " + u + ": " + JSON.stringify(nodes[u].value) + "\n"; - }); - str += " Edges:\n"; - keys(edges).forEach(function(e) { - var edge = edges[e]; - str += " " + e + " (" + edge.source + " -> " + edge.target + "): " + JSON.stringify(edges[e].value) + "\n"; - }); - return str; - }; - - function addEdgeToMap(map, v, e) { - var vEntry = map[v]; - if (!vEntry) { - vEntry = map[v] = { count: 0, edges: {} }; - } - vEntry.count++; - vEntry.edges[e] = true; - } - - function delEdgeFromMap(map, v, e) { - var vEntry = map[v]; - if (--vEntry.count == 0) { - delete map[v]; - } else { - delete vEntry.edges[e]; - } - } - - function strictGetNode(u) { - var node = nodes[u]; - if (!(u in nodes)) { - throw new Error("Node '" + u + "' is not in graph:\n" + graph.toString()); - } - return node; - } - - function strictGetEdge(e) { - var edge = edges[e]; - if (!edge) { - throw new Error("Edge '" + e + "' is not in graph:\n" + graph.toString()); - } - return edge; - } - - return graph; -} -dagre.layout = function() { - // External configuration - var config = { - // Nodes to lay out. At minimum must have `width` and `height` attributes. - nodes: [], - // Edges to lay out. At mimimum must have `source` and `target` attributes. - edges: [], - // How much debug information to include? - debugLevel: 0, - }; - - var timer = createTimer(); - - // Phase functions - var - acyclic = dagre.layout.acyclic(), - rank = dagre.layout.rank(), - order = dagre.layout.order(), - position = dagre.layout.position(); - - // This layout object - var self = {}; - - self.nodes = propertyAccessor(self, config, "nodes"); - self.edges = propertyAccessor(self, config, "edges"); - - self.orderIters = delegateProperty(order.iterations); - - self.nodeSep = delegateProperty(position.nodeSep); - self.edgeSep = delegateProperty(position.edgeSep); - self.universalSep = delegateProperty(position.universalSep); - self.rankSep = delegateProperty(position.rankSep); - self.rankDir = delegateProperty(position.rankDir); - self.debugAlignment = delegateProperty(position.debugAlignment); - - self.debugLevel = propertyAccessor(self, config, "debugLevel", function(x) { - timer.enabled(x); - acyclic.debugLevel(x); - rank.debugLevel(x); - order.debugLevel(x); - position.debugLevel(x); - }); - - self.run = timer.wrap("Total layout", run); - - return self; - - // Build graph and save mapping of generated ids to original nodes and edges - function init() { - var g = dagre.graph(); - var nextId = 0; - - // Tag each node so that we can properly represent relationships when - // we add edges. Also copy relevant dimension information. - config.nodes.forEach(function(u) { - var id = "id" in u ? u.id : "_N" + nextId++; - u.dagre = { id: id, width: u.width, height: u.height }; - g.addNode(id, u.dagre); - }); - - config.edges.forEach(function(e) { - var source = e.source.dagre.id; - if (!g.hasNode(source)) { - throw new Error("Source node for '" + e + "' not in node list"); - } - - var target = e.target.dagre.id; - if (!g.hasNode(target)) { - throw new Error("Target node for '" + e + "' not in node list"); - } - - e.dagre = { - points: [] - }; - - // Track edges that aren't self loops - layout does nothing for self - // loops, so they can be skipped. - if (source !== target) { - var id = "id" in e ? e.id : "_E" + nextId++; - e.dagre.id = id; - e.dagre.minLen = e.minLen || 1; - e.dagre.width = e.width || 0; - e.dagre.height = e.height || 0; - g.addEdge(id, source, target, e.dagre); - } - }); - - return g; - } - - function run () { - var rankSep = self.rankSep(); - try { - if (!config.nodes.length) { - return; - } - - // Build internal graph - var g = init(); - - // Make space for edge labels - g.eachEdge(function(e, s, t, a) { - a.minLen *= 2; - }); - self.rankSep(rankSep / 2); - - // Reverse edges to get an acyclic graph, we keep the graph in an acyclic - // state until the very end. - acyclic.run(g); - - // Determine the rank for each node. Nodes with a lower rank will appear - // above nodes of higher rank. - rank.run(g); - - // Normalize the graph by ensuring that every edge is proper (each edge has - // a length of 1). We achieve this by adding dummy nodes to long edges, - // thus shortening them. - normalize(g); - - // Order the nodes so that edge crossings are minimized. - order.run(g); - - // Find the x and y coordinates for every node in the graph. - position.run(g); - - // De-normalize the graph by removing dummy nodes and augmenting the - // original long edges with coordinate information. - undoNormalize(g); - - // Reverses points for edges that are in a reversed state. - fixupEdgePoints(g); - - // Reverse edges that were revered previously to get an acyclic graph. - acyclic.undo(g); - } finally { - self.rankSep(rankSep); - } - - return self; - } - - // Assumes input graph has no self-loops and is otherwise acyclic. - function normalize(g) { - var dummyCount = 0; - g.eachEdge(function(e, s, t, a) { - var sourceRank = g.node(s).rank; - var targetRank = g.node(t).rank; - if (sourceRank + 1 < targetRank) { - for (var u = s, rank = sourceRank + 1, i = 0; rank < targetRank; ++rank, ++i) { - var v = "_D" + ++dummyCount; - var node = { - width: a.width, - height: a.height, - edge: { id: e, source: s, target: t, attrs: a }, - rank: rank, - dummy: true - }; - - // If this node represents a bend then we will use it as a control - // point. For edges with 2 segments this will be the center dummy - // node. For edges with more than two segments, this will be the - // first and last dummy node. - if (i === 0) node.index = 0; - else if (rank + 1 === targetRank) node.index = 1; - - g.addNode(v, node); - g.addEdge(null, u, v, {}); - u = v; - } - g.addEdge(null, u, t, {}); - g.delEdge(e); - } - }); - } - - function undoNormalize(g) { - var visited = {}; - - g.eachNode(function(u, a) { - if (a.dummy && "index" in a) { - var edge = a.edge; - if (!g.hasEdge(edge.id)) { - g.addEdge(edge.id, edge.source, edge.target, edge.attrs); - } - var points = g.edge(edge.id).points; - points[a.index] = { x: a.x, y: a.y, ul: a.ul, ur: a.ur, dl: a.dl, dr: a.dr }; - g.delNode(u); - } - }); - } - - function fixupEdgePoints(g) { - g.eachEdge(function(e, s, t, a) { if (a.reversed) a.points.reverse(); }); - } - - function delegateProperty(f) { - return function() { - if (!arguments.length) return f(); - f.apply(null, arguments); - return self; - } - } -} -dagre.layout.acyclic = function() { - // External configuration - var config = { - debugLevel: 0 - } - - var timer = createTimer(); - - var self = {}; - - self.debugLevel = propertyAccessor(self, config, "debugLevel", function(x) { - timer.enabled(x); - }); - - self.run = timer.wrap("Acyclic Phase", run); - - self.undo = function(g) { - g.eachEdge(function(e, s, t, a) { - if (a.reversed) { - delete a.reversed; - g.delEdge(e); - g.addEdge(e, t, s, a); - } - }); - } - - return self; - - function run(g) { - var onStack = {}, - visited = {}, - reverseCount = 0; - - function dfs(u) { - if (u in visited) return; - - visited[u] = onStack[u] = true; - g.outEdges(u).forEach(function(e) { - var t = g.target(e), - a; - - if (t in onStack) { - a = g.edge(e); - g.delEdge(e); - a.reversed = true; - ++reverseCount; - g.addEdge(e, t, u, a); - } else { - dfs(t); - } - }); - - delete onStack[u]; - } - - g.eachNode(function(u) { dfs(u); }); - - if (config.debugLevel >= 2) console.log("Acyclic Phase: reversed " + reverseCount + " edge(s)"); - } -}; -dagre.layout.rank = function() { - // External configuration - var config = { - debugLevel: 0 - }; - - var timer = createTimer(); - - var self = {}; - - self.debugLevel = propertyAccessor(self, config, "debugLevel", function(x) { - timer.enabled(x); - }); - - self.run = timer.wrap("Rank Phase", run); - - return self; - - function run(g) { - initRank(g); - components(g).forEach(function(cmpt) { - var subgraph = g.subgraph(cmpt); - feasibleTree(subgraph); - normalize(subgraph); - }); - }; - - - function initRank(g) { - var minRank = {}; - var pq = priorityQueue(); - - g.eachNode(function(u) { - pq.add(u, g.inEdges(u).length); - minRank[u] = 0; - }); - - while (pq.size() > 0) { - var minId = pq.min(); - if (pq.priority(minId) > 0) { - throw new Error("Input graph is not acyclic: " + g.toString()); - } - pq.removeMin(); - - var rank = minRank[minId]; - g.node(minId).rank = rank; - - g.outEdges(minId).forEach(function(e) { - var target = g.target(e); - minRank[target] = Math.max(minRank[target], rank + (g.edge(e).minLen || 1)); - pq.decrease(target, pq.priority(target) - 1); - }); - } - } - - function feasibleTree(g) { - // Precompute minimum lengths for each directed edge - var minLen = {}; - g.eachEdge(function(e, source, target, edge) { - var id = incidenceId(source, target); - minLen[id] = Math.max(minLen[id] || 1, edge.minLen || 1); - }); - - var tree = dagre.util.prim(g, function(u, v) { - return Math.abs(g.node(u).rank - g.node(v).rank) - minLen[incidenceId(u, v)]; - }); - - var visited = {}; - function dfs(u, rank) { - visited[u] = true; - g.node(u).rank = rank; - - tree[u].forEach(function(v) { - if (!(v in visited)) { - var delta = minLen[incidenceId(u, v)]; - dfs(v, rank + (g.edges(u, v).length ? delta : -delta)); - } - }); - } - - dfs(g.nodes()[0], 0); - - return tree; - } - - function normalize(g) { - var m = min(g.nodes().map(function(u) { return g.node(u).rank; })); - g.eachNode(function(u, node) { node.rank -= m; }); - } - - /* - * This id can be used to group (in an undirected manner) multi-edges - * incident on the same two nodes. - */ - function incidenceId(u, v) { - return u < v ? u.length + ":" + u + "-" + v : v.length + ":" + v + "-" + u; - } -} -dagre.layout.order = function() { - var config = { - iterations: 24, // max number of iterations - debugLevel: 0 - }; - - var timer = createTimer(); - - var self = {}; - - self.iterations = propertyAccessor(self, config, "iterations"); - - self.debugLevel = propertyAccessor(self, config, "debugLevel", function(x) { - timer.enabled(x); - }); - - self.run = timer.wrap("Order Phase", run); - - return self; - - function run(g) { - var layering = initOrder(g); - var bestLayering = copyLayering(layering); - var bestCC = crossCount(g, layering); - - if (config.debugLevel >= 2) { - console.log("Order phase start cross count: " + bestCC); - } - - var cc, i, lastBest; - for (i = 0, lastBest = 0; lastBest < 4 && i < config.iterations; ++i, ++lastBest) { - cc = sweep(g, i, layering); - if (cc < bestCC) { - bestLayering = copyLayering(layering); - bestCC = cc; - lastBest = 0; - } - if (config.debugLevel >= 3) { - console.log("Order phase iter " + i + " cross count: " + bestCC); - } - } - - bestLayering.forEach(function(layer) { - layer.forEach(function(u, i) { - g.node(u).order = i; - }); - }); - - if (config.debugLevel >= 2) { - console.log("Order iterations: " + i); - console.log("Order phase best cross count: " + bestCC); - } - - return bestLayering; - } - - function initOrder(g) { - var layering = []; - g.eachNode(function(n, a) { - var layer = layering[a.rank] || (layering[a.rank] = []); - layer.push(n); - }); - return layering; - } - - /* - * Returns a function that will return the predecessors for a node. This - * function differs from `g.predecessors(u)` in that a predecessor appears - * for each incident edge (`g.predecessors(u)` treats predecessors as a set). - * This allows pseudo-weighting of predecessor nodes. - */ - function multiPredecessors(g) { - return function(u) { - var preds = []; - g.inEdges(u).forEach(function(e) { - preds.push(g.source(e)); - }); - return preds; - } - } - - /* - * Same as `multiPredecessors(g)` but for successors. - */ - function multiSuccessors(g) { - return function(u) { - var sucs = []; - g.outEdges(u).forEach(function(e) { - sucs.push(g.target(e)); - }); - return sucs; - } - } - - function sweep(g, iter, layering) { - if (iter % 2 === 0) { - for (var i = 1; i < layering.length; ++i) { - barycenterLayer(layering[i - 1], layering[i], multiPredecessors(g)); - } - } else { - for (var i = layering.length - 2; i >= 0; --i) { - barycenterLayer(layering[i + 1], layering[i], multiSuccessors(g)); - } - } - return crossCount(g, layering); - } - - /* - * Given a fixed layer and a movable layer in a graph this function will - * attempt to find an improved ordering for the movable layer such that - * edge crossings may be reduced. - * - * This algorithm is based on the barycenter method. - */ - function barycenterLayer(fixed, movable, predecessors) { - var pos = layerPos(movable); - var bs = barycenters(fixed, movable, predecessors); - - var toSort = movable.slice(0).sort(function(x, y) { - return bs[x] - bs[y] || pos[x] - pos[y]; - }); - - for (var i = movable.length - 1; i >= 0; --i) { - if (bs[movable[i]] !== -1) { - movable[i] = toSort.pop(); - } - } - } - - /* - * Given a fixed layer and a movable layer in a graph, this function will - * return weights for the movable layer that can be used to reorder the layer - * for potentially reduced edge crossings. - */ - function barycenters(fixed, movable, predecessors) { - var pos = layerPos(fixed), // Position of node in fixed list - bs = {}; // Barycenters for each node - - movable.forEach(function(u) { - var b = -1; - var preds = predecessors(u); - if (preds.length > 0) { - b = 0; - preds.forEach(function(v) { b += pos[v]; }); - b = b / preds.length; - } - bs[u] = b; - }); - - return bs; - } - - function copyLayering(layering) { - return layering.map(function(l) { return l.slice(0); }); - } -} - -var crossCount = dagre.layout.order.crossCount = function(g, layering) { - var cc = 0; - var prevLayer; - layering.forEach(function(layer) { - if (prevLayer) { - cc += bilayerCrossCount(g, prevLayer, layer); - } - prevLayer = layer; - }); - return cc; -} - -/* - * This function searches through a ranked and ordered graph and counts the - * number of edges that cross. This algorithm is derived from: - * - * W. Barth et al., Bilayer Cross Counting, JGAA, 8(2) 179–194 (2004) - */ -var bilayerCrossCount = dagre.layout.order.bilayerCrossCount = function(g, layer1, layer2) { - var layer2Pos = layerPos(layer2); - - var indices = []; - layer1.forEach(function(u) { - var nodeIndices = []; - g.outEdges(u).forEach(function(e) { nodeIndices.push(layer2Pos[g.target(e)]); }); - nodeIndices.sort(function(x, y) { return x - y; }); - indices = indices.concat(nodeIndices); - }); - - var firstIndex = 1; - while (firstIndex < layer2.length) firstIndex <<= 1; - - var treeSize = 2 * firstIndex - 1; - firstIndex -= 1; - - var tree = []; - for (var i = 0; i < treeSize; ++i) { tree[i] = 0; } - - var cc = 0; - indices.forEach(function(i) { - var treeIndex = i + firstIndex; - ++tree[treeIndex]; - var weightSum = 0; - while (treeIndex > 0) { - if (treeIndex % 2) { - cc += tree[treeIndex + 1]; - } - treeIndex = (treeIndex - 1) >> 1; - ++tree[treeIndex]; - } - }); - - return cc; -} - -function layerPos(layer) { - var pos = {}; - layer.forEach(function(u, i) { pos[u] = i; }); - return pos; -} -/* - * The algorithms here are based on Brandes and Köpf, "Fast and Simple - * Horizontal Coordinate Assignment". - */ -dagre.layout.position = function() { - // External configuration - var config = { - nodeSep: 50, - edgeSep: 10, - universalSep: null, - rankSep: 30, - rankDir: "TB", - debugLevel: 0 - }; - - var timer = createTimer(); - - var self = {}; - - self.nodeSep = propertyAccessor(self, config, "nodeSep"); - self.edgeSep = propertyAccessor(self, config, "edgeSep"); - // If not null this separation value is used for all nodes and edges - // regardless of their widths. `nodeSep` and `edgeSep` are ignored with this - // option. - self.universalSep = propertyAccessor(self, config, "universalSep"); - self.rankSep = propertyAccessor(self, config, "rankSep"); - self.rankDir = propertyAccessor(self, config, "rankDir"); - self.debugLevel = propertyAccessor(self, config, "debugLevel", function(x) { - timer.enabled(x); - }); - - self.run = timer.wrap("Position Phase", run); - - return self; - - function run(g) { - var layering = []; - g.eachNode(function(u, node) { - var layer = layering[node.rank] || (layering[node.rank] = []); - layer[node.order] = u; - }); - - var conflicts = findConflicts(g, layering); - - var xss = {}; - ["u", "d"].forEach(function(vertDir) { - if (vertDir === "d") layering.reverse(); - - ["l", "r"].forEach(function(horizDir) { - if (horizDir === "r") reverseInnerOrder(layering); - - var dir = vertDir + horizDir; - var align = verticalAlignment(g, layering, conflicts, vertDir === "u" ? "predecessors" : "successors"); - xss[dir]= horizontalCompaction(g, layering, align.pos, align.root, align.align); - if (horizDir === "r") flipHorizontally(xss[dir]); - - if (horizDir === "r") reverseInnerOrder(layering); - }); - - if (vertDir === "d") layering.reverse(); - }); - - balance(g, layering, xss); - g.eachNode(function(v) { - var xs = []; - for (alignment in xss) { - xDebug(alignment, g, v, xss[alignment][v]); - xs.push(xss[alignment][v]); - } - xs.sort(function(x, y) { return x - y; }); - x(g, v, (xs[1] + xs[2]) / 2); - }); - - // Translate layout so left edge of bounding rectangle has coordinate 0 - var minX = min(g.nodes().map(function(u) { return x(g, u) - width(g, u) / 2; })); - g.eachNode(function(u) { x(g, u, x(g, u) - minX); }); - - // Align y coordinates with ranks - var posY = 0; - layering.forEach(function(layer) { - var maxHeight = max(layer.map(function(u) { return height(g, u); })); - posY += maxHeight / 2; - layer.forEach(function(u) { y(g, u, posY); }); - posY += maxHeight / 2 + config.rankSep; - }); - }; - - /* - * Generate an ID that can be used to represent any undirected edge that is - * incident on `u` and `v`. - */ - function undirEdgeId(u, v) { - return u < v - ? u.toString().length + ":" + u + "-" + v - : v.toString().length + ":" + v + "-" + u; - } - - function findConflicts(g, layering) { - var conflicts = {}, // Set of conflicting edge ids - pos = {}; // Position of node in its layer - - if (layering.length <= 2) return conflicts; - - layering[1].forEach(function(u, i) { pos[u] = i; }); - for (var i = 1; i < layering.length - 1; ++i) { - prevLayer = layering[i]; - currLayer = layering[i+1]; - var k0 = 0; // Position of the last inner segment in the previous layer - var l = 0; // Current position in the current layer (for iteration up to `l1`) - - // Scan current layer for next node that is incident to an inner segement - // between layering[i+1] and layering[i]. - for (var l1 = 0; l1 < currLayer.length; ++l1) { - var u = currLayer[l1]; // Next inner segment in the current layer or - // last node in the current layer - pos[u] = l1; - - var k1 = undefined; // Position of the next inner segment in the previous layer or - // the position of the last element in the previous layer - if (g.node(u).dummy) { - var uPred = g.predecessors(u)[0]; - if (g.node(uPred).dummy) - k1 = pos[uPred]; - } - if (k1 === undefined && l1 === currLayer.length - 1) - k1 = prevLayer.length - 1; - - if (k1 !== undefined) { - for (; l <= l1; ++l) { - g.predecessors(currLayer[l]).forEach(function(v) { - var k = pos[v]; - if (k < k0 || k > k1) - conflicts[undirEdgeId(currLayer[l], v)] = true; - }); - } - k0 = k1; - } - } - } - - return conflicts; - } - - function verticalAlignment(g, layering, conflicts, relationship) { - var pos = {}, // Position for a node in its layer - root = {}, // Root of the block that the node participates in - align = {}; // Points to the next node in the block or, if the last - // element in the block, points to the first block's root - - layering.forEach(function(layer) { - layer.forEach(function(u, i) { - root[u] = u; - align[u] = u; - pos[u] = i; - }); - }); - - layering.forEach(function(layer) { - var prevIdx = -1; - layer.forEach(function(v) { - var related = g[relationship](v), // Adjacent nodes from the previous layer - m; // The mid point in the related array - - if (related.length > 0) { - related.sort(function(x, y) { return pos[x] - pos[y]; }); - mid = (related.length - 1) / 2; - related.slice(Math.floor(mid), Math.ceil(mid) + 1).forEach(function(u) { - if (align[v] === v) { - if (!conflicts[undirEdgeId(u, v)] && prevIdx < pos[u]) { - align[u] = v; - align[v] = root[v] = root[u]; - prevIdx = pos[u]; - } - } - }); - } - }); - }); - - return { pos: pos, root: root, align: align }; - } - - // This function deviates from the standard BK algorithm in two ways. First - // it takes into account the size of the nodes. Second it includes a fix to - // the original algorithm that is described in Carstens, "Node and Label - // Placement in a Layered Layout Algorithm". - function horizontalCompaction(g, layering, pos, root, align) { - var sink = {}, // Mapping of node id -> sink node id for class - shift = {}, // Mapping of sink node id -> x delta - pred = {}, // Mapping of node id -> predecessor node (or null) - xs = {}; // Calculated X positions - - layering.forEach(function(layer) { - layer.forEach(function(u, i) { - sink[u] = u; - if (i > 0) - pred[u] = layer[i - 1]; - }); - }); - - function placeBlock(v) { - if (!(v in xs)) { - xs[v] = 0; - var w = v; - do { - if (pos[w] > 0) { - var u = root[pred[w]]; - placeBlock(u); - if (sink[v] === v) { - sink[v] = sink[u]; - } - var delta = sep(g, pred[w]) + sep(g, w); - if (sink[v] !== sink[u]) { - shift[sink[u]] = Math.min(shift[sink[u]] || Number.POSITIVE_INFINITY, xs[v] - xs[u] - delta); - } else { - xs[v] = Math.max(xs[v], xs[u] + delta); - } - } - w = align[w]; - } while (w !== v); - } - } - - // Root coordinates relative to sink - values(root).forEach(function(v) { - placeBlock(v); - }); - - // Absolute coordinates - layering.forEach(function(layer) { - layer.forEach(function(v) { - xs[v] = xs[root[v]]; - var xDelta = shift[sink[v]]; - if (root[v] === v && xDelta < Number.POSITIVE_INFINITY) - xs[v] += xDelta; - }); - }); - - return xs; - } - - function findMinCoord(g, layering, xs) { - return min(layering.map(function(layer) { - var u = layer[0]; - return xs[u]; - })); - } - - function findMaxCoord(g, layering, xs) { - return max(layering.map(function(layer) { - var u = layer[layer.length - 1]; - return xs[u]; - })); - } - - function balance(g, layering, xss) { - var min = {}, // Min coordinate for the alignment - max = {}, // Max coordinate for the alginment - smallestAlignment, - shift = {}; // Amount to shift a given alignment - - var smallest = Number.POSITIVE_INFINITY; - for (var alignment in xss) { - var xs = xss[alignment]; - min[alignment] = findMinCoord(g, layering, xs); - max[alignment] = findMaxCoord(g, layering, xs); - var w = max[alignment] - min[alignment]; - if (w < smallest) { - smallest = w; - smallestAlignment = alignment; - } - } - - // Determine how much to adjust positioning for each alignment - ["u", "d"].forEach(function(vertDir) { - ["l", "r"].forEach(function(horizDir) { - var alignment = vertDir + horizDir; - shift[alignment] = horizDir === "l" - ? min[smallestAlignment] - min[alignment] - : max[smallestAlignment] - max[alignment]; - }); - }); - - // Find average of medians for xss array - for (var alignment in xss) { - g.eachNode(function(v) { - xss[alignment][v] += shift[alignment]; - }); - }; - } - - function flipHorizontally(xs) { - for (var u in xs) { - xs[u] = -xs[u]; - } - } - - function reverseInnerOrder(layering) { - layering.forEach(function(layer) { - layer.reverse(); - }); - } - - function width(g, u) { - switch (config.rankDir) { - case "LR": return g.node(u).height; - default: return g.node(u).width; - } - } - - function height(g, u) { - switch(config.rankDir) { - case "LR": return g.node(u).width; - default: return g.node(u).height; - } - } - - function sep(g, u) { - if (config.universalSep !== null) { - return config.universalSep; - } - var w = width(g, u); - var s = g.node(u).dummy ? config.edgeSep : config.nodeSep; - return (w + s) / 2; - } - - function x(g, u, x) { - switch (config.rankDir) { - case "LR": - if (arguments.length < 3) { - return g.node(u).y; - } else { - g.node(u).y = x; - } - break; - default: - if (arguments.length < 3) { - return g.node(u).x; - } else { - g.node(u).x = x; - } - } - } - - function xDebug(name, g, u, x) { - switch (config.rankDir) { - case "LR": - if (arguments.length < 3) { - return g.node(u)[name]; - } else { - g.node(u)[name] = x; - } - break; - default: - if (arguments.length < 3) { - return g.node(u)[name]; - } else { - g.node(u)[name] = x; - } - } - } - - function y(g, u, y) { - switch (config.rankDir) { - case "LR": - if (arguments.length < 3) { - return g.node(u).x; - } else { - g.node(u).x = y; - } - break; - default: - if (arguments.length < 3) { - return g.node(u).y; - } else { - g.node(u).y = y; - } - } - } -} -dagre.util = {}; - -/* - * Copies attributes from `src` to `dst`. If an attribute name is in both - * `src` and `dst` then the attribute value from `src` takes precedence. - */ -function mergeAttributes(src, dst) { - Object.keys(src).forEach(function(k) { dst[k] = src[k]; }); -} - -function min(values) { - return Math.min.apply(null, values); -} - -function max(values) { - return Math.max.apply(null, values); -} - -function concat(arrays) { - return Array.prototype.concat.apply([], arrays); -} - -var keys = dagre.util.keys = Object.keys; - -/* - * Returns an array of all values in the given object. - */ -function values(obj) { - return Object.keys(obj).map(function(k) { return obj[k]; }); -} - -function union(arrays) { - var obj = {}; - for (var i = 0; i < arrays.length; ++i) { - var a = arrays[i]; - for (var j = 0; j < a.length; ++j) { - var v = a[j]; - obj[v] = v; - } - } - - var results = []; - for (var k in obj) { - results.push(obj[k]); - } - - return results; -} - -/* - * Returns all components in the graph using undirected navigation. - */ -var components = dagre.util.components = function(g) { - var results = []; - var visited = {}; - - function dfs(u, component) { - if (!(u in visited)) { - visited[u] = true; - component.push(u); - g.neighbors(u).forEach(function(v) { - dfs(v, component); - }); - } - }; - - g.eachNode(function(u) { - var component = []; - dfs(u, component); - if (component.length > 0) { - results.push(component); - } - }); - - return results; -}; - -/* - * This algorithm uses undirected traversal to find a miminum spanning tree - * using the supplied weight function. The algorithm is described in - * Cormen, et al., "Introduction to Algorithms". The returned structure - * is an array of node id to an array of adjacent nodes. - */ -var prim = dagre.util.prim = function(g, weight) { - var result = {}; - var parent = {}; - var q = priorityQueue(); - - if (g.nodes().length === 0) { - return result; - } - - g.eachNode(function(u) { - q.add(u, Number.POSITIVE_INFINITY); - result[u] = []; - }); - - // Start from arbitrary node - q.decrease(g.nodes()[0], 0); - - var u; - var init = false; - while (q.size() > 0) { - u = q.removeMin(); - if (u in parent) { - result[u].push(parent[u]); - result[parent[u]].push(u); - } else if (init) { - throw new Error("Input graph is not connected:\n" + g.toString()); - } else { - init = true; - } - - g.neighbors(u).forEach(function(v) { - var pri = q.priority(v); - if (pri !== undefined) { - var edgeWeight = weight(u, v); - if (edgeWeight < pri) { - parent[v] = u; - q.decrease(v, edgeWeight); - } - } - }); - } - - return result; -}; - -var intersectRect = dagre.util.intersectRect = function(rect, point) { - var x = rect.x; - var y = rect.y; - - // For now we only support rectangles - - // Rectangle intersection algorithm from: - // http://math.stackexchange.com/questions/108113/find-edge-between-two-boxes - var dx = point.x - x; - var dy = point.y - y; - var w = rect.width / 2; - var h = rect.height / 2; - - var sx, sy; - if (Math.abs(dy) * w > Math.abs(dx) * h) { - // Intersection is top or bottom of rect. - if (dy < 0) { - h = -h; - } - sx = dy === 0 ? 0 : h * dx / dy; - sy = h; - } else { - // Intersection is left or right of rect. - if (dx < 0) { - w = -w; - } - sx = w; - sy = dx === 0 ? 0 : w * dy / dx; - } - - return {x: x + sx, y: y + sy}; -} - -var pointStr = dagre.util.pointStr = function(point) { - return point.x + "," + point.y; -} - -var createTimer = function() { - var self = {}, - enabled = false; - - self.enabled = function(x) { - if (!arguments.length) return enabled; - enabled = x; - return self; - }; - - self.wrap = function(name, func) { - return function() { - var start = enabled ? new Date().getTime() : null; - try { - return func.apply(null, arguments); - } finally { - if (start) console.log(name + " time: " + (new Date().getTime() - start) + "ms"); - } - } - }; - - return self; -} - -function propertyAccessor(self, config, field, setHook) { - return function(x) { - if (!arguments.length) return config[field]; - config[field] = x; - if (setHook) setHook(x); - return self; - }; -} -function priorityQueue() { - var _arr = []; - var _keyIndices = {}; - - function _heapify(i) { - var arr = _arr; - var l = 2 * i, - r = l + 1, - largest = i; - if (l < arr.length) { - largest = arr[l].pri < arr[largest].pri ? l : largest; - if (r < arr.length) { - largest = arr[r].pri < arr[largest].pri ? r : largest; - } - if (largest !== i) { - _swap(i, largest); - _heapify(largest); - } - } - } - - function _decrease(index) { - var arr = _arr; - var pri = arr[index].pri; - var parent; - while (index > 0) { - parent = index >> 1; - if (arr[parent].pri < pri) { - break; - } - _swap(index, parent); - index = parent; - } - } - - function _swap(i, j) { - var arr = _arr; - var keyIndices = _keyIndices; - var tmp = arr[i]; - arr[i] = arr[j]; - arr[j] = tmp; - keyIndices[arr[i].key] = i; - keyIndices[arr[j].key] = j; - } - - function size() { return _arr.length; } - - function keys() { return Object.keys(_keyIndices); } - - function has(key) { return key in _keyIndices; } - - function priority(key) { - var index = _keyIndices[key]; - if (index !== undefined) { - return _arr[index].pri; - } - } - - function add(key, pri) { - if (!(key in _keyIndices)) { - var entry = {key: key, pri: pri}; - var index = _arr.length; - _keyIndices[key] = index; - _arr.push(entry); - _decrease(index); - return true; - } - return false; - } - - function min() { - if (size() > 0) { - return _arr[0].key; - } - } - - function removeMin() { - _swap(0, _arr.length - 1); - var min = _arr.pop(); - delete _keyIndices[min.key]; - _heapify(0); - return min.key; - } - - function decrease(key, pri) { - var index = _keyIndices[key]; - if (pri > _arr[index].pri) { - throw new Error("New priority is greater than current priority. " + - "Key: " + key + " Old: " + _arr[index].pri + " New: " + pri); - } - _arr[index].pri = pri; - _decrease(index); - } - - return { - size: size, - keys: keys, - has: has, - priority: priority, - add: add, - min: min, - removeMin: removeMin, - decrease: decrease - }; -} -dagre.dot = {}; - -dagre.dot.toGraph = function(str) { - var parseTree = dot_parser.parse(str); - var g = dagre.graph(); - var undir = parseTree.type === "graph"; - - function createNode(id, attrs) { - if (!(g.hasNode(id))) { - g.addNode(id, { id: id, label: id }); - } - if (attrs) { - mergeAttributes(attrs, g.node(id)); - } - } - - var edgeCount = {}; - function createEdge(source, target, attrs) { - var edgeKey = source + "-" + target; - var count = edgeCount[edgeKey]; - if (!count) { - count = edgeCount[edgeKey] = 0; - } - edgeCount[edgeKey]++; - - var id = attrs.id || edgeKey + "-" + count; - var edge = {}; - mergeAttributes(attrs, edge); - mergeAttributes({ id: id }, edge); - g.addEdge(id, source, target, edge); - } - - function handleStmt(stmt) { - switch (stmt.type) { - case "node": - createNode(stmt.id, stmt.attrs); - break; - case "edge": - var prev; - stmt.elems.forEach(function(elem) { - handleStmt(elem); - - switch(elem.type) { - case "node": - var curr = elem.id; - - if (prev) { - createEdge(prev, curr, stmt.attrs); - if (undir) { - createEdge(curr, prev, stmt.attrs); - } - } - prev = curr; - break; - default: - // We don't currently support subgraphs incident on an edge - throw new Error("Unsupported type incident on edge: " + elem.type); - } - }); - break; - case "attr": - // Ignore for now - break; - default: - throw new Error("Unsupported statement type: " + stmt.type); - } - } - - if (parseTree.stmts) { - parseTree.stmts.forEach(function(stmt) { - handleStmt(stmt); - }); - } - - return g; -}; - -dagre.dot.toObjects = function(str) { - var g = dagre.dot.toGraph(str); - var nodes = g.nodes().map(function(u) { return g.node(u); }); - var edges = g.edges().map(function(e) { - var edge = g.edge(e); - edge.source = g.node(g.source(e)); - edge.target = g.node(g.target(e)); - return edge; - }); - return { nodes: nodes, edges: edges }; -}; -dot_parser = (function(){ - /* - * Generated by PEG.js 0.7.0. - * - * http://pegjs.majda.cz/ - */ - - function quote(s) { - /* - * ECMA-262, 5th ed., 7.8.4: All characters may appear literally in a - * string literal except for the closing quote character, backslash, - * carriage return, line separator, paragraph separator, and line feed. - * Any character may appear in the form of an escape sequence. - * - * For portability, we also escape escape all control and non-ASCII - * characters. Note that "\0" and "\v" escape sequences are not used - * because JSHint does not like the first and IE the second. - */ - return '"' + s - .replace(/\\/g, '\\\\') // backslash - .replace(/"/g, '\\"') // closing quote character - .replace(/\x08/g, '\\b') // backspace - .replace(/\t/g, '\\t') // horizontal tab - .replace(/\n/g, '\\n') // line feed - .replace(/\f/g, '\\f') // form feed - .replace(/\r/g, '\\r') // carriage return - .replace(/[\x00-\x07\x0B\x0E-\x1F\x80-\uFFFF]/g, escape) - + '"'; - } - - var result = { - /* - * Parses the input with a generated parser. If the parsing is successfull, - * returns a value explicitly or implicitly specified by the grammar from - * which the parser was generated (see |PEG.buildParser|). If the parsing is - * unsuccessful, throws |PEG.parser.SyntaxError| describing the error. - */ - parse: function(input, startRule) { - var parseFunctions = { - "start": parse_start, - "stmtList": parse_stmtList, - "stmt": parse_stmt, - "attrStmt": parse_attrStmt, - "inlineAttrStmt": parse_inlineAttrStmt, - "nodeStmt": parse_nodeStmt, - "edgeStmt": parse_edgeStmt, - "subgraphStmt": parse_subgraphStmt, - "attrList": parse_attrList, - "attrListBlock": parse_attrListBlock, - "aList": parse_aList, - "edgeRHS": parse_edgeRHS, - "idDef": parse_idDef, - "nodeIdOrSubgraph": parse_nodeIdOrSubgraph, - "nodeId": parse_nodeId, - "port": parse_port, - "compassPt": parse_compassPt, - "id": parse_id, - "node": parse_node, - "edge": parse_edge, - "graph": parse_graph, - "digraph": parse_digraph, - "subgraph": parse_subgraph, - "strict": parse_strict, - "graphType": parse_graphType, - "whitespace": parse_whitespace, - "comment": parse_comment, - "_": parse__ - }; - - if (startRule !== undefined) { - if (parseFunctions[startRule] === undefined) { - throw new Error("Invalid rule name: " + quote(startRule) + "."); - } - } else { - startRule = "start"; - } - - var pos = 0; - var reportFailures = 0; - var rightmostFailuresPos = 0; - var rightmostFailuresExpected = []; - - function padLeft(input, padding, length) { - var result = input; - - var padLength = length - input.length; - for (var i = 0; i < padLength; i++) { - result = padding + result; - } - - return result; - } - - function escape(ch) { - var charCode = ch.charCodeAt(0); - var escapeChar; - var length; - - if (charCode <= 0xFF) { - escapeChar = 'x'; - length = 2; - } else { - escapeChar = 'u'; - length = 4; - } - - return '\\' + escapeChar + padLeft(charCode.toString(16).toUpperCase(), '0', length); - } - - function matchFailed(failure) { - if (pos < rightmostFailuresPos) { - return; - } - - if (pos > rightmostFailuresPos) { - rightmostFailuresPos = pos; - rightmostFailuresExpected = []; - } - - rightmostFailuresExpected.push(failure); - } - - function parse_start() { - var result0, result1, result2, result3, result4, result5, result6, result7, result8, result9, result10, result11, result12; - var pos0, pos1, pos2; - - pos0 = pos; - pos1 = pos; - result0 = []; - result1 = parse__(); - while (result1 !== null) { - result0.push(result1); - result1 = parse__(); - } - if (result0 !== null) { - pos2 = pos; - result1 = parse_strict(); - if (result1 !== null) { - result2 = parse__(); - if (result2 !== null) { - result1 = [result1, result2]; - } else { - result1 = null; - pos = pos2; - } - } else { - result1 = null; - pos = pos2; - } - result1 = result1 !== null ? result1 : ""; - if (result1 !== null) { - result2 = parse_graphType(); - if (result2 !== null) { - result3 = []; - result4 = parse__(); - while (result4 !== null) { - result3.push(result4); - result4 = parse__(); - } - if (result3 !== null) { - result4 = parse_id(); - result4 = result4 !== null ? result4 : ""; - if (result4 !== null) { - result5 = []; - result6 = parse__(); - while (result6 !== null) { - result5.push(result6); - result6 = parse__(); - } - if (result5 !== null) { - if (input.charCodeAt(pos) === 123) { - result6 = "{"; - pos++; - } else { - result6 = null; - if (reportFailures === 0) { - matchFailed("\"{\""); - } - } - if (result6 !== null) { - result7 = []; - result8 = parse__(); - while (result8 !== null) { - result7.push(result8); - result8 = parse__(); - } - if (result7 !== null) { - result8 = parse_stmtList(); - result8 = result8 !== null ? result8 : ""; - if (result8 !== null) { - result9 = []; - result10 = parse__(); - while (result10 !== null) { - result9.push(result10); - result10 = parse__(); - } - if (result9 !== null) { - if (input.charCodeAt(pos) === 125) { - result10 = "}"; - pos++; - } else { - result10 = null; - if (reportFailures === 0) { - matchFailed("\"}\""); - } - } - if (result10 !== null) { - result11 = []; - result12 = parse__(); - while (result12 !== null) { - result11.push(result12); - result12 = parse__(); - } - if (result11 !== null) { - result0 = [result0, result1, result2, result3, result4, result5, result6, result7, result8, result9, result10, result11]; - } else { - result0 = null; - pos = pos1; - } - } else { - result0 = null; - pos = pos1; - } - } else { - result0 = null; - pos = pos1; - } - } else { - result0 = null; - pos = pos1; - } - } else { - result0 = null; - pos = pos1; - } - } else { - result0 = null; - pos = pos1; - } - } else { - result0 = null; - pos = pos1; - } - } else { - result0 = null; - pos = pos1; - } - } else { - result0 = null; - pos = pos1; - } - } else { - result0 = null; - pos = pos1; - } - } else { - result0 = null; - pos = pos1; - } - } else { - result0 = null; - pos = pos1; - } - if (result0 !== null) { - result0 = (function(offset, type, id, stmts) { - return {type: type, id: id, stmts: stmts}; - })(pos0, result0[2], result0[4], result0[8]); - } - if (result0 === null) { - pos = pos0; - } - return result0; - } - - function parse_stmtList() { - var result0, result1, result2, result3, result4, result5, result6, result7; - var pos0, pos1, pos2; - - pos0 = pos; - pos1 = pos; - result0 = parse_stmt(); - if (result0 !== null) { - result1 = []; - result2 = parse__(); - while (result2 !== null) { - result1.push(result2); - result2 = parse__(); - } - if (result1 !== null) { - if (input.charCodeAt(pos) === 59) { - result2 = ";"; - pos++; - } else { - result2 = null; - if (reportFailures === 0) { - matchFailed("\";\""); - } - } - result2 = result2 !== null ? result2 : ""; - if (result2 !== null) { - result3 = []; - pos2 = pos; - result4 = []; - result5 = parse__(); - while (result5 !== null) { - result4.push(result5); - result5 = parse__(); - } - if (result4 !== null) { - result5 = parse_stmt(); - if (result5 !== null) { - result6 = []; - result7 = parse__(); - while (result7 !== null) { - result6.push(result7); - result7 = parse__(); - } - if (result6 !== null) { - if (input.charCodeAt(pos) === 59) { - result7 = ";"; - pos++; - } else { - result7 = null; - if (reportFailures === 0) { - matchFailed("\";\""); - } - } - result7 = result7 !== null ? result7 : ""; - if (result7 !== null) { - result4 = [result4, result5, result6, result7]; - } else { - result4 = null; - pos = pos2; - } - } else { - result4 = null; - pos = pos2; - } - } else { - result4 = null; - pos = pos2; - } - } else { - result4 = null; - pos = pos2; - } - while (result4 !== null) { - result3.push(result4); - pos2 = pos; - result4 = []; - result5 = parse__(); - while (result5 !== null) { - result4.push(result5); - result5 = parse__(); - } - if (result4 !== null) { - result5 = parse_stmt(); - if (result5 !== null) { - result6 = []; - result7 = parse__(); - while (result7 !== null) { - result6.push(result7); - result7 = parse__(); - } - if (result6 !== null) { - if (input.charCodeAt(pos) === 59) { - result7 = ";"; - pos++; - } else { - result7 = null; - if (reportFailures === 0) { - matchFailed("\";\""); - } - } - result7 = result7 !== null ? result7 : ""; - if (result7 !== null) { - result4 = [result4, result5, result6, result7]; - } else { - result4 = null; - pos = pos2; - } - } else { - result4 = null; - pos = pos2; - } - } else { - result4 = null; - pos = pos2; - } - } else { - result4 = null; - pos = pos2; - } - } - if (result3 !== null) { - result0 = [result0, result1, result2, result3]; - } else { - result0 = null; - pos = pos1; - } - } else { - result0 = null; - pos = pos1; - } - } else { - result0 = null; - pos = pos1; - } - } else { - result0 = null; - pos = pos1; - } - if (result0 !== null) { - result0 = (function(offset, first, rest) { - var result = [first]; - for (var i = 0; i < rest.length; ++i) { - result.push(rest[i][1]); - } - return result; - })(pos0, result0[0], result0[3]); - } - if (result0 === null) { - pos = pos0; - } - return result0; - } - - function parse_stmt() { - var result0; - - result0 = parse_attrStmt(); - if (result0 === null) { - result0 = parse_subgraphStmt(); - if (result0 === null) { - result0 = parse_inlineAttrStmt(); - if (result0 === null) { - result0 = parse_edgeStmt(); - if (result0 === null) { - result0 = parse_nodeStmt(); - } - } - } - } - return result0; - } - - function parse_attrStmt() { - var result0, result1, result2; - var pos0, pos1; - - pos0 = pos; - pos1 = pos; - result0 = parse_graph(); - if (result0 === null) { - result0 = parse_node(); - if (result0 === null) { - result0 = parse_edge(); - } - } - if (result0 !== null) { - result1 = []; - result2 = parse__(); - while (result2 !== null) { - result1.push(result2); - result2 = parse__(); - } - if (result1 !== null) { - result2 = parse_attrList(); - if (result2 !== null) { - result0 = [result0, result1, result2]; - } else { - result0 = null; - pos = pos1; - } - } else { - result0 = null; - pos = pos1; - } - } else { - result0 = null; - pos = pos1; - } - if (result0 !== null) { - result0 = (function(offset, type, attrs) { - return { type: "attr", attrType: type, attrs: attrs || {}}; - })(pos0, result0[0], result0[2]); - } - if (result0 === null) { - pos = pos0; - } - return result0; - } - - function parse_inlineAttrStmt() { - var result0, result1, result2, result3, result4; - var pos0, pos1; - - pos0 = pos; - pos1 = pos; - result0 = parse_id(); - if (result0 !== null) { - result1 = []; - result2 = parse__(); - while (result2 !== null) { - result1.push(result2); - result2 = parse__(); - } - if (result1 !== null) { - if (input.charCodeAt(pos) === 61) { - result2 = "="; - pos++; - } else { - result2 = null; - if (reportFailures === 0) { - matchFailed("\"=\""); - } - } - if (result2 !== null) { - result3 = []; - result4 = parse__(); - while (result4 !== null) { - result3.push(result4); - result4 = parse__(); - } - if (result3 !== null) { - result4 = parse_id(); - if (result4 !== null) { - result0 = [result0, result1, result2, result3, result4]; - } else { - result0 = null; - pos = pos1; - } - } else { - result0 = null; - pos = pos1; - } - } else { - result0 = null; - pos = pos1; - } - } else { - result0 = null; - pos = pos1; - } - } else { - result0 = null; - pos = pos1; - } - if (result0 !== null) { - result0 = (function(offset, k, v) { - var attrs = {}; - attrs[k] = v; - return { type: "inlineAttr", attrs: attrs }; - })(pos0, result0[0], result0[4]); - } - if (result0 === null) { - pos = pos0; - } - return result0; - } - - function parse_nodeStmt() { - var result0, result1, result2; - var pos0, pos1; - - pos0 = pos; - pos1 = pos; - result0 = parse_nodeId(); - if (result0 !== null) { - result1 = []; - result2 = parse__(); - while (result2 !== null) { - result1.push(result2); - result2 = parse__(); - } - if (result1 !== null) { - result2 = parse_attrList(); - result2 = result2 !== null ? result2 : ""; - if (result2 !== null) { - result0 = [result0, result1, result2]; - } else { - result0 = null; - pos = pos1; - } - } else { - result0 = null; - pos = pos1; - } - } else { - result0 = null; - pos = pos1; - } - if (result0 !== null) { - result0 = (function(offset, id, attrs) { return {type: "node", id: id, attrs: attrs || {}}; })(pos0, result0[0], result0[2]); - } - if (result0 === null) { - pos = pos0; - } - return result0; - } - - function parse_edgeStmt() { - var result0, result1, result2, result3, result4; - var pos0, pos1; - - pos0 = pos; - pos1 = pos; - result0 = parse_nodeIdOrSubgraph(); - if (result0 !== null) { - result1 = []; - result2 = parse__(); - while (result2 !== null) { - result1.push(result2); - result2 = parse__(); - } - if (result1 !== null) { - result2 = parse_edgeRHS(); - if (result2 !== null) { - result3 = []; - result4 = parse__(); - while (result4 !== null) { - result3.push(result4); - result4 = parse__(); - } - if (result3 !== null) { - result4 = parse_attrList(); - result4 = result4 !== null ? result4 : ""; - if (result4 !== null) { - result0 = [result0, result1, result2, result3, result4]; - } else { - result0 = null; - pos = pos1; - } - } else { - result0 = null; - pos = pos1; - } - } else { - result0 = null; - pos = pos1; - } - } else { - result0 = null; - pos = pos1; - } - } else { - result0 = null; - pos = pos1; - } - if (result0 !== null) { - result0 = (function(offset, lhs, rhs, attrs) { - var elems = [lhs]; - for (var i = 0; i < rhs.length; ++i) { - elems.push(rhs[i]); - } - return { type: "edge", elems: elems, attrs: attrs || {} }; - })(pos0, result0[0], result0[2], result0[4]); - } - if (result0 === null) { - pos = pos0; - } - return result0; - } - - function parse_subgraphStmt() { - var result0, result1, result2, result3, result4, result5; - var pos0, pos1, pos2, pos3; - - pos0 = pos; - pos1 = pos; - pos2 = pos; - result0 = parse_subgraph(); - if (result0 !== null) { - result1 = []; - result2 = parse__(); - while (result2 !== null) { - result1.push(result2); - result2 = parse__(); - } - if (result1 !== null) { - pos3 = pos; - result2 = parse_id(); - if (result2 !== null) { - result3 = []; - result4 = parse__(); - while (result4 !== null) { - result3.push(result4); - result4 = parse__(); - } - if (result3 !== null) { - result2 = [result2, result3]; - } else { - result2 = null; - pos = pos3; - } - } else { - result2 = null; - pos = pos3; - } - result2 = result2 !== null ? result2 : ""; - if (result2 !== null) { - result0 = [result0, result1, result2]; - } else { - result0 = null; - pos = pos2; - } - } else { - result0 = null; - pos = pos2; - } - } else { - result0 = null; - pos = pos2; - } - result0 = result0 !== null ? result0 : ""; - if (result0 !== null) { - if (input.charCodeAt(pos) === 123) { - result1 = "{"; - pos++; - } else { - result1 = null; - if (reportFailures === 0) { - matchFailed("\"{\""); - } - } - if (result1 !== null) { - result2 = []; - result3 = parse__(); - while (result3 !== null) { - result2.push(result3); - result3 = parse__(); - } - if (result2 !== null) { - result3 = parse_stmtList(); - if (result3 !== null) { - result4 = []; - result5 = parse__(); - while (result5 !== null) { - result4.push(result5); - result5 = parse__(); - } - if (result4 !== null) { - if (input.charCodeAt(pos) === 125) { - result5 = "}"; - pos++; - } else { - result5 = null; - if (reportFailures === 0) { - matchFailed("\"}\""); - } - } - if (result5 !== null) { - result0 = [result0, result1, result2, result3, result4, result5]; - } else { - result0 = null; - pos = pos1; - } - } else { - result0 = null; - pos = pos1; - } - } else { - result0 = null; - pos = pos1; - } - } else { - result0 = null; - pos = pos1; - } - } else { - result0 = null; - pos = pos1; - } - } else { - result0 = null; - pos = pos1; - } - if (result0 !== null) { - result0 = (function(offset, id, stmts) { - id = id[2] || []; - return { type: "subgraph", id: id[0], stmts: stmts }; - })(pos0, result0[0], result0[3]); - } - if (result0 === null) { - pos = pos0; - } - return result0; - } - - function parse_attrList() { - var result0, result1, result2, result3; - var pos0, pos1, pos2; - - pos0 = pos; - pos1 = pos; - result0 = parse_attrListBlock(); - if (result0 !== null) { - result1 = []; - pos2 = pos; - result2 = []; - result3 = parse__(); - while (result3 !== null) { - result2.push(result3); - result3 = parse__(); - } - if (result2 !== null) { - result3 = parse_attrListBlock(); - if (result3 !== null) { - result2 = [result2, result3]; - } else { - result2 = null; - pos = pos2; - } - } else { - result2 = null; - pos = pos2; - } - while (result2 !== null) { - result1.push(result2); - pos2 = pos; - result2 = []; - result3 = parse__(); - while (result3 !== null) { - result2.push(result3); - result3 = parse__(); - } - if (result2 !== null) { - result3 = parse_attrListBlock(); - if (result3 !== null) { - result2 = [result2, result3]; - } else { - result2 = null; - pos = pos2; - } - } else { - result2 = null; - pos = pos2; - } - } - if (result1 !== null) { - result0 = [result0, result1]; - } else { - result0 = null; - pos = pos1; - } - } else { - result0 = null; - pos = pos1; - } - if (result0 !== null) { - result0 = (function(offset, first, rest) { - var result = first; - for (var i = 0; i < rest.length; ++i) { - result = rightBiasedMerge(result, rest[i][1]); - } - return result; - })(pos0, result0[0], result0[1]); - } - if (result0 === null) { - pos = pos0; - } - return result0; - } - - function parse_attrListBlock() { - var result0, result1, result2, result3, result4; - var pos0, pos1; - - pos0 = pos; - pos1 = pos; - if (input.charCodeAt(pos) === 91) { - result0 = "["; - pos++; - } else { - result0 = null; - if (reportFailures === 0) { - matchFailed("\"[\""); - } - } - if (result0 !== null) { - result1 = []; - result2 = parse__(); - while (result2 !== null) { - result1.push(result2); - result2 = parse__(); - } - if (result1 !== null) { - result2 = parse_aList(); - result2 = result2 !== null ? result2 : ""; - if (result2 !== null) { - result3 = []; - result4 = parse__(); - while (result4 !== null) { - result3.push(result4); - result4 = parse__(); - } - if (result3 !== null) { - if (input.charCodeAt(pos) === 93) { - result4 = "]"; - pos++; - } else { - result4 = null; - if (reportFailures === 0) { - matchFailed("\"]\""); - } - } - if (result4 !== null) { - result0 = [result0, result1, result2, result3, result4]; - } else { - result0 = null; - pos = pos1; - } - } else { - result0 = null; - pos = pos1; - } - } else { - result0 = null; - pos = pos1; - } - } else { - result0 = null; - pos = pos1; - } - } else { - result0 = null; - pos = pos1; - } - if (result0 !== null) { - result0 = (function(offset, aList) { return aList; })(pos0, result0[2]); - } - if (result0 === null) { - pos = pos0; - } - return result0; - } - - function parse_aList() { - var result0, result1, result2, result3, result4, result5; - var pos0, pos1, pos2; - - pos0 = pos; - pos1 = pos; - result0 = parse_idDef(); - if (result0 !== null) { - result1 = []; - pos2 = pos; - result2 = []; - result3 = parse__(); - while (result3 !== null) { - result2.push(result3); - result3 = parse__(); - } - if (result2 !== null) { - if (input.charCodeAt(pos) === 44) { - result3 = ","; - pos++; - } else { - result3 = null; - if (reportFailures === 0) { - matchFailed("\",\""); - } - } - result3 = result3 !== null ? result3 : ""; - if (result3 !== null) { - result4 = []; - result5 = parse__(); - while (result5 !== null) { - result4.push(result5); - result5 = parse__(); - } - if (result4 !== null) { - result5 = parse_idDef(); - if (result5 !== null) { - result2 = [result2, result3, result4, result5]; - } else { - result2 = null; - pos = pos2; - } - } else { - result2 = null; - pos = pos2; - } - } else { - result2 = null; - pos = pos2; - } - } else { - result2 = null; - pos = pos2; - } - while (result2 !== null) { - result1.push(result2); - pos2 = pos; - result2 = []; - result3 = parse__(); - while (result3 !== null) { - result2.push(result3); - result3 = parse__(); - } - if (result2 !== null) { - if (input.charCodeAt(pos) === 44) { - result3 = ","; - pos++; - } else { - result3 = null; - if (reportFailures === 0) { - matchFailed("\",\""); - } - } - result3 = result3 !== null ? result3 : ""; - if (result3 !== null) { - result4 = []; - result5 = parse__(); - while (result5 !== null) { - result4.push(result5); - result5 = parse__(); - } - if (result4 !== null) { - result5 = parse_idDef(); - if (result5 !== null) { - result2 = [result2, result3, result4, result5]; - } else { - result2 = null; - pos = pos2; - } - } else { - result2 = null; - pos = pos2; - } - } else { - result2 = null; - pos = pos2; - } - } else { - result2 = null; - pos = pos2; - } - } - if (result1 !== null) { - result0 = [result0, result1]; - } else { - result0 = null; - pos = pos1; - } - } else { - result0 = null; - pos = pos1; - } - if (result0 !== null) { - result0 = (function(offset, first, rest) { - var result = first; - for (var i = 0; i < rest.length; ++i) { - result = rightBiasedMerge(result, rest[i][3]); - } - return result; - })(pos0, result0[0], result0[1]); - } - if (result0 === null) { - pos = pos0; - } - return result0; - } - - function parse_edgeRHS() { - var result0, result1, result2, result3, result4; - var pos0, pos1, pos2; - - pos0 = pos; - pos1 = pos; - pos2 = pos; - if (input.substr(pos, 2) === "--") { - result0 = "--"; - pos += 2; - } else { - result0 = null; - if (reportFailures === 0) { - matchFailed("\"--\""); - } - } - if (result0 !== null) { - result1 = (function(offset) { return directed; })(pos) ? null : ""; - if (result1 !== null) { - result0 = [result0, result1]; - } else { - result0 = null; - pos = pos2; - } - } else { - result0 = null; - pos = pos2; - } - if (result0 === null) { - pos2 = pos; - if (input.substr(pos, 2) === "->") { - result0 = "->"; - pos += 2; - } else { - result0 = null; - if (reportFailures === 0) { - matchFailed("\"->\""); - } - } - if (result0 !== null) { - result1 = (function(offset) { return directed; })(pos) ? "" : null; - if (result1 !== null) { - result0 = [result0, result1]; - } else { - result0 = null; - pos = pos2; - } - } else { - result0 = null; - pos = pos2; - } - } - if (result0 !== null) { - result1 = []; - result2 = parse__(); - while (result2 !== null) { - result1.push(result2); - result2 = parse__(); - } - if (result1 !== null) { - result2 = parse_nodeIdOrSubgraph(); - if (result2 !== null) { - result3 = []; - result4 = parse__(); - while (result4 !== null) { - result3.push(result4); - result4 = parse__(); - } - if (result3 !== null) { - result4 = parse_edgeRHS(); - result4 = result4 !== null ? result4 : ""; - if (result4 !== null) { - result0 = [result0, result1, result2, result3, result4]; - } else { - result0 = null; - pos = pos1; - } - } else { - result0 = null; - pos = pos1; - } - } else { - result0 = null; - pos = pos1; - } - } else { - result0 = null; - pos = pos1; - } - } else { - result0 = null; - pos = pos1; - } - if (result0 !== null) { - result0 = (function(offset, rhs, rest) { - var result = [rhs]; - for (var i = 0; i < rest.length; ++i) { - result.push(rest[i]); - } - return result; - })(pos0, result0[2], result0[4]); - } - if (result0 === null) { - pos = pos0; - } - return result0; - } - - function parse_idDef() { - var result0, result1, result2, result3, result4; - var pos0, pos1, pos2; - - pos0 = pos; - pos1 = pos; - result0 = parse_id(); - if (result0 !== null) { - pos2 = pos; - result1 = []; - result2 = parse__(); - while (result2 !== null) { - result1.push(result2); - result2 = parse__(); - } - if (result1 !== null) { - if (input.charCodeAt(pos) === 61) { - result2 = "="; - pos++; - } else { - result2 = null; - if (reportFailures === 0) { - matchFailed("\"=\""); - } - } - if (result2 !== null) { - result3 = []; - result4 = parse__(); - while (result4 !== null) { - result3.push(result4); - result4 = parse__(); - } - if (result3 !== null) { - result4 = parse_id(); - if (result4 !== null) { - result1 = [result1, result2, result3, result4]; - } else { - result1 = null; - pos = pos2; - } - } else { - result1 = null; - pos = pos2; - } - } else { - result1 = null; - pos = pos2; - } - } else { - result1 = null; - pos = pos2; - } - result1 = result1 !== null ? result1 : ""; - if (result1 !== null) { - result0 = [result0, result1]; - } else { - result0 = null; - pos = pos1; - } - } else { - result0 = null; - pos = pos1; - } - if (result0 !== null) { - result0 = (function(offset, k, v) { - var result = {}; - result[k] = v[3]; - return result; - })(pos0, result0[0], result0[1]); - } - if (result0 === null) { - pos = pos0; - } - return result0; - } - - function parse_nodeIdOrSubgraph() { - var result0; - var pos0; - - result0 = parse_subgraphStmt(); - if (result0 === null) { - pos0 = pos; - result0 = parse_nodeId(); - if (result0 !== null) { - result0 = (function(offset, id) { return { type: "node", id: id, attrs: {} }; })(pos0, result0); - } - if (result0 === null) { - pos = pos0; - } - } - return result0; - } - - function parse_nodeId() { - var result0, result1, result2; - var pos0, pos1; - - pos0 = pos; - pos1 = pos; - result0 = parse_id(); - if (result0 !== null) { - result1 = []; - result2 = parse__(); - while (result2 !== null) { - result1.push(result2); - result2 = parse__(); - } - if (result1 !== null) { - result2 = parse_port(); - result2 = result2 !== null ? result2 : ""; - if (result2 !== null) { - result0 = [result0, result1, result2]; - } else { - result0 = null; - pos = pos1; - } - } else { - result0 = null; - pos = pos1; - } - } else { - result0 = null; - pos = pos1; - } - if (result0 !== null) { - result0 = (function(offset, id) { return id; })(pos0, result0[0]); - } - if (result0 === null) { - pos = pos0; - } - return result0; - } - - function parse_port() { - var result0, result1, result2, result3, result4, result5, result6; - var pos0, pos1; - - pos0 = pos; - if (input.charCodeAt(pos) === 58) { - result0 = ":"; - pos++; - } else { - result0 = null; - if (reportFailures === 0) { - matchFailed("\":\""); - } - } - if (result0 !== null) { - result1 = []; - result2 = parse__(); - while (result2 !== null) { - result1.push(result2); - result2 = parse__(); - } - if (result1 !== null) { - result2 = parse_id(); - if (result2 !== null) { - result3 = []; - result4 = parse__(); - while (result4 !== null) { - result3.push(result4); - result4 = parse__(); - } - if (result3 !== null) { - pos1 = pos; - if (input.charCodeAt(pos) === 58) { - result4 = ":"; - pos++; - } else { - result4 = null; - if (reportFailures === 0) { - matchFailed("\":\""); - } - } - if (result4 !== null) { - result5 = []; - result6 = parse__(); - while (result6 !== null) { - result5.push(result6); - result6 = parse__(); - } - if (result5 !== null) { - result6 = parse_compassPt(); - if (result6 !== null) { - result4 = [result4, result5, result6]; - } else { - result4 = null; - pos = pos1; - } - } else { - result4 = null; - pos = pos1; - } - } else { - result4 = null; - pos = pos1; - } - result4 = result4 !== null ? result4 : ""; - if (result4 !== null) { - result0 = [result0, result1, result2, result3, result4]; - } else { - result0 = null; - pos = pos0; - } - } else { - result0 = null; - pos = pos0; - } - } else { - result0 = null; - pos = pos0; - } - } else { - result0 = null; - pos = pos0; - } - } else { - result0 = null; - pos = pos0; - } - return result0; - } - - function parse_compassPt() { - var result0; - - if (input.charCodeAt(pos) === 110) { - result0 = "n"; - pos++; - } else { - result0 = null; - if (reportFailures === 0) { - matchFailed("\"n\""); - } - } - if (result0 === null) { - if (input.substr(pos, 2) === "ne") { - result0 = "ne"; - pos += 2; - } else { - result0 = null; - if (reportFailures === 0) { - matchFailed("\"ne\""); - } - } - if (result0 === null) { - if (input.charCodeAt(pos) === 101) { - result0 = "e"; - pos++; - } else { - result0 = null; - if (reportFailures === 0) { - matchFailed("\"e\""); - } - } - if (result0 === null) { - if (input.substr(pos, 2) === "se") { - result0 = "se"; - pos += 2; - } else { - result0 = null; - if (reportFailures === 0) { - matchFailed("\"se\""); - } - } - if (result0 === null) { - if (input.charCodeAt(pos) === 115) { - result0 = "s"; - pos++; - } else { - result0 = null; - if (reportFailures === 0) { - matchFailed("\"s\""); - } - } - if (result0 === null) { - if (input.substr(pos, 2) === "sw") { - result0 = "sw"; - pos += 2; - } else { - result0 = null; - if (reportFailures === 0) { - matchFailed("\"sw\""); - } - } - if (result0 === null) { - if (input.charCodeAt(pos) === 119) { - result0 = "w"; - pos++; - } else { - result0 = null; - if (reportFailures === 0) { - matchFailed("\"w\""); - } - } - if (result0 === null) { - if (input.substr(pos, 2) === "nw") { - result0 = "nw"; - pos += 2; - } else { - result0 = null; - if (reportFailures === 0) { - matchFailed("\"nw\""); - } - } - if (result0 === null) { - if (input.charCodeAt(pos) === 99) { - result0 = "c"; - pos++; - } else { - result0 = null; - if (reportFailures === 0) { - matchFailed("\"c\""); - } - } - if (result0 === null) { - if (input.charCodeAt(pos) === 95) { - result0 = "_"; - pos++; - } else { - result0 = null; - if (reportFailures === 0) { - matchFailed("\"_\""); - } - } - } - } - } - } - } - } - } - } - } - return result0; - } - - function parse_id() { - var result0, result1, result2, result3, result4; - var pos0, pos1, pos2, pos3; - - reportFailures++; - pos0 = pos; - pos1 = pos; - if (/^[a-zA-Z\u0200-\u0377_]/.test(input.charAt(pos))) { - result0 = input.charAt(pos); - pos++; - } else { - result0 = null; - if (reportFailures === 0) { - matchFailed("[a-zA-Z\\u0200-\\u0377_]"); - } - } - if (result0 !== null) { - result1 = []; - if (/^[a-zA-Z\u0200-\u0377_0-9]/.test(input.charAt(pos))) { - result2 = input.charAt(pos); - pos++; - } else { - result2 = null; - if (reportFailures === 0) { - matchFailed("[a-zA-Z\\u0200-\\u0377_0-9]"); - } - } - while (result2 !== null) { - result1.push(result2); - if (/^[a-zA-Z\u0200-\u0377_0-9]/.test(input.charAt(pos))) { - result2 = input.charAt(pos); - pos++; - } else { - result2 = null; - if (reportFailures === 0) { - matchFailed("[a-zA-Z\\u0200-\\u0377_0-9]"); - } - } - } - if (result1 !== null) { - result0 = [result0, result1]; - } else { - result0 = null; - pos = pos1; - } - } else { - result0 = null; - pos = pos1; - } - if (result0 !== null) { - result0 = (function(offset, fst, rest) { return fst + rest.join(""); })(pos0, result0[0], result0[1]); - } - if (result0 === null) { - pos = pos0; - } - if (result0 === null) { - pos0 = pos; - pos1 = pos; - if (input.charCodeAt(pos) === 45) { - result0 = "-"; - pos++; - } else { - result0 = null; - if (reportFailures === 0) { - matchFailed("\"-\""); - } - } - result0 = result0 !== null ? result0 : ""; - if (result0 !== null) { - if (input.charCodeAt(pos) === 46) { - result1 = "."; - pos++; - } else { - result1 = null; - if (reportFailures === 0) { - matchFailed("\".\""); - } - } - if (result1 !== null) { - if (/^[0-9]/.test(input.charAt(pos))) { - result3 = input.charAt(pos); - pos++; - } else { - result3 = null; - if (reportFailures === 0) { - matchFailed("[0-9]"); - } - } - if (result3 !== null) { - result2 = []; - while (result3 !== null) { - result2.push(result3); - if (/^[0-9]/.test(input.charAt(pos))) { - result3 = input.charAt(pos); - pos++; - } else { - result3 = null; - if (reportFailures === 0) { - matchFailed("[0-9]"); - } - } - } - } else { - result2 = null; - } - if (result2 !== null) { - result0 = [result0, result1, result2]; - } else { - result0 = null; - pos = pos1; - } - } else { - result0 = null; - pos = pos1; - } - } else { - result0 = null; - pos = pos1; - } - if (result0 !== null) { - result0 = (function(offset, sign, dot, after) { return sign + dot + after.join(""); })(pos0, result0[0], result0[1], result0[2]); - } - if (result0 === null) { - pos = pos0; - } - if (result0 === null) { - pos0 = pos; - pos1 = pos; - if (input.charCodeAt(pos) === 45) { - result0 = "-"; - pos++; - } else { - result0 = null; - if (reportFailures === 0) { - matchFailed("\"-\""); - } - } - result0 = result0 !== null ? result0 : ""; - if (result0 !== null) { - if (/^[0-9]/.test(input.charAt(pos))) { - result2 = input.charAt(pos); - pos++; - } else { - result2 = null; - if (reportFailures === 0) { - matchFailed("[0-9]"); - } - } - if (result2 !== null) { - result1 = []; - while (result2 !== null) { - result1.push(result2); - if (/^[0-9]/.test(input.charAt(pos))) { - result2 = input.charAt(pos); - pos++; - } else { - result2 = null; - if (reportFailures === 0) { - matchFailed("[0-9]"); - } - } - } - } else { - result1 = null; - } - if (result1 !== null) { - pos2 = pos; - if (input.charCodeAt(pos) === 46) { - result2 = "."; - pos++; - } else { - result2 = null; - if (reportFailures === 0) { - matchFailed("\".\""); - } - } - if (result2 !== null) { - result3 = []; - if (/^[0-9]/.test(input.charAt(pos))) { - result4 = input.charAt(pos); - pos++; - } else { - result4 = null; - if (reportFailures === 0) { - matchFailed("[0-9]"); - } - } - while (result4 !== null) { - result3.push(result4); - if (/^[0-9]/.test(input.charAt(pos))) { - result4 = input.charAt(pos); - pos++; - } else { - result4 = null; - if (reportFailures === 0) { - matchFailed("[0-9]"); - } - } - } - if (result3 !== null) { - result2 = [result2, result3]; - } else { - result2 = null; - pos = pos2; - } - } else { - result2 = null; - pos = pos2; - } - result2 = result2 !== null ? result2 : ""; - if (result2 !== null) { - result0 = [result0, result1, result2]; - } else { - result0 = null; - pos = pos1; - } - } else { - result0 = null; - pos = pos1; - } - } else { - result0 = null; - pos = pos1; - } - if (result0 !== null) { - result0 = (function(offset, sign, before, after) { return sign + before.join("") + (after[0] || "") + (after[1] || []).join(""); })(pos0, result0[0], result0[1], result0[2]); - } - if (result0 === null) { - pos = pos0; - } - if (result0 === null) { - pos0 = pos; - pos1 = pos; - if (input.charCodeAt(pos) === 34) { - result0 = "\""; - pos++; - } else { - result0 = null; - if (reportFailures === 0) { - matchFailed("\"\\\"\""); - } - } - if (result0 !== null) { - result1 = []; - pos2 = pos; - if (input.substr(pos, 2) === "\\\"") { - result2 = "\\\""; - pos += 2; - } else { - result2 = null; - if (reportFailures === 0) { - matchFailed("\"\\\\\\\"\""); - } - } - if (result2 !== null) { - result2 = (function(offset) { return '"'; })(pos2); - } - if (result2 === null) { - pos = pos2; - } - if (result2 === null) { - pos2 = pos; - pos3 = pos; - if (input.charCodeAt(pos) === 92) { - result2 = "\\"; - pos++; - } else { - result2 = null; - if (reportFailures === 0) { - matchFailed("\"\\\\\""); - } - } - if (result2 !== null) { - if (/^[^"]/.test(input.charAt(pos))) { - result3 = input.charAt(pos); - pos++; - } else { - result3 = null; - if (reportFailures === 0) { - matchFailed("[^\"]"); - } - } - if (result3 !== null) { - result2 = [result2, result3]; - } else { - result2 = null; - pos = pos3; - } - } else { - result2 = null; - pos = pos3; - } - if (result2 !== null) { - result2 = (function(offset, ch) { return "\\" + ch; })(pos2, result2[1]); - } - if (result2 === null) { - pos = pos2; - } - if (result2 === null) { - if (/^[^"]/.test(input.charAt(pos))) { - result2 = input.charAt(pos); - pos++; - } else { - result2 = null; - if (reportFailures === 0) { - matchFailed("[^\"]"); - } - } - } - } - while (result2 !== null) { - result1.push(result2); - pos2 = pos; - if (input.substr(pos, 2) === "\\\"") { - result2 = "\\\""; - pos += 2; - } else { - result2 = null; - if (reportFailures === 0) { - matchFailed("\"\\\\\\\"\""); - } - } - if (result2 !== null) { - result2 = (function(offset) { return '"'; })(pos2); - } - if (result2 === null) { - pos = pos2; - } - if (result2 === null) { - pos2 = pos; - pos3 = pos; - if (input.charCodeAt(pos) === 92) { - result2 = "\\"; - pos++; - } else { - result2 = null; - if (reportFailures === 0) { - matchFailed("\"\\\\\""); - } - } - if (result2 !== null) { - if (/^[^"]/.test(input.charAt(pos))) { - result3 = input.charAt(pos); - pos++; - } else { - result3 = null; - if (reportFailures === 0) { - matchFailed("[^\"]"); - } - } - if (result3 !== null) { - result2 = [result2, result3]; - } else { - result2 = null; - pos = pos3; - } - } else { - result2 = null; - pos = pos3; - } - if (result2 !== null) { - result2 = (function(offset, ch) { return "\\" + ch; })(pos2, result2[1]); - } - if (result2 === null) { - pos = pos2; - } - if (result2 === null) { - if (/^[^"]/.test(input.charAt(pos))) { - result2 = input.charAt(pos); - pos++; - } else { - result2 = null; - if (reportFailures === 0) { - matchFailed("[^\"]"); - } - } - } - } - } - if (result1 !== null) { - if (input.charCodeAt(pos) === 34) { - result2 = "\""; - pos++; - } else { - result2 = null; - if (reportFailures === 0) { - matchFailed("\"\\\"\""); - } - } - if (result2 !== null) { - result0 = [result0, result1, result2]; - } else { - result0 = null; - pos = pos1; - } - } else { - result0 = null; - pos = pos1; - } - } else { - result0 = null; - pos = pos1; - } - if (result0 !== null) { - result0 = (function(offset, id) { return id.join(""); })(pos0, result0[1]); - } - if (result0 === null) { - pos = pos0; - } - } - } - } - reportFailures--; - if (reportFailures === 0 && result0 === null) { - matchFailed("identifier"); - } - return result0; - } - - function parse_node() { - var result0; - var pos0; - - pos0 = pos; - if (input.substr(pos, 4).toLowerCase() === "node") { - result0 = input.substr(pos, 4); - pos += 4; - } else { - result0 = null; - if (reportFailures === 0) { - matchFailed("\"node\""); - } - } - if (result0 !== null) { - result0 = (function(offset, k) { return k.toLowerCase(); })(pos0, result0); - } - if (result0 === null) { - pos = pos0; - } - return result0; - } - - function parse_edge() { - var result0; - var pos0; - - pos0 = pos; - if (input.substr(pos, 4).toLowerCase() === "edge") { - result0 = input.substr(pos, 4); - pos += 4; - } else { - result0 = null; - if (reportFailures === 0) { - matchFailed("\"edge\""); - } - } - if (result0 !== null) { - result0 = (function(offset, k) { return k.toLowerCase(); })(pos0, result0); - } - if (result0 === null) { - pos = pos0; - } - return result0; - } - - function parse_graph() { - var result0; - var pos0; - - pos0 = pos; - if (input.substr(pos, 5).toLowerCase() === "graph") { - result0 = input.substr(pos, 5); - pos += 5; - } else { - result0 = null; - if (reportFailures === 0) { - matchFailed("\"graph\""); - } - } - if (result0 !== null) { - result0 = (function(offset, k) { return k.toLowerCase(); })(pos0, result0); - } - if (result0 === null) { - pos = pos0; - } - return result0; - } - - function parse_digraph() { - var result0; - var pos0; - - pos0 = pos; - if (input.substr(pos, 7).toLowerCase() === "digraph") { - result0 = input.substr(pos, 7); - pos += 7; - } else { - result0 = null; - if (reportFailures === 0) { - matchFailed("\"digraph\""); - } - } - if (result0 !== null) { - result0 = (function(offset, k) { return k.toLowerCase(); })(pos0, result0); - } - if (result0 === null) { - pos = pos0; - } - return result0; - } - - function parse_subgraph() { - var result0; - var pos0; - - pos0 = pos; - if (input.substr(pos, 8).toLowerCase() === "subgraph") { - result0 = input.substr(pos, 8); - pos += 8; - } else { - result0 = null; - if (reportFailures === 0) { - matchFailed("\"subgraph\""); - } - } - if (result0 !== null) { - result0 = (function(offset, k) { return k.toLowerCase(); })(pos0, result0); - } - if (result0 === null) { - pos = pos0; - } - return result0; - } - - function parse_strict() { - var result0; - var pos0; - - pos0 = pos; - if (input.substr(pos, 6).toLowerCase() === "strict") { - result0 = input.substr(pos, 6); - pos += 6; - } else { - result0 = null; - if (reportFailures === 0) { - matchFailed("\"strict\""); - } - } - if (result0 !== null) { - result0 = (function(offset, k) { return k.toLowerCase(); })(pos0, result0); - } - if (result0 === null) { - pos = pos0; - } - return result0; - } - - function parse_graphType() { - var result0; - var pos0; - - result0 = parse_graph(); - if (result0 === null) { - pos0 = pos; - result0 = parse_digraph(); - if (result0 !== null) { - result0 = (function(offset, graph) { - directed = graph === "digraph"; - return graph; - })(pos0, result0); - } - if (result0 === null) { - pos = pos0; - } - } - return result0; - } - - function parse_whitespace() { - var result0, result1; - - reportFailures++; - if (/^[ \t\r\n]/.test(input.charAt(pos))) { - result1 = input.charAt(pos); - pos++; - } else { - result1 = null; - if (reportFailures === 0) { - matchFailed("[ \\t\\r\\n]"); - } - } - if (result1 !== null) { - result0 = []; - while (result1 !== null) { - result0.push(result1); - if (/^[ \t\r\n]/.test(input.charAt(pos))) { - result1 = input.charAt(pos); - pos++; - } else { - result1 = null; - if (reportFailures === 0) { - matchFailed("[ \\t\\r\\n]"); - } - } - } - } else { - result0 = null; - } - reportFailures--; - if (reportFailures === 0 && result0 === null) { - matchFailed("whitespace"); - } - return result0; - } - - function parse_comment() { - var result0, result1, result2, result3; - var pos0, pos1, pos2; - - reportFailures++; - pos0 = pos; - if (input.substr(pos, 2) === "//") { - result0 = "//"; - pos += 2; - } else { - result0 = null; - if (reportFailures === 0) { - matchFailed("\"//\""); - } - } - if (result0 !== null) { - result1 = []; - if (/^[^\n]/.test(input.charAt(pos))) { - result2 = input.charAt(pos); - pos++; - } else { - result2 = null; - if (reportFailures === 0) { - matchFailed("[^\\n]"); - } - } - while (result2 !== null) { - result1.push(result2); - if (/^[^\n]/.test(input.charAt(pos))) { - result2 = input.charAt(pos); - pos++; - } else { - result2 = null; - if (reportFailures === 0) { - matchFailed("[^\\n]"); - } - } - } - if (result1 !== null) { - result0 = [result0, result1]; - } else { - result0 = null; - pos = pos0; - } - } else { - result0 = null; - pos = pos0; - } - if (result0 === null) { - pos0 = pos; - if (input.substr(pos, 2) === "/*") { - result0 = "/*"; - pos += 2; - } else { - result0 = null; - if (reportFailures === 0) { - matchFailed("\"/*\""); - } - } - if (result0 !== null) { - result1 = []; - pos1 = pos; - pos2 = pos; - reportFailures++; - if (input.substr(pos, 2) === "*/") { - result2 = "*/"; - pos += 2; - } else { - result2 = null; - if (reportFailures === 0) { - matchFailed("\"*/\""); - } - } - reportFailures--; - if (result2 === null) { - result2 = ""; - } else { - result2 = null; - pos = pos2; - } - if (result2 !== null) { - if (input.length > pos) { - result3 = input.charAt(pos); - pos++; - } else { - result3 = null; - if (reportFailures === 0) { - matchFailed("any character"); - } - } - if (result3 !== null) { - result2 = [result2, result3]; - } else { - result2 = null; - pos = pos1; - } - } else { - result2 = null; - pos = pos1; - } - while (result2 !== null) { - result1.push(result2); - pos1 = pos; - pos2 = pos; - reportFailures++; - if (input.substr(pos, 2) === "*/") { - result2 = "*/"; - pos += 2; - } else { - result2 = null; - if (reportFailures === 0) { - matchFailed("\"*/\""); - } - } - reportFailures--; - if (result2 === null) { - result2 = ""; - } else { - result2 = null; - pos = pos2; - } - if (result2 !== null) { - if (input.length > pos) { - result3 = input.charAt(pos); - pos++; - } else { - result3 = null; - if (reportFailures === 0) { - matchFailed("any character"); - } - } - if (result3 !== null) { - result2 = [result2, result3]; - } else { - result2 = null; - pos = pos1; - } - } else { - result2 = null; - pos = pos1; - } - } - if (result1 !== null) { - if (input.substr(pos, 2) === "*/") { - result2 = "*/"; - pos += 2; - } else { - result2 = null; - if (reportFailures === 0) { - matchFailed("\"*/\""); - } - } - if (result2 !== null) { - result0 = [result0, result1, result2]; - } else { - result0 = null; - pos = pos0; - } - } else { - result0 = null; - pos = pos0; - } - } else { - result0 = null; - pos = pos0; - } - } - reportFailures--; - if (reportFailures === 0 && result0 === null) { - matchFailed("comment"); - } - return result0; - } - - function parse__() { - var result0; - - result0 = parse_whitespace(); - if (result0 === null) { - result0 = parse_comment(); - } - return result0; - } - - - function cleanupExpected(expected) { - expected.sort(); - - var lastExpected = null; - var cleanExpected = []; - for (var i = 0; i < expected.length; i++) { - if (expected[i] !== lastExpected) { - cleanExpected.push(expected[i]); - lastExpected = expected[i]; - } - } - return cleanExpected; - } - - function computeErrorPosition() { - /* - * The first idea was to use |String.split| to break the input up to the - * error position along newlines and derive the line and column from - * there. However IE's |split| implementation is so broken that it was - * enough to prevent it. - */ - - var line = 1; - var column = 1; - var seenCR = false; - - for (var i = 0; i < Math.max(pos, rightmostFailuresPos); i++) { - var ch = input.charAt(i); - if (ch === "\n") { - if (!seenCR) { line++; } - column = 1; - seenCR = false; - } else if (ch === "\r" || ch === "\u2028" || ch === "\u2029") { - line++; - column = 1; - seenCR = true; - } else { - column++; - seenCR = false; - } - } - - return { line: line, column: column }; - } - - - var directed; - - function rightBiasedMerge(lhs, rhs) { - var result = {}; - for (var k in lhs) { - result[k] = lhs[k]; - } - for (var k in rhs) { - result[k] = rhs[k]; - } - return result; - } - - - var result = parseFunctions[startRule](); - - /* - * The parser is now in one of the following three states: - * - * 1. The parser successfully parsed the whole input. - * - * - |result !== null| - * - |pos === input.length| - * - |rightmostFailuresExpected| may or may not contain something - * - * 2. The parser successfully parsed only a part of the input. - * - * - |result !== null| - * - |pos < input.length| - * - |rightmostFailuresExpected| may or may not contain something - * - * 3. The parser did not successfully parse any part of the input. - * - * - |result === null| - * - |pos === 0| - * - |rightmostFailuresExpected| contains at least one failure - * - * All code following this comment (including called functions) must - * handle these states. - */ - if (result === null || pos !== input.length) { - var offset = Math.max(pos, rightmostFailuresPos); - var found = offset < input.length ? input.charAt(offset) : null; - var errorPosition = computeErrorPosition(); - - throw new this.SyntaxError( - cleanupExpected(rightmostFailuresExpected), - found, - offset, - errorPosition.line, - errorPosition.column - ); - } - - return result; - }, - - /* Returns the parser source code. */ - toSource: function() { return this._source; } - }; - - /* Thrown when a parser encounters a syntax error. */ - - result.SyntaxError = function(expected, found, offset, line, column) { - function buildMessage(expected, found) { - var expectedHumanized, foundHumanized; - - switch (expected.length) { - case 0: - expectedHumanized = "end of input"; - break; - case 1: - expectedHumanized = expected[0]; - break; - default: - expectedHumanized = expected.slice(0, expected.length - 1).join(", ") - + " or " - + expected[expected.length - 1]; - } - - foundHumanized = found ? quote(found) : "end of input"; - - return "Expected " + expectedHumanized + " but " + foundHumanized + " found."; - } - - this.name = "SyntaxError"; - this.expected = expected; - this.found = found; - this.message = buildMessage(expected, found); - this.offset = offset; - this.line = line; - this.column = column; - }; - - result.SyntaxError.prototype = Error.prototype; - - return result; -})(); -})(); diff --git a/deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/js/dagre/dagre.min.js b/deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/js/dagre/dagre.min.js deleted file mode 100644 index ddc669f92b23a688dc006bef6c9f22a0d645bab6..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/js/dagre/dagre.min.js +++ /dev/null @@ -1,22 +0,0 @@ -/* -Copyright (c) 2012 Chris Pettitt - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. -*/(function(){function c(a){var b={};return a.forEach(function(a,c){b[a]=c}),b}function d(a,b){Object.keys(a).forEach(function(c){b[c]=a[c]})}function e(a){return Math.min.apply(null,a)}function f(a){return Math.max.apply(null,a)}function g(a){return Array.prototype.concat.apply([],a)}function i(a){return Object.keys(a).map(function(b){return a[b]})}function j(a){var b={};for(var c=0;c<a.length;++c){var d=a[c];for(var e=0;e<d.length;++e){var f=d[e];b[f]=f}}var g=[];for(var h in b)g.push(b[h]);return g}function p(a,b,c,d){return function(e){return arguments.length?(b[c]=e,d&&d(e),a):b[c]}}function q(){function c(b){var d=a,f=2*b,g=f+1,h=b;f<d.length&&(h=d[f].pri<d[h].pri?f:h,g<d.length&&(h=d[g].pri<d[h].pri?g:h),h!==b&&(e(b,h),c(h)))}function d(b){var c=a,d=c[b].pri,f;while(b>0){f=b>>1;if(c[f].pri<d)break;e(b,f),b=f}}function e(c,d){var e=a,f=b,g=e[c];e[c]=e[d],e[d]=g,f[e[c].key]=c,f[e[d].key]=d}function f(){return a.length}function g(){return Object.keys(b)}function h(a){return a in b}function i(c){var d=b[c];if(d!==undefined)return a[d].pri}function j(c,e){if(c in b)return!1;var f={key:c,pri:e},g=a.length;return b[c]=g,a.push(f),d(g),!0}function k(){if(f()>0)return a[0].key}function l(){e(0,a.length-1);var d=a.pop();return delete b[d.key],c(0),d.key}function m(c,e){var f=b[c];if(e>a[f].pri)throw new Error("New priority is greater than current priority. Key: "+c+" Old: "+a[f].pri+" New: "+e);a[f].pri=e,d(f)}var a=[],b={};return{size:f,keys:g,has:h,priority:i,add:j,min:k,removeMin:l,decrease:m}}dagre={},dagre.version="0.0.6",dagre.graph={},dagre.graph=function(){function k(a,b,c){var d=a[b];d||(d=a[b]={count:0,edges:{}}),d.count++,d.edges[c]=!0}function l(a,b,c){var d=a[b];--d.count==0?delete a[b]:delete d.edges[c]}function m(b){var c=a[b];if(b in a)return c;throw new Error("Node '"+b+"' is not in graph:\n"+e.toString())}function n(a){var b=d[a];if(!b)throw new Error("Edge '"+a+"' is not in graph:\n"+e.toString());return b}var a={},b={},c={},d={},e={},f=0;return e.addNode=function(d,f){if(e.hasNode(d))throw new Error("Graph already has node '"+d+"':\n"+e.toString());a[d]={id:d,value:f},b[d]={},c[d]={}},e.delNode=function(d){m(d),e.edges(d).forEach(function(a){e.delEdge(a)}),delete b[d],delete c[d],delete a[d]},e.node=function(a){return m(a).value},e.hasNode=function(b){return b in a},e.addEdge=function(a,g,h,i){m(g),m(h);if(a===null)a="_ANON-"+ ++f;else if(e.hasEdge(a))throw new Error("Graph already has edge '"+a+"':\n"+e.toString());d[a]={id:a,source:g,target:h,value:i},k(b[h],g,a),k(c[g],h,a)},e.delEdge=function(a){var e=n(a);l(b[e.target],e.source,a),l(c[e.source],e.target,a),delete d[a]},e.edge=function(a){return n(a).value},e.source=function(a){return n(a).source},e.target=function(a){return n(a).target},e.hasEdge=function(a){return a in d},e.successors=function(b){return m(b),h(c[b]).map(function(b){return a[b].id})},e.predecessors=function(c){return m(c),h(b[c]).map(function(b){return a[b].id})},e.neighbors=function(d){m(d);var e={};return h(c[d]).map(function(a){e[a]=!0}),h(b[d]).map(function(a){e[a]=!0}),h(e).map(function(b){return a[b].id})},e.nodes=function(){var a=[];return e.eachNode(function(b,c){a.push(b)}),a},e.eachNode=function(b){for(var c in a){var d=a[c];b(d.id,d.value)}},e.edges=function(a,b){var f,g;if(!arguments.length)return f=[],e.eachEdge(function(a){f.push(a)}),f;if(arguments.length===1)return j([e.inEdges(a),e.outEdges(a)]);if(arguments.length===2)return m(a),m(b),g=c[a],f=b in g?h(g[b].edges):[],f.map(function(a){return d[a].id})},e.eachEdge=function(a){for(var b in d){var c=d[b];a(c.id,c.source,c.target,c.value)}},e.inEdges=function(a){return m(a),g(i(b[a]).map(function(a){return h(a.edges)}))},e.outEdges=function(a){return m(a),g(i(c[a]).map(function(a){return h(a.edges)}))},e.subgraph=function(a){var b=dagre.graph();return a.forEach(function(a){b.addNode(a,e.node(a))}),i(d).forEach(function(a){b.hasNode(a.source)&&b.hasNode(a.target)&&b.addEdge(a.id,a.source,a.target,e.edge(a.id))}),b},e.toString=function(){var b="GRAPH:\n";return b+=" Nodes:\n",h(a).forEach(function(c){b+=" "+c+": "+JSON.stringify(a[c].value)+"\n"}),b+=" Edges:\n",h(d).forEach(function(a){var c=d[a];b+=" "+a+" ("+c.source+" -> "+c.target+"): "+JSON.stringify(d[a].value)+"\n"}),b},e},dagre.layout=function(){function h(){var b=dagre.graph(),c=0;return a.nodes.forEach(function(a){var d="id"in a?a.id:"_N"+c++;a.dagre={id:d,width:a.width,height:a.height},b.addNode(d,a.dagre)}),a.edges.forEach(function(a){var d=a.source.dagre.id;if(!b.hasNode(d))throw new Error("Source node for '"+a+"' not in node list");var e=a.target.dagre.id;if(!b.hasNode(e))throw new Error("Target node for '"+a+"' not in node list");a.dagre={points:[]};if(d!==e){var f="id"in a?a.id:"_E"+c++;a.dagre.id=f,a.dagre.minLen=a.minLen||1,a.dagre.width=a.width||0,a.dagre.height=a.height||0,b.addEdge(f,d,e,a.dagre)}}),b}function i(){var b=g.rankSep();try{if(!a.nodes.length)return;var i=h();i.eachEdge(function(a,b,c,d){d.minLen*=2}),g.rankSep(b/2),c.run(i),d.run(i),j(i),e.run(i),f.run(i),k(i),l(i),c.undo(i)}finally{g.rankSep(b)}return g}function j(a){var b=0;a.eachEdge(function(c,d,e,f){var g=a.node(d).rank,h=a.node(e).rank;if(g+1<h){for(var i=d,j=g+1,k=0;j<h;++j,++k){var l="_D"+ ++b,m={width:f.width,height:f.height,edge:{id:c,source:d,target:e,attrs:f},rank:j,dummy:!0};k===0?m.index=0:j+1===h&&(m.index=1),a.addNode(l,m),a.addEdge(null,i,l,{}),i=l}a.addEdge(null,i,e,{}),a.delEdge(c)}})}function k(a){var b={};a.eachNode(function(b,c){if(c.dummy&&"index"in c){var d=c.edge;a.hasEdge(d.id)||a.addEdge(d.id,d.source,d.target,d.attrs);var e=a.edge(d.id).points;e[c.index]={x:c.x,y:c.y,ul:c.ul,ur:c.ur,dl:c.dl,dr:c.dr},a.delNode(b)}})}function l(a){a.eachEdge(function(a,b,c,d){d.reversed&&d.points.reverse()})}function m(a){return function(){return arguments.length?(a.apply(null,arguments),g):a()}}var a={nodes:[],edges:[],debugLevel:0},b=o(),c=dagre.layout.acyclic(),d=dagre.layout.rank(),e=dagre.layout.order(),f=dagre.layout.position(),g={};return g.nodes=p(g,a,"nodes"),g.edges=p(g,a,"edges"),g.orderIters=m(e.iterations),g.nodeSep=m(f.nodeSep),g.edgeSep=m(f.edgeSep),g.universalSep=m(f.universalSep),g.rankSep=m(f.rankSep),g.rankDir=m(f.rankDir),g.debugAlignment=m(f.debugAlignment),g.debugLevel=p(g,a,"debugLevel",function(a){b.enabled(a),c.debugLevel(a),d.debugLevel(a),e.debugLevel(a),f.debugLevel(a)}),g.run=b.wrap("Total layout",i),g},dagre.layout.acyclic=function(){function d(b){function f(a){if(a in d)return;d[a]=c[a]=!0,b.outEdges(a).forEach(function(d){var g=b.target(d),h;g in c?(h=b.edge(d),b.delEdge(d),h.reversed=!0,++e,b.addEdge(d,g,a,h)):f(g)}),delete c[a]}var c={},d={},e=0;b.eachNode(function(a){f(a)}),a.debugLevel>=2&&console.log("Acyclic Phase: reversed "+e+" edge(s)")}var a={debugLevel:0},b=o(),c={};return c.debugLevel=p(c,a,"debugLevel",function(a){b.enabled(a)}),c.run=b.wrap("Acyclic Phase",d),c.undo=function(a){a.eachEdge(function(b,c,d,e){e.reversed&&(delete e.reversed,a.delEdge(b),a.addEdge(b,d,c,e))})},c},dagre.layout.rank=function(){function d(a){f(a),k(a).forEach(function(b){var c=a.subgraph(b);g(c),h(c)})}function f(a){var b={},c=q();a.eachNode(function(d){c.add(d,a.inEdges(d).length),b[d]=0});while(c.size()>0){var d=c.min();if(c.priority(d)>0)throw new Error("Input graph is not acyclic: "+a.toString());c.removeMin();var e=b[d];a.node(d).rank=e,a.outEdges(d).forEach(function(d){var f=a.target(d);b[f]=Math.max(b[f],e+(a.edge(d).minLen||1)),c.decrease(f,c.priority(f)-1)})}}function g(a){function e(f,g){d[f]=!0,a.node(f).rank=g,c[f].forEach(function(c){if(!(c in d)){var h=b[i(f,c)];e(c,g+(a.edges(f,c).length?h:-h))}})}var b={};a.eachEdge(function(a,c,d,e){var f=i(c,d);b[f]=Math.max(b[f]||1,e.minLen||1)});var c=dagre.util.prim(a,function(c,d){return Math.abs(a.node(c).rank-a.node(d).rank)-b[i(c,d)]}),d={};return e(a.nodes()[0],0),c}function h(a){var b=e(a.nodes().map(function(b){return a.node(b).rank}));a.eachNode(function(a,c){c.rank-=b})}function i(a,b){return a<b?a.length+":"+a+"-"+b:b.length+":"+b+"-"+a}var a={debugLevel:0},b=o(),c={};return c.debugLevel=p(c,a,"debugLevel",function(a){b.enabled(a)}),c.run=b.wrap("Rank Phase",d),c},dagre.layout.order=function(){function f(c){var d=g(c),e=m(d),f=a(c,d);b.debugLevel>=2&&console.log("Order phase start cross count: "+f);var h,i,k;for(i=0,k=0;k<4&&i<b.iterations;++i,++k)h=j(c,i,d),h<f&&(e=m(d),f=h,k=0),b.debugLevel>=3&&console.log("Order phase iter "+i+" cross count: "+f);return e.forEach(function(a){a.forEach(function(a,b){c.node(a).order=b})}),b.debugLevel>=2&&(console.log("Order iterations: "+i),console.log("Order phase best cross count: "+f)),e}function g(a){var b=[];return a.eachNode(function(a,c){var d=b[c.rank]||(b[c.rank]=[]);d.push(a)}),b}function h(a){return function(b){var c=[];return a.inEdges(b).forEach(function(b){c.push(a.source(b))}),c}}function i(a){return function(b){var c=[];return a.outEdges(b).forEach(function(b){c.push(a.target(b))}),c}}function j(b,c,d){if(c%2===0)for(var e=1;e<d.length;++e)k(d[e-1],d[e],h(b));else for(var e=d.length-2;e>=0;--e)k(d[e+1],d[e],i(b));return a(b,d)}function k(a,b,d){var e=c(b),f=l(a,b,d),g=b.slice(0).sort(function(a,b){return f[a]-f[b]||e[a]-e[b]});for(var h=b.length-1;h>=0;--h)f[b[h]]!==-1&&(b[h]=g.pop())}function l(a,b,d){var e=c(a),f={};return b.forEach(function(a){var b=-1,c=d(a);c.length>0&&(b=0,c.forEach(function(a){b+=e[a]}),b/=c.length),f[a]=b}),f}function m(a){return a.map(function(a){return a.slice(0)})}var b={iterations:24,debugLevel:0},d=o(),e={};return e.iterations=p(e,b,"iterations"),e.debugLevel=p(e,b,"debugLevel",function(a){d.enabled(a)}),e.run=d.wrap("Order Phase",f),e};var a=dagre.layout.order.crossCount=function(a,c){var d=0,e;return c.forEach(function(c){e&&(d+=b(a,e,c)),e=c}),d},b=dagre.layout.order.bilayerCrossCount=function(a,b,d){var e=c(d),f=[];b.forEach(function(b){var c=[];a.outEdges(b).forEach(function(b){c.push(e[a.target(b)])}),c.sort(function(a,b){return a-b}),f=f.concat(c)});var g=1;while(g<d.length)g<<=1;var h=2*g-1;g-=1;var i=[];for(var j=0;j<h;++j)i[j]=0;var k=0;return f.forEach(function(a){var b=a+g;++i[b];var c=0;while(b>0)b%2&&(k+=i[b+1]),b=b-1>>1,++i[b]}),k};dagre.layout.position=function(){function d(b){var c=[];b.eachNode(function(a,b){var d=c[b.rank]||(c[b.rank]=[]);d[b.order]=a});var d=h(b,c),g={};["u","d"].forEach(function(a){a==="d"&&c.reverse(),["l","r"].forEach(function(e){e==="r"&&r(c);var f=a+e,h=j(b,c,d,a==="u"?"predecessors":"successors");g[f]=k(b,c,h.pos,h.root,h.align),e==="r"&&q(g[f]),e==="r"&&r(c)}),a==="d"&&c.reverse()}),n(b,c,g),b.eachNode(function(a){var c=[];for(alignment in g)w(alignment,b,a,g[alignment][a]),c.push(g[alignment][a]);c.sort(function(a,b){return a-b}),v(b,a,(c[1]+c[2])/2)});var i=e(b.nodes().map(function(a){return v(b,a)-s(b,a)/2}));b.eachNode(function(a){v(b,a,v(b,a)-i)});var l=0;c.forEach(function(c){var d=f(c.map(function(a){return t(b,a)}));l+=d/2,c.forEach(function(a){x(b,a,l)}),l+=d/2+a.rankSep})}function g(a,b){return a<b?a.toString().length+":"+a+"-"+b:b.toString().length+":"+b+"-"+a}function h(a,b){var c={},d={};if(b.length<=2)return c;b[1].forEach(function(a,b){d[a]=b});for(var e=1;e<b.length-1;++e){prevLayer=b[e],currLayer=b[e+1];var f=0,h=0;for(var i=0;i<currLayer.length;++i){var j=currLayer[i];d[j]=i;var k=undefined;if(a.node(j).dummy){var l=a.predecessors(j)[0];a.node(l).dummy&&(k=d[l])}k===undefined&&i===currLayer.length-1&&(k=prevLayer.length-1);if(k!==undefined){for(;h<=i;++h)a.predecessors(currLayer[h]).forEach(function(a){var b=d[a];if(b<f||b>k)c[g(currLayer[h],a)]=!0});f=k}}}return c}function j(a,b,c,d){var e={},f={},h={};return b.forEach(function(a){a.forEach(function(a,b){f[a]=a,h[a]=a,e[a]=b})}),b.forEach(function(b){var i=-1;b.forEach(function(b){var j=a[d](b),k;j.length>0&&(j.sort(function(a,b){return e[a]-e[b]}),mid=(j.length-1)/2,j.slice(Math.floor(mid),Math.ceil(mid)+1).forEach(function(a){h[b]===b&&!c[g(a,b)]&&i<e[a]&&(h[a]=b,h[b]=f[b]=f[a],i=e[a])}))})}),{pos:e,root:f,align:h}}function k(a,b,c,d,e){function k(b){if(!(b in j)){j[b]=0;var i=b;do{if(c[i]>0){var l=d[h[i]];k(l),f[b]===b&&(f[b]=f[l]);var m=u(a,h[i])+u(a,i);f[b]!==f[l]?g[f[l]]=Math.min(g[f[l]]||Number.POSITIVE_INFINITY,j[b]-j[l]-m):j[b]=Math.max(j[b],j[l]+m)}i=e[i]}while(i!==b)}}var f={},g={},h={},j={};return b.forEach(function(a){a.forEach(function(b,c){f[b]=b,c>0&&(h[b]=a[c-1])})}),i(d).forEach(function(a){k(a)}),b.forEach(function(a){a.forEach(function(a){j[a]=j[d[a]];var b=g[f[a]];d[a]===a&&b<Number.POSITIVE_INFINITY&&(j[a]+=b)})}),j}function l(a,b,c){return e(b.map(function(a){var b=a[0];return c[b]}))}function m(a,b,c){return f(b.map(function(a){var b=a[a.length-1];return c[b]}))}function n(a,b,c){var d={},e={},f,g={},h=Number.POSITIVE_INFINITY;for(var i in c){var j=c[i];d[i]=l(a,b,j),e[i]=m(a,b,j);var k=e[i]-d[i];k<h&&(h=k,f=i)}["u","d"].forEach(function(a){["l","r"].forEach(function(b){var c=a+b;g[c]=b==="l"?d[f]-d[c]:e[f]-e[c]})});for(var i in c)a.eachNode(function(a){c[i][a]+=g[i]})}function q(a){for(var b in a)a[b]=-a[b]}function r(a){a.forEach(function(a){a.reverse()})}function s(b,c){switch(a.rankDir){case"LR":return b.node(c).height;default:return b.node(c).width}}function t(b,c){switch(a.rankDir){case"LR":return b.node(c).width;default:return b.node(c).height}}function u(b,c){if(a.universalSep!==null)return a.universalSep;var d=s(b,c),e=b.node(c).dummy?a.edgeSep:a.nodeSep;return(d+e)/2}function v(b,c,d){switch(a.rankDir){case"LR":if(arguments.length<3)return b.node(c).y;b.node(c).y=d;break;default:if(arguments.length<3)return b.node(c).x;b.node(c).x=d}}function w(b,c,d,e){switch(a.rankDir){case"LR":if(arguments.length<3)return c.node(d)[b];c.node(d)[b]=e;break;default:if(arguments.length<3)return c.node(d)[b];c.node(d)[b]=e}}function x(b,c,d){switch(a.rankDir){case"LR":if(arguments.length<3)return b.node(c).x;b.node(c).x=d;break;default:if(arguments.length<3)return b.node(c).y;b.node(c).y=d}}var a={nodeSep:50,edgeSep:10,universalSep:null,rankSep:30,rankDir:"TB",debugLevel:0},b=o(),c={};return c.nodeSep=p(c,a,"nodeSep"),c.edgeSep=p(c,a,"edgeSep"),c.universalSep=p(c,a,"universalSep"),c.rankSep=p(c,a,"rankSep"),c.rankDir=p(c,a,"rankDir"),c.debugLevel=p(c,a,"debugLevel",function(a){b.enabled(a)}),c.run=b.wrap("Position Phase",d),c},dagre.util={};var h=dagre.util.keys=Object.keys,k=dagre.util.components=function(a){function d(b,e){b in c||(c[b]=!0,e.push(b),a.neighbors(b).forEach(function(a){d(a,e)}))}var b=[],c={};return a.eachNode(function(a){var c=[];d(a,c),c.length>0&&b.push(c)}),b},l=dagre.util.prim=function(a,b){var c={},d={},e=q();if(a.nodes().length===0)return c;a.eachNode(function(a){e.add(a,Number.POSITIVE_INFINITY),c[a]=[]}),e.decrease(a.nodes()[0],0);var f,g=!1;while(e.size()>0){f=e.removeMin();if(f in d)c[f].push(d[f]),c[d[f]].push(f);else{if(g)throw new Error("Input graph is not connected:\n"+a.toString());g=!0}a.neighbors(f).forEach(function(a){var c=e.priority(a);if(c!==undefined){var g=b(f,a);g<c&&(d[a]=f,e.decrease(a,g))}})}return c},m=dagre.util.intersectRect=function(a,b){var c=a.x,d=a.y,e=b.x-c,f=b.y-d,g=a.width/2,h=a.height/2,i,j;return Math.abs(f)*g>Math.abs(e)*h?(f<0&&(h=-h),i=f===0?0:h*e/f,j=h):(e<0&&(g=-g),i=g,j=e===0?0:g*f/e),{x:c+i,y:d+j}},n=dagre.util.pointStr=function(a){return a.x+","+a.y},o=function(){var a={},b=!1;return a.enabled=function(c){return arguments.length?(b=c,a):b},a.wrap=function(a,c){return function(){var d=b?(new Date).getTime():null;try{return c.apply(null,arguments)}finally{d&&console.log(a+" time: "+((new Date).getTime()-d)+"ms")}}},a};dagre.dot={},dagre.dot.toGraph=function(a){function f(a,b){c.hasNode(a)||c.addNode(a,{id:a,label:a}),b&&d(b,c.node(a))}function h(a,b,e){var f=a+"-"+b,h=g[f];h||(h=g[f]=0),g[f]++;var i=e.id||f+"-"+h,j={};d(e,j),d({id:i},j),c.addEdge(i,a,b,j)}function i(a){switch(a.type){case"node":f(a.id,a.attrs);break;case"edge":var b;a.elems.forEach(function(c){i(c);switch(c.type){case"node":var d=c.id;b&&(h(b,d,a.attrs),e&&h(d,b,a.attrs)),b=d;break;default:throw new Error("Unsupported type incident on edge: "+c.type)}});break;case"attr":break;default:throw new Error("Unsupported statement type: "+a.type)}}var b=dot_parser.parse(a),c=dagre.graph(),e=b.type==="graph",g={};return b.stmts&&b.stmts.forEach(function(a){i(a)}),c},dagre.dot.toObjects=function(a){var b=dagre.dot.toGraph(a),c=b.nodes().map(function(a){return b.node(a)}),d=b.edges().map(function(a){var c=b.edge(a);return c.source=b.node(b.source(a)),c.target=b.node(b.target(a)),c});return{nodes:c,edges:d}},dot_parser=function(){function a(a){return'"'+a.replace(/\\/g,"\\\\").replace(/"/g,'\\"').replace(/\x08/g,"\\b").replace(/\t/g,"\\t").replace(/\n/g,"\\n").replace(/\f/g,"\\f").replace(/\r/g,"\\r").replace(/[\x00-\x07\x0B\x0E-\x1F\x80-\uFFFF]/g,escape)+'"'}var b={parse:function(b,c){function i(a,b,c){var d=a,e=c-a.length;for(var f=0;f<e;f++)d=b+d;return d}function j(a){var b=a.charCodeAt(0),c,d;return b<=255?(c="x",d=2):(c="u",d=4),"\\"+c+i(b.toString(16).toUpperCase(),"0",d)}function k(a){if(e<g)return;e>g&&(g=e,h=[]),h.push(a)}function l(){var a,c,d,g,h,i,j,l,n,o,p,q,r,s,t,u;s=e,t=e,a=[],c=M();while(c!==null)a.push(c),c=M();if(a!==null){u=e,c=I(),c!==null?(d=M(),d!==null?c=[c,d]:(c=null,e=u)):(c=null,e=u),c=c!==null?c:"";if(c!==null){d=J();if(d!==null){g=[],h=M();while(h!==null)g.push(h),h=M();if(g!==null){h=C(),h=h!==null?h:"";if(h!==null){i=[],j=M();while(j!==null)i.push(j),j=M();if(i!==null){b.charCodeAt(e)===123?(j="{",e++):(j=null,f===0&&k('"{"'));if(j!==null){l=[],n=M();while(n!==null)l.push(n),n=M();if(l!==null){n=m(),n=n!==null?n:"";if(n!==null){o=[],p=M();while(p!==null)o.push(p),p=M();if(o!==null){b.charCodeAt(e)===125?(p="}",e++):(p=null,f===0&&k('"}"'));if(p!==null){q=[],r=M();while(r!==null)q.push(r),r=M();q!==null?a=[a,c,d,g,h,i,j,l,n,o,p,q]:(a=null,e=t)}else a=null,e=t}else a=null,e=t}else a=null,e=t}else a=null,e=t}else a=null,e=t}else a=null,e=t}else a=null,e=t}else a=null,e=t}else a=null,e=t}else a=null,e=t}else a=null,e=t;return a!==null&&(a=function(a,b,c,d){return{type:b,id:c,stmts:d}}(s,a[2],a[4],a[8])),a===null&&(e=s),a}function m(){var a,c,d,g,h,i,j,l,m,o,p;m=e,o=e,a=n();if(a!==null){c=[],d=M();while(d!==null)c.push(d),d=M();if(c!==null){b.charCodeAt(e)===59?(d=";",e++):(d=null,f===0&&k('";"')),d=d!==null?d:"";if(d!==null){g=[],p=e,h=[],i=M();while(i!==null)h.push(i),i=M();if(h!==null){i=n();if(i!==null){j=[],l=M();while(l!==null)j.push(l),l=M();j!==null?(b.charCodeAt(e)===59?(l=";",e++):(l=null,f===0&&k('";"')),l=l!==null?l:"",l!==null?h=[h,i,j,l]:(h=null,e=p)):(h=null,e=p)}else h=null,e=p}else h=null,e=p;while(h!==null){g.push(h),p=e,h=[],i=M();while(i!==null)h.push(i),i=M();if(h!==null){i=n();if(i!==null){j=[],l=M();while(l!==null)j.push(l),l=M();j!==null?(b.charCodeAt(e)===59?(l=";",e++):(l=null,f===0&&k('";"')),l=l!==null?l:"",l!==null?h=[h,i,j,l]:(h=null,e=p)):(h=null,e=p)}else h=null,e=p}else h=null,e=p}g!==null?a=[a,c,d,g]:(a=null,e=o)}else a=null,e=o}else a=null,e=o}else a=null,e=o;return a!==null&&(a=function(a,b,c){var d=[b];for(var e=0;e<c.length;++e)d.push(c[e][1]);return d}(m,a[0],a[3])),a===null&&(e=m),a}function n(){var a;return a=o(),a===null&&(a=s(),a===null&&(a=p(),a===null&&(a=r(),a===null&&(a=q())))),a}function o(){var a,b,c,d,f;d=e,f=e,a=F(),a===null&&(a=D(),a===null&&(a=E()));if(a!==null){b=[],c=M();while(c!==null)b.push(c),c=M();b!==null?(c=t(),c!==null?a=[a,b,c]:(a=null,e=f)):(a=null,e=f)}else a=null,e=f;return a!==null&&(a=function(a,b,c){return{type:"attr",attrType:b,attrs:c||{}}}(d,a[0],a[2])),a===null&&(e=d),a}function p(){var a,c,d,g,h,i,j;i=e,j=e,a=C();if(a!==null){c=[],d=M();while(d!==null)c.push(d),d=M();if(c!==null){b.charCodeAt(e)===61?(d="=",e++):(d=null,f===0&&k('"="'));if(d!==null){g=[],h=M();while(h!==null)g.push(h),h=M();g!==null?(h=C(),h!==null?a=[a,c,d,g,h]:(a=null,e=j)):(a=null,e=j)}else a=null,e=j}else a=null,e=j}else a=null,e=j;return a!==null&&(a=function(a,b,c){var d={};return d[b]=c,{type:"inlineAttr",attrs:d}}(i,a[0],a[4])),a===null&&(e=i),a}function q(){var a,b,c,d,f;d=e,f=e,a=z();if(a!==null){b=[],c=M();while(c!==null)b.push(c),c=M();b!==null?(c=t(),c=c!==null?c:"",c!==null?a=[a,b,c]:(a=null,e=f)):(a=null,e=f)}else a=null,e=f;return a!==null&&(a=function(a,b,c){return{type:"node",id:b,attrs:c||{}}}(d,a[0],a[2])),a===null&&(e=d),a}function r(){var a,b,c,d,f,g,h;g=e,h=e,a=y();if(a!==null){b=[],c=M();while(c!==null)b.push(c),c=M();if(b!==null){c=w();if(c!==null){d=[],f=M();while(f!==null)d.push(f),f=M();d!==null?(f=t(),f=f!==null?f:"",f!==null?a=[a,b,c,d,f]:(a=null,e=h)):(a=null,e=h)}else a=null,e=h}else a=null,e=h}else a=null,e=h;return a!==null&&(a=function(a,b,c,d){var e=[b];for(var f=0;f<c.length;++f)e.push(c[f]);return{type:"edge",elems:e,attrs:d||{}}}(g,a[0],a[2],a[4])),a===null&&(e=g),a}function s(){var a,c,d,g,h,i,j,l,n,o;j=e,l=e,n=e,a=H();if(a!==null){c=[],d=M();while(d!==null)c.push(d),d=M();if(c!==null){o=e,d=C();if(d!==null){g=[],h=M();while(h!==null)g.push(h),h=M();g!==null?d=[d,g]:(d=null,e=o)}else d=null,e=o;d=d!==null?d:"",d!==null?a=[a,c,d]:(a=null,e=n)}else a=null,e=n}else a=null,e=n;a=a!==null?a:"";if(a!==null){b.charCodeAt(e)===123?(c="{",e++):(c=null,f===0&&k('"{"'));if(c!==null){d=[],g=M();while(g!==null)d.push(g),g=M();if(d!==null){g=m();if(g!==null){h=[],i=M();while(i!==null)h.push(i),i=M();h!==null?(b.charCodeAt(e)===125?(i="}",e++):(i=null,f===0&&k('"}"')),i!==null?a=[a,c,d,g,h,i]:(a=null,e=l)):(a=null,e=l)}else a=null,e=l}else a=null,e=l}else a=null,e=l}else a=null,e=l;return a!==null&&(a=function(a,b,c){return b=b[2]||[],{type:"subgraph",id:b[0],stmts:c}}(j,a[0],a[3])),a===null&&(e=j),a}function t(){var a,b,c,d,f,g,h;f=e,g=e,a=u();if(a!==null){b=[],h=e,c=[],d=M();while(d!==null)c.push(d),d=M();c!==null?(d=u(),d!==null?c=[c,d]:(c=null,e=h)):(c=null,e=h);while(c!==null){b.push(c),h=e,c=[],d=M();while(d!==null)c.push(d),d=M();c!==null?(d=u(),d!==null?c=[c,d]:(c=null,e=h)):(c=null,e=h)}b!==null?a=[a,b]:(a=null,e=g)}else a=null,e=g;return a!==null&&(a=function(a,b,c){var d=b;for(var e=0;e<c.length;++e)d=Q(d,c[e][1]);return d}(f,a[0],a[1])),a===null&&(e=f),a}function u(){var a,c,d,g,h,i,j;i=e,j=e,b.charCodeAt(e)===91?(a="[",e++):(a=null,f===0&&k('"["'));if(a!==null){c=[],d=M();while(d!==null)c.push(d),d=M();if(c!==null){d=v(),d=d!==null?d:"";if(d!==null){g=[],h=M();while(h!==null)g.push(h),h=M();g!==null?(b.charCodeAt(e)===93?(h="]",e++):(h=null,f===0&&k('"]"')),h!==null?a=[a,c,d,g,h]:(a=null,e=j)):(a=null,e=j)}else a=null,e=j}else a=null,e=j}else a=null,e=j;return a!==null&&(a=function(a,b){return b}(i,a[2])),a===null&&(e=i),a}function v(){var a,c,d,g,h,i,j,l,m;j=e,l=e,a=x();if(a!==null){c=[],m=e,d=[],g=M();while(g!==null)d.push(g),g=M();if(d!==null){b.charCodeAt(e)===44?(g=",",e++):(g=null,f===0&&k('","')),g=g!==null?g:"";if(g!==null){h=[],i=M();while(i!==null)h.push(i),i=M();h!==null?(i=x(),i!==null?d=[d,g,h,i]:(d=null,e=m)):(d=null,e=m)}else d=null,e=m}else d=null,e=m;while(d!==null){c.push(d),m=e,d=[],g=M();while(g!==null)d.push(g),g=M();if(d!==null){b.charCodeAt(e)===44?(g=",",e++):(g=null,f===0&&k('","')),g=g!==null?g:"";if(g!==null){h=[],i=M();while(i!==null)h.push(i),i=M();h!==null?(i=x(),i!==null?d=[d,g,h,i]:(d=null,e=m)):(d=null,e=m)}else d=null,e=m}else d=null,e=m}c!==null?a=[a,c]:(a=null,e=l)}else a=null,e=l;return a!==null&&(a=function(a,b,c){var d=b;for(var e=0;e<c.length;++e)d=Q(d,c[e][3]);return d}(j,a[0],a[1])),a===null&&(e=j),a}function w(){var a,c,d,g,h,i,j,l;i=e,j=e,l=e,b.substr(e,2)==="--"?(a="--",e+=2):(a=null,f===0&&k('"--"')),a!==null?(c=function(a){return P}(e)?null:"",c!==null?a=[a,c]:(a=null,e=l)):(a=null,e=l),a===null&&(l=e,b.substr(e,2)==="->"?(a="->",e+=2):(a=null,f===0&&k('"->"')),a!==null?(c=function(a){return P}(e)?"":null,c!==null?a=[a,c]:(a=null,e=l)):(a=null,e=l));if(a!==null){c=[],d=M();while(d!==null)c.push(d),d=M();if(c!==null){d=y();if(d!==null){g=[],h=M();while(h!==null)g.push(h),h=M();g!==null?(h=w(),h=h!==null?h:"",h!==null?a=[a,c,d,g,h]:(a=null,e=j)):(a=null,e=j)}else a=null,e=j}else a=null,e=j}else a=null,e=j;return a!==null&&(a=function(a,b,c){var d=[b];for(var e=0;e<c.length;++e)d.push(c[e]);return d}(i,a[2],a[4])),a===null&&(e=i),a}function x(){var a,c,d,g,h,i,j,l;i=e,j=e,a=C();if(a!==null){l=e,c=[],d=M();while(d!==null)c.push(d),d=M();if(c!==null){b.charCodeAt(e)===61?(d="=",e++):(d=null,f===0&&k('"="'));if(d!==null){g=[],h=M();while(h!==null)g.push(h),h=M();g!==null?(h=C(),h!==null?c=[c,d,g,h]:(c=null,e=l)):(c=null,e=l)}else c=null,e=l}else c=null,e=l;c=c!==null?c:"",c!==null?a=[a,c]:(a=null,e=j)}else a=null,e=j;return a!==null&&(a=function(a,b,c){var d={};return d[b]=c[3],d}(i,a[0],a[1])),a===null&&(e=i),a}function y(){var a,b;return a=s(),a===null&&(b=e,a=z(),a!==null&&(a=function(a,b){return{type:"node",id:b,attrs:{}}}(b,a)),a===null&&(e=b)),a}function z(){var a,b,c,d,f;d=e,f=e,a=C();if(a!==null){b=[],c=M();while(c!==null)b.push(c),c=M();b!==null?(c=A(),c=c!==null?c:"",c!==null?a=[a,b,c]:(a=null,e=f)):(a=null,e=f)}else a=null,e=f;return a!==null&&(a=function(a,b){return b}(d,a[0])),a===null&&(e=d),a}function A(){var a,c,d,g,h,i,j,l,m;l=e,b.charCodeAt(e)===58?(a=":",e++):(a=null,f===0&&k('":"'));if(a!==null){c=[],d=M();while(d!==null)c.push(d),d=M();if(c!==null){d=C();if(d!==null){g=[],h=M();while(h!==null)g.push(h),h=M();if(g!==null){m=e,b.charCodeAt(e)===58?(h=":",e++):(h=null,f===0&&k('":"'));if(h!==null){i=[],j=M();while(j!==null)i.push(j),j=M();i!==null?(j=B(),j!==null?h=[h,i,j]:(h=null,e=m)):(h=null,e=m)}else h=null,e=m;h=h!==null?h:"",h!==null?a=[a,c,d,g,h]:(a=null,e=l)}else a=null,e=l}else a=null,e=l}else a=null,e=l}else a=null,e=l;return a}function B(){var a;return b.charCodeAt(e)===110?(a="n",e++):(a=null,f===0&&k('"n"')),a===null&&(b.substr(e,2)==="ne"?(a="ne",e+=2):(a=null,f===0&&k('"ne"')),a===null&&(b.charCodeAt(e)===101?(a="e",e++):(a=null,f===0&&k('"e"')),a===null&&(b.substr(e,2)==="se"?(a="se",e+=2):(a=null,f===0&&k('"se"')),a===null&&(b.charCodeAt(e)===115?(a="s",e++):(a=null,f===0&&k('"s"')),a===null&&(b.substr(e,2)==="sw"?(a="sw",e+=2):(a=null,f===0&&k('"sw"')),a===null&&(b.charCodeAt(e)===119?(a="w",e++):(a=null,f===0&&k('"w"')),a===null&&(b.substr(e,2)==="nw"?(a="nw",e+=2):(a=null,f===0&&k('"nw"')),a===null&&(b.charCodeAt(e)===99?(a="c",e++):(a=null,f===0&&k('"c"')),a===null&&(b.charCodeAt(e)===95?(a="_",e++):(a=null,f===0&&k('"_"'))))))))))),a}function C(){var a,c,d,g,h,i,j,l,m;f++,i=e,j=e,/^[a-zA-Z\u0200-\u0377_]/.test(b.charAt(e))?(a=b.charAt(e),e++):(a=null,f===0&&k("[a-zA-Z\\u0200-\\u0377_]"));if(a!==null){c=[],/^[a-zA-Z\u0200-\u0377_0-9]/.test(b.charAt(e))?(d=b.charAt(e),e++):(d=null,f===0&&k("[a-zA-Z\\u0200-\\u0377_0-9]"));while(d!==null)c.push(d),/^[a-zA-Z\u0200-\u0377_0-9]/.test(b.charAt(e))?(d=b.charAt(e),e++):(d=null,f===0&&k("[a-zA-Z\\u0200-\\u0377_0-9]"));c!==null?a=[a,c]:(a=null,e=j)}else a=null,e=j;a!==null&&(a=function(a,b,c){return b+c.join("")}(i,a[0],a[1])),a===null&&(e=i);if(a===null){i=e,j=e,b.charCodeAt(e)===45?(a="-",e++):(a=null,f===0&&k('"-"')),a=a!==null?a:"";if(a!==null){b.charCodeAt(e)===46?(c=".",e++):(c=null,f===0&&k('"."'));if(c!==null){/^[0-9]/.test(b.charAt(e))?(g=b.charAt(e),e++):(g=null,f===0&&k("[0-9]"));if(g!==null){d=[];while(g!==null)d.push(g),/^[0-9]/.test(b.charAt(e))?(g=b.charAt(e),e++):(g=null,f===0&&k("[0-9]"))}else d=null;d!==null?a=[a,c,d]:(a=null,e=j)}else a=null,e=j}else a=null,e=j;a!==null&&(a=function(a,b,c,d){return b+c+d.join("")}(i,a[0],a[1],a[2])),a===null&&(e=i);if(a===null){i=e,j=e,b.charCodeAt(e)===45?(a="-",e++):(a=null,f===0&&k('"-"')),a=a!==null?a:"";if(a!==null){/^[0-9]/.test(b.charAt(e))?(d=b.charAt(e),e++):(d=null,f===0&&k("[0-9]"));if(d!==null){c=[];while(d!==null)c.push(d),/^[0-9]/.test(b.charAt(e))?(d=b.charAt(e),e++):(d=null,f===0&&k("[0-9]"))}else c=null;if(c!==null){l=e,b.charCodeAt(e)===46?(d=".",e++):(d=null,f===0&&k('"."'));if(d!==null){g=[],/^[0-9]/.test(b.charAt(e))?(h=b.charAt(e),e++):(h=null,f===0&&k("[0-9]"));while(h!==null)g.push(h),/^[0-9]/.test(b.charAt(e))?(h=b.charAt(e),e++):(h=null,f===0&&k("[0-9]"));g!==null?d=[d,g]:(d=null,e=l)}else d=null,e=l;d=d!==null?d:"",d!==null?a=[a,c,d]:(a=null,e=j)}else a=null,e=j}else a=null,e=j;a!==null&&(a=function(a,b,c,d){return b+c.join("")+(d[0]||"")+(d[1]||[]).join("")}(i,a[0],a[1],a[2])),a===null&&(e=i);if(a===null){i=e,j=e,b.charCodeAt(e)===34?(a='"',e++):(a=null,f===0&&k('"\\""'));if(a!==null){c=[],l=e,b.substr(e,2)==='\\"'?(d='\\"',e+=2):(d=null,f===0&&k('"\\\\\\""')),d!==null&&(d=function(a){return'"'}(l)),d===null&&(e=l),d===null&&(l=e,m=e,b.charCodeAt(e)===92?(d="\\",e++):(d=null,f===0&&k('"\\\\"')),d!==null?(/^[^"]/.test(b.charAt(e))?(g=b.charAt(e),e++):(g=null,f===0&&k('[^"]')),g!==null?d=[d,g]:(d=null,e=m)):(d=null,e=m),d!==null&&(d=function(a,b){return"\\"+b}(l,d[1])),d===null&&(e=l),d===null&&(/^[^"]/.test(b.charAt(e))?(d=b.charAt(e),e++):(d=null,f===0&&k('[^"]'))));while(d!==null)c.push(d),l=e,b.substr(e,2)==='\\"'?(d='\\"',e+=2):(d=null,f===0&&k('"\\\\\\""')),d!==null&&(d=function(a){return'"'}(l)),d===null&&(e=l),d===null&&(l=e,m=e,b.charCodeAt(e)===92?(d="\\",e++):(d=null,f===0&&k('"\\\\"')),d!==null?(/^[^"]/.test(b.charAt(e))?(g=b.charAt(e),e++):(g=null,f===0&&k('[^"]')),g!==null?d=[d,g]:(d=null,e=m)):(d=null,e=m),d!==null&&(d=function(a,b){return"\\"+b}(l,d[1])),d===null&&(e=l),d===null&&(/^[^"]/.test(b.charAt(e))?(d=b.charAt(e),e++):(d=null,f===0&&k('[^"]'))));c!==null?(b.charCodeAt(e)===34?(d='"',e++):(d=null,f===0&&k('"\\""')),d!==null?a=[a,c,d]:(a=null,e=j)):(a=null,e=j)}else a=null,e=j;a!==null&&(a=function(a,b){return b.join("")}(i,a[1])),a===null&&(e=i)}}}return f--,f===0&&a===null&&k("identifier"),a}function D(){var a,c;return c=e,b.substr(e,4).toLowerCase()==="node"?(a=b.substr(e,4),e+=4):(a=null,f===0&&k('"node"')),a!==null&&(a=function(a,b){return b.toLowerCase()}(c,a)),a===null&&(e=c),a}function E(){var a,c;return c=e,b.substr(e,4).toLowerCase()==="edge"?(a=b.substr(e,4),e+=4):(a=null,f===0&&k('"edge"')),a!==null&&(a=function(a,b){return b.toLowerCase()}(c,a)),a===null&&(e=c),a}function F(){var a,c;return c=e,b.substr(e,5).toLowerCase()==="graph"?(a=b.substr(e,5),e+=5):(a=null,f===0&&k('"graph"')),a!==null&&(a=function(a,b){return b.toLowerCase()}(c,a)),a===null&&(e=c),a}function G(){var a,c;return c=e,b.substr(e,7).toLowerCase()==="digraph"?(a=b.substr(e,7),e+=7):(a=null,f===0&&k('"digraph"')),a!==null&&(a=function(a,b){return b.toLowerCase()}(c,a)),a===null&&(e=c),a}function H(){var a,c;return c=e,b.substr(e,8).toLowerCase()==="subgraph"?(a=b.substr(e,8),e+=8):(a=null,f===0&&k('"subgraph"')),a!==null&&(a=function(a,b){return b.toLowerCase()}(c,a)),a===null&&(e=c),a}function I(){var a,c;return c=e,b.substr(e,6).toLowerCase()==="strict"?(a=b.substr(e,6),e+=6):(a=null,f===0&&k('"strict"')),a!==null&&(a=function(a,b){return b.toLowerCase()}(c,a)),a===null&&(e=c),a}function J(){var a,b;return a=F(),a===null&&(b=e,a=G(),a!==null&&(a=function(a,b){return P=b==="digraph",b}(b,a)),a===null&&(e=b)),a}function K(){var a,c;f++,/^[ \t\r\n]/.test(b.charAt(e))?(c=b.charAt(e),e++):(c=null,f===0&&k("[ \\t\\r\\n]"));if(c!==null){a=[];while(c!==null)a.push(c),/^[ \t\r\n]/.test(b.charAt(e))?(c=b.charAt(e),e++):(c=null,f===0&&k("[ \\t\\r\\n]"))}else a=null;return f--,f===0&&a===null&&k("whitespace"),a}function L(){var a,c,d,g,h,i,j;f++,h=e,b.substr(e,2)==="//"?(a="//",e+=2):(a=null,f===0&&k('"//"'));if(a!==null){c=[],/^[^\n]/.test(b.charAt(e))?(d=b.charAt(e),e++):(d=null,f===0&&k("[^\\n]"));while(d!==null)c.push(d),/^[^\n]/.test(b.charAt(e))?(d=b.charAt(e),e++):(d=null,f===0&&k("[^\\n]"));c!==null?a=[a,c]:(a=null,e=h)}else a=null,e=h;if(a===null){h=e,b.substr(e,2)==="/*"?(a="/*",e+=2):(a=null,f===0&&k('"/*"'));if(a!==null){c=[],i=e,j=e,f++,b.substr(e,2)==="*/"?(d="*/",e+=2):(d=null,f===0&&k('"*/"')),f--,d===null?d="":(d=null -,e=j),d!==null?(b.length>e?(g=b.charAt(e),e++):(g=null,f===0&&k("any character")),g!==null?d=[d,g]:(d=null,e=i)):(d=null,e=i);while(d!==null)c.push(d),i=e,j=e,f++,b.substr(e,2)==="*/"?(d="*/",e+=2):(d=null,f===0&&k('"*/"')),f--,d===null?d="":(d=null,e=j),d!==null?(b.length>e?(g=b.charAt(e),e++):(g=null,f===0&&k("any character")),g!==null?d=[d,g]:(d=null,e=i)):(d=null,e=i);c!==null?(b.substr(e,2)==="*/"?(d="*/",e+=2):(d=null,f===0&&k('"*/"')),d!==null?a=[a,c,d]:(a=null,e=h)):(a=null,e=h)}else a=null,e=h}return f--,f===0&&a===null&&k("comment"),a}function M(){var a;return a=K(),a===null&&(a=L()),a}function N(a){a.sort();var b=null,c=[];for(var d=0;d<a.length;d++)a[d]!==b&&(c.push(a[d]),b=a[d]);return c}function O(){var a=1,c=1,d=!1;for(var f=0;f<Math.max(e,g);f++){var h=b.charAt(f);h==="\n"?(d||a++,c=1,d=!1):h==="\r"||h==="\u2028"||h==="\u2029"?(a++,c=1,d=!0):(c++,d=!1)}return{line:a,column:c}}function Q(a,b){var c={};for(var d in a)c[d]=a[d];for(var d in b)c[d]=b[d];return c}var d={start:l,stmtList:m,stmt:n,attrStmt:o,inlineAttrStmt:p,nodeStmt:q,edgeStmt:r,subgraphStmt:s,attrList:t,attrListBlock:u,aList:v,edgeRHS:w,idDef:x,nodeIdOrSubgraph:y,nodeId:z,port:A,compassPt:B,id:C,node:D,edge:E,graph:F,digraph:G,subgraph:H,strict:I,graphType:J,whitespace:K,comment:L,_:M};if(c!==undefined){if(d[c]===undefined)throw new Error("Invalid rule name: "+a(c)+".")}else c="start";var e=0,f=0,g=0,h=[],P,R=d[c]();if(R===null||e!==b.length){var S=Math.max(e,g),T=S<b.length?b.charAt(S):null,U=O();throw new this.SyntaxError(N(h),T,S,U.line,U.column)}return R},toSource:function(){return this._source}};return b.SyntaxError=function(b,c,d,e,f){function g(b,c){var d,e;switch(b.length){case 0:d="end of input";break;case 1:d=b[0];break;default:d=b.slice(0,b.length-1).join(", ")+" or "+b[b.length-1]}return e=c?a(c):"end of input","Expected "+d+" but "+e+" found."}this.name="SyntaxError",this.expected=b,this.found=c,this.message=g(b,c),this.offset=d,this.line=e,this.column=f},b.SyntaxError.prototype=Error.prototype,b}()})(); \ No newline at end of file diff --git a/deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/js/google-code-prettify/prettify.css b/deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/js/google-code-prettify/prettify.css deleted file mode 100644 index aedd8d1a915767e9fd96ae4b4ec9a088f30c3ca1..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/js/google-code-prettify/prettify.css +++ /dev/null @@ -1,30 +0,0 @@ -.com { color: #93a1a1; } -.lit { color: #195f91; } -.pun, .opn, .clo { color: #93a1a1; } -.fun { color: #dc322f; } -.str, .atv { color: #D14; } -.kwd, .linenums .tag { color: #1e347b; } -.typ, .atn, .dec, .var { color: teal; } -.pln { color: #48484c; } - -.prettyprint { - padding: 8px; - background-color: #f7f7f9; - border: 1px solid #e1e1e8; -} -.prettyprint.linenums { - -webkit-box-shadow: inset 40px 0 0 #fbfbfc, inset 41px 0 0 #ececf0; - -moz-box-shadow: inset 40px 0 0 #fbfbfc, inset 41px 0 0 #ececf0; - box-shadow: inset 40px 0 0 #fbfbfc, inset 41px 0 0 #ececf0; -} - -/* Specify class=linenums on a pre to get line numbering */ -ol.linenums { - margin: 0 0 0 33px; /* IE indents via margin-left */ -} -ol.linenums li { - padding-left: 12px; - color: #bebec5; - line-height: 18px; - text-shadow: 0 1px 0 #fff; -} \ No newline at end of file diff --git a/deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/js/google-code-prettify/prettify.js b/deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/js/google-code-prettify/prettify.js deleted file mode 100644 index eef5ad7e6a07676b3919146d583d1c190bf1e163..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/js/google-code-prettify/prettify.js +++ /dev/null @@ -1,28 +0,0 @@ -var q=null;window.PR_SHOULD_USE_CONTINUATION=!0; -(function(){function L(a){function m(a){var f=a.charCodeAt(0);if(f!==92)return f;var b=a.charAt(1);return(f=r[b])?f:"0"<=b&&b<="7"?parseInt(a.substring(1),8):b==="u"||b==="x"?parseInt(a.substring(2),16):a.charCodeAt(1)}function e(a){if(a<32)return(a<16?"\\x0":"\\x")+a.toString(16);a=String.fromCharCode(a);if(a==="\\"||a==="-"||a==="["||a==="]")a="\\"+a;return a}function h(a){for(var f=a.substring(1,a.length-1).match(/\\u[\dA-Fa-f]{4}|\\x[\dA-Fa-f]{2}|\\[0-3][0-7]{0,2}|\\[0-7]{1,2}|\\[\S\s]|[^\\]/g),a= -[],b=[],o=f[0]==="^",c=o?1:0,i=f.length;c<i;++c){var j=f[c];if(/\\[bdsw]/i.test(j))a.push(j);else{var j=m(j),d;c+2<i&&"-"===f[c+1]?(d=m(f[c+2]),c+=2):d=j;b.push([j,d]);d<65||j>122||(d<65||j>90||b.push([Math.max(65,j)|32,Math.min(d,90)|32]),d<97||j>122||b.push([Math.max(97,j)&-33,Math.min(d,122)&-33]))}}b.sort(function(a,f){return a[0]-f[0]||f[1]-a[1]});f=[];j=[NaN,NaN];for(c=0;c<b.length;++c)i=b[c],i[0]<=j[1]+1?j[1]=Math.max(j[1],i[1]):f.push(j=i);b=["["];o&&b.push("^");b.push.apply(b,a);for(c=0;c< -f.length;++c)i=f[c],b.push(e(i[0])),i[1]>i[0]&&(i[1]+1>i[0]&&b.push("-"),b.push(e(i[1])));b.push("]");return b.join("")}function y(a){for(var f=a.source.match(/\[(?:[^\\\]]|\\[\S\s])*]|\\u[\dA-Fa-f]{4}|\\x[\dA-Fa-f]{2}|\\\d+|\\[^\dux]|\(\?[!:=]|[()^]|[^()[\\^]+/g),b=f.length,d=[],c=0,i=0;c<b;++c){var j=f[c];j==="("?++i:"\\"===j.charAt(0)&&(j=+j.substring(1))&&j<=i&&(d[j]=-1)}for(c=1;c<d.length;++c)-1===d[c]&&(d[c]=++t);for(i=c=0;c<b;++c)j=f[c],j==="("?(++i,d[i]===void 0&&(f[c]="(?:")):"\\"===j.charAt(0)&& -(j=+j.substring(1))&&j<=i&&(f[c]="\\"+d[i]);for(i=c=0;c<b;++c)"^"===f[c]&&"^"!==f[c+1]&&(f[c]="");if(a.ignoreCase&&s)for(c=0;c<b;++c)j=f[c],a=j.charAt(0),j.length>=2&&a==="["?f[c]=h(j):a!=="\\"&&(f[c]=j.replace(/[A-Za-z]/g,function(a){a=a.charCodeAt(0);return"["+String.fromCharCode(a&-33,a|32)+"]"}));return f.join("")}for(var t=0,s=!1,l=!1,p=0,d=a.length;p<d;++p){var g=a[p];if(g.ignoreCase)l=!0;else if(/[a-z]/i.test(g.source.replace(/\\u[\da-f]{4}|\\x[\da-f]{2}|\\[^UXux]/gi,""))){s=!0;l=!1;break}}for(var r= -{b:8,t:9,n:10,v:11,f:12,r:13},n=[],p=0,d=a.length;p<d;++p){g=a[p];if(g.global||g.multiline)throw Error(""+g);n.push("(?:"+y(g)+")")}return RegExp(n.join("|"),l?"gi":"g")}function M(a){function m(a){switch(a.nodeType){case 1:if(e.test(a.className))break;for(var g=a.firstChild;g;g=g.nextSibling)m(g);g=a.nodeName;if("BR"===g||"LI"===g)h[s]="\n",t[s<<1]=y++,t[s++<<1|1]=a;break;case 3:case 4:g=a.nodeValue,g.length&&(g=p?g.replace(/\r\n?/g,"\n"):g.replace(/[\t\n\r ]+/g," "),h[s]=g,t[s<<1]=y,y+=g.length, -t[s++<<1|1]=a)}}var e=/(?:^|\s)nocode(?:\s|$)/,h=[],y=0,t=[],s=0,l;a.currentStyle?l=a.currentStyle.whiteSpace:window.getComputedStyle&&(l=document.defaultView.getComputedStyle(a,q).getPropertyValue("white-space"));var p=l&&"pre"===l.substring(0,3);m(a);return{a:h.join("").replace(/\n$/,""),c:t}}function B(a,m,e,h){m&&(a={a:m,d:a},e(a),h.push.apply(h,a.e))}function x(a,m){function e(a){for(var l=a.d,p=[l,"pln"],d=0,g=a.a.match(y)||[],r={},n=0,z=g.length;n<z;++n){var f=g[n],b=r[f],o=void 0,c;if(typeof b=== -"string")c=!1;else{var i=h[f.charAt(0)];if(i)o=f.match(i[1]),b=i[0];else{for(c=0;c<t;++c)if(i=m[c],o=f.match(i[1])){b=i[0];break}o||(b="pln")}if((c=b.length>=5&&"lang-"===b.substring(0,5))&&!(o&&typeof o[1]==="string"))c=!1,b="src";c||(r[f]=b)}i=d;d+=f.length;if(c){c=o[1];var j=f.indexOf(c),k=j+c.length;o[2]&&(k=f.length-o[2].length,j=k-c.length);b=b.substring(5);B(l+i,f.substring(0,j),e,p);B(l+i+j,c,C(b,c),p);B(l+i+k,f.substring(k),e,p)}else p.push(l+i,b)}a.e=p}var h={},y;(function(){for(var e=a.concat(m), -l=[],p={},d=0,g=e.length;d<g;++d){var r=e[d],n=r[3];if(n)for(var k=n.length;--k>=0;)h[n.charAt(k)]=r;r=r[1];n=""+r;p.hasOwnProperty(n)||(l.push(r),p[n]=q)}l.push(/[\S\s]/);y=L(l)})();var t=m.length;return e}function u(a){var m=[],e=[];a.tripleQuotedStrings?m.push(["str",/^(?:'''(?:[^'\\]|\\[\S\s]|''?(?=[^']))*(?:'''|$)|"""(?:[^"\\]|\\[\S\s]|""?(?=[^"]))*(?:"""|$)|'(?:[^'\\]|\\[\S\s])*(?:'|$)|"(?:[^"\\]|\\[\S\s])*(?:"|$))/,q,"'\""]):a.multiLineStrings?m.push(["str",/^(?:'(?:[^'\\]|\\[\S\s])*(?:'|$)|"(?:[^"\\]|\\[\S\s])*(?:"|$)|`(?:[^\\`]|\\[\S\s])*(?:`|$))/, -q,"'\"`"]):m.push(["str",/^(?:'(?:[^\n\r'\\]|\\.)*(?:'|$)|"(?:[^\n\r"\\]|\\.)*(?:"|$))/,q,"\"'"]);a.verbatimStrings&&e.push(["str",/^@"(?:[^"]|"")*(?:"|$)/,q]);var h=a.hashComments;h&&(a.cStyleComments?(h>1?m.push(["com",/^#(?:##(?:[^#]|#(?!##))*(?:###|$)|.*)/,q,"#"]):m.push(["com",/^#(?:(?:define|elif|else|endif|error|ifdef|include|ifndef|line|pragma|undef|warning)\b|[^\n\r]*)/,q,"#"]),e.push(["str",/^<(?:(?:(?:\.\.\/)*|\/?)(?:[\w-]+(?:\/[\w-]+)+)?[\w-]+\.h|[a-z]\w*)>/,q])):m.push(["com",/^#[^\n\r]*/, -q,"#"]));a.cStyleComments&&(e.push(["com",/^\/\/[^\n\r]*/,q]),e.push(["com",/^\/\*[\S\s]*?(?:\*\/|$)/,q]));a.regexLiterals&&e.push(["lang-regex",/^(?:^^\.?|[!+-]|!=|!==|#|%|%=|&|&&|&&=|&=|\(|\*|\*=|\+=|,|-=|->|\/|\/=|:|::|;|<|<<|<<=|<=|=|==|===|>|>=|>>|>>=|>>>|>>>=|[?@[^]|\^=|\^\^|\^\^=|{|\||\|=|\|\||\|\|=|~|break|case|continue|delete|do|else|finally|instanceof|return|throw|try|typeof)\s*(\/(?=[^*/])(?:[^/[\\]|\\[\S\s]|\[(?:[^\\\]]|\\[\S\s])*(?:]|$))+\/)/]);(h=a.types)&&e.push(["typ",h]);a=(""+a.keywords).replace(/^ | $/g, -"");a.length&&e.push(["kwd",RegExp("^(?:"+a.replace(/[\s,]+/g,"|")+")\\b"),q]);m.push(["pln",/^\s+/,q," \r\n\t\xa0"]);e.push(["lit",/^@[$_a-z][\w$@]*/i,q],["typ",/^(?:[@_]?[A-Z]+[a-z][\w$@]*|\w+_t\b)/,q],["pln",/^[$_a-z][\w$@]*/i,q],["lit",/^(?:0x[\da-f]+|(?:\d(?:_\d+)*\d*(?:\.\d*)?|\.\d\+)(?:e[+-]?\d+)?)[a-z]*/i,q,"0123456789"],["pln",/^\\[\S\s]?/,q],["pun",/^.[^\s\w"-$'./@\\`]*/,q]);return x(m,e)}function D(a,m){function e(a){switch(a.nodeType){case 1:if(k.test(a.className))break;if("BR"===a.nodeName)h(a), -a.parentNode&&a.parentNode.removeChild(a);else for(a=a.firstChild;a;a=a.nextSibling)e(a);break;case 3:case 4:if(p){var b=a.nodeValue,d=b.match(t);if(d){var c=b.substring(0,d.index);a.nodeValue=c;(b=b.substring(d.index+d[0].length))&&a.parentNode.insertBefore(s.createTextNode(b),a.nextSibling);h(a);c||a.parentNode.removeChild(a)}}}}function h(a){function b(a,d){var e=d?a.cloneNode(!1):a,f=a.parentNode;if(f){var f=b(f,1),g=a.nextSibling;f.appendChild(e);for(var h=g;h;h=g)g=h.nextSibling,f.appendChild(h)}return e} -for(;!a.nextSibling;)if(a=a.parentNode,!a)return;for(var a=b(a.nextSibling,0),e;(e=a.parentNode)&&e.nodeType===1;)a=e;d.push(a)}var k=/(?:^|\s)nocode(?:\s|$)/,t=/\r\n?|\n/,s=a.ownerDocument,l;a.currentStyle?l=a.currentStyle.whiteSpace:window.getComputedStyle&&(l=s.defaultView.getComputedStyle(a,q).getPropertyValue("white-space"));var p=l&&"pre"===l.substring(0,3);for(l=s.createElement("LI");a.firstChild;)l.appendChild(a.firstChild);for(var d=[l],g=0;g<d.length;++g)e(d[g]);m===(m|0)&&d[0].setAttribute("value", -m);var r=s.createElement("OL");r.className="linenums";for(var n=Math.max(0,m-1|0)||0,g=0,z=d.length;g<z;++g)l=d[g],l.className="L"+(g+n)%10,l.firstChild||l.appendChild(s.createTextNode("\xa0")),r.appendChild(l);a.appendChild(r)}function k(a,m){for(var e=m.length;--e>=0;){var h=m[e];A.hasOwnProperty(h)?window.console&&console.warn("cannot override language handler %s",h):A[h]=a}}function C(a,m){if(!a||!A.hasOwnProperty(a))a=/^\s*</.test(m)?"default-markup":"default-code";return A[a]}function E(a){var m= -a.g;try{var e=M(a.h),h=e.a;a.a=h;a.c=e.c;a.d=0;C(m,h)(a);var k=/\bMSIE\b/.test(navigator.userAgent),m=/\n/g,t=a.a,s=t.length,e=0,l=a.c,p=l.length,h=0,d=a.e,g=d.length,a=0;d[g]=s;var r,n;for(n=r=0;n<g;)d[n]!==d[n+2]?(d[r++]=d[n++],d[r++]=d[n++]):n+=2;g=r;for(n=r=0;n<g;){for(var z=d[n],f=d[n+1],b=n+2;b+2<=g&&d[b+1]===f;)b+=2;d[r++]=z;d[r++]=f;n=b}for(d.length=r;h<p;){var o=l[h+2]||s,c=d[a+2]||s,b=Math.min(o,c),i=l[h+1],j;if(i.nodeType!==1&&(j=t.substring(e,b))){k&&(j=j.replace(m,"\r"));i.nodeValue= -j;var u=i.ownerDocument,v=u.createElement("SPAN");v.className=d[a+1];var x=i.parentNode;x.replaceChild(v,i);v.appendChild(i);e<o&&(l[h+1]=i=u.createTextNode(t.substring(b,o)),x.insertBefore(i,v.nextSibling))}e=b;e>=o&&(h+=2);e>=c&&(a+=2)}}catch(w){"console"in window&&console.log(w&&w.stack?w.stack:w)}}var v=["break,continue,do,else,for,if,return,while"],w=[[v,"auto,case,char,const,default,double,enum,extern,float,goto,int,long,register,short,signed,sizeof,static,struct,switch,typedef,union,unsigned,void,volatile"], -"catch,class,delete,false,import,new,operator,private,protected,public,this,throw,true,try,typeof"],F=[w,"alignof,align_union,asm,axiom,bool,concept,concept_map,const_cast,constexpr,decltype,dynamic_cast,explicit,export,friend,inline,late_check,mutable,namespace,nullptr,reinterpret_cast,static_assert,static_cast,template,typeid,typename,using,virtual,where"],G=[w,"abstract,boolean,byte,extends,final,finally,implements,import,instanceof,null,native,package,strictfp,super,synchronized,throws,transient"], -H=[G,"as,base,by,checked,decimal,delegate,descending,dynamic,event,fixed,foreach,from,group,implicit,in,interface,internal,into,is,lock,object,out,override,orderby,params,partial,readonly,ref,sbyte,sealed,stackalloc,string,select,uint,ulong,unchecked,unsafe,ushort,var"],w=[w,"debugger,eval,export,function,get,null,set,undefined,var,with,Infinity,NaN"],I=[v,"and,as,assert,class,def,del,elif,except,exec,finally,from,global,import,in,is,lambda,nonlocal,not,or,pass,print,raise,try,with,yield,False,True,None"], -J=[v,"alias,and,begin,case,class,def,defined,elsif,end,ensure,false,in,module,next,nil,not,or,redo,rescue,retry,self,super,then,true,undef,unless,until,when,yield,BEGIN,END"],v=[v,"case,done,elif,esac,eval,fi,function,in,local,set,then,until"],K=/^(DIR|FILE|vector|(de|priority_)?queue|list|stack|(const_)?iterator|(multi)?(set|map)|bitset|u?(int|float)\d*)/,N=/\S/,O=u({keywords:[F,H,w,"caller,delete,die,do,dump,elsif,eval,exit,foreach,for,goto,if,import,last,local,my,next,no,our,print,package,redo,require,sub,undef,unless,until,use,wantarray,while,BEGIN,END"+ -I,J,v],hashComments:!0,cStyleComments:!0,multiLineStrings:!0,regexLiterals:!0}),A={};k(O,["default-code"]);k(x([],[["pln",/^[^<?]+/],["dec",/^<!\w[^>]*(?:>|$)/],["com",/^<\!--[\S\s]*?(?:--\>|$)/],["lang-",/^<\?([\S\s]+?)(?:\?>|$)/],["lang-",/^<%([\S\s]+?)(?:%>|$)/],["pun",/^(?:<[%?]|[%?]>)/],["lang-",/^<xmp\b[^>]*>([\S\s]+?)<\/xmp\b[^>]*>/i],["lang-js",/^<script\b[^>]*>([\S\s]*?)(<\/script\b[^>]*>)/i],["lang-css",/^<style\b[^>]*>([\S\s]*?)(<\/style\b[^>]*>)/i],["lang-in.tag",/^(<\/?[a-z][^<>]*>)/i]]), -["default-markup","htm","html","mxml","xhtml","xml","xsl"]);k(x([["pln",/^\s+/,q," \t\r\n"],["atv",/^(?:"[^"]*"?|'[^']*'?)/,q,"\"'"]],[["tag",/^^<\/?[a-z](?:[\w-.:]*\w)?|\/?>$/i],["atn",/^(?!style[\s=]|on)[a-z](?:[\w:-]*\w)?/i],["lang-uq.val",/^=\s*([^\s"'>]*(?:[^\s"'/>]|\/(?=\s)))/],["pun",/^[/<->]+/],["lang-js",/^on\w+\s*=\s*"([^"]+)"/i],["lang-js",/^on\w+\s*=\s*'([^']+)'/i],["lang-js",/^on\w+\s*=\s*([^\s"'>]+)/i],["lang-css",/^style\s*=\s*"([^"]+)"/i],["lang-css",/^style\s*=\s*'([^']+)'/i],["lang-css", -/^style\s*=\s*([^\s"'>]+)/i]]),["in.tag"]);k(x([],[["atv",/^[\S\s]+/]]),["uq.val"]);k(u({keywords:F,hashComments:!0,cStyleComments:!0,types:K}),["c","cc","cpp","cxx","cyc","m"]);k(u({keywords:"null,true,false"}),["json"]);k(u({keywords:H,hashComments:!0,cStyleComments:!0,verbatimStrings:!0,types:K}),["cs"]);k(u({keywords:G,cStyleComments:!0}),["java"]);k(u({keywords:v,hashComments:!0,multiLineStrings:!0}),["bsh","csh","sh"]);k(u({keywords:I,hashComments:!0,multiLineStrings:!0,tripleQuotedStrings:!0}), -["cv","py"]);k(u({keywords:"caller,delete,die,do,dump,elsif,eval,exit,foreach,for,goto,if,import,last,local,my,next,no,our,print,package,redo,require,sub,undef,unless,until,use,wantarray,while,BEGIN,END",hashComments:!0,multiLineStrings:!0,regexLiterals:!0}),["perl","pl","pm"]);k(u({keywords:J,hashComments:!0,multiLineStrings:!0,regexLiterals:!0}),["rb"]);k(u({keywords:w,cStyleComments:!0,regexLiterals:!0}),["js"]);k(u({keywords:"all,and,by,catch,class,else,extends,false,finally,for,if,in,is,isnt,loop,new,no,not,null,of,off,on,or,return,super,then,true,try,unless,until,when,while,yes", -hashComments:3,cStyleComments:!0,multilineStrings:!0,tripleQuotedStrings:!0,regexLiterals:!0}),["coffee"]);k(x([],[["str",/^[\S\s]+/]]),["regex"]);window.prettyPrintOne=function(a,m,e){var h=document.createElement("PRE");h.innerHTML=a;e&&D(h,e);E({g:m,i:e,h:h});return h.innerHTML};window.prettyPrint=function(a){function m(){for(var e=window.PR_SHOULD_USE_CONTINUATION?l.now()+250:Infinity;p<h.length&&l.now()<e;p++){var n=h[p],k=n.className;if(k.indexOf("prettyprint")>=0){var k=k.match(g),f,b;if(b= -!k){b=n;for(var o=void 0,c=b.firstChild;c;c=c.nextSibling)var i=c.nodeType,o=i===1?o?b:c:i===3?N.test(c.nodeValue)?b:o:o;b=(f=o===b?void 0:o)&&"CODE"===f.tagName}b&&(k=f.className.match(g));k&&(k=k[1]);b=!1;for(o=n.parentNode;o;o=o.parentNode)if((o.tagName==="pre"||o.tagName==="code"||o.tagName==="xmp")&&o.className&&o.className.indexOf("prettyprint")>=0){b=!0;break}b||((b=(b=n.className.match(/\blinenums\b(?::(\d+))?/))?b[1]&&b[1].length?+b[1]:!0:!1)&&D(n,b),d={g:k,h:n,i:b},E(d))}}p<h.length?setTimeout(m, -250):a&&a()}for(var e=[document.getElementsByTagName("pre"),document.getElementsByTagName("code"),document.getElementsByTagName("xmp")],h=[],k=0;k<e.length;++k)for(var t=0,s=e[k].length;t<s;++t)h.push(e[k][t]);var e=q,l=Date;l.now||(l={now:function(){return+new Date}});var p=0,d,g=/\blang(?:uage)?-([\w.]+)(?!\S)/;m()};window.PR={createSimpleLexer:x,registerLangHandler:k,sourceDecorator:u,PR_ATTRIB_NAME:"atn",PR_ATTRIB_VALUE:"atv",PR_COMMENT:"com",PR_DECLARATION:"dec",PR_KEYWORD:"kwd",PR_LITERAL:"lit", -PR_NOCODE:"nocode",PR_PLAIN:"pln",PR_PUNCTUATION:"pun",PR_SOURCE:"src",PR_STRING:"str",PR_TAG:"tag",PR_TYPE:"typ"}})(); diff --git a/deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/index.html b/deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/index.html deleted file mode 100644 index 1d4dbb27a8e3b680f8741933005ae361d18ff6f0..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/index.html +++ /dev/null @@ -1,92 +0,0 @@ -<!DOCTYPE html> -<html lang="en"> - <head> - <meta charset="utf-8"> - <title>Sample Graph</title> - <meta name="viewport" content="width=device-width, initial-scale=1.0"> - <meta name="description" content="Displays NGS sample graphs"> - <meta name="author" content="ETH | CISD"> - - <!-- openBIS --> - <link href="assets/css/openbis.css" rel="stylesheet"> - <script src="/openbis/resources/js/jquery.js"></script> - <script src="/openbis/resources/js/openbis.js"></script> - <script src="/openbis/resources/js/openbis-login.js"></script> - <script src="assets/js/d3/d3.js"></script> - <script src="assets/js/dagre/dagre.js"></script> - <script src="webapp.js"></script> - <script type="text/javascript"> - // If this is being shown, we are logged in, so just enter the app. - $(document).ready(function() { - enterApp(); - }); - </script> - - <!-- Le styles --> - <link href="assets/css/bootstrap.css" rel="stylesheet"> - <style> - body { - padding-top: 60px; /* 60px to make the container go all the way to the bottom of the topbar */ - } - </style> - <link href="assets/css/bootstrap-responsive.css" rel="stylesheet"> - - <!-- Le HTML5 shim, for IE6-8 support of HTML5 elements --> - <!--[if lt IE 9]> - <script src="http://html5shim.googlecode.com/svn/trunk/html5.js"></script> - <![endif]--> - - <!-- Le fav and touch icons --> - <link rel="shortcut icon" href="assets/ico/favicon.ico"> - <link rel="apple-touch-icon-precomposed" sizes="144x144" href="assets/ico/apple-touch-icon-144-precomposed.png"> - <link rel="apple-touch-icon-precomposed" sizes="114x114" href="assets/ico/apple-touch-icon-114-precomposed.png"> - <link rel="apple-touch-icon-precomposed" sizes="72x72" href="assets/ico/apple-touch-icon-72-precomposed.png"> - <link rel="apple-touch-icon-precomposed" href="assets/ico/apple-touch-icon-57-precomposed.png"> - </head> - - <body> - <div id="main"> - <div class="navbar navbar-fixed-top"> - <div class="navbar-inner"> - <div class="container-fluid"> - <a class="brand">Sample Graph</a> - <ul class="nav"> - <li class="active"><a id="bottom-up">Bottom Up</a></li> - <li><a id="top-down">Top Down</a></li> - </ul> - <ul class="nav"> - <li class="active"><a id="with-colors">Colors</a></li> - <li><a id="no-colors">B&W</a></li> - </ul> - <ul class="nav"> - <li class="active"><a id="space-saving">Space Saving</a></li> - <li><a id="space-filling">Space Filling</a></li> - </ul> - </div> - </div> - </div> - - <div class="container-fluid"> - <h1 id="root-label"></h1> - </div> <!-- /container --> - </div> <!-- /main --> - <div id="root" style="padding-left: 25px"></div> - - <!-- Le javascript - ================================================== --> - <!-- Placed at the end of the document so the pages load faster --> - <script src="assets/js/bootstrap-transition.js"></script> - <script src="assets/js/bootstrap-alert.js"></script> - <script src="assets/js/bootstrap-modal.js"></script> - <script src="assets/js/bootstrap-dropdown.js"></script> - <script src="assets/js/bootstrap-scrollspy.js"></script> - <script src="assets/js/bootstrap-tab.js"></script> - <script src="assets/js/bootstrap-tooltip.js"></script> - <script src="assets/js/bootstrap-popover.js"></script> - <script src="assets/js/bootstrap-button.js"></script> - <script src="assets/js/bootstrap-collapse.js"></script> - <script src="assets/js/bootstrap-carousel.js"></script> - <script src="assets/js/bootstrap-typeahead.js"></script> - - </body> -</html> diff --git a/deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/webapp.js b/deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/webapp.js deleted file mode 100644 index f70bf771b60b9f5f82fca2ce0f4e133483491915..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/webapp.js +++ /dev/null @@ -1,1064 +0,0 @@ -/** - * Sample-Relationship Bottom Up Webapp - * - * This webapp draws a graph emanating from a flowcell and terminating at the biological sample. - * - * Because the structure is rigid, it draws each sample type in its own column. - */ - -// -// BEGIN CONFIGURATION PARAMTERS -// -// The following parameters must be configured for the webapp - -var FLOWCELL_SAMPLE_TYPE = "FLOWCELL"; -var FLOWLANE_SAMPLE_TYPE = "FLOWLANE"; - -// The view is organized in columns that correspond to a sample type. The columns are defined here. -// The order of the sample types here matches the bottom-up order of the sample types. -var COLUMNS = [ - { type : FLOWCELL_SAMPLE_TYPE, label : "Flowcell", width : 200 }, - { type : FLOWLANE_SAMPLE_TYPE, label : "Flowlane", width : 200 }, - { type : "MULTIPLEX", label : "Multiplex", width : 300 }, - { type : "LIBRARY", label : "Library", width : 240 }, - { type : "ALIQUOT", label : "Aliquot", width : 400 }, - { type : "SAMPLE", label : "Sample", width : 400 } -]; - -// The height of each line in the display -var LINE_HEIGHT = 20; - -// The first N columns are shown expanded when the webapp is started. The next are initially collapsed. -// N probably should not be less than 2 and certainly should not be less than 1. -var FIRST_COLLAPSED_COLUMN = 2; - -// The colors used for the different samples. The colors are used when one sample has multiple parents or children to disambiguate. -var sampleColors = d3.scale.category10(); -//var sampleColors = d3.scale.ordinal().range(['#999']); - -// The color used when the connection between two samples is unambiguous -var oneToOneColor = "#999" - -// END CONFIGURATION PARAMTERS - -/// The openbisServer we use for our data -var webappContext = new openbisWebAppContext(); - -// openbisServer is global -- index.html needs to refer to it. -openbisServer = new openbis('/openbis/openbis', '/datastore_server'); -openbisServer.useSession(webappContext.getSessionId()); - -function parseJson(jsonString) { return eval('(' + jsonString + ')'); } - -function flowcellIdFromFlowlaneId(flowlaneId) { return flowlaneId.split(":")[0]; } - -/** - * The node stores the information necessary for presenting the sample data in the graph. - */ -function SampleGraphNode(sample) { - this.identifier = sample.identifier; - this.properties = sample.properties; - this.permId = sample.permId; - this.nodeId = sample["@id"]; - this.sampleType = sample.sampleTypeCode; - this.children = []; - this.parents = []; - this.serverSample = sample; - this.arrayIndex = -1; -} - -SampleGraphNode.prototype.toString = function() { - return "[" + this.sampleType + ", " + this.identifier + ", " + this.permId + "]"; -}; - -/** - * The link stores the information necessary for drawing connections between nodes - */ -function SampleGraphEdge(source, target) { - this.source = source; - this.target = target; -} - -/** Break an identifier into a code and space */ -function codeAndSpaceFromIdentifier(identifier) { - var identifierTokens = identifier.split("/"); - var space, code; - if (identifierTokens.length > 2) { - space = identifierTokens[1]; - code = identifierTokens[2]; - } else { - space = null; - code = identifierTokens[1]; - } - return {space : space, code : code}; -} - - -/** - * The model that manages state and implements the operations for the sample graph. - */ -function SampleGraphModel() { - this.initializeModel(); -} - -SampleGraphModel.prototype.initializeModel = function() { - this.sampleIdentifier = webappContext.getEntityIdentifier(); - var codeAndSpace = codeAndSpaceFromIdentifier(this.sampleIdentifier); - this.sampleSpace = codeAndSpace.space; - this.sampleCode = codeAndSpace.code; - this.samplePermId = webappContext.getEntityPermId(); - this.sampleType = webappContext.getEntityType(); - var samplesByType = {}; - COLUMNS.forEach(function(column) { samplesByType[column.type] = [] }); - this.samplesByType = samplesByType; - this.flowcellsByIdentifier = {}; -} - -/** - * Request the data necessary to display the graph. - */ -SampleGraphModel.prototype.requestGraphData = function(callback) -{ - var matchClauses = [ {"@type" : "AttributeMatchClause", - fieldType : "ATTRIBUTE", - attribute : "CODE", - desiredValue : (FLOWCELL_SAMPLE_TYPE == this.sampleType) ? this.sampleCode + "*" : this.sampleCode - }]; - - if (this.sampleSpace) { - matchClauses.push({"@type" : "AttributeMatchClause", - fieldType : "ATTRIBUTE", - attribute : "SPACE", - desiredValue : this.sampleSpace - }) - } - - - var sampleCriteria = { - matchClauses : matchClauses, - operator : "MATCH_ALL_CLAUSES" - }; - - var lexicalParent = this; - function coalesceResult(data) { - lexicalParent.coalesceGraphData(data); - lexicalParent.requestFlowcellData(callback) - } - - openbisServer.searchForSamplesWithFetchOptions(sampleCriteria, ["PROPERTIES", "ANCESTORS", "DESCENDANTS"], coalesceResult); -} - -/** - * In most cases, we need an additional server request to get the flowcell data. Make that call here. - */ -SampleGraphModel.prototype.requestFlowcellData = function(callback) { - if (FLOWCELL_SAMPLE_TYPE == this.sampleType) { - callback(); - return; - } - - // Collect the Flowcell code and spaces - var flowlaneIds = []; - this.samplesByType[FLOWLANE_SAMPLE_TYPE].forEach(function(flowlane) { - var flowcellId = flowcellIdFromFlowlaneId(flowlane.identifier); - var codeAndSpace = codeAndSpaceFromIdentifier(flowcellId); - flowlaneIds.push(codeAndSpace); - }); - - var matchClauses = []; - flowlaneIds.forEach(function(cs) { - matchClauses.push({"@type" : "AttributeMatchClause", - fieldType : "ATTRIBUTE", - attribute : "CODE", - desiredValue : cs.code - }) - }) - - var sampleCriteria = { - matchClauses : matchClauses, - operator : "MATCH_ANY_CLAUSES" - }; - - var lexicalParent = this; - function coalesceResult(data) { - lexicalParent.coalesceGraphData(data); - callback(); - } - - openbisServer.searchForSamplesWithFetchOptions(sampleCriteria, ["PROPERTIES"], coalesceResult); - -}; - - -/** - * Request the data necessary to display the graph. - */ -SampleGraphModel.prototype.coalesceGraphData = function(data, callback) { - var samples = data.result; - var nodesById = {}; - - function isPureId(sample) { return null == sample["@id"]; } - - function nodeForSample(sample) { return isPureId(sample) ? nodesById[sample] : nodesById[sample["@id"]]; } - - var lexicalParent = this; - function convertSampleToNode(sample) { - // This is just a nodeId, it will be converted elsewhere - if (isPureId(sample)) return; - // This has already been converted - if (nodesById[sample.nodeId]) return; - - var node = new SampleGraphNode(sample); - nodesById[node.nodeId] = node; - sampleTypeArray = lexicalParent.samplesByType[node.sampleType] - if (sampleTypeArray) { - node.arrayIndex = sampleTypeArray.length; - sampleTypeArray.push(node); - } - if (FLOWCELL_SAMPLE_TYPE == node.sampleType) { - lexicalParent.flowcellsByIdentifier[node.identifier] = node; - } - - if (sample.parents) sample.parents.forEach(convertSampleToNode); - if (sample.children) sample.children.forEach(convertSampleToNode); - } - - function resolveParents(sample) { - // This is just a nodeId, it will be resolved elsewhere - if (isPureId(sample)) return; - if (!sample.parents) return; - - sample.parents.forEach(resolveParents); - - var node = nodeForSample(sample); - node.parents = sample.parents.map(nodeForSample); - node.parents.forEach(function(p) { p.children ? p.children.push(node) : p.children = [node]}); - node.parents.sort(function(a, b) { return a.identifier < b.identifier; }); - } - - function resolveChildren(sample) { - // This is just a nodeId, it will be resolved elsewhere - if (isPureId(sample)) return; - if (!sample.children) return; - - sample.children.forEach(resolveChildren); - - var node = nodeForSample(sample); - node.children = sample.children.map(nodeForSample); - node.children.forEach(function(p) { p.parents ? p.parents.push(node) : p.parents = [node]}); - node.children.sort(function(a, b) { return a.identifier < b.identifier; }) - } - - samples.forEach(convertSampleToNode); - samples.forEach(resolveParents); - samples.forEach(resolveChildren); - - // The parents of the flowlanes should become the parents of the flowcell and the - // flowcell should become the parent of the flowlanes. - var flowcellsByIdentifier = this.flowcellsByIdentifier; - this.samplesByType[FLOWLANE_SAMPLE_TYPE].forEach(function(flowlane) { - var flowcellId = flowcellIdFromFlowlaneId(flowlane.identifier); - var flowcell = flowcellsByIdentifier[flowcellId]; - if (flowcell) { - flowcell.parents.push(flowlane); - flowlane.children.push(flowcell); - } - }); -} - - -/** - * The presenter that shows the model. - */ -function SampleGraphPresenter(model) { - this.model = model; - this.selectedNode = null; - this.didCreateVis = false; - this.useSpaceSavingRenderer(); - this.useBottomUpMode(); - this.useWithColorsMode(); - this.initializePresenter(); -} - -/** - * Create the DOM elements to store the visualization (tree + inspectors) - */ -SampleGraphPresenter.prototype.initializePresenter = function() -{ - if (this.didCreateVis) return; - - // Create a div to house the tree visualization and the inspectors - this.root = d3.select("#root"); - this.rootLabel = d3.select("#root-label"); - this.rootLabel.text(this.model.sampleIdentifier); - this.didCreateVis = true; -} - -SampleGraphPresenter.prototype.useSpaceSavingRenderer = function() { - this.renderer = new SimpleGraphRenderer(); -} - -SampleGraphPresenter.prototype.useSpaceFillingRenderer = function() { - this.renderer = new DagreGraphRenderer(); -} - -SampleGraphPresenter.prototype.isSpaceSavingMode = function() { - return this.renderer instanceof SimpleGraphRenderer; -} - -SampleGraphPresenter.prototype.isSpaceFillingMode = function() { - return this.renderer instanceof DagreGraphRenderer; -} - -SampleGraphPresenter.prototype.clear = function() { - this.root.selectAll("svg").remove(); -}; - -SampleGraphPresenter.prototype.calcuateVisibleColumnOffsets = function() { - // Calculate the offsets for the columns -- only need to do this once - var xOffset = 0; - - // Depending on whether or not we are viewing top down or bottom up, the visible columns are those - // before and including the selected sample type, or those after and including the sample type, respectively. - var querySampleType = model.sampleType; - var seenQuerySampleType = false; - var bottomUpMode = this.bottomUpMode; - var visibleColumns = []; - COLUMNS.forEach(function(col, i) { - var atQuerySampleType = col.type == querySampleType; - if (atQuerySampleType) { - visibleColumns.push(col); - } else { - var includeCol = seenQuerySampleType && bottomUpMode; - includeCol = includeCol || !seenQuerySampleType && !bottomUpMode; - if (includeCol) visibleColumns.push(col) - } - seenQuerySampleType = seenQuerySampleType || atQuerySampleType; - }) - - if (!bottomUpMode) visibleColumns = visibleColumns.reverse(); - this.visibleColumns = visibleColumns; - this.visibleColumns.forEach(function(column) { column.xOffset = xOffset; xOffset += column.width }); -}; - -/** - * Put the presenter in the bottom-up display mode (compared to top-down) - */ -SampleGraphPresenter.prototype.useBottomUpMode = function() { - this.bottomUpMode = true; - this.calcuateVisibleColumnOffsets(); -}; - -/** - * Put the presenter in the top-down display mode (compared to bottom-up) - */ -SampleGraphPresenter.prototype.useTopDownMode = function() { - this.bottomUpMode = false; - this.calcuateVisibleColumnOffsets(); -}; - -SampleGraphPresenter.prototype.useWithColorsMode = function() { - this.withColorsMode = true; - sampleColors = d3.scale.category10(); -}; - -SampleGraphPresenter.prototype.useNoColorsMode = function() { - this.withColorsMode = false; - sampleColors = d3.scale.ordinal().range(['#999']); -}; - -/** - * Return a function that gives the outgoing edges for a sample. - * - * The outgoing edges depends on whether the view is top-down or bottom-up - */ -SampleGraphPresenter.prototype.outEdgesFunction = function() { - var bottomUpMode = this.bottomUpMode; - return function(samp) { return bottomUpMode ? samp.parents : samp.children } -} - -/** - * Return a function that gives the incoming edges for a sample. - * - * The incoming edges depends on whether the view is top-down or bottom-up - */ -SampleGraphPresenter.prototype.inEdgesFunction = function() { - var bottomUpMode = this.bottomUpMode; - return function(samp) { return bottomUpMode ? samp.children : samp.parents } -} - -/** - * Initialize the sample nodes - */ -SampleGraphPresenter.prototype.initializeGraphSamples = function() -{ - var colors = sampleColors; - var nodes = this.visibleColumns.map(function(c) { return model.samplesByType[c.type] }); - var outEdgesGetter = this.outEdgesFunction(); - var inEdgesGetter = this.inEdgesFunction(); - // Compute the x/y coordinates for each sample - for (var col = 0; col < nodes.length; ++col) { - var colData = nodes[col]; - var xOffset = this.visibleColumns[col].xOffset; - var width = this.visibleColumns[col].width; - for (row = 0; row < colData.length; ++row) { - var sampleData = colData[row]; - sampleData.col = col; - sampleData.row = row; - sampleData.colOffset = xOffset; - var outEdges = outEdgesGetter(sampleData); - var oneEdgeOrLess = outEdges.length < 2; - var connectedNodesWithMultipleInEdges = outEdges.filter(function(c) { return inEdgesGetter(c).length > 1 }); - var oneToOne = oneEdgeOrLess && connectedNodesWithMultipleInEdges.length == 0; - sampleData.color = (!oneToOne) ? colors(row) : oneToOneColor; - sampleData.userEdgesVisible = null; - sampleData.edgesVisible = col + 1 < FIRST_COLLAPSED_COLUMN; - } - } - this.allNodes = nodes; -} - -SampleGraphPresenter.prototype.updateVisibility = function() { - // Turn off visibility on all nodes except the root node - this.allNodes.forEach(function(samps) { - samps.forEach(function(s) { s.visible = s.identifier == model.sampleIdentifier; }) - }); - var outEdgesGetter = this.outEdgesFunction(); - // Figure out if the nodes should be visible - this.allNodes.forEach(function(samps) { - samps.forEach(function(sample) { - if (null != sample.userEdgesVisible) sample.edgesVisible = sample.userEdgesVisible; - var showChildren = sample.visible && sample.edgesVisible; - if (!showChildren) return; - outEdgesGetter(sample).forEach(function(c) { - c.visible = true; - // Nodes with only one outgoing edge should show their connected node as well, unless the user requests otherwise - if (outEdgesGetter(c).length == 1) { - c.edgesVisible = (null == c.userEdgesVisible) ? true : c.userEdgesVisible; - } - }); - }) - }); -} - -SampleGraphPresenter.prototype.updateEdges = function() { - var edges = []; - var outEdgesGetter = this.outEdgesFunction(); - this.allNodes.forEach(function(samps) { - samps.forEach(function(d) { - if (!d.visible) return; - outEdgesGetter(d).forEach(function(c) { if (c.visible) edges.push(new SampleGraphEdge(d, c))}); - }) - }); - - this.edges = edges; -} - -SampleGraphPresenter.prototype.updateNodes = function() { - var nodes = this.allNodes.map(function(d) { return d.filter(function(n) { return n.visible })}); - nodes.forEach(function(samps) { samps.forEach(function(s, i) { s.visibleIndex = i })}); - this.nodes = nodes; -} - -SampleGraphPresenter.prototype.updateState = function() -{ - // These need to be done in this order - this.updateVisibility(); - this.updateNodes(); - this.updateEdges(); -} - -/** - * Display the sample nodes. - */ -SampleGraphPresenter.prototype.draw = function() -{ - this.renderer.draw(); -} - -SampleGraphPresenter.prototype.toggleExpand = function(svgNode, d) { - // toggle visiblity - d.userEdgesVisible = (null == d.userEdgesVisible) ? !d.edgesVisible :!d.userEdgesVisible; - this.selectedNode = svgNode.parentNode; - this.draw(); -} - -SampleGraphPresenter.prototype.openSample = function(svgNode, d) { - var url = "/openbis/index.html?viewMode=SIMPLE#entity=SAMPLE&permId=" + d.permId; - window.open(url, '_blank'); -} - -function displayActiveMode(active, inactive) { - active.parent().addClass("active"); - inactive.parent().removeClass("active"); -} - -function clickedBottomUp() { - if (presenter.bottomUpMode) return; - - displayActiveMode($('#bottom-up'), $('#top-down')); - presenter.useBottomUpMode(); - presenter.initializeGraphSamples(); - presenter.draw(); -} - -function clickedTopDown() { - if (!presenter.bottomUpMode) return; - - displayActiveMode($('#top-down'), $('#bottom-up')); - presenter.useTopDownMode(); - presenter.initializeGraphSamples(); - presenter.draw(); -} - -function clickedWithColors() { - if (presenter.withColorsMode) return; - - displayActiveMode($('#with-colors'), $('#no-colors')); - presenter.useWithColorsMode(); - presenter.initializeGraphSamples(); - presenter.draw(); -} - -function clickedNoColors() { - if (!presenter.withColorsMode) return; - - displayActiveMode($('#no-colors'), $('#with-colors')); - presenter.useNoColorsMode(); - presenter.initializeGraphSamples(); - presenter.draw(); -} - -function clickedSpaceSaving() { - if (presenter.isSpaceSavingMode()) return; - - displayActiveMode($('#space-saving'), $('#space-filling')); - presenter.useSpaceSavingRenderer(); - presenter.initializeGraphSamples(); - presenter.clear(); - presenter.draw(); -} - -function clickedSpaceFilling() { - if (presenter.isSpaceFillingMode()) return; - - displayActiveMode($('#space-filling'), $('#space-saving')); - presenter.useSpaceFillingRenderer(); - presenter.initializeGraphSamples(); - presenter.clear(); - presenter.draw(); -} - -function textBBoxForGraphNode(node) { - var element = presenter.renderer.columns.selectAll("text.sample")[node.col][node.visibleIndex]; - if (!element) return {x: node.colOffset, y: 0, width : 0, height : 0 }; - var bbox = element.getBBox(); - // Correct for the column - bbox.x += node.colOffset; - return bbox; -} - -function textBBoxForDomNode(node) { - var bbox = node.parentNode.childNodes[0].getBBox(); - return bbox; -} - -function translate(x, y) { - return "translate(" + x + "," + y + ")"; -} - -function countInLinksOfSameType(d) { - var type = d.sampleType; - var count = 0; - var outEdges = presenter.inEdgesFunction(); - outEdges(d).forEach(function(edge) { - if (edge.sampleType == type) count++; - }); - return count; -} - -var yLinkOffset = LINE_HEIGHT * 0.33; - - -/** - * A class that renders the graph - */ -function SimpleGraphRenderer() { - // Function used to draw paths between elements - function end(d) { - // Find the associated text node in the DOM and use that as a basis for creating the edges - var bbox = textBBoxForGraphNode(d); - return { x : bbox.x + bbox.width + 7, y : bbox.y + yLinkOffset }; - } - function start(d) { - var bbox = textBBoxForGraphNode(d); - return { x : bbox.x, y : bbox.y + yLinkOffset } - } - - this.useLineLinkPath(start, end); -} - -/** - * Draw edges using the diagonal function - */ -SimpleGraphRenderer.prototype.useDiagonalLinkPath = function(start, end) { - var diagonal = d3.svg.diagonal(); - diagonal.source(function(d) { return (countInLinksOfSameType(d.target) > 0) ? start(d.source) : end(d.source)}); - diagonal.target(function(d) { return start(d.target)}); - this.path = diagonal; -} - -/** - * Draw edges using the line function - */ -SimpleGraphRenderer.prototype.useLineLinkPath = function(start, end) { - var line = d3.svg.line(); - this.path = function(d) { - var src = (countInLinksOfSameType(d.target) > 0) ? start(d.source) : end(d.source); - var dst = start(d.target); - return line([[src.x, src.y], [dst.x, dst.y]]); - } -} - -SimpleGraphRenderer.prototype.updateNodeOffsets = function() -{ - var nodes = presenter.nodes; - function initializeOffsetsAtLevel(level) { - level.forEach(function(d) { d.xOffset = countInLinksOfSameType(d) * 20; }); - } - nodes.forEach(initializeOffsetsAtLevel) -}; - -/** - * Display the sample nodes. - */ -SimpleGraphRenderer.prototype.draw = function() -{ - presenter.updateState(); - this.updateNodeOffsets(); - var nodes = presenter.nodes; - - // Display the graph in an SVG element - this.viz = presenter.root.selectAll("svg").data([nodes]); - // Code under enter is run if there is no HTML element for a data element - this.viz.enter().append("svg:svg").attr("class", "viz"); - - // Columns - this.columns = this.viz.selectAll("g").data(function(d) { return d }); - this.columns.enter().append("svg:g").attr("class", "column"); - this.columns.exit().remove(); - this.columns.attr("transform", function(d, i) { return "translate(" + presenter.visibleColumns[i].xOffset + ", 0)"}); - this.drawHeaders(); - this.drawNodes(); - this.drawEdges(); - - - var vizHeight = (d3.max(nodes, function(d) { return d.length}) + 1) * LINE_HEIGHT + 5; - var vizWidth = d3.sum(presenter.visibleColumns, function(column) { return column.width }); - this.viz.attr("width", vizWidth); - this.viz.attr("height", vizHeight); -} - -/** - * Draw the headers - */ -SimpleGraphRenderer.prototype.drawHeaders = function() -{ - var header = this.columns.selectAll("text.header").data(function(d, i) { return [presenter.visibleColumns[i]] }); - header.enter().append("svg:text") - .attr("class", "header") - .attr("x", "0") - .attr("y", LINE_HEIGHT) - .attr("text-anchor", "begin") - .style("font-weight", "bold"); - header - .text(function(d) { return d.label }); -} - -/** - * Draw the nodes - */ -SimpleGraphRenderer.prototype.drawNodes = function() -{ - var outEdgesGetter = presenter.outEdgesFunction(); - var sample = this.columns.selectAll("text.sample").data(function(d) { return d }); - sample.enter().append("svg:text") - .attr("class", "sample") - .attr("x", "0") - .attr("y", LINE_HEIGHT) - .attr("text-anchor", "begin") - .style("cursor", "pointer") - .on("click", function(d) { presenter.openSample(this, d) }) - .transition() - .style("opacity", 1); - sample.exit() - .transition() - .style("opacity", 0).remove(); - sample - .attr("x", function(d, i) { return d.xOffset; }) - .attr("y", function(d, i) { return LINE_HEIGHT * (i+2)}) - - .text(function(d) { return d.identifier }); - - var ring = this.columns.selectAll("circle.ring").data(function(d) { return d }); - ring.enter().append("svg:circle") - .attr("class", "ring") - .attr("pointer-events", "all") - .attr("r", 0) - .style("cursor", "pointer") - .style("stroke-width", "2px") - ring.exit() - .transition() - .style("opacity", 0).remove(); - ring - .attr("cx", function(d) { return textBBoxForGraphNode(d).width + d.xOffset + 7 }) - .attr("cy", function(d, i) { return LINE_HEIGHT * (i+2) - yLinkOffset}) - .style("fill", function(d) { return d.edgesVisible ? "none" : d.color}) - .style("stroke", function(d) { return d.color}) - .on("click", function(d) { presenter.toggleExpand(this, d) }); - ring - .transition() - .style("opacity", function(d) { return outEdgesGetter(d).length > 0 ? 1 : 0 }) - .attr("r", 5); -} - -/** - * Draw the edges - */ -SimpleGraphRenderer.prototype.drawEdges = function() -{ - var link = this.viz.selectAll("path.link").data(presenter.edges); - link.enter().append("svg:path") - .attr("class", "link") - .attr("pointer-events", "none") - .style("fill", "none") - .style("stroke-width", "1.5px") - .transition() - .style("opacity", 1); - link.exit() - .transition() - .style("opacity", 0).remove(); - link - .style("stroke", function(d) { return d.source.color}) - .attr("d", this.path); -} - -/** - * A class that renders the graph using dagre. - */ -function DagreGraphRenderer() { - // Function used to draw paths between elements - function source(d) { - var dagre = d.source.dagre; - return { x : dagre.x + dagre.width + 9, y : dagre.y + (dagre.height / 2) + 5 }; - } - function target(d) { - var dagre = d.target.dagre; - return { x : dagre.x, y : dagre.y + (dagre.height / 2) + 5}; - } - - this.useLineLinkPath(source, target); -} - -/** - * Draw edges using the diagonal function - */ -DagreGraphRenderer.prototype.useDiagonalLinkPath = function(source, target) { - var diagonal = d3.svg.diagonal(); - diagonal.source(source); - diagonal.target(target); - this.path = diagonal; -} - -/** - * Draw edges using the line function - */ -DagreGraphRenderer.prototype.useLineLinkPath = function(source, target) { - var line = d3.svg.line(); - this.path = function(d) { - var src = source(d); - var dst = target(d); - return line([[src.x, src.y], [dst.x, dst.y]]); } -} - -var RANK_SEPARATION = 50; - -DagreGraphRenderer.prototype.normalizeNodeYPos = function() -{ - var nodes = presenter.nodes; - function dagrey(node) { return node.dagre.y } - // Look at all the nodes and the edges and fix the height so that nodes of the same type form a row - minmaxy = nodes.map(function(d) { return [ d3.min(d, dagrey), d3.max(d, dagrey) ]}); - miny = [minmaxy[0][0]]; - // Look the levels as pairs and ensure that the min of level i+1 is > min of level i - minmaxy.reduce(function(a,b) { - var bcopy = b.slice(0); - if (bcopy[0] < a[1] + RANK_SEPARATION) { - bcopy[0] = a[1] + RANK_SEPARATION; - if (bcopy[1] < bcopy[0]) bcopy[1] = bcopy[0] + RANK_SEPARATION; - } - miny.push(bcopy[0]); - return bcopy; - }); - nodes.forEach(function(group, i) { group.forEach(function(node) { - // look at the nodes in this group. Leave the ones that have parents/children within the group alone. - // Change the y position for the other ones - if (node.dagre.y < miny[i]) node.dagre.y = miny[i]; - })}); -} - -DagreGraphRenderer.prototype.normalizeNodeXPos = function() -{ - var nodes = presenter.nodes; - function computeMinX() { - function dagrex(node) { return node.dagre.x } - function dagrexwidth(node) { return node.dagre.x + node.dagre.width } - // Look at all the nodes and the edges and fix the x pos so that nodes of the same type form a column - minmaxx = nodes.map(function(d) { return [ d3.min(d, dagrex), d3.max(d, dagrexwidth) ]}); - minx = [minmaxx[0][0]]; - // Look the levels as pairs and ensure that the min of level i+1 is > min of level i - minmaxx.reduce(function(a,b) { - var bcopy = b.slice(0); - if (bcopy[0] < a[1] + RANK_SEPARATION) { - bcopy[0] = a[1] + RANK_SEPARATION; - if (bcopy[1] < bcopy[0]) bcopy[1] = bcopy[0] + RANK_SEPARATION; - } - minx.push(bcopy[0]); - return bcopy; - }); - return minx; - } - - var minx = computeMinX(); - nodes.forEach(function(group, i) { group.forEach(function(node) { - // look at the nodes in this group. Leave the ones that have parents/children within the group alone. - // Change the y position for the other ones - if (node.dagre.x < minx[i]) { - node.dagre.x = minx[i]; - minx = computeMinX(); - } - })}); -} - -/** - * Display the sample nodes. - */ -DagreGraphRenderer.prototype.draw = function() -{ - presenter.updateState(); - var nodes = presenter.nodes; - - var viz; - // Display the graph in an SVG element - viz = presenter.root.selectAll("svg").data([nodes]); - this.viz = viz; - // Code under enter is run if there is no HTML element for a data element - viz.enter().append("svg:svg") - .attr("class", "viz") - // Create an arrowhead to put to the lines - .append("svg:defs").append("svg:marker") - .attr("id", "arrowhead") - .attr("viewBox", "0 0 10 10") - .attr("refX", "8") - .attr("refY", "5") - .attr("markerUnits", "strokeWidth") - .attr("markerHeight", "5") - .attr("orient", "auto") - .style("fill", "#333") - .append("svg:path").attr("d", "M 0 0 L 10 5 L 0 10 z"); - - // Edges -- this has to come before the nodes so that the edges are under the nodes - this.edges = this.viz.selectAll("g.edge").data([0]); - this.edges.enter().append("svg:g").attr("class", "edge"); - this.edges.exit().remove(); - - // Columns - this.columns = this.viz.selectAll("g.column").data(function(d) { return d }); - this.columns.enter().append("svg:g").attr("class", "column"); - this.columns.exit().remove(); - - // Draw the nodes so we get the bounding boxes for the nodes - this.initialDrawNodes(); - - var dagreNodes = [] - presenter.nodes.forEach(function(nodeGroup) { nodeGroup.forEach(function(d) { dagreNodes = dagreNodes.concat(d) }) }); - - dagre.layout() - .nodeSep(RANK_SEPARATION) - .edgeSep(10) - .rankSep(RANK_SEPARATION) - .rankDir("LR") - .nodes(dagreNodes) - .edges(presenter.edges) - .run(); - this.normalizeNodeXPos(); - this.redrawNodes(); - this.drawHeaders(); - this.drawEdges(); - - var vizWidth = d3.max(dagreNodes, function(d) { return d.dagre.x + d.dagre.width; }) - var vizHeight = d3.max(dagreNodes, function(d) { return d.dagre.y + d.dagre.height; }) - - // Resize the visualization - viz.attr("width", vizWidth + 20); // add space for the ring at the end - viz.attr("height", vizHeight + LINE_HEIGHT); // add a space to make it look less cramped - - // If the user clicked on a node, scroll to make it visible - if (presenter.selectedNode) { - // Figure out which element we need to scroll - var scrollWindow = (d3.select("#root").style("overflow") == "visible") - if (scrollWindow) { - var scrolledElt = $(window); - var left = $(presenter.selectedNode).position().left - 50; - scrolledElt.scrollLeft(left); - } else { - var scrolledElt = $("#root"); - var left = $(presenter.selectedNode).position().left + scrolledElt.scrollLeft() - 50; - scrolledElt.scrollLeft(left); - } - - // WebKit only - // presenter.selectedNode.scrollIntoViewIfNeeded(true); - - } -} - -/** - * Draw the headers - */ -DagreGraphRenderer.prototype.drawHeaders = function() -{ - var sampleNodeGroup = this.columns.selectAll("g.sample").data(function(d) { return d }); - var header = this.viz.selectAll("text.header").data(function(d, i) { return presenter.visibleColumns }); - header.enter().append("svg:text") - .attr("class", "header") - .attr("y", LINE_HEIGHT - 10) - .attr("text-anchor", "begin") - .style("font-weight", "bold"); - header.exit().remove(); - header - .attr("x", function(d, i) { - var nodesAtLevel = sampleNodeGroup[i]; - if (nodesAtLevel.length < 1) return 0; - if (!nodesAtLevel[0]) return 0; - var dagre = nodesAtLevel.filter(function(d) { return d != null }).map(function(d) { return d.__data__.dagre }); - - return d3.mean(dagre, function(d) { return d.x + (d.width * 0.5) }) - 1; - }) - .attr("opacity", function(d, i) { - var nodesAtLevel = sampleNodeGroup[i]; - if (nodesAtLevel.length < 1) return 0; - if (!nodesAtLevel[0]) return 0; - return 1; - }) - .text(function(d) { return d.label }); -} - -/** - * Draw the nodes - */ -DagreGraphRenderer.prototype.initialDrawNodes = function() -{ - var outEdgesGetter = presenter.outEdgesFunction(); - var sampleNodeGroup = this.columns.selectAll("g.sample").data(function(d) { return d }); - sampleNodeGroup.enter().append("svg:g") - .attr("class", "sample") - sampleNodeGroup - sampleNodeGroup.attr("transform", function(d, i) { return translate(0, LINE_HEIGHT * (i+1)) }); - sampleNodeGroup.exit() - .transition() - .style("opacity", 0).remove(); - - var sample = sampleNodeGroup.selectAll("text.sample").data(function(d) { return [d] }); - sample.enter().append("svg:text") - .attr("class", "sample") - .attr("x", "0") - .attr("y", LINE_HEIGHT) - .attr("text-anchor", "begin") - .style("cursor", "pointer") - .on("click", function(d) { presenter.openSample(this, d) }) - .transition() - .style("opacity", 1); - sample - .text(function(d) { return d.identifier }); - - var ring = sampleNodeGroup.selectAll("circle.ring").data(function(d) { return [d] }); - ring.enter().append("svg:circle") - .attr("class", "ring") - .attr("pointer-events", "all") - .attr("r", 0) - .style("cursor", "pointer") - .style("stroke-width", "2px") - ring - .attr("cx", function(d, i) { return textBBoxForDomNode(this).width + 7 }) - .attr("cy", function(d, i) { return textBBoxForDomNode(this).height - 1 }) - .style("fill", function(d) { return d.edgesVisible ? "none" : d.color}) - .style("stroke", function(d) { return d.color}) - .on("click", function(d) { presenter.toggleExpand(this, d) }); - ring - .transition() - .style("opacity", function(d) { return outEdgesGetter(d).length > 0 ? 1 : 0 }) - .attr("r", 5); - - // Update the bounding boxes - sampleNodeGroup.each(function(d) { - var bbox = this.getBBox(); - d.width = bbox.width; - d.height = bbox.height; - }); -} - -/** - * Move the nodes in their new positions. - */ -DagreGraphRenderer.prototype.redrawNodes = function() -{ - var sampleNodeGroup = this.columns.selectAll("g.sample").data(function(d) { return d }); - sampleNodeGroup - sampleNodeGroup.attr("transform", function(d, i) { return translate(d.dagre.x, d.dagre.y) }); -} - -/** - * Draw the edges - */ -DagreGraphRenderer.prototype.drawEdges = function() -{ - var link = this.edges.selectAll("path.link").data(presenter.edges); - link.enter().append("svg:path") - .attr("class", "link") - .attr("pointer-events", "none") - .style("fill", "none") - .style("stroke-width", "1.5px") - .attr("marker-end", "url(#arrowhead)") - .transition() - .style("opacity", 1); - link.exit() - .transition() - .style("opacity", 0).remove(); - link - .style("stroke", function(d) { return d.source.color}) - .attr("d", this.path); -} - - - -/// The model that manages state and implements the operations -var model; -model = new SampleGraphModel(); - -// The presenter tranlsates the model into visual elements -var presenter; - - -function enterApp(data) -{ - $('#bottom-up').click(clickedBottomUp); - $('#top-down').click(clickedTopDown); - $('#with-colors').click(clickedWithColors); - $('#no-colors').click(clickedNoColors); - $('#space-saving').click(clickedSpaceSaving); - $('#space-filling').click(clickedSpaceFilling); - presenter = new SampleGraphPresenter(model); - presenter.useBottomUpMode() - model.requestGraphData(function() { presenter.initializeGraphSamples(); presenter.draw() }); -} \ No newline at end of file diff --git a/deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/plugin.properties b/deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/plugin.properties deleted file mode 100644 index 8a3ed6bc2aede21b87cde47d3f0803467698be13..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/plugin.properties +++ /dev/null @@ -1,7 +0,0 @@ -# The properties file for an example webapps plugin -# This file has no properties defined because none need to be defined. -webapp-folder = html -label = Sample Graph -sorting = 1 -openbisui-contexts = sample-details-view -sample-entity-types = FLOWCELL, FLOWLANE, MULTIPLEX, LIBRARY, ALIQUOT, SAMPLE diff --git a/deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/dss/reporting-plugins/sample-bottom-up-data/plugin.properties b/deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/dss/reporting-plugins/sample-bottom-up-data/plugin.properties deleted file mode 100644 index 4420c9f866fd27bcd67c77237f5a96e16af7a039..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/dss/reporting-plugins/sample-bottom-up-data/plugin.properties +++ /dev/null @@ -1,3 +0,0 @@ -label = Sample Bottom Up Data -class = ch.systemsx.cisd.openbis.dss.generic.server.plugins.jython.JythonAggregationService -script-path = sample-bottom-up.py \ No newline at end of file diff --git a/deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/dss/reporting-plugins/sample-bottom-up-data/sample-bottom-up.py b/deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/dss/reporting-plugins/sample-bottom-up-data/sample-bottom-up.py deleted file mode 100644 index a698d3c98f5a0a853ac7a430f338077ff1547044..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/dss/reporting-plugins/sample-bottom-up-data/sample-bottom-up.py +++ /dev/null @@ -1,8 +0,0 @@ -"""An aggregation service that aggregates data for the sample-bottom-up display""" - -from ch.systemsx.cisd.openbis.generic.shared.api.v1.dto import SearchCriteria - -def aggregate(parameters, table_builder): - table_builder.addHeader("TEST") - row = table_builder.addRow() - row.setCell("TEST", "TEST") diff --git a/deep_sequencing_unit/source/java/ch/ethz/bsse/cisd/dsu/dss/DataSetInfoExtractor.java b/deep_sequencing_unit/source/java/ch/ethz/bsse/cisd/dsu/dss/DataSetInfoExtractor.java deleted file mode 100644 index 8c1525261d5ecf54ad9cfa5bcae04d977bd407bb..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/source/java/ch/ethz/bsse/cisd/dsu/dss/DataSetInfoExtractor.java +++ /dev/null @@ -1,115 +0,0 @@ -/* - * Copyright 2009 ETH Zuerich, CISD - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package ch.ethz.bsse.cisd.dsu.dss; - -import java.io.File; -import java.util.Arrays; -import java.util.List; -import java.util.Properties; -import java.util.regex.Matcher; -import java.util.regex.Pattern; - -import org.apache.log4j.Logger; - -import ch.systemsx.cisd.common.exceptions.EnvironmentFailureException; -import ch.systemsx.cisd.common.exceptions.UserFailureException; -import ch.systemsx.cisd.common.filesystem.FileUtilities; -import ch.systemsx.cisd.common.logging.LogCategory; -import ch.systemsx.cisd.common.logging.LogFactory; -import ch.systemsx.cisd.etlserver.DefaultDataSetInfoExtractor; -import ch.systemsx.cisd.etlserver.IDataSetInfoExtractor; -import ch.systemsx.cisd.openbis.dss.generic.shared.IEncapsulatedOpenBISService; -import ch.systemsx.cisd.openbis.dss.generic.shared.dto.DataSetInformation; -import ch.systemsx.cisd.openbis.generic.shared.dto.NewProperty; - -/** - * Extension of {@link DefaultDataSetInfoExtractor} for DSU which tries to get version information from the content and store it into the data set - * property <code>ILLUMINA_GA_OUTPUT</code>. The path to the configuration file inside a flow cell folder is specified by the property - * <code>path-to-config-file</code>. Its default value is <code>Data/Intensities/config.xml</code>. - * <p> - * If version information couldn't be fetched a warning is logged. - * - * @author Franz-Josef Elmer - */ -public class DataSetInfoExtractor implements IDataSetInfoExtractor -{ - static final String VERSION_KEY = "ILLUMINA_PIPELINE_VERSION"; - - static final String PATH_TO_CONFIG_FILE_KEY = "path-to-config-file"; - - static final String DEFAULT_PATH_TO_CONFIG_FILE = "Data/Intensities/config.xml"; - - private final static Logger operationLog = - LogFactory.getLogger(LogCategory.OPERATION, DataSetInfoExtractor.class); - - private final IDataSetInfoExtractor dataSetInfoExtractor; - - private final String pathToConfigFile; - - private final Pattern pattern; - - public DataSetInfoExtractor(Properties properties) - { - dataSetInfoExtractor = new DefaultDataSetInfoExtractor(properties); - pathToConfigFile = properties.getProperty(PATH_TO_CONFIG_FILE_KEY, DEFAULT_PATH_TO_CONFIG_FILE); - pattern = Pattern.compile(".*<Software.*Version=('|\")(.*)('|\").*"); - } - - @Override - public DataSetInformation getDataSetInformation(File incomingDataSetPath, - IEncapsulatedOpenBISService openbisService) throws UserFailureException, - EnvironmentFailureException - { - DataSetInformation info = - dataSetInfoExtractor.getDataSetInformation(incomingDataSetPath, openbisService); - File configFile = new File(incomingDataSetPath, pathToConfigFile); - if (configFile.isFile()) - { - String version = tryToExtractVersion(configFile); - if (version != null) - { - NewProperty property = new NewProperty(); - property.setPropertyCode(VERSION_KEY); - property.setValue(version); - info.setDataSetProperties(Arrays.asList(property)); - } else - { - operationLog.warn("No version found in config file '" + pathToConfigFile + "'."); - } - } else - { - operationLog.warn("Config file '" + pathToConfigFile - + "' does not exists or is a directory."); - } - return info; - } - - private String tryToExtractVersion(File configFile) - { - List<String> configFileContent = FileUtilities.loadToStringList(configFile); - for (String line : configFileContent) - { - Matcher matcher = pattern.matcher(line); - if (matcher.matches()) - { - return matcher.group(2); - } - } - return null; - } - -} diff --git a/deep_sequencing_unit/source/java/ch/ethz/bsse/cisd/dsu/dss/FlowLaneDataSetInfoExtractor.java b/deep_sequencing_unit/source/java/ch/ethz/bsse/cisd/dsu/dss/FlowLaneDataSetInfoExtractor.java deleted file mode 100644 index 8c7cce90d6e4320c552cd73051aecbead63200d5..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/source/java/ch/ethz/bsse/cisd/dsu/dss/FlowLaneDataSetInfoExtractor.java +++ /dev/null @@ -1,60 +0,0 @@ -/* - * Copyright 2010 ETH Zuerich, CISD - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package ch.ethz.bsse.cisd.dsu.dss; - -import java.io.File; -import java.util.Properties; - -import ch.systemsx.cisd.common.exceptions.EnvironmentFailureException; -import ch.systemsx.cisd.common.exceptions.UserFailureException; -import ch.systemsx.cisd.etlserver.DefaultDataSetInfoExtractor; -import ch.systemsx.cisd.etlserver.IDataSetInfoExtractor; -import ch.systemsx.cisd.openbis.dss.generic.shared.IEncapsulatedOpenBISService; -import ch.systemsx.cisd.openbis.dss.generic.shared.dto.DataSetInformation; -import ch.systemsx.cisd.openbis.generic.shared.dto.identifier.SampleIdentifier; - -/** - * @author Franz-Josef Elmer - */ -public class FlowLaneDataSetInfoExtractor implements IDataSetInfoExtractor -{ - static final String FLOW_LANE_NUMBER_SEPARATOR = "."; - - private final IDataSetInfoExtractor dataSetInfoExtractor; - - public FlowLaneDataSetInfoExtractor(Properties properties) - { - dataSetInfoExtractor = new DefaultDataSetInfoExtractor(properties); - } - - @Override - public DataSetInformation getDataSetInformation(File incomingDataSetPath, - IEncapsulatedOpenBISService openbisService) throws UserFailureException, - EnvironmentFailureException - { - DataSetInformation dataSetInformation = - dataSetInfoExtractor.getDataSetInformation(incomingDataSetPath, openbisService); - String sampleCode = dataSetInformation.getSampleCode(); - if (sampleCode != null) - { - dataSetInformation.setSampleCode(sampleCode.replace(FLOW_LANE_NUMBER_SEPARATOR, - SampleIdentifier.CONTAINED_SAMPLE_CODE_SEPARARTOR_STRING)); - } - return dataSetInformation; - } - -} diff --git a/deep_sequencing_unit/source/java/ch/ethz/bsse/cisd/dsu/dss/FlowLaneFeeder.java b/deep_sequencing_unit/source/java/ch/ethz/bsse/cisd/dsu/dss/FlowLaneFeeder.java deleted file mode 100644 index 99234754d472d22408a320353b92931a26faa092..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/source/java/ch/ethz/bsse/cisd/dsu/dss/FlowLaneFeeder.java +++ /dev/null @@ -1,493 +0,0 @@ -/* - * Copyright 2009 ETH Zuerich, CISD - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package ch.ethz.bsse.cisd.dsu.dss; - -import java.io.File; -import java.io.FileFilter; -import java.text.MessageFormat; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collection; -import java.util.Collections; -import java.util.Date; -import java.util.HashMap; -import java.util.LinkedHashMap; -import java.util.LinkedHashSet; -import java.util.List; -import java.util.Map; -import java.util.Map.Entry; -import java.util.Properties; -import java.util.Set; - -import org.apache.commons.io.FilenameUtils; -import org.apache.commons.lang3.StringUtils; -import org.apache.commons.lang3.time.DateFormatUtils; -import org.apache.log4j.Logger; - -import ch.systemsx.cisd.common.concurrent.ConcurrencyUtilities; -import ch.systemsx.cisd.common.exceptions.ConfigurationFailureException; -import ch.systemsx.cisd.common.exceptions.EnvironmentFailureException; -import ch.systemsx.cisd.common.exceptions.Status; -import ch.systemsx.cisd.common.exceptions.UserFailureException; -import ch.systemsx.cisd.common.filesystem.FastRecursiveHardLinkMaker; -import ch.systemsx.cisd.common.filesystem.FileConstants; -import ch.systemsx.cisd.common.filesystem.FileOperations; -import ch.systemsx.cisd.common.filesystem.FileUtilities; -import ch.systemsx.cisd.common.filesystem.IImmutableCopier; -import ch.systemsx.cisd.common.logging.LogCategory; -import ch.systemsx.cisd.common.logging.LogFactory; -import ch.systemsx.cisd.common.process.ProcessExecutionHelper; -import ch.systemsx.cisd.common.process.ProcessIOStrategy; -import ch.systemsx.cisd.common.process.ProcessResult; -import ch.systemsx.cisd.common.properties.ExtendedProperties; -import ch.systemsx.cisd.common.properties.PropertyUtils; -import ch.systemsx.cisd.common.time.TimingParameters; -import ch.systemsx.cisd.etlserver.AbstractPostRegistrationDataSetHandlerForFileBasedUndo; -import ch.systemsx.cisd.openbis.dss.generic.shared.IEncapsulatedOpenBISService; -import ch.systemsx.cisd.openbis.dss.generic.shared.dto.DataSetInformation; -import ch.systemsx.cisd.openbis.dss.generic.shared.utils.RSyncConfig; -import ch.systemsx.cisd.openbis.generic.shared.basic.BasicConstant; -import ch.systemsx.cisd.openbis.generic.shared.basic.TechId; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.EntityProperty; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.EntityTypePropertyType; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.IEntityProperty; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ListSampleCriteria; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.NewAttachment; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.PropertyType; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Sample; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.SampleType; -import ch.systemsx.cisd.openbis.generic.shared.dto.SampleUpdatesDTO; -import ch.systemsx.cisd.openbis.generic.shared.dto.identifier.ExperimentIdentifier; -import ch.systemsx.cisd.openbis.generic.shared.dto.identifier.SampleIdentifier; -import ch.systemsx.cisd.openbis.generic.shared.dto.identifier.SampleIdentifierFactory; - -/** - * Post registration data set handler which makes a hard-link copy of all flow-lane files to associated drop boxes. - * - * @author Franz-Josef Elmer - */ -class FlowLaneFeeder extends AbstractPostRegistrationDataSetHandlerForFileBasedUndo -{ - static final String META_DATA_FILE_TYPE = ".tsv"; - - static final String META_DATA_FILE_PREFIX = "meta-data-file-prefix"; - - static final String TRANSFER_PREFIX = "transfer."; - - static final String AFFILIATION_KEY = "AFFILIATION"; - - static final String DATA_TRANSFERRED = "DATA_TRANSFERRED"; - - static final String EXTERNAL_SAMPLE_NAME_KEY = "EXTERNAL_SAMPLE_NAME"; - - static final String FLOW_LANE_DROP_BOX_TEMPLATE = "flow-lane-drop-box-template"; - - static final String SRF_INFO_PATH = "srf-info-path"; - - static final String ENTITY_SEPARATOR_KEY = "entity-separator"; - - static final String DEFAULT_ENTITY_SEPARATOR = "_"; - - static final String SRF_FILE_EXTENSION = "srf"; - - private final static Logger operationLog = LogFactory.getLogger(LogCategory.OPERATION, - FlowLaneFeeder.class); - - private final IEncapsulatedOpenBISService service; - - private final MessageFormat flowLaneDropBoxTemplate; - - private final String metaDataFilePrefix; - - private final String entitySepaparator; - - private final IImmutableCopier copier; - - private final Map<String, File> transferDropBoxes = new HashMap<String, File>(); - - private final String srfInfoPathOrNull; - - private boolean updateDataTransferredProperty = true; - - FlowLaneFeeder(Properties properties, IEncapsulatedOpenBISService service) - { - super(FileOperations.getInstance()); - this.service = service; - flowLaneDropBoxTemplate = - new MessageFormat(PropertyUtils.getMandatoryProperty(properties, - FLOW_LANE_DROP_BOX_TEMPLATE)); - metaDataFilePrefix = PropertyUtils.getMandatoryProperty(properties, META_DATA_FILE_PREFIX); - entitySepaparator = properties.getProperty(ENTITY_SEPARATOR_KEY, DEFAULT_ENTITY_SEPARATOR); - srfInfoPathOrNull = properties.getProperty(SRF_INFO_PATH); - if (srfInfoPathOrNull != null) - { - File srfInfo = new File(srfInfoPathOrNull); - if (srfInfo.isFile() == false) - { - throw new ConfigurationFailureException("File '" + srfInfo.getAbsolutePath() - + "' does not exists or is a folder."); - } - } - copier = FastRecursiveHardLinkMaker.tryCreate(TimingParameters.getDefaultParameters(), - RSyncConfig.getInstance().getAdditionalCommandLineOptions()); - Properties transferDropBoxMapping = - ExtendedProperties.getSubset(properties, TRANSFER_PREFIX, true); - Set<Entry<Object, Object>> entries = transferDropBoxMapping.entrySet(); - for (Entry<Object, Object> entry : entries) - { - String affiliation = entry.getKey().toString(); - String dropBoxPath = entry.getValue().toString(); - File dropBox = new File(dropBoxPath); - if (dropBox.isDirectory() == false) - { - throw new EnvironmentFailureException("Transfer drop box for " + affiliation - + " doen't exist or isn't a folder: " + dropBox.getAbsolutePath()); - } - transferDropBoxes.put(affiliation, dropBox); - } - } - - void setUpdateDataTransferredProperty(boolean updateDataTransferredProperty) - { - this.updateDataTransferredProperty = updateDataTransferredProperty; - } - - @Override - public Status handle(File originalData, DataSetInformation dataSetInformation, - Map<String, String> parameterBindings) - { - Map<String, Sample> flowLaneSampleMap = createFlowLaneSampleMap(dataSetInformation); - String flowcellID = originalData.getName(); - List<File> srfFiles = new ArrayList<File>(); - FileUtilities.findFiles(originalData, srfFiles, createSrfFileFilter()); - if (srfFiles.size() < flowLaneSampleMap.size()) - { - throw new EnvironmentFailureException("Only " + srfFiles.size() - + " flow lane files found instead of " + flowLaneSampleMap.size() + "."); - } - Set<String> processedFlowLanes = new LinkedHashSet<String>(); - for (File srfFile : srfFiles) - { - List<String> srfInfo = getSRFInfo(srfFile); - String flowLane = extractFlowLane(srfFile); - if (processedFlowLanes.contains(flowLane)) - { - throw new UserFailureException("Flow lane " + flowLane + " already registered."); - } - Sample flowLaneSample = flowLaneSampleMap.get(flowLane); - if (flowLaneSample == null) - { - throw new UserFailureException("No flow lane sample for flow lane " + flowLane - + " found."); - } - File flowLaneDropBox = createDropBoxFile(flowLane); - String fileName = - flowLaneSample.getSpace().getCode() + entitySepaparator + flowcellID - + FlowLaneDataSetInfoExtractor.FLOW_LANE_NUMBER_SEPARATOR + flowLane; - File flowLaneDataSet = new File(flowLaneDropBox, fileName); - if (flowLaneDataSet.exists()) - { - throw new EnvironmentFailureException("There is already a data set for flow lane " - + flowLane + "."); - } - addFileForUndo(flowLaneDataSet); - boolean success = flowLaneDataSet.mkdir(); - if (success == false) - { - throw new EnvironmentFailureException("Couldn't create folder '" - + flowLaneDataSet.getAbsolutePath() + "'."); - } - - createHardLink(srfFile, flowLaneDataSet); - createMetaDataFileAndHardLinkInTransferDropBox(flowLaneDataSet, flowLaneSample, - flowLane, srfInfo); - - // store additional flow lane files - List<File> flowLaneFiles = new ArrayList<File>(); - FileUtilities.findFiles(originalData, flowLaneFiles, - createPrefixFileFilter(FilenameUtils.getBaseName(srfFile.getName()))); - for (File file : flowLaneFiles) - { - if (FilenameUtils.getExtension(file.getName()).equals(SRF_FILE_EXTENSION) == false) - { - createHardLink(file, flowLaneDataSet); - } - } - - if (updateDataTransferredProperty) - { - service.updateSample(createUpdates(flowLaneSample, - createDataTransferredProperty(flowLaneSample))); - } - - File markerFile = - new File(flowLaneDropBox, FileConstants.IS_FINISHED_PREFIX + fileName); - addFileForUndo(markerFile); - FileUtilities.writeToFile(markerFile, ""); - if (operationLog.isInfoEnabled()) - { - operationLog.info("Flow lane file '" + srfFile - + "' successfully dropped into drop box '" + flowLaneDropBox + "' as '" - + flowLaneDataSet.getName() + "'."); - } - processedFlowLanes.add(flowLane); - } - return Status.OK; - } - - private List<String> getSRFInfo(File file) - { - if (srfInfoPathOrNull == null) - { - return Collections.emptyList(); - } - List<String> command = Arrays.asList(srfInfoPathOrNull, "-l1", file.getAbsolutePath()); - ProcessResult result = - ProcessExecutionHelper.run(command, operationLog, operationLog, - ConcurrencyUtilities.NO_TIMEOUT, ProcessIOStrategy.DEFAULT_IO_STRATEGY, - true); - List<String> output = result.getOutput(); - if (result.isOK() == false) - { - StringBuilder builder = new StringBuilder(); - String startupFailureMessage = result.getStartupFailureMessage(); - if (StringUtils.isNotBlank(startupFailureMessage)) - { - builder.append("\nStartup failure message:").append(startupFailureMessage); - } - builder.append("\nStandard out and error:"); - for (String outputLine : output) - { - builder.append("\n").append(outputLine); - } - throw new UserFailureException("Invalid SRF file '" + file.getAbsolutePath() + "':" - + builder); - } - return output; - } - - private Map<String, Sample> createFlowLaneSampleMap(DataSetInformation dataSetInformation) - { - SampleIdentifier sampleIdentifier = dataSetInformation.getSampleIdentifier(); - Sample flowCell = service.tryGetSampleWithExperiment(sampleIdentifier); - if (flowCell == null) - { - throw new UserFailureException("Unkown flow cell sample: " + sampleIdentifier); - } - TechId flowCellID = new TechId(flowCell.getId()); - ListSampleCriteria criteria = ListSampleCriteria.createForContainer(flowCellID); - List<Sample> flowLaneSamples = service.listSamples(criteria); - Map<String, Sample> flowLaneSampleMap = new LinkedHashMap<String, Sample>(); - for (Sample flowLaneSample : flowLaneSamples) - { - flowLaneSampleMap.put(flowLaneSample.getSubCode(), flowLaneSample); - } - return flowLaneSampleMap; - } - - private void createMetaDataFileAndHardLinkInTransferDropBox(File flowLaneDataSet, - Sample flowLaneSample, String flowLane, List<String> srfInfo) - { - if (flowLaneSample == null) - { - throw new UserFailureException("No flow lane sample for flow lane " + flowLane - + " exists"); - } - StringBuilder builder = new StringBuilder(); - addLine(builder, "Parent", flowLaneSample.getGeneratedFrom().getIdentifier()); - addLine(builder, "Code", flowLaneSample.getCode()); - addLine(builder, "Contact Person Email", flowLaneSample.getRegistrator().getEmail()); - SampleIdentifier identifier = SampleIdentifierFactory.parse(flowLaneSample.getIdentifier()); - IEntityProperty[] propertiesOrNull = - service.tryGetPropertiesOfTopSample(identifier); - File dropBox = null; - if (propertiesOrNull != null) - { - for (IEntityProperty property : propertiesOrNull) - { - PropertyType propertyType = property.getPropertyType(); - String value = property.tryGetAsString(); - addLine(builder, propertyType.getCode(), value); - String code = propertyType.getCode(); - if (code.equals(AFFILIATION_KEY)) - { - dropBox = transferDropBoxes.get(value); - } - } - } - if (srfInfo.isEmpty() == false) - { - builder.append("\n==== SRF Info ====\t\n"); - for (String line : srfInfo) - { - builder.append(line).append("\t\n"); - } - } - String sampleCode = flowLaneSample.getCode(); - String metaFileName = - metaDataFilePrefix + escapeSampleCode(sampleCode) + META_DATA_FILE_TYPE; - FileUtilities.writeToFile(new File(flowLaneDataSet, metaFileName), builder.toString()); - copyToDropBox(dropBox, flowLaneDataSet); - } - - private IEntityProperty createDataTransferredProperty(Sample flowLaneSample) - { - final PropertyType propertyType = extractDataTransferredProperty(flowLaneSample); - final String currentDate = - DateFormatUtils.format(new Date(), BasicConstant.CANONICAL_DATE_FORMAT_PATTERN); - - final IEntityProperty result = new EntityProperty(); - result.setPropertyType(propertyType); - result.setValue(currentDate); - return result; - } - - private PropertyType extractDataTransferredProperty(Sample flowLaneSample) - { - SampleType flowLaneType = service.getSampleType(flowLaneSample.getSampleType().getCode()); - PropertyType propertyType = null; - for (EntityTypePropertyType<SampleType> entityTypePropertyType : flowLaneType - .getAssignedPropertyTypes()) - { - if (entityTypePropertyType.getPropertyType().getCode().equals(DATA_TRANSFERRED)) - { - propertyType = entityTypePropertyType.getPropertyType(); - } - } - if (propertyType == null) - { - throw new UserFailureException(DATA_TRANSFERRED - + " property type doesn't exist or is not assigned to Flow Lane samples"); - } - return propertyType; - } - - public static SampleUpdatesDTO createUpdates(Sample sample, IEntityProperty newEntityProperty) - { - final TechId sampleId = TechId.create(sample); - final List<IEntityProperty> properties = - new ArrayList<IEntityProperty>(sample.getProperties()); - properties.add(newEntityProperty); - final ExperimentIdentifier experimentIdentifierOrNull = - (sample.getExperiment() != null) ? new ExperimentIdentifier(sample.getExperiment()) - : null; - final Collection<NewAttachment> attachments = new ArrayList<NewAttachment>(); - final int version = sample.getVersion(); - final SampleIdentifier sampleIdentifier = - SampleIdentifierFactory.parse(sample.getIdentifier()); - final String containerIdentifierOrNull = - (sample.getContainer() != null) ? sample.getContainer().getIdentifier() : null; - final String[] modifiedParentCodesOrNull = null; - return new SampleUpdatesDTO(sampleId, properties, experimentIdentifierOrNull, null, attachments, - version, sampleIdentifier, containerIdentifierOrNull, modifiedParentCodesOrNull); - } - - private void copyToDropBox(File dropBoxOrNull, File flowLaneDataSet) - { - if (dropBoxOrNull != null) - { - File[] files = flowLaneDataSet.listFiles(); - for (File file : files) - { - createHardLink(file, dropBoxOrNull); - addFileForUndo(new File(dropBoxOrNull, file.getName())); - } - if (operationLog.isInfoEnabled()) - { - operationLog.info("Flow lane data set '" + flowLaneDataSet.getName() - + "' successfully transfered to drop box '" + dropBoxOrNull + "'"); - } - } - } - - static String escapeSampleCode(String sampleCode) - { - return sampleCode == null ? null : sampleCode.replace( - SampleIdentifier.CONTAINED_SAMPLE_CODE_SEPARARTOR_STRING, "_"); - } - - private void addLine(StringBuilder builder, String key, String value) - { - builder.append(key).append('\t').append(value).append('\n'); - } - - private void createHardLink(File file, File folder) - { - final Status status = copier.copyImmutably(file, folder, null); - if (status.isError()) - { - throw new EnvironmentFailureException("Couldn't create a hard-link copy of '" - + file.getAbsolutePath() + "' in folder '" + folder.getAbsolutePath() + "'. [" - + status + "]"); - } - } - - private File createDropBoxFile(String flowLane) - { - File dropBox = new File(flowLaneDropBoxTemplate.format(new Object[] { flowLane })); - if (dropBox.exists() == false) - { - throw new ConfigurationFailureException("Drop box '" + dropBox + "' does not exist."); - } - if (dropBox.isDirectory() == false) - { - throw new ConfigurationFailureException("Drop box '" + dropBox - + "' is not a directory."); - } - return dropBox; - } - - private String extractFlowLane(File file) - { - String name = file.getName(); - String nameWithoutType = name.substring(0, name.lastIndexOf('.')); - int lastIndexOfUnderScore = nameWithoutType.lastIndexOf('_'); - String flowLane = nameWithoutType; - if (lastIndexOfUnderScore >= 0) - { - flowLane = nameWithoutType.substring(lastIndexOfUnderScore + 1); - } - return flowLane; - } - - private FileFilter createSrfFileFilter() - { - return new FileFilter() - { - @Override - public boolean accept(File file) - { - return file.isFile() - && FilenameUtils.getExtension(file.getName()) - .equals(SRF_FILE_EXTENSION); - } - }; - } - - private FileFilter createPrefixFileFilter(final String prefix) - { - return new FileFilter() - { - @Override - public boolean accept(File file) - { - return file.getName().startsWith(prefix); - } - }; - } - -} diff --git a/deep_sequencing_unit/source/java/ch/ethz/bsse/cisd/dsu/dss/StorageProcessor.java b/deep_sequencing_unit/source/java/ch/ethz/bsse/cisd/dsu/dss/StorageProcessor.java deleted file mode 100644 index 5391e9990f90a360a345e183e41df291090f1f46..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/source/java/ch/ethz/bsse/cisd/dsu/dss/StorageProcessor.java +++ /dev/null @@ -1,44 +0,0 @@ -/* - * Copyright 2009 ETH Zuerich, CISD - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package ch.ethz.bsse.cisd.dsu.dss; - -import java.util.Properties; - -import ch.systemsx.cisd.etlserver.DelegatingStorageProcessorWithDropbox; -import ch.systemsx.cisd.openbis.dss.generic.shared.IPostRegistrationDatasetHandler; -import ch.systemsx.cisd.openbis.dss.generic.shared.ServiceProvider; - -/** - * Storage processor which feeds flow-line drop boxes. Needs the property <code>flow-line-drop-box-template</code>. A <code>{0}</code> is the place - * holder for the flow-line number. - * - * @author Franz-Josef Elmer - */ -public class StorageProcessor extends DelegatingStorageProcessorWithDropbox -{ - public StorageProcessor(Properties properties) - { - super(properties); - } - - @Override - public IPostRegistrationDatasetHandler createPostRegistrationDataSetHandler() - { - return new FlowLaneFeeder(properties, ServiceProvider.getOpenBISService()); - } - -} diff --git a/deep_sequencing_unit/source/java/ch/ethz/bsse/cisd/dsu/dss/plugins/ChipResultsSummary.java b/deep_sequencing_unit/source/java/ch/ethz/bsse/cisd/dsu/dss/plugins/ChipResultsSummary.java deleted file mode 100644 index eadc082e447266c278ffc090e0e1770301cfe8be..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/source/java/ch/ethz/bsse/cisd/dsu/dss/plugins/ChipResultsSummary.java +++ /dev/null @@ -1,89 +0,0 @@ -/* - * Copyright 2010 ETH Zuerich, CISD - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package ch.ethz.bsse.cisd.dsu.dss.plugins; - -import javax.xml.bind.annotation.XmlElement; - -/** - * <pre> - * <ChipResultsSummary> - * <clusterCountPF>98792458</clusterCountPF> - * <clusterCountRaw>158466917</clusterCountRaw> - * <densityRatio>3556528488</densityRatio> - * <yield>3556528488</yield> - * </ChipResultsSummary> - * <Software>CASAVA-1.7.0</Software> - * </pre> - * - * @author Manuel Kohler - */ - -class ChipResultsSummary -{ - private Long clusterCountPF = 0L; - - private Long clusterCountRaw = 0L; - - private Long yield = 0L; - - private Double densityRatio = 0.0; - - @XmlElement(name = "clusterCountPF") - public Long getClusterCountPF() - { - return clusterCountPF; - } - - public void setClusterCountPF(Long clusterCountPF) - { - this.clusterCountPF = clusterCountPF; - } - - @XmlElement(name = "clusterCountRaw") - public Long getClusterCountRaw() - { - return clusterCountRaw; - } - - public void setClusterCountRaw(Long clusterCountRaw) - { - this.clusterCountRaw = clusterCountRaw; - } - - @XmlElement(name = "yield") - public Long getYield() - { - return yield; - } - - public void setYield(Long yield) - { - this.yield = yield; - } - - @XmlElement(name = "densityRatio") - public Double getDensityRatio() - { - return densityRatio; - } - - public void setDensityRatio(Double densityRatio) - { - this.densityRatio = densityRatio; - } - -} diff --git a/deep_sequencing_unit/source/java/ch/ethz/bsse/cisd/dsu/dss/plugins/ChipSummary.java b/deep_sequencing_unit/source/java/ch/ethz/bsse/cisd/dsu/dss/plugins/ChipSummary.java deleted file mode 100644 index f749f17e9265c5dcc3827a3eeba5a09f4d6e0951..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/source/java/ch/ethz/bsse/cisd/dsu/dss/plugins/ChipSummary.java +++ /dev/null @@ -1,72 +0,0 @@ -/* - * Copyright 2010 ETH Zuerich, CISD - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package ch.ethz.bsse.cisd.dsu.dss.plugins; - -import javax.xml.bind.annotation.XmlElement; - -/** - * <pre> - * <ChipSummary> - * <ChipID>708KLAAXX</ChipID> - * <Machine>BS-DSU_ELLAC</Machine> - * <RunFolder>101006_708KLAAXX</RunFolder> - * </ChipSummary> - * </pre> - * - * @author Manuel Kohler - */ -class ChipSummary -{ - private String chipID = ""; - - private String machine = ""; - - private String runFolder = ""; - - @XmlElement(name = "ChipID") - public String getChipID() - { - return chipID; - } - - public void setChipID(String chipID) - { - this.chipID = chipID; - } - - @XmlElement(name = "Machine") - public String getMachine() - { - return machine; - } - - public void setMachine(String machine) - { - this.machine = machine; - } - - @XmlElement(name = "RunFolder") - public String getRunFolder() - { - return runFolder; - } - - public void setRunFolder(String runFolder) - { - this.runFolder = runFolder; - } -} \ No newline at end of file diff --git a/deep_sequencing_unit/source/java/ch/ethz/bsse/cisd/dsu/dss/plugins/DataSetToSOFT.java b/deep_sequencing_unit/source/java/ch/ethz/bsse/cisd/dsu/dss/plugins/DataSetToSOFT.java deleted file mode 100644 index 8ceb0a016b96dcea92911c69d5282f652deb3b61..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/source/java/ch/ethz/bsse/cisd/dsu/dss/plugins/DataSetToSOFT.java +++ /dev/null @@ -1,360 +0,0 @@ -/* - * Copyright 2010 ETH Zuerich, CISD - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package ch.ethz.bsse.cisd.dsu.dss.plugins; - -import java.io.File; -import java.io.FileInputStream; -import java.io.IOException; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Properties; - -import javax.activation.DataHandler; -import javax.activation.DataSource; -import javax.mail.util.ByteArrayDataSource; - -import org.apache.log4j.Logger; - -import ch.rinn.restrictions.Private; -import ch.systemsx.cisd.base.exceptions.CheckedExceptionTunnel; -import ch.systemsx.cisd.common.exceptions.Status; -import ch.systemsx.cisd.common.logging.LogCategory; -import ch.systemsx.cisd.common.logging.LogFactory; -import ch.systemsx.cisd.common.mail.EMailAddress; -import ch.systemsx.cisd.common.security.MD5ChecksumCalculator; -import ch.systemsx.cisd.common.string.Template; -import ch.systemsx.cisd.openbis.dss.generic.shared.DataSetProcessingContext; -import ch.systemsx.cisd.openbis.dss.generic.shared.IEncapsulatedOpenBISService; -import ch.systemsx.cisd.openbis.dss.generic.shared.IProcessingPluginTask; -import ch.systemsx.cisd.openbis.dss.generic.shared.ProcessingStatus; -import ch.systemsx.cisd.openbis.dss.generic.shared.ServiceProvider; -import ch.systemsx.cisd.openbis.generic.shared.basic.TechId; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.AbstractExternalData; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.IEntityProperty; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ListSampleCriteria; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Sample; -import ch.systemsx.cisd.openbis.generic.shared.dto.DatasetDescription; -import ch.systemsx.cisd.openbis.generic.shared.dto.identifier.SampleIdentifier; -import ch.systemsx.cisd.openbis.generic.shared.dto.identifier.SampleIdentifierFactory; - -/** - * Processing plugin for exporting meta data of a flow lane as a SOFT file. - * - * @author Franz-Josef Elmer - */ -public class DataSetToSOFT implements IProcessingPluginTask -{ - @Private - static final String EXTERNAL_SAMPLE_NAME_PROPERTY = "EXTERNAL_SAMPLE_NAME"; - - private static final String EMPTY = "<<<NEED_TO_BE_FILLED>>>"; - - @Private - static final Template SOFT_FILE_NAME_TEMPLATE = new Template( - "${flow-lane}_${external-sample-name}_SOFT.txt"); - - @Private - static final Template E_MAIL_SUBJECT_TEMPLATE = new Template( - "SOFT file for '${external-sample-name}'"); - - @Private - static final Template E_MAIL_CONTENT_TEMPLATE = new Template("Dear User\n\n" - + "Enclosed you will find the SOFT file for '${external-sample-name}'.\n" - + "Flow lane: ${flow-lane}\nData Set: ${data-set}"); - - private static final class SOFTBuilder - { - private final StringBuilder builder = new StringBuilder(); - - void addSample(Sample sample, String propertyTypeCode) - { - addLine('^', "SAMPLE", getProperty(sample, propertyTypeCode)); - } - - void addSampleProperty(String key, Sample sample, String propertyTypeCode, - Map<String, String> translation) - { - String property = getProperty(sample, propertyTypeCode); - String translatedProperty = translation.get(property); - addProperty(key, translatedProperty == null ? property : translatedProperty); - } - - void addSampleProperty(String key, Sample sample, String propertyTypeCode) - { - addProperty(key, getProperty(sample, propertyTypeCode)); - } - - void addProperty(String key, String property) - { - addLine('!', "Sample_" + key, property); - } - - private void addLine(char prefix, String key, String value) - { - builder.append(prefix).append(key).append(" = ").append(value).append('\n'); - } - - private String getProperty(Sample sample, String propertyTypeCode) - { - String property = tryToGetProperty(sample, propertyTypeCode); - return property == null ? EMPTY : property; - } - - @Override - public String toString() - { - return builder.toString(); - } - } - - private static final String tryToGetProperty(Sample sample, String propertyTypeCode) - { - List<IEntityProperty> properties = sample.getProperties(); - for (IEntityProperty property : properties) - { - if (property.getPropertyType().getCode().equals(propertyTypeCode)) - { - return property.tryGetAsString(); - } - } - return null; - } - - private static final Logger operationLog = LogFactory.getLogger(LogCategory.OPERATION, - DataSetToSOFT.class); - - private static final long serialVersionUID = 1L; - - private final Map<String, String> translation; - - private transient IEncapsulatedOpenBISService service; - - public DataSetToSOFT(Properties properties, File storeRoot) - { - translation = new HashMap<String, String>(); - translation.put("GENOMIC_DNA", "genomic"); - translation.put("FRAGMENTED_GENOMIC_DNA", "genomic"); - translation.put("CHIP", "genomic"); - translation.put("BISULFITE", "genomic"); - translation.put("NON_GENOMIC", "non-genomic"); - translation.put("SYNTHETIC", "synthetic"); - translation.put("VIRAL_RNA", "viral RNA"); - translation.put("SMALL_RNA", "other"); - translation.put("TOTAL_RNA", "other"); - translation.put("MRNA", "other"); - translation.put("PROCESSED_DNA_LIBRARY", EMPTY); - } - - @Override - public ProcessingStatus process(List<DatasetDescription> datasets, - DataSetProcessingContext context) - { - EMailAddress address = new EMailAddress(context.getUserEmailOrNull()); - ProcessingStatus status = new ProcessingStatus(); - for (DatasetDescription datasetDescription : datasets) - { - try - { - String dataSetCode = datasetDescription.getDataSetCode(); - if (operationLog.isInfoEnabled()) - { - operationLog.info("Create SOFT file for data set " + dataSetCode); - } - AbstractExternalData srfDataSet = getService().tryGetDataSet(dataSetCode); - Sample flowLaneSample = getFlowLaneSample(srfDataSet); - Sample flowCellSample = getFlowCellSample(flowLaneSample); - Sample sequencingSample = getSequencingSample(flowLaneSample); - File srfFile = tryToFindSrfFile(datasetDescription, context); - if (srfFile == null) - { - status.addDatasetStatus(datasetDescription, - Status.createError("Data set " + dataSetCode + " has no srf file.")); - continue; - } - String checkSum = calculateCheckSum(srfFile); - - SOFTBuilder softBuilder = new SOFTBuilder(); - softBuilder.addSample(sequencingSample, EXTERNAL_SAMPLE_NAME_PROPERTY); - softBuilder.addProperty("type", "SRA"); - softBuilder.addSampleProperty("title", sequencingSample, - EXTERNAL_SAMPLE_NAME_PROPERTY); - softBuilder - .addSampleProperty("source_name", sequencingSample, "SAMPLE_SOURCE_NAME"); - softBuilder.addSampleProperty("organism", sequencingSample, - "NCBI_ORGANISM_TAXONOMY"); - softBuilder.addSampleProperty("characteristics", sequencingSample, - "SAMPLE_CHARACTERISTICS"); - softBuilder.addSampleProperty("biomaterial_provider", sequencingSample, - "CONTACT_PERSON_NAME"); - softBuilder.addSampleProperty("molecule", sequencingSample, "SAMPLE_MOLECULE"); - softBuilder.addSampleProperty("extract_protocol", sequencingSample, - "SAMPLE_EXTRACT_PROTOCOL"); - softBuilder.addSampleProperty("data_processing", sequencingSample, - "SAMPLE_DATA_PROCESSING"); - softBuilder.addSampleProperty("library_strategy", sequencingSample, - "SAMPLE_LIBRARY_STRATEGY"); - softBuilder.addSampleProperty("library_source", sequencingSample, "SAMPLE_KIND", - translation); - softBuilder.addSampleProperty("library_selection", sequencingSample, - "SAMPLE_LIBRARY_SELECTION"); - softBuilder - .addSampleProperty("instrument_model", flowCellSample, "GENOME_ANALYZER"); - softBuilder.addProperty("raw_file_1", srfFile.getName()); - softBuilder.addProperty("raw_file_type_1", "srf"); - softBuilder.addProperty("file_checksum_1", checkSum); - - String subject = createSubject(sequencingSample); - String content = createContent(sequencingSample, flowLaneSample, srfDataSet); - String fileName = createSoftFileName(sequencingSample, flowLaneSample); - DataSource dataSource = createDataSource(softBuilder.toString()); - context.getMailClient().sendEmailMessageWithAttachment(subject, content, fileName, - new DataHandler(dataSource), null, null, address); - status.addDatasetStatus(datasetDescription, Status.OK); - } catch (Exception ex) - { - status.addDatasetStatus(datasetDescription, - Status.createError("Exception occured: " + ex)); - operationLog.error("Exception occured while processing " + datasetDescription, ex); - } - } - return status; - } - - private String createSubject(Sample sequencingSample) - { - Template template = E_MAIL_SUBJECT_TEMPLATE.createFreshCopy(); - bindExternalSampleName(template, sequencingSample); - return template.createText(); - } - - private String createContent(Sample sequencingSample, Sample flowLaneSample, - AbstractExternalData dataSet) - { - Template template = E_MAIL_CONTENT_TEMPLATE.createFreshCopy(); - bindExternalSampleName(template, sequencingSample); - template.bind("flow-lane", flowLaneSample.getIdentifier()); - template.bind("data-set", dataSet.getCode()); - return template.createText(); - } - - private String createSoftFileName(Sample sequencingSample, Sample flowLaneSample) - { - Template template = SOFT_FILE_NAME_TEMPLATE.createFreshCopy(); - String externalSampleName = - tryToGetProperty(sequencingSample, EXTERNAL_SAMPLE_NAME_PROPERTY); - template.bind("external-sample-name", externalSampleName.replace(' ', '_')); - template.bind("flow-lane", flowLaneSample.getCode().replace(':', '-')); - return template.createText(); - } - - private void bindExternalSampleName(Template template, Sample sequencingSample) - { - String externalSampleName = - tryToGetProperty(sequencingSample, EXTERNAL_SAMPLE_NAME_PROPERTY); - template.bind("external-sample-name", externalSampleName); - } - - private String calculateCheckSum(File srfFile) - { - String checkSum; - try - { - checkSum = MD5ChecksumCalculator.calculate(new FileInputStream(srfFile)); - } catch (IOException ex) - { - throw CheckedExceptionTunnel.wrapIfNecessary(ex); - } - return checkSum; - } - - private File tryToFindSrfFile(DatasetDescription datasetDescription, - DataSetProcessingContext context) - { - return tryToFindSrfFile(context.getDirectoryProvider().getDataSetDirectory( - datasetDescription)); - } - - private File tryToFindSrfFile(File file) - { - if (file.isFile() && file.getName().endsWith(".srf")) - { - return file; - } - if (file.isDirectory()) - { - File[] files = file.listFiles(); - for (File child : files) - { - File srfFile = tryToFindSrfFile(child); - if (srfFile != null) - { - return srfFile; - } - } - } - return null; - } - - private Sample getFlowLaneSample(AbstractExternalData dataSet) - { - SampleIdentifier identifier = SampleIdentifierFactory.parse(dataSet.getSampleIdentifier()); - return getService().tryGetSampleWithExperiment(identifier); - } - - private Sample getFlowCellSample(Sample flowLaneSample) - { - SampleIdentifier identifier = - SampleIdentifierFactory.parse(flowLaneSample.getContainer().getIdentifier()); - return getService().tryGetSampleWithExperiment(identifier); - } - - private Sample getSequencingSample(Sample flowLaneSample) - { - List<Sample> parents = - getService().listSamples( - ListSampleCriteria.createForChild(new TechId(flowLaneSample.getId()))); - return parents.get(0); - } - - private DataSource createDataSource(final String softData) - { - try - { - return new ByteArrayDataSource(softData, "text/plain"); - } catch (IOException ex) - { - throw CheckedExceptionTunnel.wrapIfNecessary(ex); - } - } - - private IEncapsulatedOpenBISService getService() - { - if (service == null) - { - service = ServiceProvider.getOpenBISService(); - } - return service; - } - - // for tests - void setService(IEncapsulatedOpenBISService service) - { - this.service = service; - } - -} diff --git a/deep_sequencing_unit/source/java/ch/ethz/bsse/cisd/dsu/dss/plugins/Date.java b/deep_sequencing_unit/source/java/ch/ethz/bsse/cisd/dsu/dss/plugins/Date.java deleted file mode 100644 index 9dff47c8e54e204e3c66913a7529c23e7d4b90f0..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/source/java/ch/ethz/bsse/cisd/dsu/dss/plugins/Date.java +++ /dev/null @@ -1,38 +0,0 @@ -/* Copyright 2010 ETH Zuerich, CISD - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package ch.ethz.bsse.cisd.dsu.dss.plugins; - -import javax.xml.bind.annotation.XmlElement; - -/* - * @author Manuel Kohler - */ -class Date -{ - private String Date; - - @XmlElement - public String getDate() - { - return Date; - } - - public void setDate(String date) - { - this.Date = date; - } - -} diff --git a/deep_sequencing_unit/source/java/ch/ethz/bsse/cisd/dsu/dss/plugins/IlluminaSummary.java b/deep_sequencing_unit/source/java/ch/ethz/bsse/cisd/dsu/dss/plugins/IlluminaSummary.java deleted file mode 100644 index 9226df41972b2b457ac0f807007555f65f0d3f81..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/source/java/ch/ethz/bsse/cisd/dsu/dss/plugins/IlluminaSummary.java +++ /dev/null @@ -1,134 +0,0 @@ -/* - * Copyright 2010 ETH Zuerich, CISD - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package ch.ethz.bsse.cisd.dsu.dss.plugins; - -import javax.xml.bind.annotation.XmlElement; -import javax.xml.bind.annotation.XmlRootElement; - -/** - * Note: Not all XML Elements are read in - * - * <pre> - * <Summary> - * <ChipResultsSummary> - * ... - * </ChipResultsSummary> - * ... - * <ChipSummary> - * ... - * </ChipSummary> - * ... - * <Date> - * ... - * </Date> - * ... - * <ExpandedLaneSummary> - * ... - * </ExpandedLaneSummary> - * ... - * <LaneParameterSummary> - * ... - * </LaneParameterSummary> - * ... - * <LaneResultsSummary> - * ... - * </LaneResultsSummary> - * ... - * <Software>CASAVA-1.7.0</Software> - * ... - * <TileErrorsByLane> - * ... - * </TileErrorsByLane> - * ... - * <TileResultsByLane> - * ... - * </TileResultsByLane> - * ... - * <Summary> - * </pre> - * - * @author Manuel Kohler - */ - -@XmlRootElement(name = "Summary") -class IlluminaSummary -{ - private ChipResultsSummary chipResultsSummary; - - private LaneResultsSummary LaneResultsSummary; - - private ChipSummary chipSummary; - - private String Software = ""; - - private String Date = ""; - - @XmlElement(name = "ChipResultsSummary") - public ChipResultsSummary getChipResultsSummary() - { - return chipResultsSummary; - } - - public void setChipResultsSummary(ChipResultsSummary chipResultsSummary) - { - this.chipResultsSummary = chipResultsSummary; - } - - @XmlElement(name = "LaneResultsSummary") - public LaneResultsSummary getLaneResultsSummary() - { - return LaneResultsSummary; - } - - public void setLaneResultsSummary(LaneResultsSummary laneResultsSummary) - { - this.LaneResultsSummary = laneResultsSummary; - } - - @XmlElement(name = "ChipSummary") - public ChipSummary getChipSummary() - { - return chipSummary; - } - - public void setChipSummary(ChipSummary chipSummary) - { - this.chipSummary = chipSummary; - } - - @XmlElement(name = "Software") - public String getSoftware() - { - return Software; - } - - public void setSoftware(String software) - { - this.Software = software; - } - - @XmlElement(name = "Date") - public String getDate() - { - return Date; - } - - public void setDate(String date) - { - this.Date = date; - } -} diff --git a/deep_sequencing_unit/source/java/ch/ethz/bsse/cisd/dsu/dss/plugins/IlluminaSummaryReportingPlugin.java b/deep_sequencing_unit/source/java/ch/ethz/bsse/cisd/dsu/dss/plugins/IlluminaSummaryReportingPlugin.java deleted file mode 100644 index 7a5ecbf472d2a14535f7b3f72f5299b55a111083..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/source/java/ch/ethz/bsse/cisd/dsu/dss/plugins/IlluminaSummaryReportingPlugin.java +++ /dev/null @@ -1,302 +0,0 @@ -/* - * Copyright 2009 ETH Zuerich, CISD - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package ch.ethz.bsse.cisd.dsu.dss.plugins; - -import java.io.File; -import java.io.FileFilter; -import java.util.ArrayList; -import java.util.List; -import java.util.Properties; - -import ch.systemsx.cisd.common.exceptions.EnvironmentFailureException; -import ch.systemsx.cisd.common.xml.JaxbXmlParser; -import ch.systemsx.cisd.openbis.dss.generic.server.plugins.standard.AbstractTableModelReportingPlugin; -import ch.systemsx.cisd.openbis.dss.generic.shared.DataSetProcessingContext; -import ch.systemsx.cisd.openbis.dss.generic.shared.ServiceProvider; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DoubleTableCell; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.IEntityProperty; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ISerializableComparable; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.IntegerTableCell; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Sample; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.StringTableCell; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.TableModel; -import ch.systemsx.cisd.openbis.generic.shared.dto.DatasetDescription; -import ch.systemsx.cisd.openbis.generic.shared.dto.identifier.SampleIdentifier; -import ch.systemsx.cisd.openbis.generic.shared.dto.identifier.SpaceIdentifier; -import ch.systemsx.cisd.openbis.generic.shared.util.SimpleTableModelBuilder; - -/** - * Reporting plugin which shows numbers of the Summary.xml file generated from the Illumina Sequencer. The structure of the Summary file has changed - * from Casava 1.6 to 1.7 so some XML elements are not available in the old files. - * - * @author Manuel Kohler - */ -public class IlluminaSummaryReportingPlugin extends AbstractTableModelReportingPlugin -{ - private static final String UNALIGNED_PATH = "/Unaligned_no_mismatch"; - - private static final int MEGA = 1000000; - - private static final int KILO = 1000; - - private static final long serialVersionUID = 1L; - - private static final String SUMMARY_FILE_NAME = "Summary.xml"; - - private static final String BUSTARD_SUMMARY_FILE_NAME = "BustardSummary.xml"; - - private static final String DATA_INTENSITIES_BASE_CALLS_PATH = "/Data/Intensities/BaseCalls"; - - private static final String GERALD_DIR = "GERALD"; - - private static final String BASECALL_DIR = "Basecall"; - - private static final String[] PROPERTIES = - { "GENOME_ANALYZER", "END_TYPE", "ILLUMINA_PIPELINE_VERSION", - "CYCLES_REQUESTED_BY_CUSTOMER" }; - - private static final String[] COLUMNS = - { "Sample Code", "Clusters", "Clusters (PF)", "Yield (Mbases)", "Density Ratio", - "PhiX: Clusters", "PhiX: ClustersPF", "PhiX: Yield (Mbases)", "PhiX: % Align (PF)", - "Software", "Eland finished" }; - - public IlluminaSummaryReportingPlugin(Properties properties, File storeRoot) - { - super(properties, storeRoot); - } - - private File[] findFile(DataSetProcessingContext context, DatasetDescription dataset, - final String summaryFilePath, String path) - { - - File originalData = getDataSubDir(context.getDirectoryProvider(), dataset); - - File childDirectory = new File(originalData, path); - - File[] files = childDirectory.listFiles(new FileFilter() - { - @Override - public boolean accept(File file) - { - return file.isDirectory() && file.getName().startsWith(summaryFilePath); - } - }); - return files; - } - - private static void createRows(File[] f, String fileName, SimpleTableModelBuilder b, - DatasetDescription dataset) - { - File summaryFile = new File(f[0], fileName); - describe(b, dataset, summaryFile); - - } - - @Override - public TableModel createReport(List<DatasetDescription> datasets, - DataSetProcessingContext context) - { - SimpleTableModelBuilder builder = new SimpleTableModelBuilder(); - - for (String column : COLUMNS) - { - builder.addHeader(column); - } - - for (String property : PROPERTIES) - { - builder.addHeader(property); - } - - for (DatasetDescription dataset : datasets) - { - - File[] f = - findFile(context, dataset, GERALD_DIR, dataset.getSampleCode() - + DATA_INTENSITIES_BASE_CALLS_PATH); - - if (f != null && f.length > 0) - { - createRows(f, SUMMARY_FILE_NAME, builder, dataset); - } else - { - File[] fileNewCasava = findFile(context, dataset, BASECALL_DIR, UNALIGNED_PATH); - try - { - createRows(fileNewCasava, BUSTARD_SUMMARY_FILE_NAME, builder, dataset); - } catch (RuntimeException exc) - { - List<ISerializableComparable> row = new ArrayList<ISerializableComparable>(); - row.add(new StringTableCell(dataset.getSampleCode())); - for (int i = 0; i <= COLUMNS.length + PROPERTIES.length - 2; ++i) - { - row.add(new StringTableCell("")); - } - builder.addRow(row); - } - } - - } - return builder.getTableModel(); - } - - private static void describe(SimpleTableModelBuilder builder, DatasetDescription dataset, - File summaryFile) - { - IlluminaSummary summary = IlluminaSummaryXMLLoader.readSummaryXML(summaryFile); - describeSummary(builder, dataset, summary); - } - - private static void describeSummary(SimpleTableModelBuilder builder, - DatasetDescription dataset, IlluminaSummary summary) - { - ChipResultsSummary chipResultSummary = summary.getChipResultsSummary(); - LaneResultsSummary laneResultSummary = summary.getLaneResultsSummary(); - // ChipSummary chipSummary = summary.getChipSummary(); - - List<ISerializableComparable> row = new ArrayList<ISerializableComparable>(); - row.add(new StringTableCell(dataset.getSampleCode())); - - addTableRow(chipResultSummary.getClusterCountRaw(), row); - addTableRow(chipResultSummary.getClusterCountPF(), row); - addTableRow(chipResultSummary.getYield() / MEGA, row); - addTableRow(chipResultSummary.getDensityRatio(), row); - - // PhiX Lane - addTableRow(laneResultSummary.getRead().getLanes().get(4).getClusterCountRaw().getMean(), - row); - addTableRow(laneResultSummary.getRead().getLanes().get(4).getClusterCountPF().getMean(), - row); - addTableRow(laneResultSummary.getRead().getLanes().get(4).getLaneYield() / KILO, row); - - try - { - addTableRow(laneResultSummary.getRead().getLanes().get(4).getPercentUniquelyAlignedPF() - .getMean(), row); - } catch (RuntimeException exc) - { - row.add(new StringTableCell("")); - - } - - addTableRow(summary.getSoftware(), row); - addTableRow(summary.getDate(), row); - addPropertyColumnValues(dataset, row); - - builder.addRow(row); - } - - private static void addTableRow(Long number, List<ISerializableComparable> row) - { - try - { - row.add(new IntegerTableCell(number)); - - } catch (RuntimeException exc) - { - row.add(new StringTableCell("")); - - } - } - - private static void addTableRow(Double number, List<ISerializableComparable> row) - { - try - { - row.add(new DoubleTableCell(number)); - - } catch (RuntimeException exc) - { - row.add(new StringTableCell("")); - - } - } - - private static void addTableRow(String s, List<ISerializableComparable> row) - { - try - { - row.add(new StringTableCell(s)); - - } catch (RuntimeException exc) - { - row.add(new StringTableCell("")); - - } - } - - private static void addPropertyColumnValues(DatasetDescription dataset, - List<ISerializableComparable> row) - { - Sample sample = getSample(dataset); - for (String propertyCode : PROPERTIES) - { - boolean found = false; - for (IEntityProperty property : sample.getProperties()) - { - if (property.getPropertyType().getCode().equals(propertyCode)) - { - row.add(new StringTableCell(property.tryGetAsString())); - found = true; - break; - } - } - if (found == false) - { - row.add(new StringTableCell("")); - } - } - } - - private static Sample getSample(DatasetDescription dataset) - { - String spaceCode = dataset.getSpaceCode(); - String sampleCode = dataset.getSampleCode(); - SampleIdentifier sampleIdentifier = - new SampleIdentifier(new SpaceIdentifier(spaceCode), sampleCode); - Sample sampleOrNull = - ServiceProvider.getOpenBISService().tryGetSampleWithExperiment(sampleIdentifier); - if (sampleOrNull == null) - { - throw new EnvironmentFailureException(String.format( - "Couldn't get sample %s for dataset %s.", dataset.getSampleCode(), - dataset.getDataSetCode())); - } - return sampleOrNull; - } - - /** - * Loader of Illumina summary XML file. - * <p> - * NOTE: This is not thread safe as it holds {@link JaxbXmlParser} singleton. As long as it is used only by {@link IlluminaSummaryReportingPlugin} - * it will work correctly because we only use a singleton of each reporting plugin. - * - * @author Piotr Buczek - */ - static class IlluminaSummaryXMLLoader - { - // we use one instance - private static JaxbXmlParser<IlluminaSummary> PARSER_INSTANCE = - new JaxbXmlParser<IlluminaSummary>(IlluminaSummary.class, false); - - public static IlluminaSummary readSummaryXML(File summaryXml) - { - return PARSER_INSTANCE.doParse(summaryXml); - } - - } -} diff --git a/deep_sequencing_unit/source/java/ch/ethz/bsse/cisd/dsu/dss/plugins/Lane.java b/deep_sequencing_unit/source/java/ch/ethz/bsse/cisd/dsu/dss/plugins/Lane.java deleted file mode 100644 index 1f53180bae00e1ec83b5cd8c30dcdd6a4de31de7..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/source/java/ch/ethz/bsse/cisd/dsu/dss/plugins/Lane.java +++ /dev/null @@ -1,191 +0,0 @@ -/* - * Copyright 2010 ETH Zuerich, CISD - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package ch.ethz.bsse.cisd.dsu.dss.plugins; - -import javax.xml.bind.annotation.XmlElement; - -/** - * <pre> - * <Lane> - * <laneNumber>1</laneNumber> - * <averageAlignScorePF> - * ... - * </averageAlignScorePF> - * <clusterCountPF> - * ... - * </clusterCountPF> - * <clusterCountRaw> - * ... - * </clusterCountRaw> - * <errorPF> - * ... - * </errorPF> - * <laneYield>2290093</laneYield> - * <oneSig> - * ... - * </oneSig> - * <percentClustersPF> - * ... - * </percentClustersPF> - * <percentUniquelyAlignedPF> - * ... - * </percentUniquelyAlignedPF> - * <signal20AsPctOf1> - * ... - * </signal20AsPctOf1> - * </Lane> - * </pre> - * - * @author Manuel Kohler - */ - -class Lane -{ - private Long laneNumber = 0L; - - // since Casava 1.7 available - private doubleStats averageAlignScorePF; - - private stats clusterCountPF; - - private stats clusterCountRaw; - - // since Casava 1.7 available - private doubleStats errorPF; - - private Long laneYield = 0L; - - private stats oneSig; - - private doubleStats percentClustersPF; - - // since Casava 1.7 available - private doubleStats percentUniquelyAlignedPF; - - private doubleStats signal20AsPctOf1; - - @XmlElement(name = "laneNumber") - public Long getLaneNumber() - { - return laneNumber; - } - - public void setLaneNumber(Long laneNumber) - { - this.laneNumber = laneNumber; - } - - @XmlElement(name = "averageAlignScorePF") - public doubleStats getAverageAlignScorePF() - { - return averageAlignScorePF; - } - - public void setAverageAlignScorePF(doubleStats averageAlignScorePF) - { - this.averageAlignScorePF = averageAlignScorePF; - } - - @XmlElement(name = "clusterCountPF") - public stats getClusterCountPF() - { - return clusterCountPF; - } - - public void setClusterCountPF(stats clusterCountPF) - { - this.clusterCountPF = clusterCountPF; - } - - @XmlElement(name = "clusterCountRaw") - public stats getClusterCountRaw() - { - return clusterCountRaw; - } - - public void setClusterCountRaw(stats clusterCountRaw) - { - this.clusterCountRaw = clusterCountRaw; - } - - @XmlElement(name = "errorPF") - public doubleStats getErrorPF() - { - return errorPF; - } - - public void setErrorPF(doubleStats errorPF) - { - this.errorPF = errorPF; - } - - @XmlElement(name = "laneYield") - public Long getLaneYield() - { - return laneYield; - } - - public void setLaneYield(Long laneYield) - { - this.laneYield = laneYield; - } - - @XmlElement(name = "oneSig") - public stats getOneSig() - { - return oneSig; - } - - public void setOneSig(stats oneSig) - { - this.oneSig = oneSig; - } - - @XmlElement(name = "percentClustersPF") - public doubleStats getPercentClustersPF() - { - return percentClustersPF; - } - - public void setPercentClustersPF(doubleStats percentClustersPF) - { - this.percentClustersPF = percentClustersPF; - } - - @XmlElement(name = "percentUniquelyAlignedPF") - public doubleStats getPercentUniquelyAlignedPF() - { - return percentUniquelyAlignedPF; - } - - public void setPercentUniquelyAlignedPF(doubleStats percentUniquelyAlignedPF) - { - this.percentUniquelyAlignedPF = percentUniquelyAlignedPF; - } - - @XmlElement(name = "signal20AsPctOf1") - public doubleStats getSignal20AsPctOf1() - { - return signal20AsPctOf1; - } - - public void setSignal20AsPctOf1(doubleStats signal20AsPctOf1) - { - this.signal20AsPctOf1 = signal20AsPctOf1; - } - -} diff --git a/deep_sequencing_unit/source/java/ch/ethz/bsse/cisd/dsu/dss/plugins/LaneResultsSummary.java b/deep_sequencing_unit/source/java/ch/ethz/bsse/cisd/dsu/dss/plugins/LaneResultsSummary.java deleted file mode 100644 index 50c3538b359735f683757d98ad83b95c8ab91942..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/source/java/ch/ethz/bsse/cisd/dsu/dss/plugins/LaneResultsSummary.java +++ /dev/null @@ -1,46 +0,0 @@ -/* - * Copyright 2010 ETH Zuerich, CISD - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package ch.ethz.bsse.cisd.dsu.dss.plugins; - -import javax.xml.bind.annotation.XmlElement; - -/** - * <pre> - * <ExpandedLaneSummary> - * <Read> - * </Read> - * </ExpandedLaneSummary> - * </pre> - * - * @author Manuel Kohler - */ - -class LaneResultsSummary -{ - private Read read; - - @XmlElement(name = "Read") - public Read getRead() - { - return read; - } - - public void setRead(Read read) - { - this.read = read; - } -} diff --git a/deep_sequencing_unit/source/java/ch/ethz/bsse/cisd/dsu/dss/plugins/Read.java b/deep_sequencing_unit/source/java/ch/ethz/bsse/cisd/dsu/dss/plugins/Read.java deleted file mode 100644 index fc00524a388c3ef408fc79af3c9f293c95b06bf9..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/source/java/ch/ethz/bsse/cisd/dsu/dss/plugins/Read.java +++ /dev/null @@ -1,64 +0,0 @@ -/* Copyright 2010 ETH Zuerich, CISD - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package ch.ethz.bsse.cisd.dsu.dss.plugins; - -import java.util.ArrayList; -import java.util.List; -import javax.xml.bind.annotation.XmlElement; - -/** - * <pre> - * <Read> - * <readNumber>1</readNumber> - * <Lane> - * ... - * </Lane> - * ... - * </Read> - * </pre> - * - * @author Manuel Kohler - */ - -class Read -{ - private List<Integer> readNumber = new ArrayList<Integer>(); - - private List<Lane> lanes; - - @XmlElement(name = "readNumber") - public List<Integer> getReadNumbers() - { - return readNumber; - } - - public void setReadNumbers(List<Integer> readNumber) - { - this.readNumber = readNumber; - } - - @XmlElement(name = "Lane") - public List<Lane> getLanes() - { - return lanes; - } - - public void setLanes(List<Lane> lanes) - { - this.lanes = lanes; - } - -} diff --git a/deep_sequencing_unit/source/java/ch/ethz/bsse/cisd/dsu/dss/plugins/doubleStats.java b/deep_sequencing_unit/source/java/ch/ethz/bsse/cisd/dsu/dss/plugins/doubleStats.java deleted file mode 100644 index 0d21e99a72ca870b4a9ed93345f90873bfc4c5ae..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/source/java/ch/ethz/bsse/cisd/dsu/dss/plugins/doubleStats.java +++ /dev/null @@ -1,71 +0,0 @@ -/* - * Copyright 2010 ETH Zuerich, CISD - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package ch.ethz.bsse.cisd.dsu.dss.plugins; - -import javax.xml.bind.annotation.XmlElement; - -/** - * <pre> - * <mean>277736.1</mean> - * <stdev>11981.2</stdev> - * <sumsq>17.3</sumsq> - * </pre> - * - * @author kohleman - */ - -public class doubleStats -{ - private double mean = 0.0; - - private double stdev = 0.0; - - private double sumsq = 0.0; - - @XmlElement(name = "mean") - public double getMean() - { - return mean; - } - - public void setMean(double mean) - { - this.mean = mean; - } - - @XmlElement(name = "stdev") - public double getStdev() - { - return stdev; - } - - public void setStdev(double stdev) - { - this.stdev = stdev; - } - - @XmlElement(name = "sumsq") - public double getSumsq() - { - return sumsq; - } - - public void setSumsq(double sumsq) - { - this.sumsq = sumsq; - } -} \ No newline at end of file diff --git a/deep_sequencing_unit/source/java/ch/ethz/bsse/cisd/dsu/dss/plugins/stats.java b/deep_sequencing_unit/source/java/ch/ethz/bsse/cisd/dsu/dss/plugins/stats.java deleted file mode 100644 index 11717aacc511c3519d04b07203d9623a0bdaa404..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/source/java/ch/ethz/bsse/cisd/dsu/dss/plugins/stats.java +++ /dev/null @@ -1,71 +0,0 @@ -/* - * Copyright 2010 ETH Zuerich, CISD - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package ch.ethz.bsse.cisd.dsu.dss.plugins; - -import javax.xml.bind.annotation.XmlElement; - -/** - * <pre> - * <mean>277736</mean> - * <stdev>11981</stdev> - * <sumsq>17224950000</sumsq> - * </pre> - * - * @author kohleman - */ - -public class stats -{ - private Long mean = 0L; - - private Long stdev = 0L; - - private Long sumsq = 0L; - - @XmlElement(name = "mean") - public Long getMean() - { - return mean; - } - - public void setMean(Long mean) - { - this.mean = mean; - } - - @XmlElement(name = "stdev") - public Long getStdev() - { - return stdev; - } - - public void setStdev(Long stdev) - { - this.stdev = stdev; - } - - @XmlElement(name = "sumsq") - public Long getSumsq() - { - return sumsq; - } - - public void setSumsq(Long sumsq) - { - this.sumsq = sumsq; - } -} diff --git a/deep_sequencing_unit/source/java/ch/ethz/bsse/cisd/dsu/metadata/DbAccess.java b/deep_sequencing_unit/source/java/ch/ethz/bsse/cisd/dsu/metadata/DbAccess.java deleted file mode 100644 index 4d5e311c91ffa19f174b30fb1137278f26b9f757..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/source/java/ch/ethz/bsse/cisd/dsu/metadata/DbAccess.java +++ /dev/null @@ -1,103 +0,0 @@ -package ch.ethz.bsse.cisd.dsu.metadata; - -import java.sql.Connection; -import java.sql.DriverManager; -import java.sql.ResultSet; -import java.sql.SQLException; -import java.sql.Statement; -import java.util.HashMap; - -public class DbAccess -{ - - private static final String FASTQ_GZ_SUFFIX = ".fastq.gz"; - - /** - * Connecting to the pathinfo_DB - * - * @return Connection - */ - static Connection connectToDB(Parameters params) - { - try - { - Class.forName("org.postgresql.Driver"); - } catch (ClassNotFoundException e) - { - e.printStackTrace(); - } - Connection connection = null; - try - { - connection = DriverManager.getConnection( - params.getPathinfoDBConnectionString(), params.getPathinfoDBUser(), params.getPathinfoDBPassword()); - } catch (SQLException e) - { - e.printStackTrace(); - System.out.println("No PathinfoDB available"); - } - return connection; - } - - /** - * @return HashMap<String, Integer> of files and the corresponding checksum for the DB Uses a file as key and the checksum as value, we assume - * that a file is unique - */ - static HashMap<String, Integer> doQuery(Connection connection, String permId) - { - HashMap<String, Integer> dataSetResult = new HashMap<String, Integer>(); - Statement st = null; - try - { - st = connection.createStatement(); - } catch (SQLException e) - { - e.printStackTrace(); - } - ResultSet rs = null; - try - { - System.out.println("Found data set with permID: " + permId); - rs = st.executeQuery("select dsf.id, dsf.file_name, dsf.checksum_crc32 from data_sets ds," - + " data_set_files dsf where ds.code='" - + permId + "' and ds.id =dsf.dase_id and dsf.is_directory = FALSE;"); - while (rs.next()) - { - Integer id = rs.getInt("id"); - String fileName = rs.getString("file_name"); - Integer checksum = rs.getInt("checksum_crc32"); - - if (fileName.endsWith(FASTQ_GZ_SUFFIX)) - { - dataSetResult.put(fileName, checksum); - } - } - } catch (SQLException e) - { - e.printStackTrace(); - } - - try - { - rs.close(); - st.close(); - - } catch (SQLException e) - { - e.printStackTrace(); - } - return dataSetResult; - } - - static void closeDBConnection(Connection connection) - { - try - { - connection.close(); - } catch (SQLException e) - { - e.printStackTrace(); - } - - } -} diff --git a/deep_sequencing_unit/source/java/ch/ethz/bsse/cisd/dsu/metadata/Parameters.java b/deep_sequencing_unit/source/java/ch/ethz/bsse/cisd/dsu/metadata/Parameters.java deleted file mode 100644 index 77eab96942baab9ebde97688cb9a786df950e9b5..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/source/java/ch/ethz/bsse/cisd/dsu/metadata/Parameters.java +++ /dev/null @@ -1,91 +0,0 @@ -/* - * Copyright 2015 ETH Zuerich, SIS - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package ch.ethz.bsse.cisd.dsu.metadata; - -import static ch.systemsx.cisd.common.properties.PropertyUtils.getMandatoryProperty; - -import java.util.Properties; - -/** - * @author Manuel Kohler - */ -public class Parameters -{ - private static final String OPENBIS_USER = "openbis-user"; - - private static final String OPENBIS_PASSWORD = "openbis-password"; - - private static final String OPENBIS_SERVER_URL = "openbis-server-url"; - - private static final String PATHINFO_DB_CONNECTION_STRING = "pathinfo-db-connection-string"; - - private static final String PATHINFO_DB_USER = "pathinfo-db-user"; - - private static final String PATHINFO_DB_CONNECTION_PASSWORD = "pathinfo-db-password"; - - private final String openbisUser; - - private final String openbisPassword; - - private final String openbisServerURL; - - private final String pathinfoDBConnectionString; - - private final String pathinfoDBUser; - - private final String pathinfoDBPassword; - - public Parameters(Properties props) - { - this.openbisUser = getMandatoryProperty(props, OPENBIS_USER); - this.openbisPassword = getMandatoryProperty(props, OPENBIS_PASSWORD); - this.openbisServerURL = getMandatoryProperty(props, OPENBIS_SERVER_URL); - this.pathinfoDBConnectionString = getMandatoryProperty(props, PATHINFO_DB_CONNECTION_STRING); - this.pathinfoDBUser = getMandatoryProperty(props, PATHINFO_DB_USER); - this.pathinfoDBPassword = getMandatoryProperty(props, PATHINFO_DB_CONNECTION_PASSWORD); - } - - public String getOpenbisUser() - { - return openbisUser; - } - - public String getOpenbisPassword() - { - return openbisPassword; - } - - public String getOpenbisServerURL() - { - return openbisServerURL; - } - - public String getPathinfoDBConnectionString() - { - return pathinfoDBConnectionString; - } - - public String getPathinfoDBUser() - { - return pathinfoDBUser; - } - - public String getPathinfoDBPassword() - { - return pathinfoDBPassword; - } -} diff --git a/deep_sequencing_unit/source/java/ch/ethz/bsse/cisd/dsu/metadata/create_metadata.java b/deep_sequencing_unit/source/java/ch/ethz/bsse/cisd/dsu/metadata/create_metadata.java deleted file mode 100644 index 93eb052c65ad7f1f0218f0cdd25ef7fe2cab202d..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/source/java/ch/ethz/bsse/cisd/dsu/metadata/create_metadata.java +++ /dev/null @@ -1,445 +0,0 @@ -/* - * Copyright 2015 ETH Zuerich, SIS - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package ch.ethz.bsse.cisd.dsu.metadata; - -import java.io.BufferedWriter; -import java.io.File; -import java.io.FileWriter; -import java.io.IOException; -import java.nio.file.Path; -import java.nio.file.Paths; -import java.sql.Connection; -import java.util.ArrayList; -import java.util.EnumSet; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Properties; -import java.util.SortedMap; -import java.util.TreeMap; - -import org.apache.commons.cli.CommandLine; -import org.apache.commons.cli.CommandLineParser; -import org.apache.commons.cli.GnuParser; -import org.apache.commons.cli.HelpFormatter; -import org.apache.commons.cli.Option; -import org.apache.commons.cli.OptionBuilder; -import org.apache.commons.cli.Options; -import org.apache.commons.cli.ParseException; - -import ch.systemsx.cisd.common.io.PropertyIOUtils; -import ch.systemsx.cisd.common.logging.LogInitializer; -import ch.systemsx.cisd.openbis.common.api.client.ServiceFinder; -import ch.systemsx.cisd.openbis.generic.shared.api.v1.IGeneralInformationService; -import ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.DataSet; -import ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.Sample; -import ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.SampleFetchOption; -import ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.SearchCriteria; - -/** - * @author Manuel Kohler - */ - -public class create_metadata -{ - private static final String SEQUENCER = "SEQUENCER"; - - private static final String SEQUENCER_MODEL = "SEQUENCER_MODEL"; - - private static final String ILLUMINA_FLOW_LANE = "ILLUMINA_FLOW_LANE"; - - private static final String LANE_NUMBER = "LANE_NUMBER"; - - private static final String TSV_ENDING = ".tsv"; - - private static final String FLOW_CELL_PROPERTIES_NAME = "FLOW_CELL_PROPERTIES"; - - private static final String EXPERIMENT_NAME = "EXPERIMENT"; - - private static final String SAMPLE_CODE = "SAMPLE_CODE"; - - private static final String SAMPLE_TYPE_ILLUMINA_SEQUENCING = "ILLUMINA_SEQUENCING"; - - private static final String SAMPLE_TYPE = "SAMPLE_TYPE"; - - private static final String INDEX1_NOINDEX_VALUE = "NOINDEX"; - - private static final String INDEX2_NOINDEX_VALUE = "NOINDEX"; - - private static final String DATASET_TYPE_CODE_FASTQ_GZ = "FASTQ_GZ"; - - private static final String INDEX1_PROPERTY_CODE = "BARCODE"; - - private static final String INDEX2_PROPERTY_CODE = "INDEX2"; - - private static final String TSV_FLOWCELL_PROPERTIES = "FLOWCELL PROPERTIES"; - - private static final String TSV_FASTQ_FILES = "FASTQ_FILES"; - - private static final String CL_PARAMETER_OUTPUT_FOLDER = "output"; - - private static final String CL_PARAMETER_SAMPLE_LIST = "samples"; - - private static final String SERVICE_PROPERTIES_FILE = "etc/service.properties"; - - private static final char[] HEX_CHARACTERS = - { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f', }; - - private static final Map<String, String> SEQUENCER_NAMING; - - static - { - SEQUENCER_NAMING = new HashMap<String, String>(); - SEQUENCER_NAMING.put("ATTILA", "Illumina Genome Analyzer II"); - SEQUENCER_NAMING.put("ATTILAX", "Illumina Genome Analyzer IIx"); - SEQUENCER_NAMING.put("D00404", "Illumina HiSeq 2500"); - SEQUENCER_NAMING.put("ELLAC", "Illumina Genome Analyzer IIx"); - SEQUENCER_NAMING.put("M00721", "Illumina MiSeq"); - SEQUENCER_NAMING.put("SN1043", "Illumina HiSeq 2000"); - SEQUENCER_NAMING.put("D00535", "Illumina HiSeq 2500"); - SEQUENCER_NAMING.put("J00121", "Illumina HiSeq 3000"); - SEQUENCER_NAMING.put("M01761", "Illumina MiSeq"); - SEQUENCER_NAMING.put("NS500318", "Illumina NextSeq 500"); - SEQUENCER_NAMING.put("SN792", "Illumina HiSeq 2000"); - } - - public static void main(String[] args) - { - HashMap<String, String[]> commandLineMap = parseCommandLine(args); - extract(commandLineMap); - } - - private static void extract(HashMap<String, String[]> commandLineMap) - { - - Connection connection = null; - - LogInitializer.init(); - Properties props = PropertyIOUtils.loadProperties(SERVICE_PROPERTIES_FILE); - Parameters params = new Parameters(props); - - ServiceFinder serviceFinder = new ServiceFinder("openbis", IGeneralInformationService.SERVICE_URL); - IGeneralInformationService infoService = - serviceFinder.createService(IGeneralInformationService.class, params.getOpenbisServerURL()); - - String sessionToken = infoService.tryToAuthenticateForAllServices(params.getOpenbisUser(), params.getOpenbisPassword()); - if (sessionToken == null) - { - System.out.println("Wrong username/password!"); - System.exit(0); - } - ArrayList<String> sampleCodeList = new ArrayList<String>(); - - String outputFolder = commandLineMap.get(CL_PARAMETER_OUTPUT_FOLDER)[0]; - String[] clSampleCodeList = commandLineMap.get(CL_PARAMETER_SAMPLE_LIST); - for (String sampleCode : clSampleCodeList) - { - sampleCodeList.add(sampleCode); - } - - EnumSet<SampleFetchOption> fetchOptions = EnumSet.of(SampleFetchOption.CHILDREN, SampleFetchOption.PROPERTIES); - EnumSet<SampleFetchOption> flowcellFetchOptions = EnumSet.of(SampleFetchOption.PROPERTIES); - - connection = DbAccess.connectToDB(params); - - for (String sampleCode : sampleCodeList) - { - List<Sample> sampleList = searchSample(infoService, sessionToken, sampleCode, fetchOptions); - if (sampleList.size() < 1) - { - System.out.println(sampleCode + " not found!"); - } - - SortedMap<String, SortedMap<String, String>> sampleMap = getProperties(sampleList); - SortedMap<String, SortedMap<String, String>> flowcellMap = null; - String flowcellCode = ""; - - // Should be always a single sample - for (Sample sample : sampleList) - { - List<Sample> children = sample.getChildren(); - if (children.size() == 0) - { - System.out.println("Skipping..." + sample.getCode() + ". No children found for sample."); - continue; - } - HashMap<String, String> permIdMap = extractDataSets(infoService, sessionToken, children, sample); - - for (String permId : permIdMap.keySet()) - { - if (permId.equals("")) - { - System.out.println("Skipping..." + sample.getCode() + ". No Data Set found."); - continue; - } - - HashMap<String, Integer> dbResult = new HashMap<String, Integer>(); - if (connection != null) - { - dbResult = DbAccess.doQuery(connection, permId); - } - - for (Sample child : children) - { - String sampleConnectedToDataset = permIdMap.get(permId).split("/")[2]; - if (child.getSampleTypeCode().equals(ILLUMINA_FLOW_LANE) && - child.getCode().equals(sampleConnectedToDataset)) - { - flowcellCode = child.getCode().split(":")[0]; - String flowlaneCode = child.getCode().split(":")[1]; - SortedMap<String, String> sampleProps = sampleMap.get(sampleCode); - sampleProps.put(LANE_NUMBER, flowlaneCode); - sampleMap.put(sampleCode, sampleProps); - - List<Sample> flowcellList = searchSample(infoService, sessionToken, flowcellCode, flowcellFetchOptions); - flowcellMap = getProperties(flowcellList); - - writeTSVFile(sampleMap, flowcellMap, dbResult, outputFolder); - } - } - } - } - } - DbAccess.closeDBConnection(connection); - } - - private static SortedMap<String, SortedMap<String, String>> getProperties(List<Sample> sampleList) - { - SortedMap<String, String> sortedProperties = new TreeMap<String, String>(); - SortedMap<String, SortedMap<String, String>> sampleMap = new TreeMap<String, SortedMap<String, String>>(); - - for (Sample sample : sampleList) - { - Map<String, String> sampleProperties = sample.getProperties(); - for (String key : sampleProperties.keySet()) - { - if (!key.equals(FLOW_CELL_PROPERTIES_NAME)) - { - sortedProperties.put(key, cleanString(sampleProperties.get(key).toString())); - } - if (key.equals(SEQUENCER)) - { - sortedProperties.put(SEQUENCER_MODEL, SEQUENCER_NAMING.get(sampleProperties.get(key))); - } - } - if (sample.getSampleTypeCode().equals(SAMPLE_TYPE_ILLUMINA_SEQUENCING)) - { - sortedProperties.put(EXPERIMENT_NAME, sample.getExperimentIdentifierOrNull()); - } - sortedProperties.put(SAMPLE_CODE, sample.getCode()); - sortedProperties.put(SAMPLE_TYPE, sample.getSampleTypeCode()); - - sampleMap.put(sample.getCode(), sortedProperties); - } - return sampleMap; - } - - private static void writeTSVFile(SortedMap<String, SortedMap<String, String>> sampleMap, - SortedMap<String, SortedMap<String, String>> flowcellMap, HashMap<String, Integer> dbResult, - String outputFolder) - { - if (flowcellMap != null && flowcellMap.size() == 1) - { - SortedMap<String, String> flowcellProperties = flowcellMap.get(flowcellMap.firstKey()); - - for (String key : sampleMap.keySet()) - { - SortedMap<String, String> currentSample = sampleMap.get(key); - - StringBuilder stringBuilder = new StringBuilder(); - stringBuilder.append(key.replace("-", "_")); - stringBuilder.append("_"); - stringBuilder.append(flowcellProperties.get("RUN_NAME_FOLDER")); - stringBuilder.append("_metadata"); - stringBuilder.append(TSV_ENDING); - - Path path = Paths.get(outputFolder, stringBuilder.toString()); - File metaDataFile = new File(path.toUri()); - metaDataFile.getParentFile().mkdirs(); - try - { - metaDataFile.createNewFile(); - } catch (IOException e1) - { - e1.printStackTrace(); - } - - try - { - BufferedWriter fOut = new BufferedWriter(new FileWriter(metaDataFile)); - for (String propertyKey : currentSample.keySet()) - { - fOut.write(propertyKey + "\t" + currentSample.get(propertyKey) + "\n"); - } - fOut.write("\n" + TSV_FLOWCELL_PROPERTIES + "\n"); - - for (String flowcellPropertyKey : flowcellProperties.keySet()) - { - fOut.write(flowcellPropertyKey + "\t" + flowcellProperties.get(flowcellPropertyKey) + "\n"); - } - fOut.write("\n" + TSV_FASTQ_FILES + "\n"); - - for (String fileName : dbResult.keySet()) - { - fOut.write(fileName + "\t" + crc32ToString(dbResult.get(fileName)) + "\n"); - } - - fOut.close(); - System.out.println("Written " + metaDataFile); - - } catch (IOException e) - { - e.printStackTrace(); - } - } - } - } - - private static List<Sample> searchSample(IGeneralInformationService infoService, String sessionToken, - String sampleCode, EnumSet<SampleFetchOption> fetchOptions) - { - SearchCriteria sc = new SearchCriteria(); - sc.addMatchClause(SearchCriteria.MatchClause.createAttributeMatch(SearchCriteria.MatchClauseAttribute.CODE, sampleCode)); - List<Sample> sampleList = infoService.searchForSamples(sessionToken, sc, fetchOptions); - return sampleList; - } - - private static HashMap<String, String> extractDataSets(IGeneralInformationService infoService, String sessionToken, - List<Sample> children, Sample sample) - { - HashMap<String, String> permIdMap = new HashMap<String, String>(); - List<DataSet> flowLaneDatasets = infoService.listDataSets(sessionToken, children); - String permId = ""; - Map<String, String> sampleProperties = sample.getProperties(); - String sample_index1 = sampleProperties.get(INDEX1_PROPERTY_CODE); - if (sample_index1 == null) - { - sample_index1 = INDEX1_NOINDEX_VALUE; - } - String sample_index2 = sampleProperties.get(INDEX2_PROPERTY_CODE); - if (sample_index2 == null) - { - sample_index2 = INDEX2_NOINDEX_VALUE; - } - - for (DataSet ds : flowLaneDatasets) - { - HashMap<String, String> dsProperties = ds.getProperties(); - String datasetIndex1 = dsProperties.get(INDEX1_PROPERTY_CODE); - String datasetIndex2 = dsProperties.get(INDEX2_PROPERTY_CODE); - if (datasetIndex1 == null) - { - System.out.println("No index found for dataset " + ds.getCode() + ". Set the indices properly for the data sets and try again."); - } else - { - - if (ds.getDataSetTypeCode().equals(DATASET_TYPE_CODE_FASTQ_GZ) && - datasetIndex1.equals(sample_index1) && datasetIndex2.equals(sample_index2)) - { - permId = ds.getCode(); - permIdMap.put(permId, ds.getSampleIdentifierOrNull()); - } - } - } - if (permIdMap.size() == 0) - { - System.out.println("No data set found which matched the properties of " + sample.getCode() + - ". Check the Indices of the Samples and the Data Sets."); - } - return permIdMap; - } - - private static String cleanString(String s) - { - return s.replaceAll("\n", " "); - } - - /** - * Converts a CRC32 checksum to a string representation. - */ - public static String crc32ToString(final int checksum) - { - final char buf[] = new char[8]; - int w = checksum; - for (int i = 0, x = 7; i < 4; i++) - { - buf[x--] = HEX_CHARACTERS[w & 0xf]; - buf[x--] = HEX_CHARACTERS[(w >>> 4) & 0xf]; - w >>= 8; - } - return new String(buf); - } - - private static HashMap<String, String[]> parseCommandLine(String[] args) - { - HashMap<String, String[]> commandLineMap = new HashMap<String, String[]>(); - CommandLineParser parser = new GnuParser(); - - Options options = new Options(); - - OptionBuilder.withArgName(CL_PARAMETER_SAMPLE_LIST); - OptionBuilder.hasArgs(); - OptionBuilder.withDescription("list of samples"); - Option samples = OptionBuilder.create(CL_PARAMETER_SAMPLE_LIST); - samples.setArgs(Option.UNLIMITED_VALUES); - samples.isRequired(); - options.addOption(samples); - - OptionBuilder.withArgName(CL_PARAMETER_OUTPUT_FOLDER); - OptionBuilder.hasArg(); - OptionBuilder.withDescription("output folder"); - - Option outputFolder = OptionBuilder.create(CL_PARAMETER_OUTPUT_FOLDER); - outputFolder.setArgs(1); - options.addOption(outputFolder); - - // automatically generate the help statement - HelpFormatter formatter = new HelpFormatter(); - if (args.length < 2) - { - formatter.printHelp("help", options); - System.exit(0); - } - - try - { - CommandLine line = parser.parse(options, args); - if (line.hasOption(CL_PARAMETER_SAMPLE_LIST)) - { - String[] sampleArray = line.getOptionValues(CL_PARAMETER_SAMPLE_LIST); - commandLineMap.put(CL_PARAMETER_SAMPLE_LIST, sampleArray); - } - if (line.hasOption(CL_PARAMETER_OUTPUT_FOLDER)) - { - String[] outputArray = line.getOptionValues(CL_PARAMETER_OUTPUT_FOLDER); - commandLineMap.put(CL_PARAMETER_OUTPUT_FOLDER, outputArray); - } else - { - String cwd = System.getProperty("user.dir"); - String[] arrayCwd = cwd.split("@"); // just use a split with a not valid char to convert the String into String [] - System.out.println("No output folder specified! Will use: " + cwd); - commandLineMap.put(CL_PARAMETER_OUTPUT_FOLDER, arrayCwd); - } - } catch (ParseException exp) - { - System.out.println("Parsing of command line parameters failed.\n" + exp.getMessage()); - formatter.printHelp("help", options); - System.exit(0); - } - return commandLineMap; - } -} diff --git a/deep_sequencing_unit/source/java/ch/ethz/bsse/cisd/dsu/tracking/dto/TrackedEntities.java b/deep_sequencing_unit/source/java/ch/ethz/bsse/cisd/dsu/tracking/dto/TrackedEntities.java deleted file mode 100644 index 3919ad6a06b298e8e0b0e635ecc8c2948517b85c..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/source/java/ch/ethz/bsse/cisd/dsu/tracking/dto/TrackedEntities.java +++ /dev/null @@ -1,73 +0,0 @@ -/* - * Copyright 2009 ETH Zuerich, CISD - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package ch.ethz.bsse.cisd.dsu.tracking.dto; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; - -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.AbstractExternalData; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Sample; - -/** - * Simple encapsulation of list of entities that are tracked. - * - * @author Piotr Buczek - * @author Manuel Kohler - */ -public class TrackedEntities -{ - - private final List<Sample> sequencingSamplesToBeProcessed; - - private final List<Sample> sequencingSamplesProcessed; - - private final List<AbstractExternalData> dataSets; - - private final HashMap<String, ArrayList<Long>> changedTrackingMap; - - public TrackedEntities(List<Sample> sequencingSamplesToBeProcessed, - List<Sample> sequencingSamplesProcessed, List<AbstractExternalData> dataSets, - HashMap<String, ArrayList<Long>> changedTrackingMap) - { - this.sequencingSamplesToBeProcessed = sequencingSamplesToBeProcessed; - this.sequencingSamplesProcessed = sequencingSamplesProcessed; - this.dataSets = dataSets; - this.changedTrackingMap = changedTrackingMap; - } - - public List<Sample> getSequencingSamplesToBeProcessed() - { - return sequencingSamplesToBeProcessed; - } - - public List<Sample> getSequencingSamplesProcessed() - { - return sequencingSamplesProcessed; - } - - public List<AbstractExternalData> getDataSets() - { - return dataSets; - } - - public HashMap<String, ArrayList<Long>> getChangedTrackingMap() - { - return changedTrackingMap; - } - -} diff --git a/deep_sequencing_unit/source/java/ch/ethz/bsse/cisd/dsu/tracking/dto/TrackingStateDTO.java b/deep_sequencing_unit/source/java/ch/ethz/bsse/cisd/dsu/tracking/dto/TrackingStateDTO.java deleted file mode 100644 index f3376b413f6588da52bcbeb890fb49df46119f18..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/source/java/ch/ethz/bsse/cisd/dsu/tracking/dto/TrackingStateDTO.java +++ /dev/null @@ -1,93 +0,0 @@ -/* - * Copyright 2009 ETH Zuerich, CISD - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package ch.ethz.bsse.cisd.dsu.tracking.dto; - -import java.util.Properties; -import java.util.Set; -import java.util.TreeMap; - -/** - * Tracking state DTO - * - * @author Piotr Buczek - * @author Manuel Kohler - */ - -public class TrackingStateDTO -{ - private Set<Long> alreadyTrackedSampleIdsToBeProcessed; - - private Set<Long> alreadyTrackedSampleIdsProcessed; - - private long lastSeenDatasetId; - - private Properties lastSeenProperties; - - private TreeMap<String, Long> lastSeenDataSetIdMap; - - public TreeMap<String, Long> getLastSeenDataSetIdMap() - { - return lastSeenDataSetIdMap; - } - - public void setLastSeenDataSetIdMap(TreeMap<String, Long> lastSeenDataSetIdMap) - { - this.lastSeenDataSetIdMap = lastSeenDataSetIdMap; - } - - public long getLastSeenDatasetId() - { - return lastSeenDatasetId; - } - - public void setLastSeenDatasetId(long lastSeenDatasetId) - { - this.lastSeenDatasetId = lastSeenDatasetId; - } - - public Set<Long> getAlreadyTrackedSampleIdsToBeProcessed() - { - return alreadyTrackedSampleIdsToBeProcessed; - } - - public void setAlreadyTrackedSampleIdsToBeProcessed( - Set<Long> alreadyTrackedSampleIdsToBeProcessed) - { - this.alreadyTrackedSampleIdsToBeProcessed = alreadyTrackedSampleIdsToBeProcessed; - } - - public Set<Long> getAlreadyTrackedSampleIdsProcessed() - { - return alreadyTrackedSampleIdsProcessed; - } - - public void setAlreadyTrackedSampleIdsProcessed(Set<Long> alreadyTrackedSampleIdsProcessed) - { - this.alreadyTrackedSampleIdsProcessed = alreadyTrackedSampleIdsProcessed; - } - - public Properties getLastSeenProperties() - { - return lastSeenProperties; - } - - public void setLastSeenProperties(Properties lastSeenProperties) - { - this.lastSeenProperties = lastSeenProperties; - } - -} \ No newline at end of file diff --git a/deep_sequencing_unit/source/java/ch/ethz/bsse/cisd/dsu/tracking/email/Email.java b/deep_sequencing_unit/source/java/ch/ethz/bsse/cisd/dsu/tracking/email/Email.java deleted file mode 100644 index 2d4b6fc9c6c0384d11d9b59bab7c3e5611133dd6..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/source/java/ch/ethz/bsse/cisd/dsu/tracking/email/Email.java +++ /dev/null @@ -1,82 +0,0 @@ -/* - * Copyright 2009 ETH Zuerich, CISD - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package ch.ethz.bsse.cisd.dsu.tracking.email; - -import ch.systemsx.cisd.common.mail.EMailAddress; -import ch.systemsx.cisd.common.mail.From; -import ch.systemsx.cisd.common.mail.IMailClient; - -/** - * Simple encapsulation of {@link IMailClient#sendMessage(String, String, String, From, String...)} method parameters. - * - * @author Piotr Buczek - */ -public class Email -{ - private final String subject; - - private final String content; - - private final EMailAddress replyToOrNull; - - private final EMailAddress fromOrNull; - - private final EMailAddress[] recipients; - - public Email(String subject, String content, EMailAddress replyToOrNull, EMailAddress fromOrNull, - EMailAddress... recipients) - { - super(); - this.subject = subject; - this.content = content; - this.replyToOrNull = replyToOrNull; - this.fromOrNull = fromOrNull; - this.recipients = recipients; - } - - public Email(String subject, String content, EMailAddress replyToOrNull, String fromOrNull, - EMailAddress... recipients) - { - this(subject, content, replyToOrNull, new EMailAddress(fromOrNull), recipients); - } - - public String getSubject() - { - return subject; - } - - public String getContent() - { - return content; - } - - public EMailAddress getReplyToOrNull() - { - return replyToOrNull; - } - - public EMailAddress getFromOrNull() - { - return fromOrNull; - } - - public EMailAddress[] getRecipients() - { - return recipients; - } - -} diff --git a/deep_sequencing_unit/source/java/ch/ethz/bsse/cisd/dsu/tracking/email/EmailWithSummary.java b/deep_sequencing_unit/source/java/ch/ethz/bsse/cisd/dsu/tracking/email/EmailWithSummary.java deleted file mode 100644 index ae91239a0c783ab6967cf46800115855f25cfade..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/source/java/ch/ethz/bsse/cisd/dsu/tracking/email/EmailWithSummary.java +++ /dev/null @@ -1,46 +0,0 @@ -/* - * Copyright 2009 ETH Zuerich, CISD - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package ch.ethz.bsse.cisd.dsu.tracking.email; - -/** - * Encapsulation of {@link Email} with a short summary of its content. - * - * @author Piotr Buczek - */ -public class EmailWithSummary -{ - private final Email email; - - private final String summary; - - public EmailWithSummary(Email email, String summary) - { - this.email = email; - this.summary = summary; - } - - public Email getEmail() - { - return email; - } - - public String getSummary() - { - return summary; - } - -} diff --git a/deep_sequencing_unit/source/java/ch/ethz/bsse/cisd/dsu/tracking/email/EntityTrackingEmailData.java b/deep_sequencing_unit/source/java/ch/ethz/bsse/cisd/dsu/tracking/email/EntityTrackingEmailData.java deleted file mode 100644 index 08c7d402190da2d672fbce90c2d6212808f2f68b..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/source/java/ch/ethz/bsse/cisd/dsu/tracking/email/EntityTrackingEmailData.java +++ /dev/null @@ -1,140 +0,0 @@ -/* - * Copyright 2009 ETH Zuerich, CISD - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package ch.ethz.bsse.cisd.dsu.tracking.email; - -import java.util.ArrayList; -import java.util.List; - -import ch.systemsx.cisd.common.mail.EMailAddress; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.AbstractExternalData; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Sample; - -/** - * Structure containing all data about tracked entities that will be used in a single email to an recipient. Its purpose is to group data that will be - * used to generate content of an email containing merged information about all events that the recipient should be notified about. - * - * @author Piotr Buczek - */ -public class EntityTrackingEmailData -{ - private List<Sample> sequencingSamplesToBeProcessed = new ArrayList<Sample>(0); - - private List<Sample> sequencingSamplesProcessed = new ArrayList<Sample>(0); - - private final List<AbstractExternalData> dataSets = new ArrayList<AbstractExternalData>(0); - - private final EMailAddress recipient; - - /** creates email data for given <var>recipient</var> */ - public EntityTrackingEmailData(EMailAddress recipient) - { - this.recipient = recipient; - } - - public EMailAddress getRecipient() - { - return recipient; - } - - public List<Sample> getSequencingSamplesToBeProcessed() - { - return sequencingSamplesToBeProcessed; - } - - public List<Sample> getSequencingSamplesProcessed() - { - return sequencingSamplesProcessed; - } - - public List<AbstractExternalData> getDataSets() - { - return dataSets; - } - - /** adds info about newly tracked sequencing sample to be processed */ - public void addSequencingSampleToBeProcessed(Sample sequencingSample) - { - sequencingSamplesToBeProcessed.add(sequencingSample); - } - - /** adds info about newly tracked sequencing sample successfully processed */ - public void addSequencingSampleProcessed(Sample sequencingSample) - { - sequencingSamplesProcessed.add(sequencingSample); - } - - /** adds info about newly tracked data set */ - public void addDataSet(AbstractExternalData dataSet) - { - dataSets.add(dataSet); - } - - /** short description of data kept in the structure */ - public String getDescription() - { - final StringBuilder sb = new StringBuilder(); - appendSamplesInfo(sb, sequencingSamplesToBeProcessed, "possible for processing"); - appendSamplesInfo(sb, sequencingSamplesProcessed, "successfully processed"); - appendDataSetsInfo(sb); - return sb.toString(); - } - - private void appendSamplesInfo(final StringBuilder sb, final List<Sample> samples, - final String actionDescription) - { - if (samples.isEmpty()) - { - sb.append(String.format("no new samples are %s\n", actionDescription)); - } else - { - for (Sample seqencingSample : samples) - { - final String sequencingSampleIdentifier = seqencingSample.getIdentifier(); - sb.append(String.format("Sequencing sample: '%s' is %s", - sequencingSampleIdentifier, actionDescription)); - sb.append("\n"); - } - } - } - - private void appendDataSetsInfo(final StringBuilder sb) - { - if (getDataSets().isEmpty()) - { - sb.append("no new data sets tracked"); - } else - { - sb.append(getDataSets().size() + " new data set(s) tracked: "); - for (AbstractExternalData dataSet : getDataSets()) - { - sb.append(dataSet.getIdentifier() + ", "); - } - } - sb.append("\n"); - } - - // - // Object - // - - @Override - public String toString() - { - return getDescription(); - } - -} diff --git a/deep_sequencing_unit/source/java/ch/ethz/bsse/cisd/dsu/tracking/email/EntityTrackingEmailDataManager.java b/deep_sequencing_unit/source/java/ch/ethz/bsse/cisd/dsu/tracking/email/EntityTrackingEmailDataManager.java deleted file mode 100644 index 3ddb5aacfbf422cfedbc21b7db2d5c1a3b9e3963..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/source/java/ch/ethz/bsse/cisd/dsu/tracking/email/EntityTrackingEmailDataManager.java +++ /dev/null @@ -1,206 +0,0 @@ -/* - * Copyright 2009 ETH Zuerich, CISD - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package ch.ethz.bsse.cisd.dsu.tracking.email; - -import java.util.Collection; -import java.util.Collections; -import java.util.HashMap; -import java.util.HashSet; -import java.util.Map; -import java.util.Set; - -import ch.ethz.bsse.cisd.dsu.tracking.dto.TrackedEntities; -import ch.systemsx.cisd.common.mail.EMailAddress; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.AbstractExternalData; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.IEntityProperty; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Sample; - -/** - * Manager that groups data about tracked entities into {@link EntityTrackingEmailData} objects. - * - * @author Piotr Buczek - * @author Manuel Kohler - */ -class EntityTrackingEmailDataManager -{ - private final static String CONTACT_PERSON_EMAIL = "CONTACT_PERSON_EMAIL"; - - private final static String PRINCIPAL_INVESTIGATOR_EMAIL = "PRINCIPAL_INVESTIGATOR_EMAIL"; - - private final static String CONTACT_DATA_MANAGER_EMAIL = "CONTACT_DATA_MANAGER_EMAIL"; - - private static Map<String, String> recipientsBySpace; - - public static void initialize(final Map<String, String> recipients) - { - recipientsBySpace = recipients; - } - - public static Collection<EntityTrackingEmailData> groupByRecipient( - TrackedEntities trackedEntities) - { - assert recipientsBySpace != null : "recipientsBySpace not initialized"; - // <recipients email, email data> - final Map<EMailAddress, EntityTrackingEmailData> dataByRecipient = - new HashMap<EMailAddress, EntityTrackingEmailData>(); - groupSequencingSamplesToBeProcessed(dataByRecipient, trackedEntities); - groupSequencingSamplesProcessed(dataByRecipient, trackedEntities); - groupDataSetSamples(dataByRecipient, trackedEntities); - return dataByRecipient.values(); - } - - public static Collection<EntityTrackingEmailData> groupByRecipientDataSets( - TrackedEntities trackedEntities) - { - assert recipientsBySpace != null : "recipientsBySpace not initialized"; - // <recipients email, email data> - final Map<EMailAddress, EntityTrackingEmailData> dataByRecipient = - new HashMap<EMailAddress, EntityTrackingEmailData>(); - groupDataSetSamples(dataByRecipient, trackedEntities); - return dataByRecipient.values(); - } - - /** Puts tracked sequencing samples to be processed grouped by recipient into <var>result</var>. */ - private static void groupSequencingSamplesToBeProcessed( - Map<EMailAddress, EntityTrackingEmailData> result, TrackedEntities trackedEntities) - { - for (Sample sequencingSample : trackedEntities.getSequencingSamplesToBeProcessed()) - { - for (EMailAddress recipient : getSequencingSampleTrackingRecipients(Collections - .singleton(sequencingSample))) - { - final EntityTrackingEmailData emailData = - getOrCreateRecipientEmailData(result, recipient); - emailData.addSequencingSampleToBeProcessed(sequencingSample); - } - } - } - - /** Puts tracked processed sequencing samples grouped by recipient into <var>result</var>. */ - private static void groupSequencingSamplesProcessed( - Map<EMailAddress, EntityTrackingEmailData> result, TrackedEntities trackedEntities) - { - for (Sample sequencingSample : trackedEntities.getSequencingSamplesProcessed()) - { - for (EMailAddress recipient : getSequencingSampleTrackingRecipients(Collections - .singleton(sequencingSample))) - { - final EntityTrackingEmailData emailData = - getOrCreateRecipientEmailData(result, recipient); - emailData.addSequencingSampleProcessed(sequencingSample); - } - } - } - - /** Puts tracked data sets grouped by recipient into <var>result</var>. */ - private static void groupDataSetSamples(Map<EMailAddress, EntityTrackingEmailData> result, - TrackedEntities trackedEntities) - { - for (AbstractExternalData dataSet : trackedEntities.getDataSets()) - { - for (EMailAddress recipient : getDataSetTrackingRecipients(dataSet)) - { - final EntityTrackingEmailData emailData = - getOrCreateRecipientEmailData(result, recipient); - emailData.addDataSet(dataSet); - } - } - } - - private static EntityTrackingEmailData getOrCreateRecipientEmailData( - Map<EMailAddress, EntityTrackingEmailData> dataByRecipient, EMailAddress recipient) - { - EntityTrackingEmailData emailDataOrNull = dataByRecipient.get(recipient); - if (emailDataOrNull == null) - { - emailDataOrNull = new EntityTrackingEmailData(recipient); - dataByRecipient.put(recipient, emailDataOrNull); - } - return emailDataOrNull; - } - - /** - * Returns a set of emails of recipients that should get a tracking information about given <var>sequencingSample</var>.<br> - */ - // NOTE: Set is needed because one recipient can occur in many roles for one sample - private static Set<EMailAddress> getSequencingSampleTrackingRecipients( - Collection<Sample> sequencingSamples) - { - assert sequencingSamples != null; - - final Set<EMailAddress> recipients = new HashSet<EMailAddress>(); - - // Recipients are taken from properties of the sequencing sample. - final Set<String> recipientPropertyTypeCodes = new HashSet<String>(); - recipientPropertyTypeCodes.add(CONTACT_PERSON_EMAIL); - recipientPropertyTypeCodes.add(PRINCIPAL_INVESTIGATOR_EMAIL); - recipientPropertyTypeCodes.add(CONTACT_DATA_MANAGER_EMAIL); - - for (Sample sequencingSample : sequencingSamples) - { - for (Map.Entry<String, String> space : recipientsBySpace.entrySet()) - { - if (sequencingSample.getIdentifier().split("/")[1].equals(space.getKey())) // 20.10 Bugfix to get Space Code - { - String spaceRecipientOrNull = - recipientsBySpace.get(space.getKey()); - if (spaceRecipientOrNull != null) - { - EMailAddress myEmail = new EMailAddress(spaceRecipientOrNull); - recipients.add(myEmail); - } - } - } - - for (IEntityProperty property : sequencingSample.getProperties()) - { - final String propertyCode = property.getPropertyType().getCode(); - final String propertyValue = property.tryGetAsString(); - if (recipientPropertyTypeCodes.contains(propertyCode)) - { - EMailAddress myEmail = new EMailAddress(propertyValue); - recipients.add(myEmail); - } - } - } - - return recipients; - } - - /** - * Returns a set of emails of recipients that should get a tracking information about given <var>flowLaneSample</var>. - */ - private static Set<EMailAddress> getFlowLaneSampleTrackingRecipients(Sample flowLaneSample) - { - // Recipients are taken from properties of sequencing sample - // that is a parent of the flow lane sample. - assert flowLaneSample != null; - return getSequencingSampleTrackingRecipients(flowLaneSample.getParents()); - } - - /** - * Returns a set of emails of recipients that should get a tracking information about given <var>dataSet</var>. - */ - private static Set<EMailAddress> getDataSetTrackingRecipients(AbstractExternalData dataSet) - { - // Recipients are taken from properties of sequencing sample - // that is a parent of a flow lane sample connected directly with the data set. - assert dataSet != null; - return getFlowLaneSampleTrackingRecipients(dataSet.getSample()); - } - -} \ No newline at end of file diff --git a/deep_sequencing_unit/source/java/ch/ethz/bsse/cisd/dsu/tracking/email/EntityTrackingEmailGenerator.java b/deep_sequencing_unit/source/java/ch/ethz/bsse/cisd/dsu/tracking/email/EntityTrackingEmailGenerator.java deleted file mode 100644 index d00978e62873769d0f76763d18dc8d75c5ab8467..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/source/java/ch/ethz/bsse/cisd/dsu/tracking/email/EntityTrackingEmailGenerator.java +++ /dev/null @@ -1,586 +0,0 @@ -/* - * Copyright 2009 ETH Zuerich, CISD - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package ch.ethz.bsse.cisd.dsu.tracking.email; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collection; -import java.util.Collections; -import java.util.HashMap; -import java.util.Iterator; -import java.util.List; -import java.util.Map; -import java.util.Map.Entry; -import java.util.Properties; -import java.util.TreeMap; - -import org.apache.commons.lang3.time.DateUtils; - -import ch.ethz.bsse.cisd.dsu.tracking.dto.TrackedEntities; -import ch.ethz.bsse.cisd.dsu.tracking.main.Parameters; -import ch.systemsx.cisd.common.mail.EMailAddress; -import ch.systemsx.cisd.common.properties.PropertyUtils; -import ch.systemsx.cisd.common.shared.basic.string.StringUtils; -import ch.systemsx.cisd.common.spring.HttpInvokerUtils; -import ch.systemsx.cisd.openbis.generic.client.web.client.application.util.lang.StringEscapeUtils; -import ch.systemsx.cisd.openbis.generic.shared.api.v1.IGeneralInformationService; -import ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.SpaceWithProjectsAndRoleAssignments; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.AbstractExternalData; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.IEntityProperty; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Sample; -import ch.systemsx.cisd.openbis.generic.shared.dto.SessionContextDTO; - -/** - * @author Piotr Buczek - * @author Manuel Kohler - */ -public class EntityTrackingEmailGenerator implements IEntityTrackingEmailGenerator -{ - private static final String DB_INSTANCE = "BSSE"; - - private static final String NOTIFICATION_EMAIL_FROM = "mail.from"; - - private static final String NOTIFICATION_EMAIL_REPLY_TO = "notification-email-reply-to"; - - private static final String NOTIFICATION_EMAIL_SUBJECT = "notification-email-subject"; - - private static final String AFFILIATION_NOTIFICATION_EMAIL_CONTACT_SUFFIX = - "-affiliation-notification-email-contact"; - - private static final String SPACE_NOTIFICATION_EMAIL_CONTACT_SUFFIX = "-space-notification-email-contact"; - - private final EMailAddress from; - - private final EMailAddress replyTo; - - private final String subject; - - private final String template; - - public EntityTrackingEmailGenerator(Properties properties, String template, SessionContextDTO session) - { - this.from = new EMailAddress(PropertyUtils.getMandatoryProperty(properties, NOTIFICATION_EMAIL_FROM)); - this.replyTo = new EMailAddress(PropertyUtils.getMandatoryProperty(properties, NOTIFICATION_EMAIL_REPLY_TO)); - this.subject = PropertyUtils.getMandatoryProperty(properties, NOTIFICATION_EMAIL_SUBJECT); - this.template = template; - - final Map<String, String> recipientsBySpace = - retrieveRecipientsBySpace(properties, session); - EntityTrackingEmailDataManager.initialize(recipientsBySpace); - - } - - // <affiliation, recipient email> - @Deprecated - private Map<String, String> retrieveRecipientsByAffiliation(Properties properties) - { - final Map<String, String> result = new HashMap<String, String>(); - - for (Object key : properties.keySet()) - { - final String propertyKey = (String) key; - if (propertyKey.endsWith(AFFILIATION_NOTIFICATION_EMAIL_CONTACT_SUFFIX)) - { - final String affiliation = - propertyKey.substring(0, propertyKey.length() - - AFFILIATION_NOTIFICATION_EMAIL_CONTACT_SUFFIX.length()); - final String affiliationRecipient = - PropertyUtils.getMandatoryProperty(properties, propertyKey); - result.put(affiliation, affiliationRecipient); - } - } - return result; - } - - /** - * Builds a Map of <spaces, email addresses> - * - * @author Manuel Kohler - */ - private Map<String, String> retrieveRecipientsBySpace(Properties properties, SessionContextDTO session) - { - final Map<String, String> result = new HashMap<String, String>(); - - Parameters params = new Parameters(properties); - String serviceURL = params.getOpenbisServerURL() + IGeneralInformationService.SERVICE_URL; - IGeneralInformationService gis = HttpInvokerUtils.createServiceStub(IGeneralInformationService.class, serviceURL, - 5 * DateUtils.MILLIS_PER_MINUTE); - - List<SpaceWithProjectsAndRoleAssignments> spacesList = - gis.listSpacesWithProjectsAndRoleAssignments(session.getSessionToken(), DB_INSTANCE); - - for (Object key : properties.keySet()) - { - final String propertyKey = (String) key; - - if (propertyKey.endsWith(SPACE_NOTIFICATION_EMAIL_CONTACT_SUFFIX)) - { - if (propertyKey.contains("*")) - { - String spacePreffix = propertyKey.substring(0, propertyKey.lastIndexOf("*")); - for (SpaceWithProjectsAndRoleAssignments space : spacesList) - { - if (space.getCode().startsWith(spacePreffix)) - { - final String spaceRecipient = - PropertyUtils.getMandatoryProperty(properties, propertyKey); - result.put(space.getCode(), spaceRecipient); - } - } - } else - { - final String space = - propertyKey.substring(0, propertyKey.length() - - SPACE_NOTIFICATION_EMAIL_CONTACT_SUFFIX.length()); - final String spaceRecipient = - PropertyUtils.getMandatoryProperty(properties, propertyKey); - result.put(space, spaceRecipient); - } - } - } - return result; - } - - @Override - public List<EmailWithSummary> generateEmails(TrackedEntities trackedEntities) - { - final Collection<EntityTrackingEmailData> emailDataGroupedByRecipient = - EntityTrackingEmailDataManager.groupByRecipient(trackedEntities); - - final List<EmailWithSummary> results = new ArrayList<EmailWithSummary>(); - for (EntityTrackingEmailData emailData : emailDataGroupedByRecipient) - { - results.add(createEmailWithSummary(emailData)); - } - return results; - } - - public List<EmailWithSummary> generateDataSetsEmails(TrackedEntities trackedEntities) - { - final Collection<EntityTrackingEmailData> emailDataGroupedByRecipientDataSets = - EntityTrackingEmailDataManager.groupByRecipientDataSets(trackedEntities); - - final List<EmailWithSummary> results = new ArrayList<EmailWithSummary>(); - for (EntityTrackingEmailData emailData : emailDataGroupedByRecipientDataSets) - { - results.add(createEmailWithSummary(emailData)); - } - return results; - } - - private EmailWithSummary createEmailWithSummary(EntityTrackingEmailData emailData) - { - return new EmailWithSummary(createEmail(emailData), emailData.getDescription()); - } - - private Email createEmail(EntityTrackingEmailData emailData) - { - String content = EmailContentGenerator.fillTemplateWithData(template, emailData); - EMailAddress recipients = emailData.getRecipient(); - - String[] mailStringArray = filterBlanks(recipients.tryGetEmailAddress().split(",|;| ")); - EMailAddress[] recipientsArray = new EMailAddress[mailStringArray.length]; - - for (int i = 0; i < mailStringArray.length; ++i) - { - EMailAddress e = new EMailAddress(mailStringArray[i]); - recipientsArray[i] = e; - } - - return new Email(subject, content, replyTo, from, recipientsArray); - - } - - private static String[] filterBlanks(String[] arr) - { - ArrayList<String> result = new ArrayList<String>(); - - for (String s : arr) - { - if (false == StringUtils.isBlank(s)) - { - result.add(s.trim()); - } - } - - return result.toArray(new String[0]); - } - - /** - * Helper class for generation of email content. - * - * @author Piotr Buczek - */ - private static final class EmailContentGenerator - { - private static final char NEW_LINE = '\n'; - - private static final int SEPARATOR_LINE_WIDTH = 100; - - private static final char SECTION_SEPARATOR_CHAR = '#'; - - private static final char SUBSECTION_SEPARATOR_CHAR = '-'; - - private static final String SECTION_SEPARATOR_LINE = - createSeparatorLine(SECTION_SEPARATOR_CHAR); - - private static final String SUBSECTION_SEPARATOR_LINE = - createSeparatorLine(SUBSECTION_SEPARATOR_CHAR); - - private final static String EXTERNAL_SAMPLE_NAME_PROPERTY_CODE = "EXTERNAL_SAMPLE_NAME"; - - private final static String CONTACT_PERSON_NAME_PROPERTY_CODE = "CONTACT_PERSON_NAME"; - - private final static String INDEX1_PROPERTY_CODE = "BARCODE"; - - private final static String INDEX2_PROPERTY_CODE = "INDEX2"; - - private static final String PERMLINK_LABEL = "See details in openBIS"; - - private static final String GENARATED_CONTENT_TARGET = "{generated-content}"; - - public static String fillTemplateWithData(String template, EntityTrackingEmailData emailData) - { - return template.replace(GENARATED_CONTENT_TARGET, generateContent(emailData)); - } - - private static String generateContent(EntityTrackingEmailData emailData) - { - StringBuilder sb = new StringBuilder(); - appendDataSetsData(sb, emailData.getDataSets()); - appendSequencingSamplesData(sb, emailData.getSequencingSamplesToBeProcessed(), false); - appendSequencingSamplesData(sb, emailData.getSequencingSamplesProcessed(), true); - return sb.toString(); - } - - private static void appendSequencingSamplesData(StringBuilder sb, - Collection<Sample> sequencingSamples, boolean processed) - { - for (Sample sequencingSample : sequencingSamples) - { - final String externalSampleName = getExternalSampleName(sequencingSample); - - appendln(sb, SECTION_SEPARATOR_LINE); - appendln(sb, SUBSECTION_SEPARATOR_LINE); - - // append Sequencing sample details - if (processed) - { - appendSampleDetails(sb, - String.format("Library processing of sample '%s' was successful.", - externalSampleName), sequencingSample); - appendln(sb, SUBSECTION_SEPARATOR_LINE); - } else - { - appendSampleDetails(sb, String.format( - "Library processing of sample '%s' is possible.", externalSampleName), - sequencingSample); - appendln(sb, SUBSECTION_SEPARATOR_LINE); - } - } - } - - private static void appendSampleDetails(StringBuilder sb, String heading, Sample sample) - { - appendln(sb, heading); - - // basic sample info - appendAttribute(sb, PERMLINK_LABEL, sample.getSearchlink()); - appendAttribute(sb, "Sample identifier", sample.getIdentifier()); - appendNewline(sb); - - // sample properties - appendProperties(sb, sample.getProperties()); - } - - private static void appendDataSetsData(StringBuilder sb, List<AbstractExternalData> dataSets) - { - if (dataSets.isEmpty()) - { - return; - } - appendln(sb, SECTION_SEPARATOR_LINE); - appendln(sb, SUBSECTION_SEPARATOR_LINE); - appendln(sb, "There are new sequencing results available to you."); - appendln(sb, SUBSECTION_SEPARATOR_LINE); - - // Using a TreeMap, so the keys are sorted - TreeMap<String, List<AbstractExternalData>> sampleMap = new TreeMap<String, List<AbstractExternalData>>(); - List<AbstractExternalData> dsList = new ArrayList<AbstractExternalData>(); - - // we just loop over the data sets and write the connected samples as keys - // and the data sets as values in a map, so that we can group together as - // data sets per lane - for (AbstractExternalData dataSet : dataSets) - { - Sample s = dataSet.getSample(); - if (sampleMap.containsKey(s.getIdentifier())) - { - dsList = sampleMap.get(s.getIdentifier()); - } - dsList.add(dataSet); - sampleMap.put(s.getIdentifier(), dsList); - dsList = new ArrayList<AbstractExternalData>(); - } - - // now we can write out this per sample - Iterator<Entry<String, List<AbstractExternalData>>> it = sampleMap.entrySet().iterator(); - while (it.hasNext()) - { - Map.Entry pairs = (Map.Entry) it.next(); - appendln(sb, String.format("Results for %s", pairs.getKey())); - dsList = (List<AbstractExternalData>) pairs.getValue(); - for (AbstractExternalData ed : dsList) - { - appendDataSetDetails(sb, ed); - } - it.remove(); // avoids a ConcurrentModificationException - appendln(sb, SUBSECTION_SEPARATOR_LINE); - } - } - - private static void appendDataSetDetails(StringBuilder sb, AbstractExternalData dataSet) - { - Collection<Sample> sequencingSamples; - - Sample flowLaneSample = dataSet.getSample(); - assert flowLaneSample != null; - sequencingSamples = flowLaneSample.getParents(); - assert sequencingSamples != null; - - String Index1 = getIndex1(dataSet); - String Index2 = getIndex2(dataSet); - - HashMap<String, String> parentProperties = propertiesFromParentSample(dataSet, sequencingSamples, Index1, Index2); - - String externalSampleName = getExternalSampleNamefromDataSet(dataSet); - String contactPersonName = parentProperties.get(CONTACT_PERSON_NAME_PROPERTY_CODE); - - String Index = null; - - if (Index1 != null) - { - Index = Index1; - } - if (Index2 != null) - { - Index = Index + "-" + Index2; - } - - if (Index != null && externalSampleName != null) - { - appendln(sb, "Data Set Type: " + dataSet.getDataSetType().toString() + - " Index: " + Index + ", External Sample Name: " + externalSampleName + - ", Contact Person: " + contactPersonName); - } - else - { - appendln(sb, "Data Set Type: " + dataSet.getDataSetType().toString() + ", No Meta Data"); - } - appendln(sb, dataSet.getPermlink()); - } - - private static String getExternalSampleName(Sample sequencingSample) - { - String externalSampleName = - tryGetSamplePropertyValue(sequencingSample, EXTERNAL_SAMPLE_NAME_PROPERTY_CODE); - assert externalSampleName != null; - return externalSampleName; - } - - private static String getContactPersonName(Sample sequencingSample) - { - String contactPersonName = tryGetSamplePropertyValue(sequencingSample, CONTACT_PERSON_NAME_PROPERTY_CODE); - assert contactPersonName != null; - return contactPersonName; - } - - private static String getIndex1(AbstractExternalData dataSet) - { - List<IEntityProperty> properties = dataSet.getProperties(); - - String Index = null; - for (IEntityProperty p : properties) - { - if (p.getPropertyType().getCode().equals(INDEX1_PROPERTY_CODE)) - { - Index = p.getVocabularyTerm().getCode(); - if (!Index.equals("NOINDEX")) - { - return Index; - } - } - } - return null; - } - - private static String getIndex2(AbstractExternalData dataSet) - { - List<IEntityProperty> properties = dataSet.getProperties(); - - String Index = null; - for (IEntityProperty p : properties) - { - if (p.getPropertyType().getCode().equals(INDEX2_PROPERTY_CODE)) - { - Index = p.getVocabularyTerm().getCode(); - if (!Index.equals("NOINDEX")) - { - return Index; - } - } - } - return null; - } - - private static String getExternalSampleNamefromDataSet(AbstractExternalData dataSet) - { - List<IEntityProperty> properties = dataSet.getProperties(); - - String externalSampleName = null; - for (IEntityProperty p : properties) - { - if (p.getPropertyType().getCode().equals(EXTERNAL_SAMPLE_NAME_PROPERTY_CODE)) - { - externalSampleName = p.getValue(); - return externalSampleName; - } - } - return null; - } - - private static HashMap<String, String> propertiesFromParentSample(AbstractExternalData dataSet, - Collection<Sample> sequencingSamples, String dsIndex1, String dsIndex2) - { - HashMap<String, String> parentPropertiesMap = new HashMap<String, String>(); - if (dsIndex1 == null) - { - return parentPropertiesMap; - } - if (dsIndex2 == null) - { - dsIndex2 = ""; - } - - for (Sample parent : sequencingSamples) - { - String parentIndex1 = ""; - String parentIndex2 = ""; - String externalSampleName = ""; - String contactPersonName = ""; - - List<IEntityProperty> parentSampleProperties = parent.getProperties(); - for (IEntityProperty pp : parentSampleProperties) - { - if (pp.getPropertyType().getCode().equals(INDEX1_PROPERTY_CODE)) - { - parentIndex1 = pp.getVocabularyTerm().getCode(); - } - - if (pp.getPropertyType().getCode().equals(INDEX2_PROPERTY_CODE)) - { - parentIndex2 = pp.getVocabularyTerm().getCode(); - if (parentIndex2.equals(null)) - { - parentIndex2 = ""; - } - } - - if (pp.getPropertyType().getCode().equals(EXTERNAL_SAMPLE_NAME_PROPERTY_CODE)) - { - externalSampleName = pp.getValue(); - } - - if (pp.getPropertyType().getCode().equals(CONTACT_PERSON_NAME_PROPERTY_CODE)) - { - contactPersonName = pp.getValue(); - } - - // //if(index1 == parentIndex1 && (!index2 || !parentIndex2 || index2 == parentIndex2)){ - if (parentIndex1.equals(dsIndex1) && (!(dsIndex2.isEmpty()) || !(parentIndex2.isEmpty()) || parentIndex2.equals(dsIndex2))) - { - - parentIndex1 = ""; - parentIndex2 = ""; - - // System.out.println("Found matching meta data for: " + dataSet.getCode() + " from " + parent.getCode()); - - parentPropertiesMap.put(EXTERNAL_SAMPLE_NAME_PROPERTY_CODE, externalSampleName); - parentPropertiesMap.put(CONTACT_PERSON_NAME_PROPERTY_CODE, contactPersonName); - } - - } - - } - return parentPropertiesMap; - } - - private static String tryGetSamplePropertyValue(Sample sequencingSample, String propertyCode) - { - String result = null; - for (IEntityProperty property : sequencingSample.getProperties()) - { - if (property.getPropertyType().getCode().equals(propertyCode)) - { - result = StringEscapeUtils.unescapeHtml(property.getValue()); - break; - } - } - return result; - } - - // NOTE: Information about properties assigned to entity type are not loaded. - // If it would be available we could append information about all properties assigned - // to entity type, not only about properties filled for specific entity. Additionally - // we could group entities by in sections. - private static void appendProperties(StringBuilder sb, List<IEntityProperty> properties) - { - Collections.sort(properties); // sorting by property label or code if there is no label - for (IEntityProperty property : properties) - { - final String label = property.getPropertyType().getLabel(); - final String valueOrNull = property.tryGetAsString(); - appendAttribute(sb, label, valueOrNull); - } - } - - private static void appendAttribute(StringBuilder sb, String name, String valueOrNull) - { - appendln(sb, String.format("- %s:\n\t\t%s", StringEscapeUtils.unescapeHtml(name), - valueOrNull == null ? "(empty)" : StringEscapeUtils.unescapeHtml(valueOrNull))); - } - - private static void appendln(StringBuilder sb, String string) - { - sb.append(string); - appendNewline(sb); - } - - private static void appendNewline(StringBuilder sb) - { - sb.append(NEW_LINE); - } - - private static String createSeparatorLine(char separatorChar) - { - char[] line = new char[SEPARATOR_LINE_WIDTH]; - Arrays.fill(line, separatorChar); - return new String(line); - } - - } -} diff --git a/deep_sequencing_unit/source/java/ch/ethz/bsse/cisd/dsu/tracking/email/IEntityTrackingEmailGenerator.java b/deep_sequencing_unit/source/java/ch/ethz/bsse/cisd/dsu/tracking/email/IEntityTrackingEmailGenerator.java deleted file mode 100644 index 5d898f6eec501812660e3b23c4146542de6866ae..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/source/java/ch/ethz/bsse/cisd/dsu/tracking/email/IEntityTrackingEmailGenerator.java +++ /dev/null @@ -1,37 +0,0 @@ -/* - * Copyright 2009 ETH Zuerich, CISD - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package ch.ethz.bsse.cisd.dsu.tracking.email; - -import java.util.List; - -import ch.ethz.bsse.cisd.dsu.tracking.dto.TrackedEntities; - -/** - * @author Piotr Buczek - * @author Manuel Kohler - */ -public interface IEntityTrackingEmailGenerator -{ - /** - * Generates all {@link EmailWithSummary}s to be send containing information about <var>trackedEntities</var>. - * - * @param trackedEntities recently tracked entities - */ - List<EmailWithSummary> generateEmails(TrackedEntities trackedEntities); - - List<EmailWithSummary> generateDataSetsEmails(TrackedEntities changedEntities); -} diff --git a/deep_sequencing_unit/source/java/ch/ethz/bsse/cisd/dsu/tracking/main/FileBasedTrackingDAO.java b/deep_sequencing_unit/source/java/ch/ethz/bsse/cisd/dsu/tracking/main/FileBasedTrackingDAO.java deleted file mode 100644 index 309e0099db69450dc344bb438fb2f020200d17d5..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/source/java/ch/ethz/bsse/cisd/dsu/tracking/main/FileBasedTrackingDAO.java +++ /dev/null @@ -1,141 +0,0 @@ -/* - * Copyright 2009 ETH Zuerich, CISD - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package ch.ethz.bsse.cisd.dsu.tracking.main; - -import java.io.File; -import java.io.FileOutputStream; -import java.io.FileReader; -import java.io.IOException; -import java.util.ArrayList; -import java.util.Collection; -import java.util.List; -import java.util.Map; -import java.util.Properties; -import java.util.Set; -import java.util.TreeMap; -import java.util.TreeSet; - -import org.apache.commons.io.IOUtils; -import org.apache.commons.lang3.StringUtils; - -import ch.ethz.bsse.cisd.dsu.tracking.dto.TrackingStateDTO; -import ch.ethz.bsse.cisd.dsu.tracking.utils.LogUtils; -import ch.systemsx.cisd.common.io.PropertyIOUtils; - -/** - * @author Tomasz Pylak - * @author Manuel Kohler - */ -public class FileBasedTrackingDAO implements ITrackingDAO -{ - static String LAST_SEEN_DATASET_ID = "lastSeenDatasetId"; - - static String TO_BE_PROCESSED = "trackedSamplesToBeProcessed"; - - static String PROCESSED = "trackedSamplesProcessedSuccessfully"; - - static String SEPARATOR = " "; - - static String EQUAL = "="; - - private final String filePathSampleDb; - - private final String filePathDatasetDb; - - public FileBasedTrackingDAO(String filePathSampleDb, String filePathDatasetDb) - { - this.filePathSampleDb = filePathSampleDb; - this.filePathDatasetDb = filePathDatasetDb; - } - - @Override - public void saveTrackingState(TrackingStateDTO state) - { - List<String> lines = new ArrayList<String>(); - lines.add(TO_BE_PROCESSED + SEPARATOR - + sampleIdsAsString(state.getAlreadyTrackedSampleIdsToBeProcessed())); - lines.add(PROCESSED + SEPARATOR - + sampleIdsAsString(state.getAlreadyTrackedSampleIdsProcessed())); - - writeLines(new File(filePathSampleDb), lines); - - lines = new ArrayList<String>(); - for (Map.Entry<String, Long> entry : state.getLastSeenDataSetIdMap().entrySet()) - { - lines.add(entry.getKey() + EQUAL + entry.getValue()); - } - writeLines(new File(filePathDatasetDb), lines); - } - - private String sampleIdsAsString(Collection<Long> sampleIds) - { - return StringUtils.join(sampleIds, SEPARATOR); - } - - @Override - @SuppressWarnings("unchecked") - public TrackingStateDTO getTrackingState() - { - try - { - TrackingStateDTO state = new TrackingStateDTO(); - - Properties props = PropertyIOUtils.loadProperties(filePathDatasetDb); - TreeMap<String, Long> propsMap = new TreeMap<String, Long>(); - for (Object o : props.keySet()) - { - propsMap.put(o.toString(), Long.parseLong(props.get(o).toString())); - } - state.setLastSeenProperties(props); - state.setLastSeenDataSetIdMap(propsMap); - - List<String> lines = IOUtils.readLines(new FileReader(filePathSampleDb)); - String[] toBeProcessed = lines.get(0).split(SEPARATOR); - String[] processed = lines.get(1).split(SEPARATOR); - state.setAlreadyTrackedSampleIdsToBeProcessed(parseIds(toBeProcessed)); - state.setAlreadyTrackedSampleIdsProcessed(parseIds(processed)); - - return state; - } catch (Exception e) - { - throw LogUtils.environmentError("Incorrect file format", e); - } - } - - private static Set<Long> parseIds(String[] array) - { - Set<Long> ids = new TreeSet<Long>(); - for (int i = 1; i < array.length; i++) - { - ids.add(Long.parseLong(array[i])); - } - return ids; - } - - private static void writeLines(File file, List<String> lines) - { - try - { - IOUtils.writeLines(lines, "\n", new FileOutputStream(file)); - } catch (IOException ex) - { - throw LogUtils.environmentError(String.format( - "Cannot save the file %s with content: %s", file.getPath(), lines), ex); - } - } - -} diff --git a/deep_sequencing_unit/source/java/ch/ethz/bsse/cisd/dsu/tracking/main/ITrackingDAO.java b/deep_sequencing_unit/source/java/ch/ethz/bsse/cisd/dsu/tracking/main/ITrackingDAO.java deleted file mode 100644 index 10ac486dafa50763fc38da8fc73fd7dcbf0649b1..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/source/java/ch/ethz/bsse/cisd/dsu/tracking/main/ITrackingDAO.java +++ /dev/null @@ -1,29 +0,0 @@ -/* - * Copyright 2009 ETH Zuerich, CISD - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package ch.ethz.bsse.cisd.dsu.tracking.main; - -import ch.ethz.bsse.cisd.dsu.tracking.dto.TrackingStateDTO; - -/** - * @author Tomasz Pylak - */ -public interface ITrackingDAO -{ - void saveTrackingState(TrackingStateDTO state); - - TrackingStateDTO getTrackingState(); -} diff --git a/deep_sequencing_unit/source/java/ch/ethz/bsse/cisd/dsu/tracking/main/Parameters.java b/deep_sequencing_unit/source/java/ch/ethz/bsse/cisd/dsu/tracking/main/Parameters.java deleted file mode 100644 index 2b4d58a0f67cddfc0a1bbe72155042fe61c09eca..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/source/java/ch/ethz/bsse/cisd/dsu/tracking/main/Parameters.java +++ /dev/null @@ -1,224 +0,0 @@ -/* - * Copyright 2016 ETH Zuerich, SIS - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package ch.ethz.bsse.cisd.dsu.tracking.main; - -import static ch.systemsx.cisd.common.properties.PropertyUtils.getMandatoryProperty; - -import java.util.HashMap; -import java.util.Map; -import java.util.Properties; - -import ch.systemsx.cisd.common.mail.IMailClient; -import ch.systemsx.cisd.common.mail.MailClient; -import ch.systemsx.cisd.common.properties.PropertyUtils; - -/** - * @author Tomasz Pylak - * @author Manuel Kohler - */ -public class Parameters -{ - private static final String OPENBIS_USER = "openbis-user"; - - private static final String OPENBIS_PASSWORD = "openbis-password"; - - private static final String OPENBIS_SERVER_URL = "openbis-server-url"; - - private static final String PERMLINK_URL = "permlink-url"; - - private static final String TRACKING_ADMIN_EMAIL = "tracking-admin-email"; - - private static final String NOTIFICATION_EMAIL_FROM = "mail.from"; - - private static final String SPACE_WHITELIST = "space-whitelist"; - - private static final String DBM_SPACE_PREFIX = "dbm-space-prefix"; - - // For Development Mode - private static final String DEBUG = "debug"; - - private static final String OLD_DATA_SET_BACKLOG_NUMBER = "old-data-set-backlog-number"; - - private static final String DATA_SET_TYPE_LIST = "dataset-type-list"; - - private static final String DESTINATION_FOLDER = "destination-folder"; - - private static final String DESTINATION_FOLDER_SUFFIX = "destination-folder"; - - private static final String RSYNC_BINARY = "rsync-binary"; - - private static final String RSYNC_FLAGS = "rsync-flags"; - - private static final String DSS_ROOT_DIR = "dss-root-dir"; - - private final String openbisUser; - - private final String openbisPassword; - - private final String openbisServerURL; - - private final String permlinkURL; - - private final IMailClient mailClient; - - private final String adminEmail; - - private final String notificationEmail; - - private final String spaceWhitelist; - - private final String dbmSpacePrefix; - - private final boolean debug; - - private final long oldDataSetBacklogNumber; - - private final String dataSetTypeList; - - private final String destinationFolder; - - private final String rsyncBinary; - - private final String rsyncFlags; - - private final String dssRootDir; - - private final Map<String, String> destinationFolderMap; - - public Parameters(Properties props) - { - this.openbisUser = getMandatoryProperty(props, OPENBIS_USER); - this.openbisPassword = getMandatoryProperty(props, OPENBIS_PASSWORD); - this.openbisServerURL = getMandatoryProperty(props, OPENBIS_SERVER_URL); - this.permlinkURL = PropertyUtils.getProperty(props, PERMLINK_URL, openbisServerURL); - this.mailClient = new MailClient(props); - this.adminEmail = PropertyUtils.getProperty(props, TRACKING_ADMIN_EMAIL); - this.notificationEmail = PropertyUtils.getProperty(props, NOTIFICATION_EMAIL_FROM); - this.spaceWhitelist = PropertyUtils.getProperty(props, SPACE_WHITELIST); - this.dbmSpacePrefix = PropertyUtils.getProperty(props, DBM_SPACE_PREFIX); - this.debug = PropertyUtils.getBoolean(props, DEBUG, false); - this.oldDataSetBacklogNumber = PropertyUtils.getInt(props, OLD_DATA_SET_BACKLOG_NUMBER, 0); - this.dataSetTypeList = PropertyUtils.getProperty(props, DATA_SET_TYPE_LIST); - this.destinationFolder= PropertyUtils.getProperty(props, DESTINATION_FOLDER); - this.rsyncBinary = PropertyUtils.getProperty(props, RSYNC_BINARY); - this.rsyncFlags = PropertyUtils.getProperty(props, RSYNC_FLAGS); - this.dssRootDir = PropertyUtils.getProperty(props, DSS_ROOT_DIR); - - this.destinationFolderMap = this.setDataDestinationFolder(props); - } - - public String getOpenbisUser() - { - return openbisUser; - } - - public String getOpenbisPassword() - { - return openbisPassword; - } - - public String getOpenbisServerURL() - { - return openbisServerURL; - } - - public IMailClient getMailClient() - { - return mailClient; - } - - public String getPermlinkURL() - { - return permlinkURL; - } - - public String getAdminEmail() - { - return adminEmail; - } - - public String getNotificationEmail() - { - return notificationEmail; - } - - public String getSpaceWhitelist() - { - return spaceWhitelist; - } - - public String getDbmSpacePrefix() - { - return dbmSpacePrefix; - } - - public boolean getDebug() - { - return debug; - } - - public long getoldDataSetBacklogNumber() - { - return oldDataSetBacklogNumber; - } - - public String getdataSetTypeList() - { - return dataSetTypeList; - } - - public String getDestinationFolder() - { - return destinationFolder; - } - - public String getRsyncBinary() - { - return rsyncBinary; - } - - public String [] getRsyncFlags() - { - return rsyncFlags.split("\\s+"); - } - - public String getDssRoot() - { - return dssRootDir; - } - - public Map<String, String> getDestinationFolderMap() { - return destinationFolderMap; - } - - private Map<String, String> setDataDestinationFolder(Properties properties) { - - final Map<String, String> destinationFolderMap = new HashMap<String, String>(); - - for (Object key : properties.keySet()) - { - final String propertyKey = (String) key; - - if (propertyKey.endsWith(DESTINATION_FOLDER_SUFFIX)) - { - String datasetTypePrefix = propertyKey.split("-")[0]; - destinationFolderMap.put(datasetTypePrefix, PropertyUtils.getMandatoryProperty(properties, propertyKey)); - } - } - return destinationFolderMap; - } -} \ No newline at end of file diff --git a/deep_sequencing_unit/source/java/ch/ethz/bsse/cisd/dsu/tracking/main/TrackingBO.java b/deep_sequencing_unit/source/java/ch/ethz/bsse/cisd/dsu/tracking/main/TrackingBO.java deleted file mode 100644 index d96c507f08d0e624df0565481bef59de6fd6ba87..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/source/java/ch/ethz/bsse/cisd/dsu/tracking/main/TrackingBO.java +++ /dev/null @@ -1,801 +0,0 @@ -/* - * Copyright 2015 ETH Zuerich, CISD - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package ch.ethz.bsse.cisd.dsu.tracking.main; - -import java.io.File; -import java.io.IOException; -import java.text.SimpleDateFormat; -import java.util.*; -import java.util.Map.Entry; - -import ch.ethz.bsse.cisd.dsu.tracking.dto.TrackedEntities; -import ch.ethz.bsse.cisd.dsu.tracking.dto.TrackingStateDTO; -import ch.ethz.bsse.cisd.dsu.tracking.email.Email; -import ch.ethz.bsse.cisd.dsu.tracking.email.EmailWithSummary; -import ch.ethz.bsse.cisd.dsu.tracking.email.IEntityTrackingEmailGenerator; -import ch.ethz.bsse.cisd.dsu.tracking.utils.LogUtils; -import ch.systemsx.cisd.common.collection.CollectionUtils; -import ch.systemsx.cisd.common.exceptions.EnvironmentFailureException; -import ch.systemsx.cisd.common.exceptions.Status; -import ch.systemsx.cisd.common.filesystem.rsync.RsyncCopier; -import ch.systemsx.cisd.common.mail.EMailAddress; -import ch.systemsx.cisd.common.mail.IMailClient; -import ch.systemsx.cisd.openbis.generic.shared.ITrackingServer; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.AbstractExternalData; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DataSetArchivingStatus; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.IEntityProperty; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Sample; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.TrackingDataSetCriteria; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.TrackingSampleCriteria; -import ch.systemsx.cisd.openbis.generic.shared.dto.SessionContextDTO; -import ch.systemsx.cisd.openbis.generic.shared.dto.identifier.SampleIdentifier; -import ch.ethz.sis.openbis.generic.asapi.v3.IApplicationServerApi; -import ch.ethz.sis.openbis.generic.asapi.v3.dto.common.search.SearchResult; -// v3 -import ch.ethz.sis.openbis.generic.asapi.v3.dto.sample.fetchoptions.SampleFetchOptions; -import ch.ethz.sis.openbis.generic.asapi.v3.dto.sample.search.SampleSearchCriteria; -import ch.ethz.sis.openbis.generic.asapi.v3.dto.sample.update.SampleUpdate; - -/** - * @author Tomasz Pylak - * @author Manuel Kohler - */ - -public class TrackingBO -{ - private static final String HIGH_PRIORITY_DATA_SET_TYPE = "FASTQ_GZ"; - - private static final String ORIGINAL_PATH = "/original/"; - - private static final String PROPERTY_RUN_NAME_FOLDER = "RUN_NAME_FOLDER"; - - private static final String SEQUENCING_SAMPLE_TYPE = "ILLUMINA_SEQUENCING"; - - private static final String FLOW_LANE_SAMPLE_TYPE = "ILLUMINA_FLOW_LANE"; - - private static final String PROCESSING_POSSIBLE_PROPERTY_CODE = "LIBRARY_PROCESSING_POSSIBLE"; - - private static final String PROCESSING_SUCCESSFUL_PROPERTY_CODE = - "LIBRARY_PROCESSING_SUCCESSFUL"; - - private static final String PROPERTY_DATA_TRANSFERRED = "DATA_TRANSFERRED"; - - /** The default date format pattern. */ - public static final String DATE_FORMAT_PATTERN = "yyyy-MM-dd HH:mm:ss"; - - private static final String TRUE = "true"; - - private final ITrackingServer trackingServer; - - private final IEntityTrackingEmailGenerator emailGenerator; - - private final IMailClient mailClient; - - public TrackingBO(ITrackingServer trackingServer, IEntityTrackingEmailGenerator emailGenerator, - IMailClient mailClient) - { - this.trackingServer = trackingServer; - this.emailGenerator = emailGenerator; - this.mailClient = mailClient; - } - - public void trackAndNotify(ITrackingDAO trackingDAO, final HashMap<String, String[]> commandLineMap, - Parameters params, SessionContextDTO session, IApplicationServerApi v3, String v3SessionToken) - { - Boolean sendEmails = true; - TrackingStateDTO prevTrackingState = trackingDAO.getTrackingState(); - - extractCommandLineFlags(commandLineMap); - LogUtils.debug("prevTrackingState: " + prevTrackingState.getLastSeenDataSetIdMap().toString()); - - TrackedEntities changedEntities = null; - List<EmailWithSummary> emailsWithSummary = null; - - if (commandLineMap.get(TrackingClient.CL_PARAMETER_LANES) != null) - { - String[] laneCodeList = commandLineMap.get(TrackingClient.CL_PARAMETER_LANES); - changedEntities = fetchChangedDataSets(prevTrackingState, trackingServer, params, - commandLineMap, laneCodeList, session, v3, v3SessionToken); - } - - else if (commandLineMap.get(TrackingClient.CL_PARAMETER_REMOVE_LANES) != null) - { - sendEmails = false; - String[] laneCodeList = commandLineMap.get(TrackingClient.CL_PARAMETER_REMOVE_LANES); - changedEntities = fetchChangedDataSets(prevTrackingState, trackingServer, params, - commandLineMap, laneCodeList, session, v3, v3SessionToken); - } - - else if (commandLineMap.containsKey(TrackingClient.CL_PARAMETER_ALL)) - { - // changedEntities = fetchChangedEntities(prevTrackingState, trackingServer, commandLineMap, session); - System.out.println("This function is deactivated"); - } - - // just list the potential changed lanes - else if (commandLineMap.containsKey(TrackingClient.CL_PARAMETER_CHANGED_LANES)) - { - Map<String, String> changed_lanes = fetchChangedLanes(prevTrackingState, trackingServer, params, session); - sendEmails = false; - - } else if (commandLineMap.containsKey(TrackingClient.CL_PARAMETER_LIST_SPACES)) - { - sendEmails = false; - String trimmedSpaceWhiteList = ""; - - String spaceWhiteList = (params.getSpaceWhitelist()); - trimmedSpaceWhiteList = spaceWhiteList.replace(" ", ""); - - // trim each list element and sort then - // String trimmedSpaceList = - // Pattern.compile(",") - // .splitAsStream(params.getSpaceWhitelist()) - // .map(String :: trim) - // .sorted() - // .collect(Collectors.joining(",")); - System.out.println(trimmedSpaceWhiteList); - } - - else - { - LogUtils.debug("Should never be reached."); - } - - if (sendEmails) - { - emailsWithSummary = emailGenerator.generateDataSetsEmails(changedEntities); - sendEmails(emailsWithSummary, mailClient); - - } else - { - LogUtils.info("Not sending out any emails."); - } - - if (!params.getDebug() && changedEntities != null) - { - LogUtils.info("Saving new state to tracking database."); - saveTrackingState(prevTrackingState, changedEntities, trackingDAO); - } else - { - LogUtils.info("Debug mode activated! Won't save anything to the tracking database."); - } - - } - - private void extractCommandLineFlags(final HashMap<String, String[]> commandLineMap) - { - StringBuilder sb = new StringBuilder(); - for (Map.Entry<String, String[]> entry : commandLineMap.entrySet()) - { - sb.append(entry.getKey() + " "); - if (entry.getValue() != null) - { - for (String value : entry.getValue()) - { - sb.append(value); - } - } - } - LogUtils.info("Got these command line flags: '" + sb + "'"); - } - - private static void sendEmails(List<EmailWithSummary> emailsWithSummary, IMailClient mailClient) - { - for (EmailWithSummary emailWithSummary : emailsWithSummary) - { - Email email = emailWithSummary.getEmail(); - try - { - logEmailSummary(emailWithSummary); - sendMessage(mailClient, email); - } catch (Exception ex) - { - sendErrorReport(mailClient, ex, email); - } - } - } - - private static void logEmailSummary(EmailWithSummary emailWithSummary) - { - LogUtils.info("Sending an email [" + emailWithSummary.getEmail().getSubject() - + "]. Summary:\n" + emailWithSummary.getSummary()); - } - - // This email could not be sent, most probably the recipient addresses were - // incorrect. - // We send the email to the administrator "replyTo' address, the admin should - // forward it to the right recipient. - private static void sendErrorReport(IMailClient mailClient, Exception exception, Email email) - { - StringBuilder errorReportContentBuilder = new StringBuilder(); - appendLine(errorReportContentBuilder, "Dear openBIS Admin,"); - appendLine(errorReportContentBuilder, - "This email has been generated automatically from the openBIS Changes Tracking system."); - appendLine(errorReportContentBuilder, "There was a failure while trying to send the email:"); - appendLine(errorReportContentBuilder, exception.getMessage() == null ? "<no details>" - : exception.getMessage()); - appendLine(errorReportContentBuilder, - "The possible reason is that the recipient address is not valid."); - appendLine(errorReportContentBuilder, - "If you know the address of the recipient please correct it and forward this email to him."); - appendLine(errorReportContentBuilder, - "!!! Note that the Tracking System will not try to send this email again !!!"); - appendLine(errorReportContentBuilder, - "Please correct the recipient email address in openBIS to avoid similar problems in future."); - appendLine(errorReportContentBuilder, ""); - appendLine(errorReportContentBuilder, "Subject: " + email.getSubject()); - appendLine(errorReportContentBuilder, "Recipients: " - + CollectionUtils.abbreviate(email.getRecipients(), -1)); - appendLine(errorReportContentBuilder, ""); - - appendLine(errorReportContentBuilder, "Original content: "); - appendLine(errorReportContentBuilder, email.getContent()); - String errorReportContent = errorReportContentBuilder.toString(); - - Email errorReportEmail = - new Email("[Tracking] Sending an email failed", errorReportContent, null, email - .getFromOrNull(), email.getReplyToOrNull()); - sendMessage(mailClient, errorReportEmail); - } - - private static void sendMessage(IMailClient mailClient, Email email) - { - String subject = email.getSubject(); - String content = email.getContent(); - EMailAddress replyToOrNull = email.getReplyToOrNull(); - EMailAddress fromOrNull = email.getFromOrNull(); - EMailAddress[] recipients = email.getRecipients(); - - mailClient.sendEmailMessage(subject, content, replyToOrNull, fromOrNull, recipients); - - // sendEmailMessage(String subject, String content, EMailAddress replyToOrNull, - // EMailAddress fromOrNull, EMailAddress... recipients) - - } - - private static void appendLine(StringBuilder sb, String msg) - { - sb.append(msg); - sb.append("\n"); - } - - private static void saveTrackingState(TrackingStateDTO prevTrackingState, - TrackedEntities changedEntities, ITrackingDAO trackingDAO) - { - TrackingStateDTO state = TrackingStateUpdateHelper.calcNewTrackingState(prevTrackingState, changedEntities); - - trackingDAO.saveTrackingState(state); - } - - // gets *all* data sets - private static TrackedEntities fetchChangedEntities(TrackingStateDTO trackingState, - ITrackingServer trackingServer, HashMap<String, String[]> clMap, SessionContextDTO session) - { - - TrackingDataSetCriteria dataSetCriteria = - new TrackingDataSetCriteria(FLOW_LANE_SAMPLE_TYPE, trackingState - .getLastSeenDatasetId()); - List<AbstractExternalData> dataSets = - trackingServer.listDataSets(session.getSessionToken(), dataSetCriteria); - - HashMap<String, ArrayList<Long>> changedTrackingMap = new HashMap<String, ArrayList<Long>>(); - - // Loop over all new data sets - for (AbstractExternalData d : dataSets) - { - addDataSetTo(changedTrackingMap, d); - } - - return gatherTrackedEntities(trackingState, trackingServer, session, dataSets, changedTrackingMap); - } - - private static Map<String, String> fetchChangedLanes(TrackingStateDTO trackingState, - ITrackingServer trackingServer, Parameters params, SessionContextDTO session) - { - long usableDataSetId = getUsableDataSetId(trackingState, params); - LogUtils.info("Using maximum DS techId " + usableDataSetId + " for search of changed data sets"); - - TrackingDataSetCriteria dataSetCriteria = - new TrackingDataSetCriteria(FLOW_LANE_SAMPLE_TYPE, usableDataSetId); - List<AbstractExternalData> dataSets = - trackingServer.listDataSets(session.getSessionToken(), dataSetCriteria); - - Map<String, String> changedLanesMap = new HashMap<String, String>(); - - // Loop over all new data sets - for (AbstractExternalData d : dataSets) - { - Long newDataSetID = d.getId(); - Sample lane = d.getSample(); - String lanePermId = lane.getPermId(); - String laneSpace = lane.getIdentifier().split("/")[1]; // Bugfix for 20.10.X that is not returning the space object - Long maxDatasetIdForSample = getMaxDataSetIdForSample(trackingState, lanePermId); - - // Check if the given lanes/samples have data sets which are newer than the last seen one (= maxDatasetIdForSample) - if (newDataSetID > maxDatasetIdForSample) - { - SampleIdentifier currentLaneId = new SampleIdentifier(d.getSampleCode()); - Sample flowcell = lane.getContainer(); - String runNameFolder = ""; - List<IEntityProperty> flowcellProperties = flowcell.getProperties(); - for (IEntityProperty property : flowcellProperties) - { - if (property.getPropertyType().getCode().equals(PROPERTY_RUN_NAME_FOLDER)) - { - runNameFolder = property.getValue(); - break; - } - } - String laneString = currentLaneId.toString().split(":")[1]; - changedLanesMap.put(runNameFolder + ":" + laneString, laneSpace + " " + lane.getCode()); - LogUtils.debug("DataSetID: " + newDataSetID + " of NEW data Sets > MAX DataSet id for this sample: " + maxDatasetIdForSample); - } - } - - Set<Map.Entry<String, String>> entrySet = changedLanesMap.entrySet(); - for (Entry<String, String> entry : entrySet) - { - // needed for the integration of the openBIS webapp - System.out.println(entry.getKey() + " " + entry.getValue()); - } - LogUtils.debug("changedLanesMap: " + changedLanesMap.toString()); - return changedLanesMap; - } - - private static TrackedEntities fetchChangedDataSets(TrackingStateDTO trackingState, - ITrackingServer trackingServer, Parameters params, final HashMap<String, String[]> commandLineMap, - String[] laneCodeList, SessionContextDTO session, IApplicationServerApi v3, String v3SessionToken) - { - long usableDataSetId = getUsableDataSetId(trackingState, params); - - List<String> spaceWhiteList = Arrays.asList(params.getSpaceWhitelist().split("\\s*,\\s*")); - List<String> datasetTypeList = Arrays.asList(params.getdataSetTypeList().split("\\s*,\\s*")); - - LogUtils.info("Using maximum DS techId " + usableDataSetId + " for search of changed data sets"); - - TrackingDataSetCriteria dataSetCriteria = - new TrackingDataSetCriteria(FLOW_LANE_SAMPLE_TYPE, usableDataSetId); - List<AbstractExternalData> dataSets = - trackingServer.listDataSets(session.getSessionToken(), dataSetCriteria); - - ArrayList<SampleIdentifier> filterList = new ArrayList<SampleIdentifier>(); - ArrayList<AbstractExternalData> filteredDataSets = new ArrayList<AbstractExternalData>(); - ArrayList<AbstractExternalData> toTransferDataSets = new ArrayList<AbstractExternalData>(); - ArrayList<AbstractExternalData> toTransferDataSetsHighPriority = new ArrayList<AbstractExternalData>(); - - - // changedTrackingMap is used to report back which lanes are written back to the DB which have changed - HashMap<String, ArrayList<Long>> changedTrackingMap = new HashMap<String, ArrayList<Long>>(); - - // Loop over all lanes and create a list of relevant lanes - for (String lane : laneCodeList) - { - LogUtils.info("Searching for new data sets which belong to " + lane); - filterList.add(new SampleIdentifier(lane)); - } - - // Loop over all new data sets - for (AbstractExternalData d : dataSets) - { - Long newDataSetID = d.getId(); - SampleIdentifier currentLaneId = new SampleIdentifier(d.getSampleCode()); - String lanePermId = d.getSample().getPermId(); - Long maxDatasetIdForSample = getMaxDataSetIdForSample(trackingState, lanePermId); - - // Check if the given lanes/samples have data sets which are newer than the last seen one (= maxDatasetIdForSample) - if (filterList.contains(currentLaneId) && newDataSetID > maxDatasetIdForSample) - { - LogUtils.debug("DataSetID: " + newDataSetID + " of NEW data Sets > MAX DataSet id for this sample: " + maxDatasetIdForSample); - filteredDataSets.add(d); - addDataSetTo(changedTrackingMap, d); - - if (spaceWhiteList.contains(d.getSpace().getCode()) || d.getSpace().getCode().startsWith(params.getDbmSpacePrefix())) - { - if (datasetTypeList.contains(d.getDataSetType().getCode())) - { - if (d.tryGetAsDataSet().getStatus().equals(DataSetArchivingStatus.AVAILABLE) - || d.tryGetAsDataSet().getStatus().equals(DataSetArchivingStatus.LOCKED)) - { - // Here we distinguish between data sets types of low and high priority - if (d.getDataSetType().getCode().equals(HIGH_PRIORITY_DATA_SET_TYPE)) { - toTransferDataSetsHighPriority.add(d); - } - else { - toTransferDataSets.add(d); - } - - } else - { - LogUtils.error("Data set " + d.getCode() + " eventually archived!"); - } - } - } - } - } - - LogUtils.info("TO_TRANSFER: Found " + toTransferDataSets.size() - + " data sets which are in the list of 'space-whitelist' and could be transferred to an extra folder"); - - if (commandLineMap.containsKey(TrackingClient.CL_PARAMETER_COPY_DATA_SETS)) - { - // Data Sets with higher priority get transferred first - // extraDataSetCopy(params, toTransferDataSetsHighPriority); - // extraDataSetCopy(params, toTransferDataSets); - ArrayList<AbstractExternalData> toTransferDataSetsAll = new ArrayList<>(toTransferDataSetsHighPriority.size() + toTransferDataSets.size()); - toTransferDataSetsAll.addAll(toTransferDataSetsHighPriority); - toTransferDataSetsAll.addAll(toTransferDataSets); - if (!toTransferDataSetsAll.isEmpty()) { - extraSCICOREDataSetListCopy(params, toTransferDataSetsAll); - } - } - - - LogUtils.info("Found " + filteredDataSets.size() + " data sets which are connected to samples in " + filterList.toString()); - setLaneProperties(changedTrackingMap, v3, v3SessionToken); - - return gatherTrackedEntities(trackingState, trackingServer, session, filteredDataSets, changedTrackingMap); - } - - - private static SearchResult<ch.ethz.sis.openbis.generic.asapi.v3.dto.sample.Sample> searchForSamples(String permId, String v3sessionToken, IApplicationServerApi v3) - { - SampleSearchCriteria criterion = new SampleSearchCriteria(); - criterion.withPermId().thatEquals(permId); - - SampleFetchOptions fetchOptions = new SampleFetchOptions(); - fetchOptions.withProperties(); - - return v3.searchSamples(v3sessionToken, criterion, fetchOptions); - } - - - private static void setLaneProperties(HashMap<String, ArrayList<Long>> changedTrackingMap, IApplicationServerApi v3, String v3sessionToken) { - - for (String lanePermId : changedTrackingMap.keySet()) { - SearchResult<ch.ethz.sis.openbis.generic.asapi.v3.dto.sample.Sample> samples = searchForSamples(lanePermId, v3sessionToken, v3); - - for (ch.ethz.sis.openbis.generic.asapi.v3.dto.sample.Sample sample : samples.getObjects()) - { - SampleUpdate sampleToUpdate = new SampleUpdate(); - sampleToUpdate.setSampleId(sample.getPermId()); - sampleToUpdate.setProperty(PROPERTY_DATA_TRANSFERRED, getCurrentDateTime()); - - v3.updateSamples(v3sessionToken, Arrays.asList(sampleToUpdate)); - } - } - } - - - private static String getCurrentDateTime() { - - return new SimpleDateFormat(DATE_FORMAT_PATTERN).format(Calendar.getInstance().getTime()); - } - - private static final SimpleDateFormat LIST_TIMESTAMP_FORMAT = new SimpleDateFormat("yyyyMMddHHmmssSSSS"); - - private static void extraSCICOREDataSetListCopy(Parameters params, List<AbstractExternalData> dataSets) { - LogUtils.info("SCICORE dataset listing - Start"); - String datasetListFileBytes = ""; - for (AbstractExternalData dataSet:dataSets) { - datasetListFileBytes += dataSet.getPermId() + "\n"; - } - LogUtils.info("SCICORE dataset listing - Content : " + datasetListFileBytes); - - String timestamp = LIST_TIMESTAMP_FORMAT.format(new Date()); - String tempCanonicalPath = null; - try { - tempCanonicalPath = java.nio.file.Files.createTempDirectory(timestamp + "-tracking-temp-").toFile().getCanonicalPath(); - } catch (Exception e) { - throw new RuntimeException(e); - } - LogUtils.info("SCICORE dataset listing - temp : " + tempCanonicalPath); - - String datasetTypeCode = "FASTQ_GZ"; - String datasetName = timestamp + "_LIST"; - File datasetSource = new File(tempCanonicalPath + "/" + datasetName); - datasetSource.mkdirs(); - LogUtils.info("SCICORE dataset listing - datasetSource : " + datasetSource.getPath()); - - File datasetListFile = new File(tempCanonicalPath + "/" + datasetName + "/" + timestamp + ".tsv"); - try { - java.nio.file.Files.write(datasetListFile.toPath(), datasetListFileBytes.getBytes()); - } catch (IOException e) { - throw new RuntimeException(e); - } - - LogUtils.info("SCICORE dataset listing - writing to : " + datasetListFile.getPath()); - - File datasetDestination = new File(params.getDestinationFolderMap().get(datasetTypeCode), datasetName); - datasetDestination.mkdirs(); - - LogUtils.info("SCICORE dataset listing - datasetDestination : " + datasetDestination.getPath()); - - RsyncCopier copier = null; - File rsyncBinary = new File(params.getRsyncBinary()); - if (params.getRsyncFlags() != null) - { - LogUtils.info("SCICORE dataset listing - RSYNC WITH EXTRA PARAMETERS "); - List<String> cmdLineOptions = new ArrayList<String>(params.getRsyncFlags().length); - Collections.addAll(cmdLineOptions, params.getRsyncFlags()); - copier = new RsyncCopier(rsyncBinary, null, cmdLineOptions.toArray(new String[cmdLineOptions.size()])); - } else - { - LogUtils.info("SCICORE dataset listing - RSYNC NO EXTRA PARAMETERS "); - copier = new RsyncCopier(rsyncBinary, (File) null, ""); - } - - final long start = System.currentTimeMillis(); - LogUtils.info("SCICORE dataset listing - BEFORE RSYNC"); - Status status = copier.copyContent(datasetSource, datasetDestination, null, null); - final long end = System.currentTimeMillis(); - LogUtils.info("SCICORE dataset listing - AFTER RSYNC TIME: " + (end-start) + " millis."); - LogUtils.info("SCICORE dataset listing - AFTER RSYNC STATUS: " + status.toString()); - - if (status.isError()) - { - String exceptionMsg = - (status == null) ? "" : " Unexpected exception has occured: " - + status.toString(); - - List<EMailAddress> adminEmails = new ArrayList<EMailAddress>(); - for (String adminEmail : params.getAdminEmail().split(",")) - { - adminEmails.add(new EMailAddress(adminEmail.trim())); - } - - EnvironmentFailureException ret = - LogUtils.environmentError( - "Data transfer failed for %s. %s", - datasetName, exceptionMsg); - - IMailClient emailClient = params.getMailClient(); - emailClient.sendEmailMessage("GFB Tracker: Data transfer problem", - ret.getLocalizedMessage(), null, - new EMailAddress(params.getNotificationEmail()), - adminEmails.toArray(new EMailAddress[0])); - } -// MARKER FILE CREATION FAILED -// else { -// File datasetDestinationMarkerFile = new File(params.getDestinationFolderMap().get(datasetTypeCode), ".MARKER_is_finished_" + datasetName); -// try { -// datasetDestinationMarkerFile.createNewFile(); -// } catch (IOException e) { -// throw new RuntimeException(e); -// } -// } - } - - private static void extraDataSetCopy(Parameters params, List<AbstractExternalData> dataSets) - { - RsyncCopier copier = null; - File rsyncBinary = new File(params.getRsyncBinary()); - String base_path_string = params.getDssRoot(); - if (params.getRsyncFlags() != null) - { - List<String> cmdLineOptions = new ArrayList<String>(params.getRsyncFlags().length); - Collections.addAll(cmdLineOptions, params.getRsyncFlags()); - copier = new RsyncCopier(rsyncBinary, null, cmdLineOptions.toArray(new String[cmdLineOptions.size()])); - } else - { - LogUtils.info("No extra rsync parameters found."); - copier = new RsyncCopier(rsyncBinary, (File) null, ""); - } - - for (AbstractExternalData ds : dataSets) - { - File source = new File(base_path_string, ds.tryGetAsDataSet().getFullLocation() + ORIGINAL_PATH); - File targetName = new File(ds.tryGetAsDataSet().getFullLocation()); - - String datasetTypCode = ds.getDataSetType().getCode(); - - File omittedSource = new File(base_path_string, ds.tryGetAsDataSet().getFullLocation() + ORIGINAL_PATH + source.list()[0]); - - File destination = new File(params.getDestinationFolderMap().get(datasetTypCode), targetName.getName()); - - if (!destination.exists()) - { - destination.mkdirs(); - } - - final long start = System.currentTimeMillis(); - LogUtils.info("Start rsyncing " + ds.getCode() + " from " + omittedSource.getPath() + " to " + destination.getPath()); - - // this has always an --archive flag added - // Status status = copier.copyDirectoryImmutably(source, destination, targetName.getName(), CopyModeExisting.OVERWRITE); - - Status status = copier.copyContent(omittedSource, destination, null, null); - - if (status.isError()) - { - String exceptionMsg = - (status == null) ? "" : " Unexpected exception has occured: " - + status.toString(); - - List<EMailAddress> adminEmails = new ArrayList<EMailAddress>(); - for (String adminEmail : params.getAdminEmail().split(",")) - { - adminEmails.add(new EMailAddress(adminEmail.trim())); - } - - EnvironmentFailureException ret = - LogUtils.environmentError( - "Data transfer failed for %s. %s", - ds.getCode(), exceptionMsg); - - IMailClient emailClient = params.getMailClient(); - emailClient.sendEmailMessage("GFB Tracker: Data transfer problem", - ret.getLocalizedMessage(), null, - new EMailAddress(params.getNotificationEmail()), - adminEmails.toArray(new EMailAddress[0])); - } - - LogUtils.info(String.format("Got status: " + status + " for " + ds.getCode() + ", finished after %.2f s", - (System.currentTimeMillis() - start) / 1000.0)); - } - } - - private static long getMaxDataSetId(TrackingStateDTO trackingState) - { - long maxDataSetId = 0; - for (Long id : trackingState.getLastSeenDataSetIdMap().values()) - { - maxDataSetId = Math.max(maxDataSetId, id); - } - // return 0; - return maxDataSetId; - } - - /** - * Little helper function which reduces the number of data sets we are looking at. This can be configured by value 'old-data-set-backlog-number' - * in the service.properties. Without this value the calls get slower and slower with the growing data set amount. But we can assume that older - * data sets already got triggered earlier to send out an email. If not, the sample is so old that we do not want to send an email. - */ - private static long getUsableDataSetId(TrackingStateDTO trackingState, Parameters params) - { - long maxDataSetId = getMaxDataSetId(trackingState); - long oldDataSetBacklogNumber = params.getoldDataSetBacklogNumber(); - long usableDataSetId = Math.max(maxDataSetId - oldDataSetBacklogNumber, 0); - return usableDataSetId; - } - - private static long getMaxDataSetIdForSample(TrackingStateDTO trackingState, String lanePermId) - { - long maxDataSetId = 0; - Long maxDatasetIdForSample = trackingState.getLastSeenDataSetIdMap().get(lanePermId); - if (maxDatasetIdForSample != null) - { - return maxDatasetIdForSample; - } else - return maxDataSetId; - } - - private static TrackedEntities gatherTrackedEntities(TrackingStateDTO trackingState, - ITrackingServer trackingServer, SessionContextDTO session, - List<AbstractExternalData> dataSets, HashMap<String, ArrayList<Long>> changedTrackingMap) - { - List<Sample> sequencingSamplesToBeProcessed = - listSequencingSamples(PROCESSING_POSSIBLE_PROPERTY_CODE, trackingState - .getAlreadyTrackedSampleIdsToBeProcessed(), trackingServer, session); - List<Sample> sequencingSamplesSuccessfullyProcessed = - listSequencingSamples(PROCESSING_SUCCESSFUL_PROPERTY_CODE, trackingState - .getAlreadyTrackedSampleIdsProcessed(), trackingServer, session); - return new TrackedEntities(sequencingSamplesToBeProcessed, sequencingSamplesSuccessfullyProcessed, dataSets, - changedTrackingMap); - } - - private static void addDataSetTo(HashMap<String, ArrayList<Long>> changedTrackingMap, AbstractExternalData dataSet) - { - Sample currentLane = dataSet.getSample(); - String lanePermId = currentLane.getPermId(); - - LogUtils.debug("Found lane " + currentLane.getCode() + " with permId: " + lanePermId + " with new DS techId " + dataSet.getId() - + " and DS permId " + dataSet.getPermId()); - ArrayList<Long> existingList = changedTrackingMap.get(lanePermId); - if (existingList == null) - { - existingList = new ArrayList<Long>(); - changedTrackingMap.put(lanePermId, existingList); - } - existingList.add(dataSet.getId()); - } - - private static List<Sample> listSequencingSamples(String propertyTypeCode, - Set<Long> alreadyTrackedSampleIds, ITrackingServer trackingServer, - SessionContextDTO session) - { - return listSamples(SEQUENCING_SAMPLE_TYPE, propertyTypeCode, TRUE, alreadyTrackedSampleIds, - trackingServer, session); - } - - private static List<Sample> listSamples(String sampleType, String propertyTypeCode, - String propertyValue, Set<Long> alreadyTrackedSampleIds, - ITrackingServer trackingServer, SessionContextDTO session) - { - TrackingSampleCriteria criteria = - new TrackingSampleCriteria(sampleType, propertyTypeCode, propertyValue, - alreadyTrackedSampleIds); - return trackingServer.listSamples(session.getSessionToken(), criteria); - } - - static class TrackingStateUpdateHelper - { - - static TrackingStateDTO calcNewTrackingState(TrackingStateDTO prevState, - TrackedEntities changedEntities) - { - TrackingStateDTO state = new TrackingStateDTO(); - Set<Long> sequencingSamplesToBeProcessed = - new TreeSet<Long>(prevState.getAlreadyTrackedSampleIdsToBeProcessed()); - addNewSampleIds(sequencingSamplesToBeProcessed, changedEntities - .getSequencingSamplesToBeProcessed()); - state.setAlreadyTrackedSampleIdsToBeProcessed(sequencingSamplesToBeProcessed); - - Set<Long> sequencingSamplesProcessed = - new TreeSet<Long>(prevState.getAlreadyTrackedSampleIdsProcessed()); - addNewSampleIds(sequencingSamplesProcessed, changedEntities - .getSequencingSamplesProcessed()); - state.setAlreadyTrackedSampleIdsProcessed(sequencingSamplesProcessed); - - TreeMap<String, Long> newTrackingState = new TreeMap<String, Long>(); - - HashMap<String, ArrayList<Long>> changedTrackingMap = changedEntities.getChangedTrackingMap(); - // System.out.println(changedTrackingMap.toString()); - - for (Map.Entry<String, ArrayList<Long>> entry : changedTrackingMap.entrySet()) - { - newTrackingState.put(entry.getKey(), Collections.max(entry.getValue())); - } - // System.out.println(newTrackingState.entrySet().toString()); - - for (Map.Entry<String, Long> entry : prevState.getLastSeenDataSetIdMap().entrySet()) - { - if (!newTrackingState.containsKey(entry.getKey())) - { - newTrackingState.put(entry.getKey(), entry.getValue()); - } - } - - state.setLastSeenDataSetIdMap(newTrackingState); - return state; - } - - static TrackingStateDTO calcNewTrackingStateDataSets(HashMap<String, ArrayList<Long>> changedTrackingMap, - TrackedEntities changedEntities) - { - TrackingStateDTO state = new TrackingStateDTO(); - - TreeMap<String, Long> newTrackingState = new TreeMap<String, Long>(); - for (Map.Entry<String, ArrayList<Long>> entry : changedTrackingMap.entrySet()) - { - newTrackingState.put(entry.getKey(), Collections.max(entry.getValue())); - } - LogUtils.info(newTrackingState.toString()); - - state.setLastSeenDataSetIdMap(newTrackingState); - return state; - } - - private static void addNewSampleIds(Set<Long> alreadyTrackedSampleIdsProcessed, - List<Sample> sequencingSamplesProcessed) - { - for (Sample sample : sequencingSamplesProcessed) - { - alreadyTrackedSampleIdsProcessed.add(sample.getId()); - } - } - } -} diff --git a/deep_sequencing_unit/source/java/ch/ethz/bsse/cisd/dsu/tracking/main/TrackingClient.java b/deep_sequencing_unit/source/java/ch/ethz/bsse/cisd/dsu/tracking/main/TrackingClient.java deleted file mode 100644 index 4a7ce7658c430031cd5f2d0ce734090c475bd575..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/source/java/ch/ethz/bsse/cisd/dsu/tracking/main/TrackingClient.java +++ /dev/null @@ -1,287 +0,0 @@ -/* - * Copyright 2009 ETH Zuerich, CISD - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package ch.ethz.bsse.cisd.dsu.tracking.main; - -import java.io.File; -import java.io.FileNotFoundException; -import java.io.FileReader; -import java.io.IOException; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Properties; - -import org.apache.commons.cli.CommandLine; -import org.apache.commons.cli.CommandLineParser; -import org.apache.commons.cli.GnuParser; -import org.apache.commons.cli.HelpFormatter; -import org.apache.commons.cli.Option; -import org.apache.commons.cli.OptionBuilder; -import org.apache.commons.cli.Options; -import org.apache.commons.cli.ParseException; -import org.apache.commons.io.IOUtils; -import org.apache.commons.lang3.time.DateUtils; - -import ch.ethz.bsse.cisd.dsu.tracking.email.EntityTrackingEmailGenerator; -import ch.ethz.bsse.cisd.dsu.tracking.email.IEntityTrackingEmailGenerator; -import ch.ethz.bsse.cisd.dsu.tracking.utils.LogUtils; -import ch.ethz.sis.openbis.generic.asapi.v3.IApplicationServerApi; -import ch.systemsx.cisd.common.exceptions.EnvironmentFailureException; -import ch.systemsx.cisd.common.io.PropertyIOUtils; -import ch.systemsx.cisd.common.logging.LogInitializer; -import ch.systemsx.cisd.common.mail.EMailAddress; -import ch.systemsx.cisd.common.mail.IMailClient; -import ch.systemsx.cisd.common.shared.basic.string.StringUtils; -import ch.systemsx.cisd.common.spring.HttpInvokerUtils; -import ch.systemsx.cisd.openbis.generic.shared.ITrackingServer; -import ch.systemsx.cisd.openbis.generic.shared.dto.SessionContextDTO; - -// v3 -import ch.ethz.sis.openbis.generic.asapi.v3.IApplicationServerApi; - -/** - * @author Tomasz Pylak - * @author Manuel Kohler - */ -public class TrackingClient -{ - private static final String SERVICE_PROPERTIES_FILE = "etc/service.properties"; - - private static final String LOCAL_SAMPLE_DB = "etc/tracking-local-database"; - - private static final String LOCAL_DATASET_DB = "etc/tracking-sample-database"; - - private static final String EMAIL_TEMPLATE_FILE = "etc/email-template.txt"; - - private static final String OPENBIS_RMI_TRACKING = "/rmi-tracking"; - - public static final String CL_PARAMETER_LANES = "lanes"; - - public static final String CL_PARAMETER_ALL = "all"; - - public static final String CL_PARAMETER_CHANGED_LANES = "changed_lanes"; - - public static final String CL_PARAMETER_COPY_DATA_SETS = "copy_data_sets"; - - public static final String CL_PARAMETER_REMOVE_LANES = "remove"; - - public static final String CL_PARAMETER_LIST_SPACES = "list_spaces"; - - private static IApplicationServerApi v3; - - private static String v3SessionToken; - - public static void main(String[] args) - { - try - { - HashMap<String, String[]> commandLineMap = parseCommandLine(args); - track(commandLineMap); - } catch (EnvironmentFailureException ex) - { - LogUtils.notify(ex); - } catch (Throwable ex) - { - LogUtils.notify(ex); - } - } - - private static HashMap<String, String[]> parseCommandLine(String[] args) - { - HashMap<String, String[]> commandLineMap = new HashMap<String, String[]>(); - CommandLineParser parser = new GnuParser(); - - Options options = new Options(); - Option lanes = OptionBuilder.withArgName(CL_PARAMETER_LANES) - .hasArg() - .withDescription("list of lanes to track") - .create(CL_PARAMETER_LANES); - lanes.setArgs(Option.UNLIMITED_VALUES); - // Option all = new Option(CL_PARAMETER_ALL, "track all lanes, only for testing, never use in production!"); - - Option new_lanes = new Option(CL_PARAMETER_CHANGED_LANES, "only list lanes which have new datasets"); - - Option copy_data_sets = new Option(CL_PARAMETER_COPY_DATA_SETS, "also copy the corresponding data sets to an extra" - + " folder. Sample must be part of the space which is set in the property 'space-whitelist'. " - + " Only in combination with parameter \"" + CL_PARAMETER_LANES + "\""); - - Option remove = OptionBuilder.withArgName(CL_PARAMETER_REMOVE_LANES) - .hasArg() - .withDescription("remove lanes from tracking list and do not send an email") - .create(CL_PARAMETER_REMOVE_LANES); - remove.setArgs(Option.UNLIMITED_VALUES); - - Option list_spaces = new Option(CL_PARAMETER_LIST_SPACES, "list spaces which are configured for an extra copy"); - - options.addOption(lanes); - // options.addOption(all); - options.addOption(new_lanes); - options.addOption(copy_data_sets); - options.addOption(remove); - options.addOption(list_spaces); - - // automatically generate the help statement - HelpFormatter formatter = new HelpFormatter(); - if (args.length < 1) - { - formatter.printHelp("help", options); - System.exit(0); - } - - try - { - CommandLine line = parser.parse(options, args); - if (line.hasOption(CL_PARAMETER_LANES)) - { - String[] laneArray = line.getOptionValues(CL_PARAMETER_LANES); - commandLineMap.put(CL_PARAMETER_LANES, laneArray); - } - if (line.hasOption(CL_PARAMETER_ALL)) - { - // commandLineMap.put(CL_PARAMETER_ALL, null); - System.out.println("This option is deactivated."); - - } - if (line.hasOption(CL_PARAMETER_CHANGED_LANES)) - { - commandLineMap.put(CL_PARAMETER_CHANGED_LANES, null); - } - if (line.hasOption(CL_PARAMETER_COPY_DATA_SETS)) - { - commandLineMap.put(CL_PARAMETER_COPY_DATA_SETS, null); - } - if (line.hasOption(CL_PARAMETER_LIST_SPACES)) - { - commandLineMap.put(CL_PARAMETER_LIST_SPACES, null); - } - if (line.hasOption(CL_PARAMETER_REMOVE_LANES)) - { - commandLineMap.put(CL_PARAMETER_REMOVE_LANES, line.getOptionValues(CL_PARAMETER_REMOVE_LANES)); - } - } catch (ParseException exp) - { - LogUtils.environmentError("Parsing of command line parameters failed.", exp.getMessage()); - System.out.println("Parsing of command line parameters failed. " + exp.getMessage()); - System.exit(1); - } - return commandLineMap; - } - - private static void track(HashMap<String, String[]> commandLineMap) - { - LogInitializer.init(); - Properties props = PropertyIOUtils.loadProperties(SERVICE_PROPERTIES_FILE); - Parameters params = new Parameters(props); - - ITrackingServer trackingServer = createOpenBISTrackingServer(params); - SessionContextDTO session = authentificateInOpenBIS(params, trackingServer); - // also login to the v3 API - IApplicationServerApi v3 = initV3(params); - v3SessionToken = v3.login(params.getOpenbisUser(), params.getOpenbisPassword()); - - - IEntityTrackingEmailGenerator emailGenerator = - new EntityTrackingEmailGenerator(props, retrieveEmailTemplate(), session); - IMailClient mailClient = params.getMailClient(); - TrackingBO trackingBO = new TrackingBO(trackingServer, emailGenerator, mailClient); - - ITrackingDAO trackingDAO = new FileBasedTrackingDAO(LOCAL_SAMPLE_DB, LOCAL_DATASET_DB); - - trackingBO.trackAndNotify(trackingDAO, commandLineMap, params, session, v3, v3SessionToken); - } - - private static ITrackingServer createOpenBISTrackingServer(Parameters params) - { - String serviceURL = params.getOpenbisServerURL() + OPENBIS_RMI_TRACKING; - return HttpInvokerUtils.createServiceStub(ITrackingServer.class, serviceURL, - 5 * DateUtils.MILLIS_PER_MINUTE); - } - - private static SessionContextDTO authentificateInOpenBIS(Parameters params, - ITrackingServer trackingServer) - { - try - { - String openbisUser = params.getOpenbisUser(); - SessionContextDTO session = - trackingServer.tryAuthenticate(openbisUser, params.getOpenbisPassword()); - if (session == null) - { - throw createAuthentificationException(params, null); - } - trackingServer.setBaseIndexURL(session.getSessionToken(), params.getPermlinkURL()); - return session; - } catch (Exception ex) - { - throw createAuthentificationException(params, ex); - } - } - - private static String retrieveEmailTemplate() - { - try - { - return IOUtils.toString(new FileReader(new File(EMAIL_TEMPLATE_FILE))); - } catch (FileNotFoundException ex) - { - throw LogUtils.environmentError("Couldn't find email template file '%s'.", - EMAIL_TEMPLATE_FILE); - } catch (IOException ex) - { - throw LogUtils.environmentError( - "Exception has occured while trying to read template file '%s':%s", - EMAIL_TEMPLATE_FILE, ex.getMessage()); - } - } - - private static EnvironmentFailureException createAuthentificationException(Parameters params, - Exception exOrNull) - { - String exceptionMsg = - (exOrNull == null) ? "" : " Unexpected exception has occured: " - + exOrNull.getMessage(); - - EnvironmentFailureException ret = - LogUtils.environmentError( - "Cannot authentificate in openBIS as a user '%s'. Check that the password is correct and that openBIS service URL is correct.%s", - params.getOpenbisUser(), exceptionMsg); - - if (false == StringUtils.isBlank(params.getAdminEmail())) - { - List<EMailAddress> adminEmails = new ArrayList<EMailAddress>(); - for (String adminEmail : params.getAdminEmail().split(",")) - { - adminEmails.add(new EMailAddress(adminEmail.trim())); - } - - IMailClient emailClient = params.getMailClient(); - emailClient.sendEmailMessage("[DSU Tracker] DSU Tracking client NOT working", - ret.getLocalizedMessage(), null, - new EMailAddress(params.getNotificationEmail()), - adminEmails.toArray(new EMailAddress[0])); - } - return ret; - } - - private static IApplicationServerApi initV3(Parameters params) { - int TIMEOUT = 30000; - v3 = HttpInvokerUtils - .createServiceStub(IApplicationServerApi.class, params.getOpenbisServerURL() - + IApplicationServerApi.SERVICE_URL, TIMEOUT); - return v3; - } -} diff --git a/deep_sequencing_unit/source/java/ch/ethz/bsse/cisd/dsu/tracking/utils/LogUtils.java b/deep_sequencing_unit/source/java/ch/ethz/bsse/cisd/dsu/tracking/utils/LogUtils.java deleted file mode 100644 index 1121a7d570c3e9e28c18f9d6d66da5fc8728e214..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/source/java/ch/ethz/bsse/cisd/dsu/tracking/utils/LogUtils.java +++ /dev/null @@ -1,88 +0,0 @@ -/* - * Copyright 2009 ETH Zuerich, CISD - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package ch.ethz.bsse.cisd.dsu.tracking.utils; - -import org.apache.log4j.Logger; - -import ch.systemsx.cisd.common.exceptions.EnvironmentFailureException; -import ch.systemsx.cisd.common.logging.LogCategory; -import ch.systemsx.cisd.common.logging.LogFactory; - -/** - * @author Tomasz Pylak - */ -public class LogUtils -{ - private static final Logger notificationLog = LogFactory.getLogger(LogCategory.NOTIFY, - LogUtils.class); - - private static final Logger operationLog = LogFactory.getLogger(LogCategory.OPERATION, - LogUtils.class); - - public static void notify(EnvironmentFailureException ex) - { - String causeMsg = - (ex.getCause() == null) ? "" : "Error cause: " + ex.getCause().getMessage(); - String fullMsg = - "An environment exception occured while trying to send emails with changes.\n" - + "Check and correct the configuration.\n" + "Error details: " - + ex.getMessage() + "\n" + causeMsg; - notify(ex, fullMsg); - } - - public static void notify(Throwable ex) - { - String fullMsg = - "An unexpected exception occured while trying to send emails with changes.\n" - + "Error details: " + ex.getMessage(); - notify(ex, fullMsg); - } - - private static void notify(Throwable ex, String fullMsg) - { - ex.printStackTrace(); - notificationLog.error(fullMsg); - } - - public static EnvironmentFailureException environmentError(String message, Throwable exception) - { - String fullMsg = - message + " The following exception has been thrown: " + exception.getMessage(); - return new EnvironmentFailureException(fullMsg, exception); - } - - public static EnvironmentFailureException environmentError(String msgFormat, Object... params) - { - String fullMsg = String.format(msgFormat, params); - return new EnvironmentFailureException(fullMsg); - } - - public static void info(String msg) - { - operationLog.info(msg); - } - - public static void debug(String msg) - { - operationLog.debug(msg); - } - - public static void error(String msg) - { - operationLog.error(msg); - } -} diff --git a/deep_sequencing_unit/source/java/service.properties b/deep_sequencing_unit/source/java/service.properties deleted file mode 100644 index 8d8ac56ed080b7c046767389ad9f8a7a25c6a6e8..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/source/java/service.properties +++ /dev/null @@ -1,141 +0,0 @@ -authentication-service = dummy-authentication-service - -# The time after which an inactive session is expired by the service (in minutes). -session-timeout = 720 - -# Authorization -# Supported: 'no-authorization' and 'active-authorization' -authorization-component-factory = active-authorization - -script-folder = ./source/ - -core-plugins-folder = source/core-plugins - -# Supported: currently only 'postgresql' is supported -database.engine = postgresql -database.create-from-scratch = false -# For debugging set this value to true. -database.script-single-step-mode = false -database.url-host-part = -# database.kind = new -# database.kind = basynthec -database.kind = dev -# database.kind = basysbio -# database.kind = system_test_strict -# database.kind = system_test_plates_on_demand -# database.kind = system_test_multi_groups -database.owner = -database.owner-password = -database.admin-user = -database.admin-password = -# Max time (in seconds) to wait for a connection to become available before throwing an exception. -# Default: 60s, set to -1 to wait indefinitely. -database.max-wait-for-connection = -# Max. number of active database connections. Default: 20. -database.max-active-connections = -# Max. number of idle database connections to keep open. Default: 20. -database.max-idle-connections = -# Log interval (in seconds) between two regular log entries of the number of active database -# connections. Default: 3600. -database.active-connections-log-interval = 30 - -# User id of the user used for anonymous login -# user-for-anonymous-login = <user id> - -crowd.service.host = crowd-bsse.ethz.ch -crowd.service.port = 8443 -crowd.application.name = lims -crowd.application.password = - -# The database instance local unique identifier. Used when the new database is created. -database-instance = CISD - -trusted-cross-origin-domains= * - -# Comma-separated list of host names and IP addresses of clients on which an INSTANCE_ADMIN -# user is allowed to change identity -accepted-remote-hosts-for-identity-change = localhost - - -# Online Help -# -# Online help is broken into two sections -- generic and specific. Generic help links back to -# the CISD. Specific help is provided by the host of the installation -# -# OpenBIS needs to know the root URL for the online help and a template for the individual pages. -# The template should have on parameter, called title, and should be constructed to automatically -# create the page if it does not already exist. -# The template can be created by going to the root page, adding a new link to the page, and -# replacing the title of the new page with the ${title} -onlinehelp.generic.root-url = https://wiki-bsse.ethz.ch/display/CISDDoc/OnlineHelp -onlinehelp.generic.page-template = https://wiki-bsse.ethz.ch/pages/createpage.action?spaceKey=CISDDoc&title=${title}&linkCreation=true&fromPageId=40633829 -#onlinehelp.specific.root-url = https://wiki-bsse.ethz.ch/display/CISDDoc/OnlineHelp -#onlinehelp.specific.page-template = https://wiki-bsse.ethz.ch/pages/createpage.action?spaceKey=CISDDoc&title=${title}&linkCreation=true&fromPageId=40633829 -# --------------------------------------------------------------------------- -# (optional) Database Configurations for Query module -# --------------------------------------------------------------------------- - -# Comma separated keys of databases configured for Query module. -# Each database should have configuration properties prefixed with its key. -# Mandatory properties for each <database> include: -# <database>.label - name shown to the openBIS user when adding or editing a customized query -# <database>.database-driver - JDBC Driver of the database (e.g. org.postgresql.Driver) -# <database>.database-url - JDBC URL to the database (e.g. jdbc:postgresql://localhost/openbis) -# Optional properties for each <database> include: -# <database>.database-user - name of the database user (default: user.name from system properties) -# <database>.database-password - password of the database user -# <database>.creator-minimal-role - minimal role required to create/edit queries on this database (default: POWER_USER) -# <database>.data-space - If NOT specified OBSERVER of any space will be allowed to perform -# queries and <creator-minimal-role> of any space will allowed -# to create/edit queries on this DB. -# - If specified only OBSERVER of the space will be allowed to perform -# queries and <creator-minimal-role> of the space will allowed -# to create/edit queries on this DB. -query-databases = 1 - -1.label = openBIS meta data -#1.data-space = CISD -#1.creator-minimal-role = SPACE_ADMIN -1.database-driver = org.postgresql.Driver -1.database-url = jdbc:postgresql://localhost/openbis_${database.kind} -#1.database-username = -#1.database-password = - -# --------------------------------------------------------------------------- -# maintenance plugins configuration -# --------------------------------------------------------------------------- - -# Comma separated names of maintenance plugins. -# Each plugin should have configuration properties prefixed with its name. -# Mandatory properties for each <plugin> include: -# <plugin>.class - Fully qualified plugin class name -# <plugin>.interval - The time between plugin executions (in seconds) -# Optional properties for each <plugin> include: -# <plugin>.start - Time of the first execution (HH:mm) -# <plugin>.execute-only-once - If true the task will be executed exactly once, -# interval will be ignored. By default set to false. -#maintenance-plugins = demo, dynamic-property-evaluator, remove-unused-ad-hoc-vocabulary-terms - -demo.class = ch.systemsx.cisd.openbis.generic.server.task.DemoMaintenanceTask -demo.interval = 60 -#demo.execute-only-once = true -demo.property_1 = some value -demo.property_2 = some value 2 - -#dynamic-property-evaluator.class = ch.systemsx.cisd.openbis.generic.server.task.DynamicPropertyEvaluationMaintenanceTask -# run daily at midnight -#dynamic-property-evaluator.interval = 86400 -#dynamic-property-evaluator.start = 00:00 -# run every 10min -#dynamic-property-evaluator.interval = 6000 - -#remove-unused-ad-hoc-vocabulary-terms.class = ch.systemsx.cisd.openbis.generic.server.task.RemoveUnusedUnofficialTermsMaintenanceTask -## run once every 12 hours -#remove-unused-ad-hoc-vocabulary-terms.interval = 43200 -## delete unused ad hoc terms older than 7 days -#remove-unused-ad-hoc-vocabulary-terms.older-than-days = 7 - -# Name of the file that stores Web Client configuration -web-client-configuration-file = etc/web-client.properties - -jython-version=2.7 diff --git a/deep_sequencing_unit/sourceTest/core-plugins/core-plugins.properties b/deep_sequencing_unit/sourceTest/core-plugins/core-plugins.properties deleted file mode 100644 index 3067caffb0538eab171746efcf9de449df2daca1..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/sourceTest/core-plugins/core-plugins.properties +++ /dev/null @@ -1 +0,0 @@ -enabled-modules = dropbox-test, illumina-qgf \ No newline at end of file diff --git a/deep_sequencing_unit/sourceTest/core-plugins/demo/1/dss/drop-boxes/demo-dropbox/demo-dropbox.py b/deep_sequencing_unit/sourceTest/core-plugins/demo/1/dss/drop-boxes/demo-dropbox/demo-dropbox.py deleted file mode 100644 index 9862bad460e9aeb190f072708e9873ad7394ce99..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/sourceTest/core-plugins/demo/1/dss/drop-boxes/demo-dropbox/demo-dropbox.py +++ /dev/null @@ -1,14 +0,0 @@ -#! /usr/bin/env python - -def process(tr): - for file in tr.getIncoming().listFiles(): - openFile = None - - try: - openFile = open(file.getAbsolutePath()) - content = openFile.read().strip() - - experiment = tr.createNewExperiment("/BSSE_FLOWCELLS/FLOWCELLS/" + content, "HT_SEQUENCING") - finally: - if openFile: - openFile.close() diff --git a/deep_sequencing_unit/sourceTest/core-plugins/demo/1/dss/drop-boxes/demo-dropbox/plugin.properties b/deep_sequencing_unit/sourceTest/core-plugins/demo/1/dss/drop-boxes/demo-dropbox/plugin.properties deleted file mode 100644 index 563f23029358ae07f9173b8bd3efb1601322c121..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/sourceTest/core-plugins/demo/1/dss/drop-boxes/demo-dropbox/plugin.properties +++ /dev/null @@ -1,5 +0,0 @@ -incoming-dir = ${root-dir}/incoming-demo-dropbox -incoming-data-completeness-condition = auto-detection -top-level-data-set-handler = ch.systemsx.cisd.etlserver.registrator.api.v2.JythonTopLevelDataSetHandlerV2 -script-path = demo-dropbox.py -storage-processor = ch.systemsx.cisd.etlserver.DefaultStorageProcessor diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/.gc3pie/html/body-style.css b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/.gc3pie/html/body-style.css deleted file mode 100644 index 629f097de8b49fc14a36161fdc19abedc20b628d..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/.gc3pie/html/body-style.css +++ /dev/null @@ -1,4 +0,0 @@ -body { font: 14px "Trebuchet MS", sans-serif; } - -h1 { font: 16px; } -h3 { font: 12px; } diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/.gc3pie/html/bootstrap3/css/bootstrap-theme.css b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/.gc3pie/html/bootstrap3/css/bootstrap-theme.css deleted file mode 100644 index ad1173569371a2d189a3783ceb5177af79812719..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/.gc3pie/html/bootstrap3/css/bootstrap-theme.css +++ /dev/null @@ -1,384 +0,0 @@ -.btn-default, -.btn-primary, -.btn-success, -.btn-info, -.btn-warning, -.btn-danger { - text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.2); - -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 1px rgba(0, 0, 0, 0.075); - box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 1px rgba(0, 0, 0, 0.075); -} - -.btn-default:active, -.btn-primary:active, -.btn-success:active, -.btn-info:active, -.btn-warning:active, -.btn-danger:active, -.btn-default.active, -.btn-primary.active, -.btn-success.active, -.btn-info.active, -.btn-warning.active, -.btn-danger.active { - -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); - box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); -} - -.btn:active, -.btn.active { - background-image: none; -} - -.btn-default { - text-shadow: 0 1px 0 #fff; - background-image: -webkit-gradient(linear, left 0%, left 100%, from(#ffffff), to(#e6e6e6)); - background-image: -webkit-linear-gradient(top, #ffffff, 0%, #e6e6e6, 100%); - background-image: -moz-linear-gradient(top, #ffffff 0%, #e6e6e6 100%); - background-image: linear-gradient(to bottom, #ffffff 0%, #e6e6e6 100%); - background-repeat: repeat-x; - border-color: #e0e0e0; - border-color: #ccc; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffe6e6e6', GradientType=0); -} - -.btn-default:active, -.btn-default.active { - background-color: #e6e6e6; - border-color: #e0e0e0; -} - -.btn-primary { - background-image: -webkit-gradient(linear, left 0%, left 100%, from(#428bca), to(#3071a9)); - background-image: -webkit-linear-gradient(top, #428bca, 0%, #3071a9, 100%); - background-image: -moz-linear-gradient(top, #428bca 0%, #3071a9 100%); - background-image: linear-gradient(to bottom, #428bca 0%, #3071a9 100%); - background-repeat: repeat-x; - border-color: #2d6ca2; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff3071a9', GradientType=0); -} - -.btn-primary:active, -.btn-primary.active { - background-color: #3071a9; - border-color: #2d6ca2; -} - -.btn-success { - background-image: -webkit-gradient(linear, left 0%, left 100%, from(#5cb85c), to(#449d44)); - background-image: -webkit-linear-gradient(top, #5cb85c, 0%, #449d44, 100%); - background-image: -moz-linear-gradient(top, #5cb85c 0%, #449d44 100%); - background-image: linear-gradient(to bottom, #5cb85c 0%, #449d44 100%); - background-repeat: repeat-x; - border-color: #419641; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff449d44', GradientType=0); -} - -.btn-success:active, -.btn-success.active { - background-color: #449d44; - border-color: #419641; -} - -.btn-warning { - background-image: -webkit-gradient(linear, left 0%, left 100%, from(#f0ad4e), to(#ec971f)); - background-image: -webkit-linear-gradient(top, #f0ad4e, 0%, #ec971f, 100%); - background-image: -moz-linear-gradient(top, #f0ad4e 0%, #ec971f 100%); - background-image: linear-gradient(to bottom, #f0ad4e 0%, #ec971f 100%); - background-repeat: repeat-x; - border-color: #eb9316; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffec971f', GradientType=0); -} - -.btn-warning:active, -.btn-warning.active { - background-color: #ec971f; - border-color: #eb9316; -} - -.btn-danger { - background-image: -webkit-gradient(linear, left 0%, left 100%, from(#d9534f), to(#c9302c)); - background-image: -webkit-linear-gradient(top, #d9534f, 0%, #c9302c, 100%); - background-image: -moz-linear-gradient(top, #d9534f 0%, #c9302c 100%); - background-image: linear-gradient(to bottom, #d9534f 0%, #c9302c 100%); - background-repeat: repeat-x; - border-color: #c12e2a; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc9302c', GradientType=0); -} - -.btn-danger:active, -.btn-danger.active { - background-color: #c9302c; - border-color: #c12e2a; -} - -.btn-info { - background-image: -webkit-gradient(linear, left 0%, left 100%, from(#5bc0de), to(#31b0d5)); - background-image: -webkit-linear-gradient(top, #5bc0de, 0%, #31b0d5, 100%); - background-image: -moz-linear-gradient(top, #5bc0de 0%, #31b0d5 100%); - background-image: linear-gradient(to bottom, #5bc0de 0%, #31b0d5 100%); - background-repeat: repeat-x; - border-color: #2aabd2; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff31b0d5', GradientType=0); -} - -.btn-info:active, -.btn-info.active { - background-color: #31b0d5; - border-color: #2aabd2; -} - -.thumbnail, -.img-thumbnail { - -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.075); - box-shadow: 0 1px 2px rgba(0, 0, 0, 0.075); -} - -.dropdown-menu > li > a:hover, -.dropdown-menu > li > a:focus, -.dropdown-menu > .active > a, -.dropdown-menu > .active > a:hover, -.dropdown-menu > .active > a:focus { - background-color: #357ebd; - background-image: -webkit-gradient(linear, left 0%, left 100%, from(#428bca), to(#357ebd)); - background-image: -webkit-linear-gradient(top, #428bca, 0%, #357ebd, 100%); - background-image: -moz-linear-gradient(top, #428bca 0%, #357ebd 100%); - background-image: linear-gradient(to bottom, #428bca 0%, #357ebd 100%); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff357ebd', GradientType=0); -} - -.navbar { - background-image: -webkit-gradient(linear, left 0%, left 100%, from(#ffffff), to(#f8f8f8)); - background-image: -webkit-linear-gradient(top, #ffffff, 0%, #f8f8f8, 100%); - background-image: -moz-linear-gradient(top, #ffffff 0%, #f8f8f8 100%); - background-image: linear-gradient(to bottom, #ffffff 0%, #f8f8f8 100%); - background-repeat: repeat-x; - border-radius: 4px; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#fff8f8f8', GradientType=0); - -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 5px rgba(0, 0, 0, 0.075); - box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 5px rgba(0, 0, 0, 0.075); -} - -.navbar .navbar-nav > .active > a { - background-color: #f8f8f8; -} - -.navbar-brand, -.navbar-nav > li > a { - text-shadow: 0 1px 0 rgba(255, 255, 255, 0.25); -} - -.navbar-inverse { - background-image: -webkit-gradient(linear, left 0%, left 100%, from(#3c3c3c), to(#222222)); - background-image: -webkit-linear-gradient(top, #3c3c3c, 0%, #222222, 100%); - background-image: -moz-linear-gradient(top, #3c3c3c 0%, #222222 100%); - background-image: linear-gradient(to bottom, #3c3c3c 0%, #222222 100%); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff3c3c3c', endColorstr='#ff222222', GradientType=0); -} - -.navbar-inverse .navbar-nav > .active > a { - background-color: #222222; -} - -.navbar-inverse .navbar-brand, -.navbar-inverse .navbar-nav > li > a { - text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); -} - -.navbar-static-top, -.navbar-fixed-top, -.navbar-fixed-bottom { - border-radius: 0; -} - -.alert { - text-shadow: 0 1px 0 rgba(255, 255, 255, 0.2); - -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.25), 0 1px 2px rgba(0, 0, 0, 0.05); - box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.25), 0 1px 2px rgba(0, 0, 0, 0.05); -} - -.alert-success { - background-image: -webkit-gradient(linear, left 0%, left 100%, from(#dff0d8), to(#c8e5bc)); - background-image: -webkit-linear-gradient(top, #dff0d8, 0%, #c8e5bc, 100%); - background-image: -moz-linear-gradient(top, #dff0d8 0%, #c8e5bc 100%); - background-image: linear-gradient(to bottom, #dff0d8 0%, #c8e5bc 100%); - background-repeat: repeat-x; - border-color: #b2dba1; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffc8e5bc', GradientType=0); -} - -.alert-info { - background-image: -webkit-gradient(linear, left 0%, left 100%, from(#d9edf7), to(#b9def0)); - background-image: -webkit-linear-gradient(top, #d9edf7, 0%, #b9def0, 100%); - background-image: -moz-linear-gradient(top, #d9edf7 0%, #b9def0 100%); - background-image: linear-gradient(to bottom, #d9edf7 0%, #b9def0 100%); - background-repeat: repeat-x; - border-color: #9acfea; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffb9def0', GradientType=0); -} - -.alert-warning { - background-image: -webkit-gradient(linear, left 0%, left 100%, from(#fcf8e3), to(#f8efc0)); - background-image: -webkit-linear-gradient(top, #fcf8e3, 0%, #f8efc0, 100%); - background-image: -moz-linear-gradient(top, #fcf8e3 0%, #f8efc0 100%); - background-image: linear-gradient(to bottom, #fcf8e3 0%, #f8efc0 100%); - background-repeat: repeat-x; - border-color: #f5e79e; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fff8efc0', GradientType=0); -} - -.alert-danger { - background-image: -webkit-gradient(linear, left 0%, left 100%, from(#f2dede), to(#e7c3c3)); - background-image: -webkit-linear-gradient(top, #f2dede, 0%, #e7c3c3, 100%); - background-image: -moz-linear-gradient(top, #f2dede 0%, #e7c3c3 100%); - background-image: linear-gradient(to bottom, #f2dede 0%, #e7c3c3 100%); - background-repeat: repeat-x; - border-color: #dca7a7; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffe7c3c3', GradientType=0); -} - -.progress { - background-image: -webkit-gradient(linear, left 0%, left 100%, from(#ebebeb), to(#f5f5f5)); - background-image: -webkit-linear-gradient(top, #ebebeb, 0%, #f5f5f5, 100%); - background-image: -moz-linear-gradient(top, #ebebeb 0%, #f5f5f5 100%); - background-image: linear-gradient(to bottom, #ebebeb 0%, #f5f5f5 100%); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffebebeb', endColorstr='#fff5f5f5', GradientType=0); -} - -.progress-bar { - background-image: -webkit-gradient(linear, left 0%, left 100%, from(#428bca), to(#3071a9)); - background-image: -webkit-linear-gradient(top, #428bca, 0%, #3071a9, 100%); - background-image: -moz-linear-gradient(top, #428bca 0%, #3071a9 100%); - background-image: linear-gradient(to bottom, #428bca 0%, #3071a9 100%); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff3071a9', GradientType=0); -} - -.progress-bar-success { - background-image: -webkit-gradient(linear, left 0%, left 100%, from(#5cb85c), to(#449d44)); - background-image: -webkit-linear-gradient(top, #5cb85c, 0%, #449d44, 100%); - background-image: -moz-linear-gradient(top, #5cb85c 0%, #449d44 100%); - background-image: linear-gradient(to bottom, #5cb85c 0%, #449d44 100%); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff449d44', GradientType=0); -} - -.progress-bar-info { - background-image: -webkit-gradient(linear, left 0%, left 100%, from(#5bc0de), to(#31b0d5)); - background-image: -webkit-linear-gradient(top, #5bc0de, 0%, #31b0d5, 100%); - background-image: -moz-linear-gradient(top, #5bc0de 0%, #31b0d5 100%); - background-image: linear-gradient(to bottom, #5bc0de 0%, #31b0d5 100%); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff31b0d5', GradientType=0); -} - -.progress-bar-warning { - background-image: -webkit-gradient(linear, left 0%, left 100%, from(#f0ad4e), to(#ec971f)); - background-image: -webkit-linear-gradient(top, #f0ad4e, 0%, #ec971f, 100%); - background-image: -moz-linear-gradient(top, #f0ad4e 0%, #ec971f 100%); - background-image: linear-gradient(to bottom, #f0ad4e 0%, #ec971f 100%); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffec971f', GradientType=0); -} - -.progress-bar-danger { - background-image: -webkit-gradient(linear, left 0%, left 100%, from(#d9534f), to(#c9302c)); - background-image: -webkit-linear-gradient(top, #d9534f, 0%, #c9302c, 100%); - background-image: -moz-linear-gradient(top, #d9534f 0%, #c9302c 100%); - background-image: linear-gradient(to bottom, #d9534f 0%, #c9302c 100%); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc9302c', GradientType=0); -} - -.list-group { - border-radius: 4px; - -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.075); - box-shadow: 0 1px 2px rgba(0, 0, 0, 0.075); -} - -.list-group-item.active, -.list-group-item.active:hover, -.list-group-item.active:focus { - text-shadow: 0 -1px 0 #3071a9; - background-image: -webkit-gradient(linear, left 0%, left 100%, from(#428bca), to(#3278b3)); - background-image: -webkit-linear-gradient(top, #428bca, 0%, #3278b3, 100%); - background-image: -moz-linear-gradient(top, #428bca 0%, #3278b3 100%); - background-image: linear-gradient(to bottom, #428bca 0%, #3278b3 100%); - background-repeat: repeat-x; - border-color: #3278b3; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff3278b3', GradientType=0); -} - -.panel { - -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05); - box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05); -} - -.panel-default > .panel-heading { - background-image: -webkit-gradient(linear, left 0%, left 100%, from(#f5f5f5), to(#e8e8e8)); - background-image: -webkit-linear-gradient(top, #f5f5f5, 0%, #e8e8e8, 100%); - background-image: -moz-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%); - background-image: linear-gradient(to bottom, #f5f5f5 0%, #e8e8e8 100%); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0); -} - -.panel-primary > .panel-heading { - background-image: -webkit-gradient(linear, left 0%, left 100%, from(#428bca), to(#357ebd)); - background-image: -webkit-linear-gradient(top, #428bca, 0%, #357ebd, 100%); - background-image: -moz-linear-gradient(top, #428bca 0%, #357ebd 100%); - background-image: linear-gradient(to bottom, #428bca 0%, #357ebd 100%); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff357ebd', GradientType=0); -} - -.panel-success > .panel-heading { - background-image: -webkit-gradient(linear, left 0%, left 100%, from(#dff0d8), to(#d0e9c6)); - background-image: -webkit-linear-gradient(top, #dff0d8, 0%, #d0e9c6, 100%); - background-image: -moz-linear-gradient(top, #dff0d8 0%, #d0e9c6 100%); - background-image: linear-gradient(to bottom, #dff0d8 0%, #d0e9c6 100%); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffd0e9c6', GradientType=0); -} - -.panel-info > .panel-heading { - background-image: -webkit-gradient(linear, left 0%, left 100%, from(#d9edf7), to(#c4e3f3)); - background-image: -webkit-linear-gradient(top, #d9edf7, 0%, #c4e3f3, 100%); - background-image: -moz-linear-gradient(top, #d9edf7 0%, #c4e3f3 100%); - background-image: linear-gradient(to bottom, #d9edf7 0%, #c4e3f3 100%); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffc4e3f3', GradientType=0); -} - -.panel-warning > .panel-heading { - background-image: -webkit-gradient(linear, left 0%, left 100%, from(#fcf8e3), to(#faf2cc)); - background-image: -webkit-linear-gradient(top, #fcf8e3, 0%, #faf2cc, 100%); - background-image: -moz-linear-gradient(top, #fcf8e3 0%, #faf2cc 100%); - background-image: linear-gradient(to bottom, #fcf8e3 0%, #faf2cc 100%); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fffaf2cc', GradientType=0); -} - -.panel-danger > .panel-heading { - background-image: -webkit-gradient(linear, left 0%, left 100%, from(#f2dede), to(#ebcccc)); - background-image: -webkit-linear-gradient(top, #f2dede, 0%, #ebcccc, 100%); - background-image: -moz-linear-gradient(top, #f2dede 0%, #ebcccc 100%); - background-image: linear-gradient(to bottom, #f2dede 0%, #ebcccc 100%); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffebcccc', GradientType=0); -} - -.well { - background-image: -webkit-gradient(linear, left 0%, left 100%, from(#e8e8e8), to(#f5f5f5)); - background-image: -webkit-linear-gradient(top, #e8e8e8, 0%, #f5f5f5, 100%); - background-image: -moz-linear-gradient(top, #e8e8e8 0%, #f5f5f5 100%); - background-image: linear-gradient(to bottom, #e8e8e8 0%, #f5f5f5 100%); - background-repeat: repeat-x; - border-color: #dcdcdc; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffe8e8e8', endColorstr='#fff5f5f5', GradientType=0); - -webkit-box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.05), 0 1px 0 rgba(255, 255, 255, 0.1); - box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.05), 0 1px 0 rgba(255, 255, 255, 0.1); -} \ No newline at end of file diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/.gc3pie/html/bootstrap3/css/bootstrap-theme.min.css b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/.gc3pie/html/bootstrap3/css/bootstrap-theme.min.css deleted file mode 100644 index cad36b4e600dc09f24c69e7723ce661d19c4ffae..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/.gc3pie/html/bootstrap3/css/bootstrap-theme.min.css +++ /dev/null @@ -1 +0,0 @@ -.btn-default,.btn-primary,.btn-success,.btn-info,.btn-warning,.btn-danger{text-shadow:0 -1px 0 rgba(0,0,0,0.2);-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.15),0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 0 rgba(255,255,255,0.15),0 1px 1px rgba(0,0,0,0.075)}.btn-default:active,.btn-primary:active,.btn-success:active,.btn-info:active,.btn-warning:active,.btn-danger:active,.btn-default.active,.btn-primary.active,.btn-success.active,.btn-info.active,.btn-warning.active,.btn-danger.active{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,0.125);box-shadow:inset 0 3px 5px rgba(0,0,0,0.125)}.btn:active,.btn.active{background-image:none}.btn-default{text-shadow:0 1px 0 #fff;background-image:-webkit-gradient(linear,left 0,left 100%,from(#fff),to(#e6e6e6));background-image:-webkit-linear-gradient(top,#fff,0%,#e6e6e6,100%);background-image:-moz-linear-gradient(top,#fff 0,#e6e6e6 100%);background-image:linear-gradient(to bottom,#fff 0,#e6e6e6 100%);background-repeat:repeat-x;border-color:#e0e0e0;border-color:#ccc;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff',endColorstr='#ffe6e6e6',GradientType=0)}.btn-default:active,.btn-default.active{background-color:#e6e6e6;border-color:#e0e0e0}.btn-primary{background-image:-webkit-gradient(linear,left 0,left 100%,from(#428bca),to(#3071a9));background-image:-webkit-linear-gradient(top,#428bca,0%,#3071a9,100%);background-image:-moz-linear-gradient(top,#428bca 0,#3071a9 100%);background-image:linear-gradient(to bottom,#428bca 0,#3071a9 100%);background-repeat:repeat-x;border-color:#2d6ca2;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca',endColorstr='#ff3071a9',GradientType=0)}.btn-primary:active,.btn-primary.active{background-color:#3071a9;border-color:#2d6ca2}.btn-success{background-image:-webkit-gradient(linear,left 0,left 100%,from(#5cb85c),to(#449d44));background-image:-webkit-linear-gradient(top,#5cb85c,0%,#449d44,100%);background-image:-moz-linear-gradient(top,#5cb85c 0,#449d44 100%);background-image:linear-gradient(to bottom,#5cb85c 0,#449d44 100%);background-repeat:repeat-x;border-color:#419641;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c',endColorstr='#ff449d44',GradientType=0)}.btn-success:active,.btn-success.active{background-color:#449d44;border-color:#419641}.btn-warning{background-image:-webkit-gradient(linear,left 0,left 100%,from(#f0ad4e),to(#ec971f));background-image:-webkit-linear-gradient(top,#f0ad4e,0%,#ec971f,100%);background-image:-moz-linear-gradient(top,#f0ad4e 0,#ec971f 100%);background-image:linear-gradient(to bottom,#f0ad4e 0,#ec971f 100%);background-repeat:repeat-x;border-color:#eb9316;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e',endColorstr='#ffec971f',GradientType=0)}.btn-warning:active,.btn-warning.active{background-color:#ec971f;border-color:#eb9316}.btn-danger{background-image:-webkit-gradient(linear,left 0,left 100%,from(#d9534f),to(#c9302c));background-image:-webkit-linear-gradient(top,#d9534f,0%,#c9302c,100%);background-image:-moz-linear-gradient(top,#d9534f 0,#c9302c 100%);background-image:linear-gradient(to bottom,#d9534f 0,#c9302c 100%);background-repeat:repeat-x;border-color:#c12e2a;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f',endColorstr='#ffc9302c',GradientType=0)}.btn-danger:active,.btn-danger.active{background-color:#c9302c;border-color:#c12e2a}.btn-info{background-image:-webkit-gradient(linear,left 0,left 100%,from(#5bc0de),to(#31b0d5));background-image:-webkit-linear-gradient(top,#5bc0de,0%,#31b0d5,100%);background-image:-moz-linear-gradient(top,#5bc0de 0,#31b0d5 100%);background-image:linear-gradient(to bottom,#5bc0de 0,#31b0d5 100%);background-repeat:repeat-x;border-color:#2aabd2;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de',endColorstr='#ff31b0d5',GradientType=0)}.btn-info:active,.btn-info.active{background-color:#31b0d5;border-color:#2aabd2}.thumbnail,.img-thumbnail{-webkit-box-shadow:0 1px 2px rgba(0,0,0,0.075);box-shadow:0 1px 2px rgba(0,0,0,0.075)}.dropdown-menu>li>a:hover,.dropdown-menu>li>a:focus,.dropdown-menu>.active>a,.dropdown-menu>.active>a:hover,.dropdown-menu>.active>a:focus{background-color:#357ebd;background-image:-webkit-gradient(linear,left 0,left 100%,from(#428bca),to(#357ebd));background-image:-webkit-linear-gradient(top,#428bca,0%,#357ebd,100%);background-image:-moz-linear-gradient(top,#428bca 0,#357ebd 100%);background-image:linear-gradient(to bottom,#428bca 0,#357ebd 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca',endColorstr='#ff357ebd',GradientType=0)}.navbar{background-image:-webkit-gradient(linear,left 0,left 100%,from(#fff),to(#f8f8f8));background-image:-webkit-linear-gradient(top,#fff,0%,#f8f8f8,100%);background-image:-moz-linear-gradient(top,#fff 0,#f8f8f8 100%);background-image:linear-gradient(to bottom,#fff 0,#f8f8f8 100%);background-repeat:repeat-x;border-radius:4px;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff',endColorstr='#fff8f8f8',GradientType=0);-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.15),0 1px 5px rgba(0,0,0,0.075);box-shadow:inset 0 1px 0 rgba(255,255,255,0.15),0 1px 5px rgba(0,0,0,0.075)}.navbar .navbar-nav>.active>a{background-color:#f8f8f8}.navbar-brand,.navbar-nav>li>a{text-shadow:0 1px 0 rgba(255,255,255,0.25)}.navbar-inverse{background-image:-webkit-gradient(linear,left 0,left 100%,from(#3c3c3c),to(#222));background-image:-webkit-linear-gradient(top,#3c3c3c,0%,#222,100%);background-image:-moz-linear-gradient(top,#3c3c3c 0,#222 100%);background-image:linear-gradient(to bottom,#3c3c3c 0,#222 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff3c3c3c',endColorstr='#ff222222',GradientType=0)}.navbar-inverse .navbar-nav>.active>a{background-color:#222}.navbar-inverse .navbar-brand,.navbar-inverse .navbar-nav>li>a{text-shadow:0 -1px 0 rgba(0,0,0,0.25)}.navbar-static-top,.navbar-fixed-top,.navbar-fixed-bottom{border-radius:0}.alert{text-shadow:0 1px 0 rgba(255,255,255,0.2);-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.25),0 1px 2px rgba(0,0,0,0.05);box-shadow:inset 0 1px 0 rgba(255,255,255,0.25),0 1px 2px rgba(0,0,0,0.05)}.alert-success{background-image:-webkit-gradient(linear,left 0,left 100%,from(#dff0d8),to(#c8e5bc));background-image:-webkit-linear-gradient(top,#dff0d8,0%,#c8e5bc,100%);background-image:-moz-linear-gradient(top,#dff0d8 0,#c8e5bc 100%);background-image:linear-gradient(to bottom,#dff0d8 0,#c8e5bc 100%);background-repeat:repeat-x;border-color:#b2dba1;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8',endColorstr='#ffc8e5bc',GradientType=0)}.alert-info{background-image:-webkit-gradient(linear,left 0,left 100%,from(#d9edf7),to(#b9def0));background-image:-webkit-linear-gradient(top,#d9edf7,0%,#b9def0,100%);background-image:-moz-linear-gradient(top,#d9edf7 0,#b9def0 100%);background-image:linear-gradient(to bottom,#d9edf7 0,#b9def0 100%);background-repeat:repeat-x;border-color:#9acfea;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7',endColorstr='#ffb9def0',GradientType=0)}.alert-warning{background-image:-webkit-gradient(linear,left 0,left 100%,from(#fcf8e3),to(#f8efc0));background-image:-webkit-linear-gradient(top,#fcf8e3,0%,#f8efc0,100%);background-image:-moz-linear-gradient(top,#fcf8e3 0,#f8efc0 100%);background-image:linear-gradient(to bottom,#fcf8e3 0,#f8efc0 100%);background-repeat:repeat-x;border-color:#f5e79e;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3',endColorstr='#fff8efc0',GradientType=0)}.alert-danger{background-image:-webkit-gradient(linear,left 0,left 100%,from(#f2dede),to(#e7c3c3));background-image:-webkit-linear-gradient(top,#f2dede,0%,#e7c3c3,100%);background-image:-moz-linear-gradient(top,#f2dede 0,#e7c3c3 100%);background-image:linear-gradient(to bottom,#f2dede 0,#e7c3c3 100%);background-repeat:repeat-x;border-color:#dca7a7;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede',endColorstr='#ffe7c3c3',GradientType=0)}.progress{background-image:-webkit-gradient(linear,left 0,left 100%,from(#ebebeb),to(#f5f5f5));background-image:-webkit-linear-gradient(top,#ebebeb,0%,#f5f5f5,100%);background-image:-moz-linear-gradient(top,#ebebeb 0,#f5f5f5 100%);background-image:linear-gradient(to bottom,#ebebeb 0,#f5f5f5 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffebebeb',endColorstr='#fff5f5f5',GradientType=0)}.progress-bar{background-image:-webkit-gradient(linear,left 0,left 100%,from(#428bca),to(#3071a9));background-image:-webkit-linear-gradient(top,#428bca,0%,#3071a9,100%);background-image:-moz-linear-gradient(top,#428bca 0,#3071a9 100%);background-image:linear-gradient(to bottom,#428bca 0,#3071a9 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca',endColorstr='#ff3071a9',GradientType=0)}.progress-bar-success{background-image:-webkit-gradient(linear,left 0,left 100%,from(#5cb85c),to(#449d44));background-image:-webkit-linear-gradient(top,#5cb85c,0%,#449d44,100%);background-image:-moz-linear-gradient(top,#5cb85c 0,#449d44 100%);background-image:linear-gradient(to bottom,#5cb85c 0,#449d44 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c',endColorstr='#ff449d44',GradientType=0)}.progress-bar-info{background-image:-webkit-gradient(linear,left 0,left 100%,from(#5bc0de),to(#31b0d5));background-image:-webkit-linear-gradient(top,#5bc0de,0%,#31b0d5,100%);background-image:-moz-linear-gradient(top,#5bc0de 0,#31b0d5 100%);background-image:linear-gradient(to bottom,#5bc0de 0,#31b0d5 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de',endColorstr='#ff31b0d5',GradientType=0)}.progress-bar-warning{background-image:-webkit-gradient(linear,left 0,left 100%,from(#f0ad4e),to(#ec971f));background-image:-webkit-linear-gradient(top,#f0ad4e,0%,#ec971f,100%);background-image:-moz-linear-gradient(top,#f0ad4e 0,#ec971f 100%);background-image:linear-gradient(to bottom,#f0ad4e 0,#ec971f 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e',endColorstr='#ffec971f',GradientType=0)}.progress-bar-danger{background-image:-webkit-gradient(linear,left 0,left 100%,from(#d9534f),to(#c9302c));background-image:-webkit-linear-gradient(top,#d9534f,0%,#c9302c,100%);background-image:-moz-linear-gradient(top,#d9534f 0,#c9302c 100%);background-image:linear-gradient(to bottom,#d9534f 0,#c9302c 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f',endColorstr='#ffc9302c',GradientType=0)}.list-group{border-radius:4px;-webkit-box-shadow:0 1px 2px rgba(0,0,0,0.075);box-shadow:0 1px 2px rgba(0,0,0,0.075)}.list-group-item.active,.list-group-item.active:hover,.list-group-item.active:focus{text-shadow:0 -1px 0 #3071a9;background-image:-webkit-gradient(linear,left 0,left 100%,from(#428bca),to(#3278b3));background-image:-webkit-linear-gradient(top,#428bca,0%,#3278b3,100%);background-image:-moz-linear-gradient(top,#428bca 0,#3278b3 100%);background-image:linear-gradient(to bottom,#428bca 0,#3278b3 100%);background-repeat:repeat-x;border-color:#3278b3;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca',endColorstr='#ff3278b3',GradientType=0)}.panel{-webkit-box-shadow:0 1px 2px rgba(0,0,0,0.05);box-shadow:0 1px 2px rgba(0,0,0,0.05)}.panel-default>.panel-heading{background-image:-webkit-gradient(linear,left 0,left 100%,from(#f5f5f5),to(#e8e8e8));background-image:-webkit-linear-gradient(top,#f5f5f5,0%,#e8e8e8,100%);background-image:-moz-linear-gradient(top,#f5f5f5 0,#e8e8e8 100%);background-image:linear-gradient(to bottom,#f5f5f5 0,#e8e8e8 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5',endColorstr='#ffe8e8e8',GradientType=0)}.panel-primary>.panel-heading{background-image:-webkit-gradient(linear,left 0,left 100%,from(#428bca),to(#357ebd));background-image:-webkit-linear-gradient(top,#428bca,0%,#357ebd,100%);background-image:-moz-linear-gradient(top,#428bca 0,#357ebd 100%);background-image:linear-gradient(to bottom,#428bca 0,#357ebd 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca',endColorstr='#ff357ebd',GradientType=0)}.panel-success>.panel-heading{background-image:-webkit-gradient(linear,left 0,left 100%,from(#dff0d8),to(#d0e9c6));background-image:-webkit-linear-gradient(top,#dff0d8,0%,#d0e9c6,100%);background-image:-moz-linear-gradient(top,#dff0d8 0,#d0e9c6 100%);background-image:linear-gradient(to bottom,#dff0d8 0,#d0e9c6 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8',endColorstr='#ffd0e9c6',GradientType=0)}.panel-info>.panel-heading{background-image:-webkit-gradient(linear,left 0,left 100%,from(#d9edf7),to(#c4e3f3));background-image:-webkit-linear-gradient(top,#d9edf7,0%,#c4e3f3,100%);background-image:-moz-linear-gradient(top,#d9edf7 0,#c4e3f3 100%);background-image:linear-gradient(to bottom,#d9edf7 0,#c4e3f3 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7',endColorstr='#ffc4e3f3',GradientType=0)}.panel-warning>.panel-heading{background-image:-webkit-gradient(linear,left 0,left 100%,from(#fcf8e3),to(#faf2cc));background-image:-webkit-linear-gradient(top,#fcf8e3,0%,#faf2cc,100%);background-image:-moz-linear-gradient(top,#fcf8e3 0,#faf2cc 100%);background-image:linear-gradient(to bottom,#fcf8e3 0,#faf2cc 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3',endColorstr='#fffaf2cc',GradientType=0)}.panel-danger>.panel-heading{background-image:-webkit-gradient(linear,left 0,left 100%,from(#f2dede),to(#ebcccc));background-image:-webkit-linear-gradient(top,#f2dede,0%,#ebcccc,100%);background-image:-moz-linear-gradient(top,#f2dede 0,#ebcccc 100%);background-image:linear-gradient(to bottom,#f2dede 0,#ebcccc 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede',endColorstr='#ffebcccc',GradientType=0)}.well{background-image:-webkit-gradient(linear,left 0,left 100%,from(#e8e8e8),to(#f5f5f5));background-image:-webkit-linear-gradient(top,#e8e8e8,0%,#f5f5f5,100%);background-image:-moz-linear-gradient(top,#e8e8e8 0,#f5f5f5 100%);background-image:linear-gradient(to bottom,#e8e8e8 0,#f5f5f5 100%);background-repeat:repeat-x;border-color:#dcdcdc;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffe8e8e8',endColorstr='#fff5f5f5',GradientType=0);-webkit-box-shadow:inset 0 1px 3px rgba(0,0,0,0.05),0 1px 0 rgba(255,255,255,0.1);box-shadow:inset 0 1px 3px rgba(0,0,0,0.05),0 1px 0 rgba(255,255,255,0.1)} \ No newline at end of file diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/.gc3pie/html/bootstrap3/css/bootstrap.css b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/.gc3pie/html/bootstrap3/css/bootstrap.css deleted file mode 100644 index bbda4eed4afdc3cb938da2c517365faaf58545b5..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/.gc3pie/html/bootstrap3/css/bootstrap.css +++ /dev/null @@ -1,6805 +0,0 @@ -/*! - * Bootstrap v3.0.0 - * - * Copyright 2013 Twitter, Inc - * Licensed under the Apache License v2.0 - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Designed and built with all the love in the world by @mdo and @fat. - */ - -/*! normalize.css v2.1.0 | 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; -} - -audio:not([controls]) { - display: none; - height: 0; -} - -[hidden] { - display: none; -} - -html { - font-family: sans-serif; - -webkit-text-size-adjust: 100%; - -ms-text-size-adjust: 100%; -} - -body { - margin: 0; -} - -a:focus { - outline: thin dotted; -} - -a:active, -a:hover { - outline: 0; -} - -h1 { - margin: 0.67em 0; - font-size: 2em; -} - -abbr[title] { - border-bottom: 1px dotted; -} - -b, -strong { - font-weight: bold; -} - -dfn { - font-style: italic; -} - -hr { - height: 0; - -moz-box-sizing: content-box; - box-sizing: content-box; -} - -mark { - color: #000; - background: #ff0; -} - -code, -kbd, -pre, -samp { - font-family: monospace, serif; - font-size: 1em; -} - -pre { - white-space: pre-wrap; -} - -q { - quotes: "\201C" "\201D" "\2018" "\2019"; -} - -small { - font-size: 80%; -} - -sub, -sup { - position: relative; - font-size: 75%; - line-height: 0; - vertical-align: baseline; -} - -sup { - top: -0.5em; -} - -sub { - bottom: -0.25em; -} - -img { - border: 0; -} - -svg:not(:root) { - overflow: hidden; -} - -figure { - margin: 0; -} - -fieldset { - padding: 0.35em 0.625em 0.75em; - margin: 0 2px; - border: 1px solid #c0c0c0; -} - -legend { - padding: 0; - border: 0; -} - -button, -input, -select, -textarea { - margin: 0; - font-family: inherit; - font-size: 100%; -} - -button, -input { - line-height: normal; -} - -button, -select { - text-transform: none; -} - -button, -html input[type="button"], -input[type="reset"], -input[type="submit"] { - cursor: pointer; - -webkit-appearance: button; -} - -button[disabled], -html input[disabled] { - cursor: default; -} - -input[type="checkbox"], -input[type="radio"] { - padding: 0; - box-sizing: border-box; -} - -input[type="search"] { - -webkit-box-sizing: content-box; - -moz-box-sizing: content-box; - box-sizing: content-box; - -webkit-appearance: textfield; -} - -input[type="search"]::-webkit-search-cancel-button, -input[type="search"]::-webkit-search-decoration { - -webkit-appearance: none; -} - -button::-moz-focus-inner, -input::-moz-focus-inner { - padding: 0; - border: 0; -} - -textarea { - overflow: auto; - vertical-align: top; -} - -table { - border-collapse: collapse; - border-spacing: 0; -} - -@media print { - * { - color: #000 !important; - text-shadow: none !important; - background: transparent !important; - box-shadow: none !important; - } - a, - a:visited { - text-decoration: underline; - } - a[href]:after { - content: " (" attr(href) ")"; - } - abbr[title]:after { - content: " (" attr(title) ")"; - } - .ir a:after, - a[href^="javascript:"]:after, - a[href^="#"]:after { - content: ""; - } - pre, - blockquote { - border: 1px solid #999; - page-break-inside: avoid; - } - thead { - display: table-header-group; - } - tr, - img { - page-break-inside: avoid; - } - img { - max-width: 100% !important; - } - @page { - margin: 2cm .5cm; - } - p, - h2, - h3 { - orphans: 3; - widows: 3; - } - h2, - h3 { - page-break-after: avoid; - } - .navbar { - display: none; - } - .table td, - .table th { - background-color: #fff !important; - } - .btn > .caret, - .dropup > .btn > .caret { - border-top-color: #000 !important; - } - .label { - border: 1px solid #000; - } - .table { - border-collapse: collapse !important; - } - .table-bordered th, - .table-bordered td { - border: 1px solid #ddd !important; - } -} - -*, -*:before, -*:after { - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; -} - -html { - font-size: 62.5%; - -webkit-tap-highlight-color: rgba(0, 0, 0, 0); -} - -body { - font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; - font-size: 14px; - line-height: 1.428571429; - color: #333333; - background-color: #ffffff; -} - -input, -button, -select, -textarea { - font-family: inherit; - font-size: inherit; - line-height: inherit; -} - -button, -input, -select[multiple], -textarea { - background-image: none; -} - -a { - color: #428bca; - text-decoration: none; -} - -a:hover, -a:focus { - color: #2a6496; - text-decoration: underline; -} - -a:focus { - outline: thin dotted #333; - outline: 5px auto -webkit-focus-ring-color; - outline-offset: -2px; -} - -img { - vertical-align: middle; -} - -.img-responsive { - display: block; - height: auto; - max-width: 100%; -} - -.img-rounded { - border-radius: 6px; -} - -.img-thumbnail { - display: inline-block; - height: auto; - max-width: 100%; - padding: 4px; - line-height: 1.428571429; - background-color: #ffffff; - border: 1px solid #dddddd; - border-radius: 4px; - -webkit-transition: all 0.2s ease-in-out; - transition: all 0.2s ease-in-out; -} - -.img-circle { - border-radius: 50%; -} - -hr { - margin-top: 20px; - margin-bottom: 20px; - border: 0; - border-top: 1px solid #eeeeee; -} - -.sr-only { - position: absolute; - width: 1px; - height: 1px; - padding: 0; - margin: -1px; - overflow: hidden; - clip: rect(0 0 0 0); - border: 0; -} - -p { - margin: 0 0 10px; -} - -.lead { - margin-bottom: 20px; - font-size: 16.099999999999998px; - font-weight: 200; - line-height: 1.4; -} - -@media (min-width: 768px) { - .lead { - font-size: 21px; - } -} - -small { - font-size: 85%; -} - -cite { - font-style: normal; -} - -.text-muted { - color: #999999; -} - -.text-primary { - color: #428bca; -} - -.text-warning { - color: #c09853; -} - -.text-danger { - color: #b94a48; -} - -.text-success { - color: #468847; -} - -.text-info { - color: #3a87ad; -} - -.text-left { - text-align: left; -} - -.text-right { - text-align: right; -} - -.text-center { - text-align: center; -} - -h1, -h2, -h3, -h4, -h5, -h6, -.h1, -.h2, -.h3, -.h4, -.h5, -.h6 { - font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; - font-weight: 500; - line-height: 1.1; -} - -h1 small, -h2 small, -h3 small, -h4 small, -h5 small, -h6 small, -.h1 small, -.h2 small, -.h3 small, -.h4 small, -.h5 small, -.h6 small { - font-weight: normal; - line-height: 1; - color: #999999; -} - -h1, -h2, -h3 { - margin-top: 20px; - margin-bottom: 10px; -} - -h4, -h5, -h6 { - margin-top: 10px; - margin-bottom: 10px; -} - -h1, -.h1 { - font-size: 36px; -} - -h2, -.h2 { - font-size: 30px; -} - -h3, -.h3 { - font-size: 24px; -} - -h4, -.h4 { - font-size: 18px; -} - -h5, -.h5 { - font-size: 14px; -} - -h6, -.h6 { - font-size: 12px; -} - -h1 small, -.h1 small { - font-size: 24px; -} - -h2 small, -.h2 small { - font-size: 18px; -} - -h3 small, -.h3 small, -h4 small, -.h4 small { - font-size: 14px; -} - -.page-header { - padding-bottom: 9px; - margin: 40px 0 20px; - border-bottom: 1px solid #eeeeee; -} - -ul, -ol { - margin-top: 0; - margin-bottom: 10px; -} - -ul ul, -ol ul, -ul ol, -ol ol { - margin-bottom: 0; -} - -.list-unstyled { - padding-left: 0; - list-style: none; -} - -.list-inline { - padding-left: 0; - list-style: none; -} - -.list-inline > li { - display: inline-block; - padding-right: 5px; - padding-left: 5px; -} - -dl { - margin-bottom: 20px; -} - -dt, -dd { - line-height: 1.428571429; -} - -dt { - font-weight: bold; -} - -dd { - margin-left: 0; -} - -@media (min-width: 768px) { - .dl-horizontal dt { - float: left; - width: 160px; - overflow: hidden; - clear: left; - text-align: right; - text-overflow: ellipsis; - white-space: nowrap; - } - .dl-horizontal dd { - margin-left: 180px; - } - .dl-horizontal dd:before, - .dl-horizontal dd:after { - display: table; - content: " "; - } - .dl-horizontal dd:after { - clear: both; - } - .dl-horizontal dd:before, - .dl-horizontal dd:after { - display: table; - content: " "; - } - .dl-horizontal dd:after { - clear: both; - } -} - -abbr[title], -abbr[data-original-title] { - cursor: help; - border-bottom: 1px dotted #999999; -} - -abbr.initialism { - font-size: 90%; - text-transform: uppercase; -} - -blockquote { - padding: 10px 20px; - margin: 0 0 20px; - border-left: 5px solid #eeeeee; -} - -blockquote p { - font-size: 17.5px; - font-weight: 300; - line-height: 1.25; -} - -blockquote p:last-child { - margin-bottom: 0; -} - -blockquote small { - display: block; - line-height: 1.428571429; - color: #999999; -} - -blockquote small:before { - content: '\2014 \00A0'; -} - -blockquote.pull-right { - padding-right: 15px; - padding-left: 0; - border-right: 5px solid #eeeeee; - border-left: 0; -} - -blockquote.pull-right p, -blockquote.pull-right small { - text-align: right; -} - -blockquote.pull-right small:before { - content: ''; -} - -blockquote.pull-right small:after { - content: '\00A0 \2014'; -} - -q:before, -q:after, -blockquote:before, -blockquote:after { - content: ""; -} - -address { - display: block; - margin-bottom: 20px; - font-style: normal; - line-height: 1.428571429; -} - -code, -pre { - font-family: Monaco, Menlo, Consolas, "Courier New", monospace; -} - -code { - padding: 2px 4px; - font-size: 90%; - color: #c7254e; - white-space: nowrap; - background-color: #f9f2f4; - border-radius: 4px; -} - -pre { - display: block; - padding: 9.5px; - margin: 0 0 10px; - font-size: 13px; - line-height: 1.428571429; - color: #333333; - word-break: break-all; - word-wrap: break-word; - background-color: #f5f5f5; - border: 1px solid #cccccc; - border-radius: 4px; -} - -pre.prettyprint { - margin-bottom: 20px; -} - -pre code { - padding: 0; - font-size: inherit; - color: inherit; - white-space: pre-wrap; - background-color: transparent; - border: 0; -} - -.pre-scrollable { - max-height: 340px; - overflow-y: scroll; -} - -.container { - padding-right: 15px; - padding-left: 15px; - margin-right: auto; - margin-left: auto; -} - -.container:before, -.container:after { - display: table; - content: " "; -} - -.container:after { - clear: both; -} - -.container:before, -.container:after { - display: table; - content: " "; -} - -.container:after { - clear: both; -} - -.row { - margin-right: -15px; - margin-left: -15px; -} - -.row:before, -.row:after { - display: table; - content: " "; -} - -.row:after { - clear: both; -} - -.row:before, -.row:after { - display: table; - content: " "; -} - -.row:after { - clear: both; -} - -.col-xs-1, -.col-xs-2, -.col-xs-3, -.col-xs-4, -.col-xs-5, -.col-xs-6, -.col-xs-7, -.col-xs-8, -.col-xs-9, -.col-xs-10, -.col-xs-11, -.col-xs-12, -.col-sm-1, -.col-sm-2, -.col-sm-3, -.col-sm-4, -.col-sm-5, -.col-sm-6, -.col-sm-7, -.col-sm-8, -.col-sm-9, -.col-sm-10, -.col-sm-11, -.col-sm-12, -.col-md-1, -.col-md-2, -.col-md-3, -.col-md-4, -.col-md-5, -.col-md-6, -.col-md-7, -.col-md-8, -.col-md-9, -.col-md-10, -.col-md-11, -.col-md-12, -.col-lg-1, -.col-lg-2, -.col-lg-3, -.col-lg-4, -.col-lg-5, -.col-lg-6, -.col-lg-7, -.col-lg-8, -.col-lg-9, -.col-lg-10, -.col-lg-11, -.col-lg-12 { - position: relative; - min-height: 1px; - padding-right: 15px; - padding-left: 15px; -} - -.col-xs-1, -.col-xs-2, -.col-xs-3, -.col-xs-4, -.col-xs-5, -.col-xs-6, -.col-xs-7, -.col-xs-8, -.col-xs-9, -.col-xs-10, -.col-xs-11 { - float: left; -} - -.col-xs-1 { - width: 8.333333333333332%; -} - -.col-xs-2 { - width: 16.666666666666664%; -} - -.col-xs-3 { - width: 25%; -} - -.col-xs-4 { - width: 33.33333333333333%; -} - -.col-xs-5 { - width: 41.66666666666667%; -} - -.col-xs-6 { - width: 50%; -} - -.col-xs-7 { - width: 58.333333333333336%; -} - -.col-xs-8 { - width: 66.66666666666666%; -} - -.col-xs-9 { - width: 75%; -} - -.col-xs-10 { - width: 83.33333333333334%; -} - -.col-xs-11 { - width: 91.66666666666666%; -} - -.col-xs-12 { - width: 100%; -} - -@media (min-width: 768px) { - .container { - max-width: 750px; - } - .col-sm-1, - .col-sm-2, - .col-sm-3, - .col-sm-4, - .col-sm-5, - .col-sm-6, - .col-sm-7, - .col-sm-8, - .col-sm-9, - .col-sm-10, - .col-sm-11 { - float: left; - } - .col-sm-1 { - width: 8.333333333333332%; - } - .col-sm-2 { - width: 16.666666666666664%; - } - .col-sm-3 { - width: 25%; - } - .col-sm-4 { - width: 33.33333333333333%; - } - .col-sm-5 { - width: 41.66666666666667%; - } - .col-sm-6 { - width: 50%; - } - .col-sm-7 { - width: 58.333333333333336%; - } - .col-sm-8 { - width: 66.66666666666666%; - } - .col-sm-9 { - width: 75%; - } - .col-sm-10 { - width: 83.33333333333334%; - } - .col-sm-11 { - width: 91.66666666666666%; - } - .col-sm-12 { - width: 100%; - } - .col-sm-push-1 { - left: 8.333333333333332%; - } - .col-sm-push-2 { - left: 16.666666666666664%; - } - .col-sm-push-3 { - left: 25%; - } - .col-sm-push-4 { - left: 33.33333333333333%; - } - .col-sm-push-5 { - left: 41.66666666666667%; - } - .col-sm-push-6 { - left: 50%; - } - .col-sm-push-7 { - left: 58.333333333333336%; - } - .col-sm-push-8 { - left: 66.66666666666666%; - } - .col-sm-push-9 { - left: 75%; - } - .col-sm-push-10 { - left: 83.33333333333334%; - } - .col-sm-push-11 { - left: 91.66666666666666%; - } - .col-sm-pull-1 { - right: 8.333333333333332%; - } - .col-sm-pull-2 { - right: 16.666666666666664%; - } - .col-sm-pull-3 { - right: 25%; - } - .col-sm-pull-4 { - right: 33.33333333333333%; - } - .col-sm-pull-5 { - right: 41.66666666666667%; - } - .col-sm-pull-6 { - right: 50%; - } - .col-sm-pull-7 { - right: 58.333333333333336%; - } - .col-sm-pull-8 { - right: 66.66666666666666%; - } - .col-sm-pull-9 { - right: 75%; - } - .col-sm-pull-10 { - right: 83.33333333333334%; - } - .col-sm-pull-11 { - right: 91.66666666666666%; - } - .col-sm-offset-1 { - margin-left: 8.333333333333332%; - } - .col-sm-offset-2 { - margin-left: 16.666666666666664%; - } - .col-sm-offset-3 { - margin-left: 25%; - } - .col-sm-offset-4 { - margin-left: 33.33333333333333%; - } - .col-sm-offset-5 { - margin-left: 41.66666666666667%; - } - .col-sm-offset-6 { - margin-left: 50%; - } - .col-sm-offset-7 { - margin-left: 58.333333333333336%; - } - .col-sm-offset-8 { - margin-left: 66.66666666666666%; - } - .col-sm-offset-9 { - margin-left: 75%; - } - .col-sm-offset-10 { - margin-left: 83.33333333333334%; - } - .col-sm-offset-11 { - margin-left: 91.66666666666666%; - } -} - -@media (min-width: 992px) { - .container { - max-width: 970px; - } - .col-md-1, - .col-md-2, - .col-md-3, - .col-md-4, - .col-md-5, - .col-md-6, - .col-md-7, - .col-md-8, - .col-md-9, - .col-md-10, - .col-md-11 { - float: left; - } - .col-md-1 { - width: 8.333333333333332%; - } - .col-md-2 { - width: 16.666666666666664%; - } - .col-md-3 { - width: 25%; - } - .col-md-4 { - width: 33.33333333333333%; - } - .col-md-5 { - width: 41.66666666666667%; - } - .col-md-6 { - width: 50%; - } - .col-md-7 { - width: 58.333333333333336%; - } - .col-md-8 { - width: 66.66666666666666%; - } - .col-md-9 { - width: 75%; - } - .col-md-10 { - width: 83.33333333333334%; - } - .col-md-11 { - width: 91.66666666666666%; - } - .col-md-12 { - width: 100%; - } - .col-md-push-0 { - left: auto; - } - .col-md-push-1 { - left: 8.333333333333332%; - } - .col-md-push-2 { - left: 16.666666666666664%; - } - .col-md-push-3 { - left: 25%; - } - .col-md-push-4 { - left: 33.33333333333333%; - } - .col-md-push-5 { - left: 41.66666666666667%; - } - .col-md-push-6 { - left: 50%; - } - .col-md-push-7 { - left: 58.333333333333336%; - } - .col-md-push-8 { - left: 66.66666666666666%; - } - .col-md-push-9 { - left: 75%; - } - .col-md-push-10 { - left: 83.33333333333334%; - } - .col-md-push-11 { - left: 91.66666666666666%; - } - .col-md-pull-0 { - right: auto; - } - .col-md-pull-1 { - right: 8.333333333333332%; - } - .col-md-pull-2 { - right: 16.666666666666664%; - } - .col-md-pull-3 { - right: 25%; - } - .col-md-pull-4 { - right: 33.33333333333333%; - } - .col-md-pull-5 { - right: 41.66666666666667%; - } - .col-md-pull-6 { - right: 50%; - } - .col-md-pull-7 { - right: 58.333333333333336%; - } - .col-md-pull-8 { - right: 66.66666666666666%; - } - .col-md-pull-9 { - right: 75%; - } - .col-md-pull-10 { - right: 83.33333333333334%; - } - .col-md-pull-11 { - right: 91.66666666666666%; - } - .col-md-offset-0 { - margin-left: 0; - } - .col-md-offset-1 { - margin-left: 8.333333333333332%; - } - .col-md-offset-2 { - margin-left: 16.666666666666664%; - } - .col-md-offset-3 { - margin-left: 25%; - } - .col-md-offset-4 { - margin-left: 33.33333333333333%; - } - .col-md-offset-5 { - margin-left: 41.66666666666667%; - } - .col-md-offset-6 { - margin-left: 50%; - } - .col-md-offset-7 { - margin-left: 58.333333333333336%; - } - .col-md-offset-8 { - margin-left: 66.66666666666666%; - } - .col-md-offset-9 { - margin-left: 75%; - } - .col-md-offset-10 { - margin-left: 83.33333333333334%; - } - .col-md-offset-11 { - margin-left: 91.66666666666666%; - } -} - -@media (min-width: 1200px) { - .container { - max-width: 1170px; - } - .col-lg-1, - .col-lg-2, - .col-lg-3, - .col-lg-4, - .col-lg-5, - .col-lg-6, - .col-lg-7, - .col-lg-8, - .col-lg-9, - .col-lg-10, - .col-lg-11 { - float: left; - } - .col-lg-1 { - width: 8.333333333333332%; - } - .col-lg-2 { - width: 16.666666666666664%; - } - .col-lg-3 { - width: 25%; - } - .col-lg-4 { - width: 33.33333333333333%; - } - .col-lg-5 { - width: 41.66666666666667%; - } - .col-lg-6 { - width: 50%; - } - .col-lg-7 { - width: 58.333333333333336%; - } - .col-lg-8 { - width: 66.66666666666666%; - } - .col-lg-9 { - width: 75%; - } - .col-lg-10 { - width: 83.33333333333334%; - } - .col-lg-11 { - width: 91.66666666666666%; - } - .col-lg-12 { - width: 100%; - } - .col-lg-push-0 { - left: auto; - } - .col-lg-push-1 { - left: 8.333333333333332%; - } - .col-lg-push-2 { - left: 16.666666666666664%; - } - .col-lg-push-3 { - left: 25%; - } - .col-lg-push-4 { - left: 33.33333333333333%; - } - .col-lg-push-5 { - left: 41.66666666666667%; - } - .col-lg-push-6 { - left: 50%; - } - .col-lg-push-7 { - left: 58.333333333333336%; - } - .col-lg-push-8 { - left: 66.66666666666666%; - } - .col-lg-push-9 { - left: 75%; - } - .col-lg-push-10 { - left: 83.33333333333334%; - } - .col-lg-push-11 { - left: 91.66666666666666%; - } - .col-lg-pull-0 { - right: auto; - } - .col-lg-pull-1 { - right: 8.333333333333332%; - } - .col-lg-pull-2 { - right: 16.666666666666664%; - } - .col-lg-pull-3 { - right: 25%; - } - .col-lg-pull-4 { - right: 33.33333333333333%; - } - .col-lg-pull-5 { - right: 41.66666666666667%; - } - .col-lg-pull-6 { - right: 50%; - } - .col-lg-pull-7 { - right: 58.333333333333336%; - } - .col-lg-pull-8 { - right: 66.66666666666666%; - } - .col-lg-pull-9 { - right: 75%; - } - .col-lg-pull-10 { - right: 83.33333333333334%; - } - .col-lg-pull-11 { - right: 91.66666666666666%; - } - .col-lg-offset-0 { - margin-left: 0; - } - .col-lg-offset-1 { - margin-left: 8.333333333333332%; - } - .col-lg-offset-2 { - margin-left: 16.666666666666664%; - } - .col-lg-offset-3 { - margin-left: 25%; - } - .col-lg-offset-4 { - margin-left: 33.33333333333333%; - } - .col-lg-offset-5 { - margin-left: 41.66666666666667%; - } - .col-lg-offset-6 { - margin-left: 50%; - } - .col-lg-offset-7 { - margin-left: 58.333333333333336%; - } - .col-lg-offset-8 { - margin-left: 66.66666666666666%; - } - .col-lg-offset-9 { - margin-left: 75%; - } - .col-lg-offset-10 { - margin-left: 83.33333333333334%; - } - .col-lg-offset-11 { - margin-left: 91.66666666666666%; - } -} - -table { - max-width: 100%; - background-color: transparent; -} - -th { - text-align: left; -} - -.table { - width: 100%; - margin-bottom: 20px; -} - -.table thead > tr > th, -.table tbody > tr > th, -.table tfoot > tr > th, -.table thead > tr > td, -.table tbody > tr > td, -.table tfoot > tr > td { - padding: 8px; - line-height: 1.428571429; - vertical-align: top; - border-top: 1px solid #dddddd; -} - -.table thead > tr > th { - vertical-align: bottom; - border-bottom: 2px solid #dddddd; -} - -.table caption + thead tr:first-child th, -.table colgroup + thead tr:first-child th, -.table thead:first-child tr:first-child th, -.table caption + thead tr:first-child td, -.table colgroup + thead tr:first-child td, -.table thead:first-child tr:first-child td { - border-top: 0; -} - -.table tbody + tbody { - border-top: 2px solid #dddddd; -} - -.table .table { - background-color: #ffffff; -} - -.table-condensed thead > tr > th, -.table-condensed tbody > tr > th, -.table-condensed tfoot > tr > th, -.table-condensed thead > tr > td, -.table-condensed tbody > tr > td, -.table-condensed tfoot > tr > td { - padding: 5px; -} - -.table-bordered { - border: 1px solid #dddddd; -} - -.table-bordered > thead > tr > th, -.table-bordered > tbody > tr > th, -.table-bordered > tfoot > tr > th, -.table-bordered > thead > tr > td, -.table-bordered > tbody > tr > td, -.table-bordered > tfoot > tr > td { - border: 1px solid #dddddd; -} - -.table-bordered > thead > tr > th, -.table-bordered > thead > tr > td { - border-bottom-width: 2px; -} - -.table-striped > tbody > tr:nth-child(odd) > td, -.table-striped > tbody > tr:nth-child(odd) > th { - background-color: #f9f9f9; -} - -.table-hover > tbody > tr:hover > td, -.table-hover > tbody > tr:hover > th { - background-color: #f5f5f5; -} - -table col[class*="col-"] { - display: table-column; - float: none; -} - -table td[class*="col-"], -table th[class*="col-"] { - display: table-cell; - float: none; -} - -.table > thead > tr > td.active, -.table > tbody > tr > td.active, -.table > tfoot > tr > td.active, -.table > thead > tr > th.active, -.table > tbody > tr > th.active, -.table > tfoot > tr > th.active, -.table > thead > tr.active > td, -.table > tbody > tr.active > td, -.table > tfoot > tr.active > td, -.table > thead > tr.active > th, -.table > tbody > tr.active > th, -.table > tfoot > tr.active > th { - background-color: #f5f5f5; -} - -.table > thead > tr > td.success, -.table > tbody > tr > td.success, -.table > tfoot > tr > td.success, -.table > thead > tr > th.success, -.table > tbody > tr > th.success, -.table > tfoot > tr > th.success, -.table > thead > tr.success > td, -.table > tbody > tr.success > td, -.table > tfoot > tr.success > td, -.table > thead > tr.success > th, -.table > tbody > tr.success > th, -.table > tfoot > tr.success > th { - background-color: #dff0d8; - border-color: #d6e9c6; -} - -.table-hover > tbody > tr > td.success:hover, -.table-hover > tbody > tr > th.success:hover, -.table-hover > tbody > tr.success:hover > td { - background-color: #d0e9c6; - border-color: #c9e2b3; -} - -.table > thead > tr > td.danger, -.table > tbody > tr > td.danger, -.table > tfoot > tr > td.danger, -.table > thead > tr > th.danger, -.table > tbody > tr > th.danger, -.table > tfoot > tr > th.danger, -.table > thead > tr.danger > td, -.table > tbody > tr.danger > td, -.table > tfoot > tr.danger > td, -.table > thead > tr.danger > th, -.table > tbody > tr.danger > th, -.table > tfoot > tr.danger > th { - background-color: #f2dede; - border-color: #eed3d7; -} - -.table-hover > tbody > tr > td.danger:hover, -.table-hover > tbody > tr > th.danger:hover, -.table-hover > tbody > tr.danger:hover > td { - background-color: #ebcccc; - border-color: #e6c1c7; -} - -.table > thead > tr > td.warning, -.table > tbody > tr > td.warning, -.table > tfoot > tr > td.warning, -.table > thead > tr > th.warning, -.table > tbody > tr > th.warning, -.table > tfoot > tr > th.warning, -.table > thead > tr.warning > td, -.table > tbody > tr.warning > td, -.table > tfoot > tr.warning > td, -.table > thead > tr.warning > th, -.table > tbody > tr.warning > th, -.table > tfoot > tr.warning > th { - background-color: #fcf8e3; - border-color: #fbeed5; -} - -.table-hover > tbody > tr > td.warning:hover, -.table-hover > tbody > tr > th.warning:hover, -.table-hover > tbody > tr.warning:hover > td { - background-color: #faf2cc; - border-color: #f8e5be; -} - -@media (max-width: 768px) { - .table-responsive { - width: 100%; - margin-bottom: 15px; - overflow-x: scroll; - overflow-y: hidden; - border: 1px solid #dddddd; - } - .table-responsive > .table { - margin-bottom: 0; - background-color: #fff; - } - .table-responsive > .table > thead > tr > th, - .table-responsive > .table > tbody > tr > th, - .table-responsive > .table > tfoot > tr > th, - .table-responsive > .table > thead > tr > td, - .table-responsive > .table > tbody > tr > td, - .table-responsive > .table > tfoot > tr > td { - white-space: nowrap; - } - .table-responsive > .table-bordered { - border: 0; - } - .table-responsive > .table-bordered > thead > tr > th:first-child, - .table-responsive > .table-bordered > tbody > tr > th:first-child, - .table-responsive > .table-bordered > tfoot > tr > th:first-child, - .table-responsive > .table-bordered > thead > tr > td:first-child, - .table-responsive > .table-bordered > tbody > tr > td:first-child, - .table-responsive > .table-bordered > tfoot > tr > td:first-child { - border-left: 0; - } - .table-responsive > .table-bordered > thead > tr > th:last-child, - .table-responsive > .table-bordered > tbody > tr > th:last-child, - .table-responsive > .table-bordered > tfoot > tr > th:last-child, - .table-responsive > .table-bordered > thead > tr > td:last-child, - .table-responsive > .table-bordered > tbody > tr > td:last-child, - .table-responsive > .table-bordered > tfoot > tr > td:last-child { - border-right: 0; - } - .table-responsive > .table-bordered > thead > tr:last-child > th, - .table-responsive > .table-bordered > tbody > tr:last-child > th, - .table-responsive > .table-bordered > tfoot > tr:last-child > th, - .table-responsive > .table-bordered > thead > tr:last-child > td, - .table-responsive > .table-bordered > tbody > tr:last-child > td, - .table-responsive > .table-bordered > tfoot > tr:last-child > td { - border-bottom: 0; - } -} - -fieldset { - padding: 0; - margin: 0; - border: 0; -} - -legend { - display: block; - width: 100%; - padding: 0; - margin-bottom: 20px; - font-size: 21px; - line-height: inherit; - color: #333333; - border: 0; - border-bottom: 1px solid #e5e5e5; -} - -label { - display: inline-block; - margin-bottom: 5px; - font-weight: bold; -} - -input[type="search"] { - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; -} - -input[type="radio"], -input[type="checkbox"] { - margin: 4px 0 0; - margin-top: 1px \9; - /* IE8-9 */ - - line-height: normal; -} - -input[type="file"] { - display: block; -} - -select[multiple], -select[size] { - height: auto; -} - -select optgroup { - font-family: inherit; - font-size: inherit; - font-style: inherit; -} - -input[type="file"]:focus, -input[type="radio"]:focus, -input[type="checkbox"]:focus { - outline: thin dotted #333; - outline: 5px auto -webkit-focus-ring-color; - outline-offset: -2px; -} - -input[type="number"]::-webkit-outer-spin-button, -input[type="number"]::-webkit-inner-spin-button { - height: auto; -} - -.form-control:-moz-placeholder { - color: #999999; -} - -.form-control::-moz-placeholder { - color: #999999; -} - -.form-control:-ms-input-placeholder { - color: #999999; -} - -.form-control::-webkit-input-placeholder { - color: #999999; -} - -.form-control { - display: block; - width: 100%; - height: 34px; - padding: 6px 12px; - font-size: 14px; - line-height: 1.428571429; - color: #555555; - vertical-align: middle; - background-color: #ffffff; - border: 1px solid #cccccc; - border-radius: 4px; - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); - box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); - -webkit-transition: border-color ease-in-out 0.15s, box-shadow ease-in-out 0.15s; - transition: border-color ease-in-out 0.15s, box-shadow ease-in-out 0.15s; -} - -.form-control:focus { - border-color: #66afe9; - outline: 0; - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(102, 175, 233, 0.6); - box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(102, 175, 233, 0.6); -} - -.form-control[disabled], -.form-control[readonly], -fieldset[disabled] .form-control { - cursor: not-allowed; - background-color: #eeeeee; -} - -textarea.form-control { - height: auto; -} - -.form-group { - margin-bottom: 15px; -} - -.radio, -.checkbox { - display: block; - min-height: 20px; - padding-left: 20px; - margin-top: 10px; - margin-bottom: 10px; - vertical-align: middle; -} - -.radio label, -.checkbox label { - display: inline; - margin-bottom: 0; - font-weight: normal; - cursor: pointer; -} - -.radio input[type="radio"], -.radio-inline input[type="radio"], -.checkbox input[type="checkbox"], -.checkbox-inline input[type="checkbox"] { - float: left; - margin-left: -20px; -} - -.radio + .radio, -.checkbox + .checkbox { - margin-top: -5px; -} - -.radio-inline, -.checkbox-inline { - display: inline-block; - padding-left: 20px; - margin-bottom: 0; - font-weight: normal; - vertical-align: middle; - cursor: pointer; -} - -.radio-inline + .radio-inline, -.checkbox-inline + .checkbox-inline { - margin-top: 0; - margin-left: 10px; -} - -input[type="radio"][disabled], -input[type="checkbox"][disabled], -.radio[disabled], -.radio-inline[disabled], -.checkbox[disabled], -.checkbox-inline[disabled], -fieldset[disabled] input[type="radio"], -fieldset[disabled] input[type="checkbox"], -fieldset[disabled] .radio, -fieldset[disabled] .radio-inline, -fieldset[disabled] .checkbox, -fieldset[disabled] .checkbox-inline { - cursor: not-allowed; -} - -.input-sm { - height: 30px; - padding: 5px 10px; - font-size: 12px; - line-height: 1.5; - border-radius: 3px; -} - -select.input-sm { - height: 30px; - line-height: 30px; -} - -textarea.input-sm { - height: auto; -} - -.input-lg { - height: 45px; - padding: 10px 16px; - font-size: 18px; - line-height: 1.33; - border-radius: 6px; -} - -select.input-lg { - height: 45px; - line-height: 45px; -} - -textarea.input-lg { - height: auto; -} - -.has-warning .help-block, -.has-warning .control-label { - color: #c09853; -} - -.has-warning .form-control { - border-color: #c09853; - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); - box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); -} - -.has-warning .form-control:focus { - border-color: #a47e3c; - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #dbc59e; - box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #dbc59e; -} - -.has-warning .input-group-addon { - color: #c09853; - background-color: #fcf8e3; - border-color: #c09853; -} - -.has-error .help-block, -.has-error .control-label { - color: #b94a48; -} - -.has-error .form-control { - border-color: #b94a48; - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); - box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); -} - -.has-error .form-control:focus { - border-color: #953b39; - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #d59392; - box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #d59392; -} - -.has-error .input-group-addon { - color: #b94a48; - background-color: #f2dede; - border-color: #b94a48; -} - -.has-success .help-block, -.has-success .control-label { - color: #468847; -} - -.has-success .form-control { - border-color: #468847; - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); - box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); -} - -.has-success .form-control:focus { - border-color: #356635; - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7aba7b; - box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7aba7b; -} - -.has-success .input-group-addon { - color: #468847; - background-color: #dff0d8; - border-color: #468847; -} - -.form-control-static { - padding-top: 7px; - margin-bottom: 0; -} - -.help-block { - display: block; - margin-top: 5px; - margin-bottom: 10px; - color: #737373; -} - -@media (min-width: 768px) { - .form-inline .form-group { - display: inline-block; - margin-bottom: 0; - vertical-align: middle; - } - .form-inline .form-control { - display: inline-block; - } - .form-inline .radio, - .form-inline .checkbox { - display: inline-block; - padding-left: 0; - margin-top: 0; - margin-bottom: 0; - } - .form-inline .radio input[type="radio"], - .form-inline .checkbox input[type="checkbox"] { - float: none; - margin-left: 0; - } -} - -.form-horizontal .control-label, -.form-horizontal .radio, -.form-horizontal .checkbox, -.form-horizontal .radio-inline, -.form-horizontal .checkbox-inline { - padding-top: 7px; - margin-top: 0; - margin-bottom: 0; -} - -.form-horizontal .form-group { - margin-right: -15px; - margin-left: -15px; -} - -.form-horizontal .form-group:before, -.form-horizontal .form-group:after { - display: table; - content: " "; -} - -.form-horizontal .form-group:after { - clear: both; -} - -.form-horizontal .form-group:before, -.form-horizontal .form-group:after { - display: table; - content: " "; -} - -.form-horizontal .form-group:after { - clear: both; -} - -@media (min-width: 768px) { - .form-horizontal .control-label { - text-align: right; - } -} - -.btn { - display: inline-block; - padding: 6px 12px; - margin-bottom: 0; - font-size: 14px; - font-weight: normal; - line-height: 1.428571429; - text-align: center; - white-space: nowrap; - vertical-align: middle; - cursor: pointer; - border: 1px solid transparent; - border-radius: 4px; - -webkit-user-select: none; - -moz-user-select: none; - -ms-user-select: none; - -o-user-select: none; - user-select: none; -} - -.btn:focus { - outline: thin dotted #333; - outline: 5px auto -webkit-focus-ring-color; - outline-offset: -2px; -} - -.btn:hover, -.btn:focus { - color: #333333; - text-decoration: none; -} - -.btn:active, -.btn.active { - background-image: none; - outline: 0; - -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); - box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); -} - -.btn.disabled, -.btn[disabled], -fieldset[disabled] .btn { - pointer-events: none; - cursor: not-allowed; - opacity: 0.65; - filter: alpha(opacity=65); - -webkit-box-shadow: none; - box-shadow: none; -} - -.btn-default { - color: #333333; - background-color: #ffffff; - border-color: #cccccc; -} - -.btn-default:hover, -.btn-default:focus, -.btn-default:active, -.btn-default.active, -.open .dropdown-toggle.btn-default { - color: #333333; - background-color: #ebebeb; - border-color: #adadad; -} - -.btn-default:active, -.btn-default.active, -.open .dropdown-toggle.btn-default { - background-image: none; -} - -.btn-default.disabled, -.btn-default[disabled], -fieldset[disabled] .btn-default, -.btn-default.disabled:hover, -.btn-default[disabled]:hover, -fieldset[disabled] .btn-default:hover, -.btn-default.disabled:focus, -.btn-default[disabled]:focus, -fieldset[disabled] .btn-default:focus, -.btn-default.disabled:active, -.btn-default[disabled]:active, -fieldset[disabled] .btn-default:active, -.btn-default.disabled.active, -.btn-default[disabled].active, -fieldset[disabled] .btn-default.active { - background-color: #ffffff; - border-color: #cccccc; -} - -.btn-primary { - color: #ffffff; - background-color: #428bca; - border-color: #357ebd; -} - -.btn-primary:hover, -.btn-primary:focus, -.btn-primary:active, -.btn-primary.active, -.open .dropdown-toggle.btn-primary { - color: #ffffff; - background-color: #3276b1; - border-color: #285e8e; -} - -.btn-primary:active, -.btn-primary.active, -.open .dropdown-toggle.btn-primary { - background-image: none; -} - -.btn-primary.disabled, -.btn-primary[disabled], -fieldset[disabled] .btn-primary, -.btn-primary.disabled:hover, -.btn-primary[disabled]:hover, -fieldset[disabled] .btn-primary:hover, -.btn-primary.disabled:focus, -.btn-primary[disabled]:focus, -fieldset[disabled] .btn-primary:focus, -.btn-primary.disabled:active, -.btn-primary[disabled]:active, -fieldset[disabled] .btn-primary:active, -.btn-primary.disabled.active, -.btn-primary[disabled].active, -fieldset[disabled] .btn-primary.active { - background-color: #428bca; - border-color: #357ebd; -} - -.btn-warning { - color: #ffffff; - background-color: #f0ad4e; - border-color: #eea236; -} - -.btn-warning:hover, -.btn-warning:focus, -.btn-warning:active, -.btn-warning.active, -.open .dropdown-toggle.btn-warning { - color: #ffffff; - background-color: #ed9c28; - border-color: #d58512; -} - -.btn-warning:active, -.btn-warning.active, -.open .dropdown-toggle.btn-warning { - background-image: none; -} - -.btn-warning.disabled, -.btn-warning[disabled], -fieldset[disabled] .btn-warning, -.btn-warning.disabled:hover, -.btn-warning[disabled]:hover, -fieldset[disabled] .btn-warning:hover, -.btn-warning.disabled:focus, -.btn-warning[disabled]:focus, -fieldset[disabled] .btn-warning:focus, -.btn-warning.disabled:active, -.btn-warning[disabled]:active, -fieldset[disabled] .btn-warning:active, -.btn-warning.disabled.active, -.btn-warning[disabled].active, -fieldset[disabled] .btn-warning.active { - background-color: #f0ad4e; - border-color: #eea236; -} - -.btn-danger { - color: #ffffff; - background-color: #d9534f; - border-color: #d43f3a; -} - -.btn-danger:hover, -.btn-danger:focus, -.btn-danger:active, -.btn-danger.active, -.open .dropdown-toggle.btn-danger { - color: #ffffff; - background-color: #d2322d; - border-color: #ac2925; -} - -.btn-danger:active, -.btn-danger.active, -.open .dropdown-toggle.btn-danger { - background-image: none; -} - -.btn-danger.disabled, -.btn-danger[disabled], -fieldset[disabled] .btn-danger, -.btn-danger.disabled:hover, -.btn-danger[disabled]:hover, -fieldset[disabled] .btn-danger:hover, -.btn-danger.disabled:focus, -.btn-danger[disabled]:focus, -fieldset[disabled] .btn-danger:focus, -.btn-danger.disabled:active, -.btn-danger[disabled]:active, -fieldset[disabled] .btn-danger:active, -.btn-danger.disabled.active, -.btn-danger[disabled].active, -fieldset[disabled] .btn-danger.active { - background-color: #d9534f; - border-color: #d43f3a; -} - -.btn-success { - color: #ffffff; - background-color: #5cb85c; - border-color: #4cae4c; -} - -.btn-success:hover, -.btn-success:focus, -.btn-success:active, -.btn-success.active, -.open .dropdown-toggle.btn-success { - color: #ffffff; - background-color: #47a447; - border-color: #398439; -} - -.btn-success:active, -.btn-success.active, -.open .dropdown-toggle.btn-success { - background-image: none; -} - -.btn-success.disabled, -.btn-success[disabled], -fieldset[disabled] .btn-success, -.btn-success.disabled:hover, -.btn-success[disabled]:hover, -fieldset[disabled] .btn-success:hover, -.btn-success.disabled:focus, -.btn-success[disabled]:focus, -fieldset[disabled] .btn-success:focus, -.btn-success.disabled:active, -.btn-success[disabled]:active, -fieldset[disabled] .btn-success:active, -.btn-success.disabled.active, -.btn-success[disabled].active, -fieldset[disabled] .btn-success.active { - background-color: #5cb85c; - border-color: #4cae4c; -} - -.btn-info { - color: #ffffff; - background-color: #5bc0de; - border-color: #46b8da; -} - -.btn-info:hover, -.btn-info:focus, -.btn-info:active, -.btn-info.active, -.open .dropdown-toggle.btn-info { - color: #ffffff; - background-color: #39b3d7; - border-color: #269abc; -} - -.btn-info:active, -.btn-info.active, -.open .dropdown-toggle.btn-info { - background-image: none; -} - -.btn-info.disabled, -.btn-info[disabled], -fieldset[disabled] .btn-info, -.btn-info.disabled:hover, -.btn-info[disabled]:hover, -fieldset[disabled] .btn-info:hover, -.btn-info.disabled:focus, -.btn-info[disabled]:focus, -fieldset[disabled] .btn-info:focus, -.btn-info.disabled:active, -.btn-info[disabled]:active, -fieldset[disabled] .btn-info:active, -.btn-info.disabled.active, -.btn-info[disabled].active, -fieldset[disabled] .btn-info.active { - background-color: #5bc0de; - border-color: #46b8da; -} - -.btn-link { - font-weight: normal; - color: #428bca; - cursor: pointer; - border-radius: 0; -} - -.btn-link, -.btn-link:active, -.btn-link[disabled], -fieldset[disabled] .btn-link { - background-color: transparent; - -webkit-box-shadow: none; - box-shadow: none; -} - -.btn-link, -.btn-link:hover, -.btn-link:focus, -.btn-link:active { - border-color: transparent; -} - -.btn-link:hover, -.btn-link:focus { - color: #2a6496; - text-decoration: underline; - background-color: transparent; -} - -.btn-link[disabled]:hover, -fieldset[disabled] .btn-link:hover, -.btn-link[disabled]:focus, -fieldset[disabled] .btn-link:focus { - color: #999999; - text-decoration: none; -} - -.btn-lg { - padding: 10px 16px; - font-size: 18px; - line-height: 1.33; - border-radius: 6px; -} - -.btn-sm, -.btn-xs { - padding: 5px 10px; - font-size: 12px; - line-height: 1.5; - border-radius: 3px; -} - -.btn-xs { - padding: 1px 5px; -} - -.btn-block { - display: block; - width: 100%; - padding-right: 0; - padding-left: 0; -} - -.btn-block + .btn-block { - margin-top: 5px; -} - -input[type="submit"].btn-block, -input[type="reset"].btn-block, -input[type="button"].btn-block { - width: 100%; -} - -.fade { - opacity: 0; - -webkit-transition: opacity 0.15s linear; - transition: opacity 0.15s linear; -} - -.fade.in { - opacity: 1; -} - -.collapse { - display: none; -} - -.collapse.in { - display: block; -} - -.collapsing { - position: relative; - height: 0; - overflow: hidden; - -webkit-transition: height 0.35s ease; - transition: height 0.35s ease; -} - -@font-face { - font-family: 'Glyphicons Halflings'; - src: url('../fonts/glyphicons-halflings-regular.eot'); - src: url('../fonts/glyphicons-halflings-regular.eot?#iefix') format('embedded-opentype'), url('../fonts/glyphicons-halflings-regular.woff') format('woff'), url('../fonts/glyphicons-halflings-regular.ttf') format('truetype'), url('../fonts/glyphicons-halflings-regular.svg#glyphicons-halflingsregular') format('svg'); -} - -.glyphicon { - position: relative; - top: 1px; - display: inline-block; - font-family: 'Glyphicons Halflings'; - -webkit-font-smoothing: antialiased; - font-style: normal; - font-weight: normal; - line-height: 1; -} - -.glyphicon-asterisk:before { - content: "\2a"; -} - -.glyphicon-plus:before { - content: "\2b"; -} - -.glyphicon-euro:before { - content: "\20ac"; -} - -.glyphicon-minus:before { - content: "\2212"; -} - -.glyphicon-cloud:before { - content: "\2601"; -} - -.glyphicon-envelope:before { - content: "\2709"; -} - -.glyphicon-pencil:before { - content: "\270f"; -} - -.glyphicon-glass:before { - content: "\e001"; -} - -.glyphicon-music:before { - content: "\e002"; -} - -.glyphicon-search:before { - content: "\e003"; -} - -.glyphicon-heart:before { - content: "\e005"; -} - -.glyphicon-star:before { - content: "\e006"; -} - -.glyphicon-star-empty:before { - content: "\e007"; -} - -.glyphicon-user:before { - content: "\e008"; -} - -.glyphicon-film:before { - content: "\e009"; -} - -.glyphicon-th-large:before { - content: "\e010"; -} - -.glyphicon-th:before { - content: "\e011"; -} - -.glyphicon-th-list:before { - content: "\e012"; -} - -.glyphicon-ok:before { - content: "\e013"; -} - -.glyphicon-remove:before { - content: "\e014"; -} - -.glyphicon-zoom-in:before { - content: "\e015"; -} - -.glyphicon-zoom-out:before { - content: "\e016"; -} - -.glyphicon-off:before { - content: "\e017"; -} - -.glyphicon-signal:before { - content: "\e018"; -} - -.glyphicon-cog:before { - content: "\e019"; -} - -.glyphicon-trash:before { - content: "\e020"; -} - -.glyphicon-home:before { - content: "\e021"; -} - -.glyphicon-file:before { - content: "\e022"; -} - -.glyphicon-time:before { - content: "\e023"; -} - -.glyphicon-road:before { - content: "\e024"; -} - -.glyphicon-download-alt:before { - content: "\e025"; -} - -.glyphicon-download:before { - content: "\e026"; -} - -.glyphicon-upload:before { - content: "\e027"; -} - -.glyphicon-inbox:before { - content: "\e028"; -} - -.glyphicon-play-circle:before { - content: "\e029"; -} - -.glyphicon-repeat:before { - content: "\e030"; -} - -.glyphicon-refresh:before { - content: "\e031"; -} - -.glyphicon-list-alt:before { - content: "\e032"; -} - -.glyphicon-flag:before { - content: "\e034"; -} - -.glyphicon-headphones:before { - content: "\e035"; -} - -.glyphicon-volume-off:before { - content: "\e036"; -} - -.glyphicon-volume-down:before { - content: "\e037"; -} - -.glyphicon-volume-up:before { - content: "\e038"; -} - -.glyphicon-qrcode:before { - content: "\e039"; -} - -.glyphicon-barcode:before { - content: "\e040"; -} - -.glyphicon-tag:before { - content: "\e041"; -} - -.glyphicon-tags:before { - content: "\e042"; -} - -.glyphicon-book:before { - content: "\e043"; -} - -.glyphicon-print:before { - content: "\e045"; -} - -.glyphicon-font:before { - content: "\e047"; -} - -.glyphicon-bold:before { - content: "\e048"; -} - -.glyphicon-italic:before { - content: "\e049"; -} - -.glyphicon-text-height:before { - content: "\e050"; -} - -.glyphicon-text-width:before { - content: "\e051"; -} - -.glyphicon-align-left:before { - content: "\e052"; -} - -.glyphicon-align-center:before { - content: "\e053"; -} - -.glyphicon-align-right:before { - content: "\e054"; -} - -.glyphicon-align-justify:before { - content: "\e055"; -} - -.glyphicon-list:before { - content: "\e056"; -} - -.glyphicon-indent-left:before { - content: "\e057"; -} - -.glyphicon-indent-right:before { - content: "\e058"; -} - -.glyphicon-facetime-video:before { - content: "\e059"; -} - -.glyphicon-picture:before { - content: "\e060"; -} - -.glyphicon-map-marker:before { - content: "\e062"; -} - -.glyphicon-adjust:before { - content: "\e063"; -} - -.glyphicon-tint:before { - content: "\e064"; -} - -.glyphicon-edit:before { - content: "\e065"; -} - -.glyphicon-share:before { - content: "\e066"; -} - -.glyphicon-check:before { - content: "\e067"; -} - -.glyphicon-move:before { - content: "\e068"; -} - -.glyphicon-step-backward:before { - content: "\e069"; -} - -.glyphicon-fast-backward:before { - content: "\e070"; -} - -.glyphicon-backward:before { - content: "\e071"; -} - -.glyphicon-play:before { - content: "\e072"; -} - -.glyphicon-pause:before { - content: "\e073"; -} - -.glyphicon-stop:before { - content: "\e074"; -} - -.glyphicon-forward:before { - content: "\e075"; -} - -.glyphicon-fast-forward:before { - content: "\e076"; -} - -.glyphicon-step-forward:before { - content: "\e077"; -} - -.glyphicon-eject:before { - content: "\e078"; -} - -.glyphicon-chevron-left:before { - content: "\e079"; -} - -.glyphicon-chevron-right:before { - content: "\e080"; -} - -.glyphicon-plus-sign:before { - content: "\e081"; -} - -.glyphicon-minus-sign:before { - content: "\e082"; -} - -.glyphicon-remove-sign:before { - content: "\e083"; -} - -.glyphicon-ok-sign:before { - content: "\e084"; -} - -.glyphicon-question-sign:before { - content: "\e085"; -} - -.glyphicon-info-sign:before { - content: "\e086"; -} - -.glyphicon-screenshot:before { - content: "\e087"; -} - -.glyphicon-remove-circle:before { - content: "\e088"; -} - -.glyphicon-ok-circle:before { - content: "\e089"; -} - -.glyphicon-ban-circle:before { - content: "\e090"; -} - -.glyphicon-arrow-left:before { - content: "\e091"; -} - -.glyphicon-arrow-right:before { - content: "\e092"; -} - -.glyphicon-arrow-up:before { - content: "\e093"; -} - -.glyphicon-arrow-down:before { - content: "\e094"; -} - -.glyphicon-share-alt:before { - content: "\e095"; -} - -.glyphicon-resize-full:before { - content: "\e096"; -} - -.glyphicon-resize-small:before { - content: "\e097"; -} - -.glyphicon-exclamation-sign:before { - content: "\e101"; -} - -.glyphicon-gift:before { - content: "\e102"; -} - -.glyphicon-leaf:before { - content: "\e103"; -} - -.glyphicon-eye-open:before { - content: "\e105"; -} - -.glyphicon-eye-close:before { - content: "\e106"; -} - -.glyphicon-warning-sign:before { - content: "\e107"; -} - -.glyphicon-plane:before { - content: "\e108"; -} - -.glyphicon-random:before { - content: "\e110"; -} - -.glyphicon-comment:before { - content: "\e111"; -} - -.glyphicon-magnet:before { - content: "\e112"; -} - -.glyphicon-chevron-up:before { - content: "\e113"; -} - -.glyphicon-chevron-down:before { - content: "\e114"; -} - -.glyphicon-retweet:before { - content: "\e115"; -} - -.glyphicon-shopping-cart:before { - content: "\e116"; -} - -.glyphicon-folder-close:before { - content: "\e117"; -} - -.glyphicon-folder-open:before { - content: "\e118"; -} - -.glyphicon-resize-vertical:before { - content: "\e119"; -} - -.glyphicon-resize-horizontal:before { - content: "\e120"; -} - -.glyphicon-hdd:before { - content: "\e121"; -} - -.glyphicon-bullhorn:before { - content: "\e122"; -} - -.glyphicon-certificate:before { - content: "\e124"; -} - -.glyphicon-thumbs-up:before { - content: "\e125"; -} - -.glyphicon-thumbs-down:before { - content: "\e126"; -} - -.glyphicon-hand-right:before { - content: "\e127"; -} - -.glyphicon-hand-left:before { - content: "\e128"; -} - -.glyphicon-hand-up:before { - content: "\e129"; -} - -.glyphicon-hand-down:before { - content: "\e130"; -} - -.glyphicon-circle-arrow-right:before { - content: "\e131"; -} - -.glyphicon-circle-arrow-left:before { - content: "\e132"; -} - -.glyphicon-circle-arrow-up:before { - content: "\e133"; -} - -.glyphicon-circle-arrow-down:before { - content: "\e134"; -} - -.glyphicon-globe:before { - content: "\e135"; -} - -.glyphicon-tasks:before { - content: "\e137"; -} - -.glyphicon-filter:before { - content: "\e138"; -} - -.glyphicon-fullscreen:before { - content: "\e140"; -} - -.glyphicon-dashboard:before { - content: "\e141"; -} - -.glyphicon-heart-empty:before { - content: "\e143"; -} - -.glyphicon-link:before { - content: "\e144"; -} - -.glyphicon-phone:before { - content: "\e145"; -} - -.glyphicon-usd:before { - content: "\e148"; -} - -.glyphicon-gbp:before { - content: "\e149"; -} - -.glyphicon-sort:before { - content: "\e150"; -} - -.glyphicon-sort-by-alphabet:before { - content: "\e151"; -} - -.glyphicon-sort-by-alphabet-alt:before { - content: "\e152"; -} - -.glyphicon-sort-by-order:before { - content: "\e153"; -} - -.glyphicon-sort-by-order-alt:before { - content: "\e154"; -} - -.glyphicon-sort-by-attributes:before { - content: "\e155"; -} - -.glyphicon-sort-by-attributes-alt:before { - content: "\e156"; -} - -.glyphicon-unchecked:before { - content: "\e157"; -} - -.glyphicon-expand:before { - content: "\e158"; -} - -.glyphicon-collapse-down:before { - content: "\e159"; -} - -.glyphicon-collapse-up:before { - content: "\e160"; -} - -.glyphicon-log-in:before { - content: "\e161"; -} - -.glyphicon-flash:before { - content: "\e162"; -} - -.glyphicon-log-out:before { - content: "\e163"; -} - -.glyphicon-new-window:before { - content: "\e164"; -} - -.glyphicon-record:before { - content: "\e165"; -} - -.glyphicon-save:before { - content: "\e166"; -} - -.glyphicon-open:before { - content: "\e167"; -} - -.glyphicon-saved:before { - content: "\e168"; -} - -.glyphicon-import:before { - content: "\e169"; -} - -.glyphicon-export:before { - content: "\e170"; -} - -.glyphicon-send:before { - content: "\e171"; -} - -.glyphicon-floppy-disk:before { - content: "\e172"; -} - -.glyphicon-floppy-saved:before { - content: "\e173"; -} - -.glyphicon-floppy-remove:before { - content: "\e174"; -} - -.glyphicon-floppy-save:before { - content: "\e175"; -} - -.glyphicon-floppy-open:before { - content: "\e176"; -} - -.glyphicon-credit-card:before { - content: "\e177"; -} - -.glyphicon-transfer:before { - content: "\e178"; -} - -.glyphicon-cutlery:before { - content: "\e179"; -} - -.glyphicon-header:before { - content: "\e180"; -} - -.glyphicon-compressed:before { - content: "\e181"; -} - -.glyphicon-earphone:before { - content: "\e182"; -} - -.glyphicon-phone-alt:before { - content: "\e183"; -} - -.glyphicon-tower:before { - content: "\e184"; -} - -.glyphicon-stats:before { - content: "\e185"; -} - -.glyphicon-sd-video:before { - content: "\e186"; -} - -.glyphicon-hd-video:before { - content: "\e187"; -} - -.glyphicon-subtitles:before { - content: "\e188"; -} - -.glyphicon-sound-stereo:before { - content: "\e189"; -} - -.glyphicon-sound-dolby:before { - content: "\e190"; -} - -.glyphicon-sound-5-1:before { - content: "\e191"; -} - -.glyphicon-sound-6-1:before { - content: "\e192"; -} - -.glyphicon-sound-7-1:before { - content: "\e193"; -} - -.glyphicon-copyright-mark:before { - content: "\e194"; -} - -.glyphicon-registration-mark:before { - content: "\e195"; -} - -.glyphicon-cloud-download:before { - content: "\e197"; -} - -.glyphicon-cloud-upload:before { - content: "\e198"; -} - -.glyphicon-tree-conifer:before { - content: "\e199"; -} - -.glyphicon-tree-deciduous:before { - content: "\e200"; -} - -.glyphicon-briefcase:before { - content: "\1f4bc"; -} - -.glyphicon-calendar:before { - content: "\1f4c5"; -} - -.glyphicon-pushpin:before { - content: "\1f4cc"; -} - -.glyphicon-paperclip:before { - content: "\1f4ce"; -} - -.glyphicon-camera:before { - content: "\1f4f7"; -} - -.glyphicon-lock:before { - content: "\1f512"; -} - -.glyphicon-bell:before { - content: "\1f514"; -} - -.glyphicon-bookmark:before { - content: "\1f516"; -} - -.glyphicon-fire:before { - content: "\1f525"; -} - -.glyphicon-wrench:before { - content: "\1f527"; -} - -.caret { - display: inline-block; - width: 0; - height: 0; - margin-left: 2px; - vertical-align: middle; - border-top: 4px solid #000000; - border-right: 4px solid transparent; - border-bottom: 0 dotted; - border-left: 4px solid transparent; - content: ""; -} - -.dropdown { - position: relative; -} - -.dropdown-toggle:focus { - outline: 0; -} - -.dropdown-menu { - position: absolute; - top: 100%; - left: 0; - z-index: 1000; - display: none; - float: left; - min-width: 160px; - padding: 5px 0; - margin: 2px 0 0; - font-size: 14px; - list-style: none; - background-color: #ffffff; - border: 1px solid #cccccc; - border: 1px solid rgba(0, 0, 0, 0.15); - border-radius: 4px; - -webkit-box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175); - box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175); - background-clip: padding-box; -} - -.dropdown-menu.pull-right { - right: 0; - left: auto; -} - -.dropdown-menu .divider { - height: 1px; - margin: 9px 0; - overflow: hidden; - background-color: #e5e5e5; -} - -.dropdown-menu > li > a { - display: block; - padding: 3px 20px; - clear: both; - font-weight: normal; - line-height: 1.428571429; - color: #333333; - white-space: nowrap; -} - -.dropdown-menu > li > a:hover, -.dropdown-menu > li > a:focus { - color: #ffffff; - text-decoration: none; - background-color: #428bca; -} - -.dropdown-menu > .active > a, -.dropdown-menu > .active > a:hover, -.dropdown-menu > .active > a:focus { - color: #ffffff; - text-decoration: none; - background-color: #428bca; - outline: 0; -} - -.dropdown-menu > .disabled > a, -.dropdown-menu > .disabled > a:hover, -.dropdown-menu > .disabled > a:focus { - color: #999999; -} - -.dropdown-menu > .disabled > a:hover, -.dropdown-menu > .disabled > a:focus { - text-decoration: none; - cursor: not-allowed; - background-color: transparent; - background-image: none; - filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); -} - -.open > .dropdown-menu { - display: block; -} - -.open > a { - outline: 0; -} - -.dropdown-header { - display: block; - padding: 3px 20px; - font-size: 12px; - line-height: 1.428571429; - color: #999999; -} - -.dropdown-backdrop { - position: fixed; - top: 0; - right: 0; - bottom: 0; - left: 0; - z-index: 990; -} - -.pull-right > .dropdown-menu { - right: 0; - left: auto; -} - -.dropup .caret, -.navbar-fixed-bottom .dropdown .caret { - border-top: 0 dotted; - border-bottom: 4px solid #000000; - content: ""; -} - -.dropup .dropdown-menu, -.navbar-fixed-bottom .dropdown .dropdown-menu { - top: auto; - bottom: 100%; - margin-bottom: 1px; -} - -@media (min-width: 768px) { - .navbar-right .dropdown-menu { - right: 0; - left: auto; - } -} - -.btn-default .caret { - border-top-color: #333333; -} - -.btn-primary .caret, -.btn-success .caret, -.btn-warning .caret, -.btn-danger .caret, -.btn-info .caret { - border-top-color: #fff; -} - -.dropup .btn-default .caret { - border-bottom-color: #333333; -} - -.dropup .btn-primary .caret, -.dropup .btn-success .caret, -.dropup .btn-warning .caret, -.dropup .btn-danger .caret, -.dropup .btn-info .caret { - border-bottom-color: #fff; -} - -.btn-group, -.btn-group-vertical { - position: relative; - display: inline-block; - vertical-align: middle; -} - -.btn-group > .btn, -.btn-group-vertical > .btn { - position: relative; - float: left; -} - -.btn-group > .btn:hover, -.btn-group-vertical > .btn:hover, -.btn-group > .btn:focus, -.btn-group-vertical > .btn:focus, -.btn-group > .btn:active, -.btn-group-vertical > .btn:active, -.btn-group > .btn.active, -.btn-group-vertical > .btn.active { - z-index: 2; -} - -.btn-group > .btn:focus, -.btn-group-vertical > .btn:focus { - outline: none; -} - -.btn-group .btn + .btn, -.btn-group .btn + .btn-group, -.btn-group .btn-group + .btn, -.btn-group .btn-group + .btn-group { - margin-left: -1px; -} - -.btn-toolbar:before, -.btn-toolbar:after { - display: table; - content: " "; -} - -.btn-toolbar:after { - clear: both; -} - -.btn-toolbar:before, -.btn-toolbar:after { - display: table; - content: " "; -} - -.btn-toolbar:after { - clear: both; -} - -.btn-toolbar .btn-group { - float: left; -} - -.btn-toolbar > .btn + .btn, -.btn-toolbar > .btn-group + .btn, -.btn-toolbar > .btn + .btn-group, -.btn-toolbar > .btn-group + .btn-group { - margin-left: 5px; -} - -.btn-group > .btn:not(:first-child):not(:last-child):not(.dropdown-toggle) { - border-radius: 0; -} - -.btn-group > .btn:first-child { - margin-left: 0; -} - -.btn-group > .btn:first-child:not(:last-child):not(.dropdown-toggle) { - border-top-right-radius: 0; - border-bottom-right-radius: 0; -} - -.btn-group > .btn:last-child:not(:first-child), -.btn-group > .dropdown-toggle:not(:first-child) { - border-bottom-left-radius: 0; - border-top-left-radius: 0; -} - -.btn-group > .btn-group { - float: left; -} - -.btn-group > .btn-group:not(:first-child):not(:last-child) > .btn { - border-radius: 0; -} - -.btn-group > .btn-group:first-child > .btn:last-child, -.btn-group > .btn-group:first-child > .dropdown-toggle { - border-top-right-radius: 0; - border-bottom-right-radius: 0; -} - -.btn-group > .btn-group:last-child > .btn:first-child { - border-bottom-left-radius: 0; - border-top-left-radius: 0; -} - -.btn-group .dropdown-toggle:active, -.btn-group.open .dropdown-toggle { - outline: 0; -} - -.btn-group-xs > .btn { - padding: 5px 10px; - padding: 1px 5px; - font-size: 12px; - line-height: 1.5; - border-radius: 3px; -} - -.btn-group-sm > .btn { - padding: 5px 10px; - font-size: 12px; - line-height: 1.5; - border-radius: 3px; -} - -.btn-group-lg > .btn { - padding: 10px 16px; - font-size: 18px; - line-height: 1.33; - border-radius: 6px; -} - -.btn-group > .btn + .dropdown-toggle { - padding-right: 8px; - padding-left: 8px; -} - -.btn-group > .btn-lg + .dropdown-toggle { - padding-right: 12px; - padding-left: 12px; -} - -.btn-group.open .dropdown-toggle { - -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); - box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); -} - -.btn .caret { - margin-left: 0; -} - -.btn-lg .caret { - border-width: 5px 5px 0; - border-bottom-width: 0; -} - -.dropup .btn-lg .caret { - border-width: 0 5px 5px; -} - -.btn-group-vertical > .btn, -.btn-group-vertical > .btn-group { - display: block; - float: none; - width: 100%; - max-width: 100%; -} - -.btn-group-vertical > .btn-group:before, -.btn-group-vertical > .btn-group:after { - display: table; - content: " "; -} - -.btn-group-vertical > .btn-group:after { - clear: both; -} - -.btn-group-vertical > .btn-group:before, -.btn-group-vertical > .btn-group:after { - display: table; - content: " "; -} - -.btn-group-vertical > .btn-group:after { - clear: both; -} - -.btn-group-vertical > .btn-group > .btn { - float: none; -} - -.btn-group-vertical > .btn + .btn, -.btn-group-vertical > .btn + .btn-group, -.btn-group-vertical > .btn-group + .btn, -.btn-group-vertical > .btn-group + .btn-group { - margin-top: -1px; - margin-left: 0; -} - -.btn-group-vertical > .btn:not(:first-child):not(:last-child) { - border-radius: 0; -} - -.btn-group-vertical > .btn:first-child:not(:last-child) { - border-top-right-radius: 4px; - border-bottom-right-radius: 0; - border-bottom-left-radius: 0; -} - -.btn-group-vertical > .btn:last-child:not(:first-child) { - border-top-right-radius: 0; - border-bottom-left-radius: 4px; - border-top-left-radius: 0; -} - -.btn-group-vertical > .btn-group:not(:first-child):not(:last-child) > .btn { - border-radius: 0; -} - -.btn-group-vertical > .btn-group:first-child > .btn:last-child, -.btn-group-vertical > .btn-group:first-child > .dropdown-toggle { - border-bottom-right-radius: 0; - border-bottom-left-radius: 0; -} - -.btn-group-vertical > .btn-group:last-child > .btn:first-child { - border-top-right-radius: 0; - border-top-left-radius: 0; -} - -.btn-group-justified { - display: table; - width: 100%; - border-collapse: separate; - table-layout: fixed; -} - -.btn-group-justified .btn { - display: table-cell; - float: none; - width: 1%; -} - -[data-toggle="buttons"] > .btn > input[type="radio"], -[data-toggle="buttons"] > .btn > input[type="checkbox"] { - display: none; -} - -.input-group { - position: relative; - display: table; - border-collapse: separate; -} - -.input-group.col { - float: none; - padding-right: 0; - padding-left: 0; -} - -.input-group .form-control { - width: 100%; - margin-bottom: 0; -} - -.input-group-lg > .form-control, -.input-group-lg > .input-group-addon, -.input-group-lg > .input-group-btn > .btn { - height: 45px; - padding: 10px 16px; - font-size: 18px; - line-height: 1.33; - border-radius: 6px; -} - -select.input-group-lg > .form-control, -select.input-group-lg > .input-group-addon, -select.input-group-lg > .input-group-btn > .btn { - height: 45px; - line-height: 45px; -} - -textarea.input-group-lg > .form-control, -textarea.input-group-lg > .input-group-addon, -textarea.input-group-lg > .input-group-btn > .btn { - height: auto; -} - -.input-group-sm > .form-control, -.input-group-sm > .input-group-addon, -.input-group-sm > .input-group-btn > .btn { - height: 30px; - padding: 5px 10px; - font-size: 12px; - line-height: 1.5; - border-radius: 3px; -} - -select.input-group-sm > .form-control, -select.input-group-sm > .input-group-addon, -select.input-group-sm > .input-group-btn > .btn { - height: 30px; - line-height: 30px; -} - -textarea.input-group-sm > .form-control, -textarea.input-group-sm > .input-group-addon, -textarea.input-group-sm > .input-group-btn > .btn { - height: auto; -} - -.input-group-addon, -.input-group-btn, -.input-group .form-control { - display: table-cell; -} - -.input-group-addon:not(:first-child):not(:last-child), -.input-group-btn:not(:first-child):not(:last-child), -.input-group .form-control:not(:first-child):not(:last-child) { - border-radius: 0; -} - -.input-group-addon, -.input-group-btn { - width: 1%; - white-space: nowrap; - vertical-align: middle; -} - -.input-group-addon { - padding: 6px 12px; - font-size: 14px; - font-weight: normal; - line-height: 1; - text-align: center; - background-color: #eeeeee; - border: 1px solid #cccccc; - border-radius: 4px; -} - -.input-group-addon.input-sm { - padding: 5px 10px; - font-size: 12px; - border-radius: 3px; -} - -.input-group-addon.input-lg { - padding: 10px 16px; - font-size: 18px; - border-radius: 6px; -} - -.input-group-addon input[type="radio"], -.input-group-addon input[type="checkbox"] { - margin-top: 0; -} - -.input-group .form-control:first-child, -.input-group-addon:first-child, -.input-group-btn:first-child > .btn, -.input-group-btn:first-child > .dropdown-toggle, -.input-group-btn:last-child > .btn:not(:last-child):not(.dropdown-toggle) { - border-top-right-radius: 0; - border-bottom-right-radius: 0; -} - -.input-group-addon:first-child { - border-right: 0; -} - -.input-group .form-control:last-child, -.input-group-addon:last-child, -.input-group-btn:last-child > .btn, -.input-group-btn:last-child > .dropdown-toggle, -.input-group-btn:first-child > .btn:not(:first-child) { - border-bottom-left-radius: 0; - border-top-left-radius: 0; -} - -.input-group-addon:last-child { - border-left: 0; -} - -.input-group-btn { - position: relative; - white-space: nowrap; -} - -.input-group-btn > .btn { - position: relative; -} - -.input-group-btn > .btn + .btn { - margin-left: -4px; -} - -.input-group-btn > .btn:hover, -.input-group-btn > .btn:active { - z-index: 2; -} - -.nav { - padding-left: 0; - margin-bottom: 0; - list-style: none; -} - -.nav:before, -.nav:after { - display: table; - content: " "; -} - -.nav:after { - clear: both; -} - -.nav:before, -.nav:after { - display: table; - content: " "; -} - -.nav:after { - clear: both; -} - -.nav > li { - position: relative; - display: block; -} - -.nav > li > a { - position: relative; - display: block; - padding: 10px 15px; -} - -.nav > li > a:hover, -.nav > li > a:focus { - text-decoration: none; - background-color: #eeeeee; -} - -.nav > li.disabled > a { - color: #999999; -} - -.nav > li.disabled > a:hover, -.nav > li.disabled > a:focus { - color: #999999; - text-decoration: none; - cursor: not-allowed; - background-color: transparent; -} - -.nav .open > a, -.nav .open > a:hover, -.nav .open > a:focus { - background-color: #eeeeee; - border-color: #428bca; -} - -.nav .nav-divider { - height: 1px; - margin: 9px 0; - overflow: hidden; - background-color: #e5e5e5; -} - -.nav > li > a > img { - max-width: none; -} - -.nav-tabs { - border-bottom: 1px solid #dddddd; -} - -.nav-tabs > li { - float: left; - margin-bottom: -1px; -} - -.nav-tabs > li > a { - margin-right: 2px; - line-height: 1.428571429; - border: 1px solid transparent; - border-radius: 4px 4px 0 0; -} - -.nav-tabs > li > a:hover { - border-color: #eeeeee #eeeeee #dddddd; -} - -.nav-tabs > li.active > a, -.nav-tabs > li.active > a:hover, -.nav-tabs > li.active > a:focus { - color: #555555; - cursor: default; - background-color: #ffffff; - border: 1px solid #dddddd; - border-bottom-color: transparent; -} - -.nav-tabs.nav-justified { - width: 100%; - border-bottom: 0; -} - -.nav-tabs.nav-justified > li { - float: none; -} - -.nav-tabs.nav-justified > li > a { - text-align: center; -} - -@media (min-width: 768px) { - .nav-tabs.nav-justified > li { - display: table-cell; - width: 1%; - } -} - -.nav-tabs.nav-justified > li > a { - margin-right: 0; - border-bottom: 1px solid #dddddd; -} - -.nav-tabs.nav-justified > .active > a { - border-bottom-color: #ffffff; -} - -.nav-pills > li { - float: left; -} - -.nav-pills > li > a { - border-radius: 5px; -} - -.nav-pills > li + li { - margin-left: 2px; -} - -.nav-pills > li.active > a, -.nav-pills > li.active > a:hover, -.nav-pills > li.active > a:focus { - color: #ffffff; - background-color: #428bca; -} - -.nav-stacked > li { - float: none; -} - -.nav-stacked > li + li { - margin-top: 2px; - margin-left: 0; -} - -.nav-justified { - width: 100%; -} - -.nav-justified > li { - float: none; -} - -.nav-justified > li > a { - text-align: center; -} - -@media (min-width: 768px) { - .nav-justified > li { - display: table-cell; - width: 1%; - } -} - -.nav-tabs-justified { - border-bottom: 0; -} - -.nav-tabs-justified > li > a { - margin-right: 0; - border-bottom: 1px solid #dddddd; -} - -.nav-tabs-justified > .active > a { - border-bottom-color: #ffffff; -} - -.tabbable:before, -.tabbable:after { - display: table; - content: " "; -} - -.tabbable:after { - clear: both; -} - -.tabbable:before, -.tabbable:after { - display: table; - content: " "; -} - -.tabbable:after { - clear: both; -} - -.tab-content > .tab-pane, -.pill-content > .pill-pane { - display: none; -} - -.tab-content > .active, -.pill-content > .active { - display: block; -} - -.nav .caret { - border-top-color: #428bca; - border-bottom-color: #428bca; -} - -.nav a:hover .caret { - border-top-color: #2a6496; - border-bottom-color: #2a6496; -} - -.nav-tabs .dropdown-menu { - margin-top: -1px; - border-top-right-radius: 0; - border-top-left-radius: 0; -} - -.navbar { - position: relative; - z-index: 1000; - min-height: 50px; - margin-bottom: 20px; - border: 1px solid transparent; -} - -.navbar:before, -.navbar:after { - display: table; - content: " "; -} - -.navbar:after { - clear: both; -} - -.navbar:before, -.navbar:after { - display: table; - content: " "; -} - -.navbar:after { - clear: both; -} - -@media (min-width: 768px) { - .navbar { - border-radius: 4px; - } -} - -.navbar-header:before, -.navbar-header:after { - display: table; - content: " "; -} - -.navbar-header:after { - clear: both; -} - -.navbar-header:before, -.navbar-header:after { - display: table; - content: " "; -} - -.navbar-header:after { - clear: both; -} - -@media (min-width: 768px) { - .navbar-header { - float: left; - } -} - -.navbar-collapse { - max-height: 340px; - padding-right: 15px; - padding-left: 15px; - overflow-x: visible; - border-top: 1px solid transparent; - box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1); - -webkit-overflow-scrolling: touch; -} - -.navbar-collapse:before, -.navbar-collapse:after { - display: table; - content: " "; -} - -.navbar-collapse:after { - clear: both; -} - -.navbar-collapse:before, -.navbar-collapse:after { - display: table; - content: " "; -} - -.navbar-collapse:after { - clear: both; -} - -.navbar-collapse.in { - overflow-y: auto; -} - -@media (min-width: 768px) { - .navbar-collapse { - width: auto; - border-top: 0; - box-shadow: none; - } - .navbar-collapse.collapse { - display: block !important; - height: auto !important; - padding-bottom: 0; - overflow: visible !important; - } - .navbar-collapse.in { - overflow-y: visible; - } - .navbar-collapse .navbar-nav.navbar-left:first-child { - margin-left: -15px; - } - .navbar-collapse .navbar-nav.navbar-right:last-child { - margin-right: -15px; - } - .navbar-collapse .navbar-text:last-child { - margin-right: 0; - } -} - -.container > .navbar-header, -.container > .navbar-collapse { - margin-right: -15px; - margin-left: -15px; -} - -@media (min-width: 768px) { - .container > .navbar-header, - .container > .navbar-collapse { - margin-right: 0; - margin-left: 0; - } -} - -.navbar-static-top { - border-width: 0 0 1px; -} - -@media (min-width: 768px) { - .navbar-static-top { - border-radius: 0; - } -} - -.navbar-fixed-top, -.navbar-fixed-bottom { - position: fixed; - right: 0; - left: 0; - border-width: 0 0 1px; -} - -@media (min-width: 768px) { - .navbar-fixed-top, - .navbar-fixed-bottom { - border-radius: 0; - } -} - -.navbar-fixed-top { - top: 0; - z-index: 1030; -} - -.navbar-fixed-bottom { - bottom: 0; - margin-bottom: 0; -} - -.navbar-brand { - float: left; - padding: 15px 15px; - font-size: 18px; - line-height: 20px; -} - -.navbar-brand:hover, -.navbar-brand:focus { - text-decoration: none; -} - -@media (min-width: 768px) { - .navbar > .container .navbar-brand { - margin-left: -15px; - } -} - -.navbar-toggle { - position: relative; - float: right; - padding: 9px 10px; - margin-top: 8px; - margin-right: 15px; - margin-bottom: 8px; - background-color: transparent; - border: 1px solid transparent; - border-radius: 4px; -} - -.navbar-toggle .icon-bar { - display: block; - width: 22px; - height: 2px; - border-radius: 1px; -} - -.navbar-toggle .icon-bar + .icon-bar { - margin-top: 4px; -} - -@media (min-width: 768px) { - .navbar-toggle { - display: none; - } -} - -.navbar-nav { - margin: 7.5px -15px; -} - -.navbar-nav > li > a { - padding-top: 10px; - padding-bottom: 10px; - line-height: 20px; -} - -@media (max-width: 767px) { - .navbar-nav .open .dropdown-menu { - position: static; - float: none; - width: auto; - margin-top: 0; - background-color: transparent; - border: 0; - box-shadow: none; - } - .navbar-nav .open .dropdown-menu > li > a, - .navbar-nav .open .dropdown-menu .dropdown-header { - padding: 5px 15px 5px 25px; - } - .navbar-nav .open .dropdown-menu > li > a { - line-height: 20px; - } - .navbar-nav .open .dropdown-menu > li > a:hover, - .navbar-nav .open .dropdown-menu > li > a:focus { - background-image: none; - } -} - -@media (min-width: 768px) { - .navbar-nav { - float: left; - margin: 0; - } - .navbar-nav > li { - float: left; - } - .navbar-nav > li > a { - padding-top: 15px; - padding-bottom: 15px; - } -} - -@media (min-width: 768px) { - .navbar-left { - float: left !important; - } - .navbar-right { - float: right !important; - } -} - -.navbar-form { - padding: 10px 15px; - margin-top: 8px; - margin-right: -15px; - margin-bottom: 8px; - margin-left: -15px; - border-top: 1px solid transparent; - border-bottom: 1px solid transparent; - -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1); - box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1); -} - -@media (min-width: 768px) { - .navbar-form .form-group { - display: inline-block; - margin-bottom: 0; - vertical-align: middle; - } - .navbar-form .form-control { - display: inline-block; - } - .navbar-form .radio, - .navbar-form .checkbox { - display: inline-block; - padding-left: 0; - margin-top: 0; - margin-bottom: 0; - } - .navbar-form .radio input[type="radio"], - .navbar-form .checkbox input[type="checkbox"] { - float: none; - margin-left: 0; - } -} - -@media (max-width: 767px) { - .navbar-form .form-group { - margin-bottom: 5px; - } -} - -@media (min-width: 768px) { - .navbar-form { - width: auto; - padding-top: 0; - padding-bottom: 0; - margin-right: 0; - margin-left: 0; - border: 0; - -webkit-box-shadow: none; - box-shadow: none; - } -} - -.navbar-nav > li > .dropdown-menu { - margin-top: 0; - border-top-right-radius: 0; - border-top-left-radius: 0; -} - -.navbar-fixed-bottom .navbar-nav > li > .dropdown-menu { - border-bottom-right-radius: 0; - border-bottom-left-radius: 0; -} - -.navbar-nav.pull-right > li > .dropdown-menu, -.navbar-nav > li > .dropdown-menu.pull-right { - right: 0; - left: auto; -} - -.navbar-btn { - margin-top: 8px; - margin-bottom: 8px; -} - -.navbar-text { - float: left; - margin-top: 15px; - margin-bottom: 15px; -} - -@media (min-width: 768px) { - .navbar-text { - margin-right: 15px; - margin-left: 15px; - } -} - -.navbar-default { - background-color: #f8f8f8; - border-color: #e7e7e7; -} - -.navbar-default .navbar-brand { - color: #777777; -} - -.navbar-default .navbar-brand:hover, -.navbar-default .navbar-brand:focus { - color: #5e5e5e; - background-color: transparent; -} - -.navbar-default .navbar-text { - color: #777777; -} - -.navbar-default .navbar-nav > li > a { - color: #777777; -} - -.navbar-default .navbar-nav > li > a:hover, -.navbar-default .navbar-nav > li > a:focus { - color: #333333; - background-color: transparent; -} - -.navbar-default .navbar-nav > .active > a, -.navbar-default .navbar-nav > .active > a:hover, -.navbar-default .navbar-nav > .active > a:focus { - color: #555555; - background-color: #e7e7e7; -} - -.navbar-default .navbar-nav > .disabled > a, -.navbar-default .navbar-nav > .disabled > a:hover, -.navbar-default .navbar-nav > .disabled > a:focus { - color: #cccccc; - background-color: transparent; -} - -.navbar-default .navbar-toggle { - border-color: #dddddd; -} - -.navbar-default .navbar-toggle:hover, -.navbar-default .navbar-toggle:focus { - background-color: #dddddd; -} - -.navbar-default .navbar-toggle .icon-bar { - background-color: #cccccc; -} - -.navbar-default .navbar-collapse, -.navbar-default .navbar-form { - border-color: #e6e6e6; -} - -.navbar-default .navbar-nav > .dropdown > a:hover .caret, -.navbar-default .navbar-nav > .dropdown > a:focus .caret { - border-top-color: #333333; - border-bottom-color: #333333; -} - -.navbar-default .navbar-nav > .open > a, -.navbar-default .navbar-nav > .open > a:hover, -.navbar-default .navbar-nav > .open > a:focus { - color: #555555; - background-color: #e7e7e7; -} - -.navbar-default .navbar-nav > .open > a .caret, -.navbar-default .navbar-nav > .open > a:hover .caret, -.navbar-default .navbar-nav > .open > a:focus .caret { - border-top-color: #555555; - border-bottom-color: #555555; -} - -.navbar-default .navbar-nav > .dropdown > a .caret { - border-top-color: #777777; - border-bottom-color: #777777; -} - -@media (max-width: 767px) { - .navbar-default .navbar-nav .open .dropdown-menu > li > a { - color: #777777; - } - .navbar-default .navbar-nav .open .dropdown-menu > li > a:hover, - .navbar-default .navbar-nav .open .dropdown-menu > li > a:focus { - color: #333333; - background-color: transparent; - } - .navbar-default .navbar-nav .open .dropdown-menu > .active > a, - .navbar-default .navbar-nav .open .dropdown-menu > .active > a:hover, - .navbar-default .navbar-nav .open .dropdown-menu > .active > a:focus { - color: #555555; - background-color: #e7e7e7; - } - .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a, - .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:hover, - .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:focus { - color: #cccccc; - background-color: transparent; - } -} - -.navbar-default .navbar-link { - color: #777777; -} - -.navbar-default .navbar-link:hover { - color: #333333; -} - -.navbar-inverse { - background-color: #222222; - border-color: #080808; -} - -.navbar-inverse .navbar-brand { - color: #999999; -} - -.navbar-inverse .navbar-brand:hover, -.navbar-inverse .navbar-brand:focus { - color: #ffffff; - background-color: transparent; -} - -.navbar-inverse .navbar-text { - color: #999999; -} - -.navbar-inverse .navbar-nav > li > a { - color: #999999; -} - -.navbar-inverse .navbar-nav > li > a:hover, -.navbar-inverse .navbar-nav > li > a:focus { - color: #ffffff; - background-color: transparent; -} - -.navbar-inverse .navbar-nav > .active > a, -.navbar-inverse .navbar-nav > .active > a:hover, -.navbar-inverse .navbar-nav > .active > a:focus { - color: #ffffff; - background-color: #080808; -} - -.navbar-inverse .navbar-nav > .disabled > a, -.navbar-inverse .navbar-nav > .disabled > a:hover, -.navbar-inverse .navbar-nav > .disabled > a:focus { - color: #444444; - background-color: transparent; -} - -.navbar-inverse .navbar-toggle { - border-color: #333333; -} - -.navbar-inverse .navbar-toggle:hover, -.navbar-inverse .navbar-toggle:focus { - background-color: #333333; -} - -.navbar-inverse .navbar-toggle .icon-bar { - background-color: #ffffff; -} - -.navbar-inverse .navbar-collapse, -.navbar-inverse .navbar-form { - border-color: #101010; -} - -.navbar-inverse .navbar-nav > .open > a, -.navbar-inverse .navbar-nav > .open > a:hover, -.navbar-inverse .navbar-nav > .open > a:focus { - color: #ffffff; - background-color: #080808; -} - -.navbar-inverse .navbar-nav > .dropdown > a:hover .caret { - border-top-color: #ffffff; - border-bottom-color: #ffffff; -} - -.navbar-inverse .navbar-nav > .dropdown > a .caret { - border-top-color: #999999; - border-bottom-color: #999999; -} - -.navbar-inverse .navbar-nav > .open > a .caret, -.navbar-inverse .navbar-nav > .open > a:hover .caret, -.navbar-inverse .navbar-nav > .open > a:focus .caret { - border-top-color: #ffffff; - border-bottom-color: #ffffff; -} - -@media (max-width: 767px) { - .navbar-inverse .navbar-nav .open .dropdown-menu > .dropdown-header { - border-color: #080808; - } - .navbar-inverse .navbar-nav .open .dropdown-menu > li > a { - color: #999999; - } - .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:hover, - .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:focus { - color: #ffffff; - background-color: transparent; - } - .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a, - .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:hover, - .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:focus { - color: #ffffff; - background-color: #080808; - } - .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a, - .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:hover, - .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:focus { - color: #444444; - background-color: transparent; - } -} - -.navbar-inverse .navbar-link { - color: #999999; -} - -.navbar-inverse .navbar-link:hover { - color: #ffffff; -} - -.breadcrumb { - padding: 8px 15px; - margin-bottom: 20px; - list-style: none; - background-color: #f5f5f5; - border-radius: 4px; -} - -.breadcrumb > li { - display: inline-block; -} - -.breadcrumb > li + li:before { - padding: 0 5px; - color: #cccccc; - content: "/\00a0"; -} - -.breadcrumb > .active { - color: #999999; -} - -.pagination { - display: inline-block; - padding-left: 0; - margin: 20px 0; - border-radius: 4px; -} - -.pagination > li { - display: inline; -} - -.pagination > li > a, -.pagination > li > span { - position: relative; - float: left; - padding: 6px 12px; - margin-left: -1px; - line-height: 1.428571429; - text-decoration: none; - background-color: #ffffff; - border: 1px solid #dddddd; -} - -.pagination > li:first-child > a, -.pagination > li:first-child > span { - margin-left: 0; - border-bottom-left-radius: 4px; - border-top-left-radius: 4px; -} - -.pagination > li:last-child > a, -.pagination > li:last-child > span { - border-top-right-radius: 4px; - border-bottom-right-radius: 4px; -} - -.pagination > li > a:hover, -.pagination > li > span:hover, -.pagination > li > a:focus, -.pagination > li > span:focus { - background-color: #eeeeee; -} - -.pagination > .active > a, -.pagination > .active > span, -.pagination > .active > a:hover, -.pagination > .active > span:hover, -.pagination > .active > a:focus, -.pagination > .active > span:focus { - z-index: 2; - color: #ffffff; - cursor: default; - background-color: #428bca; - border-color: #428bca; -} - -.pagination > .disabled > span, -.pagination > .disabled > a, -.pagination > .disabled > a:hover, -.pagination > .disabled > a:focus { - color: #999999; - cursor: not-allowed; - background-color: #ffffff; - border-color: #dddddd; -} - -.pagination-lg > li > a, -.pagination-lg > li > span { - padding: 10px 16px; - font-size: 18px; -} - -.pagination-lg > li:first-child > a, -.pagination-lg > li:first-child > span { - border-bottom-left-radius: 6px; - border-top-left-radius: 6px; -} - -.pagination-lg > li:last-child > a, -.pagination-lg > li:last-child > span { - border-top-right-radius: 6px; - border-bottom-right-radius: 6px; -} - -.pagination-sm > li > a, -.pagination-sm > li > span { - padding: 5px 10px; - font-size: 12px; -} - -.pagination-sm > li:first-child > a, -.pagination-sm > li:first-child > span { - border-bottom-left-radius: 3px; - border-top-left-radius: 3px; -} - -.pagination-sm > li:last-child > a, -.pagination-sm > li:last-child > span { - border-top-right-radius: 3px; - border-bottom-right-radius: 3px; -} - -.pager { - padding-left: 0; - margin: 20px 0; - text-align: center; - list-style: none; -} - -.pager:before, -.pager:after { - display: table; - content: " "; -} - -.pager:after { - clear: both; -} - -.pager:before, -.pager:after { - display: table; - content: " "; -} - -.pager:after { - clear: both; -} - -.pager li { - display: inline; -} - -.pager li > a, -.pager li > span { - display: inline-block; - padding: 5px 14px; - background-color: #ffffff; - border: 1px solid #dddddd; - border-radius: 15px; -} - -.pager li > a:hover, -.pager li > a:focus { - text-decoration: none; - background-color: #eeeeee; -} - -.pager .next > a, -.pager .next > span { - float: right; -} - -.pager .previous > a, -.pager .previous > span { - float: left; -} - -.pager .disabled > a, -.pager .disabled > a:hover, -.pager .disabled > a:focus, -.pager .disabled > span { - color: #999999; - cursor: not-allowed; - background-color: #ffffff; -} - -.label { - display: inline; - padding: .2em .6em .3em; - font-size: 75%; - font-weight: bold; - line-height: 1; - color: #ffffff; - text-align: center; - white-space: nowrap; - vertical-align: baseline; - border-radius: .25em; -} - -.label[href]:hover, -.label[href]:focus { - color: #ffffff; - text-decoration: none; - cursor: pointer; -} - -.label:empty { - display: none; -} - -.label-default { - background-color: #999999; -} - -.label-default[href]:hover, -.label-default[href]:focus { - background-color: #808080; -} - -.label-primary { - background-color: #428bca; -} - -.label-primary[href]:hover, -.label-primary[href]:focus { - background-color: #3071a9; -} - -.label-success { - background-color: #5cb85c; -} - -.label-success[href]:hover, -.label-success[href]:focus { - background-color: #449d44; -} - -.label-info { - background-color: #5bc0de; -} - -.label-info[href]:hover, -.label-info[href]:focus { - background-color: #31b0d5; -} - -.label-warning { - background-color: #f0ad4e; -} - -.label-warning[href]:hover, -.label-warning[href]:focus { - background-color: #ec971f; -} - -.label-danger { - background-color: #d9534f; -} - -.label-danger[href]:hover, -.label-danger[href]:focus { - background-color: #c9302c; -} - -.badge { - display: inline-block; - min-width: 10px; - padding: 3px 7px; - font-size: 12px; - font-weight: bold; - line-height: 1; - color: #ffffff; - text-align: center; - white-space: nowrap; - vertical-align: baseline; - background-color: #999999; - border-radius: 10px; -} - -.badge:empty { - display: none; -} - -a.badge:hover, -a.badge:focus { - color: #ffffff; - text-decoration: none; - cursor: pointer; -} - -.btn .badge { - position: relative; - top: -1px; -} - -a.list-group-item.active > .badge, -.nav-pills > .active > a > .badge { - color: #428bca; - background-color: #ffffff; -} - -.nav-pills > li > a > .badge { - margin-left: 3px; -} - -.jumbotron { - padding: 30px; - margin-bottom: 30px; - font-size: 21px; - font-weight: 200; - line-height: 2.1428571435; - color: inherit; - background-color: #eeeeee; -} - -.jumbotron h1 { - line-height: 1; - color: inherit; -} - -.jumbotron p { - line-height: 1.4; -} - -.container .jumbotron { - border-radius: 6px; -} - -@media screen and (min-width: 768px) { - .jumbotron { - padding-top: 48px; - padding-bottom: 48px; - } - .container .jumbotron { - padding-right: 60px; - padding-left: 60px; - } - .jumbotron h1 { - font-size: 63px; - } -} - -.thumbnail { - display: inline-block; - display: block; - height: auto; - max-width: 100%; - padding: 4px; - line-height: 1.428571429; - background-color: #ffffff; - border: 1px solid #dddddd; - border-radius: 4px; - -webkit-transition: all 0.2s ease-in-out; - transition: all 0.2s ease-in-out; -} - -.thumbnail > img { - display: block; - height: auto; - max-width: 100%; -} - -a.thumbnail:hover, -a.thumbnail:focus { - border-color: #428bca; -} - -.thumbnail > img { - margin-right: auto; - margin-left: auto; -} - -.thumbnail .caption { - padding: 9px; - color: #333333; -} - -.alert { - padding: 15px; - margin-bottom: 20px; - border: 1px solid transparent; - border-radius: 4px; -} - -.alert h4 { - margin-top: 0; - color: inherit; -} - -.alert .alert-link { - font-weight: bold; -} - -.alert > p, -.alert > ul { - margin-bottom: 0; -} - -.alert > p + p { - margin-top: 5px; -} - -.alert-dismissable { - padding-right: 35px; -} - -.alert-dismissable .close { - position: relative; - top: -2px; - right: -21px; - color: inherit; -} - -.alert-success { - color: #468847; - background-color: #dff0d8; - border-color: #d6e9c6; -} - -.alert-success hr { - border-top-color: #c9e2b3; -} - -.alert-success .alert-link { - color: #356635; -} - -.alert-info { - color: #3a87ad; - background-color: #d9edf7; - border-color: #bce8f1; -} - -.alert-info hr { - border-top-color: #a6e1ec; -} - -.alert-info .alert-link { - color: #2d6987; -} - -.alert-warning { - color: #c09853; - background-color: #fcf8e3; - border-color: #fbeed5; -} - -.alert-warning hr { - border-top-color: #f8e5be; -} - -.alert-warning .alert-link { - color: #a47e3c; -} - -.alert-danger { - color: #b94a48; - background-color: #f2dede; - border-color: #eed3d7; -} - -.alert-danger hr { - border-top-color: #e6c1c7; -} - -.alert-danger .alert-link { - color: #953b39; -} - -@-webkit-keyframes progress-bar-stripes { - from { - background-position: 40px 0; - } - to { - background-position: 0 0; - } -} - -@-moz-keyframes progress-bar-stripes { - from { - background-position: 40px 0; - } - to { - background-position: 0 0; - } -} - -@-o-keyframes progress-bar-stripes { - from { - background-position: 0 0; - } - to { - background-position: 40px 0; - } -} - -@keyframes progress-bar-stripes { - from { - background-position: 40px 0; - } - to { - background-position: 0 0; - } -} - -.progress { - height: 20px; - margin-bottom: 20px; - overflow: hidden; - background-color: #f5f5f5; - border-radius: 4px; - -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1); - box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1); -} - -.progress-bar { - float: left; - width: 0; - height: 100%; - font-size: 12px; - color: #ffffff; - text-align: center; - background-color: #428bca; - -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15); - box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15); - -webkit-transition: width 0.6s ease; - transition: width 0.6s ease; -} - -.progress-striped .progress-bar { - background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent)); - background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-size: 40px 40px; -} - -.progress.active .progress-bar { - -webkit-animation: progress-bar-stripes 2s linear infinite; - -moz-animation: progress-bar-stripes 2s linear infinite; - -ms-animation: progress-bar-stripes 2s linear infinite; - -o-animation: progress-bar-stripes 2s linear infinite; - animation: progress-bar-stripes 2s linear infinite; -} - -.progress-bar-success { - background-color: #5cb85c; -} - -.progress-striped .progress-bar-success { - background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent)); - background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); -} - -.progress-bar-info { - background-color: #5bc0de; -} - -.progress-striped .progress-bar-info { - background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent)); - background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); -} - -.progress-bar-warning { - background-color: #f0ad4e; -} - -.progress-striped .progress-bar-warning { - background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent)); - background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); -} - -.progress-bar-danger { - background-color: #d9534f; -} - -.progress-striped .progress-bar-danger { - background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent)); - background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); -} - -.media, -.media-body { - overflow: hidden; - zoom: 1; -} - -.media, -.media .media { - margin-top: 15px; -} - -.media:first-child { - margin-top: 0; -} - -.media-object { - display: block; -} - -.media-heading { - margin: 0 0 5px; -} - -.media > .pull-left { - margin-right: 10px; -} - -.media > .pull-right { - margin-left: 10px; -} - -.media-list { - padding-left: 0; - list-style: none; -} - -.list-group { - padding-left: 0; - margin-bottom: 20px; -} - -.list-group-item { - position: relative; - display: block; - padding: 10px 15px; - margin-bottom: -1px; - background-color: #ffffff; - border: 1px solid #dddddd; -} - -.list-group-item:first-child { - border-top-right-radius: 4px; - border-top-left-radius: 4px; -} - -.list-group-item:last-child { - margin-bottom: 0; - border-bottom-right-radius: 4px; - border-bottom-left-radius: 4px; -} - -.list-group-item > .badge { - float: right; -} - -.list-group-item > .badge + .badge { - margin-right: 5px; -} - -a.list-group-item { - color: #555555; -} - -a.list-group-item .list-group-item-heading { - color: #333333; -} - -a.list-group-item:hover, -a.list-group-item:focus { - text-decoration: none; - background-color: #f5f5f5; -} - -.list-group-item.active, -.list-group-item.active:hover, -.list-group-item.active:focus { - z-index: 2; - color: #ffffff; - background-color: #428bca; - border-color: #428bca; -} - -.list-group-item.active .list-group-item-heading, -.list-group-item.active:hover .list-group-item-heading, -.list-group-item.active:focus .list-group-item-heading { - color: inherit; -} - -.list-group-item.active .list-group-item-text, -.list-group-item.active:hover .list-group-item-text, -.list-group-item.active:focus .list-group-item-text { - color: #e1edf7; -} - -.list-group-item-heading { - margin-top: 0; - margin-bottom: 5px; -} - -.list-group-item-text { - margin-bottom: 0; - line-height: 1.3; -} - -.panel { - margin-bottom: 20px; - background-color: #ffffff; - border: 1px solid transparent; - border-radius: 4px; - -webkit-box-shadow: 0 1px 1px rgba(0, 0, 0, 0.05); - box-shadow: 0 1px 1px rgba(0, 0, 0, 0.05); -} - -.panel-body { - padding: 15px; -} - -.panel-body:before, -.panel-body:after { - display: table; - content: " "; -} - -.panel-body:after { - clear: both; -} - -.panel-body:before, -.panel-body:after { - display: table; - content: " "; -} - -.panel-body:after { - clear: both; -} - -.panel > .list-group { - margin-bottom: 0; -} - -.panel > .list-group .list-group-item { - border-width: 1px 0; -} - -.panel > .list-group .list-group-item:first-child { - border-top-right-radius: 0; - border-top-left-radius: 0; -} - -.panel > .list-group .list-group-item:last-child { - border-bottom: 0; -} - -.panel-heading + .list-group .list-group-item:first-child { - border-top-width: 0; -} - -.panel > .table { - margin-bottom: 0; -} - -.panel > .panel-body + .table { - border-top: 1px solid #dddddd; -} - -.panel-heading { - padding: 10px 15px; - border-bottom: 1px solid transparent; - border-top-right-radius: 3px; - border-top-left-radius: 3px; -} - -.panel-title { - margin-top: 0; - margin-bottom: 0; - font-size: 16px; -} - -.panel-title > a { - color: inherit; -} - -.panel-footer { - padding: 10px 15px; - background-color: #f5f5f5; - border-top: 1px solid #dddddd; - border-bottom-right-radius: 3px; - border-bottom-left-radius: 3px; -} - -.panel-group .panel { - margin-bottom: 0; - overflow: hidden; - border-radius: 4px; -} - -.panel-group .panel + .panel { - margin-top: 5px; -} - -.panel-group .panel-heading { - border-bottom: 0; -} - -.panel-group .panel-heading + .panel-collapse .panel-body { - border-top: 1px solid #dddddd; -} - -.panel-group .panel-footer { - border-top: 0; -} - -.panel-group .panel-footer + .panel-collapse .panel-body { - border-bottom: 1px solid #dddddd; -} - -.panel-default { - border-color: #dddddd; -} - -.panel-default > .panel-heading { - color: #333333; - background-color: #f5f5f5; - border-color: #dddddd; -} - -.panel-default > .panel-heading + .panel-collapse .panel-body { - border-top-color: #dddddd; -} - -.panel-default > .panel-footer + .panel-collapse .panel-body { - border-bottom-color: #dddddd; -} - -.panel-primary { - border-color: #428bca; -} - -.panel-primary > .panel-heading { - color: #ffffff; - background-color: #428bca; - border-color: #428bca; -} - -.panel-primary > .panel-heading + .panel-collapse .panel-body { - border-top-color: #428bca; -} - -.panel-primary > .panel-footer + .panel-collapse .panel-body { - border-bottom-color: #428bca; -} - -.panel-success { - border-color: #d6e9c6; -} - -.panel-success > .panel-heading { - color: #468847; - background-color: #dff0d8; - border-color: #d6e9c6; -} - -.panel-success > .panel-heading + .panel-collapse .panel-body { - border-top-color: #d6e9c6; -} - -.panel-success > .panel-footer + .panel-collapse .panel-body { - border-bottom-color: #d6e9c6; -} - -.panel-warning { - border-color: #fbeed5; -} - -.panel-warning > .panel-heading { - color: #c09853; - background-color: #fcf8e3; - border-color: #fbeed5; -} - -.panel-warning > .panel-heading + .panel-collapse .panel-body { - border-top-color: #fbeed5; -} - -.panel-warning > .panel-footer + .panel-collapse .panel-body { - border-bottom-color: #fbeed5; -} - -.panel-danger { - border-color: #eed3d7; -} - -.panel-danger > .panel-heading { - color: #b94a48; - background-color: #f2dede; - border-color: #eed3d7; -} - -.panel-danger > .panel-heading + .panel-collapse .panel-body { - border-top-color: #eed3d7; -} - -.panel-danger > .panel-footer + .panel-collapse .panel-body { - border-bottom-color: #eed3d7; -} - -.panel-info { - border-color: #bce8f1; -} - -.panel-info > .panel-heading { - color: #3a87ad; - background-color: #d9edf7; - border-color: #bce8f1; -} - -.panel-info > .panel-heading + .panel-collapse .panel-body { - border-top-color: #bce8f1; -} - -.panel-info > .panel-footer + .panel-collapse .panel-body { - border-bottom-color: #bce8f1; -} - -.well { - min-height: 20px; - padding: 19px; - margin-bottom: 20px; - background-color: #f5f5f5; - border: 1px solid #e3e3e3; - border-radius: 4px; - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05); - box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05); -} - -.well blockquote { - border-color: #ddd; - border-color: rgba(0, 0, 0, 0.15); -} - -.well-lg { - padding: 24px; - border-radius: 6px; -} - -.well-sm { - padding: 9px; - border-radius: 3px; -} - -.close { - float: right; - font-size: 21px; - font-weight: bold; - line-height: 1; - color: #000000; - text-shadow: 0 1px 0 #ffffff; - opacity: 0.2; - filter: alpha(opacity=20); -} - -.close:hover, -.close:focus { - color: #000000; - text-decoration: none; - cursor: pointer; - opacity: 0.5; - filter: alpha(opacity=50); -} - -button.close { - padding: 0; - cursor: pointer; - background: transparent; - border: 0; - -webkit-appearance: none; -} - -.modal-open { - overflow: hidden; -} - -body.modal-open, -.modal-open .navbar-fixed-top, -.modal-open .navbar-fixed-bottom { - margin-right: 15px; -} - -.modal { - position: fixed; - top: 0; - right: 0; - bottom: 0; - left: 0; - z-index: 1040; - display: none; - overflow: auto; - overflow-y: scroll; -} - -.modal.fade .modal-dialog { - -webkit-transform: translate(0, -25%); - -ms-transform: translate(0, -25%); - transform: translate(0, -25%); - -webkit-transition: -webkit-transform 0.3s ease-out; - -moz-transition: -moz-transform 0.3s ease-out; - -o-transition: -o-transform 0.3s ease-out; - transition: transform 0.3s ease-out; -} - -.modal.in .modal-dialog { - -webkit-transform: translate(0, 0); - -ms-transform: translate(0, 0); - transform: translate(0, 0); -} - -.modal-dialog { - z-index: 1050; - width: auto; - padding: 10px; - margin-right: auto; - margin-left: auto; -} - -.modal-content { - position: relative; - background-color: #ffffff; - border: 1px solid #999999; - border: 1px solid rgba(0, 0, 0, 0.2); - border-radius: 6px; - outline: none; - -webkit-box-shadow: 0 3px 9px rgba(0, 0, 0, 0.5); - box-shadow: 0 3px 9px rgba(0, 0, 0, 0.5); - background-clip: padding-box; -} - -.modal-backdrop { - position: fixed; - top: 0; - right: 0; - bottom: 0; - left: 0; - z-index: 1030; - background-color: #000000; -} - -.modal-backdrop.fade { - opacity: 0; - filter: alpha(opacity=0); -} - -.modal-backdrop.in { - opacity: 0.5; - filter: alpha(opacity=50); -} - -.modal-header { - min-height: 16.428571429px; - padding: 15px; - border-bottom: 1px solid #e5e5e5; -} - -.modal-header .close { - margin-top: -2px; -} - -.modal-title { - margin: 0; - line-height: 1.428571429; -} - -.modal-body { - position: relative; - padding: 20px; -} - -.modal-footer { - padding: 19px 20px 20px; - margin-top: 15px; - text-align: right; - border-top: 1px solid #e5e5e5; -} - -.modal-footer:before, -.modal-footer:after { - display: table; - content: " "; -} - -.modal-footer:after { - clear: both; -} - -.modal-footer:before, -.modal-footer:after { - display: table; - content: " "; -} - -.modal-footer:after { - clear: both; -} - -.modal-footer .btn + .btn { - margin-bottom: 0; - margin-left: 5px; -} - -.modal-footer .btn-group .btn + .btn { - margin-left: -1px; -} - -.modal-footer .btn-block + .btn-block { - margin-left: 0; -} - -@media screen and (min-width: 768px) { - .modal-dialog { - right: auto; - left: 50%; - width: 600px; - padding-top: 30px; - padding-bottom: 30px; - } - .modal-content { - -webkit-box-shadow: 0 5px 15px rgba(0, 0, 0, 0.5); - box-shadow: 0 5px 15px rgba(0, 0, 0, 0.5); - } -} - -.tooltip { - position: absolute; - z-index: 1030; - display: block; - font-size: 12px; - line-height: 1.4; - opacity: 0; - filter: alpha(opacity=0); - visibility: visible; -} - -.tooltip.in { - opacity: 0.9; - filter: alpha(opacity=90); -} - -.tooltip.top { - padding: 5px 0; - margin-top: -3px; -} - -.tooltip.right { - padding: 0 5px; - margin-left: 3px; -} - -.tooltip.bottom { - padding: 5px 0; - margin-top: 3px; -} - -.tooltip.left { - padding: 0 5px; - margin-left: -3px; -} - -.tooltip-inner { - max-width: 200px; - padding: 3px 8px; - color: #ffffff; - text-align: center; - text-decoration: none; - background-color: #000000; - border-radius: 4px; -} - -.tooltip-arrow { - position: absolute; - width: 0; - height: 0; - border-color: transparent; - border-style: solid; -} - -.tooltip.top .tooltip-arrow { - bottom: 0; - left: 50%; - margin-left: -5px; - border-top-color: #000000; - border-width: 5px 5px 0; -} - -.tooltip.top-left .tooltip-arrow { - bottom: 0; - left: 5px; - border-top-color: #000000; - border-width: 5px 5px 0; -} - -.tooltip.top-right .tooltip-arrow { - right: 5px; - bottom: 0; - border-top-color: #000000; - border-width: 5px 5px 0; -} - -.tooltip.right .tooltip-arrow { - top: 50%; - left: 0; - margin-top: -5px; - border-right-color: #000000; - border-width: 5px 5px 5px 0; -} - -.tooltip.left .tooltip-arrow { - top: 50%; - right: 0; - margin-top: -5px; - border-left-color: #000000; - border-width: 5px 0 5px 5px; -} - -.tooltip.bottom .tooltip-arrow { - top: 0; - left: 50%; - margin-left: -5px; - border-bottom-color: #000000; - border-width: 0 5px 5px; -} - -.tooltip.bottom-left .tooltip-arrow { - top: 0; - left: 5px; - border-bottom-color: #000000; - border-width: 0 5px 5px; -} - -.tooltip.bottom-right .tooltip-arrow { - top: 0; - right: 5px; - border-bottom-color: #000000; - border-width: 0 5px 5px; -} - -.popover { - position: absolute; - top: 0; - left: 0; - z-index: 1010; - display: none; - max-width: 276px; - padding: 1px; - text-align: left; - white-space: normal; - background-color: #ffffff; - border: 1px solid #cccccc; - border: 1px solid rgba(0, 0, 0, 0.2); - border-radius: 6px; - -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); - box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); - background-clip: padding-box; -} - -.popover.top { - margin-top: -10px; -} - -.popover.right { - margin-left: 10px; -} - -.popover.bottom { - margin-top: 10px; -} - -.popover.left { - margin-left: -10px; -} - -.popover-title { - padding: 8px 14px; - margin: 0; - font-size: 14px; - font-weight: normal; - line-height: 18px; - background-color: #f7f7f7; - border-bottom: 1px solid #ebebeb; - border-radius: 5px 5px 0 0; -} - -.popover-content { - padding: 9px 14px; -} - -.popover .arrow, -.popover .arrow:after { - position: absolute; - display: block; - width: 0; - height: 0; - border-color: transparent; - border-style: solid; -} - -.popover .arrow { - border-width: 11px; -} - -.popover .arrow:after { - border-width: 10px; - content: ""; -} - -.popover.top .arrow { - bottom: -11px; - left: 50%; - margin-left: -11px; - border-top-color: #999999; - border-top-color: rgba(0, 0, 0, 0.25); - border-bottom-width: 0; -} - -.popover.top .arrow:after { - bottom: 1px; - margin-left: -10px; - border-top-color: #ffffff; - border-bottom-width: 0; - content: " "; -} - -.popover.right .arrow { - top: 50%; - left: -11px; - margin-top: -11px; - border-right-color: #999999; - border-right-color: rgba(0, 0, 0, 0.25); - border-left-width: 0; -} - -.popover.right .arrow:after { - bottom: -10px; - left: 1px; - border-right-color: #ffffff; - border-left-width: 0; - content: " "; -} - -.popover.bottom .arrow { - top: -11px; - left: 50%; - margin-left: -11px; - border-bottom-color: #999999; - border-bottom-color: rgba(0, 0, 0, 0.25); - border-top-width: 0; -} - -.popover.bottom .arrow:after { - top: 1px; - margin-left: -10px; - border-bottom-color: #ffffff; - border-top-width: 0; - content: " "; -} - -.popover.left .arrow { - top: 50%; - right: -11px; - margin-top: -11px; - border-left-color: #999999; - border-left-color: rgba(0, 0, 0, 0.25); - border-right-width: 0; -} - -.popover.left .arrow:after { - right: 1px; - bottom: -10px; - border-left-color: #ffffff; - border-right-width: 0; - content: " "; -} - -.carousel { - position: relative; -} - -.carousel-inner { - position: relative; - width: 100%; - overflow: hidden; -} - -.carousel-inner > .item { - position: relative; - display: none; - -webkit-transition: 0.6s ease-in-out left; - transition: 0.6s ease-in-out left; -} - -.carousel-inner > .item > img, -.carousel-inner > .item > a > img { - display: block; - height: auto; - max-width: 100%; - line-height: 1; -} - -.carousel-inner > .active, -.carousel-inner > .next, -.carousel-inner > .prev { - display: block; -} - -.carousel-inner > .active { - left: 0; -} - -.carousel-inner > .next, -.carousel-inner > .prev { - position: absolute; - top: 0; - width: 100%; -} - -.carousel-inner > .next { - left: 100%; -} - -.carousel-inner > .prev { - left: -100%; -} - -.carousel-inner > .next.left, -.carousel-inner > .prev.right { - left: 0; -} - -.carousel-inner > .active.left { - left: -100%; -} - -.carousel-inner > .active.right { - left: 100%; -} - -.carousel-control { - position: absolute; - top: 0; - bottom: 0; - left: 0; - width: 15%; - font-size: 20px; - color: #ffffff; - text-align: center; - text-shadow: 0 1px 2px rgba(0, 0, 0, 0.6); - opacity: 0.5; - filter: alpha(opacity=50); -} - -.carousel-control.left { - background-image: -webkit-gradient(linear, 0 top, 100% top, from(rgba(0, 0, 0, 0.5)), to(rgba(0, 0, 0, 0.0001))); - background-image: -webkit-linear-gradient(left, color-stop(rgba(0, 0, 0, 0.5) 0), color-stop(rgba(0, 0, 0, 0.0001) 100%)); - background-image: -moz-linear-gradient(left, rgba(0, 0, 0, 0.5) 0, rgba(0, 0, 0, 0.0001) 100%); - background-image: linear-gradient(to right, rgba(0, 0, 0, 0.5) 0, rgba(0, 0, 0, 0.0001) 100%); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1); -} - -.carousel-control.right { - right: 0; - left: auto; - background-image: -webkit-gradient(linear, 0 top, 100% top, from(rgba(0, 0, 0, 0.0001)), to(rgba(0, 0, 0, 0.5))); - background-image: -webkit-linear-gradient(left, color-stop(rgba(0, 0, 0, 0.0001) 0), color-stop(rgba(0, 0, 0, 0.5) 100%)); - background-image: -moz-linear-gradient(left, rgba(0, 0, 0, 0.0001) 0, rgba(0, 0, 0, 0.5) 100%); - background-image: linear-gradient(to right, rgba(0, 0, 0, 0.0001) 0, rgba(0, 0, 0, 0.5) 100%); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1); -} - -.carousel-control:hover, -.carousel-control:focus { - color: #ffffff; - text-decoration: none; - opacity: 0.9; - filter: alpha(opacity=90); -} - -.carousel-control .icon-prev, -.carousel-control .icon-next, -.carousel-control .glyphicon-chevron-left, -.carousel-control .glyphicon-chevron-right { - position: absolute; - top: 50%; - left: 50%; - z-index: 5; - display: inline-block; -} - -.carousel-control .icon-prev, -.carousel-control .icon-next { - width: 20px; - height: 20px; - margin-top: -10px; - margin-left: -10px; - font-family: serif; -} - -.carousel-control .icon-prev:before { - content: '\2039'; -} - -.carousel-control .icon-next:before { - content: '\203a'; -} - -.carousel-indicators { - position: absolute; - bottom: 10px; - left: 50%; - z-index: 15; - width: 60%; - padding-left: 0; - margin-left: -30%; - text-align: center; - list-style: none; -} - -.carousel-indicators li { - display: inline-block; - width: 10px; - height: 10px; - margin: 1px; - text-indent: -999px; - cursor: pointer; - border: 1px solid #ffffff; - border-radius: 10px; -} - -.carousel-indicators .active { - width: 12px; - height: 12px; - margin: 0; - background-color: #ffffff; -} - -.carousel-caption { - position: absolute; - right: 15%; - bottom: 20px; - left: 15%; - z-index: 10; - padding-top: 20px; - padding-bottom: 20px; - color: #ffffff; - text-align: center; - text-shadow: 0 1px 2px rgba(0, 0, 0, 0.6); -} - -.carousel-caption .btn { - text-shadow: none; -} - -@media screen and (min-width: 768px) { - .carousel-control .icon-prev, - .carousel-control .icon-next { - width: 30px; - height: 30px; - margin-top: -15px; - margin-left: -15px; - font-size: 30px; - } - .carousel-caption { - right: 20%; - left: 20%; - padding-bottom: 30px; - } - .carousel-indicators { - bottom: 20px; - } -} - -.clearfix:before, -.clearfix:after { - display: table; - content: " "; -} - -.clearfix:after { - clear: both; -} - -.pull-right { - float: right !important; -} - -.pull-left { - float: left !important; -} - -.hide { - display: none !important; -} - -.show { - display: block !important; -} - -.invisible { - visibility: hidden; -} - -.text-hide { - font: 0/0 a; - color: transparent; - text-shadow: none; - background-color: transparent; - border: 0; -} - -.affix { - position: fixed; -} - -@-ms-viewport { - width: device-width; -} - -@media screen and (max-width: 400px) { - @-ms-viewport { - width: 320px; - } -} - -.hidden { - display: none !important; - visibility: hidden !important; -} - -.visible-xs { - display: none !important; -} - -tr.visible-xs { - display: none !important; -} - -th.visible-xs, -td.visible-xs { - display: none !important; -} - -@media (max-width: 767px) { - .visible-xs { - display: block !important; - } - tr.visible-xs { - display: table-row !important; - } - th.visible-xs, - td.visible-xs { - display: table-cell !important; - } -} - -@media (min-width: 768px) and (max-width: 991px) { - .visible-xs.visible-sm { - display: block !important; - } - tr.visible-xs.visible-sm { - display: table-row !important; - } - th.visible-xs.visible-sm, - td.visible-xs.visible-sm { - display: table-cell !important; - } -} - -@media (min-width: 992px) and (max-width: 1199px) { - .visible-xs.visible-md { - display: block !important; - } - tr.visible-xs.visible-md { - display: table-row !important; - } - th.visible-xs.visible-md, - td.visible-xs.visible-md { - display: table-cell !important; - } -} - -@media (min-width: 1200px) { - .visible-xs.visible-lg { - display: block !important; - } - tr.visible-xs.visible-lg { - display: table-row !important; - } - th.visible-xs.visible-lg, - td.visible-xs.visible-lg { - display: table-cell !important; - } -} - -.visible-sm { - display: none !important; -} - -tr.visible-sm { - display: none !important; -} - -th.visible-sm, -td.visible-sm { - display: none !important; -} - -@media (max-width: 767px) { - .visible-sm.visible-xs { - display: block !important; - } - tr.visible-sm.visible-xs { - display: table-row !important; - } - th.visible-sm.visible-xs, - td.visible-sm.visible-xs { - display: table-cell !important; - } -} - -@media (min-width: 768px) and (max-width: 991px) { - .visible-sm { - display: block !important; - } - tr.visible-sm { - display: table-row !important; - } - th.visible-sm, - td.visible-sm { - display: table-cell !important; - } -} - -@media (min-width: 992px) and (max-width: 1199px) { - .visible-sm.visible-md { - display: block !important; - } - tr.visible-sm.visible-md { - display: table-row !important; - } - th.visible-sm.visible-md, - td.visible-sm.visible-md { - display: table-cell !important; - } -} - -@media (min-width: 1200px) { - .visible-sm.visible-lg { - display: block !important; - } - tr.visible-sm.visible-lg { - display: table-row !important; - } - th.visible-sm.visible-lg, - td.visible-sm.visible-lg { - display: table-cell !important; - } -} - -.visible-md { - display: none !important; -} - -tr.visible-md { - display: none !important; -} - -th.visible-md, -td.visible-md { - display: none !important; -} - -@media (max-width: 767px) { - .visible-md.visible-xs { - display: block !important; - } - tr.visible-md.visible-xs { - display: table-row !important; - } - th.visible-md.visible-xs, - td.visible-md.visible-xs { - display: table-cell !important; - } -} - -@media (min-width: 768px) and (max-width: 991px) { - .visible-md.visible-sm { - display: block !important; - } - tr.visible-md.visible-sm { - display: table-row !important; - } - th.visible-md.visible-sm, - td.visible-md.visible-sm { - display: table-cell !important; - } -} - -@media (min-width: 992px) and (max-width: 1199px) { - .visible-md { - display: block !important; - } - tr.visible-md { - display: table-row !important; - } - th.visible-md, - td.visible-md { - display: table-cell !important; - } -} - -@media (min-width: 1200px) { - .visible-md.visible-lg { - display: block !important; - } - tr.visible-md.visible-lg { - display: table-row !important; - } - th.visible-md.visible-lg, - td.visible-md.visible-lg { - display: table-cell !important; - } -} - -.visible-lg { - display: none !important; -} - -tr.visible-lg { - display: none !important; -} - -th.visible-lg, -td.visible-lg { - display: none !important; -} - -@media (max-width: 767px) { - .visible-lg.visible-xs { - display: block !important; - } - tr.visible-lg.visible-xs { - display: table-row !important; - } - th.visible-lg.visible-xs, - td.visible-lg.visible-xs { - display: table-cell !important; - } -} - -@media (min-width: 768px) and (max-width: 991px) { - .visible-lg.visible-sm { - display: block !important; - } - tr.visible-lg.visible-sm { - display: table-row !important; - } - th.visible-lg.visible-sm, - td.visible-lg.visible-sm { - display: table-cell !important; - } -} - -@media (min-width: 992px) and (max-width: 1199px) { - .visible-lg.visible-md { - display: block !important; - } - tr.visible-lg.visible-md { - display: table-row !important; - } - th.visible-lg.visible-md, - td.visible-lg.visible-md { - display: table-cell !important; - } -} - -@media (min-width: 1200px) { - .visible-lg { - display: block !important; - } - tr.visible-lg { - display: table-row !important; - } - th.visible-lg, - td.visible-lg { - display: table-cell !important; - } -} - -.hidden-xs { - display: block !important; -} - -tr.hidden-xs { - display: table-row !important; -} - -th.hidden-xs, -td.hidden-xs { - display: table-cell !important; -} - -@media (max-width: 767px) { - .hidden-xs { - display: none !important; - } - tr.hidden-xs { - display: none !important; - } - th.hidden-xs, - td.hidden-xs { - display: none !important; - } -} - -@media (min-width: 768px) and (max-width: 991px) { - .hidden-xs.hidden-sm { - display: none !important; - } - tr.hidden-xs.hidden-sm { - display: none !important; - } - th.hidden-xs.hidden-sm, - td.hidden-xs.hidden-sm { - display: none !important; - } -} - -@media (min-width: 992px) and (max-width: 1199px) { - .hidden-xs.hidden-md { - display: none !important; - } - tr.hidden-xs.hidden-md { - display: none !important; - } - th.hidden-xs.hidden-md, - td.hidden-xs.hidden-md { - display: none !important; - } -} - -@media (min-width: 1200px) { - .hidden-xs.hidden-lg { - display: none !important; - } - tr.hidden-xs.hidden-lg { - display: none !important; - } - th.hidden-xs.hidden-lg, - td.hidden-xs.hidden-lg { - display: none !important; - } -} - -.hidden-sm { - display: block !important; -} - -tr.hidden-sm { - display: table-row !important; -} - -th.hidden-sm, -td.hidden-sm { - display: table-cell !important; -} - -@media (max-width: 767px) { - .hidden-sm.hidden-xs { - display: none !important; - } - tr.hidden-sm.hidden-xs { - display: none !important; - } - th.hidden-sm.hidden-xs, - td.hidden-sm.hidden-xs { - display: none !important; - } -} - -@media (min-width: 768px) and (max-width: 991px) { - .hidden-sm { - display: none !important; - } - tr.hidden-sm { - display: none !important; - } - th.hidden-sm, - td.hidden-sm { - display: none !important; - } -} - -@media (min-width: 992px) and (max-width: 1199px) { - .hidden-sm.hidden-md { - display: none !important; - } - tr.hidden-sm.hidden-md { - display: none !important; - } - th.hidden-sm.hidden-md, - td.hidden-sm.hidden-md { - display: none !important; - } -} - -@media (min-width: 1200px) { - .hidden-sm.hidden-lg { - display: none !important; - } - tr.hidden-sm.hidden-lg { - display: none !important; - } - th.hidden-sm.hidden-lg, - td.hidden-sm.hidden-lg { - display: none !important; - } -} - -.hidden-md { - display: block !important; -} - -tr.hidden-md { - display: table-row !important; -} - -th.hidden-md, -td.hidden-md { - display: table-cell !important; -} - -@media (max-width: 767px) { - .hidden-md.hidden-xs { - display: none !important; - } - tr.hidden-md.hidden-xs { - display: none !important; - } - th.hidden-md.hidden-xs, - td.hidden-md.hidden-xs { - display: none !important; - } -} - -@media (min-width: 768px) and (max-width: 991px) { - .hidden-md.hidden-sm { - display: none !important; - } - tr.hidden-md.hidden-sm { - display: none !important; - } - th.hidden-md.hidden-sm, - td.hidden-md.hidden-sm { - display: none !important; - } -} - -@media (min-width: 992px) and (max-width: 1199px) { - .hidden-md { - display: none !important; - } - tr.hidden-md { - display: none !important; - } - th.hidden-md, - td.hidden-md { - display: none !important; - } -} - -@media (min-width: 1200px) { - .hidden-md.hidden-lg { - display: none !important; - } - tr.hidden-md.hidden-lg { - display: none !important; - } - th.hidden-md.hidden-lg, - td.hidden-md.hidden-lg { - display: none !important; - } -} - -.hidden-lg { - display: block !important; -} - -tr.hidden-lg { - display: table-row !important; -} - -th.hidden-lg, -td.hidden-lg { - display: table-cell !important; -} - -@media (max-width: 767px) { - .hidden-lg.hidden-xs { - display: none !important; - } - tr.hidden-lg.hidden-xs { - display: none !important; - } - th.hidden-lg.hidden-xs, - td.hidden-lg.hidden-xs { - display: none !important; - } -} - -@media (min-width: 768px) and (max-width: 991px) { - .hidden-lg.hidden-sm { - display: none !important; - } - tr.hidden-lg.hidden-sm { - display: none !important; - } - th.hidden-lg.hidden-sm, - td.hidden-lg.hidden-sm { - display: none !important; - } -} - -@media (min-width: 992px) and (max-width: 1199px) { - .hidden-lg.hidden-md { - display: none !important; - } - tr.hidden-lg.hidden-md { - display: none !important; - } - th.hidden-lg.hidden-md, - td.hidden-lg.hidden-md { - display: none !important; - } -} - -@media (min-width: 1200px) { - .hidden-lg { - display: none !important; - } - tr.hidden-lg { - display: none !important; - } - th.hidden-lg, - td.hidden-lg { - display: none !important; - } -} - -.visible-print { - display: none !important; -} - -tr.visible-print { - display: none !important; -} - -th.visible-print, -td.visible-print { - display: none !important; -} - -@media print { - .visible-print { - display: block !important; - } - tr.visible-print { - display: table-row !important; - } - th.visible-print, - td.visible-print { - display: table-cell !important; - } - .hidden-print { - display: none !important; - } - tr.hidden-print { - display: none !important; - } - th.hidden-print, - td.hidden-print { - display: none !important; - } -} \ No newline at end of file diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/.gc3pie/html/bootstrap3/css/bootstrap.min.css b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/.gc3pie/html/bootstrap3/css/bootstrap.min.css deleted file mode 100644 index a553c4f5e08a72a0d475aac9019fa57754abccb3..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/.gc3pie/html/bootstrap3/css/bootstrap.min.css +++ /dev/null @@ -1,9 +0,0 @@ -/*! - * Bootstrap v3.0.0 - * - * Copyright 2013 Twitter, Inc - * Licensed under the Apache License v2.0 - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Designed and built with all the love in the world by @mdo and @fat. - *//*! normalize.css v2.1.0 | 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}audio:not([controls]){display:none;height:0}[hidden]{display:none}html{font-family:sans-serif;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%}body{margin:0}a:focus{outline:thin dotted}a:active,a:hover{outline:0}h1{margin:.67em 0;font-size:2em}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:bold}dfn{font-style:italic}hr{height:0;-moz-box-sizing:content-box;box-sizing:content-box}mark{color:#000;background:#ff0}code,kbd,pre,samp{font-family:monospace,serif;font-size:1em}pre{white-space:pre-wrap}q{quotes:"\201C" "\201D" "\2018" "\2019"}small{font-size:80%}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sup{top:-0.5em}sub{bottom:-0.25em}img{border:0}svg:not(:root){overflow:hidden}figure{margin:0}fieldset{padding:.35em .625em .75em;margin:0 2px;border:1px solid #c0c0c0}legend{padding:0;border:0}button,input,select,textarea{margin:0;font-family:inherit;font-size:100%}button,input{line-height:normal}button,select{text-transform:none}button,html input[type="button"],input[type="reset"],input[type="submit"]{cursor:pointer;-webkit-appearance:button}button[disabled],html input[disabled]{cursor:default}input[type="checkbox"],input[type="radio"]{padding:0;box-sizing:border-box}input[type="search"]{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;-webkit-appearance:textfield}input[type="search"]::-webkit-search-cancel-button,input[type="search"]::-webkit-search-decoration{-webkit-appearance:none}button::-moz-focus-inner,input::-moz-focus-inner{padding:0;border:0}textarea{overflow:auto;vertical-align:top}table{border-collapse:collapse;border-spacing:0}@media print{*{color:#000!important;text-shadow:none!important;background:transparent!important;box-shadow:none!important}a,a:visited{text-decoration:underline}a[href]:after{content:" (" attr(href) ")"}abbr[title]:after{content:" (" attr(title) ")"}.ir a:after,a[href^="javascript:"]:after,a[href^="#"]:after{content:""}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100%!important}@page{margin:2cm .5cm}p,h2,h3{orphans:3;widows:3}h2,h3{page-break-after:avoid}.navbar{display:none}.table td,.table th{background-color:#fff!important}.btn>.caret,.dropup>.btn>.caret{border-top-color:#000!important}.label{border:1px solid #000}.table{border-collapse:collapse!important}.table-bordered th,.table-bordered td{border:1px solid #ddd!important}}*,*:before,*:after{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}html{font-size:62.5%;-webkit-tap-highlight-color:rgba(0,0,0,0)}body{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;line-height:1.428571429;color:#333;background-color:#fff}input,button,select,textarea{font-family:inherit;font-size:inherit;line-height:inherit}button,input,select[multiple],textarea{background-image:none}a{color:#428bca;text-decoration:none}a:hover,a:focus{color:#2a6496;text-decoration:underline}a:focus{outline:thin dotted #333;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}img{vertical-align:middle}.img-responsive{display:block;height:auto;max-width:100%}.img-rounded{border-radius:6px}.img-thumbnail{display:inline-block;height:auto;max-width:100%;padding:4px;line-height:1.428571429;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.img-circle{border-radius:50%}hr{margin-top:20px;margin-bottom:20px;border:0;border-top:1px solid #eee}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0 0 0 0);border:0}p{margin:0 0 10px}.lead{margin-bottom:20px;font-size:16.099999999999998px;font-weight:200;line-height:1.4}@media(min-width:768px){.lead{font-size:21px}}small{font-size:85%}cite{font-style:normal}.text-muted{color:#999}.text-primary{color:#428bca}.text-warning{color:#c09853}.text-danger{color:#b94a48}.text-success{color:#468847}.text-info{color:#3a87ad}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}h1,h2,h3,h4,h5,h6,.h1,.h2,.h3,.h4,.h5,.h6{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-weight:500;line-height:1.1}h1 small,h2 small,h3 small,h4 small,h5 small,h6 small,.h1 small,.h2 small,.h3 small,.h4 small,.h5 small,.h6 small{font-weight:normal;line-height:1;color:#999}h1,h2,h3{margin-top:20px;margin-bottom:10px}h4,h5,h6{margin-top:10px;margin-bottom:10px}h1,.h1{font-size:36px}h2,.h2{font-size:30px}h3,.h3{font-size:24px}h4,.h4{font-size:18px}h5,.h5{font-size:14px}h6,.h6{font-size:12px}h1 small,.h1 small{font-size:24px}h2 small,.h2 small{font-size:18px}h3 small,.h3 small,h4 small,.h4 small{font-size:14px}.page-header{padding-bottom:9px;margin:40px 0 20px;border-bottom:1px solid #eee}ul,ol{margin-top:0;margin-bottom:10px}ul ul,ol ul,ul ol,ol ol{margin-bottom:0}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;list-style:none}.list-inline>li{display:inline-block;padding-right:5px;padding-left:5px}dl{margin-bottom:20px}dt,dd{line-height:1.428571429}dt{font-weight:bold}dd{margin-left:0}@media(min-width:768px){.dl-horizontal dt{float:left;width:160px;overflow:hidden;clear:left;text-align:right;text-overflow:ellipsis;white-space:nowrap}.dl-horizontal dd{margin-left:180px}.dl-horizontal dd:before,.dl-horizontal dd:after{display:table;content:" "}.dl-horizontal dd:after{clear:both}.dl-horizontal dd:before,.dl-horizontal dd:after{display:table;content:" "}.dl-horizontal dd:after{clear:both}}abbr[title],abbr[data-original-title]{cursor:help;border-bottom:1px dotted #999}abbr.initialism{font-size:90%;text-transform:uppercase}blockquote{padding:10px 20px;margin:0 0 20px;border-left:5px solid #eee}blockquote p{font-size:17.5px;font-weight:300;line-height:1.25}blockquote p:last-child{margin-bottom:0}blockquote small{display:block;line-height:1.428571429;color:#999}blockquote small:before{content:'\2014 \00A0'}blockquote.pull-right{padding-right:15px;padding-left:0;border-right:5px solid #eee;border-left:0}blockquote.pull-right p,blockquote.pull-right small{text-align:right}blockquote.pull-right small:before{content:''}blockquote.pull-right small:after{content:'\00A0 \2014'}q:before,q:after,blockquote:before,blockquote:after{content:""}address{display:block;margin-bottom:20px;font-style:normal;line-height:1.428571429}code,pre{font-family:Monaco,Menlo,Consolas,"Courier New",monospace}code{padding:2px 4px;font-size:90%;color:#c7254e;white-space:nowrap;background-color:#f9f2f4;border-radius:4px}pre{display:block;padding:9.5px;margin:0 0 10px;font-size:13px;line-height:1.428571429;color:#333;word-break:break-all;word-wrap:break-word;background-color:#f5f5f5;border:1px solid #ccc;border-radius:4px}pre.prettyprint{margin-bottom:20px}pre code{padding:0;font-size:inherit;color:inherit;white-space:pre-wrap;background-color:transparent;border:0}.pre-scrollable{max-height:340px;overflow-y:scroll}.container{padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}.container:before,.container:after{display:table;content:" "}.container:after{clear:both}.container:before,.container:after{display:table;content:" "}.container:after{clear:both}.row{margin-right:-15px;margin-left:-15px}.row:before,.row:after{display:table;content:" "}.row:after{clear:both}.row:before,.row:after{display:table;content:" "}.row:after{clear:both}.col-xs-1,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9,.col-xs-10,.col-xs-11,.col-xs-12,.col-sm-1,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-sm-10,.col-sm-11,.col-sm-12,.col-md-1,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-md-10,.col-md-11,.col-md-12,.col-lg-1,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-lg-10,.col-lg-11,.col-lg-12{position:relative;min-height:1px;padding-right:15px;padding-left:15px}.col-xs-1,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9,.col-xs-10,.col-xs-11{float:left}.col-xs-1{width:8.333333333333332%}.col-xs-2{width:16.666666666666664%}.col-xs-3{width:25%}.col-xs-4{width:33.33333333333333%}.col-xs-5{width:41.66666666666667%}.col-xs-6{width:50%}.col-xs-7{width:58.333333333333336%}.col-xs-8{width:66.66666666666666%}.col-xs-9{width:75%}.col-xs-10{width:83.33333333333334%}.col-xs-11{width:91.66666666666666%}.col-xs-12{width:100%}@media(min-width:768px){.container{max-width:750px}.col-sm-1,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-sm-10,.col-sm-11{float:left}.col-sm-1{width:8.333333333333332%}.col-sm-2{width:16.666666666666664%}.col-sm-3{width:25%}.col-sm-4{width:33.33333333333333%}.col-sm-5{width:41.66666666666667%}.col-sm-6{width:50%}.col-sm-7{width:58.333333333333336%}.col-sm-8{width:66.66666666666666%}.col-sm-9{width:75%}.col-sm-10{width:83.33333333333334%}.col-sm-11{width:91.66666666666666%}.col-sm-12{width:100%}.col-sm-push-1{left:8.333333333333332%}.col-sm-push-2{left:16.666666666666664%}.col-sm-push-3{left:25%}.col-sm-push-4{left:33.33333333333333%}.col-sm-push-5{left:41.66666666666667%}.col-sm-push-6{left:50%}.col-sm-push-7{left:58.333333333333336%}.col-sm-push-8{left:66.66666666666666%}.col-sm-push-9{left:75%}.col-sm-push-10{left:83.33333333333334%}.col-sm-push-11{left:91.66666666666666%}.col-sm-pull-1{right:8.333333333333332%}.col-sm-pull-2{right:16.666666666666664%}.col-sm-pull-3{right:25%}.col-sm-pull-4{right:33.33333333333333%}.col-sm-pull-5{right:41.66666666666667%}.col-sm-pull-6{right:50%}.col-sm-pull-7{right:58.333333333333336%}.col-sm-pull-8{right:66.66666666666666%}.col-sm-pull-9{right:75%}.col-sm-pull-10{right:83.33333333333334%}.col-sm-pull-11{right:91.66666666666666%}.col-sm-offset-1{margin-left:8.333333333333332%}.col-sm-offset-2{margin-left:16.666666666666664%}.col-sm-offset-3{margin-left:25%}.col-sm-offset-4{margin-left:33.33333333333333%}.col-sm-offset-5{margin-left:41.66666666666667%}.col-sm-offset-6{margin-left:50%}.col-sm-offset-7{margin-left:58.333333333333336%}.col-sm-offset-8{margin-left:66.66666666666666%}.col-sm-offset-9{margin-left:75%}.col-sm-offset-10{margin-left:83.33333333333334%}.col-sm-offset-11{margin-left:91.66666666666666%}}@media(min-width:992px){.container{max-width:970px}.col-md-1,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-md-10,.col-md-11{float:left}.col-md-1{width:8.333333333333332%}.col-md-2{width:16.666666666666664%}.col-md-3{width:25%}.col-md-4{width:33.33333333333333%}.col-md-5{width:41.66666666666667%}.col-md-6{width:50%}.col-md-7{width:58.333333333333336%}.col-md-8{width:66.66666666666666%}.col-md-9{width:75%}.col-md-10{width:83.33333333333334%}.col-md-11{width:91.66666666666666%}.col-md-12{width:100%}.col-md-push-0{left:auto}.col-md-push-1{left:8.333333333333332%}.col-md-push-2{left:16.666666666666664%}.col-md-push-3{left:25%}.col-md-push-4{left:33.33333333333333%}.col-md-push-5{left:41.66666666666667%}.col-md-push-6{left:50%}.col-md-push-7{left:58.333333333333336%}.col-md-push-8{left:66.66666666666666%}.col-md-push-9{left:75%}.col-md-push-10{left:83.33333333333334%}.col-md-push-11{left:91.66666666666666%}.col-md-pull-0{right:auto}.col-md-pull-1{right:8.333333333333332%}.col-md-pull-2{right:16.666666666666664%}.col-md-pull-3{right:25%}.col-md-pull-4{right:33.33333333333333%}.col-md-pull-5{right:41.66666666666667%}.col-md-pull-6{right:50%}.col-md-pull-7{right:58.333333333333336%}.col-md-pull-8{right:66.66666666666666%}.col-md-pull-9{right:75%}.col-md-pull-10{right:83.33333333333334%}.col-md-pull-11{right:91.66666666666666%}.col-md-offset-0{margin-left:0}.col-md-offset-1{margin-left:8.333333333333332%}.col-md-offset-2{margin-left:16.666666666666664%}.col-md-offset-3{margin-left:25%}.col-md-offset-4{margin-left:33.33333333333333%}.col-md-offset-5{margin-left:41.66666666666667%}.col-md-offset-6{margin-left:50%}.col-md-offset-7{margin-left:58.333333333333336%}.col-md-offset-8{margin-left:66.66666666666666%}.col-md-offset-9{margin-left:75%}.col-md-offset-10{margin-left:83.33333333333334%}.col-md-offset-11{margin-left:91.66666666666666%}}@media(min-width:1200px){.container{max-width:1170px}.col-lg-1,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-lg-10,.col-lg-11{float:left}.col-lg-1{width:8.333333333333332%}.col-lg-2{width:16.666666666666664%}.col-lg-3{width:25%}.col-lg-4{width:33.33333333333333%}.col-lg-5{width:41.66666666666667%}.col-lg-6{width:50%}.col-lg-7{width:58.333333333333336%}.col-lg-8{width:66.66666666666666%}.col-lg-9{width:75%}.col-lg-10{width:83.33333333333334%}.col-lg-11{width:91.66666666666666%}.col-lg-12{width:100%}.col-lg-push-0{left:auto}.col-lg-push-1{left:8.333333333333332%}.col-lg-push-2{left:16.666666666666664%}.col-lg-push-3{left:25%}.col-lg-push-4{left:33.33333333333333%}.col-lg-push-5{left:41.66666666666667%}.col-lg-push-6{left:50%}.col-lg-push-7{left:58.333333333333336%}.col-lg-push-8{left:66.66666666666666%}.col-lg-push-9{left:75%}.col-lg-push-10{left:83.33333333333334%}.col-lg-push-11{left:91.66666666666666%}.col-lg-pull-0{right:auto}.col-lg-pull-1{right:8.333333333333332%}.col-lg-pull-2{right:16.666666666666664%}.col-lg-pull-3{right:25%}.col-lg-pull-4{right:33.33333333333333%}.col-lg-pull-5{right:41.66666666666667%}.col-lg-pull-6{right:50%}.col-lg-pull-7{right:58.333333333333336%}.col-lg-pull-8{right:66.66666666666666%}.col-lg-pull-9{right:75%}.col-lg-pull-10{right:83.33333333333334%}.col-lg-pull-11{right:91.66666666666666%}.col-lg-offset-0{margin-left:0}.col-lg-offset-1{margin-left:8.333333333333332%}.col-lg-offset-2{margin-left:16.666666666666664%}.col-lg-offset-3{margin-left:25%}.col-lg-offset-4{margin-left:33.33333333333333%}.col-lg-offset-5{margin-left:41.66666666666667%}.col-lg-offset-6{margin-left:50%}.col-lg-offset-7{margin-left:58.333333333333336%}.col-lg-offset-8{margin-left:66.66666666666666%}.col-lg-offset-9{margin-left:75%}.col-lg-offset-10{margin-left:83.33333333333334%}.col-lg-offset-11{margin-left:91.66666666666666%}}table{max-width:100%;background-color:transparent}th{text-align:left}.table{width:100%;margin-bottom:20px}.table thead>tr>th,.table tbody>tr>th,.table tfoot>tr>th,.table thead>tr>td,.table tbody>tr>td,.table tfoot>tr>td{padding:8px;line-height:1.428571429;vertical-align:top;border-top:1px solid #ddd}.table thead>tr>th{vertical-align:bottom;border-bottom:2px solid #ddd}.table caption+thead tr:first-child th,.table colgroup+thead tr:first-child th,.table thead:first-child tr:first-child th,.table caption+thead tr:first-child td,.table colgroup+thead tr:first-child td,.table thead:first-child tr:first-child td{border-top:0}.table tbody+tbody{border-top:2px solid #ddd}.table .table{background-color:#fff}.table-condensed thead>tr>th,.table-condensed tbody>tr>th,.table-condensed tfoot>tr>th,.table-condensed thead>tr>td,.table-condensed tbody>tr>td,.table-condensed tfoot>tr>td{padding:5px}.table-bordered{border:1px solid #ddd}.table-bordered>thead>tr>th,.table-bordered>tbody>tr>th,.table-bordered>tfoot>tr>th,.table-bordered>thead>tr>td,.table-bordered>tbody>tr>td,.table-bordered>tfoot>tr>td{border:1px solid #ddd}.table-bordered>thead>tr>th,.table-bordered>thead>tr>td{border-bottom-width:2px}.table-striped>tbody>tr:nth-child(odd)>td,.table-striped>tbody>tr:nth-child(odd)>th{background-color:#f9f9f9}.table-hover>tbody>tr:hover>td,.table-hover>tbody>tr:hover>th{background-color:#f5f5f5}table col[class*="col-"]{display:table-column;float:none}table td[class*="col-"],table th[class*="col-"]{display:table-cell;float:none}.table>thead>tr>td.active,.table>tbody>tr>td.active,.table>tfoot>tr>td.active,.table>thead>tr>th.active,.table>tbody>tr>th.active,.table>tfoot>tr>th.active,.table>thead>tr.active>td,.table>tbody>tr.active>td,.table>tfoot>tr.active>td,.table>thead>tr.active>th,.table>tbody>tr.active>th,.table>tfoot>tr.active>th{background-color:#f5f5f5}.table>thead>tr>td.success,.table>tbody>tr>td.success,.table>tfoot>tr>td.success,.table>thead>tr>th.success,.table>tbody>tr>th.success,.table>tfoot>tr>th.success,.table>thead>tr.success>td,.table>tbody>tr.success>td,.table>tfoot>tr.success>td,.table>thead>tr.success>th,.table>tbody>tr.success>th,.table>tfoot>tr.success>th{background-color:#dff0d8;border-color:#d6e9c6}.table-hover>tbody>tr>td.success:hover,.table-hover>tbody>tr>th.success:hover,.table-hover>tbody>tr.success:hover>td{background-color:#d0e9c6;border-color:#c9e2b3}.table>thead>tr>td.danger,.table>tbody>tr>td.danger,.table>tfoot>tr>td.danger,.table>thead>tr>th.danger,.table>tbody>tr>th.danger,.table>tfoot>tr>th.danger,.table>thead>tr.danger>td,.table>tbody>tr.danger>td,.table>tfoot>tr.danger>td,.table>thead>tr.danger>th,.table>tbody>tr.danger>th,.table>tfoot>tr.danger>th{background-color:#f2dede;border-color:#eed3d7}.table-hover>tbody>tr>td.danger:hover,.table-hover>tbody>tr>th.danger:hover,.table-hover>tbody>tr.danger:hover>td{background-color:#ebcccc;border-color:#e6c1c7}.table>thead>tr>td.warning,.table>tbody>tr>td.warning,.table>tfoot>tr>td.warning,.table>thead>tr>th.warning,.table>tbody>tr>th.warning,.table>tfoot>tr>th.warning,.table>thead>tr.warning>td,.table>tbody>tr.warning>td,.table>tfoot>tr.warning>td,.table>thead>tr.warning>th,.table>tbody>tr.warning>th,.table>tfoot>tr.warning>th{background-color:#fcf8e3;border-color:#fbeed5}.table-hover>tbody>tr>td.warning:hover,.table-hover>tbody>tr>th.warning:hover,.table-hover>tbody>tr.warning:hover>td{background-color:#faf2cc;border-color:#f8e5be}@media(max-width:768px){.table-responsive{width:100%;margin-bottom:15px;overflow-x:scroll;overflow-y:hidden;border:1px solid #ddd}.table-responsive>.table{margin-bottom:0;background-color:#fff}.table-responsive>.table>thead>tr>th,.table-responsive>.table>tbody>tr>th,.table-responsive>.table>tfoot>tr>th,.table-responsive>.table>thead>tr>td,.table-responsive>.table>tbody>tr>td,.table-responsive>.table>tfoot>tr>td{white-space:nowrap}.table-responsive>.table-bordered{border:0}.table-responsive>.table-bordered>thead>tr>th:first-child,.table-responsive>.table-bordered>tbody>tr>th:first-child,.table-responsive>.table-bordered>tfoot>tr>th:first-child,.table-responsive>.table-bordered>thead>tr>td:first-child,.table-responsive>.table-bordered>tbody>tr>td:first-child,.table-responsive>.table-bordered>tfoot>tr>td:first-child{border-left:0}.table-responsive>.table-bordered>thead>tr>th:last-child,.table-responsive>.table-bordered>tbody>tr>th:last-child,.table-responsive>.table-bordered>tfoot>tr>th:last-child,.table-responsive>.table-bordered>thead>tr>td:last-child,.table-responsive>.table-bordered>tbody>tr>td:last-child,.table-responsive>.table-bordered>tfoot>tr>td:last-child{border-right:0}.table-responsive>.table-bordered>thead>tr:last-child>th,.table-responsive>.table-bordered>tbody>tr:last-child>th,.table-responsive>.table-bordered>tfoot>tr:last-child>th,.table-responsive>.table-bordered>thead>tr:last-child>td,.table-responsive>.table-bordered>tbody>tr:last-child>td,.table-responsive>.table-bordered>tfoot>tr:last-child>td{border-bottom:0}}fieldset{padding:0;margin:0;border:0}legend{display:block;width:100%;padding:0;margin-bottom:20px;font-size:21px;line-height:inherit;color:#333;border:0;border-bottom:1px solid #e5e5e5}label{display:inline-block;margin-bottom:5px;font-weight:bold}input[type="search"]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}input[type="radio"],input[type="checkbox"]{margin:4px 0 0;margin-top:1px \9;line-height:normal}input[type="file"]{display:block}select[multiple],select[size]{height:auto}select optgroup{font-family:inherit;font-size:inherit;font-style:inherit}input[type="file"]:focus,input[type="radio"]:focus,input[type="checkbox"]:focus{outline:thin dotted #333;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}input[type="number"]::-webkit-outer-spin-button,input[type="number"]::-webkit-inner-spin-button{height:auto}.form-control:-moz-placeholder{color:#999}.form-control::-moz-placeholder{color:#999}.form-control:-ms-input-placeholder{color:#999}.form-control::-webkit-input-placeholder{color:#999}.form-control{display:block;width:100%;height:34px;padding:6px 12px;font-size:14px;line-height:1.428571429;color:#555;vertical-align:middle;background-color:#fff;border:1px solid #ccc;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-webkit-transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s;transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s}.form-control:focus{border-color:#66afe9;outline:0;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 8px rgba(102,175,233,0.6);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 8px rgba(102,175,233,0.6)}.form-control[disabled],.form-control[readonly],fieldset[disabled] .form-control{cursor:not-allowed;background-color:#eee}textarea.form-control{height:auto}.form-group{margin-bottom:15px}.radio,.checkbox{display:block;min-height:20px;padding-left:20px;margin-top:10px;margin-bottom:10px;vertical-align:middle}.radio label,.checkbox label{display:inline;margin-bottom:0;font-weight:normal;cursor:pointer}.radio input[type="radio"],.radio-inline input[type="radio"],.checkbox input[type="checkbox"],.checkbox-inline input[type="checkbox"]{float:left;margin-left:-20px}.radio+.radio,.checkbox+.checkbox{margin-top:-5px}.radio-inline,.checkbox-inline{display:inline-block;padding-left:20px;margin-bottom:0;font-weight:normal;vertical-align:middle;cursor:pointer}.radio-inline+.radio-inline,.checkbox-inline+.checkbox-inline{margin-top:0;margin-left:10px}input[type="radio"][disabled],input[type="checkbox"][disabled],.radio[disabled],.radio-inline[disabled],.checkbox[disabled],.checkbox-inline[disabled],fieldset[disabled] input[type="radio"],fieldset[disabled] input[type="checkbox"],fieldset[disabled] .radio,fieldset[disabled] .radio-inline,fieldset[disabled] .checkbox,fieldset[disabled] .checkbox-inline{cursor:not-allowed}.input-sm{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-sm{height:30px;line-height:30px}textarea.input-sm{height:auto}.input-lg{height:45px;padding:10px 16px;font-size:18px;line-height:1.33;border-radius:6px}select.input-lg{height:45px;line-height:45px}textarea.input-lg{height:auto}.has-warning .help-block,.has-warning .control-label{color:#c09853}.has-warning .form-control{border-color:#c09853;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.has-warning .form-control:focus{border-color:#a47e3c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #dbc59e;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #dbc59e}.has-warning .input-group-addon{color:#c09853;background-color:#fcf8e3;border-color:#c09853}.has-error .help-block,.has-error .control-label{color:#b94a48}.has-error .form-control{border-color:#b94a48;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.has-error .form-control:focus{border-color:#953b39;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #d59392;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #d59392}.has-error .input-group-addon{color:#b94a48;background-color:#f2dede;border-color:#b94a48}.has-success .help-block,.has-success .control-label{color:#468847}.has-success .form-control{border-color:#468847;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.has-success .form-control:focus{border-color:#356635;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #7aba7b;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #7aba7b}.has-success .input-group-addon{color:#468847;background-color:#dff0d8;border-color:#468847}.form-control-static{padding-top:7px;margin-bottom:0}.help-block{display:block;margin-top:5px;margin-bottom:10px;color:#737373}@media(min-width:768px){.form-inline .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.form-inline .form-control{display:inline-block}.form-inline .radio,.form-inline .checkbox{display:inline-block;padding-left:0;margin-top:0;margin-bottom:0}.form-inline .radio input[type="radio"],.form-inline .checkbox input[type="checkbox"]{float:none;margin-left:0}}.form-horizontal .control-label,.form-horizontal .radio,.form-horizontal .checkbox,.form-horizontal .radio-inline,.form-horizontal .checkbox-inline{padding-top:7px;margin-top:0;margin-bottom:0}.form-horizontal .form-group{margin-right:-15px;margin-left:-15px}.form-horizontal .form-group:before,.form-horizontal .form-group:after{display:table;content:" "}.form-horizontal .form-group:after{clear:both}.form-horizontal .form-group:before,.form-horizontal .form-group:after{display:table;content:" "}.form-horizontal .form-group:after{clear:both}@media(min-width:768px){.form-horizontal .control-label{text-align:right}}.btn{display:inline-block;padding:6px 12px;margin-bottom:0;font-size:14px;font-weight:normal;line-height:1.428571429;text-align:center;white-space:nowrap;vertical-align:middle;cursor:pointer;border:1px solid transparent;border-radius:4px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;-o-user-select:none;user-select:none}.btn:focus{outline:thin dotted #333;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.btn:hover,.btn:focus{color:#333;text-decoration:none}.btn:active,.btn.active{background-image:none;outline:0;-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,0.125);box-shadow:inset 0 3px 5px rgba(0,0,0,0.125)}.btn.disabled,.btn[disabled],fieldset[disabled] .btn{pointer-events:none;cursor:not-allowed;opacity:.65;filter:alpha(opacity=65);-webkit-box-shadow:none;box-shadow:none}.btn-default{color:#333;background-color:#fff;border-color:#ccc}.btn-default:hover,.btn-default:focus,.btn-default:active,.btn-default.active,.open .dropdown-toggle.btn-default{color:#333;background-color:#ebebeb;border-color:#adadad}.btn-default:active,.btn-default.active,.open .dropdown-toggle.btn-default{background-image:none}.btn-default.disabled,.btn-default[disabled],fieldset[disabled] .btn-default,.btn-default.disabled:hover,.btn-default[disabled]:hover,fieldset[disabled] .btn-default:hover,.btn-default.disabled:focus,.btn-default[disabled]:focus,fieldset[disabled] .btn-default:focus,.btn-default.disabled:active,.btn-default[disabled]:active,fieldset[disabled] .btn-default:active,.btn-default.disabled.active,.btn-default[disabled].active,fieldset[disabled] .btn-default.active{background-color:#fff;border-color:#ccc}.btn-primary{color:#fff;background-color:#428bca;border-color:#357ebd}.btn-primary:hover,.btn-primary:focus,.btn-primary:active,.btn-primary.active,.open .dropdown-toggle.btn-primary{color:#fff;background-color:#3276b1;border-color:#285e8e}.btn-primary:active,.btn-primary.active,.open .dropdown-toggle.btn-primary{background-image:none}.btn-primary.disabled,.btn-primary[disabled],fieldset[disabled] .btn-primary,.btn-primary.disabled:hover,.btn-primary[disabled]:hover,fieldset[disabled] .btn-primary:hover,.btn-primary.disabled:focus,.btn-primary[disabled]:focus,fieldset[disabled] .btn-primary:focus,.btn-primary.disabled:active,.btn-primary[disabled]:active,fieldset[disabled] .btn-primary:active,.btn-primary.disabled.active,.btn-primary[disabled].active,fieldset[disabled] .btn-primary.active{background-color:#428bca;border-color:#357ebd}.btn-warning{color:#fff;background-color:#f0ad4e;border-color:#eea236}.btn-warning:hover,.btn-warning:focus,.btn-warning:active,.btn-warning.active,.open .dropdown-toggle.btn-warning{color:#fff;background-color:#ed9c28;border-color:#d58512}.btn-warning:active,.btn-warning.active,.open .dropdown-toggle.btn-warning{background-image:none}.btn-warning.disabled,.btn-warning[disabled],fieldset[disabled] .btn-warning,.btn-warning.disabled:hover,.btn-warning[disabled]:hover,fieldset[disabled] .btn-warning:hover,.btn-warning.disabled:focus,.btn-warning[disabled]:focus,fieldset[disabled] .btn-warning:focus,.btn-warning.disabled:active,.btn-warning[disabled]:active,fieldset[disabled] .btn-warning:active,.btn-warning.disabled.active,.btn-warning[disabled].active,fieldset[disabled] .btn-warning.active{background-color:#f0ad4e;border-color:#eea236}.btn-danger{color:#fff;background-color:#d9534f;border-color:#d43f3a}.btn-danger:hover,.btn-danger:focus,.btn-danger:active,.btn-danger.active,.open .dropdown-toggle.btn-danger{color:#fff;background-color:#d2322d;border-color:#ac2925}.btn-danger:active,.btn-danger.active,.open .dropdown-toggle.btn-danger{background-image:none}.btn-danger.disabled,.btn-danger[disabled],fieldset[disabled] .btn-danger,.btn-danger.disabled:hover,.btn-danger[disabled]:hover,fieldset[disabled] .btn-danger:hover,.btn-danger.disabled:focus,.btn-danger[disabled]:focus,fieldset[disabled] .btn-danger:focus,.btn-danger.disabled:active,.btn-danger[disabled]:active,fieldset[disabled] .btn-danger:active,.btn-danger.disabled.active,.btn-danger[disabled].active,fieldset[disabled] .btn-danger.active{background-color:#d9534f;border-color:#d43f3a}.btn-success{color:#fff;background-color:#5cb85c;border-color:#4cae4c}.btn-success:hover,.btn-success:focus,.btn-success:active,.btn-success.active,.open .dropdown-toggle.btn-success{color:#fff;background-color:#47a447;border-color:#398439}.btn-success:active,.btn-success.active,.open .dropdown-toggle.btn-success{background-image:none}.btn-success.disabled,.btn-success[disabled],fieldset[disabled] .btn-success,.btn-success.disabled:hover,.btn-success[disabled]:hover,fieldset[disabled] .btn-success:hover,.btn-success.disabled:focus,.btn-success[disabled]:focus,fieldset[disabled] .btn-success:focus,.btn-success.disabled:active,.btn-success[disabled]:active,fieldset[disabled] .btn-success:active,.btn-success.disabled.active,.btn-success[disabled].active,fieldset[disabled] .btn-success.active{background-color:#5cb85c;border-color:#4cae4c}.btn-info{color:#fff;background-color:#5bc0de;border-color:#46b8da}.btn-info:hover,.btn-info:focus,.btn-info:active,.btn-info.active,.open .dropdown-toggle.btn-info{color:#fff;background-color:#39b3d7;border-color:#269abc}.btn-info:active,.btn-info.active,.open .dropdown-toggle.btn-info{background-image:none}.btn-info.disabled,.btn-info[disabled],fieldset[disabled] .btn-info,.btn-info.disabled:hover,.btn-info[disabled]:hover,fieldset[disabled] .btn-info:hover,.btn-info.disabled:focus,.btn-info[disabled]:focus,fieldset[disabled] .btn-info:focus,.btn-info.disabled:active,.btn-info[disabled]:active,fieldset[disabled] .btn-info:active,.btn-info.disabled.active,.btn-info[disabled].active,fieldset[disabled] .btn-info.active{background-color:#5bc0de;border-color:#46b8da}.btn-link{font-weight:normal;color:#428bca;cursor:pointer;border-radius:0}.btn-link,.btn-link:active,.btn-link[disabled],fieldset[disabled] .btn-link{background-color:transparent;-webkit-box-shadow:none;box-shadow:none}.btn-link,.btn-link:hover,.btn-link:focus,.btn-link:active{border-color:transparent}.btn-link:hover,.btn-link:focus{color:#2a6496;text-decoration:underline;background-color:transparent}.btn-link[disabled]:hover,fieldset[disabled] .btn-link:hover,.btn-link[disabled]:focus,fieldset[disabled] .btn-link:focus{color:#999;text-decoration:none}.btn-lg{padding:10px 16px;font-size:18px;line-height:1.33;border-radius:6px}.btn-sm,.btn-xs{padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.btn-xs{padding:1px 5px}.btn-block{display:block;width:100%;padding-right:0;padding-left:0}.btn-block+.btn-block{margin-top:5px}input[type="submit"].btn-block,input[type="reset"].btn-block,input[type="button"].btn-block{width:100%}.fade{opacity:0;-webkit-transition:opacity .15s linear;transition:opacity .15s linear}.fade.in{opacity:1}.collapse{display:none}.collapse.in{display:block}.collapsing{position:relative;height:0;overflow:hidden;-webkit-transition:height .35s ease;transition:height .35s ease}@font-face{font-family:'Glyphicons Halflings';src:url('../fonts/glyphicons-halflings-regular.eot');src:url('../fonts/glyphicons-halflings-regular.eot?#iefix') format('embedded-opentype'),url('../fonts/glyphicons-halflings-regular.woff') format('woff'),url('../fonts/glyphicons-halflings-regular.ttf') format('truetype'),url('../fonts/glyphicons-halflings-regular.svg#glyphicons-halflingsregular') format('svg')}.glyphicon{position:relative;top:1px;display:inline-block;font-family:'Glyphicons Halflings';-webkit-font-smoothing:antialiased;font-style:normal;font-weight:normal;line-height:1}.glyphicon-asterisk:before{content:"\2a"}.glyphicon-plus:before{content:"\2b"}.glyphicon-euro:before{content:"\20ac"}.glyphicon-minus:before{content:"\2212"}.glyphicon-cloud:before{content:"\2601"}.glyphicon-envelope:before{content:"\2709"}.glyphicon-pencil:before{content:"\270f"}.glyphicon-glass:before{content:"\e001"}.glyphicon-music:before{content:"\e002"}.glyphicon-search:before{content:"\e003"}.glyphicon-heart:before{content:"\e005"}.glyphicon-star:before{content:"\e006"}.glyphicon-star-empty:before{content:"\e007"}.glyphicon-user:before{content:"\e008"}.glyphicon-film:before{content:"\e009"}.glyphicon-th-large:before{content:"\e010"}.glyphicon-th:before{content:"\e011"}.glyphicon-th-list:before{content:"\e012"}.glyphicon-ok:before{content:"\e013"}.glyphicon-remove:before{content:"\e014"}.glyphicon-zoom-in:before{content:"\e015"}.glyphicon-zoom-out:before{content:"\e016"}.glyphicon-off:before{content:"\e017"}.glyphicon-signal:before{content:"\e018"}.glyphicon-cog:before{content:"\e019"}.glyphicon-trash:before{content:"\e020"}.glyphicon-home:before{content:"\e021"}.glyphicon-file:before{content:"\e022"}.glyphicon-time:before{content:"\e023"}.glyphicon-road:before{content:"\e024"}.glyphicon-download-alt:before{content:"\e025"}.glyphicon-download:before{content:"\e026"}.glyphicon-upload:before{content:"\e027"}.glyphicon-inbox:before{content:"\e028"}.glyphicon-play-circle:before{content:"\e029"}.glyphicon-repeat:before{content:"\e030"}.glyphicon-refresh:before{content:"\e031"}.glyphicon-list-alt:before{content:"\e032"}.glyphicon-flag:before{content:"\e034"}.glyphicon-headphones:before{content:"\e035"}.glyphicon-volume-off:before{content:"\e036"}.glyphicon-volume-down:before{content:"\e037"}.glyphicon-volume-up:before{content:"\e038"}.glyphicon-qrcode:before{content:"\e039"}.glyphicon-barcode:before{content:"\e040"}.glyphicon-tag:before{content:"\e041"}.glyphicon-tags:before{content:"\e042"}.glyphicon-book:before{content:"\e043"}.glyphicon-print:before{content:"\e045"}.glyphicon-font:before{content:"\e047"}.glyphicon-bold:before{content:"\e048"}.glyphicon-italic:before{content:"\e049"}.glyphicon-text-height:before{content:"\e050"}.glyphicon-text-width:before{content:"\e051"}.glyphicon-align-left:before{content:"\e052"}.glyphicon-align-center:before{content:"\e053"}.glyphicon-align-right:before{content:"\e054"}.glyphicon-align-justify:before{content:"\e055"}.glyphicon-list:before{content:"\e056"}.glyphicon-indent-left:before{content:"\e057"}.glyphicon-indent-right:before{content:"\e058"}.glyphicon-facetime-video:before{content:"\e059"}.glyphicon-picture:before{content:"\e060"}.glyphicon-map-marker:before{content:"\e062"}.glyphicon-adjust:before{content:"\e063"}.glyphicon-tint:before{content:"\e064"}.glyphicon-edit:before{content:"\e065"}.glyphicon-share:before{content:"\e066"}.glyphicon-check:before{content:"\e067"}.glyphicon-move:before{content:"\e068"}.glyphicon-step-backward:before{content:"\e069"}.glyphicon-fast-backward:before{content:"\e070"}.glyphicon-backward:before{content:"\e071"}.glyphicon-play:before{content:"\e072"}.glyphicon-pause:before{content:"\e073"}.glyphicon-stop:before{content:"\e074"}.glyphicon-forward:before{content:"\e075"}.glyphicon-fast-forward:before{content:"\e076"}.glyphicon-step-forward:before{content:"\e077"}.glyphicon-eject:before{content:"\e078"}.glyphicon-chevron-left:before{content:"\e079"}.glyphicon-chevron-right:before{content:"\e080"}.glyphicon-plus-sign:before{content:"\e081"}.glyphicon-minus-sign:before{content:"\e082"}.glyphicon-remove-sign:before{content:"\e083"}.glyphicon-ok-sign:before{content:"\e084"}.glyphicon-question-sign:before{content:"\e085"}.glyphicon-info-sign:before{content:"\e086"}.glyphicon-screenshot:before{content:"\e087"}.glyphicon-remove-circle:before{content:"\e088"}.glyphicon-ok-circle:before{content:"\e089"}.glyphicon-ban-circle:before{content:"\e090"}.glyphicon-arrow-left:before{content:"\e091"}.glyphicon-arrow-right:before{content:"\e092"}.glyphicon-arrow-up:before{content:"\e093"}.glyphicon-arrow-down:before{content:"\e094"}.glyphicon-share-alt:before{content:"\e095"}.glyphicon-resize-full:before{content:"\e096"}.glyphicon-resize-small:before{content:"\e097"}.glyphicon-exclamation-sign:before{content:"\e101"}.glyphicon-gift:before{content:"\e102"}.glyphicon-leaf:before{content:"\e103"}.glyphicon-eye-open:before{content:"\e105"}.glyphicon-eye-close:before{content:"\e106"}.glyphicon-warning-sign:before{content:"\e107"}.glyphicon-plane:before{content:"\e108"}.glyphicon-random:before{content:"\e110"}.glyphicon-comment:before{content:"\e111"}.glyphicon-magnet:before{content:"\e112"}.glyphicon-chevron-up:before{content:"\e113"}.glyphicon-chevron-down:before{content:"\e114"}.glyphicon-retweet:before{content:"\e115"}.glyphicon-shopping-cart:before{content:"\e116"}.glyphicon-folder-close:before{content:"\e117"}.glyphicon-folder-open:before{content:"\e118"}.glyphicon-resize-vertical:before{content:"\e119"}.glyphicon-resize-horizontal:before{content:"\e120"}.glyphicon-hdd:before{content:"\e121"}.glyphicon-bullhorn:before{content:"\e122"}.glyphicon-certificate:before{content:"\e124"}.glyphicon-thumbs-up:before{content:"\e125"}.glyphicon-thumbs-down:before{content:"\e126"}.glyphicon-hand-right:before{content:"\e127"}.glyphicon-hand-left:before{content:"\e128"}.glyphicon-hand-up:before{content:"\e129"}.glyphicon-hand-down:before{content:"\e130"}.glyphicon-circle-arrow-right:before{content:"\e131"}.glyphicon-circle-arrow-left:before{content:"\e132"}.glyphicon-circle-arrow-up:before{content:"\e133"}.glyphicon-circle-arrow-down:before{content:"\e134"}.glyphicon-globe:before{content:"\e135"}.glyphicon-tasks:before{content:"\e137"}.glyphicon-filter:before{content:"\e138"}.glyphicon-fullscreen:before{content:"\e140"}.glyphicon-dashboard:before{content:"\e141"}.glyphicon-heart-empty:before{content:"\e143"}.glyphicon-link:before{content:"\e144"}.glyphicon-phone:before{content:"\e145"}.glyphicon-usd:before{content:"\e148"}.glyphicon-gbp:before{content:"\e149"}.glyphicon-sort:before{content:"\e150"}.glyphicon-sort-by-alphabet:before{content:"\e151"}.glyphicon-sort-by-alphabet-alt:before{content:"\e152"}.glyphicon-sort-by-order:before{content:"\e153"}.glyphicon-sort-by-order-alt:before{content:"\e154"}.glyphicon-sort-by-attributes:before{content:"\e155"}.glyphicon-sort-by-attributes-alt:before{content:"\e156"}.glyphicon-unchecked:before{content:"\e157"}.glyphicon-expand:before{content:"\e158"}.glyphicon-collapse-down:before{content:"\e159"}.glyphicon-collapse-up:before{content:"\e160"}.glyphicon-log-in:before{content:"\e161"}.glyphicon-flash:before{content:"\e162"}.glyphicon-log-out:before{content:"\e163"}.glyphicon-new-window:before{content:"\e164"}.glyphicon-record:before{content:"\e165"}.glyphicon-save:before{content:"\e166"}.glyphicon-open:before{content:"\e167"}.glyphicon-saved:before{content:"\e168"}.glyphicon-import:before{content:"\e169"}.glyphicon-export:before{content:"\e170"}.glyphicon-send:before{content:"\e171"}.glyphicon-floppy-disk:before{content:"\e172"}.glyphicon-floppy-saved:before{content:"\e173"}.glyphicon-floppy-remove:before{content:"\e174"}.glyphicon-floppy-save:before{content:"\e175"}.glyphicon-floppy-open:before{content:"\e176"}.glyphicon-credit-card:before{content:"\e177"}.glyphicon-transfer:before{content:"\e178"}.glyphicon-cutlery:before{content:"\e179"}.glyphicon-header:before{content:"\e180"}.glyphicon-compressed:before{content:"\e181"}.glyphicon-earphone:before{content:"\e182"}.glyphicon-phone-alt:before{content:"\e183"}.glyphicon-tower:before{content:"\e184"}.glyphicon-stats:before{content:"\e185"}.glyphicon-sd-video:before{content:"\e186"}.glyphicon-hd-video:before{content:"\e187"}.glyphicon-subtitles:before{content:"\e188"}.glyphicon-sound-stereo:before{content:"\e189"}.glyphicon-sound-dolby:before{content:"\e190"}.glyphicon-sound-5-1:before{content:"\e191"}.glyphicon-sound-6-1:before{content:"\e192"}.glyphicon-sound-7-1:before{content:"\e193"}.glyphicon-copyright-mark:before{content:"\e194"}.glyphicon-registration-mark:before{content:"\e195"}.glyphicon-cloud-download:before{content:"\e197"}.glyphicon-cloud-upload:before{content:"\e198"}.glyphicon-tree-conifer:before{content:"\e199"}.glyphicon-tree-deciduous:before{content:"\e200"}.glyphicon-briefcase:before{content:"\1f4bc"}.glyphicon-calendar:before{content:"\1f4c5"}.glyphicon-pushpin:before{content:"\1f4cc"}.glyphicon-paperclip:before{content:"\1f4ce"}.glyphicon-camera:before{content:"\1f4f7"}.glyphicon-lock:before{content:"\1f512"}.glyphicon-bell:before{content:"\1f514"}.glyphicon-bookmark:before{content:"\1f516"}.glyphicon-fire:before{content:"\1f525"}.glyphicon-wrench:before{content:"\1f527"}.caret{display:inline-block;width:0;height:0;margin-left:2px;vertical-align:middle;border-top:4px solid #000;border-right:4px solid transparent;border-bottom:0 dotted;border-left:4px solid transparent;content:""}.dropdown{position:relative}.dropdown-toggle:focus{outline:0}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:160px;padding:5px 0;margin:2px 0 0;font-size:14px;list-style:none;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.15);border-radius:4px;-webkit-box-shadow:0 6px 12px rgba(0,0,0,0.175);box-shadow:0 6px 12px rgba(0,0,0,0.175);background-clip:padding-box}.dropdown-menu.pull-right{right:0;left:auto}.dropdown-menu .divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.dropdown-menu>li>a{display:block;padding:3px 20px;clear:both;font-weight:normal;line-height:1.428571429;color:#333;white-space:nowrap}.dropdown-menu>li>a:hover,.dropdown-menu>li>a:focus{color:#fff;text-decoration:none;background-color:#428bca}.dropdown-menu>.active>a,.dropdown-menu>.active>a:hover,.dropdown-menu>.active>a:focus{color:#fff;text-decoration:none;background-color:#428bca;outline:0}.dropdown-menu>.disabled>a,.dropdown-menu>.disabled>a:hover,.dropdown-menu>.disabled>a:focus{color:#999}.dropdown-menu>.disabled>a:hover,.dropdown-menu>.disabled>a:focus{text-decoration:none;cursor:not-allowed;background-color:transparent;background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.open>.dropdown-menu{display:block}.open>a{outline:0}.dropdown-header{display:block;padding:3px 20px;font-size:12px;line-height:1.428571429;color:#999}.dropdown-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:990}.pull-right>.dropdown-menu{right:0;left:auto}.dropup .caret,.navbar-fixed-bottom .dropdown .caret{border-top:0 dotted;border-bottom:4px solid #000;content:""}.dropup .dropdown-menu,.navbar-fixed-bottom .dropdown .dropdown-menu{top:auto;bottom:100%;margin-bottom:1px}@media(min-width:768px){.navbar-right .dropdown-menu{right:0;left:auto}}.btn-default .caret{border-top-color:#333}.btn-primary .caret,.btn-success .caret,.btn-warning .caret,.btn-danger .caret,.btn-info .caret{border-top-color:#fff}.dropup .btn-default .caret{border-bottom-color:#333}.dropup .btn-primary .caret,.dropup .btn-success .caret,.dropup .btn-warning .caret,.dropup .btn-danger .caret,.dropup .btn-info .caret{border-bottom-color:#fff}.btn-group,.btn-group-vertical{position:relative;display:inline-block;vertical-align:middle}.btn-group>.btn,.btn-group-vertical>.btn{position:relative;float:left}.btn-group>.btn:hover,.btn-group-vertical>.btn:hover,.btn-group>.btn:focus,.btn-group-vertical>.btn:focus,.btn-group>.btn:active,.btn-group-vertical>.btn:active,.btn-group>.btn.active,.btn-group-vertical>.btn.active{z-index:2}.btn-group>.btn:focus,.btn-group-vertical>.btn:focus{outline:0}.btn-group .btn+.btn,.btn-group .btn+.btn-group,.btn-group .btn-group+.btn,.btn-group .btn-group+.btn-group{margin-left:-1px}.btn-toolbar:before,.btn-toolbar:after{display:table;content:" "}.btn-toolbar:after{clear:both}.btn-toolbar:before,.btn-toolbar:after{display:table;content:" "}.btn-toolbar:after{clear:both}.btn-toolbar .btn-group{float:left}.btn-toolbar>.btn+.btn,.btn-toolbar>.btn-group+.btn,.btn-toolbar>.btn+.btn-group,.btn-toolbar>.btn-group+.btn-group{margin-left:5px}.btn-group>.btn:not(:first-child):not(:last-child):not(.dropdown-toggle){border-radius:0}.btn-group>.btn:first-child{margin-left:0}.btn-group>.btn:first-child:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn:last-child:not(:first-child),.btn-group>.dropdown-toggle:not(:first-child){border-bottom-left-radius:0;border-top-left-radius:0}.btn-group>.btn-group{float:left}.btn-group>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group>.btn-group:first-child>.btn:last-child,.btn-group>.btn-group:first-child>.dropdown-toggle{border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn-group:last-child>.btn:first-child{border-bottom-left-radius:0;border-top-left-radius:0}.btn-group .dropdown-toggle:active,.btn-group.open .dropdown-toggle{outline:0}.btn-group-xs>.btn{padding:5px 10px;padding:1px 5px;font-size:12px;line-height:1.5;border-radius:3px}.btn-group-sm>.btn{padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.btn-group-lg>.btn{padding:10px 16px;font-size:18px;line-height:1.33;border-radius:6px}.btn-group>.btn+.dropdown-toggle{padding-right:8px;padding-left:8px}.btn-group>.btn-lg+.dropdown-toggle{padding-right:12px;padding-left:12px}.btn-group.open .dropdown-toggle{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,0.125);box-shadow:inset 0 3px 5px rgba(0,0,0,0.125)}.btn .caret{margin-left:0}.btn-lg .caret{border-width:5px 5px 0;border-bottom-width:0}.dropup .btn-lg .caret{border-width:0 5px 5px}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group{display:block;float:none;width:100%;max-width:100%}.btn-group-vertical>.btn-group:before,.btn-group-vertical>.btn-group:after{display:table;content:" "}.btn-group-vertical>.btn-group:after{clear:both}.btn-group-vertical>.btn-group:before,.btn-group-vertical>.btn-group:after{display:table;content:" "}.btn-group-vertical>.btn-group:after{clear:both}.btn-group-vertical>.btn-group>.btn{float:none}.btn-group-vertical>.btn+.btn,.btn-group-vertical>.btn+.btn-group,.btn-group-vertical>.btn-group+.btn,.btn-group-vertical>.btn-group+.btn-group{margin-top:-1px;margin-left:0}.btn-group-vertical>.btn:not(:first-child):not(:last-child){border-radius:0}.btn-group-vertical>.btn:first-child:not(:last-child){border-top-right-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn:last-child:not(:first-child){border-top-right-radius:0;border-bottom-left-radius:4px;border-top-left-radius:0}.btn-group-vertical>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group-vertical>.btn-group:first-child>.btn:last-child,.btn-group-vertical>.btn-group:first-child>.dropdown-toggle{border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn-group:last-child>.btn:first-child{border-top-right-radius:0;border-top-left-radius:0}.btn-group-justified{display:table;width:100%;border-collapse:separate;table-layout:fixed}.btn-group-justified .btn{display:table-cell;float:none;width:1%}[data-toggle="buttons"]>.btn>input[type="radio"],[data-toggle="buttons"]>.btn>input[type="checkbox"]{display:none}.input-group{position:relative;display:table;border-collapse:separate}.input-group.col{float:none;padding-right:0;padding-left:0}.input-group .form-control{width:100%;margin-bottom:0}.input-group-lg>.form-control,.input-group-lg>.input-group-addon,.input-group-lg>.input-group-btn>.btn{height:45px;padding:10px 16px;font-size:18px;line-height:1.33;border-radius:6px}select.input-group-lg>.form-control,select.input-group-lg>.input-group-addon,select.input-group-lg>.input-group-btn>.btn{height:45px;line-height:45px}textarea.input-group-lg>.form-control,textarea.input-group-lg>.input-group-addon,textarea.input-group-lg>.input-group-btn>.btn{height:auto}.input-group-sm>.form-control,.input-group-sm>.input-group-addon,.input-group-sm>.input-group-btn>.btn{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-group-sm>.form-control,select.input-group-sm>.input-group-addon,select.input-group-sm>.input-group-btn>.btn{height:30px;line-height:30px}textarea.input-group-sm>.form-control,textarea.input-group-sm>.input-group-addon,textarea.input-group-sm>.input-group-btn>.btn{height:auto}.input-group-addon,.input-group-btn,.input-group .form-control{display:table-cell}.input-group-addon:not(:first-child):not(:last-child),.input-group-btn:not(:first-child):not(:last-child),.input-group .form-control:not(:first-child):not(:last-child){border-radius:0}.input-group-addon,.input-group-btn{width:1%;white-space:nowrap;vertical-align:middle}.input-group-addon{padding:6px 12px;font-size:14px;font-weight:normal;line-height:1;text-align:center;background-color:#eee;border:1px solid #ccc;border-radius:4px}.input-group-addon.input-sm{padding:5px 10px;font-size:12px;border-radius:3px}.input-group-addon.input-lg{padding:10px 16px;font-size:18px;border-radius:6px}.input-group-addon input[type="radio"],.input-group-addon input[type="checkbox"]{margin-top:0}.input-group .form-control:first-child,.input-group-addon:first-child,.input-group-btn:first-child>.btn,.input-group-btn:first-child>.dropdown-toggle,.input-group-btn:last-child>.btn:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.input-group-addon:first-child{border-right:0}.input-group .form-control:last-child,.input-group-addon:last-child,.input-group-btn:last-child>.btn,.input-group-btn:last-child>.dropdown-toggle,.input-group-btn:first-child>.btn:not(:first-child){border-bottom-left-radius:0;border-top-left-radius:0}.input-group-addon:last-child{border-left:0}.input-group-btn{position:relative;white-space:nowrap}.input-group-btn>.btn{position:relative}.input-group-btn>.btn+.btn{margin-left:-4px}.input-group-btn>.btn:hover,.input-group-btn>.btn:active{z-index:2}.nav{padding-left:0;margin-bottom:0;list-style:none}.nav:before,.nav:after{display:table;content:" "}.nav:after{clear:both}.nav:before,.nav:after{display:table;content:" "}.nav:after{clear:both}.nav>li{position:relative;display:block}.nav>li>a{position:relative;display:block;padding:10px 15px}.nav>li>a:hover,.nav>li>a:focus{text-decoration:none;background-color:#eee}.nav>li.disabled>a{color:#999}.nav>li.disabled>a:hover,.nav>li.disabled>a:focus{color:#999;text-decoration:none;cursor:not-allowed;background-color:transparent}.nav .open>a,.nav .open>a:hover,.nav .open>a:focus{background-color:#eee;border-color:#428bca}.nav .nav-divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.nav>li>a>img{max-width:none}.nav-tabs{border-bottom:1px solid #ddd}.nav-tabs>li{float:left;margin-bottom:-1px}.nav-tabs>li>a{margin-right:2px;line-height:1.428571429;border:1px solid transparent;border-radius:4px 4px 0 0}.nav-tabs>li>a:hover{border-color:#eee #eee #ddd}.nav-tabs>li.active>a,.nav-tabs>li.active>a:hover,.nav-tabs>li.active>a:focus{color:#555;cursor:default;background-color:#fff;border:1px solid #ddd;border-bottom-color:transparent}.nav-tabs.nav-justified{width:100%;border-bottom:0}.nav-tabs.nav-justified>li{float:none}.nav-tabs.nav-justified>li>a{text-align:center}@media(min-width:768px){.nav-tabs.nav-justified>li{display:table-cell;width:1%}}.nav-tabs.nav-justified>li>a{margin-right:0;border-bottom:1px solid #ddd}.nav-tabs.nav-justified>.active>a{border-bottom-color:#fff}.nav-pills>li{float:left}.nav-pills>li>a{border-radius:5px}.nav-pills>li+li{margin-left:2px}.nav-pills>li.active>a,.nav-pills>li.active>a:hover,.nav-pills>li.active>a:focus{color:#fff;background-color:#428bca}.nav-stacked>li{float:none}.nav-stacked>li+li{margin-top:2px;margin-left:0}.nav-justified{width:100%}.nav-justified>li{float:none}.nav-justified>li>a{text-align:center}@media(min-width:768px){.nav-justified>li{display:table-cell;width:1%}}.nav-tabs-justified{border-bottom:0}.nav-tabs-justified>li>a{margin-right:0;border-bottom:1px solid #ddd}.nav-tabs-justified>.active>a{border-bottom-color:#fff}.tabbable:before,.tabbable:after{display:table;content:" "}.tabbable:after{clear:both}.tabbable:before,.tabbable:after{display:table;content:" "}.tabbable:after{clear:both}.tab-content>.tab-pane,.pill-content>.pill-pane{display:none}.tab-content>.active,.pill-content>.active{display:block}.nav .caret{border-top-color:#428bca;border-bottom-color:#428bca}.nav a:hover .caret{border-top-color:#2a6496;border-bottom-color:#2a6496}.nav-tabs .dropdown-menu{margin-top:-1px;border-top-right-radius:0;border-top-left-radius:0}.navbar{position:relative;z-index:1000;min-height:50px;margin-bottom:20px;border:1px solid transparent}.navbar:before,.navbar:after{display:table;content:" "}.navbar:after{clear:both}.navbar:before,.navbar:after{display:table;content:" "}.navbar:after{clear:both}@media(min-width:768px){.navbar{border-radius:4px}}.navbar-header:before,.navbar-header:after{display:table;content:" "}.navbar-header:after{clear:both}.navbar-header:before,.navbar-header:after{display:table;content:" "}.navbar-header:after{clear:both}@media(min-width:768px){.navbar-header{float:left}}.navbar-collapse{max-height:340px;padding-right:15px;padding-left:15px;overflow-x:visible;border-top:1px solid transparent;box-shadow:inset 0 1px 0 rgba(255,255,255,0.1);-webkit-overflow-scrolling:touch}.navbar-collapse:before,.navbar-collapse:after{display:table;content:" "}.navbar-collapse:after{clear:both}.navbar-collapse:before,.navbar-collapse:after{display:table;content:" "}.navbar-collapse:after{clear:both}.navbar-collapse.in{overflow-y:auto}@media(min-width:768px){.navbar-collapse{width:auto;border-top:0;box-shadow:none}.navbar-collapse.collapse{display:block!important;height:auto!important;padding-bottom:0;overflow:visible!important}.navbar-collapse.in{overflow-y:visible}.navbar-collapse .navbar-nav.navbar-left:first-child{margin-left:-15px}.navbar-collapse .navbar-nav.navbar-right:last-child{margin-right:-15px}.navbar-collapse .navbar-text:last-child{margin-right:0}}.container>.navbar-header,.container>.navbar-collapse{margin-right:-15px;margin-left:-15px}@media(min-width:768px){.container>.navbar-header,.container>.navbar-collapse{margin-right:0;margin-left:0}}.navbar-static-top{border-width:0 0 1px}@media(min-width:768px){.navbar-static-top{border-radius:0}}.navbar-fixed-top,.navbar-fixed-bottom{position:fixed;right:0;left:0;border-width:0 0 1px}@media(min-width:768px){.navbar-fixed-top,.navbar-fixed-bottom{border-radius:0}}.navbar-fixed-top{top:0;z-index:1030}.navbar-fixed-bottom{bottom:0;margin-bottom:0}.navbar-brand{float:left;padding:15px 15px;font-size:18px;line-height:20px}.navbar-brand:hover,.navbar-brand:focus{text-decoration:none}@media(min-width:768px){.navbar>.container .navbar-brand{margin-left:-15px}}.navbar-toggle{position:relative;float:right;padding:9px 10px;margin-top:8px;margin-right:15px;margin-bottom:8px;background-color:transparent;border:1px solid transparent;border-radius:4px}.navbar-toggle .icon-bar{display:block;width:22px;height:2px;border-radius:1px}.navbar-toggle .icon-bar+.icon-bar{margin-top:4px}@media(min-width:768px){.navbar-toggle{display:none}}.navbar-nav{margin:7.5px -15px}.navbar-nav>li>a{padding-top:10px;padding-bottom:10px;line-height:20px}@media(max-width:767px){.navbar-nav .open .dropdown-menu{position:static;float:none;width:auto;margin-top:0;background-color:transparent;border:0;box-shadow:none}.navbar-nav .open .dropdown-menu>li>a,.navbar-nav .open .dropdown-menu .dropdown-header{padding:5px 15px 5px 25px}.navbar-nav .open .dropdown-menu>li>a{line-height:20px}.navbar-nav .open .dropdown-menu>li>a:hover,.navbar-nav .open .dropdown-menu>li>a:focus{background-image:none}}@media(min-width:768px){.navbar-nav{float:left;margin:0}.navbar-nav>li{float:left}.navbar-nav>li>a{padding-top:15px;padding-bottom:15px}}@media(min-width:768px){.navbar-left{float:left!important}.navbar-right{float:right!important}}.navbar-form{padding:10px 15px;margin-top:8px;margin-right:-15px;margin-bottom:8px;margin-left:-15px;border-top:1px solid transparent;border-bottom:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.1);box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.1)}@media(min-width:768px){.navbar-form .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.navbar-form .form-control{display:inline-block}.navbar-form .radio,.navbar-form .checkbox{display:inline-block;padding-left:0;margin-top:0;margin-bottom:0}.navbar-form .radio input[type="radio"],.navbar-form .checkbox input[type="checkbox"]{float:none;margin-left:0}}@media(max-width:767px){.navbar-form .form-group{margin-bottom:5px}}@media(min-width:768px){.navbar-form{width:auto;padding-top:0;padding-bottom:0;margin-right:0;margin-left:0;border:0;-webkit-box-shadow:none;box-shadow:none}}.navbar-nav>li>.dropdown-menu{margin-top:0;border-top-right-radius:0;border-top-left-radius:0}.navbar-fixed-bottom .navbar-nav>li>.dropdown-menu{border-bottom-right-radius:0;border-bottom-left-radius:0}.navbar-nav.pull-right>li>.dropdown-menu,.navbar-nav>li>.dropdown-menu.pull-right{right:0;left:auto}.navbar-btn{margin-top:8px;margin-bottom:8px}.navbar-text{float:left;margin-top:15px;margin-bottom:15px}@media(min-width:768px){.navbar-text{margin-right:15px;margin-left:15px}}.navbar-default{background-color:#f8f8f8;border-color:#e7e7e7}.navbar-default .navbar-brand{color:#777}.navbar-default .navbar-brand:hover,.navbar-default .navbar-brand:focus{color:#5e5e5e;background-color:transparent}.navbar-default .navbar-text{color:#777}.navbar-default .navbar-nav>li>a{color:#777}.navbar-default .navbar-nav>li>a:hover,.navbar-default .navbar-nav>li>a:focus{color:#333;background-color:transparent}.navbar-default .navbar-nav>.active>a,.navbar-default .navbar-nav>.active>a:hover,.navbar-default .navbar-nav>.active>a:focus{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav>.disabled>a,.navbar-default .navbar-nav>.disabled>a:hover,.navbar-default .navbar-nav>.disabled>a:focus{color:#ccc;background-color:transparent}.navbar-default .navbar-toggle{border-color:#ddd}.navbar-default .navbar-toggle:hover,.navbar-default .navbar-toggle:focus{background-color:#ddd}.navbar-default .navbar-toggle .icon-bar{background-color:#ccc}.navbar-default .navbar-collapse,.navbar-default .navbar-form{border-color:#e6e6e6}.navbar-default .navbar-nav>.dropdown>a:hover .caret,.navbar-default .navbar-nav>.dropdown>a:focus .caret{border-top-color:#333;border-bottom-color:#333}.navbar-default .navbar-nav>.open>a,.navbar-default .navbar-nav>.open>a:hover,.navbar-default .navbar-nav>.open>a:focus{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav>.open>a .caret,.navbar-default .navbar-nav>.open>a:hover .caret,.navbar-default .navbar-nav>.open>a:focus .caret{border-top-color:#555;border-bottom-color:#555}.navbar-default .navbar-nav>.dropdown>a .caret{border-top-color:#777;border-bottom-color:#777}@media(max-width:767px){.navbar-default .navbar-nav .open .dropdown-menu>li>a{color:#777}.navbar-default .navbar-nav .open .dropdown-menu>li>a:hover,.navbar-default .navbar-nav .open .dropdown-menu>li>a:focus{color:#333;background-color:transparent}.navbar-default .navbar-nav .open .dropdown-menu>.active>a,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:hover,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:focus{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:hover,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:focus{color:#ccc;background-color:transparent}}.navbar-default .navbar-link{color:#777}.navbar-default .navbar-link:hover{color:#333}.navbar-inverse{background-color:#222;border-color:#080808}.navbar-inverse .navbar-brand{color:#999}.navbar-inverse .navbar-brand:hover,.navbar-inverse .navbar-brand:focus{color:#fff;background-color:transparent}.navbar-inverse .navbar-text{color:#999}.navbar-inverse .navbar-nav>li>a{color:#999}.navbar-inverse .navbar-nav>li>a:hover,.navbar-inverse .navbar-nav>li>a:focus{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav>.active>a,.navbar-inverse .navbar-nav>.active>a:hover,.navbar-inverse .navbar-nav>.active>a:focus{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav>.disabled>a,.navbar-inverse .navbar-nav>.disabled>a:hover,.navbar-inverse .navbar-nav>.disabled>a:focus{color:#444;background-color:transparent}.navbar-inverse .navbar-toggle{border-color:#333}.navbar-inverse .navbar-toggle:hover,.navbar-inverse .navbar-toggle:focus{background-color:#333}.navbar-inverse .navbar-toggle .icon-bar{background-color:#fff}.navbar-inverse .navbar-collapse,.navbar-inverse .navbar-form{border-color:#101010}.navbar-inverse .navbar-nav>.open>a,.navbar-inverse .navbar-nav>.open>a:hover,.navbar-inverse .navbar-nav>.open>a:focus{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav>.dropdown>a:hover .caret{border-top-color:#fff;border-bottom-color:#fff}.navbar-inverse .navbar-nav>.dropdown>a .caret{border-top-color:#999;border-bottom-color:#999}.navbar-inverse .navbar-nav>.open>a .caret,.navbar-inverse .navbar-nav>.open>a:hover .caret,.navbar-inverse .navbar-nav>.open>a:focus .caret{border-top-color:#fff;border-bottom-color:#fff}@media(max-width:767px){.navbar-inverse .navbar-nav .open .dropdown-menu>.dropdown-header{border-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a{color:#999}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:hover,.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:focus{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:hover,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:focus{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:hover,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:focus{color:#444;background-color:transparent}}.navbar-inverse .navbar-link{color:#999}.navbar-inverse .navbar-link:hover{color:#fff}.breadcrumb{padding:8px 15px;margin-bottom:20px;list-style:none;background-color:#f5f5f5;border-radius:4px}.breadcrumb>li{display:inline-block}.breadcrumb>li+li:before{padding:0 5px;color:#ccc;content:"/\00a0"}.breadcrumb>.active{color:#999}.pagination{display:inline-block;padding-left:0;margin:20px 0;border-radius:4px}.pagination>li{display:inline}.pagination>li>a,.pagination>li>span{position:relative;float:left;padding:6px 12px;margin-left:-1px;line-height:1.428571429;text-decoration:none;background-color:#fff;border:1px solid #ddd}.pagination>li:first-child>a,.pagination>li:first-child>span{margin-left:0;border-bottom-left-radius:4px;border-top-left-radius:4px}.pagination>li:last-child>a,.pagination>li:last-child>span{border-top-right-radius:4px;border-bottom-right-radius:4px}.pagination>li>a:hover,.pagination>li>span:hover,.pagination>li>a:focus,.pagination>li>span:focus{background-color:#eee}.pagination>.active>a,.pagination>.active>span,.pagination>.active>a:hover,.pagination>.active>span:hover,.pagination>.active>a:focus,.pagination>.active>span:focus{z-index:2;color:#fff;cursor:default;background-color:#428bca;border-color:#428bca}.pagination>.disabled>span,.pagination>.disabled>a,.pagination>.disabled>a:hover,.pagination>.disabled>a:focus{color:#999;cursor:not-allowed;background-color:#fff;border-color:#ddd}.pagination-lg>li>a,.pagination-lg>li>span{padding:10px 16px;font-size:18px}.pagination-lg>li:first-child>a,.pagination-lg>li:first-child>span{border-bottom-left-radius:6px;border-top-left-radius:6px}.pagination-lg>li:last-child>a,.pagination-lg>li:last-child>span{border-top-right-radius:6px;border-bottom-right-radius:6px}.pagination-sm>li>a,.pagination-sm>li>span{padding:5px 10px;font-size:12px}.pagination-sm>li:first-child>a,.pagination-sm>li:first-child>span{border-bottom-left-radius:3px;border-top-left-radius:3px}.pagination-sm>li:last-child>a,.pagination-sm>li:last-child>span{border-top-right-radius:3px;border-bottom-right-radius:3px}.pager{padding-left:0;margin:20px 0;text-align:center;list-style:none}.pager:before,.pager:after{display:table;content:" "}.pager:after{clear:both}.pager:before,.pager:after{display:table;content:" "}.pager:after{clear:both}.pager li{display:inline}.pager li>a,.pager li>span{display:inline-block;padding:5px 14px;background-color:#fff;border:1px solid #ddd;border-radius:15px}.pager li>a:hover,.pager li>a:focus{text-decoration:none;background-color:#eee}.pager .next>a,.pager .next>span{float:right}.pager .previous>a,.pager .previous>span{float:left}.pager .disabled>a,.pager .disabled>a:hover,.pager .disabled>a:focus,.pager .disabled>span{color:#999;cursor:not-allowed;background-color:#fff}.label{display:inline;padding:.2em .6em .3em;font-size:75%;font-weight:bold;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25em}.label[href]:hover,.label[href]:focus{color:#fff;text-decoration:none;cursor:pointer}.label:empty{display:none}.label-default{background-color:#999}.label-default[href]:hover,.label-default[href]:focus{background-color:#808080}.label-primary{background-color:#428bca}.label-primary[href]:hover,.label-primary[href]:focus{background-color:#3071a9}.label-success{background-color:#5cb85c}.label-success[href]:hover,.label-success[href]:focus{background-color:#449d44}.label-info{background-color:#5bc0de}.label-info[href]:hover,.label-info[href]:focus{background-color:#31b0d5}.label-warning{background-color:#f0ad4e}.label-warning[href]:hover,.label-warning[href]:focus{background-color:#ec971f}.label-danger{background-color:#d9534f}.label-danger[href]:hover,.label-danger[href]:focus{background-color:#c9302c}.badge{display:inline-block;min-width:10px;padding:3px 7px;font-size:12px;font-weight:bold;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:baseline;background-color:#999;border-radius:10px}.badge:empty{display:none}a.badge:hover,a.badge:focus{color:#fff;text-decoration:none;cursor:pointer}.btn .badge{position:relative;top:-1px}a.list-group-item.active>.badge,.nav-pills>.active>a>.badge{color:#428bca;background-color:#fff}.nav-pills>li>a>.badge{margin-left:3px}.jumbotron{padding:30px;margin-bottom:30px;font-size:21px;font-weight:200;line-height:2.1428571435;color:inherit;background-color:#eee}.jumbotron h1{line-height:1;color:inherit}.jumbotron p{line-height:1.4}.container .jumbotron{border-radius:6px}@media screen and (min-width:768px){.jumbotron{padding-top:48px;padding-bottom:48px}.container .jumbotron{padding-right:60px;padding-left:60px}.jumbotron h1{font-size:63px}}.thumbnail{display:inline-block;display:block;height:auto;max-width:100%;padding:4px;line-height:1.428571429;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.thumbnail>img{display:block;height:auto;max-width:100%}a.thumbnail:hover,a.thumbnail:focus{border-color:#428bca}.thumbnail>img{margin-right:auto;margin-left:auto}.thumbnail .caption{padding:9px;color:#333}.alert{padding:15px;margin-bottom:20px;border:1px solid transparent;border-radius:4px}.alert h4{margin-top:0;color:inherit}.alert .alert-link{font-weight:bold}.alert>p,.alert>ul{margin-bottom:0}.alert>p+p{margin-top:5px}.alert-dismissable{padding-right:35px}.alert-dismissable .close{position:relative;top:-2px;right:-21px;color:inherit}.alert-success{color:#468847;background-color:#dff0d8;border-color:#d6e9c6}.alert-success hr{border-top-color:#c9e2b3}.alert-success .alert-link{color:#356635}.alert-info{color:#3a87ad;background-color:#d9edf7;border-color:#bce8f1}.alert-info hr{border-top-color:#a6e1ec}.alert-info .alert-link{color:#2d6987}.alert-warning{color:#c09853;background-color:#fcf8e3;border-color:#fbeed5}.alert-warning hr{border-top-color:#f8e5be}.alert-warning .alert-link{color:#a47e3c}.alert-danger{color:#b94a48;background-color:#f2dede;border-color:#eed3d7}.alert-danger hr{border-top-color:#e6c1c7}.alert-danger .alert-link{color:#953b39}@-webkit-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-moz-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-o-keyframes progress-bar-stripes{from{background-position:0 0}to{background-position:40px 0}}@keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}.progress{height:20px;margin-bottom:20px;overflow:hidden;background-color:#f5f5f5;border-radius:4px;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,0.1);box-shadow:inset 0 1px 2px rgba(0,0,0,0.1)}.progress-bar{float:left;width:0;height:100%;font-size:12px;color:#fff;text-align:center;background-color:#428bca;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,0.15);box-shadow:inset 0 -1px 0 rgba(0,0,0,0.15);-webkit-transition:width .6s ease;transition:width .6s ease}.progress-striped .progress-bar{background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,0.15)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,0.15)),color-stop(0.75,rgba(255,255,255,0.15)),color-stop(0.75,transparent),to(transparent));background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-size:40px 40px}.progress.active .progress-bar{-webkit-animation:progress-bar-stripes 2s linear infinite;-moz-animation:progress-bar-stripes 2s linear infinite;-ms-animation:progress-bar-stripes 2s linear infinite;-o-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite}.progress-bar-success{background-color:#5cb85c}.progress-striped .progress-bar-success{background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,0.15)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,0.15)),color-stop(0.75,rgba(255,255,255,0.15)),color-stop(0.75,transparent),to(transparent));background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent)}.progress-bar-info{background-color:#5bc0de}.progress-striped .progress-bar-info{background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,0.15)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,0.15)),color-stop(0.75,rgba(255,255,255,0.15)),color-stop(0.75,transparent),to(transparent));background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent)}.progress-bar-warning{background-color:#f0ad4e}.progress-striped .progress-bar-warning{background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,0.15)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,0.15)),color-stop(0.75,rgba(255,255,255,0.15)),color-stop(0.75,transparent),to(transparent));background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent)}.progress-bar-danger{background-color:#d9534f}.progress-striped .progress-bar-danger{background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,0.15)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,0.15)),color-stop(0.75,rgba(255,255,255,0.15)),color-stop(0.75,transparent),to(transparent));background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent)}.media,.media-body{overflow:hidden;zoom:1}.media,.media .media{margin-top:15px}.media:first-child{margin-top:0}.media-object{display:block}.media-heading{margin:0 0 5px}.media>.pull-left{margin-right:10px}.media>.pull-right{margin-left:10px}.media-list{padding-left:0;list-style:none}.list-group{padding-left:0;margin-bottom:20px}.list-group-item{position:relative;display:block;padding:10px 15px;margin-bottom:-1px;background-color:#fff;border:1px solid #ddd}.list-group-item:first-child{border-top-right-radius:4px;border-top-left-radius:4px}.list-group-item:last-child{margin-bottom:0;border-bottom-right-radius:4px;border-bottom-left-radius:4px}.list-group-item>.badge{float:right}.list-group-item>.badge+.badge{margin-right:5px}a.list-group-item{color:#555}a.list-group-item .list-group-item-heading{color:#333}a.list-group-item:hover,a.list-group-item:focus{text-decoration:none;background-color:#f5f5f5}.list-group-item.active,.list-group-item.active:hover,.list-group-item.active:focus{z-index:2;color:#fff;background-color:#428bca;border-color:#428bca}.list-group-item.active .list-group-item-heading,.list-group-item.active:hover .list-group-item-heading,.list-group-item.active:focus .list-group-item-heading{color:inherit}.list-group-item.active .list-group-item-text,.list-group-item.active:hover .list-group-item-text,.list-group-item.active:focus .list-group-item-text{color:#e1edf7}.list-group-item-heading{margin-top:0;margin-bottom:5px}.list-group-item-text{margin-bottom:0;line-height:1.3}.panel{margin-bottom:20px;background-color:#fff;border:1px solid transparent;border-radius:4px;-webkit-box-shadow:0 1px 1px rgba(0,0,0,0.05);box-shadow:0 1px 1px rgba(0,0,0,0.05)}.panel-body{padding:15px}.panel-body:before,.panel-body:after{display:table;content:" "}.panel-body:after{clear:both}.panel-body:before,.panel-body:after{display:table;content:" "}.panel-body:after{clear:both}.panel>.list-group{margin-bottom:0}.panel>.list-group .list-group-item{border-width:1px 0}.panel>.list-group .list-group-item:first-child{border-top-right-radius:0;border-top-left-radius:0}.panel>.list-group .list-group-item:last-child{border-bottom:0}.panel-heading+.list-group .list-group-item:first-child{border-top-width:0}.panel>.table{margin-bottom:0}.panel>.panel-body+.table{border-top:1px solid #ddd}.panel-heading{padding:10px 15px;border-bottom:1px solid transparent;border-top-right-radius:3px;border-top-left-radius:3px}.panel-title{margin-top:0;margin-bottom:0;font-size:16px}.panel-title>a{color:inherit}.panel-footer{padding:10px 15px;background-color:#f5f5f5;border-top:1px solid #ddd;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel-group .panel{margin-bottom:0;overflow:hidden;border-radius:4px}.panel-group .panel+.panel{margin-top:5px}.panel-group .panel-heading{border-bottom:0}.panel-group .panel-heading+.panel-collapse .panel-body{border-top:1px solid #ddd}.panel-group .panel-footer{border-top:0}.panel-group .panel-footer+.panel-collapse .panel-body{border-bottom:1px solid #ddd}.panel-default{border-color:#ddd}.panel-default>.panel-heading{color:#333;background-color:#f5f5f5;border-color:#ddd}.panel-default>.panel-heading+.panel-collapse .panel-body{border-top-color:#ddd}.panel-default>.panel-footer+.panel-collapse .panel-body{border-bottom-color:#ddd}.panel-primary{border-color:#428bca}.panel-primary>.panel-heading{color:#fff;background-color:#428bca;border-color:#428bca}.panel-primary>.panel-heading+.panel-collapse .panel-body{border-top-color:#428bca}.panel-primary>.panel-footer+.panel-collapse .panel-body{border-bottom-color:#428bca}.panel-success{border-color:#d6e9c6}.panel-success>.panel-heading{color:#468847;background-color:#dff0d8;border-color:#d6e9c6}.panel-success>.panel-heading+.panel-collapse .panel-body{border-top-color:#d6e9c6}.panel-success>.panel-footer+.panel-collapse .panel-body{border-bottom-color:#d6e9c6}.panel-warning{border-color:#fbeed5}.panel-warning>.panel-heading{color:#c09853;background-color:#fcf8e3;border-color:#fbeed5}.panel-warning>.panel-heading+.panel-collapse .panel-body{border-top-color:#fbeed5}.panel-warning>.panel-footer+.panel-collapse .panel-body{border-bottom-color:#fbeed5}.panel-danger{border-color:#eed3d7}.panel-danger>.panel-heading{color:#b94a48;background-color:#f2dede;border-color:#eed3d7}.panel-danger>.panel-heading+.panel-collapse .panel-body{border-top-color:#eed3d7}.panel-danger>.panel-footer+.panel-collapse .panel-body{border-bottom-color:#eed3d7}.panel-info{border-color:#bce8f1}.panel-info>.panel-heading{color:#3a87ad;background-color:#d9edf7;border-color:#bce8f1}.panel-info>.panel-heading+.panel-collapse .panel-body{border-top-color:#bce8f1}.panel-info>.panel-footer+.panel-collapse .panel-body{border-bottom-color:#bce8f1}.well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#f5f5f5;border:1px solid #e3e3e3;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.05);box-shadow:inset 0 1px 1px rgba(0,0,0,0.05)}.well blockquote{border-color:#ddd;border-color:rgba(0,0,0,0.15)}.well-lg{padding:24px;border-radius:6px}.well-sm{padding:9px;border-radius:3px}.close{float:right;font-size:21px;font-weight:bold;line-height:1;color:#000;text-shadow:0 1px 0 #fff;opacity:.2;filter:alpha(opacity=20)}.close:hover,.close:focus{color:#000;text-decoration:none;cursor:pointer;opacity:.5;filter:alpha(opacity=50)}button.close{padding:0;cursor:pointer;background:transparent;border:0;-webkit-appearance:none}.modal-open{overflow:hidden}body.modal-open,.modal-open .navbar-fixed-top,.modal-open .navbar-fixed-bottom{margin-right:15px}.modal{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;display:none;overflow:auto;overflow-y:scroll}.modal.fade .modal-dialog{-webkit-transform:translate(0,-25%);-ms-transform:translate(0,-25%);transform:translate(0,-25%);-webkit-transition:-webkit-transform .3s ease-out;-moz-transition:-moz-transform .3s ease-out;-o-transition:-o-transform .3s ease-out;transition:transform .3s ease-out}.modal.in .modal-dialog{-webkit-transform:translate(0,0);-ms-transform:translate(0,0);transform:translate(0,0)}.modal-dialog{z-index:1050;width:auto;padding:10px;margin-right:auto;margin-left:auto}.modal-content{position:relative;background-color:#fff;border:1px solid #999;border:1px solid rgba(0,0,0,0.2);border-radius:6px;outline:0;-webkit-box-shadow:0 3px 9px rgba(0,0,0,0.5);box-shadow:0 3px 9px rgba(0,0,0,0.5);background-clip:padding-box}.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1030;background-color:#000}.modal-backdrop.fade{opacity:0;filter:alpha(opacity=0)}.modal-backdrop.in{opacity:.5;filter:alpha(opacity=50)}.modal-header{min-height:16.428571429px;padding:15px;border-bottom:1px solid #e5e5e5}.modal-header .close{margin-top:-2px}.modal-title{margin:0;line-height:1.428571429}.modal-body{position:relative;padding:20px}.modal-footer{padding:19px 20px 20px;margin-top:15px;text-align:right;border-top:1px solid #e5e5e5}.modal-footer:before,.modal-footer:after{display:table;content:" "}.modal-footer:after{clear:both}.modal-footer:before,.modal-footer:after{display:table;content:" "}.modal-footer:after{clear:both}.modal-footer .btn+.btn{margin-bottom:0;margin-left:5px}.modal-footer .btn-group .btn+.btn{margin-left:-1px}.modal-footer .btn-block+.btn-block{margin-left:0}@media screen and (min-width:768px){.modal-dialog{right:auto;left:50%;width:600px;padding-top:30px;padding-bottom:30px}.modal-content{-webkit-box-shadow:0 5px 15px rgba(0,0,0,0.5);box-shadow:0 5px 15px rgba(0,0,0,0.5)}}.tooltip{position:absolute;z-index:1030;display:block;font-size:12px;line-height:1.4;opacity:0;filter:alpha(opacity=0);visibility:visible}.tooltip.in{opacity:.9;filter:alpha(opacity=90)}.tooltip.top{padding:5px 0;margin-top:-3px}.tooltip.right{padding:0 5px;margin-left:3px}.tooltip.bottom{padding:5px 0;margin-top:3px}.tooltip.left{padding:0 5px;margin-left:-3px}.tooltip-inner{max-width:200px;padding:3px 8px;color:#fff;text-align:center;text-decoration:none;background-color:#000;border-radius:4px}.tooltip-arrow{position:absolute;width:0;height:0;border-color:transparent;border-style:solid}.tooltip.top .tooltip-arrow{bottom:0;left:50%;margin-left:-5px;border-top-color:#000;border-width:5px 5px 0}.tooltip.top-left .tooltip-arrow{bottom:0;left:5px;border-top-color:#000;border-width:5px 5px 0}.tooltip.top-right .tooltip-arrow{right:5px;bottom:0;border-top-color:#000;border-width:5px 5px 0}.tooltip.right .tooltip-arrow{top:50%;left:0;margin-top:-5px;border-right-color:#000;border-width:5px 5px 5px 0}.tooltip.left .tooltip-arrow{top:50%;right:0;margin-top:-5px;border-left-color:#000;border-width:5px 0 5px 5px}.tooltip.bottom .tooltip-arrow{top:0;left:50%;margin-left:-5px;border-bottom-color:#000;border-width:0 5px 5px}.tooltip.bottom-left .tooltip-arrow{top:0;left:5px;border-bottom-color:#000;border-width:0 5px 5px}.tooltip.bottom-right .tooltip-arrow{top:0;right:5px;border-bottom-color:#000;border-width:0 5px 5px}.popover{position:absolute;top:0;left:0;z-index:1010;display:none;max-width:276px;padding:1px;text-align:left;white-space:normal;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.2);border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,0.2);box-shadow:0 5px 10px rgba(0,0,0,0.2);background-clip:padding-box}.popover.top{margin-top:-10px}.popover.right{margin-left:10px}.popover.bottom{margin-top:10px}.popover.left{margin-left:-10px}.popover-title{padding:8px 14px;margin:0;font-size:14px;font-weight:normal;line-height:18px;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;border-radius:5px 5px 0 0}.popover-content{padding:9px 14px}.popover .arrow,.popover .arrow:after{position:absolute;display:block;width:0;height:0;border-color:transparent;border-style:solid}.popover .arrow{border-width:11px}.popover .arrow:after{border-width:10px;content:""}.popover.top .arrow{bottom:-11px;left:50%;margin-left:-11px;border-top-color:#999;border-top-color:rgba(0,0,0,0.25);border-bottom-width:0}.popover.top .arrow:after{bottom:1px;margin-left:-10px;border-top-color:#fff;border-bottom-width:0;content:" "}.popover.right .arrow{top:50%;left:-11px;margin-top:-11px;border-right-color:#999;border-right-color:rgba(0,0,0,0.25);border-left-width:0}.popover.right .arrow:after{bottom:-10px;left:1px;border-right-color:#fff;border-left-width:0;content:" "}.popover.bottom .arrow{top:-11px;left:50%;margin-left:-11px;border-bottom-color:#999;border-bottom-color:rgba(0,0,0,0.25);border-top-width:0}.popover.bottom .arrow:after{top:1px;margin-left:-10px;border-bottom-color:#fff;border-top-width:0;content:" "}.popover.left .arrow{top:50%;right:-11px;margin-top:-11px;border-left-color:#999;border-left-color:rgba(0,0,0,0.25);border-right-width:0}.popover.left .arrow:after{right:1px;bottom:-10px;border-left-color:#fff;border-right-width:0;content:" "}.carousel{position:relative}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel-inner>.item{position:relative;display:none;-webkit-transition:.6s ease-in-out left;transition:.6s ease-in-out left}.carousel-inner>.item>img,.carousel-inner>.item>a>img{display:block;height:auto;max-width:100%;line-height:1}.carousel-inner>.active,.carousel-inner>.next,.carousel-inner>.prev{display:block}.carousel-inner>.active{left:0}.carousel-inner>.next,.carousel-inner>.prev{position:absolute;top:0;width:100%}.carousel-inner>.next{left:100%}.carousel-inner>.prev{left:-100%}.carousel-inner>.next.left,.carousel-inner>.prev.right{left:0}.carousel-inner>.active.left{left:-100%}.carousel-inner>.active.right{left:100%}.carousel-control{position:absolute;top:0;bottom:0;left:0;width:15%;font-size:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,0.6);opacity:.5;filter:alpha(opacity=50)}.carousel-control.left{background-image:-webkit-gradient(linear,0 top,100% top,from(rgba(0,0,0,0.5)),to(rgba(0,0,0,0.0001)));background-image:-webkit-linear-gradient(left,color-stop(rgba(0,0,0,0.5) 0),color-stop(rgba(0,0,0,0.0001) 100%));background-image:-moz-linear-gradient(left,rgba(0,0,0,0.5) 0,rgba(0,0,0,0.0001) 100%);background-image:linear-gradient(to right,rgba(0,0,0,0.5) 0,rgba(0,0,0,0.0001) 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000',endColorstr='#00000000',GradientType=1)}.carousel-control.right{right:0;left:auto;background-image:-webkit-gradient(linear,0 top,100% top,from(rgba(0,0,0,0.0001)),to(rgba(0,0,0,0.5)));background-image:-webkit-linear-gradient(left,color-stop(rgba(0,0,0,0.0001) 0),color-stop(rgba(0,0,0,0.5) 100%));background-image:-moz-linear-gradient(left,rgba(0,0,0,0.0001) 0,rgba(0,0,0,0.5) 100%);background-image:linear-gradient(to right,rgba(0,0,0,0.0001) 0,rgba(0,0,0,0.5) 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000',endColorstr='#80000000',GradientType=1)}.carousel-control:hover,.carousel-control:focus{color:#fff;text-decoration:none;opacity:.9;filter:alpha(opacity=90)}.carousel-control .icon-prev,.carousel-control .icon-next,.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right{position:absolute;top:50%;left:50%;z-index:5;display:inline-block}.carousel-control .icon-prev,.carousel-control .icon-next{width:20px;height:20px;margin-top:-10px;margin-left:-10px;font-family:serif}.carousel-control .icon-prev:before{content:'\2039'}.carousel-control .icon-next:before{content:'\203a'}.carousel-indicators{position:absolute;bottom:10px;left:50%;z-index:15;width:60%;padding-left:0;margin-left:-30%;text-align:center;list-style:none}.carousel-indicators li{display:inline-block;width:10px;height:10px;margin:1px;text-indent:-999px;cursor:pointer;border:1px solid #fff;border-radius:10px}.carousel-indicators .active{width:12px;height:12px;margin:0;background-color:#fff}.carousel-caption{position:absolute;right:15%;bottom:20px;left:15%;z-index:10;padding-top:20px;padding-bottom:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,0.6)}.carousel-caption .btn{text-shadow:none}@media screen and (min-width:768px){.carousel-control .icon-prev,.carousel-control .icon-next{width:30px;height:30px;margin-top:-15px;margin-left:-15px;font-size:30px}.carousel-caption{right:20%;left:20%;padding-bottom:30px}.carousel-indicators{bottom:20px}}.clearfix:before,.clearfix:after{display:table;content:" "}.clearfix:after{clear:both}.pull-right{float:right!important}.pull-left{float:left!important}.hide{display:none!important}.show{display:block!important}.invisible{visibility:hidden}.text-hide{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.affix{position:fixed}@-ms-viewport{width:device-width}@media screen and (max-width:400px){@-ms-viewport{width:320px}}.hidden{display:none!important;visibility:hidden!important}.visible-xs{display:none!important}tr.visible-xs{display:none!important}th.visible-xs,td.visible-xs{display:none!important}@media(max-width:767px){.visible-xs{display:block!important}tr.visible-xs{display:table-row!important}th.visible-xs,td.visible-xs{display:table-cell!important}}@media(min-width:768px) and (max-width:991px){.visible-xs.visible-sm{display:block!important}tr.visible-xs.visible-sm{display:table-row!important}th.visible-xs.visible-sm,td.visible-xs.visible-sm{display:table-cell!important}}@media(min-width:992px) and (max-width:1199px){.visible-xs.visible-md{display:block!important}tr.visible-xs.visible-md{display:table-row!important}th.visible-xs.visible-md,td.visible-xs.visible-md{display:table-cell!important}}@media(min-width:1200px){.visible-xs.visible-lg{display:block!important}tr.visible-xs.visible-lg{display:table-row!important}th.visible-xs.visible-lg,td.visible-xs.visible-lg{display:table-cell!important}}.visible-sm{display:none!important}tr.visible-sm{display:none!important}th.visible-sm,td.visible-sm{display:none!important}@media(max-width:767px){.visible-sm.visible-xs{display:block!important}tr.visible-sm.visible-xs{display:table-row!important}th.visible-sm.visible-xs,td.visible-sm.visible-xs{display:table-cell!important}}@media(min-width:768px) and (max-width:991px){.visible-sm{display:block!important}tr.visible-sm{display:table-row!important}th.visible-sm,td.visible-sm{display:table-cell!important}}@media(min-width:992px) and (max-width:1199px){.visible-sm.visible-md{display:block!important}tr.visible-sm.visible-md{display:table-row!important}th.visible-sm.visible-md,td.visible-sm.visible-md{display:table-cell!important}}@media(min-width:1200px){.visible-sm.visible-lg{display:block!important}tr.visible-sm.visible-lg{display:table-row!important}th.visible-sm.visible-lg,td.visible-sm.visible-lg{display:table-cell!important}}.visible-md{display:none!important}tr.visible-md{display:none!important}th.visible-md,td.visible-md{display:none!important}@media(max-width:767px){.visible-md.visible-xs{display:block!important}tr.visible-md.visible-xs{display:table-row!important}th.visible-md.visible-xs,td.visible-md.visible-xs{display:table-cell!important}}@media(min-width:768px) and (max-width:991px){.visible-md.visible-sm{display:block!important}tr.visible-md.visible-sm{display:table-row!important}th.visible-md.visible-sm,td.visible-md.visible-sm{display:table-cell!important}}@media(min-width:992px) and (max-width:1199px){.visible-md{display:block!important}tr.visible-md{display:table-row!important}th.visible-md,td.visible-md{display:table-cell!important}}@media(min-width:1200px){.visible-md.visible-lg{display:block!important}tr.visible-md.visible-lg{display:table-row!important}th.visible-md.visible-lg,td.visible-md.visible-lg{display:table-cell!important}}.visible-lg{display:none!important}tr.visible-lg{display:none!important}th.visible-lg,td.visible-lg{display:none!important}@media(max-width:767px){.visible-lg.visible-xs{display:block!important}tr.visible-lg.visible-xs{display:table-row!important}th.visible-lg.visible-xs,td.visible-lg.visible-xs{display:table-cell!important}}@media(min-width:768px) and (max-width:991px){.visible-lg.visible-sm{display:block!important}tr.visible-lg.visible-sm{display:table-row!important}th.visible-lg.visible-sm,td.visible-lg.visible-sm{display:table-cell!important}}@media(min-width:992px) and (max-width:1199px){.visible-lg.visible-md{display:block!important}tr.visible-lg.visible-md{display:table-row!important}th.visible-lg.visible-md,td.visible-lg.visible-md{display:table-cell!important}}@media(min-width:1200px){.visible-lg{display:block!important}tr.visible-lg{display:table-row!important}th.visible-lg,td.visible-lg{display:table-cell!important}}.hidden-xs{display:block!important}tr.hidden-xs{display:table-row!important}th.hidden-xs,td.hidden-xs{display:table-cell!important}@media(max-width:767px){.hidden-xs{display:none!important}tr.hidden-xs{display:none!important}th.hidden-xs,td.hidden-xs{display:none!important}}@media(min-width:768px) and (max-width:991px){.hidden-xs.hidden-sm{display:none!important}tr.hidden-xs.hidden-sm{display:none!important}th.hidden-xs.hidden-sm,td.hidden-xs.hidden-sm{display:none!important}}@media(min-width:992px) and (max-width:1199px){.hidden-xs.hidden-md{display:none!important}tr.hidden-xs.hidden-md{display:none!important}th.hidden-xs.hidden-md,td.hidden-xs.hidden-md{display:none!important}}@media(min-width:1200px){.hidden-xs.hidden-lg{display:none!important}tr.hidden-xs.hidden-lg{display:none!important}th.hidden-xs.hidden-lg,td.hidden-xs.hidden-lg{display:none!important}}.hidden-sm{display:block!important}tr.hidden-sm{display:table-row!important}th.hidden-sm,td.hidden-sm{display:table-cell!important}@media(max-width:767px){.hidden-sm.hidden-xs{display:none!important}tr.hidden-sm.hidden-xs{display:none!important}th.hidden-sm.hidden-xs,td.hidden-sm.hidden-xs{display:none!important}}@media(min-width:768px) and (max-width:991px){.hidden-sm{display:none!important}tr.hidden-sm{display:none!important}th.hidden-sm,td.hidden-sm{display:none!important}}@media(min-width:992px) and (max-width:1199px){.hidden-sm.hidden-md{display:none!important}tr.hidden-sm.hidden-md{display:none!important}th.hidden-sm.hidden-md,td.hidden-sm.hidden-md{display:none!important}}@media(min-width:1200px){.hidden-sm.hidden-lg{display:none!important}tr.hidden-sm.hidden-lg{display:none!important}th.hidden-sm.hidden-lg,td.hidden-sm.hidden-lg{display:none!important}}.hidden-md{display:block!important}tr.hidden-md{display:table-row!important}th.hidden-md,td.hidden-md{display:table-cell!important}@media(max-width:767px){.hidden-md.hidden-xs{display:none!important}tr.hidden-md.hidden-xs{display:none!important}th.hidden-md.hidden-xs,td.hidden-md.hidden-xs{display:none!important}}@media(min-width:768px) and (max-width:991px){.hidden-md.hidden-sm{display:none!important}tr.hidden-md.hidden-sm{display:none!important}th.hidden-md.hidden-sm,td.hidden-md.hidden-sm{display:none!important}}@media(min-width:992px) and (max-width:1199px){.hidden-md{display:none!important}tr.hidden-md{display:none!important}th.hidden-md,td.hidden-md{display:none!important}}@media(min-width:1200px){.hidden-md.hidden-lg{display:none!important}tr.hidden-md.hidden-lg{display:none!important}th.hidden-md.hidden-lg,td.hidden-md.hidden-lg{display:none!important}}.hidden-lg{display:block!important}tr.hidden-lg{display:table-row!important}th.hidden-lg,td.hidden-lg{display:table-cell!important}@media(max-width:767px){.hidden-lg.hidden-xs{display:none!important}tr.hidden-lg.hidden-xs{display:none!important}th.hidden-lg.hidden-xs,td.hidden-lg.hidden-xs{display:none!important}}@media(min-width:768px) and (max-width:991px){.hidden-lg.hidden-sm{display:none!important}tr.hidden-lg.hidden-sm{display:none!important}th.hidden-lg.hidden-sm,td.hidden-lg.hidden-sm{display:none!important}}@media(min-width:992px) and (max-width:1199px){.hidden-lg.hidden-md{display:none!important}tr.hidden-lg.hidden-md{display:none!important}th.hidden-lg.hidden-md,td.hidden-lg.hidden-md{display:none!important}}@media(min-width:1200px){.hidden-lg{display:none!important}tr.hidden-lg{display:none!important}th.hidden-lg,td.hidden-lg{display:none!important}}.visible-print{display:none!important}tr.visible-print{display:none!important}th.visible-print,td.visible-print{display:none!important}@media print{.visible-print{display:block!important}tr.visible-print{display:table-row!important}th.visible-print,td.visible-print{display:table-cell!important}.hidden-print{display:none!important}tr.hidden-print{display:none!important}th.hidden-print,td.hidden-print{display:none!important}} \ No newline at end of file diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/.gc3pie/html/bootstrap3/fonts/glyphicons-halflings-regular.eot b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/.gc3pie/html/bootstrap3/fonts/glyphicons-halflings-regular.eot deleted file mode 100644 index 87eaa434234e2a984c261e0450a2f4ad837aa7b4..0000000000000000000000000000000000000000 Binary files a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/.gc3pie/html/bootstrap3/fonts/glyphicons-halflings-regular.eot and /dev/null differ diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/.gc3pie/html/bootstrap3/fonts/glyphicons-halflings-regular.svg b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/.gc3pie/html/bootstrap3/fonts/glyphicons-halflings-regular.svg deleted file mode 100644 index 5fee0685496c143a002985cdfb832dfd3001e6fc..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/.gc3pie/html/bootstrap3/fonts/glyphicons-halflings-regular.svg +++ /dev/null @@ -1,228 +0,0 @@ -<?xml version="1.0" standalone="no"?> -<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" > -<svg xmlns="http://www.w3.org/2000/svg"> -<metadata></metadata> -<defs> -<font id="glyphicons_halflingsregular" horiz-adv-x="1200" > -<font-face units-per-em="1200" ascent="960" descent="-240" /> -<missing-glyph horiz-adv-x="500" /> -<glyph /> -<glyph /> -<glyph unicode=" " /> -<glyph unicode="*" d="M1100 500h-259l183 -183l-141 -141l-183 183v-259h-200v259l-183 -183l-141 141l183 183h-259v200h259l-183 183l141 141l183 -183v259h200v-259l183 183l141 -141l-183 -183h259v-200z" /> -<glyph unicode="+" d="M1100 400h-400v-400h-300v400h-400v300h400v400h300v-400h400v-300z" /> -<glyph unicode=" " /> -<glyph unicode=" " horiz-adv-x="652" /> -<glyph unicode=" " horiz-adv-x="1304" /> -<glyph unicode=" " horiz-adv-x="652" /> -<glyph unicode=" " horiz-adv-x="1304" /> -<glyph unicode=" " horiz-adv-x="434" /> -<glyph unicode=" " horiz-adv-x="326" /> -<glyph unicode=" " horiz-adv-x="217" /> -<glyph unicode=" " horiz-adv-x="217" /> -<glyph unicode=" " horiz-adv-x="163" /> -<glyph unicode=" " horiz-adv-x="260" /> -<glyph unicode=" " horiz-adv-x="72" /> -<glyph unicode=" " horiz-adv-x="260" /> -<glyph unicode=" " horiz-adv-x="326" /> -<glyph unicode="€" d="M800 500h-300q9 -74 33 -132t52.5 -91t62 -54.5t59 -29t46.5 -7.5q29 0 66 13t75 37t63.5 67.5t25.5 96.5h174q-31 -172 -128 -278q-107 -117 -274 -117q-205 0 -324 158q-36 46 -69 131.5t-45 205.5h-217l100 100h113q0 47 5 100h-218l100 100h135q37 167 112 257 q117 141 297 141q242 0 354 -189q60 -103 66 -209h-181q0 55 -25.5 99t-63.5 68t-75 36.5t-67 12.5q-24 0 -52.5 -10t-62.5 -32t-65.5 -67t-50.5 -107h379l-100 -100h-300q-6 -46 -6 -100h406z" /> -<glyph unicode="−" d="M1100 700h-900v-300h900v300z" /> -<glyph unicode="☁" d="M178 300h750q120 0 205 86t85 208q0 120 -85 206.5t-205 86.5q-46 0 -90 -14q-44 97 -134.5 156.5t-200.5 59.5q-152 0 -260 -107.5t-108 -260.5q0 -25 2 -37q-66 -14 -108.5 -67.5t-42.5 -122.5q0 -80 56.5 -137t135.5 -57z" /> -<glyph unicode="✉" d="M1200 1100h-1200l600 -603zM300 600l-300 -300v600zM1200 900v-600l-300 300zM800 500l400 -400h-1200l400 400l200 -200z" /> -<glyph unicode="✏" d="M1101 889l99 92q13 13 13 32.5t-13 33.5l-153 153q-15 13 -33 13t-33 -13l-94 -97zM401 189l614 614l-214 214l-614 -614zM-13 -13l333 112l-223 223z" /> -<glyph unicode="" horiz-adv-x="500" d="M0 0z" /> -<glyph unicode="" d="M700 100h300v-100h-800v100h300v550l-500 550h1200l-500 -550v-550z" /> -<glyph unicode="" d="M1000 934v-521q-64 16 -138 -7q-79 -26 -122.5 -83t-25.5 -111q17 -55 85.5 -75.5t147.5 4.5q70 23 111.5 63.5t41.5 95.5v881q0 10 -7 15.5t-17 2.5l-752 -193q-10 -3 -17 -12.5t-7 -19.5v-689q-64 17 -138 -7q-79 -25 -122.5 -82t-25.5 -112t86 -75.5t147 5.5 q65 21 109 69t44 90v606z" /> -<glyph unicode="" d="M913 432l300 -300q7 -8 7 -18t-7 -18l-109 -109q-8 -7 -18 -7t-18 7l-300 300q-119 -78 -261 -78q-200 0 -342 142t-142 342t142 342t342 142t342 -142t142 -342q0 -142 -78 -261zM176 693q0 -136 97 -233t234 -97t233.5 96.5t96.5 233.5t-96.5 233.5t-233.5 96.5 t-234 -97t-97 -233z" /> -<glyph unicode="" d="M649 949q48 69 109.5 105t121.5 38t118.5 -20.5t102.5 -64t71 -100.5t27 -123q0 -57 -33.5 -117.5t-94 -124.5t-126.5 -127.5t-150 -152.5t-146 -174q-62 85 -145.5 174t-149.5 152.5t-126.5 127.5t-94 124.5t-33.5 117.5q0 64 28 123t73 100.5t104.5 64t119 20.5 t120 -38.5t104.5 -104.5z" /> -<glyph unicode="" d="M791 522l145 -449l-384 275l-382 -275l146 447l-388 280h479l146 400h2l146 -400h472zM168 71l2 1z" /> -<glyph unicode="" d="M791 522l145 -449l-384 275l-382 -275l146 447l-388 280h479l146 400h2l146 -400h472zM747 331l-74 229l193 140h-235l-77 211l-78 -211h-239l196 -142l-73 -226l192 140zM168 71l2 1z" /> -<glyph unicode="" d="M1200 143v-143h-1200v143l400 257v100q-37 0 -68.5 74.5t-31.5 125.5v200q0 124 88 212t212 88t212 -88t88 -212v-200q0 -51 -31.5 -125.5t-68.5 -74.5v-100z" /> -<glyph unicode="" d="M1200 1100v-1100h-1200v1100h1200zM200 1000h-100v-100h100v100zM900 1000h-600v-400h600v400zM1100 1000h-100v-100h100v100zM200 800h-100v-100h100v100zM1100 800h-100v-100h100v100zM200 600h-100v-100h100v100zM1100 600h-100v-100h100v100zM900 500h-600v-400h600 v400zM200 400h-100v-100h100v100zM1100 400h-100v-100h100v100zM200 200h-100v-100h100v100zM1100 200h-100v-100h100v100z" /> -<glyph unicode="" d="M500 1050v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5h400q21 0 35.5 -14.5t14.5 -35.5zM1100 1050v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5h400 q21 0 35.5 -14.5t14.5 -35.5zM500 450v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5h400q21 0 35.5 -14.5t14.5 -35.5zM1100 450v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5v400 q0 21 14.5 35.5t35.5 14.5h400q21 0 35.5 -14.5t14.5 -35.5z" /> -<glyph unicode="" d="M300 1050v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5h200q21 0 35.5 -14.5t14.5 -35.5zM700 1050v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5h200 q21 0 35.5 -14.5t14.5 -35.5zM1100 1050v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5h200q21 0 35.5 -14.5t14.5 -35.5zM300 650v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200 q0 21 14.5 35.5t35.5 14.5h200q21 0 35.5 -14.5t14.5 -35.5zM700 650v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5h200q21 0 35.5 -14.5t14.5 -35.5zM1100 650v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200 q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5h200q21 0 35.5 -14.5t14.5 -35.5zM300 250v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5h200q21 0 35.5 -14.5t14.5 -35.5zM700 250v-200 q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5h200q21 0 35.5 -14.5t14.5 -35.5zM1100 250v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5h200q21 0 35.5 -14.5 t14.5 -35.5z" /> -<glyph unicode="" d="M300 1050v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5h200q21 0 35.5 -14.5t14.5 -35.5zM1200 1050v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-700q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5h700 q21 0 35.5 -14.5t14.5 -35.5zM300 450v200q0 21 -14.5 35.5t-35.5 14.5h-200q-21 0 -35.5 -14.5t-14.5 -35.5v-200q0 -21 14.5 -35.5t35.5 -14.5h200q21 0 35.5 14.5t14.5 35.5zM1200 650v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-700q-21 0 -35.5 14.5t-14.5 35.5v200 q0 21 14.5 35.5t35.5 14.5h700q21 0 35.5 -14.5t14.5 -35.5zM300 250v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5h200q21 0 35.5 -14.5t14.5 -35.5zM1200 250v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-700 q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5h700q21 0 35.5 -14.5t14.5 -35.5z" /> -<glyph unicode="" d="M448 34l818 820l-212 212l-607 -607l-206 207l-212 -212z" /> -<glyph unicode="" d="M882 106l-282 282l-282 -282l-212 212l282 282l-282 282l212 212l282 -282l282 282l212 -212l-282 -282l282 -282z" /> -<glyph unicode="" d="M913 432l300 -300q7 -8 7 -18t-7 -18l-109 -109q-8 -7 -18 -7t-18 7l-300 300q-119 -78 -261 -78q-200 0 -342 142t-142 342t142 342t342 142t342 -142t142 -342q0 -142 -78 -261zM507 363q137 0 233.5 96.5t96.5 233.5t-96.5 233.5t-233.5 96.5t-234 -97t-97 -233 t97 -233t234 -97zM600 800h100v-200h-100v-100h-200v100h-100v200h100v100h200v-100z" /> -<glyph unicode="" d="M913 432l300 -299q7 -7 7 -18t-7 -18l-109 -109q-8 -8 -18 -8t-18 8l-300 299q-120 -77 -261 -77q-200 0 -342 142t-142 342t142 342t342 142t342 -142t142 -342q0 -141 -78 -262zM176 694q0 -136 97 -233t234 -97t233.5 97t96.5 233t-96.5 233t-233.5 97t-234 -97 t-97 -233zM300 801v-200h400v200h-400z" /> -<glyph unicode="" d="M700 750v400q0 21 -14.5 35.5t-35.5 14.5h-100q-21 0 -35.5 -14.5t-14.5 -35.5v-400q0 -21 14.5 -35.5t35.5 -14.5h100q21 0 35.5 14.5t14.5 35.5zM800 975v166q167 -62 272 -210t105 -331q0 -118 -45.5 -224.5t-123 -184t-184 -123t-224.5 -45.5t-224.5 45.5t-184 123 t-123 184t-45.5 224.5q0 183 105 331t272 210v-166q-103 -55 -165 -155t-62 -220q0 -177 125 -302t302 -125t302 125t125 302q0 120 -62 220t-165 155z" /> -<glyph unicode="" d="M1200 1h-200v1200h200v-1200zM900 1h-200v800h200v-800zM600 1h-200v500h200v-500zM300 301h-200v-300h200v300z" /> -<glyph unicode="" d="M488 183l38 -151q40 -5 74 -5q27 0 74 5l38 151l6 2q46 13 93 39l5 3l134 -81q56 44 104 105l-80 134l3 5q24 44 39 93l1 6l152 38q5 40 5 74q0 28 -5 73l-152 38l-1 6q-16 51 -39 93l-3 5l80 134q-44 58 -104 105l-134 -81l-5 3q-45 25 -93 39l-6 1l-38 152q-40 5 -74 5 q-27 0 -74 -5l-38 -152l-5 -1q-50 -14 -94 -39l-5 -3l-133 81q-59 -47 -105 -105l80 -134l-3 -5q-25 -47 -38 -93l-2 -6l-151 -38q-6 -48 -6 -73q0 -33 6 -74l151 -38l2 -6q14 -49 38 -93l3 -5l-80 -134q45 -59 105 -105l133 81l5 -3q45 -26 94 -39zM600 815q89 0 152 -63 t63 -151q0 -89 -63 -152t-152 -63t-152 63t-63 152q0 88 63 151t152 63z" /> -<glyph unicode="" d="M900 1100h275q10 0 17.5 -7.5t7.5 -17.5v-50q0 -11 -7 -18t-18 -7h-1050q-11 0 -18 7t-7 18v50q0 10 7.5 17.5t17.5 7.5h275v100q0 41 29.5 70.5t70.5 29.5h300q41 0 70.5 -29.5t29.5 -70.5v-100zM800 1100v100h-300v-100h300zM200 900h900v-800q0 -41 -29.5 -71 t-70.5 -30h-700q-41 0 -70.5 30t-29.5 71v800zM300 100h100v700h-100v-700zM500 100h100v700h-100v-700zM700 100h100v700h-100v-700zM900 100h100v700h-100v-700z" /> -<glyph unicode="" d="M1301 601h-200v-600h-300v400h-300v-400h-300v600h-200l656 644z" /> -<glyph unicode="" d="M600 700h400v-675q0 -11 -7 -18t-18 -7h-850q-11 0 -18 7t-7 18v1150q0 11 7 18t18 7h475v-500zM1000 800h-300v300z" /> -<glyph unicode="" d="M600 1196q162 0 299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299t80 299t217 217t299 80zM600 1014q-171 0 -292.5 -121.5t-121.5 -292.5t121.5 -292.5t292.5 -121.5t292.5 121.5t121.5 292.5t-121.5 292.5t-292.5 121.5zM600 600h200 v-100h-300v400h100v-300z" /> -<glyph unicode="" d="M721 400h-242l-40 -400h-539l431 1200h209l-21 -300h162l-20 300h208l431 -1200h-538zM712 500l-27 300h-170l-27 -300h224z" /> -<glyph unicode="" d="M1100 400v-400h-1100v400h490l-290 300h200v500h300v-500h200l-290 -300h490zM988 300h-175v-100h175v100z" /> -<glyph unicode="" d="M600 1199q122 0 233 -47.5t191 -127.5t127.5 -191t47.5 -233t-47.5 -233t-127.5 -191t-191 -127.5t-233 -47.5t-233 47.5t-191 127.5t-127.5 191t-47.5 233t47.5 233t127.5 191t191 127.5t233 47.5zM600 1012q-170 0 -291 -121t-121 -291t121 -291t291 -121t291 121 t121 291t-121 291t-291 121zM700 600h150l-250 -300l-250 300h150v300h200v-300z" /> -<glyph unicode="" d="M600 1196q162 0 299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299t80 299t217 217t299 80zM600 1014q-171 0 -292.5 -121.5t-121.5 -292.5t121.5 -292.5t292.5 -121.5t292.5 121.5t121.5 292.5t-121.5 292.5t-292.5 121.5zM850 600h-150 v-300h-200v300h-150l250 300z" /> -<glyph unicode="" d="M0 500l200 700h800q199 -700 200 -700v-475q0 -11 -7 -18t-18 -7h-1150q-11 0 -18 7t-7 18v475zM903 1000h-606l-97 -500h200l50 -200h300l50 200h200z" /> -<glyph unicode="" d="M600 1196q162 0 299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299t80 299t217 217t299 80zM600 1014q-171 0 -292.5 -121.5t-121.5 -292.5q0 -172 121.5 -293t292.5 -121t292.5 121t121.5 293q0 171 -121.5 292.5t-292.5 121.5zM797 598 l-297 -201v401z" /> -<glyph unicode="" d="M1177 600h-150q0 -177 -125 -302t-302 -125t-302 125t-125 302t125 302t302 125q136 0 246 -81l-146 -146h400v400l-145 -145q-157 122 -355 122q-118 0 -224.5 -45.5t-184 -123t-123 -184t-45.5 -224.5t45.5 -224.5t123 -184t184 -123t224.5 -45.5t224.5 45.5t184 123 t123 184t45.5 224.5z" /> -<glyph unicode="" d="M700 800l147 147q-112 80 -247 80q-177 0 -302 -125t-125 -302h-150q0 118 45.5 224.5t123 184t184 123t224.5 45.5q198 0 355 -122l145 145v-400h-400zM500 400l-147 -147q112 -80 247 -80q177 0 302 125t125 302h150q0 -118 -45.5 -224.5t-123 -184t-184 -123 t-224.5 -45.5q-198 0 -355 122l-145 -145v400h400z" /> -<glyph unicode="" d="M100 1200v-1200h1100v1200h-1100zM1100 100h-900v900h900v-900zM400 800h-100v100h100v-100zM1000 800h-500v100h500v-100zM400 600h-100v100h100v-100zM1000 600h-500v100h500v-100zM400 400h-100v100h100v-100zM1000 400h-500v100h500v-100zM400 200h-100v100h100v-100 zM1000 300h-500v-100h500v100z" /> -<glyph unicode="" d="M200 0h-100v1100h100v-1100zM1100 600v500q-40 -81 -101.5 -115.5t-127.5 -29.5t-138 25t-139.5 40t-125.5 25t-103 -29.5t-65 -115.5v-500q60 60 127.5 84t127.5 17.5t122 -23t119 -30t110 -11t103 42t91 120.5z" /> -<glyph unicode="" d="M1200 275v300q0 116 -49.5 227t-131 192.5t-192.5 131t-227 49.5t-227 -49.5t-192.5 -131t-131 -192.5t-49.5 -227v-300q0 -11 7 -18t18 -7h50q11 0 18 7t7 18v300q0 127 70.5 231.5t184.5 161.5t245 57t245 -57t184.5 -161.5t70.5 -231.5v-300q0 -11 7 -18t18 -7h50 q11 0 18 7t7 18zM400 480v-460q0 -8 -6 -14t-14 -6h-160q-8 0 -14 6t-6 14v460q0 8 6 14t14 6h160q8 0 14 -6t6 -14zM1000 480v-460q0 -8 -6 -14t-14 -6h-160q-8 0 -14 6t-6 14v460q0 8 6 14t14 6h160q8 0 14 -6t6 -14z" /> -<glyph unicode="" d="M0 800v-400h300l300 -200v800l-300 -200h-300zM971 600l141 -141l-71 -71l-141 141l-141 -141l-71 71l141 141l-141 141l71 71l141 -141l141 141l71 -71z" /> -<glyph unicode="" d="M0 800v-400h300l300 -200v800l-300 -200h-300zM700 857l69 53q111 -135 111 -310q0 -169 -106 -302l-67 54q86 110 86 248q0 146 -93 257z" /> -<glyph unicode="" d="M974 186l6 8q142 178 142 405q0 230 -144 408l-6 8l-83 -64l7 -8q123 -151 123 -344q0 -189 -119 -339l-7 -8zM300 801l300 200v-800l-300 200h-300v400h300zM702 858l69 53q111 -135 111 -310q0 -170 -106 -303l-67 55q86 110 86 248q0 145 -93 257z" /> -<glyph unicode="" d="M100 700h400v100h100v100h-100v300h-500v-600h100v100zM1200 700v500h-600v-200h100v-300h200v-300h300v200h-200v100h200zM100 1100h300v-300h-300v300zM800 800v300h300v-300h-300zM200 900h100v100h-100v-100zM900 1000h100v-100h-100v100zM300 600h-100v-100h-200 v-500h500v500h-200v100zM900 200v-100h-200v100h-100v100h100v200h-200v100h300v-300h200v-100h-100zM400 400v-300h-300v300h300zM300 200h-100v100h100v-100zM1100 300h100v-100h-100v100zM600 100h100v-100h-100v100zM1200 100v-100h-300v100h300z" /> -<glyph unicode="" d="M100 1200h-100v-1000h100v1000zM300 200h-100v1000h100v-1000zM700 200h-200v1000h200v-1000zM900 200h-100v1000h100v-1000zM1200 1200v-1000h-200v1000h200zM400 100v-100h-300v100h300zM500 91h100v-91h-100v91zM700 91h100v-91h-100v91zM1100 91v-91h-200v91h200z " /> -<glyph unicode="" d="M1200 500l-500 -500l-699 700v475q0 10 7.5 17.5t17.5 7.5h474zM320 882q29 29 29 71t-29 71q-30 30 -71.5 30t-71.5 -30q-29 -29 -29 -71t29 -71q30 -30 71.5 -30t71.5 30z" /> -<glyph unicode="" d="M1201 500l-500 -500l-699 700v475q0 11 7 18t18 7h474zM1501 500l-500 -500l-50 50l450 450l-700 700h100zM320 882q30 29 30 71t-30 71q-29 30 -71 30t-71 -30q-30 -29 -30 -71t30 -71q29 -30 71 -30t71 30z" /> -<glyph unicode="" d="M1200 1200v-1000l-100 -100v1000h-750l-100 -100h750v-1000h-900v1025l175 175h925z" /> -<glyph unicode="" d="M947 829l-94 346q-2 11 -10 18t-18 7h-450q-10 0 -18 -7t-10 -18l-94 -346l40 -124h592zM1200 800v-700h-200v200h-800v-200h-200v700h200l100 -200h600l100 200h200zM881 176l38 -152q2 -10 -3.5 -17t-15.5 -7h-600q-10 0 -15.5 7t-3.5 17l38 152q2 10 11.5 17t19.5 7 h500q10 0 19.5 -7t11.5 -17z" /> -<glyph unicode="" d="M1200 0v66q-34 1 -74 43q-18 19 -33 42t-21 37l-6 13l-385 998h-93l-399 -1006q-24 -48 -52 -75q-12 -12 -33 -25t-36 -20l-15 -7v-66h365v66q-41 0 -72 11t-49 38t1 71l92 234h391l82 -222q16 -45 -5.5 -88.5t-74.5 -43.5v-66h417zM416 521l178 457l46 -140l116 -317 h-340z" /> -<glyph unicode="" d="M100 1199h471q120 0 213 -88t93 -228q0 -55 -11.5 -101.5t-28 -74t-33.5 -47.5t-28 -28l-12 -7q8 -3 21.5 -9t48 -31.5t60.5 -58t47.5 -91.5t21.5 -129q0 -84 -59 -156.5t-142 -111t-162 -38.5h-500v89q41 7 70.5 32.5t29.5 65.5v827q0 28 -1 39.5t-5.5 26t-15.5 21 t-29 14t-49 14.5v70zM400 1079v-379h139q76 0 130 61.5t54 138.5q0 82 -84 130.5t-239 48.5zM400 200h161q89 0 153 48.5t64 132.5q0 90 -62.5 154.5t-156.5 64.5h-159v-400z" /> -<glyph unicode="" d="M877 1200l2 -57q-33 -8 -62 -25.5t-46 -37t-29.5 -38t-17.5 -30.5l-5 -12l-128 -825q-10 -52 14 -82t95 -36v-57h-500v57q77 7 134.5 40.5t65.5 80.5l173 849q10 56 -10 74t-91 37q-6 1 -10.5 2.5t-9.5 2.5v57h425z" /> -<glyph unicode="" d="M1150 1200h150v-300h-50q0 29 -8 48.5t-18.5 30t-33.5 15t-39.5 5.5t-50.5 1h-200v-850l100 -50v-100h-400v100l100 50v850h-200q-34 0 -50.5 -1t-40 -5.5t-33.5 -15t-18.5 -30t-8.5 -48.5h-49v300h150h700zM100 1000v-800h75l-125 -167l-125 167h75v800h-75l125 167 l125 -167h-75z" /> -<glyph unicode="" d="M950 1201h150v-300h-50q0 29 -8 48.5t-18 30t-33.5 15t-40 5.5t-50.5 1h-200v-650l100 -50v-100h-400v100l100 50v650h-200q-34 0 -50.5 -1t-39.5 -5.5t-33.5 -15t-18.5 -30t-8 -48.5h-50v300h150h700zM200 101h800v75l167 -125l-167 -125v75h-800v-75l-167 125l167 125 v-75z" /> -<glyph unicode="" d="M700 950v100q0 21 -14.5 35.5t-35.5 14.5h-600q-21 0 -35.5 -14.5t-14.5 -35.5v-100q0 -20 14.5 -35t35.5 -15h600q21 0 35.5 15t14.5 35zM1100 650v100q0 21 -14.5 35.5t-35.5 14.5h-1000q-21 0 -35.5 -14.5t-14.5 -35.5v-100q0 -20 14.5 -35t35.5 -15h1000 q21 0 35.5 15t14.5 35zM900 350v100q0 21 -14.5 35.5t-35.5 14.5h-800q-21 0 -35.5 -14.5t-14.5 -35.5v-100q0 -20 14.5 -35t35.5 -15h800q21 0 35.5 15t14.5 35zM1200 50v100q0 21 -14.5 35.5t-35.5 14.5h-1100q-21 0 -35.5 -14.5t-14.5 -35.5v-100q0 -20 14.5 -35 t35.5 -15h1100q21 0 35.5 15t14.5 35z" /> -<glyph unicode="" d="M1000 950v100q0 21 -14.5 35.5t-35.5 14.5h-700q-21 0 -35.5 -14.5t-14.5 -35.5v-100q0 -20 14.5 -35t35.5 -15h700q21 0 35.5 15t14.5 35zM1200 650v100q0 21 -14.5 35.5t-35.5 14.5h-1100q-21 0 -35.5 -14.5t-14.5 -35.5v-100q0 -20 14.5 -35t35.5 -15h1100 q21 0 35.5 15t14.5 35zM1000 350v100q0 21 -14.5 35.5t-35.5 14.5h-700q-21 0 -35.5 -14.5t-14.5 -35.5v-100q0 -20 14.5 -35t35.5 -15h700q21 0 35.5 15t14.5 35zM1200 50v100q0 21 -14.5 35.5t-35.5 14.5h-1100q-21 0 -35.5 -14.5t-14.5 -35.5v-100q0 -20 14.5 -35 t35.5 -15h1100q21 0 35.5 15t14.5 35z" /> -<glyph unicode="" d="M500 950v100q0 21 14.5 35.5t35.5 14.5h600q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-600q-21 0 -35.5 15t-14.5 35zM100 650v100q0 21 14.5 35.5t35.5 14.5h1000q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-1000q-21 0 -35.5 15 t-14.5 35zM300 350v100q0 21 14.5 35.5t35.5 14.5h800q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-800q-21 0 -35.5 15t-14.5 35zM0 50v100q0 21 14.5 35.5t35.5 14.5h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-1100 q-21 0 -35.5 15t-14.5 35z" /> -<glyph unicode="" d="M0 950v100q0 21 14.5 35.5t35.5 14.5h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-1100q-21 0 -35.5 15t-14.5 35zM0 650v100q0 21 14.5 35.5t35.5 14.5h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-1100q-21 0 -35.5 15 t-14.5 35zM0 350v100q0 21 14.5 35.5t35.5 14.5h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-1100q-21 0 -35.5 15t-14.5 35zM0 50v100q0 21 14.5 35.5t35.5 14.5h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-1100 q-21 0 -35.5 15t-14.5 35z" /> -<glyph unicode="" d="M0 950v100q0 21 14.5 35.5t35.5 14.5h100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-100q-21 0 -35.5 15t-14.5 35zM300 950v100q0 21 14.5 35.5t35.5 14.5h800q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-800q-21 0 -35.5 15 t-14.5 35zM0 650v100q0 21 14.5 35.5t35.5 14.5h100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-100q-21 0 -35.5 15t-14.5 35zM300 650v100q0 21 14.5 35.5t35.5 14.5h800q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-800 q-21 0 -35.5 15t-14.5 35zM0 350v100q0 21 14.5 35.5t35.5 14.5h100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-100q-21 0 -35.5 15t-14.5 35zM300 350v100q0 21 14.5 35.5t35.5 14.5h800q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15 h-800q-21 0 -35.5 15t-14.5 35zM0 50v100q0 21 14.5 35.5t35.5 14.5h100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-100q-21 0 -35.5 15t-14.5 35zM300 50v100q0 21 14.5 35.5t35.5 14.5h800q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15 h-800q-21 0 -35.5 15t-14.5 35z" /> -<glyph unicode="" d="M400 1100h-100v-1100h100v1100zM700 950v100q0 21 -15 35.5t-35 14.5h-100q-21 0 -35.5 -14.5t-14.5 -35.5v-100q0 -20 14.5 -35t35.5 -15h100q20 0 35 15t15 35zM1100 650v100q0 21 -15 35.5t-35 14.5h-500q-21 0 -35.5 -14.5t-14.5 -35.5v-100q0 -20 14.5 -35t35.5 -15 h500q20 0 35 15t15 35zM100 425v75h-201v100h201v75l166 -125zM900 350v100q0 21 -15 35.5t-35 14.5h-300q-21 0 -35.5 -14.5t-14.5 -35.5v-100q0 -20 14.5 -35t35.5 -15h300q20 0 35 15t15 35zM1200 50v100q0 21 -15 35.5t-35 14.5h-600q-21 0 -35.5 -14.5t-14.5 -35.5 v-100q0 -20 14.5 -35t35.5 -15h600q20 0 35 15t15 35z" /> -<glyph unicode="" d="M201 950v100q0 21 -15 35.5t-35 14.5h-100q-21 0 -35.5 -14.5t-14.5 -35.5v-100q0 -20 14.5 -35t35.5 -15h100q20 0 35 15t15 35zM801 1100h100v-1100h-100v1100zM601 650v100q0 21 -15 35.5t-35 14.5h-500q-21 0 -35.5 -14.5t-14.5 -35.5v-100q0 -20 14.5 -35t35.5 -15 h500q20 0 35 15t15 35zM1101 425v75h200v100h-200v75l-167 -125zM401 350v100q0 21 -15 35.5t-35 14.5h-300q-21 0 -35.5 -14.5t-14.5 -35.5v-100q0 -20 14.5 -35t35.5 -15h300q20 0 35 15t15 35zM701 50v100q0 21 -15 35.5t-35 14.5h-600q-21 0 -35.5 -14.5t-14.5 -35.5 v-100q0 -20 14.5 -35t35.5 -15h600q20 0 35 15t15 35z" /> -<glyph unicode="" d="M900 925v-650q0 -31 -22 -53t-53 -22h-750q-31 0 -53 22t-22 53v650q0 31 22 53t53 22h750q31 0 53 -22t22 -53zM1200 300l-300 300l300 300v-600z" /> -<glyph unicode="" d="M1200 1056v-1012q0 -18 -12.5 -31t-31.5 -13h-1112q-18 0 -31 13t-13 31v1012q0 18 13 31t31 13h1112q19 0 31.5 -13t12.5 -31zM1100 1000h-1000v-737l247 182l298 -131l-74 156l293 318l236 -288v500zM476 750q0 -56 -39 -95t-95 -39t-95 39t-39 95t39 95t95 39t95 -39 t39 -95z" /> -<glyph unicode="" d="M600 1213q123 0 227 -63t164.5 -169.5t60.5 -229.5t-73 -272q-73 -114 -166.5 -237t-150.5 -189l-57 -66q-10 9 -27 26t-66.5 70.5t-96 109t-104 135.5t-100.5 155q-63 139 -63 262q0 124 60.5 231.5t165 172t226.5 64.5zM599 514q107 0 182.5 75.5t75.5 182.5t-75.5 182 t-182.5 75t-182 -75.5t-75 -181.5q0 -107 75.5 -182.5t181.5 -75.5z" /> -<glyph unicode="" d="M600 1199q122 0 233 -47.5t191 -127.5t127.5 -191t47.5 -233t-47.5 -233t-127.5 -191t-191 -127.5t-233 -47.5t-233 47.5t-191 127.5t-127.5 191t-47.5 233t47.5 233t127.5 191t191 127.5t233 47.5zM600 173v854q-176 0 -301.5 -125t-125.5 -302t125.5 -302t301.5 -125z " /> -<glyph unicode="" d="M554 1295q21 -71 57.5 -142.5t76 -130.5t83 -118.5t82 -117t70 -116t50 -125.5t18.5 -136q0 -89 -39 -165.5t-102 -126.5t-140 -79.5t-156 -33.5q-114 6 -211.5 53t-161.5 138.5t-64 210.5q0 94 34 186t88.5 172.5t112 159t115 177t87.5 194.5zM455 296q-7 6 -18 17 t-34 48t-33 77q-15 73 -14 143.5t10 122.5l9 51q-92 -110 -119.5 -185t-12.5 -156q14 -82 59.5 -136t136.5 -80z" /> -<glyph unicode="" d="M1108 902l113 113l-21 85l-92 28l-113 -113zM1100 625v-225q0 -165 -117.5 -282.5t-282.5 -117.5h-300q-165 0 -282.5 117.5t-117.5 282.5v300q0 165 117.5 282.5t282.5 117.5q366 -6 397 -14l-186 -186h-311q-41 0 -70.5 -29.5t-29.5 -70.5v-500q0 -41 29.5 -70.5 t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5v125zM436 341l161 50l412 412l-114 113l-405 -405z" /> -<glyph unicode="" d="M1100 453v-53q0 -165 -117.5 -282.5t-282.5 -117.5h-300q-165 0 -282.5 117.5t-117.5 282.5v300q0 165 117.5 282.5t282.5 117.5h261l2 -80q-133 -32 -218 -120h-145q-41 0 -70.5 -29.5t-29.5 -70.5v-500q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5z M813 431l360 324l-359 318v-216q-7 0 -19 -1t-48 -8t-69.5 -18.5t-76.5 -37t-76.5 -59t-62 -88t-39.5 -121.5q30 38 81.5 64t103 35.5t99 14t77.5 3.5l29 -1v-209z" /> -<glyph unicode="" d="M1100 569v-169q0 -165 -117.5 -282.5t-282.5 -117.5h-300q-165 0 -282.5 117.5t-117.5 282.5v300q0 165 117.5 282.5t282.5 117.5h300q60 0 127 -23l-178 -177h-349q-41 0 -70.5 -29.5t-29.5 -70.5v-500q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5v69z M625 348l566 567l-136 137l-430 -431l-147 147l-136 -136z" /> -<glyph unicode="" d="M900 303v198h-200v-200h195l-295 -300l-300 300h200v200h-200v-198l-300 300l300 296v-198h200v200h-200l300 300l295 -300h-195v-200h200v198l300 -296z" /> -<glyph unicode="" d="M900 0l-500 488v-438q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v1000q0 21 14.5 35.5t35.5 14.5h100q21 0 35.5 -14.5t14.5 -35.5v-437l500 487v-1100z" /> -<glyph unicode="" d="M1200 0l-500 488v-488l-500 488v-438q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v1000q0 21 14.5 35.5t35.5 14.5h100q21 0 35.5 -14.5t14.5 -35.5v-437l500 487v-487l500 487v-1100z" /> -<glyph unicode="" d="M1200 0l-500 488v-488l-564 550l564 550v-487l500 487v-1100z" /> -<glyph unicode="" d="M1100 550l-900 550v-1100z" /> -<glyph unicode="" d="M500 150v800q0 21 -14.5 35.5t-35.5 14.5h-200q-21 0 -35.5 -14.5t-14.5 -35.5v-800q0 -21 14.5 -35.5t35.5 -14.5h200q21 0 35.5 14.5t14.5 35.5zM900 150v800q0 21 -14.5 35.5t-35.5 14.5h-200q-21 0 -35.5 -14.5t-14.5 -35.5v-800q0 -21 14.5 -35.5t35.5 -14.5h200 q21 0 35.5 14.5t14.5 35.5z" /> -<glyph unicode="" d="M1100 150v800q0 21 -14.5 35.5t-35.5 14.5h-800q-21 0 -35.5 -14.5t-14.5 -35.5v-800q0 -20 14.5 -35t35.5 -15h800q21 0 35.5 15t14.5 35z" /> -<glyph unicode="" d="M500 0v488l-500 -488v1100l500 -487v487l564 -550z" /> -<glyph unicode="" d="M1050 1100h100q21 0 35.5 -14.5t14.5 -35.5v-1000q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v438l-500 -488v488l-500 -488v1100l500 -487v487l500 -487v437q0 21 14.5 35.5t35.5 14.5z" /> -<glyph unicode="" d="M850 1100h100q21 0 35.5 -14.5t14.5 -35.5v-1000q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v438l-500 -488v1100l500 -487v437q0 21 14.5 35.5t35.5 14.5z" /> -<glyph unicode="" d="M650 1064l-550 -564h1100zM1200 350v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-1000q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5h1000q21 0 35.5 -14.5t14.5 -35.5z" /> -<glyph unicode="" d="M777 7l240 240l-353 353l353 353l-240 240l-592 -594z" /> -<glyph unicode="" d="M513 -46l-241 240l353 353l-353 353l241 240l572 -571l21 -22l-1 -1v-1z" /> -<glyph unicode="" d="M600 1197q162 0 299.5 -80t217.5 -217.5t80 -299.5t-80 -299.5t-217.5 -217.5t-299.5 -80t-299.5 80t-217.5 217.5t-80 299.5t80 299.5t217.5 217.5t299.5 80zM500 900v-200h-200v-200h200v-200h200v200h200v200h-200v200h-200z" /> -<glyph unicode="" d="M600 1197q162 0 299.5 -80t217.5 -217.5t80 -299.5t-80 -299.5t-217.5 -217.5t-299.5 -80t-299.5 80t-217.5 217.5t-80 299.5t80 299.5t217.5 217.5t299.5 80zM300 700v-200h600v200h-600z" /> -<glyph unicode="" d="M600 1197q162 0 299.5 -80t217.5 -217.5t80 -299.5t-80 -299.5t-217.5 -217.5t-299.5 -80t-299.5 80t-217.5 217.5t-80 299.5t80 299.5t217.5 217.5t299.5 80zM247 741l141 -141l-142 -141l213 -213l141 142l141 -142l213 213l-142 141l142 141l-213 212l-141 -141 l-141 142z" /> -<glyph unicode="" d="M600 1197q162 0 299.5 -80t217.5 -217.5t80 -299.5t-80 -299.5t-217.5 -217.5t-299.5 -80t-299.5 80t-217.5 217.5t-80 299.5t80 299.5t217.5 217.5t299.5 80zM546 623l-102 102l-174 -174l276 -277l411 411l-175 174z" /> -<glyph unicode="" d="M600 1197q162 0 299.5 -80t217.5 -217.5t80 -299.5t-80 -299.5t-217.5 -217.5t-299.5 -80t-299.5 80t-217.5 217.5t-80 299.5t80 299.5t217.5 217.5t299.5 80zM500 500h200q5 3 14 8t31.5 25.5t39.5 45.5t31 69t14 94q0 51 -17.5 89t-42 58t-58.5 32t-58.5 15t-51.5 3 q-105 0 -172 -56t-67 -183h144q4 0 11.5 -1t11 -1t6.5 3t3 9t1 11t3.5 8.5t3.5 6t5.5 4t6.5 2.5t9 1.5t9 0.5h11.5h12.5q19 0 30 -10t11 -26q0 -22 -4 -28t-27 -22q-5 -1 -12.5 -3t-27 -13.5t-34 -27t-26.5 -46t-11 -68.5zM500 400v-100h200v100h-200z" /> -<glyph unicode="" d="M600 1197q162 0 299.5 -80t217.5 -217.5t80 -299.5t-80 -299.5t-217.5 -217.5t-299.5 -80t-299.5 80t-217.5 217.5t-80 299.5t80 299.5t217.5 217.5t299.5 80zM500 900v-100h200v100h-200zM400 700v-100h100v-200h-100v-100h400v100h-100v300h-300z" /> -<glyph unicode="" d="M1200 700v-200h-203q-25 -102 -116.5 -186t-180.5 -117v-197h-200v197q-140 27 -208 102.5t-98 200.5h-194v200h194q15 60 36 104.5t55.5 86t88 69t126.5 40.5v200h200v-200q54 -20 113 -60t112.5 -105.5t71.5 -134.5h203zM700 500v-206q149 48 201 206h-201v200h200 q-25 74 -76 127.5t-124 76.5v-204h-200v203q-75 -24 -130 -77.5t-79 -125.5h209v-200h-210q24 -73 79.5 -127.5t130.5 -78.5v206h200z" /> -<glyph unicode="" d="M600 1196q162 0 299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299t80 299t217 217t299 80zM600 1014q-171 0 -292.5 -121.5t-121.5 -292.5t121.5 -292.5t292.5 -121.5t292.5 121.5t121.5 292.5t-121.5 292.5t-292.5 121.5zM844 735 l-135 -135l135 -135l-109 -109l-135 135l-135 -135l-109 109l135 135l-135 135l109 109l135 -135l135 135z" /> -<glyph unicode="" d="M600 1196q162 0 299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299t80 299t217 217t299 80zM600 1014q-171 0 -292.5 -121.5t-121.5 -292.5t121.5 -292.5t292.5 -121.5t292.5 121.5t121.5 292.5t-121.5 292.5t-292.5 121.5zM896 654 l-346 -345l-228 228l141 141l87 -87l204 205z" /> -<glyph unicode="" d="M600 1196q162 0 299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299t80 299t217 217t299 80zM248 385l568 567q-100 62 -216 62q-171 0 -292.5 -121.5t-121.5 -292.5q0 -115 62 -215zM955 809l-564 -564q97 -59 209 -59q171 0 292.5 121.5 t121.5 292.5q0 112 -59 209z" /> -<glyph unicode="" d="M1200 400h-600v-301l-600 448l600 453v-300h600v-300z" /> -<glyph unicode="" d="M600 400h-600v300h600v300l600 -453l-600 -448v301z" /> -<glyph unicode="" d="M1098 600h-298v-600h-300v600h-296l450 600z" /> -<glyph unicode="" d="M998 600l-449 -600l-445 600h296v600h300v-600h298z" /> -<glyph unicode="" d="M600 199v301q-95 -2 -183 -20t-170 -52t-147 -92.5t-100 -135.5q6 132 41 238.5t103.5 193t184 138t271.5 59.5v271l600 -453z" /> -<glyph unicode="" d="M1200 1200h-400l129 -129l-294 -294l142 -142l294 294l129 -129v400zM565 423l-294 -294l129 -129h-400v400l129 -129l294 294z" /> -<glyph unicode="" d="M871 730l129 -130h-400v400l129 -129l295 295l142 -141zM200 600h400v-400l-129 130l-295 -295l-142 141l295 295z" /> -<glyph unicode="" d="M600 1177q118 0 224.5 -45.5t184 -123t123 -184t45.5 -224.5t-45.5 -224.5t-123 -184t-184 -123t-224.5 -45.5t-224.5 45.5t-184 123t-123 184t-45.5 224.5t45.5 224.5t123 184t184 123t224.5 45.5zM686 549l58 302q4 20 -8 34.5t-33 14.5h-207q-20 0 -32 -14.5t-8 -34.5 l58 -302q4 -20 21.5 -34.5t37.5 -14.5h54q20 0 37.5 14.5t21.5 34.5zM700 400h-200v-100h200v100z" /> -<glyph unicode="" d="M1200 900h-111v6t-1 15t-3 18l-34 172q-11 39 -41.5 63t-69.5 24q-32 0 -61 -17l-239 -144q-22 -13 -40 -35q-19 24 -40 36l-238 144q-33 18 -62 18q-39 0 -69.5 -23t-40.5 -61l-35 -177q-2 -8 -3 -18t-1 -15v-6h-111v-100h100v-200h400v300h200v-300h400v200h100v100z M731 900l202 197q5 -12 12 -32.5t23 -64t25 -72t7 -28.5h-269zM481 900h-281q-3 0 14 48t35 96l18 47zM100 0h400v400h-400v-400zM700 400h400v-400h-400v400z" /> -<glyph unicode="" d="M0 121l216 193q-9 53 -13 83t-5.5 94t9 113t38.5 114t74 124q47 60 99.5 102.5t103 68t127.5 48t145.5 37.5t184.5 43.5t220 58.5q0 -189 -22 -343t-59 -258t-89 -181.5t-108.5 -120t-122 -68t-125.5 -30t-121.5 -1.5t-107.5 12.5t-87.5 17t-56.5 7.5l-99 -55l-201 -202 v143zM692 611q70 38 118.5 69.5t102 79t99 111.5t86.5 148q22 50 24 60t-6 19q-7 5 -17 5t-26.5 -14.5t-33.5 -39.5q-35 -51 -113.5 -108.5t-139.5 -89.5l-61 -32q-369 -197 -458 -401q-48 -111 -28.5 -117.5t86.5 76.5q55 66 367 234z" /> -<glyph unicode="" d="M1261 600l-26 -40q-6 -10 -20 -30t-49 -63.5t-74.5 -85.5t-97 -90t-116.5 -83.5t-132.5 -59t-145.5 -23.5t-145.5 23.5t-132.5 59t-116.5 83.5t-97 90t-74.5 85.5t-49 63.5t-20 30l-26 40l26 40q6 10 20 30t49 63.5t74.5 85.5t97 90t116.5 83.5t132.5 59t145.5 23.5 t145.5 -23.5t132.5 -59t116.5 -83.5t97 -90t74.5 -85.5t49 -63.5t20 -30zM600 240q64 0 123.5 20t100.5 45.5t85.5 71.5t66.5 75.5t58 81.5t47 66q-1 1 -28.5 37.5t-42 55t-43.5 53t-57.5 63.5t-58.5 54q49 -74 49 -163q0 -124 -88 -212t-212 -88t-212 88t-88 212 q0 85 46 158q-102 -87 -226 -258q7 -10 40.5 -58t56 -78.5t68 -77.5t87.5 -75t103 -49.5t125 -21.5zM484 762l-107 -106q49 -124 154 -191l105 105q-37 24 -75 72t-57 84z" /> -<glyph unicode="" d="M906 1200l-314 -1200h-148l37 143q-82 21 -165 71.5t-140 102t-109.5 112t-72 88.5t-29.5 43l-26 40l26 40q6 10 20 30t49 63.5t74.5 85.5t97 90t116.5 83.5t132.5 59t145.5 23.5q61 0 121 -17l37 142h148zM1261 600l-26 -40q-7 -12 -25.5 -38t-63.5 -79.5t-95.5 -102.5 t-124 -100t-146.5 -79l38 145q22 15 44.5 34t46 44t40.5 44t41 50.5t33.5 43.5t33 44t24.5 34q-97 127 -140 175l39 146q67 -54 131.5 -125.5t87.5 -103.5t36 -52zM513 264l37 141q-107 18 -178.5 101.5t-71.5 193.5q0 85 46 158q-102 -87 -226 -258q210 -282 393 -336z M484 762l-107 -106q49 -124 154 -191l47 47l23 87q-30 28 -59 69t-44 68z" /> -<glyph unicode="" d="M-47 0h1294q37 0 50.5 35.5t-7.5 67.5l-642 1056q-20 33 -48 36t-48 -29l-642 -1066q-21 -32 -7.5 -66t50.5 -34zM700 200v100h-200v-100h-345l445 723l445 -723h-345zM700 700h-200v-100l100 -300l100 300v100z" /> -<glyph unicode="" d="M800 711l363 -325q15 -14 26 -38.5t11 -44.5v-41q0 -20 -12 -26.5t-29 5.5l-359 249v-263q100 -91 100 -113v-64q0 -21 -13 -29t-32 1l-94 78h-222l-94 -78q-19 -9 -32 -1t-13 29v64q0 22 100 113v263l-359 -249q-17 -12 -29 -5.5t-12 26.5v41q0 20 11 44.5t26 38.5 l363 325v339q0 62 44 106t106 44t106 -44t44 -106v-339z" /> -<glyph unicode="" d="M941 800l-600 -600h-341v200h259l600 600h241v198l300 -295l-300 -300v197h-159zM381 678l141 142l-181 180h-341v-200h259zM1100 598l300 -295l-300 -300v197h-241l-181 181l141 142l122 -123h159v198z" /> -<glyph unicode="" d="M100 1100h1000q41 0 70.5 -29.5t29.5 -70.5v-600q0 -41 -29.5 -70.5t-70.5 -29.5h-596l-304 -300v300h-100q-41 0 -70.5 29.5t-29.5 70.5v600q0 41 29.5 70.5t70.5 29.5z" /> -<glyph unicode="" d="M400 900h-300v300h300v-300zM1100 900h-300v300h300v-300zM1100 800v-200q0 -42 -3 -83t-15 -104t-31.5 -116t-58 -109.5t-89 -96.5t-129 -65.5t-174.5 -25.5t-174.5 25.5t-129 65.5t-89 96.5t-58 109.5t-31.5 116t-15 104t-3 83v200h300v-250q0 -113 6 -145 q17 -92 102 -117q39 -11 92 -11q37 0 66.5 5.5t50 15.5t36 24t24 31.5t14 37.5t7 42t2.5 45t0 47v25v250h300z" /> -<glyph unicode="" d="M902 184l226 227l-578 579l-580 -579l227 -227l352 353z" /> -<glyph unicode="" d="M650 218l578 579l-226 227l-353 -353l-352 353l-227 -227z" /> -<glyph unicode="" d="M1198 400v600h-796l215 -200h381v-400h-198l299 -283l299 283h-200zM-198 700l299 283l300 -283h-203v-400h385l215 -200h-800v600h-196z" /> -<glyph unicode="" d="M1050 1200h94q20 0 35 -14.5t15 -35.5t-15 -35.5t-35 -14.5h-54l-201 -961q-2 -4 -6 -10.5t-19 -17.5t-33 -11h-31v-50q0 -20 -14.5 -35t-35.5 -15t-35.5 15t-14.5 35v50h-300v-50q0 -20 -14.5 -35t-35.5 -15t-35.5 15t-14.5 35v50h-50q-21 0 -35.5 15t-14.5 35 q0 21 14.5 35.5t35.5 14.5h535l48 200h-633q-32 0 -54.5 21t-27.5 43l-100 475q-5 24 10 42q14 19 39 19h896l38 162q5 17 18.5 27.5t30.5 10.5z" /> -<glyph unicode="" d="M1200 1000v-100h-1200v100h200q0 41 29.5 70.5t70.5 29.5h300q41 0 70.5 -29.5t29.5 -70.5h500zM0 800h1200v-800h-1200v800z" /> -<glyph unicode="" d="M201 800l-200 -400v600h200q0 41 29.5 70.5t70.5 29.5h300q41 0 70.5 -29.5t29.5 -70.5h500v-200h-1000zM1501 700l-300 -700h-1200l300 700h1200z" /> -<glyph unicode="" d="M302 300h198v600h-198l298 300l298 -300h-198v-600h198l-298 -300z" /> -<glyph unicode="" d="M900 303v197h-600v-197l-300 297l300 298v-198h600v198l300 -298z" /> -<glyph unicode="" d="M31 400l172 739q5 22 23 41.5t38 19.5h672q19 0 37.5 -22.5t23.5 -45.5l172 -732h-1138zM100 300h1000q41 0 70.5 -29.5t29.5 -70.5v-100q0 -41 -29.5 -70.5t-70.5 -29.5h-1000q-41 0 -70.5 29.5t-29.5 70.5v100q0 41 29.5 70.5t70.5 29.5zM900 200h-100v-100h100v100z M1100 200h-100v-100h100v100z" /> -<glyph unicode="" d="M1100 200v850q0 21 14.5 35.5t35.5 14.5q20 0 35 -14.5t15 -35.5v-850q0 -20 -15 -35t-35 -15q-21 0 -35.5 15t-14.5 35zM325 800l675 250v-850l-675 200h-38l47 -276q2 -12 -3 -17.5t-11 -6t-21 -0.5h-8h-83q-20 0 -34.5 14t-18.5 35q-56 337 -56 351v250v5 q0 13 0.5 18.5t2.5 13t8 10.5t15 3h200zM-101 600v50q0 24 25 49t50 38l25 13v-250l-11 5.5t-24 14t-30 21.5t-24 27.5t-11 31.5z" /> -<glyph unicode="" d="M445 1180l-45 -233l-224 78l78 -225l-233 -44l179 -156l-179 -155l233 -45l-78 -224l224 78l45 -233l155 179l155 -179l45 233l224 -78l-78 224l234 45l-180 155l180 156l-234 44l78 225l-224 -78l-45 233l-155 -180z" /> -<glyph unicode="" d="M700 1200h-50q-27 0 -51 -20t-38 -48l-96 -198l-145 -196q-20 -26 -20 -63v-400q0 -75 100 -75h61q123 -100 139 -100h250q46 0 83 57l238 344q29 31 29 74v100q0 44 -30.5 84.5t-69.5 40.5h-328q28 118 28 125v150q0 44 -30.5 84.5t-69.5 40.5zM700 925l-50 -225h450 v-125l-250 -375h-214l-136 100h-100v375l150 212l100 213h50v-175zM0 800v-600h200v600h-200z" /> -<glyph unicode="" d="M700 0h-50q-27 0 -51 20t-38 48l-96 198l-145 196q-20 26 -20 63v400q0 75 100 75h61q123 100 139 100h250q46 0 83 -57l238 -344q29 -31 29 -74v-100q0 -44 -30.5 -84.5t-69.5 -40.5h-328q28 -118 28 -125v-150q0 -44 -30.5 -84.5t-69.5 -40.5zM200 400h-200v600h200 v-600zM700 275l-50 225h450v125l-250 375h-214l-136 -100h-100v-375l150 -212l100 -213h50v175z" /> -<glyph unicode="" d="M364 873l362 230q14 6 25 6q17 0 29 -12l109 -112q14 -14 14 -34q0 -18 -11 -32l-85 -121h302q85 0 138.5 -38t53.5 -110t-54.5 -111t-138.5 -39h-107l-130 -339q-7 -22 -20.5 -41.5t-28.5 -19.5h-341q-7 0 -90 81t-83 94v525q0 17 14 35.5t28 28.5zM408 792v-503 l100 -89h293l131 339q6 21 19.5 41t28.5 20h203q16 0 25 15t9 36q0 20 -9 34.5t-25 14.5h-457h-6.5h-7.5t-6.5 0.5t-6 1t-5 1.5t-5.5 2.5t-4 4t-4 5.5q-5 12 -5 20q0 14 10 27l147 183l-86 83zM208 200h-200v600h200v-600z" /> -<glyph unicode="" d="M475 1104l365 -230q7 -4 16.5 -10.5t26 -26t16.5 -36.5v-526q0 -13 -85.5 -93.5t-93.5 -80.5h-342q-15 0 -28.5 20t-19.5 41l-131 339h-106q-84 0 -139 39t-55 111t54 110t139 37h302l-85 121q-11 16 -11 32q0 21 14 34l109 113q13 12 29 12q11 0 25 -6zM370 946 l145 -184q10 -11 10 -26q0 -11 -5 -20q-1 -3 -3.5 -5.5l-4 -4t-5 -2.5t-5.5 -1.5t-6.5 -1t-6.5 -0.5h-7.5h-6.5h-476v-100h222q15 0 28.5 -20.5t19.5 -40.5l131 -339h293l106 89v502l-342 237zM1199 201h-200v600h200v-600z" /> -<glyph unicode="" d="M1100 473v342q0 15 -20 28.5t-41 19.5l-339 131v106q0 84 -39 139t-111 55t-110 -53.5t-38 -138.5v-302l-121 84q-15 12 -33.5 11.5t-32.5 -13.5l-112 -110q-22 -22 -6 -53l230 -363q4 -6 10.5 -15.5t26 -25t36.5 -15.5h525q13 0 94 83t81 90zM911 400h-503l-236 339 l83 86l183 -146q22 -18 47 -5q3 1 5.5 3.5l4 4t2.5 5t1.5 5.5t1 6.5t0.5 6v7.5v7v456q0 22 25 31t50 -0.5t25 -30.5v-202q0 -16 20 -29.5t41 -19.5l339 -130v-294zM1000 200v-200h-600v200h600z" /> -<glyph unicode="" d="M305 1104v200h600v-200h-600zM605 310l339 131q20 6 40.5 19.5t20.5 28.5v342q0 7 -81 90t-94 83h-525q-17 0 -35.5 -14t-28.5 -28l-10 -15l-230 -362q-15 -31 7 -53l112 -110q13 -13 32 -13.5t34 10.5l121 85l-1 -302q0 -84 38.5 -138t110.5 -54t111 55t39 139v106z M905 804v-294l-340 -130q-20 -6 -40 -20t-20 -29v-202q0 -22 -25 -31t-50 0t-25 31v456v14.5t-1.5 11.5t-5 12t-9.5 7q-24 13 -46 -5l-184 -146l-83 86l237 339h503z" /> -<glyph unicode="" d="M603 1195q162 0 299.5 -80t217.5 -218t80 -300t-80 -299.5t-217.5 -217.5t-299.5 -80t-300 80t-218 217.5t-80 299.5q0 122 47.5 232.5t127.5 190.5t190.5 127.5t232.5 47.5zM598 701h-298v-201h300l-2 -194l402 294l-402 298v-197z" /> -<glyph unicode="" d="M597 1195q122 0 232.5 -47.5t190.5 -127.5t127.5 -190.5t47.5 -232.5q0 -162 -80 -299.5t-218 -217.5t-300 -80t-299.5 80t-217.5 217.5t-80 299.5q0 122 47.5 232.5t127.5 190.5t190.5 127.5t231.5 47.5zM200 600l400 -294v194h302v201h-300v197z" /> -<glyph unicode="" d="M603 1195q121 0 231.5 -47.5t190.5 -127.5t127.5 -190.5t47.5 -232.5q0 -162 -80 -299.5t-217.5 -217.5t-299.5 -80t-300 80t-218 217.5t-80 299.5q0 122 47.5 232.5t127.5 190.5t190.5 127.5t232.5 47.5zM300 600h200v-300h200v300h200l-300 400z" /> -<glyph unicode="" d="M603 1195q121 0 231.5 -47.5t190.5 -127.5t127.5 -190.5t47.5 -232.5q0 -162 -80 -299.5t-217.5 -217.5t-299.5 -80t-300 80t-218 217.5t-80 299.5q0 122 47.5 232.5t127.5 190.5t190.5 127.5t232.5 47.5zM500 900v-300h-200l300 -400l300 400h-200v300h-200z" /> -<glyph unicode="" d="M603 1195q121 0 231.5 -47.5t190.5 -127.5t127.5 -190.5t47.5 -232.5q0 -162 -80 -299.5t-217.5 -217.5t-299.5 -80t-300 80t-218 217.5t-80 299.5q0 122 47.5 232.5t127.5 190.5t190.5 127.5t232.5 47.5zM627 1101q-15 -12 -36.5 -21t-34.5 -12t-44 -8t-39 -6 q-15 -3 -45.5 0.5t-45.5 -2.5q-21 -7 -52 -26.5t-34 -34.5q-3 -11 6.5 -22.5t8.5 -18.5q-3 -34 -27.5 -90.5t-29.5 -79.5q-8 -33 5.5 -92.5t7.5 -87.5q0 -9 17 -44t16 -60q12 0 23 -5.5t23 -15t20 -13.5q24 -12 108 -42q22 -8 53 -31.5t59.5 -38.5t57.5 -11q8 -18 -15 -55 t-20 -57q42 -71 87 -80q0 -6 -3 -15.5t-3.5 -14.5t4.5 -17q102 -2 221 112q30 29 47 47t34.5 49t20.5 62q-14 9 -37 9.5t-36 7.5q-14 7 -49 15t-52 19q-9 0 -39.5 -0.5t-46.5 -1.5t-39 -6.5t-39 -16.5q-50 -35 -66 -12q-4 2 -3.5 25.5t0.5 25.5q-6 13 -26.5 17t-24.5 7 q2 22 -2 41t-16.5 28t-38.5 -20q-23 -25 -42 4q-19 28 -8 58q6 16 22 22q6 -1 26 -1.5t33.5 -4t19.5 -13.5q12 -19 32 -37.5t34 -27.5l14 -8q0 3 9.5 39.5t5.5 57.5q-4 23 14.5 44.5t22.5 31.5q5 14 10 35t8.5 31t15.5 22.5t34 21.5q-6 18 10 37q8 0 23.5 -1.5t24.5 -1.5 t20.5 4.5t20.5 15.5q-10 23 -30.5 42.5t-38 30t-49 26.5t-43.5 23q11 41 1 44q31 -13 58.5 -14.5t39.5 3.5l11 4q6 36 -17 53.5t-64 28.5t-56 23q-19 -3 -37 0zM613 994q0 -18 8 -42.5t16.5 -44t9.5 -23.5q-9 2 -31 5t-36 5t-32 8t-30 14q3 12 16 30t16 25q10 -10 18.5 -10 t14 6t14.5 14.5t16 12.5z" /> -<glyph unicode="" horiz-adv-x="1220" d="M100 1196h1000q41 0 70.5 -29.5t29.5 -70.5v-100q0 -41 -29.5 -70.5t-70.5 -29.5h-1000q-41 0 -70.5 29.5t-29.5 70.5v100q0 41 29.5 70.5t70.5 29.5zM1100 1096h-200v-100h200v100zM100 796h1000q41 0 70.5 -29.5t29.5 -70.5v-100q0 -41 -29.5 -70.5t-70.5 -29.5h-1000 q-41 0 -70.5 29.5t-29.5 70.5v100q0 41 29.5 70.5t70.5 29.5zM1100 696h-500v-100h500v100zM100 396h1000q41 0 70.5 -29.5t29.5 -70.5v-100q0 -41 -29.5 -70.5t-70.5 -29.5h-1000q-41 0 -70.5 29.5t-29.5 70.5v100q0 41 29.5 70.5t70.5 29.5zM1100 296h-300v-100h300v100z " /> -<glyph unicode="" d="M1100 1200v-100h-1000v100h1000zM150 1000h900l-350 -500v-300l-200 -200v500z" /> -<glyph unicode="" d="M329 729l142 142l-200 200l129 129h-400v-400l129 129zM1200 1200v-400l-129 129l-200 -200l-142 142l200 200l-129 129h400zM271 129l129 -129h-400v400l129 -129l200 200l142 -142zM1071 271l129 129v-400h-400l129 129l-200 200l142 142z" /> -<glyph unicode="" d="M596 1192q162 0 299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299t80 299t217 217t299 80zM596 1010q-171 0 -292.5 -121.5t-121.5 -292.5q0 -172 121.5 -293t292.5 -121t292.5 121t121.5 293q0 171 -121.5 292.5t-292.5 121.5zM455 905 q22 0 38 -16t16 -39t-16 -39t-38 -16q-23 0 -39 16.5t-16 38.5t16 38.5t39 16.5zM708 821l1 1q-9 14 -9 28q0 22 16 38.5t39 16.5q22 0 38 -16t16 -39t-16 -39t-38 -16q-14 0 -29 10l-55 -145q17 -22 17 -51q0 -36 -25.5 -61.5t-61.5 -25.5t-61.5 25.5t-25.5 61.5 q0 32 20.5 56.5t51.5 29.5zM855 709q23 0 38.5 -15.5t15.5 -38.5t-16 -39t-38 -16q-23 0 -39 16t-16 39q0 22 16 38t39 16zM345 709q23 0 39 -16t16 -38q0 -23 -16 -39t-39 -16q-22 0 -38 16t-16 39t15.5 38.5t38.5 15.5z" /> -<glyph unicode="" d="M649 54l-16 22q-90 125 -293 323q-71 70 -104.5 105.5t-77 89.5t-61 99t-17.5 91q0 131 98.5 229.5t230.5 98.5q143 0 241 -129q103 129 246 129q129 0 226 -98.5t97 -229.5q0 -46 -17.5 -91t-61 -99t-77 -89.5t-104.5 -105.5q-203 -198 -293 -323zM844 524l12 12 q64 62 97.5 97t64.5 79t31 72q0 71 -48 119t-105 48q-74 0 -132 -82l-118 -171l-114 174q-51 79 -123 79q-60 0 -109.5 -49t-49.5 -118q0 -27 30.5 -70t61.5 -75.5t95 -94.5l22 -22q93 -90 190 -201q82 92 195 203z" /> -<glyph unicode="" d="M476 406l19 -17l105 105l-212 212l389 389l247 -247l-95 -96l18 -18q46 -46 77 -99l29 29q35 35 62.5 88t27.5 96q0 93 -66 159l-141 141q-66 66 -159 66q-95 0 -159 -66l-283 -283q-66 -64 -66 -159q0 -93 66 -159zM123 193l141 -141q66 -66 159 -66q95 0 159 66 l283 283q66 66 66 159t-66 159l-141 141q-12 12 -19 17l-105 -105l212 -212l-389 -389l-247 248l95 95l-18 18q-46 45 -75 101l-55 -55q-66 -66 -66 -159q0 -94 66 -160z" /> -<glyph unicode="" d="M200 100v953q0 21 30 46t81 48t129 38t163 15t162 -15t127 -38t79 -48t29 -46v-953q0 -41 -29.5 -70.5t-70.5 -29.5h-600q-41 0 -70.5 29.5t-29.5 70.5zM900 1000h-600v-700h600v700zM600 46q43 0 73.5 30.5t30.5 73.5t-30.5 73.5t-73.5 30.5t-73.5 -30.5t-30.5 -73.5 t30.5 -73.5t73.5 -30.5z" /> -<glyph unicode="" d="M700 1029v-307l64 -14q34 -7 64 -16.5t70 -31.5t67.5 -52t47.5 -80.5t20 -112.5q0 -139 -89 -224t-244 -96v-77h-100v78q-152 17 -237 104q-40 40 -52.5 93.5t-15.5 139.5h139q5 -77 48.5 -126.5t117.5 -64.5v335l-27 7q-46 14 -79 26.5t-72 36t-62.5 52t-40 72.5 t-16.5 99q0 92 44 159.5t109 101t144 40.5v78h100v-79q38 -4 72.5 -13.5t75.5 -31.5t71 -53.5t51.5 -84t24.5 -118.5h-159q-8 72 -35 109.5t-101 50.5zM600 755v274q-61 -8 -97.5 -37.5t-36.5 -102.5q0 -29 8 -51t16.5 -34t29.5 -22.5t31 -13.5t38 -10q7 -2 11 -3zM700 548 v-311q170 18 170 151q0 64 -44 99.5t-126 60.5z" /> -<glyph unicode="" d="M866 300l50 -147q-41 -25 -80.5 -36.5t-59 -13t-61.5 -1.5q-23 0 -128 33t-155 29q-39 -4 -82 -17t-66 -25l-24 -11l-55 145l16.5 11t15.5 10t13.5 9.5t14.5 12t14.5 14t17.5 18.5q48 55 54 126.5t-30 142.5h-221v100h166q-24 49 -44 104q-10 26 -14.5 55.5t-3 72.5 t25 90t68.5 87q97 88 263 88q129 0 230 -89t101 -208h-153q0 52 -34 89.5t-74 51.5t-76 14q-37 0 -79 -14.5t-62 -35.5q-41 -44 -41 -101q0 -11 2.5 -24.5t5.5 -24t9.5 -26.5t10.5 -25t14 -27.5t14 -25.5t15.5 -27t13.5 -24h242v-100h-197q8 -50 -2.5 -115t-31.5 -94 q-41 -59 -99 -113q35 11 84 18t70 7q32 1 102 -16t104 -17q76 0 136 30z" /> -<glyph unicode="" d="M300 0l298 300h-198v900h-200v-900h-198zM900 1200l298 -300h-198v-900h-200v900h-198z" /> -<glyph unicode="" d="M400 300h198l-298 -300l-298 300h198v900h200v-900zM1000 1200v-500h-100v100h-100v-100h-100v500h300zM901 1100h-100v-200h100v200zM700 500h300v-200h-99v-100h-100v100h99v100h-200v100zM800 100h200v-100h-300v200h100v-100z" /> -<glyph unicode="" d="M400 300h198l-298 -300l-298 300h198v900h200v-900zM1000 1200v-200h-99v-100h-100v100h99v100h-200v100h300zM800 800h200v-100h-300v200h100v-100zM700 500h300v-500h-100v100h-100v-100h-100v500zM801 200h100v200h-100v-200z" /> -<glyph unicode="" d="M300 0l298 300h-198v900h-200v-900h-198zM900 1100h-100v100h200v-500h-100v400zM1100 500v-500h-100v100h-200v400h300zM1001 400h-100v-200h100v200z" /> -<glyph unicode="" d="M300 0l298 300h-198v900h-200v-900h-198zM1100 1200v-500h-100v100h-200v400h300zM1001 1100h-100v-200h100v200zM900 400h-100v100h200v-500h-100v400z" /> -<glyph unicode="" d="M300 0l298 300h-198v900h-200v-900h-198zM900 1000h-200v200h200v-200zM1000 700h-300v200h300v-200zM1100 400h-400v200h400v-200zM1200 100h-500v200h500v-200z" /> -<glyph unicode="" d="M300 0l298 300h-198v900h-200v-900h-198zM1200 1000h-500v200h500v-200zM1100 700h-400v200h400v-200zM1000 400h-300v200h300v-200zM900 100h-200v200h200v-200z" /> -<glyph unicode="" d="M400 1100h300q162 0 281 -118.5t119 -281.5v-300q0 -165 -118.5 -282.5t-281.5 -117.5h-300q-165 0 -282.5 117.5t-117.5 282.5v300q0 165 117.5 282.5t282.5 117.5zM800 900h-500q-41 0 -70.5 -29.5t-29.5 -70.5v-500q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5 t29.5 70.5v500q0 41 -29.5 70.5t-70.5 29.5z" /> -<glyph unicode="" d="M700 0h-300q-163 0 -281.5 117.5t-118.5 282.5v300q0 163 119 281.5t281 118.5h300q165 0 282.5 -117.5t117.5 -282.5v-300q0 -165 -117.5 -282.5t-282.5 -117.5zM800 900h-500q-41 0 -70.5 -29.5t-29.5 -70.5v-500q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5 t29.5 70.5v500q0 41 -29.5 70.5t-70.5 29.5zM400 800v-500l333 250z" /> -<glyph unicode="" d="M0 400v300q0 163 117.5 281.5t282.5 118.5h300q163 0 281.5 -119t118.5 -281v-300q0 -165 -117.5 -282.5t-282.5 -117.5h-300q-165 0 -282.5 117.5t-117.5 282.5zM900 300v500q0 41 -29.5 70.5t-70.5 29.5h-500q-41 0 -70.5 -29.5t-29.5 -70.5v-500q0 -41 29.5 -70.5 t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5zM800 700h-500l250 -333z" /> -<glyph unicode="" d="M1100 700v-300q0 -162 -118.5 -281t-281.5 -119h-300q-165 0 -282.5 118.5t-117.5 281.5v300q0 165 117.5 282.5t282.5 117.5h300q165 0 282.5 -117.5t117.5 -282.5zM900 300v500q0 41 -29.5 70.5t-70.5 29.5h-500q-41 0 -70.5 -29.5t-29.5 -70.5v-500q0 -41 29.5 -70.5 t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5zM550 733l-250 -333h500z" /> -<glyph unicode="" d="M500 1100h400q165 0 282.5 -117.5t117.5 -282.5v-300q0 -165 -117.5 -282.5t-282.5 -117.5h-400v200h500q41 0 70.5 29.5t29.5 70.5v500q0 41 -29.5 70.5t-70.5 29.5h-500v200zM700 550l-400 -350v200h-300v300h300v200z" /> -<glyph unicode="" d="M403 2l9 -1q13 0 26 16l538 630q15 19 6 36q-8 18 -32 16h-300q1 4 78 219.5t79 227.5q2 17 -6 27l-8 8h-9q-16 0 -25 -15q-4 -5 -98.5 -111.5t-228 -257t-209.5 -238.5q-17 -19 -7 -40q10 -19 32 -19h302q-155 -438 -160 -458q-5 -21 4 -32z" /> -<glyph unicode="" d="M800 200h-500q-41 0 -70.5 29.5t-29.5 70.5v500q0 41 29.5 70.5t70.5 29.5h500v185q-14 4 -114 7.5t-193 5.5l-93 2q-165 0 -282.5 -117.5t-117.5 -282.5v-300q0 -165 117.5 -282.5t282.5 -117.5h300q47 0 100 15v185zM900 200v200h-300v300h300v200l400 -350z" /> -<glyph unicode="" d="M1200 700l-149 149l-342 -353l-213 213l353 342l-149 149h500v-500zM1022 571l-122 -123v-148q0 -41 -29.5 -70.5t-70.5 -29.5h-500q-41 0 -70.5 29.5t-29.5 70.5v500q0 41 29.5 70.5t70.5 29.5h156l118 122l-74 78h-100q-165 0 -282.5 -117.5t-117.5 -282.5v-300 q0 -165 117.5 -282.5t282.5 -117.5h300q163 0 281.5 117.5t118.5 282.5v98z" /> -<glyph unicode="" d="M600 1196q162 0 299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299t80 299t217 217t299 80zM600 1014q-171 0 -292.5 -121.5t-121.5 -292.5t121.5 -292.5t292.5 -121.5t292.5 121.5t121.5 292.5t-121.5 292.5t-292.5 121.5zM600 794 q80 0 137 -57t57 -137t-57 -137t-137 -57t-137 57t-57 137t57 137t137 57z" /> -<glyph unicode="" d="M700 800v400h-300v-400h-300l445 -500l450 500h-295zM25 300h1048q11 0 19 -7.5t8 -17.5v-275h-1100v275q0 11 7 18t18 7zM1000 200h-100v-50h100v50z" /> -<glyph unicode="" d="M400 700v-300h300v300h295l-445 500l-450 -500h300zM25 300h1048q11 0 19 -7.5t8 -17.5v-275h-1100v275q0 11 7 18t18 7zM1000 200h-100v-50h100v50z" /> -<glyph unicode="" d="M405 400l596 596l-154 155l-442 -442l-150 151l-155 -155zM25 300h1048q11 0 19 -7.5t8 -17.5v-275h-1100v275q0 11 7 18t18 7zM1000 200h-100v-50h100v50z" /> -<glyph unicode="" d="M409 1103l-97 97l-212 -212l97 -98zM650 861l-149 149l-212 -212l149 -149l-238 -248h700v699zM25 300h1048q11 0 19 -7.5t8 -17.5v-275h-1100v275q0 11 7 18t18 7zM1000 200h-100v-50h100v50z" /> -<glyph unicode="" d="M539 950l-149 -149l212 -212l149 148l248 -237v700h-699zM297 709l-97 -97l212 -212l98 97zM25 300h1048q11 0 19 -7.5t8 -17.5v-275h-1100v275q0 11 7 18t18 7zM1000 200h-100v-50h100v50z" /> -<glyph unicode="" d="M1200 1199v-1079l-475 272l-310 -393v416h-392zM1166 1148l-672 -712v-226z" /> -<glyph unicode="" d="M1100 1000v-850q0 -21 -15 -35.5t-35 -14.5h-150v400h-700v-400h-150q-21 0 -35.5 14.5t-14.5 35.5v1000q0 20 14.5 35t35.5 15h250v-300h500v300h100zM700 1200h-100v-200h100v200z" /> -<glyph unicode="" d="M578 500h-378v-400h-150q-21 0 -35.5 14.5t-14.5 35.5v1000q0 20 14.5 35t35.5 15h250v-300h500v300h100l200 -200v-218l-276 -275l-120 120zM700 1200h-100v-200h100v200zM1300 538l-475 -476l-244 244l123 123l120 -120l353 352z" /> -<glyph unicode="" d="M529 500h-329v-400h-150q-21 0 -35.5 14.5t-14.5 35.5v1000q0 20 14.5 35t35.5 15h250v-300h500v300h100l200 -200v-269l-103 -103l-170 170zM700 1200h-100v-200h100v200zM1167 6l-170 170l-170 -170l-127 127l170 170l-170 170l127 127l170 -170l170 170l127 -128 l-170 -169l170 -170z" /> -<glyph unicode="" d="M700 500h-500v-400h-150q-21 0 -35.5 14.5t-14.5 35.5v1000q0 20 14.5 35t35.5 15h250v-300h500v300h100l200 -200v-300h-400v-200zM700 1000h-100v200h100v-200zM1000 600h-200v-300h-200l300 -300l300 300h-200v300z" /> -<glyph unicode="" d="M602 500h-402v-400h-150q-21 0 -35.5 14.5t-14.5 35.5v1000q0 20 14.5 35t35.5 15h250v-300h500v300h100l200 -200v-402l-200 200zM700 1000h-100v200h100v-200zM1000 300h200l-300 300l-300 -300h200v-300h200v300z" /> -<glyph unicode="" d="M1200 900v150q0 21 -14.5 35.5t-35.5 14.5h-1100q-21 0 -35.5 -14.5t-14.5 -35.5v-150h1200zM0 800v-550q0 -21 14.5 -35.5t35.5 -14.5h1100q21 0 35.5 14.5t14.5 35.5v550h-1200zM100 500h400v-200h-400v200z" /> -<glyph unicode="" d="M500 1000h400v198l300 -298l-300 -298v198h-400v200zM100 800v200h100v-200h-100zM400 800h-100v200h100v-200zM700 300h-400v-198l-300 298l300 298v-198h400v-200zM800 500h100v-200h-100v200zM1000 500v-200h100v200h-100z" /> -<glyph unicode="" d="M1200 50v1106q0 31 -18 40.5t-44 -7.5l-276 -117q-25 -16 -43.5 -50.5t-18.5 -65.5v-359q0 -29 10.5 -55.5t25 -43t29 -28.5t25.5 -18l10 -5v-397q0 -21 14.5 -35.5t35.5 -14.5h200q21 0 35.5 14.5t14.5 35.5zM550 1200l50 -100v-400l-100 -203v-447q0 -21 -14.5 -35.5 t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v447l-100 203v400l50 100l50 -100v-300h100v300l50 100l50 -100v-300h100v300z" /> -<glyph unicode="" d="M1100 106v888q0 22 25 34.5t50 13.5l25 2v56h-400v-56q75 0 87.5 -6t12.5 -44v-394h-500v394q0 38 12.5 44t87.5 6v56h-400v-56q4 0 11 -0.5t24 -3t30 -7t24 -15t11 -24.5v-888q0 -22 -25 -34.5t-50 -13.5l-25 -2v-56h400v56q-75 0 -87.5 6t-12.5 44v394h500v-394 q0 -38 -12.5 -44t-87.5 -6v-56h400v56q-4 0 -11 0.5t-24 3t-30 7t-24 15t-11 24.5z" /> -<glyph unicode="" d="M675 1000l-100 100h-375l-100 -100h400l200 -200v-98l295 98h105v200h-425zM500 300v500q0 41 -29.5 70.5t-70.5 29.5h-300q-41 0 -70.5 -29.5t-29.5 -70.5v-500q0 -41 29.5 -70.5t70.5 -29.5h300q41 0 70.5 29.5t29.5 70.5zM100 800h300v-200h-300v200zM700 565l400 133 v-163l-400 -133v163zM100 500h300v-200h-300v200zM805 300l295 98v-298h-425l-100 -100h-375l-100 100h400l200 200h105z" /> -<glyph unicode="" d="M179 1169l-162 -162q-1 -11 -0.5 -32.5t16 -90t46.5 -140t104 -177.5t175 -208q103 -103 207.5 -176t180 -103.5t137 -47t92.5 -16.5l31 1l163 162q16 17 13 40.5t-22 37.5l-192 136q-19 14 -45 12t-42 -19l-119 -118q-143 103 -267 227q-126 126 -227 268l118 118 q17 17 20 41.5t-11 44.5l-139 194q-14 19 -36.5 22t-40.5 -14z" /> -<glyph unicode="" d="M1200 712v200q-6 8 -19 20.5t-63 45t-112 57t-171 45t-235 20.5q-92 0 -175 -10.5t-141.5 -27t-108.5 -36.5t-81.5 -40t-53.5 -36.5t-31 -27.5l-9 -10v-200q0 -21 14.5 -33.5t34.5 -8.5l202 33q20 4 34.5 21t14.5 38v146q141 24 300 24t300 -24v-146q0 -21 14.5 -38 t34.5 -21l202 -33q20 -4 34.5 8.5t14.5 33.5zM800 650l365 -303q14 -14 24.5 -39.5t10.5 -45.5v-212q0 -21 -15 -35.5t-35 -14.5h-1100q-21 0 -35.5 14.5t-14.5 35.5v212q0 20 10.5 45.5t24.5 39.5l365 303v50q0 4 1 10.5t12 22.5t30 28.5t60 23t97 10.5t97 -10t60 -23.5 t30 -27.5t12 -24l1 -10v-50z" /> -<glyph unicode="" d="M175 200h950l-125 150v250l100 100v400h-100v-200h-100v200h-200v-200h-100v200h-200v-200h-100v200h-100v-400l100 -100v-250zM1200 100v-100h-1100v100h1100z" /> -<glyph unicode="" d="M600 1100h100q41 0 70.5 -29.5t29.5 -70.5v-1000h-300v1000q0 41 29.5 70.5t70.5 29.5zM1000 800h100q41 0 70.5 -29.5t29.5 -70.5v-700h-300v700q0 41 29.5 70.5t70.5 29.5zM400 0v400q0 41 -29.5 70.5t-70.5 29.5h-100q-41 0 -70.5 -29.5t-29.5 -70.5v-400h300z" /> -<glyph unicode="" d="M1200 800v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212v500q0 124 88 212t212 88h700q124 0 212 -88t88 -212zM1000 900h-900v-700h900v700zM200 800v-300h200v-100h-200v-100h300v300h-200v100h200v100h-300zM800 800h-200v-500h200v100h100v300h-100 v100zM800 700v-300h-100v300h100z" /> -<glyph unicode="" d="M1200 800v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212v500q0 124 88 212t212 88h700q124 0 212 -88t88 -212zM1000 900h-900v-700h900v700zM400 600h-100v200h-100v-500h100v200h100v-200h100v500h-100v-200zM800 800h-200v-500h200v100h100v300h-100 v100zM800 700v-300h-100v300h100z" /> -<glyph unicode="" d="M1200 800v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212v500q0 124 88 212t212 88h700q124 0 212 -88t88 -212zM1000 900h-900v-700h900v700zM200 800v-500h300v100h-200v300h200v100h-300zM600 800v-500h300v100h-200v300h200v100h-300z" /> -<glyph unicode="" d="M1200 800v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212v500q0 124 88 212t212 88h700q124 0 212 -88t88 -212zM1000 900h-900v-700h900v700zM500 700l-300 -150l300 -150v300zM600 400l300 150l-300 150v-300z" /> -<glyph unicode="" d="M1200 800v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212v500q0 124 88 212t212 88h700q124 0 212 -88t88 -212zM1000 900h-900v-700h900v700zM900 800v-500h-700v500h700zM300 400h130q41 0 68 42t27 107t-28.5 108t-66.5 43h-130v-300zM800 700h-130 q-38 0 -66.5 -43t-28.5 -108t27 -107t68 -42h130v300z" /> -<glyph unicode="" d="M1200 800v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212v500q0 124 88 212t212 88h700q124 0 212 -88t88 -212zM1000 900h-900v-700h900v700zM200 800v-300h200v-100h-200v-100h300v300h-200v100h200v100h-300zM800 300h100v500h-200v-100h100v-400z M601 300h100v100h-100v-100z" /> -<glyph unicode="" d="M1200 800v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212v500q0 124 88 212t212 88h700q124 0 212 -88t88 -212zM1000 900h-900v-700h900v700zM300 700v100h-100v-500h300v400h-200zM800 300h100v500h-200v-100h100v-400zM401 400h-100v200h100v-200z M601 300h100v100h-100v-100z" /> -<glyph unicode="" d="M200 1100h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212v500q0 124 88 212t212 88zM1000 900h-900v-700h900v700zM400 700h-200v100h300v-300h-99v-100h-100v100h99v200zM800 700h-100v100h200v-500h-100v400zM201 400h100v-100 h-100v100zM701 300h-100v100h100v-100z" /> -<glyph unicode="" d="M600 1196q162 0 299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299t80 299t217 217t299 80zM600 1014q-171 0 -292.5 -121.5t-121.5 -292.5t121.5 -292.5t292.5 -121.5t292.5 121.5t121.5 292.5t-121.5 292.5t-292.5 121.5zM800 700h-300 v-200h300v-100h-300l-100 100v200l100 100h300v-100z" /> -<glyph unicode="" d="M596 1196q162 0 299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299t80 299t217 217t299 80zM596 1014q-171 0 -292.5 -121.5t-121.5 -292.5t121.5 -292.5t292.5 -121.5t292.5 121.5t121.5 292.5t-121.5 292.5t-292.5 121.5zM800 700v-100 h-100v100h-200v-100h200v-100h-200v-100h-100v400h300zM800 400h-100v100h100v-100z" /> -<glyph unicode="" d="M800 300h128q120 0 205 86t85 208q0 120 -85 206.5t-205 86.5q-46 0 -90 -14q-44 97 -134.5 156.5t-200.5 59.5q-152 0 -260 -107.5t-108 -260.5q0 -25 2 -37q-66 -14 -108.5 -67.5t-42.5 -122.5q0 -80 56.5 -137t135.5 -57h222v300h400v-300zM700 200h200l-300 -300 l-300 300h200v300h200v-300z" /> -<glyph unicode="" d="M600 714l403 -403q94 26 154.5 104t60.5 178q0 121 -85 207.5t-205 86.5q-46 0 -90 -14q-44 97 -134.5 156.5t-200.5 59.5q-152 0 -260 -107.5t-108 -260.5q0 -25 2 -37q-66 -14 -108.5 -67.5t-42.5 -122.5q0 -80 56.5 -137t135.5 -57h8zM700 -100h-200v300h-200l300 300 l300 -300h-200v-300z" /> -<glyph unicode="" d="M700 200h400l-270 300h170l-270 300h170l-300 333l-300 -333h170l-270 -300h170l-270 -300h400v-155l-75 -45h350l-75 45v155z" /> -<glyph unicode="" d="M700 45v306q46 -30 100 -30q74 0 126.5 52.5t52.5 126.5q0 24 -9 55q50 32 79.5 83t29.5 112q0 90 -61.5 155.5t-150.5 71.5q-26 89 -99.5 145.5t-167.5 56.5q-116 0 -197.5 -81.5t-81.5 -197.5q0 -4 1 -12t1 -11q-14 2 -23 2q-74 0 -126.5 -52.5t-52.5 -126.5 q0 -53 28.5 -97t75.5 -65q-4 -16 -4 -38q0 -74 52.5 -126.5t126.5 -52.5q56 0 100 30v-306l-75 -45h350z" /> -<glyph unicode="💼" d="M800 1000h300q41 0 70.5 -29.5t29.5 -70.5v-400h-500v100h-200v-100h-500v400q0 41 29.5 70.5t70.5 29.5h300v100q0 41 29.5 70.5t70.5 29.5h200q41 0 70.5 -29.5t29.5 -70.5v-100zM500 1000h200v100h-200v-100zM1200 400v-200q0 -41 -29.5 -70.5t-70.5 -29.5h-1000 q-41 0 -70.5 29.5t-29.5 70.5v200h1200z" /> -<glyph unicode="📅" d="M1100 900v150q0 21 -14.5 35.5t-35.5 14.5h-150v100h-100v-100h-500v100h-100v-100h-150q-21 0 -35.5 -14.5t-14.5 -35.5v-150h1100zM0 800v-750q0 -20 14.5 -35t35.5 -15h1000q21 0 35.5 15t14.5 35v750h-1100zM100 600h100v-100h-100v100zM300 600h100v-100h-100v100z M500 600h100v-100h-100v100zM700 600h100v-100h-100v100zM900 600h100v-100h-100v100zM100 400h100v-100h-100v100zM300 400h100v-100h-100v100zM500 400h100v-100h-100v100zM700 400h100v-100h-100v100zM900 400h100v-100h-100v100zM100 200h100v-100h-100v100zM300 200 h100v-100h-100v100zM500 200h100v-100h-100v100zM700 200h100v-100h-100v100zM900 200h100v-100h-100v100z" /> -<glyph unicode="📌" d="M902 1185l283 -282q15 -15 15 -36t-15 -35q-14 -15 -35 -15t-35 15l-36 35l-279 -267v-300l-212 210l-208 -207l-380 -303l303 380l207 208l-210 212h300l267 279l-35 36q-15 14 -15 35t15 35q14 15 35 15t35 -15z" /> -<glyph unicode="📎" d="M518 119l69 -60l517 511q67 67 95 157t11 183q-16 87 -67 154t-130 103q-69 33 -152 33q-107 0 -197 -55q-40 -24 -111 -95l-512 -512q-68 -68 -81 -163t35 -173q35 -57 94 -89t129 -32q63 0 119 28q33 16 65 40.5t52.5 45.5t59.5 64q40 44 57 61l394 394q35 35 47 84 t-3 96q-27 87 -117 104q-20 2 -29 2q-46 0 -79.5 -17t-67.5 -51l-388 -396l-7 -7l69 -67l377 373q20 22 39 38q23 23 50 23q38 0 53 -36q16 -39 -20 -75l-547 -547q-52 -52 -125 -52q-55 0 -100 33t-54 96q-5 35 2.5 66t31.5 63t42 50t56 54q24 21 44 41l348 348 q52 52 82.5 79.5t84 54t107.5 26.5q25 0 48 -4q95 -17 154 -94.5t51 -175.5q-7 -101 -98 -192l-252 -249l-253 -256z" /> -<glyph unicode="📷" d="M1200 200v600q0 41 -29.5 70.5t-70.5 29.5h-150q-4 8 -11.5 21.5t-33 48t-53 61t-69 48t-83.5 21.5h-200q-41 0 -82 -20.5t-70 -50t-52 -59t-34 -50.5l-12 -20h-150q-41 0 -70.5 -29.5t-29.5 -70.5v-600q0 -41 29.5 -70.5t70.5 -29.5h1000q41 0 70.5 29.5t29.5 70.5z M1000 700h-100v100h100v-100zM844 500q0 -100 -72 -172t-172 -72t-172 72t-72 172t72 172t172 72t172 -72t72 -172zM706 500q0 44 -31 75t-75 31t-75 -31t-31 -75t31 -75t75 -31t75 31t31 75z" /> -<glyph unicode="🔒" d="M900 800h100q41 0 70.5 -29.5t29.5 -70.5v-600q0 -41 -29.5 -70.5t-70.5 -29.5h-900q-41 0 -70.5 29.5t-29.5 70.5v600q0 41 29.5 70.5t70.5 29.5h100v200q0 82 59 141t141 59h300q82 0 141 -59t59 -141v-200zM400 800h300v150q0 21 -14.5 35.5t-35.5 14.5h-200 q-21 0 -35.5 -14.5t-14.5 -35.5v-150z" /> -<glyph unicode="🔔" d="M1062 400h17q20 0 33.5 -14.5t13.5 -35.5q0 -20 -13 -40t-31 -27q-22 -9 -63 -23t-167.5 -37t-251.5 -23t-245.5 20.5t-178.5 41.5l-58 20q-18 7 -31 27.5t-13 40.5q0 21 13.5 35.5t33.5 14.5h17l118 173l63 327q15 77 76 140t144 83l-18 32q-6 19 3 32t29 13h94 q20 0 29 -10.5t3 -29.5l-18 -37q83 -19 144 -82.5t76 -140.5l63 -327zM600 104q-54 0 -103 6q12 -49 40 -79.5t63 -30.5t63 30.5t39 79.5q-48 -6 -102 -6z" /> -<glyph unicode="🔖" d="M200 0l450 444l450 -443v1150q0 20 -14.5 35t-35.5 15h-800q-21 0 -35.5 -15t-14.5 -35v-1151z" /> -<glyph unicode="🔥" d="M400 755q2 -12 8 -41.5t8 -43t6 -39.5t3.5 -39.5t-1 -33.5t-6 -31.5t-13.5 -24t-21 -20.5t-31 -12q-38 -10 -67 13t-40.5 61.5t-15 81.5t10.5 75q-52 -46 -83.5 -101t-39 -107t-7.5 -85t5 -63q9 -56 44 -119.5t105 -108.5q31 -21 64 -16t62 23.5t57 49.5t48 61.5t35 60.5 q32 66 39 184.5t-13 157.5q79 -80 122 -164t26 -184q-5 -33 -20.5 -69.5t-37.5 -80.5q-10 -19 -14.5 -29t-12 -26t-9 -23.5t-3 -19t2.5 -15.5t11 -9.5t19.5 -5t30.5 2.5t42 8q57 20 91 34t87.5 44.5t87 64t65.5 88.5t47 122q38 172 -44.5 341.5t-246.5 278.5q22 -44 43 -129 q39 -159 -32 -154q-15 2 -33 9q-79 33 -120.5 100t-44 175.5t48.5 257.5q-13 -8 -34 -23.5t-72.5 -66.5t-88.5 -105.5t-60 -138t-8 -166.5z" /> -<glyph unicode="🔧" d="M948 778l251 126q13 -175 -151 -267q-123 -70 -253 -23l-596 -596q-15 -16 -36.5 -16t-36.5 16l-111 110q-15 15 -15 36.5t15 37.5l600 599q-33 101 6 201.5t135 154.5q164 92 306 -9l-259 -138z" /> -</font> -</defs></svg> \ No newline at end of file diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/.gc3pie/html/bootstrap3/fonts/glyphicons-halflings-regular.ttf b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/.gc3pie/html/bootstrap3/fonts/glyphicons-halflings-regular.ttf deleted file mode 100644 index be784dc1d5bcb92ab155f578f3723524a3dd9688..0000000000000000000000000000000000000000 Binary files a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/.gc3pie/html/bootstrap3/fonts/glyphicons-halflings-regular.ttf and /dev/null differ diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/.gc3pie/html/bootstrap3/fonts/glyphicons-halflings-regular.woff b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/.gc3pie/html/bootstrap3/fonts/glyphicons-halflings-regular.woff deleted file mode 100644 index 2cc3e4852a5a42e6aadd6284e067b66e14a57bc7..0000000000000000000000000000000000000000 Binary files a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/.gc3pie/html/bootstrap3/fonts/glyphicons-halflings-regular.woff and /dev/null differ diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/.gc3pie/html/bootstrap3/js/bootstrap.js b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/.gc3pie/html/bootstrap3/js/bootstrap.js deleted file mode 100644 index 2c64257146c4b4b0696e2acbc390300c1a1de3e5..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/.gc3pie/html/bootstrap3/js/bootstrap.js +++ /dev/null @@ -1,1999 +0,0 @@ -/** -* bootstrap.js v3.0.0 by @fat and @mdo -* Copyright 2013 Twitter Inc. -* http://www.apache.org/licenses/LICENSE-2.0 -*/ -if (!jQuery) { throw new Error("Bootstrap requires jQuery") } - -/* ======================================================================== - * Bootstrap: transition.js v3.0.0 - * http://twbs.github.com/bootstrap/javascript.html#transitions - * ======================================================================== - * Copyright 2013 Twitter, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ======================================================================== */ - - -+function ($) { "use strict"; - - // CSS TRANSITION SUPPORT (Shoutout: http://www.modernizr.com/) - // ============================================================ - - function transitionEnd() { - var el = document.createElement('bootstrap') - - var transEndEventNames = { - 'WebkitTransition' : 'webkitTransitionEnd' - , 'MozTransition' : 'transitionend' - , 'OTransition' : 'oTransitionEnd otransitionend' - , 'transition' : 'transitionend' - } - - for (var name in transEndEventNames) { - if (el.style[name] !== undefined) { - return { end: transEndEventNames[name] } - } - } - } - - // http://blog.alexmaccaw.com/css-transitions - $.fn.emulateTransitionEnd = function (duration) { - var called = false, $el = this - $(this).one($.support.transition.end, function () { called = true }) - var callback = function () { if (!called) $($el).trigger($.support.transition.end) } - setTimeout(callback, duration) - return this - } - - $(function () { - $.support.transition = transitionEnd() - }) - -}(window.jQuery); - -/* ======================================================================== - * Bootstrap: alert.js v3.0.0 - * http://twbs.github.com/bootstrap/javascript.html#alerts - * ======================================================================== - * Copyright 2013 Twitter, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ======================================================================== */ - - -+function ($) { "use strict"; - - // ALERT CLASS DEFINITION - // ====================== - - var dismiss = '[data-dismiss="alert"]' - var Alert = function (el) { - $(el).on('click', dismiss, this.close) - } - - Alert.prototype.close = function (e) { - var $this = $(this) - var selector = $this.attr('data-target') - - if (!selector) { - selector = $this.attr('href') - selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') // strip for ie7 - } - - var $parent = $(selector) - - if (e) e.preventDefault() - - if (!$parent.length) { - $parent = $this.hasClass('alert') ? $this : $this.parent() - } - - $parent.trigger(e = $.Event('close.bs.alert')) - - if (e.isDefaultPrevented()) return - - $parent.removeClass('in') - - function removeElement() { - $parent.trigger('closed.bs.alert').remove() - } - - $.support.transition && $parent.hasClass('fade') ? - $parent - .one($.support.transition.end, removeElement) - .emulateTransitionEnd(150) : - removeElement() - } - - - // ALERT PLUGIN DEFINITION - // ======================= - - var old = $.fn.alert - - $.fn.alert = function (option) { - return this.each(function () { - var $this = $(this) - var data = $this.data('bs.alert') - - if (!data) $this.data('bs.alert', (data = new Alert(this))) - if (typeof option == 'string') data[option].call($this) - }) - } - - $.fn.alert.Constructor = Alert - - - // ALERT NO CONFLICT - // ================= - - $.fn.alert.noConflict = function () { - $.fn.alert = old - return this - } - - - // ALERT DATA-API - // ============== - - $(document).on('click.bs.alert.data-api', dismiss, Alert.prototype.close) - -}(window.jQuery); - -/* ======================================================================== - * Bootstrap: button.js v3.0.0 - * http://twbs.github.com/bootstrap/javascript.html#buttons - * ======================================================================== - * Copyright 2013 Twitter, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ======================================================================== */ - - -+function ($) { "use strict"; - - // BUTTON PUBLIC CLASS DEFINITION - // ============================== - - var Button = function (element, options) { - this.$element = $(element) - this.options = $.extend({}, Button.DEFAULTS, options) - } - - Button.DEFAULTS = { - loadingText: 'loading...' - } - - Button.prototype.setState = function (state) { - var d = 'disabled' - var $el = this.$element - var val = $el.is('input') ? 'val' : 'html' - var data = $el.data() - - state = state + 'Text' - - if (!data.resetText) $el.data('resetText', $el[val]()) - - $el[val](data[state] || this.options[state]) - - // push to event loop to allow forms to submit - setTimeout(function () { - state == 'loadingText' ? - $el.addClass(d).attr(d, d) : - $el.removeClass(d).removeAttr(d); - }, 0) - } - - Button.prototype.toggle = function () { - var $parent = this.$element.closest('[data-toggle="buttons"]') - - if ($parent.length) { - var $input = this.$element.find('input') - .prop('checked', !this.$element.hasClass('active')) - .trigger('change') - if ($input.prop('type') === 'radio') $parent.find('.active').removeClass('active') - } - - this.$element.toggleClass('active') - } - - - // BUTTON PLUGIN DEFINITION - // ======================== - - var old = $.fn.button - - $.fn.button = function (option) { - return this.each(function () { - var $this = $(this) - var data = $this.data('bs.button') - var options = typeof option == 'object' && option - - if (!data) $this.data('bs.button', (data = new Button(this, options))) - - if (option == 'toggle') data.toggle() - else if (option) data.setState(option) - }) - } - - $.fn.button.Constructor = Button - - - // BUTTON NO CONFLICT - // ================== - - $.fn.button.noConflict = function () { - $.fn.button = old - return this - } - - - // BUTTON DATA-API - // =============== - - $(document).on('click.bs.button.data-api', '[data-toggle^=button]', function (e) { - var $btn = $(e.target) - if (!$btn.hasClass('btn')) $btn = $btn.closest('.btn') - $btn.button('toggle') - e.preventDefault() - }) - -}(window.jQuery); - -/* ======================================================================== - * Bootstrap: carousel.js v3.0.0 - * http://twbs.github.com/bootstrap/javascript.html#carousel - * ======================================================================== - * Copyright 2012 Twitter, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ======================================================================== */ - - -+function ($) { "use strict"; - - // CAROUSEL CLASS DEFINITION - // ========================= - - var Carousel = function (element, options) { - this.$element = $(element) - this.$indicators = this.$element.find('.carousel-indicators') - this.options = options - this.paused = - this.sliding = - this.interval = - this.$active = - this.$items = null - - this.options.pause == 'hover' && this.$element - .on('mouseenter', $.proxy(this.pause, this)) - .on('mouseleave', $.proxy(this.cycle, this)) - } - - Carousel.DEFAULTS = { - interval: 5000 - , pause: 'hover' - , wrap: true - } - - Carousel.prototype.cycle = function (e) { - e || (this.paused = false) - - this.interval && clearInterval(this.interval) - - this.options.interval - && !this.paused - && (this.interval = setInterval($.proxy(this.next, this), this.options.interval)) - - return this - } - - Carousel.prototype.getActiveIndex = function () { - this.$active = this.$element.find('.item.active') - this.$items = this.$active.parent().children() - - return this.$items.index(this.$active) - } - - Carousel.prototype.to = function (pos) { - var that = this - var activeIndex = this.getActiveIndex() - - if (pos > (this.$items.length - 1) || pos < 0) return - - if (this.sliding) return this.$element.one('slid', function () { that.to(pos) }) - if (activeIndex == pos) return this.pause().cycle() - - return this.slide(pos > activeIndex ? 'next' : 'prev', $(this.$items[pos])) - } - - Carousel.prototype.pause = function (e) { - e || (this.paused = true) - - if (this.$element.find('.next, .prev').length && $.support.transition.end) { - this.$element.trigger($.support.transition.end) - this.cycle(true) - } - - this.interval = clearInterval(this.interval) - - return this - } - - Carousel.prototype.next = function () { - if (this.sliding) return - return this.slide('next') - } - - Carousel.prototype.prev = function () { - if (this.sliding) return - return this.slide('prev') - } - - Carousel.prototype.slide = function (type, next) { - var $active = this.$element.find('.item.active') - var $next = next || $active[type]() - var isCycling = this.interval - var direction = type == 'next' ? 'left' : 'right' - var fallback = type == 'next' ? 'first' : 'last' - var that = this - - if (!$next.length) { - if (!this.options.wrap) return - $next = this.$element.find('.item')[fallback]() - } - - this.sliding = true - - isCycling && this.pause() - - var e = $.Event('slide.bs.carousel', { relatedTarget: $next[0], direction: direction }) - - if ($next.hasClass('active')) return - - if (this.$indicators.length) { - this.$indicators.find('.active').removeClass('active') - this.$element.one('slid', function () { - var $nextIndicator = $(that.$indicators.children()[that.getActiveIndex()]) - $nextIndicator && $nextIndicator.addClass('active') - }) - } - - if ($.support.transition && this.$element.hasClass('slide')) { - this.$element.trigger(e) - if (e.isDefaultPrevented()) return - $next.addClass(type) - $next[0].offsetWidth // force reflow - $active.addClass(direction) - $next.addClass(direction) - $active - .one($.support.transition.end, function () { - $next.removeClass([type, direction].join(' ')).addClass('active') - $active.removeClass(['active', direction].join(' ')) - that.sliding = false - setTimeout(function () { that.$element.trigger('slid') }, 0) - }) - .emulateTransitionEnd(600) - } else { - this.$element.trigger(e) - if (e.isDefaultPrevented()) return - $active.removeClass('active') - $next.addClass('active') - this.sliding = false - this.$element.trigger('slid') - } - - isCycling && this.cycle() - - return this - } - - - // CAROUSEL PLUGIN DEFINITION - // ========================== - - var old = $.fn.carousel - - $.fn.carousel = function (option) { - return this.each(function () { - var $this = $(this) - var data = $this.data('bs.carousel') - var options = $.extend({}, Carousel.DEFAULTS, $this.data(), typeof option == 'object' && option) - var action = typeof option == 'string' ? option : options.slide - - if (!data) $this.data('bs.carousel', (data = new Carousel(this, options))) - if (typeof option == 'number') data.to(option) - else if (action) data[action]() - else if (options.interval) data.pause().cycle() - }) - } - - $.fn.carousel.Constructor = Carousel - - - // CAROUSEL NO CONFLICT - // ==================== - - $.fn.carousel.noConflict = function () { - $.fn.carousel = old - return this - } - - - // CAROUSEL DATA-API - // ================= - - $(document).on('click.bs.carousel.data-api', '[data-slide], [data-slide-to]', function (e) { - var $this = $(this), href - var $target = $($this.attr('data-target') || (href = $this.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '')) //strip for ie7 - var options = $.extend({}, $target.data(), $this.data()) - var slideIndex = $this.attr('data-slide-to') - if (slideIndex) options.interval = false - - $target.carousel(options) - - if (slideIndex = $this.attr('data-slide-to')) { - $target.data('bs.carousel').to(slideIndex) - } - - e.preventDefault() - }) - - $(window).on('load', function () { - $('[data-ride="carousel"]').each(function () { - var $carousel = $(this) - $carousel.carousel($carousel.data()) - }) - }) - -}(window.jQuery); - -/* ======================================================================== - * Bootstrap: collapse.js v3.0.0 - * http://twbs.github.com/bootstrap/javascript.html#collapse - * ======================================================================== - * Copyright 2012 Twitter, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ======================================================================== */ - - -+function ($) { "use strict"; - - // COLLAPSE PUBLIC CLASS DEFINITION - // ================================ - - var Collapse = function (element, options) { - this.$element = $(element) - this.options = $.extend({}, Collapse.DEFAULTS, options) - this.transitioning = null - - if (this.options.parent) this.$parent = $(this.options.parent) - if (this.options.toggle) this.toggle() - } - - Collapse.DEFAULTS = { - toggle: true - } - - Collapse.prototype.dimension = function () { - var hasWidth = this.$element.hasClass('width') - return hasWidth ? 'width' : 'height' - } - - Collapse.prototype.show = function () { - if (this.transitioning || this.$element.hasClass('in')) return - - var startEvent = $.Event('show.bs.collapse') - this.$element.trigger(startEvent) - if (startEvent.isDefaultPrevented()) return - - var actives = this.$parent && this.$parent.find('> .panel > .in') - - if (actives && actives.length) { - var hasData = actives.data('bs.collapse') - if (hasData && hasData.transitioning) return - actives.collapse('hide') - hasData || actives.data('bs.collapse', null) - } - - var dimension = this.dimension() - - this.$element - .removeClass('collapse') - .addClass('collapsing') - [dimension](0) - - this.transitioning = 1 - - var complete = function () { - this.$element - .removeClass('collapsing') - .addClass('in') - [dimension]('auto') - this.transitioning = 0 - this.$element.trigger('shown.bs.collapse') - } - - if (!$.support.transition) return complete.call(this) - - var scrollSize = $.camelCase(['scroll', dimension].join('-')) - - this.$element - .one($.support.transition.end, $.proxy(complete, this)) - .emulateTransitionEnd(350) - [dimension](this.$element[0][scrollSize]) - } - - Collapse.prototype.hide = function () { - if (this.transitioning || !this.$element.hasClass('in')) return - - var startEvent = $.Event('hide.bs.collapse') - this.$element.trigger(startEvent) - if (startEvent.isDefaultPrevented()) return - - var dimension = this.dimension() - - this.$element - [dimension](this.$element[dimension]()) - [0].offsetHeight - - this.$element - .addClass('collapsing') - .removeClass('collapse') - .removeClass('in') - - this.transitioning = 1 - - var complete = function () { - this.transitioning = 0 - this.$element - .trigger('hidden.bs.collapse') - .removeClass('collapsing') - .addClass('collapse') - } - - if (!$.support.transition) return complete.call(this) - - this.$element - [dimension](0) - .one($.support.transition.end, $.proxy(complete, this)) - .emulateTransitionEnd(350) - } - - Collapse.prototype.toggle = function () { - this[this.$element.hasClass('in') ? 'hide' : 'show']() - } - - - // COLLAPSE PLUGIN DEFINITION - // ========================== - - var old = $.fn.collapse - - $.fn.collapse = function (option) { - return this.each(function () { - var $this = $(this) - var data = $this.data('bs.collapse') - var options = $.extend({}, Collapse.DEFAULTS, $this.data(), typeof option == 'object' && option) - - if (!data) $this.data('bs.collapse', (data = new Collapse(this, options))) - if (typeof option == 'string') data[option]() - }) - } - - $.fn.collapse.Constructor = Collapse - - - // COLLAPSE NO CONFLICT - // ==================== - - $.fn.collapse.noConflict = function () { - $.fn.collapse = old - return this - } - - - // COLLAPSE DATA-API - // ================= - - $(document).on('click.bs.collapse.data-api', '[data-toggle=collapse]', function (e) { - var $this = $(this), href - var target = $this.attr('data-target') - || e.preventDefault() - || (href = $this.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '') //strip for ie7 - var $target = $(target) - var data = $target.data('bs.collapse') - var option = data ? 'toggle' : $this.data() - var parent = $this.attr('data-parent') - var $parent = parent && $(parent) - - if (!data || !data.transitioning) { - if ($parent) $parent.find('[data-toggle=collapse][data-parent="' + parent + '"]').not($this).addClass('collapsed') - $this[$target.hasClass('in') ? 'addClass' : 'removeClass']('collapsed') - } - - $target.collapse(option) - }) - -}(window.jQuery); - -/* ======================================================================== - * Bootstrap: dropdown.js v3.0.0 - * http://twbs.github.com/bootstrap/javascript.html#dropdowns - * ======================================================================== - * Copyright 2012 Twitter, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ======================================================================== */ - - -+function ($) { "use strict"; - - // DROPDOWN CLASS DEFINITION - // ========================= - - var backdrop = '.dropdown-backdrop' - var toggle = '[data-toggle=dropdown]' - var Dropdown = function (element) { - var $el = $(element).on('click.bs.dropdown', this.toggle) - } - - Dropdown.prototype.toggle = function (e) { - var $this = $(this) - - if ($this.is('.disabled, :disabled')) return - - var $parent = getParent($this) - var isActive = $parent.hasClass('open') - - clearMenus() - - if (!isActive) { - if ('ontouchstart' in document.documentElement && !$parent.closest('.navbar-nav').length) { - // if mobile we we use a backdrop because click events don't delegate - $('<div class="dropdown-backdrop"/>').insertAfter($(this)).on('click', clearMenus) - } - - $parent.trigger(e = $.Event('show.bs.dropdown')) - - if (e.isDefaultPrevented()) return - - $parent - .toggleClass('open') - .trigger('shown.bs.dropdown') - - $this.focus() - } - - return false - } - - Dropdown.prototype.keydown = function (e) { - if (!/(38|40|27)/.test(e.keyCode)) return - - var $this = $(this) - - e.preventDefault() - e.stopPropagation() - - if ($this.is('.disabled, :disabled')) return - - var $parent = getParent($this) - var isActive = $parent.hasClass('open') - - if (!isActive || (isActive && e.keyCode == 27)) { - if (e.which == 27) $parent.find(toggle).focus() - return $this.click() - } - - var $items = $('[role=menu] li:not(.divider):visible a', $parent) - - if (!$items.length) return - - var index = $items.index($items.filter(':focus')) - - if (e.keyCode == 38 && index > 0) index-- // up - if (e.keyCode == 40 && index < $items.length - 1) index++ // down - if (!~index) index=0 - - $items.eq(index).focus() - } - - function clearMenus() { - $(backdrop).remove() - $(toggle).each(function (e) { - var $parent = getParent($(this)) - if (!$parent.hasClass('open')) return - $parent.trigger(e = $.Event('hide.bs.dropdown')) - if (e.isDefaultPrevented()) return - $parent.removeClass('open').trigger('hidden.bs.dropdown') - }) - } - - function getParent($this) { - var selector = $this.attr('data-target') - - if (!selector) { - selector = $this.attr('href') - selector = selector && /#/.test(selector) && selector.replace(/.*(?=#[^\s]*$)/, '') //strip for ie7 - } - - var $parent = selector && $(selector) - - return $parent && $parent.length ? $parent : $this.parent() - } - - - // DROPDOWN PLUGIN DEFINITION - // ========================== - - var old = $.fn.dropdown - - $.fn.dropdown = function (option) { - return this.each(function () { - var $this = $(this) - var data = $this.data('dropdown') - - if (!data) $this.data('dropdown', (data = new Dropdown(this))) - if (typeof option == 'string') data[option].call($this) - }) - } - - $.fn.dropdown.Constructor = Dropdown - - - // DROPDOWN NO CONFLICT - // ==================== - - $.fn.dropdown.noConflict = function () { - $.fn.dropdown = old - return this - } - - - // APPLY TO STANDARD DROPDOWN ELEMENTS - // =================================== - - $(document) - .on('click.bs.dropdown.data-api', clearMenus) - .on('click.bs.dropdown.data-api', '.dropdown form', function (e) { e.stopPropagation() }) - .on('click.bs.dropdown.data-api' , toggle, Dropdown.prototype.toggle) - .on('keydown.bs.dropdown.data-api', toggle + ', [role=menu]' , Dropdown.prototype.keydown) - -}(window.jQuery); - -/* ======================================================================== - * Bootstrap: modal.js v3.0.0 - * http://twbs.github.com/bootstrap/javascript.html#modals - * ======================================================================== - * Copyright 2012 Twitter, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ======================================================================== */ - - -+function ($) { "use strict"; - - // MODAL CLASS DEFINITION - // ====================== - - var Modal = function (element, options) { - this.options = options - this.$element = $(element) - this.$backdrop = - this.isShown = null - - if (this.options.remote) this.$element.load(this.options.remote) - } - - Modal.DEFAULTS = { - backdrop: true - , keyboard: true - , show: true - } - - Modal.prototype.toggle = function (_relatedTarget) { - return this[!this.isShown ? 'show' : 'hide'](_relatedTarget) - } - - Modal.prototype.show = function (_relatedTarget) { - var that = this - var e = $.Event('show.bs.modal', { relatedTarget: _relatedTarget }) - - this.$element.trigger(e) - - if (this.isShown || e.isDefaultPrevented()) return - - this.isShown = true - - this.escape() - - this.$element.on('click.dismiss.modal', '[data-dismiss="modal"]', $.proxy(this.hide, this)) - - this.backdrop(function () { - var transition = $.support.transition && that.$element.hasClass('fade') - - if (!that.$element.parent().length) { - that.$element.appendTo(document.body) // don't move modals dom position - } - - that.$element.show() - - if (transition) { - that.$element[0].offsetWidth // force reflow - } - - that.$element - .addClass('in') - .attr('aria-hidden', false) - - that.enforceFocus() - - var e = $.Event('shown.bs.modal', { relatedTarget: _relatedTarget }) - - transition ? - that.$element.find('.modal-dialog') // wait for modal to slide in - .one($.support.transition.end, function () { - that.$element.focus().trigger(e) - }) - .emulateTransitionEnd(300) : - that.$element.focus().trigger(e) - }) - } - - Modal.prototype.hide = function (e) { - if (e) e.preventDefault() - - e = $.Event('hide.bs.modal') - - this.$element.trigger(e) - - if (!this.isShown || e.isDefaultPrevented()) return - - this.isShown = false - - this.escape() - - $(document).off('focusin.bs.modal') - - this.$element - .removeClass('in') - .attr('aria-hidden', true) - .off('click.dismiss.modal') - - $.support.transition && this.$element.hasClass('fade') ? - this.$element - .one($.support.transition.end, $.proxy(this.hideModal, this)) - .emulateTransitionEnd(300) : - this.hideModal() - } - - Modal.prototype.enforceFocus = function () { - $(document) - .off('focusin.bs.modal') // guard against infinite focus loop - .on('focusin.bs.modal', $.proxy(function (e) { - if (this.$element[0] !== e.target && !this.$element.has(e.target).length) { - this.$element.focus() - } - }, this)) - } - - Modal.prototype.escape = function () { - if (this.isShown && this.options.keyboard) { - this.$element.on('keyup.dismiss.bs.modal', $.proxy(function (e) { - e.which == 27 && this.hide() - }, this)) - } else if (!this.isShown) { - this.$element.off('keyup.dismiss.bs.modal') - } - } - - Modal.prototype.hideModal = function () { - var that = this - this.$element.hide() - this.backdrop(function () { - that.removeBackdrop() - that.$element.trigger('hidden.bs.modal') - }) - } - - Modal.prototype.removeBackdrop = function () { - this.$backdrop && this.$backdrop.remove() - this.$backdrop = null - } - - Modal.prototype.backdrop = function (callback) { - var that = this - var animate = this.$element.hasClass('fade') ? 'fade' : '' - - if (this.isShown && this.options.backdrop) { - var doAnimate = $.support.transition && animate - - this.$backdrop = $('<div class="modal-backdrop ' + animate + '" />') - .appendTo(document.body) - - this.$element.on('click.dismiss.modal', $.proxy(function (e) { - if (e.target !== e.currentTarget) return - this.options.backdrop == 'static' - ? this.$element[0].focus.call(this.$element[0]) - : this.hide.call(this) - }, this)) - - if (doAnimate) this.$backdrop[0].offsetWidth // force reflow - - this.$backdrop.addClass('in') - - if (!callback) return - - doAnimate ? - this.$backdrop - .one($.support.transition.end, callback) - .emulateTransitionEnd(150) : - callback() - - } else if (!this.isShown && this.$backdrop) { - this.$backdrop.removeClass('in') - - $.support.transition && this.$element.hasClass('fade')? - this.$backdrop - .one($.support.transition.end, callback) - .emulateTransitionEnd(150) : - callback() - - } else if (callback) { - callback() - } - } - - - // MODAL PLUGIN DEFINITION - // ======================= - - var old = $.fn.modal - - $.fn.modal = function (option, _relatedTarget) { - return this.each(function () { - var $this = $(this) - var data = $this.data('bs.modal') - var options = $.extend({}, Modal.DEFAULTS, $this.data(), typeof option == 'object' && option) - - if (!data) $this.data('bs.modal', (data = new Modal(this, options))) - if (typeof option == 'string') data[option](_relatedTarget) - else if (options.show) data.show(_relatedTarget) - }) - } - - $.fn.modal.Constructor = Modal - - - // MODAL NO CONFLICT - // ================= - - $.fn.modal.noConflict = function () { - $.fn.modal = old - return this - } - - - // MODAL DATA-API - // ============== - - $(document).on('click.bs.modal.data-api', '[data-toggle="modal"]', function (e) { - var $this = $(this) - var href = $this.attr('href') - var $target = $($this.attr('data-target') || (href && href.replace(/.*(?=#[^\s]+$)/, ''))) //strip for ie7 - var option = $target.data('modal') ? 'toggle' : $.extend({ remote: !/#/.test(href) && href }, $target.data(), $this.data()) - - e.preventDefault() - - $target - .modal(option, this) - .one('hide', function () { - $this.is(':visible') && $this.focus() - }) - }) - - $(document) - .on('show.bs.modal', '.modal', function () { $(document.body).addClass('modal-open') }) - .on('hidden.bs.modal', '.modal', function () { $(document.body).removeClass('modal-open') }) - -}(window.jQuery); - -/* ======================================================================== - * Bootstrap: tooltip.js v3.0.0 - * http://twbs.github.com/bootstrap/javascript.html#tooltip - * Inspired by the original jQuery.tipsy by Jason Frame - * ======================================================================== - * Copyright 2012 Twitter, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ======================================================================== */ - - -+function ($) { "use strict"; - - // TOOLTIP PUBLIC CLASS DEFINITION - // =============================== - - var Tooltip = function (element, options) { - this.type = - this.options = - this.enabled = - this.timeout = - this.hoverState = - this.$element = null - - this.init('tooltip', element, options) - } - - Tooltip.DEFAULTS = { - animation: true - , placement: 'top' - , selector: false - , template: '<div class="tooltip"><div class="tooltip-arrow"></div><div class="tooltip-inner"></div></div>' - , trigger: 'hover focus' - , title: '' - , delay: 0 - , html: false - , container: false - } - - Tooltip.prototype.init = function (type, element, options) { - this.enabled = true - this.type = type - this.$element = $(element) - this.options = this.getOptions(options) - - var triggers = this.options.trigger.split(' ') - - for (var i = triggers.length; i--;) { - var trigger = triggers[i] - - if (trigger == 'click') { - this.$element.on('click.' + this.type, this.options.selector, $.proxy(this.toggle, this)) - } else if (trigger != 'manual') { - var eventIn = trigger == 'hover' ? 'mouseenter' : 'focus' - var eventOut = trigger == 'hover' ? 'mouseleave' : 'blur' - - this.$element.on(eventIn + '.' + this.type, this.options.selector, $.proxy(this.enter, this)) - this.$element.on(eventOut + '.' + this.type, this.options.selector, $.proxy(this.leave, this)) - } - } - - this.options.selector ? - (this._options = $.extend({}, this.options, { trigger: 'manual', selector: '' })) : - this.fixTitle() - } - - Tooltip.prototype.getDefaults = function () { - return Tooltip.DEFAULTS - } - - Tooltip.prototype.getOptions = function (options) { - options = $.extend({}, this.getDefaults(), this.$element.data(), options) - - if (options.delay && typeof options.delay == 'number') { - options.delay = { - show: options.delay - , hide: options.delay - } - } - - return options - } - - Tooltip.prototype.getDelegateOptions = function () { - var options = {} - var defaults = this.getDefaults() - - this._options && $.each(this._options, function (key, value) { - if (defaults[key] != value) options[key] = value - }) - - return options - } - - Tooltip.prototype.enter = function (obj) { - var self = obj instanceof this.constructor ? - obj : $(obj.currentTarget)[this.type](this.getDelegateOptions()).data('bs.' + this.type) - - clearTimeout(self.timeout) - - self.hoverState = 'in' - - if (!self.options.delay || !self.options.delay.show) return self.show() - - self.timeout = setTimeout(function () { - if (self.hoverState == 'in') self.show() - }, self.options.delay.show) - } - - Tooltip.prototype.leave = function (obj) { - var self = obj instanceof this.constructor ? - obj : $(obj.currentTarget)[this.type](this.getDelegateOptions()).data('bs.' + this.type) - - clearTimeout(self.timeout) - - self.hoverState = 'out' - - if (!self.options.delay || !self.options.delay.hide) return self.hide() - - self.timeout = setTimeout(function () { - if (self.hoverState == 'out') self.hide() - }, self.options.delay.hide) - } - - Tooltip.prototype.show = function () { - var e = $.Event('show.bs.'+ this.type) - - if (this.hasContent() && this.enabled) { - this.$element.trigger(e) - - if (e.isDefaultPrevented()) return - - var $tip = this.tip() - - this.setContent() - - if (this.options.animation) $tip.addClass('fade') - - var placement = typeof this.options.placement == 'function' ? - this.options.placement.call(this, $tip[0], this.$element[0]) : - this.options.placement - - var autoToken = /\s?auto?\s?/i - var autoPlace = autoToken.test(placement) - if (autoPlace) placement = placement.replace(autoToken, '') || 'top' - - $tip - .detach() - .css({ top: 0, left: 0, display: 'block' }) - .addClass(placement) - - this.options.container ? $tip.appendTo(this.options.container) : $tip.insertAfter(this.$element) - - var pos = this.getPosition() - var actualWidth = $tip[0].offsetWidth - var actualHeight = $tip[0].offsetHeight - - if (autoPlace) { - var $parent = this.$element.parent() - - var orgPlacement = placement - var docScroll = document.documentElement.scrollTop || document.body.scrollTop - var parentWidth = this.options.container == 'body' ? window.innerWidth : $parent.outerWidth() - var parentHeight = this.options.container == 'body' ? window.innerHeight : $parent.outerHeight() - var parentLeft = this.options.container == 'body' ? 0 : $parent.offset().left - - placement = placement == 'bottom' && pos.top + pos.height + actualHeight - docScroll > parentHeight ? 'top' : - placement == 'top' && pos.top - docScroll - actualHeight < 0 ? 'bottom' : - placement == 'right' && pos.right + actualWidth > parentWidth ? 'left' : - placement == 'left' && pos.left - actualWidth < parentLeft ? 'right' : - placement - - $tip - .removeClass(orgPlacement) - .addClass(placement) - } - - var calculatedOffset = this.getCalculatedOffset(placement, pos, actualWidth, actualHeight) - - this.applyPlacement(calculatedOffset, placement) - this.$element.trigger('shown.bs.' + this.type) - } - } - - Tooltip.prototype.applyPlacement = function(offset, placement) { - var replace - var $tip = this.tip() - var width = $tip[0].offsetWidth - var height = $tip[0].offsetHeight - - // manually read margins because getBoundingClientRect includes difference - var marginTop = parseInt($tip.css('margin-top'), 10) - var marginLeft = parseInt($tip.css('margin-left'), 10) - - // we must check for NaN for ie 8/9 - if (isNaN(marginTop)) marginTop = 0 - if (isNaN(marginLeft)) marginLeft = 0 - - offset.top = offset.top + marginTop - offset.left = offset.left + marginLeft - - $tip - .offset(offset) - .addClass('in') - - // check to see if placing tip in new offset caused the tip to resize itself - var actualWidth = $tip[0].offsetWidth - var actualHeight = $tip[0].offsetHeight - - if (placement == 'top' && actualHeight != height) { - replace = true - offset.top = offset.top + height - actualHeight - } - - if (/bottom|top/.test(placement)) { - var delta = 0 - - if (offset.left < 0) { - delta = offset.left * -2 - offset.left = 0 - - $tip.offset(offset) - - actualWidth = $tip[0].offsetWidth - actualHeight = $tip[0].offsetHeight - } - - this.replaceArrow(delta - width + actualWidth, actualWidth, 'left') - } else { - this.replaceArrow(actualHeight - height, actualHeight, 'top') - } - - if (replace) $tip.offset(offset) - } - - Tooltip.prototype.replaceArrow = function(delta, dimension, position) { - this.arrow().css(position, delta ? (50 * (1 - delta / dimension) + "%") : '') - } - - Tooltip.prototype.setContent = function () { - var $tip = this.tip() - var title = this.getTitle() - - $tip.find('.tooltip-inner')[this.options.html ? 'html' : 'text'](title) - $tip.removeClass('fade in top bottom left right') - } - - Tooltip.prototype.hide = function () { - var that = this - var $tip = this.tip() - var e = $.Event('hide.bs.' + this.type) - - function complete() { - if (that.hoverState != 'in') $tip.detach() - } - - this.$element.trigger(e) - - if (e.isDefaultPrevented()) return - - $tip.removeClass('in') - - $.support.transition && this.$tip.hasClass('fade') ? - $tip - .one($.support.transition.end, complete) - .emulateTransitionEnd(150) : - complete() - - this.$element.trigger('hidden.bs.' + this.type) - - return this - } - - Tooltip.prototype.fixTitle = function () { - var $e = this.$element - if ($e.attr('title') || typeof($e.attr('data-original-title')) != 'string') { - $e.attr('data-original-title', $e.attr('title') || '').attr('title', '') - } - } - - Tooltip.prototype.hasContent = function () { - return this.getTitle() - } - - Tooltip.prototype.getPosition = function () { - var el = this.$element[0] - return $.extend({}, (typeof el.getBoundingClientRect == 'function') ? el.getBoundingClientRect() : { - width: el.offsetWidth - , height: el.offsetHeight - }, this.$element.offset()) - } - - Tooltip.prototype.getCalculatedOffset = function (placement, pos, actualWidth, actualHeight) { - return placement == 'bottom' ? { top: pos.top + pos.height, left: pos.left + pos.width / 2 - actualWidth / 2 } : - placement == 'top' ? { top: pos.top - actualHeight, left: pos.left + pos.width / 2 - actualWidth / 2 } : - placement == 'left' ? { top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left - actualWidth } : - /* placement == 'right' */ { top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left + pos.width } - } - - Tooltip.prototype.getTitle = function () { - var title - var $e = this.$element - var o = this.options - - title = $e.attr('data-original-title') - || (typeof o.title == 'function' ? o.title.call($e[0]) : o.title) - - return title - } - - Tooltip.prototype.tip = function () { - return this.$tip = this.$tip || $(this.options.template) - } - - Tooltip.prototype.arrow = function () { - return this.$arrow = this.$arrow || this.tip().find('.tooltip-arrow') - } - - Tooltip.prototype.validate = function () { - if (!this.$element[0].parentNode) { - this.hide() - this.$element = null - this.options = null - } - } - - Tooltip.prototype.enable = function () { - this.enabled = true - } - - Tooltip.prototype.disable = function () { - this.enabled = false - } - - Tooltip.prototype.toggleEnabled = function () { - this.enabled = !this.enabled - } - - Tooltip.prototype.toggle = function (e) { - var self = e ? $(e.currentTarget)[this.type](this.getDelegateOptions()).data('bs.' + this.type) : this - self.tip().hasClass('in') ? self.leave(self) : self.enter(self) - } - - Tooltip.prototype.destroy = function () { - this.hide().$element.off('.' + this.type).removeData('bs.' + this.type) - } - - - // TOOLTIP PLUGIN DEFINITION - // ========================= - - var old = $.fn.tooltip - - $.fn.tooltip = function (option) { - return this.each(function () { - var $this = $(this) - var data = $this.data('bs.tooltip') - var options = typeof option == 'object' && option - - if (!data) $this.data('bs.tooltip', (data = new Tooltip(this, options))) - if (typeof option == 'string') data[option]() - }) - } - - $.fn.tooltip.Constructor = Tooltip - - - // TOOLTIP NO CONFLICT - // =================== - - $.fn.tooltip.noConflict = function () { - $.fn.tooltip = old - return this - } - -}(window.jQuery); - -/* ======================================================================== - * Bootstrap: popover.js v3.0.0 - * http://twbs.github.com/bootstrap/javascript.html#popovers - * ======================================================================== - * Copyright 2012 Twitter, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ======================================================================== */ - - -+function ($) { "use strict"; - - // POPOVER PUBLIC CLASS DEFINITION - // =============================== - - var Popover = function (element, options) { - this.init('popover', element, options) - } - - if (!$.fn.tooltip) throw new Error('Popover requires tooltip.js') - - Popover.DEFAULTS = $.extend({} , $.fn.tooltip.Constructor.DEFAULTS, { - placement: 'right' - , trigger: 'click' - , content: '' - , template: '<div class="popover"><div class="arrow"></div><h3 class="popover-title"></h3><div class="popover-content"></div></div>' - }) - - - // NOTE: POPOVER EXTENDS tooltip.js - // ================================ - - Popover.prototype = $.extend({}, $.fn.tooltip.Constructor.prototype) - - Popover.prototype.constructor = Popover - - Popover.prototype.getDefaults = function () { - return Popover.DEFAULTS - } - - Popover.prototype.setContent = function () { - var $tip = this.tip() - var title = this.getTitle() - var content = this.getContent() - - $tip.find('.popover-title')[this.options.html ? 'html' : 'text'](title) - $tip.find('.popover-content')[this.options.html ? 'html' : 'text'](content) - - $tip.removeClass('fade top bottom left right in') - - // IE8 doesn't accept hiding via the `:empty` pseudo selector, we have to do - // this manually by checking the contents. - if (!$tip.find('.popover-title').html()) $tip.find('.popover-title').hide() - } - - Popover.prototype.hasContent = function () { - return this.getTitle() || this.getContent() - } - - Popover.prototype.getContent = function () { - var $e = this.$element - var o = this.options - - return $e.attr('data-content') - || (typeof o.content == 'function' ? - o.content.call($e[0]) : - o.content) - } - - Popover.prototype.arrow = function () { - return this.$arrow = this.$arrow || this.tip().find('.arrow') - } - - Popover.prototype.tip = function () { - if (!this.$tip) this.$tip = $(this.options.template) - return this.$tip - } - - - // POPOVER PLUGIN DEFINITION - // ========================= - - var old = $.fn.popover - - $.fn.popover = function (option) { - return this.each(function () { - var $this = $(this) - var data = $this.data('bs.popover') - var options = typeof option == 'object' && option - - if (!data) $this.data('bs.popover', (data = new Popover(this, options))) - if (typeof option == 'string') data[option]() - }) - } - - $.fn.popover.Constructor = Popover - - - // POPOVER NO CONFLICT - // =================== - - $.fn.popover.noConflict = function () { - $.fn.popover = old - return this - } - -}(window.jQuery); - -/* ======================================================================== - * Bootstrap: scrollspy.js v3.0.0 - * http://twbs.github.com/bootstrap/javascript.html#scrollspy - * ======================================================================== - * Copyright 2012 Twitter, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ======================================================================== */ - - -+function ($) { "use strict"; - - // SCROLLSPY CLASS DEFINITION - // ========================== - - function ScrollSpy(element, options) { - var href - var process = $.proxy(this.process, this) - - this.$element = $(element).is('body') ? $(window) : $(element) - this.$body = $('body') - this.$scrollElement = this.$element.on('scroll.bs.scroll-spy.data-api', process) - this.options = $.extend({}, ScrollSpy.DEFAULTS, options) - this.selector = (this.options.target - || ((href = $(element).attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '')) //strip for ie7 - || '') + ' .nav li > a' - this.offsets = $([]) - this.targets = $([]) - this.activeTarget = null - - this.refresh() - this.process() - } - - ScrollSpy.DEFAULTS = { - offset: 10 - } - - ScrollSpy.prototype.refresh = function () { - var offsetMethod = this.$element[0] == window ? 'offset' : 'position' - - this.offsets = $([]) - this.targets = $([]) - - var self = this - var $targets = this.$body - .find(this.selector) - .map(function () { - var $el = $(this) - var href = $el.data('target') || $el.attr('href') - var $href = /^#\w/.test(href) && $(href) - - return ($href - && $href.length - && [[ $href[offsetMethod]().top + (!$.isWindow(self.$scrollElement.get(0)) && self.$scrollElement.scrollTop()), href ]]) || null - }) - .sort(function (a, b) { return a[0] - b[0] }) - .each(function () { - self.offsets.push(this[0]) - self.targets.push(this[1]) - }) - } - - ScrollSpy.prototype.process = function () { - var scrollTop = this.$scrollElement.scrollTop() + this.options.offset - var scrollHeight = this.$scrollElement[0].scrollHeight || this.$body[0].scrollHeight - var maxScroll = scrollHeight - this.$scrollElement.height() - var offsets = this.offsets - var targets = this.targets - var activeTarget = this.activeTarget - var i - - if (scrollTop >= maxScroll) { - return activeTarget != (i = targets.last()[0]) && this.activate(i) - } - - for (i = offsets.length; i--;) { - activeTarget != targets[i] - && scrollTop >= offsets[i] - && (!offsets[i + 1] || scrollTop <= offsets[i + 1]) - && this.activate( targets[i] ) - } - } - - ScrollSpy.prototype.activate = function (target) { - this.activeTarget = target - - $(this.selector) - .parents('.active') - .removeClass('active') - - var selector = this.selector - + '[data-target="' + target + '"],' - + this.selector + '[href="' + target + '"]' - - var active = $(selector) - .parents('li') - .addClass('active') - - if (active.parent('.dropdown-menu').length) { - active = active - .closest('li.dropdown') - .addClass('active') - } - - active.trigger('activate') - } - - - // SCROLLSPY PLUGIN DEFINITION - // =========================== - - var old = $.fn.scrollspy - - $.fn.scrollspy = function (option) { - return this.each(function () { - var $this = $(this) - var data = $this.data('bs.scrollspy') - var options = typeof option == 'object' && option - - if (!data) $this.data('bs.scrollspy', (data = new ScrollSpy(this, options))) - if (typeof option == 'string') data[option]() - }) - } - - $.fn.scrollspy.Constructor = ScrollSpy - - - // SCROLLSPY NO CONFLICT - // ===================== - - $.fn.scrollspy.noConflict = function () { - $.fn.scrollspy = old - return this - } - - - // SCROLLSPY DATA-API - // ================== - - $(window).on('load', function () { - $('[data-spy="scroll"]').each(function () { - var $spy = $(this) - $spy.scrollspy($spy.data()) - }) - }) - -}(window.jQuery); - -/* ======================================================================== - * Bootstrap: tab.js v3.0.0 - * http://twbs.github.com/bootstrap/javascript.html#tabs - * ======================================================================== - * Copyright 2012 Twitter, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ======================================================================== */ - - -+function ($) { "use strict"; - - // TAB CLASS DEFINITION - // ==================== - - var Tab = function (element) { - this.element = $(element) - } - - Tab.prototype.show = function () { - var $this = this.element - var $ul = $this.closest('ul:not(.dropdown-menu)') - var selector = $this.attr('data-target') - - if (!selector) { - selector = $this.attr('href') - selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') //strip for ie7 - } - - if ($this.parent('li').hasClass('active')) return - - var previous = $ul.find('.active:last a')[0] - var e = $.Event('show.bs.tab', { - relatedTarget: previous - }) - - $this.trigger(e) - - if (e.isDefaultPrevented()) return - - var $target = $(selector) - - this.activate($this.parent('li'), $ul) - this.activate($target, $target.parent(), function () { - $this.trigger({ - type: 'shown.bs.tab' - , relatedTarget: previous - }) - }) - } - - Tab.prototype.activate = function (element, container, callback) { - var $active = container.find('> .active') - var transition = callback - && $.support.transition - && $active.hasClass('fade') - - function next() { - $active - .removeClass('active') - .find('> .dropdown-menu > .active') - .removeClass('active') - - element.addClass('active') - - if (transition) { - element[0].offsetWidth // reflow for transition - element.addClass('in') - } else { - element.removeClass('fade') - } - - if (element.parent('.dropdown-menu')) { - element.closest('li.dropdown').addClass('active') - } - - callback && callback() - } - - transition ? - $active - .one($.support.transition.end, next) - .emulateTransitionEnd(150) : - next() - - $active.removeClass('in') - } - - - // TAB PLUGIN DEFINITION - // ===================== - - var old = $.fn.tab - - $.fn.tab = function ( option ) { - return this.each(function () { - var $this = $(this) - var data = $this.data('bs.tab') - - if (!data) $this.data('bs.tab', (data = new Tab(this))) - if (typeof option == 'string') data[option]() - }) - } - - $.fn.tab.Constructor = Tab - - - // TAB NO CONFLICT - // =============== - - $.fn.tab.noConflict = function () { - $.fn.tab = old - return this - } - - - // TAB DATA-API - // ============ - - $(document).on('click.bs.tab.data-api', '[data-toggle="tab"], [data-toggle="pill"]', function (e) { - e.preventDefault() - $(this).tab('show') - }) - -}(window.jQuery); - -/* ======================================================================== - * Bootstrap: affix.js v3.0.0 - * http://twbs.github.com/bootstrap/javascript.html#affix - * ======================================================================== - * Copyright 2012 Twitter, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ======================================================================== */ - - -+function ($) { "use strict"; - - // AFFIX CLASS DEFINITION - // ====================== - - var Affix = function (element, options) { - this.options = $.extend({}, Affix.DEFAULTS, options) - this.$window = $(window) - .on('scroll.bs.affix.data-api', $.proxy(this.checkPosition, this)) - .on('click.bs.affix.data-api', $.proxy(this.checkPositionWithEventLoop, this)) - - this.$element = $(element) - this.affixed = - this.unpin = null - - this.checkPosition() - } - - Affix.RESET = 'affix affix-top affix-bottom' - - Affix.DEFAULTS = { - offset: 0 - } - - Affix.prototype.checkPositionWithEventLoop = function () { - setTimeout($.proxy(this.checkPosition, this), 1) - } - - Affix.prototype.checkPosition = function () { - if (!this.$element.is(':visible')) return - - var scrollHeight = $(document).height() - var scrollTop = this.$window.scrollTop() - var position = this.$element.offset() - var offset = this.options.offset - var offsetTop = offset.top - var offsetBottom = offset.bottom - - if (typeof offset != 'object') offsetBottom = offsetTop = offset - if (typeof offsetTop == 'function') offsetTop = offset.top() - if (typeof offsetBottom == 'function') offsetBottom = offset.bottom() - - var affix = this.unpin != null && (scrollTop + this.unpin <= position.top) ? false : - offsetBottom != null && (position.top + this.$element.height() >= scrollHeight - offsetBottom) ? 'bottom' : - offsetTop != null && (scrollTop <= offsetTop) ? 'top' : false - - if (this.affixed === affix) return - if (this.unpin) this.$element.css('top', '') - - this.affixed = affix - this.unpin = affix == 'bottom' ? position.top - scrollTop : null - - this.$element.removeClass(Affix.RESET).addClass('affix' + (affix ? '-' + affix : '')) - - if (affix == 'bottom') { - this.$element.offset({ top: document.body.offsetHeight - offsetBottom - this.$element.height() }) - } - } - - - // AFFIX PLUGIN DEFINITION - // ======================= - - var old = $.fn.affix - - $.fn.affix = function (option) { - return this.each(function () { - var $this = $(this) - var data = $this.data('bs.affix') - var options = typeof option == 'object' && option - - if (!data) $this.data('bs.affix', (data = new Affix(this, options))) - if (typeof option == 'string') data[option]() - }) - } - - $.fn.affix.Constructor = Affix - - - // AFFIX NO CONFLICT - // ================= - - $.fn.affix.noConflict = function () { - $.fn.affix = old - return this - } - - - // AFFIX DATA-API - // ============== - - $(window).on('load', function () { - $('[data-spy="affix"]').each(function () { - var $spy = $(this) - var data = $spy.data() - - data.offset = data.offset || {} - - if (data.offsetBottom) data.offset.bottom = data.offsetBottom - if (data.offsetTop) data.offset.top = data.offsetTop - - $spy.affix(data) - }) - }) - -}(window.jQuery); diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/.gc3pie/html/bootstrap3/js/bootstrap.min.js b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/.gc3pie/html/bootstrap3/js/bootstrap.min.js deleted file mode 100644 index 1765631f41f2b74d016945a39ab2cbda43260177..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/.gc3pie/html/bootstrap3/js/bootstrap.min.js +++ /dev/null @@ -1,6 +0,0 @@ -/** -* bootstrap.js v3.0.0 by @fat and @mdo -* Copyright 2013 Twitter Inc. -* http://www.apache.org/licenses/LICENSE-2.0 -*/ -if(!jQuery)throw new Error("Bootstrap requires jQuery");+function(a){"use strict";function b(){var a=document.createElement("bootstrap"),b={WebkitTransition:"webkitTransitionEnd",MozTransition:"transitionend",OTransition:"oTransitionEnd otransitionend",transition:"transitionend"};for(var c in b)if(void 0!==a.style[c])return{end:b[c]}}a.fn.emulateTransitionEnd=function(b){var c=!1,d=this;a(this).one(a.support.transition.end,function(){c=!0});var e=function(){c||a(d).trigger(a.support.transition.end)};return setTimeout(e,b),this},a(function(){a.support.transition=b()})}(window.jQuery),+function(a){"use strict";var b='[data-dismiss="alert"]',c=function(c){a(c).on("click",b,this.close)};c.prototype.close=function(b){function c(){f.trigger("closed.bs.alert").remove()}var d=a(this),e=d.attr("data-target");e||(e=d.attr("href"),e=e&&e.replace(/.*(?=#[^\s]*$)/,""));var f=a(e);b&&b.preventDefault(),f.length||(f=d.hasClass("alert")?d:d.parent()),f.trigger(b=a.Event("close.bs.alert")),b.isDefaultPrevented()||(f.removeClass("in"),a.support.transition&&f.hasClass("fade")?f.one(a.support.transition.end,c).emulateTransitionEnd(150):c())};var d=a.fn.alert;a.fn.alert=function(b){return this.each(function(){var d=a(this),e=d.data("bs.alert");e||d.data("bs.alert",e=new c(this)),"string"==typeof b&&e[b].call(d)})},a.fn.alert.Constructor=c,a.fn.alert.noConflict=function(){return a.fn.alert=d,this},a(document).on("click.bs.alert.data-api",b,c.prototype.close)}(window.jQuery),+function(a){"use strict";var b=function(c,d){this.$element=a(c),this.options=a.extend({},b.DEFAULTS,d)};b.DEFAULTS={loadingText:"loading..."},b.prototype.setState=function(a){var b="disabled",c=this.$element,d=c.is("input")?"val":"html",e=c.data();a+="Text",e.resetText||c.data("resetText",c[d]()),c[d](e[a]||this.options[a]),setTimeout(function(){"loadingText"==a?c.addClass(b).attr(b,b):c.removeClass(b).removeAttr(b)},0)},b.prototype.toggle=function(){var a=this.$element.closest('[data-toggle="buttons"]');if(a.length){var b=this.$element.find("input").prop("checked",!this.$element.hasClass("active")).trigger("change");"radio"===b.prop("type")&&a.find(".active").removeClass("active")}this.$element.toggleClass("active")};var c=a.fn.button;a.fn.button=function(c){return this.each(function(){var d=a(this),e=d.data("bs.button"),f="object"==typeof c&&c;e||d.data("bs.button",e=new b(this,f)),"toggle"==c?e.toggle():c&&e.setState(c)})},a.fn.button.Constructor=b,a.fn.button.noConflict=function(){return a.fn.button=c,this},a(document).on("click.bs.button.data-api","[data-toggle^=button]",function(b){var c=a(b.target);c.hasClass("btn")||(c=c.closest(".btn")),c.button("toggle"),b.preventDefault()})}(window.jQuery),+function(a){"use strict";var b=function(b,c){this.$element=a(b),this.$indicators=this.$element.find(".carousel-indicators"),this.options=c,this.paused=this.sliding=this.interval=this.$active=this.$items=null,"hover"==this.options.pause&&this.$element.on("mouseenter",a.proxy(this.pause,this)).on("mouseleave",a.proxy(this.cycle,this))};b.DEFAULTS={interval:5e3,pause:"hover",wrap:!0},b.prototype.cycle=function(b){return b||(this.paused=!1),this.interval&&clearInterval(this.interval),this.options.interval&&!this.paused&&(this.interval=setInterval(a.proxy(this.next,this),this.options.interval)),this},b.prototype.getActiveIndex=function(){return this.$active=this.$element.find(".item.active"),this.$items=this.$active.parent().children(),this.$items.index(this.$active)},b.prototype.to=function(b){var c=this,d=this.getActiveIndex();return b>this.$items.length-1||0>b?void 0:this.sliding?this.$element.one("slid",function(){c.to(b)}):d==b?this.pause().cycle():this.slide(b>d?"next":"prev",a(this.$items[b]))},b.prototype.pause=function(b){return b||(this.paused=!0),this.$element.find(".next, .prev").length&&a.support.transition.end&&(this.$element.trigger(a.support.transition.end),this.cycle(!0)),this.interval=clearInterval(this.interval),this},b.prototype.next=function(){return this.sliding?void 0:this.slide("next")},b.prototype.prev=function(){return this.sliding?void 0:this.slide("prev")},b.prototype.slide=function(b,c){var d=this.$element.find(".item.active"),e=c||d[b](),f=this.interval,g="next"==b?"left":"right",h="next"==b?"first":"last",i=this;if(!e.length){if(!this.options.wrap)return;e=this.$element.find(".item")[h]()}this.sliding=!0,f&&this.pause();var j=a.Event("slide.bs.carousel",{relatedTarget:e[0],direction:g});if(!e.hasClass("active")){if(this.$indicators.length&&(this.$indicators.find(".active").removeClass("active"),this.$element.one("slid",function(){var b=a(i.$indicators.children()[i.getActiveIndex()]);b&&b.addClass("active")})),a.support.transition&&this.$element.hasClass("slide")){if(this.$element.trigger(j),j.isDefaultPrevented())return;e.addClass(b),e[0].offsetWidth,d.addClass(g),e.addClass(g),d.one(a.support.transition.end,function(){e.removeClass([b,g].join(" ")).addClass("active"),d.removeClass(["active",g].join(" ")),i.sliding=!1,setTimeout(function(){i.$element.trigger("slid")},0)}).emulateTransitionEnd(600)}else{if(this.$element.trigger(j),j.isDefaultPrevented())return;d.removeClass("active"),e.addClass("active"),this.sliding=!1,this.$element.trigger("slid")}return f&&this.cycle(),this}};var c=a.fn.carousel;a.fn.carousel=function(c){return this.each(function(){var d=a(this),e=d.data("bs.carousel"),f=a.extend({},b.DEFAULTS,d.data(),"object"==typeof c&&c),g="string"==typeof c?c:f.slide;e||d.data("bs.carousel",e=new b(this,f)),"number"==typeof c?e.to(c):g?e[g]():f.interval&&e.pause().cycle()})},a.fn.carousel.Constructor=b,a.fn.carousel.noConflict=function(){return a.fn.carousel=c,this},a(document).on("click.bs.carousel.data-api","[data-slide], [data-slide-to]",function(b){var c,d=a(this),e=a(d.attr("data-target")||(c=d.attr("href"))&&c.replace(/.*(?=#[^\s]+$)/,"")),f=a.extend({},e.data(),d.data()),g=d.attr("data-slide-to");g&&(f.interval=!1),e.carousel(f),(g=d.attr("data-slide-to"))&&e.data("bs.carousel").to(g),b.preventDefault()}),a(window).on("load",function(){a('[data-ride="carousel"]').each(function(){var b=a(this);b.carousel(b.data())})})}(window.jQuery),+function(a){"use strict";var b=function(c,d){this.$element=a(c),this.options=a.extend({},b.DEFAULTS,d),this.transitioning=null,this.options.parent&&(this.$parent=a(this.options.parent)),this.options.toggle&&this.toggle()};b.DEFAULTS={toggle:!0},b.prototype.dimension=function(){var a=this.$element.hasClass("width");return a?"width":"height"},b.prototype.show=function(){if(!this.transitioning&&!this.$element.hasClass("in")){var b=a.Event("show.bs.collapse");if(this.$element.trigger(b),!b.isDefaultPrevented()){var c=this.$parent&&this.$parent.find("> .panel > .in");if(c&&c.length){var d=c.data("bs.collapse");if(d&&d.transitioning)return;c.collapse("hide"),d||c.data("bs.collapse",null)}var e=this.dimension();this.$element.removeClass("collapse").addClass("collapsing")[e](0),this.transitioning=1;var f=function(){this.$element.removeClass("collapsing").addClass("in")[e]("auto"),this.transitioning=0,this.$element.trigger("shown.bs.collapse")};if(!a.support.transition)return f.call(this);var g=a.camelCase(["scroll",e].join("-"));this.$element.one(a.support.transition.end,a.proxy(f,this)).emulateTransitionEnd(350)[e](this.$element[0][g])}}},b.prototype.hide=function(){if(!this.transitioning&&this.$element.hasClass("in")){var b=a.Event("hide.bs.collapse");if(this.$element.trigger(b),!b.isDefaultPrevented()){var c=this.dimension();this.$element[c](this.$element[c]())[0].offsetHeight,this.$element.addClass("collapsing").removeClass("collapse").removeClass("in"),this.transitioning=1;var d=function(){this.transitioning=0,this.$element.trigger("hidden.bs.collapse").removeClass("collapsing").addClass("collapse")};return a.support.transition?(this.$element[c](0).one(a.support.transition.end,a.proxy(d,this)).emulateTransitionEnd(350),void 0):d.call(this)}}},b.prototype.toggle=function(){this[this.$element.hasClass("in")?"hide":"show"]()};var c=a.fn.collapse;a.fn.collapse=function(c){return this.each(function(){var d=a(this),e=d.data("bs.collapse"),f=a.extend({},b.DEFAULTS,d.data(),"object"==typeof c&&c);e||d.data("bs.collapse",e=new b(this,f)),"string"==typeof c&&e[c]()})},a.fn.collapse.Constructor=b,a.fn.collapse.noConflict=function(){return a.fn.collapse=c,this},a(document).on("click.bs.collapse.data-api","[data-toggle=collapse]",function(b){var c,d=a(this),e=d.attr("data-target")||b.preventDefault()||(c=d.attr("href"))&&c.replace(/.*(?=#[^\s]+$)/,""),f=a(e),g=f.data("bs.collapse"),h=g?"toggle":d.data(),i=d.attr("data-parent"),j=i&&a(i);g&&g.transitioning||(j&&j.find('[data-toggle=collapse][data-parent="'+i+'"]').not(d).addClass("collapsed"),d[f.hasClass("in")?"addClass":"removeClass"]("collapsed")),f.collapse(h)})}(window.jQuery),+function(a){"use strict";function b(){a(d).remove(),a(e).each(function(b){var d=c(a(this));d.hasClass("open")&&(d.trigger(b=a.Event("hide.bs.dropdown")),b.isDefaultPrevented()||d.removeClass("open").trigger("hidden.bs.dropdown"))})}function c(b){var c=b.attr("data-target");c||(c=b.attr("href"),c=c&&/#/.test(c)&&c.replace(/.*(?=#[^\s]*$)/,""));var d=c&&a(c);return d&&d.length?d:b.parent()}var d=".dropdown-backdrop",e="[data-toggle=dropdown]",f=function(b){a(b).on("click.bs.dropdown",this.toggle)};f.prototype.toggle=function(d){var e=a(this);if(!e.is(".disabled, :disabled")){var f=c(e),g=f.hasClass("open");if(b(),!g){if("ontouchstart"in document.documentElement&&!f.closest(".navbar-nav").length&&a('<div class="dropdown-backdrop"/>').insertAfter(a(this)).on("click",b),f.trigger(d=a.Event("show.bs.dropdown")),d.isDefaultPrevented())return;f.toggleClass("open").trigger("shown.bs.dropdown"),e.focus()}return!1}},f.prototype.keydown=function(b){if(/(38|40|27)/.test(b.keyCode)){var d=a(this);if(b.preventDefault(),b.stopPropagation(),!d.is(".disabled, :disabled")){var f=c(d),g=f.hasClass("open");if(!g||g&&27==b.keyCode)return 27==b.which&&f.find(e).focus(),d.click();var h=a("[role=menu] li:not(.divider):visible a",f);if(h.length){var i=h.index(h.filter(":focus"));38==b.keyCode&&i>0&&i--,40==b.keyCode&&i<h.length-1&&i++,~i||(i=0),h.eq(i).focus()}}}};var g=a.fn.dropdown;a.fn.dropdown=function(b){return this.each(function(){var c=a(this),d=c.data("dropdown");d||c.data("dropdown",d=new f(this)),"string"==typeof b&&d[b].call(c)})},a.fn.dropdown.Constructor=f,a.fn.dropdown.noConflict=function(){return a.fn.dropdown=g,this},a(document).on("click.bs.dropdown.data-api",b).on("click.bs.dropdown.data-api",".dropdown form",function(a){a.stopPropagation()}).on("click.bs.dropdown.data-api",e,f.prototype.toggle).on("keydown.bs.dropdown.data-api",e+", [role=menu]",f.prototype.keydown)}(window.jQuery),+function(a){"use strict";var b=function(b,c){this.options=c,this.$element=a(b),this.$backdrop=this.isShown=null,this.options.remote&&this.$element.load(this.options.remote)};b.DEFAULTS={backdrop:!0,keyboard:!0,show:!0},b.prototype.toggle=function(a){return this[this.isShown?"hide":"show"](a)},b.prototype.show=function(b){var c=this,d=a.Event("show.bs.modal",{relatedTarget:b});this.$element.trigger(d),this.isShown||d.isDefaultPrevented()||(this.isShown=!0,this.escape(),this.$element.on("click.dismiss.modal",'[data-dismiss="modal"]',a.proxy(this.hide,this)),this.backdrop(function(){var d=a.support.transition&&c.$element.hasClass("fade");c.$element.parent().length||c.$element.appendTo(document.body),c.$element.show(),d&&c.$element[0].offsetWidth,c.$element.addClass("in").attr("aria-hidden",!1),c.enforceFocus();var e=a.Event("shown.bs.modal",{relatedTarget:b});d?c.$element.find(".modal-dialog").one(a.support.transition.end,function(){c.$element.focus().trigger(e)}).emulateTransitionEnd(300):c.$element.focus().trigger(e)}))},b.prototype.hide=function(b){b&&b.preventDefault(),b=a.Event("hide.bs.modal"),this.$element.trigger(b),this.isShown&&!b.isDefaultPrevented()&&(this.isShown=!1,this.escape(),a(document).off("focusin.bs.modal"),this.$element.removeClass("in").attr("aria-hidden",!0).off("click.dismiss.modal"),a.support.transition&&this.$element.hasClass("fade")?this.$element.one(a.support.transition.end,a.proxy(this.hideModal,this)).emulateTransitionEnd(300):this.hideModal())},b.prototype.enforceFocus=function(){a(document).off("focusin.bs.modal").on("focusin.bs.modal",a.proxy(function(a){this.$element[0]===a.target||this.$element.has(a.target).length||this.$element.focus()},this))},b.prototype.escape=function(){this.isShown&&this.options.keyboard?this.$element.on("keyup.dismiss.bs.modal",a.proxy(function(a){27==a.which&&this.hide()},this)):this.isShown||this.$element.off("keyup.dismiss.bs.modal")},b.prototype.hideModal=function(){var a=this;this.$element.hide(),this.backdrop(function(){a.removeBackdrop(),a.$element.trigger("hidden.bs.modal")})},b.prototype.removeBackdrop=function(){this.$backdrop&&this.$backdrop.remove(),this.$backdrop=null},b.prototype.backdrop=function(b){var c=this.$element.hasClass("fade")?"fade":"";if(this.isShown&&this.options.backdrop){var d=a.support.transition&&c;if(this.$backdrop=a('<div class="modal-backdrop '+c+'" />').appendTo(document.body),this.$element.on("click.dismiss.modal",a.proxy(function(a){a.target===a.currentTarget&&("static"==this.options.backdrop?this.$element[0].focus.call(this.$element[0]):this.hide.call(this))},this)),d&&this.$backdrop[0].offsetWidth,this.$backdrop.addClass("in"),!b)return;d?this.$backdrop.one(a.support.transition.end,b).emulateTransitionEnd(150):b()}else!this.isShown&&this.$backdrop?(this.$backdrop.removeClass("in"),a.support.transition&&this.$element.hasClass("fade")?this.$backdrop.one(a.support.transition.end,b).emulateTransitionEnd(150):b()):b&&b()};var c=a.fn.modal;a.fn.modal=function(c,d){return this.each(function(){var e=a(this),f=e.data("bs.modal"),g=a.extend({},b.DEFAULTS,e.data(),"object"==typeof c&&c);f||e.data("bs.modal",f=new b(this,g)),"string"==typeof c?f[c](d):g.show&&f.show(d)})},a.fn.modal.Constructor=b,a.fn.modal.noConflict=function(){return a.fn.modal=c,this},a(document).on("click.bs.modal.data-api",'[data-toggle="modal"]',function(b){var c=a(this),d=c.attr("href"),e=a(c.attr("data-target")||d&&d.replace(/.*(?=#[^\s]+$)/,"")),f=e.data("modal")?"toggle":a.extend({remote:!/#/.test(d)&&d},e.data(),c.data());b.preventDefault(),e.modal(f,this).one("hide",function(){c.is(":visible")&&c.focus()})}),a(document).on("show.bs.modal",".modal",function(){a(document.body).addClass("modal-open")}).on("hidden.bs.modal",".modal",function(){a(document.body).removeClass("modal-open")})}(window.jQuery),+function(a){"use strict";var b=function(a,b){this.type=this.options=this.enabled=this.timeout=this.hoverState=this.$element=null,this.init("tooltip",a,b)};b.DEFAULTS={animation:!0,placement:"top",selector:!1,template:'<div class="tooltip"><div class="tooltip-arrow"></div><div class="tooltip-inner"></div></div>',trigger:"hover focus",title:"",delay:0,html:!1,container:!1},b.prototype.init=function(b,c,d){this.enabled=!0,this.type=b,this.$element=a(c),this.options=this.getOptions(d);for(var e=this.options.trigger.split(" "),f=e.length;f--;){var g=e[f];if("click"==g)this.$element.on("click."+this.type,this.options.selector,a.proxy(this.toggle,this));else if("manual"!=g){var h="hover"==g?"mouseenter":"focus",i="hover"==g?"mouseleave":"blur";this.$element.on(h+"."+this.type,this.options.selector,a.proxy(this.enter,this)),this.$element.on(i+"."+this.type,this.options.selector,a.proxy(this.leave,this))}}this.options.selector?this._options=a.extend({},this.options,{trigger:"manual",selector:""}):this.fixTitle()},b.prototype.getDefaults=function(){return b.DEFAULTS},b.prototype.getOptions=function(b){return b=a.extend({},this.getDefaults(),this.$element.data(),b),b.delay&&"number"==typeof b.delay&&(b.delay={show:b.delay,hide:b.delay}),b},b.prototype.getDelegateOptions=function(){var b={},c=this.getDefaults();return this._options&&a.each(this._options,function(a,d){c[a]!=d&&(b[a]=d)}),b},b.prototype.enter=function(b){var c=b instanceof this.constructor?b:a(b.currentTarget)[this.type](this.getDelegateOptions()).data("bs."+this.type);return clearTimeout(c.timeout),c.hoverState="in",c.options.delay&&c.options.delay.show?(c.timeout=setTimeout(function(){"in"==c.hoverState&&c.show()},c.options.delay.show),void 0):c.show()},b.prototype.leave=function(b){var c=b instanceof this.constructor?b:a(b.currentTarget)[this.type](this.getDelegateOptions()).data("bs."+this.type);return clearTimeout(c.timeout),c.hoverState="out",c.options.delay&&c.options.delay.hide?(c.timeout=setTimeout(function(){"out"==c.hoverState&&c.hide()},c.options.delay.hide),void 0):c.hide()},b.prototype.show=function(){var b=a.Event("show.bs."+this.type);if(this.hasContent()&&this.enabled){if(this.$element.trigger(b),b.isDefaultPrevented())return;var c=this.tip();this.setContent(),this.options.animation&&c.addClass("fade");var d="function"==typeof this.options.placement?this.options.placement.call(this,c[0],this.$element[0]):this.options.placement,e=/\s?auto?\s?/i,f=e.test(d);f&&(d=d.replace(e,"")||"top"),c.detach().css({top:0,left:0,display:"block"}).addClass(d),this.options.container?c.appendTo(this.options.container):c.insertAfter(this.$element);var g=this.getPosition(),h=c[0].offsetWidth,i=c[0].offsetHeight;if(f){var j=this.$element.parent(),k=d,l=document.documentElement.scrollTop||document.body.scrollTop,m="body"==this.options.container?window.innerWidth:j.outerWidth(),n="body"==this.options.container?window.innerHeight:j.outerHeight(),o="body"==this.options.container?0:j.offset().left;d="bottom"==d&&g.top+g.height+i-l>n?"top":"top"==d&&g.top-l-i<0?"bottom":"right"==d&&g.right+h>m?"left":"left"==d&&g.left-h<o?"right":d,c.removeClass(k).addClass(d)}var p=this.getCalculatedOffset(d,g,h,i);this.applyPlacement(p,d),this.$element.trigger("shown.bs."+this.type)}},b.prototype.applyPlacement=function(a,b){var c,d=this.tip(),e=d[0].offsetWidth,f=d[0].offsetHeight,g=parseInt(d.css("margin-top"),10),h=parseInt(d.css("margin-left"),10);isNaN(g)&&(g=0),isNaN(h)&&(h=0),a.top=a.top+g,a.left=a.left+h,d.offset(a).addClass("in");var i=d[0].offsetWidth,j=d[0].offsetHeight;if("top"==b&&j!=f&&(c=!0,a.top=a.top+f-j),/bottom|top/.test(b)){var k=0;a.left<0&&(k=-2*a.left,a.left=0,d.offset(a),i=d[0].offsetWidth,j=d[0].offsetHeight),this.replaceArrow(k-e+i,i,"left")}else this.replaceArrow(j-f,j,"top");c&&d.offset(a)},b.prototype.replaceArrow=function(a,b,c){this.arrow().css(c,a?50*(1-a/b)+"%":"")},b.prototype.setContent=function(){var a=this.tip(),b=this.getTitle();a.find(".tooltip-inner")[this.options.html?"html":"text"](b),a.removeClass("fade in top bottom left right")},b.prototype.hide=function(){function b(){"in"!=c.hoverState&&d.detach()}var c=this,d=this.tip(),e=a.Event("hide.bs."+this.type);return this.$element.trigger(e),e.isDefaultPrevented()?void 0:(d.removeClass("in"),a.support.transition&&this.$tip.hasClass("fade")?d.one(a.support.transition.end,b).emulateTransitionEnd(150):b(),this.$element.trigger("hidden.bs."+this.type),this)},b.prototype.fixTitle=function(){var a=this.$element;(a.attr("title")||"string"!=typeof a.attr("data-original-title"))&&a.attr("data-original-title",a.attr("title")||"").attr("title","")},b.prototype.hasContent=function(){return this.getTitle()},b.prototype.getPosition=function(){var b=this.$element[0];return a.extend({},"function"==typeof b.getBoundingClientRect?b.getBoundingClientRect():{width:b.offsetWidth,height:b.offsetHeight},this.$element.offset())},b.prototype.getCalculatedOffset=function(a,b,c,d){return"bottom"==a?{top:b.top+b.height,left:b.left+b.width/2-c/2}:"top"==a?{top:b.top-d,left:b.left+b.width/2-c/2}:"left"==a?{top:b.top+b.height/2-d/2,left:b.left-c}:{top:b.top+b.height/2-d/2,left:b.left+b.width}},b.prototype.getTitle=function(){var a,b=this.$element,c=this.options;return a=b.attr("data-original-title")||("function"==typeof c.title?c.title.call(b[0]):c.title)},b.prototype.tip=function(){return this.$tip=this.$tip||a(this.options.template)},b.prototype.arrow=function(){return this.$arrow=this.$arrow||this.tip().find(".tooltip-arrow")},b.prototype.validate=function(){this.$element[0].parentNode||(this.hide(),this.$element=null,this.options=null)},b.prototype.enable=function(){this.enabled=!0},b.prototype.disable=function(){this.enabled=!1},b.prototype.toggleEnabled=function(){this.enabled=!this.enabled},b.prototype.toggle=function(b){var c=b?a(b.currentTarget)[this.type](this.getDelegateOptions()).data("bs."+this.type):this;c.tip().hasClass("in")?c.leave(c):c.enter(c)},b.prototype.destroy=function(){this.hide().$element.off("."+this.type).removeData("bs."+this.type)};var c=a.fn.tooltip;a.fn.tooltip=function(c){return this.each(function(){var d=a(this),e=d.data("bs.tooltip"),f="object"==typeof c&&c;e||d.data("bs.tooltip",e=new b(this,f)),"string"==typeof c&&e[c]()})},a.fn.tooltip.Constructor=b,a.fn.tooltip.noConflict=function(){return a.fn.tooltip=c,this}}(window.jQuery),+function(a){"use strict";var b=function(a,b){this.init("popover",a,b)};if(!a.fn.tooltip)throw new Error("Popover requires tooltip.js");b.DEFAULTS=a.extend({},a.fn.tooltip.Constructor.DEFAULTS,{placement:"right",trigger:"click",content:"",template:'<div class="popover"><div class="arrow"></div><h3 class="popover-title"></h3><div class="popover-content"></div></div>'}),b.prototype=a.extend({},a.fn.tooltip.Constructor.prototype),b.prototype.constructor=b,b.prototype.getDefaults=function(){return b.DEFAULTS},b.prototype.setContent=function(){var a=this.tip(),b=this.getTitle(),c=this.getContent();a.find(".popover-title")[this.options.html?"html":"text"](b),a.find(".popover-content")[this.options.html?"html":"text"](c),a.removeClass("fade top bottom left right in"),a.find(".popover-title").html()||a.find(".popover-title").hide()},b.prototype.hasContent=function(){return this.getTitle()||this.getContent()},b.prototype.getContent=function(){var a=this.$element,b=this.options;return a.attr("data-content")||("function"==typeof b.content?b.content.call(a[0]):b.content)},b.prototype.arrow=function(){return this.$arrow=this.$arrow||this.tip().find(".arrow")},b.prototype.tip=function(){return this.$tip||(this.$tip=a(this.options.template)),this.$tip};var c=a.fn.popover;a.fn.popover=function(c){return this.each(function(){var d=a(this),e=d.data("bs.popover"),f="object"==typeof c&&c;e||d.data("bs.popover",e=new b(this,f)),"string"==typeof c&&e[c]()})},a.fn.popover.Constructor=b,a.fn.popover.noConflict=function(){return a.fn.popover=c,this}}(window.jQuery),+function(a){"use strict";function b(c,d){var e,f=a.proxy(this.process,this);this.$element=a(c).is("body")?a(window):a(c),this.$body=a("body"),this.$scrollElement=this.$element.on("scroll.bs.scroll-spy.data-api",f),this.options=a.extend({},b.DEFAULTS,d),this.selector=(this.options.target||(e=a(c).attr("href"))&&e.replace(/.*(?=#[^\s]+$)/,"")||"")+" .nav li > a",this.offsets=a([]),this.targets=a([]),this.activeTarget=null,this.refresh(),this.process()}b.DEFAULTS={offset:10},b.prototype.refresh=function(){var b=this.$element[0]==window?"offset":"position";this.offsets=a([]),this.targets=a([]);var c=this;this.$body.find(this.selector).map(function(){var d=a(this),e=d.data("target")||d.attr("href"),f=/^#\w/.test(e)&&a(e);return f&&f.length&&[[f[b]().top+(!a.isWindow(c.$scrollElement.get(0))&&c.$scrollElement.scrollTop()),e]]||null}).sort(function(a,b){return a[0]-b[0]}).each(function(){c.offsets.push(this[0]),c.targets.push(this[1])})},b.prototype.process=function(){var a,b=this.$scrollElement.scrollTop()+this.options.offset,c=this.$scrollElement[0].scrollHeight||this.$body[0].scrollHeight,d=c-this.$scrollElement.height(),e=this.offsets,f=this.targets,g=this.activeTarget;if(b>=d)return g!=(a=f.last()[0])&&this.activate(a);for(a=e.length;a--;)g!=f[a]&&b>=e[a]&&(!e[a+1]||b<=e[a+1])&&this.activate(f[a])},b.prototype.activate=function(b){this.activeTarget=b,a(this.selector).parents(".active").removeClass("active");var c=this.selector+'[data-target="'+b+'"],'+this.selector+'[href="'+b+'"]',d=a(c).parents("li").addClass("active");d.parent(".dropdown-menu").length&&(d=d.closest("li.dropdown").addClass("active")),d.trigger("activate")};var c=a.fn.scrollspy;a.fn.scrollspy=function(c){return this.each(function(){var d=a(this),e=d.data("bs.scrollspy"),f="object"==typeof c&&c;e||d.data("bs.scrollspy",e=new b(this,f)),"string"==typeof c&&e[c]()})},a.fn.scrollspy.Constructor=b,a.fn.scrollspy.noConflict=function(){return a.fn.scrollspy=c,this},a(window).on("load",function(){a('[data-spy="scroll"]').each(function(){var b=a(this);b.scrollspy(b.data())})})}(window.jQuery),+function(a){"use strict";var b=function(b){this.element=a(b)};b.prototype.show=function(){var b=this.element,c=b.closest("ul:not(.dropdown-menu)"),d=b.attr("data-target");if(d||(d=b.attr("href"),d=d&&d.replace(/.*(?=#[^\s]*$)/,"")),!b.parent("li").hasClass("active")){var e=c.find(".active:last a")[0],f=a.Event("show.bs.tab",{relatedTarget:e});if(b.trigger(f),!f.isDefaultPrevented()){var g=a(d);this.activate(b.parent("li"),c),this.activate(g,g.parent(),function(){b.trigger({type:"shown.bs.tab",relatedTarget:e})})}}},b.prototype.activate=function(b,c,d){function e(){f.removeClass("active").find("> .dropdown-menu > .active").removeClass("active"),b.addClass("active"),g?(b[0].offsetWidth,b.addClass("in")):b.removeClass("fade"),b.parent(".dropdown-menu")&&b.closest("li.dropdown").addClass("active"),d&&d()}var f=c.find("> .active"),g=d&&a.support.transition&&f.hasClass("fade");g?f.one(a.support.transition.end,e).emulateTransitionEnd(150):e(),f.removeClass("in")};var c=a.fn.tab;a.fn.tab=function(c){return this.each(function(){var d=a(this),e=d.data("bs.tab");e||d.data("bs.tab",e=new b(this)),"string"==typeof c&&e[c]()})},a.fn.tab.Constructor=b,a.fn.tab.noConflict=function(){return a.fn.tab=c,this},a(document).on("click.bs.tab.data-api",'[data-toggle="tab"], [data-toggle="pill"]',function(b){b.preventDefault(),a(this).tab("show")})}(window.jQuery),+function(a){"use strict";var b=function(c,d){this.options=a.extend({},b.DEFAULTS,d),this.$window=a(window).on("scroll.bs.affix.data-api",a.proxy(this.checkPosition,this)).on("click.bs.affix.data-api",a.proxy(this.checkPositionWithEventLoop,this)),this.$element=a(c),this.affixed=this.unpin=null,this.checkPosition()};b.RESET="affix affix-top affix-bottom",b.DEFAULTS={offset:0},b.prototype.checkPositionWithEventLoop=function(){setTimeout(a.proxy(this.checkPosition,this),1)},b.prototype.checkPosition=function(){if(this.$element.is(":visible")){var c=a(document).height(),d=this.$window.scrollTop(),e=this.$element.offset(),f=this.options.offset,g=f.top,h=f.bottom;"object"!=typeof f&&(h=g=f),"function"==typeof g&&(g=f.top()),"function"==typeof h&&(h=f.bottom());var i=null!=this.unpin&&d+this.unpin<=e.top?!1:null!=h&&e.top+this.$element.height()>=c-h?"bottom":null!=g&&g>=d?"top":!1;this.affixed!==i&&(this.unpin&&this.$element.css("top",""),this.affixed=i,this.unpin="bottom"==i?e.top-d:null,this.$element.removeClass(b.RESET).addClass("affix"+(i?"-"+i:"")),"bottom"==i&&this.$element.offset({top:document.body.offsetHeight-h-this.$element.height()}))}};var c=a.fn.affix;a.fn.affix=function(c){return this.each(function(){var d=a(this),e=d.data("bs.affix"),f="object"==typeof c&&c;e||d.data("bs.affix",e=new b(this,f)),"string"==typeof c&&e[c]()})},a.fn.affix.Constructor=b,a.fn.affix.noConflict=function(){return a.fn.affix=c,this},a(window).on("load",function(){a('[data-spy="affix"]').each(function(){var b=a(this),c=b.data();c.offset=c.offset||{},c.offsetBottom&&(c.offset.bottom=c.offsetBottom),c.offsetTop&&(c.offset.top=c.offsetTop),b.affix(c)})})}(window.jQuery); \ No newline at end of file diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/.gc3pie/html/button.css b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/.gc3pie/html/button.css deleted file mode 100644 index 520064cfe9ea4087404295847c936165d766308d..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/.gc3pie/html/button.css +++ /dev/null @@ -1,54 +0,0 @@ -button { - font: 14px "Trebuchet MS"; - background-color: #222; - background-image: -moz-linear-gradient(top, rgba(255,255,255,.25), rgba(255,255,255,.11)); - background-image: -webkit-gradient(linear,left top,left bottom,color-stop(0, rgba(255,255,255,.25)),color-stop(1, rgba(255,255,255,.11))); - background-image: -webkit-linear-gradient(rgba(255,255,255,.25), rgba(255,255,255,.11)); - color: #fff; - text-rendering: optimizeLegibility; - text-shadow: 0 -1px 1px #222; - padding: 3px 5px 3px 5px; - border: 0; - border-radius: 0; - border-bottom: 1px solid #222; - margin.left: 5; - -moz-box-shadow: 0 1px 3px #999; - -webkit-box-shadow: 0 1px 3px #999; - box-shadow: 0 1px 3px #999; -} - -button.first { - border-top-left-radius: 5px; - border-bottom-left-radius: 5px; -} - -button.last { - border-top-right-radius: 5px; - border-bottom-right-radius: 5px; -} - -button.active { - background-color: rgb(65,102,133); -} - -button:hover { - background-color: grey; - cursor: pointer; -} - -input { - font: 14px "Trebuchet MS"; - background-image: -moz-linear-gradient(top, rgba(255,255,255,.25), rgba(255,255,255,.11)); - background-image: -webkit-gradient(linear,left top,left bottom,color-stop(0, rgba(255,255,255,.25)),color-stop(1, rgba(255,255,255,.11))); - background-image: -webkit-linear-gradient(rgba(255,255,255,.5), rgba(255,255,255,.1)); - color: #000; - text-rendering: optimizeLegibility; - padding: 3px 5px 3px 5px; - border: 0; - border-radius: 0; - margin: 0; - -moz-box-shadow: 0 1px 3px #999; - -webkit-box-shadow: 0 1px 3px #999; - box-shadow: 0 1px 3px #999; -} - diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/.gc3pie/html/d3.v2.min.js b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/.gc3pie/html/d3.v2.min.js deleted file mode 100644 index 0b4ea58fdb3898737cf1be2c06ce6d7532e87878..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/.gc3pie/html/d3.v2.min.js +++ /dev/null @@ -1,4 +0,0 @@ -(function(){function e(e,t){try{for(var n in t)Object.defineProperty(e.prototype,n,{value:t[n],enumerable:!1})}catch(r){e.prototype=t}}function t(e){var t=-1,n=e.length,r=[];while(++t<n)r.push(e[t]);return r}function n(e){return Array.prototype.slice.call(e)}function r(){}function i(e){return e}function s(){return this}function o(){return!0}function u(e){return typeof e=="function"?e:function(){return e}}function a(e,t,n){return function(){var r=n.apply(t,arguments);return arguments.length?e:r}}function f(e){return e!=null&&!isNaN(e)}function l(e){return e.length}function c(e){return e==null}function h(e){return e.trim().replace(/\s+/g," ")}function p(e){var t=1;while(e*t%1)t*=10;return t}function d(){}function v(e){function t(){var t=n,r=-1,i=t.length,s;while(++r<i)(s=t[r].on)&&s.apply(this,arguments);return e}var n=[],i=new r;return t.on=function(t,r){var s=i.get(t),o;return arguments.length<2?s&&s.on:(s&&(s.on=null,n=n.slice(0,o=n.indexOf(s)).concat(n.slice(o+1)),i.remove(t)),r&&n.push(i.set(t,{on:r})),e)},t}function m(e,t){return t-(e?1+Math.floor(Math.log(e+Math.pow(10,1+Math.floor(Math.log(e)/Math.LN10)-t))/Math.LN10):1)}function g(e){return e+""}function y(e){var t=e.lastIndexOf("."),n=t>=0?e.substring(t):(t=e.length,""),r=[];while(t>0)r.push(e.substring(t-=3,t+3));return r.reverse().join(",")+n}function b(e,t){var n=Math.pow(10,Math.abs(8-t)*3);return{scale:t>8?function(e){return e/n}:function(e){return e*n},symbol:e}}function w(e){return function(t){return t<=0?0:t>=1?1:e(t)}}function E(e){return function(t){return 1-e(1-t)}}function S(e){return function(t){return.5*(t<.5?e(2*t):2-e(2-2*t))}}function x(e){return e}function T(e){return function(t){return Math.pow(t,e)}}function N(e){return 1-Math.cos(e*Math.PI/2)}function C(e){return Math.pow(2,10*(e-1))}function k(e){return 1-Math.sqrt(1-e*e)}function L(e,t){var n;return arguments.length<2&&(t=.45),arguments.length<1?(e=1,n=t/4):n=t/(2*Math.PI)*Math.asin(1/e),function(r){return 1+e*Math.pow(2,10*-r)*Math.sin((r-n)*2*Math.PI/t)}}function A(e){return e||(e=1.70158),function(t){return t*t*((e+1)*t-e)}}function O(e){return e<1/2.75?7.5625*e*e:e<2/2.75?7.5625*(e-=1.5/2.75)*e+.75:e<2.5/2.75?7.5625*(e-=2.25/2.75)*e+.9375:7.5625*(e-=2.625/2.75)*e+.984375}function M(){d3.event.stopPropagation(),d3.event.preventDefault()}function _(){var e=d3.event,t;while(t=e.sourceEvent)e=t;return e}function D(e){var t=new d,n=0,r=arguments.length;while(++n<r)t[arguments[n]]=v(t);return t.of=function(n,r){return function(i){try{var s=i.sourceEvent=d3.event;i.target=e,d3.event=i,t[i.type].apply(n,r)}finally{d3.event=s}}},t}function P(e){var t=[e.a,e.b],n=[e.c,e.d],r=B(t),i=H(t,n),s=B(j(n,t,-i))||0;t[0]*n[1]<n[0]*t[1]&&(t[0]*=-1,t[1]*=-1,r*=-1,i*=-1),this.rotate=(r?Math.atan2(t[1],t[0]):Math.atan2(-n[0],n[1]))*ls,this.translate=[e.e,e.f],this.scale=[r,s],this.skew=s?Math.atan2(i,s)*ls:0}function H(e,t){return e[0]*t[0]+e[1]*t[1]}function B(e){var t=Math.sqrt(H(e,e));return t&&(e[0]/=t,e[1]/=t),t}function j(e,t,n){return e[0]+=n*t[0],e[1]+=n*t[1],e}function F(e){return e=="transform"?d3.interpolateTransform:d3.interpolate}function I(e,t){return t=t-(e=+e)?1/(t-e):0,function(n){return(n-e)*t}}function q(e,t){return t=t-(e=+e)?1/(t-e):0,function(n){return Math.max(0,Math.min(1,(n-e)*t))}}function R(){}function U(e,t,n){return new z(e,t,n)}function z(e,t,n){this.r=e,this.g=t,this.b=n}function W(e){return e<16?"0"+Math.max(0,e).toString(16):Math.min(255,e).toString(16)}function X(e,t,n){var r=0,i=0,s=0,o,u,a;o=/([a-z]+)\((.*)\)/i.exec(e);if(o){u=o[2].split(",");switch(o[1]){case"hsl":return n(parseFloat(u[0]),parseFloat(u[1])/100,parseFloat(u[2])/100);case"rgb":return t(K(u[0]),K(u[1]),K(u[2]))}}return(a=ds.get(e))?t(a.r,a.g,a.b):(e!=null&&e.charAt(0)==="#"&&(e.length===4?(r=e.charAt(1),r+=r,i=e.charAt(2),i+=i,s=e.charAt(3),s+=s):e.length===7&&(r=e.substring(1,3),i=e.substring(3,5),s=e.substring(5,7)),r=parseInt(r,16),i=parseInt(i,16),s=parseInt(s,16)),t(r,i,s))}function V(e,t,n){var r=Math.min(e/=255,t/=255,n/=255),i=Math.max(e,t,n),s=i-r,o,u,a=(i+r)/2;return s?(u=a<.5?s/(i+r):s/(2-i-r),e==i?o=(t-n)/s+(t<n?6:0):t==i?o=(n-e)/s+2:o=(e-t)/s+4,o*=60):u=o=0,Q(o,u,a)}function $(e,t,n){e=J(e),t=J(t),n=J(n);var r=ut((.4124564*e+.3575761*t+.1804375*n)/ys),i=ut((.2126729*e+.7151522*t+.072175*n)/bs),s=ut((.0193339*e+.119192*t+.9503041*n)/ws);return nt(116*i-16,500*(r-i),200*(i-s))}function J(e){return(e/=255)<=.04045?e/12.92:Math.pow((e+.055)/1.055,2.4)}function K(e){var t=parseFloat(e);return e.charAt(e.length-1)==="%"?Math.round(t*2.55):t}function Q(e,t,n){return new G(e,t,n)}function G(e,t,n){this.h=e,this.s=t,this.l=n}function Y(e,t,n){function r(e){return e>360?e-=360:e<0&&(e+=360),e<60?s+(o-s)*e/60:e<180?o:e<240?s+(o-s)*(240-e)/60:s}function i(e){return Math.round(r(e)*255)}var s,o;return e%=360,e<0&&(e+=360),t=t<0?0:t>1?1:t,n=n<0?0:n>1?1:n,o=n<=.5?n*(1+t):n+t-n*t,s=2*n-o,U(i(e+120),i(e),i(e-120))}function Z(e,t,n){return new et(e,t,n)}function et(e,t,n){this.h=e,this.c=t,this.l=n}function tt(e,t,n){return nt(n,Math.cos(e*=Math.PI/180)*t,Math.sin(e)*t)}function nt(e,t,n){return new rt(e,t,n)}function rt(e,t,n){this.l=e,this.a=t,this.b=n}function it(e,t,n){var r=(e+16)/116,i=r+t/500,s=r-n/200;return i=ot(i)*ys,r=ot(r)*bs,s=ot(s)*ws,U(at(3.2404542*i-1.5371385*r-.4985314*s),at(-0.969266*i+1.8760108*r+.041556*s),at(.0556434*i-.2040259*r+1.0572252*s))}function st(e,t,n){return Z(Math.atan2(n,t)/Math.PI*180,Math.sqrt(t*t+n*n),e)}function ot(e){return e>.206893034?e*e*e:(e-4/29)/7.787037}function ut(e){return e>.008856?Math.pow(e,1/3):7.787037*e+4/29}function at(e){return Math.round(255*(e<=.00304?12.92*e:1.055*Math.pow(e,1/2.4)-.055))}function ft(e){return Qi(e,ks),e}function lt(e){return function(){return Ss(e,this)}}function ct(e){return function(){return xs(e,this)}}function ht(e,t){function n(){this.removeAttribute(e)}function r(){this.removeAttributeNS(e.space,e.local)}function i(){this.setAttribute(e,t)}function s(){this.setAttributeNS(e.space,e.local,t)}function o(){var n=t.apply(this,arguments);n==null?this.removeAttribute(e):this.setAttribute(e,n)}function u(){var n=t.apply(this,arguments);n==null?this.removeAttributeNS(e.space,e.local):this.setAttributeNS(e.space,e.local,n)}return e=d3.ns.qualify(e),t==null?e.local?r:n:typeof t=="function"?e.local?u:o:e.local?s:i}function pt(e){return new RegExp("(?:^|\\s+)"+d3.requote(e)+"(?:\\s+|$)","g")}function dt(e,t){function n(){var n=-1;while(++n<i)e[n](this,t)}function r(){var n=-1,r=t.apply(this,arguments);while(++n<i)e[n](this,r)}e=e.trim().split(/\s+/).map(vt);var i=e.length;return typeof t=="function"?r:n}function vt(e){var t=pt(e);return function(n,r){if(i=n.classList)return r?i.add(e):i.remove(e);var i=n.className,s=i.baseVal!=null,o=s?i.baseVal:i;r?(t.lastIndex=0,t.test(o)||(o=h(o+" "+e),s?i.baseVal=o:n.className=o)):o&&(o=h(o.replace(t," ")),s?i.baseVal=o:n.className=o)}}function mt(e,t,n){function r(){this.style.removeProperty(e)}function i(){this.style.setProperty(e,t,n)}function s(){var r=t.apply(this,arguments);r==null?this.style.removeProperty(e):this.style.setProperty(e,r,n)}return t==null?r:typeof t=="function"?s:i}function gt(e,t){function n(){delete this[e]}function r(){this[e]=t}function i(){var n=t.apply(this,arguments);n==null?delete this[e]:this[e]=n}return t==null?n:typeof t=="function"?i:r}function yt(e){return{__data__:e}}function bt(e){return function(){return Cs(this,e)}}function wt(e){return arguments.length||(e=d3.ascending),function(t,n){return e(t&&t.__data__,n&&n.__data__)}}function Et(e,t,n){function r(){var t=this[s];t&&(this.removeEventListener(e,t,t.$),delete this[s])}function i(){function i(e){var n=d3.event;d3.event=e,u[0]=o.__data__;try{t.apply(o,u)}finally{d3.event=n}}var o=this,u=arguments;r.call(this),this.addEventListener(e,this[s]=i,i.$=n),i._=t}var s="__on"+e,o=e.indexOf(".");return o>0&&(e=e.substring(0,o)),t?i:r}function St(e,t){for(var n=0,r=e.length;n<r;n++)for(var i=e[n],s=0,o=i.length,u;s<o;s++)(u=i[s])&&t(u,s,n);return e}function xt(e){return Qi(e,As),e}function Tt(e,t,n){Qi(e,Os);var i=new r,s=d3.dispatch("start","end"),o=Fs;return e.id=t,e.time=n,e.tween=function(t,n){return arguments.length<2?i.get(t):(n==null?i.remove(t):i.set(t,n),e)},e.ease=function(t){return arguments.length?(o=typeof t=="function"?t:d3.ease.apply(d3,arguments),e):o},e.each=function(t,n){return arguments.length<2?Nt.call(e,t):(s.on(t,n),e)},d3.timer(function(r){return St(e,function(e,u,a){function f(r){return v.active>t?c():(v.active=t,i.forEach(function(t,n){(n=n.call(e,m,u))&&h.push(n)}),s.start.call(e,m,u),l(r)||d3.timer(l,0,n),1)}function l(n){if(v.active!==t)return c();var r=(n-p)/d,i=o(r),a=h.length;while(a>0)h[--a].call(e,i);if(r>=1)return c(),_s=t,s.end.call(e,m,u),_s=0,1}function c(){return--v.count||delete e.__transition__,1}var h=[],p=e.delay,d=e.duration,v=(e=e.node).__transition__||(e.__transition__={active:0,count:0}),m=e.__data__;++v.count,p<=r?f(r):d3.timer(f,p,n)})},0,n),e}function Nt(e){var t=_s,n=Fs,r=Bs,i=js;return _s=this.id,Fs=this.ease(),St(this,function(t,n,r){Bs=t.delay,js=t.duration,e.call(t=t.node,t.__data__,n,r)}),_s=t,Fs=n,Bs=r,js=i,this}function Ct(e,t,n){return n!=""&&Is}function kt(e,t){return d3.tween(e,F(t))}function Lt(){var e,t=Date.now(),n=Us;while(n)e=t-n.then,e>=n.delay&&(n.flush=n.callback(e)),n=n.next;var r=At()-t;r>24?(isFinite(r)&&(clearTimeout(Ws),Ws=setTimeout(Lt,r)),zs=0):(zs=1,Xs(Lt))}function At(){var e=null,t=Us,n=Infinity;while(t)t.flush?(delete Rs[t.callback.id],t=e?e.next=t.next:Us=t.next):(n=Math.min(n,t.then+t.delay),t=(e=t).next);return n}function Ot(e,t){var n=e.ownerSVGElement||e;if(n.createSVGPoint){var r=n.createSVGPoint();if(Vs<0&&(window.scrollX||window.scrollY)){n=d3.select(document.body).append("svg").style("position","absolute").style("top",0).style("left",0);var i=n[0][0].getScreenCTM();Vs=!i.f&&!i.e,n.remove()}return Vs?(r.x=t.pageX,r.y=t.pageY):(r.x=t.clientX,r.y=t.clientY),r=r.matrixTransform(e.getScreenCTM().inverse()),[r.x,r.y]}var s=e.getBoundingClientRect();return[t.clientX-s.left-e.clientLeft,t.clientY-s.top-e.clientTop]}function Mt(){}function _t(e){var t=e[0],n=e[e.length-1];return t<n?[t,n]:[n,t]}function Dt(e){return e.rangeExtent?e.rangeExtent():_t(e.range())}function Pt(e,t){var n=0,r=e.length-1,i=e[n],s=e[r],o;s<i&&(o=n,n=r,r=o,o=i,i=s,s=o);if(t=t(s-i))e[n]=t.floor(i),e[r]=t.ceil(s);return e}function Ht(){return Math}function Bt(e,t,n,r){function i(){var i=Math.min(e.length,t.length)>2?zt:Ut,a=r?q:I;return o=i(e,t,a,n),u=i(t,e,a,d3.interpolate),s}function s(e){return o(e)}var o,u;return s.invert=function(e){return u(e)},s.domain=function(t){return arguments.length?(e=t.map(Number),i()):e},s.range=function(e){return arguments.length?(t=e,i()):t},s.rangeRound=function(e){return s.range(e).interpolate(d3.interpolateRound)},s.clamp=function(e){return arguments.length?(r=e,i()):r},s.interpolate=function(e){return arguments.length?(n=e,i()):n},s.ticks=function(t){return qt(e,t)},s.tickFormat=function(t){return Rt(e,t)},s.nice=function(){return Pt(e,Ft),i()},s.copy=function(){return Bt(e,t,n,r)},i()}function jt(e,t){return d3.rebind(e,t,"range","rangeRound","interpolate","clamp")}function Ft(e){return e=Math.pow(10,Math.round(Math.log(e)/Math.LN10)-1),e&&{floor:function(t){return Math.floor(t/e)*e},ceil:function(t){return Math.ceil(t/e)*e}}}function It(e,t){var n=_t(e),r=n[1]-n[0],i=Math.pow(10,Math.floor(Math.log(r/t)/Math.LN10)),s=t/r*i;return s<=.15?i*=10:s<=.35?i*=5:s<=.75&&(i*=2),n[0]=Math.ceil(n[0]/i)*i,n[1]=Math.floor(n[1]/i)*i+i*.5,n[2]=i,n}function qt(e,t){return d3.range.apply(d3,It(e,t))}function Rt(e,t){return d3.format(",."+Math.max(0,-Math.floor(Math.log(It(e,t)[2])/Math.LN10+.01))+"f")}function Ut(e,t,n,r){var i=n(e[0],e[1]),s=r(t[0],t[1]);return function(e){return s(i(e))}}function zt(e,t,n,r){var i=[],s=[],o=0,u=Math.min(e.length,t.length)-1;e[u]<e[0]&&(e=e.slice().reverse(),t=t.slice().reverse());while(++o<=u)i.push(n(e[o-1],e[o])),s.push(r(t[o-1],t[o]));return function(t){var n=d3.bisect(e,t,1,u)-1;return s[n](i[n](t))}}function Wt(e,t){function n(n){return e(t(n))}var r=t.pow;return n.invert=function(t){return r(e.invert(t))},n.domain=function(i){return arguments.length?(t=i[0]<0?Vt:Xt,r=t.pow,e.domain(i.map(t)),n):e.domain().map(r)},n.nice=function(){return e.domain(Pt(e.domain(),Ht)),n},n.ticks=function(){var n=_t(e.domain()),i=[];if(n.every(isFinite)){var s=Math.floor(n[0]),o=Math.ceil(n[1]),u=r(n[0]),a=r(n[1]);if(t===Vt){i.push(r(s));for(;s++<o;)for(var f=9;f>0;f--)i.push(r(s)*f)}else{for(;s<o;s++)for(var f=1;f<10;f++)i.push(r(s)*f);i.push(r(s))}for(s=0;i[s]<u;s++);for(o=i.length;i[o-1]>a;o--);i=i.slice(s,o)}return i},n.tickFormat=function(e,i){arguments.length<2&&(i=$s);if(arguments.length<1)return i;var s=Math.max(.1,e/n.ticks().length),o=t===Vt?(u=-1e-12,Math.floor):(u=1e-12,Math.ceil),u;return function(e){return e/r(o(t(e)+u))<=s?i(e):""}},n.copy=function(){return Wt(e.copy(),t)},jt(n,e)}function Xt(e){return Math.log(e<0?0:e)/Math.LN10}function Vt(e){return-Math.log(e>0?0:-e)/Math.LN10}function $t(e,t){function n(t){return e(r(t))}var r=Jt(t),i=Jt(1/t);return n.invert=function(t){return i(e.invert(t))},n.domain=function(t){return arguments.length?(e.domain(t.map(r)),n):e.domain().map(i)},n.ticks=function(e){return qt(n.domain(),e)},n.tickFormat=function(e){return Rt(n.domain(),e)},n.nice=function(){return n.domain(Pt(n.domain(),Ft))},n.exponent=function(e){if(!arguments.length)return t;var s=n.domain();return r=Jt(t=e),i=Jt(1/t),n.domain(s)},n.copy=function(){return $t(e.copy(),t)},jt(n,e)}function Jt(e){return function(t){return t<0?-Math.pow(-t,e):Math.pow(t,e)}}function Kt(e,t){function n(t){return o[((s.get(t)||s.set(t,e.push(t)))-1)%o.length]}function i(t,n){return d3.range(e.length).map(function(e){return t+n*e})}var s,o,u;return n.domain=function(i){if(!arguments.length)return e;e=[],s=new r;var o=-1,u=i.length,a;while(++o<u)s.has(a=i[o])||s.set(a,e.push(a));return n[t.t].apply(n,t.a)},n.range=function(e){return arguments.length?(o=e,u=0,t={t:"range",a:arguments},n):o},n.rangePoints=function(r,s){arguments.length<2&&(s=0);var a=r[0],f=r[1],l=(f-a)/(Math.max(1,e.length-1)+s);return o=i(e.length<2?(a+f)/2:a+l*s/2,l),u=0,t={t:"rangePoints",a:arguments},n},n.rangeBands=function(r,s,a){arguments.length<2&&(s=0),arguments.length<3&&(a=s);var f=r[1]<r[0],l=r[f-0],c=r[1-f],h=(c-l)/(e.length-s+2*a);return o=i(l+h*a,h),f&&o.reverse(),u=h*(1-s),t={t:"rangeBands",a:arguments},n},n.rangeRoundBands=function(r,s,a){arguments.length<2&&(s=0),arguments.length<3&&(a=s);var f=r[1]<r[0],l=r[f-0],c=r[1-f],h=Math.floor((c-l)/(e.length-s+2*a)),p=c-l-(e.length-s)*h;return o=i(l+Math.round(p/2),h),f&&o.reverse(),u=Math.round(h*(1-s)),t={t:"rangeRoundBands",a:arguments},n},n.rangeBand=function(){return u},n.rangeExtent=function(){return _t(t.a[0])},n.copy=function(){return Kt(e,t)},n.domain(e)}function Qt(e,t){function n(){var n=0,s=e.length,o=t.length;i=[];while(++n<o)i[n-1]=d3.quantile(e,n/o);return r}function r(e){return isNaN(e=+e)?NaN:t[d3.bisect(i,e)]}var i;return r.domain=function(t){return arguments.length?(e=t.filter(function(e){return!isNaN(e)}).sort(d3.ascending),n()):e},r.range=function(e){return arguments.length?(t=e,n()):t},r.quantiles=function(){return i},r.copy=function(){return Qt(e,t)},n()}function Gt(e,t,n){function r(t){return n[Math.max(0,Math.min(o,Math.floor(s*(t-e))))]}function i(){return s=n.length/(t-e),o=n.length-1,r}var s,o;return r.domain=function(n){return arguments.length?(e=+n[0],t=+n[n.length-1],i()):[e,t]},r.range=function(e){return arguments.length?(n=e,i()):n},r.copy=function(){return Gt(e,t,n)},i()}function Yt(e,t){function n(n){return t[d3.bisect(e,n)]}return n.domain=function(t){return arguments.length?(e=t,n):e},n.range=function(e){return arguments.length?(t=e,n):t},n.copy=function(){return Yt(e,t)},n}function Zt(e){function t(e){return+e}return t.invert=t,t.domain=t.range=function(n){return arguments.length?(e=n.map(t),t):e},t.ticks=function(t){return qt(e,t)},t.tickFormat=function(t){return Rt(e,t)},t.copy=function(){return Zt(e)},t}function en(e){return e.innerRadius}function tn(e){return e.outerRadius}function nn(e){return e.startAngle}function rn(e){return e.endAngle}function sn(e){function t(t){function o(){a.push("M",s(e(l),f))}var a=[],l=[],c=-1,h=t.length,p,d=u(n),v=u(r);while(++c<h)i.call(this,p=t[c],c)?l.push([+d.call(this,p,c),+v.call(this,p,c)]):l.length&&(o(),l=[]);return l.length&&o(),a.length?a.join(""):null}var n=on,r=un,i=o,s=an,a=s.key,f=.7;return t.x=function(e){return arguments.length?(n=e,t):n},t.y=function(e){return arguments.length?(r=e,t):r},t.defined=function(e){return arguments.length?(i=e,t):i},t.interpolate=function(e){return arguments.length?(typeof e=="function"?a=s=e:a=(s=eo.get(e)||an).key,t):a},t.tension=function(e){return arguments.length?(f=e,t):f},t}function on(e){return e[0]}function un(e){return e[1]}function an(e){return e.join("L")}function fn(e){return an(e)+"Z"}function ln(e){var t=0,n=e.length,r=e[0],i=[r[0],",",r[1]];while(++t<n)i.push("V",(r=e[t])[1],"H",r[0]);return i.join("")}function cn(e){var t=0,n=e.length,r=e[0],i=[r[0],",",r[1]];while(++t<n)i.push("H",(r=e[t])[0],"V",r[1]);return i.join("")}function hn(e,t){return e.length<4?an(e):e[1]+vn(e.slice(1,e.length-1),mn(e,t))}function pn(e,t){return e.length<3?an(e):e[0]+vn((e.push(e[0]),e),mn([e[e.length-2]].concat(e,[e[1]]),t))}function dn(e,t,n){return e.length<3?an(e):e[0]+vn(e,mn(e,t))}function vn(e,t){if(t.length<1||e.length!=t.length&&e.length!=t.length+2)return an(e);var n=e.length!=t.length,r="",i=e[0],s=e[1],o=t[0],u=o,a=1;n&&(r+="Q"+(s[0]-o[0]*2/3)+","+(s[1]-o[1]*2/3)+","+s[0]+","+s[1],i=e[1],a=2);if(t.length>1){u=t[1],s=e[a],a++,r+="C"+(i[0]+o[0])+","+(i[1]+o[1])+","+(s[0]-u[0])+","+(s[1]-u[1])+","+s[0]+","+s[1];for(var f=2;f<t.length;f++,a++)s=e[a],u=t[f],r+="S"+(s[0]-u[0])+","+(s[1]-u[1])+","+s[0]+","+s[1]}if(n){var l=e[a];r+="Q"+(s[0]+u[0]*2/3)+","+(s[1]+u[1]*2/3)+","+l[0]+","+l[1]}return r}function mn(e,t){var n=[],r=(1-t)/2,i,s=e[0],o=e[1],u=1,a=e.length;while(++u<a)i=s,s=o,o=e[u],n.push([r*(o[0]-i[0]),r*(o[1]-i[1])]);return n}function gn(e){if(e.length<3)return an(e);var t=1,n=e.length,r=e[0],i=r[0],s=r[1],o=[i,i,i,(r=e[1])[0]],u=[s,s,s,r[1]],a=[i,",",s];Sn(a,o,u);while(++t<n)r=e[t],o.shift(),o.push(r[0]),u.shift(),u.push(r[1]),Sn(a,o,u);t=-1;while(++t<2)o.shift(),o.push(r[0]),u.shift(),u.push(r[1]),Sn(a,o,u);return a.join("")}function yn(e){if(e.length<4)return an(e);var t=[],n=-1,r=e.length,i,s=[0],o=[0];while(++n<3)i=e[n],s.push(i[0]),o.push(i[1]);t.push(En(ro,s)+","+En(ro,o)),--n;while(++n<r)i=e[n],s.shift(),s.push(i[0]),o.shift(),o.push(i[1]),Sn(t,s,o);return t.join("")}function bn(e){var t,n=-1,r=e.length,i=r+4,s,o=[],u=[];while(++n<4)s=e[n%r],o.push(s[0]),u.push(s[1]);t=[En(ro,o),",",En(ro,u)],--n;while(++n<i)s=e[n%r],o.shift(),o.push(s[0]),u.shift(),u.push(s[1]),Sn(t,o,u);return t.join("")}function wn(e,t){var n=e.length-1;if(n){var r=e[0][0],i=e[0][1],s=e[n][0]-r,o=e[n][1]-i,u=-1,a,f;while(++u<=n)a=e[u],f=u/n,a[0]=t*a[0]+(1-t)*(r+f*s),a[1]=t*a[1]+(1-t)*(i+f*o)}return gn(e)}function En(e,t){return e[0]*t[0]+e[1]*t[1]+e[2]*t[2]+e[3]*t[3]}function Sn(e,t,n){e.push("C",En(to,t),",",En(to,n),",",En(no,t),",",En(no,n),",",En(ro,t),",",En(ro,n))}function xn(e,t){return(t[1]-e[1])/(t[0]-e[0])}function Tn(e){var t=0,n=e.length-1,r=[],i=e[0],s=e[1],o=r[0]=xn(i,s);while(++t<n)r[t]=(o+(o=xn(i=s,s=e[t+1])))/2;return r[t]=o,r}function Nn(e){var t=[],n,r,i,s,o=Tn(e),u=-1,a=e.length-1;while(++u<a)n=xn(e[u],e[u+1]),Math.abs(n)<1e-6?o[u]=o[u+1]=0:(r=o[u]/n,i=o[u+1]/n,s=r*r+i*i,s>9&&(s=n*3/Math.sqrt(s),o[u]=s*r,o[u+1]=s*i));u=-1;while(++u<=a)s=(e[Math.min(a,u+1)][0]-e[Math.max(0,u-1)][0])/(6*(1+o[u]*o[u])),t.push([s||0,o[u]*s||0]);return t}function Cn(e){return e.length<3?an(e):e[0]+vn(e,Nn(e))}function kn(e){var t,n=-1,r=e.length,i,s;while(++n<r)t=e[n],i=t[0],s=t[1]+Ys,t[0]=i*Math.cos(s),t[1]=i*Math.sin(s);return e}function Ln(e){function t(t){function o(){l.push("M",f(e(v),p),h,c(e(d.reverse()),p),"Z")}var l=[],d=[],v=[],m=-1,g=t.length,y,b=u(n),w=u(i),E=n===r?function(){return x}:u(r),S=i===s?function(){return T}:u(s),x,T;while(++m<g)a.call(this,y=t[m],m)?(d.push([x=+b.call(this,y,m),T=+w.call(this,y,m)]),v.push([+E.call(this,y,m),+S.call(this,y,m)])):d.length&&(o(),d=[],v=[]);return d.length&&o(),l.length?l.join(""):null}var n=on,r=on,i=0,s=un,a=o,f=an,l=f.key,c=f,h="L",p=.7;return t.x=function(e){return arguments.length?(n=r=e,t):r},t.x0=function(e){return arguments.length?(n=e,t):n},t.x1=function(e){return arguments.length?(r=e,t):r},t.y=function(e){return arguments.length?(i=s=e,t):s},t.y0=function(e){return arguments.length?(i=e,t):i},t.y1=function(e){return arguments.length?(s=e,t):s},t.defined=function(e){return arguments.length?(a=e,t):a},t.interpolate=function(e){return arguments.length?(typeof e=="function"?l=f=e:l=(f=eo.get(e)||an).key,c=f.reverse||f,h=f.closed?"M":"L",t):l},t.tension=function(e){return arguments.length?(p=e,t):p},t}function An(e){return e.source}function On(e){return e.target}function Mn(e){return e.radius}function _n(e){return e.startAngle}function Dn(e){return e.endAngle}function Pn(e){return[e.x,e.y]}function Hn(e){return function(){var t=e.apply(this,arguments),n=t[0],r=t[1]+Ys;return[n*Math.cos(r),n*Math.sin(r)]}}function Bn(){return 64}function jn(){return"circle"}function Fn(e){var t=Math.sqrt(e/Math.PI);return"M0,"+t+"A"+t+","+t+" 0 1,1 0,"+ -t+"A"+t+","+t+" 0 1,1 0,"+t+"Z"}function In(e,t){e.attr("transform",function(e){return"translate("+t(e)+",0)"})}function qn(e,t){e.attr("transform",function(e){return"translate(0,"+t(e)+")"})}function Rn(e,t,n){i=[];if(n&&t.length>1){var r=_t(e.domain()),i,s=-1,o=t.length,u=(t[1]-t[0])/++n,a,f;while(++s<o)for(a=n;--a>0;)(f=+t[s]-a*u)>=r[0]&&i.push(f);for(--s,a=0;++a<n&&(f=+t[s]+a*u)<r[1];)i.push(f)}return i}function Un(){fo||(fo=d3.select("body").append("div").style("visibility","hidden").style("top",0).style("height",0).style("width",0).style("overflow-y","scroll").append("div").style("height","2000px").node().parentNode);var e=d3.event,t;try{fo.scrollTop=1e3,fo.dispatchEvent(e),t=1e3-fo.scrollTop}catch(n){t=e.wheelDelta||-e.detail*5}return t}function zn(e){var t=e.source,n=e.target,r=Xn(t,n),i=[t];while(t!==r)t=t.parent,i.push(t);var s=i.length;while(n!==r)i.splice(s,0,n),n=n.parent;return i}function Wn(e){var t=[],n=e.parent;while(n!=null)t.push(e),e=n,n=n.parent;return t.push(e),t}function Xn(e,t){if(e===t)return e;var n=Wn(e),r=Wn(t),i=n.pop(),s=r.pop(),o=null;while(i===s)o=i,i=n.pop(),s=r.pop();return o}function Vn(e){e.fixed|=2}function $n(e){e.fixed&=1}function Jn(e){e.fixed|=4}function Kn(e){e.fixed&=3}function Qn(e,t,n){var r=0,i=0;e.charge=0;if(!e.leaf){var s=e.nodes,o=s.length,u=-1,a;while(++u<o){a=s[u];if(a==null)continue;Qn(a,t,n),e.charge+=a.charge,r+=a.charge*a.cx,i+=a.charge*a.cy}}if(e.point){e.leaf||(e.point.x+=Math.random()-.5,e.point.y+=Math.random()-.5);var f=t*n[e.point.index];e.charge+=e.pointCharge=f,r+=f*e.point.x,i+=f*e.point.y}e.cx=r/e.charge,e.cy=i/e.charge}function Gn(e){return 20}function Yn(e){return 1}function Zn(e){return e.x}function er(e){return e.y}function tr(e,t,n){e.y0=t,e.y=n}function nr(e){return d3.range(e.length)}function rr(e){var t=-1,n=e[0].length,r=[];while(++t<n)r[t]=0;return r}function ir(e){var t=1,n=0,r=e[0][1],i,s=e.length;for(;t<s;++t)(i=e[t][1])>r&&(n=t,r=i);return n}function sr(e){return e.reduce(or,0)}function or(e,t){return e+t[1]}function ur(e,t){return ar(e,Math.ceil(Math.log(t.length)/Math.LN2+1))}function ar(e,t){var n=-1,r=+e[0],i=(e[1]-r)/t,s=[];while(++n<=t)s[n]=i*n+r;return s}function fr(e){return[d3.min(e),d3.max(e)]}function lr(e,t){return d3.rebind(e,t,"sort","children","value"),e.links=dr,e.nodes=function(t){return vo=!0,(e.nodes=e)(t)},e}function cr(e){return e.children}function hr(e){return e.value}function pr(e,t){return t.value-e.value}function dr(e){return d3.merge(e.map(function(e){return(e.children||[]).map(function(t){return{source:e,target:t}})}))}function vr(e,t){return e.value-t.value}function mr(e,t){var n=e._pack_next;e._pack_next=t,t._pack_prev=e,t._pack_next=n,n._pack_prev=t}function gr(e,t){e._pack_next=t,t._pack_prev=e}function yr(e,t){var n=t.x-e.x,r=t.y-e.y,i=e.r+t.r;return i*i-n*n-r*r>.001}function br(e){function t(e){r=Math.min(e.x-e.r,r),i=Math.max(e.x+e.r,i),s=Math.min(e.y-e.r,s),o=Math.max(e.y+e.r,o)}if(!(n=e.children)||!(p=n.length))return;var n,r=Infinity,i=-Infinity,s=Infinity,o=-Infinity,u,a,f,l,c,h,p;n.forEach(wr),u=n[0],u.x=-u.r,u.y=0,t(u);if(p>1){a=n[1],a.x=a.r,a.y=0,t(a);if(p>2){f=n[2],xr(u,a,f),t(f),mr(u,f),u._pack_prev=f,mr(f,a),a=u._pack_next;for(l=3;l<p;l++){xr(u,a,f=n[l]);var d=0,v=1,m=1;for(c=a._pack_next;c!==a;c=c._pack_next,v++)if(yr(c,f)){d=1;break}if(d==1)for(h=u._pack_prev;h!==c._pack_prev;h=h._pack_prev,m++)if(yr(h,f))break;d?(v<m||v==m&&a.r<u.r?gr(u,a=c):gr(u=h,a),l--):(mr(u,f),a=f,t(f))}}}var g=(r+i)/2,y=(s+o)/2,b=0;for(l=0;l<p;l++)f=n[l],f.x-=g,f.y-=y,b=Math.max(b,f.r+Math.sqrt(f.x*f.x+f.y*f.y));e.r=b,n.forEach(Er)}function wr(e){e._pack_next=e._pack_prev=e}function Er(e){delete e._pack_next,delete e._pack_prev}function Sr(e,t,n,r){var i=e.children;e.x=t+=r*e.x,e.y=n+=r*e.y,e.r*=r;if(i){var s=-1,o=i.length;while(++s<o)Sr(i[s],t,n,r)}}function xr(e,t,n){var r=e.r+n.r,i=t.x-e.x,s=t.y-e.y;if(r&&(i||s)){var o=t.r+n.r,u=i*i+s*s;o*=o,r*=r;var a=.5+(r-o)/(2*u),f=Math.sqrt(Math.max(0,2*o*(r+u)-(r-=u)*r-o*o))/(2*u);n.x=e.x+a*i+f*s,n.y=e.y+a*s-f*i}else n.x=e.x+r,n.y=e.y}function Tr(e){return 1+d3.max(e,function(e){return e.y})}function Nr(e){return e.reduce(function(e,t){return e+t.x},0)/e.length}function Cr(e){var t=e.children;return t&&t.length?Cr(t[0]):e}function kr(e){var t=e.children,n;return t&&(n=t.length)?kr(t[n-1]):e}function Lr(e,t){return e.parent==t.parent?1:2}function Ar(e){var t=e.children;return t&&t.length?t[0]:e._tree.thread}function Or(e){var t=e.children,n;return t&&(n=t.length)?t[n-1]:e._tree.thread}function Mr(e,t){var n=e.children;if(n&&(i=n.length)){var r,i,s=-1;while(++s<i)t(r=Mr(n[s],t),e)>0&&(e=r)}return e}function _r(e,t){return e.x-t.x}function Dr(e,t){return t.x-e.x}function Pr(e,t){return e.depth-t.depth}function Hr(e,t){function n(e,r){var i=e.children;if(i&&(a=i.length)){var s,o=null,u=-1,a;while(++u<a)s=i[u],n(s,o),o=s}t(e,r)}n(e,null)}function Br(e){var t=0,n=0,r=e.children,i=r.length,s;while(--i>=0)s=r[i]._tree,s.prelim+=t,s.mod+=t,t+=s.shift+(n+=s.change)}function jr(e,t,n){e=e._tree,t=t._tree;var r=n/(t.number-e.number);e.change+=r,t.change-=r,t.shift+=n,t.prelim+=n,t.mod+=n}function Fr(e,t,n){return e._tree.ancestor.parent==t.parent?e._tree.ancestor:n}function Ir(e){return{x:e.x,y:e.y,dx:e.dx,dy:e.dy}}function qr(e,t){var n=e.x+t[3],r=e.y+t[0],i=e.dx-t[1]-t[3],s=e.dy-t[0]-t[2];return i<0&&(n+=i/2,i=0),s<0&&(r+=s/2,s=0),{x:n,y:r,dx:i,dy:s}}function Rr(e,t){function n(e,r){d3.text(e,t,function(e){r(e&&n.parse(e))})}function r(t){return t.map(i).join(e)}function i(e){return o.test(e)?'"'+e.replace(/\"/g,'""')+'"':e}var s=new RegExp("\r\n|["+e+"\r\n]","g"),o=new RegExp('["'+e+"\n]"),u=e.charCodeAt(0);return n.parse=function(e){var t;return n.parseRows(e,function(e,n){if(n){var r={},i=-1,s=t.length;while(++i<s)r[t[i]]=e[i];return r}return t=e,null})},n.parseRows=function(e,t){function n(){if(s.lastIndex>=e.length)return i;if(l)return l=!1,r;var t=s.lastIndex;if(e.charCodeAt(t)===34){var n=t;while(n++<e.length)if(e.charCodeAt(n)===34){if(e.charCodeAt(n+1)!==34)break;n++}s.lastIndex=n+2;var o=e.charCodeAt(n+1);return o===13?(l=!0,e.charCodeAt(n+2)===10&&s.lastIndex++):o===10&&(l=!0),e.substring(t+1,n).replace(/""/g,'"')}var a=s.exec(e);return a?(l=a[0].charCodeAt(0)!==u,e.substring(t,a.index)):(s.lastIndex=e.length,e.substring(t))}var r={},i={},o=[],a=0,f,l;s.lastIndex=0;while((f=n())!==i){var c=[];while(f!==r&&f!==i)c.push(f),f=n();if(t&&!(c=t(c,a++)))continue;o.push(c)}return o},n.format=function(e){return e.map(r).join("\n")},n}function Ur(e,t){return function(n){return n&&e.hasOwnProperty(n.type)?e[n.type](n):t}}function zr(e){return"m0,"+e+"a"+e+","+e+" 0 1,1 0,"+ -2*e+"a"+e+","+e+" 0 1,1 0,"+2*e+"z"}function Wr(e,t){go.hasOwnProperty(e.type)&&go[e.type](e,t)}function Xr(e,t){Wr(e.geometry,t)}function Vr(e,t){for(var n=e.features,r=0,i=n.length;r<i;r++)Wr(n[r].geometry,t)}function $r(e,t){for(var n=e.geometries,r=0,i=n.length;r<i;r++)Wr(n[r],t)}function Jr(e,t){for(var n=e.coordinates,r=0,i=n.length;r<i;r++)t.apply(null,n[r])}function Kr(e,t){for(var n=e.coordinates,r=0,i=n.length;r<i;r++)for(var s=n[r],o=0,u=s.length;o<u;o++)t.apply(null,s[o])}function Qr(e,t){for(var n=e.coordinates,r=0,i=n.length;r<i;r++)for(var s=n[r][0],o=0,u=s.length;o<u;o++)t.apply(null,s[o])}function Gr(e,t){t.apply(null,e.coordinates)}function Yr(e,t){for(var n=e.coordinates[0],r=0,i=n.length;r<i;r++)t.apply(null,n[r])}function Zr(e){return e.source}function ei(e){return e.target}function ti(){function e(e){var t=Math.sin(e*=p)*d,n=Math.sin(p-e)*d,r=n*s+t*c,u=n*o+t*h,a=n*i+t*l;return[Math.atan2(u,r)/mo,Math.atan2(a,Math.sqrt(r*r+u*u))/mo]}var t,n,r,i,s,o,u,a,f,l,c,h,p,d;return e.distance=function(){return p==null&&(d=1/Math.sin(p=Math.acos(Math.max(-1,Math.min(1,i*l+r*f*Math.cos(u-t)))))),p},e.source=function(u){var a=Math.cos(t=u[0]*mo),f=Math.sin(t);return r=Math.cos(n=u[1]*mo),i=Math.sin(n),s=r*a,o=r*f,p=null,e},e.target=function(t){var n=Math.cos(u=t[0]*mo),r=Math.sin(u);return f=Math.cos(a=t[1]*mo),l=Math.sin(a),c=f*n,h=f*r,p=null,e},e}function ni(e,t){var n=ti().source(e).target(t);return n.distance(),n}function ri(e){var t=0,n=0;for(;;){if(e(t,n))return[t,n];t===0?(t=n+1,n=0):(t-=1,n+=1)}}function ii(e,t,n,r){var i,s,o,u,a,f,l;return i=r[e],s=i[0],o=i[1],i=r[t],u=i[0],a=i[1],i=r[n],f=i[0],l=i[1],(l-o)*(u-s)-(a-o)*(f-s)>0}function si(e,t,n){return(n[0]-t[0])*(e[1]-t[1])<(n[1]-t[1])*(e[0]-t[0])}function oi(e,t,n,r){var i=e[0],s=t[0],o=n[0],u=r[0],a=e[1],f=t[1],l=n[1],c=r[1],h=i-o,p=s-i,d=u-o,v=a-l,m=f-a,g=c-l,y=(d*v-g*h)/(g*p-d*m);return[i+y*p,a+y*m]}function ui(e,t){var n={list:e.map(function(e,t){return{index:t,x:e[0],y:e[1]}}).sort(function(e,t){return e.y<t.y?-1:e.y>t.y?1:e.x<t.x?-1:e.x>t.x?1:0}),bottomSite:null},r={list:[],leftEnd:null,rightEnd:null,init:function(){r.leftEnd=r.createHalfEdge(null,"l"),r.rightEnd=r.createHalfEdge(null,"l"),r.leftEnd.r=r.rightEnd,r.rightEnd.l=r.leftEnd,r.list.unshift(r.leftEnd,r.rightEnd)},createHalfEdge:function(e,t){return{edge:e,side:t,vertex:null,l:null,r:null}},insert:function(e,t){t.l=e,t.r=e.r,e.r.l=t,e.r=t},leftBound:function(e){var t=r.leftEnd;do t=t.r;while(t!=r.rightEnd&&i.rightOf(t,e));return t=t.l,t},del:function(e){e.l.r=e.r,e.r.l=e.l,e.edge=null},right:function(e){return e.r},left:function(e){return e.l},leftRegion:function(e){return e.edge==null?n.bottomSite:e.edge.region[e.side]},rightRegion:function(e){return e.edge==null?n.bottomSite:e.edge.region[wo[e.side]]}},i={bisect:function(e,t){var n={region:{l:e,r:t},ep:{l:null,r:null}},r=t.x-e.x,i=t.y-e.y,s=r>0?r:-r,o=i>0?i:-i;return n.c=e.x*r+e.y*i+(r*r+i*i)*.5,s>o?(n.a=1,n.b=i/r,n.c/=r):(n.b=1,n.a=r/i,n.c/=i),n},intersect:function(e,t){var n=e.edge,r=t.edge;if(!n||!r||n.region.r==r.region.r)return null;var i=n.a*r.b-n.b*r.a;if(Math.abs(i)<1e-10)return null;var s=(n.c*r.b-r.c*n.b)/i,o=(r.c*n.a-n.c*r.a)/i,u=n.region.r,a=r.region.r,f,l;u.y<a.y||u.y==a.y&&u.x<a.x?(f=e,l=n):(f=t,l=r);var c=s>=l.region.r.x;return c&&f.side==="l"||!c&&f.side==="r"?null:{x:s,y:o}},rightOf:function(e,t){var n=e.edge,r=n.region.r,i=t.x>r.x;if(i&&e.side==="l")return 1;if(!i&&e.side==="r")return 0;if(n.a===1){var s=t.y-r.y,o=t.x-r.x,u=0,a=0;!i&&n.b<0||i&&n.b>=0?a=u=s>=n.b*o:(a=t.x+t.y*n.b>n.c,n.b<0&&(a=!a),a||(u=1));if(!u){var f=r.x-n.region.l.x;a=n.b*(o*o-s*s)<f*s*(1+2*o/f+n.b*n.b),n.b<0&&(a=!a)}}else{var l=n.c-n.a*t.x,c=t.y-l,h=t.x-r.x,p=l-r.y;a=c*c>h*h+p*p}return e.side==="l"?a:!a},endPoint:function(e,n,r){e.ep[n]=r;if(!e.ep[wo[n]])return;t(e)},distance:function(e,t){var n=e.x-t.x,r=e.y-t.y;return Math.sqrt(n*n+r*r)}},s={list:[],insert:function(e,t,n){e.vertex=t,e.ystar=t.y+n;for(var r=0,i=s.list,o=i.length;r<o;r++){var u=i[r];if(e.ystar>u.ystar||e.ystar==u.ystar&&t.x>u.vertex.x)continue;break}i.splice(r,0,e)},del:function(e){for(var t=0,n=s.list,r=n.length;t<r&&n[t]!=e;++t);n.splice(t,1)},empty:function(){return s.list.length===0},nextEvent:function(e){for(var t=0,n=s.list,r=n.length;t<r;++t)if(n[t]==e)return n[t+1];return null},min:function(){var e=s.list[0];return{x:e.vertex.x,y:e.ystar}},extractMin:function(){return s.list.shift()}};r.init(),n.bottomSite=n.list.shift();var o=n.list.shift(),u,a,f,l,c,h,p,d,v,m,g,y,b;for(;;){s.empty()||(u=s.min());if(o&&(s.empty()||o.y<u.y||o.y==u.y&&o.x<u.x))a=r.leftBound(o),f=r.right(a),p=r.rightRegion(a),y=i.bisect(p,o),h=r.createHalfEdge(y,"l"),r.insert(a,h),m=i.intersect(a,h),m&&(s.del(a),s.insert(a,m,i. -distance(m,o))),a=h,h=r.createHalfEdge(y,"r"),r.insert(a,h),m=i.intersect(h,f),m&&s.insert(h,m,i.distance(m,o)),o=n.list.shift();else{if(!!s.empty())break;a=s.extractMin(),l=r.left(a),f=r.right(a),c=r.right(f),p=r.leftRegion(a),d=r.rightRegion(f),g=a.vertex,i.endPoint(a.edge,a.side,g),i.endPoint(f.edge,f.side,g),r.del(a),s.del(f),r.del(f),b="l",p.y>d.y&&(v=p,p=d,d=v,b="r"),y=i.bisect(p,d),h=r.createHalfEdge(y,b),r.insert(l,h),i.endPoint(y,wo[b],g),m=i.intersect(l,h),m&&(s.del(l),s.insert(l,m,i.distance(m,p))),m=i.intersect(h,c),m&&s.insert(h,m,i.distance(m,p))}}for(a=r.right(r.leftEnd);a!=r.rightEnd;a=r.right(a))t(a.edge)}function ai(){return{leaf:!0,nodes:[],point:null}}function fi(e,t,n,r,i,s){if(!e(t,n,r,i,s)){var o=(n+i)*.5,u=(r+s)*.5,a=t.nodes;a[0]&&fi(e,a[0],n,r,o,u),a[1]&&fi(e,a[1],o,r,i,u),a[2]&&fi(e,a[2],n,u,o,s),a[3]&&fi(e,a[3],o,u,i,s)}}function li(e){return{x:e[0],y:e[1]}}function ci(){this._=new Date(arguments.length>1?Date.UTC.apply(this,arguments):arguments[0])}function hi(e){return e.substring(0,3)}function pi(e,t,n,r){var i,s,o=0,u=t.length,a=n.length;while(o<u){if(r>=a)return-1;i=t.charCodeAt(o++);if(i==37){s=Uo[t.charAt(o++)];if(!s||(r=s(e,n,r))<0)return-1}else if(i!=n.charCodeAt(r++))return-1}return r}function di(e){return new RegExp("^(?:"+e.map(d3.requote).join("|")+")","i")}function vi(e){var t=new r,n=-1,i=e.length;while(++n<i)t.set(e[n].toLowerCase(),n);return t}function mi(e,t,n){Bo.lastIndex=0;var r=Bo.exec(t.substring(n));return r?n+=r[0].length:-1}function gi(e,t,n){Ho.lastIndex=0;var r=Ho.exec(t.substring(n));return r?n+=r[0].length:-1}function yi(e,t,n){Io.lastIndex=0;var r=Io.exec(t.substring(n));return r?(e.m=qo.get(r[0].toLowerCase()),n+=r[0].length):-1}function bi(e,t,n){jo.lastIndex=0;var r=jo.exec(t.substring(n));return r?(e.m=Fo.get(r[0].toLowerCase()),n+=r[0].length):-1}function wi(e,t,n){return pi(e,Ro.c.toString(),t,n)}function Ei(e,t,n){return pi(e,Ro.x.toString(),t,n)}function Si(e,t,n){return pi(e,Ro.X.toString(),t,n)}function xi(e,t,n){zo.lastIndex=0;var r=zo.exec(t.substring(n,n+4));return r?(e.y=+r[0],n+=r[0].length):-1}function Ti(e,t,n){zo.lastIndex=0;var r=zo.exec(t.substring(n,n+2));return r?(e.y=Ni(+r[0]),n+=r[0].length):-1}function Ni(e){return e+(e>68?1900:2e3)}function Ci(e,t,n){zo.lastIndex=0;var r=zo.exec(t.substring(n,n+2));return r?(e.m=r[0]-1,n+=r[0].length):-1}function ki(e,t,n){zo.lastIndex=0;var r=zo.exec(t.substring(n,n+2));return r?(e.d=+r[0],n+=r[0].length):-1}function Li(e,t,n){zo.lastIndex=0;var r=zo.exec(t.substring(n,n+2));return r?(e.H=+r[0],n+=r[0].length):-1}function Ai(e,t,n){zo.lastIndex=0;var r=zo.exec(t.substring(n,n+2));return r?(e.M=+r[0],n+=r[0].length):-1}function Oi(e,t,n){zo.lastIndex=0;var r=zo.exec(t.substring(n,n+2));return r?(e.S=+r[0],n+=r[0].length):-1}function Mi(e,t,n){zo.lastIndex=0;var r=zo.exec(t.substring(n,n+3));return r?(e.L=+r[0],n+=r[0].length):-1}function _i(e,t,n){var r=Wo.get(t.substring(n,n+=2).toLowerCase());return r==null?-1:(e.p=r,n)}function Di(e){var t=e.getTimezoneOffset(),n=t>0?"-":"+",r=~~(Math.abs(t)/60),i=Math.abs(t)%60;return n+Mo(r)+Mo(i)}function Pi(e){return e.toISOString()}function Hi(e,t,n){function r(t){var n=e(t),r=s(n,1);return t-n<r-t?n:r}function i(n){return t(n=e(new Eo(n-1)),1),n}function s(e,n){return t(e=new Eo(+e),n),e}function o(e,r,s){var o=i(e),u=[];if(s>1)while(o<r)n(o)%s||u.push(new Date(+o)),t(o,1);else while(o<r)u.push(new Date(+o)),t(o,1);return u}function u(e,t,n){try{Eo=ci;var r=new ci;return r._=e,o(r,t,n)}finally{Eo=Date}}e.floor=e,e.round=r,e.ceil=i,e.offset=s,e.range=o;var a=e.utc=Bi(e);return a.floor=a,a.round=Bi(r),a.ceil=Bi(i),a.offset=Bi(s),a.range=u,e}function Bi(e){return function(t,n){try{Eo=ci;var r=new ci;return r._=t,e(r,n)._}finally{Eo=Date}}}function ji(e,t,n){function r(t){return e(t)}return r.invert=function(t){return Ii(e.invert(t))},r.domain=function(t){return arguments.length?(e.domain(t),r):e.domain().map(Ii)},r.nice=function(e){return r.domain(Pt(r.domain(),function(){return e}))},r.ticks=function(n,i){var s=Fi(r.domain());if(typeof n!="function"){var o=s[1]-s[0],u=o/n,a=d3.bisect(Vo,u);if(a==Vo.length)return t.year(s,n);if(!a)return e.ticks(n).map(Ii);Math.log(u/Vo[a-1])<Math.log(Vo[a]/u)&&--a,n=t[a],i=n[1],n=n[0].range}return n(s[0],new Date(+s[1]+1),i)},r.tickFormat=function(){return n},r.copy=function(){return ji(e.copy(),t,n)},d3.rebind(r,e,"range","rangeRound","interpolate","clamp")}function Fi(e){var t=e[0],n=e[e.length-1];return t<n?[t,n]:[n,t]}function Ii(e){return new Date(e)}function qi(e){return function(t){var n=e.length-1,r=e[n];while(!r[1](t))r=e[--n];return r[0](t)}}function Ri(e){var t=new Date(e,0,1);return t.setFullYear(e),t}function Ui(e){var t=e.getFullYear(),n=Ri(t),r=Ri(t+1);return t+(e-n)/(r-n)}function zi(e){var t=new Date(Date.UTC(e,0,1));return t.setUTCFullYear(e),t}function Wi(e){var t=e.getUTCFullYear(),n=zi(t),r=zi(t+1);return t+(e-n)/(r-n)}Date.now||(Date.now=function(){return+(new Date)});try{document.createElement("div").style.setProperty("opacity",0,"")}catch(Xi){var Vi=CSSStyleDeclaration.prototype,$i=Vi.setProperty;Vi.setProperty=function(e,t,n){$i.call(this,e,t+"",n)}}d3={version:"2.10.3"};var Ji=n;try{Ji(document.documentElement.childNodes)[0].nodeType}catch(Ki){Ji=t}var Qi=[].__proto__?function(e,t){e.__proto__=t}:function(e,t){for(var n in t)e[n]=t[n]};d3.map=function(e){var t=new r;for(var n in e)t.set(n,e[n]);return t},e(r,{has:function(e){return Gi+e in this},get:function(e){return this[Gi+e]},set:function(e,t){return this[Gi+e]=t},remove:function(e){return e=Gi+e,e in this&&delete this[e]},keys:function(){var e=[];return this.forEach(function(t){e.push(t)}),e},values:function(){var e=[];return this.forEach(function(t,n){e.push(n)}),e},entries:function(){var e=[];return this.forEach(function(t,n){e.push({key:t,value:n})}),e},forEach:function(e){for(var t in this)t.charCodeAt(0)===Yi&&e.call(this,t.substring(1),this[t])}});var Gi="\0",Yi=Gi.charCodeAt(0);d3.functor=u,d3.rebind=function(e,t){var n=1,r=arguments.length,i;while(++n<r)e[i=arguments[n]]=a(e,t,t[i]);return e},d3.ascending=function(e,t){return e<t?-1:e>t?1:e>=t?0:NaN},d3.descending=function(e,t){return t<e?-1:t>e?1:t>=e?0:NaN},d3.mean=function(e,t){var n=e.length,r,i=0,s=-1,o=0;if(arguments.length===1)while(++s<n)f(r=e[s])&&(i+=(r-i)/++o);else while(++s<n)f(r=t.call(e,e[s],s))&&(i+=(r-i)/++o);return o?i:undefined},d3.median=function(e,t){return arguments.length>1&&(e=e.map(t)),e=e.filter(f),e.length?d3.quantile(e.sort(d3.ascending),.5):undefined},d3.min=function(e,t){var n=-1,r=e.length,i,s;if(arguments.length===1){while(++n<r&&((i=e[n])==null||i!=i))i=undefined;while(++n<r)(s=e[n])!=null&&i>s&&(i=s)}else{while(++n<r&&((i=t.call(e,e[n],n))==null||i!=i))i=undefined;while(++n<r)(s=t.call(e,e[n],n))!=null&&i>s&&(i=s)}return i},d3.max=function(e,t){var n=-1,r=e.length,i,s;if(arguments.length===1){while(++n<r&&((i=e[n])==null||i!=i))i=undefined;while(++n<r)(s=e[n])!=null&&s>i&&(i=s)}else{while(++n<r&&((i=t.call(e,e[n],n))==null||i!=i))i=undefined;while(++n<r)(s=t.call(e,e[n],n))!=null&&s>i&&(i=s)}return i},d3.extent=function(e,t){var n=-1,r=e.length,i,s,o;if(arguments.length===1){while(++n<r&&((i=o=e[n])==null||i!=i))i=o=undefined;while(++n<r)(s=e[n])!=null&&(i>s&&(i=s),o<s&&(o=s))}else{while(++n<r&&((i=o=t.call(e,e[n],n))==null||i!=i))i=undefined;while(++n<r)(s=t.call(e,e[n],n))!=null&&(i>s&&(i=s),o<s&&(o=s))}return[i,o]},d3.random={normal:function(e,t){var n=arguments.length;return n<2&&(t=1),n<1&&(e=0),function(){var n,r,i;do n=Math.random()*2-1,r=Math.random()*2-1,i=n*n+r*r;while(!i||i>1);return e+t*n*Math.sqrt(-2*Math.log(i)/i)}},logNormal:function(e,t){var n=arguments.length;n<2&&(t=1),n<1&&(e=0);var r=d3.random.normal();return function(){return Math.exp(e+t*r())}},irwinHall:function(e){return function(){for(var t=0,n=0;n<e;n++)t+=Math.random();return t/e}}},d3.sum=function(e,t){var n=0,r=e.length,i,s=-1;if(arguments.length===1)while(++s<r)isNaN(i=+e[s])||(n+=i);else while(++s<r)isNaN(i=+t.call(e,e[s],s))||(n+=i);return n},d3.quantile=function(e,t){var n=(e.length-1)*t+1,r=Math.floor(n),i=e[r-1],s=n-r;return s?i+s*(e[r]-i):i},d3.transpose=function(e){return d3.zip.apply(d3,e)},d3.zip=function(){if(!(i=arguments.length))return[];for(var e=-1,t=d3.min(arguments,l),n=new Array(t);++e<t;)for(var r=-1,i,s=n[e]=new Array(i);++r<i;)s[r]=arguments[r][e];return n},d3.bisector=function(e){return{left:function(t,n,r,i){arguments.length<3&&(r=0),arguments.length<4&&(i=t.length);while(r<i){var s=r+i>>>1;e.call(t,t[s],s)<n?r=s+1:i=s}return r},right:function(t,n,r,i){arguments.length<3&&(r=0),arguments.length<4&&(i=t.length);while(r<i){var s=r+i>>>1;n<e.call(t,t[s],s)?i=s:r=s+1}return r}}};var Zi=d3.bisector(function(e){return e});d3.bisectLeft=Zi.left,d3.bisect=d3.bisectRight=Zi.right,d3.first=function(e,t){var n=0,r=e.length,i=e[0],s;arguments.length===1&&(t=d3.ascending);while(++n<r)t.call(e,i,s=e[n])>0&&(i=s);return i},d3.last=function(e,t){var n=0,r=e.length,i=e[0],s;arguments.length===1&&(t=d3.ascending);while(++n<r)t.call(e,i,s=e[n])<=0&&(i=s);return i},d3.nest=function(){function e(t,s){if(s>=i.length)return u?u.call(n,t):o?t.sort(o):t;var a=-1,f=t.length,l=i[s++],c,h,p=new r,d,v={};while(++a<f)(d=p.get(c=l(h=t[a])))?d.push(h):p.set(c,[h]);return p.forEach(function(t,n){v[t]=e(n,s)}),v}function t(e,n){if(n>=i.length)return e;var r=[],o=s[n++],u;for(u in e)r.push({key:u,values:t(e[u],n)});return o&&r.sort(function(e,t){return o(e.key,t.key)}),r}var n={},i=[],s=[],o,u;return n.map=function(t){return e(t,0)},n.entries=function(n){return t(e(n,0),0)},n.key=function(e){return i.push(e),n},n.sortKeys=function(e){return s[i.length-1]=e,n},n.sortValues=function(e){return o=e,n},n.rollup=function(e){return u=e,n},n},d3.keys=function(e){var t=[];for(var n in e)t.push(n);return t},d3.values=function(e){var t=[];for(var n in e)t.push(e[n]);return t},d3.entries=function(e){var t=[];for(var n in e)t.push({key:n,value:e[n]});return t},d3.permute=function(e,t){var n=[],r=-1,i=t.length;while(++r<i)n[r]=e[t[r]];return n},d3.merge=function(e){return Array.prototype.concat.apply([],e)},d3.split=function(e,t){var n=[],r=[],i,s=-1,o=e.length;arguments.length<2&&(t=c);while(++s<o)t.call(r,i=e[s],s)?r=[]:(r.length||n.push(r),r.push(i));return n},d3.range=function(e,t,n){arguments.length<3&&(n=1,arguments.length<2&&(t=e,e=0));if((t-e)/n===Infinity)throw new Error("infinite range");var r=[],i=p(Math.abs(n)),s=-1,o;e*=i,t*=i,n*=i;if(n<0)while((o=e+n*++s)>t)r.push(o/i);else while((o=e+n*++s)<t)r.push(o/i);return r},d3.requote=function(e){return e.replace(es,"\\$&")};var es=/[\\\^\$\*\+\?\|\[\]\(\)\.\{\}]/g;d3.round=function(e,t){return t?Math.round(e*(t=Math.pow(10,t)))/t:Math.round(e)},d3.xhr=function(e,t,n){var r=new XMLHttpRequest;arguments.length<3?(n=t,t=null):t&&r.overrideMimeType&&r.overrideMimeType(t),r.open("GET",e,!0),t&&r.setRequestHeader("Accept",t),r.onreadystatechange=function(){if(r.readyState===4){var e=r.status;n(!e&&r.response||e>=200&&e<300||e===304?r:null)}},r.send(null)},d3.text=function(e,t,n){function r(e){n(e&&e.responseText)}arguments.length<3&&(n=t,t=null),d3.xhr(e,t,r)},d3.json=function(e,t){d3.text(e,"application/json",function(e){t(e?JSON.parse(e):null)})},d3.html=function(e,t){d3.text(e,"text/html",function(e){if(e!=null){var n=document.createRange();n.selectNode(document.body),e=n.createContextualFragment(e)}t(e)})},d3.xml=function(e,t,n){function r(e){n(e&&e.responseXML)}arguments.length<3&&(n=t,t=null),d3.xhr(e,t,r)};var ts={svg:"http://www.w3.org/2000/svg",xhtml:"http://www.w3.org/1999/xhtml",xlink:"http://www.w3.org/1999/xlink",xml:"http://www.w3.org/XML/1998/namespace",xmlns:"http://www.w3.org/2000/xmlns/"};d3.ns={prefix:ts,qualify:function(e){var t=e.indexOf(":"),n=e;return t>=0&&(n=e.substring(0,t),e=e.substring(t+1)),ts.hasOwnProperty(n)?{space:ts[n],local:e}:e}},d3.dispatch=function(){var e=new d,t=-1,n=arguments.length;while(++t<n)e[arguments[t]]=v(e);return e},d.prototype.on=function(e,t){var n=e.indexOf("."),r="";return n>0&&(r=e.substring(n+1),e=e.substring(0,n)),arguments.length<2?this[e].on(r):this[e].on(r,t)},d3.format=function(e){var t=ns.exec(e),n=t[1]||" ",r=t[3]||"",i=t[5],s=+t[6],o=t[7],u=t[8],a=t[9],f=1,l="",c=!1;u&&(u=+u.substring(1)),i&&(n="0",o&&(s-=Math.floor((s-1)/4)));switch(a){case"n":o=!0,a="g";break;case"%":f=100,l="%",a="f";break;case"p":f=100,l="%",a="r";break;case"d":c=!0,u=0;break;case"s":f=-1,a="r"}return a=="r"&&!u&&(a="g"),a=rs.get(a)||g,function(e){if(c&&e%1)return"";var t=e<0&&(e=-e)?"-":r;if(f<0){var h=d3.formatPrefix(e,u);e=h.scale(e),l=h.symbol}else e*=f;e=a(e,u);if(i){var p=e.length+t.length;p<s&&(e=(new Array(s-p+1)).join(n)+e),o&&(e=y(e)),e=t+e}else{o&&(e=y(e)),e=t+e;var p=e.length;p<s&&(e=(new Array(s-p+1)).join(n)+e)}return e+l}};var ns=/(?:([^{])?([<>=^]))?([+\- ])?(#)?(0)?([0-9]+)?(,)?(\.[0-9]+)?([a-zA-Z%])?/,rs=d3.map({g:function(e,t){return e.toPrecision(t)},e:function(e,t){return e.toExponential(t)},f:function(e,t){return e.toFixed(t)},r:function(e,t){return d3.round(e,t=m(e,t)).toFixed(Math.max(0,Math.min(20,t)))}}),is=["y","z","a","f","p","n","μ","m","","k","M","G","T","P","E","Z","Y"].map(b);d3.formatPrefix=function(e,t){var n=0;return e&&(e<0&&(e*=-1),t&&(e=d3.round(e,m(e,t))),n=1+Math.floor(1e-12+Math.log(e)/Math.LN10),n=Math.max(-24,Math.min(24,Math.floor((n<=0?n+1:n-1)/3)*3))),is[8+n/3]};var ss=T(2),os=T(3),us=function(){return x},as=d3.map({linear:us,poly:T,quad:function(){return ss},cubic:function(){return os},sin:function(){return N},exp:function(){return C},circle:function(){return k},elastic:L,back:A,bounce:function(){return O}}),fs=d3.map({"in":x,out:E,"in-out":S,"out-in":function(e){return S(E(e))}});d3.ease=function(e){var t=e.indexOf("-"),n=t>=0?e.substring(0,t):e,r=t>=0?e.substring(t+1):"in";return n=as.get(n)||us,r=fs.get(r)||x,w(r(n.apply(null,Array.prototype.slice.call(arguments,1))))},d3.event=null,d3.transform=function(e){var t=document.createElementNS(d3.ns.prefix.svg,"g");return(d3.transform=function(e){t.setAttribute("transform",e);var n=t.transform.baseVal.consolidate();return new P(n?n.matrix:cs)})(e)},P.prototype.toString=function(){return"translate("+this.translate+")rotate("+this.rotate+")skewX("+this.skew+")scale("+this.scale+")"};var ls=180/Math.PI,cs={a:1,b:0,c:0,d:1,e:0,f:0};d3.interpolate=function(e,t){var n=d3.interpolators.length,r;while(--n>=0&&!(r=d3.interpolators[n](e,t)));return r},d3.interpolateNumber=function(e,t){return t-=e,function(n){return e+t*n}},d3.interpolateRound=function(e,t){return t-=e,function(n){return Math.round(e+t*n)}},d3.interpolateString=function(e,t){var n,r,i,s=0,o=0,u=[],a=[],f,l;hs.lastIndex=0;for(r=0;n=hs.exec(t);++r)n.index&&u.push(t.substring(s,o=n.index)),a.push({i:u.length,x:n[0]}),u.push(null),s=hs.lastIndex;s<t.length&&u.push(t.substring(s));for(r=0,f=a.length;(n=hs.exec(e))&&r<f;++r){l=a[r];if(l.x==n[0]){if(l.i)if(u[l.i+1]==null){u[l.i-1]+=l.x,u.splice(l.i,1);for(i=r+1;i<f;++i)a[i].i--}else{u[l.i-1]+=l.x+u[l.i+1],u.splice(l.i,2);for(i=r+1;i<f;++i)a[i].i-=2}else if(u[l.i+1]==null)u[l.i]=l.x;else{u[l.i]=l.x+u[l.i+1],u.splice(l.i+1,1);for(i=r+1;i<f;++i)a[i].i--}a.splice(r,1),f--,r--}else l.x=d3.interpolateNumber(parseFloat(n[0]),parseFloat(l.x))}while(r<f)l=a.pop(),u[l.i+1]==null?u[l.i]=l.x:(u[l.i]=l.x+u[l.i+1],u.splice(l.i+1,1)),f--;return u.length===1?u[0]==null?a[0].x:function(){return t}:function(e){for(r=0;r<f;++r)u[(l=a[r]).i]=l.x(e);return u.join("")}},d3.interpolateTransform=function(e,t){var n=[],r=[],i,s=d3.transform(e),o=d3.transform(t),u=s.translate,a=o.translate,f=s.rotate,l=o.rotate,c=s.skew,h=o.skew,p=s.scale,d=o.scale;return u[0]!=a[0]||u[1]!=a[1]?(n.push("translate(",null,",",null,")"),r.push({i:1,x:d3.interpolateNumber(u[0],a[0])},{i:3,x:d3.interpolateNumber(u[1],a[1])})):a[0]||a[1]?n.push("translate("+a+")"):n.push(""),f!=l?(f-l>180?l+=360:l-f>180&&(f+=360),r.push({i:n.push(n.pop()+"rotate(",null,")")-2,x:d3.interpolateNumber(f,l)})):l&&n.push(n.pop()+"rotate("+l+")"),c!=h?r.push({i:n.push(n.pop()+"skewX(",null,")")-2,x:d3.interpolateNumber(c,h)}):h&&n.push(n.pop()+"skewX("+h+")"),p[0]!=d[0]||p[1]!=d[1]?(i=n.push(n.pop()+"scale(",null,",",null,")"),r.push({i:i-4,x:d3.interpolateNumber(p[0],d[0])},{i:i-2,x:d3.interpolateNumber(p[1],d[1])})):(d[0]!=1||d[1]!=1)&&n.push(n.pop()+"scale("+d+")"),i=r.length,function(e){var t=-1,s;while(++t<i)n[(s=r[t]).i]=s.x(e);return n.join("")}},d3.interpolateRgb=function(e,t){e=d3.rgb(e),t=d3.rgb(t);var n=e.r,r=e.g,i=e.b,s=t.r-n,o=t.g-r,u=t.b-i;return function(e){return"#"+W(Math.round(n+s*e))+W(Math.round(r+o*e))+W(Math.round(i+u*e))}},d3.interpolateHsl=function(e,t){e=d3.hsl(e),t=d3.hsl(t);var n=e.h,r=e.s,i=e.l,s=t.h-n,o=t.s-r,u=t.l-i;return s>180?s-=360:s<-180&&(s+=360),function(e){return Y(n+s*e,r+o*e,i+u*e)+""}},d3.interpolateLab=function(e,t){e=d3.lab(e),t=d3.lab(t);var n=e.l,r=e.a,i=e.b,s=t.l-n,o=t.a-r,u=t.b-i;return function(e){return it(n+s*e,r+o*e,i+u*e)+""}},d3.interpolateHcl=function(e,t){e=d3.hcl(e),t=d3.hcl(t);var n=e.h,r=e.c,i=e.l,s=t.h-n,o=t.c-r,u=t.l-i;return s>180?s-=360:s<-180&&(s+=360),function(e){return tt(n+s*e,r+o*e,i+u*e)+""}},d3.interpolateArray=function(e,t){var n=[],r=[],i=e.length,s=t.length,o=Math.min(e.length,t.length),u;for(u=0;u<o;++u)n.push(d3.interpolate(e[u],t[u]));for(;u<i;++u)r[u]=e[u];for(;u<s;++u)r[u]=t[u];return function(e){for(u=0;u<o;++u)r[u]=n[u](e);return r}},d3.interpolateObject=function(e,t){var n={},r={},i;for(i in e)i in t?n[i]=F(i)(e[i],t[i]):r[i]=e[i];for(i in t)i in e||(r[i]=t[i]);return function(e){for(i in n)r[i]=n[i](e);return r}};var hs=/[-+]?(?:\d+\.?\d*|\.?\d+)(?:[eE][-+]?\d+)?/g;d3.interpolators=[d3.interpolateObject,function(e,t){return t instanceof Array&&d3.interpolateArray(e,t)},function(e,t){return(typeof e=="string"||typeof t=="string")&&d3.interpolateString(e+"",t+"")},function(e,t){return(typeof t=="string"?ds.has(t)||/^(#|rgb\(|hsl\()/.test(t):t instanceof R)&&d3.interpolateRgb(e,t)},function(e,t){return!isNaN(e=+e)&&!isNaN(t=+t)&&d3.interpolateNumber(e,t)}],R.prototype.toString=function(){return this.rgb()+""},d3.rgb=function(e,t,n){return arguments.length===1?e instanceof z?U(e.r,e.g,e.b):X(""+e,U,Y):U(~~e,~~t,~~n)};var ps=z.prototype=new R;ps.brighter=function(e){e=Math.pow(.7,arguments.length?e:1);var t=this.r,n=this.g,r=this.b,i=30;return!t&&!n&&!r?U(i,i,i):(t&&t<i&&(t=i),n&&n<i&&(n=i),r&&r<i&&(r=i),U(Math.min(255,Math.floor(t/e)),Math.min(255,Math.floor(n/e)),Math.min(255,Math.floor(r/e))))},ps.darker=function(e){return e=Math.pow(.7,arguments.length?e:1),U(Math.floor(e*this.r),Math.floor(e*this.g),Math.floor(e*this.b))},ps.hsl=function(){return V(this.r,this.g,this.b)},ps.toString=function(){return"#"+W(this.r)+W(this.g)+W(this.b)};var ds=d3.map({aliceblue:"#f0f8ff",antiquewhite:"#faebd7",aqua:"#00ffff",aquamarine:"#7fffd4",azure:"#f0ffff",beige:"#f5f5dc",bisque:"#ffe4c4",black:"#000000",blanchedalmond:"#ffebcd",blue:"#0000ff",blueviolet:"#8a2be2",brown:"#a52a2a",burlywood:"#deb887",cadetblue:"#5f9ea0",chartreuse:"#7fff00",chocolate:"#d2691e",coral:"#ff7f50",cornflowerblue:"#6495ed",cornsilk:"#fff8dc",crimson:"#dc143c",cyan:"#00ffff",darkblue:"#00008b",darkcyan:"#008b8b",darkgoldenrod:"#b8860b",darkgray:"#a9a9a9",darkgreen:"#006400",darkgrey:"#a9a9a9",darkkhaki:"#bdb76b",darkmagenta:"#8b008b",darkolivegreen:"#556b2f",darkorange:"#ff8c00",darkorchid:"#9932cc",darkred:"#8b0000",darksalmon:"#e9967a",darkseagreen:"#8fbc8f",darkslateblue:"#483d8b",darkslategray:"#2f4f4f",darkslategrey:"#2f4f4f",darkturquoise:"#00ced1",darkviolet:"#9400d3",deeppink:"#ff1493",deepskyblue:"#00bfff",dimgray:"#696969",dimgrey:"#696969",dodgerblue:"#1e90ff",firebrick:"#b22222",floralwhite:"#fffaf0",forestgreen:"#228b22",fuchsia:"#ff00ff",gainsboro:"#dcdcdc",ghostwhite:"#f8f8ff",gold:"#ffd700",goldenrod:"#daa520",gray:"#808080",green:"#008000",greenyellow:"#adff2f",grey:"#808080",honeydew:"#f0fff0",hotpink:"#ff69b4",indianred:"#cd5c5c",indigo:"#4b0082",ivory:"#fffff0",khaki:"#f0e68c",lavender:"#e6e6fa",lavenderblush:"#fff0f5",lawngreen:"#7cfc00",lemonchiffon:"#fffacd",lightblue:"#add8e6",lightcoral:"#f08080",lightcyan:"#e0ffff",lightgoldenrodyellow:"#fafad2",lightgray:"#d3d3d3",lightgreen:"#90ee90",lightgrey:"#d3d3d3",lightpink:"#ffb6c1",lightsalmon:"#ffa07a",lightseagreen:"#20b2aa",lightskyblue:"#87cefa",lightslategray:"#778899",lightslategrey:"#778899",lightsteelblue:"#b0c4de",lightyellow:"#ffffe0",lime:"#00ff00",limegreen:"#32cd32",linen:"#faf0e6",magenta:"#ff00ff",maroon:"#800000",mediumaquamarine:"#66cdaa",mediumblue:"#0000cd",mediumorchid:"#ba55d3",mediumpurple:"#9370db",mediumseagreen:"#3cb371",mediumslateblue:"#7b68ee",mediumspringgreen:"#00fa9a",mediumturquoise:"#48d1cc",mediumvioletred:"#c71585",midnightblue:"#191970",mintcream:"#f5fffa",mistyrose:"#ffe4e1",moccasin:"#ffe4b5",navajowhite:"#ffdead",navy:"#000080",oldlace:"#fdf5e6",olive:"#808000",olivedrab:"#6b8e23",orange:"#ffa500",orangered:"#ff4500",orchid:"#da70d6",palegoldenrod:"#eee8aa",palegreen:"#98fb98",paleturquoise:"#afeeee",palevioletred:"#db7093",papayawhip:"#ffefd5",peachpuff:"#ffdab9",peru:"#cd853f",pink:"#ffc0cb",plum:"#dda0dd",powderblue:"#b0e0e6",purple:"#800080",red:"#ff0000",rosybrown:"#bc8f8f",royalblue:"#4169e1",saddlebrown:"#8b4513",salmon:"#fa8072",sandybrown:"#f4a460",seagreen:"#2e8b57",seashell:"#fff5ee",sienna:"#a0522d",silver:"#c0c0c0",skyblue:"#87ceeb",slateblue:"#6a5acd",slategray:"#708090",slategrey:"#708090",snow:"#fffafa",springgreen:"#00ff7f",steelblue:"#4682b4",tan:"#d2b48c",teal:"#008080",thistle:"#d8bfd8",tomato:"#ff6347",turquoise:"#40e0d0",violet:"#ee82ee",wheat:"#f5deb3",white:"#ffffff",whitesmoke:"#f5f5f5",yellow:"#ffff00",yellowgreen:"#9acd32"});ds.forEach(function(e,t){ds.set(e,X(t,U,Y))}),d3.hsl=function(e,t,n){return arguments.length===1?e instanceof G?Q(e.h,e.s,e.l):X(""+e,V,Q):Q(+e,+t,+n)};var vs=G.prototype=new R;vs.brighter=function(e){return e=Math.pow(.7,arguments.length?e:1),Q(this.h,this.s,this.l/e)},vs.darker=function(e){return e=Math.pow(.7,arguments.length?e:1),Q(this.h,this.s,e*this.l)},vs.rgb=function(){return Y(this.h,this.s,this.l)},d3.hcl=function(e,t,n){return arguments.length===1?e instanceof et?Z(e.h,e.c,e.l):e instanceof rt?st(e.l,e.a,e.b):st((e=$((e=d3.rgb(e)).r,e.g,e.b)).l,e.a,e.b):Z(+e,+t,+n)};var ms=et.prototype=new R;ms.brighter=function(e){return Z(this.h,this.c,Math.min(100,this.l+gs*(arguments.length?e:1)))},ms.darker=function(e){return Z(this.h,this.c,Math.max(0,this.l-gs*(arguments.length?e:1)))},ms.rgb=function(){return tt(this.h,this.c,this.l).rgb()},d3.lab=function(e,t,n){return arguments.length===1?e instanceof rt?nt(e.l,e.a,e.b):e instanceof et?tt(e.l,e.c,e.h):$((e=d3.rgb(e)).r,e.g,e.b):nt(+e,+t,+n)};var gs=18,ys=.95047,bs=1,ws=1.08883,Es=rt.prototype=new R;Es.brighter=function(e){return nt(Math.min(100,this.l+gs*(arguments.length?e:1)),this.a,this.b)},Es.darker=function(e){return nt(Math.max(0,this.l-gs*(arguments.length?e:1)),this.a,this.b)},Es.rgb=function(){return it(this.l,this.a,this.b)};var Ss=function(e,t){return t.querySelector(e)},xs=function(e,t){return t.querySelectorAll(e)},Ts=document.documentElement,Ns=Ts.matchesSelector||Ts.webkitMatchesSelector||Ts.mozMatchesSelector||Ts.msMatchesSelector||Ts.oMatchesSelector,Cs=function(e,t){return Ns.call(e,t)};typeof Sizzle=="function"&&(Ss=function(e,t){return Sizzle(e,t)[0]||null},xs=function(e,t){return Sizzle.uniqueSort(Sizzle(e,t))},Cs=Sizzle.matchesSelector);var ks=[];d3.selection=function(){return Ls},d3.selection.prototype=ks,ks.select=function(e){var t=[],n,r,i,s;typeof e!="function"&&(e=lt(e));for(var o=-1,u=this.length;++o<u;){t.push(n=[]),n.parentNode=(i=this[o]).parentNode;for(var a=-1,f=i.length;++a<f;)(s=i[a])?(n.push(r=e.call(s,s.__data__,a)),r&&"__data__"in s&&(r.__data__=s.__data__)):n.push(null)}return ft(t)},ks.selectAll=function(e){var t=[],n,r;typeof e!="function"&&(e=ct(e));for(var i=-1,s=this.length;++i<s;)for(var o=this[i],u=-1,a=o.length;++u<a;)if(r=o[u])t.push(n=Ji(e.call(r,r.__data__,u))),n.parentNode=r;return ft(t)},ks.attr=function(e,t){if(arguments.length<2){if(typeof e=="string"){var n=this.node();return e=d3.ns.qualify(e),e.local?n.getAttributeNS(e.space,e.local):n.getAttribute(e)}for(t in e)this.each(ht(t,e[t]));return this}return this.each(ht(e,t))},ks.classed=function(e,t){if(arguments.length<2){if(typeof e=="string"){var n=this.node(),r=(e=e.trim().split(/^|\s+/g)).length,i=-1;if(t=n.classList){while(++i<r)if(!t.contains(e[i]))return!1}else{t=n.className,t.baseVal!=null&&(t=t.baseVal);while(++i<r)if(!pt(e[i]).test(t))return!1}return!0}for(t in e)this.each(dt(t,e[t]));return this}return this.each(dt(e,t))},ks.style=function(e,t,n){var r=arguments.length;if(r<3){if(typeof e!="string"){r<2&&(t="");for(n in e)this.each(mt(n,e[n],t));return this}if(r<2)return window.getComputedStyle(this.node(),null).getPropertyValue(e);n=""}return this.each(mt(e,t,n))},ks.property=function(e,t){if(arguments.length<2){if(typeof e=="string")return this.node()[e];for(t in e)this.each(gt(t,e[t]));return this}return this.each(gt(e,t))},ks.text=function(e){return arguments.length<1?this.node().textContent:this.each(typeof e=="function"?function(){var t=e.apply(this,arguments);this.textContent=t==null?"":t}:e==null?function(){this.textContent=""}:function(){this.textContent=e})},ks.html=function(e){return arguments.length<1?this.node().innerHTML:this.each(typeof e=="function"?function(){var t=e.apply(this,arguments);this.innerHTML=t==null?"":t}:e==null?function(){this.innerHTML=""}:function(){this.innerHTML=e})},ks.append=function(e){function t(){return this.appendChild(document.createElementNS(this.namespaceURI,e))}function n(){return this.appendChild(document.createElementNS(e.space,e.local))}return e=d3.ns.qualify(e),this.select(e.local?n:t)},ks.insert=function(e,t){function n(){return this.insertBefore(document.createElementNS(this.namespaceURI,e),Ss(t,this))}function r(){return this.insertBefore(document.createElementNS(e.space,e.local),Ss(t,this))}return e=d3.ns.qualify(e),this.select(e.local?r:n)},ks.remove=function(){return this.each(function(){var e=this.parentNode;e&&e.removeChild(this)})},ks.data=function(e,t){function n(e,n){var i,s=e.length,o=n.length,u=Math.min(s,o),c=Math.max(s,o),h=[],p=[],d=[],v,m;if(t){var g=new r,y=[],b,w=n.length;for(i=-1;++i<s;)b=t.call(v=e[i],v.__data__,i),g.has(b)?d[w++]=v:g.set(b,v),y.push(b);for(i=-1;++i<o;)b=t.call(n,m=n[i],i),g.has(b)?(h[i]=v=g.get(b),v.__data__=m,p[i]=d[i]=null):(p[i]=yt(m),h[i]=d[i]=null),g.remove(b);for(i=-1;++i<s;)g.has(y[i])&&(d[i]=e[i])}else{for(i=-1;++i<u;)v=e[i],m=n[i],v?(v.__data__=m,h[i]=v,p[i]=d[i]=null):(p[i]=yt(m),h[i]=d[i]=null);for(;i<o;++i)p[i]=yt(n[i]),h[i]=d[i]=null;for(;i<c;++i)d[i]=e[i],p[i]=h[i]=null}p.update=h,p.parentNode=h.parentNode=d.parentNode=e.parentNode,a.push(p),f.push(h),l.push(d)}var i=-1,s=this.length,o,u;if(!arguments.length){e=new Array(s=(o=this[0]).length);while(++i<s)if(u=o[i])e[i]=u.__data__;return e}var a=xt([]),f=ft([]),l=ft([]);if(typeof e=="function")while(++i<s)n(o=this[i],e.call(o,o.parentNode.__data__,i));else while(++i<s)n(o=this[i],e);return f.enter=function(){return a},f.exit=function(){return l},f},ks.datum=ks.map=function(e){return arguments.length<1?this.property("__data__"):this.property("__data__",e)},ks.filter=function(e){var t=[],n,r,i;typeof e!="function"&&(e=bt(e));for(var s=0,o=this.length;s<o;s++){t.push(n=[]),n.parentNode=(r=this[s]).parentNode;for(var u=0,a=r.length;u<a;u++)(i=r[u])&&e.call(i,i.__data__,u)&&n.push(i)}return ft(t)},ks.order=function(){for(var e=-1,t=this.length;++e<t;)for(var n=this[e],r=n.length-1,i=n[r],s;--r>=0;)if(s=n[r])i&&i!==s.nextSibling&&i.parentNode.insertBefore(s,i),i=s;return this},ks.sort=function(e){e=wt.apply(this,arguments);for(var t=-1,n=this.length;++t<n;)this[t].sort(e);return this.order()},ks.on=function(e,t,n){var r=arguments.length;if(r<3){if(typeof e!="string"){r<2&&(t=!1);for(n in e)this.each(Et(n,e[n],t));return this}if(r<2)return(r=this.node()["__on"+e])&&r._;n=!1}return this.each(Et(e,t,n))},ks.each=function(e){return St(this,function(t,n,r){e.call(t,t.__data__,n,r)})},ks.call=function(e){return e.apply(this,(arguments[0]=this,arguments)),this},ks.empty=function(){return!this.node()},ks.node=function(e){for(var t=0,n=this.length;t<n;t++)for(var r=this[t],i=0,s=r.length;i<s;i++){var o=r[i];if(o)return o}return null},ks.transition=function(){var e=[],t,n;for(var r=-1,i=this.length;++r<i;){e.push(t=[]);for(var s=this[r],o=-1,u=s.length;++o<u;)t.push((n=s[o])?{node:n,delay:Bs,duration:js}:null)}return Tt(e,_s||++Ms,Date.now())};var Ls=ft([[document]]);Ls[0].parentNode=Ts,d3.select=function(e){return typeof e=="string"?Ls.select(e):ft([[e]])},d3.selectAll=function(e){return typeof e=="string"?Ls.selectAll(e):ft([Ji(e)])};var As=[];d3.selection.enter=xt,d3.selection.enter.prototype=As,As.append=ks.append,As.insert=ks.insert,As.empty=ks.empty,As.node=ks.node,As.select=function(e){var t=[],n,r,i,s,o;for(var u=-1,a=this.length;++u<a;){i=(s=this[u]).update,t.push(n=[]),n.parentNode=s.parentNode;for(var f=-1,l=s.length;++f<l;)(o=s[f])?(n.push(i[f]=r=e.call(s.parentNode,o.__data__,f)),r.__data__=o.__data__):n.push(null)}return ft(t)};var Os=[],Ms=0,_s=0,Ds=0,Ps=250,Hs=d3.ease("cubic-in-out"),Bs=Ds,js=Ps,Fs=Hs;Os.call=ks.call,d3.transition=function(e){return arguments.length?_s?e.transition():e:Ls.transition()},d3.transition.prototype=Os,Os.select=function(e){var t=[],n,r,i;typeof e!="function"&&(e=lt(e));for(var s=-1,o=this.length;++s<o;){t.push(n=[]);for(var u=this[s],a=-1,f=u.length;++a<f;)(i=u[a])&&(r=e.call(i.node,i.node.__data__,a))?("__data__"in i.node&&(r.__data__=i.node.__data__),n.push({node:r,delay:i.delay,duration:i.duration})):n.push(null)}return Tt(t,this.id,this.time).ease(this.ease())},Os.selectAll=function(e){var t=[],n,r,i;typeof e!="function"&&(e=ct(e));for(var s=-1,o=this.length;++s<o;)for(var u=this[s],a=-1,f=u.length;++a<f;)if(i=u[a]){r=e.call(i.node,i.node.__data__,a),t.push(n=[]);for(var l=-1,c=r.length;++l<c;)n.push({node:r[l],delay:i.delay,duration:i.duration})}return Tt(t,this.id,this.time).ease(this.ease())},Os.filter=function(e){var t=[],n,r,i;typeof e!="function"&&(e=bt(e));for(var s=0,o=this.length;s<o;s++){t.push(n=[]);for(var r=this[s],u=0,a=r.length;u<a;u++)(i=r[u])&&e.call(i.node,i.node.__data__,u)&&n.push(i)}return Tt(t,this.id,this.time).ease(this.ease())},Os.attr=function(e,t){if(arguments.length<2){for(t in e)this.attrTween(t,kt(e[t],t));return this}return this.attrTween(e,kt(t,e))},Os.attrTween=function(e,t){function n(e,n){var r=t.call(this,e,n,this.getAttribute(i));return r===Is?(this.removeAttribute(i),null):r&&function(e){this.setAttribute(i,r(e))}}function r(e,n){var r=t.call(this,e,n,this.getAttributeNS(i.space,i.local));return r===Is?(this.removeAttributeNS(i.space,i.local),null):r&&function(e){this.setAttributeNS(i.space,i.local,r(e))}}var i=d3.ns.qualify(e);return this.tween("attr."+e,i.local?r:n)},Os.style=function(e,t,n){var r=arguments.length;if(r<3){if(typeof e!="string"){r<2&&(t="");for(n in e)this.styleTween(n,kt(e[n],n),t);return this}n=""}return this.styleTween(e,kt(t,e),n)},Os.styleTween=function(e,t,n){return arguments.length<3&&(n=""),this.tween("style."+e,function(r,i){var s=t.call(this,r,i,window.getComputedStyle(this,null).getPropertyValue(e));return s===Is?(this.style.removeProperty(e),null):s&&function(t){this.style.setProperty(e,s(t),n)}})},Os.text=function(e){return this.tween("text",function(t,n){this.textContent=typeof e=="function"?e.call(this,t,n):e})},Os.remove=function(){return this.each("end.transition",function(){var e;!this.__transition__&&(e=this.parentNode)&&e.removeChild(this)})},Os.delay=function(e){return St(this,typeof e=="function"?function(t,n,r){t.delay=e.call(t=t.node,t.__data__,n,r)|0}:(e|=0,function(t){t.delay=e}))},Os.duration=function(e){return St(this,typeof e=="function"?function(t,n,r){t.duration=Math.max(1,e.call(t=t.node,t.__data__,n,r)|0)}:(e=Math.max(1,e|0),function(t){t.duration=e}))},Os.transition=function(){return this.select(s)},d3.tween=function(e,t){function n(n,r,i){var s=e.call(this,n,r);return s==null?i!=""&&Is:i!=s&&t(i,s+"")}function r(n,r,i){return i!=e&&t(i,e)}return typeof e=="function"?n:e==null?Ct:(e+="",r)};var Is={},qs=0,Rs={},Us=null,zs,Ws;d3.timer=function(e,t,n){if(arguments.length<3){if(arguments.length<2)t=0;else if(!isFinite(t))return;n=Date.now()}var r=Rs[e.id];r&&r.callback===e?(r.then=n,r.delay=t):Rs[e.id=++qs]=Us={callback:e,then:n,delay:t,next:Us},zs||(Ws=clearTimeout(Ws),zs=1,Xs(Lt))},d3.timer.flush=function(){var e,t=Date.now(),n=Us;while(n)e=t-n.then,n.delay||(n.flush=n.callback(e)),n=n.next;At()};var Xs=window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||window.oRequestAnimationFrame||window.msRequestAnimationFrame||function(e){setTimeout -(e,17)};d3.mouse=function(e){return Ot(e,_())};var Vs=/WebKit/.test(navigator.userAgent)?-1:0;d3.touches=function(e,t){return arguments.length<2&&(t=_().touches),t?Ji(t).map(function(t){var n=Ot(e,t);return n.identifier=t.identifier,n}):[]},d3.scale={},d3.scale.linear=function(){return Bt([0,1],[0,1],d3.interpolate,!1)},d3.scale.log=function(){return Wt(d3.scale.linear(),Xt)};var $s=d3.format(".0e");Xt.pow=function(e){return Math.pow(10,e)},Vt.pow=function(e){return-Math.pow(10,-e)},d3.scale.pow=function(){return $t(d3.scale.linear(),1)},d3.scale.sqrt=function(){return d3.scale.pow().exponent(.5)},d3.scale.ordinal=function(){return Kt([],{t:"range",a:[[]]})},d3.scale.category10=function(){return d3.scale.ordinal().range(Js)},d3.scale.category20=function(){return d3.scale.ordinal().range(Ks)},d3.scale.category20b=function(){return d3.scale.ordinal().range(Qs)},d3.scale.category20c=function(){return d3.scale.ordinal().range(Gs)};var Js=["#1f77b4","#ff7f0e","#2ca02c","#d62728","#9467bd","#8c564b","#e377c2","#7f7f7f","#bcbd22","#17becf"],Ks=["#1f77b4","#aec7e8","#ff7f0e","#ffbb78","#2ca02c","#98df8a","#d62728","#ff9896","#9467bd","#c5b0d5","#8c564b","#c49c94","#e377c2","#f7b6d2","#7f7f7f","#c7c7c7","#bcbd22","#dbdb8d","#17becf","#9edae5"],Qs=["#393b79","#5254a3","#6b6ecf","#9c9ede","#637939","#8ca252","#b5cf6b","#cedb9c","#8c6d31","#bd9e39","#e7ba52","#e7cb94","#843c39","#ad494a","#d6616b","#e7969c","#7b4173","#a55194","#ce6dbd","#de9ed6"],Gs=["#3182bd","#6baed6","#9ecae1","#c6dbef","#e6550d","#fd8d3c","#fdae6b","#fdd0a2","#31a354","#74c476","#a1d99b","#c7e9c0","#756bb1","#9e9ac8","#bcbddc","#dadaeb","#636363","#969696","#bdbdbd","#d9d9d9"];d3.scale.quantile=function(){return Qt([],[])},d3.scale.quantize=function(){return Gt(0,1,[0,1])},d3.scale.threshold=function(){return Yt([.5],[0,1])},d3.scale.identity=function(){return Zt([0,1])},d3.svg={},d3.svg.arc=function(){function e(){var e=t.apply(this,arguments),s=n.apply(this,arguments),o=r.apply(this,arguments)+Ys,u=i.apply(this,arguments)+Ys,a=(u<o&&(a=o,o=u,u=a),u-o),f=a<Math.PI?"0":"1",l=Math.cos(o),c=Math.sin(o),h=Math.cos(u),p=Math.sin(u);return a>=Zs?e?"M0,"+s+"A"+s+","+s+" 0 1,1 0,"+ -s+"A"+s+","+s+" 0 1,1 0,"+s+"M0,"+e+"A"+e+","+e+" 0 1,0 0,"+ -e+"A"+e+","+e+" 0 1,0 0,"+e+"Z":"M0,"+s+"A"+s+","+s+" 0 1,1 0,"+ -s+"A"+s+","+s+" 0 1,1 0,"+s+"Z":e?"M"+s*l+","+s*c+"A"+s+","+s+" 0 "+f+",1 "+s*h+","+s*p+"L"+e*h+","+e*p+"A"+e+","+e+" 0 "+f+",0 "+e*l+","+e*c+"Z":"M"+s*l+","+s*c+"A"+s+","+s+" 0 "+f+",1 "+s*h+","+s*p+"L0,0"+"Z"}var t=en,n=tn,r=nn,i=rn;return e.innerRadius=function(n){return arguments.length?(t=u(n),e):t},e.outerRadius=function(t){return arguments.length?(n=u(t),e):n},e.startAngle=function(t){return arguments.length?(r=u(t),e):r},e.endAngle=function(t){return arguments.length?(i=u(t),e):i},e.centroid=function(){var e=(t.apply(this,arguments)+n.apply(this,arguments))/2,s=(r.apply(this,arguments)+i.apply(this,arguments))/2+Ys;return[Math.cos(s)*e,Math.sin(s)*e]},e};var Ys=-Math.PI/2,Zs=2*Math.PI-1e-6;d3.svg.line=function(){return sn(i)};var eo=d3.map({linear:an,"linear-closed":fn,"step-before":ln,"step-after":cn,basis:gn,"basis-open":yn,"basis-closed":bn,bundle:wn,cardinal:dn,"cardinal-open":hn,"cardinal-closed":pn,monotone:Cn});eo.forEach(function(e,t){t.key=e,t.closed=/-closed$/.test(e)});var to=[0,2/3,1/3,0],no=[0,1/3,2/3,0],ro=[0,1/6,2/3,1/6];d3.svg.line.radial=function(){var e=sn(kn);return e.radius=e.x,delete e.x,e.angle=e.y,delete e.y,e},ln.reverse=cn,cn.reverse=ln,d3.svg.area=function(){return Ln(i)},d3.svg.area.radial=function(){var e=Ln(kn);return e.radius=e.x,delete e.x,e.innerRadius=e.x0,delete e.x0,e.outerRadius=e.x1,delete e.x1,e.angle=e.y,delete e.y,e.startAngle=e.y0,delete e.y0,e.endAngle=e.y1,delete e.y1,e},d3.svg.chord=function(){function e(e,u){var a=t(this,s,e,u),f=t(this,o,e,u);return"M"+a.p0+r(a.r,a.p1,a.a1-a.a0)+(n(a,f)?i(a.r,a.p1,a.r,a.p0):i(a.r,a.p1,f.r,f.p0)+r(f.r,f.p1,f.a1-f.a0)+i(f.r,f.p1,a.r,a.p0))+"Z"}function t(e,t,n,r){var i=t.call(e,n,r),s=a.call(e,i,r),o=f.call(e,i,r)+Ys,u=l.call(e,i,r)+Ys;return{r:s,a0:o,a1:u,p0:[s*Math.cos(o),s*Math.sin(o)],p1:[s*Math.cos(u),s*Math.sin(u)]}}function n(e,t){return e.a0==t.a0&&e.a1==t.a1}function r(e,t,n){return"A"+e+","+e+" 0 "+ +(n>Math.PI)+",1 "+t}function i(e,t,n,r){return"Q 0,0 "+r}var s=An,o=On,a=Mn,f=nn,l=rn;return e.radius=function(t){return arguments.length?(a=u(t),e):a},e.source=function(t){return arguments.length?(s=u(t),e):s},e.target=function(t){return arguments.length?(o=u(t),e):o},e.startAngle=function(t){return arguments.length?(f=u(t),e):f},e.endAngle=function(t){return arguments.length?(l=u(t),e):l},e},d3.svg.diagonal=function(){function e(e,i){var s=t.call(this,e,i),o=n.call(this,e,i),u=(s.y+o.y)/2,a=[s,{x:s.x,y:u},{x:o.x,y:u},o];return a=a.map(r),"M"+a[0]+"C"+a[1]+" "+a[2]+" "+a[3]}var t=An,n=On,r=Pn;return e.source=function(n){return arguments.length?(t=u(n),e):t},e.target=function(t){return arguments.length?(n=u(t),e):n},e.projection=function(t){return arguments.length?(r=t,e):r},e},d3.svg.diagonal.radial=function(){var e=d3.svg.diagonal(),t=Pn,n=e.projection;return e.projection=function(e){return arguments.length?n(Hn(t=e)):t},e},d3.svg.mouse=d3.mouse,d3.svg.touches=d3.touches,d3.svg.symbol=function(){function e(e,r){return(io.get(t.call(this,e,r))||Fn)(n.call(this,e,r))}var t=jn,n=Bn;return e.type=function(n){return arguments.length?(t=u(n),e):t},e.size=function(t){return arguments.length?(n=u(t),e):n},e};var io=d3.map({circle:Fn,cross:function(e){var t=Math.sqrt(e/5)/2;return"M"+ -3*t+","+ -t+"H"+ -t+"V"+ -3*t+"H"+t+"V"+ -t+"H"+3*t+"V"+t+"H"+t+"V"+3*t+"H"+ -t+"V"+t+"H"+ -3*t+"Z"},diamond:function(e){var t=Math.sqrt(e/(2*oo)),n=t*oo;return"M0,"+ -t+"L"+n+",0"+" 0,"+t+" "+ -n+",0"+"Z"},square:function(e){var t=Math.sqrt(e)/2;return"M"+ -t+","+ -t+"L"+t+","+ -t+" "+t+","+t+" "+ -t+","+t+"Z"},"triangle-down":function(e){var t=Math.sqrt(e/so),n=t*so/2;return"M0,"+n+"L"+t+","+ -n+" "+ -t+","+ -n+"Z"},"triangle-up":function(e){var t=Math.sqrt(e/so),n=t*so/2;return"M0,"+ -n+"L"+t+","+n+" "+ -t+","+n+"Z"}});d3.svg.symbolTypes=io.keys();var so=Math.sqrt(3),oo=Math.tan(30*Math.PI/180);d3.svg.axis=function(){function e(e){e.each(function(){var e=d3.select(this),c=a==null?t.ticks?t.ticks.apply(t,u):t.domain():a,h=f==null?t.tickFormat?t.tickFormat.apply(t,u):String:f,p=Rn(t,c,l),d=e.selectAll(".minor").data(p,String),v=d.enter().insert("line","g").attr("class","tick minor").style("opacity",1e-6),m=d3.transition(d.exit()).style("opacity",1e-6).remove(),g=d3.transition(d).style("opacity",1),y=e.selectAll("g").data(c,String),b=y.enter().insert("g","path").style("opacity",1e-6),w=d3.transition(y.exit()).style("opacity",1e-6).remove(),E=d3.transition(y).style("opacity",1),S,x=Dt(t),T=e.selectAll(".domain").data([0]),N=T.enter().append("path").attr("class","domain"),C=d3.transition(T),k=t.copy(),L=this.__chart__||k;this.__chart__=k,b.append("line").attr("class","tick"),b.append("text");var A=b.select("line"),O=E.select("line"),M=y.select("text").text(h),_=b.select("text"),D=E.select("text");switch(n){case"bottom":S=In,v.attr("y2",i),g.attr("x2",0).attr("y2",i),A.attr("y2",r),_.attr("y",Math.max(r,0)+o),O.attr("x2",0).attr("y2",r),D.attr("x",0).attr("y",Math.max(r,0)+o),M.attr("dy",".71em").attr("text-anchor","middle"),C.attr("d","M"+x[0]+","+s+"V0H"+x[1]+"V"+s);break;case"top":S=In,v.attr("y2",-i),g.attr("x2",0).attr("y2",-i),A.attr("y2",-r),_.attr("y",-(Math.max(r,0)+o)),O.attr("x2",0).attr("y2",-r),D.attr("x",0).attr("y",-(Math.max(r,0)+o)),M.attr("dy","0em").attr("text-anchor","middle"),C.attr("d","M"+x[0]+","+ -s+"V0H"+x[1]+"V"+ -s);break;case"left":S=qn,v.attr("x2",-i),g.attr("x2",-i).attr("y2",0),A.attr("x2",-r),_.attr("x",-(Math.max(r,0)+o)),O.attr("x2",-r).attr("y2",0),D.attr("x",-(Math.max(r,0)+o)).attr("y",0),M.attr("dy",".32em").attr("text-anchor","end"),C.attr("d","M"+ -s+","+x[0]+"H0V"+x[1]+"H"+ -s);break;case"right":S=qn,v.attr("x2",i),g.attr("x2",i).attr("y2",0),A.attr("x2",r),_.attr("x",Math.max(r,0)+o),O.attr("x2",r).attr("y2",0),D.attr("x",Math.max(r,0)+o).attr("y",0),M.attr("dy",".32em").attr("text-anchor","start"),C.attr("d","M"+s+","+x[0]+"H0V"+x[1]+"H"+s)}if(t.ticks)b.call(S,L),E.call(S,k),w.call(S,k),v.call(S,L),g.call(S,k),m.call(S,k);else{var P=k.rangeBand()/2,H=function(e){return k(e)+P};b.call(S,H),E.call(S,H)}})}var t=d3.scale.linear(),n="bottom",r=6,i=6,s=6,o=3,u=[10],a=null,f,l=0;return e.scale=function(n){return arguments.length?(t=n,e):t},e.orient=function(t){return arguments.length?(n=t,e):n},e.ticks=function(){return arguments.length?(u=arguments,e):u},e.tickValues=function(t){return arguments.length?(a=t,e):a},e.tickFormat=function(t){return arguments.length?(f=t,e):f},e.tickSize=function(t,n,o){if(!arguments.length)return r;var u=arguments.length-1;return r=+t,i=u>1?+n:r,s=u>0?+arguments[u]:r,e},e.tickPadding=function(t){return arguments.length?(o=+t,e):o},e.tickSubdivide=function(t){return arguments.length?(l=+t,e):l},e},d3.svg.brush=function(){function e(s){s.each(function(){var s=d3.select(this),f=s.selectAll(".background").data([0]),l=s.selectAll(".extent").data([0]),c=s.selectAll(".resize").data(a,String),h;s.style("pointer-events","all").on("mousedown.brush",i).on("touchstart.brush",i),f.enter().append("rect").attr("class","background").style("visibility","hidden").style("cursor","crosshair"),l.enter().append("rect").attr("class","extent").style("cursor","move"),c.enter().append("g").attr("class",function(e){return"resize "+e}).style("cursor",function(e){return uo[e]}).append("rect").attr("x",function(e){return/[ew]$/.test(e)?-3:null}).attr("y",function(e){return/^[ns]/.test(e)?-3:null}).attr("width",6).attr("height",6).style("visibility","hidden"),c.style("display",e.empty()?"none":null),c.exit().remove(),o&&(h=Dt(o),f.attr("x",h[0]).attr("width",h[1]-h[0]),n(s)),u&&(h=Dt(u),f.attr("y",h[0]).attr("height",h[1]-h[0]),r(s)),t(s)})}function t(e){e.selectAll(".resize").attr("transform",function(e){return"translate("+f[+/e$/.test(e)][0]+","+f[+/^s/.test(e)][1]+")"})}function n(e){e.select(".extent").attr("x",f[0][0]),e.selectAll(".extent,.n>rect,.s>rect").attr("width",f[1][0]-f[0][0])}function r(e){e.select(".extent").attr("y",f[0][1]),e.selectAll(".extent,.e>rect,.w>rect").attr("height",f[1][1]-f[0][1])}function i(){function i(){var e=d3.event.changedTouches;return e?d3.touches(v,e)[0]:d3.mouse(v)}function a(){d3.event.keyCode==32&&(S||(x=null,T[0]-=f[1][0],T[1]-=f[1][1],S=2),M())}function c(){d3.event.keyCode==32&&S==2&&(T[0]+=f[1][0],T[1]+=f[1][1],S=0,M())}function h(){var e=i(),s=!1;N&&(e[0]+=N[0],e[1]+=N[1]),S||(d3.event.altKey?(x||(x=[(f[0][0]+f[1][0])/2,(f[0][1]+f[1][1])/2]),T[0]=f[+(e[0]<x[0])][0],T[1]=f[+(e[1]<x[1])][1]):x=null),w&&p(e,o,0)&&(n(y),s=!0),E&&p(e,u,1)&&(r(y),s=!0),s&&(t(y),g({type:"brush",mode:S?"move":"resize"}))}function p(e,t,n){var r=Dt(t),i=r[0],s=r[1],o=T[n],u=f[1][n]-f[0][n],a,c;S&&(i-=o,s-=u+o),a=Math.max(i,Math.min(s,e[n])),S?c=(a+=o)+u:(x&&(o=Math.max(i,Math.min(s,2*x[n]-a))),o<a?(c=a,a=o):c=o);if(f[0][n]!==a||f[1][n]!==c)return l=null,f[0][n]=a,f[1][n]=c,!0}function d(){h(),y.style("pointer-events","all").selectAll(".resize").style("display",e.empty()?"none":null),d3.select("body").style("cursor",null),C.on("mousemove.brush",null).on("mouseup.brush",null).on("touchmove.brush",null).on("touchend.brush",null).on("keydown.brush",null).on("keyup.brush",null),g({type:"brushend"}),M()}var v=this,m=d3.select(d3.event.target),g=s.of(v,arguments),y=d3.select(v),b=m.datum(),w=!/^(n|s)$/.test(b)&&o,E=!/^(e|w)$/.test(b)&&u,S=m.classed("extent"),x,T=i(),N,C=d3.select(window).on("mousemove.brush",h).on("mouseup.brush",d).on("touchmove.brush",h).on("touchend.brush",d).on("keydown.brush",a).on("keyup.brush",c);if(S)T[0]=f[0][0]-T[0],T[1]=f[0][1]-T[1];else if(b){var k=+/w$/.test(b),L=+/^n/.test(b);N=[f[1-k][0]-T[0],f[1-L][1]-T[1]],T[0]=f[k][0],T[1]=f[L][1]}else d3.event.altKey&&(x=T.slice());y.style("pointer-events","none").selectAll(".resize").style("display",null),d3.select("body").style("cursor",m.style("cursor")),g({type:"brushstart"}),h(),M()}var s=D(e,"brushstart","brush","brushend"),o=null,u=null,a=ao[0],f=[[0,0],[0,0]],l;return e.x=function(t){return arguments.length?(o=t,a=ao[!o<<1|!u],e):o},e.y=function(t){return arguments.length?(u=t,a=ao[!o<<1|!u],e):u},e.extent=function(t){var n,r,i,s,a;return arguments.length?(l=[[0,0],[0,0]],o&&(n=t[0],r=t[1],u&&(n=n[0],r=r[0]),l[0][0]=n,l[1][0]=r,o.invert&&(n=o(n),r=o(r)),r<n&&(a=n,n=r,r=a),f[0][0]=n|0,f[1][0]=r|0),u&&(i=t[0],s=t[1],o&&(i=i[1],s=s[1]),l[0][1]=i,l[1][1]=s,u.invert&&(i=u(i),s=u(s)),s<i&&(a=i,i=s,s=a),f[0][1]=i|0,f[1][1]=s|0),e):(t=l||f,o&&(n=t[0][0],r=t[1][0],l||(n=f[0][0],r=f[1][0],o.invert&&(n=o.invert(n),r=o.invert(r)),r<n&&(a=n,n=r,r=a))),u&&(i=t[0][1],s=t[1][1],l||(i=f[0][1],s=f[1][1],u.invert&&(i=u.invert(i),s=u.invert(s)),s<i&&(a=i,i=s,s=a))),o&&u?[[n,i],[r,s]]:o?[n,r]:u&&[i,s])},e.clear=function(){return l=null,f[0][0]=f[0][1]=f[1][0]=f[1][1]=0,e},e.empty=function(){return o&&f[0][0]===f[1][0]||u&&f[0][1]===f[1][1]},d3.rebind(e,s,"on")};var uo={n:"ns-resize",e:"ew-resize",s:"ns-resize",w:"ew-resize",nw:"nwse-resize",ne:"nesw-resize",se:"nwse-resize",sw:"nesw-resize"},ao=[["n","e","s","w","nw","ne","se","sw"],["e","w"],["n","s"],[]];d3.behavior={},d3.behavior.drag=function(){function e(){this.on("mousedown.drag",t).on("touchstart.drag",t)}function t(){function e(){var e=o.parentNode;return f?d3.touches(e).filter(function(e){return e.identifier===f})[0]:d3.mouse(e)}function t(){if(!o.parentNode)return i();var t=e(),n=t[0]-c[0],r=t[1]-c[1];h|=n|r,c=t,M(),u({type:"drag",x:t[0]+l[0],y:t[1]+l[1],dx:n,dy:r})}function i(){u({type:"dragend"}),h&&(M(),d3.event.target===a&&p.on("click.drag",s,!0)),p.on(f?"touchmove.drag-"+f:"mousemove.drag",null).on(f?"touchend.drag-"+f:"mouseup.drag",null)}function s(){M(),p.on("click.drag",null)}var o=this,u=n.of(o,arguments),a=d3.event.target,f=d3.event.touches&&d3.event.changedTouches[0].identifier,l,c=e(),h=0,p=d3.select(window).on(f?"touchmove.drag-"+f:"mousemove.drag",t).on(f?"touchend.drag-"+f:"mouseup.drag",i,!0);r?(l=r.apply(o,arguments),l=[l.x-c[0],l.y-c[1]]):l=[0,0],f||M(),u({type:"dragstart"})}var n=D(e,"drag","dragstart","dragend"),r=null;return e.origin=function(t){return arguments.length?(r=t,e):r},d3.rebind(e,n,"on")},d3.behavior.zoom=function(){function e(){this.on("mousedown.zoom",o).on("mousewheel.zoom",u).on("mousemove.zoom",a).on("DOMMouseScroll.zoom",u).on("dblclick.zoom",f).on("touchstart.zoom",l).on("touchmove.zoom",c).on("touchend.zoom",l)}function t(e){return[(e[0]-h[0])/d,(e[1]-h[1])/d]}function n(e){return[e[0]*d+h[0],e[1]*d+h[1]]}function r(e){d=Math.max(m[0],Math.min(m[1],e))}function i(e,t){t=n(t),h[0]+=e[0]-t[0],h[1]+=e[1]-t[1]}function s(e){b&&b.domain(y.range().map(function(e){return(e-h[0])/d}).map(y.invert)),E&&E.domain(w.range().map(function(e){return(e-h[1])/d}).map(w.invert)),d3.event.preventDefault(),e({type:"zoom",scale:d,translate:h})}function o(){function e(){f=1,i(d3.mouse(o),c),s(u)}function n(){f&&M(),l.on("mousemove.zoom",null).on("mouseup.zoom",null),f&&d3.event.target===a&&l.on("click.zoom",r,!0)}function r(){M(),l.on("click.zoom",null)}var o=this,u=g.of(o,arguments),a=d3.event.target,f=0,l=d3.select(window).on("mousemove.zoom",e).on("mouseup.zoom",n),c=t(d3.mouse(o));window.focus(),M()}function u(){p||(p=t(d3.mouse(this))),r(Math.pow(2,Un()*.002)*d),i(d3.mouse(this),p),s(g.of(this,arguments))}function a(){p=null}function f(){var e=d3.mouse(this),n=t(e);r(d3.event.shiftKey?d/2:d*2),i(e,n),s(g.of(this,arguments))}function l(){var e=d3.touches(this),n=Date.now();v=d,p={},e.forEach(function(e){p[e.identifier]=t(e)}),M();if(e.length===1){if(n-S<500){var o=e[0],u=t(e[0]);r(d*2),i(o,u),s(g.of(this,arguments))}S=n}}function c(){var e=d3.touches(this),t=e[0],n=p[t.identifier];if(o=e[1]){var o,u=p[o.identifier];t=[(t[0]+o[0])/2,(t[1]+o[1])/2],n=[(n[0]+u[0])/2,(n[1]+u[1])/2],r(d3.event.scale*v)}i(t,n),S=null,s(g.of(this,arguments))}var h=[0,0],p,d=1,v,m=lo,g=D(e,"zoom"),y,b,w,E,S;return e.translate=function(t){return arguments.length?(h=t.map(Number),e):h},e.scale=function(t){return arguments.length?(d=+t,e):d},e.scaleExtent=function(t){return arguments.length?(m=t==null?lo:t.map(Number),e):m},e.x=function(t){return arguments.length?(b=t,y=t.copy(),e):b},e.y=function(t){return arguments.length?(E=t,w=t.copy(),e):E},d3.rebind(e,g,"on")};var fo,lo=[0,Infinity];d3.layout={},d3.layout.bundle=function(){return function(e){var t=[],n=-1,r=e.length;while(++n<r)t.push(zn(e[n]));return t}},d3.layout.chord=function(){function e(){var e={},n=[],c=d3.range(o),h=[],p,d,v,m,g;r=[],i=[],p=0,m=-1;while(++m<o){d=0,g=-1;while(++g<o)d+=s[m][g];n.push(d),h.push(d3.range(o)),p+=d}a&&c.sort(function(e,t){return a(n[e],n[t])}),f&&h.forEach(function(e,t){e.sort(function(e,n){return f(s[t][e],s[t][n])})}),p=(2*Math.PI-u*o)/p,d=0,m=-1;while(++m<o){v=d,g=-1;while(++g<o){var y=c[m],b=h[y][g],w=s[y][b],E=d,S=d+=w*p;e[y+"-"+b]={index:y,subindex:b,startAngle:E,endAngle:S,value:w}}i[y]={index:y,startAngle:v,endAngle:d,value:(d-v)/p},d+=u}m=-1;while(++m<o){g=m-1;while(++g<o){var x=e[m+"-"+g],T=e[g+"-"+m];(x.value||T.value)&&r.push(x.value<T.value?{source:T,target:x}:{source:x,target:T})}}l&&t()}function t(){r.sort(function(e,t){return l((e.source.value+e.target.value)/2,(t.source.value+t.target.value)/2)})}var n={},r,i,s,o,u=0,a,f,l;return n.matrix=function(e){return arguments.length?(o=(s=e)&&s.length,r=i=null,n):s},n.padding=function(e){return arguments.length?(u=e,r=i=null,n):u},n.sortGroups=function(e){return arguments.length?(a=e,r=i=null,n):a},n.sortSubgroups=function(e){return arguments.length?(f=e,r=null,n):f},n.sortChords=function(e){return arguments.length?(l=e,r&&t(),n):l},n.chords=function(){return r||e(),r},n.groups=function(){return i||e(),i},n},d3.layout.force=function(){function e(e){return function(t,n,r,i,s){if(t.point!==e){var o=t.cx-e.x,u=t.cy-e.y,a=1/Math.sqrt(o*o+u*u);if((i-n)*a<d){var f=t.charge*a*a;return e.px-=o*f,e.py-=u*f,!0}if(t.point&&isFinite(a)){var f=t.pointCharge*a*a;e.px-=o*f,e.py-=u*f}}return!t.charge}}function t(e){e.px=d3.event.x,e.py=d3.event.y,n.resume()}var n={},r=d3.dispatch("start","tick","end"),s=[1,1],o,a,f=.9,l=Gn,c=Yn,h=-30,p=.1,d=.8,v,m=[],g=[],y,b,w;return n.tick=function(){if((a*=.99)<.005)return r.end({type:"end",alpha:a=0}),!0;var t=m.length,n=g.length,i,o,u,l,c,d,v,E,S;for(o=0;o<n;++o){u=g[o],l=u.source,c=u.target,E=c.x-l.x,S=c.y-l.y;if(d=E*E+S*S)d=a*b[o]*((d=Math.sqrt(d))-y[o])/d,E*=d,S*=d,c.x-=E*(v=l.weight/(c.weight+l.weight)),c.y-=S*v,l.x+=E*(v=1-v),l.y+=S*v}if(v=a*p){E=s[0]/2,S=s[1]/2,o=-1;if(v)while(++o<t)u=m[o],u.x+=(E-u.x)*v,u.y+=(S-u.y)*v}if(h){Qn(i=d3.geom.quadtree(m),a,w),o=-1;while(++o<t)(u=m[o]).fixed||i.visit(e(u))}o=-1;while(++o<t)u=m[o],u.fixed?(u.x=u.px,u.y=u.py):(u.x-=(u.px-(u.px=u.x))*f,u.y-=(u.py-(u.py=u.y))*f);r.tick({type:"tick",alpha:a})},n.nodes=function(e){return arguments.length?(m=e,n):m},n.links=function(e){return arguments.length?(g=e,n):g},n.size=function(e){return arguments.length?(s=e,n):s},n.linkDistance=function(e){return arguments.length?(l=u(e),n):l},n.distance=n.linkDistance,n.linkStrength=function(e){return arguments.length?(c=u(e),n):c},n.friction=function(e){return arguments.length?(f=e,n):f},n.charge=function(e){return arguments.length?(h=typeof e=="function"?e:+e,n):h},n.gravity=function(e){return arguments.length?(p=e,n):p},n.theta=function(e){return arguments.length?(d=e,n):d},n.alpha=function(e){return arguments.length?(a?e>0?a=e:a=0:e>0&&(r.start({type:"start",alpha:a=e}),d3.timer(n.tick)),n):a},n.start=function(){function e(e,n){var i=t(r),s=-1,o=i.length,u;while(++s<o)if(!isNaN(u=i[s][e]))return u;return Math.random()*n}function t(){if(!p){p=[];for(i=0;i<o;++i)p[i]=[];for(i=0;i<u;++i){var e=g[i];p[e.source.index].push(e.target),p[e.target.index].push(e.source)}}return p[r]}var r,i,o=m.length,u=g.length,a=s[0],f=s[1],p,d;for(r=0;r<o;++r)(d=m[r]).index=r,d.weight=0;y=[],b=[];for(r=0;r<u;++r)d=g[r],typeof d.source=="number"&&(d.source=m[d.source]),typeof d.target=="number"&&(d.target=m[d.target]),y[r]=l.call(this,d,r),b[r]=c.call(this,d,r),++d.source.weight,++d.target.weight;for(r=0;r<o;++r)d=m[r],isNaN(d.x)&&(d.x=e("x",a)),isNaN(d.y)&&(d.y=e("y",f)),isNaN(d.px)&&(d.px=d.x),isNaN(d.py)&&(d.py=d.y);w=[];if(typeof h=="function")for(r=0;r<o;++r)w[r]=+h.call(this,m[r],r);else for(r=0;r<o;++r)w[r]=h;return n.resume()},n.resume=function(){return n.alpha(.1)},n.stop=function(){return n.alpha(0)},n.drag=function(){o||(o=d3.behavior.drag().origin(i).on("dragstart",Vn).on("drag",t).on("dragend",$n)),this.on("mouseover.force",Jn).on("mouseout.force",Kn).call(o)},d3.rebind(n,r,"on")},d3.layout.partition=function(){function e(t,n,r,i){var s=t.children;t.x=n,t.y=t.depth*i,t.dx=r,t.dy=i;if(s&&(u=s.length)){var o=-1,u,a,f;r=t.value?r/t.value:0;while(++o<u)e(a=s[o],n,f=a.value*r,i),n+=f}}function t(e){var n=e.children,r=0;if(n&&(s=n.length)){var i=-1,s;while(++i<s)r=Math.max(r,t(n[i]))}return 1+r}function n(n,s){var o=r.call(this,n,s);return e(o[0],0,i[0],i[1]/t(o[0])),o}var r=d3.layout.hierarchy(),i=[1,1];return n.size=function(e){return arguments.length?(i=e,n):i},lr(n,r)},d3.layout.pie=function(){function e(s,o){var u=s.map(function(n,r){return+t.call(e,n,r)}),a=+(typeof r=="function"?r.apply(this,arguments):r),f=((typeof i=="function"?i.apply(this,arguments):i)-r)/d3.sum(u),l=d3.range(s.length);n!=null&&l.sort(n===co?function(e,t){return u[t]-u[e]}:function(e,t){return n(s[e],s[t])});var c=[];return l.forEach(function(e){var t;c[e]={data:s[e],value:t=u[e],startAngle:a,endAngle:a+=t*f}}),c}var t=Number,n=co,r=0,i=2*Math.PI;return e.value=function(n){return arguments.length?(t=n,e):t},e.sort=function(t){return arguments.length?(n=t,e):n},e.startAngle=function(t){return arguments.length?(r=t,e):r},e.endAngle=function(t){return arguments.length?(i=t,e):i},e};var co={};d3.layout.stack=function(){function e(i,a){var f=i.map(function(n,r){return t.call(e,n,r)}),l=f.map(function(t,n){return t.map(function(t,n){return[o.call(e,t,n),u.call(e,t,n)]})}),c=n.call(e,l,a);f=d3.permute(f,c),l=d3.permute(l,c);var h=r.call(e,l,a),p=f.length,d=f[0].length,v,m,g;for(m=0;m<d;++m){s.call(e,f[0][m],g=h[m],l[0][m][1]);for(v=1;v<p;++v)s.call(e,f[v][m],g+=l[v-1][m][1],l[v][m][1])}return i}var t=i,n=nr,r=rr,s=tr,o=Zn,u=er;return e.values=function(n){return arguments.length?(t=n,e):t},e.order=function(t){return arguments.length?(n=typeof t=="function"?t:ho.get(t)||nr,e):n},e.offset=function(t){return arguments.length?(r=typeof t=="function"?t:po.get(t)||rr,e):r},e.x=function(t){return arguments.length?(o=t,e):o},e.y=function(t){return arguments.length?(u=t,e):u},e.out=function(t){return arguments.length?(s=t,e):s},e};var ho=d3.map({"inside-out":function(e){var t=e.length,n,r,i=e.map(ir),s=e.map(sr),o=d3.range(t).sort(function(e,t){return i[e]-i[t]}),u=0,a=0,f=[],l=[];for(n=0;n<t;++n)r=o[n],u<a?(u+=s[r],f.push(r)):(a+=s[r],l.push(r));return l.reverse().concat(f)},reverse:function(e){return d3.range(e.length).reverse()},"default":nr}),po=d3.map({silhouette:function(e){var t=e.length,n=e[0].length,r=[],i=0,s,o,u,a=[];for(o=0;o<n;++o){for(s=0,u=0;s<t;s++)u+=e[s][o][1];u>i&&(i=u),r.push(u)}for(o=0;o<n;++o)a[o]=(i-r[o])/2;return a},wiggle:function(e){var t=e.length,n=e[0],r=n.length,i=0,s,o,u,a,f,l,c,h,p,d=[];d[0]=h=p=0;for(o=1;o<r;++o){for(s=0,a=0;s<t;++s)a+=e[s][o][1];for(s=0,f=0,c=n[o][0]-n[o-1][0];s<t;++s){for(u=0,l=(e[s][o][1]-e[s][o-1][1])/(2*c);u<s;++u)l+=(e[u][o][1]-e[u][o-1][1])/c;f+=l*e[s][o][1]}d[o]=h-=a?f/a*c:0,h<p&&(p=h)}for(o=0;o<r;++o)d[o]-=p;return d},expand:function(e){var t=e.length,n=e[0].length,r=1/t,i,s,o,u=[];for(s=0;s<n;++s){for(i=0,o=0;i<t;i++)o+=e[i][s][1];if(o)for(i=0;i<t;i++)e[i][s][1]/=o;else for(i=0;i<t;i++)e[i][s][1]=r}for(s=0;s<n;++s)u[s]=0;return u},zero:rr});d3.layout.histogram=function(){function e(e,s){var o=[],u=e.map(n,this),a=r.call(this,u,s),f=i.call(this,a,u,s),l,s=-1,c=u.length,h=f.length-1,p=t?1:1/c,d;while(++s<h)l=o[s]=[],l.dx=f[s+1]-(l.x=f[s]),l.y=0;if(h>0){s=-1;while(++s<c)d=u[s],d>=a[0]&&d<=a[1]&&(l=o[d3.bisect(f,d,1,h)-1],l.y+=p,l.push(e[s]))}return o}var t=!0,n=Number,r=fr,i=ur;return e.value=function(t){return arguments.length?(n=t,e):n},e.range=function(t){return arguments.length?(r=u(t),e):r},e.bins=function(t){return arguments.length?(i=typeof t=="number"?function(e){return ar(e,t)}:u(t),e):i},e.frequency=function(n){return arguments.length?(t=!!n,e):t},e},d3.layout.hierarchy=function(){function e(t,o,u){var a=i.call(n,t,o),f=vo?t:{data:t};f.depth=o,u.push(f);if(a&&(c=a.length)){var l=-1,c,h=f.children=[],p=0,d=o+1,v;while(++l<c)v=e(a[l],d,u),v.parent=f,h.push(v),p+=v.value;r&&h.sort(r),s&&(f.value=p)}else s&&(f.value=+s.call(n,t,o)||0);return f}function t(e,r){var i=e.children,o=0;if(i&&(a=i.length)){var u=-1,a,f=r+1;while(++u<a)o+=t(i[u],f)}else s&&(o=+s.call(n,vo?e:e.data,r)||0);return s&&(e.value=o),o}function n(t){var n=[];return e(t,0,n),n}var r=pr,i=cr,s=hr;return n.sort=function(e){return arguments.length?(r=e,n):r},n.children=function(e){return arguments.length?(i=e,n):i},n.value=function(e){return arguments.length?(s=e,n):s},n.revalue=function(e){return t(e,0),e},n};var vo=!1;d3.layout.pack=function(){function e(e,i){var s=t.call(this,e,i),o=s[0];o.x=0,o.y=0,Hr(o,function(e){e.r=Math.sqrt(e.value)}),Hr(o,br);var u=r[0],a=r[1],f=Math.max(2*o.r/u,2*o.r/a);if(n>0){var l=n*f/2;Hr(o,function(e){e.r+=l}),Hr(o,br),Hr(o,function(e){e.r-=l}),f=Math.max(2*o.r/u,2*o.r/a)}return Sr(o,u/2,a/2,1/f),s}var t=d3.layout.hierarchy().sort(vr),n=0,r=[1,1];return e.size=function(t){return arguments.length?(r=t,e):r},e.padding=function(t){return arguments.length?(n=+t,e):n},lr(e,t)},d3.layout.cluster=function(){function e(e,i){var s=t.call(this,e,i),o=s[0],u,a=0,f,l;Hr(o,function(e){var t=e.children;t&&t.length?(e.x=Nr(t),e.y=Tr(t)):(e.x=u?a+=n(e,u):0,e.y=0,u=e)});var c=Cr(o),h=kr(o),p=c.x-n(c,h)/2,d=h.x+n(h,c)/2;return Hr(o,function(e){e.x=(e.x-p)/(d-p)*r[0],e.y=(1-(o.y?e.y/o.y:1))*r[1]}),s}var t=d3.layout.hierarchy().sort(null).value(null),n=Lr,r=[1,1];return e.separation=function(t){return arguments.length?(n=t,e):n},e.size=function(t){return arguments.length?(r=t,e):r},lr(e,t)},d3.layout.tree=function(){function e(e,i){function s(e,t){var r=e.children,i=e._tree;if(r&&(o=r.length)){var o,a=r[0],f,l=a,c,h=-1;while(++h<o)c=r[h],s(c,f),l=u(c,f,l),f=c;Br(e);var p=.5*(a._tree.prelim+c._tree.prelim);t?(i.prelim=t._tree.prelim+n(e,t),i.mod=i.prelim-p):i.prelim=p}else t&&(i.prelim=t._tree.prelim+n(e,t))}function o(e,t){e.x=e._tree.prelim+t;var n=e.children;if(n&&(i=n.length)){var r=-1,i;t+=e._tree.mod;while(++r<i)o(n[r],t)}}function u(e,t,r){if(t){var i=e,s=e,o=t,u=e.parent.children[0],a=i._tree.mod,f=s._tree.mod,l=o._tree.mod,c=u._tree.mod,h;while(o=Or(o),i=Ar(i),o&&i)u=Ar(u),s=Or(s),s._tree.ancestor=e,h=o._tree.prelim+l-i._tree.prelim-a+n(o,i),h>0&&(jr(Fr(o,e,r),e,h),a+=h,f+=h),l+=o._tree.mod,a+=i._tree.mod,c+=u._tree.mod,f+=s._tree.mod;o&&!Or(s)&&(s._tree.thread=o,s._tree.mod+=l-f),i&&!Ar(u)&&(u._tree.thread=i,u._tree.mod+=a-c,r=e)}return r}var a=t.call(this,e,i),f=a[0];Hr(f,function(e,t){e._tree={ancestor:e,prelim:0,mod:0,change:0,shift:0,number:t?t._tree.number+1:0}}),s(f),o(f,-f._tree.prelim);var l=Mr(f,Dr),c=Mr(f,_r),h=Mr(f,Pr),p=l.x-n(l,c)/2,d=c.x+n(c,l)/2,v=h.depth||1;return Hr(f,function(e){e.x=(e.x-p)/(d-p)*r[0],e.y=e.depth/v*r[1],delete e._tree}),a}var t=d3.layout.hierarchy().sort(null).value(null),n=Lr,r=[1,1];return e.separation=function(t){return arguments.length?(n=t,e):n},e.size=function(t){return arguments.length?(r=t,e):r},lr(e,t)},d3.layout.treemap=function(){function e(e,t){var n=-1,r=e.length,i,s;while(++n<r)s=(i=e[n]).value*(t<0?0:t),i.area=isNaN(s)||s<=0?0:s}function t(n){var s=n.children;if(s&&s.length){var o=l(n),u=[],a=s.slice(),f,c=Infinity,h,p=Math.min(o.dx,o.dy),d;e(a,o.dx*o.dy/n.value),u.area=0;while((d=a.length)>0)u.push(f=a[d-1]),u.area+=f.area,(h=r(u,p))<=c?(a.pop(),c=h):(u.area-=u.pop().area,i(u,p,o,!1),p=Math.min(o.dx,o.dy),u.length=u.area=0,c=Infinity);u.length&&(i(u,p,o,!0),u.length=u.area=0),s.forEach(t)}}function n(t){var r=t.children;if(r&&r.length){var s=l(t),o=r.slice(),u,a=[];e(o,s.dx*s.dy/t.value),a.area=0;while(u=o.pop())a.push(u),a.area+=u.area,u.z!=null&&(i(a,u.z?s.dx:s.dy,s,!o.length),a.length=a.area=0);r.forEach(n)}}function r(e,t){var n=e.area,r,i=0,s=Infinity,o=-1,u=e.length;while(++o<u){if(!(r=e[o].area))continue;r<s&&(s=r),r>i&&(i=r)}return n*=n,t*=t,n?Math.max(t*i*p/n,n/(t*s*p)):Infinity}function i(e,t,n,r){var i=-1,s=e.length,o=n.x,a=n.y,f=t?u(e.area/t):0,l;if(t==n.dx){if(r||f>n.dy)f=n.dy;while(++i<s)l=e[i],l.x=o,l.y=a,l.dy=f,o+=l.dx=Math.min(n.x+n.dx-o,f?u(l.area/f):0);l.z=!0,l.dx+=n.x+n.dx-o,n.y+=f,n.dy-=f}else{if(r||f>n.dx)f=n.dx;while(++i<s)l=e[i],l.x=o,l.y=a,l.dx=f,a+=l.dy=Math.min(n.y+n.dy-a,f?u(l.area/f):0);l.z=!1,l.dy+=n.y+n.dy-a,n.x+=f,n.dx-=f}}function s(r){var i=h||o(r),s=i[0];return s.x=0,s.y=0,s.dx=a[0],s.dy=a[1],h&&o.revalue(s),e([s],s.dx*s.dy/s.value),(h?n:t)(s),c&&(h=i),i}var o=d3.layout.hierarchy(),u=Math.round,a=[1,1],f=null,l=Ir,c=!1,h,p=.5*(1+Math.sqrt(5));return s.size=function(e){return arguments.length?(a=e,s):a},s.padding=function(e){function t(t){var n=e.call(s,t,t.depth);return n==null?Ir(t):qr(t,typeof n=="number"?[n,n,n,n]:n)}function n(t){return qr(t,e)}if(!arguments.length)return f;var r;return l=(f=e)==null?Ir:(r=typeof e)==="function"?t:r==="number"?(e=[e,e,e,e],n):n,s},s.round=function(e){return arguments.length?(u=e?Math.round:Number,s):u!=Number},s.sticky=function(e){return arguments.length?(c=e,h=null,s):c},s.ratio=function(e){return arguments.length?(p=e,s):p},lr(s,o)},d3.csv=Rr(",","text/csv"),d3.tsv=Rr(" ","text/tab-separated-values"),d3.geo={};var mo=Math.PI/180;d3.geo.azimuthal=function(){function e(e){var n=e[0]*mo-s,o=e[1]*mo,f=Math.cos(n),l=Math.sin(n),c=Math.cos(o),h=Math.sin(o),p=t!=="orthographic"?a*h+u*c*f:null,d,v=t==="stereographic"?1/(1+p):t==="gnomonic"?1/p:t==="equidistant"?(d=Math.acos(p),d?d/Math.sin(d):0):t==="equalarea"?Math.sqrt(2/(1+p)):1,m=v*c*l,g=v*(a*c*f-u*h);return[r*m+i[0],r*g+i[1]]}var t="orthographic",n,r=200,i=[480,250],s,o,u,a;return e.invert=function(e){var n=(e[0]-i[0])/r,o=(e[1]-i[1])/r,f=Math.sqrt(n*n+o*o),l=t==="stereographic"?2*Math.atan(f):t==="gnomonic"?Math.atan(f):t==="equidistant"?f:t==="equalarea"?2*Math.asin(.5*f):Math.asin(f),c=Math.sin(l),h=Math.cos(l);return[(s+Math.atan2(n*c,f*u*h+o*a*c))/mo,Math.asin(h*a-(f?o*c*u/f:0))/mo]},e.mode=function(n){return arguments.length?(t=n+"",e):t},e.origin=function(t){return arguments.length?(n=t,s=n[0]*mo,o=n[1]*mo,u=Math.cos(o),a=Math.sin(o),e):n},e.scale=function(t){return arguments.length?(r=+t,e):r},e.translate=function(t){return arguments.length?(i=[+t[0],+t[1]],e):i},e.origin([0,0])},d3.geo.albers=function(){function e(e){var t=u*(mo*e[0]-o),n=Math.sqrt(a-2*u*Math.sin(mo*e[1]))/u;return[i*n*Math.sin(t)+s[0],i*(n*Math.cos(t)-f)+s[1]]}function t(){var t=mo*r[0],i=mo*r[1],s=mo*n[1],l=Math.sin(t),c=Math.cos(t);return o=mo*n[0],u=.5*(l+Math.sin(i)),a=c*c+2*u*l,f=Math.sqrt(a-2*u*Math.sin(s))/u,e}var n=[-98,38],r=[29.5,45.5],i=1e3,s=[480,250],o,u,a,f;return e.invert=function(e){var t=(e[0]-s[0])/i,n=(e[1]-s[1])/i,r=f+n,l=Math.atan2(t,r),c=Math.sqrt(t*t+r*r);return[(o+l/u)/mo,Math.asin((a-c*c*u*u)/(2*u))/mo]},e.origin=function(e){return arguments.length?(n=[+e[0],+e[1]],t()):n},e.parallels=function(e){return arguments.length?(r=[+e[0],+e[1]],t()):r},e.scale=function(t){return arguments.length?(i=+t,e):i},e.translate=function(t){return arguments.length?(s=[+t[0],+t[1]],e):s},t()},d3.geo.albersUsa=function(){function e(e){var s=e[0],o=e[1];return(o>50?n:s<-140?r:o<21?i:t)(e)}var t=d3.geo.albers(),n=d3.geo.albers().origin([-160,60]).parallels([55,65]),r=d3.geo.albers().origin([-160,20]).parallels([8,18]),i=d3.geo.albers().origin([-60,10]).parallels([8,18]);return e.scale=function(s){return arguments.length?(t.scale(s),n.scale(s*.6),r.scale(s),i.scale(s*1.5),e.translate(t.translate())):t.scale()},e.translate=function(s){if(!arguments.length)return t.translate();var o=t.scale()/1e3,u=s[0],a=s[1];return t.translate(s),n.translate([u-400*o,a+170*o]),r.translate([u-190*o,a+200*o]),i.translate([u+580*o,a+430*o]),e},e.scale(t.scale())},d3.geo.bonne=function(){function e(e){var u=e[0]*mo-r,a=e[1]*mo-i;if(s){var f=o+s-a,l=u*Math.cos(a)/f;u=f*Math.sin(l),a=f*Math.cos(l)-o}else u*=Math.cos(a),a*=-1;return[t*u+n[0],t*a+n[1]]}var t=200,n=[480,250],r,i,s,o;return e.invert=function(e){var i=(e[0]-n[0])/t,u=(e[1]-n[1])/t;if(s){var a=o+u,f=Math.sqrt(i*i+a*a);u=o+s-f,i=r+f*Math.atan2(i,a)/Math.cos(u)}else u*=-1,i/=Math.cos(u);return[i/mo,u/mo]},e.parallel=function(t){return arguments.length?(o=1/Math.tan(s=t*mo),e):s/mo},e.origin=function(t){return arguments.length?(r=t[0]*mo,i=t[1]*mo,e):[r/mo,i/mo]},e.scale=function( -n){return arguments.length?(t=+n,e):t},e.translate=function(t){return arguments.length?(n=[+t[0],+t[1]],e):n},e.origin([0,0]).parallel(45)},d3.geo.equirectangular=function(){function e(e){var r=e[0]/360,i=-e[1]/360;return[t*r+n[0],t*i+n[1]]}var t=500,n=[480,250];return e.invert=function(e){var r=(e[0]-n[0])/t,i=(e[1]-n[1])/t;return[360*r,-360*i]},e.scale=function(n){return arguments.length?(t=+n,e):t},e.translate=function(t){return arguments.length?(n=[+t[0],+t[1]],e):n},e},d3.geo.mercator=function(){function e(e){var r=e[0]/360,i=-(Math.log(Math.tan(Math.PI/4+e[1]*mo/2))/mo)/360;return[t*r+n[0],t*Math.max(-0.5,Math.min(.5,i))+n[1]]}var t=500,n=[480,250];return e.invert=function(e){var r=(e[0]-n[0])/t,i=(e[1]-n[1])/t;return[360*r,2*Math.atan(Math.exp(-360*i*mo))/mo-90]},e.scale=function(n){return arguments.length?(t=+n,e):t},e.translate=function(t){return arguments.length?(n=[+t[0],+t[1]],e):n},e},d3.geo.path=function(){function e(e,t){typeof s=="function"&&(o=zr(s.apply(this,arguments))),f(e);var n=a.length?a.join(""):null;return a=[],n}function t(e){return u(e).join(",")}function n(e){var t=i(e[0]),n=0,r=e.length;while(++n<r)t-=i(e[n]);return t}function r(e){var t=d3.geom.polygon(e[0].map(u)),n=t.area(),r=t.centroid(n<0?(n*=-1,1):-1),i=r[0],s=r[1],o=n,a=0,f=e.length;while(++a<f)t=d3.geom.polygon(e[a].map(u)),n=t.area(),r=t.centroid(n<0?(n*=-1,1):-1),i-=r[0],s-=r[1],o-=n;return[i,s,6*o]}function i(e){return Math.abs(d3.geom.polygon(e.map(u)).area())}var s=4.5,o=zr(s),u=d3.geo.albersUsa(),a=[],f=Ur({FeatureCollection:function(e){var t=e.features,n=-1,r=t.length;while(++n<r)a.push(f(t[n].geometry))},Feature:function(e){f(e.geometry)},Point:function(e){a.push("M",t(e.coordinates),o)},MultiPoint:function(e){var n=e.coordinates,r=-1,i=n.length;while(++r<i)a.push("M",t(n[r]),o)},LineString:function(e){var n=e.coordinates,r=-1,i=n.length;a.push("M");while(++r<i)a.push(t(n[r]),"L");a.pop()},MultiLineString:function(e){var n=e.coordinates,r=-1,i=n.length,s,o,u;while(++r<i){s=n[r],o=-1,u=s.length,a.push("M");while(++o<u)a.push(t(s[o]),"L");a.pop()}},Polygon:function(e){var n=e.coordinates,r=-1,i=n.length,s,o,u;while(++r<i){s=n[r],o=-1;if((u=s.length-1)>0){a.push("M");while(++o<u)a.push(t(s[o]),"L");a[a.length-1]="Z"}}},MultiPolygon:function(e){var n=e.coordinates,r=-1,i=n.length,s,o,u,f,l,c;while(++r<i){s=n[r],o=-1,u=s.length;while(++o<u){f=s[o],l=-1;if((c=f.length-1)>0){a.push("M");while(++l<c)a.push(t(f[l]),"L");a[a.length-1]="Z"}}}},GeometryCollection:function(e){var t=e.geometries,n=-1,r=t.length;while(++n<r)a.push(f(t[n]))}}),l=e.area=Ur({FeatureCollection:function(e){var t=0,n=e.features,r=-1,i=n.length;while(++r<i)t+=l(n[r]);return t},Feature:function(e){return l(e.geometry)},Polygon:function(e){return n(e.coordinates)},MultiPolygon:function(e){var t=0,r=e.coordinates,i=-1,s=r.length;while(++i<s)t+=n(r[i]);return t},GeometryCollection:function(e){var t=0,n=e.geometries,r=-1,i=n.length;while(++r<i)t+=l(n[r]);return t}},0),c=e.centroid=Ur({Feature:function(e){return c(e.geometry)},Polygon:function(e){var t=r(e.coordinates);return[t[0]/t[2],t[1]/t[2]]},MultiPolygon:function(e){var t=0,n=e.coordinates,i,s=0,o=0,u=0,a=-1,f=n.length;while(++a<f)i=r(n[a]),s+=i[0],o+=i[1],u+=i[2];return[s/u,o/u]}});return e.projection=function(t){return u=t,e},e.pointRadius=function(t){return typeof t=="function"?s=t:(s=+t,o=zr(s)),e},e},d3.geo.bounds=function(e){var t=Infinity,n=Infinity,r=-Infinity,i=-Infinity;return Wr(e,function(e,s){e<t&&(t=e),e>r&&(r=e),s<n&&(n=s),s>i&&(i=s)}),[[t,n],[r,i]]};var go={Feature:Xr,FeatureCollection:Vr,GeometryCollection:$r,LineString:Jr,MultiLineString:Kr,MultiPoint:Jr,MultiPolygon:Qr,Point:Gr,Polygon:Yr};d3.geo.circle=function(){function e(){}function t(e){return a.distance(e)<u}function n(e){var t=-1,n=e.length,i=[],s,o,f,l,c;while(++t<n)c=a.distance(f=e[t]),c<u?(o&&i.push(ni(o,f)((l-u)/(l-c))),i.push(f),s=o=null):(o=f,!s&&i.length&&(i.push(ni(i[i.length-1],o)((u-l)/(c-l))),s=o)),l=c;return s=e[0],o=i[0],o&&f[0]===s[0]&&f[1]===s[1]&&(f[0]!==o[0]||f[1]!==o[1])&&i.push(o),r(i)}function r(e){var t=0,n=e.length,r,i,s=n?[e[0]]:e,o,u=a.source();while(++t<n){o=a.source(e[t-1])(e[t]).coordinates;for(r=0,i=o.length;++r<i;)s.push(o[r])}return a.source(u),s}var s=[0,0],o=89.99,u=o*mo,a=d3.geo.greatArc().source(s).target(i);e.clip=function(e){return typeof s=="function"&&a.source(s.apply(this,arguments)),f(e)||null};var f=Ur({FeatureCollection:function(e){var t=e.features.map(f).filter(i);return t&&(e=Object.create(e),e.features=t,e)},Feature:function(e){var t=f(e.geometry);return t&&(e=Object.create(e),e.geometry=t,e)},Point:function(e){return t(e.coordinates)&&e},MultiPoint:function(e){var n=e.coordinates.filter(t);return n.length&&{type:e.type,coordinates:n}},LineString:function(e){var t=n(e.coordinates);return t.length&&(e=Object.create(e),e.coordinates=t,e)},MultiLineString:function(e){var t=e.coordinates.map(n).filter(function(e){return e.length});return t.length&&(e=Object.create(e),e.coordinates=t,e)},Polygon:function(e){var t=e.coordinates.map(n);return t[0].length&&(e=Object.create(e),e.coordinates=t,e)},MultiPolygon:function(e){var t=e.coordinates.map(function(e){return e.map(n)}).filter(function(e){return e[0].length});return t.length&&(e=Object.create(e),e.coordinates=t,e)},GeometryCollection:function(e){var t=e.geometries.map(f).filter(i);return t.length&&(e=Object.create(e),e.geometries=t,e)}});return e.origin=function(t){return arguments.length?(s=t,typeof s!="function"&&a.source(s),e):s},e.angle=function(t){return arguments.length?(u=(o=+t)*mo,e):o},d3.rebind(e,a,"precision")},d3.geo.greatArc=function(){function e(){var t=e.distance.apply(this,arguments),r=0,u=s/t,a=[n];while((r+=u)<1)a.push(o(r));return a.push(i),{type:"LineString",coordinates:a}}var t=Zr,n,r=ei,i,s=6*mo,o=ti();return e.distance=function(){return typeof t=="function"&&o.source(n=t.apply(this,arguments)),typeof r=="function"&&o.target(i=r.apply(this,arguments)),o.distance()},e.source=function(r){return arguments.length?(t=r,typeof t!="function"&&o.source(n=t),e):t},e.target=function(t){return arguments.length?(r=t,typeof r!="function"&&o.target(i=r),e):r},e.precision=function(t){return arguments.length?(s=t*mo,e):s/mo},e},d3.geo.greatCircle=d3.geo.circle,d3.geom={},d3.geom.contour=function(e,t){var n=t||ri(e),r=[],i=n[0],s=n[1],o=0,u=0,a=NaN,f=NaN,l=0;do l=0,e(i-1,s-1)&&(l+=1),e(i,s-1)&&(l+=2),e(i-1,s)&&(l+=4),e(i,s)&&(l+=8),l===6?(o=f===-1?-1:1,u=0):l===9?(o=0,u=a===1?-1:1):(o=yo[l],u=bo[l]),o!=a&&u!=f&&(r.push([i,s]),a=o,f=u),i+=o,s+=u;while(n[0]!=i||n[1]!=s);return r};var yo=[1,0,1,1,-1,0,-1,1,0,0,0,0,-1,0,-1,NaN],bo=[0,-1,0,0,0,-1,0,0,1,-1,1,1,0,-1,0,NaN];d3.geom.hull=function(e){if(e.length<3)return[];var t=e.length,n=t-1,r=[],i=[],s,o,u=0,a,f,l,c,h,p,d,v;for(s=1;s<t;++s)e[s][1]<e[u][1]?u=s:e[s][1]==e[u][1]&&(u=e[s][0]<e[u][0]?s:u);for(s=0;s<t;++s){if(s===u)continue;f=e[s][1]-e[u][1],a=e[s][0]-e[u][0],r.push({angle:Math.atan2(f,a),index:s})}r.sort(function(e,t){return e.angle-t.angle}),d=r[0].angle,p=r[0].index,h=0;for(s=1;s<n;++s)o=r[s].index,d==r[s].angle?(a=e[p][0]-e[u][0],f=e[p][1]-e[u][1],l=e[o][0]-e[u][0],c=e[o][1]-e[u][1],a*a+f*f>=l*l+c*c?r[s].index=-1:(r[h].index=-1,d=r[s].angle,h=s,p=o)):(d=r[s].angle,h=s,p=o);i.push(u);for(s=0,o=0;s<2;++o)r[o].index!==-1&&(i.push(r[o].index),s++);v=i.length;for(;o<n;++o){if(r[o].index===-1)continue;while(!ii(i[v-2],i[v-1],r[o].index,e))--v;i[v++]=r[o].index}var m=[];for(s=0;s<v;++s)m.push(e[i[s]]);return m},d3.geom.polygon=function(e){return e.area=function(){var t=0,n=e.length,r=e[n-1][0]*e[0][1],i=e[n-1][1]*e[0][0];while(++t<n)r+=e[t-1][0]*e[t][1],i+=e[t-1][1]*e[t][0];return(i-r)*.5},e.centroid=function(t){var n=-1,r=e.length,i=0,s=0,o,u=e[r-1],a;arguments.length||(t=-1/(6*e.area()));while(++n<r)o=u,u=e[n],a=o[0]*u[1]-u[0]*o[1],i+=(o[0]+u[0])*a,s+=(o[1]+u[1])*a;return[i*t,s*t]},e.clip=function(t){var n,r=-1,i=e.length,s,o,u=e[i-1],a,f,l;while(++r<i){n=t.slice(),t.length=0,a=e[r],f=n[(o=n.length)-1],s=-1;while(++s<o)l=n[s],si(l,u,a)?(si(f,u,a)||t.push(oi(f,l,u,a)),t.push(l)):si(f,u,a)&&t.push(oi(f,l,u,a)),f=l;u=a}return t},e},d3.geom.voronoi=function(e){var t=e.map(function(){return[]});return ui(e,function(e){var n,r,i,s,o,u;e.a===1&&e.b>=0?(n=e.ep.r,r=e.ep.l):(n=e.ep.l,r=e.ep.r),e.a===1?(o=n?n.y:-1e6,i=e.c-e.b*o,u=r?r.y:1e6,s=e.c-e.b*u):(i=n?n.x:-1e6,o=e.c-e.a*i,s=r?r.x:1e6,u=e.c-e.a*s);var a=[i,o],f=[s,u];t[e.region.l.index].push(a,f),t[e.region.r.index].push(a,f)}),t.map(function(t,n){var r=e[n][0],i=e[n][1];return t.forEach(function(e){e.angle=Math.atan2(e[0]-r,e[1]-i)}),t.sort(function(e,t){return e.angle-t.angle}).filter(function(e,n){return!n||e.angle-t[n-1].angle>1e-10})})};var wo={l:"r",r:"l"};d3.geom.delaunay=function(e){var t=e.map(function(){return[]}),n=[];return ui(e,function(n){t[n.region.l.index].push(e[n.region.r.index])}),t.forEach(function(t,r){var i=e[r],s=i[0],o=i[1];t.forEach(function(e){e.angle=Math.atan2(e[0]-s,e[1]-o)}),t.sort(function(e,t){return e.angle-t.angle});for(var u=0,a=t.length-1;u<a;u++)n.push([i,t[u],t[u+1]])}),n},d3.geom.quadtree=function(e,t,n,r,i){function s(e,t,n,r,i,s){if(isNaN(t.x)||isNaN(t.y))return;if(e.leaf){var u=e.point;u?Math.abs(u.x-t.x)+Math.abs(u.y-t.y)<.01?o(e,t,n,r,i,s):(e.point=null,o(e,u,n,r,i,s),o(e,t,n,r,i,s)):e.point=t}else o(e,t,n,r,i,s)}function o(e,t,n,r,i,o){var u=(n+i)*.5,a=(r+o)*.5,f=t.x>=u,l=t.y>=a,c=(l<<1)+f;e.leaf=!1,e=e.nodes[c]||(e.nodes[c]=ai()),f?n=u:i=u,l?r=a:o=a,s(e,t,n,r,i,o)}var u,a=-1,f=e.length;f&&isNaN(e[0].x)&&(e=e.map(li));if(arguments.length<5)if(arguments.length===3)i=r=n,n=t;else{t=n=Infinity,r=i=-Infinity;while(++a<f)u=e[a],u.x<t&&(t=u.x),u.y<n&&(n=u.y),u.x>r&&(r=u.x),u.y>i&&(i=u.y);var l=r-t,c=i-n;l>c?i=n+l:r=t+c}var h=ai();return h.add=function(e){s(h,e,t,n,r,i)},h.visit=function(e){fi(e,h,t,n,r,i)},e.forEach(h.add),h},d3.time={};var Eo=Date,So=["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"];ci.prototype={getDate:function(){return this._.getUTCDate()},getDay:function(){return this._.getUTCDay()},getFullYear:function(){return this._.getUTCFullYear()},getHours:function(){return this._.getUTCHours()},getMilliseconds:function(){return this._.getUTCMilliseconds()},getMinutes:function(){return this._.getUTCMinutes()},getMonth:function(){return this._.getUTCMonth()},getSeconds:function(){return this._.getUTCSeconds()},getTime:function(){return this._.getTime()},getTimezoneOffset:function(){return 0},valueOf:function(){return this._.valueOf()},setDate:function(){xo.setUTCDate.apply(this._,arguments)},setDay:function(){xo.setUTCDay.apply(this._,arguments)},setFullYear:function(){xo.setUTCFullYear.apply(this._,arguments)},setHours:function(){xo.setUTCHours.apply(this._,arguments)},setMilliseconds:function(){xo.setUTCMilliseconds.apply(this._,arguments)},setMinutes:function(){xo.setUTCMinutes.apply(this._,arguments)},setMonth:function(){xo.setUTCMonth.apply(this._,arguments)},setSeconds:function(){xo.setUTCSeconds.apply(this._,arguments)},setTime:function(){xo.setTime.apply(this._,arguments)}};var xo=Date.prototype,To="%a %b %e %H:%M:%S %Y",No="%m/%d/%y",Co="%H:%M:%S",ko=So,Lo=ko.map(hi),Ao=["January","February","March","April","May","June","July","August","September","October","November","December"],Oo=Ao.map(hi);d3.time.format=function(e){function t(t){var r=[],i=-1,s=0,o,u;while(++i<n)e.charCodeAt(i)==37&&(r.push(e.substring(s,i),(u=Ro[o=e.charAt(++i)])?u(t):o),s=i+1);return r.push(e.substring(s,i)),r.join("")}var n=e.length;return t.parse=function(t){var n={y:1900,m:0,d:1,H:0,M:0,S:0,L:0},r=pi(n,e,t,0);if(r!=t.length)return null;"p"in n&&(n.H=n.H%12+n.p*12);var i=new Eo;return i.setFullYear(n.y,n.m,n.d),i.setHours(n.H,n.M,n.S,n.L),i},t.toString=function(){return e},t};var Mo=d3.format("02d"),_o=d3.format("03d"),Do=d3.format("04d"),Po=d3.format("2d"),Ho=di(ko),Bo=di(Lo),jo=di(Ao),Fo=vi(Ao),Io=di(Oo),qo=vi(Oo),Ro={a:function(e){return Lo[e.getDay()]},A:function(e){return ko[e.getDay()]},b:function(e){return Oo[e.getMonth()]},B:function(e){return Ao[e.getMonth()]},c:d3.time.format(To),d:function(e){return Mo(e.getDate())},e:function(e){return Po(e.getDate())},H:function(e){return Mo(e.getHours())},I:function(e){return Mo(e.getHours()%12||12)},j:function(e){return _o(1+d3.time.dayOfYear(e))},L:function(e){return _o(e.getMilliseconds())},m:function(e){return Mo(e.getMonth()+1)},M:function(e){return Mo(e.getMinutes())},p:function(e){return e.getHours()>=12?"PM":"AM"},S:function(e){return Mo(e.getSeconds())},U:function(e){return Mo(d3.time.sundayOfYear(e))},w:function(e){return e.getDay()},W:function(e){return Mo(d3.time.mondayOfYear(e))},x:d3.time.format(No),X:d3.time.format(Co),y:function(e){return Mo(e.getFullYear()%100)},Y:function(e){return Do(e.getFullYear()%1e4)},Z:Di,"%":function(e){return"%"}},Uo={a:mi,A:gi,b:yi,B:bi,c:wi,d:ki,e:ki,H:Li,I:Li,L:Mi,m:Ci,M:Ai,p:_i,S:Oi,x:Ei,X:Si,y:Ti,Y:xi},zo=/^\s*\d+/,Wo=d3.map({am:0,pm:1});d3.time.format.utc=function(e){function t(e){try{Eo=ci;var t=new Eo;return t._=e,n(t)}finally{Eo=Date}}var n=d3.time.format(e);return t.parse=function(e){try{Eo=ci;var t=n.parse(e);return t&&t._}finally{Eo=Date}},t.toString=n.toString,t};var Xo=d3.time.format.utc("%Y-%m-%dT%H:%M:%S.%LZ");d3.time.format.iso=Date.prototype.toISOString?Pi:Xo,Pi.parse=function(e){var t=new Date(e);return isNaN(t)?null:t},Pi.toString=Xo.toString,d3.time.second=Hi(function(e){return new Eo(Math.floor(e/1e3)*1e3)},function(e,t){e.setTime(e.getTime()+Math.floor(t)*1e3)},function(e){return e.getSeconds()}),d3.time.seconds=d3.time.second.range,d3.time.seconds.utc=d3.time.second.utc.range,d3.time.minute=Hi(function(e){return new Eo(Math.floor(e/6e4)*6e4)},function(e,t){e.setTime(e.getTime()+Math.floor(t)*6e4)},function(e){return e.getMinutes()}),d3.time.minutes=d3.time.minute.range,d3.time.minutes.utc=d3.time.minute.utc.range,d3.time.hour=Hi(function(e){var t=e.getTimezoneOffset()/60;return new Eo((Math.floor(e/36e5-t)+t)*36e5)},function(e,t){e.setTime(e.getTime()+Math.floor(t)*36e5)},function(e){return e.getHours()}),d3.time.hours=d3.time.hour.range,d3.time.hours.utc=d3.time.hour.utc.range,d3.time.day=Hi(function(e){var t=new Eo(1970,0);return t.setFullYear(e.getFullYear(),e.getMonth(),e.getDate()),t},function(e,t){e.setDate(e.getDate()+t)},function(e){return e.getDate()-1}),d3.time.days=d3.time.day.range,d3.time.days.utc=d3.time.day.utc.range,d3.time.dayOfYear=function(e){var t=d3.time.year(e);return Math.floor((e-t-(e.getTimezoneOffset()-t.getTimezoneOffset())*6e4)/864e5)},So.forEach(function(e,t){e=e.toLowerCase(),t=7-t;var n=d3.time[e]=Hi(function(e){return(e=d3.time.day(e)).setDate(e.getDate()-(e.getDay()+t)%7),e},function(e,t){e.setDate(e.getDate()+Math.floor(t)*7)},function(e){var n=d3.time.year(e).getDay();return Math.floor((d3.time.dayOfYear(e)+(n+t)%7)/7)-(n!==t)});d3.time[e+"s"]=n.range,d3.time[e+"s"].utc=n.utc.range,d3.time[e+"OfYear"]=function(e){var n=d3.time.year(e).getDay();return Math.floor((d3.time.dayOfYear(e)+(n+t)%7)/7)}}),d3.time.week=d3.time.sunday,d3.time.weeks=d3.time.sunday.range,d3.time.weeks.utc=d3.time.sunday.utc.range,d3.time.weekOfYear=d3.time.sundayOfYear,d3.time.month=Hi(function(e){return e=d3.time.day(e),e.setDate(1),e},function(e,t){e.setMonth(e.getMonth()+t)},function(e){return e.getMonth()}),d3.time.months=d3.time.month.range,d3.time.months.utc=d3.time.month.utc.range,d3.time.year=Hi(function(e){return e=d3.time.day(e),e.setMonth(0,1),e},function(e,t){e.setFullYear(e.getFullYear()+t)},function(e){return e.getFullYear()}),d3.time.years=d3.time.year.range,d3.time.years.utc=d3.time.year.utc.range;var Vo=[1e3,5e3,15e3,3e4,6e4,3e5,9e5,18e5,36e5,108e5,216e5,432e5,864e5,1728e5,6048e5,2592e6,7776e6,31536e6],$o=[[d3.time.second,1],[d3.time.second,5],[d3.time.second,15],[d3.time.second,30],[d3.time.minute,1],[d3.time.minute,5],[d3.time.minute,15],[d3.time.minute,30],[d3.time.hour,1],[d3.time.hour,3],[d3.time.hour,6],[d3.time.hour,12],[d3.time.day,1],[d3.time.day,2],[d3.time.week,1],[d3.time.month,1],[d3.time.month,3],[d3.time.year,1]],Jo=[[d3.time.format("%Y"),function(e){return!0}],[d3.time.format("%B"),function(e){return e.getMonth()}],[d3.time.format("%b %d"),function(e){return e.getDate()!=1}],[d3.time.format("%a %d"),function(e){return e.getDay()&&e.getDate()!=1}],[d3.time.format("%I %p"),function(e){return e.getHours()}],[d3.time.format("%I:%M"),function(e){return e.getMinutes()}],[d3.time.format(":%S"),function(e){return e.getSeconds()}],[d3.time.format(".%L"),function(e){return e.getMilliseconds()}]],Ko=d3.scale.linear(),Qo=qi(Jo);$o.year=function(e,t){return Ko.domain(e.map(Ui)).ticks(t).map(Ri)},d3.time.scale=function(){return ji(d3.scale.linear(),$o,Qo)};var Go=$o.map(function(e){return[e[0].utc,e[1]]}),Yo=[[d3.time.format.utc("%Y"),function(e){return!0}],[d3.time.format.utc("%B"),function(e){return e.getUTCMonth()}],[d3.time.format.utc("%b %d"),function(e){return e.getUTCDate()!=1}],[d3.time.format.utc("%a %d"),function(e){return e.getUTCDay()&&e.getUTCDate()!=1}],[d3.time.format.utc("%I %p"),function(e){return e.getUTCHours()}],[d3.time.format.utc("%I:%M"),function(e){return e.getUTCMinutes()}],[d3.time.format.utc(":%S"),function(e){return e.getUTCSeconds()}],[d3.time.format.utc(".%L"),function(e){return e.getUTCMilliseconds()}]],Zo=qi(Yo);Go.year=function(e,t){return Ko.domain(e.map(Wi)).ticks(t).map(zi)},d3.time.scale.utc=function(){return ji(d3.scale.linear(),Go,Zo)}})(); \ No newline at end of file diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/.gc3pie/html/images/openBIS_Logo.svg b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/.gc3pie/html/images/openBIS_Logo.svg deleted file mode 100755 index 811623c73d2ef53c4a15be466eee3af98cf19822..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/.gc3pie/html/images/openBIS_Logo.svg +++ /dev/null @@ -1,68 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- Generator: Adobe Illustrator 15.0.2, SVG Export Plug-In . SVG Version: 6.00 Build 0) --> -<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> -<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" - width="400.023px" height="174.566px" viewBox="0 0 400.023 174.566" enable-background="new 0 0 400.023 174.566" - xml:space="preserve"> -<g id="Layer_1"> - <g> - <text transform="matrix(1 0 0 1 46.4854 154.2764)"><tspan x="0" y="0" fill="#010101" font-family="'HelveticaNeue-Bold'" font-size="93.505" letter-spacing="-4">open</tspan><tspan x="204.679" y="0" fill="#231F20" font-family="'HelveticaNeue'" font-size="93.505">BIS</tspan></text> - <rect x="204.234" y="158.748" fill="none" width="192.64" height="14.936"/> - <text transform="matrix(1 0 0 1 204.2329 169.876)" fill="#010101" font-family="'HelveticaNeue'" font-size="15.5842">Biology Information System</text> - <g> - <g> - <g> - <g> - <polygon fill="#068172" points="125.213,81.967 141.416,98.167 147.252,92.333 131.053,76.132 125.213,76.132 "/> - </g> - <g> - <g> - <polygon fill="#068172" points="120.206,81.967 104.005,98.167 98.168,92.333 114.368,76.132 120.206,76.132 "/> - </g> - <g> - <polygon fill="#068172" points="120.206,65.286 104.005,49.084 98.168,54.92 114.368,71.12 120.206,71.12 "/> - </g> - </g> - </g> - <g> - <polygon fill="#068172" points="125.213,65.286 141.416,49.084 147.252,54.92 131.053,71.12 125.213,71.12 "/> - </g> - </g> - <g> - <g> - <polygon fill="#A4A4A4" points="76.131,16.201 92.331,0 98.168,5.836 81.969,22.036 76.13,22.036 "/> - </g> - <g> - <g> - <polygon fill="#ADACAF" points="76.131,32.882 92.331,49.084 98.168,43.247 81.969,27.048 76.13,27.048 "/> - </g> - <g> - <g> - <polygon fill="#ADACAF" points="71.122,32.882 54.921,49.084 49.084,43.247 65.283,27.048 71.123,27.048 "/> - </g> - <g> - <polygon fill="#ADACAF" points="71.122,16.201 54.921,0 49.084,5.836 65.283,22.036 71.123,22.036 "/> - </g> - </g> - </g> - </g> - <g> - <g> - <polygon fill="#ADACAF" points="27.046,65.286 43.247,49.084 49.083,54.92 32.884,71.12 27.045,71.12 "/> - </g> - <g> - <polygon fill="#ADACAF" points="27.046,81.967 43.247,98.167 49.083,92.333 32.884,76.132 27.045,76.132 "/> - </g> - <g> - <polygon fill="#ADACAF" points="22.038,81.967 5.837,98.167 0,92.333 16.199,76.132 22.038,76.132 "/> - </g> - <g> - <polygon fill="#ADACAF" points="22.038,65.286 5.837,49.084 0,54.92 16.199,71.12 22.038,71.12 "/> - </g> - </g> - </g> - </g> -</g> -<g id="Layer_2"> -</g> -</svg> diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/.gc3pie/html/index.html b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/.gc3pie/html/index.html deleted file mode 100644 index 7288ade93ad2c7b1f62547b26f287d96217cfc7e..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/.gc3pie/html/index.html +++ /dev/null @@ -1,452 +0,0 @@ -<head> - <title>Quantitative Genomics Facility</title> - <link rel="stylesheet" href="bootstrap3/css/bootstrap.min.css"> - <script type="text/javascript" src="d3.v2.min.js"></script> - <script type="text/javascript" src="jquery-1.8.2.min.js"></script> - <script type="text/javascript" src="bootstrap3/js/bootstrap.min.js"></script> - <script type="text/javascript" src="spin.min.js"></script> - <script type="text/javascript" src="openbis.js"></script> - <script type="text/javascript" src="openbis-dsu.js"></script> - <!-- To speed development, cache the requests --> - <!-- <script type="text/javascript" src="openbis-request-cache.js"></script> --> - <script> - - dsu = new openbis_dsu('/openbis/openbis', '/datastore_server'); - var vis; - var didCreateVis = false; - var context = new openbisWebAppContext(); - - $(document).ready(function () { - refresh(); - setInterval(refresh, 600000); - }); - - function createVis() { - if (didCreateVis) return; - vis = d3.select("#main").append("div").attr("id", "vis"); - didCreateVis = true; - } - - function enableSubmission() { - $('#submitBtn').prop('disabled', false); - } - - function disableSubmission() { - $('#submitBtn').prop('disabled', true); - } - - function displayReturnedTable(data) { - if (data.error) { - console.log(data.error); - vis.append("p").text("Could not retrieve data."); - return; - } - - var dataToShow = data.result; - //console.log(dataToShow); - - d3.select("#progress").remove() - d3.select("#button-group").remove() - - vis.append("p").text(""); - // Pick all div elements of the visualization - vis.selectAll("div").attr("class", "alert") - .data(dataToShow.rows) - .enter() - .append("div") - .attr("class", function (row) { - if (row[0].value == 0 || row[0].value > 99) { - if(row[0].value == 100) - enableSubmission(); - if(row[0].value == 101) - disableSubmission(); - return ""; - } - return "alert alert-danger"; - }) - .html(function (row) { - return row[1].value; - }) - - var button = d3.select("#container") - .append("div") - - button.selectAll("button") - .data(dataToShow.rows) - .enter() - .append("div") - .append("button") - .attr("id", function (row) { - return row[0].value; - }) - .attr("class", function (row) { - if (row[0].value == 0) { - return "btn btn-success"; - } - return "btn btn-danger"; - }) - //.attr("onclick", function(row) { return "callIngestionSetInvoice('" + row + "');" }) - .text(function (row) { - if (row[0].value == 0) { - return "OK" ; - } - return "Fail"; - }); - - } - - function hideButtons(data) { - var buttonId = data.result.rows[0][0].value; - d3.select("#setInvoice").remove() - d3.select("#main").append("div").attr("id", "Done").append("p").text("Done " + buttonId); - d3.select("button#" + String(buttonId)).remove(); - } - - function spinner(target) { - var opts = { - lines: 13, // The number of lines to draw - length: 7, // The length of each line - width: 4, // The line thickness - radius: 10, // The radius of the inner circle - corners: 1, // Corner roundness (0..1) - rotate: 0, // The rotation offset - color: '#000', // #rgb or #rrggbb - speed: 1, // Rounds per second - trail: 60, // Afterglow percentage - shadow: false, // Whether to render a shadow - hwaccel: false, // Whether to use hardware acceleration - className: 'spinner', // The CSS class to assign to the spinner - zIndex: 2e9, // The z-index (defaults to 2000000000) - top: 250, // Top position relative to parent in px - left: 'auto' // Left position relative to parent in px - }; - var spinner = new Spinner(opts).spin(target); - } - - - function callIngestionSetInvoice(piSampleString) { - var sampleIdentifier = context.getEntityIdentifier() - - var piSampleStringList = piSampleString.split("#") - var principalInvestigator = piSampleStringList[0] - var listOfSamples = piSampleStringList.slice(1, piSampleStringList.length) - - dsu.server.useSession(context.getSessionId()); - var parameters = - { - sampleId: sampleIdentifier, - pI: principalInvestigator, - listOfSamples: listOfSamples - }; - - d3.select("#main").append("div").attr("id", "setInvoice").append("p").text("Setting 'INVOICE SENT' property of " + listOfSamples + "to TRUE"); - var target = document.getElementById('setInvoice'); - spinner(target) - dsu.server.createReportFromAggregationService("DSS1", "setInvoiceSent", parameters, hideButtons); - } - - - function callIngestionService(method) { - var permIdentifier = context.getEntityIdentifier() - //var mySendEmail = $("#sendEmail").is(':checked') - var clusteroptions = "brutus" - var bowtieParameters = $("#Bowtie2Paramter").val() - - if ($('#brutus').is(':active')) { - clusteroptions = 'brutus'; - } - if ($('#bsseGrid').is(':active')) { - clusteroptions = 'bsseGrid'; - } - - - d3.select("#main").select("#progress").remove() - d3.select("#main").select("#vis").remove() - didCreateVis = false; - dsu.server.useSession(context.getSessionId()); - createVis() - - myUserId = context.getSessionId().split("-")[0]; - - var parameters = - { - permId: permIdentifier, - //sendEmail: mySendEmail, - bowtieParam: bowtieParameters, - clusteroptionsParam : clusteroptions, - userId : myUserId, - method: method - }; - console.log(parameters) - - //d3.select("#main").append("div").attr("id", "progress").append("p").text("Starting Job..."); - var target = document.getElementById('progress'); - spinner(target) - dsu.server.createReportFromAggregationService("DSS1", "triggergc3pie", parameters, displayReturnedTable); - } - - function refresh() { - callIngestionService("pollJob") - - } - - - </script> -</head> -<body> -<div class="container"> - <div class="row"> - <div class="col-lg-12"> - - <h2>Bowtie 2 - <small>Read Alignment</small> - </h2> - </div> - </div> -</div> - -<br> - -<p> - - - -<div class="container"> - <div class="row"> - <div class="col-lg-12"> - <div class="btn-group"> - <button type="button" class="btn btn-default" id="brutus"> ETHZ Brutus Cluster </button> - <button type="button" class="btn btn-default" id="bsseGrid"> BSSE Grid </button> - - </div> - </div> - </div> -</div> -</p> - -<p> - -<div class="container"> - <div class="row"> - <div class="col-lg-12"> - <form role="form"> - <div class="form-group"> - <label>Parameters</label> - <input type="text" class="form-control" id="Bowtie2Paramter" - placeholder="e.g. --very-sensitive --phred33 -q"> - </div> - </form> - </div> - </div> -</div> -</p> - -<p> -<!-- -<div class="container"> - <div class="row"> - <div class="col-lg-12"> - <div class="checkbox"> - <label> - <input type="checkbox" id="sendEmail"> Send Email when job finished - </label> - </div> - </div> - </div> -</div> ---> -</p> - -<p> - -<div class="container"> - <div class="row"> - <div class="col-md-3"> - <button class="btn btn-default" type="submit" - "createInvoice-button" id="submitBtn" onclick="callIngestionService('startJob');">Start Bowtie2</button> - </div> - <div class="col-md-3"> - <button type="button" class="btn btn-default" onclick="refresh();"> - <span class="glyphicon glyphicon-refresh"></span> Refresh - </button> - </div> - </div> -</div> -</p> - -<br> - -<p> - -<div class="container"> - <div class="row"> - <div class="col-lg-12"> - <div class="panel-group" id="accordion"> - <div class="panel panel-default"> - <div class="panel-heading"> - <h6 div class="panel-title"> - <a class="accordion-toggle" data-toggle="collapse" data-parent="#accordion" - href="#collapseOne"> - Available Bowtie 2 Parameters - </a> - </div> - </h6> - </div> - <div id="collapseOne" class="panel-collapse collapse"> - <div class="panel-body"> - <pre> -Usage: - bowtie2 [options]* -x <bt2-idx> {-1 <m1> -2 <m2> | -U <r>} [-S <sam>] - - <bt2-idx> Index filename prefix (minus trailing .X.bt2). - NOTE: Bowtie 1 and Bowtie 2 indexes are not compatible. - <m1> Files with #1 mates, paired with files in <m2>. - Could be gzip'ed (extension: .gz) or bzip2'ed (extension: .bz2). - <m2> Files with #2 mates, paired with files in <m1>. - Could be gzip'ed (extension: .gz) or bzip2'ed (extension: .bz2). - <r> Files with unpaired reads. - Could be gzip'ed (extension: .gz) or bzip2'ed (extension: .bz2). - <sam> File for SAM output (default: stdout) - - <m1>, <m2>, <r> can be comma-separated lists (no whitespace) and can be - specified many times. E.g. '-U file1.fq,file2.fq -U file3.fq'. - -Options (defaults in parentheses): - - Input: - -q query input files are FASTQ .fq/.fastq (default) - --qseq query input files are in Illumina's qseq format - -f query input files are (multi-)FASTA .fa/.mfa - -r query input files are raw one-sequence-per-line - -c <m1>, <m2>, <r> are sequences themselves, not files - -s/--skip <int> skip the first <int> reads/pairs in the input (none) - -u/--upto <int> stop after first <int> reads/pairs (no limit) - -5/--trim5 <int> trim <int> bases from 5'/left end of reads (0) - -3/--trim3 <int> trim <int> bases from 3'/right end of reads (0) - --phred33 qualities are Phred+33 (default) - --phred64 qualities are Phred+64 - --int-quals qualities encoded as space-delimited integers - - Presets: Same as: - For --end-to-end: - --very-fast -D 5 -R 1 -N 0 -L 22 -i S,0,2.50 - --fast -D 10 -R 2 -N 0 -L 22 -i S,0,2.50 - --sensitive -D 15 -R 2 -N 0 -L 22 -i S,1,1.15 (default) - --very-sensitive -D 20 -R 3 -N 0 -L 20 -i S,1,0.50 - - For --local: - --very-fast-local -D 5 -R 1 -N 0 -L 25 -i S,1,2.00 - --fast-local -D 10 -R 2 -N 0 -L 22 -i S,1,1.75 - --sensitive-local -D 15 -R 2 -N 0 -L 20 -i S,1,0.75 (default) - --very-sensitive-local -D 20 -R 3 -N 0 -L 20 -i S,1,0.50 - - Alignment: - -N <int> max # mismatches in seed alignment; can be 0 or 1 (0) - -L <int> length of seed substrings; must be >3, <32 (22) - -i <func> interval between seed substrings w/r/t read len (S,1,1.15) - --n-ceil <func> func for max # non-A/C/G/Ts permitted in aln (L,0,0.15) - --dpad <int> include <int> extra ref chars on sides of DP table (15) - --gbar <int> disallow gaps within <int> nucs of read extremes (4) - --ignore-quals treat all quality values as 30 on Phred scale (off) - --nofw do not align forward (original) version of read (off) - --norc do not align reverse-complement version of read (off) - - --end-to-end entire read must align; no clipping (on) - OR - --local local alignment; ends might be soft clipped (off) - - Scoring: - --ma <int> match bonus (0 for --end-to-end, 2 for --local) - --mp <int> max penalty for mismatch; lower qual = lower penalty (6) - --np <int> penalty for non-A/C/G/Ts in read/ref (1) - --rdg <int>,<int> read gap open, extend penalties (5,3) - --rfg <int>,<int> reference gap open, extend penalties (5,3) - --score-min <func> min acceptable alignment score w/r/t read length - (G,20,8 for local, L,-0.6,-0.6 for end-to-end) - - Reporting: - (default) look for multiple alignments, report best, with MAPQ - OR - -k <int> report up to <int> alns per read; MAPQ not meaningful - OR - -a/--all report all alignments; very slow, MAPQ not meaningful - - Effort: - -D <int> give up extending after <int> failed extends in a row (15) - -R <int> for reads w/ repetitive seeds, try <int> sets of seeds (2) - - Paired-end: - -I/--minins <int> minimum fragment length (0) - -X/--maxins <int> maximum fragment length (500) - --fr/--rf/--ff -1, -2 mates align fw/rev, rev/fw, fw/fw (--fr) - --no-mixed suppress unpaired alignments for paired reads - --no-discordant suppress discordant alignments for paired reads - --no-dovetail not concordant when mates extend past each other - --no-contain not concordant when one mate alignment contains other - --no-overlap not concordant when mates overlap at all - - Output: - -t/--time print wall-clock time taken by search phases - --un <path> write unpaired reads that didn't align to <path> - --al <path> write unpaired reads that aligned at least once to <path> - --un-conc <path> write pairs that didn't align concordantly to <path> - --al-conc <path> write pairs that aligned concordantly at least once to <path> - (Note: for --un, --al, --un-conc, or --al-conc, add '-gz' to the option name, e.g. - --un-gz <path>, to gzip compress output, or add '-bz2' to bzip2 compress output.) - --quiet print nothing to stderr except serious errors - --met-file <path> send metrics to file at <path> (off) - --met-stderr send metrics to stderr (off) - --met <int> report internal counters & metrics every <int> secs (1) - --no-head supppress header lines, i.e. lines starting with @ - --no-sq supppress @SQ header lines - --rg-id <text> set read group id, reflected in @RG line and RG:Z: opt field - --rg <text> add <text> ("lab:value") to @RG line of SAM header. - Note: @RG line only printed when --rg-id is set. - --omit-sec-seq put '*' in SEQ and QUAL fields for secondary alignments. - - Performance: - -o/--offrate <int> override offrate of index; must be >= index's offrate - -p/--threads <int> number of alignment threads to launch (1) - --reorder force SAM output order to match order of input reads - --mm use memory-mapped I/O for index; many 'bowtie's can share - - Other: - --qc-filter filter out reads that are bad according to QSEQ filter - --seed <int> seed for random number generator (0) - --non-deterministic seed rand. gen. arbitrarily instead of using read attributes - --version print version information and quit - -h/--help print this usage message -</pre> - </div> - </div> - </div> - </div> - </div> -</div> -</div> -</div> -</p> -</div> - -<!-- Placeholder for the output coming back from the server --> -<div class="container"> - <div class="row"> - <div class="col-lg-12"> - <div id="main"> - </div> - </div> - </div> -</div> - -<!-- Footer ================================================== --> - -<footer class="bs-footer" role="contentinfo"> - <h6 div class="container"> - <a href="http://bowtie-bio.sourceforge.net/bowtie2/index.shtml" target="_blank">Bowtie 2 Homepage</a> - </div> - </h6> -</footer> - - -</body> -</html> diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/.gc3pie/html/index.html.sv b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/.gc3pie/html/index.html.sv deleted file mode 100644 index b777734dc4d4ff6636cbec2e8ad4957efa60c83d..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/.gc3pie/html/index.html.sv +++ /dev/null @@ -1,314 +0,0 @@ -<head> - <title>Quantitative Genomics Facility</title> - <link rel="stylesheet" href="bootstrap3/css/bootstrap.min.css"> - <script type="text/javascript" src="d3.v2.min.js"></script> - <script type="text/javascript" src="/openbis/resources/js/jquery.js"></script> - <script type="text/javascript" src="bootstrap3/js/bootstrap.min.js"></script> - <script type="text/javascript" src="spin.min.js"></script> - <script type="text/javascript" src="/openbis/resources/js/openbis.js"></script> - <script type="text/javascript" src="openbis-dsu.js"></script> - <!-- To speed development, cache the requests --> - <!-- <script type="text/javascript" src="openbis-request-cache.js"></script> --> - <script> - -dsu = new openbis_dsu('/openbis/openbis', '/datastore_server'); -var vis; -var didCreateVis = false; -var context = new openbisWebAppContext(); - -$(document).ready(function() { -}); - -function createVis() -{ - if (didCreateVis) return; - vis = d3.select("#main").append("div").attr("id", "vis"); - didCreateVis = true; -} - -function displayReturnedTable(data) -{ - if (data.error) { - console.log(data.error); - vis.append("p").text("Could not retrieve data."); - return; - } - - var dataToShow = data.result; - - d3.select("#progress").remove() - d3.select("#button-group").remove() - - vis.append("p").text(""); - // Pick all div elements of the visualization - vis.selectAll("div") - .data(dataToShow.rows) - .enter() - .append("div") - .html(function(row) { return row[1].value;}) - - var button = d3.select("#container") - .append("div") - - button.selectAll("button") - .data(dataToShow.rows) - .enter() - .append("div") - .append("button") - .attr("id", function(row) { return row[0].value; }) - .attr("class", function(row) { if (row[0].value == 0) {return "btn btn-success";} return "btn btn-danger";}) - //.attr("onclick", function(row) { return "callIngestionSetInvoice('" + row + "');" }) - .text(function(row) { if (row[0].value == 0) { return "OK"; } return "Fail";}); - -// var invoices = []; -// for (var i=0;i<data.result.rows.length;i++) { -// //var val = data.result.rows[i][1].value.split('#')[0]; -// var val = data.result.rows[i][1].value; -// if (val) { -// invoices.push(val) -// } -// } -} - -function hideButtons(data) -{ - var buttonId = data.result.rows[0][0].value; - d3.select("#setInvoice").remove() - d3.select("#main").append("div").attr("id", "Done").append("p").text("Done " + buttonId); - d3.select("button#" + String(buttonId)).remove(); -} - -function spinner (target) { - var opts = { - lines: 13, // The number of lines to draw - length: 7, // The length of each line - width: 4, // The line thickness - radius: 10, // The radius of the inner circle - corners: 1, // Corner roundness (0..1) - rotate: 0, // The rotation offset - color: '#000', // #rgb or #rrggbb - speed: 1, // Rounds per second - trail: 60, // Afterglow percentage - shadow: false, // Whether to render a shadow - hwaccel: false, // Whether to use hardware acceleration - className: 'spinner', // The CSS class to assign to the spinner - zIndex: 2e9, // The z-index (defaults to 2000000000) - top: 250, // Top position relative to parent in px - left: 'auto' // Left position relative to parent in px - }; - var spinner = new Spinner(opts).spin(target); -} - - -function callIngestionSetInvoice(piSampleString) -{ - var sampleIdentifier = context.getEntityIdentifier() - - var piSampleStringList = piSampleString.split("#") - var principalInvestigator = piSampleStringList[0] - var listOfSamples = piSampleStringList.slice(1,piSampleStringList.length) - - dsu.server.useSession(context.getSessionId()); - var parameters = - { - sampleId : sampleIdentifier, - pI : principalInvestigator, - listOfSamples : listOfSamples - }; - - d3.select("#main").append("div").attr("id", "setInvoice").append("p").text("Setting 'INVOICE SENT' property of " + listOfSamples + "to TRUE"); - var target = document.getElementById('setInvoice'); - spinner(target) - dsu.server.createReportFromAggregationService("DSS1", "setInvoiceSent", parameters, hideButtons); -} - - -function callIngestionService() -{ - var permIdentifier = context.getEntityIdentifier() - var mySendEmail = $("#sendEmail").is(':checked') - var bowtieParameters = $("#Bowtie2Paramter").val() - - d3.select("#main").select("#progress").remove() - d3.select("#main").select("#vis").remove() - didCreateVis = false; - dsu.server.useSession(context.getSessionId()); - createVis() - var parameters = - { - permId : permIdentifier, - sendEmail : mySendEmail, - bowtieParam : bowtieParameters - }; - - d3.select("#main").append("div").attr("id", "progress").append("p").text("Starting gc3pie Job..."); - var target = document.getElementById('progress'); - spinner(target) - dsu.server.createReportFromAggregationService("DSS1", "triggergc3pie", parameters, displayReturnedTable); -} - - </script> -</head> -<body> -<div id="container" class="container"> -<h2>Bowtie 2 Alignment</h2> -<div id="main"> - - - -<form role="form"> - <div class="form-group"> - <label for="Bowtie2ParamterLabel">Parameters</label> - <input type="text" class="form-control" id="Bowtie2Paramter" placeholder="e.g. --very-sensitive --phred33 -q"> - </div> - <div class="checkbox"> - <label> - <input type="checkbox" id="sendEmail"> Send Email when job finished - </label> - </div> -</form> -<button class="btn btn-default btn-default" type="submit" "createInvoice-button" onclick="callIngestionService();">Start Bowtie2 Alignment</button> - - <div class="panel-group" id="accordion"> - <div class="panel panel-default"> - <div class="panel-heading"> - <h4 class="panel-title"> - <a class="accordion-toggle" data-toggle="collapse" data-parent="#accordion" href="#collapseOne"> - Available Bowtie 2 Options - </a> - </h4> - </div> - <div id="collapseOne" class="panel-collapse collapse"> - <div class="panel-body"> - <pre> -Usage: - bowtie2 [options]* -x <bt2-idx> {-1 <m1> -2 <m2> | -U <r>} [-S <sam>] - - <bt2-idx> Index filename prefix (minus trailing .X.bt2). - NOTE: Bowtie 1 and Bowtie 2 indexes are not compatible. - <m1> Files with #1 mates, paired with files in <m2>. - Could be gzip'ed (extension: .gz) or bzip2'ed (extension: .bz2). - <m2> Files with #2 mates, paired with files in <m1>. - Could be gzip'ed (extension: .gz) or bzip2'ed (extension: .bz2). - <r> Files with unpaired reads. - Could be gzip'ed (extension: .gz) or bzip2'ed (extension: .bz2). - <sam> File for SAM output (default: stdout) - - <m1>, <m2>, <r> can be comma-separated lists (no whitespace) and can be - specified many times. E.g. '-U file1.fq,file2.fq -U file3.fq'. - -Options (defaults in parentheses): - - Input: - -q query input files are FASTQ .fq/.fastq (default) - --qseq query input files are in Illumina's qseq format - -f query input files are (multi-)FASTA .fa/.mfa - -r query input files are raw one-sequence-per-line - -c <m1>, <m2>, <r> are sequences themselves, not files - -s/--skip <int> skip the first <int> reads/pairs in the input (none) - -u/--upto <int> stop after first <int> reads/pairs (no limit) - -5/--trim5 <int> trim <int> bases from 5'/left end of reads (0) - -3/--trim3 <int> trim <int> bases from 3'/right end of reads (0) - --phred33 qualities are Phred+33 (default) - --phred64 qualities are Phred+64 - --int-quals qualities encoded as space-delimited integers - - Presets: Same as: - For --end-to-end: - --very-fast -D 5 -R 1 -N 0 -L 22 -i S,0,2.50 - --fast -D 10 -R 2 -N 0 -L 22 -i S,0,2.50 - --sensitive -D 15 -R 2 -N 0 -L 22 -i S,1,1.15 (default) - --very-sensitive -D 20 -R 3 -N 0 -L 20 -i S,1,0.50 - - For --local: - --very-fast-local -D 5 -R 1 -N 0 -L 25 -i S,1,2.00 - --fast-local -D 10 -R 2 -N 0 -L 22 -i S,1,1.75 - --sensitive-local -D 15 -R 2 -N 0 -L 20 -i S,1,0.75 (default) - --very-sensitive-local -D 20 -R 3 -N 0 -L 20 -i S,1,0.50 - - Alignment: - -N <int> max # mismatches in seed alignment; can be 0 or 1 (0) - -L <int> length of seed substrings; must be >3, <32 (22) - -i <func> interval between seed substrings w/r/t read len (S,1,1.15) - --n-ceil <func> func for max # non-A/C/G/Ts permitted in aln (L,0,0.15) - --dpad <int> include <int> extra ref chars on sides of DP table (15) - --gbar <int> disallow gaps within <int> nucs of read extremes (4) - --ignore-quals treat all quality values as 30 on Phred scale (off) - --nofw do not align forward (original) version of read (off) - --norc do not align reverse-complement version of read (off) - - --end-to-end entire read must align; no clipping (on) - OR - --local local alignment; ends might be soft clipped (off) - - Scoring: - --ma <int> match bonus (0 for --end-to-end, 2 for --local) - --mp <int> max penalty for mismatch; lower qual = lower penalty (6) - --np <int> penalty for non-A/C/G/Ts in read/ref (1) - --rdg <int>,<int> read gap open, extend penalties (5,3) - --rfg <int>,<int> reference gap open, extend penalties (5,3) - --score-min <func> min acceptable alignment score w/r/t read length - (G,20,8 for local, L,-0.6,-0.6 for end-to-end) - - Reporting: - (default) look for multiple alignments, report best, with MAPQ - OR - -k <int> report up to <int> alns per read; MAPQ not meaningful - OR - -a/--all report all alignments; very slow, MAPQ not meaningful - - Effort: - -D <int> give up extending after <int> failed extends in a row (15) - -R <int> for reads w/ repetitive seeds, try <int> sets of seeds (2) - - Paired-end: - -I/--minins <int> minimum fragment length (0) - -X/--maxins <int> maximum fragment length (500) - --fr/--rf/--ff -1, -2 mates align fw/rev, rev/fw, fw/fw (--fr) - --no-mixed suppress unpaired alignments for paired reads - --no-discordant suppress discordant alignments for paired reads - --no-dovetail not concordant when mates extend past each other - --no-contain not concordant when one mate alignment contains other - --no-overlap not concordant when mates overlap at all - - Output: - -t/--time print wall-clock time taken by search phases - --un <path> write unpaired reads that didn't align to <path> - --al <path> write unpaired reads that aligned at least once to <path> - --un-conc <path> write pairs that didn't align concordantly to <path> - --al-conc <path> write pairs that aligned concordantly at least once to <path> - (Note: for --un, --al, --un-conc, or --al-conc, add '-gz' to the option name, e.g. - --un-gz <path>, to gzip compress output, or add '-bz2' to bzip2 compress output.) - --quiet print nothing to stderr except serious errors - --met-file <path> send metrics to file at <path> (off) - --met-stderr send metrics to stderr (off) - --met <int> report internal counters & metrics every <int> secs (1) - --no-head supppress header lines, i.e. lines starting with @ - --no-sq supppress @SQ header lines - --rg-id <text> set read group id, reflected in @RG line and RG:Z: opt field - --rg <text> add <text> ("lab:value") to @RG line of SAM header. - Note: @RG line only printed when --rg-id is set. - --omit-sec-seq put '*' in SEQ and QUAL fields for secondary alignments. - - Performance: - -o/--offrate <int> override offrate of index; must be >= index's offrate - -p/--threads <int> number of alignment threads to launch (1) - --reorder force SAM output order to match order of input reads - --mm use memory-mapped I/O for index; many 'bowtie's can share - - Other: - --qc-filter filter out reads that are bad according to QSEQ filter - --seed <int> seed for random number generator (0) - --non-deterministic seed rand. gen. arbitrarily instead of using read attributes - --version print version information and quit - -h/--help print this usage message -</pre> -</div> -</div> -</div> -</div> - -</div> -</div> -</body> -</html> diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/.gc3pie/html/index2.html b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/.gc3pie/html/index2.html deleted file mode 100644 index 1ae95d1251d75e91833d2d71d3c3abf066988e70..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/.gc3pie/html/index2.html +++ /dev/null @@ -1,14 +0,0 @@ -<head> - <title>Quantitative Genomics Facility</title> - <script type="text/css" src="bootstrap3/css/bootstrap.min.css"></script> -</head> -<body> -<div id="main"> - <button class="btn btn-default btn-lg" type="button" "createInvoice-button" onclick="callIngestionService();">Start gc3pie Job</button> -</div> -<p> - <button type="button" class="btn btn-primary btn-sm">Small button</button> - <button type="button" class="btn btn-default btn-sm">Small button</button> -</p> -</body> -</html> diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/.gc3pie/html/jquery-1.8.2.min.js b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/.gc3pie/html/jquery-1.8.2.min.js deleted file mode 100644 index bc3fbc81b261b9dd759fd83917b93664138faa4a..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/.gc3pie/html/jquery-1.8.2.min.js +++ /dev/null @@ -1,2 +0,0 @@ -/*! jQuery v1.8.2 jquery.com | jquery.org/license */ -(function(a,b){function G(a){var b=F[a]={};return p.each(a.split(s),function(a,c){b[c]=!0}),b}function J(a,c,d){if(d===b&&a.nodeType===1){var e="data-"+c.replace(I,"-$1").toLowerCase();d=a.getAttribute(e);if(typeof d=="string"){try{d=d==="true"?!0:d==="false"?!1:d==="null"?null:+d+""===d?+d:H.test(d)?p.parseJSON(d):d}catch(f){}p.data(a,c,d)}else d=b}return d}function K(a){var b;for(b in a){if(b==="data"&&p.isEmptyObject(a[b]))continue;if(b!=="toJSON")return!1}return!0}function ba(){return!1}function bb(){return!0}function bh(a){return!a||!a.parentNode||a.parentNode.nodeType===11}function bi(a,b){do a=a[b];while(a&&a.nodeType!==1);return a}function bj(a,b,c){b=b||0;if(p.isFunction(b))return p.grep(a,function(a,d){var e=!!b.call(a,d,a);return e===c});if(b.nodeType)return p.grep(a,function(a,d){return a===b===c});if(typeof b=="string"){var d=p.grep(a,function(a){return a.nodeType===1});if(be.test(b))return p.filter(b,d,!c);b=p.filter(b,d)}return p.grep(a,function(a,d){return p.inArray(a,b)>=0===c})}function bk(a){var b=bl.split("|"),c=a.createDocumentFragment();if(c.createElement)while(b.length)c.createElement(b.pop());return c}function bC(a,b){return a.getElementsByTagName(b)[0]||a.appendChild(a.ownerDocument.createElement(b))}function bD(a,b){if(b.nodeType!==1||!p.hasData(a))return;var c,d,e,f=p._data(a),g=p._data(b,f),h=f.events;if(h){delete g.handle,g.events={};for(c in h)for(d=0,e=h[c].length;d<e;d++)p.event.add(b,c,h[c][d])}g.data&&(g.data=p.extend({},g.data))}function bE(a,b){var c;if(b.nodeType!==1)return;b.clearAttributes&&b.clearAttributes(),b.mergeAttributes&&b.mergeAttributes(a),c=b.nodeName.toLowerCase(),c==="object"?(b.parentNode&&(b.outerHTML=a.outerHTML),p.support.html5Clone&&a.innerHTML&&!p.trim(b.innerHTML)&&(b.innerHTML=a.innerHTML)):c==="input"&&bv.test(a.type)?(b.defaultChecked=b.checked=a.checked,b.value!==a.value&&(b.value=a.value)):c==="option"?b.selected=a.defaultSelected:c==="input"||c==="textarea"?b.defaultValue=a.defaultValue:c==="script"&&b.text!==a.text&&(b.text=a.text),b.removeAttribute(p.expando)}function bF(a){return typeof a.getElementsByTagName!="undefined"?a.getElementsByTagName("*"):typeof a.querySelectorAll!="undefined"?a.querySelectorAll("*"):[]}function bG(a){bv.test(a.type)&&(a.defaultChecked=a.checked)}function bY(a,b){if(b in a)return b;var c=b.charAt(0).toUpperCase()+b.slice(1),d=b,e=bW.length;while(e--){b=bW[e]+c;if(b in a)return b}return d}function bZ(a,b){return a=b||a,p.css(a,"display")==="none"||!p.contains(a.ownerDocument,a)}function b$(a,b){var c,d,e=[],f=0,g=a.length;for(;f<g;f++){c=a[f];if(!c.style)continue;e[f]=p._data(c,"olddisplay"),b?(!e[f]&&c.style.display==="none"&&(c.style.display=""),c.style.display===""&&bZ(c)&&(e[f]=p._data(c,"olddisplay",cc(c.nodeName)))):(d=bH(c,"display"),!e[f]&&d!=="none"&&p._data(c,"olddisplay",d))}for(f=0;f<g;f++){c=a[f];if(!c.style)continue;if(!b||c.style.display==="none"||c.style.display==="")c.style.display=b?e[f]||"":"none"}return a}function b_(a,b,c){var d=bP.exec(b);return d?Math.max(0,d[1]-(c||0))+(d[2]||"px"):b}function ca(a,b,c,d){var e=c===(d?"border":"content")?4:b==="width"?1:0,f=0;for(;e<4;e+=2)c==="margin"&&(f+=p.css(a,c+bV[e],!0)),d?(c==="content"&&(f-=parseFloat(bH(a,"padding"+bV[e]))||0),c!=="margin"&&(f-=parseFloat(bH(a,"border"+bV[e]+"Width"))||0)):(f+=parseFloat(bH(a,"padding"+bV[e]))||0,c!=="padding"&&(f+=parseFloat(bH(a,"border"+bV[e]+"Width"))||0));return f}function cb(a,b,c){var d=b==="width"?a.offsetWidth:a.offsetHeight,e=!0,f=p.support.boxSizing&&p.css(a,"boxSizing")==="border-box";if(d<=0||d==null){d=bH(a,b);if(d<0||d==null)d=a.style[b];if(bQ.test(d))return d;e=f&&(p.support.boxSizingReliable||d===a.style[b]),d=parseFloat(d)||0}return d+ca(a,b,c||(f?"border":"content"),e)+"px"}function cc(a){if(bS[a])return bS[a];var b=p("<"+a+">").appendTo(e.body),c=b.css("display");b.remove();if(c==="none"||c===""){bI=e.body.appendChild(bI||p.extend(e.createElement("iframe"),{frameBorder:0,width:0,height:0}));if(!bJ||!bI.createElement)bJ=(bI.contentWindow||bI.contentDocument).document,bJ.write("<!doctype html><html><body>"),bJ.close();b=bJ.body.appendChild(bJ.createElement(a)),c=bH(b,"display"),e.body.removeChild(bI)}return bS[a]=c,c}function ci(a,b,c,d){var e;if(p.isArray(b))p.each(b,function(b,e){c||ce.test(a)?d(a,e):ci(a+"["+(typeof e=="object"?b:"")+"]",e,c,d)});else if(!c&&p.type(b)==="object")for(e in b)ci(a+"["+e+"]",b[e],c,d);else d(a,b)}function cz(a){return function(b,c){typeof b!="string"&&(c=b,b="*");var d,e,f,g=b.toLowerCase().split(s),h=0,i=g.length;if(p.isFunction(c))for(;h<i;h++)d=g[h],f=/^\+/.test(d),f&&(d=d.substr(1)||"*"),e=a[d]=a[d]||[],e[f?"unshift":"push"](c)}}function cA(a,c,d,e,f,g){f=f||c.dataTypes[0],g=g||{},g[f]=!0;var h,i=a[f],j=0,k=i?i.length:0,l=a===cv;for(;j<k&&(l||!h);j++)h=i[j](c,d,e),typeof h=="string"&&(!l||g[h]?h=b:(c.dataTypes.unshift(h),h=cA(a,c,d,e,h,g)));return(l||!h)&&!g["*"]&&(h=cA(a,c,d,e,"*",g)),h}function cB(a,c){var d,e,f=p.ajaxSettings.flatOptions||{};for(d in c)c[d]!==b&&((f[d]?a:e||(e={}))[d]=c[d]);e&&p.extend(!0,a,e)}function cC(a,c,d){var e,f,g,h,i=a.contents,j=a.dataTypes,k=a.responseFields;for(f in k)f in d&&(c[k[f]]=d[f]);while(j[0]==="*")j.shift(),e===b&&(e=a.mimeType||c.getResponseHeader("content-type"));if(e)for(f in i)if(i[f]&&i[f].test(e)){j.unshift(f);break}if(j[0]in d)g=j[0];else{for(f in d){if(!j[0]||a.converters[f+" "+j[0]]){g=f;break}h||(h=f)}g=g||h}if(g)return g!==j[0]&&j.unshift(g),d[g]}function cD(a,b){var c,d,e,f,g=a.dataTypes.slice(),h=g[0],i={},j=0;a.dataFilter&&(b=a.dataFilter(b,a.dataType));if(g[1])for(c in a.converters)i[c.toLowerCase()]=a.converters[c];for(;e=g[++j];)if(e!=="*"){if(h!=="*"&&h!==e){c=i[h+" "+e]||i["* "+e];if(!c)for(d in i){f=d.split(" ");if(f[1]===e){c=i[h+" "+f[0]]||i["* "+f[0]];if(c){c===!0?c=i[d]:i[d]!==!0&&(e=f[0],g.splice(j--,0,e));break}}}if(c!==!0)if(c&&a["throws"])b=c(b);else try{b=c(b)}catch(k){return{state:"parsererror",error:c?k:"No conversion from "+h+" to "+e}}}h=e}return{state:"success",data:b}}function cL(){try{return new a.XMLHttpRequest}catch(b){}}function cM(){try{return new a.ActiveXObject("Microsoft.XMLHTTP")}catch(b){}}function cU(){return setTimeout(function(){cN=b},0),cN=p.now()}function cV(a,b){p.each(b,function(b,c){var d=(cT[b]||[]).concat(cT["*"]),e=0,f=d.length;for(;e<f;e++)if(d[e].call(a,b,c))return})}function cW(a,b,c){var d,e=0,f=0,g=cS.length,h=p.Deferred().always(function(){delete i.elem}),i=function(){var b=cN||cU(),c=Math.max(0,j.startTime+j.duration-b),d=1-(c/j.duration||0),e=0,f=j.tweens.length;for(;e<f;e++)j.tweens[e].run(d);return h.notifyWith(a,[j,d,c]),d<1&&f?c:(h.resolveWith(a,[j]),!1)},j=h.promise({elem:a,props:p.extend({},b),opts:p.extend(!0,{specialEasing:{}},c),originalProperties:b,originalOptions:c,startTime:cN||cU(),duration:c.duration,tweens:[],createTween:function(b,c,d){var e=p.Tween(a,j.opts,b,c,j.opts.specialEasing[b]||j.opts.easing);return j.tweens.push(e),e},stop:function(b){var c=0,d=b?j.tweens.length:0;for(;c<d;c++)j.tweens[c].run(1);return b?h.resolveWith(a,[j,b]):h.rejectWith(a,[j,b]),this}}),k=j.props;cX(k,j.opts.specialEasing);for(;e<g;e++){d=cS[e].call(j,a,k,j.opts);if(d)return d}return cV(j,k),p.isFunction(j.opts.start)&&j.opts.start.call(a,j),p.fx.timer(p.extend(i,{anim:j,queue:j.opts.queue,elem:a})),j.progress(j.opts.progress).done(j.opts.done,j.opts.complete).fail(j.opts.fail).always(j.opts.always)}function cX(a,b){var c,d,e,f,g;for(c in a){d=p.camelCase(c),e=b[d],f=a[c],p.isArray(f)&&(e=f[1],f=a[c]=f[0]),c!==d&&(a[d]=f,delete a[c]),g=p.cssHooks[d];if(g&&"expand"in g){f=g.expand(f),delete a[d];for(c in f)c in a||(a[c]=f[c],b[c]=e)}else b[d]=e}}function cY(a,b,c){var d,e,f,g,h,i,j,k,l=this,m=a.style,n={},o=[],q=a.nodeType&&bZ(a);c.queue||(j=p._queueHooks(a,"fx"),j.unqueued==null&&(j.unqueued=0,k=j.empty.fire,j.empty.fire=function(){j.unqueued||k()}),j.unqueued++,l.always(function(){l.always(function(){j.unqueued--,p.queue(a,"fx").length||j.empty.fire()})})),a.nodeType===1&&("height"in b||"width"in b)&&(c.overflow=[m.overflow,m.overflowX,m.overflowY],p.css(a,"display")==="inline"&&p.css(a,"float")==="none"&&(!p.support.inlineBlockNeedsLayout||cc(a.nodeName)==="inline"?m.display="inline-block":m.zoom=1)),c.overflow&&(m.overflow="hidden",p.support.shrinkWrapBlocks||l.done(function(){m.overflow=c.overflow[0],m.overflowX=c.overflow[1],m.overflowY=c.overflow[2]}));for(d in b){f=b[d];if(cP.exec(f)){delete b[d];if(f===(q?"hide":"show"))continue;o.push(d)}}g=o.length;if(g){h=p._data(a,"fxshow")||p._data(a,"fxshow",{}),q?p(a).show():l.done(function(){p(a).hide()}),l.done(function(){var b;p.removeData(a,"fxshow",!0);for(b in n)p.style(a,b,n[b])});for(d=0;d<g;d++)e=o[d],i=l.createTween(e,q?h[e]:0),n[e]=h[e]||p.style(a,e),e in h||(h[e]=i.start,q&&(i.end=i.start,i.start=e==="width"||e==="height"?1:0))}}function cZ(a,b,c,d,e){return new cZ.prototype.init(a,b,c,d,e)}function c$(a,b){var c,d={height:a},e=0;b=b?1:0;for(;e<4;e+=2-b)c=bV[e],d["margin"+c]=d["padding"+c]=a;return b&&(d.opacity=d.width=a),d}function da(a){return p.isWindow(a)?a:a.nodeType===9?a.defaultView||a.parentWindow:!1}var c,d,e=a.document,f=a.location,g=a.navigator,h=a.jQuery,i=a.$,j=Array.prototype.push,k=Array.prototype.slice,l=Array.prototype.indexOf,m=Object.prototype.toString,n=Object.prototype.hasOwnProperty,o=String.prototype.trim,p=function(a,b){return new p.fn.init(a,b,c)},q=/[\-+]?(?:\d*\.|)\d+(?:[eE][\-+]?\d+|)/.source,r=/\S/,s=/\s+/,t=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,u=/^(?:[^#<]*(<[\w\W]+>)[^>]*$|#([\w\-]*)$)/,v=/^<(\w+)\s*\/?>(?:<\/\1>|)$/,w=/^[\],:{}\s]*$/,x=/(?:^|:|,)(?:\s*\[)+/g,y=/\\(?:["\\\/bfnrt]|u[\da-fA-F]{4})/g,z=/"[^"\\\r\n]*"|true|false|null|-?(?:\d\d*\.|)\d+(?:[eE][\-+]?\d+|)/g,A=/^-ms-/,B=/-([\da-z])/gi,C=function(a,b){return(b+"").toUpperCase()},D=function(){e.addEventListener?(e.removeEventListener("DOMContentLoaded",D,!1),p.ready()):e.readyState==="complete"&&(e.detachEvent("onreadystatechange",D),p.ready())},E={};p.fn=p.prototype={constructor:p,init:function(a,c,d){var f,g,h,i;if(!a)return this;if(a.nodeType)return this.context=this[0]=a,this.length=1,this;if(typeof a=="string"){a.charAt(0)==="<"&&a.charAt(a.length-1)===">"&&a.length>=3?f=[null,a,null]:f=u.exec(a);if(f&&(f[1]||!c)){if(f[1])return c=c instanceof p?c[0]:c,i=c&&c.nodeType?c.ownerDocument||c:e,a=p.parseHTML(f[1],i,!0),v.test(f[1])&&p.isPlainObject(c)&&this.attr.call(a,c,!0),p.merge(this,a);g=e.getElementById(f[2]);if(g&&g.parentNode){if(g.id!==f[2])return d.find(a);this.length=1,this[0]=g}return this.context=e,this.selector=a,this}return!c||c.jquery?(c||d).find(a):this.constructor(c).find(a)}return p.isFunction(a)?d.ready(a):(a.selector!==b&&(this.selector=a.selector,this.context=a.context),p.makeArray(a,this))},selector:"",jquery:"1.8.2",length:0,size:function(){return this.length},toArray:function(){return k.call(this)},get:function(a){return a==null?this.toArray():a<0?this[this.length+a]:this[a]},pushStack:function(a,b,c){var d=p.merge(this.constructor(),a);return d.prevObject=this,d.context=this.context,b==="find"?d.selector=this.selector+(this.selector?" ":"")+c:b&&(d.selector=this.selector+"."+b+"("+c+")"),d},each:function(a,b){return p.each(this,a,b)},ready:function(a){return p.ready.promise().done(a),this},eq:function(a){return a=+a,a===-1?this.slice(a):this.slice(a,a+1)},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},slice:function(){return this.pushStack(k.apply(this,arguments),"slice",k.call(arguments).join(","))},map:function(a){return this.pushStack(p.map(this,function(b,c){return a.call(b,c,b)}))},end:function(){return this.prevObject||this.constructor(null)},push:j,sort:[].sort,splice:[].splice},p.fn.init.prototype=p.fn,p.extend=p.fn.extend=function(){var a,c,d,e,f,g,h=arguments[0]||{},i=1,j=arguments.length,k=!1;typeof h=="boolean"&&(k=h,h=arguments[1]||{},i=2),typeof h!="object"&&!p.isFunction(h)&&(h={}),j===i&&(h=this,--i);for(;i<j;i++)if((a=arguments[i])!=null)for(c in a){d=h[c],e=a[c];if(h===e)continue;k&&e&&(p.isPlainObject(e)||(f=p.isArray(e)))?(f?(f=!1,g=d&&p.isArray(d)?d:[]):g=d&&p.isPlainObject(d)?d:{},h[c]=p.extend(k,g,e)):e!==b&&(h[c]=e)}return h},p.extend({noConflict:function(b){return a.$===p&&(a.$=i),b&&a.jQuery===p&&(a.jQuery=h),p},isReady:!1,readyWait:1,holdReady:function(a){a?p.readyWait++:p.ready(!0)},ready:function(a){if(a===!0?--p.readyWait:p.isReady)return;if(!e.body)return setTimeout(p.ready,1);p.isReady=!0;if(a!==!0&&--p.readyWait>0)return;d.resolveWith(e,[p]),p.fn.trigger&&p(e).trigger("ready").off("ready")},isFunction:function(a){return p.type(a)==="function"},isArray:Array.isArray||function(a){return p.type(a)==="array"},isWindow:function(a){return a!=null&&a==a.window},isNumeric:function(a){return!isNaN(parseFloat(a))&&isFinite(a)},type:function(a){return a==null?String(a):E[m.call(a)]||"object"},isPlainObject:function(a){if(!a||p.type(a)!=="object"||a.nodeType||p.isWindow(a))return!1;try{if(a.constructor&&!n.call(a,"constructor")&&!n.call(a.constructor.prototype,"isPrototypeOf"))return!1}catch(c){return!1}var d;for(d in a);return d===b||n.call(a,d)},isEmptyObject:function(a){var b;for(b in a)return!1;return!0},error:function(a){throw new Error(a)},parseHTML:function(a,b,c){var d;return!a||typeof a!="string"?null:(typeof b=="boolean"&&(c=b,b=0),b=b||e,(d=v.exec(a))?[b.createElement(d[1])]:(d=p.buildFragment([a],b,c?null:[]),p.merge([],(d.cacheable?p.clone(d.fragment):d.fragment).childNodes)))},parseJSON:function(b){if(!b||typeof b!="string")return null;b=p.trim(b);if(a.JSON&&a.JSON.parse)return a.JSON.parse(b);if(w.test(b.replace(y,"@").replace(z,"]").replace(x,"")))return(new Function("return "+b))();p.error("Invalid JSON: "+b)},parseXML:function(c){var d,e;if(!c||typeof c!="string")return null;try{a.DOMParser?(e=new DOMParser,d=e.parseFromString(c,"text/xml")):(d=new ActiveXObject("Microsoft.XMLDOM"),d.async="false",d.loadXML(c))}catch(f){d=b}return(!d||!d.documentElement||d.getElementsByTagName("parsererror").length)&&p.error("Invalid XML: "+c),d},noop:function(){},globalEval:function(b){b&&r.test(b)&&(a.execScript||function(b){a.eval.call(a,b)})(b)},camelCase:function(a){return a.replace(A,"ms-").replace(B,C)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toLowerCase()===b.toLowerCase()},each:function(a,c,d){var e,f=0,g=a.length,h=g===b||p.isFunction(a);if(d){if(h){for(e in a)if(c.apply(a[e],d)===!1)break}else for(;f<g;)if(c.apply(a[f++],d)===!1)break}else if(h){for(e in a)if(c.call(a[e],e,a[e])===!1)break}else for(;f<g;)if(c.call(a[f],f,a[f++])===!1)break;return a},trim:o&&!o.call(" ")?function(a){return a==null?"":o.call(a)}:function(a){return a==null?"":(a+"").replace(t,"")},makeArray:function(a,b){var c,d=b||[];return a!=null&&(c=p.type(a),a.length==null||c==="string"||c==="function"||c==="regexp"||p.isWindow(a)?j.call(d,a):p.merge(d,a)),d},inArray:function(a,b,c){var d;if(b){if(l)return l.call(b,a,c);d=b.length,c=c?c<0?Math.max(0,d+c):c:0;for(;c<d;c++)if(c in b&&b[c]===a)return c}return-1},merge:function(a,c){var d=c.length,e=a.length,f=0;if(typeof d=="number")for(;f<d;f++)a[e++]=c[f];else while(c[f]!==b)a[e++]=c[f++];return a.length=e,a},grep:function(a,b,c){var d,e=[],f=0,g=a.length;c=!!c;for(;f<g;f++)d=!!b(a[f],f),c!==d&&e.push(a[f]);return e},map:function(a,c,d){var e,f,g=[],h=0,i=a.length,j=a instanceof p||i!==b&&typeof i=="number"&&(i>0&&a[0]&&a[i-1]||i===0||p.isArray(a));if(j)for(;h<i;h++)e=c(a[h],h,d),e!=null&&(g[g.length]=e);else for(f in a)e=c(a[f],f,d),e!=null&&(g[g.length]=e);return g.concat.apply([],g)},guid:1,proxy:function(a,c){var d,e,f;return typeof c=="string"&&(d=a[c],c=a,a=d),p.isFunction(a)?(e=k.call(arguments,2),f=function(){return a.apply(c,e.concat(k.call(arguments)))},f.guid=a.guid=a.guid||p.guid++,f):b},access:function(a,c,d,e,f,g,h){var i,j=d==null,k=0,l=a.length;if(d&&typeof d=="object"){for(k in d)p.access(a,c,k,d[k],1,g,e);f=1}else if(e!==b){i=h===b&&p.isFunction(e),j&&(i?(i=c,c=function(a,b,c){return i.call(p(a),c)}):(c.call(a,e),c=null));if(c)for(;k<l;k++)c(a[k],d,i?e.call(a[k],k,c(a[k],d)):e,h);f=1}return f?a:j?c.call(a):l?c(a[0],d):g},now:function(){return(new Date).getTime()}}),p.ready.promise=function(b){if(!d){d=p.Deferred();if(e.readyState==="complete")setTimeout(p.ready,1);else if(e.addEventListener)e.addEventListener("DOMContentLoaded",D,!1),a.addEventListener("load",p.ready,!1);else{e.attachEvent("onreadystatechange",D),a.attachEvent("onload",p.ready);var c=!1;try{c=a.frameElement==null&&e.documentElement}catch(f){}c&&c.doScroll&&function g(){if(!p.isReady){try{c.doScroll("left")}catch(a){return setTimeout(g,50)}p.ready()}}()}}return d.promise(b)},p.each("Boolean Number String Function Array Date RegExp Object".split(" "),function(a,b){E["[object "+b+"]"]=b.toLowerCase()}),c=p(e);var F={};p.Callbacks=function(a){a=typeof a=="string"?F[a]||G(a):p.extend({},a);var c,d,e,f,g,h,i=[],j=!a.once&&[],k=function(b){c=a.memory&&b,d=!0,h=f||0,f=0,g=i.length,e=!0;for(;i&&h<g;h++)if(i[h].apply(b[0],b[1])===!1&&a.stopOnFalse){c=!1;break}e=!1,i&&(j?j.length&&k(j.shift()):c?i=[]:l.disable())},l={add:function(){if(i){var b=i.length;(function d(b){p.each(b,function(b,c){var e=p.type(c);e==="function"&&(!a.unique||!l.has(c))?i.push(c):c&&c.length&&e!=="string"&&d(c)})})(arguments),e?g=i.length:c&&(f=b,k(c))}return this},remove:function(){return i&&p.each(arguments,function(a,b){var c;while((c=p.inArray(b,i,c))>-1)i.splice(c,1),e&&(c<=g&&g--,c<=h&&h--)}),this},has:function(a){return p.inArray(a,i)>-1},empty:function(){return i=[],this},disable:function(){return i=j=c=b,this},disabled:function(){return!i},lock:function(){return j=b,c||l.disable(),this},locked:function(){return!j},fireWith:function(a,b){return b=b||[],b=[a,b.slice?b.slice():b],i&&(!d||j)&&(e?j.push(b):k(b)),this},fire:function(){return l.fireWith(this,arguments),this},fired:function(){return!!d}};return l},p.extend({Deferred:function(a){var b=[["resolve","done",p.Callbacks("once memory"),"resolved"],["reject","fail",p.Callbacks("once memory"),"rejected"],["notify","progress",p.Callbacks("memory")]],c="pending",d={state:function(){return c},always:function(){return e.done(arguments).fail(arguments),this},then:function(){var a=arguments;return p.Deferred(function(c){p.each(b,function(b,d){var f=d[0],g=a[b];e[d[1]](p.isFunction(g)?function(){var a=g.apply(this,arguments);a&&p.isFunction(a.promise)?a.promise().done(c.resolve).fail(c.reject).progress(c.notify):c[f+"With"](this===e?c:this,[a])}:c[f])}),a=null}).promise()},promise:function(a){return a!=null?p.extend(a,d):d}},e={};return d.pipe=d.then,p.each(b,function(a,f){var g=f[2],h=f[3];d[f[1]]=g.add,h&&g.add(function(){c=h},b[a^1][2].disable,b[2][2].lock),e[f[0]]=g.fire,e[f[0]+"With"]=g.fireWith}),d.promise(e),a&&a.call(e,e),e},when:function(a){var b=0,c=k.call(arguments),d=c.length,e=d!==1||a&&p.isFunction(a.promise)?d:0,f=e===1?a:p.Deferred(),g=function(a,b,c){return function(d){b[a]=this,c[a]=arguments.length>1?k.call(arguments):d,c===h?f.notifyWith(b,c):--e||f.resolveWith(b,c)}},h,i,j;if(d>1){h=new Array(d),i=new Array(d),j=new Array(d);for(;b<d;b++)c[b]&&p.isFunction(c[b].promise)?c[b].promise().done(g(b,j,c)).fail(f.reject).progress(g(b,i,h)):--e}return e||f.resolveWith(j,c),f.promise()}}),p.support=function(){var b,c,d,f,g,h,i,j,k,l,m,n=e.createElement("div");n.setAttribute("className","t"),n.innerHTML=" <link/><table></table><a href='/a'>a</a><input type='checkbox'/>",c=n.getElementsByTagName("*"),d=n.getElementsByTagName("a")[0],d.style.cssText="top:1px;float:left;opacity:.5";if(!c||!c.length)return{};f=e.createElement("select"),g=f.appendChild(e.createElement("option")),h=n.getElementsByTagName("input")[0],b={leadingWhitespace:n.firstChild.nodeType===3,tbody:!n.getElementsByTagName("tbody").length,htmlSerialize:!!n.getElementsByTagName("link").length,style:/top/.test(d.getAttribute("style")),hrefNormalized:d.getAttribute("href")==="/a",opacity:/^0.5/.test(d.style.opacity),cssFloat:!!d.style.cssFloat,checkOn:h.value==="on",optSelected:g.selected,getSetAttribute:n.className!=="t",enctype:!!e.createElement("form").enctype,html5Clone:e.createElement("nav").cloneNode(!0).outerHTML!=="<:nav></:nav>",boxModel:e.compatMode==="CSS1Compat",submitBubbles:!0,changeBubbles:!0,focusinBubbles:!1,deleteExpando:!0,noCloneEvent:!0,inlineBlockNeedsLayout:!1,shrinkWrapBlocks:!1,reliableMarginRight:!0,boxSizingReliable:!0,pixelPosition:!1},h.checked=!0,b.noCloneChecked=h.cloneNode(!0).checked,f.disabled=!0,b.optDisabled=!g.disabled;try{delete n.test}catch(o){b.deleteExpando=!1}!n.addEventListener&&n.attachEvent&&n.fireEvent&&(n.attachEvent("onclick",m=function(){b.noCloneEvent=!1}),n.cloneNode(!0).fireEvent("onclick"),n.detachEvent("onclick",m)),h=e.createElement("input"),h.value="t",h.setAttribute("type","radio"),b.radioValue=h.value==="t",h.setAttribute("checked","checked"),h.setAttribute("name","t"),n.appendChild(h),i=e.createDocumentFragment(),i.appendChild(n.lastChild),b.checkClone=i.cloneNode(!0).cloneNode(!0).lastChild.checked,b.appendChecked=h.checked,i.removeChild(h),i.appendChild(n);if(n.attachEvent)for(k in{submit:!0,change:!0,focusin:!0})j="on"+k,l=j in n,l||(n.setAttribute(j,"return;"),l=typeof n[j]=="function"),b[k+"Bubbles"]=l;return p(function(){var c,d,f,g,h="padding:0;margin:0;border:0;display:block;overflow:hidden;",i=e.getElementsByTagName("body")[0];if(!i)return;c=e.createElement("div"),c.style.cssText="visibility:hidden;border:0;width:0;height:0;position:static;top:0;margin-top:1px",i.insertBefore(c,i.firstChild),d=e.createElement("div"),c.appendChild(d),d.innerHTML="<table><tr><td></td><td>t</td></tr></table>",f=d.getElementsByTagName("td"),f[0].style.cssText="padding:0;margin:0;border:0;display:none",l=f[0].offsetHeight===0,f[0].style.display="",f[1].style.display="none",b.reliableHiddenOffsets=l&&f[0].offsetHeight===0,d.innerHTML="",d.style.cssText="box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;padding:1px;border:1px;display:block;width:4px;margin-top:1%;position:absolute;top:1%;",b.boxSizing=d.offsetWidth===4,b.doesNotIncludeMarginInBodyOffset=i.offsetTop!==1,a.getComputedStyle&&(b.pixelPosition=(a.getComputedStyle(d,null)||{}).top!=="1%",b.boxSizingReliable=(a.getComputedStyle(d,null)||{width:"4px"}).width==="4px",g=e.createElement("div"),g.style.cssText=d.style.cssText=h,g.style.marginRight=g.style.width="0",d.style.width="1px",d.appendChild(g),b.reliableMarginRight=!parseFloat((a.getComputedStyle(g,null)||{}).marginRight)),typeof d.style.zoom!="undefined"&&(d.innerHTML="",d.style.cssText=h+"width:1px;padding:1px;display:inline;zoom:1",b.inlineBlockNeedsLayout=d.offsetWidth===3,d.style.display="block",d.style.overflow="visible",d.innerHTML="<div></div>",d.firstChild.style.width="5px",b.shrinkWrapBlocks=d.offsetWidth!==3,c.style.zoom=1),i.removeChild(c),c=d=f=g=null}),i.removeChild(n),c=d=f=g=h=i=n=null,b}();var H=/(?:\{[\s\S]*\}|\[[\s\S]*\])$/,I=/([A-Z])/g;p.extend({cache:{},deletedIds:[],uuid:0,expando:"jQuery"+(p.fn.jquery+Math.random()).replace(/\D/g,""),noData:{embed:!0,object:"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",applet:!0},hasData:function(a){return a=a.nodeType?p.cache[a[p.expando]]:a[p.expando],!!a&&!K(a)},data:function(a,c,d,e){if(!p.acceptData(a))return;var f,g,h=p.expando,i=typeof c=="string",j=a.nodeType,k=j?p.cache:a,l=j?a[h]:a[h]&&h;if((!l||!k[l]||!e&&!k[l].data)&&i&&d===b)return;l||(j?a[h]=l=p.deletedIds.pop()||p.guid++:l=h),k[l]||(k[l]={},j||(k[l].toJSON=p.noop));if(typeof c=="object"||typeof c=="function")e?k[l]=p.extend(k[l],c):k[l].data=p.extend(k[l].data,c);return f=k[l],e||(f.data||(f.data={}),f=f.data),d!==b&&(f[p.camelCase(c)]=d),i?(g=f[c],g==null&&(g=f[p.camelCase(c)])):g=f,g},removeData:function(a,b,c){if(!p.acceptData(a))return;var d,e,f,g=a.nodeType,h=g?p.cache:a,i=g?a[p.expando]:p.expando;if(!h[i])return;if(b){d=c?h[i]:h[i].data;if(d){p.isArray(b)||(b in d?b=[b]:(b=p.camelCase(b),b in d?b=[b]:b=b.split(" ")));for(e=0,f=b.length;e<f;e++)delete d[b[e]];if(!(c?K:p.isEmptyObject)(d))return}}if(!c){delete h[i].data;if(!K(h[i]))return}g?p.cleanData([a],!0):p.support.deleteExpando||h!=h.window?delete h[i]:h[i]=null},_data:function(a,b,c){return p.data(a,b,c,!0)},acceptData:function(a){var b=a.nodeName&&p.noData[a.nodeName.toLowerCase()];return!b||b!==!0&&a.getAttribute("classid")===b}}),p.fn.extend({data:function(a,c){var d,e,f,g,h,i=this[0],j=0,k=null;if(a===b){if(this.length){k=p.data(i);if(i.nodeType===1&&!p._data(i,"parsedAttrs")){f=i.attributes;for(h=f.length;j<h;j++)g=f[j].name,g.indexOf("data-")||(g=p.camelCase(g.substring(5)),J(i,g,k[g]));p._data(i,"parsedAttrs",!0)}}return k}return typeof a=="object"?this.each(function(){p.data(this,a)}):(d=a.split(".",2),d[1]=d[1]?"."+d[1]:"",e=d[1]+"!",p.access(this,function(c){if(c===b)return k=this.triggerHandler("getData"+e,[d[0]]),k===b&&i&&(k=p.data(i,a),k=J(i,a,k)),k===b&&d[1]?this.data(d[0]):k;d[1]=c,this.each(function(){var b=p(this);b.triggerHandler("setData"+e,d),p.data(this,a,c),b.triggerHandler("changeData"+e,d)})},null,c,arguments.length>1,null,!1))},removeData:function(a){return this.each(function(){p.removeData(this,a)})}}),p.extend({queue:function(a,b,c){var d;if(a)return b=(b||"fx")+"queue",d=p._data(a,b),c&&(!d||p.isArray(c)?d=p._data(a,b,p.makeArray(c)):d.push(c)),d||[]},dequeue:function(a,b){b=b||"fx";var c=p.queue(a,b),d=c.length,e=c.shift(),f=p._queueHooks(a,b),g=function(){p.dequeue(a,b)};e==="inprogress"&&(e=c.shift(),d--),e&&(b==="fx"&&c.unshift("inprogress"),delete f.stop,e.call(a,g,f)),!d&&f&&f.empty.fire()},_queueHooks:function(a,b){var c=b+"queueHooks";return p._data(a,c)||p._data(a,c,{empty:p.Callbacks("once memory").add(function(){p.removeData(a,b+"queue",!0),p.removeData(a,c,!0)})})}}),p.fn.extend({queue:function(a,c){var d=2;return typeof a!="string"&&(c=a,a="fx",d--),arguments.length<d?p.queue(this[0],a):c===b?this:this.each(function(){var b=p.queue(this,a,c);p._queueHooks(this,a),a==="fx"&&b[0]!=="inprogress"&&p.dequeue(this,a)})},dequeue:function(a){return this.each(function(){p.dequeue(this,a)})},delay:function(a,b){return a=p.fx?p.fx.speeds[a]||a:a,b=b||"fx",this.queue(b,function(b,c){var d=setTimeout(b,a);c.stop=function(){clearTimeout(d)}})},clearQueue:function(a){return this.queue(a||"fx",[])},promise:function(a,c){var d,e=1,f=p.Deferred(),g=this,h=this.length,i=function(){--e||f.resolveWith(g,[g])};typeof a!="string"&&(c=a,a=b),a=a||"fx";while(h--)d=p._data(g[h],a+"queueHooks"),d&&d.empty&&(e++,d.empty.add(i));return i(),f.promise(c)}});var L,M,N,O=/[\t\r\n]/g,P=/\r/g,Q=/^(?:button|input)$/i,R=/^(?:button|input|object|select|textarea)$/i,S=/^a(?:rea|)$/i,T=/^(?:autofocus|autoplay|async|checked|controls|defer|disabled|hidden|loop|multiple|open|readonly|required|scoped|selected)$/i,U=p.support.getSetAttribute;p.fn.extend({attr:function(a,b){return p.access(this,p.attr,a,b,arguments.length>1)},removeAttr:function(a){return this.each(function(){p.removeAttr(this,a)})},prop:function(a,b){return p.access(this,p.prop,a,b,arguments.length>1)},removeProp:function(a){return a=p.propFix[a]||a,this.each(function(){try{this[a]=b,delete this[a]}catch(c){}})},addClass:function(a){var b,c,d,e,f,g,h;if(p.isFunction(a))return this.each(function(b){p(this).addClass(a.call(this,b,this.className))});if(a&&typeof a=="string"){b=a.split(s);for(c=0,d=this.length;c<d;c++){e=this[c];if(e.nodeType===1)if(!e.className&&b.length===1)e.className=a;else{f=" "+e.className+" ";for(g=0,h=b.length;g<h;g++)f.indexOf(" "+b[g]+" ")<0&&(f+=b[g]+" ");e.className=p.trim(f)}}}return this},removeClass:function(a){var c,d,e,f,g,h,i;if(p.isFunction(a))return this.each(function(b){p(this).removeClass(a.call(this,b,this.className))});if(a&&typeof a=="string"||a===b){c=(a||"").split(s);for(h=0,i=this.length;h<i;h++){e=this[h];if(e.nodeType===1&&e.className){d=(" "+e.className+" ").replace(O," ");for(f=0,g=c.length;f<g;f++)while(d.indexOf(" "+c[f]+" ")>=0)d=d.replace(" "+c[f]+" "," ");e.className=a?p.trim(d):""}}}return this},toggleClass:function(a,b){var c=typeof a,d=typeof b=="boolean";return p.isFunction(a)?this.each(function(c){p(this).toggleClass(a.call(this,c,this.className,b),b)}):this.each(function(){if(c==="string"){var e,f=0,g=p(this),h=b,i=a.split(s);while(e=i[f++])h=d?h:!g.hasClass(e),g[h?"addClass":"removeClass"](e)}else if(c==="undefined"||c==="boolean")this.className&&p._data(this,"__className__",this.className),this.className=this.className||a===!1?"":p._data(this,"__className__")||""})},hasClass:function(a){var b=" "+a+" ",c=0,d=this.length;for(;c<d;c++)if(this[c].nodeType===1&&(" "+this[c].className+" ").replace(O," ").indexOf(b)>=0)return!0;return!1},val:function(a){var c,d,e,f=this[0];if(!arguments.length){if(f)return c=p.valHooks[f.type]||p.valHooks[f.nodeName.toLowerCase()],c&&"get"in c&&(d=c.get(f,"value"))!==b?d:(d=f.value,typeof d=="string"?d.replace(P,""):d==null?"":d);return}return e=p.isFunction(a),this.each(function(d){var f,g=p(this);if(this.nodeType!==1)return;e?f=a.call(this,d,g.val()):f=a,f==null?f="":typeof f=="number"?f+="":p.isArray(f)&&(f=p.map(f,function(a){return a==null?"":a+""})),c=p.valHooks[this.type]||p.valHooks[this.nodeName.toLowerCase()];if(!c||!("set"in c)||c.set(this,f,"value")===b)this.value=f})}}),p.extend({valHooks:{option:{get:function(a){var b=a.attributes.value;return!b||b.specified?a.value:a.text}},select:{get:function(a){var b,c,d,e,f=a.selectedIndex,g=[],h=a.options,i=a.type==="select-one";if(f<0)return null;c=i?f:0,d=i?f+1:h.length;for(;c<d;c++){e=h[c];if(e.selected&&(p.support.optDisabled?!e.disabled:e.getAttribute("disabled")===null)&&(!e.parentNode.disabled||!p.nodeName(e.parentNode,"optgroup"))){b=p(e).val();if(i)return b;g.push(b)}}return i&&!g.length&&h.length?p(h[f]).val():g},set:function(a,b){var c=p.makeArray(b);return p(a).find("option").each(function(){this.selected=p.inArray(p(this).val(),c)>=0}),c.length||(a.selectedIndex=-1),c}}},attrFn:{},attr:function(a,c,d,e){var f,g,h,i=a.nodeType;if(!a||i===3||i===8||i===2)return;if(e&&p.isFunction(p.fn[c]))return p(a)[c](d);if(typeof a.getAttribute=="undefined")return p.prop(a,c,d);h=i!==1||!p.isXMLDoc(a),h&&(c=c.toLowerCase(),g=p.attrHooks[c]||(T.test(c)?M:L));if(d!==b){if(d===null){p.removeAttr(a,c);return}return g&&"set"in g&&h&&(f=g.set(a,d,c))!==b?f:(a.setAttribute(c,d+""),d)}return g&&"get"in g&&h&&(f=g.get(a,c))!==null?f:(f=a.getAttribute(c),f===null?b:f)},removeAttr:function(a,b){var c,d,e,f,g=0;if(b&&a.nodeType===1){d=b.split(s);for(;g<d.length;g++)e=d[g],e&&(c=p.propFix[e]||e,f=T.test(e),f||p.attr(a,e,""),a.removeAttribute(U?e:c),f&&c in a&&(a[c]=!1))}},attrHooks:{type:{set:function(a,b){if(Q.test(a.nodeName)&&a.parentNode)p.error("type property can't be changed");else if(!p.support.radioValue&&b==="radio"&&p.nodeName(a,"input")){var c=a.value;return a.setAttribute("type",b),c&&(a.value=c),b}}},value:{get:function(a,b){return L&&p.nodeName(a,"button")?L.get(a,b):b in a?a.value:null},set:function(a,b,c){if(L&&p.nodeName(a,"button"))return L.set(a,b,c);a.value=b}}},propFix:{tabindex:"tabIndex",readonly:"readOnly","for":"htmlFor","class":"className",maxlength:"maxLength",cellspacing:"cellSpacing",cellpadding:"cellPadding",rowspan:"rowSpan",colspan:"colSpan",usemap:"useMap",frameborder:"frameBorder",contenteditable:"contentEditable"},prop:function(a,c,d){var e,f,g,h=a.nodeType;if(!a||h===3||h===8||h===2)return;return g=h!==1||!p.isXMLDoc(a),g&&(c=p.propFix[c]||c,f=p.propHooks[c]),d!==b?f&&"set"in f&&(e=f.set(a,d,c))!==b?e:a[c]=d:f&&"get"in f&&(e=f.get(a,c))!==null?e:a[c]},propHooks:{tabIndex:{get:function(a){var c=a.getAttributeNode("tabindex");return c&&c.specified?parseInt(c.value,10):R.test(a.nodeName)||S.test(a.nodeName)&&a.href?0:b}}}}),M={get:function(a,c){var d,e=p.prop(a,c);return e===!0||typeof e!="boolean"&&(d=a.getAttributeNode(c))&&d.nodeValue!==!1?c.toLowerCase():b},set:function(a,b,c){var d;return b===!1?p.removeAttr(a,c):(d=p.propFix[c]||c,d in a&&(a[d]=!0),a.setAttribute(c,c.toLowerCase())),c}},U||(N={name:!0,id:!0,coords:!0},L=p.valHooks.button={get:function(a,c){var d;return d=a.getAttributeNode(c),d&&(N[c]?d.value!=="":d.specified)?d.value:b},set:function(a,b,c){var d=a.getAttributeNode(c);return d||(d=e.createAttribute(c),a.setAttributeNode(d)),d.value=b+""}},p.each(["width","height"],function(a,b){p.attrHooks[b]=p.extend(p.attrHooks[b],{set:function(a,c){if(c==="")return a.setAttribute(b,"auto"),c}})}),p.attrHooks.contenteditable={get:L.get,set:function(a,b,c){b===""&&(b="false"),L.set(a,b,c)}}),p.support.hrefNormalized||p.each(["href","src","width","height"],function(a,c){p.attrHooks[c]=p.extend(p.attrHooks[c],{get:function(a){var d=a.getAttribute(c,2);return d===null?b:d}})}),p.support.style||(p.attrHooks.style={get:function(a){return a.style.cssText.toLowerCase()||b},set:function(a,b){return a.style.cssText=b+""}}),p.support.optSelected||(p.propHooks.selected=p.extend(p.propHooks.selected,{get:function(a){var b=a.parentNode;return b&&(b.selectedIndex,b.parentNode&&b.parentNode.selectedIndex),null}})),p.support.enctype||(p.propFix.enctype="encoding"),p.support.checkOn||p.each(["radio","checkbox"],function(){p.valHooks[this]={get:function(a){return a.getAttribute("value")===null?"on":a.value}}}),p.each(["radio","checkbox"],function(){p.valHooks[this]=p.extend(p.valHooks[this],{set:function(a,b){if(p.isArray(b))return a.checked=p.inArray(p(a).val(),b)>=0}})});var V=/^(?:textarea|input|select)$/i,W=/^([^\.]*|)(?:\.(.+)|)$/,X=/(?:^|\s)hover(\.\S+|)\b/,Y=/^key/,Z=/^(?:mouse|contextmenu)|click/,$=/^(?:focusinfocus|focusoutblur)$/,_=function(a){return p.event.special.hover?a:a.replace(X,"mouseenter$1 mouseleave$1")};p.event={add:function(a,c,d,e,f){var g,h,i,j,k,l,m,n,o,q,r;if(a.nodeType===3||a.nodeType===8||!c||!d||!(g=p._data(a)))return;d.handler&&(o=d,d=o.handler,f=o.selector),d.guid||(d.guid=p.guid++),i=g.events,i||(g.events=i={}),h=g.handle,h||(g.handle=h=function(a){return typeof p!="undefined"&&(!a||p.event.triggered!==a.type)?p.event.dispatch.apply(h.elem,arguments):b},h.elem=a),c=p.trim(_(c)).split(" ");for(j=0;j<c.length;j++){k=W.exec(c[j])||[],l=k[1],m=(k[2]||"").split(".").sort(),r=p.event.special[l]||{},l=(f?r.delegateType:r.bindType)||l,r=p.event.special[l]||{},n=p.extend({type:l,origType:k[1],data:e,handler:d,guid:d.guid,selector:f,needsContext:f&&p.expr.match.needsContext.test(f),namespace:m.join(".")},o),q=i[l];if(!q){q=i[l]=[],q.delegateCount=0;if(!r.setup||r.setup.call(a,e,m,h)===!1)a.addEventListener?a.addEventListener(l,h,!1):a.attachEvent&&a.attachEvent("on"+l,h)}r.add&&(r.add.call(a,n),n.handler.guid||(n.handler.guid=d.guid)),f?q.splice(q.delegateCount++,0,n):q.push(n),p.event.global[l]=!0}a=null},global:{},remove:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,n,o,q,r=p.hasData(a)&&p._data(a);if(!r||!(m=r.events))return;b=p.trim(_(b||"")).split(" ");for(f=0;f<b.length;f++){g=W.exec(b[f])||[],h=i=g[1],j=g[2];if(!h){for(h in m)p.event.remove(a,h+b[f],c,d,!0);continue}n=p.event.special[h]||{},h=(d?n.delegateType:n.bindType)||h,o=m[h]||[],k=o.length,j=j?new RegExp("(^|\\.)"+j.split(".").sort().join("\\.(?:.*\\.|)")+"(\\.|$)"):null;for(l=0;l<o.length;l++)q=o[l],(e||i===q.origType)&&(!c||c.guid===q.guid)&&(!j||j.test(q.namespace))&&(!d||d===q.selector||d==="**"&&q.selector)&&(o.splice(l--,1),q.selector&&o.delegateCount--,n.remove&&n.remove.call(a,q));o.length===0&&k!==o.length&&((!n.teardown||n.teardown.call(a,j,r.handle)===!1)&&p.removeEvent(a,h,r.handle),delete m[h])}p.isEmptyObject(m)&&(delete r.handle,p.removeData(a,"events",!0))},customEvent:{getData:!0,setData:!0,changeData:!0},trigger:function(c,d,f,g){if(!f||f.nodeType!==3&&f.nodeType!==8){var h,i,j,k,l,m,n,o,q,r,s=c.type||c,t=[];if($.test(s+p.event.triggered))return;s.indexOf("!")>=0&&(s=s.slice(0,-1),i=!0),s.indexOf(".")>=0&&(t=s.split("."),s=t.shift(),t.sort());if((!f||p.event.customEvent[s])&&!p.event.global[s])return;c=typeof c=="object"?c[p.expando]?c:new p.Event(s,c):new p.Event(s),c.type=s,c.isTrigger=!0,c.exclusive=i,c.namespace=t.join("."),c.namespace_re=c.namespace?new RegExp("(^|\\.)"+t.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,m=s.indexOf(":")<0?"on"+s:"";if(!f){h=p.cache;for(j in h)h[j].events&&h[j].events[s]&&p.event.trigger(c,d,h[j].handle.elem,!0);return}c.result=b,c.target||(c.target=f),d=d!=null?p.makeArray(d):[],d.unshift(c),n=p.event.special[s]||{};if(n.trigger&&n.trigger.apply(f,d)===!1)return;q=[[f,n.bindType||s]];if(!g&&!n.noBubble&&!p.isWindow(f)){r=n.delegateType||s,k=$.test(r+s)?f:f.parentNode;for(l=f;k;k=k.parentNode)q.push([k,r]),l=k;l===(f.ownerDocument||e)&&q.push([l.defaultView||l.parentWindow||a,r])}for(j=0;j<q.length&&!c.isPropagationStopped();j++)k=q[j][0],c.type=q[j][1],o=(p._data(k,"events")||{})[c.type]&&p._data(k,"handle"),o&&o.apply(k,d),o=m&&k[m],o&&p.acceptData(k)&&o.apply&&o.apply(k,d)===!1&&c.preventDefault();return c.type=s,!g&&!c.isDefaultPrevented()&&(!n._default||n._default.apply(f.ownerDocument,d)===!1)&&(s!=="click"||!p.nodeName(f,"a"))&&p.acceptData(f)&&m&&f[s]&&(s!=="focus"&&s!=="blur"||c.target.offsetWidth!==0)&&!p.isWindow(f)&&(l=f[m],l&&(f[m]=null),p.event.triggered=s,f[s](),p.event.triggered=b,l&&(f[m]=l)),c.result}return},dispatch:function(c){c=p.event.fix(c||a.event);var d,e,f,g,h,i,j,l,m,n,o=(p._data(this,"events")||{})[c.type]||[],q=o.delegateCount,r=k.call(arguments),s=!c.exclusive&&!c.namespace,t=p.event.special[c.type]||{},u=[];r[0]=c,c.delegateTarget=this;if(t.preDispatch&&t.preDispatch.call(this,c)===!1)return;if(q&&(!c.button||c.type!=="click"))for(f=c.target;f!=this;f=f.parentNode||this)if(f.disabled!==!0||c.type!=="click"){h={},j=[];for(d=0;d<q;d++)l=o[d],m=l.selector,h[m]===b&&(h[m]=l.needsContext?p(m,this).index(f)>=0:p.find(m,this,null,[f]).length),h[m]&&j.push(l);j.length&&u.push({elem:f,matches:j})}o.length>q&&u.push({elem:this,matches:o.slice(q)});for(d=0;d<u.length&&!c.isPropagationStopped();d++){i=u[d],c.currentTarget=i.elem;for(e=0;e<i.matches.length&&!c.isImmediatePropagationStopped();e++){l=i.matches[e];if(s||!c.namespace&&!l.namespace||c.namespace_re&&c.namespace_re.test(l.namespace))c.data=l.data,c.handleObj=l,g=((p.event.special[l.origType]||{}).handle||l.handler).apply(i.elem,r),g!==b&&(c.result=g,g===!1&&(c.preventDefault(),c.stopPropagation()))}}return t.postDispatch&&t.postDispatch.call(this,c),c.result},props:"attrChange attrName relatedNode srcElement altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),fixHooks:{},keyHooks:{props:"char charCode key keyCode".split(" "),filter:function(a,b){return a.which==null&&(a.which=b.charCode!=null?b.charCode:b.keyCode),a}},mouseHooks:{props:"button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "),filter:function(a,c){var d,f,g,h=c.button,i=c.fromElement;return a.pageX==null&&c.clientX!=null&&(d=a.target.ownerDocument||e,f=d.documentElement,g=d.body,a.pageX=c.clientX+(f&&f.scrollLeft||g&&g.scrollLeft||0)-(f&&f.clientLeft||g&&g.clientLeft||0),a.pageY=c.clientY+(f&&f.scrollTop||g&&g.scrollTop||0)-(f&&f.clientTop||g&&g.clientTop||0)),!a.relatedTarget&&i&&(a.relatedTarget=i===a.target?c.toElement:i),!a.which&&h!==b&&(a.which=h&1?1:h&2?3:h&4?2:0),a}},fix:function(a){if(a[p.expando])return a;var b,c,d=a,f=p.event.fixHooks[a.type]||{},g=f.props?this.props.concat(f.props):this.props;a=p.Event(d);for(b=g.length;b;)c=g[--b],a[c]=d[c];return a.target||(a.target=d.srcElement||e),a.target.nodeType===3&&(a.target=a.target.parentNode),a.metaKey=!!a.metaKey,f.filter?f.filter(a,d):a},special:{load:{noBubble:!0},focus:{delegateType:"focusin"},blur:{delegateType:"focusout"},beforeunload:{setup:function(a,b,c){p.isWindow(this)&&(this.onbeforeunload=c)},teardown:function(a,b){this.onbeforeunload===b&&(this.onbeforeunload=null)}}},simulate:function(a,b,c,d){var e=p.extend(new p.Event,c,{type:a,isSimulated:!0,originalEvent:{}});d?p.event.trigger(e,null,b):p.event.dispatch.call(b,e),e.isDefaultPrevented()&&c.preventDefault()}},p.event.handle=p.event.dispatch,p.removeEvent=e.removeEventListener?function(a,b,c){a.removeEventListener&&a.removeEventListener(b,c,!1)}:function(a,b,c){var d="on"+b;a.detachEvent&&(typeof a[d]=="undefined"&&(a[d]=null),a.detachEvent(d,c))},p.Event=function(a,b){if(this instanceof p.Event)a&&a.type?(this.originalEvent=a,this.type=a.type,this.isDefaultPrevented=a.defaultPrevented||a.returnValue===!1||a.getPreventDefault&&a.getPreventDefault()?bb:ba):this.type=a,b&&p.extend(this,b),this.timeStamp=a&&a.timeStamp||p.now(),this[p.expando]=!0;else return new p.Event(a,b)},p.Event.prototype={preventDefault:function(){this.isDefaultPrevented=bb;var a=this.originalEvent;if(!a)return;a.preventDefault?a.preventDefault():a.returnValue=!1},stopPropagation:function(){this.isPropagationStopped=bb;var a=this.originalEvent;if(!a)return;a.stopPropagation&&a.stopPropagation(),a.cancelBubble=!0},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=bb,this.stopPropagation()},isDefaultPrevented:ba,isPropagationStopped:ba,isImmediatePropagationStopped:ba},p.each({mouseenter:"mouseover",mouseleave:"mouseout"},function(a,b){p.event.special[a]={delegateType:b,bindType:b,handle:function(a){var c,d=this,e=a.relatedTarget,f=a.handleObj,g=f.selector;if(!e||e!==d&&!p.contains(d,e))a.type=f.origType,c=f.handler.apply(this,arguments),a.type=b;return c}}}),p.support.submitBubbles||(p.event.special.submit={setup:function(){if(p.nodeName(this,"form"))return!1;p.event.add(this,"click._submit keypress._submit",function(a){var c=a.target,d=p.nodeName(c,"input")||p.nodeName(c,"button")?c.form:b;d&&!p._data(d,"_submit_attached")&&(p.event.add(d,"submit._submit",function(a){a._submit_bubble=!0}),p._data(d,"_submit_attached",!0))})},postDispatch:function(a){a._submit_bubble&&(delete a._submit_bubble,this.parentNode&&!a.isTrigger&&p.event.simulate("submit",this.parentNode,a,!0))},teardown:function(){if(p.nodeName(this,"form"))return!1;p.event.remove(this,"._submit")}}),p.support.changeBubbles||(p.event.special.change={setup:function(){if(V.test(this.nodeName)){if(this.type==="checkbox"||this.type==="radio")p.event.add(this,"propertychange._change",function(a){a.originalEvent.propertyName==="checked"&&(this._just_changed=!0)}),p.event.add(this,"click._change",function(a){this._just_changed&&!a.isTrigger&&(this._just_changed=!1),p.event.simulate("change",this,a,!0)});return!1}p.event.add(this,"beforeactivate._change",function(a){var b=a.target;V.test(b.nodeName)&&!p._data(b,"_change_attached")&&(p.event.add(b,"change._change",function(a){this.parentNode&&!a.isSimulated&&!a.isTrigger&&p.event.simulate("change",this.parentNode,a,!0)}),p._data(b,"_change_attached",!0))})},handle:function(a){var b=a.target;if(this!==b||a.isSimulated||a.isTrigger||b.type!=="radio"&&b.type!=="checkbox")return a.handleObj.handler.apply(this,arguments)},teardown:function(){return p.event.remove(this,"._change"),!V.test(this.nodeName)}}),p.support.focusinBubbles||p.each({focus:"focusin",blur:"focusout"},function(a,b){var c=0,d=function(a){p.event.simulate(b,a.target,p.event.fix(a),!0)};p.event.special[b]={setup:function(){c++===0&&e.addEventListener(a,d,!0)},teardown:function(){--c===0&&e.removeEventListener(a,d,!0)}}}),p.fn.extend({on:function(a,c,d,e,f){var g,h;if(typeof a=="object"){typeof c!="string"&&(d=d||c,c=b);for(h in a)this.on(h,c,d,a[h],f);return this}d==null&&e==null?(e=c,d=c=b):e==null&&(typeof c=="string"?(e=d,d=b):(e=d,d=c,c=b));if(e===!1)e=ba;else if(!e)return this;return f===1&&(g=e,e=function(a){return p().off(a),g.apply(this,arguments)},e.guid=g.guid||(g.guid=p.guid++)),this.each(function(){p.event.add(this,a,e,d,c)})},one:function(a,b,c,d){return this.on(a,b,c,d,1)},off:function(a,c,d){var e,f;if(a&&a.preventDefault&&a.handleObj)return e=a.handleObj,p(a.delegateTarget).off(e.namespace?e.origType+"."+e.namespace:e.origType,e.selector,e.handler),this;if(typeof a=="object"){for(f in a)this.off(f,c,a[f]);return this}if(c===!1||typeof c=="function")d=c,c=b;return d===!1&&(d=ba),this.each(function(){p.event.remove(this,a,d,c)})},bind:function(a,b,c){return this.on(a,null,b,c)},unbind:function(a,b){return this.off(a,null,b)},live:function(a,b,c){return p(this.context).on(a,this.selector,b,c),this},die:function(a,b){return p(this.context).off(a,this.selector||"**",b),this},delegate:function(a,b,c,d){return this.on(b,a,c,d)},undelegate:function(a,b,c){return arguments.length===1?this.off(a,"**"):this.off(b,a||"**",c)},trigger:function(a,b){return this.each(function(){p.event.trigger(a,b,this)})},triggerHandler:function(a,b){if(this[0])return p.event.trigger(a,b,this[0],!0)},toggle:function(a){var b=arguments,c=a.guid||p.guid++,d=0,e=function(c){var e=(p._data(this,"lastToggle"+a.guid)||0)%d;return p._data(this,"lastToggle"+a.guid,e+1),c.preventDefault(),b[e].apply(this,arguments)||!1};e.guid=c;while(d<b.length)b[d++].guid=c;return this.click(e)},hover:function(a,b){return this.mouseenter(a).mouseleave(b||a)}}),p.each("blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error contextmenu".split(" "),function(a,b){p.fn[b]=function(a,c){return c==null&&(c=a,a=null),arguments.length>0?this.on(b,null,a,c):this.trigger(b)},Y.test(b)&&(p.event.fixHooks[b]=p.event.keyHooks),Z.test(b)&&(p.event.fixHooks[b]=p.event.mouseHooks)}),function(a,b){function bc(a,b,c,d){c=c||[],b=b||r;var e,f,i,j,k=b.nodeType;if(!a||typeof a!="string")return c;if(k!==1&&k!==9)return[];i=g(b);if(!i&&!d)if(e=P.exec(a))if(j=e[1]){if(k===9){f=b.getElementById(j);if(!f||!f.parentNode)return c;if(f.id===j)return c.push(f),c}else if(b.ownerDocument&&(f=b.ownerDocument.getElementById(j))&&h(b,f)&&f.id===j)return c.push(f),c}else{if(e[2])return w.apply(c,x.call(b.getElementsByTagName(a),0)),c;if((j=e[3])&&_&&b.getElementsByClassName)return w.apply(c,x.call(b.getElementsByClassName(j),0)),c}return bp(a.replace(L,"$1"),b,c,d,i)}function bd(a){return function(b){var c=b.nodeName.toLowerCase();return c==="input"&&b.type===a}}function be(a){return function(b){var c=b.nodeName.toLowerCase();return(c==="input"||c==="button")&&b.type===a}}function bf(a){return z(function(b){return b=+b,z(function(c,d){var e,f=a([],c.length,b),g=f.length;while(g--)c[e=f[g]]&&(c[e]=!(d[e]=c[e]))})})}function bg(a,b,c){if(a===b)return c;var d=a.nextSibling;while(d){if(d===b)return-1;d=d.nextSibling}return 1}function bh(a,b){var c,d,f,g,h,i,j,k=C[o][a];if(k)return b?0:k.slice(0);h=a,i=[],j=e.preFilter;while(h){if(!c||(d=M.exec(h)))d&&(h=h.slice(d[0].length)),i.push(f=[]);c=!1;if(d=N.exec(h))f.push(c=new q(d.shift())),h=h.slice(c.length),c.type=d[0].replace(L," ");for(g in e.filter)(d=W[g].exec(h))&&(!j[g]||(d=j[g](d,r,!0)))&&(f.push(c=new q(d.shift())),h=h.slice(c.length),c.type=g,c.matches=d);if(!c)break}return b?h.length:h?bc.error(a):C(a,i).slice(0)}function bi(a,b,d){var e=b.dir,f=d&&b.dir==="parentNode",g=u++;return b.first?function(b,c,d){while(b=b[e])if(f||b.nodeType===1)return a(b,c,d)}:function(b,d,h){if(!h){var i,j=t+" "+g+" ",k=j+c;while(b=b[e])if(f||b.nodeType===1){if((i=b[o])===k)return b.sizset;if(typeof i=="string"&&i.indexOf(j)===0){if(b.sizset)return b}else{b[o]=k;if(a(b,d,h))return b.sizset=!0,b;b.sizset=!1}}}else while(b=b[e])if(f||b.nodeType===1)if(a(b,d,h))return b}}function bj(a){return a.length>1?function(b,c,d){var e=a.length;while(e--)if(!a[e](b,c,d))return!1;return!0}:a[0]}function bk(a,b,c,d,e){var f,g=[],h=0,i=a.length,j=b!=null;for(;h<i;h++)if(f=a[h])if(!c||c(f,d,e))g.push(f),j&&b.push(h);return g}function bl(a,b,c,d,e,f){return d&&!d[o]&&(d=bl(d)),e&&!e[o]&&(e=bl(e,f)),z(function(f,g,h,i){if(f&&e)return;var j,k,l,m=[],n=[],o=g.length,p=f||bo(b||"*",h.nodeType?[h]:h,[],f),q=a&&(f||!b)?bk(p,m,a,h,i):p,r=c?e||(f?a:o||d)?[]:g:q;c&&c(q,r,h,i);if(d){l=bk(r,n),d(l,[],h,i),j=l.length;while(j--)if(k=l[j])r[n[j]]=!(q[n[j]]=k)}if(f){j=a&&r.length;while(j--)if(k=r[j])f[m[j]]=!(g[m[j]]=k)}else r=bk(r===g?r.splice(o,r.length):r),e?e(null,g,r,i):w.apply(g,r)})}function bm(a){var b,c,d,f=a.length,g=e.relative[a[0].type],h=g||e.relative[" "],i=g?1:0,j=bi(function(a){return a===b},h,!0),k=bi(function(a){return y.call(b,a)>-1},h,!0),m=[function(a,c,d){return!g&&(d||c!==l)||((b=c).nodeType?j(a,c,d):k(a,c,d))}];for(;i<f;i++)if(c=e.relative[a[i].type])m=[bi(bj(m),c)];else{c=e.filter[a[i].type].apply(null,a[i].matches);if(c[o]){d=++i;for(;d<f;d++)if(e.relative[a[d].type])break;return bl(i>1&&bj(m),i>1&&a.slice(0,i-1).join("").replace(L,"$1"),c,i<d&&bm(a.slice(i,d)),d<f&&bm(a=a.slice(d)),d<f&&a.join(""))}m.push(c)}return bj(m)}function bn(a,b){var d=b.length>0,f=a.length>0,g=function(h,i,j,k,m){var n,o,p,q=[],s=0,u="0",x=h&&[],y=m!=null,z=l,A=h||f&&e.find.TAG("*",m&&i.parentNode||i),B=t+=z==null?1:Math.E;y&&(l=i!==r&&i,c=g.el);for(;(n=A[u])!=null;u++){if(f&&n){for(o=0;p=a[o];o++)if(p(n,i,j)){k.push(n);break}y&&(t=B,c=++g.el)}d&&((n=!p&&n)&&s--,h&&x.push(n))}s+=u;if(d&&u!==s){for(o=0;p=b[o];o++)p(x,q,i,j);if(h){if(s>0)while(u--)!x[u]&&!q[u]&&(q[u]=v.call(k));q=bk(q)}w.apply(k,q),y&&!h&&q.length>0&&s+b.length>1&&bc.uniqueSort(k)}return y&&(t=B,l=z),x};return g.el=0,d?z(g):g}function bo(a,b,c,d){var e=0,f=b.length;for(;e<f;e++)bc(a,b[e],c,d);return c}function bp(a,b,c,d,f){var g,h,j,k,l,m=bh(a),n=m.length;if(!d&&m.length===1){h=m[0]=m[0].slice(0);if(h.length>2&&(j=h[0]).type==="ID"&&b.nodeType===9&&!f&&e.relative[h[1].type]){b=e.find.ID(j.matches[0].replace(V,""),b,f)[0];if(!b)return c;a=a.slice(h.shift().length)}for(g=W.POS.test(a)?-1:h.length-1;g>=0;g--){j=h[g];if(e.relative[k=j.type])break;if(l=e.find[k])if(d=l(j.matches[0].replace(V,""),R.test(h[0].type)&&b.parentNode||b,f)){h.splice(g,1),a=d.length&&h.join("");if(!a)return w.apply(c,x.call(d,0)),c;break}}}return i(a,m)(d,b,f,c,R.test(a)),c}function bq(){}var c,d,e,f,g,h,i,j,k,l,m=!0,n="undefined",o=("sizcache"+Math.random()).replace(".",""),q=String,r=a.document,s=r.documentElement,t=0,u=0,v=[].pop,w=[].push,x=[].slice,y=[].indexOf||function(a){var b=0,c=this.length;for(;b<c;b++)if(this[b]===a)return b;return-1},z=function(a,b){return a[o]=b==null||b,a},A=function(){var a={},b=[];return z(function(c,d){return b.push(c)>e.cacheLength&&delete a[b.shift()],a[c]=d},a)},B=A(),C=A(),D=A(),E="[\\x20\\t\\r\\n\\f]",F="(?:\\\\.|[-\\w]|[^\\x00-\\xa0])+",G=F.replace("w","w#"),H="([*^$|!~]?=)",I="\\["+E+"*("+F+")"+E+"*(?:"+H+E+"*(?:(['\"])((?:\\\\.|[^\\\\])*?)\\3|("+G+")|)|)"+E+"*\\]",J=":("+F+")(?:\\((?:(['\"])((?:\\\\.|[^\\\\])*?)\\2|([^()[\\]]*|(?:(?:"+I+")|[^:]|\\\\.)*|.*))\\)|)",K=":(even|odd|eq|gt|lt|nth|first|last)(?:\\("+E+"*((?:-\\d)?\\d*)"+E+"*\\)|)(?=[^-]|$)",L=new RegExp("^"+E+"+|((?:^|[^\\\\])(?:\\\\.)*)"+E+"+$","g"),M=new RegExp("^"+E+"*,"+E+"*"),N=new RegExp("^"+E+"*([\\x20\\t\\r\\n\\f>+~])"+E+"*"),O=new RegExp(J),P=/^(?:#([\w\-]+)|(\w+)|\.([\w\-]+))$/,Q=/^:not/,R=/[\x20\t\r\n\f]*[+~]/,S=/:not\($/,T=/h\d/i,U=/input|select|textarea|button/i,V=/\\(?!\\)/g,W={ID:new RegExp("^#("+F+")"),CLASS:new RegExp("^\\.("+F+")"),NAME:new RegExp("^\\[name=['\"]?("+F+")['\"]?\\]"),TAG:new RegExp("^("+F.replace("w","w*")+")"),ATTR:new RegExp("^"+I),PSEUDO:new RegExp("^"+J),POS:new RegExp(K,"i"),CHILD:new RegExp("^:(only|nth|first|last)-child(?:\\("+E+"*(even|odd|(([+-]|)(\\d*)n|)"+E+"*(?:([+-]|)"+E+"*(\\d+)|))"+E+"*\\)|)","i"),needsContext:new RegExp("^"+E+"*[>+~]|"+K,"i")},X=function(a){var b=r.createElement("div");try{return a(b)}catch(c){return!1}finally{b=null}},Y=X(function(a){return a.appendChild(r.createComment("")),!a.getElementsByTagName("*").length}),Z=X(function(a){return a.innerHTML="<a href='#'></a>",a.firstChild&&typeof a.firstChild.getAttribute!==n&&a.firstChild.getAttribute("href")==="#"}),$=X(function(a){a.innerHTML="<select></select>";var b=typeof a.lastChild.getAttribute("multiple");return b!=="boolean"&&b!=="string"}),_=X(function(a){return a.innerHTML="<div class='hidden e'></div><div class='hidden'></div>",!a.getElementsByClassName||!a.getElementsByClassName("e").length?!1:(a.lastChild.className="e",a.getElementsByClassName("e").length===2)}),ba=X(function(a){a.id=o+0,a.innerHTML="<a name='"+o+"'></a><div name='"+o+"'></div>",s.insertBefore(a,s.firstChild);var b=r.getElementsByName&&r.getElementsByName(o).length===2+r.getElementsByName(o+0).length;return d=!r.getElementById(o),s.removeChild(a),b});try{x.call(s.childNodes,0)[0].nodeType}catch(bb){x=function(a){var b,c=[];for(;b=this[a];a++)c.push(b);return c}}bc.matches=function(a,b){return bc(a,null,null,b)},bc.matchesSelector=function(a,b){return bc(b,null,null,[a]).length>0},f=bc.getText=function(a){var b,c="",d=0,e=a.nodeType;if(e){if(e===1||e===9||e===11){if(typeof a.textContent=="string")return a.textContent;for(a=a.firstChild;a;a=a.nextSibling)c+=f(a)}else if(e===3||e===4)return a.nodeValue}else for(;b=a[d];d++)c+=f(b);return c},g=bc.isXML=function(a){var b=a&&(a.ownerDocument||a).documentElement;return b?b.nodeName!=="HTML":!1},h=bc.contains=s.contains?function(a,b){var c=a.nodeType===9?a.documentElement:a,d=b&&b.parentNode;return a===d||!!(d&&d.nodeType===1&&c.contains&&c.contains(d))}:s.compareDocumentPosition?function(a,b){return b&&!!(a.compareDocumentPosition(b)&16)}:function(a,b){while(b=b.parentNode)if(b===a)return!0;return!1},bc.attr=function(a,b){var c,d=g(a);return d||(b=b.toLowerCase()),(c=e.attrHandle[b])?c(a):d||$?a.getAttribute(b):(c=a.getAttributeNode(b),c?typeof a[b]=="boolean"?a[b]?b:null:c.specified?c.value:null:null)},e=bc.selectors={cacheLength:50,createPseudo:z,match:W,attrHandle:Z?{}:{href:function(a){return a.getAttribute("href",2)},type:function(a){return a.getAttribute("type")}},find:{ID:d?function(a,b,c){if(typeof b.getElementById!==n&&!c){var d=b.getElementById(a);return d&&d.parentNode?[d]:[]}}:function(a,c,d){if(typeof c.getElementById!==n&&!d){var e=c.getElementById(a);return e?e.id===a||typeof e.getAttributeNode!==n&&e.getAttributeNode("id").value===a?[e]:b:[]}},TAG:Y?function(a,b){if(typeof b.getElementsByTagName!==n)return b.getElementsByTagName(a)}:function(a,b){var c=b.getElementsByTagName(a);if(a==="*"){var d,e=[],f=0;for(;d=c[f];f++)d.nodeType===1&&e.push(d);return e}return c},NAME:ba&&function(a,b){if(typeof b.getElementsByName!==n)return b.getElementsByName(name)},CLASS:_&&function(a,b,c){if(typeof b.getElementsByClassName!==n&&!c)return b.getElementsByClassName(a)}},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(a){return a[1]=a[1].replace(V,""),a[3]=(a[4]||a[5]||"").replace(V,""),a[2]==="~="&&(a[3]=" "+a[3]+" "),a.slice(0,4)},CHILD:function(a){return a[1]=a[1].toLowerCase(),a[1]==="nth"?(a[2]||bc.error(a[0]),a[3]=+(a[3]?a[4]+(a[5]||1):2*(a[2]==="even"||a[2]==="odd")),a[4]=+(a[6]+a[7]||a[2]==="odd")):a[2]&&bc.error(a[0]),a},PSEUDO:function(a){var b,c;if(W.CHILD.test(a[0]))return null;if(a[3])a[2]=a[3];else if(b=a[4])O.test(b)&&(c=bh(b,!0))&&(c=b.indexOf(")",b.length-c)-b.length)&&(b=b.slice(0,c),a[0]=a[0].slice(0,c)),a[2]=b;return a.slice(0,3)}},filter:{ID:d?function(a){return a=a.replace(V,""),function(b){return b.getAttribute("id")===a}}:function(a){return a=a.replace(V,""),function(b){var c=typeof b.getAttributeNode!==n&&b.getAttributeNode("id");return c&&c.value===a}},TAG:function(a){return a==="*"?function(){return!0}:(a=a.replace(V,"").toLowerCase(),function(b){return b.nodeName&&b.nodeName.toLowerCase()===a})},CLASS:function(a){var b=B[o][a];return b||(b=B(a,new RegExp("(^|"+E+")"+a+"("+E+"|$)"))),function(a){return b.test(a.className||typeof a.getAttribute!==n&&a.getAttribute("class")||"")}},ATTR:function(a,b,c){return function(d,e){var f=bc.attr(d,a);return f==null?b==="!=":b?(f+="",b==="="?f===c:b==="!="?f!==c:b==="^="?c&&f.indexOf(c)===0:b==="*="?c&&f.indexOf(c)>-1:b==="$="?c&&f.substr(f.length-c.length)===c:b==="~="?(" "+f+" ").indexOf(c)>-1:b==="|="?f===c||f.substr(0,c.length+1)===c+"-":!1):!0}},CHILD:function(a,b,c,d){return a==="nth"?function(a){var b,e,f=a.parentNode;if(c===1&&d===0)return!0;if(f){e=0;for(b=f.firstChild;b;b=b.nextSibling)if(b.nodeType===1){e++;if(a===b)break}}return e-=d,e===c||e%c===0&&e/c>=0}:function(b){var c=b;switch(a){case"only":case"first":while(c=c.previousSibling)if(c.nodeType===1)return!1;if(a==="first")return!0;c=b;case"last":while(c=c.nextSibling)if(c.nodeType===1)return!1;return!0}}},PSEUDO:function(a,b){var c,d=e.pseudos[a]||e.setFilters[a.toLowerCase()]||bc.error("unsupported pseudo: "+a);return d[o]?d(b):d.length>1?(c=[a,a,"",b],e.setFilters.hasOwnProperty(a.toLowerCase())?z(function(a,c){var e,f=d(a,b),g=f.length;while(g--)e=y.call(a,f[g]),a[e]=!(c[e]=f[g])}):function(a){return d(a,0,c)}):d}},pseudos:{not:z(function(a){var b=[],c=[],d=i(a.replace(L,"$1"));return d[o]?z(function(a,b,c,e){var f,g=d(a,null,e,[]),h=a.length;while(h--)if(f=g[h])a[h]=!(b[h]=f)}):function(a,e,f){return b[0]=a,d(b,null,f,c),!c.pop()}}),has:z(function(a){return function(b){return bc(a,b).length>0}}),contains:z(function(a){return function(b){return(b.textContent||b.innerText||f(b)).indexOf(a)>-1}}),enabled:function(a){return a.disabled===!1},disabled:function(a){return a.disabled===!0},checked:function(a){var b=a.nodeName.toLowerCase();return b==="input"&&!!a.checked||b==="option"&&!!a.selected},selected:function(a){return a.parentNode&&a.parentNode.selectedIndex,a.selected===!0},parent:function(a){return!e.pseudos.empty(a)},empty:function(a){var b;a=a.firstChild;while(a){if(a.nodeName>"@"||(b=a.nodeType)===3||b===4)return!1;a=a.nextSibling}return!0},header:function(a){return T.test(a.nodeName)},text:function(a){var b,c;return a.nodeName.toLowerCase()==="input"&&(b=a.type)==="text"&&((c=a.getAttribute("type"))==null||c.toLowerCase()===b)},radio:bd("radio"),checkbox:bd("checkbox"),file:bd("file"),password:bd("password"),image:bd("image"),submit:be("submit"),reset:be("reset"),button:function(a){var b=a.nodeName.toLowerCase();return b==="input"&&a.type==="button"||b==="button"},input:function(a){return U.test(a.nodeName)},focus:function(a){var b=a.ownerDocument;return a===b.activeElement&&(!b.hasFocus||b.hasFocus())&&(!!a.type||!!a.href)},active:function(a){return a===a.ownerDocument.activeElement},first:bf(function(a,b,c){return[0]}),last:bf(function(a,b,c){return[b-1]}),eq:bf(function(a,b,c){return[c<0?c+b:c]}),even:bf(function(a,b,c){for(var d=0;d<b;d+=2)a.push(d);return a}),odd:bf(function(a,b,c){for(var d=1;d<b;d+=2)a.push(d);return a}),lt:bf(function(a,b,c){for(var d=c<0?c+b:c;--d>=0;)a.push(d);return a}),gt:bf(function(a,b,c){for(var d=c<0?c+b:c;++d<b;)a.push(d);return a})}},j=s.compareDocumentPosition?function(a,b){return a===b?(k=!0,0):(!a.compareDocumentPosition||!b.compareDocumentPosition?a.compareDocumentPosition:a.compareDocumentPosition(b)&4)?-1:1}:function(a,b){if(a===b)return k=!0,0;if(a.sourceIndex&&b.sourceIndex)return a.sourceIndex-b.sourceIndex;var c,d,e=[],f=[],g=a.parentNode,h=b.parentNode,i=g;if(g===h)return bg(a,b);if(!g)return-1;if(!h)return 1;while(i)e.unshift(i),i=i.parentNode;i=h;while(i)f.unshift(i),i=i.parentNode;c=e.length,d=f.length;for(var j=0;j<c&&j<d;j++)if(e[j]!==f[j])return bg(e[j],f[j]);return j===c?bg(a,f[j],-1):bg(e[j],b,1)},[0,0].sort(j),m=!k,bc.uniqueSort=function(a){var b,c=1;k=m,a.sort(j);if(k)for(;b=a[c];c++)b===a[c-1]&&a.splice(c--,1);return a},bc.error=function(a){throw new Error("Syntax error, unrecognized expression: "+a)},i=bc.compile=function(a,b){var c,d=[],e=[],f=D[o][a];if(!f){b||(b=bh(a)),c=b.length;while(c--)f=bm(b[c]),f[o]?d.push(f):e.push(f);f=D(a,bn(e,d))}return f},r.querySelectorAll&&function(){var a,b=bp,c=/'|\\/g,d=/\=[\x20\t\r\n\f]*([^'"\]]*)[\x20\t\r\n\f]*\]/g,e=[":focus"],f=[":active",":focus"],h=s.matchesSelector||s.mozMatchesSelector||s.webkitMatchesSelector||s.oMatchesSelector||s.msMatchesSelector;X(function(a){a.innerHTML="<select><option selected=''></option></select>",a.querySelectorAll("[selected]").length||e.push("\\["+E+"*(?:checked|disabled|ismap|multiple|readonly|selected|value)"),a.querySelectorAll(":checked").length||e.push(":checked")}),X(function(a){a.innerHTML="<p test=''></p>",a.querySelectorAll("[test^='']").length&&e.push("[*^$]="+E+"*(?:\"\"|'')"),a.innerHTML="<input type='hidden'/>",a.querySelectorAll(":enabled").length||e.push(":enabled",":disabled")}),e=new RegExp(e.join("|")),bp=function(a,d,f,g,h){if(!g&&!h&&(!e||!e.test(a))){var i,j,k=!0,l=o,m=d,n=d.nodeType===9&&a;if(d.nodeType===1&&d.nodeName.toLowerCase()!=="object"){i=bh(a),(k=d.getAttribute("id"))?l=k.replace(c,"\\$&"):d.setAttribute("id",l),l="[id='"+l+"'] ",j=i.length;while(j--)i[j]=l+i[j].join("");m=R.test(a)&&d.parentNode||d,n=i.join(",")}if(n)try{return w.apply(f,x.call(m.querySelectorAll(n),0)),f}catch(p){}finally{k||d.removeAttribute("id")}}return b(a,d,f,g,h)},h&&(X(function(b){a=h.call(b,"div");try{h.call(b,"[test!='']:sizzle"),f.push("!=",J)}catch(c){}}),f=new RegExp(f.join("|")),bc.matchesSelector=function(b,c){c=c.replace(d,"='$1']");if(!g(b)&&!f.test(c)&&(!e||!e.test(c)))try{var i=h.call(b,c);if(i||a||b.document&&b.document.nodeType!==11)return i}catch(j){}return bc(c,null,null,[b]).length>0})}(),e.pseudos.nth=e.pseudos.eq,e.filters=bq.prototype=e.pseudos,e.setFilters=new bq,bc.attr=p.attr,p.find=bc,p.expr=bc.selectors,p.expr[":"]=p.expr.pseudos,p.unique=bc.uniqueSort,p.text=bc.getText,p.isXMLDoc=bc.isXML,p.contains=bc.contains}(a);var bc=/Until$/,bd=/^(?:parents|prev(?:Until|All))/,be=/^.[^:#\[\.,]*$/,bf=p.expr.match.needsContext,bg={children:!0,contents:!0,next:!0,prev:!0};p.fn.extend({find:function(a){var b,c,d,e,f,g,h=this;if(typeof a!="string")return p(a).filter(function(){for(b=0,c=h.length;b<c;b++)if(p.contains(h[b],this))return!0});g=this.pushStack("","find",a);for(b=0,c=this.length;b<c;b++){d=g.length,p.find(a,this[b],g);if(b>0)for(e=d;e<g.length;e++)for(f=0;f<d;f++)if(g[f]===g[e]){g.splice(e--,1);break}}return g},has:function(a){var b,c=p(a,this),d=c.length;return this.filter(function(){for(b=0;b<d;b++)if(p.contains(this,c[b]))return!0})},not:function(a){return this.pushStack(bj(this,a,!1),"not",a)},filter:function(a){return this.pushStack(bj(this,a,!0),"filter",a)},is:function(a){return!!a&&(typeof a=="string"?bf.test(a)?p(a,this.context).index(this[0])>=0:p.filter(a,this).length>0:this.filter(a).length>0)},closest:function(a,b){var c,d=0,e=this.length,f=[],g=bf.test(a)||typeof a!="string"?p(a,b||this.context):0;for(;d<e;d++){c=this[d];while(c&&c.ownerDocument&&c!==b&&c.nodeType!==11){if(g?g.index(c)>-1:p.find.matchesSelector(c,a)){f.push(c);break}c=c.parentNode}}return f=f.length>1?p.unique(f):f,this.pushStack(f,"closest",a)},index:function(a){return a?typeof a=="string"?p.inArray(this[0],p(a)):p.inArray(a.jquery?a[0]:a,this):this[0]&&this[0].parentNode?this.prevAll().length:-1},add:function(a,b){var c=typeof a=="string"?p(a,b):p.makeArray(a&&a.nodeType?[a]:a),d=p.merge(this.get(),c);return this.pushStack(bh(c[0])||bh(d[0])?d:p.unique(d))},addBack:function(a){return this.add(a==null?this.prevObject:this.prevObject.filter(a))}}),p.fn.andSelf=p.fn.addBack,p.each({parent:function(a){var b=a.parentNode;return b&&b.nodeType!==11?b:null},parents:function(a){return p.dir(a,"parentNode")},parentsUntil:function(a,b,c){return p.dir(a,"parentNode",c)},next:function(a){return bi(a,"nextSibling")},prev:function(a){return bi(a,"previousSibling")},nextAll:function(a){return p.dir(a,"nextSibling")},prevAll:function(a){return p.dir(a,"previousSibling")},nextUntil:function(a,b,c){return p.dir(a,"nextSibling",c)},prevUntil:function(a,b,c){return p.dir(a,"previousSibling",c)},siblings:function(a){return p.sibling((a.parentNode||{}).firstChild,a)},children:function(a){return p.sibling(a.firstChild)},contents:function(a){return p.nodeName(a,"iframe")?a.contentDocument||a.contentWindow.document:p.merge([],a.childNodes)}},function(a,b){p.fn[a]=function(c,d){var e=p.map(this,b,c);return bc.test(a)||(d=c),d&&typeof d=="string"&&(e=p.filter(d,e)),e=this.length>1&&!bg[a]?p.unique(e):e,this.length>1&&bd.test(a)&&(e=e.reverse()),this.pushStack(e,a,k.call(arguments).join(","))}}),p.extend({filter:function(a,b,c){return c&&(a=":not("+a+")"),b.length===1?p.find.matchesSelector(b[0],a)?[b[0]]:[]:p.find.matches(a,b)},dir:function(a,c,d){var e=[],f=a[c];while(f&&f.nodeType!==9&&(d===b||f.nodeType!==1||!p(f).is(d)))f.nodeType===1&&e.push(f),f=f[c];return e},sibling:function(a,b){var c=[];for(;a;a=a.nextSibling)a.nodeType===1&&a!==b&&c.push(a);return c}});var bl="abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",bm=/ jQuery\d+="(?:null|\d+)"/g,bn=/^\s+/,bo=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,bp=/<([\w:]+)/,bq=/<tbody/i,br=/<|&#?\w+;/,bs=/<(?:script|style|link)/i,bt=/<(?:script|object|embed|option|style)/i,bu=new RegExp("<(?:"+bl+")[\\s/>]","i"),bv=/^(?:checkbox|radio)$/,bw=/checked\s*(?:[^=]|=\s*.checked.)/i,bx=/\/(java|ecma)script/i,by=/^\s*<!(?:\[CDATA\[|\-\-)|[\]\-]{2}>\s*$/g,bz={option:[1,"<select multiple='multiple'>","</select>"],legend:[1,"<fieldset>","</fieldset>"],thead:[1,"<table>","</table>"],tr:[2,"<table><tbody>","</tbody></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],col:[2,"<table><tbody></tbody><colgroup>","</colgroup></table>"],area:[1,"<map>","</map>"],_default:[0,"",""]},bA=bk(e),bB=bA.appendChild(e.createElement("div"));bz.optgroup=bz.option,bz.tbody=bz.tfoot=bz.colgroup=bz.caption=bz.thead,bz.th=bz.td,p.support.htmlSerialize||(bz._default=[1,"X<div>","</div>"]),p.fn.extend({text:function(a){return p.access(this,function(a){return a===b?p.text(this):this.empty().append((this[0]&&this[0].ownerDocument||e).createTextNode(a))},null,a,arguments.length)},wrapAll:function(a){if(p.isFunction(a))return this.each(function(b){p(this).wrapAll(a.call(this,b))});if(this[0]){var b=p(a,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&b.insertBefore(this[0]),b.map(function(){var a=this;while(a.firstChild&&a.firstChild.nodeType===1)a=a.firstChild;return a}).append(this)}return this},wrapInner:function(a){return p.isFunction(a)?this.each(function(b){p(this).wrapInner(a.call(this,b))}):this.each(function(){var b=p(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){var b=p.isFunction(a);return this.each(function(c){p(this).wrapAll(b?a.call(this,c):a)})},unwrap:function(){return this.parent().each(function(){p.nodeName(this,"body")||p(this).replaceWith(this.childNodes)}).end()},append:function(){return this.domManip(arguments,!0,function(a){(this.nodeType===1||this.nodeType===11)&&this.appendChild(a)})},prepend:function(){return this.domManip(arguments,!0,function(a){(this.nodeType===1||this.nodeType===11)&&this.insertBefore(a,this.firstChild)})},before:function(){if(!bh(this[0]))return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this)});if(arguments.length){var a=p.clean(arguments);return this.pushStack(p.merge(a,this),"before",this.selector)}},after:function(){if(!bh(this[0]))return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this.nextSibling)});if(arguments.length){var a=p.clean(arguments);return this.pushStack(p.merge(this,a),"after",this.selector)}},remove:function(a,b){var c,d=0;for(;(c=this[d])!=null;d++)if(!a||p.filter(a,[c]).length)!b&&c.nodeType===1&&(p.cleanData(c.getElementsByTagName("*")),p.cleanData([c])),c.parentNode&&c.parentNode.removeChild(c);return this},empty:function(){var a,b=0;for(;(a=this[b])!=null;b++){a.nodeType===1&&p.cleanData(a.getElementsByTagName("*"));while(a.firstChild)a.removeChild(a.firstChild)}return this},clone:function(a,b){return a=a==null?!1:a,b=b==null?a:b,this.map(function(){return p.clone(this,a,b)})},html:function(a){return p.access(this,function(a){var c=this[0]||{},d=0,e=this.length;if(a===b)return c.nodeType===1?c.innerHTML.replace(bm,""):b;if(typeof a=="string"&&!bs.test(a)&&(p.support.htmlSerialize||!bu.test(a))&&(p.support.leadingWhitespace||!bn.test(a))&&!bz[(bp.exec(a)||["",""])[1].toLowerCase()]){a=a.replace(bo,"<$1></$2>");try{for(;d<e;d++)c=this[d]||{},c.nodeType===1&&(p.cleanData(c.getElementsByTagName("*")),c.innerHTML=a);c=0}catch(f){}}c&&this.empty().append(a)},null,a,arguments.length)},replaceWith:function(a){return bh(this[0])?this.length?this.pushStack(p(p.isFunction(a)?a():a),"replaceWith",a):this:p.isFunction(a)?this.each(function(b){var c=p(this),d=c.html();c.replaceWith(a.call(this,b,d))}):(typeof a!="string"&&(a=p(a).detach()),this.each(function(){var b=this.nextSibling,c=this.parentNode;p(this).remove(),b?p(b).before(a):p(c).append(a)}))},detach:function(a){return this.remove(a,!0)},domManip:function(a,c,d){a=[].concat.apply([],a);var e,f,g,h,i=0,j=a[0],k=[],l=this.length;if(!p.support.checkClone&&l>1&&typeof j=="string"&&bw.test(j))return this.each(function(){p(this).domManip(a,c,d)});if(p.isFunction(j))return this.each(function(e){var f=p(this);a[0]=j.call(this,e,c?f.html():b),f.domManip(a,c,d)});if(this[0]){e=p.buildFragment(a,this,k),g=e.fragment,f=g.firstChild,g.childNodes.length===1&&(g=f);if(f){c=c&&p.nodeName(f,"tr");for(h=e.cacheable||l-1;i<l;i++)d.call(c&&p.nodeName(this[i],"table")?bC(this[i],"tbody"):this[i],i===h?g:p.clone(g,!0,!0))}g=f=null,k.length&&p.each(k,function(a,b){b.src?p.ajax?p.ajax({url:b.src,type:"GET",dataType:"script",async:!1,global:!1,"throws":!0}):p.error("no ajax"):p.globalEval((b.text||b.textContent||b.innerHTML||"").replace(by,"")),b.parentNode&&b.parentNode.removeChild(b)})}return this}}),p.buildFragment=function(a,c,d){var f,g,h,i=a[0];return c=c||e,c=!c.nodeType&&c[0]||c,c=c.ownerDocument||c,a.length===1&&typeof i=="string"&&i.length<512&&c===e&&i.charAt(0)==="<"&&!bt.test(i)&&(p.support.checkClone||!bw.test(i))&&(p.support.html5Clone||!bu.test(i))&&(g=!0,f=p.fragments[i],h=f!==b),f||(f=c.createDocumentFragment(),p.clean(a,c,f,d),g&&(p.fragments[i]=h&&f)),{fragment:f,cacheable:g}},p.fragments={},p.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){p.fn[a]=function(c){var d,e=0,f=[],g=p(c),h=g.length,i=this.length===1&&this[0].parentNode;if((i==null||i&&i.nodeType===11&&i.childNodes.length===1)&&h===1)return g[b](this[0]),this;for(;e<h;e++)d=(e>0?this.clone(!0):this).get(),p(g[e])[b](d),f=f.concat(d);return this.pushStack(f,a,g.selector)}}),p.extend({clone:function(a,b,c){var d,e,f,g;p.support.html5Clone||p.isXMLDoc(a)||!bu.test("<"+a.nodeName+">")?g=a.cloneNode(!0):(bB.innerHTML=a.outerHTML,bB.removeChild(g=bB.firstChild));if((!p.support.noCloneEvent||!p.support.noCloneChecked)&&(a.nodeType===1||a.nodeType===11)&&!p.isXMLDoc(a)){bE(a,g),d=bF(a),e=bF(g);for(f=0;d[f];++f)e[f]&&bE(d[f],e[f])}if(b){bD(a,g);if(c){d=bF(a),e=bF(g);for(f=0;d[f];++f)bD(d[f],e[f])}}return d=e=null,g},clean:function(a,b,c,d){var f,g,h,i,j,k,l,m,n,o,q,r,s=b===e&&bA,t=[];if(!b||typeof b.createDocumentFragment=="undefined")b=e;for(f=0;(h=a[f])!=null;f++){typeof h=="number"&&(h+="");if(!h)continue;if(typeof h=="string")if(!br.test(h))h=b.createTextNode(h);else{s=s||bk(b),l=b.createElement("div"),s.appendChild(l),h=h.replace(bo,"<$1></$2>"),i=(bp.exec(h)||["",""])[1].toLowerCase(),j=bz[i]||bz._default,k=j[0],l.innerHTML=j[1]+h+j[2];while(k--)l=l.lastChild;if(!p.support.tbody){m=bq.test(h),n=i==="table"&&!m?l.firstChild&&l.firstChild.childNodes:j[1]==="<table>"&&!m?l.childNodes:[];for(g=n.length-1;g>=0;--g)p.nodeName(n[g],"tbody")&&!n[g].childNodes.length&&n[g].parentNode.removeChild(n[g])}!p.support.leadingWhitespace&&bn.test(h)&&l.insertBefore(b.createTextNode(bn.exec(h)[0]),l.firstChild),h=l.childNodes,l.parentNode.removeChild(l)}h.nodeType?t.push(h):p.merge(t,h)}l&&(h=l=s=null);if(!p.support.appendChecked)for(f=0;(h=t[f])!=null;f++)p.nodeName(h,"input")?bG(h):typeof h.getElementsByTagName!="undefined"&&p.grep(h.getElementsByTagName("input"),bG);if(c){q=function(a){if(!a.type||bx.test(a.type))return d?d.push(a.parentNode?a.parentNode.removeChild(a):a):c.appendChild(a)};for(f=0;(h=t[f])!=null;f++)if(!p.nodeName(h,"script")||!q(h))c.appendChild(h),typeof h.getElementsByTagName!="undefined"&&(r=p.grep(p.merge([],h.getElementsByTagName("script")),q),t.splice.apply(t,[f+1,0].concat(r)),f+=r.length)}return t},cleanData:function(a,b){var c,d,e,f,g=0,h=p.expando,i=p.cache,j=p.support.deleteExpando,k=p.event.special;for(;(e=a[g])!=null;g++)if(b||p.acceptData(e)){d=e[h],c=d&&i[d];if(c){if(c.events)for(f in c.events)k[f]?p.event.remove(e,f):p.removeEvent(e,f,c.handle);i[d]&&(delete i[d],j?delete e[h]:e.removeAttribute?e.removeAttribute(h):e[h]=null,p.deletedIds.push(d))}}}}),function(){var a,b;p.uaMatch=function(a){a=a.toLowerCase();var b=/(chrome)[ \/]([\w.]+)/.exec(a)||/(webkit)[ \/]([\w.]+)/.exec(a)||/(opera)(?:.*version|)[ \/]([\w.]+)/.exec(a)||/(msie) ([\w.]+)/.exec(a)||a.indexOf("compatible")<0&&/(mozilla)(?:.*? rv:([\w.]+)|)/.exec(a)||[];return{browser:b[1]||"",version:b[2]||"0"}},a=p.uaMatch(g.userAgent),b={},a.browser&&(b[a.browser]=!0,b.version=a.version),b.chrome?b.webkit=!0:b.webkit&&(b.safari=!0),p.browser=b,p.sub=function(){function a(b,c){return new a.fn.init(b,c)}p.extend(!0,a,this),a.superclass=this,a.fn=a.prototype=this(),a.fn.constructor=a,a.sub=this.sub,a.fn.init=function c(c,d){return d&&d instanceof p&&!(d instanceof a)&&(d=a(d)),p.fn.init.call(this,c,d,b)},a.fn.init.prototype=a.fn;var b=a(e);return a}}();var bH,bI,bJ,bK=/alpha\([^)]*\)/i,bL=/opacity=([^)]*)/,bM=/^(top|right|bottom|left)$/,bN=/^(none|table(?!-c[ea]).+)/,bO=/^margin/,bP=new RegExp("^("+q+")(.*)$","i"),bQ=new RegExp("^("+q+")(?!px)[a-z%]+$","i"),bR=new RegExp("^([-+])=("+q+")","i"),bS={},bT={position:"absolute",visibility:"hidden",display:"block"},bU={letterSpacing:0,fontWeight:400},bV=["Top","Right","Bottom","Left"],bW=["Webkit","O","Moz","ms"],bX=p.fn.toggle;p.fn.extend({css:function(a,c){return p.access(this,function(a,c,d){return d!==b?p.style(a,c,d):p.css(a,c)},a,c,arguments.length>1)},show:function(){return b$(this,!0)},hide:function(){return b$(this)},toggle:function(a,b){var c=typeof a=="boolean";return p.isFunction(a)&&p.isFunction(b)?bX.apply(this,arguments):this.each(function(){(c?a:bZ(this))?p(this).show():p(this).hide()})}}),p.extend({cssHooks:{opacity:{get:function(a,b){if(b){var c=bH(a,"opacity");return c===""?"1":c}}}},cssNumber:{fillOpacity:!0,fontWeight:!0,lineHeight:!0,opacity:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":p.support.cssFloat?"cssFloat":"styleFloat"},style:function(a,c,d,e){if(!a||a.nodeType===3||a.nodeType===8||!a.style)return;var f,g,h,i=p.camelCase(c),j=a.style;c=p.cssProps[i]||(p.cssProps[i]=bY(j,i)),h=p.cssHooks[c]||p.cssHooks[i];if(d===b)return h&&"get"in h&&(f=h.get(a,!1,e))!==b?f:j[c];g=typeof d,g==="string"&&(f=bR.exec(d))&&(d=(f[1]+1)*f[2]+parseFloat(p.css(a,c)),g="number");if(d==null||g==="number"&&isNaN(d))return;g==="number"&&!p.cssNumber[i]&&(d+="px");if(!h||!("set"in h)||(d=h.set(a,d,e))!==b)try{j[c]=d}catch(k){}},css:function(a,c,d,e){var f,g,h,i=p.camelCase(c);return c=p.cssProps[i]||(p.cssProps[i]=bY(a.style,i)),h=p.cssHooks[c]||p.cssHooks[i],h&&"get"in h&&(f=h.get(a,!0,e)),f===b&&(f=bH(a,c)),f==="normal"&&c in bU&&(f=bU[c]),d||e!==b?(g=parseFloat(f),d||p.isNumeric(g)?g||0:f):f},swap:function(a,b,c){var d,e,f={};for(e in b)f[e]=a.style[e],a.style[e]=b[e];d=c.call(a);for(e in b)a.style[e]=f[e];return d}}),a.getComputedStyle?bH=function(b,c){var d,e,f,g,h=a.getComputedStyle(b,null),i=b.style;return h&&(d=h[c],d===""&&!p.contains(b.ownerDocument,b)&&(d=p.style(b,c)),bQ.test(d)&&bO.test(c)&&(e=i.width,f=i.minWidth,g=i.maxWidth,i.minWidth=i.maxWidth=i.width=d,d=h.width,i.width=e,i.minWidth=f,i.maxWidth=g)),d}:e.documentElement.currentStyle&&(bH=function(a,b){var c,d,e=a.currentStyle&&a.currentStyle[b],f=a.style;return e==null&&f&&f[b]&&(e=f[b]),bQ.test(e)&&!bM.test(b)&&(c=f.left,d=a.runtimeStyle&&a.runtimeStyle.left,d&&(a.runtimeStyle.left=a.currentStyle.left),f.left=b==="fontSize"?"1em":e,e=f.pixelLeft+"px",f.left=c,d&&(a.runtimeStyle.left=d)),e===""?"auto":e}),p.each(["height","width"],function(a,b){p.cssHooks[b]={get:function(a,c,d){if(c)return a.offsetWidth===0&&bN.test(bH(a,"display"))?p.swap(a,bT,function(){return cb(a,b,d)}):cb(a,b,d)},set:function(a,c,d){return b_(a,c,d?ca(a,b,d,p.support.boxSizing&&p.css(a,"boxSizing")==="border-box"):0)}}}),p.support.opacity||(p.cssHooks.opacity={get:function(a,b){return bL.test((b&&a.currentStyle?a.currentStyle.filter:a.style.filter)||"")?.01*parseFloat(RegExp.$1)+"":b?"1":""},set:function(a,b){var c=a.style,d=a.currentStyle,e=p.isNumeric(b)?"alpha(opacity="+b*100+")":"",f=d&&d.filter||c.filter||"";c.zoom=1;if(b>=1&&p.trim(f.replace(bK,""))===""&&c.removeAttribute){c.removeAttribute("filter");if(d&&!d.filter)return}c.filter=bK.test(f)?f.replace(bK,e):f+" "+e}}),p(function(){p.support.reliableMarginRight||(p.cssHooks.marginRight={get:function(a,b){return p.swap(a,{display:"inline-block"},function(){if(b)return bH(a,"marginRight")})}}),!p.support.pixelPosition&&p.fn.position&&p.each(["top","left"],function(a,b){p.cssHooks[b]={get:function(a,c){if(c){var d=bH(a,b);return bQ.test(d)?p(a).position()[b]+"px":d}}}})}),p.expr&&p.expr.filters&&(p.expr.filters.hidden=function(a){return a.offsetWidth===0&&a.offsetHeight===0||!p.support.reliableHiddenOffsets&&(a.style&&a.style.display||bH(a,"display"))==="none"},p.expr.filters.visible=function(a){return!p.expr.filters.hidden(a)}),p.each({margin:"",padding:"",border:"Width"},function(a,b){p.cssHooks[a+b]={expand:function(c){var d,e=typeof c=="string"?c.split(" "):[c],f={};for(d=0;d<4;d++)f[a+bV[d]+b]=e[d]||e[d-2]||e[0];return f}},bO.test(a)||(p.cssHooks[a+b].set=b_)});var cd=/%20/g,ce=/\[\]$/,cf=/\r?\n/g,cg=/^(?:color|date|datetime|datetime-local|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,ch=/^(?:select|textarea)/i;p.fn.extend({serialize:function(){return p.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?p.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||ch.test(this.nodeName)||cg.test(this.type))}).map(function(a,b){var c=p(this).val();return c==null?null:p.isArray(c)?p.map(c,function(a,c){return{name:b.name,value:a.replace(cf,"\r\n")}}):{name:b.name,value:c.replace(cf,"\r\n")}}).get()}}),p.param=function(a,c){var d,e=[],f=function(a,b){b=p.isFunction(b)?b():b==null?"":b,e[e.length]=encodeURIComponent(a)+"="+encodeURIComponent(b)};c===b&&(c=p.ajaxSettings&&p.ajaxSettings.traditional);if(p.isArray(a)||a.jquery&&!p.isPlainObject(a))p.each(a,function(){f(this.name,this.value)});else for(d in a)ci(d,a[d],c,f);return e.join("&").replace(cd,"+")};var cj,ck,cl=/#.*$/,cm=/^(.*?):[ \t]*([^\r\n]*)\r?$/mg,cn=/^(?:about|app|app\-storage|.+\-extension|file|res|widget):$/,co=/^(?:GET|HEAD)$/,cp=/^\/\//,cq=/\?/,cr=/<script\b[^<]*(?:(?!<\/script>)<[^<]*)*<\/script>/gi,cs=/([?&])_=[^&]*/,ct=/^([\w\+\.\-]+:)(?:\/\/([^\/?#:]*)(?::(\d+)|)|)/,cu=p.fn.load,cv={},cw={},cx=["*/"]+["*"];try{ck=f.href}catch(cy){ck=e.createElement("a"),ck.href="",ck=ck.href}cj=ct.exec(ck.toLowerCase())||[],p.fn.load=function(a,c,d){if(typeof a!="string"&&cu)return cu.apply(this,arguments);if(!this.length)return this;var e,f,g,h=this,i=a.indexOf(" ");return i>=0&&(e=a.slice(i,a.length),a=a.slice(0,i)),p.isFunction(c)?(d=c,c=b):c&&typeof c=="object"&&(f="POST"),p.ajax({url:a,type:f,dataType:"html",data:c,complete:function(a,b){d&&h.each(d,g||[a.responseText,b,a])}}).done(function(a){g=arguments,h.html(e?p("<div>").append(a.replace(cr,"")).find(e):a)}),this},p.each("ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "),function(a,b){p.fn[b]=function(a){return this.on(b,a)}}),p.each(["get","post"],function(a,c){p[c]=function(a,d,e,f){return p.isFunction(d)&&(f=f||e,e=d,d=b),p.ajax({type:c,url:a,data:d,success:e,dataType:f})}}),p.extend({getScript:function(a,c){return p.get(a,b,c,"script")},getJSON:function(a,b,c){return p.get(a,b,c,"json")},ajaxSetup:function(a,b){return b?cB(a,p.ajaxSettings):(b=a,a=p.ajaxSettings),cB(a,b),a},ajaxSettings:{url:ck,isLocal:cn.test(cj[1]),global:!0,type:"GET",contentType:"application/x-www-form-urlencoded; charset=UTF-8",processData:!0,async:!0,accepts:{xml:"application/xml, text/xml",html:"text/html",text:"text/plain",json:"application/json, text/javascript","*":cx},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText"},converters:{"* text":a.String,"text html":!0,"text json":p.parseJSON,"text xml":p.parseXML},flatOptions:{context:!0,url:!0}},ajaxPrefilter:cz(cv),ajaxTransport:cz(cw),ajax:function(a,c){function y(a,c,f,i){var k,s,t,u,w,y=c;if(v===2)return;v=2,h&&clearTimeout(h),g=b,e=i||"",x.readyState=a>0?4:0,f&&(u=cC(l,x,f));if(a>=200&&a<300||a===304)l.ifModified&&(w=x.getResponseHeader("Last-Modified"),w&&(p.lastModified[d]=w),w=x.getResponseHeader("Etag"),w&&(p.etag[d]=w)),a===304?(y="notmodified",k=!0):(k=cD(l,u),y=k.state,s=k.data,t=k.error,k=!t);else{t=y;if(!y||a)y="error",a<0&&(a=0)}x.status=a,x.statusText=(c||y)+"",k?o.resolveWith(m,[s,y,x]):o.rejectWith(m,[x,y,t]),x.statusCode(r),r=b,j&&n.trigger("ajax"+(k?"Success":"Error"),[x,l,k?s:t]),q.fireWith(m,[x,y]),j&&(n.trigger("ajaxComplete",[x,l]),--p.active||p.event.trigger("ajaxStop"))}typeof a=="object"&&(c=a,a=b),c=c||{};var d,e,f,g,h,i,j,k,l=p.ajaxSetup({},c),m=l.context||l,n=m!==l&&(m.nodeType||m instanceof p)?p(m):p.event,o=p.Deferred(),q=p.Callbacks("once memory"),r=l.statusCode||{},t={},u={},v=0,w="canceled",x={readyState:0,setRequestHeader:function(a,b){if(!v){var c=a.toLowerCase();a=u[c]=u[c]||a,t[a]=b}return this},getAllResponseHeaders:function(){return v===2?e:null},getResponseHeader:function(a){var c;if(v===2){if(!f){f={};while(c=cm.exec(e))f[c[1].toLowerCase()]=c[2]}c=f[a.toLowerCase()]}return c===b?null:c},overrideMimeType:function(a){return v||(l.mimeType=a),this},abort:function(a){return a=a||w,g&&g.abort(a),y(0,a),this}};o.promise(x),x.success=x.done,x.error=x.fail,x.complete=q.add,x.statusCode=function(a){if(a){var b;if(v<2)for(b in a)r[b]=[r[b],a[b]];else b=a[x.status],x.always(b)}return this},l.url=((a||l.url)+"").replace(cl,"").replace(cp,cj[1]+"//"),l.dataTypes=p.trim(l.dataType||"*").toLowerCase().split(s),l.crossDomain==null&&(i=ct.exec(l.url.toLowerCase())||!1,l.crossDomain=i&&i.join(":")+(i[3]?"":i[1]==="http:"?80:443)!==cj.join(":")+(cj[3]?"":cj[1]==="http:"?80:443)),l.data&&l.processData&&typeof l.data!="string"&&(l.data=p.param(l.data,l.traditional)),cA(cv,l,c,x);if(v===2)return x;j=l.global,l.type=l.type.toUpperCase(),l.hasContent=!co.test(l.type),j&&p.active++===0&&p.event.trigger("ajaxStart");if(!l.hasContent){l.data&&(l.url+=(cq.test(l.url)?"&":"?")+l.data,delete l.data),d=l.url;if(l.cache===!1){var z=p.now(),A=l.url.replace(cs,"$1_="+z);l.url=A+(A===l.url?(cq.test(l.url)?"&":"?")+"_="+z:"")}}(l.data&&l.hasContent&&l.contentType!==!1||c.contentType)&&x.setRequestHeader("Content-Type",l.contentType),l.ifModified&&(d=d||l.url,p.lastModified[d]&&x.setRequestHeader("If-Modified-Since",p.lastModified[d]),p.etag[d]&&x.setRequestHeader("If-None-Match",p.etag[d])),x.setRequestHeader("Accept",l.dataTypes[0]&&l.accepts[l.dataTypes[0]]?l.accepts[l.dataTypes[0]]+(l.dataTypes[0]!=="*"?", "+cx+"; q=0.01":""):l.accepts["*"]);for(k in l.headers)x.setRequestHeader(k,l.headers[k]);if(!l.beforeSend||l.beforeSend.call(m,x,l)!==!1&&v!==2){w="abort";for(k in{success:1,error:1,complete:1})x[k](l[k]);g=cA(cw,l,c,x);if(!g)y(-1,"No Transport");else{x.readyState=1,j&&n.trigger("ajaxSend",[x,l]),l.async&&l.timeout>0&&(h=setTimeout(function(){x.abort("timeout")},l.timeout));try{v=1,g.send(t,y)}catch(B){if(v<2)y(-1,B);else throw B}}return x}return x.abort()},active:0,lastModified:{},etag:{}});var cE=[],cF=/\?/,cG=/(=)\?(?=&|$)|\?\?/,cH=p.now();p.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var a=cE.pop()||p.expando+"_"+cH++;return this[a]=!0,a}}),p.ajaxPrefilter("json jsonp",function(c,d,e){var f,g,h,i=c.data,j=c.url,k=c.jsonp!==!1,l=k&&cG.test(j),m=k&&!l&&typeof i=="string"&&!(c.contentType||"").indexOf("application/x-www-form-urlencoded")&&cG.test(i);if(c.dataTypes[0]==="jsonp"||l||m)return f=c.jsonpCallback=p.isFunction(c.jsonpCallback)?c.jsonpCallback():c.jsonpCallback,g=a[f],l?c.url=j.replace(cG,"$1"+f):m?c.data=i.replace(cG,"$1"+f):k&&(c.url+=(cF.test(j)?"&":"?")+c.jsonp+"="+f),c.converters["script json"]=function(){return h||p.error(f+" was not called"),h[0]},c.dataTypes[0]="json",a[f]=function(){h=arguments},e.always(function(){a[f]=g,c[f]&&(c.jsonpCallback=d.jsonpCallback,cE.push(f)),h&&p.isFunction(g)&&g(h[0]),h=g=b}),"script"}),p.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/javascript|ecmascript/},converters:{"text script":function(a){return p.globalEval(a),a}}}),p.ajaxPrefilter("script",function(a){a.cache===b&&(a.cache=!1),a.crossDomain&&(a.type="GET",a.global=!1)}),p.ajaxTransport("script",function(a){if(a.crossDomain){var c,d=e.head||e.getElementsByTagName("head")[0]||e.documentElement;return{send:function(f,g){c=e.createElement("script"),c.async="async",a.scriptCharset&&(c.charset=a.scriptCharset),c.src=a.url,c.onload=c.onreadystatechange=function(a,e){if(e||!c.readyState||/loaded|complete/.test(c.readyState))c.onload=c.onreadystatechange=null,d&&c.parentNode&&d.removeChild(c),c=b,e||g(200,"success")},d.insertBefore(c,d.firstChild)},abort:function(){c&&c.onload(0,1)}}}});var cI,cJ=a.ActiveXObject?function(){for(var a in cI)cI[a](0,1)}:!1,cK=0;p.ajaxSettings.xhr=a.ActiveXObject?function(){return!this.isLocal&&cL()||cM()}:cL,function(a){p.extend(p.support,{ajax:!!a,cors:!!a&&"withCredentials"in a})}(p.ajaxSettings.xhr()),p.support.ajax&&p.ajaxTransport(function(c){if(!c.crossDomain||p.support.cors){var d;return{send:function(e,f){var g,h,i=c.xhr();c.username?i.open(c.type,c.url,c.async,c.username,c.password):i.open(c.type,c.url,c.async);if(c.xhrFields)for(h in c.xhrFields)i[h]=c.xhrFields[h];c.mimeType&&i.overrideMimeType&&i.overrideMimeType(c.mimeType),!c.crossDomain&&!e["X-Requested-With"]&&(e["X-Requested-With"]="XMLHttpRequest");try{for(h in e)i.setRequestHeader(h,e[h])}catch(j){}i.send(c.hasContent&&c.data||null),d=function(a,e){var h,j,k,l,m;try{if(d&&(e||i.readyState===4)){d=b,g&&(i.onreadystatechange=p.noop,cJ&&delete cI[g]);if(e)i.readyState!==4&&i.abort();else{h=i.status,k=i.getAllResponseHeaders(),l={},m=i.responseXML,m&&m.documentElement&&(l.xml=m);try{l.text=i.responseText}catch(a){}try{j=i.statusText}catch(n){j=""}!h&&c.isLocal&&!c.crossDomain?h=l.text?200:404:h===1223&&(h=204)}}}catch(o){e||f(-1,o)}l&&f(h,j,l,k)},c.async?i.readyState===4?setTimeout(d,0):(g=++cK,cJ&&(cI||(cI={},p(a).unload(cJ)),cI[g]=d),i.onreadystatechange=d):d()},abort:function(){d&&d(0,1)}}}});var cN,cO,cP=/^(?:toggle|show|hide)$/,cQ=new RegExp("^(?:([-+])=|)("+q+")([a-z%]*)$","i"),cR=/queueHooks$/,cS=[cY],cT={"*":[function(a,b){var c,d,e=this.createTween(a,b),f=cQ.exec(b),g=e.cur(),h=+g||0,i=1,j=20;if(f){c=+f[2],d=f[3]||(p.cssNumber[a]?"":"px");if(d!=="px"&&h){h=p.css(e.elem,a,!0)||c||1;do i=i||".5",h=h/i,p.style(e.elem,a,h+d);while(i!==(i=e.cur()/g)&&i!==1&&--j)}e.unit=d,e.start=h,e.end=f[1]?h+(f[1]+1)*c:c}return e}]};p.Animation=p.extend(cW,{tweener:function(a,b){p.isFunction(a)?(b=a,a=["*"]):a=a.split(" ");var c,d=0,e=a.length;for(;d<e;d++)c=a[d],cT[c]=cT[c]||[],cT[c].unshift(b)},prefilter:function(a,b){b?cS.unshift(a):cS.push(a)}}),p.Tween=cZ,cZ.prototype={constructor:cZ,init:function(a,b,c,d,e,f){this.elem=a,this.prop=c,this.easing=e||"swing",this.options=b,this.start=this.now=this.cur(),this.end=d,this.unit=f||(p.cssNumber[c]?"":"px")},cur:function(){var a=cZ.propHooks[this.prop];return a&&a.get?a.get(this):cZ.propHooks._default.get(this)},run:function(a){var b,c=cZ.propHooks[this.prop];return this.options.duration?this.pos=b=p.easing[this.easing](a,this.options.duration*a,0,1,this.options.duration):this.pos=b=a,this.now=(this.end-this.start)*b+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),c&&c.set?c.set(this):cZ.propHooks._default.set(this),this}},cZ.prototype.init.prototype=cZ.prototype,cZ.propHooks={_default:{get:function(a){var b;return a.elem[a.prop]==null||!!a.elem.style&&a.elem.style[a.prop]!=null?(b=p.css(a.elem,a.prop,!1,""),!b||b==="auto"?0:b):a.elem[a.prop]},set:function(a){p.fx.step[a.prop]?p.fx.step[a.prop](a):a.elem.style&&(a.elem.style[p.cssProps[a.prop]]!=null||p.cssHooks[a.prop])?p.style(a.elem,a.prop,a.now+a.unit):a.elem[a.prop]=a.now}}},cZ.propHooks.scrollTop=cZ.propHooks.scrollLeft={set:function(a){a.elem.nodeType&&a.elem.parentNode&&(a.elem[a.prop]=a.now)}},p.each(["toggle","show","hide"],function(a,b){var c=p.fn[b];p.fn[b]=function(d,e,f){return d==null||typeof d=="boolean"||!a&&p.isFunction(d)&&p.isFunction(e)?c.apply(this,arguments):this.animate(c$(b,!0),d,e,f)}}),p.fn.extend({fadeTo:function(a,b,c,d){return this.filter(bZ).css("opacity",0).show().end().animate({opacity:b},a,c,d)},animate:function(a,b,c,d){var e=p.isEmptyObject(a),f=p.speed(b,c,d),g=function(){var b=cW(this,p.extend({},a),f);e&&b.stop(!0)};return e||f.queue===!1?this.each(g):this.queue(f.queue,g)},stop:function(a,c,d){var e=function(a){var b=a.stop;delete a.stop,b(d)};return typeof a!="string"&&(d=c,c=a,a=b),c&&a!==!1&&this.queue(a||"fx",[]),this.each(function(){var b=!0,c=a!=null&&a+"queueHooks",f=p.timers,g=p._data(this);if(c)g[c]&&g[c].stop&&e(g[c]);else for(c in g)g[c]&&g[c].stop&&cR.test(c)&&e(g[c]);for(c=f.length;c--;)f[c].elem===this&&(a==null||f[c].queue===a)&&(f[c].anim.stop(d),b=!1,f.splice(c,1));(b||!d)&&p.dequeue(this,a)})}}),p.each({slideDown:c$("show"),slideUp:c$("hide"),slideToggle:c$("toggle"),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(a,b){p.fn[a]=function(a,c,d){return this.animate(b,a,c,d)}}),p.speed=function(a,b,c){var d=a&&typeof a=="object"?p.extend({},a):{complete:c||!c&&b||p.isFunction(a)&&a,duration:a,easing:c&&b||b&&!p.isFunction(b)&&b};d.duration=p.fx.off?0:typeof d.duration=="number"?d.duration:d.duration in p.fx.speeds?p.fx.speeds[d.duration]:p.fx.speeds._default;if(d.queue==null||d.queue===!0)d.queue="fx";return d.old=d.complete,d.complete=function(){p.isFunction(d.old)&&d.old.call(this),d.queue&&p.dequeue(this,d.queue)},d},p.easing={linear:function(a){return a},swing:function(a){return.5-Math.cos(a*Math.PI)/2}},p.timers=[],p.fx=cZ.prototype.init,p.fx.tick=function(){var a,b=p.timers,c=0;for(;c<b.length;c++)a=b[c],!a()&&b[c]===a&&b.splice(c--,1);b.length||p.fx.stop()},p.fx.timer=function(a){a()&&p.timers.push(a)&&!cO&&(cO=setInterval(p.fx.tick,p.fx.interval))},p.fx.interval=13,p.fx.stop=function(){clearInterval(cO),cO=null},p.fx.speeds={slow:600,fast:200,_default:400},p.fx.step={},p.expr&&p.expr.filters&&(p.expr.filters.animated=function(a){return p.grep(p.timers,function(b){return a===b.elem}).length});var c_=/^(?:body|html)$/i;p.fn.offset=function(a){if(arguments.length)return a===b?this:this.each(function(b){p.offset.setOffset(this,a,b)});var c,d,e,f,g,h,i,j={top:0,left:0},k=this[0],l=k&&k.ownerDocument;if(!l)return;return(d=l.body)===k?p.offset.bodyOffset(k):(c=l.documentElement,p.contains(c,k)?(typeof k.getBoundingClientRect!="undefined"&&(j=k.getBoundingClientRect()),e=da(l),f=c.clientTop||d.clientTop||0,g=c.clientLeft||d.clientLeft||0,h=e.pageYOffset||c.scrollTop,i=e.pageXOffset||c.scrollLeft,{top:j.top+h-f,left:j.left+i-g}):j)},p.offset={bodyOffset:function(a){var b=a.offsetTop,c=a.offsetLeft;return p.support.doesNotIncludeMarginInBodyOffset&&(b+=parseFloat(p.css(a,"marginTop"))||0,c+=parseFloat(p.css(a,"marginLeft"))||0),{top:b,left:c}},setOffset:function(a,b,c){var d=p.css(a,"position");d==="static"&&(a.style.position="relative");var e=p(a),f=e.offset(),g=p.css(a,"top"),h=p.css(a,"left"),i=(d==="absolute"||d==="fixed")&&p.inArray("auto",[g,h])>-1,j={},k={},l,m;i?(k=e.position(),l=k.top,m=k.left):(l=parseFloat(g)||0,m=parseFloat(h)||0),p.isFunction(b)&&(b=b.call(a,c,f)),b.top!=null&&(j.top=b.top-f.top+l),b.left!=null&&(j.left=b.left-f.left+m),"using"in b?b.using.call(a,j):e.css(j)}},p.fn.extend({position:function(){if(!this[0])return;var a=this[0],b=this.offsetParent(),c=this.offset(),d=c_.test(b[0].nodeName)?{top:0,left:0}:b.offset();return c.top-=parseFloat(p.css(a,"marginTop"))||0,c.left-=parseFloat(p.css(a,"marginLeft"))||0,d.top+=parseFloat(p.css(b[0],"borderTopWidth"))||0,d.left+=parseFloat(p.css(b[0],"borderLeftWidth"))||0,{top:c.top-d.top,left:c.left-d.left}},offsetParent:function(){return this.map(function(){var a=this.offsetParent||e.body;while(a&&!c_.test(a.nodeName)&&p.css(a,"position")==="static")a=a.offsetParent;return a||e.body})}}),p.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(a,c){var d=/Y/.test(c);p.fn[a]=function(e){return p.access(this,function(a,e,f){var g=da(a);if(f===b)return g?c in g?g[c]:g.document.documentElement[e]:a[e];g?g.scrollTo(d?p(g).scrollLeft():f,d?f:p(g).scrollTop()):a[e]=f},a,e,arguments.length,null)}}),p.each({Height:"height",Width:"width"},function(a,c){p.each({padding:"inner"+a,content:c,"":"outer"+a},function(d,e){p.fn[e]=function(e,f){var g=arguments.length&&(d||typeof e!="boolean"),h=d||(e===!0||f===!0?"margin":"border");return p.access(this,function(c,d,e){var f;return p.isWindow(c)?c.document.documentElement["client"+a]:c.nodeType===9?(f=c.documentElement,Math.max(c.body["scroll"+a],f["scroll"+a],c.body["offset"+a],f["offset"+a],f["client"+a])):e===b?p.css(c,d,e,h):p.style(c,d,e,h)},c,g?e:b,g,null)}})}),a.jQuery=a.$=p,typeof define=="function"&&define.amd&&define.amd.jQuery&&define("jquery",[],function(){return p})})(window); \ No newline at end of file diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/.gc3pie/html/openbis-action-deferrer.js b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/.gc3pie/html/openbis-action-deferrer.js deleted file mode 100644 index ee2e81717388b2c3649e0b754199ae5d8898e7c5..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/.gc3pie/html/openbis-action-deferrer.js +++ /dev/null @@ -1,31 +0,0 @@ -/** - * A utility class for deferring an action until all of some kind of action has completed - * - * @argument dependencies An array of the keys for the dependencies. - */ - -function openbisActionDeferrer(pendingAction, dependencies) { - this.pendingAction = pendingAction; - this.dependencies = {}; - var newme = this; - dependencies.forEach(function(key) { - newme.dependencies[key] = false; - }); -} - -/** - * Note that a dependency completed. Execute the pending action if appropriate. - */ -openbisActionDeferrer.prototype.dependencyCompleted = function(key) { - this.dependencies[key] = true; - var shouldExecute = true; - for (prop in this.dependencies) { - if (false == this.dependencies[prop]) { - shouldExecute = false; - break; - } - } - if (shouldExecute) { - this.pendingAction(); - } -} \ No newline at end of file diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/.gc3pie/html/openbis-dsu.js b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/.gc3pie/html/openbis-dsu.js deleted file mode 100644 index 52e7336254ad191bc7f4756967e79f55ab1faa58..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/.gc3pie/html/openbis-dsu.js +++ /dev/null @@ -1,103 +0,0 @@ -/** - * openbis-dsu.js - * OpenBIS-DSU API - * - * A DSU-specific API for accessing openBIS. Depends on openbis.js. - * @author Chandrasekhar Ramakrishnan - */ - -/** - * The openbis_dsu object provides a dsu-specific interface to openbis. - * - * It creates objects for projects, experiments, samples, and datasets. These objects - * are designed to be passed on to GUI libraries (like d3). The openbis version of each - * object is stored in the bis variable. - * @constructor - */ -function openbis_dsu(url, dssUrl) { - this.server = new openbis(url, dssUrl); -} - -/** - * Request the sequencing samples for a project - */ -openbis_dsu.prototype.retrieveSequencingSamples = function(action) -{ - var sampleCriteria = - { - matchClauses : - [ {"@type":"AttributeMatchClause", - attribute : "TYPE", - fieldType : "ATTRIBUTE", - desiredValue : "ILLUMINA_SEQUENCING" - } ], - operator : "MATCH_ALL_CLAUSES" - }; - - this.server.searchForSamples(sampleCriteria, action); -} - -/** - * Get the flow lanes for a sequencing sample. - */ -openbis_dsu.prototype.retrieveFlowLanesForSequencingSample = function(sample, action) -{ - var projectCode = null; - - if(sample.bis.experimentIdentifierOrNull){ - var experimentIdentifierRegexp = /\/(.*)\/(.*)\/(.*)/g; - var experimentIdentifierMatch = experimentIdentifierRegexp.exec(sample.bis.experimentIdentifierOrNull); - projectCode = experimentIdentifierMatch[2]; - }else{ - action(null); - return; - } - - var experimentCriteria = - { - targetEntityKind : "EXPERIMENT", - criteria : { - matchClauses : - [ {"@type":"AttributeMatchClause", - "attribute":"PROJECT", - "fieldType":"ATTRIBUTE", - "desiredValue": projectCode - } ] - } - }; - - var parentCriteria = - { - targetEntityKind : "SAMPLE_PARENT", - criteria : { - matchClauses : - [ {"@type":"AttributeMatchClause", - "attribute":"CODE", - "fieldType":"ATTRIBUTE", - "desiredValue": sample.bis.code - } ] - } - }; - - var sampleCriteria = - { - subCriterias : [ experimentCriteria, parentCriteria ], - matchClauses : - [ {"@type":"AttributeMatchClause", - attribute : "TYPE", - fieldType : "ATTRIBUTE", - desiredValue : "ILLUMINA_FLOW_LANE" - } ], - operator : "MATCH_ALL_CLAUSES" - }; - - this.server.searchForSamples(sampleCriteria, action) -} - -/** - * Get all data sets connected to a sequencing sample - */ -openbis_dsu.prototype.retrieveDataSetsForSequencingSample = function(sequencing, action) -{ - this.server.listDataSetsForSample(sequencing.bis, false, action); -} diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/.gc3pie/html/openbis-login.js b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/.gc3pie/html/openbis-login.js deleted file mode 100644 index 7d1ece5965cac06666f12b6e03d20871bc65fb36..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/.gc3pie/html/openbis-login.js +++ /dev/null @@ -1,77 +0,0 @@ -/** - * A module for configuring the login page to openBIS. It hides and shows - * the login form and main content as necessary. It invokes a specified - * function on successful login. - * - * This module assumes that the page follows the structure of our standard - * login page. This means that the Following elements are defined : - * - * div#login-form-div - * form#login-form - * input#username - * input#password - * button#login-button - * div#main - * button#logout-button - * - * Assuming these elements are defined, this module configures their appeareance - * and behavior.The div#main element is initially hidden until the user logs in. - * Once logged in, the div#login-form-div element is hidden and the div#main - * element is made visible. - * - * @module openbis-login - * @requires jquery - */ - - -/** - * Configure the login page to hide and show the login form and main content - * as appropriate - * - * @param openbis The openbis facade object - * @param onLogin The function to be called when login succeeds. - * @function - */ - -function openbisLoginPage(openbis, onLogin) -{ - this.openbis = openbis; - this.onLogin = onLogin; -} - -openbisLoginPage.prototype.configure = function(){ - var loginPage = this; - - $('#main').hide(); - - var username = $("#username").value; - if(username == null || username.length==0) { - $("#username").focus(); - } else { - $("#login-button").focus(); - } - - $('#logout-button').click(function() { - loginPage.openbis.logout(function(data) { - $("#login-form-div").show(); - $("#main").hide(); - $("#username").focus(); - }); - }); - - $('#login-form').submit(function() { - loginPage.openbis.login( $.trim($('#username').val()), $.trim($('#password').val()), function(data) { loginPage.onLogin(data) }) - }); - - loginPage.openbis.ifRestoredSessionActive(function(data) { loginPage.onLogin(data) }); - - // Make the ENTER key the default button - $("login-form input").keypress(function (e) { - if ((e.which && e.which == 13) || (e.keyCode && e.keyCode == 13)) { - $('button[type=submit].default').click(); - return false; - } else { - return true; - } - }); -} \ No newline at end of file diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/.gc3pie/html/openbis-request-cache.js b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/.gc3pie/html/openbis-request-cache.js deleted file mode 100644 index 29c57a8145e7b8a2db781e04949de3168865d04f..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/.gc3pie/html/openbis-request-cache.js +++ /dev/null @@ -1,51 +0,0 @@ -/** - * Caches openBIS JSON responses into the local browser storage. - * - * Once the local storage is populated with data from real - * server interactions, the UI development can be done offline - * based on the cached server responses. - * - * USAGE : include this script in your app *after* the openbis facade. - * Be careful not to distribute it to your customers. - * - * <script type="text/javascript" src="openbis-request-cache.js"></script> - * - * To clear the cache, you can call "localStorage.clear()" in a browser console. - */ - -var original_ajax_request_func = _openbisInternal.prototype.ajaxRequest; - -_openbisInternal.prototype.ajaxRequest = function(settings) { - - function getCacheId(settings) { - var methodName = settings.data['method'] - if (methodName.toLowerCase().indexOf('authenticate') != -1) { - // do not store sensitive parameters information - // for login methods (e.g. username/password) - return methodName - } else { - var params = settings.data['params'] - return methodName + '-' + JSON.stringify(params) - } - } - - var cacheId = getCacheId(settings) - var cachedResponse = localStorage.getItem(cacheId) - - if (cachedResponse == null) { - var originalCallback = settings.success - settings.success = function(response) { - localStorage.setItem(cacheId, JSON.stringify(response)) - originalCallback(response) - } - original_ajax_request_func(settings); - } else { - // async execution after a delay of 100ms - setTimeout(function() { - settings.success(JSON.parse(cachedResponse)) - }, 100) - - } -} - -alert("This app includes development code. For production, do not forget to remove the reference to openbis-request-cache.js") \ No newline at end of file diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/.gc3pie/html/openbis-screening.js b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/.gc3pie/html/openbis-screening.js deleted file mode 100644 index a39730902bbc401f5a740a2a6c8d58f311f80cb3..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/.gc3pie/html/openbis-screening.js +++ /dev/null @@ -1,655 +0,0 @@ -/** - * ======================================================= - * OpenBIS screening facade internal code (DO NOT USE!!!) - * ======================================================= - */ - -if(typeof openbis == 'undefined' || typeof _openbisInternal == 'undefined'){ - alert('Loading of openbis-screening.js failed - openbis.js is missing'); -} - -var _openbisInternalGeneric = _openbisInternal; - -var _openbisInternal = function(openbisUrlOrNull){ - this.init(openbisUrlOrNull); -} - -$.extend(_openbisInternal.prototype, _openbisInternalGeneric.prototype); - -_openbisInternal.prototype.init = function(openbisUrlOrNull){ - _openbisInternalGeneric.prototype.init.call(this, openbisUrlOrNull); - this.screeningUrl = this.openbisUrl + "/rmi-screening-api-v1.json" -} - -_openbisInternal.prototype.getScreeningDataStoreApiUrlForDataStoreUrl = function(dataStoreUrl){ - return dataStoreUrl + "/rmi-datastore-server-screening-api-v1.json" -} - -var _openbisGeneric = openbis; - -/** - * ========================= - * OpenBIS screening facade - * ========================= - * - * The facade provides access to the following services: - * - * - all services that the generic OpenBIS facade provides (see openbis.js file) - * - ch.systemsx.cisd.openbis.plugin.screening.shared.api.v1.IScreeningApiServer - * - ch.systemsx.cisd.openbis.dss.screening.shared.api.v1.IDssServiceRpcScreening - * - */ - -var openbis = function(openbisUrlOrNull){ - this._internal = new _openbisInternal(openbisUrlOrNull); -} - -$.extend(openbis.prototype, _openbisGeneric.prototype); - -/** - * ==================================================================================== - * ch.systemsx.cisd.openbis.plugin.screening.shared.api.v1.IScreeningApiServer methods - * ==================================================================================== - */ - -/** - * @see IScreeningApiServer.listPlates(String) - * @method - */ -openbis.prototype.listPlates = function(action) { - this._internal.ajaxRequest({ - url: this._internal.screeningUrl, - data: { "method" : "listPlates", - "params" : [ this.getSession() ] }, - success: action - }); -} - -/** - * @see IScreeningApiServer.listPlates(String, ExperimentIdentifier) - * @method - */ -openbis.prototype.listPlatesForExperiment = function(experimentIdentifier, action) { - this._internal.ajaxRequest({ - url: this._internal.screeningUrl, - data: { "method" : "listPlates", - "params" : [ this.getSession(), experimentIdentifier ] }, - success: action - }); -} - -/** - * @see IScreeningApiServer.getPlateMetadataList(String, List<? extends PlateIdentifier>) - * @method - */ -openbis.prototype.getPlateMetadataList = function(plateIdentifiers, action) { - this._internal.ajaxRequest({ - url: this._internal.screeningUrl, - data: { "method" : "getPlateMetadataList", - "params" : [ this.getSession(), plateIdentifiers ] }, - success: action - }); -} - -/** - * @see IScreeningApiServer.listExperiments(String) - * @method - */ -openbis.prototype.listAllExperiments = function(action) { - this._internal.ajaxRequest({ - url: this._internal.screeningUrl, - data: { "method" : "listExperiments", - "params" : [ this.getSession() ] }, - success: action - }); -} - -/** - * @see IScreeningApiServer.listExperiments(String, String) - * @method - */ -openbis.prototype.listExperimentsVisibleToUser = function(userId, action) { - this._internal.ajaxRequest({ - url: this._internal.screeningUrl, - data: { "method" : "listExperiments", - "params" : [ this.getSession(), userId ] }, - success: action - }); -} - -/** - * @see IScreeningApiServer.listFeatureVectorDatasets(String, List<? extends PlateIdentifier>) - * @method - */ -openbis.prototype.listFeatureVectorDatasets = function(plateIdentifiers, action) { - this._internal.ajaxRequest({ - url: this._internal.screeningUrl, - data: { "method" : "listFeatureVectorDatasets", - "params" : [ this.getSession(), plateIdentifiers ] }, - success: action - }); -} - -/** - * @see IScreeningApiServer.listImageDatasets(String, List<? extends PlateIdentifier>) - * @method - */ -openbis.prototype.listImageDatasets = function(plateIdentifiers, action) { - this._internal.ajaxRequest({ - url: this._internal.screeningUrl, - data: { "method" : "listImageDatasets", - "params" : [ this.getSession(), plateIdentifiers ] }, - success: action - }); -} - -/** - * @see IScreeningApiServer.listRawImageDatasets(String, List<? extends PlateIdentifier>) - * @method - */ -openbis.prototype.listRawImageDatasets = function(plateIdentifiers, action) { - this._internal.ajaxRequest({ - url: this._internal.screeningUrl, - data: { "method" : "listRawImageDatasets", - "params" : [ this.getSession(), plateIdentifiers ] }, - success: action - }); -} - -/** - * @see IScreeningApiServer.listSegmentationImageDatasets(String, List<? extends PlateIdentifier>) - * @method - */ -openbis.prototype.listSegmentationImageDatasets = function(plateIdentifiers, action) { - this._internal.ajaxRequest({ - url: this._internal.screeningUrl, - data: { "method" : "listSegmentationImageDatasets", - "params" : [ this.getSession(), plateIdentifiers ] }, - success: action - }); -} - -/** - * @see IScreeningApiServer.getDatasetIdentifiers(String, List<String>) - * @method - */ -openbis.prototype.getDatasetIdentifiers = function(datasetCodes, action) { - this._internal.ajaxRequest({ - url: this._internal.screeningUrl, - data: { "method" : "getDatasetIdentifiers", - "params" : [ this.getSession(), datasetCodes ] }, - success: action - }); -} - -/** - * @see IScreeningApiServer.listPlateWells(String, ExperimentIdentifier, MaterialIdentifier, boolean) - * @method - */ -openbis.prototype.listPlateWellsForExperimentAndMaterial = function(experimentIdentifer, materialIdentifier, findDatasets, action) { - this._internal.ajaxRequest({ - url: this._internal.screeningUrl, - data: { "method" : "listPlateWells", - "params" : [ this.getSession(), experimentIdentifer, materialIdentifier, findDatasets ] }, - success: action - }); -} - -/** - * @see IScreeningApiServer.listPlateWells(String, MaterialIdentifier, boolean) - * @method - */ -openbis.prototype.listPlateWellsForMaterial = function(materialIdentifier, findDatasets, action) { - this._internal.ajaxRequest({ - url: this._internal.screeningUrl, - data: { "method" : "listPlateWells", - "params" : [ this.getSession(), materialIdentifier, findDatasets ] }, - success: action - }); -} - -/** - * @see IScreeningApiServer.listPlateWells(String, PlateIdentifier) - * @method - */ -openbis.prototype.listPlateWells = function(plateIdentifier, action) { - this._internal.ajaxRequest({ - url: this._internal.screeningUrl, - data: { "method" : "listPlateWells", - "params" : [ this.getSession(), plateIdentifier ] }, - success: action - }); -} - -/** - * @see IScreeningApiServer.getWellSample(String, WellIdentifier) - * @method - */ -openbis.prototype.getWellSample = function(wellIdentifier, action) { - this._internal.ajaxRequest({ - url: this._internal.screeningUrl, - data: { "method" : "getWellSample", - "params" : [ this.getSession(), wellIdentifier ] }, - success: action - }); -} - -/** - * @see IScreeningApiServer.getPlateSample(String, PlateIdentifier) - * @method - */ -openbis.prototype.getPlateSample = function(plateIdentifier, action) { - this._internal.ajaxRequest({ - url: this._internal.screeningUrl, - data: { "method" : "getPlateSample", - "params" : [ this.getSession(), plateIdentifier ] }, - success: action - }); -} - -/** - * @see IScreeningApiServer.listPlateMaterialMapping(String, List<PlateIdentifier>, MaterialTypeIdentifier) - * @method - */ -openbis.prototype.listPlateMaterialMapping = function(plateIdentifiers, materialTypeIdentifierOrNull, action) { - this._internal.ajaxRequest({ - url: this._internal.screeningUrl, - data: { "method" : "listPlateMaterialMapping", - "params" : [ this.getSession(), plateIdentifiers, materialTypeIdentifierOrNull ] }, - success: action - }); -} - -/** - * @see IScreeningApiServer.getExperimentImageMetadata(String, ExperimentIdentifier) - * @method - */ -openbis.prototype.getExperimentImageMetadata = function(experimentIdentifer, action) { - this._internal.ajaxRequest({ - url: this._internal.screeningUrl, - data: { "method" : "getExperimentImageMetadata", - "params" : [ this.getSession(), experimentIdentifer ] }, - success: action - }); -} - -/** - * @see IScreeningApiServer.listAvailableFeatureCodes(String, List<? extends IFeatureVectorDatasetIdentifier>) - * @method - */ -openbis.prototype.listAvailableFeatureCodes = function(featureDatasets, action) { - this._internal.ajaxRequest({ - url: this._internal.screeningUrl, - data: { "method" : "listAvailableFeatureCodes", - "params" : [ this.getSession(), featureDatasets ] }, - success: action - }); -} - -/** - * @see IScreeningApiServer.listAvailableFeatures(String, List<? extends IFeatureVectorDatasetIdentifier>) - * @method - */ -openbis.prototype.listAvailableFeatures = function(featureDatasets, action) { - this._internal.ajaxRequest({ - url: this._internal.screeningUrl, - data: { "method" : "listAvailableFeatures", - "params" : [ this.getSession(), featureDatasets ] }, - success: action - }); -} - -/** - * @see IScreeningApiServer.loadFeatures(String, List<FeatureVectorDatasetReference>, List<String>) - * @method - */ -openbis.prototype.loadFeatures = function(featureDatasets, featureCodes, action) { - this._internal.ajaxRequest({ - url: this._internal.screeningUrl, - data: { "method" : "loadFeatures", - "params" : [ this.getSession(), featureDatasets, featureCodes ] }, - success: action - }); -} - -/** - * @see IScreeningApiServer.loadFeaturesForDatasetWellReferences(String, List<FeatureVectorDatasetWellReference>, List<String>) - * @method - */ -openbis.prototype.loadFeaturesForDatasetWellReferences = function(datasetWellReferences, featureCodes, action) { - this._internal.ajaxRequest({ - url: this._internal.screeningUrl, - data: { "method" : "loadFeaturesForDatasetWellReferences", - "params" : [ this.getSession(), datasetWellReferences, featureCodes ] }, - success: action - }); -} - -/** - * @see IScreeningApiServer.loadImagesBase64(String, List<PlateImageReference>, boolean) - * @method - */ -openbis.prototype.loadImagesBase64ForImageReferencesAndImageConversion = function(imageReferences, convertToPng, action) { - this._internal.ajaxRequest({ - url: this._internal.screeningUrl, - data: { "method" : "loadImagesBase64", - "params" : { - "sessionToken" : this.getSession(), - "imageReferences" : imageReferences, - "convertToPng" : convertToPng - } - }, - success: action - }); -} - -/** - * @see IScreeningApiServer.loadThumbnailImagesBase64(String, List<PlateImageReference>) - * @method - */ -openbis.prototype.loadThumbnailImagesBase64ForImageReferences = function(imageReferences, action) { - this._internal.ajaxRequest({ - url: this._internal.screeningUrl, - data: { "method" : "loadThumbnailImagesBase64", - "params" : { - "sessionToken" : this.getSession(), - "imageReferences" : imageReferences - } - }, - success: action - }); -} - -/** - * @see IScreeningApiServer.loadImagesBase64(String, List<PlateImageReference>, ImageSize) - * @method - */ -openbis.prototype.loadImagesBase64ForImageReferencesAndImageSize = function(imageReferences, size, action) { - this._internal.ajaxRequest({ - url: this._internal.screeningUrl, - data: { "method" : "loadImagesBase64", - "params" : { - "sessionToken" : this.getSession(), - "imageReferences" : imageReferences, - "size" : size - } - }, - success: action - }); -} - -/** - * @see IScreeningApiServer.loadImagesBase64(String, List<PlateImageReference>) - * @method - */ -openbis.prototype.loadImagesBase64ForImageReferences = function(imageReferences, action) { - this._internal.ajaxRequest({ - url: this._internal.screeningUrl, - data: { "method" : "loadImagesBase64", - "params" : { - "sessionToken" : this.getSession(), - "imageReferences" : imageReferences - } - }, - success: action - }); -} - -/** - * @see IScreeningApiServer.loadImagesBase64(String, List<PlateImageReference>, LoadImageConfiguration) - * @method - */ -openbis.prototype.loadImagesBase64ForImageReferencesAndImageConfiguration = function(imageReferences, configuration, action) { - this._internal.ajaxRequest({ - url: this._internal.screeningUrl, - data: { "method" : "loadImagesBase64", - "params" : { - "sessionToken" : this.getSession(), - "imageReferences" : imageReferences, - "configuration" : configuration - } - }, - success: action - }); -} - -/** - * @see IScreeningApiServer.loadImagesBase64(String, List<PlateImageReference>, ImageRepresentationFormat) - * @method - */ -openbis.prototype.loadImagesBase64ForImageReferencesAndImageRepresentationFormat = function(imageReferences, format, action) { - this._internal.ajaxRequest({ - url: this._internal.screeningUrl, - data: { "method" : "loadImagesBase64", - "params" : { - "sessionToken" : this.getSession(), - "imageReferences" : imageReferences, - "format" : format - } - }, - success: action - }); -} - -/** - * @see IScreeningApiServer.loadImagesBase64(String, List<PlateImageReference>, IImageRepresentationFormatSelectionCriterion...) - * @method - */ -openbis.prototype.loadImagesBase64ForImageReferencesAndImageRepresentationFormatCriteria = function(imageReferences, criteria, action) { - this._internal.ajaxRequest({ - url: this._internal.screeningUrl, - data: { "method" : "loadImagesBase64", - "params" : { - "sessionToken" : this.getSession(), - "imageReferences" : imageReferences, - "criteria" : criteria - } - }, - success: action - }); -} - -/** - * @see IScreeningApiServer.listImageMetadata(String, List<? extends IImageDatasetIdentifier>) - * @method - */ -openbis.prototype.listImageMetadata = function(imageDatasets, action) { - this._internal.ajaxRequest({ - url: this._internal.screeningUrl, - data: { "method" : "listImageMetadata", - "params" : [ this.getSession(), imageDatasets ] }, - success: action - }); -} - -/** - * @see IScreeningApiServer.listAvailableImageRepresentationFormats(String, List<? extends IDatasetIdentifier>) - * @method - */ -openbis.prototype.listAvailableImageRepresentationFormats = function(imageDatasets, action) { - this._internal.ajaxRequest({ - url: this._internal.screeningUrl, - data: { "method" : "listAvailableImageRepresentationFormats", - "params" : [ this.getSession(), imageDatasets ] }, - success: action - }); -} - -/** - * @see IScreeningApiServer.loadPhysicalThumbnailsBase64(String, List<PlateImageReference>, ImageRepresentationFormat) - * @method - */ -openbis.prototype.loadPhysicalThumbnailsBase64ForImageReferencesAndImageRepresentationFormat = function(imageReferences, format, action) { - this._internal.ajaxRequest({ - url: this._internal.screeningUrl, - data: { "method" : "loadPhysicalThumbnailsBase64", - "params" : [ this.getSession(), imageReferences, format ] }, - success: action - }); -} - -/** - * ===================================================================================== - * ch.systemsx.cisd.openbis.dss.screening.shared.api.v1.IDssServiceRpcScreening methods - * ===================================================================================== - */ - -/** - * @see IDssServiceRpcScreening.loadImagesBase64(String, IDatasetIdentifier, List<WellPosition>, String, ImageSize) - * @method - */ -openbis.prototype.loadImagesBase64ForDataSetIdentifierAndWellPositionsAndChannelAndImageSize = function(dataSetIdentifier, wellPositions, channel, thumbnailSizeOrNull, action) { - this._internal.ajaxRequest({ - url: this._internal.getScreeningDataStoreApiUrlForDataStoreUrl(dataSetIdentifier.datastoreServerUrl), - data: { "method" : "loadImagesBase64", - "params" : { - "sessionToken" : this.getSession(), - "dataSetIdentifier" : dataSetIdentifier, - "wellPositions" : wellPositions, - "channel" : channel, - "thumbnailSizeOrNull" : thumbnailSizeOrNull - } - }, - success: action - }); -} - -/** - * @see IDssServiceRpcScreening.loadImagesBase64(String, IDatasetIdentifier, String, ImageSize) - * @method - */ -openbis.prototype.loadImagesBase64ForDataSetIdentifierAndChannelAndImageSize = function(dataSetIdentifier, channel, thumbnailSizeOrNull, action) { - this._internal.ajaxRequest({ - url: this._internal.getScreeningDataStoreApiUrlForDataStoreUrl(dataSetIdentifier.datastoreServerUrl), - data: { "method" : "loadImagesBase64", - "params" : { - "sessionToken" : this.getSession(), - "dataSetIdentifier" : dataSetIdentifier, - "channel" : channel, - "thumbnailSizeOrNull" : thumbnailSizeOrNull - } - }, - success: action - }); -} - -/** - * @see IDssServiceRpcScreening.loadThumbnailImagesBase64(String, IDatasetIdentifier, List<String>) - * @method - */ -openbis.prototype.loadThumbnailImagesBase64ForDataSetIdentifierAndChannels = function(dataSetIdentifier, channels, action) { - this._internal.ajaxRequest({ - url: this._internal.getScreeningDataStoreApiUrlForDataStoreUrl(dataSetIdentifier.datastoreServerUrl), - data: { "method" : "loadThumbnailImagesBase64", - "params" : { - "sessionToken" : this.getSession(), - "dataSetIdentifier" : dataSetIdentifier, - "channels" : channels - } - }, - success: action - }); -} - -/** - * @see IDssServiceRpcScreening.listPlateImageReferences(String, IDatasetIdentifier, List<WellPosition>, String) - * @method - */ -openbis.prototype.listPlateImageReferencesForDataSetIdentifierAndWellPositionsAndChannel = function(dataSetIdentifier, wellPositions, channel, action) { - this._internal.ajaxRequest({ - url: this._internal.getScreeningDataStoreApiUrlForDataStoreUrl(dataSetIdentifier.datastoreServerUrl), - data: { "method" : "listPlateImageReferences", - "params" : { - "sessionToken" : this.getSession(), - "dataSetIdentifier" : dataSetIdentifier, - "wellPositions" : wellPositions, - "channel" : channel - } - }, - success: action - }); -} - -/** - * @see IDssServiceRpcScreening.listPlateImageReferences(String, IDatasetIdentifier, List<WellPosition>, List<String>) - * @method - */ -openbis.prototype.listPlateImageReferencesForDataSetIdentifierAndWellPositionsAndChannels = function(dataSetIdentifier, wellPositions, channels, action) { - this._internal.ajaxRequest({ - url: this._internal.getScreeningDataStoreApiUrlForDataStoreUrl(dataSetIdentifier.datastoreServerUrl), - data: { "method" : "listPlateImageReferences", - "params" : { - "sessionToken" : this.getSession(), - "dataSetIdentifier" : dataSetIdentifier, - "wellPositions" : wellPositions, - "channels" : channels - } - }, - success: action - }); -} - -/** - * @see IDssServiceRpcScreening.listImageReferences(String, IDatasetIdentifier, String) - * @method - */ -openbis.prototype.listImageReferencesForDataSetIdentifierAndChannel = function(dataSetIdentifier, channel, action) { - this._internal.ajaxRequest({ - url: this._internal.getScreeningDataStoreApiUrlForDataStoreUrl(dataSetIdentifier.datastoreServerUrl), - data: { "method" : "listImageReferences", - "params" : { - "sessionToken" : this.getSession(), - "dataSetIdentifier" : dataSetIdentifier, - "channel" : channel - } - }, - success: action - }); -} - -/** - * @see IDssServiceRpcScreening.listImageReferences(String, IDatasetIdentifier, List<String>) - * @method - */ -openbis.prototype.listImageReferencesForDataSetIdentifierAndChannels = function(dataSetIdentifier, channels, action) { - this._internal.ajaxRequest({ - url: this._internal.getScreeningDataStoreApiUrlForDataStoreUrl(dataSetIdentifier.datastoreServerUrl), - data: { "method" : "listImageReferences", - "params" : { - "sessionToken" : this.getSession(), - "dataSetIdentifier" : dataSetIdentifier, - "channels" : channels - } - }, - success: action - }); -} - -/** - * @see IDssServiceRpcScreening.listAvailableFeatureLists(String, IFeatureVectorDatasetIdentifier) - * @method - */ -openbis.prototype.listAvailableFeatureLists = function(featureVectorDataSet, action) { - this._internal.ajaxRequest({ - url: this._internal.getScreeningDataStoreApiUrlForDataStoreUrl(featureVectorDataSet.datastoreServerUrl), - data: { "method" : "listAvailableFeatureLists", - params : [this.getSession(), featureVectorDataSet] - }, - success: action - }); -}; - -/** - * @see IDssServiceRpcScreening.getFeatureList(String, IFeatureVectorDatasetIdentifier, String) - * @method - */ -openbis.prototype.getFeatureList = function(featureVectorDataSet, featureListCode, action) { - this._internal.ajaxRequest({ - url: this._internal.getScreeningDataStoreApiUrlForDataStoreUrl(featureVectorDataSet.datastoreServerUrl), - data: { "method" : "getFeatureList", - params : [this.getSession(), featureVectorDataSet, featureListCode] - }, - success: action - }); -}; - diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/.gc3pie/html/openbis.js b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/.gc3pie/html/openbis.js deleted file mode 100644 index f5476a74d56f0f72713d4c678d306fa0f8405326..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/.gc3pie/html/openbis.js +++ /dev/null @@ -1,1987 +0,0 @@ -/** - * ============================================= - * OpenBIS facade internal code (DO NOT USE!!!) - * ============================================= - */ - -if(typeof $ == 'undefined'){ - alert('Loading of openbis.js failed - jquery.js is missing'); -} - -function _openbisInternal(openbisUrlOrNull){ - this.init(openbisUrlOrNull); -} - -_openbisInternal.prototype.init = function(openbisUrlOrNull){ - this.openbisUrl = this.normalizeOpenbisUrl(openbisUrlOrNull); - this.generalInfoServiceUrl = this.openbisUrl + "/rmi-general-information-v1.json"; - this.generalInfoChangingServiceUrl = this.openbisUrl + "/rmi-general-information-changing-v1.json"; - this.queryServiceUrl = this.openbisUrl + "/rmi-query-v1.json"; - this.webInfoServiceUrl = this.openbisUrl + "/rmi-web-information-v1.json" -} - -_openbisInternal.prototype.log = function(msg){ - if(console){ - console.log(msg); - } -} - -_openbisInternal.prototype.normalizeOpenbisUrl = function(openbisUrlOrNull){ - var parts = this.parseUri(window.location); - - if(openbisUrlOrNull){ - var openbisParts = this.parseUri(openbisUrlOrNull); - - for(openbisPartName in openbisParts){ - var openbisPartValue = openbisParts[openbisPartName]; - - if(openbisPartValue){ - parts[openbisPartName] = openbisPartValue; - } - } - } - - return parts.protocol + "://" + parts.authority + "/openbis/openbis"; -} - -_openbisInternal.prototype.jsonRequestData = function(params) { - params["id"] = "1"; - params["jsonrpc"] = "2.0"; - return JSON.stringify(params) -} - -_openbisInternal.prototype.ajaxRequest = function(settings) { - settings.type = "POST"; - settings.processData = false; - settings.dataType = "json"; - settings.data = this.jsonRequestData(settings.data); - settings.success = this.ajaxRequestSuccess(settings.success); - // we call the same settings.success function for backward compatibility - settings.error = this.ajaxRequestError(settings.success); - $.ajax(settings) -} - -_openbisInternal.prototype.ajaxRequestSuccess = function(action){ - var openbisObj = this; - return function(response){ - if(response.error){ - openbisObj.log("Request failed: " + JSON.stringify(response.error)); - } - if(action){ - action(response); - } - }; -} - -_openbisInternal.prototype.ajaxRequestError = function(action){ - var openbisObj = this; - return function(xhr, status, error){ - openbisObj.log("Request failed: " + error); - if(action){ - action({ - "error" : "Request failed: " + error - }); - } - }; -} - -// Functions for working with cookies (see http://www.quirksmode.org/js/cookies.html) - -_openbisInternal.prototype.createCookie = function(name,value,days) { - if (days) { - var date = new Date(); - date.setTime(date.getTime()+(days*24*60*60*1000)); - var expires = "; expires="+date.toGMTString(); - } - else var expires = ""; - document.cookie = name+"="+value+expires+"; path=/"; -} - -_openbisInternal.prototype.readCookie = function(name) { - var nameEQ = name + "="; - var ca = document.cookie.split(';'); - for(var i=0;i < ca.length;i++) { - var c = ca[i]; - while (c.charAt(0)==' ') c = c.substring(1,c.length); - if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length,c.length); - } - return null; -} - -_openbisInternal.prototype.eraseCookie = function(name) { - this.createCookie(name,"",-1); -} - -// parseUri 1.2.2 (c) Steven Levithan <stevenlevithan.com> MIT License (see http://blog.stevenlevithan.com/archives/parseuri) - -_openbisInternal.prototype.parseUri = function(str) { - var options = { - strictMode: false, - key: ["source","protocol","authority","userInfo","user","password","host","port","relative","path","directory","file","query","anchor"], - q: { - name: "queryKey", - parser: /(?:^|&)([^&=]*)=?([^&]*)/g - }, - parser: { - strict: /^(?:([^:\/?#]+):)?(?:\/\/((?:(([^:@]*)(?::([^:@]*))?)?@)?([^:\/?#]*)(?::(\d*))?))?((((?:[^?#\/]*\/)*)([^?#]*))(?:\?([^#]*))?(?:#(.*))?)/, - loose: /^(?:(?![^:@]+:[^:@\/]*@)([^:\/?#.]+):)?(?:\/\/)?((?:(([^:@]*)(?::([^:@]*))?)?@)?([^:\/?#]*)(?::(\d*))?)(((\/(?:[^?#](?![^?#\/]*\.[^?#\/.]+(?:[?#]|$)))*\/?)?([^?#\/]*))(?:\?([^#]*))?(?:#(.*))?)/ - } - }; - - var o = options, - m = o.parser[o.strictMode ? "strict" : "loose"].exec(str), - uri = {}, - i = 14; - - while (i--) uri[o.key[i]] = m[i] || ""; - - uri[o.q.name] = {}; - uri[o.key[12]].replace(o.q.parser, function ($0, $1, $2) { - if ($1) uri[o.q.name][$1] = $2; - }); - - return uri; -} - -_openbisInternal.prototype.listDataStores = function(action){ - this.ajaxRequest({ - url: this.generalInfoServiceUrl, - data: { "method" : "listDataStores", - "params" : [ this.sessionToken ] - }, - success: action - }); -} - -_openbisInternal.prototype.initDataStores = function(action){ - var openbisInternal = this; - - if(typeof this.dataStores === "undefined"){ - this.listDataStores(function(response){ - if(response.result){ - openbisInternal.dataStores = response.result; - }else{ - openbisInternal.dataStores = []; - } - action(); - }); - }else{ - action(); - } -} - -_openbisInternal.prototype.getDataStoreUrlForDataStoreCode = function(dataStoreCodeOrNull, action) { - var openbisInternal = this; - - this.initDataStores(function(){ - if(openbisInternal.dataStores.length == 0){ - throw "Couldn't get a data store url as there are no data stores configured."; - }else{ - if(dataStoreCodeOrNull){ - var dataStoreUrl = null; - $.each(openbisInternal.dataStores, function(index, dataStore){ - if(dataStore.code == dataStoreCodeOrNull){ - dataStoreUrl = dataStore.downloadUrl; - } - }); - if(dataStoreUrl){ - action(dataStoreUrl); - }else{ - throw "Couldn't get a data store url because data store with " + dataStoreCodeOrNull + " code does not exist."; - } - }else{ - if(openbisInternal.dataStores.length == 1){ - action(openbisInternal.dataStores[0].downloadUrl); - }else{ - throw "There is more than one data store configured. Please specify a data store code to get a data store url."; - } - } - } - }); -} - -_openbisInternal.prototype.getDataStoreUrlForDataSetCode = function(dataSetCode, action) { - var openbisInternal = this; - - this.initDataStores(function(){ - if(openbisInternal.dataStores.length == 0){ - throw "Couldn't get a data store url as there are no data stores configured."; - }else if(openbisInternal.dataStores.length == 1){ - action(openbisInternal.dataStores[0].downloadUrl); - }else{ - openbisInternal.ajaxRequest({ - url: openbisInternal.generalInfoServiceUrl, - data: { "method" : "tryGetDataStoreBaseURL", - "params" : [ openbisInternal.sessionToken, dataSetCode ] - }, - success: function(response){ - var hostUrl = response.result; - - if(hostUrl){ - action(hostUrl + "/datastore_server"); - }else{ - throw "Couldn't get a data store url for a data set with " + dataSetCode + " code because the data set does not exist."; - } - } - }); - } - }); -} - -_openbisInternal.prototype.getDataStoreApiUrlForDataStoreCode = function(dataStoreCodeOrNull, action) { - this.getDataStoreUrlForDataStoreCode(dataStoreCodeOrNull, function(dataStoreUrl){ - action(dataStoreUrl + "/rmi-dss-api-v1.json"); - }); -} - -_openbisInternal.prototype.getDataStoreApiUrlForDataSetCode = function(dataSetCode, action) { - this.getDataStoreUrlForDataSetCode(dataSetCode, function(dataStoreUrl){ - action(dataStoreUrl + "/rmi-dss-api-v1.json"); - }); -} - -_openbisInternal.prototype.getDataStoreHostForDataStoreCode = function(dataStoreCodeOrNull, action) { - var openbisObj = this; - - this.getDataStoreUrlForDataStoreCode(dataStoreCodeOrNull, function(dataStoreUrl){ - var parts = openbisObj.parseUri(dataStoreUrl); - action(parts.protocol + "://" + parts.authority); - }); -} - -/** - * =============== - * OpenBIS facade - * =============== - * - * The facade provides access to the following services: - * - * - ch.systemsx.cisd.openbis.generic.shared.api.v1.IGeneralInformationService - * - ch.systemsx.cisd.openbis.generic.shared.api.v1.IGeneralInformationChangingService - * - ch.systemsx.cisd.openbis.plugin.query.shared.api.v1.IQueryApiServer - * - ch.systemsx.cisd.openbis.generic.shared.api.v1.IWebInformationService - * - ch.systemsx.cisd.openbis.dss.generic.shared.api.v1.IDssServiceRpcGeneric - * - * @class - * - */ - -function openbis(openbisUrlOrNull) { - this._internal = new _openbisInternal(openbisUrlOrNull); -} - -/** - * ================================================================================== - * ch.systemsx.cisd.openbis.generic.shared.api.v1.IGeneralInformationService methods - * ================================================================================== - */ - -/** - * Log into openBIS. - * - * @see IGeneralInformationService.tryToAuthenticateForAllServices(String, String) - * @method - */ -openbis.prototype.login = function(userId, userPassword, action) { - var openbisObj = this - this._internal.ajaxRequest({ - url: this._internal.generalInfoServiceUrl, - data: { "method" : "tryToAuthenticateForAllServices", - "params" : [ userId, userPassword ] - }, - success: - function(loginResponse) { - if(loginResponse.error){ - alert("Login failed"); - }else{ - openbisObj._internal.sessionToken = loginResponse.result; - openbisObj.rememberSession(); - } - openbisObj._internal.initDataStores(function(){ - action(loginResponse); - }); - } - }); -} - -/** - * Stores the current session in a cookie. - * - * @method - */ -openbis.prototype.rememberSession = function() { - this._internal.createCookie('openbis', this.getSession(), 1); -} - -/** - * Removes the current session from a cookie. - * - * @method - */ -openbis.prototype.forgetSession = function() { - this._internal.eraseCookie('openbis'); -} - -/** - * Restores the current session from a cookie. - * - * @method - */ -openbis.prototype.restoreSession = function() { - this._internal.sessionToken = this._internal.readCookie('openbis'); -} - -/** - * Sets the current session. - * - * @method - */ -openbis.prototype.useSession = function(sessionToken){ - this._internal.sessionToken = sessionToken; -} - -/** - * Returns the current session. - * - * @method - */ -openbis.prototype.getSession = function(){ - return this._internal.sessionToken; -} - -/** - * Checks whether the current session is still active. - * - * @see IGeneralInformationService.isSessionActive(String) - * @method - */ -openbis.prototype.isSessionActive = function(action) { - if(this.getSession()){ - this._internal.ajaxRequest({ - url: this._internal.generalInfoServiceUrl, - data: { "method" : "isSessionActive", - "params" : [ this.getSession() ] - }, - success: action - }); - }else{ - action({ result : false }) - } -} - -/** - * Restores the current session from a cookie and executes - * the specified action if the session is still active. - * - * @see restoreSession() - * @see isSessionActive() - * @method - */ -openbis.prototype.ifRestoredSessionActive = function(action) { - this.restoreSession(); - this.isSessionActive(function(data) { if (data.result) action(data) }); -} - -/** - * Log out of openBIS. - * - * @see IGeneralInformationService.logout(String) - * @method - */ -openbis.prototype.logout = function(action) { - this.forgetSession(); - - if(this.getSession()){ - this._internal.ajaxRequest({ - url: this._internal.generalInfoServiceUrl, - data: { "method" : "logout", - "params" : [ this.getSession() ] - }, - success: action - }); - }else if(action){ - action({ result : null }); - } -} - -/** - * @see IGeneralInformationService.listNamedRoleSets(String) - * @method - */ -openbis.prototype.listNamedRoleSets = function(action) { - this._internal.ajaxRequest({ - url: this._internal.generalInfoServiceUrl, - data: { "method" : "listNamedRoleSets", - "params" : [ this.getSession() ] - }, - success: action - }); -} - -/** - * @see IGeneralInformationService.listSpacesWithProjectsAndRoleAssignments(String, String) - * @method - */ -openbis.prototype.listSpacesWithProjectsAndRoleAssignments = function(databaseInstanceCodeOrNull, action) { - this._internal.ajaxRequest({ - url: this._internal.generalInfoServiceUrl, - data: { "method" : "listSpacesWithProjectsAndRoleAssignments", - "params" : [ this.getSession(), databaseInstanceCodeOrNull ] - }, - success: action - }); -} - -/** - * @see IGeneralInformationService.searchForSamples(String, SearchCriteria) - * @method - */ -openbis.prototype.searchForSamples = function(searchCriteria, action) { - this._internal.ajaxRequest({ - url: this._internal.generalInfoServiceUrl, - data: { "method" : "searchForSamples", - "params" : [ this.getSession(), - searchCriteria ] }, - success: action - }); -} - -/** - * @see IGeneralInformationService.searchForSamples(String, SearchCriteria, EnumSet<SampleFetchOption>) - * @method - */ -openbis.prototype.searchForSamplesWithFetchOptions = function(searchCriteria, fetchOptions, action) { - this._internal.ajaxRequest({ - url: this._internal.generalInfoServiceUrl, - data: { - "method" : "searchForSamples", - "params" : [ - this.getSession(), - searchCriteria, - fetchOptions ] - }, - success: action - }); -} - -/** - * @see IGeneralInformationService.searchForSamplesOnBehalfOfUser(String, SearchCriteria, EnumSet<SampleFetchOption>, String) - * @method - */ -openbis.prototype.searchForSamplesOnBehalfOfUser = function(searchCriteria, fetchOptions, userId, action) { - this._internal.ajaxRequest({ - url: this._internal.generalInfoServiceUrl, - data: { - "method" : "searchForSamplesOnBehalfOfUser", - "params" : [ - this.getSession(), - searchCriteria, - fetchOptions, - userId ] - }, - success: action - }); -} - -/** - * @see IGeneralInformationService.filterSamplesVisibleToUser(String, List<Sample>, String) - * @method - */ -openbis.prototype.filterSamplesVisibleToUser = function(allSamples, userId, action) { - this._internal.ajaxRequest({ - url: this._internal.generalInfoServiceUrl, - data: { - "method" : "filterSamplesVisibleToUser", - "params" : [ - this.getSession(), - allSamples, - userId ] - }, - success: action - }); -} - -/** - * @see IGeneralInformationService.listSamplesForExperiment(String, String) - * @method - */ -openbis.prototype.listSamplesForExperiment = function(experimentIdentifier, action) { - this._internal.ajaxRequest({ - url: this._internal.generalInfoServiceUrl, - data: { "method" : "listSamplesForExperiment", - "params" : [ this.getSession(), experimentIdentifier ] - }, - success: action - }); -} - -/** - * @see IGeneralInformationService.listSamplesForExperimentOnBehalfOfUser(String, String, String) - * @method - */ -openbis.prototype.listSamplesForExperimentOnBehalfOfUser = function(experimentIdentifier, userId, action) { - this._internal.ajaxRequest({ - url: this._internal.generalInfoServiceUrl, - data: { "method" : "listSamplesForExperimentOnBehalfOfUser", - "params" : [ this.getSession(), experimentIdentifier, userId ] - }, - success: action - }); -} - -/** - * @see IGeneralInformationService.listDataSets(String, List<Sample>) - * @method - */ -openbis.prototype.listDataSetsForSamples = function(samples, action) { - this._internal.ajaxRequest({ - url: this._internal.generalInfoServiceUrl, - data: { "method" : "listDataSets", - "params" : [ this.getSession(), samples ] - }, - success: action - }); -} - -/** - * @see IGeneralInformationService.listExperiments(String, List<Project>, String) - * @method - */ -openbis.prototype.listExperiments = function(projects, experimentType, action) { - this._internal.ajaxRequest({ - url: this._internal.generalInfoServiceUrl, - data: { "method" : "listExperiments", - "params" : [ this.getSession(), projects, experimentType ] - }, - success: action - }); -} - -/** - * @see IGeneralInformationService.listExperimentsHavingSamples(String, List<Project>, String) - * @method - */ -openbis.prototype.listExperimentsHavingSamples = function(projects, experimentType, action) { - this._internal.ajaxRequest({ - url: this._internal.generalInfoServiceUrl, - data: { "method" : "listExperimentsHavingSamples", - "params" : [ this.getSession(), projects, experimentType ] - }, - success: action - }); -} - -/** - * @see IGeneralInformationService.listExperimentsHavingDataSets(String, List<Project>, String) - * @method - */ -openbis.prototype.listExperimentsHavingDataSets = function(projects, experimentType, action) { - this._internal.ajaxRequest({ - url: this._internal.generalInfoServiceUrl, - data: { "method" : "listExperimentsHavingDataSets", - "params" : [ this.getSession(), projects, experimentType ] - }, - success: action - }); -} - -/** - * @see IGeneralInformationService.filterExperimentsVisibleToUser(String, List<Experiment>, String) - * @method - */ -openbis.prototype.filterExperimentsVisibleToUser = function(allExperiments, userId, action) { - this._internal.ajaxRequest({ - url: this._internal.generalInfoServiceUrl, - data: { "method" : "filterExperimentsVisibleToUser", - "params" : [ this.getSession(), allExperiments, userId ] - }, - success: action - }); -} - -/** - * @see IGeneralInformationService.listDataSetsForSample(String, Sample, boolean) - * @method - */ -openbis.prototype.listDataSetsForSample = function(sample, restrictToDirectlyConnected, action) { - this._internal.ajaxRequest({ - url: this._internal.generalInfoServiceUrl, - data: { "method" : "listDataSetsForSample", - "params" : [ this.getSession(), sample, restrictToDirectlyConnected ] - }, - success: action - }); -} - -/** - * @see IGeneralInformationService.listDataStores(String) - * @method - */ -openbis.prototype.listDataStores = function(action) { - this._internal.listDataStores(action); -} - -/** - * @see IGeneralInformationService.getDefaultPutDataStoreBaseURL(String) - * @method - */ -openbis.prototype.getDefaultPutDataStoreBaseURL = function(action) { - this._internal.ajaxRequest({ - url: this._internal.generalInfoServiceUrl, - data: { "method" : "getDefaultPutDataStoreBaseURL", - "params" : [ this.getSession() ] - }, - success: action - }); -} - -/** - * @see IGeneralInformationService.tryGetDataStoreBaseURL(String) - * @method - */ -openbis.prototype.tryGetDataStoreBaseURL = function(dataSetCode, action) { - this._internal.ajaxRequest({ - url: this._internal.generalInfoServiceUrl, - data: { "method" : "tryGetDataStoreBaseURL", - "params" : [ this.getSession(), dataSetCode ] - }, - success: action - }); -} - -/** - * @see IGeneralInformationService.getDataStoreBaseURLs(String, List<String>) - * @method - */ -openbis.prototype.getDataStoreBaseURLs = function(dataSetCodes, action) { - this._internal.ajaxRequest({ - url: this._internal.generalInfoServiceUrl, - data: { "method" : "getDataStoreBaseURLs", - "params" : [ this.getSession(), dataSetCodes ] - }, - success: action - }); -} - -/** - * @see IGeneralInformationService.listDataSetTypes(String) - * @method - */ -openbis.prototype.listDataSetTypes = function(action) { - this._internal.ajaxRequest({ - url: this._internal.generalInfoServiceUrl, - data: { "method" : "listDataSetTypes", - "params" : [ this.getSession() ] - }, - success: action - }); -} - -/** - * @see IGeneralInformationService.listSampleTypes(String) - * @method - */ -openbis.prototype.listSampleTypes = function(action) { - this._internal.ajaxRequest({ - url: this._internal.generalInfoServiceUrl, - data: { "method" : "listSampleTypes", - "params" : [ this.getSession() ] - }, - success: action - }); -} - -/** - * @see IGeneralInformationService.listExperimentTypes(String) - * @method - */ -openbis.prototype.listExperimentTypes = function(action) { - this._internal.ajaxRequest({ - url: this._internal.generalInfoServiceUrl, - data: { "method" : "listExperimentTypes", - "params" : [ this.getSession() ] - }, - success: action - }); -} - -/** - * @see IGeneralInformationService.listVocabularies(String) - * @method - */ -openbis.prototype.listVocabularies = function(action) { - this._internal.ajaxRequest({ - url: this._internal.generalInfoServiceUrl, - data: { "method" : "listVocabularies", - "params" : [ this.getSession() ] - }, - success: action - }); -} - -/** - * @see IGeneralInformationService.listDataSets(String, List<Sample>, EnumSet<Connections>) - * @method - */ -openbis.prototype.listDataSetsForSamplesWithConnections = function(samples, connectionsToGet, action) { - this._internal.ajaxRequest({ - url: this._internal.generalInfoServiceUrl, - data: { "method" : "listDataSets", - "params" : [ this.getSession(), samples, connectionsToGet ] - }, - success: action - }); -} - -/** - * @see IGeneralInformationService.listDataSetsOnBehalfOfUser(String, List<Sample>, EnumSet<Connections>, String) - * @method - */ -openbis.prototype.listDataSetsForSamplesOnBehalfOfUser = function(samples, connectionsToGet, userId, action) { - this._internal.ajaxRequest({ - url: this._internal.generalInfoServiceUrl, - data: { "method" : "listDataSetsOnBehalfOfUser", - "params" : [ this.getSession(), samples, connectionsToGet, userId ] - }, - success: action - }); -} - -/** - * @see IGeneralInformationService.listDataSetsForExperiments(String, List<Experiment>, EnumSet<Connections>) - * @method - */ -openbis.prototype.listDataSetsForExperiments = function(experiments, connectionsToGet, action) { - this._internal.ajaxRequest({ - url: this._internal.generalInfoServiceUrl, - data: { "method" : "listDataSetsForExperiments", - "params" : [ this.getSession(), experiments, connectionsToGet ] - }, - success: action - }); -} - -/** - * @see IGeneralInformationService.listDataSetsForExperimentsOnBehalfOfUser(String, List<Experiment>, EnumSet<Connections>, String) - * @method - */ -openbis.prototype.listDataSetsForExperimentsOnBehalfOfUser = function(experiments, connectionsToGet, userId, action) { - this._internal.ajaxRequest({ - url: this._internal.generalInfoServiceUrl, - data: { "method" : "listDataSetsForExperimentsOnBehalfOfUser", - "params" : [ this.getSession(), experiments, connectionsToGet, userId ] - }, - success: action - }); -} - -/** - * @see IGeneralInformationService.getDataSetMetaData(String, List<String>) - * @method - */ -openbis.prototype.getDataSetMetaData = function(dataSetCodes, action) { - this._internal.ajaxRequest({ - url: this._internal.generalInfoServiceUrl, - data: { "method" : "getDataSetMetaData", - "params" : [ this.getSession(), dataSetCodes ] - }, - success: action - }); -} - -/** - * @see IGeneralInformationService.getDataSetMetaData(String, List<String>, EnumSet<DataSetFetchOption>) - * @method - */ -openbis.prototype.getDataSetMetaDataWithFetchOptions = function(dataSetCodes, fetchOptions, action) { - this._internal.ajaxRequest({ - url: this._internal.generalInfoServiceUrl, - data: { "method" : "getDataSetMetaData", - "params" : [ this.getSession(), dataSetCodes, fetchOptions ] - }, - success: action - }); -} - -/** - * @see IGeneralInformationService.searchForDataSets(String, SearchCriteria) - * @method - */ -openbis.prototype.searchForDataSets = function(searchCriteria, action) { - this._internal.ajaxRequest({ - url: this._internal.generalInfoServiceUrl, - data: { "method" : "searchForDataSets", - "params" : [ this.getSession(), - searchCriteria ] }, - success: action - }); -} - -/** - * @see IGeneralInformationService.searchForDataSetsOnBehalfOfUser(String, SearchCriteria, String) - * @method - */ -openbis.prototype.searchForDataSetsOnBehalfOfUser = function(searchCriteria, userId, action) { - this._internal.ajaxRequest({ - url: this._internal.generalInfoServiceUrl, - data: { "method" : "searchForDataSetsOnBehalfOfUser", - "params" : [ this.getSession(), - searchCriteria, - userId ] }, - success: action - }); -} - -/** - * @see IGeneralInformationService.filterDataSetsVisibleToUser(String, List<DataSet>, String) - * @method - */ -openbis.prototype.filterDataSetsVisibleToUser = function(allDataSets, userId, action) { - this._internal.ajaxRequest({ - url: this._internal.generalInfoServiceUrl, - data: { "method" : "filterDataSetsVisibleToUser", - "params" : [ this.getSession(), - allDataSets, - userId ] }, - success: action - }); -} - -/** - * @see IGeneralInformationService.listExperiments(String, List<String>) - * @method - */ -openbis.prototype.listExperimentsForIdentifiers = function(experimentIdentifiers, action) { - this._internal.ajaxRequest({ - url: this._internal.generalInfoServiceUrl, - data: { "method" : "listExperiments", - "params" : [ this.getSession(), - experimentIdentifiers ] }, - success: action - }); -} - -/** - * @see IGeneralInformationService.searchForExperiments(String, SearchCriteria) - * @method - */ -openbis.prototype.searchForExperiments = function(searchCriteria, action) { - this._internal.ajaxRequest({ - url: this._internal.generalInfoServiceUrl, - data: { "method" : "searchForExperiments", - "params" : [ this.getSession(), - searchCriteria ] }, - success: action - }); -} - -/** - * @see IGeneralInformationService.listProjects(String) - * @method - */ -openbis.prototype.listProjects = function(action) { - this._internal.ajaxRequest({ - url: this._internal.generalInfoServiceUrl, - data: { "method" : "listProjects", - "params" : [ this.getSession() ] - }, - success: action - }); -} - -/** - * @see IGeneralInformationService.listProjectsOnBehalfOfUser(String, String) - * @method - */ -openbis.prototype.listProjectsOnBehalfOfUser = function(userId, action) { - this._internal.ajaxRequest({ - url: this._internal.generalInfoServiceUrl, - data: { "method" : "listProjectsOnBehalfOfUser", - "params" : [ this.getSession(), userId ] - }, - success: action - }); -} - -/** - * @see IGeneralInformationService.getMaterialByCodes(String, List<MaterialIdentifier>) - * @method - */ -openbis.prototype.getMaterialByCodes = function(materialIdentifiers, action) { - this._internal.ajaxRequest({ - url: this._internal.generalInfoServiceUrl, - data: { "method" : "getMaterialByCodes", - "params" : [ this.getSession(), materialIdentifiers ] - }, - success: action - }); -} - -/** - * @see IGeneralInformationService.searchForMaterials(String, SearchCriteria) - * @method - */ -openbis.prototype.searchForMaterials = function(searchCriteria, action) { - this._internal.ajaxRequest({ - url: this._internal.generalInfoServiceUrl, - data: { "method" : "searchForMaterials", - "params" : [ this.getSession(), searchCriteria ] - }, - success: action - }); -} - -/** - * @see IGeneralInformationService.listMetaprojects(String) - * @method - */ -openbis.prototype.listMetaprojects = function(action) { - this._internal.ajaxRequest({ - url: this._internal.generalInfoServiceUrl, - data: { "method" : "listMetaprojects", - "params" : [ this.getSession() ] - }, - success: action - }); -} - -/** - * @see IGeneralInformationService.listMetaprojectsOnBehalfOfUser(String, String) - * @method - */ -openbis.prototype.listMetaprojectsOnBehalfOfUser = function(userId, action) { - this._internal.ajaxRequest({ - url: this._internal.generalInfoServiceUrl, - data: { "method" : "listMetaprojectsOnBehalfOfUser", - "params" : [ this.getSession(), userId ] - }, - success: action - }); -} - -/** - * @see IGeneralInformationService.getMetaproject(String, IMetaprojectId) - * @method - */ -openbis.prototype.getMetaproject = function(metaprojectId, action) { - this._internal.ajaxRequest({ - url: this._internal.generalInfoServiceUrl, - data: { "method" : "getMetaproject", - "params" : [ this.getSession(), metaprojectId ] - }, - success: action - }); -} - -/** - * @see IGeneralInformationService.getMetaprojectOnBehalfOfUser(String, IMetaprojectId, String) - * @method - */ -openbis.prototype.getMetaprojectOnBehalfOfUser = function(metaprojectId, userId, action) { - this._internal.ajaxRequest({ - url: this._internal.generalInfoServiceUrl, - data: { "method" : "getMetaprojectOnBehalfOfUser", - "params" : [ this.getSession(), metaprojectId, userId ] - }, - success: action - }); -} - -/** - * @see IGeneralInformationService.listAttachmentsForProject(String, IProjectId, boolean) - * @method - */ -openbis.prototype.listAttachmentsForProject = function(projectId, allVersions, action) { - this._internal.ajaxRequest({ - url: this._internal.generalInfoServiceUrl, - data: { "method" : "listAttachmentsForProject", - "params" : [ this.getSession(), projectId, allVersions ] - }, - success: action - }); -} - -/** - * @see IGeneralInformationService.listAttachmentsForExperiment(String, IExperimentId, boolean) - * @method - */ -openbis.prototype.listAttachmentsForExperiment = function(experimentId, allVersions, action) { - this._internal.ajaxRequest({ - url: this._internal.generalInfoServiceUrl, - data: { "method" : "listAttachmentsForExperiment", - "params" : [ this.getSession(), experimentId, allVersions ] - }, - success: action - }); -} - -/** - * @see IGeneralInformationService.listAttachmentsForSample(String, ISampleId, boolean) - * @method - */ -openbis.prototype.listAttachmentsForSample = function(sampleId, allVersions, action) { - this._internal.ajaxRequest({ - url: this._internal.generalInfoServiceUrl, - data: { "method" : "listAttachmentsForSample", - "params" : [ this.getSession(), sampleId, allVersions ] - }, - success: action - }); -} - -/** - * ========================================================================================== - * ch.systemsx.cisd.openbis.generic.shared.api.v1.IGeneralInformationChangingService methods - * ========================================================================================== - */ - -/** - * @see IGeneralInformationChangingService.updateSampleProperties(String, long, Map<String,String>) - * @method - */ -openbis.prototype.updateSampleProperties = function(sampleId, properties, action) { - this._internal.ajaxRequest({ - url: this._internal.generalInfoChangingServiceUrl, - data: { "method" : "updateSampleProperties", - "params" : [ this.getSession(), sampleId, properties ] - }, - success: action - }); -} - -/** - * @see IGeneralInformationChangingService.addUnofficialVocabularyTerm(String, Long, NewVocabularyTerm) - * @method - */ -openbis.prototype.addUnofficialVocabularyTerm = function(vocabularyId, term, action) { - this._internal.ajaxRequest({ - url: this._internal.generalInfoChangingServiceUrl, - data: { "method" : "addUnofficialVocabularyTerm", - "params" : [ this.getSession(), vocabularyId, term ] - }, - success: action - }); -} - -/** - * @see IGeneralInformationChangingService.getWebAppSettings(String, String) - * @method - */ -openbis.prototype.getWebAppSettings = function(webappId, action) { - this._internal.ajaxRequest({ - url: this._internal.generalInfoChangingServiceUrl, - data: { "method" : "getWebAppSettings", - params : [ this.getSession(), webappId ] }, - success: action - }); -} - -/** - * @see IGeneralInformationChangingService.setWebAppSettings(String, WebAppSettings) - * @method - */ -openbis.prototype.setWebAppSettings = function(webappSettings, action) { - this._internal.ajaxRequest({ - url: this._internal.generalInfoChangingServiceUrl, - data: { "method" : "setWebAppSettings", - params : [ this.getSession(), webappSettings ] }, - success: action - }); -} - -/** - * @see IGeneralInformationChangingService.createMetaproject(String, String, String) - * @method - */ -openbis.prototype.createMetaproject = function(name, descriptionOrNull, action) { - this._internal.ajaxRequest({ - url: this._internal.generalInfoChangingServiceUrl, - data: { "method" : "createMetaproject", - params : [ this.getSession(), name, descriptionOrNull ] }, - success: action - }); -} - -/** - * @see IGeneralInformationChangingService.updateMetaproject(String, IMetaprojectId, String, String) - * @method - */ -openbis.prototype.updateMetaproject = function(metaprojectId, name, descriptionOrNull, action) { - this._internal.ajaxRequest({ - url: this._internal.generalInfoChangingServiceUrl, - data: { "method" : "updateMetaproject", - params : [ this.getSession(), metaprojectId, name, descriptionOrNull ] }, - success: action - }); -} - -/** - * @see IGeneralInformationChangingService.deleteMetaproject(String, IMetaprojectId) - * @method - */ -openbis.prototype.deleteMetaproject = function(metaprojectId, action) { - this._internal.ajaxRequest({ - url: this._internal.generalInfoChangingServiceUrl, - data: { "method" : "deleteMetaproject", - params : [ this.getSession(), metaprojectId ] }, - success: action - }); -} - -/** - * @see IGeneralInformationChangingService.addToMetaproject(String, IMetaprojectId, MetaprojectAssignmentsIds) - * @method - */ -openbis.prototype.addToMetaproject = function(metaprojectId, assignmentsToAdd, action) { - this._internal.ajaxRequest({ - url: this._internal.generalInfoChangingServiceUrl, - data: { "method" : "addToMetaproject", - params : [ this.getSession(), metaprojectId, assignmentsToAdd ] }, - success: action - }); -} - -/** - * @see IGeneralInformationChangingService.removeFromMetaproject(String, IMetaprojectId, MetaprojectAssignmentsIds) - * @method - */ -openbis.prototype.removeFromMetaproject = function(metaprojectId, assignmentsToRemove, action) { - this._internal.ajaxRequest({ - url: this._internal.generalInfoChangingServiceUrl, - data: { "method" : "removeFromMetaproject", - params : [ this.getSession(), metaprojectId, assignmentsToRemove ] }, - success: action - }); -} - -/** - * ============================================================================ - * ch.systemsx.cisd.openbis.plugin.query.shared.api.v1.IQueryApiServer methods - * ============================================================================ - */ - -/** - * @see IQueryApiServer.listQueries(String) - * @method - */ -openbis.prototype.listQueries = function(action) { - this._internal.ajaxRequest({ - url: this._internal.queryServiceUrl, - data: { "method" : "listQueries", - "params" : [ this.getSession() ] }, - success: action - }); -} - -/** - * @see IQueryApiServer.executeQuery(String, long, Map<String, String>) - * @method - */ -openbis.prototype.executeQuery = function(queryId, parameterBindings, action) { - this._internal.ajaxRequest({ - url: this._internal.queryServiceUrl, - data: { "method" : "executeQuery", - "params" : [ this.getSession(), queryId, parameterBindings ] }, - success: action - }); -} - -/** - * @see IQueryApiServer.listTableReportDescriptions(String) - * @method - */ -openbis.prototype.listTableReportDescriptions = function(action) { - this._internal.ajaxRequest({ - url: this._internal.queryServiceUrl, - data: { "method" : "listTableReportDescriptions", - "params" : [ this.getSession() ] }, - success: action - }); -} - -/** - * @see IQueryApiServer.createReportFromDataSets(String, String, String, List<String>) - * @method - */ -openbis.prototype.createReportFromDataSets = function(dataStoreCode, serviceKey, dataSetCodes, action) { - this._internal.ajaxRequest({ - url: this._internal.queryServiceUrl, - data: { "method" : "createReportFromDataSets", - params : [ this.getSession(), dataStoreCode, serviceKey, dataSetCodes ] }, - success: action - }); -} - -/** - * @see IQueryApiServer.listAggregationServices(String) - * @method - */ -openbis.prototype.listAggregationServices = function(action) { - this._internal.ajaxRequest({ - url: this._internal.queryServiceUrl, - data: { "method" : "listAggregationServices", - params : [ this.getSession() ] }, - success: action - }); -} - -/** - * @see IQueryApiServer.createReportFromAggregationService(String, String, String, Map<String, Object>) - * @method - */ -openbis.prototype.createReportFromAggregationService = function(dataStoreCode, serviceKey, parameters, action) { - this._internal.ajaxRequest({ - url: this._internal.queryServiceUrl, - data: { "method" : "createReportFromAggregationService", - params : [ this.getSession(), dataStoreCode, serviceKey, parameters ] }, - success: action - }); -} - - -/** - * ============================================================================== - * ch.systemsx.cisd.openbis.generic.shared.api.v1.IWebInformationService methods - * ============================================================================== - */ - -/** - * Returns the current server side session. - * - * @see IWebInformationService.getSessionToken() - * @method - */ -openbis.prototype.getSessionTokenFromServer = function(action) { - this._internal.ajaxRequest({ - url: this._internal.webInfoServiceUrl, - data: { "method" : "getSessionToken" }, - success: action - }); -} - -/** - * ================================================================================= - * ch.systemsx.cisd.openbis.dss.generic.shared.api.v1.IDssServiceRpcGeneric methods - * ================================================================================= - */ - -/** - * @see IDssServiceRpcGeneric.listFilesForDataSet(String, DataSetFileDTO) - * @method - */ -openbis.prototype.listFilesForDataSetFile = function(fileOrFolder, action) { - var openbisObj = this; - this._internal.getDataStoreApiUrlForDataSetCode(fileOrFolder.dataSetCode, function(dataStoreApiUrl){ - openbisObj._internal.ajaxRequest({ - url: dataStoreApiUrl, - data: { "method" : "listFilesForDataSet", - "params" : [ openbisObj.getSession(), fileOrFolder ] }, - success: action - }); - }); -} - -/** - * @see IDssServiceRpcGeneric.getDownloadUrlForFileForDataSet(String, DataSetFileDTO) - * @method - */ -openbis.prototype.getDownloadUrlForFileForDataSetFile = function(fileOrFolder, action) { - var openbisObj = this; - this._internal.getDataStoreApiUrlForDataSetCode(fileOrFolder.dataSetCode, function(dataStoreApiUrl){ - openbisObj._internal.ajaxRequest({ - url: dataStoreApiUrl, - data: { "method" : "getDownloadUrlForFileForDataSet", - "params" : [ openbisObj.getSession(), fileOrFolder ] }, - success: action - }); - }); -} - -/** - * Returns a download url that is valid as long as the user session is valid. - * @method - */ -openbis.prototype.getDownloadUrlForFileForDataSetFileInSession = function(fileOrFolder, action) { - this.getDownloadUrlForFileForDataSetInSession(fileOrFolder.dataSetCode, fileOrFolder.path, action); -} - -/** - * @see IDssServiceRpcGeneric.getDownloadUrlForFileForDataSetWithTimeout(String, DataSetFileDTO, long) - * @method - */ -openbis.prototype.getDownloadUrlForFileForDataSetFileWithTimeout = function(fileOrFolder, validityDurationInSeconds, action) { - var openbisObj = this; - this._internal.getDataStoreApiUrlForDataSetCode(fileOrFolder.dataSetCode, function(dataStoreApiUrl){ - openbisObj._internal.ajaxRequest({ - url: dataStoreApiUrl, - data: { "method" : "getDownloadUrlForFileForDataSetWithTimeout", - "params" : [ openbisObj.getSession(), fileOrFolder, validityDurationInSeconds ] }, - success: action - }); - }); -} - -/** - * @see IDssServiceRpcGeneric.listFilesForDataSet(String, String, String, boolean) - * @method - */ -openbis.prototype.listFilesForDataSet = function(dataSetCode, path, recursive, action) { - var openbisObj = this; - this._internal.getDataStoreApiUrlForDataSetCode(dataSetCode, function(dataStoreApiUrl){ - openbisObj._internal.ajaxRequest({ - url: dataStoreApiUrl, - data: { "method" : "listFilesForDataSet", - "params" : [ openbisObj.getSession(), dataSetCode, path, recursive ] }, - success: action - }); - }); -} - -/** - * @see IDssServiceRpcGeneric.getDownloadUrlForFileForDataSet(String, String, String) - * @method - */ -openbis.prototype.getDownloadUrlForFileForDataSet = function(dataSetCode, path, action) { - var openbisObj = this; - this._internal.getDataStoreApiUrlForDataSetCode(dataSetCode, function(dataStoreApiUrl){ - openbisObj._internal.ajaxRequest({ - url: dataStoreApiUrl, - data: { "method" : "getDownloadUrlForFileForDataSet", - "params" : [ openbisObj.getSession(), dataSetCode, path ] }, - success: action - }); - }); -} - -/** - * Returns a download url that is valid as long as the user session is valid. - * @method - */ -openbis.prototype.getDownloadUrlForFileForDataSetInSession = function(dataSetCode, path, action) { - var openbisObj = this; - this._internal.getDataStoreUrlForDataSetCode(dataSetCode, function(dataStoreUrl){ - var pathWithoutSlash = path.charAt(0) == "/" ? path.substr(1) : path; - var url = dataStoreUrl + "/" + dataSetCode + "/" + pathWithoutSlash + "?sessionID=" + openbisObj.getSession(); - action(url); - }); -} - -/** - * @see IDssServiceRpcGeneric.getDownloadUrlForFileForDataSetWithTimeout(String, String, String, long) - * @method - */ -openbis.prototype.getDownloadUrlForFileForDataSetWithTimeout = function(dataSetCode, path, validityDurationInSeconds, action) { - var openbisObj = this; - this._internal.getDataStoreApiUrlForDataSetCode(dataSetCode, function(dataStoreApiUrl){ - openbisObj._internal.ajaxRequest({ - url: dataStoreApiUrl, - data: { "method" : "getDownloadUrlForFileForDataSetWithTimeout", - "params" : [ openbisObj.getSession(), dataSetCode, path, validityDurationInSeconds ] }, - success: action - }); - }); -} - -/** - * Creates a session workspace file uploader inside the specified uploaderContainer element and for the default data store. - * @method - */ -openbis.prototype.createSessionWorkspaceUploader = function(uploaderContainer, oncomplete){ - this.createSessionWorkspaceUploaderForDataStore(uploaderContainer, null, oncomplete); -} - -/** - * Creates a session workspace file uploader inside the specified uploaderContainer element and for the specified data store. - * @method - */ -openbis.prototype.createSessionWorkspaceUploaderForDataStore = function(uploaderContainer, dataStoreCodeOrNull, oncomplete){ - var uploaderSupported = window.File && window.FileReader && window.XMLHttpRequest; - - if(!uploaderSupported){ - alert("Uploader is not supported by your browser."); - return; - } - - var $this = this; - this._internal.getDataStoreUrlForDataStoreCode(dataStoreCodeOrNull, function(dataStoreUrl){ - // figure out what is the location of the openbis.js script and assume that uploader resources are served by the same server - var openbisScriptLocation = $('script[src*=openbis\\.js]').attr('src'); - var uploaderDirectoryLocation = jsFileLocation = openbisScriptLocation.replace(/js\/openbis\.js/g, 'uploader'); - - $('head').append('<link rel="stylesheet" media="screen" type="text/css" href="' + uploaderDirectoryLocation + '/css/src/upload.css" />'); - $('head').append('<script charset="utf-8" type="text/javascript" src="' + uploaderDirectoryLocation + '/js/src/upload.js" />'); - - $(uploaderContainer).load(uploaderDirectoryLocation + "/index.html", function(){ - Uploader.init({ - smart_mode: true, - chunk_size: 1000*1024, - file_upload_url: dataStoreUrl + "/session_workspace_file_upload", - form_upload_url: dataStoreUrl + "/session_workspace_form_upload", - file_download_url: dataStoreUrl + "/session_workspace_file_download", - oncomplete: oncomplete, - sessionID: $this.getSession() - }); - }); - }); -} - -/** - * Creates a session workspace download url for a file with the specified filePath and for the default data store. - * @method - */ -openbis.prototype.createSessionWorkspaceDownloadUrl = function(filePath, action){ - return this.createSessionWorkspaceDownloadUrlForDataStore(filePath, null, action); -} - -/** - * Creates a session workspace download url for a file with the specified filePath and for the specified data store. - * @method - */ -openbis.prototype.createSessionWorkspaceDownloadUrlForDataStore = function(filePath, dataStoreCodeOrNull, action){ - var openbisObj = this; - - this._internal.getDataStoreUrlForDataStoreCode(dataStoreCodeOrNull, function(dataStoreUrl){ - var downloadUrl = dataStoreUrl + "/session_workspace_file_download?sessionID=" + openbisObj.getSession() + "&filePath=" + filePath; - action(downloadUrl); - }); -} - -/** - * Create a session workspace download link for a file with the specified filePath at the default data store. - * @method - */ -openbis.prototype.createSessionWorkspaceDownloadLink = function(filePath, linkText, action){ - return this.createSessionWorkspaceDownloadLinkForDataStore(filePath, linkText, null, action); -} - -/** - * Create a session workspace download link for a file with the specified filePath at the specified data store. - * @method - */ -openbis.prototype.createSessionWorkspaceDownloadLinkForDataStore = function(filePath, linkText, dataStoreCodeOrNull, action){ - this.createSessionWorkspaceDownloadUrlForDataStore(filePath, dataStoreCodeOrNull, function(downloadUrl){ - var link = $("<a href='" + downloadUrl + "'>" + (linkText ? linkText : filePath) + "</a>"); - action(link); - }); -} - -/** - * Downloads a session workspace file with the specified filePath from the default data store. - * @method - */ -openbis.prototype.downloadSessionWorkspaceFile = function(filePath, action) { - this.downloadSessionWorkspaceFileForDataStore(filePath, null, action); -} - -/** - * Downloads a session workspace file with the specified filePath from the specified data store. - * @method - */ -openbis.prototype.downloadSessionWorkspaceFileForDataStore = function(filePath, dataStoreCodeOrNull, action) { - var openbisObj = this; - - this.createSessionWorkspaceDownloadUrlForDataStore(filePath, dataStoreCodeOrNull, function(downloadUrl){ - $.ajax({ - type: "GET", - dataType: "text", - url: downloadUrl, - success: openbisObj._internal.ajaxRequestSuccess(action), - error: openbisObj._internal.ajaxRequestError(action) - }); - }); -} - -/** - * Deletes a session workspace file with the specified filePath from the default data store. - * @method - */ -openbis.prototype.deleteSessionWorkspaceFile = function(filePath, action) { - this.deleteSessionWorkspaceFileForDataStore(filePath, null, action) -} - -/** - * Deletes a session workspace file with the specified filePath from the specified data store. - * @method - */ -openbis.prototype.deleteSessionWorkspaceFileForDataStore = function(filePath, dataStoreCodeOrNull, action) { - var openbisObj = this; - - this._internal.getDataStoreApiUrlForDataStoreCode(dataStoreCodeOrNull, function(dataStoreApiUrl){ - openbisObj._internal.ajaxRequest({ - url: dataStoreApiUrl, - data: { - "method" : "deleteSessionWorkspaceFile", - "params" : [ openbisObj.getSession(), filePath ] - }, - success: action - }); - }); -} - -/** - * @see IDssServiceRpcGeneric.getPathToDataSet(String, String, String) - * @method - */ -openbis.prototype.getPathToDataSet = function(dataSetCode, overrideStoreRootPathOrNull, action) { - var openbisObj = this; - this._internal.getDataStoreApiUrlForDataSetCode(dataSetCode, function(dataStoreApiUrl){ - openbisObj._internal.ajaxRequest({ - url: dataStoreApiUrl, - data: { "method" : "getPathToDataSet", - "params" : [ openbisObj.getSession(), dataSetCode, overrideStoreRootPathOrNull ] }, - success: action - }); - }); -} - -/** - * @see IDssServiceRpcGeneric.tryGetPathToDataSet(String, String, String) - * @method - */ -openbis.prototype.tryGetPathToDataSet = function(dataSetCode, overrideStoreRootPathOrNull, action) { - var openbisObj = this; - this._internal.getDataStoreApiUrlForDataSetCode(dataSetCode, function(dataStoreApiUrl){ - openbisObj._internal.ajaxRequest({ - url: dataStoreApiUrl, - data: { "method" : "tryGetPathToDataSet", - "params" : [ openbisObj.getSession(), dataSetCode, overrideStoreRootPathOrNull ] }, - success: action - }); - }); -} - -/** - * List shares from the default data store. - * - * @see IDssServiceRpcGeneric.listAllShares(String) - * @method - */ -openbis.prototype.listAllShares = function(action) { - this.listAllSharesForDataStore(null, action); -} - -/** - * List shares from the specified data store. - * - * @see IDssServiceRpcGeneric.listAllShares(String) - * @method - */ -openbis.prototype.listAllSharesForDataStore = function(dataStoreCodeOrNull, action) { - var openbisObj = this; - - this._internal.getDataStoreApiUrlForDataStoreCode(dataStoreCodeOrNull, function(dataStoreApiUrl){ - openbisObj._internal.ajaxRequest({ - url: dataStoreApiUrl, - data: { - "method" : "listAllShares", - "params" : [ openbisObj.getSession() ] - }, - success: action - }); - }); -} - -/** - * @see IDssServiceRpcGeneric.shuffleDataSet(String, String, String) - * @method - */ -openbis.prototype.shuffleDataSet = function(dataSetCode, shareId, action) { - var openbisObj = this; - this._internal.getDataStoreApiUrlForDataSetCode(dataSetCode, function(dataStoreApiUrl){ - openbisObj._internal.ajaxRequest({ - url: dataStoreApiUrl, - data: { "method" : "shuffleDataSet", - "params" : [ openbisObj.getSession(), dataSetCode, shareId ] }, - success: action - }); - }); -} - -/** - * Get a validation script from the default data store. - * - * @see IDssServiceRpcGeneric.getValidationScript(String, String) - * @method - */ -openbis.prototype.getValidationScript = function(dataSetTypeOrNull, action) { - this.getValidationScriptForDataStore(dataSetTypeOrNull, null, action); -} - -/** - * Get a validation script from the specified data store. - * - * @see IDssServiceRpcGeneric.getValidationScript(String, String) - * @method - */ -openbis.prototype.getValidationScriptForDataStore = function(dataSetTypeOrNull, dataStoreCodeOrNull, action) { - var openbisObj = this; - - this._internal.getDataStoreApiUrlForDataStoreCode(dataStoreCodeOrNull, function(dataStoreApiUrl){ - openbisObj._internal.ajaxRequest({ - url: dataStoreApiUrl, - data: { - "method" : "getValidationScript", - "params" : [ openbisObj.getSession(), dataSetTypeOrNull ] - }, - success: action - }); - }); -} - -/** - * Get a url that will produce a graph with the given configuration at the default data store. - * - * @method - */ -openbis.prototype.getGraphUrl = function(graphConfig, action) { - this.getGraphUrlForDataStore(graphConfig, null, action); -} - -/** - * Get a url that will produce a graph with the given configuration at the specified data store. - * - * @method - */ -openbis.prototype.getGraphUrlForDataStore = function(graphConfig, dataStoreCodeOrNull, action) { - var openbisObj = this; - - this._internal.getDataStoreHostForDataStoreCode(dataStoreCodeOrNull, function(dataStoreHost) { - var graphUrl = dataStoreHost + "/graphservice/?sessionID=" + openbisObj.getSession(); - for (prop in graphConfig) { - graphUrl += "&" + prop + "=" + encodeURIComponent(graphConfig[prop]); - } - action(graphUrl); - }); -} - -/** - * ===================== - * OpenBIS graph config - * ===================== - * - * Defines the configuration for a graph generated by the server's graphservice. - * - * To use, set properties on the object with keys that match the name of the servlet - * parameters of the graphservice and then call the method getGraphUrl on the openbis - * object. Do *not* set the sessionID paramter -- this will be filled in by the openbis - * object. - * - * The graphservice is documented here: https://wiki-bsse.ethz.ch/display/openBISDoc/Configuring+Graphs+and+Plots - * - * @class - * - */ -function openbisGraphConfig(filename, graphtype, title) { - this.file = filename; - this["graph-type"] = graphtype; - this.title = title; -} - - -/** - * ===================================================== - * OpenBIS webapp context internal code (DO NOT USE!!!) - * ===================================================== - */ - -function _openbisWebAppContextInternal(){ - this.webappCode = this.getParameter("webapp-code"); - this.sessionId = this.getParameter("session-id"); - this.entityKind = this.getParameter("entity-kind"); - this.entityType = this.getParameter("entity-type"); - this.entityIdentifier = this.getParameter("entity-identifier"); - this.entityPermId = this.getParameter("entity-perm-id"); -} - -_openbisWebAppContextInternal.prototype.getParameter = function(parameterName){ - var match = location.search.match(RegExp("[?|&]"+parameterName+'=(.+?)(&|$)')); - if(match && match[1]){ - return decodeURIComponent(match[1].replace(/\+/g,' ')); - }else{ - return null; - } -} - -/** - * ======================= - * OpenBIS webapp context - * ======================= - * - * Provides a context information for webapps that are embedded inside the OpenBIS UI. - * - * @class - * - */ -function openbisWebAppContext(){ - this._internal = new _openbisWebAppContextInternal(); -} - -openbisWebAppContext.prototype.getWebappCode = function(){ - return this._internal.webappCode; -} - -openbisWebAppContext.prototype.getSessionId = function(){ - return this._internal.sessionId; -} - -openbisWebAppContext.prototype.getEntityKind = function(){ - return this._internal.entityKind; -} - -openbisWebAppContext.prototype.getEntityType = function(){ - return this._internal.entityType; -} - -openbisWebAppContext.prototype.getEntityIdentifier = function(){ - return this._internal.entityIdentifier; -} - -openbisWebAppContext.prototype.getEntityPermId = function(){ - return this._internal.entityPermId; -} - -openbisWebAppContext.prototype.getParameter = function(parameterName){ - return this._internal.getParameter(parameterName); -} - -/** - * ======================= - * OpenBIS Search Criteria - * ======================= - * - * Methods and classes for constructing search criteria objects for use in searches. - */ - -/** - * It is easier to construct instances of match clauses using one of the factory methods: - * - * createPropertyMatch - * createAttributeMatch - * createTimeAttributeMatch - * createAnyPropertyMatch - * createAnyFieldMatch - * - * @see ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.SearchCriteria.MatchClause - * @class - */ -function SearchCriteriaMatchClause(type, fieldType, fieldCode, desiredValue) { - this["@type"] = type; - this["fieldType"] = fieldType; - this["fieldCode"] = fieldCode; - this["desiredValue"] = desiredValue; - // compareMode should be one of "LESS_THAN_OR_EQUAL", "EQUALS", "GREATER_THAN_OR_EQUAL" - this["compareMode"] = "EQUALS"; -} - -/** - * Factory method to create a match for a property. - * - * @param propertyCode The code of the property to compare against - * @param desiredValue The value used in the comparison - * @see ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.SearchCriteria.MatchClause.createPropertyMatch(String, String) - * @method - */ -SearchCriteriaMatchClause.createPropertyMatch = function(propertyCode, desiredValue) { - var matchClause = new SearchCriteriaMatchClause("PropertyMatchClause", "PROPERTY", propertyCode, desiredValue); - matchClause["propertyCode"] = propertyCode; - return matchClause; -} - -/** - * Factory method to create a match for an attribute. - * - * @param attribute Should be a valid ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.SearchCriteria.MatchClauseAttribute. - * It should come from this list: - * // common - * "CODE", "TYPE", "PERM_ID", - * // for sample or experiment - * "SPACE", - * // for experiment - * "PROJECT", - * // for all types of entities - * "METAPROJECT" - * @param desiredValue The value used in the comparison - * @see ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.SearchCriteria.MatchClause.createAttributeMatch(MatchClauseAttribute, String) - * @method - */ -SearchCriteriaMatchClause.createAttributeMatch = function(attribute, desiredValue) { - var matchClause = new SearchCriteriaMatchClause("AttributeMatchClause", "ATTRIBUTE", attribute, desiredValue); - matchClause["attribute"] = attribute; - return matchClause; -} - -/** - * Factory method to create a MatchClause matching against registration or modification - * date. - * - * @param attribute Should be a valid ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.SearchCriteria.MatchClauseTimeAttribute - * It should come from this list: REGISTRATION_DATE, MODIFICATION_DATE - * - * @param mode One of "LESS_THAN_OR_EQUAL", "EQUALS", "GREATER_THAN_OR_EQUAL" - * @param date The date to compare against, format YYYY-MM-DD - * @timezone The time zone of the date ("+1", "-5", "0", etc.) - * @see ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.SearchCriteria.MatchClause.createAttributeMatch(MatchClauseTimeAttribute, CompareMode, String, String) - * @method - */ -SearchCriteriaMatchClause.createTimeAttributeMatch = function(attribute, mode, date, timezone) -{ - var matchClause = new SearchCriteriaMatchClause("TimeAttributeMatchClause", "ATTRIBUTE", attribute, date); - matchClause["attribute"] = attribute; - matchClause["compareMode"] = mode; - matchClause["timeZone"] = timezone; - return matchClause; -} - -/** - * Factory method to create a match for against any property. - * - * @param desiredValue The value used in the comparison - * @see ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.SearchCriteria.MatchClause.createAnyPropertyMatch(String) - * @method - */ -SearchCriteriaMatchClause.createAnyPropertyMatch = function(desiredValue) { - var matchClause = new SearchCriteriaMatchClause("AnyPropertyMatchClause", "ANY_PROPERTY", null, desiredValue); - return matchClause; -} - -/** - * Factory method to create a match for against any field (property or attribute). - * - * @param desiredValue The value used in the comparison - * @see ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.SearchCriteria.MatchClause.createAnyFieldMatch(String) - * @method - */ -SearchCriteriaMatchClause.createAnyFieldMatch = function(desiredValue) { - var matchClause = new SearchCriteriaMatchClause("AnyFieldMatchClause", "ANY_FIELD", null, desiredValue); - return matchClause; -} - -/** - * @see ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.SearchCriteria - * @class - */ -function SearchCriteria() { - this["@type"] = "SearchCriteria"; - // operator should be either of "MATCH_ALL_CLAUSES" or "MATCH_ANY_CLAUSES" - this["operator"] = "MATCH_ALL_CLAUSES"; - this["matchClauses"] = []; - this["subCriterias"] = []; -} - -/** - * @see ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.SearchCriteria.addMatchClause(MatchClause) - * @method - */ -SearchCriteria.prototype.addMatchClause = function(matchClause) { - this["matchClauses"].push(matchClause); -}; - -/** - * @see ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.SearchCriteria.addSubCriteria(SearchSubCriteria) - * @method - */ -SearchCriteria.prototype.addSubCriteria = function(subCriteria) { - this["subCriterias"].push(subCriteria); -}; - - -/** - * It is easier to construct instances of sub criteria using one of the factory methods: - * - * createSampleParentCriteria - * createSampleChildCriteria - * createSampleContainerCriteria - * createSampleCriteria - * createExperimentCriteria - * createDataSetContainerCriteria - * createDataSetParentCriteria - * createDataSetChildCriteria - * - * @see ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.SearchSubCriteria - * @class - */ -function SearchSubCriteria(targetEntityKind, searchCriteria) { - this["@type"] = "SearchSubCriteria"; - this["targetEntityKind"] = targetEntityKind; - this["criteria"] = searchCriteria; -} - -/** - * Factory method to create a match for a sample parent. - * - * @see ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.SearchSubCriteria.createSampleParentCriteria(SearchCriteria) - * @method - */ -SearchSubCriteria.createSampleParentCriteria = function(searchCriteria) { - return new SearchSubCriteria("SAMPLE_PARENT", searchCriteria) -} - -/** - * Factory method to create a match for a sample child. - * - * @see ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.SearchSubCriteria.createSampleChildCriteria(SearchCriteria) - * @method - */ -SearchSubCriteria.createSampleChildCriteria = function(searchCriteria) { - return new SearchSubCriteria("SAMPLE_CHILD", searchCriteria) -} - -/** - * Factory method to create a match for a sample container. - * - * @see ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.SearchSubCriteria.createSampleContainerCriteria(SearchCriteria) - * @method - */ -SearchSubCriteria.createSampleContainerCriteria = function(searchCriteria) { - return new SearchSubCriteria("SAMPLE_CONTAINER", searchCriteria) -} - -/** - * Factory method to create a match for a sample. - * - * @see ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.SearchSubCriteria.createSampleCriteria(SearchCriteria) - * @method - */ -SearchSubCriteria.createSampleCriteria = function(searchCriteria) { - return new SearchSubCriteria("SAMPLE", searchCriteria) -} - -/** - * Factory method to create a match for an experiment. - * - * @see ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.SearchSubCriteria.createExperimentCriteria(SearchCriteria) - * @method - */ -SearchSubCriteria.createExperimentCriteria = function(searchCriteria) { - return new SearchSubCriteria("EXPERIMENT", searchCriteria) -} - -/** - * Factory method to create a match for a data set container. - * - * @see ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.SearchSubCriteria.createDataSetContainerCriteria(SearchCriteria) - * @method - */ -SearchSubCriteria.createDataSetContainerCriteria = function(searchCriteria) { - return new SearchSubCriteria("DATA_SET_CONTAINER", searchCriteria) -} - -/** - * Factory method to create a match for a data set parent. - * - * @see ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.SearchSubCriteria.createDataSetParentCriteria(SearchCriteria) - * @method - */ -SearchSubCriteria.createDataSetParentCriteria = function(searchCriteria) { - return new SearchSubCriteria("DATA_SET_PARENT", searchCriteria) -} - -/** - * Factory method to create a match for a data set child. - * - * @see ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.SearchSubCriteria.createDataSetChildCriteria(SearchCriteria) - * @method - */ -SearchSubCriteria.createDataSetChildCriteria = function(searchCriteria) { - return new SearchSubCriteria("DATA_SET_CHILD", searchCriteria) -} diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/.gc3pie/html/spin.min.js b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/.gc3pie/html/spin.min.js deleted file mode 100644 index 942980c82a07821ba453cc6cdba7524e038a72c6..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/.gc3pie/html/spin.min.js +++ /dev/null @@ -1,2 +0,0 @@ -//fgnass.github.com/spin.js#v1.2.7 -!function(e,t,n){function o(e,n){var r=t.createElement(e||"div"),i;for(i in n)r[i]=n[i];return r}function u(e){for(var t=1,n=arguments.length;t<n;t++)e.appendChild(arguments[t]);return e}function f(e,t,n,r){var o=["opacity",t,~~(e*100),n,r].join("-"),u=.01+n/r*100,f=Math.max(1-(1-e)/t*(100-u),e),l=s.substring(0,s.indexOf("Animation")).toLowerCase(),c=l&&"-"+l+"-"||"";return i[o]||(a.insertRule("@"+c+"keyframes "+o+"{"+"0%{opacity:"+f+"}"+u+"%{opacity:"+e+"}"+(u+.01)+"%{opacity:1}"+(u+t)%100+"%{opacity:"+e+"}"+"100%{opacity:"+f+"}"+"}",a.cssRules.length),i[o]=1),o}function l(e,t){var i=e.style,s,o;if(i[t]!==n)return t;t=t.charAt(0).toUpperCase()+t.slice(1);for(o=0;o<r.length;o++){s=r[o]+t;if(i[s]!==n)return s}}function c(e,t){for(var n in t)e.style[l(e,n)||n]=t[n];return e}function h(e){for(var t=1;t<arguments.length;t++){var r=arguments[t];for(var i in r)e[i]===n&&(e[i]=r[i])}return e}function p(e){var t={x:e.offsetLeft,y:e.offsetTop};while(e=e.offsetParent)t.x+=e.offsetLeft,t.y+=e.offsetTop;return t}var r=["webkit","Moz","ms","O"],i={},s,a=function(){var e=o("style",{type:"text/css"});return u(t.getElementsByTagName("head")[0],e),e.sheet||e.styleSheet}(),d={lines:12,length:7,width:5,radius:10,rotate:0,corners:1,color:"#000",speed:1,trail:100,opacity:.25,fps:20,zIndex:2e9,className:"spinner",top:"auto",left:"auto",position:"relative"},v=function m(e){if(!this.spin)return new m(e);this.opts=h(e||{},m.defaults,d)};v.defaults={},h(v.prototype,{spin:function(e){this.stop();var t=this,n=t.opts,r=t.el=c(o(0,{className:n.className}),{position:n.position,width:0,zIndex:n.zIndex}),i=n.radius+n.length+n.width,u,a;e&&(e.insertBefore(r,e.firstChild||null),a=p(e),u=p(r),c(r,{left:(n.left=="auto"?a.x-u.x+(e.offsetWidth>>1):parseInt(n.left,10)+i)+"px",top:(n.top=="auto"?a.y-u.y+(e.offsetHeight>>1):parseInt(n.top,10)+i)+"px"})),r.setAttribute("aria-role","progressbar"),t.lines(r,t.opts);if(!s){var f=0,l=n.fps,h=l/n.speed,d=(1-n.opacity)/(h*n.trail/100),v=h/n.lines;(function m(){f++;for(var e=n.lines;e;e--){var i=Math.max(1-(f+e*v)%h*d,n.opacity);t.opacity(r,n.lines-e,i,n)}t.timeout=t.el&&setTimeout(m,~~(1e3/l))})()}return t},stop:function(){var e=this.el;return e&&(clearTimeout(this.timeout),e.parentNode&&e.parentNode.removeChild(e),this.el=n),this},lines:function(e,t){function i(e,r){return c(o(),{position:"absolute",width:t.length+t.width+"px",height:t.width+"px",background:e,boxShadow:r,transformOrigin:"left",transform:"rotate("+~~(360/t.lines*n+t.rotate)+"deg) translate("+t.radius+"px"+",0)",borderRadius:(t.corners*t.width>>1)+"px"})}var n=0,r;for(;n<t.lines;n++)r=c(o(),{position:"absolute",top:1+~(t.width/2)+"px",transform:t.hwaccel?"translate3d(0,0,0)":"",opacity:t.opacity,animation:s&&f(t.opacity,t.trail,n,t.lines)+" "+1/t.speed+"s linear infinite"}),t.shadow&&u(r,c(i("#000","0 0 4px #000"),{top:"2px"})),u(e,u(r,i(t.color,"0 0 1px rgba(0,0,0,.1)")));return e},opacity:function(e,t,n){t<e.childNodes.length&&(e.childNodes[t].style.opacity=n)}}),function(){function e(e,t){return o("<"+e+' xmlns="urn:schemas-microsoft.com:vml" class="spin-vml">',t)}var t=c(o("group"),{behavior:"url(#default#VML)"});!l(t,"transform")&&t.adj?(a.addRule(".spin-vml","behavior:url(#default#VML)"),v.prototype.lines=function(t,n){function s(){return c(e("group",{coordsize:i+" "+i,coordorigin:-r+" "+ -r}),{width:i,height:i})}function l(t,i,o){u(a,u(c(s(),{rotation:360/n.lines*t+"deg",left:~~i}),u(c(e("roundrect",{arcsize:n.corners}),{width:r,height:n.width,left:n.radius,top:-n.width>>1,filter:o}),e("fill",{color:n.color,opacity:n.opacity}),e("stroke",{opacity:0}))))}var r=n.length+n.width,i=2*r,o=-(n.width+n.length)*2+"px",a=c(s(),{position:"absolute",top:o,left:o}),f;if(n.shadow)for(f=1;f<=n.lines;f++)l(f,-2,"progid:DXImageTransform.Microsoft.Blur(pixelradius=2,makeshadow=1,shadowopacity=.3)");for(f=1;f<=n.lines;f++)l(f);return u(t,a)},v.prototype.opacity=function(e,t,n,r){var i=e.firstChild;r=r.shadow&&r.lines||0,i&&t+r<i.childNodes.length&&(i=i.childNodes[t+r],i=i&&i.firstChild,i=i&&i.firstChild,i&&(i.opacity=n))}):s=l(t,"animation")}(),typeof define=="function"&&define.amd?define(function(){return v}):e.Spinner=v}(window,document); \ No newline at end of file diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/.gc3pie/plugin.properties b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/.gc3pie/plugin.properties deleted file mode 100644 index fdd65d79fa0c66239259c8c343a1716ea6eaddc7..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/.gc3pie/plugin.properties +++ /dev/null @@ -1,6 +0,0 @@ -# The properties file for an example webapps plugin -# This file has no properties defined because none need to be defined. -webapp-folder = html -openbisui-contexts = data-set-details-view -data-set-entity-types = FASTQ_GZ -label = Bowtie2 Alignment diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/bee/html/index.html b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/bee/html/index.html deleted file mode 100644 index 330d7af0d6bc1cac14d7d1be081c66708e4fdba1..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/bee/html/index.html +++ /dev/null @@ -1,428 +0,0 @@ -<head> - <title>Quantitative Genomics Facility</title> - <link rel="stylesheet" href="//maxcdn.bootstrapcdn.com/bootstrap/3.2.0/css/bootstrap.min.css"> - <script type="text/javascript" src="/openbis/resources/js/d3.v3.min.js"></script> - <script type="text/javascript" src="/openbis/resources/js/jquery.js"></script> - <script type="text/javascript" src="/openbis/resources/js/spin.min.js"></script> - <script type="text/javascript" src="/openbis/resources/js/openbis.js"></script> - <script type="text/javascript" src="/openbis/resources/js/openbis-dsu.js"></script> - <script type="text/javascript" src="//maxcdn.bootstrapcdn.com/bootstrap/3.2.0/js/bootstrap.min.js"></script> - <!-- To speed development, cache the requests --> - <!-- <script type="text/javascript" src="openbis-request-cache.js"></script> --> - <script> - - dsu = new openbis_dsu('/openbis/openbis', '/datastore_server'); - var vis; - var didCreateVis = false; - var context = new openbisWebAppContext(); - - $(document).ready(function () { - refresh(); - setInterval(refresh, 600000); - }); - - function createVis() { - if (didCreateVis) return; - vis = d3.select("#main").append("div").attr("id", "vis"); - didCreateVis = true; - } - - function enableSubmission() { - $('#submitBtn').prop('disabled', false); - } - - function disableSubmission() { - $('#submitBtn').prop('disabled', true); - } - - function displayReturnedTable(data) { - if (data.error) { - console.log(data.error); - vis.append("p").text("Could not retrieve data."); - return; - } - - var dataToShow = data.result; - console.log(dataToShow.rows[0][0].value); - - d3.select("#progress").remove() - d3.select("#button-group").remove() - - vis.append("p").text(""); - // Pick all div elements of the visualization - vis.selectAll("div").attr("class", "alert") - .data(dataToShow.rows) - .enter() - .append("div") - .attr("class", function (row) { - if (row[0].value == 0 || row[0].value > 99) { - if(row[0].value == 100) - enableSubmission(); - if(row[0].value == 101) - disableSubmission(); - return "alert alert-success"; - } - return "alert alert-danger"; - }) - .html(function (row) { - return row[1].value; - }) - - var button = d3.select("#container") - .append("div") - - button.selectAll("button") - .data(dataToShow.rows) - .enter() - .append("div") - .append("button") - .attr("id", function (row) { - return row[0].value; - }) - .attr("class", function (row) { - if (row[0].value == 100) { - return "btn btn-success"; - } - return "btn btn-danger"; - }) - //.attr("onclick", function(row) { return "callIngestionSetInvoice('" + row + "');" }) - .text(function (row) { - if (row[0].value == 0) { - return "OK" ; - } - return "Fail"; - }); - - } - - function hideButtons(data) { - var buttonId = data.result.rows[0][0].value; - d3.select("#setInvoice").remove() - d3.select("#main").append("div").attr("id", "Done").append("p").text("Done " + buttonId); - d3.select("button#" + String(buttonId)).remove(); - } - - function spinner(target) { - var opts = { - lines: 13, // The number of lines to draw - length: 7, // The length of each line - width: 4, // The line thickness - radius: 10, // The radius of the inner circle - corners: 1, // Corner roundness (0..1) - rotate: 0, // The rotation offset - color: '#000', // #rgb or #rrggbb - speed: 1, // Rounds per second - trail: 60, // Afterglow percentage - shadow: false, // Whether to render a shadow - hwaccel: false, // Whether to use hardware acceleration - className: 'spinner', // The CSS class to assign to the spinner - zIndex: 2e9, // The z-index (defaults to 2000000000) - top: 250, // Top position relative to parent in px - left: 'auto' // Left position relative to parent in px - }; - var spinner = new Spinner(opts).spin(target); - } - - - function callIngestionService(method) { - var permIdentifier = context.getEntityIdentifier() - //var mySendEmail = $("#sendEmail").is(':checked') - var clusteroptions = "brutus" - var bowtieParameters = $("#Bowtie2Paramter").val() - - if ($('#brutus').is(':active')) { - clusteroptions = 'brutus'; - } - if ($('#bsseGrid').is(':active')) { - clusteroptions = 'bsseGrid'; - } - - - d3.select("#main").select("#progress").remove() - d3.select("#main").select("#vis").remove() - didCreateVis = false; - dsu.server.useSession(context.getSessionId()); - createVis() - - myUserId = context.getSessionId().split("-")[0]; - - var parameters = - { - permId: permIdentifier, - //sendEmail: mySendEmail, - bowtieParam: bowtieParameters, - clusteroptionsParam : clusteroptions, - userId : myUserId, - method: method - }; - console.log(parameters) - - //d3.select("#main").append("div").attr("id", "progress").append("p").text("Starting Job..."); - var target = document.getElementById('progress'); - spinner(target) - dsu.server.createReportFromAggregationService("DSS1", "triggerbee", parameters, displayReturnedTable); - } - - function refresh() { - callIngestionService("pollJob") - - } - - - </script> -</head> -<body> -<div class="container"> - <div class="row"> - <div class="col-lg-12"> - - <h2>Bowtie 2 - <small>Read Alignment</small> - </h2> - </div> - </div> -</div> - -<br> - -<p> - - - -<div class="container"> - <div class="row"> - <div class="col-lg-12"> - <div class="btn-group"> - <button type="button" class="btn btn-default" id="brutus"> ETHZ Brutus Cluster </button> - <button type="button" class="btn btn-default" id="bsseGrid"> BSSE Grid </button> - - </div> - </div> - </div> -</div> -</p> - -<p> - -<div class="container"> - <div class="row"> - <div class="col-lg-12"> - <form role="form"> - <div class="form-group"> - <label>Parameters</label> - <input type="text" class="form-control" id="Bowtie2Paramter" - placeholder="e.g. --very-sensitive --phred33 -q"> - </div> - </form> - </div> - </div> -</div> -</p> - -<p> -<!-- -<div class="container"> - <div class="row"> - <div class="col-lg-12"> - <div class="checkbox"> - <label> - <input type="checkbox" id="sendEmail"> Send Email when job finished - </label> - </div> - </div> - </div> -</div> ---> -</p> - -<p> - -<div class="container"> - <div class="row"> - <div class="col-md-3"> - <button class="btn btn-default" type="submit" - "createInvoice-button" id="submitBtn" onclick="callIngestionService('startJob');">Start Bowtie2</button> - <button type="button" class="btn btn-default" onclick="refresh();"> - <span class="glyphicon glyphicon-refresh"></span> Refresh - </button> - </div> - </div> -</div> -</p> - -<br> - -<p> - -<div class="container"> - <div class="row"> - <div class="col-lg-12"> - <div class="panel-group" id="accordion"> - <div class="panel panel-default"> - <div class="panel-heading"> - <h6 div class="panel-title"> - <a class="accordion-toggle" data-toggle="collapse" data-parent="#accordion" - href="#collapseOne"> - Available Bowtie 2 Parameters - </a> - </div> - </h6> - </div> - <div id="collapseOne" class="panel-collapse collapse"> - <div class="panel-body"> - <pre> -Usage: - bowtie2 [options]* -x <bt2-idx> {-1 <m1> -2 <m2> | -U <r>} [-S <sam>] - - <bt2-idx> Index filename prefix (minus trailing .X.bt2). - NOTE: Bowtie 1 and Bowtie 2 indexes are not compatible. - <m1> Files with #1 mates, paired with files in <m2>. - Could be gzip'ed (extension: .gz) or bzip2'ed (extension: .bz2). - <m2> Files with #2 mates, paired with files in <m1>. - Could be gzip'ed (extension: .gz) or bzip2'ed (extension: .bz2). - <r> Files with unpaired reads. - Could be gzip'ed (extension: .gz) or bzip2'ed (extension: .bz2). - <sam> File for SAM output (default: stdout) - - <m1>, <m2>, <r> can be comma-separated lists (no whitespace) and can be - specified many times. E.g. '-U file1.fq,file2.fq -U file3.fq'. - -Options (defaults in parentheses): - - Input: - -q query input files are FASTQ .fq/.fastq (default) - --qseq query input files are in Illumina's qseq format - -f query input files are (multi-)FASTA .fa/.mfa - -r query input files are raw one-sequence-per-line - -c <m1>, <m2>, <r> are sequences themselves, not files - -s/--skip <int> skip the first <int> reads/pairs in the input (none) - -u/--upto <int> stop after first <int> reads/pairs (no limit) - -5/--trim5 <int> trim <int> bases from 5'/left end of reads (0) - -3/--trim3 <int> trim <int> bases from 3'/right end of reads (0) - --phred33 qualities are Phred+33 (default) - --phred64 qualities are Phred+64 - --int-quals qualities encoded as space-delimited integers - - Presets: Same as: - For --end-to-end: - --very-fast -D 5 -R 1 -N 0 -L 22 -i S,0,2.50 - --fast -D 10 -R 2 -N 0 -L 22 -i S,0,2.50 - --sensitive -D 15 -R 2 -N 0 -L 22 -i S,1,1.15 (default) - --very-sensitive -D 20 -R 3 -N 0 -L 20 -i S,1,0.50 - - For --local: - --very-fast-local -D 5 -R 1 -N 0 -L 25 -i S,1,2.00 - --fast-local -D 10 -R 2 -N 0 -L 22 -i S,1,1.75 - --sensitive-local -D 15 -R 2 -N 0 -L 20 -i S,1,0.75 (default) - --very-sensitive-local -D 20 -R 3 -N 0 -L 20 -i S,1,0.50 - - Alignment: - -N <int> max # mismatches in seed alignment; can be 0 or 1 (0) - -L <int> length of seed substrings; must be >3, <32 (22) - -i <func> interval between seed substrings w/r/t read len (S,1,1.15) - --n-ceil <func> func for max # non-A/C/G/Ts permitted in aln (L,0,0.15) - --dpad <int> include <int> extra ref chars on sides of DP table (15) - --gbar <int> disallow gaps within <int> nucs of read extremes (4) - --ignore-quals treat all quality values as 30 on Phred scale (off) - --nofw do not align forward (original) version of read (off) - --norc do not align reverse-complement version of read (off) - - --end-to-end entire read must align; no clipping (on) - OR - --local local alignment; ends might be soft clipped (off) - - Scoring: - --ma <int> match bonus (0 for --end-to-end, 2 for --local) - --mp <int> max penalty for mismatch; lower qual = lower penalty (6) - --np <int> penalty for non-A/C/G/Ts in read/ref (1) - --rdg <int>,<int> read gap open, extend penalties (5,3) - --rfg <int>,<int> reference gap open, extend penalties (5,3) - --score-min <func> min acceptable alignment score w/r/t read length - (G,20,8 for local, L,-0.6,-0.6 for end-to-end) - - Reporting: - (default) look for multiple alignments, report best, with MAPQ - OR - -k <int> report up to <int> alns per read; MAPQ not meaningful - OR - -a/--all report all alignments; very slow, MAPQ not meaningful - - Effort: - -D <int> give up extending after <int> failed extends in a row (15) - -R <int> for reads w/ repetitive seeds, try <int> sets of seeds (2) - - Paired-end: - -I/--minins <int> minimum fragment length (0) - -X/--maxins <int> maximum fragment length (500) - --fr/--rf/--ff -1, -2 mates align fw/rev, rev/fw, fw/fw (--fr) - --no-mixed suppress unpaired alignments for paired reads - --no-discordant suppress discordant alignments for paired reads - --no-dovetail not concordant when mates extend past each other - --no-contain not concordant when one mate alignment contains other - --no-overlap not concordant when mates overlap at all - - Output: - -t/--time print wall-clock time taken by search phases - --un <path> write unpaired reads that didn't align to <path> - --al <path> write unpaired reads that aligned at least once to <path> - --un-conc <path> write pairs that didn't align concordantly to <path> - --al-conc <path> write pairs that aligned concordantly at least once to <path> - (Note: for --un, --al, --un-conc, or --al-conc, add '-gz' to the option name, e.g. - --un-gz <path>, to gzip compress output, or add '-bz2' to bzip2 compress output.) - --quiet print nothing to stderr except serious errors - --met-file <path> send metrics to file at <path> (off) - --met-stderr send metrics to stderr (off) - --met <int> report internal counters & metrics every <int> secs (1) - --no-head supppress header lines, i.e. lines starting with @ - --no-sq supppress @SQ header lines - --rg-id <text> set read group id, reflected in @RG line and RG:Z: opt field - --rg <text> add <text> ("lab:value") to @RG line of SAM header. - Note: @RG line only printed when --rg-id is set. - --omit-sec-seq put '*' in SEQ and QUAL fields for secondary alignments. - - Performance: - -o/--offrate <int> override offrate of index; must be >= index's offrate - -p/--threads <int> number of alignment threads to launch (1) - --reorder force SAM output order to match order of input reads - --mm use memory-mapped I/O for index; many 'bowtie's can share - - Other: - --qc-filter filter out reads that are bad according to QSEQ filter - --seed <int> seed for random number generator (0) - --non-deterministic seed rand. gen. arbitrarily instead of using read attributes - --version print version information and quit - -h/--help print this usage message -</pre> - </div> - </div> - </div> - </div> - </div> -</div> -</div> -</div> -</p> -</div> - -<!-- Placeholder for the output coming back from the server --> -<div class="container"> - <div class="row"> - <div class="col-lg-12"> - <div id="main"> - </div> - </div> - </div> -</div> - -<!-- Footer ================================================== --> - -<footer class="bs-footer" role="contentinfo"> - <h6 div class="container"> - <a href="http://bowtie-bio.sourceforge.net/bowtie2/index.shtml" target="_blank">Bowtie 2 Homepage</a> - </div> - </h6> -</footer> - - -</body> -</html> diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/bee/plugin.properties b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/bee/plugin.properties deleted file mode 100644 index fdd65d79fa0c66239259c8c343a1716ea6eaddc7..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/bee/plugin.properties +++ /dev/null @@ -1,6 +0,0 @@ -# The properties file for an example webapps plugin -# This file has no properties defined because none need to be defined. -webapp-folder = html -openbisui-contexts = data-set-details-view -data-set-entity-types = FASTQ_GZ -label = Bowtie2 Alignment diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/cellStatistics/html/index.html b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/cellStatistics/html/index.html deleted file mode 100644 index 127a1899a18d2807e3fd390ac7a7e88e6afcb70a..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/cellStatistics/html/index.html +++ /dev/null @@ -1,324 +0,0 @@ -<!DOCTYPE html> -<html> - <head> - <title>Flowcell Statistics</title> - <script type="text/javascript" src="/openbis/resources/js/d3.v3.min.js"></script> - <script type="text/javascript" src="/openbis/resources/js/d3.layout.js"></script> - <script type="text/javascript" src="/openbis/resources/js/jquery.js"></script> - <script type="text/javascript" src="/openbis/resources/js/openbis.js"></script> - <script type="text/javascript" src="/openbis/resources/js/openbis-dsu.js"></script> - <script type="text/javascript" src="/openbis/resources/js/openbis-action-deferrer.js"></script> - <script type="text/javascript" src="/openbis/resources/js/FileSaver.js"></script> - <link rel="stylesheet" href="//maxcdn.bootstrapcdn.com/bootstrap/3.2.0/css/bootstrap.min.css"> - <link rel="stylesheet" type="text/css" href="style.css" /> - - </head> - <body> - <div id="container" class="container"> - <script> - - var formatThousands = d3.format(","); - dsu = new openbis_dsu('/openbis/openbis', '/datastore_server'); - var webAppContext = new openbisWebAppContext(); - dsu.server.useSession(webAppContext.getSessionId()); - - var prop; - var flowcellProperties = []; - var myArray = []; - var sumArray = []; - var sumArrayNOINDEX = []; - var sumsArray = [] - - loadData() - - /* ------- General functions -------------------------------------------*/ - - // used for sorting by lane of the final array of objects - function compare(a,b) { - if (a.lane < b.lane) - return -1; - if (a.lane > b.lane) - return 1; - return 0; - } - - function isNumber(n) { - return !isNaN(parseFloat(n)) && isFinite(n); - } - - function roundFloat(myFloat) { - return Number(myFloat).toFixed(2); - } - - if (typeof String.prototype.startsWith != 'function') { - // see below for better implementation! - String.prototype.startsWith = function (str){ - return this.indexOf(str) === 0; - }; - } - - - /* -------------------------------------------------------------------*/ - -function loadData () { - var dataSetProperties; - var prop; - - dsu.retrieveSample(webAppContext.getEntityIdentifier(), function(response) { - - flowcellProperties = response.result[0].properties; - numberOfLanes = (flowcellProperties.LANECOUNT); - - var sampleCodes = []; - for (i = 1; i <= numberOfLanes; i++) { - sampleCodes.push(webAppContext.getEntityIdentifier() + ":" + i); - } - - var clusters = "" - // just take the first lane to read out the BCL version - dsu.retrieveSampleWithPropertiesCode(sampleCodes[0], function(laneResponse) { - // console.log(laneResponse) - bclVersion = laneResponse.result[0].properties.BCL_VERSION - if (bclVersion !== undefined) { - if (bclVersion.startsWith("bcl2fastq v2")) { - clusters = "Clusters"; - } - else { - clusters = "Reads"; - } - } - else { clusters = "Reads"}; - }); - - var deferrer = new openbisActionDeferrer(function(){ - sumArray.sort(compare); - sumArrayNOINDEX.sort(compare); - plotLaneTable (sumArrayNOINDEX, true, clusters); - placeholder() - plotLaneTable (sumArray, false, clusters); - downloadButton ("tableStats"); - $("#save_as" + "tableStats").click(function() { submit_download_form("html", "tableStats"); }); - }, sampleCodes, clusters); - - sampleCodes.forEach(function(sampleCode){ - dsu.retrieveDataSetsForSample(sampleCode, function(response){ - getProperties(response); - //console.log("got response " + sampleCode); - var sums = calculateSum(myArray, sampleCode, true); - var sumsNOINDEX = calculateSum(myArray, sampleCode, false); - sumArray.push(sums[0]); - sumArrayNOINDEX.push(sumsNOINDEX[0]); - myArray = []; - deferrer.dependencyCompleted(sampleCode); - }); - }); - - function getProperties(dataSetProperties) { - for (var i = 0; i < dataSetProperties.result.length; i++) { - myArray.push({ - 'externalSampleName' : dataSetProperties.result[i].properties.EXTERNAL_SAMPLE_NAME, - 'index1': dataSetProperties.result[i].properties.BARCODE, - 'index2': dataSetProperties.result[i].properties.INDEX2, - 'percFilteringPass' : parseFloat(dataSetProperties.result[i].properties.PERCENTAGE_PASSED_FILTERING), - 'rawReadsSum' : dataSetProperties.result[i].properties.RAW_READS_SUM, - 'pfReadsSum' : dataSetProperties.result[i].properties.PF_READS_SUM, - 'rawYieldMbases' : dataSetProperties.result[i].properties.RAW_YIELD_MBASES, - 'yieldMbases' : dataSetProperties.result[i].properties.YIELD_MBASES, - 'percRawClustersPerLane': parseFloat(dataSetProperties.result[i].properties.PERCENTAGE_RAW_CLUSTERS_PER_LANE), - 'pfMeanQualityScore' : parseFloat(dataSetProperties.result[i].properties.PFMEANQUALITYSCORE), - 'pfYieldq30Percentage' : parseFloat(dataSetProperties.result[i].properties.PFYIELDQ30PERCENTAGE) - }); - }; - }; - }); -}; - -function plotLaneTable (sumArray, withNOINDEX, clusters) { - - //d3.select("body").append("text") - // .text("Summary Table") - // .attr("class", "h3"); - - d3.select("body").append("text") - .text(function (){if (withNOINDEX) {return " All " + clusters;} return " Without Undetermined " + clusters;}) - .attr("class", "h3"); - - d3.select("body") - .append("p") - ; - - var laneTableStats = d3.select("body") - .append("table") - .attr("id", "tableStats") - .attr("class", "tableStats") - ; - - header = {} - header["Lane"] = 1 - header["# of Samples"] = 1 - header["AVG Passed Filtering (PF)"] = 1 - header["Sum Raw " + clusters] = 1 - header["Sum PF " + clusters] = 1 - header["Sum Raw Bases"] = 1 - header["Sum PF Bases"] = 1 - header["AVG Raw Clusters in % per Index"] = 1 - header["AVG PF Phred Score"] = 1 - header["AVG > 30 Phred Score"] = 1 - - // create the table header - var thead = laneTableStats.selectAll("th") - .data(d3.keys(header)) - .enter().append("th") - .text(function(d){return d}) - ; - - // create rows - // console.log("Sumarray") - // console.log(sumArray) - //sumArray.splice(1,3) - - - // litte hack which removes three lanes of the FC view, as the NextSeq has four lanes - // as specified by Illumina, but logically it is only one lane - // So if the FC has four lanes we assume it is a NextSeq run and therefore we remove the last three - // lanes via the splice method - if (sumArray.length == 4) { - sumArray.splice(1,3) - } - - /* - for (i=0; i< sumArray.length; i++) { - console.log(sumArray[i].numberOfSamples) - if (sumArray[i].numberOfSamples == 0) { - console.log("NO samples in "+ i) - sumArray.splice(i,1) - } - } - */ - - var tr = laneTableStats.selectAll("tr") - .data(sumArray).enter().append("tr") - // cells - var td = tr.selectAll("td") - .data(function(d){return d3.values(d)}) - .enter().append("td") - .text(function(d) {if (isNumber(d)) {return formatThousands(d)}; return d;}) - .style("text-align", function(d){if (isNumber(d)) {return "right"} return "left"}) - ; -} - -function placeholder() { - -var space = d3.select("body") - .append("svg") - .attr("id", "placeholder") - .attr("width", 0) - .attr("height", 100) - ; -} - -function calculateSum(statisticsArray, sampleCode, withNOINDEX) { - - var sums = [] - var averagePercFilteringPass = 0; - var sumRawReads = 0; - var sumPfReads = 0; - var sumRawYieldMbases = 0; - var sumYieldMbases = 0; - var averagePercRawClustersPerLane = 0; - var averagePfMeanQualityScore = 0; - var averagePfYieldq30Percentage = 0; - - for (var i = 0; i < statisticsArray.length; i++) { - // do not calculate with the NOINDEX reads - if ((typeof (statisticsArray[i].externalSampleName) == 'undefined') && withNOINDEX) { - continue; - } else { - - averagePercFilteringPass = averagePercFilteringPass + parseFloat(statisticsArray[i].percFilteringPass); - sumRawReads = sumRawReads + parseInt(statisticsArray[i].rawReadsSum); - sumPfReads = sumPfReads + parseInt(statisticsArray[i].pfReadsSum); - sumRawYieldMbases = sumRawYieldMbases + parseInt(statisticsArray[i].rawYieldMbases); - sumYieldMbases = sumYieldMbases + parseInt(statisticsArray[i].yieldMbases); - averagePercRawClustersPerLane = averagePercRawClustersPerLane + parseInt(statisticsArray[i].percRawClustersPerLane); - averagePfMeanQualityScore = averagePfMeanQualityScore + parseInt(statisticsArray[i].pfMeanQualityScore); - averagePfYieldq30Percentage = averagePfYieldq30Percentage + parseInt(statisticsArray[i].pfYieldq30Percentage); - } - } - if (withNOINDEX) {penalty = -1} else {penalty = 0} - - // added the Math.max function to make sure that there is no division by zero, - // can happen when a single sample is on a lane (no multiplexing) - averagePercFilteringPass = roundFloat(averagePercFilteringPass / Math.max((statisticsArray.length + penalty),1)); - averagePercRawClustersPerLane = roundFloat(averagePercRawClustersPerLane / Math.max((statisticsArray.length + penalty),1)); - averagePfMeanQualityScore = roundFloat(averagePfMeanQualityScore / Math.max((statisticsArray.length + penalty),1)); - averagePfYieldq30Percentage = roundFloat(averagePfYieldq30Percentage / Math.max((statisticsArray.length + penalty),1)); - - sums.push({ - 'lane' : sampleCode.split("/")[2].split(":")[1], - 'numberOfSamples' : statisticsArray.length, - 'averagePercFilteringPass' : averagePercFilteringPass, - 'rawReadsSum' : sumRawReads, - 'pfReadsSum' : sumPfReads, - 'rawYieldMbases' : sumRawYieldMbases, - 'yieldMbases' : sumYieldMbases, - 'percRawClustersPerLane': averagePercRawClustersPerLane, - 'pfMeanQualityScore' : averagePfMeanQualityScore, - 'pfYieldq30Percentage' : averagePfYieldq30Percentage - }); - return sums; -} - - - function downloadButton (buttonName) { - - var div = d3.select("body").append("button") - .attr("class", "btn btn-default btn-xs") - .attr("type", "submit") - .attr("id", "save_as" + buttonName) - .attr("value", "") - .text("Save") - ; - } - - function submit_download_form(output_format, svgName) - { - var rawSampleName = webAppContext.entityIdentifier - var split = rawSampleName.split(":") - var fc = split[0].split("/")[2] - var lane = split[1] - - // Get the d3js SVG element - var tmp = document.getElementById(svgName); - - if (output_format == "svg") { - - // Extract the data as SVG text string - var svg_xml = "<svg xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">" + (new XMLSerializer).serializeToString(tmp) + "</svg>"; - - var blob = new Blob([svg_xml], {type: "image/svg+xml;charset=utf-8"}); - } - if (output_format == "html") { - var html = "<html> <head> <title></title> <style type=\"text/css\">" + - "table.tableStats { font-family: sans-serif; font-size: 14px; border-collapse:collapse; }" + - ".tableStats th { padding:6px 10px; color:#444; font-weight:bold; text-shadow:1px 1px 1px #fff; border-bottom:2px solid #444; }" + - ".tableStats tr:nth-child(even) { background: WhiteSmoke; }" + - ".tableStats td { padding:0px 10px 10px 10px; }" + - "</style> </head> <body>" + - (new XMLSerializer).serializeToString(tmp) + - "</body> </html>" - var blob = new Blob([html], {type: "image/html;charset=utf-8"}); - } - if (output_format == "png") { - console.log("png") - } - - saveAs(blob, fc + "_" + svgName + "." + output_format); - - } - - </script> - </div> - </body> -</html> - diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/cellStatistics/html/style.css b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/cellStatistics/html/style.css deleted file mode 100644 index 985d8ac6db01436d9b470bd37405ff4fae6ca8cd..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/cellStatistics/html/style.css +++ /dev/null @@ -1,47 +0,0 @@ - .axis path, - .axis line { - fill: none; - stroke: #000; - shape-rendering: crispEdges; - } - - .axis text { - font-family: sans-serif; - font-size: 10px; - } - - table.tableStats { - font-family: sans-serif; - font-size: 14px; - border-collapse:collapse; - } - - .tableStats th { - padding:6px 10px; - color:#444; - font-weight:bold; - text-shadow:1px 1px 1px #fff; - border-bottom:2px solid #444; - } - - .tableStats tr:nth-child(even) { - background: WhiteSmoke; - } - .tableStats td { - - padding:0px 10px 10px 10px; - - } - - div.tooltip { - position: absolute; - text-align: center; - width: 100px; - height: 42px; - padding: 2px; - font: 12px sans-serif; - background: LightSalmon; - border: 0px; - border-radius: 8px; - pointer-events: none; - } diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/cellStatistics/plugin.properties b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/cellStatistics/plugin.properties deleted file mode 100644 index 19629033996f81da35792956c089e964a1dac020..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/cellStatistics/plugin.properties +++ /dev/null @@ -1,6 +0,0 @@ -# The properties file for an example webapps plugin -# This file has no properties defined because none need to be defined. -webapp-folder = html -openbisui-contexts = sample-details-view -sample-entity-types = ILLUMINA_FLOW_CELL -label = Flow Cell Statistics diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/demultiplexing/html/bootstrap3/css/bootstrap-theme.css b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/demultiplexing/html/bootstrap3/css/bootstrap-theme.css deleted file mode 100644 index f860bbc069d8c3fb2b1432ec1b0ff35bf5ae027b..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/demultiplexing/html/bootstrap3/css/bootstrap-theme.css +++ /dev/null @@ -1,442 +0,0 @@ -/*! - * Bootstrap v3.2.0 (http://getbootstrap.com) - * Copyright 2011-2014 Twitter, Inc. - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) - */ - -.btn-default, -.btn-primary, -.btn-success, -.btn-info, -.btn-warning, -.btn-danger { - text-shadow: 0 -1px 0 rgba(0, 0, 0, .2); - -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .15), 0 1px 1px rgba(0, 0, 0, .075); - box-shadow: inset 0 1px 0 rgba(255, 255, 255, .15), 0 1px 1px rgba(0, 0, 0, .075); -} -.btn-default:active, -.btn-primary:active, -.btn-success:active, -.btn-info:active, -.btn-warning:active, -.btn-danger:active, -.btn-default.active, -.btn-primary.active, -.btn-success.active, -.btn-info.active, -.btn-warning.active, -.btn-danger.active { - -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125); - box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125); -} -.btn:active, -.btn.active { - background-image: none; -} -.btn-default { - text-shadow: 0 1px 0 #fff; - background-image: -webkit-linear-gradient(top, #fff 0%, #e0e0e0 100%); - background-image: -o-linear-gradient(top, #fff 0%, #e0e0e0 100%); - background-image: -webkit-gradient(linear, left top, left bottom, from(#fff), to(#e0e0e0)); - background-image: linear-gradient(to bottom, #fff 0%, #e0e0e0 100%); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffe0e0e0', GradientType=0); - filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); - background-repeat: repeat-x; - border-color: #dbdbdb; - border-color: #ccc; -} -.btn-default:hover, -.btn-default:focus { - background-color: #e0e0e0; - background-position: 0 -15px; -} -.btn-default:active, -.btn-default.active { - background-color: #e0e0e0; - border-color: #dbdbdb; -} -.btn-default:disabled, -.btn-default[disabled] { - background-color: #e0e0e0; - background-image: none; -} -.btn-primary { - background-image: -webkit-linear-gradient(top, #428bca 0%, #2d6ca2 100%); - background-image: -o-linear-gradient(top, #428bca 0%, #2d6ca2 100%); - background-image: -webkit-gradient(linear, left top, left bottom, from(#428bca), to(#2d6ca2)); - background-image: linear-gradient(to bottom, #428bca 0%, #2d6ca2 100%); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff2d6ca2', GradientType=0); - filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); - background-repeat: repeat-x; - border-color: #2b669a; -} -.btn-primary:hover, -.btn-primary:focus { - background-color: #2d6ca2; - background-position: 0 -15px; -} -.btn-primary:active, -.btn-primary.active { - background-color: #2d6ca2; - border-color: #2b669a; -} -.btn-primary:disabled, -.btn-primary[disabled] { - background-color: #2d6ca2; - background-image: none; -} -.btn-success { - background-image: -webkit-linear-gradient(top, #5cb85c 0%, #419641 100%); - background-image: -o-linear-gradient(top, #5cb85c 0%, #419641 100%); - background-image: -webkit-gradient(linear, left top, left bottom, from(#5cb85c), to(#419641)); - background-image: linear-gradient(to bottom, #5cb85c 0%, #419641 100%); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff419641', GradientType=0); - filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); - background-repeat: repeat-x; - border-color: #3e8f3e; -} -.btn-success:hover, -.btn-success:focus { - background-color: #419641; - background-position: 0 -15px; -} -.btn-success:active, -.btn-success.active { - background-color: #419641; - border-color: #3e8f3e; -} -.btn-success:disabled, -.btn-success[disabled] { - background-color: #419641; - background-image: none; -} -.btn-info { - background-image: -webkit-linear-gradient(top, #5bc0de 0%, #2aabd2 100%); - background-image: -o-linear-gradient(top, #5bc0de 0%, #2aabd2 100%); - background-image: -webkit-gradient(linear, left top, left bottom, from(#5bc0de), to(#2aabd2)); - background-image: linear-gradient(to bottom, #5bc0de 0%, #2aabd2 100%); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff2aabd2', GradientType=0); - filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); - background-repeat: repeat-x; - border-color: #28a4c9; -} -.btn-info:hover, -.btn-info:focus { - background-color: #2aabd2; - background-position: 0 -15px; -} -.btn-info:active, -.btn-info.active { - background-color: #2aabd2; - border-color: #28a4c9; -} -.btn-info:disabled, -.btn-info[disabled] { - background-color: #2aabd2; - background-image: none; -} -.btn-warning { - background-image: -webkit-linear-gradient(top, #f0ad4e 0%, #eb9316 100%); - background-image: -o-linear-gradient(top, #f0ad4e 0%, #eb9316 100%); - background-image: -webkit-gradient(linear, left top, left bottom, from(#f0ad4e), to(#eb9316)); - background-image: linear-gradient(to bottom, #f0ad4e 0%, #eb9316 100%); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffeb9316', GradientType=0); - filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); - background-repeat: repeat-x; - border-color: #e38d13; -} -.btn-warning:hover, -.btn-warning:focus { - background-color: #eb9316; - background-position: 0 -15px; -} -.btn-warning:active, -.btn-warning.active { - background-color: #eb9316; - border-color: #e38d13; -} -.btn-warning:disabled, -.btn-warning[disabled] { - background-color: #eb9316; - background-image: none; -} -.btn-danger { - background-image: -webkit-linear-gradient(top, #d9534f 0%, #c12e2a 100%); - background-image: -o-linear-gradient(top, #d9534f 0%, #c12e2a 100%); - background-image: -webkit-gradient(linear, left top, left bottom, from(#d9534f), to(#c12e2a)); - background-image: linear-gradient(to bottom, #d9534f 0%, #c12e2a 100%); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc12e2a', GradientType=0); - filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); - background-repeat: repeat-x; - border-color: #b92c28; -} -.btn-danger:hover, -.btn-danger:focus { - background-color: #c12e2a; - background-position: 0 -15px; -} -.btn-danger:active, -.btn-danger.active { - background-color: #c12e2a; - border-color: #b92c28; -} -.btn-danger:disabled, -.btn-danger[disabled] { - background-color: #c12e2a; - background-image: none; -} -.thumbnail, -.img-thumbnail { - -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, .075); - box-shadow: 0 1px 2px rgba(0, 0, 0, .075); -} -.dropdown-menu > li > a:hover, -.dropdown-menu > li > a:focus { - background-color: #e8e8e8; - background-image: -webkit-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%); - background-image: -o-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%); - background-image: -webkit-gradient(linear, left top, left bottom, from(#f5f5f5), to(#e8e8e8)); - background-image: linear-gradient(to bottom, #f5f5f5 0%, #e8e8e8 100%); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0); - background-repeat: repeat-x; -} -.dropdown-menu > .active > a, -.dropdown-menu > .active > a:hover, -.dropdown-menu > .active > a:focus { - background-color: #357ebd; - background-image: -webkit-linear-gradient(top, #428bca 0%, #357ebd 100%); - background-image: -o-linear-gradient(top, #428bca 0%, #357ebd 100%); - background-image: -webkit-gradient(linear, left top, left bottom, from(#428bca), to(#357ebd)); - background-image: linear-gradient(to bottom, #428bca 0%, #357ebd 100%); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff357ebd', GradientType=0); - background-repeat: repeat-x; -} -.navbar-default { - background-image: -webkit-linear-gradient(top, #fff 0%, #f8f8f8 100%); - background-image: -o-linear-gradient(top, #fff 0%, #f8f8f8 100%); - background-image: -webkit-gradient(linear, left top, left bottom, from(#fff), to(#f8f8f8)); - background-image: linear-gradient(to bottom, #fff 0%, #f8f8f8 100%); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#fff8f8f8', GradientType=0); - filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); - background-repeat: repeat-x; - border-radius: 4px; - -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .15), 0 1px 5px rgba(0, 0, 0, .075); - box-shadow: inset 0 1px 0 rgba(255, 255, 255, .15), 0 1px 5px rgba(0, 0, 0, .075); -} -.navbar-default .navbar-nav > .active > a { - background-image: -webkit-linear-gradient(top, #ebebeb 0%, #f3f3f3 100%); - background-image: -o-linear-gradient(top, #ebebeb 0%, #f3f3f3 100%); - background-image: -webkit-gradient(linear, left top, left bottom, from(#ebebeb), to(#f3f3f3)); - background-image: linear-gradient(to bottom, #ebebeb 0%, #f3f3f3 100%); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffebebeb', endColorstr='#fff3f3f3', GradientType=0); - background-repeat: repeat-x; - -webkit-box-shadow: inset 0 3px 9px rgba(0, 0, 0, .075); - box-shadow: inset 0 3px 9px rgba(0, 0, 0, .075); -} -.navbar-brand, -.navbar-nav > li > a { - text-shadow: 0 1px 0 rgba(255, 255, 255, .25); -} -.navbar-inverse { - background-image: -webkit-linear-gradient(top, #3c3c3c 0%, #222 100%); - background-image: -o-linear-gradient(top, #3c3c3c 0%, #222 100%); - background-image: -webkit-gradient(linear, left top, left bottom, from(#3c3c3c), to(#222)); - background-image: linear-gradient(to bottom, #3c3c3c 0%, #222 100%); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff3c3c3c', endColorstr='#ff222222', GradientType=0); - filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); - background-repeat: repeat-x; -} -.navbar-inverse .navbar-nav > .active > a { - background-image: -webkit-linear-gradient(top, #222 0%, #282828 100%); - background-image: -o-linear-gradient(top, #222 0%, #282828 100%); - background-image: -webkit-gradient(linear, left top, left bottom, from(#222), to(#282828)); - background-image: linear-gradient(to bottom, #222 0%, #282828 100%); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff222222', endColorstr='#ff282828', GradientType=0); - background-repeat: repeat-x; - -webkit-box-shadow: inset 0 3px 9px rgba(0, 0, 0, .25); - box-shadow: inset 0 3px 9px rgba(0, 0, 0, .25); -} -.navbar-inverse .navbar-brand, -.navbar-inverse .navbar-nav > li > a { - text-shadow: 0 -1px 0 rgba(0, 0, 0, .25); -} -.navbar-static-top, -.navbar-fixed-top, -.navbar-fixed-bottom { - border-radius: 0; -} -.alert { - text-shadow: 0 1px 0 rgba(255, 255, 255, .2); - -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .25), 0 1px 2px rgba(0, 0, 0, .05); - box-shadow: inset 0 1px 0 rgba(255, 255, 255, .25), 0 1px 2px rgba(0, 0, 0, .05); -} -.alert-success { - background-image: -webkit-linear-gradient(top, #dff0d8 0%, #c8e5bc 100%); - background-image: -o-linear-gradient(top, #dff0d8 0%, #c8e5bc 100%); - background-image: -webkit-gradient(linear, left top, left bottom, from(#dff0d8), to(#c8e5bc)); - background-image: linear-gradient(to bottom, #dff0d8 0%, #c8e5bc 100%); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffc8e5bc', GradientType=0); - background-repeat: repeat-x; - border-color: #b2dba1; -} -.alert-info { - background-image: -webkit-linear-gradient(top, #d9edf7 0%, #b9def0 100%); - background-image: -o-linear-gradient(top, #d9edf7 0%, #b9def0 100%); - background-image: -webkit-gradient(linear, left top, left bottom, from(#d9edf7), to(#b9def0)); - background-image: linear-gradient(to bottom, #d9edf7 0%, #b9def0 100%); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffb9def0', GradientType=0); - background-repeat: repeat-x; - border-color: #9acfea; -} -.alert-warning { - background-image: -webkit-linear-gradient(top, #fcf8e3 0%, #f8efc0 100%); - background-image: -o-linear-gradient(top, #fcf8e3 0%, #f8efc0 100%); - background-image: -webkit-gradient(linear, left top, left bottom, from(#fcf8e3), to(#f8efc0)); - background-image: linear-gradient(to bottom, #fcf8e3 0%, #f8efc0 100%); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fff8efc0', GradientType=0); - background-repeat: repeat-x; - border-color: #f5e79e; -} -.alert-danger { - background-image: -webkit-linear-gradient(top, #f2dede 0%, #e7c3c3 100%); - background-image: -o-linear-gradient(top, #f2dede 0%, #e7c3c3 100%); - background-image: -webkit-gradient(linear, left top, left bottom, from(#f2dede), to(#e7c3c3)); - background-image: linear-gradient(to bottom, #f2dede 0%, #e7c3c3 100%); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffe7c3c3', GradientType=0); - background-repeat: repeat-x; - border-color: #dca7a7; -} -.progress { - background-image: -webkit-linear-gradient(top, #ebebeb 0%, #f5f5f5 100%); - background-image: -o-linear-gradient(top, #ebebeb 0%, #f5f5f5 100%); - background-image: -webkit-gradient(linear, left top, left bottom, from(#ebebeb), to(#f5f5f5)); - background-image: linear-gradient(to bottom, #ebebeb 0%, #f5f5f5 100%); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffebebeb', endColorstr='#fff5f5f5', GradientType=0); - background-repeat: repeat-x; -} -.progress-bar { - background-image: -webkit-linear-gradient(top, #428bca 0%, #3071a9 100%); - background-image: -o-linear-gradient(top, #428bca 0%, #3071a9 100%); - background-image: -webkit-gradient(linear, left top, left bottom, from(#428bca), to(#3071a9)); - background-image: linear-gradient(to bottom, #428bca 0%, #3071a9 100%); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff3071a9', GradientType=0); - background-repeat: repeat-x; -} -.progress-bar-success { - background-image: -webkit-linear-gradient(top, #5cb85c 0%, #449d44 100%); - background-image: -o-linear-gradient(top, #5cb85c 0%, #449d44 100%); - background-image: -webkit-gradient(linear, left top, left bottom, from(#5cb85c), to(#449d44)); - background-image: linear-gradient(to bottom, #5cb85c 0%, #449d44 100%); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff449d44', GradientType=0); - background-repeat: repeat-x; -} -.progress-bar-info { - background-image: -webkit-linear-gradient(top, #5bc0de 0%, #31b0d5 100%); - background-image: -o-linear-gradient(top, #5bc0de 0%, #31b0d5 100%); - background-image: -webkit-gradient(linear, left top, left bottom, from(#5bc0de), to(#31b0d5)); - background-image: linear-gradient(to bottom, #5bc0de 0%, #31b0d5 100%); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff31b0d5', GradientType=0); - background-repeat: repeat-x; -} -.progress-bar-warning { - background-image: -webkit-linear-gradient(top, #f0ad4e 0%, #ec971f 100%); - background-image: -o-linear-gradient(top, #f0ad4e 0%, #ec971f 100%); - background-image: -webkit-gradient(linear, left top, left bottom, from(#f0ad4e), to(#ec971f)); - background-image: linear-gradient(to bottom, #f0ad4e 0%, #ec971f 100%); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffec971f', GradientType=0); - background-repeat: repeat-x; -} -.progress-bar-danger { - background-image: -webkit-linear-gradient(top, #d9534f 0%, #c9302c 100%); - background-image: -o-linear-gradient(top, #d9534f 0%, #c9302c 100%); - background-image: -webkit-gradient(linear, left top, left bottom, from(#d9534f), to(#c9302c)); - background-image: linear-gradient(to bottom, #d9534f 0%, #c9302c 100%); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc9302c', GradientType=0); - background-repeat: repeat-x; -} -.progress-bar-striped { - background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); - background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); - background-image: linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); -} -.list-group { - border-radius: 4px; - -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, .075); - box-shadow: 0 1px 2px rgba(0, 0, 0, .075); -} -.list-group-item.active, -.list-group-item.active:hover, -.list-group-item.active:focus { - text-shadow: 0 -1px 0 #3071a9; - background-image: -webkit-linear-gradient(top, #428bca 0%, #3278b3 100%); - background-image: -o-linear-gradient(top, #428bca 0%, #3278b3 100%); - background-image: -webkit-gradient(linear, left top, left bottom, from(#428bca), to(#3278b3)); - background-image: linear-gradient(to bottom, #428bca 0%, #3278b3 100%); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff3278b3', GradientType=0); - background-repeat: repeat-x; - border-color: #3278b3; -} -.panel { - -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, .05); - box-shadow: 0 1px 2px rgba(0, 0, 0, .05); -} -.panel-default > .panel-heading { - background-image: -webkit-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%); - background-image: -o-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%); - background-image: -webkit-gradient(linear, left top, left bottom, from(#f5f5f5), to(#e8e8e8)); - background-image: linear-gradient(to bottom, #f5f5f5 0%, #e8e8e8 100%); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0); - background-repeat: repeat-x; -} -.panel-primary > .panel-heading { - background-image: -webkit-linear-gradient(top, #428bca 0%, #357ebd 100%); - background-image: -o-linear-gradient(top, #428bca 0%, #357ebd 100%); - background-image: -webkit-gradient(linear, left top, left bottom, from(#428bca), to(#357ebd)); - background-image: linear-gradient(to bottom, #428bca 0%, #357ebd 100%); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff357ebd', GradientType=0); - background-repeat: repeat-x; -} -.panel-success > .panel-heading { - background-image: -webkit-linear-gradient(top, #dff0d8 0%, #d0e9c6 100%); - background-image: -o-linear-gradient(top, #dff0d8 0%, #d0e9c6 100%); - background-image: -webkit-gradient(linear, left top, left bottom, from(#dff0d8), to(#d0e9c6)); - background-image: linear-gradient(to bottom, #dff0d8 0%, #d0e9c6 100%); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffd0e9c6', GradientType=0); - background-repeat: repeat-x; -} -.panel-info > .panel-heading { - background-image: -webkit-linear-gradient(top, #d9edf7 0%, #c4e3f3 100%); - background-image: -o-linear-gradient(top, #d9edf7 0%, #c4e3f3 100%); - background-image: -webkit-gradient(linear, left top, left bottom, from(#d9edf7), to(#c4e3f3)); - background-image: linear-gradient(to bottom, #d9edf7 0%, #c4e3f3 100%); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffc4e3f3', GradientType=0); - background-repeat: repeat-x; -} -.panel-warning > .panel-heading { - background-image: -webkit-linear-gradient(top, #fcf8e3 0%, #faf2cc 100%); - background-image: -o-linear-gradient(top, #fcf8e3 0%, #faf2cc 100%); - background-image: -webkit-gradient(linear, left top, left bottom, from(#fcf8e3), to(#faf2cc)); - background-image: linear-gradient(to bottom, #fcf8e3 0%, #faf2cc 100%); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fffaf2cc', GradientType=0); - background-repeat: repeat-x; -} -.panel-danger > .panel-heading { - background-image: -webkit-linear-gradient(top, #f2dede 0%, #ebcccc 100%); - background-image: -o-linear-gradient(top, #f2dede 0%, #ebcccc 100%); - background-image: -webkit-gradient(linear, left top, left bottom, from(#f2dede), to(#ebcccc)); - background-image: linear-gradient(to bottom, #f2dede 0%, #ebcccc 100%); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffebcccc', GradientType=0); - background-repeat: repeat-x; -} -.well { - background-image: -webkit-linear-gradient(top, #e8e8e8 0%, #f5f5f5 100%); - background-image: -o-linear-gradient(top, #e8e8e8 0%, #f5f5f5 100%); - background-image: -webkit-gradient(linear, left top, left bottom, from(#e8e8e8), to(#f5f5f5)); - background-image: linear-gradient(to bottom, #e8e8e8 0%, #f5f5f5 100%); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffe8e8e8', endColorstr='#fff5f5f5', GradientType=0); - background-repeat: repeat-x; - border-color: #dcdcdc; - -webkit-box-shadow: inset 0 1px 3px rgba(0, 0, 0, .05), 0 1px 0 rgba(255, 255, 255, .1); - box-shadow: inset 0 1px 3px rgba(0, 0, 0, .05), 0 1px 0 rgba(255, 255, 255, .1); -} -/*# sourceMappingURL=bootstrap-theme.css.map */ diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/demultiplexing/html/bootstrap3/css/bootstrap-theme.css.map b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/demultiplexing/html/bootstrap3/css/bootstrap-theme.css.map deleted file mode 100644 index 4cc41ab001ac92f916f6e0f112c8bfd2a352cb42..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/demultiplexing/html/bootstrap3/css/bootstrap-theme.css.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"bootstrap-theme.css","sources":["less/theme.less","less/mixins/vendor-prefixes.less","bootstrap-theme.css","less/mixins/gradients.less","less/mixins/reset-filter.less"],"names":[],"mappings":"AAeA;;;;;;EAME,0CAAA;EC+CA,6FAAA;EACQ,qFAAA;EC5DT;AFiBC;;;;;;;;;;;;EC0CA,0DAAA;EACQ,kDAAA;EC7CT;AFqCC;;EAEE,wBAAA;EEnCH;AFwCD;EG/CI,0EAAA;EACA,qEAAA;EACA,+FAAA;EAAA,wEAAA;EAEA,wHAAA;ECnBF,qEAAA;EJ8BA,6BAAA;EACA,uBAAA;EA+B2C,2BAAA;EAA2B,oBAAA;EE7BvE;AFAC;;EAEE,2BAAA;EACA,8BAAA;EEEH;AFCC;;EAEE,2BAAA;EACA,uBAAA;EECH;AFEC;;EAEE,2BAAA;EACA,wBAAA;EEAH;AFeD;EGhDI,0EAAA;EACA,qEAAA;EACA,+FAAA;EAAA,wEAAA;EAEA,wHAAA;ECnBF,qEAAA;EJ8BA,6BAAA;EACA,uBAAA;EE0BD;AFxBC;;EAEE,2BAAA;EACA,8BAAA;EE0BH;AFvBC;;EAEE,2BAAA;EACA,uBAAA;EEyBH;AFtBC;;EAEE,2BAAA;EACA,wBAAA;EEwBH;AFRD;EGjDI,0EAAA;EACA,qEAAA;EACA,+FAAA;EAAA,wEAAA;EAEA,wHAAA;ECnBF,qEAAA;EJ8BA,6BAAA;EACA,uBAAA;EEkDD;AFhDC;;EAEE,2BAAA;EACA,8BAAA;EEkDH;AF/CC;;EAEE,2BAAA;EACA,uBAAA;EEiDH;AF9CC;;EAEE,2BAAA;EACA,wBAAA;EEgDH;AF/BD;EGlDI,0EAAA;EACA,qEAAA;EACA,+FAAA;EAAA,wEAAA;EAEA,wHAAA;ECnBF,qEAAA;EJ8BA,6BAAA;EACA,uBAAA;EE0ED;AFxEC;;EAEE,2BAAA;EACA,8BAAA;EE0EH;AFvEC;;EAEE,2BAAA;EACA,uBAAA;EEyEH;AFtEC;;EAEE,2BAAA;EACA,wBAAA;EEwEH;AFtDD;EGnDI,0EAAA;EACA,qEAAA;EACA,+FAAA;EAAA,wEAAA;EAEA,wHAAA;ECnBF,qEAAA;EJ8BA,6BAAA;EACA,uBAAA;EEkGD;AFhGC;;EAEE,2BAAA;EACA,8BAAA;EEkGH;AF/FC;;EAEE,2BAAA;EACA,uBAAA;EEiGH;AF9FC;;EAEE,2BAAA;EACA,wBAAA;EEgGH;AF7ED;EGpDI,0EAAA;EACA,qEAAA;EACA,+FAAA;EAAA,wEAAA;EAEA,wHAAA;ECnBF,qEAAA;EJ8BA,6BAAA;EACA,uBAAA;EE0HD;AFxHC;;EAEE,2BAAA;EACA,8BAAA;EE0HH;AFvHC;;EAEE,2BAAA;EACA,uBAAA;EEyHH;AFtHC;;EAEE,2BAAA;EACA,wBAAA;EEwHH;AF7FD;;ECbE,oDAAA;EACQ,4CAAA;EC8GT;AFvFD;;EGvEI,0EAAA;EACA,qEAAA;EACA,+FAAA;EAAA,wEAAA;EACA,6BAAA;EACA,wHAAA;EHsEF,2BAAA;EE6FD;AF3FD;;;EG5EI,0EAAA;EACA,qEAAA;EACA,+FAAA;EAAA,wEAAA;EACA,6BAAA;EACA,wHAAA;EH4EF,2BAAA;EEiGD;AFvFD;EG1FI,0EAAA;EACA,qEAAA;EACA,+FAAA;EAAA,wEAAA;EACA,6BAAA;EACA,wHAAA;ECnBF,qEAAA;EJ4GA,oBAAA;EC9CA,6FAAA;EACQ,qFAAA;EC4IT;AFlGD;EG1FI,0EAAA;EACA,qEAAA;EACA,+FAAA;EAAA,wEAAA;EACA,6BAAA;EACA,wHAAA;EF2CF,0DAAA;EACQ,kDAAA;ECqJT;AF/FD;;EAEE,gDAAA;EEiGD;AF7FD;EG5GI,0EAAA;EACA,qEAAA;EACA,+FAAA;EAAA,wEAAA;EACA,6BAAA;EACA,wHAAA;ECnBF,qEAAA;EFgOD;AFrGD;EG5GI,0EAAA;EACA,qEAAA;EACA,+FAAA;EAAA,wEAAA;EACA,6BAAA;EACA,wHAAA;EF2CF,yDAAA;EACQ,iDAAA;EC0KT;AF9GD;;EAWI,2CAAA;EEuGH;AFlGD;;;EAGE,kBAAA;EEoGD;AF1FD;EACE,+CAAA;EC3FA,4FAAA;EACQ,oFAAA;ECwLT;AFlFD;EGtJI,0EAAA;EACA,qEAAA;EACA,+FAAA;EAAA,wEAAA;EACA,6BAAA;EACA,wHAAA;EH8IF,uBAAA;EE8FD;AFzFD;EGvJI,0EAAA;EACA,qEAAA;EACA,+FAAA;EAAA,wEAAA;EACA,6BAAA;EACA,wHAAA;EH8IF,uBAAA;EEsGD;AFhGD;EGxJI,0EAAA;EACA,qEAAA;EACA,+FAAA;EAAA,wEAAA;EACA,6BAAA;EACA,wHAAA;EH8IF,uBAAA;EE8GD;AFvGD;EGzJI,0EAAA;EACA,qEAAA;EACA,+FAAA;EAAA,wEAAA;EACA,6BAAA;EACA,wHAAA;EH8IF,uBAAA;EEsHD;AFtGD;EGlKI,0EAAA;EACA,qEAAA;EACA,+FAAA;EAAA,wEAAA;EACA,6BAAA;EACA,wHAAA;ED2QH;AFnGD;EG5KI,0EAAA;EACA,qEAAA;EACA,+FAAA;EAAA,wEAAA;EACA,6BAAA;EACA,wHAAA;EDkRH;AFzGD;EG7KI,0EAAA;EACA,qEAAA;EACA,+FAAA;EAAA,wEAAA;EACA,6BAAA;EACA,wHAAA;EDyRH;AF/GD;EG9KI,0EAAA;EACA,qEAAA;EACA,+FAAA;EAAA,wEAAA;EACA,6BAAA;EACA,wHAAA;EDgSH;AFrHD;EG/KI,0EAAA;EACA,qEAAA;EACA,+FAAA;EAAA,wEAAA;EACA,6BAAA;EACA,wHAAA;EDuSH;AF3HD;EGhLI,0EAAA;EACA,qEAAA;EACA,+FAAA;EAAA,wEAAA;EACA,6BAAA;EACA,wHAAA;ED8SH;AF9HD;EGnJI,+MAAA;EACA,0MAAA;EACA,uMAAA;EDoRH;AF1HD;EACE,oBAAA;EC/IA,oDAAA;EACQ,4CAAA;EC4QT;AF3HD;;;EAGE,+BAAA;EGpME,0EAAA;EACA,qEAAA;EACA,+FAAA;EAAA,wEAAA;EACA,6BAAA;EACA,wHAAA;EHkMF,uBAAA;EEiID;AFvHD;ECjKE,mDAAA;EACQ,2CAAA;EC2RT;AFjHD;EG1NI,0EAAA;EACA,qEAAA;EACA,+FAAA;EAAA,wEAAA;EACA,6BAAA;EACA,wHAAA;ED8UH;AFvHD;EG3NI,0EAAA;EACA,qEAAA;EACA,+FAAA;EAAA,wEAAA;EACA,6BAAA;EACA,wHAAA;EDqVH;AF7HD;EG5NI,0EAAA;EACA,qEAAA;EACA,+FAAA;EAAA,wEAAA;EACA,6BAAA;EACA,wHAAA;ED4VH;AFnID;EG7NI,0EAAA;EACA,qEAAA;EACA,+FAAA;EAAA,wEAAA;EACA,6BAAA;EACA,wHAAA;EDmWH;AFzID;EG9NI,0EAAA;EACA,qEAAA;EACA,+FAAA;EAAA,wEAAA;EACA,6BAAA;EACA,wHAAA;ED0WH;AF/ID;EG/NI,0EAAA;EACA,qEAAA;EACA,+FAAA;EAAA,wEAAA;EACA,6BAAA;EACA,wHAAA;EDiXH;AF9ID;EGvOI,0EAAA;EACA,qEAAA;EACA,+FAAA;EAAA,wEAAA;EACA,6BAAA;EACA,wHAAA;EHqOF,uBAAA;EC1LA,2FAAA;EACQ,mFAAA;EC+UT","sourcesContent":["\n//\n// Load core variables and mixins\n// --------------------------------------------------\n\n@import \"variables.less\";\n@import \"mixins.less\";\n\n\n\n//\n// Buttons\n// --------------------------------------------------\n\n// Common styles\n.btn-default,\n.btn-primary,\n.btn-success,\n.btn-info,\n.btn-warning,\n.btn-danger {\n text-shadow: 0 -1px 0 rgba(0,0,0,.2);\n @shadow: inset 0 1px 0 rgba(255,255,255,.15), 0 1px 1px rgba(0,0,0,.075);\n .box-shadow(@shadow);\n\n // Reset the shadow\n &:active,\n &.active {\n .box-shadow(inset 0 3px 5px rgba(0,0,0,.125));\n }\n}\n\n// Mixin for generating new styles\n.btn-styles(@btn-color: #555) {\n #gradient > .vertical(@start-color: @btn-color; @end-color: darken(@btn-color, 12%));\n .reset-filter(); // Disable gradients for IE9 because filter bleeds through rounded corners\n background-repeat: repeat-x;\n border-color: darken(@btn-color, 14%);\n\n &:hover,\n &:focus {\n background-color: darken(@btn-color, 12%);\n background-position: 0 -15px;\n }\n\n &:active,\n &.active {\n background-color: darken(@btn-color, 12%);\n border-color: darken(@btn-color, 14%);\n }\n\n &:disabled,\n &[disabled] {\n background-color: darken(@btn-color, 12%);\n background-image: none;\n }\n}\n\n// Common styles\n.btn {\n // Remove the gradient for the pressed/active state\n &:active,\n &.active {\n background-image: none;\n }\n}\n\n// Apply the mixin to the buttons\n.btn-default { .btn-styles(@btn-default-bg); text-shadow: 0 1px 0 #fff; border-color: #ccc; }\n.btn-primary { .btn-styles(@btn-primary-bg); }\n.btn-success { .btn-styles(@btn-success-bg); }\n.btn-info { .btn-styles(@btn-info-bg); }\n.btn-warning { .btn-styles(@btn-warning-bg); }\n.btn-danger { .btn-styles(@btn-danger-bg); }\n\n\n\n//\n// Images\n// --------------------------------------------------\n\n.thumbnail,\n.img-thumbnail {\n .box-shadow(0 1px 2px rgba(0,0,0,.075));\n}\n\n\n\n//\n// Dropdowns\n// --------------------------------------------------\n\n.dropdown-menu > li > a:hover,\n.dropdown-menu > li > a:focus {\n #gradient > .vertical(@start-color: @dropdown-link-hover-bg; @end-color: darken(@dropdown-link-hover-bg, 5%));\n background-color: darken(@dropdown-link-hover-bg, 5%);\n}\n.dropdown-menu > .active > a,\n.dropdown-menu > .active > a:hover,\n.dropdown-menu > .active > a:focus {\n #gradient > .vertical(@start-color: @dropdown-link-active-bg; @end-color: darken(@dropdown-link-active-bg, 5%));\n background-color: darken(@dropdown-link-active-bg, 5%);\n}\n\n\n\n//\n// Navbar\n// --------------------------------------------------\n\n// Default navbar\n.navbar-default {\n #gradient > .vertical(@start-color: lighten(@navbar-default-bg, 10%); @end-color: @navbar-default-bg);\n .reset-filter(); // Remove gradient in IE<10 to fix bug where dropdowns don't get triggered\n border-radius: @navbar-border-radius;\n @shadow: inset 0 1px 0 rgba(255,255,255,.15), 0 1px 5px rgba(0,0,0,.075);\n .box-shadow(@shadow);\n\n .navbar-nav > .active > a {\n #gradient > .vertical(@start-color: darken(@navbar-default-bg, 5%); @end-color: darken(@navbar-default-bg, 2%));\n .box-shadow(inset 0 3px 9px rgba(0,0,0,.075));\n }\n}\n.navbar-brand,\n.navbar-nav > li > a {\n text-shadow: 0 1px 0 rgba(255,255,255,.25);\n}\n\n// Inverted navbar\n.navbar-inverse {\n #gradient > .vertical(@start-color: lighten(@navbar-inverse-bg, 10%); @end-color: @navbar-inverse-bg);\n .reset-filter(); // Remove gradient in IE<10 to fix bug where dropdowns don't get triggered\n\n .navbar-nav > .active > a {\n #gradient > .vertical(@start-color: @navbar-inverse-bg; @end-color: lighten(@navbar-inverse-bg, 2.5%));\n .box-shadow(inset 0 3px 9px rgba(0,0,0,.25));\n }\n\n .navbar-brand,\n .navbar-nav > li > a {\n text-shadow: 0 -1px 0 rgba(0,0,0,.25);\n }\n}\n\n// Undo rounded corners in static and fixed navbars\n.navbar-static-top,\n.navbar-fixed-top,\n.navbar-fixed-bottom {\n border-radius: 0;\n}\n\n\n\n//\n// Alerts\n// --------------------------------------------------\n\n// Common styles\n.alert {\n text-shadow: 0 1px 0 rgba(255,255,255,.2);\n @shadow: inset 0 1px 0 rgba(255,255,255,.25), 0 1px 2px rgba(0,0,0,.05);\n .box-shadow(@shadow);\n}\n\n// Mixin for generating new styles\n.alert-styles(@color) {\n #gradient > .vertical(@start-color: @color; @end-color: darken(@color, 7.5%));\n border-color: darken(@color, 15%);\n}\n\n// Apply the mixin to the alerts\n.alert-success { .alert-styles(@alert-success-bg); }\n.alert-info { .alert-styles(@alert-info-bg); }\n.alert-warning { .alert-styles(@alert-warning-bg); }\n.alert-danger { .alert-styles(@alert-danger-bg); }\n\n\n\n//\n// Progress bars\n// --------------------------------------------------\n\n// Give the progress background some depth\n.progress {\n #gradient > .vertical(@start-color: darken(@progress-bg, 4%); @end-color: @progress-bg)\n}\n\n// Mixin for generating new styles\n.progress-bar-styles(@color) {\n #gradient > .vertical(@start-color: @color; @end-color: darken(@color, 10%));\n}\n\n// Apply the mixin to the progress bars\n.progress-bar { .progress-bar-styles(@progress-bar-bg); }\n.progress-bar-success { .progress-bar-styles(@progress-bar-success-bg); }\n.progress-bar-info { .progress-bar-styles(@progress-bar-info-bg); }\n.progress-bar-warning { .progress-bar-styles(@progress-bar-warning-bg); }\n.progress-bar-danger { .progress-bar-styles(@progress-bar-danger-bg); }\n\n// Reset the striped class because our mixins don't do multiple gradients and\n// the above custom styles override the new `.progress-bar-striped` in v3.2.0.\n.progress-bar-striped {\n #gradient > .striped();\n}\n\n\n//\n// List groups\n// --------------------------------------------------\n\n.list-group {\n border-radius: @border-radius-base;\n .box-shadow(0 1px 2px rgba(0,0,0,.075));\n}\n.list-group-item.active,\n.list-group-item.active:hover,\n.list-group-item.active:focus {\n text-shadow: 0 -1px 0 darken(@list-group-active-bg, 10%);\n #gradient > .vertical(@start-color: @list-group-active-bg; @end-color: darken(@list-group-active-bg, 7.5%));\n border-color: darken(@list-group-active-border, 7.5%);\n}\n\n\n\n//\n// Panels\n// --------------------------------------------------\n\n// Common styles\n.panel {\n .box-shadow(0 1px 2px rgba(0,0,0,.05));\n}\n\n// Mixin for generating new styles\n.panel-heading-styles(@color) {\n #gradient > .vertical(@start-color: @color; @end-color: darken(@color, 5%));\n}\n\n// Apply the mixin to the panel headings only\n.panel-default > .panel-heading { .panel-heading-styles(@panel-default-heading-bg); }\n.panel-primary > .panel-heading { .panel-heading-styles(@panel-primary-heading-bg); }\n.panel-success > .panel-heading { .panel-heading-styles(@panel-success-heading-bg); }\n.panel-info > .panel-heading { .panel-heading-styles(@panel-info-heading-bg); }\n.panel-warning > .panel-heading { .panel-heading-styles(@panel-warning-heading-bg); }\n.panel-danger > .panel-heading { .panel-heading-styles(@panel-danger-heading-bg); }\n\n\n\n//\n// Wells\n// --------------------------------------------------\n\n.well {\n #gradient > .vertical(@start-color: darken(@well-bg, 5%); @end-color: @well-bg);\n border-color: darken(@well-bg, 10%);\n @shadow: inset 0 1px 3px rgba(0,0,0,.05), 0 1px 0 rgba(255,255,255,.1);\n .box-shadow(@shadow);\n}\n","// Vendor Prefixes\n//\n// All vendor mixins are deprecated as of v3.2.0 due to the introduction of\n// Autoprefixer in our Gruntfile. They will be removed in v4.\n\n// - Animations\n// - Backface visibility\n// - Box shadow\n// - Box sizing\n// - Content columns\n// - Hyphens\n// - Placeholder text\n// - Transformations\n// - Transitions\n// - User Select\n\n\n// Animations\n.animation(@animation) {\n -webkit-animation: @animation;\n -o-animation: @animation;\n animation: @animation;\n}\n.animation-name(@name) {\n -webkit-animation-name: @name;\n animation-name: @name;\n}\n.animation-duration(@duration) {\n -webkit-animation-duration: @duration;\n animation-duration: @duration;\n}\n.animation-timing-function(@timing-function) {\n -webkit-animation-timing-function: @timing-function;\n animation-timing-function: @timing-function;\n}\n.animation-delay(@delay) {\n -webkit-animation-delay: @delay;\n animation-delay: @delay;\n}\n.animation-iteration-count(@iteration-count) {\n -webkit-animation-iteration-count: @iteration-count;\n animation-iteration-count: @iteration-count;\n}\n.animation-direction(@direction) {\n -webkit-animation-direction: @direction;\n animation-direction: @direction;\n}\n.animation-fill-mode(@fill-mode) {\n -webkit-animation-fill-mode: @fill-mode;\n animation-fill-mode: @fill-mode;\n}\n\n// Backface visibility\n// Prevent browsers from flickering when using CSS 3D transforms.\n// Default value is `visible`, but can be changed to `hidden`\n\n.backface-visibility(@visibility){\n -webkit-backface-visibility: @visibility;\n -moz-backface-visibility: @visibility;\n backface-visibility: @visibility;\n}\n\n// Drop shadows\n//\n// Note: Deprecated `.box-shadow()` as of v3.1.0 since all of Bootstrap's\n// supported browsers that have box shadow capabilities now support it.\n\n.box-shadow(@shadow) {\n -webkit-box-shadow: @shadow; // iOS <4.3 & Android <4.1\n box-shadow: @shadow;\n}\n\n// Box sizing\n.box-sizing(@boxmodel) {\n -webkit-box-sizing: @boxmodel;\n -moz-box-sizing: @boxmodel;\n box-sizing: @boxmodel;\n}\n\n// CSS3 Content Columns\n.content-columns(@column-count; @column-gap: @grid-gutter-width) {\n -webkit-column-count: @column-count;\n -moz-column-count: @column-count;\n column-count: @column-count;\n -webkit-column-gap: @column-gap;\n -moz-column-gap: @column-gap;\n column-gap: @column-gap;\n}\n\n// Optional hyphenation\n.hyphens(@mode: auto) {\n word-wrap: break-word;\n -webkit-hyphens: @mode;\n -moz-hyphens: @mode;\n -ms-hyphens: @mode; // IE10+\n -o-hyphens: @mode;\n hyphens: @mode;\n}\n\n// Placeholder text\n.placeholder(@color: @input-color-placeholder) {\n &::-moz-placeholder { color: @color; // Firefox\n opacity: 1; } // See https://github.com/twbs/bootstrap/pull/11526\n &:-ms-input-placeholder { color: @color; } // Internet Explorer 10+\n &::-webkit-input-placeholder { color: @color; } // Safari and Chrome\n}\n\n// Transformations\n.scale(@ratio) {\n -webkit-transform: scale(@ratio);\n -ms-transform: scale(@ratio); // IE9 only\n -o-transform: scale(@ratio);\n transform: scale(@ratio);\n}\n.scale(@ratioX; @ratioY) {\n -webkit-transform: scale(@ratioX, @ratioY);\n -ms-transform: scale(@ratioX, @ratioY); // IE9 only\n -o-transform: scale(@ratioX, @ratioY);\n transform: scale(@ratioX, @ratioY);\n}\n.scaleX(@ratio) {\n -webkit-transform: scaleX(@ratio);\n -ms-transform: scaleX(@ratio); // IE9 only\n -o-transform: scaleX(@ratio);\n transform: scaleX(@ratio);\n}\n.scaleY(@ratio) {\n -webkit-transform: scaleY(@ratio);\n -ms-transform: scaleY(@ratio); // IE9 only\n -o-transform: scaleY(@ratio);\n transform: scaleY(@ratio);\n}\n.skew(@x; @y) {\n -webkit-transform: skewX(@x) skewY(@y);\n -ms-transform: skewX(@x) skewY(@y); // See https://github.com/twbs/bootstrap/issues/4885; IE9+\n -o-transform: skewX(@x) skewY(@y);\n transform: skewX(@x) skewY(@y);\n}\n.translate(@x; @y) {\n -webkit-transform: translate(@x, @y);\n -ms-transform: translate(@x, @y); // IE9 only\n -o-transform: translate(@x, @y);\n transform: translate(@x, @y);\n}\n.translate3d(@x; @y; @z) {\n -webkit-transform: translate3d(@x, @y, @z);\n transform: translate3d(@x, @y, @z);\n}\n.rotate(@degrees) {\n -webkit-transform: rotate(@degrees);\n -ms-transform: rotate(@degrees); // IE9 only\n -o-transform: rotate(@degrees);\n transform: rotate(@degrees);\n}\n.rotateX(@degrees) {\n -webkit-transform: rotateX(@degrees);\n -ms-transform: rotateX(@degrees); // IE9 only\n -o-transform: rotateX(@degrees);\n transform: rotateX(@degrees);\n}\n.rotateY(@degrees) {\n -webkit-transform: rotateY(@degrees);\n -ms-transform: rotateY(@degrees); // IE9 only\n -o-transform: rotateY(@degrees);\n transform: rotateY(@degrees);\n}\n.perspective(@perspective) {\n -webkit-perspective: @perspective;\n -moz-perspective: @perspective;\n perspective: @perspective;\n}\n.perspective-origin(@perspective) {\n -webkit-perspective-origin: @perspective;\n -moz-perspective-origin: @perspective;\n perspective-origin: @perspective;\n}\n.transform-origin(@origin) {\n -webkit-transform-origin: @origin;\n -moz-transform-origin: @origin;\n -ms-transform-origin: @origin; // IE9 only\n transform-origin: @origin;\n}\n\n\n// Transitions\n\n.transition(@transition) {\n -webkit-transition: @transition;\n -o-transition: @transition;\n transition: @transition;\n}\n.transition-property(@transition-property) {\n -webkit-transition-property: @transition-property;\n transition-property: @transition-property;\n}\n.transition-delay(@transition-delay) {\n -webkit-transition-delay: @transition-delay;\n transition-delay: @transition-delay;\n}\n.transition-duration(@transition-duration) {\n -webkit-transition-duration: @transition-duration;\n transition-duration: @transition-duration;\n}\n.transition-timing-function(@timing-function) {\n -webkit-transition-timing-function: @timing-function;\n transition-timing-function: @timing-function;\n}\n.transition-transform(@transition) {\n -webkit-transition: -webkit-transform @transition;\n -moz-transition: -moz-transform @transition;\n -o-transition: -o-transform @transition;\n transition: transform @transition;\n}\n\n\n// User select\n// For selecting text on the page\n\n.user-select(@select) {\n -webkit-user-select: @select;\n -moz-user-select: @select;\n -ms-user-select: @select; // IE10+\n user-select: @select;\n}\n",null,"// Gradients\n\n#gradient {\n\n // Horizontal gradient, from left to right\n //\n // Creates two color stops, start and end, by specifying a color and position for each color stop.\n // Color stops are not available in IE9 and below.\n .horizontal(@start-color: #555; @end-color: #333; @start-percent: 0%; @end-percent: 100%) {\n background-image: -webkit-linear-gradient(left, @start-color @start-percent, @end-color @end-percent); // Safari 5.1-6, Chrome 10+\n background-image: -o-linear-gradient(left, @start-color @start-percent, @end-color @end-percent); // Opera 12\n background-image: linear-gradient(to right, @start-color @start-percent, @end-color @end-percent); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+\n background-repeat: repeat-x;\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=1)\",argb(@start-color),argb(@end-color))); // IE9 and down\n }\n\n // Vertical gradient, from top to bottom\n //\n // Creates two color stops, start and end, by specifying a color and position for each color stop.\n // Color stops are not available in IE9 and below.\n .vertical(@start-color: #555; @end-color: #333; @start-percent: 0%; @end-percent: 100%) {\n background-image: -webkit-linear-gradient(top, @start-color @start-percent, @end-color @end-percent); // Safari 5.1-6, Chrome 10+\n background-image: -o-linear-gradient(top, @start-color @start-percent, @end-color @end-percent); // Opera 12\n background-image: linear-gradient(to bottom, @start-color @start-percent, @end-color @end-percent); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+\n background-repeat: repeat-x;\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=0)\",argb(@start-color),argb(@end-color))); // IE9 and down\n }\n\n .directional(@start-color: #555; @end-color: #333; @deg: 45deg) {\n background-repeat: repeat-x;\n background-image: -webkit-linear-gradient(@deg, @start-color, @end-color); // Safari 5.1-6, Chrome 10+\n background-image: -o-linear-gradient(@deg, @start-color, @end-color); // Opera 12\n background-image: linear-gradient(@deg, @start-color, @end-color); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+\n }\n .horizontal-three-colors(@start-color: #00b3ee; @mid-color: #7a43b6; @color-stop: 50%; @end-color: #c3325f) {\n background-image: -webkit-linear-gradient(left, @start-color, @mid-color @color-stop, @end-color);\n background-image: -o-linear-gradient(left, @start-color, @mid-color @color-stop, @end-color);\n background-image: linear-gradient(to right, @start-color, @mid-color @color-stop, @end-color);\n background-repeat: no-repeat;\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=1)\",argb(@start-color),argb(@end-color))); // IE9 and down, gets no color-stop at all for proper fallback\n }\n .vertical-three-colors(@start-color: #00b3ee; @mid-color: #7a43b6; @color-stop: 50%; @end-color: #c3325f) {\n background-image: -webkit-linear-gradient(@start-color, @mid-color @color-stop, @end-color);\n background-image: -o-linear-gradient(@start-color, @mid-color @color-stop, @end-color);\n background-image: linear-gradient(@start-color, @mid-color @color-stop, @end-color);\n background-repeat: no-repeat;\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=0)\",argb(@start-color),argb(@end-color))); // IE9 and down, gets no color-stop at all for proper fallback\n }\n .radial(@inner-color: #555; @outer-color: #333) {\n background-image: -webkit-radial-gradient(circle, @inner-color, @outer-color);\n background-image: radial-gradient(circle, @inner-color, @outer-color);\n background-repeat: no-repeat;\n }\n .striped(@color: rgba(255,255,255,.15); @angle: 45deg) {\n background-image: -webkit-linear-gradient(@angle, @color 25%, transparent 25%, transparent 50%, @color 50%, @color 75%, transparent 75%, transparent);\n background-image: -o-linear-gradient(@angle, @color 25%, transparent 25%, transparent 50%, @color 50%, @color 75%, transparent 75%, transparent);\n background-image: linear-gradient(@angle, @color 25%, transparent 25%, transparent 50%, @color 50%, @color 75%, transparent 75%, transparent);\n }\n}\n","// Reset filters for IE\n//\n// When you need to remove a gradient background, do not forget to use this to reset\n// the IE filter for IE9 and below.\n\n.reset-filter() {\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(enabled = false)\"));\n}\n"]} \ No newline at end of file diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/demultiplexing/html/bootstrap3/css/bootstrap-theme.min.css b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/demultiplexing/html/bootstrap3/css/bootstrap-theme.min.css deleted file mode 100644 index 2e97597c876ddd2c5d081dd27db3a90e61d925e9..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/demultiplexing/html/bootstrap3/css/bootstrap-theme.min.css +++ /dev/null @@ -1,5 +0,0 @@ -/*! - * Bootstrap v3.2.0 (http://getbootstrap.com) - * Copyright 2011-2014 Twitter, Inc. - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) - */.btn-default,.btn-primary,.btn-success,.btn-info,.btn-warning,.btn-danger{text-shadow:0 -1px 0 rgba(0,0,0,.2);-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.15),0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 0 rgba(255,255,255,.15),0 1px 1px rgba(0,0,0,.075)}.btn-default:active,.btn-primary:active,.btn-success:active,.btn-info:active,.btn-warning:active,.btn-danger:active,.btn-default.active,.btn-primary.active,.btn-success.active,.btn-info.active,.btn-warning.active,.btn-danger.active{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn:active,.btn.active{background-image:none}.btn-default{text-shadow:0 1px 0 #fff;background-image:-webkit-linear-gradient(top,#fff 0,#e0e0e0 100%);background-image:-o-linear-gradient(top,#fff 0,#e0e0e0 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#e0e0e0));background-image:linear-gradient(to bottom,#fff 0,#e0e0e0 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffe0e0e0', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#dbdbdb;border-color:#ccc}.btn-default:hover,.btn-default:focus{background-color:#e0e0e0;background-position:0 -15px}.btn-default:active,.btn-default.active{background-color:#e0e0e0;border-color:#dbdbdb}.btn-default:disabled,.btn-default[disabled]{background-color:#e0e0e0;background-image:none}.btn-primary{background-image:-webkit-linear-gradient(top,#428bca 0,#2d6ca2 100%);background-image:-o-linear-gradient(top,#428bca 0,#2d6ca2 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#428bca),to(#2d6ca2));background-image:linear-gradient(to bottom,#428bca 0,#2d6ca2 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff2d6ca2', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#2b669a}.btn-primary:hover,.btn-primary:focus{background-color:#2d6ca2;background-position:0 -15px}.btn-primary:active,.btn-primary.active{background-color:#2d6ca2;border-color:#2b669a}.btn-primary:disabled,.btn-primary[disabled]{background-color:#2d6ca2;background-image:none}.btn-success{background-image:-webkit-linear-gradient(top,#5cb85c 0,#419641 100%);background-image:-o-linear-gradient(top,#5cb85c 0,#419641 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#5cb85c),to(#419641));background-image:linear-gradient(to bottom,#5cb85c 0,#419641 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff419641', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#3e8f3e}.btn-success:hover,.btn-success:focus{background-color:#419641;background-position:0 -15px}.btn-success:active,.btn-success.active{background-color:#419641;border-color:#3e8f3e}.btn-success:disabled,.btn-success[disabled]{background-color:#419641;background-image:none}.btn-info{background-image:-webkit-linear-gradient(top,#5bc0de 0,#2aabd2 100%);background-image:-o-linear-gradient(top,#5bc0de 0,#2aabd2 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#5bc0de),to(#2aabd2));background-image:linear-gradient(to bottom,#5bc0de 0,#2aabd2 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff2aabd2', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#28a4c9}.btn-info:hover,.btn-info:focus{background-color:#2aabd2;background-position:0 -15px}.btn-info:active,.btn-info.active{background-color:#2aabd2;border-color:#28a4c9}.btn-info:disabled,.btn-info[disabled]{background-color:#2aabd2;background-image:none}.btn-warning{background-image:-webkit-linear-gradient(top,#f0ad4e 0,#eb9316 100%);background-image:-o-linear-gradient(top,#f0ad4e 0,#eb9316 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f0ad4e),to(#eb9316));background-image:linear-gradient(to bottom,#f0ad4e 0,#eb9316 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffeb9316', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#e38d13}.btn-warning:hover,.btn-warning:focus{background-color:#eb9316;background-position:0 -15px}.btn-warning:active,.btn-warning.active{background-color:#eb9316;border-color:#e38d13}.btn-warning:disabled,.btn-warning[disabled]{background-color:#eb9316;background-image:none}.btn-danger{background-image:-webkit-linear-gradient(top,#d9534f 0,#c12e2a 100%);background-image:-o-linear-gradient(top,#d9534f 0,#c12e2a 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#d9534f),to(#c12e2a));background-image:linear-gradient(to bottom,#d9534f 0,#c12e2a 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc12e2a', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#b92c28}.btn-danger:hover,.btn-danger:focus{background-color:#c12e2a;background-position:0 -15px}.btn-danger:active,.btn-danger.active{background-color:#c12e2a;border-color:#b92c28}.btn-danger:disabled,.btn-danger[disabled]{background-color:#c12e2a;background-image:none}.thumbnail,.img-thumbnail{-webkit-box-shadow:0 1px 2px rgba(0,0,0,.075);box-shadow:0 1px 2px rgba(0,0,0,.075)}.dropdown-menu>li>a:hover,.dropdown-menu>li>a:focus{background-color:#e8e8e8;background-image:-webkit-linear-gradient(top,#f5f5f5 0,#e8e8e8 100%);background-image:-o-linear-gradient(top,#f5f5f5 0,#e8e8e8 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f5f5f5),to(#e8e8e8));background-image:linear-gradient(to bottom,#f5f5f5 0,#e8e8e8 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0);background-repeat:repeat-x}.dropdown-menu>.active>a,.dropdown-menu>.active>a:hover,.dropdown-menu>.active>a:focus{background-color:#357ebd;background-image:-webkit-linear-gradient(top,#428bca 0,#357ebd 100%);background-image:-o-linear-gradient(top,#428bca 0,#357ebd 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#428bca),to(#357ebd));background-image:linear-gradient(to bottom,#428bca 0,#357ebd 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff357ebd', GradientType=0);background-repeat:repeat-x}.navbar-default{background-image:-webkit-linear-gradient(top,#fff 0,#f8f8f8 100%);background-image:-o-linear-gradient(top,#fff 0,#f8f8f8 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#f8f8f8));background-image:linear-gradient(to bottom,#fff 0,#f8f8f8 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#fff8f8f8', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-radius:4px;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.15),0 1px 5px rgba(0,0,0,.075);box-shadow:inset 0 1px 0 rgba(255,255,255,.15),0 1px 5px rgba(0,0,0,.075)}.navbar-default .navbar-nav>.active>a{background-image:-webkit-linear-gradient(top,#ebebeb 0,#f3f3f3 100%);background-image:-o-linear-gradient(top,#ebebeb 0,#f3f3f3 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#ebebeb),to(#f3f3f3));background-image:linear-gradient(to bottom,#ebebeb 0,#f3f3f3 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffebebeb', endColorstr='#fff3f3f3', GradientType=0);background-repeat:repeat-x;-webkit-box-shadow:inset 0 3px 9px rgba(0,0,0,.075);box-shadow:inset 0 3px 9px rgba(0,0,0,.075)}.navbar-brand,.navbar-nav>li>a{text-shadow:0 1px 0 rgba(255,255,255,.25)}.navbar-inverse{background-image:-webkit-linear-gradient(top,#3c3c3c 0,#222 100%);background-image:-o-linear-gradient(top,#3c3c3c 0,#222 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#3c3c3c),to(#222));background-image:linear-gradient(to bottom,#3c3c3c 0,#222 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff3c3c3c', endColorstr='#ff222222', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x}.navbar-inverse .navbar-nav>.active>a{background-image:-webkit-linear-gradient(top,#222 0,#282828 100%);background-image:-o-linear-gradient(top,#222 0,#282828 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#222),to(#282828));background-image:linear-gradient(to bottom,#222 0,#282828 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff222222', endColorstr='#ff282828', GradientType=0);background-repeat:repeat-x;-webkit-box-shadow:inset 0 3px 9px rgba(0,0,0,.25);box-shadow:inset 0 3px 9px rgba(0,0,0,.25)}.navbar-inverse .navbar-brand,.navbar-inverse .navbar-nav>li>a{text-shadow:0 -1px 0 rgba(0,0,0,.25)}.navbar-static-top,.navbar-fixed-top,.navbar-fixed-bottom{border-radius:0}.alert{text-shadow:0 1px 0 rgba(255,255,255,.2);-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.25),0 1px 2px rgba(0,0,0,.05);box-shadow:inset 0 1px 0 rgba(255,255,255,.25),0 1px 2px rgba(0,0,0,.05)}.alert-success{background-image:-webkit-linear-gradient(top,#dff0d8 0,#c8e5bc 100%);background-image:-o-linear-gradient(top,#dff0d8 0,#c8e5bc 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#dff0d8),to(#c8e5bc));background-image:linear-gradient(to bottom,#dff0d8 0,#c8e5bc 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffc8e5bc', GradientType=0);background-repeat:repeat-x;border-color:#b2dba1}.alert-info{background-image:-webkit-linear-gradient(top,#d9edf7 0,#b9def0 100%);background-image:-o-linear-gradient(top,#d9edf7 0,#b9def0 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#d9edf7),to(#b9def0));background-image:linear-gradient(to bottom,#d9edf7 0,#b9def0 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffb9def0', GradientType=0);background-repeat:repeat-x;border-color:#9acfea}.alert-warning{background-image:-webkit-linear-gradient(top,#fcf8e3 0,#f8efc0 100%);background-image:-o-linear-gradient(top,#fcf8e3 0,#f8efc0 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#fcf8e3),to(#f8efc0));background-image:linear-gradient(to bottom,#fcf8e3 0,#f8efc0 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fff8efc0', GradientType=0);background-repeat:repeat-x;border-color:#f5e79e}.alert-danger{background-image:-webkit-linear-gradient(top,#f2dede 0,#e7c3c3 100%);background-image:-o-linear-gradient(top,#f2dede 0,#e7c3c3 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f2dede),to(#e7c3c3));background-image:linear-gradient(to bottom,#f2dede 0,#e7c3c3 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffe7c3c3', GradientType=0);background-repeat:repeat-x;border-color:#dca7a7}.progress{background-image:-webkit-linear-gradient(top,#ebebeb 0,#f5f5f5 100%);background-image:-o-linear-gradient(top,#ebebeb 0,#f5f5f5 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#ebebeb),to(#f5f5f5));background-image:linear-gradient(to bottom,#ebebeb 0,#f5f5f5 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffebebeb', endColorstr='#fff5f5f5', GradientType=0);background-repeat:repeat-x}.progress-bar{background-image:-webkit-linear-gradient(top,#428bca 0,#3071a9 100%);background-image:-o-linear-gradient(top,#428bca 0,#3071a9 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#428bca),to(#3071a9));background-image:linear-gradient(to bottom,#428bca 0,#3071a9 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff3071a9', GradientType=0);background-repeat:repeat-x}.progress-bar-success{background-image:-webkit-linear-gradient(top,#5cb85c 0,#449d44 100%);background-image:-o-linear-gradient(top,#5cb85c 0,#449d44 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#5cb85c),to(#449d44));background-image:linear-gradient(to bottom,#5cb85c 0,#449d44 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff449d44', GradientType=0);background-repeat:repeat-x}.progress-bar-info{background-image:-webkit-linear-gradient(top,#5bc0de 0,#31b0d5 100%);background-image:-o-linear-gradient(top,#5bc0de 0,#31b0d5 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#5bc0de),to(#31b0d5));background-image:linear-gradient(to bottom,#5bc0de 0,#31b0d5 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff31b0d5', GradientType=0);background-repeat:repeat-x}.progress-bar-warning{background-image:-webkit-linear-gradient(top,#f0ad4e 0,#ec971f 100%);background-image:-o-linear-gradient(top,#f0ad4e 0,#ec971f 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f0ad4e),to(#ec971f));background-image:linear-gradient(to bottom,#f0ad4e 0,#ec971f 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffec971f', GradientType=0);background-repeat:repeat-x}.progress-bar-danger{background-image:-webkit-linear-gradient(top,#d9534f 0,#c9302c 100%);background-image:-o-linear-gradient(top,#d9534f 0,#c9302c 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#d9534f),to(#c9302c));background-image:linear-gradient(to bottom,#d9534f 0,#c9302c 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc9302c', GradientType=0);background-repeat:repeat-x}.progress-bar-striped{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.list-group{border-radius:4px;-webkit-box-shadow:0 1px 2px rgba(0,0,0,.075);box-shadow:0 1px 2px rgba(0,0,0,.075)}.list-group-item.active,.list-group-item.active:hover,.list-group-item.active:focus{text-shadow:0 -1px 0 #3071a9;background-image:-webkit-linear-gradient(top,#428bca 0,#3278b3 100%);background-image:-o-linear-gradient(top,#428bca 0,#3278b3 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#428bca),to(#3278b3));background-image:linear-gradient(to bottom,#428bca 0,#3278b3 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff3278b3', GradientType=0);background-repeat:repeat-x;border-color:#3278b3}.panel{-webkit-box-shadow:0 1px 2px rgba(0,0,0,.05);box-shadow:0 1px 2px rgba(0,0,0,.05)}.panel-default>.panel-heading{background-image:-webkit-linear-gradient(top,#f5f5f5 0,#e8e8e8 100%);background-image:-o-linear-gradient(top,#f5f5f5 0,#e8e8e8 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f5f5f5),to(#e8e8e8));background-image:linear-gradient(to bottom,#f5f5f5 0,#e8e8e8 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0);background-repeat:repeat-x}.panel-primary>.panel-heading{background-image:-webkit-linear-gradient(top,#428bca 0,#357ebd 100%);background-image:-o-linear-gradient(top,#428bca 0,#357ebd 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#428bca),to(#357ebd));background-image:linear-gradient(to bottom,#428bca 0,#357ebd 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff357ebd', GradientType=0);background-repeat:repeat-x}.panel-success>.panel-heading{background-image:-webkit-linear-gradient(top,#dff0d8 0,#d0e9c6 100%);background-image:-o-linear-gradient(top,#dff0d8 0,#d0e9c6 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#dff0d8),to(#d0e9c6));background-image:linear-gradient(to bottom,#dff0d8 0,#d0e9c6 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffd0e9c6', GradientType=0);background-repeat:repeat-x}.panel-info>.panel-heading{background-image:-webkit-linear-gradient(top,#d9edf7 0,#c4e3f3 100%);background-image:-o-linear-gradient(top,#d9edf7 0,#c4e3f3 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#d9edf7),to(#c4e3f3));background-image:linear-gradient(to bottom,#d9edf7 0,#c4e3f3 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffc4e3f3', GradientType=0);background-repeat:repeat-x}.panel-warning>.panel-heading{background-image:-webkit-linear-gradient(top,#fcf8e3 0,#faf2cc 100%);background-image:-o-linear-gradient(top,#fcf8e3 0,#faf2cc 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#fcf8e3),to(#faf2cc));background-image:linear-gradient(to bottom,#fcf8e3 0,#faf2cc 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fffaf2cc', GradientType=0);background-repeat:repeat-x}.panel-danger>.panel-heading{background-image:-webkit-linear-gradient(top,#f2dede 0,#ebcccc 100%);background-image:-o-linear-gradient(top,#f2dede 0,#ebcccc 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f2dede),to(#ebcccc));background-image:linear-gradient(to bottom,#f2dede 0,#ebcccc 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffebcccc', GradientType=0);background-repeat:repeat-x}.well{background-image:-webkit-linear-gradient(top,#e8e8e8 0,#f5f5f5 100%);background-image:-o-linear-gradient(top,#e8e8e8 0,#f5f5f5 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#e8e8e8),to(#f5f5f5));background-image:linear-gradient(to bottom,#e8e8e8 0,#f5f5f5 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffe8e8e8', endColorstr='#fff5f5f5', GradientType=0);background-repeat:repeat-x;border-color:#dcdcdc;-webkit-box-shadow:inset 0 1px 3px rgba(0,0,0,.05),0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px 3px rgba(0,0,0,.05),0 1px 0 rgba(255,255,255,.1)} \ No newline at end of file diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/demultiplexing/html/bootstrap3/css/bootstrap.css b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/demultiplexing/html/bootstrap3/css/bootstrap.css deleted file mode 100644 index 037dd0561510db605878e08bc9b513d79ffc9782..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/demultiplexing/html/bootstrap3/css/bootstrap.css +++ /dev/null @@ -1,6203 +0,0 @@ -/*! - * Bootstrap v3.2.0 (http://getbootstrap.com) - * Copyright 2011-2014 Twitter, Inc. - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) - */ - -/*! normalize.css v3.0.1 | MIT License | git.io/normalize */ -html { - font-family: sans-serif; - -webkit-text-size-adjust: 100%; - -ms-text-size-adjust: 100%; -} -body { - margin: 0; -} -article, -aside, -details, -figcaption, -figure, -footer, -header, -hgroup, -main, -nav, -section, -summary { - display: block; -} -audio, -canvas, -progress, -video { - display: inline-block; - vertical-align: baseline; -} -audio:not([controls]) { - display: none; - height: 0; -} -[hidden], -template { - display: none; -} -a { - background: transparent; -} -a:active, -a:hover { - outline: 0; -} -abbr[title] { - border-bottom: 1px dotted; -} -b, -strong { - font-weight: bold; -} -dfn { - font-style: italic; -} -h1 { - margin: .67em 0; - font-size: 2em; -} -mark { - color: #000; - background: #ff0; -} -small { - font-size: 80%; -} -sub, -sup { - position: relative; - font-size: 75%; - line-height: 0; - vertical-align: baseline; -} -sup { - top: -.5em; -} -sub { - bottom: -.25em; -} -img { - border: 0; -} -svg:not(:root) { - overflow: hidden; -} -figure { - margin: 1em 40px; -} -hr { - height: 0; - -webkit-box-sizing: content-box; - -moz-box-sizing: content-box; - box-sizing: content-box; -} -pre { - overflow: auto; -} -code, -kbd, -pre, -samp { - font-family: monospace, monospace; - font-size: 1em; -} -button, -input, -optgroup, -select, -textarea { - margin: 0; - font: inherit; - color: inherit; -} -button { - overflow: visible; -} -button, -select { - text-transform: none; -} -button, -html input[type="button"], -input[type="reset"], -input[type="submit"] { - -webkit-appearance: button; - cursor: pointer; -} -button[disabled], -html input[disabled] { - cursor: default; -} -button::-moz-focus-inner, -input::-moz-focus-inner { - padding: 0; - border: 0; -} -input { - line-height: normal; -} -input[type="checkbox"], -input[type="radio"] { - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; - padding: 0; -} -input[type="number"]::-webkit-inner-spin-button, -input[type="number"]::-webkit-outer-spin-button { - height: auto; -} -input[type="search"] { - -webkit-box-sizing: content-box; - -moz-box-sizing: content-box; - box-sizing: content-box; - -webkit-appearance: textfield; -} -input[type="search"]::-webkit-search-cancel-button, -input[type="search"]::-webkit-search-decoration { - -webkit-appearance: none; -} -fieldset { - padding: .35em .625em .75em; - margin: 0 2px; - border: 1px solid #c0c0c0; -} -legend { - padding: 0; - border: 0; -} -textarea { - overflow: auto; -} -optgroup { - font-weight: bold; -} -table { - border-spacing: 0; - border-collapse: collapse; -} -td, -th { - padding: 0; -} -@media print { - * { - color: #000 !important; - text-shadow: none !important; - background: transparent !important; - -webkit-box-shadow: none !important; - box-shadow: none !important; - } - a, - a:visited { - text-decoration: underline; - } - a[href]:after { - content: " (" attr(href) ")"; - } - abbr[title]:after { - content: " (" attr(title) ")"; - } - a[href^="javascript:"]:after, - a[href^="#"]:after { - content: ""; - } - pre, - blockquote { - border: 1px solid #999; - - page-break-inside: avoid; - } - thead { - display: table-header-group; - } - tr, - img { - page-break-inside: avoid; - } - img { - max-width: 100% !important; - } - p, - h2, - h3 { - orphans: 3; - widows: 3; - } - h2, - h3 { - page-break-after: avoid; - } - select { - background: #fff !important; - } - .navbar { - display: none; - } - .table td, - .table th { - background-color: #fff !important; - } - .btn > .caret, - .dropup > .btn > .caret { - border-top-color: #000 !important; - } - .label { - border: 1px solid #000; - } - .table { - border-collapse: collapse !important; - } - .table-bordered th, - .table-bordered td { - border: 1px solid #ddd !important; - } -} -@font-face { - font-family: 'Glyphicons Halflings'; - - src: url('../fonts/glyphicons-halflings-regular.eot'); - src: url('../fonts/glyphicons-halflings-regular.eot?#iefix') format('embedded-opentype'), url('../fonts/glyphicons-halflings-regular.woff') format('woff'), url('../fonts/glyphicons-halflings-regular.ttf') format('truetype'), url('../fonts/glyphicons-halflings-regular.svg#glyphicons_halflingsregular') format('svg'); -} -.glyphicon { - position: relative; - top: 1px; - display: inline-block; - font-family: 'Glyphicons Halflings'; - font-style: normal; - font-weight: normal; - line-height: 1; - - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; -} -.glyphicon-asterisk:before { - content: "\2a"; -} -.glyphicon-plus:before { - content: "\2b"; -} -.glyphicon-euro:before { - content: "\20ac"; -} -.glyphicon-minus:before { - content: "\2212"; -} -.glyphicon-cloud:before { - content: "\2601"; -} -.glyphicon-envelope:before { - content: "\2709"; -} -.glyphicon-pencil:before { - content: "\270f"; -} -.glyphicon-glass:before { - content: "\e001"; -} -.glyphicon-music:before { - content: "\e002"; -} -.glyphicon-search:before { - content: "\e003"; -} -.glyphicon-heart:before { - content: "\e005"; -} -.glyphicon-star:before { - content: "\e006"; -} -.glyphicon-star-empty:before { - content: "\e007"; -} -.glyphicon-user:before { - content: "\e008"; -} -.glyphicon-film:before { - content: "\e009"; -} -.glyphicon-th-large:before { - content: "\e010"; -} -.glyphicon-th:before { - content: "\e011"; -} -.glyphicon-th-list:before { - content: "\e012"; -} -.glyphicon-ok:before { - content: "\e013"; -} -.glyphicon-remove:before { - content: "\e014"; -} -.glyphicon-zoom-in:before { - content: "\e015"; -} -.glyphicon-zoom-out:before { - content: "\e016"; -} -.glyphicon-off:before { - content: "\e017"; -} -.glyphicon-signal:before { - content: "\e018"; -} -.glyphicon-cog:before { - content: "\e019"; -} -.glyphicon-trash:before { - content: "\e020"; -} -.glyphicon-home:before { - content: "\e021"; -} -.glyphicon-file:before { - content: "\e022"; -} -.glyphicon-time:before { - content: "\e023"; -} -.glyphicon-road:before { - content: "\e024"; -} -.glyphicon-download-alt:before { - content: "\e025"; -} -.glyphicon-download:before { - content: "\e026"; -} -.glyphicon-upload:before { - content: "\e027"; -} -.glyphicon-inbox:before { - content: "\e028"; -} -.glyphicon-play-circle:before { - content: "\e029"; -} -.glyphicon-repeat:before { - content: "\e030"; -} -.glyphicon-refresh:before { - content: "\e031"; -} -.glyphicon-list-alt:before { - content: "\e032"; -} -.glyphicon-lock:before { - content: "\e033"; -} -.glyphicon-flag:before { - content: "\e034"; -} -.glyphicon-headphones:before { - content: "\e035"; -} -.glyphicon-volume-off:before { - content: "\e036"; -} -.glyphicon-volume-down:before { - content: "\e037"; -} -.glyphicon-volume-up:before { - content: "\e038"; -} -.glyphicon-qrcode:before { - content: "\e039"; -} -.glyphicon-barcode:before { - content: "\e040"; -} -.glyphicon-tag:before { - content: "\e041"; -} -.glyphicon-tags:before { - content: "\e042"; -} -.glyphicon-book:before { - content: "\e043"; -} -.glyphicon-bookmark:before { - content: "\e044"; -} -.glyphicon-print:before { - content: "\e045"; -} -.glyphicon-camera:before { - content: "\e046"; -} -.glyphicon-font:before { - content: "\e047"; -} -.glyphicon-bold:before { - content: "\e048"; -} -.glyphicon-italic:before { - content: "\e049"; -} -.glyphicon-text-height:before { - content: "\e050"; -} -.glyphicon-text-width:before { - content: "\e051"; -} -.glyphicon-align-left:before { - content: "\e052"; -} -.glyphicon-align-center:before { - content: "\e053"; -} -.glyphicon-align-right:before { - content: "\e054"; -} -.glyphicon-align-justify:before { - content: "\e055"; -} -.glyphicon-list:before { - content: "\e056"; -} -.glyphicon-indent-left:before { - content: "\e057"; -} -.glyphicon-indent-right:before { - content: "\e058"; -} -.glyphicon-facetime-video:before { - content: "\e059"; -} -.glyphicon-picture:before { - content: "\e060"; -} -.glyphicon-map-marker:before { - content: "\e062"; -} -.glyphicon-adjust:before { - content: "\e063"; -} -.glyphicon-tint:before { - content: "\e064"; -} -.glyphicon-edit:before { - content: "\e065"; -} -.glyphicon-share:before { - content: "\e066"; -} -.glyphicon-check:before { - content: "\e067"; -} -.glyphicon-move:before { - content: "\e068"; -} -.glyphicon-step-backward:before { - content: "\e069"; -} -.glyphicon-fast-backward:before { - content: "\e070"; -} -.glyphicon-backward:before { - content: "\e071"; -} -.glyphicon-play:before { - content: "\e072"; -} -.glyphicon-pause:before { - content: "\e073"; -} -.glyphicon-stop:before { - content: "\e074"; -} -.glyphicon-forward:before { - content: "\e075"; -} -.glyphicon-fast-forward:before { - content: "\e076"; -} -.glyphicon-step-forward:before { - content: "\e077"; -} -.glyphicon-eject:before { - content: "\e078"; -} -.glyphicon-chevron-left:before { - content: "\e079"; -} -.glyphicon-chevron-right:before { - content: "\e080"; -} -.glyphicon-plus-sign:before { - content: "\e081"; -} -.glyphicon-minus-sign:before { - content: "\e082"; -} -.glyphicon-remove-sign:before { - content: "\e083"; -} -.glyphicon-ok-sign:before { - content: "\e084"; -} -.glyphicon-question-sign:before { - content: "\e085"; -} -.glyphicon-info-sign:before { - content: "\e086"; -} -.glyphicon-screenshot:before { - content: "\e087"; -} -.glyphicon-remove-circle:before { - content: "\e088"; -} -.glyphicon-ok-circle:before { - content: "\e089"; -} -.glyphicon-ban-circle:before { - content: "\e090"; -} -.glyphicon-arrow-left:before { - content: "\e091"; -} -.glyphicon-arrow-right:before { - content: "\e092"; -} -.glyphicon-arrow-up:before { - content: "\e093"; -} -.glyphicon-arrow-down:before { - content: "\e094"; -} -.glyphicon-share-alt:before { - content: "\e095"; -} -.glyphicon-resize-full:before { - content: "\e096"; -} -.glyphicon-resize-small:before { - content: "\e097"; -} -.glyphicon-exclamation-sign:before { - content: "\e101"; -} -.glyphicon-gift:before { - content: "\e102"; -} -.glyphicon-leaf:before { - content: "\e103"; -} -.glyphicon-fire:before { - content: "\e104"; -} -.glyphicon-eye-open:before { - content: "\e105"; -} -.glyphicon-eye-close:before { - content: "\e106"; -} -.glyphicon-warning-sign:before { - content: "\e107"; -} -.glyphicon-plane:before { - content: "\e108"; -} -.glyphicon-calendar:before { - content: "\e109"; -} -.glyphicon-random:before { - content: "\e110"; -} -.glyphicon-comment:before { - content: "\e111"; -} -.glyphicon-magnet:before { - content: "\e112"; -} -.glyphicon-chevron-up:before { - content: "\e113"; -} -.glyphicon-chevron-down:before { - content: "\e114"; -} -.glyphicon-retweet:before { - content: "\e115"; -} -.glyphicon-shopping-cart:before { - content: "\e116"; -} -.glyphicon-folder-close:before { - content: "\e117"; -} -.glyphicon-folder-open:before { - content: "\e118"; -} -.glyphicon-resize-vertical:before { - content: "\e119"; -} -.glyphicon-resize-horizontal:before { - content: "\e120"; -} -.glyphicon-hdd:before { - content: "\e121"; -} -.glyphicon-bullhorn:before { - content: "\e122"; -} -.glyphicon-bell:before { - content: "\e123"; -} -.glyphicon-certificate:before { - content: "\e124"; -} -.glyphicon-thumbs-up:before { - content: "\e125"; -} -.glyphicon-thumbs-down:before { - content: "\e126"; -} -.glyphicon-hand-right:before { - content: "\e127"; -} -.glyphicon-hand-left:before { - content: "\e128"; -} -.glyphicon-hand-up:before { - content: "\e129"; -} -.glyphicon-hand-down:before { - content: "\e130"; -} -.glyphicon-circle-arrow-right:before { - content: "\e131"; -} -.glyphicon-circle-arrow-left:before { - content: "\e132"; -} -.glyphicon-circle-arrow-up:before { - content: "\e133"; -} -.glyphicon-circle-arrow-down:before { - content: "\e134"; -} -.glyphicon-globe:before { - content: "\e135"; -} -.glyphicon-wrench:before { - content: "\e136"; -} -.glyphicon-tasks:before { - content: "\e137"; -} -.glyphicon-filter:before { - content: "\e138"; -} -.glyphicon-briefcase:before { - content: "\e139"; -} -.glyphicon-fullscreen:before { - content: "\e140"; -} -.glyphicon-dashboard:before { - content: "\e141"; -} -.glyphicon-paperclip:before { - content: "\e142"; -} -.glyphicon-heart-empty:before { - content: "\e143"; -} -.glyphicon-link:before { - content: "\e144"; -} -.glyphicon-phone:before { - content: "\e145"; -} -.glyphicon-pushpin:before { - content: "\e146"; -} -.glyphicon-usd:before { - content: "\e148"; -} -.glyphicon-gbp:before { - content: "\e149"; -} -.glyphicon-sort:before { - content: "\e150"; -} -.glyphicon-sort-by-alphabet:before { - content: "\e151"; -} -.glyphicon-sort-by-alphabet-alt:before { - content: "\e152"; -} -.glyphicon-sort-by-order:before { - content: "\e153"; -} -.glyphicon-sort-by-order-alt:before { - content: "\e154"; -} -.glyphicon-sort-by-attributes:before { - content: "\e155"; -} -.glyphicon-sort-by-attributes-alt:before { - content: "\e156"; -} -.glyphicon-unchecked:before { - content: "\e157"; -} -.glyphicon-expand:before { - content: "\e158"; -} -.glyphicon-collapse-down:before { - content: "\e159"; -} -.glyphicon-collapse-up:before { - content: "\e160"; -} -.glyphicon-log-in:before { - content: "\e161"; -} -.glyphicon-flash:before { - content: "\e162"; -} -.glyphicon-log-out:before { - content: "\e163"; -} -.glyphicon-new-window:before { - content: "\e164"; -} -.glyphicon-record:before { - content: "\e165"; -} -.glyphicon-save:before { - content: "\e166"; -} -.glyphicon-open:before { - content: "\e167"; -} -.glyphicon-saved:before { - content: "\e168"; -} -.glyphicon-import:before { - content: "\e169"; -} -.glyphicon-export:before { - content: "\e170"; -} -.glyphicon-send:before { - content: "\e171"; -} -.glyphicon-floppy-disk:before { - content: "\e172"; -} -.glyphicon-floppy-saved:before { - content: "\e173"; -} -.glyphicon-floppy-remove:before { - content: "\e174"; -} -.glyphicon-floppy-save:before { - content: "\e175"; -} -.glyphicon-floppy-open:before { - content: "\e176"; -} -.glyphicon-credit-card:before { - content: "\e177"; -} -.glyphicon-transfer:before { - content: "\e178"; -} -.glyphicon-cutlery:before { - content: "\e179"; -} -.glyphicon-header:before { - content: "\e180"; -} -.glyphicon-compressed:before { - content: "\e181"; -} -.glyphicon-earphone:before { - content: "\e182"; -} -.glyphicon-phone-alt:before { - content: "\e183"; -} -.glyphicon-tower:before { - content: "\e184"; -} -.glyphicon-stats:before { - content: "\e185"; -} -.glyphicon-sd-video:before { - content: "\e186"; -} -.glyphicon-hd-video:before { - content: "\e187"; -} -.glyphicon-subtitles:before { - content: "\e188"; -} -.glyphicon-sound-stereo:before { - content: "\e189"; -} -.glyphicon-sound-dolby:before { - content: "\e190"; -} -.glyphicon-sound-5-1:before { - content: "\e191"; -} -.glyphicon-sound-6-1:before { - content: "\e192"; -} -.glyphicon-sound-7-1:before { - content: "\e193"; -} -.glyphicon-copyright-mark:before { - content: "\e194"; -} -.glyphicon-registration-mark:before { - content: "\e195"; -} -.glyphicon-cloud-download:before { - content: "\e197"; -} -.glyphicon-cloud-upload:before { - content: "\e198"; -} -.glyphicon-tree-conifer:before { - content: "\e199"; -} -.glyphicon-tree-deciduous:before { - content: "\e200"; -} -* { - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; -} -*:before, -*:after { - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; -} -html { - font-size: 10px; - - -webkit-tap-highlight-color: rgba(0, 0, 0, 0); -} -body { - font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; - font-size: 14px; - line-height: 1.42857143; - color: #333; - background-color: #fff; -} -input, -button, -select, -textarea { - font-family: inherit; - font-size: inherit; - line-height: inherit; -} -a { - color: #428bca; - text-decoration: none; -} -a:hover, -a:focus { - color: #2a6496; - text-decoration: underline; -} -a:focus { - outline: thin dotted; - outline: 5px auto -webkit-focus-ring-color; - outline-offset: -2px; -} -figure { - margin: 0; -} -img { - vertical-align: middle; -} -.img-responsive, -.thumbnail > img, -.thumbnail a > img, -.carousel-inner > .item > img, -.carousel-inner > .item > a > img { - display: block; - width: 100% \9; - max-width: 100%; - height: auto; -} -.img-rounded { - border-radius: 6px; -} -.img-thumbnail { - display: inline-block; - width: 100% \9; - max-width: 100%; - height: auto; - padding: 4px; - line-height: 1.42857143; - background-color: #fff; - border: 1px solid #ddd; - border-radius: 4px; - -webkit-transition: all .2s ease-in-out; - -o-transition: all .2s ease-in-out; - transition: all .2s ease-in-out; -} -.img-circle { - border-radius: 50%; -} -hr { - margin-top: 20px; - margin-bottom: 20px; - border: 0; - border-top: 1px solid #eee; -} -.sr-only { - position: absolute; - width: 1px; - height: 1px; - padding: 0; - margin: -1px; - overflow: hidden; - clip: rect(0, 0, 0, 0); - border: 0; -} -.sr-only-focusable:active, -.sr-only-focusable:focus { - position: static; - width: auto; - height: auto; - margin: 0; - overflow: visible; - clip: auto; -} -h1, -h2, -h3, -h4, -h5, -h6, -.h1, -.h2, -.h3, -.h4, -.h5, -.h6 { - font-family: inherit; - font-weight: 500; - line-height: 1.1; - color: inherit; -} -h1 small, -h2 small, -h3 small, -h4 small, -h5 small, -h6 small, -.h1 small, -.h2 small, -.h3 small, -.h4 small, -.h5 small, -.h6 small, -h1 .small, -h2 .small, -h3 .small, -h4 .small, -h5 .small, -h6 .small, -.h1 .small, -.h2 .small, -.h3 .small, -.h4 .small, -.h5 .small, -.h6 .small { - font-weight: normal; - line-height: 1; - color: #777; -} -h1, -.h1, -h2, -.h2, -h3, -.h3 { - margin-top: 20px; - margin-bottom: 10px; -} -h1 small, -.h1 small, -h2 small, -.h2 small, -h3 small, -.h3 small, -h1 .small, -.h1 .small, -h2 .small, -.h2 .small, -h3 .small, -.h3 .small { - font-size: 65%; -} -h4, -.h4, -h5, -.h5, -h6, -.h6 { - margin-top: 10px; - margin-bottom: 10px; -} -h4 small, -.h4 small, -h5 small, -.h5 small, -h6 small, -.h6 small, -h4 .small, -.h4 .small, -h5 .small, -.h5 .small, -h6 .small, -.h6 .small { - font-size: 75%; -} -h1, -.h1 { - font-size: 36px; -} -h2, -.h2 { - font-size: 30px; -} -h3, -.h3 { - font-size: 24px; -} -h4, -.h4 { - font-size: 18px; -} -h5, -.h5 { - font-size: 14px; -} -h6, -.h6 { - font-size: 12px; -} -p { - margin: 0 0 10px; -} -.lead { - margin-bottom: 20px; - font-size: 16px; - font-weight: 300; - line-height: 1.4; -} -@media (min-width: 768px) { - .lead { - font-size: 21px; - } -} -small, -.small { - font-size: 85%; -} -cite { - font-style: normal; -} -mark, -.mark { - padding: .2em; - background-color: #fcf8e3; -} -.text-left { - text-align: left; -} -.text-right { - text-align: right; -} -.text-center { - text-align: center; -} -.text-justify { - text-align: justify; -} -.text-nowrap { - white-space: nowrap; -} -.text-lowercase { - text-transform: lowercase; -} -.text-uppercase { - text-transform: uppercase; -} -.text-capitalize { - text-transform: capitalize; -} -.text-muted { - color: #777; -} -.text-primary { - color: #428bca; -} -a.text-primary:hover { - color: #3071a9; -} -.text-success { - color: #3c763d; -} -a.text-success:hover { - color: #2b542c; -} -.text-info { - color: #31708f; -} -a.text-info:hover { - color: #245269; -} -.text-warning { - color: #8a6d3b; -} -a.text-warning:hover { - color: #66512c; -} -.text-danger { - color: #a94442; -} -a.text-danger:hover { - color: #843534; -} -.bg-primary { - color: #fff; - background-color: #428bca; -} -a.bg-primary:hover { - background-color: #3071a9; -} -.bg-success { - background-color: #dff0d8; -} -a.bg-success:hover { - background-color: #c1e2b3; -} -.bg-info { - background-color: #d9edf7; -} -a.bg-info:hover { - background-color: #afd9ee; -} -.bg-warning { - background-color: #fcf8e3; -} -a.bg-warning:hover { - background-color: #f7ecb5; -} -.bg-danger { - background-color: #f2dede; -} -a.bg-danger:hover { - background-color: #e4b9b9; -} -.page-header { - padding-bottom: 9px; - margin: 40px 0 20px; - border-bottom: 1px solid #eee; -} -ul, -ol { - margin-top: 0; - margin-bottom: 10px; -} -ul ul, -ol ul, -ul ol, -ol ol { - margin-bottom: 0; -} -.list-unstyled { - padding-left: 0; - list-style: none; -} -.list-inline { - padding-left: 0; - margin-left: -5px; - list-style: none; -} -.list-inline > li { - display: inline-block; - padding-right: 5px; - padding-left: 5px; -} -dl { - margin-top: 0; - margin-bottom: 20px; -} -dt, -dd { - line-height: 1.42857143; -} -dt { - font-weight: bold; -} -dd { - margin-left: 0; -} -@media (min-width: 768px) { - .dl-horizontal dt { - float: left; - width: 160px; - overflow: hidden; - clear: left; - text-align: right; - text-overflow: ellipsis; - white-space: nowrap; - } - .dl-horizontal dd { - margin-left: 180px; - } -} -abbr[title], -abbr[data-original-title] { - cursor: help; - border-bottom: 1px dotted #777; -} -.initialism { - font-size: 90%; - text-transform: uppercase; -} -blockquote { - padding: 10px 20px; - margin: 0 0 20px; - font-size: 17.5px; - border-left: 5px solid #eee; -} -blockquote p:last-child, -blockquote ul:last-child, -blockquote ol:last-child { - margin-bottom: 0; -} -blockquote footer, -blockquote small, -blockquote .small { - display: block; - font-size: 80%; - line-height: 1.42857143; - color: #777; -} -blockquote footer:before, -blockquote small:before, -blockquote .small:before { - content: '\2014 \00A0'; -} -.blockquote-reverse, -blockquote.pull-right { - padding-right: 15px; - padding-left: 0; - text-align: right; - border-right: 5px solid #eee; - border-left: 0; -} -.blockquote-reverse footer:before, -blockquote.pull-right footer:before, -.blockquote-reverse small:before, -blockquote.pull-right small:before, -.blockquote-reverse .small:before, -blockquote.pull-right .small:before { - content: ''; -} -.blockquote-reverse footer:after, -blockquote.pull-right footer:after, -.blockquote-reverse small:after, -blockquote.pull-right small:after, -.blockquote-reverse .small:after, -blockquote.pull-right .small:after { - content: '\00A0 \2014'; -} -blockquote:before, -blockquote:after { - content: ""; -} -address { - margin-bottom: 20px; - font-style: normal; - line-height: 1.42857143; -} -code, -kbd, -pre, -samp { - font-family: Menlo, Monaco, Consolas, "Courier New", monospace; -} -code { - padding: 2px 4px; - font-size: 90%; - color: #c7254e; - background-color: #f9f2f4; - border-radius: 4px; -} -kbd { - padding: 2px 4px; - font-size: 90%; - color: #fff; - background-color: #333; - border-radius: 3px; - -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, .25); - box-shadow: inset 0 -1px 0 rgba(0, 0, 0, .25); -} -kbd kbd { - padding: 0; - font-size: 100%; - -webkit-box-shadow: none; - box-shadow: none; -} -pre { - display: block; - padding: 9.5px; - margin: 0 0 10px; - font-size: 13px; - line-height: 1.42857143; - color: #333; - word-break: break-all; - word-wrap: break-word; - background-color: #f5f5f5; - border: 1px solid #ccc; - border-radius: 4px; -} -pre code { - padding: 0; - font-size: inherit; - color: inherit; - white-space: pre-wrap; - background-color: transparent; - border-radius: 0; -} -.pre-scrollable { - max-height: 340px; - overflow-y: scroll; -} -.container { - padding-right: 15px; - padding-left: 15px; - margin-right: auto; - margin-left: auto; -} -@media (min-width: 768px) { - .container { - width: 750px; - } -} -@media (min-width: 992px) { - .container { - width: 970px; - } -} -@media (min-width: 1200px) { - .container { - width: 1170px; - } -} -.container-fluid { - padding-right: 15px; - padding-left: 15px; - margin-right: auto; - margin-left: auto; -} -.row { - margin-right: -15px; - margin-left: -15px; -} -.col-xs-1, .col-sm-1, .col-md-1, .col-lg-1, .col-xs-2, .col-sm-2, .col-md-2, .col-lg-2, .col-xs-3, .col-sm-3, .col-md-3, .col-lg-3, .col-xs-4, .col-sm-4, .col-md-4, .col-lg-4, .col-xs-5, .col-sm-5, .col-md-5, .col-lg-5, .col-xs-6, .col-sm-6, .col-md-6, .col-lg-6, .col-xs-7, .col-sm-7, .col-md-7, .col-lg-7, .col-xs-8, .col-sm-8, .col-md-8, .col-lg-8, .col-xs-9, .col-sm-9, .col-md-9, .col-lg-9, .col-xs-10, .col-sm-10, .col-md-10, .col-lg-10, .col-xs-11, .col-sm-11, .col-md-11, .col-lg-11, .col-xs-12, .col-sm-12, .col-md-12, .col-lg-12 { - position: relative; - min-height: 1px; - padding-right: 15px; - padding-left: 15px; -} -.col-xs-1, .col-xs-2, .col-xs-3, .col-xs-4, .col-xs-5, .col-xs-6, .col-xs-7, .col-xs-8, .col-xs-9, .col-xs-10, .col-xs-11, .col-xs-12 { - float: left; -} -.col-xs-12 { - width: 100%; -} -.col-xs-11 { - width: 91.66666667%; -} -.col-xs-10 { - width: 83.33333333%; -} -.col-xs-9 { - width: 75%; -} -.col-xs-8 { - width: 66.66666667%; -} -.col-xs-7 { - width: 58.33333333%; -} -.col-xs-6 { - width: 50%; -} -.col-xs-5 { - width: 41.66666667%; -} -.col-xs-4 { - width: 33.33333333%; -} -.col-xs-3 { - width: 25%; -} -.col-xs-2 { - width: 16.66666667%; -} -.col-xs-1 { - width: 8.33333333%; -} -.col-xs-pull-12 { - right: 100%; -} -.col-xs-pull-11 { - right: 91.66666667%; -} -.col-xs-pull-10 { - right: 83.33333333%; -} -.col-xs-pull-9 { - right: 75%; -} -.col-xs-pull-8 { - right: 66.66666667%; -} -.col-xs-pull-7 { - right: 58.33333333%; -} -.col-xs-pull-6 { - right: 50%; -} -.col-xs-pull-5 { - right: 41.66666667%; -} -.col-xs-pull-4 { - right: 33.33333333%; -} -.col-xs-pull-3 { - right: 25%; -} -.col-xs-pull-2 { - right: 16.66666667%; -} -.col-xs-pull-1 { - right: 8.33333333%; -} -.col-xs-pull-0 { - right: auto; -} -.col-xs-push-12 { - left: 100%; -} -.col-xs-push-11 { - left: 91.66666667%; -} -.col-xs-push-10 { - left: 83.33333333%; -} -.col-xs-push-9 { - left: 75%; -} -.col-xs-push-8 { - left: 66.66666667%; -} -.col-xs-push-7 { - left: 58.33333333%; -} -.col-xs-push-6 { - left: 50%; -} -.col-xs-push-5 { - left: 41.66666667%; -} -.col-xs-push-4 { - left: 33.33333333%; -} -.col-xs-push-3 { - left: 25%; -} -.col-xs-push-2 { - left: 16.66666667%; -} -.col-xs-push-1 { - left: 8.33333333%; -} -.col-xs-push-0 { - left: auto; -} -.col-xs-offset-12 { - margin-left: 100%; -} -.col-xs-offset-11 { - margin-left: 91.66666667%; -} -.col-xs-offset-10 { - margin-left: 83.33333333%; -} -.col-xs-offset-9 { - margin-left: 75%; -} -.col-xs-offset-8 { - margin-left: 66.66666667%; -} -.col-xs-offset-7 { - margin-left: 58.33333333%; -} -.col-xs-offset-6 { - margin-left: 50%; -} -.col-xs-offset-5 { - margin-left: 41.66666667%; -} -.col-xs-offset-4 { - margin-left: 33.33333333%; -} -.col-xs-offset-3 { - margin-left: 25%; -} -.col-xs-offset-2 { - margin-left: 16.66666667%; -} -.col-xs-offset-1 { - margin-left: 8.33333333%; -} -.col-xs-offset-0 { - margin-left: 0; -} -@media (min-width: 768px) { - .col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12 { - float: left; - } - .col-sm-12 { - width: 100%; - } - .col-sm-11 { - width: 91.66666667%; - } - .col-sm-10 { - width: 83.33333333%; - } - .col-sm-9 { - width: 75%; - } - .col-sm-8 { - width: 66.66666667%; - } - .col-sm-7 { - width: 58.33333333%; - } - .col-sm-6 { - width: 50%; - } - .col-sm-5 { - width: 41.66666667%; - } - .col-sm-4 { - width: 33.33333333%; - } - .col-sm-3 { - width: 25%; - } - .col-sm-2 { - width: 16.66666667%; - } - .col-sm-1 { - width: 8.33333333%; - } - .col-sm-pull-12 { - right: 100%; - } - .col-sm-pull-11 { - right: 91.66666667%; - } - .col-sm-pull-10 { - right: 83.33333333%; - } - .col-sm-pull-9 { - right: 75%; - } - .col-sm-pull-8 { - right: 66.66666667%; - } - .col-sm-pull-7 { - right: 58.33333333%; - } - .col-sm-pull-6 { - right: 50%; - } - .col-sm-pull-5 { - right: 41.66666667%; - } - .col-sm-pull-4 { - right: 33.33333333%; - } - .col-sm-pull-3 { - right: 25%; - } - .col-sm-pull-2 { - right: 16.66666667%; - } - .col-sm-pull-1 { - right: 8.33333333%; - } - .col-sm-pull-0 { - right: auto; - } - .col-sm-push-12 { - left: 100%; - } - .col-sm-push-11 { - left: 91.66666667%; - } - .col-sm-push-10 { - left: 83.33333333%; - } - .col-sm-push-9 { - left: 75%; - } - .col-sm-push-8 { - left: 66.66666667%; - } - .col-sm-push-7 { - left: 58.33333333%; - } - .col-sm-push-6 { - left: 50%; - } - .col-sm-push-5 { - left: 41.66666667%; - } - .col-sm-push-4 { - left: 33.33333333%; - } - .col-sm-push-3 { - left: 25%; - } - .col-sm-push-2 { - left: 16.66666667%; - } - .col-sm-push-1 { - left: 8.33333333%; - } - .col-sm-push-0 { - left: auto; - } - .col-sm-offset-12 { - margin-left: 100%; - } - .col-sm-offset-11 { - margin-left: 91.66666667%; - } - .col-sm-offset-10 { - margin-left: 83.33333333%; - } - .col-sm-offset-9 { - margin-left: 75%; - } - .col-sm-offset-8 { - margin-left: 66.66666667%; - } - .col-sm-offset-7 { - margin-left: 58.33333333%; - } - .col-sm-offset-6 { - margin-left: 50%; - } - .col-sm-offset-5 { - margin-left: 41.66666667%; - } - .col-sm-offset-4 { - margin-left: 33.33333333%; - } - .col-sm-offset-3 { - margin-left: 25%; - } - .col-sm-offset-2 { - margin-left: 16.66666667%; - } - .col-sm-offset-1 { - margin-left: 8.33333333%; - } - .col-sm-offset-0 { - margin-left: 0; - } -} -@media (min-width: 992px) { - .col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12 { - float: left; - } - .col-md-12 { - width: 100%; - } - .col-md-11 { - width: 91.66666667%; - } - .col-md-10 { - width: 83.33333333%; - } - .col-md-9 { - width: 75%; - } - .col-md-8 { - width: 66.66666667%; - } - .col-md-7 { - width: 58.33333333%; - } - .col-md-6 { - width: 50%; - } - .col-md-5 { - width: 41.66666667%; - } - .col-md-4 { - width: 33.33333333%; - } - .col-md-3 { - width: 25%; - } - .col-md-2 { - width: 16.66666667%; - } - .col-md-1 { - width: 8.33333333%; - } - .col-md-pull-12 { - right: 100%; - } - .col-md-pull-11 { - right: 91.66666667%; - } - .col-md-pull-10 { - right: 83.33333333%; - } - .col-md-pull-9 { - right: 75%; - } - .col-md-pull-8 { - right: 66.66666667%; - } - .col-md-pull-7 { - right: 58.33333333%; - } - .col-md-pull-6 { - right: 50%; - } - .col-md-pull-5 { - right: 41.66666667%; - } - .col-md-pull-4 { - right: 33.33333333%; - } - .col-md-pull-3 { - right: 25%; - } - .col-md-pull-2 { - right: 16.66666667%; - } - .col-md-pull-1 { - right: 8.33333333%; - } - .col-md-pull-0 { - right: auto; - } - .col-md-push-12 { - left: 100%; - } - .col-md-push-11 { - left: 91.66666667%; - } - .col-md-push-10 { - left: 83.33333333%; - } - .col-md-push-9 { - left: 75%; - } - .col-md-push-8 { - left: 66.66666667%; - } - .col-md-push-7 { - left: 58.33333333%; - } - .col-md-push-6 { - left: 50%; - } - .col-md-push-5 { - left: 41.66666667%; - } - .col-md-push-4 { - left: 33.33333333%; - } - .col-md-push-3 { - left: 25%; - } - .col-md-push-2 { - left: 16.66666667%; - } - .col-md-push-1 { - left: 8.33333333%; - } - .col-md-push-0 { - left: auto; - } - .col-md-offset-12 { - margin-left: 100%; - } - .col-md-offset-11 { - margin-left: 91.66666667%; - } - .col-md-offset-10 { - margin-left: 83.33333333%; - } - .col-md-offset-9 { - margin-left: 75%; - } - .col-md-offset-8 { - margin-left: 66.66666667%; - } - .col-md-offset-7 { - margin-left: 58.33333333%; - } - .col-md-offset-6 { - margin-left: 50%; - } - .col-md-offset-5 { - margin-left: 41.66666667%; - } - .col-md-offset-4 { - margin-left: 33.33333333%; - } - .col-md-offset-3 { - margin-left: 25%; - } - .col-md-offset-2 { - margin-left: 16.66666667%; - } - .col-md-offset-1 { - margin-left: 8.33333333%; - } - .col-md-offset-0 { - margin-left: 0; - } -} -@media (min-width: 1200px) { - .col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12 { - float: left; - } - .col-lg-12 { - width: 100%; - } - .col-lg-11 { - width: 91.66666667%; - } - .col-lg-10 { - width: 83.33333333%; - } - .col-lg-9 { - width: 75%; - } - .col-lg-8 { - width: 66.66666667%; - } - .col-lg-7 { - width: 58.33333333%; - } - .col-lg-6 { - width: 50%; - } - .col-lg-5 { - width: 41.66666667%; - } - .col-lg-4 { - width: 33.33333333%; - } - .col-lg-3 { - width: 25%; - } - .col-lg-2 { - width: 16.66666667%; - } - .col-lg-1 { - width: 8.33333333%; - } - .col-lg-pull-12 { - right: 100%; - } - .col-lg-pull-11 { - right: 91.66666667%; - } - .col-lg-pull-10 { - right: 83.33333333%; - } - .col-lg-pull-9 { - right: 75%; - } - .col-lg-pull-8 { - right: 66.66666667%; - } - .col-lg-pull-7 { - right: 58.33333333%; - } - .col-lg-pull-6 { - right: 50%; - } - .col-lg-pull-5 { - right: 41.66666667%; - } - .col-lg-pull-4 { - right: 33.33333333%; - } - .col-lg-pull-3 { - right: 25%; - } - .col-lg-pull-2 { - right: 16.66666667%; - } - .col-lg-pull-1 { - right: 8.33333333%; - } - .col-lg-pull-0 { - right: auto; - } - .col-lg-push-12 { - left: 100%; - } - .col-lg-push-11 { - left: 91.66666667%; - } - .col-lg-push-10 { - left: 83.33333333%; - } - .col-lg-push-9 { - left: 75%; - } - .col-lg-push-8 { - left: 66.66666667%; - } - .col-lg-push-7 { - left: 58.33333333%; - } - .col-lg-push-6 { - left: 50%; - } - .col-lg-push-5 { - left: 41.66666667%; - } - .col-lg-push-4 { - left: 33.33333333%; - } - .col-lg-push-3 { - left: 25%; - } - .col-lg-push-2 { - left: 16.66666667%; - } - .col-lg-push-1 { - left: 8.33333333%; - } - .col-lg-push-0 { - left: auto; - } - .col-lg-offset-12 { - margin-left: 100%; - } - .col-lg-offset-11 { - margin-left: 91.66666667%; - } - .col-lg-offset-10 { - margin-left: 83.33333333%; - } - .col-lg-offset-9 { - margin-left: 75%; - } - .col-lg-offset-8 { - margin-left: 66.66666667%; - } - .col-lg-offset-7 { - margin-left: 58.33333333%; - } - .col-lg-offset-6 { - margin-left: 50%; - } - .col-lg-offset-5 { - margin-left: 41.66666667%; - } - .col-lg-offset-4 { - margin-left: 33.33333333%; - } - .col-lg-offset-3 { - margin-left: 25%; - } - .col-lg-offset-2 { - margin-left: 16.66666667%; - } - .col-lg-offset-1 { - margin-left: 8.33333333%; - } - .col-lg-offset-0 { - margin-left: 0; - } -} -table { - background-color: transparent; -} -th { - text-align: left; -} -.table { - width: 100%; - max-width: 100%; - margin-bottom: 20px; -} -.table > thead > tr > th, -.table > tbody > tr > th, -.table > tfoot > tr > th, -.table > thead > tr > td, -.table > tbody > tr > td, -.table > tfoot > tr > td { - padding: 8px; - line-height: 1.42857143; - vertical-align: top; - border-top: 1px solid #ddd; -} -.table > thead > tr > th { - vertical-align: bottom; - border-bottom: 2px solid #ddd; -} -.table > caption + thead > tr:first-child > th, -.table > colgroup + thead > tr:first-child > th, -.table > thead:first-child > tr:first-child > th, -.table > caption + thead > tr:first-child > td, -.table > colgroup + thead > tr:first-child > td, -.table > thead:first-child > tr:first-child > td { - border-top: 0; -} -.table > tbody + tbody { - border-top: 2px solid #ddd; -} -.table .table { - background-color: #fff; -} -.table-condensed > thead > tr > th, -.table-condensed > tbody > tr > th, -.table-condensed > tfoot > tr > th, -.table-condensed > thead > tr > td, -.table-condensed > tbody > tr > td, -.table-condensed > tfoot > tr > td { - padding: 5px; -} -.table-bordered { - border: 1px solid #ddd; -} -.table-bordered > thead > tr > th, -.table-bordered > tbody > tr > th, -.table-bordered > tfoot > tr > th, -.table-bordered > thead > tr > td, -.table-bordered > tbody > tr > td, -.table-bordered > tfoot > tr > td { - border: 1px solid #ddd; -} -.table-bordered > thead > tr > th, -.table-bordered > thead > tr > td { - border-bottom-width: 2px; -} -.table-striped > tbody > tr:nth-child(odd) > td, -.table-striped > tbody > tr:nth-child(odd) > th { - background-color: #f9f9f9; -} -.table-hover > tbody > tr:hover > td, -.table-hover > tbody > tr:hover > th { - background-color: #f5f5f5; -} -table col[class*="col-"] { - position: static; - display: table-column; - float: none; -} -table td[class*="col-"], -table th[class*="col-"] { - position: static; - display: table-cell; - float: none; -} -.table > thead > tr > td.active, -.table > tbody > tr > td.active, -.table > tfoot > tr > td.active, -.table > thead > tr > th.active, -.table > tbody > tr > th.active, -.table > tfoot > tr > th.active, -.table > thead > tr.active > td, -.table > tbody > tr.active > td, -.table > tfoot > tr.active > td, -.table > thead > tr.active > th, -.table > tbody > tr.active > th, -.table > tfoot > tr.active > th { - background-color: #f5f5f5; -} -.table-hover > tbody > tr > td.active:hover, -.table-hover > tbody > tr > th.active:hover, -.table-hover > tbody > tr.active:hover > td, -.table-hover > tbody > tr:hover > .active, -.table-hover > tbody > tr.active:hover > th { - background-color: #e8e8e8; -} -.table > thead > tr > td.success, -.table > tbody > tr > td.success, -.table > tfoot > tr > td.success, -.table > thead > tr > th.success, -.table > tbody > tr > th.success, -.table > tfoot > tr > th.success, -.table > thead > tr.success > td, -.table > tbody > tr.success > td, -.table > tfoot > tr.success > td, -.table > thead > tr.success > th, -.table > tbody > tr.success > th, -.table > tfoot > tr.success > th { - background-color: #dff0d8; -} -.table-hover > tbody > tr > td.success:hover, -.table-hover > tbody > tr > th.success:hover, -.table-hover > tbody > tr.success:hover > td, -.table-hover > tbody > tr:hover > .success, -.table-hover > tbody > tr.success:hover > th { - background-color: #d0e9c6; -} -.table > thead > tr > td.info, -.table > tbody > tr > td.info, -.table > tfoot > tr > td.info, -.table > thead > tr > th.info, -.table > tbody > tr > th.info, -.table > tfoot > tr > th.info, -.table > thead > tr.info > td, -.table > tbody > tr.info > td, -.table > tfoot > tr.info > td, -.table > thead > tr.info > th, -.table > tbody > tr.info > th, -.table > tfoot > tr.info > th { - background-color: #d9edf7; -} -.table-hover > tbody > tr > td.info:hover, -.table-hover > tbody > tr > th.info:hover, -.table-hover > tbody > tr.info:hover > td, -.table-hover > tbody > tr:hover > .info, -.table-hover > tbody > tr.info:hover > th { - background-color: #c4e3f3; -} -.table > thead > tr > td.warning, -.table > tbody > tr > td.warning, -.table > tfoot > tr > td.warning, -.table > thead > tr > th.warning, -.table > tbody > tr > th.warning, -.table > tfoot > tr > th.warning, -.table > thead > tr.warning > td, -.table > tbody > tr.warning > td, -.table > tfoot > tr.warning > td, -.table > thead > tr.warning > th, -.table > tbody > tr.warning > th, -.table > tfoot > tr.warning > th { - background-color: #fcf8e3; -} -.table-hover > tbody > tr > td.warning:hover, -.table-hover > tbody > tr > th.warning:hover, -.table-hover > tbody > tr.warning:hover > td, -.table-hover > tbody > tr:hover > .warning, -.table-hover > tbody > tr.warning:hover > th { - background-color: #faf2cc; -} -.table > thead > tr > td.danger, -.table > tbody > tr > td.danger, -.table > tfoot > tr > td.danger, -.table > thead > tr > th.danger, -.table > tbody > tr > th.danger, -.table > tfoot > tr > th.danger, -.table > thead > tr.danger > td, -.table > tbody > tr.danger > td, -.table > tfoot > tr.danger > td, -.table > thead > tr.danger > th, -.table > tbody > tr.danger > th, -.table > tfoot > tr.danger > th { - background-color: #f2dede; -} -.table-hover > tbody > tr > td.danger:hover, -.table-hover > tbody > tr > th.danger:hover, -.table-hover > tbody > tr.danger:hover > td, -.table-hover > tbody > tr:hover > .danger, -.table-hover > tbody > tr.danger:hover > th { - background-color: #ebcccc; -} -@media screen and (max-width: 767px) { - .table-responsive { - width: 100%; - margin-bottom: 15px; - overflow-x: auto; - overflow-y: hidden; - -webkit-overflow-scrolling: touch; - -ms-overflow-style: -ms-autohiding-scrollbar; - border: 1px solid #ddd; - } - .table-responsive > .table { - margin-bottom: 0; - } - .table-responsive > .table > thead > tr > th, - .table-responsive > .table > tbody > tr > th, - .table-responsive > .table > tfoot > tr > th, - .table-responsive > .table > thead > tr > td, - .table-responsive > .table > tbody > tr > td, - .table-responsive > .table > tfoot > tr > td { - white-space: nowrap; - } - .table-responsive > .table-bordered { - border: 0; - } - .table-responsive > .table-bordered > thead > tr > th:first-child, - .table-responsive > .table-bordered > tbody > tr > th:first-child, - .table-responsive > .table-bordered > tfoot > tr > th:first-child, - .table-responsive > .table-bordered > thead > tr > td:first-child, - .table-responsive > .table-bordered > tbody > tr > td:first-child, - .table-responsive > .table-bordered > tfoot > tr > td:first-child { - border-left: 0; - } - .table-responsive > .table-bordered > thead > tr > th:last-child, - .table-responsive > .table-bordered > tbody > tr > th:last-child, - .table-responsive > .table-bordered > tfoot > tr > th:last-child, - .table-responsive > .table-bordered > thead > tr > td:last-child, - .table-responsive > .table-bordered > tbody > tr > td:last-child, - .table-responsive > .table-bordered > tfoot > tr > td:last-child { - border-right: 0; - } - .table-responsive > .table-bordered > tbody > tr:last-child > th, - .table-responsive > .table-bordered > tfoot > tr:last-child > th, - .table-responsive > .table-bordered > tbody > tr:last-child > td, - .table-responsive > .table-bordered > tfoot > tr:last-child > td { - border-bottom: 0; - } -} -fieldset { - min-width: 0; - padding: 0; - margin: 0; - border: 0; -} -legend { - display: block; - width: 100%; - padding: 0; - margin-bottom: 20px; - font-size: 21px; - line-height: inherit; - color: #333; - border: 0; - border-bottom: 1px solid #e5e5e5; -} -label { - display: inline-block; - max-width: 100%; - margin-bottom: 5px; - font-weight: bold; -} -input[type="search"] { - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; -} -input[type="radio"], -input[type="checkbox"] { - margin: 4px 0 0; - margin-top: 1px \9; - line-height: normal; -} -input[type="file"] { - display: block; -} -input[type="range"] { - display: block; - width: 100%; -} -select[multiple], -select[size] { - height: auto; -} -input[type="file"]:focus, -input[type="radio"]:focus, -input[type="checkbox"]:focus { - outline: thin dotted; - outline: 5px auto -webkit-focus-ring-color; - outline-offset: -2px; -} -output { - display: block; - padding-top: 7px; - font-size: 14px; - line-height: 1.42857143; - color: #555; -} -.form-control { - display: block; - width: 100%; - height: 34px; - padding: 6px 12px; - font-size: 14px; - line-height: 1.42857143; - color: #555; - background-color: #fff; - background-image: none; - border: 1px solid #ccc; - border-radius: 4px; - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); - box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); - -webkit-transition: border-color ease-in-out .15s, -webkit-box-shadow ease-in-out .15s; - -o-transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s; - transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s; -} -.form-control:focus { - border-color: #66afe9; - outline: 0; - -webkit-box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, .6); - box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, .6); -} -.form-control::-moz-placeholder { - color: #777; - opacity: 1; -} -.form-control:-ms-input-placeholder { - color: #777; -} -.form-control::-webkit-input-placeholder { - color: #777; -} -.form-control[disabled], -.form-control[readonly], -fieldset[disabled] .form-control { - cursor: not-allowed; - background-color: #eee; - opacity: 1; -} -textarea.form-control { - height: auto; -} -input[type="search"] { - -webkit-appearance: none; -} -input[type="date"], -input[type="time"], -input[type="datetime-local"], -input[type="month"] { - line-height: 34px; - line-height: 1.42857143 \0; -} -input[type="date"].input-sm, -input[type="time"].input-sm, -input[type="datetime-local"].input-sm, -input[type="month"].input-sm { - line-height: 30px; -} -input[type="date"].input-lg, -input[type="time"].input-lg, -input[type="datetime-local"].input-lg, -input[type="month"].input-lg { - line-height: 46px; -} -.form-group { - margin-bottom: 15px; -} -.radio, -.checkbox { - position: relative; - display: block; - min-height: 20px; - margin-top: 10px; - margin-bottom: 10px; -} -.radio label, -.checkbox label { - padding-left: 20px; - margin-bottom: 0; - font-weight: normal; - cursor: pointer; -} -.radio input[type="radio"], -.radio-inline input[type="radio"], -.checkbox input[type="checkbox"], -.checkbox-inline input[type="checkbox"] { - position: absolute; - margin-top: 4px \9; - margin-left: -20px; -} -.radio + .radio, -.checkbox + .checkbox { - margin-top: -5px; -} -.radio-inline, -.checkbox-inline { - display: inline-block; - padding-left: 20px; - margin-bottom: 0; - font-weight: normal; - vertical-align: middle; - cursor: pointer; -} -.radio-inline + .radio-inline, -.checkbox-inline + .checkbox-inline { - margin-top: 0; - margin-left: 10px; -} -input[type="radio"][disabled], -input[type="checkbox"][disabled], -input[type="radio"].disabled, -input[type="checkbox"].disabled, -fieldset[disabled] input[type="radio"], -fieldset[disabled] input[type="checkbox"] { - cursor: not-allowed; -} -.radio-inline.disabled, -.checkbox-inline.disabled, -fieldset[disabled] .radio-inline, -fieldset[disabled] .checkbox-inline { - cursor: not-allowed; -} -.radio.disabled label, -.checkbox.disabled label, -fieldset[disabled] .radio label, -fieldset[disabled] .checkbox label { - cursor: not-allowed; -} -.form-control-static { - padding-top: 7px; - padding-bottom: 7px; - margin-bottom: 0; -} -.form-control-static.input-lg, -.form-control-static.input-sm { - padding-right: 0; - padding-left: 0; -} -.input-sm, -.form-horizontal .form-group-sm .form-control { - height: 30px; - padding: 5px 10px; - font-size: 12px; - line-height: 1.5; - border-radius: 3px; -} -select.input-sm { - height: 30px; - line-height: 30px; -} -textarea.input-sm, -select[multiple].input-sm { - height: auto; -} -.input-lg, -.form-horizontal .form-group-lg .form-control { - height: 46px; - padding: 10px 16px; - font-size: 18px; - line-height: 1.33; - border-radius: 6px; -} -select.input-lg { - height: 46px; - line-height: 46px; -} -textarea.input-lg, -select[multiple].input-lg { - height: auto; -} -.has-feedback { - position: relative; -} -.has-feedback .form-control { - padding-right: 42.5px; -} -.form-control-feedback { - position: absolute; - top: 25px; - right: 0; - z-index: 2; - display: block; - width: 34px; - height: 34px; - line-height: 34px; - text-align: center; -} -.input-lg + .form-control-feedback { - width: 46px; - height: 46px; - line-height: 46px; -} -.input-sm + .form-control-feedback { - width: 30px; - height: 30px; - line-height: 30px; -} -.has-success .help-block, -.has-success .control-label, -.has-success .radio, -.has-success .checkbox, -.has-success .radio-inline, -.has-success .checkbox-inline { - color: #3c763d; -} -.has-success .form-control { - border-color: #3c763d; - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); - box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); -} -.has-success .form-control:focus { - border-color: #2b542c; - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #67b168; - box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #67b168; -} -.has-success .input-group-addon { - color: #3c763d; - background-color: #dff0d8; - border-color: #3c763d; -} -.has-success .form-control-feedback { - color: #3c763d; -} -.has-warning .help-block, -.has-warning .control-label, -.has-warning .radio, -.has-warning .checkbox, -.has-warning .radio-inline, -.has-warning .checkbox-inline { - color: #8a6d3b; -} -.has-warning .form-control { - border-color: #8a6d3b; - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); - box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); -} -.has-warning .form-control:focus { - border-color: #66512c; - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #c0a16b; - box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #c0a16b; -} -.has-warning .input-group-addon { - color: #8a6d3b; - background-color: #fcf8e3; - border-color: #8a6d3b; -} -.has-warning .form-control-feedback { - color: #8a6d3b; -} -.has-error .help-block, -.has-error .control-label, -.has-error .radio, -.has-error .checkbox, -.has-error .radio-inline, -.has-error .checkbox-inline { - color: #a94442; -} -.has-error .form-control { - border-color: #a94442; - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); - box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); -} -.has-error .form-control:focus { - border-color: #843534; - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #ce8483; - box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #ce8483; -} -.has-error .input-group-addon { - color: #a94442; - background-color: #f2dede; - border-color: #a94442; -} -.has-error .form-control-feedback { - color: #a94442; -} -.has-feedback label.sr-only ~ .form-control-feedback { - top: 0; -} -.help-block { - display: block; - margin-top: 5px; - margin-bottom: 10px; - color: #737373; -} -@media (min-width: 768px) { - .form-inline .form-group { - display: inline-block; - margin-bottom: 0; - vertical-align: middle; - } - .form-inline .form-control { - display: inline-block; - width: auto; - vertical-align: middle; - } - .form-inline .input-group { - display: inline-table; - vertical-align: middle; - } - .form-inline .input-group .input-group-addon, - .form-inline .input-group .input-group-btn, - .form-inline .input-group .form-control { - width: auto; - } - .form-inline .input-group > .form-control { - width: 100%; - } - .form-inline .control-label { - margin-bottom: 0; - vertical-align: middle; - } - .form-inline .radio, - .form-inline .checkbox { - display: inline-block; - margin-top: 0; - margin-bottom: 0; - vertical-align: middle; - } - .form-inline .radio label, - .form-inline .checkbox label { - padding-left: 0; - } - .form-inline .radio input[type="radio"], - .form-inline .checkbox input[type="checkbox"] { - position: relative; - margin-left: 0; - } - .form-inline .has-feedback .form-control-feedback { - top: 0; - } -} -.form-horizontal .radio, -.form-horizontal .checkbox, -.form-horizontal .radio-inline, -.form-horizontal .checkbox-inline { - padding-top: 7px; - margin-top: 0; - margin-bottom: 0; -} -.form-horizontal .radio, -.form-horizontal .checkbox { - min-height: 27px; -} -.form-horizontal .form-group { - margin-right: -15px; - margin-left: -15px; -} -@media (min-width: 768px) { - .form-horizontal .control-label { - padding-top: 7px; - margin-bottom: 0; - text-align: right; - } -} -.form-horizontal .has-feedback .form-control-feedback { - top: 0; - right: 15px; -} -@media (min-width: 768px) { - .form-horizontal .form-group-lg .control-label { - padding-top: 14.3px; - } -} -@media (min-width: 768px) { - .form-horizontal .form-group-sm .control-label { - padding-top: 6px; - } -} -.btn { - display: inline-block; - padding: 6px 12px; - margin-bottom: 0; - font-size: 14px; - font-weight: normal; - line-height: 1.42857143; - text-align: center; - white-space: nowrap; - vertical-align: middle; - cursor: pointer; - -webkit-user-select: none; - -moz-user-select: none; - -ms-user-select: none; - user-select: none; - background-image: none; - border: 1px solid transparent; - border-radius: 4px; -} -.btn:focus, -.btn:active:focus, -.btn.active:focus { - outline: thin dotted; - outline: 5px auto -webkit-focus-ring-color; - outline-offset: -2px; -} -.btn:hover, -.btn:focus { - color: #333; - text-decoration: none; -} -.btn:active, -.btn.active { - background-image: none; - outline: 0; - -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125); - box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125); -} -.btn.disabled, -.btn[disabled], -fieldset[disabled] .btn { - pointer-events: none; - cursor: not-allowed; - filter: alpha(opacity=65); - -webkit-box-shadow: none; - box-shadow: none; - opacity: .65; -} -.btn-default { - color: #333; - background-color: #fff; - border-color: #ccc; -} -.btn-default:hover, -.btn-default:focus, -.btn-default:active, -.btn-default.active, -.open > .dropdown-toggle.btn-default { - color: #333; - background-color: #e6e6e6; - border-color: #adadad; -} -.btn-default:active, -.btn-default.active, -.open > .dropdown-toggle.btn-default { - background-image: none; -} -.btn-default.disabled, -.btn-default[disabled], -fieldset[disabled] .btn-default, -.btn-default.disabled:hover, -.btn-default[disabled]:hover, -fieldset[disabled] .btn-default:hover, -.btn-default.disabled:focus, -.btn-default[disabled]:focus, -fieldset[disabled] .btn-default:focus, -.btn-default.disabled:active, -.btn-default[disabled]:active, -fieldset[disabled] .btn-default:active, -.btn-default.disabled.active, -.btn-default[disabled].active, -fieldset[disabled] .btn-default.active { - background-color: #fff; - border-color: #ccc; -} -.btn-default .badge { - color: #fff; - background-color: #333; -} -.btn-primary { - color: #fff; - background-color: #428bca; - border-color: #357ebd; -} -.btn-primary:hover, -.btn-primary:focus, -.btn-primary:active, -.btn-primary.active, -.open > .dropdown-toggle.btn-primary { - color: #fff; - background-color: #3071a9; - border-color: #285e8e; -} -.btn-primary:active, -.btn-primary.active, -.open > .dropdown-toggle.btn-primary { - background-image: none; -} -.btn-primary.disabled, -.btn-primary[disabled], -fieldset[disabled] .btn-primary, -.btn-primary.disabled:hover, -.btn-primary[disabled]:hover, -fieldset[disabled] .btn-primary:hover, -.btn-primary.disabled:focus, -.btn-primary[disabled]:focus, -fieldset[disabled] .btn-primary:focus, -.btn-primary.disabled:active, -.btn-primary[disabled]:active, -fieldset[disabled] .btn-primary:active, -.btn-primary.disabled.active, -.btn-primary[disabled].active, -fieldset[disabled] .btn-primary.active { - background-color: #428bca; - border-color: #357ebd; -} -.btn-primary .badge { - color: #428bca; - background-color: #fff; -} -.btn-success { - color: #fff; - background-color: #5cb85c; - border-color: #4cae4c; -} -.btn-success:hover, -.btn-success:focus, -.btn-success:active, -.btn-success.active, -.open > .dropdown-toggle.btn-success { - color: #fff; - background-color: #449d44; - border-color: #398439; -} -.btn-success:active, -.btn-success.active, -.open > .dropdown-toggle.btn-success { - background-image: none; -} -.btn-success.disabled, -.btn-success[disabled], -fieldset[disabled] .btn-success, -.btn-success.disabled:hover, -.btn-success[disabled]:hover, -fieldset[disabled] .btn-success:hover, -.btn-success.disabled:focus, -.btn-success[disabled]:focus, -fieldset[disabled] .btn-success:focus, -.btn-success.disabled:active, -.btn-success[disabled]:active, -fieldset[disabled] .btn-success:active, -.btn-success.disabled.active, -.btn-success[disabled].active, -fieldset[disabled] .btn-success.active { - background-color: #5cb85c; - border-color: #4cae4c; -} -.btn-success .badge { - color: #5cb85c; - background-color: #fff; -} -.btn-info { - color: #fff; - background-color: #5bc0de; - border-color: #46b8da; -} -.btn-info:hover, -.btn-info:focus, -.btn-info:active, -.btn-info.active, -.open > .dropdown-toggle.btn-info { - color: #fff; - background-color: #31b0d5; - border-color: #269abc; -} -.btn-info:active, -.btn-info.active, -.open > .dropdown-toggle.btn-info { - background-image: none; -} -.btn-info.disabled, -.btn-info[disabled], -fieldset[disabled] .btn-info, -.btn-info.disabled:hover, -.btn-info[disabled]:hover, -fieldset[disabled] .btn-info:hover, -.btn-info.disabled:focus, -.btn-info[disabled]:focus, -fieldset[disabled] .btn-info:focus, -.btn-info.disabled:active, -.btn-info[disabled]:active, -fieldset[disabled] .btn-info:active, -.btn-info.disabled.active, -.btn-info[disabled].active, -fieldset[disabled] .btn-info.active { - background-color: #5bc0de; - border-color: #46b8da; -} -.btn-info .badge { - color: #5bc0de; - background-color: #fff; -} -.btn-warning { - color: #fff; - background-color: #f0ad4e; - border-color: #eea236; -} -.btn-warning:hover, -.btn-warning:focus, -.btn-warning:active, -.btn-warning.active, -.open > .dropdown-toggle.btn-warning { - color: #fff; - background-color: #ec971f; - border-color: #d58512; -} -.btn-warning:active, -.btn-warning.active, -.open > .dropdown-toggle.btn-warning { - background-image: none; -} -.btn-warning.disabled, -.btn-warning[disabled], -fieldset[disabled] .btn-warning, -.btn-warning.disabled:hover, -.btn-warning[disabled]:hover, -fieldset[disabled] .btn-warning:hover, -.btn-warning.disabled:focus, -.btn-warning[disabled]:focus, -fieldset[disabled] .btn-warning:focus, -.btn-warning.disabled:active, -.btn-warning[disabled]:active, -fieldset[disabled] .btn-warning:active, -.btn-warning.disabled.active, -.btn-warning[disabled].active, -fieldset[disabled] .btn-warning.active { - background-color: #f0ad4e; - border-color: #eea236; -} -.btn-warning .badge { - color: #f0ad4e; - background-color: #fff; -} -.btn-danger { - color: #fff; - background-color: #d9534f; - border-color: #d43f3a; -} -.btn-danger:hover, -.btn-danger:focus, -.btn-danger:active, -.btn-danger.active, -.open > .dropdown-toggle.btn-danger { - color: #fff; - background-color: #c9302c; - border-color: #ac2925; -} -.btn-danger:active, -.btn-danger.active, -.open > .dropdown-toggle.btn-danger { - background-image: none; -} -.btn-danger.disabled, -.btn-danger[disabled], -fieldset[disabled] .btn-danger, -.btn-danger.disabled:hover, -.btn-danger[disabled]:hover, -fieldset[disabled] .btn-danger:hover, -.btn-danger.disabled:focus, -.btn-danger[disabled]:focus, -fieldset[disabled] .btn-danger:focus, -.btn-danger.disabled:active, -.btn-danger[disabled]:active, -fieldset[disabled] .btn-danger:active, -.btn-danger.disabled.active, -.btn-danger[disabled].active, -fieldset[disabled] .btn-danger.active { - background-color: #d9534f; - border-color: #d43f3a; -} -.btn-danger .badge { - color: #d9534f; - background-color: #fff; -} -.btn-link { - font-weight: normal; - color: #428bca; - cursor: pointer; - border-radius: 0; -} -.btn-link, -.btn-link:active, -.btn-link[disabled], -fieldset[disabled] .btn-link { - background-color: transparent; - -webkit-box-shadow: none; - box-shadow: none; -} -.btn-link, -.btn-link:hover, -.btn-link:focus, -.btn-link:active { - border-color: transparent; -} -.btn-link:hover, -.btn-link:focus { - color: #2a6496; - text-decoration: underline; - background-color: transparent; -} -.btn-link[disabled]:hover, -fieldset[disabled] .btn-link:hover, -.btn-link[disabled]:focus, -fieldset[disabled] .btn-link:focus { - color: #777; - text-decoration: none; -} -.btn-lg, -.btn-group-lg > .btn { - padding: 10px 16px; - font-size: 18px; - line-height: 1.33; - border-radius: 6px; -} -.btn-sm, -.btn-group-sm > .btn { - padding: 5px 10px; - font-size: 12px; - line-height: 1.5; - border-radius: 3px; -} -.btn-xs, -.btn-group-xs > .btn { - padding: 1px 5px; - font-size: 12px; - line-height: 1.5; - border-radius: 3px; -} -.btn-block { - display: block; - width: 100%; -} -.btn-block + .btn-block { - margin-top: 5px; -} -input[type="submit"].btn-block, -input[type="reset"].btn-block, -input[type="button"].btn-block { - width: 100%; -} -.fade { - opacity: 0; - -webkit-transition: opacity .15s linear; - -o-transition: opacity .15s linear; - transition: opacity .15s linear; -} -.fade.in { - opacity: 1; -} -.collapse { - display: none; -} -.collapse.in { - display: block; -} -tr.collapse.in { - display: table-row; -} -tbody.collapse.in { - display: table-row-group; -} -.collapsing { - position: relative; - height: 0; - overflow: hidden; - -webkit-transition: height .35s ease; - -o-transition: height .35s ease; - transition: height .35s ease; -} -.caret { - display: inline-block; - width: 0; - height: 0; - margin-left: 2px; - vertical-align: middle; - border-top: 4px solid; - border-right: 4px solid transparent; - border-left: 4px solid transparent; -} -.dropdown { - position: relative; -} -.dropdown-toggle:focus { - outline: 0; -} -.dropdown-menu { - position: absolute; - top: 100%; - left: 0; - z-index: 1000; - display: none; - float: left; - min-width: 160px; - padding: 5px 0; - margin: 2px 0 0; - font-size: 14px; - text-align: left; - list-style: none; - background-color: #fff; - -webkit-background-clip: padding-box; - background-clip: padding-box; - border: 1px solid #ccc; - border: 1px solid rgba(0, 0, 0, .15); - border-radius: 4px; - -webkit-box-shadow: 0 6px 12px rgba(0, 0, 0, .175); - box-shadow: 0 6px 12px rgba(0, 0, 0, .175); -} -.dropdown-menu.pull-right { - right: 0; - left: auto; -} -.dropdown-menu .divider { - height: 1px; - margin: 9px 0; - overflow: hidden; - background-color: #e5e5e5; -} -.dropdown-menu > li > a { - display: block; - padding: 3px 20px; - clear: both; - font-weight: normal; - line-height: 1.42857143; - color: #333; - white-space: nowrap; -} -.dropdown-menu > li > a:hover, -.dropdown-menu > li > a:focus { - color: #262626; - text-decoration: none; - background-color: #f5f5f5; -} -.dropdown-menu > .active > a, -.dropdown-menu > .active > a:hover, -.dropdown-menu > .active > a:focus { - color: #fff; - text-decoration: none; - background-color: #428bca; - outline: 0; -} -.dropdown-menu > .disabled > a, -.dropdown-menu > .disabled > a:hover, -.dropdown-menu > .disabled > a:focus { - color: #777; -} -.dropdown-menu > .disabled > a:hover, -.dropdown-menu > .disabled > a:focus { - text-decoration: none; - cursor: not-allowed; - background-color: transparent; - background-image: none; - filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); -} -.open > .dropdown-menu { - display: block; -} -.open > a { - outline: 0; -} -.dropdown-menu-right { - right: 0; - left: auto; -} -.dropdown-menu-left { - right: auto; - left: 0; -} -.dropdown-header { - display: block; - padding: 3px 20px; - font-size: 12px; - line-height: 1.42857143; - color: #777; - white-space: nowrap; -} -.dropdown-backdrop { - position: fixed; - top: 0; - right: 0; - bottom: 0; - left: 0; - z-index: 990; -} -.pull-right > .dropdown-menu { - right: 0; - left: auto; -} -.dropup .caret, -.navbar-fixed-bottom .dropdown .caret { - content: ""; - border-top: 0; - border-bottom: 4px solid; -} -.dropup .dropdown-menu, -.navbar-fixed-bottom .dropdown .dropdown-menu { - top: auto; - bottom: 100%; - margin-bottom: 1px; -} -@media (min-width: 768px) { - .navbar-right .dropdown-menu { - right: 0; - left: auto; - } - .navbar-right .dropdown-menu-left { - right: auto; - left: 0; - } -} -.btn-group, -.btn-group-vertical { - position: relative; - display: inline-block; - vertical-align: middle; -} -.btn-group > .btn, -.btn-group-vertical > .btn { - position: relative; - float: left; -} -.btn-group > .btn:hover, -.btn-group-vertical > .btn:hover, -.btn-group > .btn:focus, -.btn-group-vertical > .btn:focus, -.btn-group > .btn:active, -.btn-group-vertical > .btn:active, -.btn-group > .btn.active, -.btn-group-vertical > .btn.active { - z-index: 2; -} -.btn-group > .btn:focus, -.btn-group-vertical > .btn:focus { - outline: 0; -} -.btn-group .btn + .btn, -.btn-group .btn + .btn-group, -.btn-group .btn-group + .btn, -.btn-group .btn-group + .btn-group { - margin-left: -1px; -} -.btn-toolbar { - margin-left: -5px; -} -.btn-toolbar .btn-group, -.btn-toolbar .input-group { - float: left; -} -.btn-toolbar > .btn, -.btn-toolbar > .btn-group, -.btn-toolbar > .input-group { - margin-left: 5px; -} -.btn-group > .btn:not(:first-child):not(:last-child):not(.dropdown-toggle) { - border-radius: 0; -} -.btn-group > .btn:first-child { - margin-left: 0; -} -.btn-group > .btn:first-child:not(:last-child):not(.dropdown-toggle) { - border-top-right-radius: 0; - border-bottom-right-radius: 0; -} -.btn-group > .btn:last-child:not(:first-child), -.btn-group > .dropdown-toggle:not(:first-child) { - border-top-left-radius: 0; - border-bottom-left-radius: 0; -} -.btn-group > .btn-group { - float: left; -} -.btn-group > .btn-group:not(:first-child):not(:last-child) > .btn { - border-radius: 0; -} -.btn-group > .btn-group:first-child > .btn:last-child, -.btn-group > .btn-group:first-child > .dropdown-toggle { - border-top-right-radius: 0; - border-bottom-right-radius: 0; -} -.btn-group > .btn-group:last-child > .btn:first-child { - border-top-left-radius: 0; - border-bottom-left-radius: 0; -} -.btn-group .dropdown-toggle:active, -.btn-group.open .dropdown-toggle { - outline: 0; -} -.btn-group > .btn + .dropdown-toggle { - padding-right: 8px; - padding-left: 8px; -} -.btn-group > .btn-lg + .dropdown-toggle { - padding-right: 12px; - padding-left: 12px; -} -.btn-group.open .dropdown-toggle { - -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125); - box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125); -} -.btn-group.open .dropdown-toggle.btn-link { - -webkit-box-shadow: none; - box-shadow: none; -} -.btn .caret { - margin-left: 0; -} -.btn-lg .caret { - border-width: 5px 5px 0; - border-bottom-width: 0; -} -.dropup .btn-lg .caret { - border-width: 0 5px 5px; -} -.btn-group-vertical > .btn, -.btn-group-vertical > .btn-group, -.btn-group-vertical > .btn-group > .btn { - display: block; - float: none; - width: 100%; - max-width: 100%; -} -.btn-group-vertical > .btn-group > .btn { - float: none; -} -.btn-group-vertical > .btn + .btn, -.btn-group-vertical > .btn + .btn-group, -.btn-group-vertical > .btn-group + .btn, -.btn-group-vertical > .btn-group + .btn-group { - margin-top: -1px; - margin-left: 0; -} -.btn-group-vertical > .btn:not(:first-child):not(:last-child) { - border-radius: 0; -} -.btn-group-vertical > .btn:first-child:not(:last-child) { - border-top-right-radius: 4px; - border-bottom-right-radius: 0; - border-bottom-left-radius: 0; -} -.btn-group-vertical > .btn:last-child:not(:first-child) { - border-top-left-radius: 0; - border-top-right-radius: 0; - border-bottom-left-radius: 4px; -} -.btn-group-vertical > .btn-group:not(:first-child):not(:last-child) > .btn { - border-radius: 0; -} -.btn-group-vertical > .btn-group:first-child:not(:last-child) > .btn:last-child, -.btn-group-vertical > .btn-group:first-child:not(:last-child) > .dropdown-toggle { - border-bottom-right-radius: 0; - border-bottom-left-radius: 0; -} -.btn-group-vertical > .btn-group:last-child:not(:first-child) > .btn:first-child { - border-top-left-radius: 0; - border-top-right-radius: 0; -} -.btn-group-justified { - display: table; - width: 100%; - table-layout: fixed; - border-collapse: separate; -} -.btn-group-justified > .btn, -.btn-group-justified > .btn-group { - display: table-cell; - float: none; - width: 1%; -} -.btn-group-justified > .btn-group .btn { - width: 100%; -} -.btn-group-justified > .btn-group .dropdown-menu { - left: auto; -} -[data-toggle="buttons"] > .btn > input[type="radio"], -[data-toggle="buttons"] > .btn > input[type="checkbox"] { - position: absolute; - z-index: -1; - filter: alpha(opacity=0); - opacity: 0; -} -.input-group { - position: relative; - display: table; - border-collapse: separate; -} -.input-group[class*="col-"] { - float: none; - padding-right: 0; - padding-left: 0; -} -.input-group .form-control { - position: relative; - z-index: 2; - float: left; - width: 100%; - margin-bottom: 0; -} -.input-group-lg > .form-control, -.input-group-lg > .input-group-addon, -.input-group-lg > .input-group-btn > .btn { - height: 46px; - padding: 10px 16px; - font-size: 18px; - line-height: 1.33; - border-radius: 6px; -} -select.input-group-lg > .form-control, -select.input-group-lg > .input-group-addon, -select.input-group-lg > .input-group-btn > .btn { - height: 46px; - line-height: 46px; -} -textarea.input-group-lg > .form-control, -textarea.input-group-lg > .input-group-addon, -textarea.input-group-lg > .input-group-btn > .btn, -select[multiple].input-group-lg > .form-control, -select[multiple].input-group-lg > .input-group-addon, -select[multiple].input-group-lg > .input-group-btn > .btn { - height: auto; -} -.input-group-sm > .form-control, -.input-group-sm > .input-group-addon, -.input-group-sm > .input-group-btn > .btn { - height: 30px; - padding: 5px 10px; - font-size: 12px; - line-height: 1.5; - border-radius: 3px; -} -select.input-group-sm > .form-control, -select.input-group-sm > .input-group-addon, -select.input-group-sm > .input-group-btn > .btn { - height: 30px; - line-height: 30px; -} -textarea.input-group-sm > .form-control, -textarea.input-group-sm > .input-group-addon, -textarea.input-group-sm > .input-group-btn > .btn, -select[multiple].input-group-sm > .form-control, -select[multiple].input-group-sm > .input-group-addon, -select[multiple].input-group-sm > .input-group-btn > .btn { - height: auto; -} -.input-group-addon, -.input-group-btn, -.input-group .form-control { - display: table-cell; -} -.input-group-addon:not(:first-child):not(:last-child), -.input-group-btn:not(:first-child):not(:last-child), -.input-group .form-control:not(:first-child):not(:last-child) { - border-radius: 0; -} -.input-group-addon, -.input-group-btn { - width: 1%; - white-space: nowrap; - vertical-align: middle; -} -.input-group-addon { - padding: 6px 12px; - font-size: 14px; - font-weight: normal; - line-height: 1; - color: #555; - text-align: center; - background-color: #eee; - border: 1px solid #ccc; - border-radius: 4px; -} -.input-group-addon.input-sm { - padding: 5px 10px; - font-size: 12px; - border-radius: 3px; -} -.input-group-addon.input-lg { - padding: 10px 16px; - font-size: 18px; - border-radius: 6px; -} -.input-group-addon input[type="radio"], -.input-group-addon input[type="checkbox"] { - margin-top: 0; -} -.input-group .form-control:first-child, -.input-group-addon:first-child, -.input-group-btn:first-child > .btn, -.input-group-btn:first-child > .btn-group > .btn, -.input-group-btn:first-child > .dropdown-toggle, -.input-group-btn:last-child > .btn:not(:last-child):not(.dropdown-toggle), -.input-group-btn:last-child > .btn-group:not(:last-child) > .btn { - border-top-right-radius: 0; - border-bottom-right-radius: 0; -} -.input-group-addon:first-child { - border-right: 0; -} -.input-group .form-control:last-child, -.input-group-addon:last-child, -.input-group-btn:last-child > .btn, -.input-group-btn:last-child > .btn-group > .btn, -.input-group-btn:last-child > .dropdown-toggle, -.input-group-btn:first-child > .btn:not(:first-child), -.input-group-btn:first-child > .btn-group:not(:first-child) > .btn { - border-top-left-radius: 0; - border-bottom-left-radius: 0; -} -.input-group-addon:last-child { - border-left: 0; -} -.input-group-btn { - position: relative; - font-size: 0; - white-space: nowrap; -} -.input-group-btn > .btn { - position: relative; -} -.input-group-btn > .btn + .btn { - margin-left: -1px; -} -.input-group-btn > .btn:hover, -.input-group-btn > .btn:focus, -.input-group-btn > .btn:active { - z-index: 2; -} -.input-group-btn:first-child > .btn, -.input-group-btn:first-child > .btn-group { - margin-right: -1px; -} -.input-group-btn:last-child > .btn, -.input-group-btn:last-child > .btn-group { - margin-left: -1px; -} -.nav { - padding-left: 0; - margin-bottom: 0; - list-style: none; -} -.nav > li { - position: relative; - display: block; -} -.nav > li > a { - position: relative; - display: block; - padding: 10px 15px; -} -.nav > li > a:hover, -.nav > li > a:focus { - text-decoration: none; - background-color: #eee; -} -.nav > li.disabled > a { - color: #777; -} -.nav > li.disabled > a:hover, -.nav > li.disabled > a:focus { - color: #777; - text-decoration: none; - cursor: not-allowed; - background-color: transparent; -} -.nav .open > a, -.nav .open > a:hover, -.nav .open > a:focus { - background-color: #eee; - border-color: #428bca; -} -.nav .nav-divider { - height: 1px; - margin: 9px 0; - overflow: hidden; - background-color: #e5e5e5; -} -.nav > li > a > img { - max-width: none; -} -.nav-tabs { - border-bottom: 1px solid #ddd; -} -.nav-tabs > li { - float: left; - margin-bottom: -1px; -} -.nav-tabs > li > a { - margin-right: 2px; - line-height: 1.42857143; - border: 1px solid transparent; - border-radius: 4px 4px 0 0; -} -.nav-tabs > li > a:hover { - border-color: #eee #eee #ddd; -} -.nav-tabs > li.active > a, -.nav-tabs > li.active > a:hover, -.nav-tabs > li.active > a:focus { - color: #555; - cursor: default; - background-color: #fff; - border: 1px solid #ddd; - border-bottom-color: transparent; -} -.nav-tabs.nav-justified { - width: 100%; - border-bottom: 0; -} -.nav-tabs.nav-justified > li { - float: none; -} -.nav-tabs.nav-justified > li > a { - margin-bottom: 5px; - text-align: center; -} -.nav-tabs.nav-justified > .dropdown .dropdown-menu { - top: auto; - left: auto; -} -@media (min-width: 768px) { - .nav-tabs.nav-justified > li { - display: table-cell; - width: 1%; - } - .nav-tabs.nav-justified > li > a { - margin-bottom: 0; - } -} -.nav-tabs.nav-justified > li > a { - margin-right: 0; - border-radius: 4px; -} -.nav-tabs.nav-justified > .active > a, -.nav-tabs.nav-justified > .active > a:hover, -.nav-tabs.nav-justified > .active > a:focus { - border: 1px solid #ddd; -} -@media (min-width: 768px) { - .nav-tabs.nav-justified > li > a { - border-bottom: 1px solid #ddd; - border-radius: 4px 4px 0 0; - } - .nav-tabs.nav-justified > .active > a, - .nav-tabs.nav-justified > .active > a:hover, - .nav-tabs.nav-justified > .active > a:focus { - border-bottom-color: #fff; - } -} -.nav-pills > li { - float: left; -} -.nav-pills > li > a { - border-radius: 4px; -} -.nav-pills > li + li { - margin-left: 2px; -} -.nav-pills > li.active > a, -.nav-pills > li.active > a:hover, -.nav-pills > li.active > a:focus { - color: #fff; - background-color: #428bca; -} -.nav-stacked > li { - float: none; -} -.nav-stacked > li + li { - margin-top: 2px; - margin-left: 0; -} -.nav-justified { - width: 100%; -} -.nav-justified > li { - float: none; -} -.nav-justified > li > a { - margin-bottom: 5px; - text-align: center; -} -.nav-justified > .dropdown .dropdown-menu { - top: auto; - left: auto; -} -@media (min-width: 768px) { - .nav-justified > li { - display: table-cell; - width: 1%; - } - .nav-justified > li > a { - margin-bottom: 0; - } -} -.nav-tabs-justified { - border-bottom: 0; -} -.nav-tabs-justified > li > a { - margin-right: 0; - border-radius: 4px; -} -.nav-tabs-justified > .active > a, -.nav-tabs-justified > .active > a:hover, -.nav-tabs-justified > .active > a:focus { - border: 1px solid #ddd; -} -@media (min-width: 768px) { - .nav-tabs-justified > li > a { - border-bottom: 1px solid #ddd; - border-radius: 4px 4px 0 0; - } - .nav-tabs-justified > .active > a, - .nav-tabs-justified > .active > a:hover, - .nav-tabs-justified > .active > a:focus { - border-bottom-color: #fff; - } -} -.tab-content > .tab-pane { - display: none; -} -.tab-content > .active { - display: block; -} -.nav-tabs .dropdown-menu { - margin-top: -1px; - border-top-left-radius: 0; - border-top-right-radius: 0; -} -.navbar { - position: relative; - min-height: 50px; - margin-bottom: 20px; - border: 1px solid transparent; -} -@media (min-width: 768px) { - .navbar { - border-radius: 4px; - } -} -@media (min-width: 768px) { - .navbar-header { - float: left; - } -} -.navbar-collapse { - padding-right: 15px; - padding-left: 15px; - overflow-x: visible; - -webkit-overflow-scrolling: touch; - border-top: 1px solid transparent; - -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .1); - box-shadow: inset 0 1px 0 rgba(255, 255, 255, .1); -} -.navbar-collapse.in { - overflow-y: auto; -} -@media (min-width: 768px) { - .navbar-collapse { - width: auto; - border-top: 0; - -webkit-box-shadow: none; - box-shadow: none; - } - .navbar-collapse.collapse { - display: block !important; - height: auto !important; - padding-bottom: 0; - overflow: visible !important; - } - .navbar-collapse.in { - overflow-y: visible; - } - .navbar-fixed-top .navbar-collapse, - .navbar-static-top .navbar-collapse, - .navbar-fixed-bottom .navbar-collapse { - padding-right: 0; - padding-left: 0; - } -} -.navbar-fixed-top .navbar-collapse, -.navbar-fixed-bottom .navbar-collapse { - max-height: 340px; -} -@media (max-width: 480px) and (orientation: landscape) { - .navbar-fixed-top .navbar-collapse, - .navbar-fixed-bottom .navbar-collapse { - max-height: 200px; - } -} -.container > .navbar-header, -.container-fluid > .navbar-header, -.container > .navbar-collapse, -.container-fluid > .navbar-collapse { - margin-right: -15px; - margin-left: -15px; -} -@media (min-width: 768px) { - .container > .navbar-header, - .container-fluid > .navbar-header, - .container > .navbar-collapse, - .container-fluid > .navbar-collapse { - margin-right: 0; - margin-left: 0; - } -} -.navbar-static-top { - z-index: 1000; - border-width: 0 0 1px; -} -@media (min-width: 768px) { - .navbar-static-top { - border-radius: 0; - } -} -.navbar-fixed-top, -.navbar-fixed-bottom { - position: fixed; - right: 0; - left: 0; - z-index: 1030; - -webkit-transform: translate3d(0, 0, 0); - -o-transform: translate3d(0, 0, 0); - transform: translate3d(0, 0, 0); -} -@media (min-width: 768px) { - .navbar-fixed-top, - .navbar-fixed-bottom { - border-radius: 0; - } -} -.navbar-fixed-top { - top: 0; - border-width: 0 0 1px; -} -.navbar-fixed-bottom { - bottom: 0; - margin-bottom: 0; - border-width: 1px 0 0; -} -.navbar-brand { - float: left; - height: 50px; - padding: 15px 15px; - font-size: 18px; - line-height: 20px; -} -.navbar-brand:hover, -.navbar-brand:focus { - text-decoration: none; -} -@media (min-width: 768px) { - .navbar > .container .navbar-brand, - .navbar > .container-fluid .navbar-brand { - margin-left: -15px; - } -} -.navbar-toggle { - position: relative; - float: right; - padding: 9px 10px; - margin-top: 8px; - margin-right: 15px; - margin-bottom: 8px; - background-color: transparent; - background-image: none; - border: 1px solid transparent; - border-radius: 4px; -} -.navbar-toggle:focus { - outline: 0; -} -.navbar-toggle .icon-bar { - display: block; - width: 22px; - height: 2px; - border-radius: 1px; -} -.navbar-toggle .icon-bar + .icon-bar { - margin-top: 4px; -} -@media (min-width: 768px) { - .navbar-toggle { - display: none; - } -} -.navbar-nav { - margin: 7.5px -15px; -} -.navbar-nav > li > a { - padding-top: 10px; - padding-bottom: 10px; - line-height: 20px; -} -@media (max-width: 767px) { - .navbar-nav .open .dropdown-menu { - position: static; - float: none; - width: auto; - margin-top: 0; - background-color: transparent; - border: 0; - -webkit-box-shadow: none; - box-shadow: none; - } - .navbar-nav .open .dropdown-menu > li > a, - .navbar-nav .open .dropdown-menu .dropdown-header { - padding: 5px 15px 5px 25px; - } - .navbar-nav .open .dropdown-menu > li > a { - line-height: 20px; - } - .navbar-nav .open .dropdown-menu > li > a:hover, - .navbar-nav .open .dropdown-menu > li > a:focus { - background-image: none; - } -} -@media (min-width: 768px) { - .navbar-nav { - float: left; - margin: 0; - } - .navbar-nav > li { - float: left; - } - .navbar-nav > li > a { - padding-top: 15px; - padding-bottom: 15px; - } - .navbar-nav.navbar-right:last-child { - margin-right: -15px; - } -} -@media (min-width: 768px) { - .navbar-left { - float: left !important; - } - .navbar-right { - float: right !important; - } -} -.navbar-form { - padding: 10px 15px; - margin-top: 8px; - margin-right: -15px; - margin-bottom: 8px; - margin-left: -15px; - border-top: 1px solid transparent; - border-bottom: 1px solid transparent; - -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .1), 0 1px 0 rgba(255, 255, 255, .1); - box-shadow: inset 0 1px 0 rgba(255, 255, 255, .1), 0 1px 0 rgba(255, 255, 255, .1); -} -@media (min-width: 768px) { - .navbar-form .form-group { - display: inline-block; - margin-bottom: 0; - vertical-align: middle; - } - .navbar-form .form-control { - display: inline-block; - width: auto; - vertical-align: middle; - } - .navbar-form .input-group { - display: inline-table; - vertical-align: middle; - } - .navbar-form .input-group .input-group-addon, - .navbar-form .input-group .input-group-btn, - .navbar-form .input-group .form-control { - width: auto; - } - .navbar-form .input-group > .form-control { - width: 100%; - } - .navbar-form .control-label { - margin-bottom: 0; - vertical-align: middle; - } - .navbar-form .radio, - .navbar-form .checkbox { - display: inline-block; - margin-top: 0; - margin-bottom: 0; - vertical-align: middle; - } - .navbar-form .radio label, - .navbar-form .checkbox label { - padding-left: 0; - } - .navbar-form .radio input[type="radio"], - .navbar-form .checkbox input[type="checkbox"] { - position: relative; - margin-left: 0; - } - .navbar-form .has-feedback .form-control-feedback { - top: 0; - } -} -@media (max-width: 767px) { - .navbar-form .form-group { - margin-bottom: 5px; - } -} -@media (min-width: 768px) { - .navbar-form { - width: auto; - padding-top: 0; - padding-bottom: 0; - margin-right: 0; - margin-left: 0; - border: 0; - -webkit-box-shadow: none; - box-shadow: none; - } - .navbar-form.navbar-right:last-child { - margin-right: -15px; - } -} -.navbar-nav > li > .dropdown-menu { - margin-top: 0; - border-top-left-radius: 0; - border-top-right-radius: 0; -} -.navbar-fixed-bottom .navbar-nav > li > .dropdown-menu { - border-bottom-right-radius: 0; - border-bottom-left-radius: 0; -} -.navbar-btn { - margin-top: 8px; - margin-bottom: 8px; -} -.navbar-btn.btn-sm { - margin-top: 10px; - margin-bottom: 10px; -} -.navbar-btn.btn-xs { - margin-top: 14px; - margin-bottom: 14px; -} -.navbar-text { - margin-top: 15px; - margin-bottom: 15px; -} -@media (min-width: 768px) { - .navbar-text { - float: left; - margin-right: 15px; - margin-left: 15px; - } - .navbar-text.navbar-right:last-child { - margin-right: 0; - } -} -.navbar-default { - background-color: #f8f8f8; - border-color: #e7e7e7; -} -.navbar-default .navbar-brand { - color: #777; -} -.navbar-default .navbar-brand:hover, -.navbar-default .navbar-brand:focus { - color: #5e5e5e; - background-color: transparent; -} -.navbar-default .navbar-text { - color: #777; -} -.navbar-default .navbar-nav > li > a { - color: #777; -} -.navbar-default .navbar-nav > li > a:hover, -.navbar-default .navbar-nav > li > a:focus { - color: #333; - background-color: transparent; -} -.navbar-default .navbar-nav > .active > a, -.navbar-default .navbar-nav > .active > a:hover, -.navbar-default .navbar-nav > .active > a:focus { - color: #555; - background-color: #e7e7e7; -} -.navbar-default .navbar-nav > .disabled > a, -.navbar-default .navbar-nav > .disabled > a:hover, -.navbar-default .navbar-nav > .disabled > a:focus { - color: #ccc; - background-color: transparent; -} -.navbar-default .navbar-toggle { - border-color: #ddd; -} -.navbar-default .navbar-toggle:hover, -.navbar-default .navbar-toggle:focus { - background-color: #ddd; -} -.navbar-default .navbar-toggle .icon-bar { - background-color: #888; -} -.navbar-default .navbar-collapse, -.navbar-default .navbar-form { - border-color: #e7e7e7; -} -.navbar-default .navbar-nav > .open > a, -.navbar-default .navbar-nav > .open > a:hover, -.navbar-default .navbar-nav > .open > a:focus { - color: #555; - background-color: #e7e7e7; -} -@media (max-width: 767px) { - .navbar-default .navbar-nav .open .dropdown-menu > li > a { - color: #777; - } - .navbar-default .navbar-nav .open .dropdown-menu > li > a:hover, - .navbar-default .navbar-nav .open .dropdown-menu > li > a:focus { - color: #333; - background-color: transparent; - } - .navbar-default .navbar-nav .open .dropdown-menu > .active > a, - .navbar-default .navbar-nav .open .dropdown-menu > .active > a:hover, - .navbar-default .navbar-nav .open .dropdown-menu > .active > a:focus { - color: #555; - background-color: #e7e7e7; - } - .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a, - .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:hover, - .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:focus { - color: #ccc; - background-color: transparent; - } -} -.navbar-default .navbar-link { - color: #777; -} -.navbar-default .navbar-link:hover { - color: #333; -} -.navbar-default .btn-link { - color: #777; -} -.navbar-default .btn-link:hover, -.navbar-default .btn-link:focus { - color: #333; -} -.navbar-default .btn-link[disabled]:hover, -fieldset[disabled] .navbar-default .btn-link:hover, -.navbar-default .btn-link[disabled]:focus, -fieldset[disabled] .navbar-default .btn-link:focus { - color: #ccc; -} -.navbar-inverse { - background-color: #222; - border-color: #080808; -} -.navbar-inverse .navbar-brand { - color: #777; -} -.navbar-inverse .navbar-brand:hover, -.navbar-inverse .navbar-brand:focus { - color: #fff; - background-color: transparent; -} -.navbar-inverse .navbar-text { - color: #777; -} -.navbar-inverse .navbar-nav > li > a { - color: #777; -} -.navbar-inverse .navbar-nav > li > a:hover, -.navbar-inverse .navbar-nav > li > a:focus { - color: #fff; - background-color: transparent; -} -.navbar-inverse .navbar-nav > .active > a, -.navbar-inverse .navbar-nav > .active > a:hover, -.navbar-inverse .navbar-nav > .active > a:focus { - color: #fff; - background-color: #080808; -} -.navbar-inverse .navbar-nav > .disabled > a, -.navbar-inverse .navbar-nav > .disabled > a:hover, -.navbar-inverse .navbar-nav > .disabled > a:focus { - color: #444; - background-color: transparent; -} -.navbar-inverse .navbar-toggle { - border-color: #333; -} -.navbar-inverse .navbar-toggle:hover, -.navbar-inverse .navbar-toggle:focus { - background-color: #333; -} -.navbar-inverse .navbar-toggle .icon-bar { - background-color: #fff; -} -.navbar-inverse .navbar-collapse, -.navbar-inverse .navbar-form { - border-color: #101010; -} -.navbar-inverse .navbar-nav > .open > a, -.navbar-inverse .navbar-nav > .open > a:hover, -.navbar-inverse .navbar-nav > .open > a:focus { - color: #fff; - background-color: #080808; -} -@media (max-width: 767px) { - .navbar-inverse .navbar-nav .open .dropdown-menu > .dropdown-header { - border-color: #080808; - } - .navbar-inverse .navbar-nav .open .dropdown-menu .divider { - background-color: #080808; - } - .navbar-inverse .navbar-nav .open .dropdown-menu > li > a { - color: #777; - } - .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:hover, - .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:focus { - color: #fff; - background-color: transparent; - } - .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a, - .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:hover, - .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:focus { - color: #fff; - background-color: #080808; - } - .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a, - .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:hover, - .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:focus { - color: #444; - background-color: transparent; - } -} -.navbar-inverse .navbar-link { - color: #777; -} -.navbar-inverse .navbar-link:hover { - color: #fff; -} -.navbar-inverse .btn-link { - color: #777; -} -.navbar-inverse .btn-link:hover, -.navbar-inverse .btn-link:focus { - color: #fff; -} -.navbar-inverse .btn-link[disabled]:hover, -fieldset[disabled] .navbar-inverse .btn-link:hover, -.navbar-inverse .btn-link[disabled]:focus, -fieldset[disabled] .navbar-inverse .btn-link:focus { - color: #444; -} -.breadcrumb { - padding: 8px 15px; - margin-bottom: 20px; - list-style: none; - background-color: #f5f5f5; - border-radius: 4px; -} -.breadcrumb > li { - display: inline-block; -} -.breadcrumb > li + li:before { - padding: 0 5px; - color: #ccc; - content: "/\00a0"; -} -.breadcrumb > .active { - color: #777; -} -.pagination { - display: inline-block; - padding-left: 0; - margin: 20px 0; - border-radius: 4px; -} -.pagination > li { - display: inline; -} -.pagination > li > a, -.pagination > li > span { - position: relative; - float: left; - padding: 6px 12px; - margin-left: -1px; - line-height: 1.42857143; - color: #428bca; - text-decoration: none; - background-color: #fff; - border: 1px solid #ddd; -} -.pagination > li:first-child > a, -.pagination > li:first-child > span { - margin-left: 0; - border-top-left-radius: 4px; - border-bottom-left-radius: 4px; -} -.pagination > li:last-child > a, -.pagination > li:last-child > span { - border-top-right-radius: 4px; - border-bottom-right-radius: 4px; -} -.pagination > li > a:hover, -.pagination > li > span:hover, -.pagination > li > a:focus, -.pagination > li > span:focus { - color: #2a6496; - background-color: #eee; - border-color: #ddd; -} -.pagination > .active > a, -.pagination > .active > span, -.pagination > .active > a:hover, -.pagination > .active > span:hover, -.pagination > .active > a:focus, -.pagination > .active > span:focus { - z-index: 2; - color: #fff; - cursor: default; - background-color: #428bca; - border-color: #428bca; -} -.pagination > .disabled > span, -.pagination > .disabled > span:hover, -.pagination > .disabled > span:focus, -.pagination > .disabled > a, -.pagination > .disabled > a:hover, -.pagination > .disabled > a:focus { - color: #777; - cursor: not-allowed; - background-color: #fff; - border-color: #ddd; -} -.pagination-lg > li > a, -.pagination-lg > li > span { - padding: 10px 16px; - font-size: 18px; -} -.pagination-lg > li:first-child > a, -.pagination-lg > li:first-child > span { - border-top-left-radius: 6px; - border-bottom-left-radius: 6px; -} -.pagination-lg > li:last-child > a, -.pagination-lg > li:last-child > span { - border-top-right-radius: 6px; - border-bottom-right-radius: 6px; -} -.pagination-sm > li > a, -.pagination-sm > li > span { - padding: 5px 10px; - font-size: 12px; -} -.pagination-sm > li:first-child > a, -.pagination-sm > li:first-child > span { - border-top-left-radius: 3px; - border-bottom-left-radius: 3px; -} -.pagination-sm > li:last-child > a, -.pagination-sm > li:last-child > span { - border-top-right-radius: 3px; - border-bottom-right-radius: 3px; -} -.pager { - padding-left: 0; - margin: 20px 0; - text-align: center; - list-style: none; -} -.pager li { - display: inline; -} -.pager li > a, -.pager li > span { - display: inline-block; - padding: 5px 14px; - background-color: #fff; - border: 1px solid #ddd; - border-radius: 15px; -} -.pager li > a:hover, -.pager li > a:focus { - text-decoration: none; - background-color: #eee; -} -.pager .next > a, -.pager .next > span { - float: right; -} -.pager .previous > a, -.pager .previous > span { - float: left; -} -.pager .disabled > a, -.pager .disabled > a:hover, -.pager .disabled > a:focus, -.pager .disabled > span { - color: #777; - cursor: not-allowed; - background-color: #fff; -} -.label { - display: inline; - padding: .2em .6em .3em; - font-size: 75%; - font-weight: bold; - line-height: 1; - color: #fff; - text-align: center; - white-space: nowrap; - vertical-align: baseline; - border-radius: .25em; -} -a.label:hover, -a.label:focus { - color: #fff; - text-decoration: none; - cursor: pointer; -} -.label:empty { - display: none; -} -.btn .label { - position: relative; - top: -1px; -} -.label-default { - background-color: #777; -} -.label-default[href]:hover, -.label-default[href]:focus { - background-color: #5e5e5e; -} -.label-primary { - background-color: #428bca; -} -.label-primary[href]:hover, -.label-primary[href]:focus { - background-color: #3071a9; -} -.label-success { - background-color: #5cb85c; -} -.label-success[href]:hover, -.label-success[href]:focus { - background-color: #449d44; -} -.label-info { - background-color: #5bc0de; -} -.label-info[href]:hover, -.label-info[href]:focus { - background-color: #31b0d5; -} -.label-warning { - background-color: #f0ad4e; -} -.label-warning[href]:hover, -.label-warning[href]:focus { - background-color: #ec971f; -} -.label-danger { - background-color: #d9534f; -} -.label-danger[href]:hover, -.label-danger[href]:focus { - background-color: #c9302c; -} -.badge { - display: inline-block; - min-width: 10px; - padding: 3px 7px; - font-size: 12px; - font-weight: bold; - line-height: 1; - color: #fff; - text-align: center; - white-space: nowrap; - vertical-align: baseline; - background-color: #777; - border-radius: 10px; -} -.badge:empty { - display: none; -} -.btn .badge { - position: relative; - top: -1px; -} -.btn-xs .badge { - top: 0; - padding: 1px 5px; -} -a.badge:hover, -a.badge:focus { - color: #fff; - text-decoration: none; - cursor: pointer; -} -a.list-group-item.active > .badge, -.nav-pills > .active > a > .badge { - color: #428bca; - background-color: #fff; -} -.nav-pills > li > a > .badge { - margin-left: 3px; -} -.jumbotron { - padding: 30px; - margin-bottom: 30px; - color: inherit; - background-color: #eee; -} -.jumbotron h1, -.jumbotron .h1 { - color: inherit; -} -.jumbotron p { - margin-bottom: 15px; - font-size: 21px; - font-weight: 200; -} -.jumbotron > hr { - border-top-color: #d5d5d5; -} -.container .jumbotron { - border-radius: 6px; -} -.jumbotron .container { - max-width: 100%; -} -@media screen and (min-width: 768px) { - .jumbotron { - padding-top: 48px; - padding-bottom: 48px; - } - .container .jumbotron { - padding-right: 60px; - padding-left: 60px; - } - .jumbotron h1, - .jumbotron .h1 { - font-size: 63px; - } -} -.thumbnail { - display: block; - padding: 4px; - margin-bottom: 20px; - line-height: 1.42857143; - background-color: #fff; - border: 1px solid #ddd; - border-radius: 4px; - -webkit-transition: all .2s ease-in-out; - -o-transition: all .2s ease-in-out; - transition: all .2s ease-in-out; -} -.thumbnail > img, -.thumbnail a > img { - margin-right: auto; - margin-left: auto; -} -a.thumbnail:hover, -a.thumbnail:focus, -a.thumbnail.active { - border-color: #428bca; -} -.thumbnail .caption { - padding: 9px; - color: #333; -} -.alert { - padding: 15px; - margin-bottom: 20px; - border: 1px solid transparent; - border-radius: 4px; -} -.alert h4 { - margin-top: 0; - color: inherit; -} -.alert .alert-link { - font-weight: bold; -} -.alert > p, -.alert > ul { - margin-bottom: 0; -} -.alert > p + p { - margin-top: 5px; -} -.alert-dismissable, -.alert-dismissible { - padding-right: 35px; -} -.alert-dismissable .close, -.alert-dismissible .close { - position: relative; - top: -2px; - right: -21px; - color: inherit; -} -.alert-success { - color: #3c763d; - background-color: #dff0d8; - border-color: #d6e9c6; -} -.alert-success hr { - border-top-color: #c9e2b3; -} -.alert-success .alert-link { - color: #2b542c; -} -.alert-info { - color: #31708f; - background-color: #d9edf7; - border-color: #bce8f1; -} -.alert-info hr { - border-top-color: #a6e1ec; -} -.alert-info .alert-link { - color: #245269; -} -.alert-warning { - color: #8a6d3b; - background-color: #fcf8e3; - border-color: #faebcc; -} -.alert-warning hr { - border-top-color: #f7e1b5; -} -.alert-warning .alert-link { - color: #66512c; -} -.alert-danger { - color: #a94442; - background-color: #f2dede; - border-color: #ebccd1; -} -.alert-danger hr { - border-top-color: #e4b9c0; -} -.alert-danger .alert-link { - color: #843534; -} -@-webkit-keyframes progress-bar-stripes { - from { - background-position: 40px 0; - } - to { - background-position: 0 0; - } -} -@-o-keyframes progress-bar-stripes { - from { - background-position: 40px 0; - } - to { - background-position: 0 0; - } -} -@keyframes progress-bar-stripes { - from { - background-position: 40px 0; - } - to { - background-position: 0 0; - } -} -.progress { - height: 20px; - margin-bottom: 20px; - overflow: hidden; - background-color: #f5f5f5; - border-radius: 4px; - -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, .1); - box-shadow: inset 0 1px 2px rgba(0, 0, 0, .1); -} -.progress-bar { - float: left; - width: 0; - height: 100%; - font-size: 12px; - line-height: 20px; - color: #fff; - text-align: center; - background-color: #428bca; - -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, .15); - box-shadow: inset 0 -1px 0 rgba(0, 0, 0, .15); - -webkit-transition: width .6s ease; - -o-transition: width .6s ease; - transition: width .6s ease; -} -.progress-striped .progress-bar, -.progress-bar-striped { - background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); - background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); - background-image: linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); - -webkit-background-size: 40px 40px; - background-size: 40px 40px; -} -.progress.active .progress-bar, -.progress-bar.active { - -webkit-animation: progress-bar-stripes 2s linear infinite; - -o-animation: progress-bar-stripes 2s linear infinite; - animation: progress-bar-stripes 2s linear infinite; -} -.progress-bar[aria-valuenow="1"], -.progress-bar[aria-valuenow="2"] { - min-width: 30px; -} -.progress-bar[aria-valuenow="0"] { - min-width: 30px; - color: #777; - background-color: transparent; - background-image: none; - -webkit-box-shadow: none; - box-shadow: none; -} -.progress-bar-success { - background-color: #5cb85c; -} -.progress-striped .progress-bar-success { - background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); - background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); - background-image: linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); -} -.progress-bar-info { - background-color: #5bc0de; -} -.progress-striped .progress-bar-info { - background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); - background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); - background-image: linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); -} -.progress-bar-warning { - background-color: #f0ad4e; -} -.progress-striped .progress-bar-warning { - background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); - background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); - background-image: linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); -} -.progress-bar-danger { - background-color: #d9534f; -} -.progress-striped .progress-bar-danger { - background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); - background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); - background-image: linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); -} -.media, -.media-body { - overflow: hidden; - zoom: 1; -} -.media, -.media .media { - margin-top: 15px; -} -.media:first-child { - margin-top: 0; -} -.media-object { - display: block; -} -.media-heading { - margin: 0 0 5px; -} -.media > .pull-left { - margin-right: 10px; -} -.media > .pull-right { - margin-left: 10px; -} -.media-list { - padding-left: 0; - list-style: none; -} -.list-group { - padding-left: 0; - margin-bottom: 20px; -} -.list-group-item { - position: relative; - display: block; - padding: 10px 15px; - margin-bottom: -1px; - background-color: #fff; - border: 1px solid #ddd; -} -.list-group-item:first-child { - border-top-left-radius: 4px; - border-top-right-radius: 4px; -} -.list-group-item:last-child { - margin-bottom: 0; - border-bottom-right-radius: 4px; - border-bottom-left-radius: 4px; -} -.list-group-item > .badge { - float: right; -} -.list-group-item > .badge + .badge { - margin-right: 5px; -} -a.list-group-item { - color: #555; -} -a.list-group-item .list-group-item-heading { - color: #333; -} -a.list-group-item:hover, -a.list-group-item:focus { - color: #555; - text-decoration: none; - background-color: #f5f5f5; -} -.list-group-item.disabled, -.list-group-item.disabled:hover, -.list-group-item.disabled:focus { - color: #777; - background-color: #eee; -} -.list-group-item.disabled .list-group-item-heading, -.list-group-item.disabled:hover .list-group-item-heading, -.list-group-item.disabled:focus .list-group-item-heading { - color: inherit; -} -.list-group-item.disabled .list-group-item-text, -.list-group-item.disabled:hover .list-group-item-text, -.list-group-item.disabled:focus .list-group-item-text { - color: #777; -} -.list-group-item.active, -.list-group-item.active:hover, -.list-group-item.active:focus { - z-index: 2; - color: #fff; - background-color: #428bca; - border-color: #428bca; -} -.list-group-item.active .list-group-item-heading, -.list-group-item.active:hover .list-group-item-heading, -.list-group-item.active:focus .list-group-item-heading, -.list-group-item.active .list-group-item-heading > small, -.list-group-item.active:hover .list-group-item-heading > small, -.list-group-item.active:focus .list-group-item-heading > small, -.list-group-item.active .list-group-item-heading > .small, -.list-group-item.active:hover .list-group-item-heading > .small, -.list-group-item.active:focus .list-group-item-heading > .small { - color: inherit; -} -.list-group-item.active .list-group-item-text, -.list-group-item.active:hover .list-group-item-text, -.list-group-item.active:focus .list-group-item-text { - color: #e1edf7; -} -.list-group-item-success { - color: #3c763d; - background-color: #dff0d8; -} -a.list-group-item-success { - color: #3c763d; -} -a.list-group-item-success .list-group-item-heading { - color: inherit; -} -a.list-group-item-success:hover, -a.list-group-item-success:focus { - color: #3c763d; - background-color: #d0e9c6; -} -a.list-group-item-success.active, -a.list-group-item-success.active:hover, -a.list-group-item-success.active:focus { - color: #fff; - background-color: #3c763d; - border-color: #3c763d; -} -.list-group-item-info { - color: #31708f; - background-color: #d9edf7; -} -a.list-group-item-info { - color: #31708f; -} -a.list-group-item-info .list-group-item-heading { - color: inherit; -} -a.list-group-item-info:hover, -a.list-group-item-info:focus { - color: #31708f; - background-color: #c4e3f3; -} -a.list-group-item-info.active, -a.list-group-item-info.active:hover, -a.list-group-item-info.active:focus { - color: #fff; - background-color: #31708f; - border-color: #31708f; -} -.list-group-item-warning { - color: #8a6d3b; - background-color: #fcf8e3; -} -a.list-group-item-warning { - color: #8a6d3b; -} -a.list-group-item-warning .list-group-item-heading { - color: inherit; -} -a.list-group-item-warning:hover, -a.list-group-item-warning:focus { - color: #8a6d3b; - background-color: #faf2cc; -} -a.list-group-item-warning.active, -a.list-group-item-warning.active:hover, -a.list-group-item-warning.active:focus { - color: #fff; - background-color: #8a6d3b; - border-color: #8a6d3b; -} -.list-group-item-danger { - color: #a94442; - background-color: #f2dede; -} -a.list-group-item-danger { - color: #a94442; -} -a.list-group-item-danger .list-group-item-heading { - color: inherit; -} -a.list-group-item-danger:hover, -a.list-group-item-danger:focus { - color: #a94442; - background-color: #ebcccc; -} -a.list-group-item-danger.active, -a.list-group-item-danger.active:hover, -a.list-group-item-danger.active:focus { - color: #fff; - background-color: #a94442; - border-color: #a94442; -} -.list-group-item-heading { - margin-top: 0; - margin-bottom: 5px; -} -.list-group-item-text { - margin-bottom: 0; - line-height: 1.3; -} -.panel { - margin-bottom: 20px; - background-color: #fff; - border: 1px solid transparent; - border-radius: 4px; - -webkit-box-shadow: 0 1px 1px rgba(0, 0, 0, .05); - box-shadow: 0 1px 1px rgba(0, 0, 0, .05); -} -.panel-body { - padding: 15px; -} -.panel-heading { - padding: 10px 15px; - border-bottom: 1px solid transparent; - border-top-left-radius: 3px; - border-top-right-radius: 3px; -} -.panel-heading > .dropdown .dropdown-toggle { - color: inherit; -} -.panel-title { - margin-top: 0; - margin-bottom: 0; - font-size: 16px; - color: inherit; -} -.panel-title > a { - color: inherit; -} -.panel-footer { - padding: 10px 15px; - background-color: #f5f5f5; - border-top: 1px solid #ddd; - border-bottom-right-radius: 3px; - border-bottom-left-radius: 3px; -} -.panel > .list-group { - margin-bottom: 0; -} -.panel > .list-group .list-group-item { - border-width: 1px 0; - border-radius: 0; -} -.panel > .list-group:first-child .list-group-item:first-child { - border-top: 0; - border-top-left-radius: 3px; - border-top-right-radius: 3px; -} -.panel > .list-group:last-child .list-group-item:last-child { - border-bottom: 0; - border-bottom-right-radius: 3px; - border-bottom-left-radius: 3px; -} -.panel-heading + .list-group .list-group-item:first-child { - border-top-width: 0; -} -.list-group + .panel-footer { - border-top-width: 0; -} -.panel > .table, -.panel > .table-responsive > .table, -.panel > .panel-collapse > .table { - margin-bottom: 0; -} -.panel > .table:first-child, -.panel > .table-responsive:first-child > .table:first-child { - border-top-left-radius: 3px; - border-top-right-radius: 3px; -} -.panel > .table:first-child > thead:first-child > tr:first-child td:first-child, -.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:first-child, -.panel > .table:first-child > tbody:first-child > tr:first-child td:first-child, -.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child td:first-child, -.panel > .table:first-child > thead:first-child > tr:first-child th:first-child, -.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:first-child, -.panel > .table:first-child > tbody:first-child > tr:first-child th:first-child, -.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:first-child { - border-top-left-radius: 3px; -} -.panel > .table:first-child > thead:first-child > tr:first-child td:last-child, -.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:last-child, -.panel > .table:first-child > tbody:first-child > tr:first-child td:last-child, -.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child td:last-child, -.panel > .table:first-child > thead:first-child > tr:first-child th:last-child, -.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:last-child, -.panel > .table:first-child > tbody:first-child > tr:first-child th:last-child, -.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:last-child { - border-top-right-radius: 3px; -} -.panel > .table:last-child, -.panel > .table-responsive:last-child > .table:last-child { - border-bottom-right-radius: 3px; - border-bottom-left-radius: 3px; -} -.panel > .table:last-child > tbody:last-child > tr:last-child td:first-child, -.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:first-child, -.panel > .table:last-child > tfoot:last-child > tr:last-child td:first-child, -.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child td:first-child, -.panel > .table:last-child > tbody:last-child > tr:last-child th:first-child, -.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:first-child, -.panel > .table:last-child > tfoot:last-child > tr:last-child th:first-child, -.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:first-child { - border-bottom-left-radius: 3px; -} -.panel > .table:last-child > tbody:last-child > tr:last-child td:last-child, -.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:last-child, -.panel > .table:last-child > tfoot:last-child > tr:last-child td:last-child, -.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child td:last-child, -.panel > .table:last-child > tbody:last-child > tr:last-child th:last-child, -.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:last-child, -.panel > .table:last-child > tfoot:last-child > tr:last-child th:last-child, -.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:last-child { - border-bottom-right-radius: 3px; -} -.panel > .panel-body + .table, -.panel > .panel-body + .table-responsive { - border-top: 1px solid #ddd; -} -.panel > .table > tbody:first-child > tr:first-child th, -.panel > .table > tbody:first-child > tr:first-child td { - border-top: 0; -} -.panel > .table-bordered, -.panel > .table-responsive > .table-bordered { - border: 0; -} -.panel > .table-bordered > thead > tr > th:first-child, -.panel > .table-responsive > .table-bordered > thead > tr > th:first-child, -.panel > .table-bordered > tbody > tr > th:first-child, -.panel > .table-responsive > .table-bordered > tbody > tr > th:first-child, -.panel > .table-bordered > tfoot > tr > th:first-child, -.panel > .table-responsive > .table-bordered > tfoot > tr > th:first-child, -.panel > .table-bordered > thead > tr > td:first-child, -.panel > .table-responsive > .table-bordered > thead > tr > td:first-child, -.panel > .table-bordered > tbody > tr > td:first-child, -.panel > .table-responsive > .table-bordered > tbody > tr > td:first-child, -.panel > .table-bordered > tfoot > tr > td:first-child, -.panel > .table-responsive > .table-bordered > tfoot > tr > td:first-child { - border-left: 0; -} -.panel > .table-bordered > thead > tr > th:last-child, -.panel > .table-responsive > .table-bordered > thead > tr > th:last-child, -.panel > .table-bordered > tbody > tr > th:last-child, -.panel > .table-responsive > .table-bordered > tbody > tr > th:last-child, -.panel > .table-bordered > tfoot > tr > th:last-child, -.panel > .table-responsive > .table-bordered > tfoot > tr > th:last-child, -.panel > .table-bordered > thead > tr > td:last-child, -.panel > .table-responsive > .table-bordered > thead > tr > td:last-child, -.panel > .table-bordered > tbody > tr > td:last-child, -.panel > .table-responsive > .table-bordered > tbody > tr > td:last-child, -.panel > .table-bordered > tfoot > tr > td:last-child, -.panel > .table-responsive > .table-bordered > tfoot > tr > td:last-child { - border-right: 0; -} -.panel > .table-bordered > thead > tr:first-child > td, -.panel > .table-responsive > .table-bordered > thead > tr:first-child > td, -.panel > .table-bordered > tbody > tr:first-child > td, -.panel > .table-responsive > .table-bordered > tbody > tr:first-child > td, -.panel > .table-bordered > thead > tr:first-child > th, -.panel > .table-responsive > .table-bordered > thead > tr:first-child > th, -.panel > .table-bordered > tbody > tr:first-child > th, -.panel > .table-responsive > .table-bordered > tbody > tr:first-child > th { - border-bottom: 0; -} -.panel > .table-bordered > tbody > tr:last-child > td, -.panel > .table-responsive > .table-bordered > tbody > tr:last-child > td, -.panel > .table-bordered > tfoot > tr:last-child > td, -.panel > .table-responsive > .table-bordered > tfoot > tr:last-child > td, -.panel > .table-bordered > tbody > tr:last-child > th, -.panel > .table-responsive > .table-bordered > tbody > tr:last-child > th, -.panel > .table-bordered > tfoot > tr:last-child > th, -.panel > .table-responsive > .table-bordered > tfoot > tr:last-child > th { - border-bottom: 0; -} -.panel > .table-responsive { - margin-bottom: 0; - border: 0; -} -.panel-group { - margin-bottom: 20px; -} -.panel-group .panel { - margin-bottom: 0; - border-radius: 4px; -} -.panel-group .panel + .panel { - margin-top: 5px; -} -.panel-group .panel-heading { - border-bottom: 0; -} -.panel-group .panel-heading + .panel-collapse > .panel-body { - border-top: 1px solid #ddd; -} -.panel-group .panel-footer { - border-top: 0; -} -.panel-group .panel-footer + .panel-collapse .panel-body { - border-bottom: 1px solid #ddd; -} -.panel-default { - border-color: #ddd; -} -.panel-default > .panel-heading { - color: #333; - background-color: #f5f5f5; - border-color: #ddd; -} -.panel-default > .panel-heading + .panel-collapse > .panel-body { - border-top-color: #ddd; -} -.panel-default > .panel-heading .badge { - color: #f5f5f5; - background-color: #333; -} -.panel-default > .panel-footer + .panel-collapse > .panel-body { - border-bottom-color: #ddd; -} -.panel-primary { - border-color: #428bca; -} -.panel-primary > .panel-heading { - color: #fff; - background-color: #428bca; - border-color: #428bca; -} -.panel-primary > .panel-heading + .panel-collapse > .panel-body { - border-top-color: #428bca; -} -.panel-primary > .panel-heading .badge { - color: #428bca; - background-color: #fff; -} -.panel-primary > .panel-footer + .panel-collapse > .panel-body { - border-bottom-color: #428bca; -} -.panel-success { - border-color: #d6e9c6; -} -.panel-success > .panel-heading { - color: #3c763d; - background-color: #dff0d8; - border-color: #d6e9c6; -} -.panel-success > .panel-heading + .panel-collapse > .panel-body { - border-top-color: #d6e9c6; -} -.panel-success > .panel-heading .badge { - color: #dff0d8; - background-color: #3c763d; -} -.panel-success > .panel-footer + .panel-collapse > .panel-body { - border-bottom-color: #d6e9c6; -} -.panel-info { - border-color: #bce8f1; -} -.panel-info > .panel-heading { - color: #31708f; - background-color: #d9edf7; - border-color: #bce8f1; -} -.panel-info > .panel-heading + .panel-collapse > .panel-body { - border-top-color: #bce8f1; -} -.panel-info > .panel-heading .badge { - color: #d9edf7; - background-color: #31708f; -} -.panel-info > .panel-footer + .panel-collapse > .panel-body { - border-bottom-color: #bce8f1; -} -.panel-warning { - border-color: #faebcc; -} -.panel-warning > .panel-heading { - color: #8a6d3b; - background-color: #fcf8e3; - border-color: #faebcc; -} -.panel-warning > .panel-heading + .panel-collapse > .panel-body { - border-top-color: #faebcc; -} -.panel-warning > .panel-heading .badge { - color: #fcf8e3; - background-color: #8a6d3b; -} -.panel-warning > .panel-footer + .panel-collapse > .panel-body { - border-bottom-color: #faebcc; -} -.panel-danger { - border-color: #ebccd1; -} -.panel-danger > .panel-heading { - color: #a94442; - background-color: #f2dede; - border-color: #ebccd1; -} -.panel-danger > .panel-heading + .panel-collapse > .panel-body { - border-top-color: #ebccd1; -} -.panel-danger > .panel-heading .badge { - color: #f2dede; - background-color: #a94442; -} -.panel-danger > .panel-footer + .panel-collapse > .panel-body { - border-bottom-color: #ebccd1; -} -.embed-responsive { - position: relative; - display: block; - height: 0; - padding: 0; - overflow: hidden; -} -.embed-responsive .embed-responsive-item, -.embed-responsive iframe, -.embed-responsive embed, -.embed-responsive object { - position: absolute; - top: 0; - bottom: 0; - left: 0; - width: 100%; - height: 100%; - border: 0; -} -.embed-responsive.embed-responsive-16by9 { - padding-bottom: 56.25%; -} -.embed-responsive.embed-responsive-4by3 { - padding-bottom: 75%; -} -.well { - min-height: 20px; - padding: 19px; - margin-bottom: 20px; - background-color: #f5f5f5; - border: 1px solid #e3e3e3; - border-radius: 4px; - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .05); - box-shadow: inset 0 1px 1px rgba(0, 0, 0, .05); -} -.well blockquote { - border-color: #ddd; - border-color: rgba(0, 0, 0, .15); -} -.well-lg { - padding: 24px; - border-radius: 6px; -} -.well-sm { - padding: 9px; - border-radius: 3px; -} -.close { - float: right; - font-size: 21px; - font-weight: bold; - line-height: 1; - color: #000; - text-shadow: 0 1px 0 #fff; - filter: alpha(opacity=20); - opacity: .2; -} -.close:hover, -.close:focus { - color: #000; - text-decoration: none; - cursor: pointer; - filter: alpha(opacity=50); - opacity: .5; -} -button.close { - -webkit-appearance: none; - padding: 0; - cursor: pointer; - background: transparent; - border: 0; -} -.modal-open { - overflow: hidden; -} -.modal { - position: fixed; - top: 0; - right: 0; - bottom: 0; - left: 0; - z-index: 1050; - display: none; - overflow: hidden; - -webkit-overflow-scrolling: touch; - outline: 0; -} -.modal.fade .modal-dialog { - -webkit-transition: -webkit-transform .3s ease-out; - -o-transition: -o-transform .3s ease-out; - transition: transform .3s ease-out; - -webkit-transform: translate3d(0, -25%, 0); - -o-transform: translate3d(0, -25%, 0); - transform: translate3d(0, -25%, 0); -} -.modal.in .modal-dialog { - -webkit-transform: translate3d(0, 0, 0); - -o-transform: translate3d(0, 0, 0); - transform: translate3d(0, 0, 0); -} -.modal-open .modal { - overflow-x: hidden; - overflow-y: auto; -} -.modal-dialog { - position: relative; - width: auto; - margin: 10px; -} -.modal-content { - position: relative; - background-color: #fff; - -webkit-background-clip: padding-box; - background-clip: padding-box; - border: 1px solid #999; - border: 1px solid rgba(0, 0, 0, .2); - border-radius: 6px; - outline: 0; - -webkit-box-shadow: 0 3px 9px rgba(0, 0, 0, .5); - box-shadow: 0 3px 9px rgba(0, 0, 0, .5); -} -.modal-backdrop { - position: fixed; - top: 0; - right: 0; - bottom: 0; - left: 0; - z-index: 1040; - background-color: #000; -} -.modal-backdrop.fade { - filter: alpha(opacity=0); - opacity: 0; -} -.modal-backdrop.in { - filter: alpha(opacity=50); - opacity: .5; -} -.modal-header { - min-height: 16.42857143px; - padding: 15px; - border-bottom: 1px solid #e5e5e5; -} -.modal-header .close { - margin-top: -2px; -} -.modal-title { - margin: 0; - line-height: 1.42857143; -} -.modal-body { - position: relative; - padding: 15px; -} -.modal-footer { - padding: 15px; - text-align: right; - border-top: 1px solid #e5e5e5; -} -.modal-footer .btn + .btn { - margin-bottom: 0; - margin-left: 5px; -} -.modal-footer .btn-group .btn + .btn { - margin-left: -1px; -} -.modal-footer .btn-block + .btn-block { - margin-left: 0; -} -.modal-scrollbar-measure { - position: absolute; - top: -9999px; - width: 50px; - height: 50px; - overflow: scroll; -} -@media (min-width: 768px) { - .modal-dialog { - width: 600px; - margin: 30px auto; - } - .modal-content { - -webkit-box-shadow: 0 5px 15px rgba(0, 0, 0, .5); - box-shadow: 0 5px 15px rgba(0, 0, 0, .5); - } - .modal-sm { - width: 300px; - } -} -@media (min-width: 992px) { - .modal-lg { - width: 900px; - } -} -.tooltip { - position: absolute; - z-index: 1070; - display: block; - font-size: 12px; - line-height: 1.4; - visibility: visible; - filter: alpha(opacity=0); - opacity: 0; -} -.tooltip.in { - filter: alpha(opacity=90); - opacity: .9; -} -.tooltip.top { - padding: 5px 0; - margin-top: -3px; -} -.tooltip.right { - padding: 0 5px; - margin-left: 3px; -} -.tooltip.bottom { - padding: 5px 0; - margin-top: 3px; -} -.tooltip.left { - padding: 0 5px; - margin-left: -3px; -} -.tooltip-inner { - max-width: 200px; - padding: 3px 8px; - color: #fff; - text-align: center; - text-decoration: none; - background-color: #000; - border-radius: 4px; -} -.tooltip-arrow { - position: absolute; - width: 0; - height: 0; - border-color: transparent; - border-style: solid; -} -.tooltip.top .tooltip-arrow { - bottom: 0; - left: 50%; - margin-left: -5px; - border-width: 5px 5px 0; - border-top-color: #000; -} -.tooltip.top-left .tooltip-arrow { - bottom: 0; - left: 5px; - border-width: 5px 5px 0; - border-top-color: #000; -} -.tooltip.top-right .tooltip-arrow { - right: 5px; - bottom: 0; - border-width: 5px 5px 0; - border-top-color: #000; -} -.tooltip.right .tooltip-arrow { - top: 50%; - left: 0; - margin-top: -5px; - border-width: 5px 5px 5px 0; - border-right-color: #000; -} -.tooltip.left .tooltip-arrow { - top: 50%; - right: 0; - margin-top: -5px; - border-width: 5px 0 5px 5px; - border-left-color: #000; -} -.tooltip.bottom .tooltip-arrow { - top: 0; - left: 50%; - margin-left: -5px; - border-width: 0 5px 5px; - border-bottom-color: #000; -} -.tooltip.bottom-left .tooltip-arrow { - top: 0; - left: 5px; - border-width: 0 5px 5px; - border-bottom-color: #000; -} -.tooltip.bottom-right .tooltip-arrow { - top: 0; - right: 5px; - border-width: 0 5px 5px; - border-bottom-color: #000; -} -.popover { - position: absolute; - top: 0; - left: 0; - z-index: 1060; - display: none; - max-width: 276px; - padding: 1px; - text-align: left; - white-space: normal; - background-color: #fff; - -webkit-background-clip: padding-box; - background-clip: padding-box; - border: 1px solid #ccc; - border: 1px solid rgba(0, 0, 0, .2); - border-radius: 6px; - -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, .2); - box-shadow: 0 5px 10px rgba(0, 0, 0, .2); -} -.popover.top { - margin-top: -10px; -} -.popover.right { - margin-left: 10px; -} -.popover.bottom { - margin-top: 10px; -} -.popover.left { - margin-left: -10px; -} -.popover-title { - padding: 8px 14px; - margin: 0; - font-size: 14px; - font-weight: normal; - line-height: 18px; - background-color: #f7f7f7; - border-bottom: 1px solid #ebebeb; - border-radius: 5px 5px 0 0; -} -.popover-content { - padding: 9px 14px; -} -.popover > .arrow, -.popover > .arrow:after { - position: absolute; - display: block; - width: 0; - height: 0; - border-color: transparent; - border-style: solid; -} -.popover > .arrow { - border-width: 11px; -} -.popover > .arrow:after { - content: ""; - border-width: 10px; -} -.popover.top > .arrow { - bottom: -11px; - left: 50%; - margin-left: -11px; - border-top-color: #999; - border-top-color: rgba(0, 0, 0, .25); - border-bottom-width: 0; -} -.popover.top > .arrow:after { - bottom: 1px; - margin-left: -10px; - content: " "; - border-top-color: #fff; - border-bottom-width: 0; -} -.popover.right > .arrow { - top: 50%; - left: -11px; - margin-top: -11px; - border-right-color: #999; - border-right-color: rgba(0, 0, 0, .25); - border-left-width: 0; -} -.popover.right > .arrow:after { - bottom: -10px; - left: 1px; - content: " "; - border-right-color: #fff; - border-left-width: 0; -} -.popover.bottom > .arrow { - top: -11px; - left: 50%; - margin-left: -11px; - border-top-width: 0; - border-bottom-color: #999; - border-bottom-color: rgba(0, 0, 0, .25); -} -.popover.bottom > .arrow:after { - top: 1px; - margin-left: -10px; - content: " "; - border-top-width: 0; - border-bottom-color: #fff; -} -.popover.left > .arrow { - top: 50%; - right: -11px; - margin-top: -11px; - border-right-width: 0; - border-left-color: #999; - border-left-color: rgba(0, 0, 0, .25); -} -.popover.left > .arrow:after { - right: 1px; - bottom: -10px; - content: " "; - border-right-width: 0; - border-left-color: #fff; -} -.carousel { - position: relative; -} -.carousel-inner { - position: relative; - width: 100%; - overflow: hidden; -} -.carousel-inner > .item { - position: relative; - display: none; - -webkit-transition: .6s ease-in-out left; - -o-transition: .6s ease-in-out left; - transition: .6s ease-in-out left; -} -.carousel-inner > .item > img, -.carousel-inner > .item > a > img { - line-height: 1; -} -.carousel-inner > .active, -.carousel-inner > .next, -.carousel-inner > .prev { - display: block; -} -.carousel-inner > .active { - left: 0; -} -.carousel-inner > .next, -.carousel-inner > .prev { - position: absolute; - top: 0; - width: 100%; -} -.carousel-inner > .next { - left: 100%; -} -.carousel-inner > .prev { - left: -100%; -} -.carousel-inner > .next.left, -.carousel-inner > .prev.right { - left: 0; -} -.carousel-inner > .active.left { - left: -100%; -} -.carousel-inner > .active.right { - left: 100%; -} -.carousel-control { - position: absolute; - top: 0; - bottom: 0; - left: 0; - width: 15%; - font-size: 20px; - color: #fff; - text-align: center; - text-shadow: 0 1px 2px rgba(0, 0, 0, .6); - filter: alpha(opacity=50); - opacity: .5; -} -.carousel-control.left { - background-image: -webkit-linear-gradient(left, rgba(0, 0, 0, .5) 0%, rgba(0, 0, 0, .0001) 100%); - background-image: -o-linear-gradient(left, rgba(0, 0, 0, .5) 0%, rgba(0, 0, 0, .0001) 100%); - background-image: -webkit-gradient(linear, left top, right top, from(rgba(0, 0, 0, .5)), to(rgba(0, 0, 0, .0001))); - background-image: linear-gradient(to right, rgba(0, 0, 0, .5) 0%, rgba(0, 0, 0, .0001) 100%); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1); - background-repeat: repeat-x; -} -.carousel-control.right { - right: 0; - left: auto; - background-image: -webkit-linear-gradient(left, rgba(0, 0, 0, .0001) 0%, rgba(0, 0, 0, .5) 100%); - background-image: -o-linear-gradient(left, rgba(0, 0, 0, .0001) 0%, rgba(0, 0, 0, .5) 100%); - background-image: -webkit-gradient(linear, left top, right top, from(rgba(0, 0, 0, .0001)), to(rgba(0, 0, 0, .5))); - background-image: linear-gradient(to right, rgba(0, 0, 0, .0001) 0%, rgba(0, 0, 0, .5) 100%); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1); - background-repeat: repeat-x; -} -.carousel-control:hover, -.carousel-control:focus { - color: #fff; - text-decoration: none; - filter: alpha(opacity=90); - outline: 0; - opacity: .9; -} -.carousel-control .icon-prev, -.carousel-control .icon-next, -.carousel-control .glyphicon-chevron-left, -.carousel-control .glyphicon-chevron-right { - position: absolute; - top: 50%; - z-index: 5; - display: inline-block; -} -.carousel-control .icon-prev, -.carousel-control .glyphicon-chevron-left { - left: 50%; - margin-left: -10px; -} -.carousel-control .icon-next, -.carousel-control .glyphicon-chevron-right { - right: 50%; - margin-right: -10px; -} -.carousel-control .icon-prev, -.carousel-control .icon-next { - width: 20px; - height: 20px; - margin-top: -10px; - font-family: serif; -} -.carousel-control .icon-prev:before { - content: '\2039'; -} -.carousel-control .icon-next:before { - content: '\203a'; -} -.carousel-indicators { - position: absolute; - bottom: 10px; - left: 50%; - z-index: 15; - width: 60%; - padding-left: 0; - margin-left: -30%; - text-align: center; - list-style: none; -} -.carousel-indicators li { - display: inline-block; - width: 10px; - height: 10px; - margin: 1px; - text-indent: -999px; - cursor: pointer; - background-color: #000 \9; - background-color: rgba(0, 0, 0, 0); - border: 1px solid #fff; - border-radius: 10px; -} -.carousel-indicators .active { - width: 12px; - height: 12px; - margin: 0; - background-color: #fff; -} -.carousel-caption { - position: absolute; - right: 15%; - bottom: 20px; - left: 15%; - z-index: 10; - padding-top: 20px; - padding-bottom: 20px; - color: #fff; - text-align: center; - text-shadow: 0 1px 2px rgba(0, 0, 0, .6); -} -.carousel-caption .btn { - text-shadow: none; -} -@media screen and (min-width: 768px) { - .carousel-control .glyphicon-chevron-left, - .carousel-control .glyphicon-chevron-right, - .carousel-control .icon-prev, - .carousel-control .icon-next { - width: 30px; - height: 30px; - margin-top: -15px; - font-size: 30px; - } - .carousel-control .glyphicon-chevron-left, - .carousel-control .icon-prev { - margin-left: -15px; - } - .carousel-control .glyphicon-chevron-right, - .carousel-control .icon-next { - margin-right: -15px; - } - .carousel-caption { - right: 20%; - left: 20%; - padding-bottom: 30px; - } - .carousel-indicators { - bottom: 20px; - } -} -.clearfix:before, -.clearfix:after, -.dl-horizontal dd:before, -.dl-horizontal dd:after, -.container:before, -.container:after, -.container-fluid:before, -.container-fluid:after, -.row:before, -.row:after, -.form-horizontal .form-group:before, -.form-horizontal .form-group:after, -.btn-toolbar:before, -.btn-toolbar:after, -.btn-group-vertical > .btn-group:before, -.btn-group-vertical > .btn-group:after, -.nav:before, -.nav:after, -.navbar:before, -.navbar:after, -.navbar-header:before, -.navbar-header:after, -.navbar-collapse:before, -.navbar-collapse:after, -.pager:before, -.pager:after, -.panel-body:before, -.panel-body:after, -.modal-footer:before, -.modal-footer:after { - display: table; - content: " "; -} -.clearfix:after, -.dl-horizontal dd:after, -.container:after, -.container-fluid:after, -.row:after, -.form-horizontal .form-group:after, -.btn-toolbar:after, -.btn-group-vertical > .btn-group:after, -.nav:after, -.navbar:after, -.navbar-header:after, -.navbar-collapse:after, -.pager:after, -.panel-body:after, -.modal-footer:after { - clear: both; -} -.center-block { - display: block; - margin-right: auto; - margin-left: auto; -} -.pull-right { - float: right !important; -} -.pull-left { - float: left !important; -} -.hide { - display: none !important; -} -.show { - display: block !important; -} -.invisible { - visibility: hidden; -} -.text-hide { - font: 0/0 a; - color: transparent; - text-shadow: none; - background-color: transparent; - border: 0; -} -.hidden { - display: none !important; - visibility: hidden !important; -} -.affix { - position: fixed; - -webkit-transform: translate3d(0, 0, 0); - -o-transform: translate3d(0, 0, 0); - transform: translate3d(0, 0, 0); -} -@-ms-viewport { - width: device-width; -} -.visible-xs, -.visible-sm, -.visible-md, -.visible-lg { - display: none !important; -} -.visible-xs-block, -.visible-xs-inline, -.visible-xs-inline-block, -.visible-sm-block, -.visible-sm-inline, -.visible-sm-inline-block, -.visible-md-block, -.visible-md-inline, -.visible-md-inline-block, -.visible-lg-block, -.visible-lg-inline, -.visible-lg-inline-block { - display: none !important; -} -@media (max-width: 767px) { - .visible-xs { - display: block !important; - } - table.visible-xs { - display: table; - } - tr.visible-xs { - display: table-row !important; - } - th.visible-xs, - td.visible-xs { - display: table-cell !important; - } -} -@media (max-width: 767px) { - .visible-xs-block { - display: block !important; - } -} -@media (max-width: 767px) { - .visible-xs-inline { - display: inline !important; - } -} -@media (max-width: 767px) { - .visible-xs-inline-block { - display: inline-block !important; - } -} -@media (min-width: 768px) and (max-width: 991px) { - .visible-sm { - display: block !important; - } - table.visible-sm { - display: table; - } - tr.visible-sm { - display: table-row !important; - } - th.visible-sm, - td.visible-sm { - display: table-cell !important; - } -} -@media (min-width: 768px) and (max-width: 991px) { - .visible-sm-block { - display: block !important; - } -} -@media (min-width: 768px) and (max-width: 991px) { - .visible-sm-inline { - display: inline !important; - } -} -@media (min-width: 768px) and (max-width: 991px) { - .visible-sm-inline-block { - display: inline-block !important; - } -} -@media (min-width: 992px) and (max-width: 1199px) { - .visible-md { - display: block !important; - } - table.visible-md { - display: table; - } - tr.visible-md { - display: table-row !important; - } - th.visible-md, - td.visible-md { - display: table-cell !important; - } -} -@media (min-width: 992px) and (max-width: 1199px) { - .visible-md-block { - display: block !important; - } -} -@media (min-width: 992px) and (max-width: 1199px) { - .visible-md-inline { - display: inline !important; - } -} -@media (min-width: 992px) and (max-width: 1199px) { - .visible-md-inline-block { - display: inline-block !important; - } -} -@media (min-width: 1200px) { - .visible-lg { - display: block !important; - } - table.visible-lg { - display: table; - } - tr.visible-lg { - display: table-row !important; - } - th.visible-lg, - td.visible-lg { - display: table-cell !important; - } -} -@media (min-width: 1200px) { - .visible-lg-block { - display: block !important; - } -} -@media (min-width: 1200px) { - .visible-lg-inline { - display: inline !important; - } -} -@media (min-width: 1200px) { - .visible-lg-inline-block { - display: inline-block !important; - } -} -@media (max-width: 767px) { - .hidden-xs { - display: none !important; - } -} -@media (min-width: 768px) and (max-width: 991px) { - .hidden-sm { - display: none !important; - } -} -@media (min-width: 992px) and (max-width: 1199px) { - .hidden-md { - display: none !important; - } -} -@media (min-width: 1200px) { - .hidden-lg { - display: none !important; - } -} -.visible-print { - display: none !important; -} -@media print { - .visible-print { - display: block !important; - } - table.visible-print { - display: table; - } - tr.visible-print { - display: table-row !important; - } - th.visible-print, - td.visible-print { - display: table-cell !important; - } -} -.visible-print-block { - display: none !important; -} -@media print { - .visible-print-block { - display: block !important; - } -} -.visible-print-inline { - display: none !important; -} -@media print { - .visible-print-inline { - display: inline !important; - } -} -.visible-print-inline-block { - display: none !important; -} -@media print { - .visible-print-inline-block { - display: inline-block !important; - } -} -@media print { - .hidden-print { - display: none !important; - } -} -/*# sourceMappingURL=bootstrap.css.map */ diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/demultiplexing/html/bootstrap3/css/bootstrap.css.map b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/demultiplexing/html/bootstrap3/css/bootstrap.css.map deleted file mode 100644 index bfb5616891b8d59dea9003d767fd30c9840a6437..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/demultiplexing/html/bootstrap3/css/bootstrap.css.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"bootstrap.css","sources":["bootstrap.css","less/normalize.less","less/print.less","less/glyphicons.less","less/scaffolding.less","less/mixins/vendor-prefixes.less","less/mixins/tab-focus.less","less/mixins/image.less","less/type.less","less/mixins/text-emphasis.less","less/mixins/background-variant.less","less/mixins/text-overflow.less","less/code.less","less/grid.less","less/mixins/grid.less","less/mixins/grid-framework.less","less/tables.less","less/mixins/table-row.less","less/forms.less","less/mixins/forms.less","less/buttons.less","less/mixins/buttons.less","less/mixins/opacity.less","less/component-animations.less","less/dropdowns.less","less/mixins/nav-divider.less","less/mixins/reset-filter.less","less/button-groups.less","less/mixins/border-radius.less","less/input-groups.less","less/navs.less","less/navbar.less","less/mixins/nav-vertical-align.less","less/utilities.less","less/breadcrumbs.less","less/pagination.less","less/mixins/pagination.less","less/pager.less","less/labels.less","less/mixins/labels.less","less/badges.less","less/jumbotron.less","less/thumbnails.less","less/alerts.less","less/mixins/alerts.less","less/progress-bars.less","less/mixins/gradients.less","less/mixins/progress-bar.less","less/media.less","less/list-group.less","less/mixins/list-group.less","less/panels.less","less/mixins/panels.less","less/responsive-embed.less","less/wells.less","less/close.less","less/modals.less","less/tooltip.less","less/popovers.less","less/carousel.less","less/mixins/clearfix.less","less/mixins/center-block.less","less/mixins/hide-text.less","less/responsive-utilities.less","less/mixins/responsive-visibility.less"],"names":[],"mappings":"AAAA,6DAA4D;ACQ5D;EACE,yBAAA;EACA,4BAAA;EACA,gCAAA;EDND;ACaD;EACE,WAAA;EDXD;ACuBD;;;;;;;;;;;;EAYE,gBAAA;EDrBD;AC6BD;;;;EAIE,uBAAA;EACA,0BAAA;ED3BD;ACmCD;EACE,eAAA;EACA,WAAA;EDjCD;ACyCD;;EAEE,eAAA;EDvCD;ACiDD;EACE,yBAAA;ED/CD;ACsDD;;EAEE,YAAA;EDpDD;AC8DD;EACE,2BAAA;ED5DD;ACmED;;EAEE,mBAAA;EDjED;ACwED;EACE,oBAAA;EDtED;AC8ED;EACE,gBAAA;EACA,kBAAA;ED5ED;ACmFD;EACE,kBAAA;EACA,aAAA;EDjFD;ACwFD;EACE,gBAAA;EDtFD;AC6FD;;EAEE,gBAAA;EACA,gBAAA;EACA,oBAAA;EACA,0BAAA;ED3FD;AC8FD;EACE,aAAA;ED5FD;AC+FD;EACE,iBAAA;ED7FD;ACuGD;EACE,WAAA;EDrGD;AC4GD;EACE,kBAAA;ED1GD;ACoHD;EACE,kBAAA;EDlHD;ACyHD;EACE,8BAAA;EACA,iCAAA;EAAA,yBAAA;EACA,WAAA;EDvHD;AC8HD;EACE,gBAAA;ED5HD;ACmID;;;;EAIE,mCAAA;EACA,gBAAA;EDjID;ACmJD;;;;;EAKE,gBAAA;EACA,eAAA;EACA,WAAA;EDjJD;ACwJD;EACE,mBAAA;EDtJD;ACgKD;;EAEE,sBAAA;ED9JD;ACyKD;;;;EAIE,4BAAA;EACA,iBAAA;EDvKD;AC8KD;;EAEE,iBAAA;ED5KD;ACmLD;;EAEE,WAAA;EACA,YAAA;EDjLD;ACyLD;EACE,qBAAA;EDvLD;ACkMD;;EAEE,gCAAA;EAAA,6BAAA;EAAA,wBAAA;EACA,YAAA;EDhMD;ACyMD;;EAEE,cAAA;EDvMD;ACgND;EACE,+BAAA;EACA,8BAAA;EACA,iCAAA;EACA,yBAAA;ED9MD;ACuND;;EAEE,0BAAA;EDrND;AC4ND;EACE,2BAAA;EACA,eAAA;EACA,gCAAA;ED1ND;ACkOD;EACE,WAAA;EACA,YAAA;EDhOD;ACuOD;EACE,gBAAA;EDrOD;AC6OD;EACE,mBAAA;ED3OD;ACqPD;EACE,2BAAA;EACA,mBAAA;EDnPD;ACsPD;;EAEE,YAAA;EDpPD;AE9ED;EA9FE;IACE,8BAAA;IACA,wBAAA;IACA,oCAAA;IACA,qCAAA;IAAA,6BAAA;IF+KD;EE5KD;;IAEE,4BAAA;IF8KD;EE3KD;IACE,8BAAA;IF6KD;EE1KD;IACE,+BAAA;IF4KD;EExKD;;IAEE,aAAA;IF0KD;EEvKD;;IAEE,wBAAA;IACA,0BAAA;IFyKD;EEtKD;IACE,6BAAA;IFwKD;EErKD;;IAEE,0BAAA;IFuKD;EEpKD;IACE,4BAAA;IFsKD;EEnKD;;;IAGE,YAAA;IACA,WAAA;IFqKD;EElKD;;IAEE,yBAAA;IFoKD;EE/JD;IACE,6BAAA;IFiKD;EE7JD;IACE,eAAA;IF+JD;EE7JD;;IAGI,mCAAA;IF8JH;EE3JD;;IAGI,mCAAA;IF4JH;EEzJD;IACE,wBAAA;IF2JD;EExJD;IACE,sCAAA;IF0JD;EExJD;;IAGI,mCAAA;IFyJH;EACF;AGhPD;EACE,qCAAA;EACA,uDAAA;EACA,6TAAA;EHkPD;AG3OD;EACE,oBAAA;EACA,UAAA;EACA,uBAAA;EACA,qCAAA;EACA,oBAAA;EACA,qBAAA;EACA,gBAAA;EACA,qCAAA;EACA,oCAAA;EH6OD;AGzOmC;EAAW,gBAAA;EH4O9C;AG3OmC;EAAW,gBAAA;EH8O9C;AG7OmC;EAAW,kBAAA;EHgP9C;AG/OmC;EAAW,kBAAA;EHkP9C;AGjPmC;EAAW,kBAAA;EHoP9C;AGnPmC;EAAW,kBAAA;EHsP9C;AGrPmC;EAAW,kBAAA;EHwP9C;AGvPmC;EAAW,kBAAA;EH0P9C;AGzPmC;EAAW,kBAAA;EH4P9C;AG3PmC;EAAW,kBAAA;EH8P9C;AG7PmC;EAAW,kBAAA;EHgQ9C;AG/PmC;EAAW,kBAAA;EHkQ9C;AGjQmC;EAAW,kBAAA;EHoQ9C;AGnQmC;EAAW,kBAAA;EHsQ9C;AGrQmC;EAAW,kBAAA;EHwQ9C;AGvQmC;EAAW,kBAAA;EH0Q9C;AGzQmC;EAAW,kBAAA;EH4Q9C;AG3QmC;EAAW,kBAAA;EH8Q9C;AG7QmC;EAAW,kBAAA;EHgR9C;AG/QmC;EAAW,kBAAA;EHkR9C;AGjRmC;EAAW,kBAAA;EHoR9C;AGnRmC;EAAW,kBAAA;EHsR9C;AGrRmC;EAAW,kBAAA;EHwR9C;AGvRmC;EAAW,kBAAA;EH0R9C;AGzRmC;EAAW,kBAAA;EH4R9C;AG3RmC;EAAW,kBAAA;EH8R9C;AG7RmC;EAAW,kBAAA;EHgS9C;AG/RmC;EAAW,kBAAA;EHkS9C;AGjSmC;EAAW,kBAAA;EHoS9C;AGnSmC;EAAW,kBAAA;EHsS9C;AGrSmC;EAAW,kBAAA;EHwS9C;AGvSmC;EAAW,kBAAA;EH0S9C;AGzSmC;EAAW,kBAAA;EH4S9C;AG3SmC;EAAW,kBAAA;EH8S9C;AG7SmC;EAAW,kBAAA;EHgT9C;AG/SmC;EAAW,kBAAA;EHkT9C;AGjTmC;EAAW,kBAAA;EHoT9C;AGnTmC;EAAW,kBAAA;EHsT9C;AGrTmC;EAAW,kBAAA;EHwT9C;AGvTmC;EAAW,kBAAA;EH0T9C;AGzTmC;EAAW,kBAAA;EH4T9C;AG3TmC;EAAW,kBAAA;EH8T9C;AG7TmC;EAAW,kBAAA;EHgU9C;AG/TmC;EAAW,kBAAA;EHkU9C;AGjUmC;EAAW,kBAAA;EHoU9C;AGnUmC;EAAW,kBAAA;EHsU9C;AGrUmC;EAAW,kBAAA;EHwU9C;AGvUmC;EAAW,kBAAA;EH0U9C;AGzUmC;EAAW,kBAAA;EH4U9C;AG3UmC;EAAW,kBAAA;EH8U9C;AG7UmC;EAAW,kBAAA;EHgV9C;AG/UmC;EAAW,kBAAA;EHkV9C;AGjVmC;EAAW,kBAAA;EHoV9C;AGnVmC;EAAW,kBAAA;EHsV9C;AGrVmC;EAAW,kBAAA;EHwV9C;AGvVmC;EAAW,kBAAA;EH0V9C;AGzVmC;EAAW,kBAAA;EH4V9C;AG3VmC;EAAW,kBAAA;EH8V9C;AG7VmC;EAAW,kBAAA;EHgW9C;AG/VmC;EAAW,kBAAA;EHkW9C;AGjWmC;EAAW,kBAAA;EHoW9C;AGnWmC;EAAW,kBAAA;EHsW9C;AGrWmC;EAAW,kBAAA;EHwW9C;AGvWmC;EAAW,kBAAA;EH0W9C;AGzWmC;EAAW,kBAAA;EH4W9C;AG3WmC;EAAW,kBAAA;EH8W9C;AG7WmC;EAAW,kBAAA;EHgX9C;AG/WmC;EAAW,kBAAA;EHkX9C;AGjXmC;EAAW,kBAAA;EHoX9C;AGnXmC;EAAW,kBAAA;EHsX9C;AGrXmC;EAAW,kBAAA;EHwX9C;AGvXmC;EAAW,kBAAA;EH0X9C;AGzXmC;EAAW,kBAAA;EH4X9C;AG3XmC;EAAW,kBAAA;EH8X9C;AG7XmC;EAAW,kBAAA;EHgY9C;AG/XmC;EAAW,kBAAA;EHkY9C;AGjYmC;EAAW,kBAAA;EHoY9C;AGnYmC;EAAW,kBAAA;EHsY9C;AGrYmC;EAAW,kBAAA;EHwY9C;AGvYmC;EAAW,kBAAA;EH0Y9C;AGzYmC;EAAW,kBAAA;EH4Y9C;AG3YmC;EAAW,kBAAA;EH8Y9C;AG7YmC;EAAW,kBAAA;EHgZ9C;AG/YmC;EAAW,kBAAA;EHkZ9C;AGjZmC;EAAW,kBAAA;EHoZ9C;AGnZmC;EAAW,kBAAA;EHsZ9C;AGrZmC;EAAW,kBAAA;EHwZ9C;AGvZmC;EAAW,kBAAA;EH0Z9C;AGzZmC;EAAW,kBAAA;EH4Z9C;AG3ZmC;EAAW,kBAAA;EH8Z9C;AG7ZmC;EAAW,kBAAA;EHga9C;AG/ZmC;EAAW,kBAAA;EHka9C;AGjamC;EAAW,kBAAA;EHoa9C;AGnamC;EAAW,kBAAA;EHsa9C;AGramC;EAAW,kBAAA;EHwa9C;AGvamC;EAAW,kBAAA;EH0a9C;AGzamC;EAAW,kBAAA;EH4a9C;AG3amC;EAAW,kBAAA;EH8a9C;AG7amC;EAAW,kBAAA;EHgb9C;AG/amC;EAAW,kBAAA;EHkb9C;AGjbmC;EAAW,kBAAA;EHob9C;AGnbmC;EAAW,kBAAA;EHsb9C;AGrbmC;EAAW,kBAAA;EHwb9C;AGvbmC;EAAW,kBAAA;EH0b9C;AGzbmC;EAAW,kBAAA;EH4b9C;AG3bmC;EAAW,kBAAA;EH8b9C;AG7bmC;EAAW,kBAAA;EHgc9C;AG/bmC;EAAW,kBAAA;EHkc9C;AGjcmC;EAAW,kBAAA;EHoc9C;AGncmC;EAAW,kBAAA;EHsc9C;AGrcmC;EAAW,kBAAA;EHwc9C;AGvcmC;EAAW,kBAAA;EH0c9C;AGzcmC;EAAW,kBAAA;EH4c9C;AG3cmC;EAAW,kBAAA;EH8c9C;AG7cmC;EAAW,kBAAA;EHgd9C;AG/cmC;EAAW,kBAAA;EHkd9C;AGjdmC;EAAW,kBAAA;EHod9C;AGndmC;EAAW,kBAAA;EHsd9C;AGrdmC;EAAW,kBAAA;EHwd9C;AGvdmC;EAAW,kBAAA;EH0d9C;AGzdmC;EAAW,kBAAA;EH4d9C;AG3dmC;EAAW,kBAAA;EH8d9C;AG7dmC;EAAW,kBAAA;EHge9C;AG/dmC;EAAW,kBAAA;EHke9C;AGjemC;EAAW,kBAAA;EHoe9C;AGnemC;EAAW,kBAAA;EHse9C;AGremC;EAAW,kBAAA;EHwe9C;AGvemC;EAAW,kBAAA;EH0e9C;AGzemC;EAAW,kBAAA;EH4e9C;AG3emC;EAAW,kBAAA;EH8e9C;AG7emC;EAAW,kBAAA;EHgf9C;AG/emC;EAAW,kBAAA;EHkf9C;AGjfmC;EAAW,kBAAA;EHof9C;AGnfmC;EAAW,kBAAA;EHsf9C;AGrfmC;EAAW,kBAAA;EHwf9C;AGvfmC;EAAW,kBAAA;EH0f9C;AGzfmC;EAAW,kBAAA;EH4f9C;AG3fmC;EAAW,kBAAA;EH8f9C;AG7fmC;EAAW,kBAAA;EHggB9C;AG/fmC;EAAW,kBAAA;EHkgB9C;AGjgBmC;EAAW,kBAAA;EHogB9C;AGngBmC;EAAW,kBAAA;EHsgB9C;AGrgBmC;EAAW,kBAAA;EHwgB9C;AGvgBmC;EAAW,kBAAA;EH0gB9C;AGzgBmC;EAAW,kBAAA;EH4gB9C;AG3gBmC;EAAW,kBAAA;EH8gB9C;AG7gBmC;EAAW,kBAAA;EHghB9C;AG/gBmC;EAAW,kBAAA;EHkhB9C;AGjhBmC;EAAW,kBAAA;EHohB9C;AGnhBmC;EAAW,kBAAA;EHshB9C;AGrhBmC;EAAW,kBAAA;EHwhB9C;AGvhBmC;EAAW,kBAAA;EH0hB9C;AGzhBmC;EAAW,kBAAA;EH4hB9C;AG3hBmC;EAAW,kBAAA;EH8hB9C;AG7hBmC;EAAW,kBAAA;EHgiB9C;AG/hBmC;EAAW,kBAAA;EHkiB9C;AGjiBmC;EAAW,kBAAA;EHoiB9C;AGniBmC;EAAW,kBAAA;EHsiB9C;AGriBmC;EAAW,kBAAA;EHwiB9C;AGviBmC;EAAW,kBAAA;EH0iB9C;AGziBmC;EAAW,kBAAA;EH4iB9C;AG3iBmC;EAAW,kBAAA;EH8iB9C;AG7iBmC;EAAW,kBAAA;EHgjB9C;AG/iBmC;EAAW,kBAAA;EHkjB9C;AGjjBmC;EAAW,kBAAA;EHojB9C;AGnjBmC;EAAW,kBAAA;EHsjB9C;AGrjBmC;EAAW,kBAAA;EHwjB9C;AGvjBmC;EAAW,kBAAA;EH0jB9C;AGzjBmC;EAAW,kBAAA;EH4jB9C;AG3jBmC;EAAW,kBAAA;EH8jB9C;AG7jBmC;EAAW,kBAAA;EHgkB9C;AG/jBmC;EAAW,kBAAA;EHkkB9C;AGjkBmC;EAAW,kBAAA;EHokB9C;AGnkBmC;EAAW,kBAAA;EHskB9C;AGrkBmC;EAAW,kBAAA;EHwkB9C;AGvkBmC;EAAW,kBAAA;EH0kB9C;AGzkBmC;EAAW,kBAAA;EH4kB9C;AG3kBmC;EAAW,kBAAA;EH8kB9C;AG7kBmC;EAAW,kBAAA;EHglB9C;AG/kBmC;EAAW,kBAAA;EHklB9C;AGjlBmC;EAAW,kBAAA;EHolB9C;AGnlBmC;EAAW,kBAAA;EHslB9C;AGrlBmC;EAAW,kBAAA;EHwlB9C;AGvlBmC;EAAW,kBAAA;EH0lB9C;AGzlBmC;EAAW,kBAAA;EH4lB9C;AG3lBmC;EAAW,kBAAA;EH8lB9C;AG7lBmC;EAAW,kBAAA;EHgmB9C;AG/lBmC;EAAW,kBAAA;EHkmB9C;AGjmBmC;EAAW,kBAAA;EHomB9C;AGnmBmC;EAAW,kBAAA;EHsmB9C;AGrmBmC;EAAW,kBAAA;EHwmB9C;AGvmBmC;EAAW,kBAAA;EH0mB9C;AGzmBmC;EAAW,kBAAA;EH4mB9C;AG3mBmC;EAAW,kBAAA;EH8mB9C;AG7mBmC;EAAW,kBAAA;EHgnB9C;AG/mBmC;EAAW,kBAAA;EHknB9C;AGjnBmC;EAAW,kBAAA;EHonB9C;AGnnBmC;EAAW,kBAAA;EHsnB9C;AGrnBmC;EAAW,kBAAA;EHwnB9C;AGvnBmC;EAAW,kBAAA;EH0nB9C;AIx1BD;ECgEE,gCAAA;EACG,6BAAA;EACK,wBAAA;EL2xBT;AI11BD;;EC6DE,gCAAA;EACG,6BAAA;EACK,wBAAA;ELiyBT;AIx1BD;EACE,iBAAA;EACA,+CAAA;EJ01BD;AIv1BD;EACE,6DAAA;EACA,iBAAA;EACA,yBAAA;EACA,gBAAA;EACA,2BAAA;EJy1BD;AIr1BD;;;;EAIE,sBAAA;EACA,oBAAA;EACA,sBAAA;EJu1BD;AIj1BD;EACE,gBAAA;EACA,uBAAA;EJm1BD;AIj1BC;;EAEE,gBAAA;EACA,4BAAA;EJm1BH;AIh1BC;EErDA,sBAAA;EAEA,4CAAA;EACA,sBAAA;ENu4BD;AI10BD;EACE,WAAA;EJ40BD;AIt0BD;EACE,wBAAA;EJw0BD;AIp0BD;;;;;EGvEE,gBAAA;EACA,gBAAA;EACA,iBAAA;EACA,cAAA;EPk5BD;AIz0BD;EACE,oBAAA;EJ20BD;AIr0BD;EACE,cAAA;EACA,yBAAA;EACA,2BAAA;EACA,2BAAA;EACA,oBAAA;EC0FA,0CAAA;EACK,qCAAA;EACG,kCAAA;EEpLR,uBAAA;EACA,gBAAA;EACA,iBAAA;EACA,cAAA;EPm6BD;AIt0BD;EACE,oBAAA;EJw0BD;AIl0BD;EACE,kBAAA;EACA,qBAAA;EACA,WAAA;EACA,+BAAA;EJo0BD;AI5zBD;EACE,oBAAA;EACA,YAAA;EACA,aAAA;EACA,cAAA;EACA,YAAA;EACA,kBAAA;EACA,wBAAA;EACA,WAAA;EJ8zBD;AItzBC;;EAEE,kBAAA;EACA,aAAA;EACA,cAAA;EACA,WAAA;EACA,mBAAA;EACA,YAAA;EJwzBH;AQn8BD;;;;;;;;;;;;EAEE,sBAAA;EACA,kBAAA;EACA,kBAAA;EACA,gBAAA;ER+8BD;AQp9BD;;;;;;;;;;;;;;;;;;;;;;;;EASI,qBAAA;EACA,gBAAA;EACA,gBAAA;ERq+BH;AQj+BD;;;;;;EAGE,kBAAA;EACA,qBAAA;ERs+BD;AQ1+BD;;;;;;;;;;;;EAQI,gBAAA;ERg/BH;AQ7+BD;;;;;;EAGE,kBAAA;EACA,qBAAA;ERk/BD;AQt/BD;;;;;;;;;;;;EAQI,gBAAA;ER4/BH;AQx/BD;;EAAU,iBAAA;ER4/BT;AQ3/BD;;EAAU,iBAAA;ER+/BT;AQ9/BD;;EAAU,iBAAA;ERkgCT;AQjgCD;;EAAU,iBAAA;ERqgCT;AQpgCD;;EAAU,iBAAA;ERwgCT;AQvgCD;;EAAU,iBAAA;ER2gCT;AQrgCD;EACE,kBAAA;ERugCD;AQpgCD;EACE,qBAAA;EACA,iBAAA;EACA,kBAAA;EACA,kBAAA;ERsgCD;AQjgCD;EAAA;IAFI,iBAAA;IRugCD;EACF;AQ//BD;;EAEE,gBAAA;ERigCD;AQ7/BD;EACE,oBAAA;ER+/BD;AQ5/BD;;EAEE,2BAAA;EACA,eAAA;ER8/BD;AQ1/BD;EAAuB,kBAAA;ER6/BtB;AQ5/BD;EAAuB,mBAAA;ER+/BtB;AQ9/BD;EAAuB,oBAAA;ERigCtB;AQhgCD;EAAuB,qBAAA;ERmgCtB;AQlgCD;EAAuB,qBAAA;ERqgCtB;AQlgCD;EAAuB,2BAAA;ERqgCtB;AQpgCD;EAAuB,2BAAA;ERugCtB;AQtgCD;EAAuB,4BAAA;ERygCtB;AQtgCD;EACE,gBAAA;ERwgCD;AQtgCD;EC1GE,gBAAA;ETmnCD;ASlnCC;EACE,gBAAA;ETonCH;AQzgCD;EC7GE,gBAAA;ETynCD;ASxnCC;EACE,gBAAA;ET0nCH;AQ5gCD;EChHE,gBAAA;ET+nCD;AS9nCC;EACE,gBAAA;ETgoCH;AQ/gCD;ECnHE,gBAAA;ETqoCD;ASpoCC;EACE,gBAAA;ETsoCH;AQlhCD;ECtHE,gBAAA;ET2oCD;AS1oCC;EACE,gBAAA;ET4oCH;AQjhCD;EAGE,aAAA;EEhIA,2BAAA;EVkpCD;AUjpCC;EACE,2BAAA;EVmpCH;AQlhCD;EEnIE,2BAAA;EVwpCD;AUvpCC;EACE,2BAAA;EVypCH;AQrhCD;EEtIE,2BAAA;EV8pCD;AU7pCC;EACE,2BAAA;EV+pCH;AQxhCD;EEzIE,2BAAA;EVoqCD;AUnqCC;EACE,2BAAA;EVqqCH;AQ3hCD;EE5IE,2BAAA;EV0qCD;AUzqCC;EACE,2BAAA;EV2qCH;AQzhCD;EACE,qBAAA;EACA,qBAAA;EACA,kCAAA;ER2hCD;AQnhCD;;EAEE,eAAA;EACA,qBAAA;ERqhCD;AQxhCD;;;;EAMI,kBAAA;ERwhCH;AQjhCD;EACE,iBAAA;EACA,kBAAA;ERmhCD;AQ/gCD;EALE,iBAAA;EACA,kBAAA;EAMA,mBAAA;ERkhCD;AQphCD;EAKI,uBAAA;EACA,mBAAA;EACA,oBAAA;ERkhCH;AQ7gCD;EACE,eAAA;EACA,qBAAA;ER+gCD;AQ7gCD;;EAEE,yBAAA;ER+gCD;AQ7gCD;EACE,mBAAA;ER+gCD;AQ7gCD;EACE,gBAAA;ER+gCD;AQt/BD;EAAA;IAVM,aAAA;IACA,cAAA;IACA,aAAA;IACA,mBAAA;IG3NJ,kBAAA;IACA,yBAAA;IACA,qBAAA;IXguCC;EQhgCH;IAHM,oBAAA;IRsgCH;EACF;AQ7/BD;;EAGE,cAAA;EACA,mCAAA;ER8/BD;AQ5/BD;EACE,gBAAA;EACA,2BAAA;ER8/BD;AQ1/BD;EACE,oBAAA;EACA,kBAAA;EACA,mBAAA;EACA,gCAAA;ER4/BD;AQv/BG;;;EACE,kBAAA;ER2/BL;AQrgCD;;;EAmBI,gBAAA;EACA,gBAAA;EACA,yBAAA;EACA,gBAAA;ERu/BH;AQr/BG;;;EACE,wBAAA;ERy/BL;AQj/BD;;EAEE,qBAAA;EACA,iBAAA;EACA,iCAAA;EACA,gBAAA;EACA,mBAAA;ERm/BD;AQ7+BG;;;;;;EAAW,aAAA;ERq/Bd;AQp/BG;;;;;;EACE,wBAAA;ER2/BL;AQr/BD;;EAEE,aAAA;ERu/BD;AQn/BD;EACE,qBAAA;EACA,oBAAA;EACA,yBAAA;ERq/BD;AYtyCD;;;;EAIE,gEAAA;EZwyCD;AYpyCD;EACE,kBAAA;EACA,gBAAA;EACA,gBAAA;EACA,2BAAA;EACA,oBAAA;EZsyCD;AYlyCD;EACE,kBAAA;EACA,gBAAA;EACA,gBAAA;EACA,2BAAA;EACA,oBAAA;EACA,wDAAA;EAAA,gDAAA;EZoyCD;AY1yCD;EASI,YAAA;EACA,iBAAA;EACA,0BAAA;EAAA,kBAAA;EZoyCH;AY/xCD;EACE,gBAAA;EACA,gBAAA;EACA,kBAAA;EACA,iBAAA;EACA,yBAAA;EACA,uBAAA;EACA,uBAAA;EACA,gBAAA;EACA,2BAAA;EACA,2BAAA;EACA,oBAAA;EZiyCD;AY5yCD;EAeI,YAAA;EACA,oBAAA;EACA,gBAAA;EACA,uBAAA;EACA,+BAAA;EACA,kBAAA;EZgyCH;AY3xCD;EACE,mBAAA;EACA,oBAAA;EZ6xCD;Aat1CD;ECHE,oBAAA;EACA,mBAAA;EACA,oBAAA;EACA,qBAAA;Ed41CD;Aat1CC;EAAA;IAFE,cAAA;Ib41CD;EACF;Aax1CC;EAAA;IAFE,cAAA;Ib81CD;EACF;Aa11CD;EAAA;IAFI,eAAA;Ibg2CD;EACF;Aav1CD;ECvBE,oBAAA;EACA,mBAAA;EACA,oBAAA;EACA,qBAAA;Edi3CD;Aap1CD;ECvBE,oBAAA;EACA,qBAAA;Ed82CD;Ae92CG;EACE,oBAAA;EAEA,iBAAA;EAEA,oBAAA;EACA,qBAAA;Ef82CL;Ae91CG;EACE,aAAA;Efg2CL;Aez1CC;EACE,aAAA;Ef21CH;Ae51CC;EACE,qBAAA;Ef81CH;Ae/1CC;EACE,qBAAA;Efi2CH;Ael2CC;EACE,YAAA;Efo2CH;Aer2CC;EACE,qBAAA;Efu2CH;Aex2CC;EACE,qBAAA;Ef02CH;Ae32CC;EACE,YAAA;Ef62CH;Ae92CC;EACE,qBAAA;Efg3CH;Aej3CC;EACE,qBAAA;Efm3CH;Aep3CC;EACE,YAAA;Efs3CH;Aev3CC;EACE,qBAAA;Efy3CH;Ae13CC;EACE,oBAAA;Ef43CH;Ae92CC;EACE,aAAA;Efg3CH;Aej3CC;EACE,qBAAA;Efm3CH;Aep3CC;EACE,qBAAA;Efs3CH;Aev3CC;EACE,YAAA;Efy3CH;Ae13CC;EACE,qBAAA;Ef43CH;Ae73CC;EACE,qBAAA;Ef+3CH;Aeh4CC;EACE,YAAA;Efk4CH;Aen4CC;EACE,qBAAA;Efq4CH;Aet4CC;EACE,qBAAA;Efw4CH;Aez4CC;EACE,YAAA;Ef24CH;Ae54CC;EACE,qBAAA;Ef84CH;Ae/4CC;EACE,oBAAA;Efi5CH;Ae74CC;EACE,aAAA;Ef+4CH;Ae/5CC;EACE,YAAA;Efi6CH;Ael6CC;EACE,oBAAA;Efo6CH;Aer6CC;EACE,oBAAA;Efu6CH;Aex6CC;EACE,WAAA;Ef06CH;Ae36CC;EACE,oBAAA;Ef66CH;Ae96CC;EACE,oBAAA;Efg7CH;Aej7CC;EACE,WAAA;Efm7CH;Aep7CC;EACE,oBAAA;Efs7CH;Aev7CC;EACE,oBAAA;Efy7CH;Ae17CC;EACE,WAAA;Ef47CH;Ae77CC;EACE,oBAAA;Ef+7CH;Aeh8CC;EACE,mBAAA;Efk8CH;Ae97CC;EACE,YAAA;Efg8CH;Ael7CC;EACE,mBAAA;Efo7CH;Aer7CC;EACE,2BAAA;Efu7CH;Aex7CC;EACE,2BAAA;Ef07CH;Ae37CC;EACE,kBAAA;Ef67CH;Ae97CC;EACE,2BAAA;Efg8CH;Aej8CC;EACE,2BAAA;Efm8CH;Aep8CC;EACE,kBAAA;Efs8CH;Aev8CC;EACE,2BAAA;Efy8CH;Ae18CC;EACE,2BAAA;Ef48CH;Ae78CC;EACE,kBAAA;Ef+8CH;Aeh9CC;EACE,2BAAA;Efk9CH;Aen9CC;EACE,0BAAA;Efq9CH;Aet9CC;EACE,iBAAA;Efw9CH;Aa59CD;EE9BI;IACE,aAAA;If6/CH;Eet/CD;IACE,aAAA;Ifw/CD;Eez/CD;IACE,qBAAA;If2/CD;Ee5/CD;IACE,qBAAA;If8/CD;Ee//CD;IACE,YAAA;IfigDD;EelgDD;IACE,qBAAA;IfogDD;EergDD;IACE,qBAAA;IfugDD;EexgDD;IACE,YAAA;If0gDD;Ee3gDD;IACE,qBAAA;If6gDD;Ee9gDD;IACE,qBAAA;IfghDD;EejhDD;IACE,YAAA;IfmhDD;EephDD;IACE,qBAAA;IfshDD;EevhDD;IACE,oBAAA;IfyhDD;Ee3gDD;IACE,aAAA;If6gDD;Ee9gDD;IACE,qBAAA;IfghDD;EejhDD;IACE,qBAAA;IfmhDD;EephDD;IACE,YAAA;IfshDD;EevhDD;IACE,qBAAA;IfyhDD;Ee1hDD;IACE,qBAAA;If4hDD;Ee7hDD;IACE,YAAA;If+hDD;EehiDD;IACE,qBAAA;IfkiDD;EeniDD;IACE,qBAAA;IfqiDD;EetiDD;IACE,YAAA;IfwiDD;EeziDD;IACE,qBAAA;If2iDD;Ee5iDD;IACE,oBAAA;If8iDD;Ee1iDD;IACE,aAAA;If4iDD;Ee5jDD;IACE,YAAA;If8jDD;Ee/jDD;IACE,oBAAA;IfikDD;EelkDD;IACE,oBAAA;IfokDD;EerkDD;IACE,WAAA;IfukDD;EexkDD;IACE,oBAAA;If0kDD;Ee3kDD;IACE,oBAAA;If6kDD;Ee9kDD;IACE,WAAA;IfglDD;EejlDD;IACE,oBAAA;IfmlDD;EeplDD;IACE,oBAAA;IfslDD;EevlDD;IACE,WAAA;IfylDD;Ee1lDD;IACE,oBAAA;If4lDD;Ee7lDD;IACE,mBAAA;If+lDD;Ee3lDD;IACE,YAAA;If6lDD;Ee/kDD;IACE,mBAAA;IfilDD;EellDD;IACE,2BAAA;IfolDD;EerlDD;IACE,2BAAA;IfulDD;EexlDD;IACE,kBAAA;If0lDD;Ee3lDD;IACE,2BAAA;If6lDD;Ee9lDD;IACE,2BAAA;IfgmDD;EejmDD;IACE,kBAAA;IfmmDD;EepmDD;IACE,2BAAA;IfsmDD;EevmDD;IACE,2BAAA;IfymDD;Ee1mDD;IACE,kBAAA;If4mDD;Ee7mDD;IACE,2BAAA;If+mDD;EehnDD;IACE,0BAAA;IfknDD;EennDD;IACE,iBAAA;IfqnDD;EACF;AajnDD;EEvCI;IACE,aAAA;If2pDH;EeppDD;IACE,aAAA;IfspDD;EevpDD;IACE,qBAAA;IfypDD;Ee1pDD;IACE,qBAAA;If4pDD;Ee7pDD;IACE,YAAA;If+pDD;EehqDD;IACE,qBAAA;IfkqDD;EenqDD;IACE,qBAAA;IfqqDD;EetqDD;IACE,YAAA;IfwqDD;EezqDD;IACE,qBAAA;If2qDD;Ee5qDD;IACE,qBAAA;If8qDD;Ee/qDD;IACE,YAAA;IfirDD;EelrDD;IACE,qBAAA;IforDD;EerrDD;IACE,oBAAA;IfurDD;EezqDD;IACE,aAAA;If2qDD;Ee5qDD;IACE,qBAAA;If8qDD;Ee/qDD;IACE,qBAAA;IfirDD;EelrDD;IACE,YAAA;IforDD;EerrDD;IACE,qBAAA;IfurDD;EexrDD;IACE,qBAAA;If0rDD;Ee3rDD;IACE,YAAA;If6rDD;Ee9rDD;IACE,qBAAA;IfgsDD;EejsDD;IACE,qBAAA;IfmsDD;EepsDD;IACE,YAAA;IfssDD;EevsDD;IACE,qBAAA;IfysDD;Ee1sDD;IACE,oBAAA;If4sDD;EexsDD;IACE,aAAA;If0sDD;Ee1tDD;IACE,YAAA;If4tDD;Ee7tDD;IACE,oBAAA;If+tDD;EehuDD;IACE,oBAAA;IfkuDD;EenuDD;IACE,WAAA;IfquDD;EetuDD;IACE,oBAAA;IfwuDD;EezuDD;IACE,oBAAA;If2uDD;Ee5uDD;IACE,WAAA;If8uDD;Ee/uDD;IACE,oBAAA;IfivDD;EelvDD;IACE,oBAAA;IfovDD;EervDD;IACE,WAAA;IfuvDD;EexvDD;IACE,oBAAA;If0vDD;Ee3vDD;IACE,mBAAA;If6vDD;EezvDD;IACE,YAAA;If2vDD;Ee7uDD;IACE,mBAAA;If+uDD;EehvDD;IACE,2BAAA;IfkvDD;EenvDD;IACE,2BAAA;IfqvDD;EetvDD;IACE,kBAAA;IfwvDD;EezvDD;IACE,2BAAA;If2vDD;Ee5vDD;IACE,2BAAA;If8vDD;Ee/vDD;IACE,kBAAA;IfiwDD;EelwDD;IACE,2BAAA;IfowDD;EerwDD;IACE,2BAAA;IfuwDD;EexwDD;IACE,kBAAA;If0wDD;Ee3wDD;IACE,2BAAA;If6wDD;Ee9wDD;IACE,0BAAA;IfgxDD;EejxDD;IACE,iBAAA;IfmxDD;EACF;AaxwDD;EE9CI;IACE,aAAA;IfyzDH;EelzDD;IACE,aAAA;IfozDD;EerzDD;IACE,qBAAA;IfuzDD;EexzDD;IACE,qBAAA;If0zDD;Ee3zDD;IACE,YAAA;If6zDD;Ee9zDD;IACE,qBAAA;Ifg0DD;Eej0DD;IACE,qBAAA;Ifm0DD;Eep0DD;IACE,YAAA;Ifs0DD;Eev0DD;IACE,qBAAA;Ify0DD;Ee10DD;IACE,qBAAA;If40DD;Ee70DD;IACE,YAAA;If+0DD;Eeh1DD;IACE,qBAAA;Ifk1DD;Een1DD;IACE,oBAAA;Ifq1DD;Eev0DD;IACE,aAAA;Ify0DD;Ee10DD;IACE,qBAAA;If40DD;Ee70DD;IACE,qBAAA;If+0DD;Eeh1DD;IACE,YAAA;Ifk1DD;Een1DD;IACE,qBAAA;Ifq1DD;Eet1DD;IACE,qBAAA;Ifw1DD;Eez1DD;IACE,YAAA;If21DD;Ee51DD;IACE,qBAAA;If81DD;Ee/1DD;IACE,qBAAA;Ifi2DD;Eel2DD;IACE,YAAA;Ifo2DD;Eer2DD;IACE,qBAAA;Ifu2DD;Eex2DD;IACE,oBAAA;If02DD;Eet2DD;IACE,aAAA;Ifw2DD;Eex3DD;IACE,YAAA;If03DD;Ee33DD;IACE,oBAAA;If63DD;Ee93DD;IACE,oBAAA;Ifg4DD;Eej4DD;IACE,WAAA;Ifm4DD;Eep4DD;IACE,oBAAA;Ifs4DD;Eev4DD;IACE,oBAAA;Ify4DD;Ee14DD;IACE,WAAA;If44DD;Ee74DD;IACE,oBAAA;If+4DD;Eeh5DD;IACE,oBAAA;Ifk5DD;Een5DD;IACE,WAAA;Ifq5DD;Eet5DD;IACE,oBAAA;Ifw5DD;Eez5DD;IACE,mBAAA;If25DD;Eev5DD;IACE,YAAA;Ify5DD;Ee34DD;IACE,mBAAA;If64DD;Ee94DD;IACE,2BAAA;Ifg5DD;Eej5DD;IACE,2BAAA;Ifm5DD;Eep5DD;IACE,kBAAA;Ifs5DD;Eev5DD;IACE,2BAAA;Ify5DD;Ee15DD;IACE,2BAAA;If45DD;Ee75DD;IACE,kBAAA;If+5DD;Eeh6DD;IACE,2BAAA;Ifk6DD;Een6DD;IACE,2BAAA;Ifq6DD;Eet6DD;IACE,kBAAA;Ifw6DD;Eez6DD;IACE,2BAAA;If26DD;Ee56DD;IACE,0BAAA;If86DD;Ee/6DD;IACE,iBAAA;Ifi7DD;EACF;AgBr/DD;EACE,+BAAA;EhBu/DD;AgBr/DD;EACE,kBAAA;EhBu/DD;AgBj/DD;EACE,aAAA;EACA,iBAAA;EACA,qBAAA;EhBm/DD;AgBt/DD;;;;;;EAWQ,cAAA;EACA,yBAAA;EACA,qBAAA;EACA,+BAAA;EhBm/DP;AgBjgED;EAoBI,wBAAA;EACA,kCAAA;EhBg/DH;AgBrgED;;;;;;EA8BQ,eAAA;EhB++DP;AgB7gED;EAoCI,+BAAA;EhB4+DH;AgBhhED;EAyCI,2BAAA;EhB0+DH;AgBn+DD;;;;;;EAOQ,cAAA;EhBo+DP;AgBz9DD;EACE,2BAAA;EhB29DD;AgB59DD;;;;;;EAQQ,2BAAA;EhB49DP;AgBp+DD;;EAeM,0BAAA;EhBy9DL;AgB/8DD;;EAIM,2BAAA;EhB+8DL;AgBr8DD;;EAIM,2BAAA;EhBq8DL;AgB37DD;EACE,kBAAA;EACA,aAAA;EACA,uBAAA;EhB67DD;AgBx7DG;;EACE,kBAAA;EACA,aAAA;EACA,qBAAA;EhB27DL;AiBvkEC;;;;;;;;;;;;EAOI,2BAAA;EjB8kEL;AiBxkEC;;;;;EAMI,2BAAA;EjBykEL;AiB5lEC;;;;;;;;;;;;EAOI,2BAAA;EjBmmEL;AiB7lEC;;;;;EAMI,2BAAA;EjB8lEL;AiBjnEC;;;;;;;;;;;;EAOI,2BAAA;EjBwnEL;AiBlnEC;;;;;EAMI,2BAAA;EjBmnEL;AiBtoEC;;;;;;;;;;;;EAOI,2BAAA;EjB6oEL;AiBvoEC;;;;;EAMI,2BAAA;EjBwoEL;AiB3pEC;;;;;;;;;;;;EAOI,2BAAA;EjBkqEL;AiB5pEC;;;;;EAMI,2BAAA;EjB6pEL;AgB78DD;EAAA;IA5DI,aAAA;IACA,qBAAA;IACA,oBAAA;IACA,kBAAA;IACA,8CAAA;IACA,2BAAA;IACA,mCAAA;IhB6gED;EgBv9DH;IAlDM,kBAAA;IhB4gEH;EgB19DH;;;;;;IAzCY,qBAAA;IhB2gET;EgBl+DH;IAjCM,WAAA;IhBsgEH;EgBr+DH;;;;;;IAxBY,gBAAA;IhBqgET;EgB7+DH;;;;;;IApBY,iBAAA;IhBygET;EgBr/DH;;;;IAPY,kBAAA;IhBkgET;EACF;AkB3tED;EACE,YAAA;EACA,WAAA;EACA,WAAA;EAIA,cAAA;ElB0tED;AkBvtED;EACE,gBAAA;EACA,aAAA;EACA,YAAA;EACA,qBAAA;EACA,iBAAA;EACA,sBAAA;EACA,gBAAA;EACA,WAAA;EACA,kCAAA;ElBytED;AkBttED;EACE,uBAAA;EACA,iBAAA;EACA,oBAAA;EACA,mBAAA;ElBwtED;AkB7sED;Eb4BE,gCAAA;EACG,6BAAA;EACK,wBAAA;ELorET;AkB7sED;;EAEE,iBAAA;EACA,oBAAA;EACA,qBAAA;ElB+sED;AkB3sED;EACE,gBAAA;ElB6sED;AkBzsED;EACE,gBAAA;EACA,aAAA;ElB2sED;AkBvsED;;EAEE,cAAA;ElBysED;AkBrsED;;;EZxEE,sBAAA;EAEA,4CAAA;EACA,sBAAA;ENixED;AkBrsED;EACE,gBAAA;EACA,kBAAA;EACA,iBAAA;EACA,yBAAA;EACA,gBAAA;ElBusED;AkB7qED;EACE,gBAAA;EACA,aAAA;EACA,cAAA;EACA,mBAAA;EACA,iBAAA;EACA,yBAAA;EACA,gBAAA;EACA,2BAAA;EACA,wBAAA;EACA,2BAAA;EACA,oBAAA;EbzDA,0DAAA;EACQ,kDAAA;EAsHR,wFAAA;EACK,2EAAA;EACG,wEAAA;ELonET;AmB7vEC;EACE,uBAAA;EACA,YAAA;EdcF,wFAAA;EACQ,gFAAA;ELkvET;AKltEC;EAAgC,gBAAA;EACA,YAAA;ELqtEjC;AKptEC;EAAgC,gBAAA;ELutEjC;AKttEC;EAAgC,gBAAA;ELytEjC;AkBrrEC;;;EAGE,qBAAA;EACA,2BAAA;EACA,YAAA;ElBurEH;AkBnrEC;EACE,cAAA;ElBqrEH;AkBzqED;EACE,0BAAA;ElB2qED;AkB/pED;;;;EAIE,mBAAA;EAEA,4BAAA;ElBgqED;AkB9pEC;;;;EACE,mBAAA;ElBmqEH;AkBjqEC;;;;EACE,mBAAA;ElBsqEH;AkB5pED;EACE,qBAAA;ElB8pED;AkBtpED;;EAEE,oBAAA;EACA,gBAAA;EACA,kBAAA;EACA,kBAAA;EACA,qBAAA;ElBwpED;AkB9pED;;EASI,oBAAA;EACA,kBAAA;EACA,qBAAA;EACA,iBAAA;ElBypEH;AkBtpED;;;;EAIE,oBAAA;EACA,oBAAA;EACA,oBAAA;ElBwpED;AkBrpED;;EAEE,kBAAA;ElBupED;AkBnpED;;EAEE,uBAAA;EACA,oBAAA;EACA,kBAAA;EACA,wBAAA;EACA,qBAAA;EACA,iBAAA;ElBqpED;AkBnpED;;EAEE,eAAA;EACA,mBAAA;ElBqpED;AkB5oEC;;;;;;EAGE,qBAAA;ElBipEH;AkB3oEC;;;;EAEE,qBAAA;ElB+oEH;AkBzoEC;;;;EAGI,qBAAA;ElB4oEL;AkBjoED;EAEE,kBAAA;EACA,qBAAA;EAEA,kBAAA;ElBioED;AkB/nEC;;EAEE,iBAAA;EACA,kBAAA;ElBioEH;AkBvnED;;ECnPE,cAAA;EACA,mBAAA;EACA,iBAAA;EACA,kBAAA;EACA,oBAAA;EnB82ED;AmB52EC;EACE,cAAA;EACA,mBAAA;EnB82EH;AmB32EC;;EAEE,cAAA;EnB62EH;AkBnoED;;ECvPE,cAAA;EACA,oBAAA;EACA,iBAAA;EACA,mBAAA;EACA,oBAAA;EnB83ED;AmB53EC;EACE,cAAA;EACA,mBAAA;EnB83EH;AmB33EC;;EAEE,cAAA;EnB63EH;AkB1oED;EAEE,oBAAA;ElB2oED;AkB7oED;EAMI,uBAAA;ElB0oEH;AkBtoED;EACE,oBAAA;EACA,WAAA;EACA,UAAA;EACA,YAAA;EACA,gBAAA;EACA,aAAA;EACA,cAAA;EACA,mBAAA;EACA,oBAAA;ElBwoED;AkBtoED;EACE,aAAA;EACA,cAAA;EACA,mBAAA;ElBwoED;AkBtoED;EACE,aAAA;EACA,cAAA;EACA,mBAAA;ElBwoED;AkBpoED;;;;;;ECrVI,gBAAA;EnBi+EH;AkB5oED;ECjVI,uBAAA;EdmDF,0DAAA;EACQ,kDAAA;EL86ET;AmBh+EG;EACE,uBAAA;EdgDJ,2EAAA;EACQ,mEAAA;ELm7ET;AkBtpED;ECvUI,gBAAA;EACA,uBAAA;EACA,2BAAA;EnBg+EH;AkB3pED;ECjUI,gBAAA;EnB+9EH;AkB3pED;;;;;;ECxVI,gBAAA;EnB2/EH;AkBnqED;ECpVI,uBAAA;EdmDF,0DAAA;EACQ,kDAAA;ELw8ET;AmB1/EG;EACE,uBAAA;EdgDJ,2EAAA;EACQ,mEAAA;EL68ET;AkB7qED;EC1UI,gBAAA;EACA,uBAAA;EACA,2BAAA;EnB0/EH;AkBlrED;ECpUI,gBAAA;EnBy/EH;AkBlrED;;;;;;EC3VI,gBAAA;EnBqhFH;AkB1rED;ECvVI,uBAAA;EdmDF,0DAAA;EACQ,kDAAA;ELk+ET;AmBphFG;EACE,uBAAA;EdgDJ,2EAAA;EACQ,mEAAA;ELu+ET;AkBpsED;EC7UI,gBAAA;EACA,uBAAA;EACA,2BAAA;EnBohFH;AkBzsED;ECvUI,gBAAA;EnBmhFH;AkBtsED;EACE,QAAA;ElBwsED;AkB/rED;EACE,gBAAA;EACA,iBAAA;EACA,qBAAA;EACA,gBAAA;ElBisED;AkB9mED;EAAA;IA7DM,uBAAA;IACA,kBAAA;IACA,wBAAA;IlB+qEH;EkBpnEH;IAtDM,uBAAA;IACA,aAAA;IACA,wBAAA;IlB6qEH;EkBznEH;IAhDM,uBAAA;IACA,wBAAA;IlB4qEH;EkB7nEH;;;IA1CQ,aAAA;IlB4qEL;EkBloEH;IApCM,aAAA;IlByqEH;EkBroEH;IAhCM,kBAAA;IACA,wBAAA;IlBwqEH;EkBzoEH;;IAvBM,uBAAA;IACA,eAAA;IACA,kBAAA;IACA,wBAAA;IlBoqEH;EkBhpEH;;IAjBQ,iBAAA;IlBqqEL;EkBppEH;;IAZM,oBAAA;IACA,gBAAA;IlBoqEH;EkBzpEH;IAHM,QAAA;IlB+pEH;EACF;AkBrpED;;;;EASI,eAAA;EACA,kBAAA;EACA,kBAAA;ElBkpEH;AkB7pED;;EAiBI,kBAAA;ElBgpEH;AkBjqED;EJxcE,oBAAA;EACA,qBAAA;Ed4mFD;AkBloEC;EAAA;IANI,mBAAA;IACA,kBAAA;IACA,kBAAA;IlB4oEH;EACF;AkB5qED;EAwCI,QAAA;EACA,aAAA;ElBuoEH;AkB1nEG;EAAA;IAHI,qBAAA;IlBioEL;EACF;AkBrnEG;EAAA;IAHI,kBAAA;IlB4nEL;EACF;AoBzoFD;EACE,uBAAA;EACA,kBAAA;EACA,qBAAA;EACA,oBAAA;EACA,wBAAA;EACA,iBAAA;EACA,wBAAA;EACA,+BAAA;EACA,qBAAA;EC4BA,mBAAA;EACA,iBAAA;EACA,yBAAA;EACA,oBAAA;EhB2KA,2BAAA;EACG,wBAAA;EACC,uBAAA;EACI,mBAAA;ELs8ET;AoB5oFG;;;EdpBF,sBAAA;EAEA,4CAAA;EACA,sBAAA;ENoqFD;AoB9oFC;;EAEE,gBAAA;EACA,uBAAA;EpBgpFH;AoB7oFC;;EAEE,YAAA;EACA,wBAAA;Ef8BF,0DAAA;EACQ,kDAAA;ELknFT;AoB7oFC;;;EAGE,qBAAA;EACA,sBAAA;EE3CF,eAAA;EAGA,2BAAA;EjB8DA,0BAAA;EACQ,kBAAA;EL4nFT;AoBzoFD;EClDE,gBAAA;EACA,2BAAA;EACA,uBAAA;ErB8rFD;AqB5rFC;;;;;EAKE,gBAAA;EACA,2BAAA;EACI,uBAAA;ErB8rFP;AqB5rFC;;;EAGE,wBAAA;ErB8rFH;AqBzrFG;;;;;;;;;;;;;;;EAKE,2BAAA;EACI,uBAAA;ErBqsFT;AoB9qFD;EClBI,gBAAA;EACA,2BAAA;ErBmsFH;AoB/qFD;ECrDE,gBAAA;EACA,2BAAA;EACA,uBAAA;ErBuuFD;AqBruFC;;;;;EAKE,gBAAA;EACA,2BAAA;EACI,uBAAA;ErBuuFP;AqBruFC;;;EAGE,wBAAA;ErBuuFH;AqBluFG;;;;;;;;;;;;;;;EAKE,2BAAA;EACI,uBAAA;ErB8uFT;AoBptFD;ECrBI,gBAAA;EACA,2BAAA;ErB4uFH;AoBptFD;ECzDE,gBAAA;EACA,2BAAA;EACA,uBAAA;ErBgxFD;AqB9wFC;;;;;EAKE,gBAAA;EACA,2BAAA;EACI,uBAAA;ErBgxFP;AqB9wFC;;;EAGE,wBAAA;ErBgxFH;AqB3wFG;;;;;;;;;;;;;;;EAKE,2BAAA;EACI,uBAAA;ErBuxFT;AoBzvFD;ECzBI,gBAAA;EACA,2BAAA;ErBqxFH;AoBzvFD;EC7DE,gBAAA;EACA,2BAAA;EACA,uBAAA;ErByzFD;AqBvzFC;;;;;EAKE,gBAAA;EACA,2BAAA;EACI,uBAAA;ErByzFP;AqBvzFC;;;EAGE,wBAAA;ErByzFH;AqBpzFG;;;;;;;;;;;;;;;EAKE,2BAAA;EACI,uBAAA;ErBg0FT;AoB9xFD;EC7BI,gBAAA;EACA,2BAAA;ErB8zFH;AoB9xFD;ECjEE,gBAAA;EACA,2BAAA;EACA,uBAAA;ErBk2FD;AqBh2FC;;;;;EAKE,gBAAA;EACA,2BAAA;EACI,uBAAA;ErBk2FP;AqBh2FC;;;EAGE,wBAAA;ErBk2FH;AqB71FG;;;;;;;;;;;;;;;EAKE,2BAAA;EACI,uBAAA;ErBy2FT;AoBn0FD;ECjCI,gBAAA;EACA,2BAAA;ErBu2FH;AoBn0FD;ECrEE,gBAAA;EACA,2BAAA;EACA,uBAAA;ErB24FD;AqBz4FC;;;;;EAKE,gBAAA;EACA,2BAAA;EACI,uBAAA;ErB24FP;AqBz4FC;;;EAGE,wBAAA;ErB24FH;AqBt4FG;;;;;;;;;;;;;;;EAKE,2BAAA;EACI,uBAAA;ErBk5FT;AoBx2FD;ECrCI,gBAAA;EACA,2BAAA;ErBg5FH;AoBn2FD;EACE,gBAAA;EACA,qBAAA;EACA,iBAAA;EACA,kBAAA;EpBq2FD;AoBn2FC;;;;EAIE,+BAAA;Ef1BF,0BAAA;EACQ,kBAAA;ELg4FT;AoBp2FC;;;;EAIE,2BAAA;EpBs2FH;AoBp2FC;;EAEE,gBAAA;EACA,4BAAA;EACA,+BAAA;EpBs2FH;AoBl2FG;;;;EAEE,gBAAA;EACA,uBAAA;EpBs2FL;AoB71FD;;EC9EE,oBAAA;EACA,iBAAA;EACA,mBAAA;EACA,oBAAA;ErB+6FD;AoBh2FD;;EClFE,mBAAA;EACA,iBAAA;EACA,kBAAA;EACA,oBAAA;ErBs7FD;AoBn2FD;;ECtFE,kBAAA;EACA,iBAAA;EACA,kBAAA;EACA,oBAAA;ErB67FD;AoBl2FD;EACE,gBAAA;EACA,aAAA;EpBo2FD;AoBh2FD;EACE,iBAAA;EpBk2FD;AoB31FC;;;EACE,aAAA;EpB+1FH;AuBh/FD;EACE,YAAA;ElBiLA,0CAAA;EACK,qCAAA;EACG,kCAAA;ELk0FT;AuBn/FC;EACE,YAAA;EvBq/FH;AuBj/FD;EACE,eAAA;EvBm/FD;AuBj/FC;EAAY,gBAAA;EvBo/Fb;AuBn/FC;EAAY,oBAAA;EvBs/Fb;AuBr/FC;EAAY,0BAAA;EvBw/Fb;AuBr/FD;EACE,oBAAA;EACA,WAAA;EACA,kBAAA;ElB+JA,uCAAA;EACK,kCAAA;EACG,+BAAA;ELy1FT;AwBhhGD;EACE,uBAAA;EACA,UAAA;EACA,WAAA;EACA,kBAAA;EACA,wBAAA;EACA,uBAAA;EACA,qCAAA;EACA,oCAAA;ExBkhGD;AwB9gGD;EACE,oBAAA;ExBghGD;AwB5gGD;EACE,YAAA;ExB8gGD;AwB1gGD;EACE,oBAAA;EACA,WAAA;EACA,SAAA;EACA,eAAA;EACA,eAAA;EACA,aAAA;EACA,kBAAA;EACA,gBAAA;EACA,iBAAA;EACA,kBAAA;EACA,iBAAA;EACA,kBAAA;EACA,2BAAA;EACA,2BAAA;EACA,uCAAA;EACA,oBAAA;EnBwBA,qDAAA;EACQ,6CAAA;EmBvBR,sCAAA;EAAA,8BAAA;ExB6gGD;AwBxgGC;EACE,UAAA;EACA,YAAA;ExB0gGH;AwBniGD;ECvBE,aAAA;EACA,eAAA;EACA,kBAAA;EACA,2BAAA;EzB6jGD;AwBziGD;EAmCI,gBAAA;EACA,mBAAA;EACA,aAAA;EACA,qBAAA;EACA,yBAAA;EACA,gBAAA;EACA,qBAAA;ExBygGH;AwBngGC;;EAEE,uBAAA;EACA,gBAAA;EACA,2BAAA;ExBqgGH;AwB//FC;;;EAGE,gBAAA;EACA,uBAAA;EACA,YAAA;EACA,2BAAA;ExBigGH;AwBx/FC;;;EAGE,gBAAA;ExB0/FH;AwBr/FC;;EAEE,uBAAA;EACA,+BAAA;EACA,wBAAA;EE1GF,qEAAA;EF4GE,qBAAA;ExBu/FH;AwBl/FD;EAGI,gBAAA;ExBk/FH;AwBr/FD;EAQI,YAAA;ExBg/FH;AwBx+FD;EACE,YAAA;EACA,UAAA;ExB0+FD;AwBl+FD;EACE,SAAA;EACA,aAAA;ExBo+FD;AwBh+FD;EACE,gBAAA;EACA,mBAAA;EACA,iBAAA;EACA,yBAAA;EACA,gBAAA;EACA,qBAAA;ExBk+FD;AwB99FD;EACE,iBAAA;EACA,SAAA;EACA,UAAA;EACA,WAAA;EACA,QAAA;EACA,cAAA;ExBg+FD;AwB59FD;EACE,UAAA;EACA,YAAA;ExB89FD;AwBt9FD;;EAII,eAAA;EACA,0BAAA;EACA,aAAA;ExBs9FH;AwB59FD;;EAUI,WAAA;EACA,cAAA;EACA,oBAAA;ExBs9FH;AwBh8FD;EAZE;IAnEA,YAAA;IACA,UAAA;IxBmhGC;EwBj9FD;IAzDA,SAAA;IACA,aAAA;IxB6gGC;EACF;A2B5pGD;;EAEE,oBAAA;EACA,uBAAA;EACA,wBAAA;E3B8pGD;A2BlqGD;;EAMI,oBAAA;EACA,aAAA;E3BgqGH;A2B9pGG;;;;;;;;EAIE,YAAA;E3BoqGL;A2BlqGG;;EAEE,YAAA;E3BoqGL;A2B9pGD;;;;EAKI,mBAAA;E3B+pGH;A2B1pGD;EACE,mBAAA;E3B4pGD;A2B7pGD;;EAMI,aAAA;E3B2pGH;A2BjqGD;;;EAWI,kBAAA;E3B2pGH;A2BvpGD;EACE,kBAAA;E3BypGD;A2BrpGD;EACE,gBAAA;E3BupGD;A2BtpGC;ECrDA,+BAAA;EACG,4BAAA;E5B8sGJ;A2BrpGD;;EClDE,8BAAA;EACG,2BAAA;E5B2sGJ;A2BppGD;EACE,aAAA;E3BspGD;A2BppGD;EACE,kBAAA;E3BspGD;A2BppGD;;ECtEE,+BAAA;EACG,4BAAA;E5B8tGJ;A2BnpGD;ECpEE,8BAAA;EACG,2BAAA;E5B0tGJ;A2BlpGD;;EAEE,YAAA;E3BopGD;A2BnoGD;EACE,mBAAA;EACA,oBAAA;E3BqoGD;A2BnoGD;EACE,oBAAA;EACA,qBAAA;E3BqoGD;A2BhoGD;EtBlDE,0DAAA;EACQ,kDAAA;ELqrGT;A2BhoGC;EtBtDA,0BAAA;EACQ,kBAAA;ELyrGT;A2B7nGD;EACE,gBAAA;E3B+nGD;A2B5nGD;EACE,yBAAA;EACA,wBAAA;E3B8nGD;A2B3nGD;EACE,yBAAA;E3B6nGD;A2BtnGD;;;EAII,gBAAA;EACA,aAAA;EACA,aAAA;EACA,iBAAA;E3BunGH;A2B9nGD;EAcM,aAAA;E3BmnGL;A2BjoGD;;;;EAsBI,kBAAA;EACA,gBAAA;E3BinGH;A2B5mGC;EACE,kBAAA;E3B8mGH;A2B5mGC;EACE,8BAAA;ECvKF,+BAAA;EACC,8BAAA;E5BsxGF;A2B7mGC;EACE,gCAAA;ECnLF,4BAAA;EACC,2BAAA;E5BmyGF;A2B7mGD;EACE,kBAAA;E3B+mGD;A2B7mGD;;EClLE,+BAAA;EACC,8BAAA;E5BmyGF;A2B5mGD;EChME,4BAAA;EACC,2BAAA;E5B+yGF;A2BvmGD;EACE,gBAAA;EACA,aAAA;EACA,qBAAA;EACA,2BAAA;E3BymGD;A2B7mGD;;EAOI,aAAA;EACA,qBAAA;EACA,WAAA;E3B0mGH;A2BnnGD;EAYI,aAAA;E3B0mGH;A2BtnGD;EAgBI,YAAA;E3BymGH;A2B3lGD;;EAEE,oBAAA;EACA,aAAA;EL1OA,YAAA;EAGA,0BAAA;EtBs0GD;A6Bt0GD;EACE,oBAAA;EACA,gBAAA;EACA,2BAAA;E7Bw0GD;A6Br0GC;EACE,aAAA;EACA,iBAAA;EACA,kBAAA;E7Bu0GH;A6Bh1GD;EAeI,oBAAA;EACA,YAAA;EAKA,aAAA;EAEA,aAAA;EACA,kBAAA;E7B+zGH;A6BtzGD;;;EV0BE,cAAA;EACA,oBAAA;EACA,iBAAA;EACA,mBAAA;EACA,oBAAA;EnBiyGD;AmB/xGC;;;EACE,cAAA;EACA,mBAAA;EnBmyGH;AmBhyGC;;;;;;EAEE,cAAA;EnBsyGH;A6Bx0GD;;;EVqBE,cAAA;EACA,mBAAA;EACA,iBAAA;EACA,kBAAA;EACA,oBAAA;EnBwzGD;AmBtzGC;;;EACE,cAAA;EACA,mBAAA;EnB0zGH;AmBvzGC;;;;;;EAEE,cAAA;EnB6zGH;A6Bt1GD;;;EAGE,qBAAA;E7Bw1GD;A6Bt1GC;;;EACE,kBAAA;E7B01GH;A6Bt1GD;;EAEE,WAAA;EACA,qBAAA;EACA,wBAAA;E7Bw1GD;A6Bn1GD;EACE,mBAAA;EACA,iBAAA;EACA,qBAAA;EACA,gBAAA;EACA,gBAAA;EACA,oBAAA;EACA,2BAAA;EACA,2BAAA;EACA,oBAAA;E7Bq1GD;A6Bl1GC;EACE,mBAAA;EACA,iBAAA;EACA,oBAAA;E7Bo1GH;A6Bl1GC;EACE,oBAAA;EACA,iBAAA;EACA,oBAAA;E7Bo1GH;A6Bx2GD;;EA0BI,eAAA;E7Bk1GH;A6B70GD;;;;;;;EDhGE,+BAAA;EACG,4BAAA;E5Bs7GJ;A6B90GD;EACE,iBAAA;E7Bg1GD;A6B90GD;;;;;;;EDpGE,8BAAA;EACG,2BAAA;E5B27GJ;A6B/0GD;EACE,gBAAA;E7Bi1GD;A6B50GD;EACE,oBAAA;EAGA,cAAA;EACA,qBAAA;E7B40GD;A6Bj1GD;EAUI,oBAAA;E7B00GH;A6Bp1GD;EAYM,mBAAA;E7B20GL;A6Bx0GG;;;EAGE,YAAA;E7B00GL;A6Br0GC;;EAGI,oBAAA;E7Bs0GL;A6Bn0GC;;EAGI,mBAAA;E7Bo0GL;A8B99GD;EACE,kBAAA;EACA,iBAAA;EACA,kBAAA;E9Bg+GD;A8Bn+GD;EAOI,oBAAA;EACA,gBAAA;E9B+9GH;A8Bv+GD;EAWM,oBAAA;EACA,gBAAA;EACA,oBAAA;E9B+9GL;A8B99GK;;EAEE,uBAAA;EACA,2BAAA;E9Bg+GP;A8B39GG;EACE,gBAAA;E9B69GL;A8B39GK;;EAEE,gBAAA;EACA,uBAAA;EACA,+BAAA;EACA,qBAAA;E9B69GP;A8Bt9GG;;;EAGE,2BAAA;EACA,uBAAA;E9Bw9GL;A8BjgHD;ELHE,aAAA;EACA,eAAA;EACA,kBAAA;EACA,2BAAA;EzBugHD;A8BvgHD;EA0DI,iBAAA;E9Bg9GH;A8Bv8GD;EACE,kCAAA;E9By8GD;A8B18GD;EAGI,aAAA;EAEA,qBAAA;E9By8GH;A8B98GD;EASM,mBAAA;EACA,yBAAA;EACA,+BAAA;EACA,4BAAA;E9Bw8GL;A8Bv8GK;EACE,uCAAA;E9By8GP;A8Bn8GK;;;EAGE,gBAAA;EACA,2BAAA;EACA,2BAAA;EACA,kCAAA;EACA,iBAAA;E9Bq8GP;A8Bh8GC;EAqDA,aAAA;EA8BA,kBAAA;E9Bi3GD;A8Bp8GC;EAwDE,aAAA;E9B+4GH;A8Bv8GC;EA0DI,oBAAA;EACA,oBAAA;E9Bg5GL;A8B38GC;EAgEE,WAAA;EACA,YAAA;E9B84GH;A8Bl4GD;EAAA;IAPM,qBAAA;IACA,WAAA;I9B64GH;E8Bv4GH;IAJQ,kBAAA;I9B84GL;EACF;A8Bx9GC;EAuFE,iBAAA;EACA,oBAAA;E9Bo4GH;A8B59GC;;;EA8FE,2BAAA;E9Bm4GH;A8Br3GD;EAAA;IATM,kCAAA;IACA,4BAAA;I9Bk4GH;E8B13GH;;;IAHM,8BAAA;I9Bk4GH;EACF;A8Bn+GD;EAEI,aAAA;E9Bo+GH;A8Bt+GD;EAMM,oBAAA;E9Bm+GL;A8Bz+GD;EASM,kBAAA;E9Bm+GL;A8B99GK;;;EAGE,gBAAA;EACA,2BAAA;E9Bg+GP;A8Bx9GD;EAEI,aAAA;E9By9GH;A8B39GD;EAIM,iBAAA;EACA,gBAAA;E9B09GL;A8B98GD;EACE,aAAA;E9Bg9GD;A8Bj9GD;EAII,aAAA;E9Bg9GH;A8Bp9GD;EAMM,oBAAA;EACA,oBAAA;E9Bi9GL;A8Bx9GD;EAYI,WAAA;EACA,YAAA;E9B+8GH;A8Bn8GD;EAAA;IAPM,qBAAA;IACA,WAAA;I9B88GH;E8Bx8GH;IAJQ,kBAAA;I9B+8GL;EACF;A8Bv8GD;EACE,kBAAA;E9By8GD;A8B18GD;EAKI,iBAAA;EACA,oBAAA;E9Bw8GH;A8B98GD;;;EAYI,2BAAA;E9Bu8GH;A8Bz7GD;EAAA;IATM,kCAAA;IACA,4BAAA;I9Bs8GH;E8B97GH;;;IAHM,8BAAA;I9Bs8GH;EACF;A8B77GD;EAEI,eAAA;E9B87GH;A8Bh8GD;EAKI,gBAAA;E9B87GH;A8Br7GD;EAEE,kBAAA;EF3OA,4BAAA;EACC,2BAAA;E5BkqHF;A+B5pHD;EACE,oBAAA;EACA,kBAAA;EACA,qBAAA;EACA,+BAAA;E/B8pHD;A+BtpHD;EAAA;IAFI,oBAAA;I/B4pHD;EACF;A+B7oHD;EAAA;IAFI,aAAA;I/BmpHD;EACF;A+BroHD;EACE,qBAAA;EACA,qBAAA;EACA,oBAAA;EACA,mCAAA;EACA,4DAAA;EAAA,oDAAA;EAEA,mCAAA;E/BsoHD;A+BpoHC;EACE,kBAAA;E/BsoHH;A+B1mHD;EAAA;IAxBI,aAAA;IACA,eAAA;IACA,0BAAA;IAAA,kBAAA;I/BsoHD;E+BpoHC;IACE,2BAAA;IACA,yBAAA;IACA,mBAAA;IACA,8BAAA;I/BsoHH;E+BnoHC;IACE,qBAAA;I/BqoHH;E+BhoHC;;;IAGE,iBAAA;IACA,kBAAA;I/BkoHH;EACF;A+B9nHD;;EAGI,mBAAA;E/B+nHH;A+B1nHC;EAAA;;IAFI,mBAAA;I/BioHH;EACF;A+BxnHD;;;;EAII,qBAAA;EACA,oBAAA;E/B0nHH;A+BpnHC;EAAA;;;;IAHI,iBAAA;IACA,gBAAA;I/B8nHH;EACF;A+BlnHD;EACE,eAAA;EACA,uBAAA;E/BonHD;A+B/mHD;EAAA;IAFI,kBAAA;I/BqnHD;EACF;A+BjnHD;;EAEE,iBAAA;EACA,UAAA;EACA,SAAA;EACA,eAAA;E1BGA,yCAAA;EACQ,oCAAA;EAAA,iCAAA;ELinHT;A+B9mHD;EAAA;;IAFI,kBAAA;I/BqnHD;EACF;A+BnnHD;EACE,QAAA;EACA,uBAAA;E/BqnHD;A+BnnHD;EACE,WAAA;EACA,kBAAA;EACA,uBAAA;E/BqnHD;A+B/mHD;EACE,aAAA;EACA,oBAAA;EACA,iBAAA;EACA,mBAAA;EACA,cAAA;E/BinHD;A+B/mHC;;EAEE,uBAAA;E/BinHH;A+BxmHD;EALI;;IAEE,oBAAA;I/BgnHH;EACF;A+BtmHD;EACE,oBAAA;EACA,cAAA;EACA,oBAAA;EACA,mBAAA;EC3LA,iBAAA;EACA,oBAAA;ED4LA,+BAAA;EACA,wBAAA;EACA,+BAAA;EACA,oBAAA;E/BymHD;A+BrmHC;EACE,YAAA;E/BumHH;A+BrnHD;EAmBI,gBAAA;EACA,aAAA;EACA,aAAA;EACA,oBAAA;E/BqmHH;A+B3nHD;EAyBI,iBAAA;E/BqmHH;A+B/lHD;EAAA;IAFI,eAAA;I/BqmHD;EACF;A+B5lHD;EACE,qBAAA;E/B8lHD;A+B/lHD;EAII,mBAAA;EACA,sBAAA;EACA,mBAAA;E/B8lHH;A+BnkHC;EAAA;IArBI,kBAAA;IACA,aAAA;IACA,aAAA;IACA,eAAA;IACA,+BAAA;IACA,WAAA;IACA,0BAAA;IAAA,kBAAA;I/B4lHH;E+B7kHD;;IAZM,4BAAA;I/B6lHL;E+BjlHD;IATM,mBAAA;I/B6lHL;E+B5lHK;;IAEE,wBAAA;I/B8lHP;EACF;A+BxkHD;EAAA;IAfI,aAAA;IACA,WAAA;I/B2lHD;E+B7kHH;IAXM,aAAA;I/B2lHH;E+BhlHH;IATQ,mBAAA;IACA,sBAAA;I/B4lHL;E+BxlHC;IACE,qBAAA;I/B0lHH;EACF;A+BzkHD;EALE;IE9QA,wBAAA;IjCg2HC;E+BjlHD;IElRA,yBAAA;IjCs2HC;EACF;A+B5kHD;EACE,oBAAA;EACA,qBAAA;EACA,oBAAA;EACA,mCAAA;EACA,sCAAA;E1B3OA,8FAAA;EACQ,sFAAA;E2B/DR,iBAAA;EACA,oBAAA;EhC03HD;AkBl7GD;EAAA;IA7DM,uBAAA;IACA,kBAAA;IACA,wBAAA;IlBm/GH;EkBx7GH;IAtDM,uBAAA;IACA,aAAA;IACA,wBAAA;IlBi/GH;EkB77GH;IAhDM,uBAAA;IACA,wBAAA;IlBg/GH;EkBj8GH;;;IA1CQ,aAAA;IlBg/GL;EkBt8GH;IApCM,aAAA;IlB6+GH;EkBz8GH;IAhCM,kBAAA;IACA,wBAAA;IlB4+GH;EkB78GH;;IAvBM,uBAAA;IACA,eAAA;IACA,kBAAA;IACA,wBAAA;IlBw+GH;EkBp9GH;;IAjBQ,iBAAA;IlBy+GL;EkBx9GH;;IAZM,oBAAA;IACA,gBAAA;IlBw+GH;EkB79GH;IAHM,QAAA;IlBm+GH;EACF;A+BtnHC;EAAA;IAFI,oBAAA;I/B4nHH;EACF;A+BvmHD;EAAA;IAbI,aAAA;IACA,WAAA;IACA,gBAAA;IACA,iBAAA;IACA,gBAAA;IACA,mBAAA;I1BlQF,0BAAA;IACQ,kBAAA;IL23HP;E+BtnHC;IACE,qBAAA;I/BwnHH;EACF;A+BhnHD;EACE,eAAA;EHlVA,4BAAA;EACC,2BAAA;E5Bq8HF;A+BhnHD;EH9UE,+BAAA;EACC,8BAAA;E5Bi8HF;A+B3mHD;EC5VE,iBAAA;EACA,oBAAA;EhC08HD;A+B5mHC;EC/VA,kBAAA;EACA,qBAAA;EhC88HD;A+B7mHC;EClWA,kBAAA;EACA,qBAAA;EhCk9HD;A+BvmHD;EC5WE,kBAAA;EACA,qBAAA;EhCs9HD;A+B9lHD;EAAA;IATI,aAAA;IACA,mBAAA;IACA,oBAAA;I/B2mHD;E+BxmHC;IACE,iBAAA;I/B0mHH;EACF;A+BlmHD;EACE,2BAAA;EACA,uBAAA;E/BomHD;A+BtmHD;EAKI,gBAAA;E/BomHH;A+BnmHG;;EAEE,gBAAA;EACA,+BAAA;E/BqmHL;A+B9mHD;EAcI,gBAAA;E/BmmHH;A+BjnHD;EAmBM,gBAAA;E/BimHL;A+B/lHK;;EAEE,gBAAA;EACA,+BAAA;E/BimHP;A+B7lHK;;;EAGE,gBAAA;EACA,2BAAA;E/B+lHP;A+B3lHK;;;EAGE,gBAAA;EACA,+BAAA;E/B6lHP;A+BroHD;EA8CI,uBAAA;E/B0lHH;A+BzlHG;;EAEE,2BAAA;E/B2lHL;A+B5oHD;EAoDM,2BAAA;E/B2lHL;A+B/oHD;;EA0DI,uBAAA;E/BylHH;A+BllHK;;;EAGE,2BAAA;EACA,gBAAA;E/BolHP;A+BnjHC;EAAA;IAzBQ,gBAAA;I/BglHP;E+B/kHO;;IAEE,gBAAA;IACA,+BAAA;I/BilHT;E+B7kHO;;;IAGE,gBAAA;IACA,2BAAA;I/B+kHT;E+B3kHO;;;IAGE,gBAAA;IACA,+BAAA;I/B6kHT;EACF;A+B/qHD;EA8GI,gBAAA;E/BokHH;A+BnkHG;EACE,gBAAA;E/BqkHL;A+BrrHD;EAqHI,gBAAA;E/BmkHH;A+BlkHG;;EAEE,gBAAA;E/BokHL;A+BhkHK;;;;EAEE,gBAAA;E/BokHP;A+B5jHD;EACE,2BAAA;EACA,uBAAA;E/B8jHD;A+BhkHD;EAKI,gBAAA;E/B8jHH;A+B7jHG;;EAEE,gBAAA;EACA,+BAAA;E/B+jHL;A+BxkHD;EAcI,gBAAA;E/B6jHH;A+B3kHD;EAmBM,gBAAA;E/B2jHL;A+BzjHK;;EAEE,gBAAA;EACA,+BAAA;E/B2jHP;A+BvjHK;;;EAGE,gBAAA;EACA,2BAAA;E/ByjHP;A+BrjHK;;;EAGE,gBAAA;EACA,+BAAA;E/BujHP;A+B/lHD;EA+CI,uBAAA;E/BmjHH;A+BljHG;;EAEE,2BAAA;E/BojHL;A+BtmHD;EAqDM,2BAAA;E/BojHL;A+BzmHD;;EA2DI,uBAAA;E/BkjHH;A+B5iHK;;;EAGE,2BAAA;EACA,gBAAA;E/B8iHP;A+BvgHC;EAAA;IA/BQ,uBAAA;I/B0iHP;E+B3gHD;IA5BQ,2BAAA;I/B0iHP;E+B9gHD;IAzBQ,gBAAA;I/B0iHP;E+BziHO;;IAEE,gBAAA;IACA,+BAAA;I/B2iHT;E+BviHO;;;IAGE,gBAAA;IACA,2BAAA;I/ByiHT;E+BriHO;;;IAGE,gBAAA;IACA,+BAAA;I/BuiHT;EACF;A+B/oHD;EA+GI,gBAAA;E/BmiHH;A+BliHG;EACE,gBAAA;E/BoiHL;A+BrpHD;EAsHI,gBAAA;E/BkiHH;A+BjiHG;;EAEE,gBAAA;E/BmiHL;A+B/hHK;;;;EAEE,gBAAA;E/BmiHP;AkCxqID;EACE,mBAAA;EACA,qBAAA;EACA,kBAAA;EACA,2BAAA;EACA,oBAAA;ElC0qID;AkC/qID;EAQI,uBAAA;ElC0qIH;AkClrID;EAWM,mBAAA;EACA,gBAAA;EACA,gBAAA;ElC0qIL;AkCvrID;EAkBI,gBAAA;ElCwqIH;AmC5rID;EACE,uBAAA;EACA,iBAAA;EACA,gBAAA;EACA,oBAAA;EnC8rID;AmClsID;EAOI,iBAAA;EnC8rIH;AmCrsID;;EAUM,oBAAA;EACA,aAAA;EACA,mBAAA;EACA,yBAAA;EACA,uBAAA;EACA,gBAAA;EACA,2BAAA;EACA,2BAAA;EACA,mBAAA;EnC+rIL;AmC7rIG;;EAGI,gBAAA;EPXN,gCAAA;EACG,6BAAA;E5B0sIJ;AmC5rIG;;EPvBF,iCAAA;EACG,8BAAA;E5ButIJ;AmCvrIG;;;;EAEE,gBAAA;EACA,2BAAA;EACA,uBAAA;EnC2rIL;AmCrrIG;;;;;;EAGE,YAAA;EACA,gBAAA;EACA,2BAAA;EACA,uBAAA;EACA,iBAAA;EnC0rIL;AmChvID;;;;;;EAiEM,gBAAA;EACA,2BAAA;EACA,uBAAA;EACA,qBAAA;EnCurIL;AmC9qID;;EC1EM,oBAAA;EACA,iBAAA;EpC4vIL;AoC1vIG;;ERMF,gCAAA;EACG,6BAAA;E5BwvIJ;AoCzvIG;;ERRF,iCAAA;EACG,8BAAA;E5BqwIJ;AmCxrID;;EC/EM,mBAAA;EACA,iBAAA;EpC2wIL;AoCzwIG;;ERMF,gCAAA;EACG,6BAAA;E5BuwIJ;AoCxwIG;;ERRF,iCAAA;EACG,8BAAA;E5BoxIJ;AqCvxID;EACE,iBAAA;EACA,gBAAA;EACA,kBAAA;EACA,oBAAA;ErCyxID;AqC7xID;EAOI,iBAAA;ErCyxIH;AqChyID;;EAUM,uBAAA;EACA,mBAAA;EACA,2BAAA;EACA,2BAAA;EACA,qBAAA;ErC0xIL;AqCxyID;;EAmBM,uBAAA;EACA,2BAAA;ErCyxIL;AqC7yID;;EA2BM,cAAA;ErCsxIL;AqCjzID;;EAkCM,aAAA;ErCmxIL;AqCrzID;;;;EA2CM,gBAAA;EACA,2BAAA;EACA,qBAAA;ErCgxIL;AsC9zID;EACE,iBAAA;EACA,yBAAA;EACA,gBAAA;EACA,mBAAA;EACA,gBAAA;EACA,gBAAA;EACA,oBAAA;EACA,qBAAA;EACA,0BAAA;EACA,sBAAA;EtCg0ID;AsC5zIG;;EAEE,gBAAA;EACA,uBAAA;EACA,iBAAA;EtC8zIL;AsCzzIC;EACE,eAAA;EtC2zIH;AsCvzIC;EACE,oBAAA;EACA,WAAA;EtCyzIH;AsClzID;ECtCE,2BAAA;EvC21ID;AuCx1IG;;EAEE,2BAAA;EvC01IL;AsCrzID;EC1CE,2BAAA;EvCk2ID;AuC/1IG;;EAEE,2BAAA;EvCi2IL;AsCxzID;EC9CE,2BAAA;EvCy2ID;AuCt2IG;;EAEE,2BAAA;EvCw2IL;AsC3zID;EClDE,2BAAA;EvCg3ID;AuC72IG;;EAEE,2BAAA;EvC+2IL;AsC9zID;ECtDE,2BAAA;EvCu3ID;AuCp3IG;;EAEE,2BAAA;EvCs3IL;AsCj0ID;EC1DE,2BAAA;EvC83ID;AuC33IG;;EAEE,2BAAA;EvC63IL;AwC/3ID;EACE,uBAAA;EACA,iBAAA;EACA,kBAAA;EACA,iBAAA;EACA,mBAAA;EACA,gBAAA;EACA,gBAAA;EACA,0BAAA;EACA,qBAAA;EACA,oBAAA;EACA,2BAAA;EACA,qBAAA;ExCi4ID;AwC93IC;EACE,eAAA;ExCg4IH;AwC53IC;EACE,oBAAA;EACA,WAAA;ExC83IH;AwC53IC;EACE,QAAA;EACA,kBAAA;ExC83IH;AwCz3IG;;EAEE,gBAAA;EACA,uBAAA;EACA,iBAAA;ExC23IL;AwCt3IC;;EAEE,gBAAA;EACA,2BAAA;ExCw3IH;AwCt3IC;EACE,kBAAA;ExCw3IH;AyCv6ID;EACE,eAAA;EACA,qBAAA;EACA,gBAAA;EACA,2BAAA;EzCy6ID;AyC76ID;;EAQI,gBAAA;EzCy6IH;AyCj7ID;EAWI,qBAAA;EACA,iBAAA;EACA,kBAAA;EzCy6IH;AyCt7ID;EAiBI,2BAAA;EzCw6IH;AyCr6IC;EACE,oBAAA;EzCu6IH;AyC57ID;EAyBI,iBAAA;EzCs6IH;AyCr5ID;EAAA;IAbI,mBAAA;IACA,sBAAA;IzCs6ID;EyCp6IC;IACE,oBAAA;IACA,qBAAA;IzCs6IH;EyC95IH;;IAHM,iBAAA;IzCq6IH;EACF;A0C58ID;EACE,gBAAA;EACA,cAAA;EACA,qBAAA;EACA,yBAAA;EACA,2BAAA;EACA,2BAAA;EACA,oBAAA;ErC8KA,0CAAA;EACK,qCAAA;EACG,kCAAA;ELiyIT;A0Cx9ID;;EAaI,mBAAA;EACA,oBAAA;E1C+8IH;A0C38IC;;;EAGE,uBAAA;E1C68IH;A0Cl+ID;EA0BI,cAAA;EACA,gBAAA;E1C28IH;A2Cp+ID;EACE,eAAA;EACA,qBAAA;EACA,+BAAA;EACA,oBAAA;E3Cs+ID;A2C1+ID;EAQI,eAAA;EAEA,gBAAA;E3Co+IH;A2C9+ID;EAcI,mBAAA;E3Cm+IH;A2Cj/ID;;EAoBI,kBAAA;E3Ci+IH;A2Cr/ID;EAuBI,iBAAA;E3Ci+IH;A2Cz9ID;;EAEE,qBAAA;E3C29ID;A2C79ID;;EAMI,oBAAA;EACA,WAAA;EACA,cAAA;EACA,gBAAA;E3C29IH;A2Cn9ID;ECrDE,2BAAA;EACA,uBAAA;EACA,gBAAA;E5C2gJD;A2Cx9ID;EChDI,2BAAA;E5C2gJH;A2C39ID;EC7CI,gBAAA;E5C2gJH;A2C39ID;ECxDE,2BAAA;EACA,uBAAA;EACA,gBAAA;E5CshJD;A2Ch+ID;ECnDI,2BAAA;E5CshJH;A2Cn+ID;EChDI,gBAAA;E5CshJH;A2Cn+ID;EC3DE,2BAAA;EACA,uBAAA;EACA,gBAAA;E5CiiJD;A2Cx+ID;ECtDI,2BAAA;E5CiiJH;A2C3+ID;ECnDI,gBAAA;E5CiiJH;A2C3+ID;EC9DE,2BAAA;EACA,uBAAA;EACA,gBAAA;E5C4iJD;A2Ch/ID;ECzDI,2BAAA;E5C4iJH;A2Cn/ID;ECtDI,gBAAA;E5C4iJH;A6C9iJD;EACE;IAAQ,6BAAA;I7CijJP;E6ChjJD;IAAQ,0BAAA;I7CmjJP;EACF;A6ChjJD;EACE;IAAQ,6BAAA;I7CmjJP;E6CljJD;IAAQ,0BAAA;I7CqjJP;EACF;A6CxjJD;EACE;IAAQ,6BAAA;I7CmjJP;E6CljJD;IAAQ,0BAAA;I7CqjJP;EACF;A6C7iJD;EACE,kBAAA;EACA,cAAA;EACA,qBAAA;EACA,2BAAA;EACA,oBAAA;ExCqCA,wDAAA;EACQ,gDAAA;EL2gJT;A6C5iJD;EACE,aAAA;EACA,WAAA;EACA,cAAA;EACA,iBAAA;EACA,mBAAA;EACA,gBAAA;EACA,oBAAA;EACA,2BAAA;ExCwBA,wDAAA;EACQ,gDAAA;EAsHR,qCAAA;EACK,gCAAA;EACG,6BAAA;ELk6IT;A6CziJD;;ECAI,+MAAA;EACA,0MAAA;EACA,uMAAA;EDCF,oCAAA;EAAA,4BAAA;E7C6iJD;A6CtiJD;;ExC7CE,4DAAA;EACK,uDAAA;EACG,oDAAA;ELulJT;A6CriJC;;EAEE,iBAAA;E7CuiJH;A6CpiJC;EACE,gBAAA;EACA,iBAAA;EACA,+BAAA;EACA,wBAAA;EACA,0BAAA;EAAA,kBAAA;E7CsiJH;A6C7hJD;EEvFE,2BAAA;E/CunJD;A+CpnJC;EDgDE,+MAAA;EACA,0MAAA;EACA,uMAAA;E9CukJH;A6CjiJD;EE3FE,2BAAA;E/C+nJD;A+C5nJC;EDgDE,+MAAA;EACA,0MAAA;EACA,uMAAA;E9C+kJH;A6CriJD;EE/FE,2BAAA;E/CuoJD;A+CpoJC;EDgDE,+MAAA;EACA,0MAAA;EACA,uMAAA;E9CulJH;A6CziJD;EEnGE,2BAAA;E/C+oJD;A+C5oJC;EDgDE,+MAAA;EACA,0MAAA;EACA,uMAAA;E9C+lJH;AgD9oJD;;EAEE,kBAAA;EACA,SAAA;EhDgpJD;AgD5oJD;;EAEE,kBAAA;EhD8oJD;AgD5oJD;EACE,eAAA;EhD8oJD;AgD1oJD;EACE,gBAAA;EhD4oJD;AgDxoJD;EACE,iBAAA;EhD0oJD;AgDnoJD;EAEI,oBAAA;EhDooJH;AgDtoJD;EAKI,mBAAA;EhDooJH;AgD3nJD;EACE,iBAAA;EACA,kBAAA;EhD6nJD;AiD1qJD;EAEE,qBAAA;EACA,iBAAA;EjD2qJD;AiDnqJD;EACE,oBAAA;EACA,gBAAA;EACA,oBAAA;EAEA,qBAAA;EACA,2BAAA;EACA,2BAAA;EjDoqJD;AiDjqJC;ErB3BA,8BAAA;EACC,6BAAA;E5B+rJF;AiDlqJC;EACE,kBAAA;ErBvBF,iCAAA;EACC,gCAAA;E5B4rJF;AiDprJD;EAoBI,cAAA;EjDmqJH;AiDvrJD;EAuBI,mBAAA;EjDmqJH;AiDzpJD;EACE,gBAAA;EjD2pJD;AiD5pJD;EAII,gBAAA;EjD2pJH;AiDvpJC;;EAEE,uBAAA;EACA,gBAAA;EACA,2BAAA;EjDypJH;AiDnpJC;;;EAGE,2BAAA;EACA,gBAAA;EjDqpJH;AiDzpJC;;;EAQI,gBAAA;EjDspJL;AiD9pJC;;;EAWI,gBAAA;EjDwpJL;AiDnpJC;;;EAGE,YAAA;EACA,gBAAA;EACA,2BAAA;EACA,uBAAA;EjDqpJH;AiD3pJC;;;;;;;;;EAYI,gBAAA;EjD0pJL;AiDtqJC;;;EAeI,gBAAA;EjD4pJL;AkD/vJC;EACE,gBAAA;EACA,2BAAA;ElDiwJH;AkD/vJG;EACE,gBAAA;ElDiwJL;AkDlwJG;EAII,gBAAA;ElDiwJP;AkD9vJK;;EAEE,gBAAA;EACA,2BAAA;ElDgwJP;AkD9vJK;;;EAGE,aAAA;EACA,2BAAA;EACA,uBAAA;ElDgwJP;AkDrxJC;EACE,gBAAA;EACA,2BAAA;ElDuxJH;AkDrxJG;EACE,gBAAA;ElDuxJL;AkDxxJG;EAII,gBAAA;ElDuxJP;AkDpxJK;;EAEE,gBAAA;EACA,2BAAA;ElDsxJP;AkDpxJK;;;EAGE,aAAA;EACA,2BAAA;EACA,uBAAA;ElDsxJP;AkD3yJC;EACE,gBAAA;EACA,2BAAA;ElD6yJH;AkD3yJG;EACE,gBAAA;ElD6yJL;AkD9yJG;EAII,gBAAA;ElD6yJP;AkD1yJK;;EAEE,gBAAA;EACA,2BAAA;ElD4yJP;AkD1yJK;;;EAGE,aAAA;EACA,2BAAA;EACA,uBAAA;ElD4yJP;AkDj0JC;EACE,gBAAA;EACA,2BAAA;ElDm0JH;AkDj0JG;EACE,gBAAA;ElDm0JL;AkDp0JG;EAII,gBAAA;ElDm0JP;AkDh0JK;;EAEE,gBAAA;EACA,2BAAA;ElDk0JP;AkDh0JK;;;EAGE,aAAA;EACA,2BAAA;EACA,uBAAA;ElDk0JP;AiD/tJD;EACE,eAAA;EACA,oBAAA;EjDiuJD;AiD/tJD;EACE,kBAAA;EACA,kBAAA;EjDiuJD;AmD51JD;EACE,qBAAA;EACA,2BAAA;EACA,+BAAA;EACA,oBAAA;E9C0DA,mDAAA;EACQ,2CAAA;ELqyJT;AmD31JD;EACE,eAAA;EnD61JD;AmDx1JD;EACE,oBAAA;EACA,sCAAA;EvBpBA,8BAAA;EACC,6BAAA;E5B+2JF;AmD91JD;EAMI,gBAAA;EnD21JH;AmDt1JD;EACE,eAAA;EACA,kBAAA;EACA,iBAAA;EACA,gBAAA;EnDw1JD;AmD51JD;EAOI,gBAAA;EnDw1JH;AmDn1JD;EACE,oBAAA;EACA,2BAAA;EACA,+BAAA;EvBpCA,iCAAA;EACC,gCAAA;E5B03JF;AmD70JD;EAEI,kBAAA;EnD80JH;AmDh1JD;EAKM,qBAAA;EACA,kBAAA;EnD80JL;AmD10JG;EAEI,eAAA;EvBlEN,8BAAA;EACC,6BAAA;E5B84JF;AmDx0JG;EAEI,kBAAA;EvBjEN,iCAAA;EACC,gCAAA;E5B24JF;AmDp0JD;EAEI,qBAAA;EnDq0JH;AmDl0JD;EACE,qBAAA;EnDo0JD;AmD5zJD;;;EAII,kBAAA;EnD6zJH;AmDj0JD;;EvB9FE,8BAAA;EACC,6BAAA;E5Bm6JF;AmDt0JD;;;;;;;;EAgBU,6BAAA;EnDg0JT;AmDh1JD;;;;;;;;EAoBU,8BAAA;EnDs0JT;AmD11JD;;EvBtFE,iCAAA;EACC,gCAAA;E5Bo7JF;AmD/1JD;;;;;;;;EAmCU,gCAAA;EnDs0JT;AmDz2JD;;;;;;;;EAuCU,iCAAA;EnD40JT;AmDn3JD;;EA8CI,+BAAA;EnDy0JH;AmDv3JD;;EAkDI,eAAA;EnDy0JH;AmD33JD;;EAsDI,WAAA;EnDy0JH;AmD/3JD;;;;;;;;;;;;EA6DU,gBAAA;EnDg1JT;AmD74JD;;;;;;;;;;;;EAiEU,iBAAA;EnD01JT;AmD35JD;;;;;;;;EA0EU,kBAAA;EnD21JT;AmDr6JD;;;;;;;;EAmFU,kBAAA;EnD41JT;AmD/6JD;EAyFI,WAAA;EACA,kBAAA;EnDy1JH;AmD/0JD;EACE,qBAAA;EnDi1JD;AmDl1JD;EAKI,kBAAA;EACA,oBAAA;EnDg1JH;AmDt1JD;EAQM,iBAAA;EnDi1JL;AmDz1JD;EAaI,kBAAA;EnD+0JH;AmD51JD;EAeM,+BAAA;EnDg1JL;AmD/1JD;EAmBI,eAAA;EnD+0JH;AmDl2JD;EAqBM,kCAAA;EnDg1JL;AmDz0JD;EC9NE,uBAAA;EpD0iKD;AoDxiKC;EACE,gBAAA;EACA,2BAAA;EACA,uBAAA;EpD0iKH;AoD7iKC;EAMI,2BAAA;EpD0iKL;AoDhjKC;EASI,gBAAA;EACA,2BAAA;EpD0iKL;AoDviKC;EAEI,8BAAA;EpDwiKL;AmDx1JD;ECjOE,uBAAA;EpD4jKD;AoD1jKC;EACE,gBAAA;EACA,2BAAA;EACA,uBAAA;EpD4jKH;AoD/jKC;EAMI,2BAAA;EpD4jKL;AoDlkKC;EASI,gBAAA;EACA,2BAAA;EpD4jKL;AoDzjKC;EAEI,8BAAA;EpD0jKL;AmDv2JD;ECpOE,uBAAA;EpD8kKD;AoD5kKC;EACE,gBAAA;EACA,2BAAA;EACA,uBAAA;EpD8kKH;AoDjlKC;EAMI,2BAAA;EpD8kKL;AoDplKC;EASI,gBAAA;EACA,2BAAA;EpD8kKL;AoD3kKC;EAEI,8BAAA;EpD4kKL;AmDt3JD;ECvOE,uBAAA;EpDgmKD;AoD9lKC;EACE,gBAAA;EACA,2BAAA;EACA,uBAAA;EpDgmKH;AoDnmKC;EAMI,2BAAA;EpDgmKL;AoDtmKC;EASI,gBAAA;EACA,2BAAA;EpDgmKL;AoD7lKC;EAEI,8BAAA;EpD8lKL;AmDr4JD;EC1OE,uBAAA;EpDknKD;AoDhnKC;EACE,gBAAA;EACA,2BAAA;EACA,uBAAA;EpDknKH;AoDrnKC;EAMI,2BAAA;EpDknKL;AoDxnKC;EASI,gBAAA;EACA,2BAAA;EpDknKL;AoD/mKC;EAEI,8BAAA;EpDgnKL;AmDp5JD;EC7OE,uBAAA;EpDooKD;AoDloKC;EACE,gBAAA;EACA,2BAAA;EACA,uBAAA;EpDooKH;AoDvoKC;EAMI,2BAAA;EpDooKL;AoD1oKC;EASI,gBAAA;EACA,2BAAA;EpDooKL;AoDjoKC;EAEI,8BAAA;EpDkoKL;AqDlpKD;EACE,oBAAA;EACA,gBAAA;EACA,WAAA;EACA,YAAA;EACA,kBAAA;ErDopKD;AqDzpKD;;;;EAWI,oBAAA;EACA,QAAA;EACA,SAAA;EACA,WAAA;EACA,cAAA;EACA,aAAA;EACA,WAAA;ErDopKH;AqDhpKC;EACE,wBAAA;ErDkpKH;AqD9oKC;EACE,qBAAA;ErDgpKH;AsDzqKD;EACE,kBAAA;EACA,eAAA;EACA,qBAAA;EACA,2BAAA;EACA,2BAAA;EACA,oBAAA;EjDwDA,yDAAA;EACQ,iDAAA;ELonKT;AsDnrKD;EASI,oBAAA;EACA,mCAAA;EtD6qKH;AsDxqKD;EACE,eAAA;EACA,oBAAA;EtD0qKD;AsDxqKD;EACE,cAAA;EACA,oBAAA;EtD0qKD;AuDhsKD;EACE,cAAA;EACA,iBAAA;EACA,mBAAA;EACA,gBAAA;EACA,gBAAA;EACA,8BAAA;EjCRA,cAAA;EAGA,2BAAA;EtBysKD;AuDjsKC;;EAEE,gBAAA;EACA,uBAAA;EACA,iBAAA;EjCfF,cAAA;EAGA,2BAAA;EtBitKD;AuD9rKC;EACE,YAAA;EACA,iBAAA;EACA,yBAAA;EACA,WAAA;EACA,0BAAA;EvDgsKH;AwDptKD;EACE,kBAAA;ExDstKD;AwDltKD;EACE,eAAA;EACA,kBAAA;EACA,iBAAA;EACA,QAAA;EACA,UAAA;EACA,WAAA;EACA,SAAA;EACA,eAAA;EACA,mCAAA;EAIA,YAAA;ExDitKD;AwD9sKC;EnDkHA,4CAAA;EACQ,uCAAA;EAAA,oCAAA;EA8DR,qDAAA;EAEK,2CAAA;EACG,qCAAA;ELkiKT;AwDltKC;EnD8GA,yCAAA;EACQ,oCAAA;EAAA,iCAAA;ELumKT;AwDptKD;EACE,oBAAA;EACA,kBAAA;ExDstKD;AwDltKD;EACE,oBAAA;EACA,aAAA;EACA,cAAA;ExDotKD;AwDhtKD;EACE,oBAAA;EACA,2BAAA;EACA,2BAAA;EACA,sCAAA;EACA,oBAAA;EnDaA,kDAAA;EACQ,0CAAA;EmDZR,sCAAA;EAAA,8BAAA;EAEA,YAAA;ExDktKD;AwD9sKD;EACE,iBAAA;EACA,QAAA;EACA,UAAA;EACA,WAAA;EACA,SAAA;EACA,eAAA;EACA,2BAAA;ExDgtKD;AwD9sKC;ElCrEA,YAAA;EAGA,0BAAA;EtBoxKD;AwDjtKC;ElCtEA,cAAA;EAGA,2BAAA;EtBwxKD;AwDhtKD;EACE,eAAA;EACA,kCAAA;EACA,2BAAA;ExDktKD;AwD/sKD;EACE,kBAAA;ExDitKD;AwD7sKD;EACE,WAAA;EACA,yBAAA;ExD+sKD;AwD1sKD;EACE,oBAAA;EACA,eAAA;ExD4sKD;AwDxsKD;EACE,eAAA;EACA,mBAAA;EACA,+BAAA;ExD0sKD;AwD7sKD;EAQI,kBAAA;EACA,kBAAA;ExDwsKH;AwDjtKD;EAaI,mBAAA;ExDusKH;AwDptKD;EAiBI,gBAAA;ExDssKH;AwDjsKD;EACE,oBAAA;EACA,cAAA;EACA,aAAA;EACA,cAAA;EACA,kBAAA;ExDmsKD;AwDjrKD;EAZE;IACE,cAAA;IACA,mBAAA;IxDgsKD;EwD9rKD;InDvEA,mDAAA;IACQ,2CAAA;ILwwKP;EwD7rKD;IAAY,cAAA;IxDgsKX;EACF;AwD3rKD;EAFE;IAAY,cAAA;IxDisKX;EACF;AyDh1KD;EACE,oBAAA;EACA,eAAA;EACA,gBAAA;EACA,qBAAA;EACA,iBAAA;EACA,kBAAA;EnCTA,YAAA;EAGA,0BAAA;EtB01KD;AyDj1KC;EnCZA,cAAA;EAGA,2BAAA;EtB81KD;AyDp1KC;EAAW,kBAAA;EAAmB,gBAAA;EzDw1K/B;AyDv1KC;EAAW,kBAAA;EAAmB,gBAAA;EzD21K/B;AyD11KC;EAAW,iBAAA;EAAmB,gBAAA;EzD81K/B;AyD71KC;EAAW,mBAAA;EAAmB,gBAAA;EzDi2K/B;AyD71KD;EACE,kBAAA;EACA,kBAAA;EACA,gBAAA;EACA,oBAAA;EACA,uBAAA;EACA,2BAAA;EACA,oBAAA;EzD+1KD;AyD31KD;EACE,oBAAA;EACA,UAAA;EACA,WAAA;EACA,2BAAA;EACA,qBAAA;EzD61KD;AyD11KC;EACE,WAAA;EACA,WAAA;EACA,mBAAA;EACA,yBAAA;EACA,2BAAA;EzD41KH;AyD11KC;EACE,WAAA;EACA,WAAA;EACA,yBAAA;EACA,2BAAA;EzD41KH;AyD11KC;EACE,WAAA;EACA,YAAA;EACA,yBAAA;EACA,2BAAA;EzD41KH;AyD11KC;EACE,UAAA;EACA,SAAA;EACA,kBAAA;EACA,6BAAA;EACA,6BAAA;EzD41KH;AyD11KC;EACE,UAAA;EACA,UAAA;EACA,kBAAA;EACA,6BAAA;EACA,4BAAA;EzD41KH;AyD11KC;EACE,QAAA;EACA,WAAA;EACA,mBAAA;EACA,yBAAA;EACA,8BAAA;EzD41KH;AyD11KC;EACE,QAAA;EACA,WAAA;EACA,yBAAA;EACA,8BAAA;EzD41KH;AyD11KC;EACE,QAAA;EACA,YAAA;EACA,yBAAA;EACA,8BAAA;EzD41KH;A0Dn7KD;EACE,oBAAA;EACA,QAAA;EACA,SAAA;EACA,eAAA;EACA,eAAA;EACA,kBAAA;EACA,cAAA;EACA,kBAAA;EACA,2BAAA;EACA,sCAAA;EAAA,8BAAA;EACA,2BAAA;EACA,sCAAA;EACA,oBAAA;ErDkDA,mDAAA;EACQ,2CAAA;EqD/CR,qBAAA;E1Do7KD;A0Dj7KC;EAAY,mBAAA;E1Do7Kb;A0Dn7KC;EAAY,mBAAA;E1Ds7Kb;A0Dr7KC;EAAY,kBAAA;E1Dw7Kb;A0Dv7KC;EAAY,oBAAA;E1D07Kb;A0Dv7KD;EACE,WAAA;EACA,mBAAA;EACA,iBAAA;EACA,qBAAA;EACA,mBAAA;EACA,2BAAA;EACA,kCAAA;EACA,4BAAA;E1Dy7KD;A0Dt7KD;EACE,mBAAA;E1Dw7KD;A0Dh7KC;;EAEE,oBAAA;EACA,gBAAA;EACA,UAAA;EACA,WAAA;EACA,2BAAA;EACA,qBAAA;E1Dk7KH;A0D/6KD;EACE,oBAAA;E1Di7KD;A0D/6KD;EACE,oBAAA;EACA,aAAA;E1Di7KD;A0D76KC;EACE,WAAA;EACA,oBAAA;EACA,wBAAA;EACA,2BAAA;EACA,uCAAA;EACA,eAAA;E1D+6KH;A0D96KG;EACE,cAAA;EACA,aAAA;EACA,oBAAA;EACA,wBAAA;EACA,2BAAA;E1Dg7KL;A0D76KC;EACE,UAAA;EACA,aAAA;EACA,mBAAA;EACA,sBAAA;EACA,6BAAA;EACA,yCAAA;E1D+6KH;A0D96KG;EACE,cAAA;EACA,WAAA;EACA,eAAA;EACA,sBAAA;EACA,6BAAA;E1Dg7KL;A0D76KC;EACE,WAAA;EACA,oBAAA;EACA,qBAAA;EACA,8BAAA;EACA,0CAAA;EACA,YAAA;E1D+6KH;A0D96KG;EACE,cAAA;EACA,UAAA;EACA,oBAAA;EACA,qBAAA;EACA,8BAAA;E1Dg7KL;A0D56KC;EACE,UAAA;EACA,cAAA;EACA,mBAAA;EACA,uBAAA;EACA,4BAAA;EACA,wCAAA;E1D86KH;A0D76KG;EACE,cAAA;EACA,YAAA;EACA,uBAAA;EACA,4BAAA;EACA,eAAA;E1D+6KL;A2DziLD;EACE,oBAAA;E3D2iLD;A2DxiLD;EACE,oBAAA;EACA,kBAAA;EACA,aAAA;E3D0iLD;A2D7iLD;EAMI,eAAA;EACA,oBAAA;EtD0KF,2CAAA;EACK,sCAAA;EACG,mCAAA;ELi4KT;A2DpjLD;;EAcM,gBAAA;E3D0iLL;A2DxjLD;;;EAqBI,gBAAA;E3DwiLH;A2D7jLD;EAyBI,SAAA;E3DuiLH;A2DhkLD;;EA8BI,oBAAA;EACA,QAAA;EACA,aAAA;E3DsiLH;A2DtkLD;EAoCI,YAAA;E3DqiLH;A2DzkLD;EAuCI,aAAA;E3DqiLH;A2D5kLD;;EA2CI,SAAA;E3DqiLH;A2DhlLD;EA+CI,aAAA;E3DoiLH;A2DnlLD;EAkDI,YAAA;E3DoiLH;A2D5hLD;EACE,oBAAA;EACA,QAAA;EACA,SAAA;EACA,WAAA;EACA,YAAA;ErCtEA,cAAA;EAGA,2BAAA;EqCqEA,iBAAA;EACA,gBAAA;EACA,oBAAA;EACA,2CAAA;E3D+hLD;A2D1hLC;Eb1EE,oGAAA;EACA,+FAAA;EACA,sHAAA;EAAA,gGAAA;EACA,6BAAA;EACA,wHAAA;E9CumLH;A2D9hLC;EACE,YAAA;EACA,UAAA;Eb/EA,oGAAA;EACA,+FAAA;EACA,sHAAA;EAAA,gGAAA;EACA,6BAAA;EACA,wHAAA;E9CgnLH;A2DhiLC;;EAEE,YAAA;EACA,gBAAA;EACA,uBAAA;ErC9FF,cAAA;EAGA,2BAAA;EtB+nLD;A2DjkLD;;;;EAsCI,oBAAA;EACA,UAAA;EACA,YAAA;EACA,uBAAA;E3DiiLH;A2D1kLD;;EA6CI,WAAA;EACA,oBAAA;E3DiiLH;A2D/kLD;;EAkDI,YAAA;EACA,qBAAA;E3DiiLH;A2DplLD;;EAuDI,aAAA;EACA,cAAA;EACA,mBAAA;EACA,oBAAA;E3DiiLH;A2D5hLG;EACE,kBAAA;E3D8hLL;A2D1hLG;EACE,kBAAA;E3D4hLL;A2DlhLD;EACE,oBAAA;EACA,cAAA;EACA,WAAA;EACA,aAAA;EACA,YAAA;EACA,mBAAA;EACA,iBAAA;EACA,kBAAA;EACA,oBAAA;E3DohLD;A2D7hLD;EAYI,uBAAA;EACA,aAAA;EACA,cAAA;EACA,aAAA;EACA,qBAAA;EACA,2BAAA;EACA,qBAAA;EACA,iBAAA;EAUA,2BAAA;EACA,oCAAA;E3D2gLH;A2DziLD;EAiCI,WAAA;EACA,aAAA;EACA,cAAA;EACA,2BAAA;E3D2gLH;A2DpgLD;EACE,oBAAA;EACA,WAAA;EACA,YAAA;EACA,cAAA;EACA,aAAA;EACA,mBAAA;EACA,sBAAA;EACA,gBAAA;EACA,oBAAA;EACA,2CAAA;E3DsgLD;A2DrgLC;EACE,mBAAA;E3DugLH;A2D99KD;EAhCE;;;;IAKI,aAAA;IACA,cAAA;IACA,mBAAA;IACA,iBAAA;I3DggLH;E2DxgLD;;IAYI,oBAAA;I3DggLH;E2D5gLD;;IAgBI,qBAAA;I3DggLH;E2D3/KD;IACE,WAAA;IACA,YAAA;IACA,sBAAA;I3D6/KD;E2Dz/KD;IACE,cAAA;I3D2/KD;EACF;A4D/tLC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAEE,cAAA;EACA,gBAAA;E5D6vLH;A4D3vLC;;;;;;;;;;;;;;;EACE,aAAA;E5D2wLH;AiCnxLD;E4BRE,gBAAA;EACA,mBAAA;EACA,oBAAA;E7D8xLD;AiCrxLD;EACE,yBAAA;EjCuxLD;AiCrxLD;EACE,wBAAA;EjCuxLD;AiC/wLD;EACE,0BAAA;EjCixLD;AiC/wLD;EACE,2BAAA;EjCixLD;AiC/wLD;EACE,oBAAA;EjCixLD;AiC/wLD;E6BzBE,aAAA;EACA,oBAAA;EACA,mBAAA;EACA,+BAAA;EACA,WAAA;E9D2yLD;AiC7wLD;EACE,0BAAA;EACA,+BAAA;EjC+wLD;AiCxwLD;EACE,iBAAA;E5B2FA,yCAAA;EACQ,oCAAA;EAAA,iCAAA;ELgrLT;A+D9yLD;EACE,qBAAA;E/DgzLD;A+D1yLD;;;;ECdE,0BAAA;EhE8zLD;A+DzyLD;;;;;;;;;;;;EAYE,0BAAA;E/D2yLD;A+DpyLD;EAAA;IChDE,2BAAA;IhEw1LC;EgEv1LD;IAAU,gBAAA;IhE01LT;EgEz1LD;IAAU,+BAAA;IhE41LT;EgE31LD;;IACU,gCAAA;IhE81LT;EACF;A+D9yLD;EAAA;IAFI,2BAAA;I/DozLD;EACF;A+D9yLD;EAAA;IAFI,4BAAA;I/DozLD;EACF;A+D9yLD;EAAA;IAFI,kCAAA;I/DozLD;EACF;A+D7yLD;EAAA;ICrEE,2BAAA;IhEs3LC;EgEr3LD;IAAU,gBAAA;IhEw3LT;EgEv3LD;IAAU,+BAAA;IhE03LT;EgEz3LD;;IACU,gCAAA;IhE43LT;EACF;A+DvzLD;EAAA;IAFI,2BAAA;I/D6zLD;EACF;A+DvzLD;EAAA;IAFI,4BAAA;I/D6zLD;EACF;A+DvzLD;EAAA;IAFI,kCAAA;I/D6zLD;EACF;A+DtzLD;EAAA;IC1FE,2BAAA;IhEo5LC;EgEn5LD;IAAU,gBAAA;IhEs5LT;EgEr5LD;IAAU,+BAAA;IhEw5LT;EgEv5LD;;IACU,gCAAA;IhE05LT;EACF;A+Dh0LD;EAAA;IAFI,2BAAA;I/Ds0LD;EACF;A+Dh0LD;EAAA;IAFI,4BAAA;I/Ds0LD;EACF;A+Dh0LD;EAAA;IAFI,kCAAA;I/Ds0LD;EACF;A+D/zLD;EAAA;IC/GE,2BAAA;IhEk7LC;EgEj7LD;IAAU,gBAAA;IhEo7LT;EgEn7LD;IAAU,+BAAA;IhEs7LT;EgEr7LD;;IACU,gCAAA;IhEw7LT;EACF;A+Dz0LD;EAAA;IAFI,2BAAA;I/D+0LD;EACF;A+Dz0LD;EAAA;IAFI,4BAAA;I/D+0LD;EACF;A+Dz0LD;EAAA;IAFI,kCAAA;I/D+0LD;EACF;A+Dx0LD;EAAA;IC5HE,0BAAA;IhEw8LC;EACF;A+Dx0LD;EAAA;ICjIE,0BAAA;IhE68LC;EACF;A+Dx0LD;EAAA;ICtIE,0BAAA;IhEk9LC;EACF;A+Dx0LD;EAAA;IC3IE,0BAAA;IhEu9LC;EACF;A+Dr0LD;ECnJE,0BAAA;EhE29LD;A+Dl0LD;EAAA;ICjKE,2BAAA;IhEu+LC;EgEt+LD;IAAU,gBAAA;IhEy+LT;EgEx+LD;IAAU,+BAAA;IhE2+LT;EgE1+LD;;IACU,gCAAA;IhE6+LT;EACF;A+Dh1LD;EACE,0BAAA;E/Dk1LD;A+D70LD;EAAA;IAFI,2BAAA;I/Dm1LD;EACF;A+Dj1LD;EACE,0BAAA;E/Dm1LD;A+D90LD;EAAA;IAFI,4BAAA;I/Do1LD;EACF;A+Dl1LD;EACE,0BAAA;E/Do1LD;A+D/0LD;EAAA;IAFI,kCAAA;I/Dq1LD;EACF;A+D90LD;EAAA;ICpLE,0BAAA;IhEsgMC;EACF","sourcesContent":[null,"/*! normalize.css v3.0.1 | MIT License | git.io/normalize */\n\n//\n// 1. Set default font family to sans-serif.\n// 2. Prevent iOS text size adjust after orientation change, without disabling\n// user zoom.\n//\n\nhtml {\n font-family: sans-serif; // 1\n -ms-text-size-adjust: 100%; // 2\n -webkit-text-size-adjust: 100%; // 2\n}\n\n//\n// Remove default margin.\n//\n\nbody {\n margin: 0;\n}\n\n// HTML5 display definitions\n// ==========================================================================\n\n//\n// Correct `block` display not defined for any HTML5 element in IE 8/9.\n// Correct `block` display not defined for `details` or `summary` in IE 10/11 and Firefox.\n// Correct `block` display not defined for `main` in IE 11.\n//\n\narticle,\naside,\ndetails,\nfigcaption,\nfigure,\nfooter,\nheader,\nhgroup,\nmain,\nnav,\nsection,\nsummary {\n display: block;\n}\n\n//\n// 1. Correct `inline-block` display not defined in IE 8/9.\n// 2. Normalize vertical alignment of `progress` in Chrome, Firefox, and Opera.\n//\n\naudio,\ncanvas,\nprogress,\nvideo {\n display: inline-block; // 1\n vertical-align: baseline; // 2\n}\n\n//\n// Prevent modern browsers from displaying `audio` without controls.\n// Remove excess height in iOS 5 devices.\n//\n\naudio:not([controls]) {\n display: none;\n height: 0;\n}\n\n//\n// Address `[hidden]` styling not present in IE 8/9/10.\n// Hide the `template` element in IE 8/9/11, Safari, and Firefox < 22.\n//\n\n[hidden],\ntemplate {\n display: none;\n}\n\n// Links\n// ==========================================================================\n\n//\n// Remove the gray background color from active links in IE 10.\n//\n\na {\n background: transparent;\n}\n\n//\n// Improve readability when focused and also mouse hovered in all browsers.\n//\n\na:active,\na:hover {\n outline: 0;\n}\n\n// Text-level semantics\n// ==========================================================================\n\n//\n// Address styling not present in IE 8/9/10/11, Safari, and Chrome.\n//\n\nabbr[title] {\n border-bottom: 1px dotted;\n}\n\n//\n// Address style set to `bolder` in Firefox 4+, Safari, and Chrome.\n//\n\nb,\nstrong {\n font-weight: bold;\n}\n\n//\n// Address styling not present in Safari and Chrome.\n//\n\ndfn {\n font-style: italic;\n}\n\n//\n// Address variable `h1` font-size and margin within `section` and `article`\n// contexts in Firefox 4+, Safari, and Chrome.\n//\n\nh1 {\n font-size: 2em;\n margin: 0.67em 0;\n}\n\n//\n// Address styling not present in IE 8/9.\n//\n\nmark {\n background: #ff0;\n color: #000;\n}\n\n//\n// Address inconsistent and variable font size in all browsers.\n//\n\nsmall {\n font-size: 80%;\n}\n\n//\n// Prevent `sub` and `sup` affecting `line-height` in all browsers.\n//\n\nsub,\nsup {\n font-size: 75%;\n line-height: 0;\n position: relative;\n vertical-align: baseline;\n}\n\nsup {\n top: -0.5em;\n}\n\nsub {\n bottom: -0.25em;\n}\n\n// Embedded content\n// ==========================================================================\n\n//\n// Remove border when inside `a` element in IE 8/9/10.\n//\n\nimg {\n border: 0;\n}\n\n//\n// Correct overflow not hidden in IE 9/10/11.\n//\n\nsvg:not(:root) {\n overflow: hidden;\n}\n\n// Grouping content\n// ==========================================================================\n\n//\n// Address margin not present in IE 8/9 and Safari.\n//\n\nfigure {\n margin: 1em 40px;\n}\n\n//\n// Address differences between Firefox and other browsers.\n//\n\nhr {\n -moz-box-sizing: content-box;\n box-sizing: content-box;\n height: 0;\n}\n\n//\n// Contain overflow in all browsers.\n//\n\npre {\n overflow: auto;\n}\n\n//\n// Address odd `em`-unit font size rendering in all browsers.\n//\n\ncode,\nkbd,\npre,\nsamp {\n font-family: monospace, monospace;\n font-size: 1em;\n}\n\n// Forms\n// ==========================================================================\n\n//\n// Known limitation: by default, Chrome and Safari on OS X allow very limited\n// styling of `select`, unless a `border` property is set.\n//\n\n//\n// 1. Correct color not being inherited.\n// Known issue: affects color of disabled elements.\n// 2. Correct font properties not being inherited.\n// 3. Address margins set differently in Firefox 4+, Safari, and Chrome.\n//\n\nbutton,\ninput,\noptgroup,\nselect,\ntextarea {\n color: inherit; // 1\n font: inherit; // 2\n margin: 0; // 3\n}\n\n//\n// Address `overflow` set to `hidden` in IE 8/9/10/11.\n//\n\nbutton {\n overflow: visible;\n}\n\n//\n// Address inconsistent `text-transform` inheritance for `button` and `select`.\n// All other form control elements do not inherit `text-transform` values.\n// Correct `button` style inheritance in Firefox, IE 8/9/10/11, and Opera.\n// Correct `select` style inheritance in Firefox.\n//\n\nbutton,\nselect {\n text-transform: none;\n}\n\n//\n// 1. Avoid the WebKit bug in Android 4.0.* where (2) destroys native `audio`\n// and `video` controls.\n// 2. Correct inability to style clickable `input` types in iOS.\n// 3. Improve usability and consistency of cursor style between image-type\n// `input` and others.\n//\n\nbutton,\nhtml input[type=\"button\"], // 1\ninput[type=\"reset\"],\ninput[type=\"submit\"] {\n -webkit-appearance: button; // 2\n cursor: pointer; // 3\n}\n\n//\n// Re-set default cursor for disabled elements.\n//\n\nbutton[disabled],\nhtml input[disabled] {\n cursor: default;\n}\n\n//\n// Remove inner padding and border in Firefox 4+.\n//\n\nbutton::-moz-focus-inner,\ninput::-moz-focus-inner {\n border: 0;\n padding: 0;\n}\n\n//\n// Address Firefox 4+ setting `line-height` on `input` using `!important` in\n// the UA stylesheet.\n//\n\ninput {\n line-height: normal;\n}\n\n//\n// It's recommended that you don't attempt to style these elements.\n// Firefox's implementation doesn't respect box-sizing, padding, or width.\n//\n// 1. Address box sizing set to `content-box` in IE 8/9/10.\n// 2. Remove excess padding in IE 8/9/10.\n//\n\ninput[type=\"checkbox\"],\ninput[type=\"radio\"] {\n box-sizing: border-box; // 1\n padding: 0; // 2\n}\n\n//\n// Fix the cursor style for Chrome's increment/decrement buttons. For certain\n// `font-size` values of the `input`, it causes the cursor style of the\n// decrement button to change from `default` to `text`.\n//\n\ninput[type=\"number\"]::-webkit-inner-spin-button,\ninput[type=\"number\"]::-webkit-outer-spin-button {\n height: auto;\n}\n\n//\n// 1. Address `appearance` set to `searchfield` in Safari and Chrome.\n// 2. Address `box-sizing` set to `border-box` in Safari and Chrome\n// (include `-moz` to future-proof).\n//\n\ninput[type=\"search\"] {\n -webkit-appearance: textfield; // 1\n -moz-box-sizing: content-box;\n -webkit-box-sizing: content-box; // 2\n box-sizing: content-box;\n}\n\n//\n// Remove inner padding and search cancel button in Safari and Chrome on OS X.\n// Safari (but not Chrome) clips the cancel button when the search input has\n// padding (and `textfield` appearance).\n//\n\ninput[type=\"search\"]::-webkit-search-cancel-button,\ninput[type=\"search\"]::-webkit-search-decoration {\n -webkit-appearance: none;\n}\n\n//\n// Define consistent border, margin, and padding.\n//\n\nfieldset {\n border: 1px solid #c0c0c0;\n margin: 0 2px;\n padding: 0.35em 0.625em 0.75em;\n}\n\n//\n// 1. Correct `color` not being inherited in IE 8/9/10/11.\n// 2. Remove padding so people aren't caught out if they zero out fieldsets.\n//\n\nlegend {\n border: 0; // 1\n padding: 0; // 2\n}\n\n//\n// Remove default vertical scrollbar in IE 8/9/10/11.\n//\n\ntextarea {\n overflow: auto;\n}\n\n//\n// Don't inherit the `font-weight` (applied by a rule above).\n// NOTE: the default cannot safely be changed in Chrome and Safari on OS X.\n//\n\noptgroup {\n font-weight: bold;\n}\n\n// Tables\n// ==========================================================================\n\n//\n// Remove most spacing between table cells.\n//\n\ntable {\n border-collapse: collapse;\n border-spacing: 0;\n}\n\ntd,\nth {\n padding: 0;\n}\n","//\n// Basic print styles\n// --------------------------------------------------\n// Source: https://github.com/h5bp/html5-boilerplate/blob/master/css/main.css\n\n@media print {\n\n * {\n text-shadow: none !important;\n color: #000 !important; // Black prints faster: h5bp.com/s\n background: transparent !important;\n box-shadow: none !important;\n }\n\n a,\n a:visited {\n text-decoration: underline;\n }\n\n a[href]:after {\n content: \" (\" attr(href) \")\";\n }\n\n abbr[title]:after {\n content: \" (\" attr(title) \")\";\n }\n\n // Don't show links for images, or javascript/internal links\n a[href^=\"javascript:\"]:after,\n a[href^=\"#\"]:after {\n content: \"\";\n }\n\n pre,\n blockquote {\n border: 1px solid #999;\n page-break-inside: avoid;\n }\n\n thead {\n display: table-header-group; // h5bp.com/t\n }\n\n tr,\n img {\n page-break-inside: avoid;\n }\n\n img {\n max-width: 100% !important;\n }\n\n p,\n h2,\n h3 {\n orphans: 3;\n widows: 3;\n }\n\n h2,\n h3 {\n page-break-after: avoid;\n }\n\n // Chrome (OSX) fix for https://github.com/twbs/bootstrap/issues/11245\n // Once fixed, we can just straight up remove this.\n select {\n background: #fff !important;\n }\n\n // Bootstrap components\n .navbar {\n display: none;\n }\n .table {\n td,\n th {\n background-color: #fff !important;\n }\n }\n .btn,\n .dropup > .btn {\n > .caret {\n border-top-color: #000 !important;\n }\n }\n .label {\n border: 1px solid #000;\n }\n\n .table {\n border-collapse: collapse !important;\n }\n .table-bordered {\n th,\n td {\n border: 1px solid #ddd !important;\n }\n }\n\n}\n","//\n// Glyphicons for Bootstrap\n//\n// Since icons are fonts, they can be placed anywhere text is placed and are\n// thus automatically sized to match the surrounding child. To use, create an\n// inline element with the appropriate classes, like so:\n//\n// <a href=\"#\"><span class=\"glyphicon glyphicon-star\"></span> Star</a>\n\n// Import the fonts\n@font-face {\n font-family: 'Glyphicons Halflings';\n src: url('@{icon-font-path}@{icon-font-name}.eot');\n src: url('@{icon-font-path}@{icon-font-name}.eot?#iefix') format('embedded-opentype'),\n url('@{icon-font-path}@{icon-font-name}.woff') format('woff'),\n url('@{icon-font-path}@{icon-font-name}.ttf') format('truetype'),\n url('@{icon-font-path}@{icon-font-name}.svg#@{icon-font-svg-id}') format('svg');\n}\n\n// Catchall baseclass\n.glyphicon {\n position: relative;\n top: 1px;\n display: inline-block;\n font-family: 'Glyphicons Halflings';\n font-style: normal;\n font-weight: normal;\n line-height: 1;\n -webkit-font-smoothing: antialiased;\n -moz-osx-font-smoothing: grayscale;\n}\n\n// Individual icons\n.glyphicon-asterisk { &:before { content: \"\\2a\"; } }\n.glyphicon-plus { &:before { content: \"\\2b\"; } }\n.glyphicon-euro { &:before { content: \"\\20ac\"; } }\n.glyphicon-minus { &:before { content: \"\\2212\"; } }\n.glyphicon-cloud { &:before { content: \"\\2601\"; } }\n.glyphicon-envelope { &:before { content: \"\\2709\"; } }\n.glyphicon-pencil { &:before { content: \"\\270f\"; } }\n.glyphicon-glass { &:before { content: \"\\e001\"; } }\n.glyphicon-music { &:before { content: \"\\e002\"; } }\n.glyphicon-search { &:before { content: \"\\e003\"; } }\n.glyphicon-heart { &:before { content: \"\\e005\"; } }\n.glyphicon-star { &:before { content: \"\\e006\"; } }\n.glyphicon-star-empty { &:before { content: \"\\e007\"; } }\n.glyphicon-user { &:before { content: \"\\e008\"; } }\n.glyphicon-film { &:before { content: \"\\e009\"; } }\n.glyphicon-th-large { &:before { content: \"\\e010\"; } }\n.glyphicon-th { &:before { content: \"\\e011\"; } }\n.glyphicon-th-list { &:before { content: \"\\e012\"; } }\n.glyphicon-ok { &:before { content: \"\\e013\"; } }\n.glyphicon-remove { &:before { content: \"\\e014\"; } }\n.glyphicon-zoom-in { &:before { content: \"\\e015\"; } }\n.glyphicon-zoom-out { &:before { content: \"\\e016\"; } }\n.glyphicon-off { &:before { content: \"\\e017\"; } }\n.glyphicon-signal { &:before { content: \"\\e018\"; } }\n.glyphicon-cog { &:before { content: \"\\e019\"; } }\n.glyphicon-trash { &:before { content: \"\\e020\"; } }\n.glyphicon-home { &:before { content: \"\\e021\"; } }\n.glyphicon-file { &:before { content: \"\\e022\"; } }\n.glyphicon-time { &:before { content: \"\\e023\"; } }\n.glyphicon-road { &:before { content: \"\\e024\"; } }\n.glyphicon-download-alt { &:before { content: \"\\e025\"; } }\n.glyphicon-download { &:before { content: \"\\e026\"; } }\n.glyphicon-upload { &:before { content: \"\\e027\"; } }\n.glyphicon-inbox { &:before { content: \"\\e028\"; } }\n.glyphicon-play-circle { &:before { content: \"\\e029\"; } }\n.glyphicon-repeat { &:before { content: \"\\e030\"; } }\n.glyphicon-refresh { &:before { content: \"\\e031\"; } }\n.glyphicon-list-alt { &:before { content: \"\\e032\"; } }\n.glyphicon-lock { &:before { content: \"\\e033\"; } }\n.glyphicon-flag { &:before { content: \"\\e034\"; } }\n.glyphicon-headphones { &:before { content: \"\\e035\"; } }\n.glyphicon-volume-off { &:before { content: \"\\e036\"; } }\n.glyphicon-volume-down { &:before { content: \"\\e037\"; } }\n.glyphicon-volume-up { &:before { content: \"\\e038\"; } }\n.glyphicon-qrcode { &:before { content: \"\\e039\"; } }\n.glyphicon-barcode { &:before { content: \"\\e040\"; } }\n.glyphicon-tag { &:before { content: \"\\e041\"; } }\n.glyphicon-tags { &:before { content: \"\\e042\"; } }\n.glyphicon-book { &:before { content: \"\\e043\"; } }\n.glyphicon-bookmark { &:before { content: \"\\e044\"; } }\n.glyphicon-print { &:before { content: \"\\e045\"; } }\n.glyphicon-camera { &:before { content: \"\\e046\"; } }\n.glyphicon-font { &:before { content: \"\\e047\"; } }\n.glyphicon-bold { &:before { content: \"\\e048\"; } }\n.glyphicon-italic { &:before { content: \"\\e049\"; } }\n.glyphicon-text-height { &:before { content: \"\\e050\"; } }\n.glyphicon-text-width { &:before { content: \"\\e051\"; } }\n.glyphicon-align-left { &:before { content: \"\\e052\"; } }\n.glyphicon-align-center { &:before { content: \"\\e053\"; } }\n.glyphicon-align-right { &:before { content: \"\\e054\"; } }\n.glyphicon-align-justify { &:before { content: \"\\e055\"; } }\n.glyphicon-list { &:before { content: \"\\e056\"; } }\n.glyphicon-indent-left { &:before { content: \"\\e057\"; } }\n.glyphicon-indent-right { &:before { content: \"\\e058\"; } }\n.glyphicon-facetime-video { &:before { content: \"\\e059\"; } }\n.glyphicon-picture { &:before { content: \"\\e060\"; } }\n.glyphicon-map-marker { &:before { content: \"\\e062\"; } }\n.glyphicon-adjust { &:before { content: \"\\e063\"; } }\n.glyphicon-tint { &:before { content: \"\\e064\"; } }\n.glyphicon-edit { &:before { content: \"\\e065\"; } }\n.glyphicon-share { &:before { content: \"\\e066\"; } }\n.glyphicon-check { &:before { content: \"\\e067\"; } }\n.glyphicon-move { &:before { content: \"\\e068\"; } }\n.glyphicon-step-backward { &:before { content: \"\\e069\"; } }\n.glyphicon-fast-backward { &:before { content: \"\\e070\"; } }\n.glyphicon-backward { &:before { content: \"\\e071\"; } }\n.glyphicon-play { &:before { content: \"\\e072\"; } }\n.glyphicon-pause { &:before { content: \"\\e073\"; } }\n.glyphicon-stop { &:before { content: \"\\e074\"; } }\n.glyphicon-forward { &:before { content: \"\\e075\"; } }\n.glyphicon-fast-forward { &:before { content: \"\\e076\"; } }\n.glyphicon-step-forward { &:before { content: \"\\e077\"; } }\n.glyphicon-eject { &:before { content: \"\\e078\"; } }\n.glyphicon-chevron-left { &:before { content: \"\\e079\"; } }\n.glyphicon-chevron-right { &:before { content: \"\\e080\"; } }\n.glyphicon-plus-sign { &:before { content: \"\\e081\"; } }\n.glyphicon-minus-sign { &:before { content: \"\\e082\"; } }\n.glyphicon-remove-sign { &:before { content: \"\\e083\"; } }\n.glyphicon-ok-sign { &:before { content: \"\\e084\"; } }\n.glyphicon-question-sign { &:before { content: \"\\e085\"; } }\n.glyphicon-info-sign { &:before { content: \"\\e086\"; } }\n.glyphicon-screenshot { &:before { content: \"\\e087\"; } }\n.glyphicon-remove-circle { &:before { content: \"\\e088\"; } }\n.glyphicon-ok-circle { &:before { content: \"\\e089\"; } }\n.glyphicon-ban-circle { &:before { content: \"\\e090\"; } }\n.glyphicon-arrow-left { &:before { content: \"\\e091\"; } }\n.glyphicon-arrow-right { &:before { content: \"\\e092\"; } }\n.glyphicon-arrow-up { &:before { content: \"\\e093\"; } }\n.glyphicon-arrow-down { &:before { content: \"\\e094\"; } }\n.glyphicon-share-alt { &:before { content: \"\\e095\"; } }\n.glyphicon-resize-full { &:before { content: \"\\e096\"; } }\n.glyphicon-resize-small { &:before { content: \"\\e097\"; } }\n.glyphicon-exclamation-sign { &:before { content: \"\\e101\"; } }\n.glyphicon-gift { &:before { content: \"\\e102\"; } }\n.glyphicon-leaf { &:before { content: \"\\e103\"; } }\n.glyphicon-fire { &:before { content: \"\\e104\"; } }\n.glyphicon-eye-open { &:before { content: \"\\e105\"; } }\n.glyphicon-eye-close { &:before { content: \"\\e106\"; } }\n.glyphicon-warning-sign { &:before { content: \"\\e107\"; } }\n.glyphicon-plane { &:before { content: \"\\e108\"; } }\n.glyphicon-calendar { &:before { content: \"\\e109\"; } }\n.glyphicon-random { &:before { content: \"\\e110\"; } }\n.glyphicon-comment { &:before { content: \"\\e111\"; } }\n.glyphicon-magnet { &:before { content: \"\\e112\"; } }\n.glyphicon-chevron-up { &:before { content: \"\\e113\"; } }\n.glyphicon-chevron-down { &:before { content: \"\\e114\"; } }\n.glyphicon-retweet { &:before { content: \"\\e115\"; } }\n.glyphicon-shopping-cart { &:before { content: \"\\e116\"; } }\n.glyphicon-folder-close { &:before { content: \"\\e117\"; } }\n.glyphicon-folder-open { &:before { content: \"\\e118\"; } }\n.glyphicon-resize-vertical { &:before { content: \"\\e119\"; } }\n.glyphicon-resize-horizontal { &:before { content: \"\\e120\"; } }\n.glyphicon-hdd { &:before { content: \"\\e121\"; } }\n.glyphicon-bullhorn { &:before { content: \"\\e122\"; } }\n.glyphicon-bell { &:before { content: \"\\e123\"; } }\n.glyphicon-certificate { &:before { content: \"\\e124\"; } }\n.glyphicon-thumbs-up { &:before { content: \"\\e125\"; } }\n.glyphicon-thumbs-down { &:before { content: \"\\e126\"; } }\n.glyphicon-hand-right { &:before { content: \"\\e127\"; } }\n.glyphicon-hand-left { &:before { content: \"\\e128\"; } }\n.glyphicon-hand-up { &:before { content: \"\\e129\"; } }\n.glyphicon-hand-down { &:before { content: \"\\e130\"; } }\n.glyphicon-circle-arrow-right { &:before { content: \"\\e131\"; } }\n.glyphicon-circle-arrow-left { &:before { content: \"\\e132\"; } }\n.glyphicon-circle-arrow-up { &:before { content: \"\\e133\"; } }\n.glyphicon-circle-arrow-down { &:before { content: \"\\e134\"; } }\n.glyphicon-globe { &:before { content: \"\\e135\"; } }\n.glyphicon-wrench { &:before { content: \"\\e136\"; } }\n.glyphicon-tasks { &:before { content: \"\\e137\"; } }\n.glyphicon-filter { &:before { content: \"\\e138\"; } }\n.glyphicon-briefcase { &:before { content: \"\\e139\"; } }\n.glyphicon-fullscreen { &:before { content: \"\\e140\"; } }\n.glyphicon-dashboard { &:before { content: \"\\e141\"; } }\n.glyphicon-paperclip { &:before { content: \"\\e142\"; } }\n.glyphicon-heart-empty { &:before { content: \"\\e143\"; } }\n.glyphicon-link { &:before { content: \"\\e144\"; } }\n.glyphicon-phone { &:before { content: \"\\e145\"; } }\n.glyphicon-pushpin { &:before { content: \"\\e146\"; } }\n.glyphicon-usd { &:before { content: \"\\e148\"; } }\n.glyphicon-gbp { &:before { content: \"\\e149\"; } }\n.glyphicon-sort { &:before { content: \"\\e150\"; } }\n.glyphicon-sort-by-alphabet { &:before { content: \"\\e151\"; } }\n.glyphicon-sort-by-alphabet-alt { &:before { content: \"\\e152\"; } }\n.glyphicon-sort-by-order { &:before { content: \"\\e153\"; } }\n.glyphicon-sort-by-order-alt { &:before { content: \"\\e154\"; } }\n.glyphicon-sort-by-attributes { &:before { content: \"\\e155\"; } }\n.glyphicon-sort-by-attributes-alt { &:before { content: \"\\e156\"; } }\n.glyphicon-unchecked { &:before { content: \"\\e157\"; } }\n.glyphicon-expand { &:before { content: \"\\e158\"; } }\n.glyphicon-collapse-down { &:before { content: \"\\e159\"; } }\n.glyphicon-collapse-up { &:before { content: \"\\e160\"; } }\n.glyphicon-log-in { &:before { content: \"\\e161\"; } }\n.glyphicon-flash { &:before { content: \"\\e162\"; } }\n.glyphicon-log-out { &:before { content: \"\\e163\"; } }\n.glyphicon-new-window { &:before { content: \"\\e164\"; } }\n.glyphicon-record { &:before { content: \"\\e165\"; } }\n.glyphicon-save { &:before { content: \"\\e166\"; } }\n.glyphicon-open { &:before { content: \"\\e167\"; } }\n.glyphicon-saved { &:before { content: \"\\e168\"; } }\n.glyphicon-import { &:before { content: \"\\e169\"; } }\n.glyphicon-export { &:before { content: \"\\e170\"; } }\n.glyphicon-send { &:before { content: \"\\e171\"; } }\n.glyphicon-floppy-disk { &:before { content: \"\\e172\"; } }\n.glyphicon-floppy-saved { &:before { content: \"\\e173\"; } }\n.glyphicon-floppy-remove { &:before { content: \"\\e174\"; } }\n.glyphicon-floppy-save { &:before { content: \"\\e175\"; } }\n.glyphicon-floppy-open { &:before { content: \"\\e176\"; } }\n.glyphicon-credit-card { &:before { content: \"\\e177\"; } }\n.glyphicon-transfer { &:before { content: \"\\e178\"; } }\n.glyphicon-cutlery { &:before { content: \"\\e179\"; } }\n.glyphicon-header { &:before { content: \"\\e180\"; } }\n.glyphicon-compressed { &:before { content: \"\\e181\"; } }\n.glyphicon-earphone { &:before { content: \"\\e182\"; } }\n.glyphicon-phone-alt { &:before { content: \"\\e183\"; } }\n.glyphicon-tower { &:before { content: \"\\e184\"; } }\n.glyphicon-stats { &:before { content: \"\\e185\"; } }\n.glyphicon-sd-video { &:before { content: \"\\e186\"; } }\n.glyphicon-hd-video { &:before { content: \"\\e187\"; } }\n.glyphicon-subtitles { &:before { content: \"\\e188\"; } }\n.glyphicon-sound-stereo { &:before { content: \"\\e189\"; } }\n.glyphicon-sound-dolby { &:before { content: \"\\e190\"; } }\n.glyphicon-sound-5-1 { &:before { content: \"\\e191\"; } }\n.glyphicon-sound-6-1 { &:before { content: \"\\e192\"; } }\n.glyphicon-sound-7-1 { &:before { content: \"\\e193\"; } }\n.glyphicon-copyright-mark { &:before { content: \"\\e194\"; } }\n.glyphicon-registration-mark { &:before { content: \"\\e195\"; } }\n.glyphicon-cloud-download { &:before { content: \"\\e197\"; } }\n.glyphicon-cloud-upload { &:before { content: \"\\e198\"; } }\n.glyphicon-tree-conifer { &:before { content: \"\\e199\"; } }\n.glyphicon-tree-deciduous { &:before { content: \"\\e200\"; } }\n","//\n// Scaffolding\n// --------------------------------------------------\n\n\n// Reset the box-sizing\n//\n// Heads up! This reset may cause conflicts with some third-party widgets.\n// For recommendations on resolving such conflicts, see\n// http://getbootstrap.com/getting-started/#third-box-sizing\n* {\n .box-sizing(border-box);\n}\n*:before,\n*:after {\n .box-sizing(border-box);\n}\n\n\n// Body reset\n\nhtml {\n font-size: 10px;\n -webkit-tap-highlight-color: rgba(0,0,0,0);\n}\n\nbody {\n font-family: @font-family-base;\n font-size: @font-size-base;\n line-height: @line-height-base;\n color: @text-color;\n background-color: @body-bg;\n}\n\n// Reset fonts for relevant elements\ninput,\nbutton,\nselect,\ntextarea {\n font-family: inherit;\n font-size: inherit;\n line-height: inherit;\n}\n\n\n// Links\n\na {\n color: @link-color;\n text-decoration: none;\n\n &:hover,\n &:focus {\n color: @link-hover-color;\n text-decoration: underline;\n }\n\n &:focus {\n .tab-focus();\n }\n}\n\n\n// Figures\n//\n// We reset this here because previously Normalize had no `figure` margins. This\n// ensures we don't break anyone's use of the element.\n\nfigure {\n margin: 0;\n}\n\n\n// Images\n\nimg {\n vertical-align: middle;\n}\n\n// Responsive images (ensure images don't scale beyond their parents)\n.img-responsive {\n .img-responsive();\n}\n\n// Rounded corners\n.img-rounded {\n border-radius: @border-radius-large;\n}\n\n// Image thumbnails\n//\n// Heads up! This is mixin-ed into thumbnails.less for `.thumbnail`.\n.img-thumbnail {\n padding: @thumbnail-padding;\n line-height: @line-height-base;\n background-color: @thumbnail-bg;\n border: 1px solid @thumbnail-border;\n border-radius: @thumbnail-border-radius;\n .transition(all .2s ease-in-out);\n\n // Keep them at most 100% wide\n .img-responsive(inline-block);\n}\n\n// Perfect circle\n.img-circle {\n border-radius: 50%; // set radius in percents\n}\n\n\n// Horizontal rules\n\nhr {\n margin-top: @line-height-computed;\n margin-bottom: @line-height-computed;\n border: 0;\n border-top: 1px solid @hr-border;\n}\n\n\n// Only display content to screen readers\n//\n// See: http://a11yproject.com/posts/how-to-hide-content/\n\n.sr-only {\n position: absolute;\n width: 1px;\n height: 1px;\n margin: -1px;\n padding: 0;\n overflow: hidden;\n clip: rect(0,0,0,0);\n border: 0;\n}\n\n// Use in conjunction with .sr-only to only display content when it's focused.\n// Useful for \"Skip to main content\" links; see http://www.w3.org/TR/2013/NOTE-WCAG20-TECHS-20130905/G1\n// Credit: HTML5 Boilerplate\n\n.sr-only-focusable {\n &:active,\n &:focus {\n position: static;\n width: auto;\n height: auto;\n margin: 0;\n overflow: visible;\n clip: auto;\n }\n}\n","// Vendor Prefixes\n//\n// All vendor mixins are deprecated as of v3.2.0 due to the introduction of\n// Autoprefixer in our Gruntfile. They will be removed in v4.\n\n// - Animations\n// - Backface visibility\n// - Box shadow\n// - Box sizing\n// - Content columns\n// - Hyphens\n// - Placeholder text\n// - Transformations\n// - Transitions\n// - User Select\n\n\n// Animations\n.animation(@animation) {\n -webkit-animation: @animation;\n -o-animation: @animation;\n animation: @animation;\n}\n.animation-name(@name) {\n -webkit-animation-name: @name;\n animation-name: @name;\n}\n.animation-duration(@duration) {\n -webkit-animation-duration: @duration;\n animation-duration: @duration;\n}\n.animation-timing-function(@timing-function) {\n -webkit-animation-timing-function: @timing-function;\n animation-timing-function: @timing-function;\n}\n.animation-delay(@delay) {\n -webkit-animation-delay: @delay;\n animation-delay: @delay;\n}\n.animation-iteration-count(@iteration-count) {\n -webkit-animation-iteration-count: @iteration-count;\n animation-iteration-count: @iteration-count;\n}\n.animation-direction(@direction) {\n -webkit-animation-direction: @direction;\n animation-direction: @direction;\n}\n.animation-fill-mode(@fill-mode) {\n -webkit-animation-fill-mode: @fill-mode;\n animation-fill-mode: @fill-mode;\n}\n\n// Backface visibility\n// Prevent browsers from flickering when using CSS 3D transforms.\n// Default value is `visible`, but can be changed to `hidden`\n\n.backface-visibility(@visibility){\n -webkit-backface-visibility: @visibility;\n -moz-backface-visibility: @visibility;\n backface-visibility: @visibility;\n}\n\n// Drop shadows\n//\n// Note: Deprecated `.box-shadow()` as of v3.1.0 since all of Bootstrap's\n// supported browsers that have box shadow capabilities now support it.\n\n.box-shadow(@shadow) {\n -webkit-box-shadow: @shadow; // iOS <4.3 & Android <4.1\n box-shadow: @shadow;\n}\n\n// Box sizing\n.box-sizing(@boxmodel) {\n -webkit-box-sizing: @boxmodel;\n -moz-box-sizing: @boxmodel;\n box-sizing: @boxmodel;\n}\n\n// CSS3 Content Columns\n.content-columns(@column-count; @column-gap: @grid-gutter-width) {\n -webkit-column-count: @column-count;\n -moz-column-count: @column-count;\n column-count: @column-count;\n -webkit-column-gap: @column-gap;\n -moz-column-gap: @column-gap;\n column-gap: @column-gap;\n}\n\n// Optional hyphenation\n.hyphens(@mode: auto) {\n word-wrap: break-word;\n -webkit-hyphens: @mode;\n -moz-hyphens: @mode;\n -ms-hyphens: @mode; // IE10+\n -o-hyphens: @mode;\n hyphens: @mode;\n}\n\n// Placeholder text\n.placeholder(@color: @input-color-placeholder) {\n &::-moz-placeholder { color: @color; // Firefox\n opacity: 1; } // See https://github.com/twbs/bootstrap/pull/11526\n &:-ms-input-placeholder { color: @color; } // Internet Explorer 10+\n &::-webkit-input-placeholder { color: @color; } // Safari and Chrome\n}\n\n// Transformations\n.scale(@ratio) {\n -webkit-transform: scale(@ratio);\n -ms-transform: scale(@ratio); // IE9 only\n -o-transform: scale(@ratio);\n transform: scale(@ratio);\n}\n.scale(@ratioX; @ratioY) {\n -webkit-transform: scale(@ratioX, @ratioY);\n -ms-transform: scale(@ratioX, @ratioY); // IE9 only\n -o-transform: scale(@ratioX, @ratioY);\n transform: scale(@ratioX, @ratioY);\n}\n.scaleX(@ratio) {\n -webkit-transform: scaleX(@ratio);\n -ms-transform: scaleX(@ratio); // IE9 only\n -o-transform: scaleX(@ratio);\n transform: scaleX(@ratio);\n}\n.scaleY(@ratio) {\n -webkit-transform: scaleY(@ratio);\n -ms-transform: scaleY(@ratio); // IE9 only\n -o-transform: scaleY(@ratio);\n transform: scaleY(@ratio);\n}\n.skew(@x; @y) {\n -webkit-transform: skewX(@x) skewY(@y);\n -ms-transform: skewX(@x) skewY(@y); // See https://github.com/twbs/bootstrap/issues/4885; IE9+\n -o-transform: skewX(@x) skewY(@y);\n transform: skewX(@x) skewY(@y);\n}\n.translate(@x; @y) {\n -webkit-transform: translate(@x, @y);\n -ms-transform: translate(@x, @y); // IE9 only\n -o-transform: translate(@x, @y);\n transform: translate(@x, @y);\n}\n.translate3d(@x; @y; @z) {\n -webkit-transform: translate3d(@x, @y, @z);\n transform: translate3d(@x, @y, @z);\n}\n.rotate(@degrees) {\n -webkit-transform: rotate(@degrees);\n -ms-transform: rotate(@degrees); // IE9 only\n -o-transform: rotate(@degrees);\n transform: rotate(@degrees);\n}\n.rotateX(@degrees) {\n -webkit-transform: rotateX(@degrees);\n -ms-transform: rotateX(@degrees); // IE9 only\n -o-transform: rotateX(@degrees);\n transform: rotateX(@degrees);\n}\n.rotateY(@degrees) {\n -webkit-transform: rotateY(@degrees);\n -ms-transform: rotateY(@degrees); // IE9 only\n -o-transform: rotateY(@degrees);\n transform: rotateY(@degrees);\n}\n.perspective(@perspective) {\n -webkit-perspective: @perspective;\n -moz-perspective: @perspective;\n perspective: @perspective;\n}\n.perspective-origin(@perspective) {\n -webkit-perspective-origin: @perspective;\n -moz-perspective-origin: @perspective;\n perspective-origin: @perspective;\n}\n.transform-origin(@origin) {\n -webkit-transform-origin: @origin;\n -moz-transform-origin: @origin;\n -ms-transform-origin: @origin; // IE9 only\n transform-origin: @origin;\n}\n\n\n// Transitions\n\n.transition(@transition) {\n -webkit-transition: @transition;\n -o-transition: @transition;\n transition: @transition;\n}\n.transition-property(@transition-property) {\n -webkit-transition-property: @transition-property;\n transition-property: @transition-property;\n}\n.transition-delay(@transition-delay) {\n -webkit-transition-delay: @transition-delay;\n transition-delay: @transition-delay;\n}\n.transition-duration(@transition-duration) {\n -webkit-transition-duration: @transition-duration;\n transition-duration: @transition-duration;\n}\n.transition-timing-function(@timing-function) {\n -webkit-transition-timing-function: @timing-function;\n transition-timing-function: @timing-function;\n}\n.transition-transform(@transition) {\n -webkit-transition: -webkit-transform @transition;\n -moz-transition: -moz-transform @transition;\n -o-transition: -o-transform @transition;\n transition: transform @transition;\n}\n\n\n// User select\n// For selecting text on the page\n\n.user-select(@select) {\n -webkit-user-select: @select;\n -moz-user-select: @select;\n -ms-user-select: @select; // IE10+\n user-select: @select;\n}\n","// WebKit-style focus\n\n.tab-focus() {\n // Default\n outline: thin dotted;\n // WebKit\n outline: 5px auto -webkit-focus-ring-color;\n outline-offset: -2px;\n}\n","// Image Mixins\n// - Responsive image\n// - Retina image\n\n\n// Responsive image\n//\n// Keep images from scaling beyond the width of their parents.\n.img-responsive(@display: block) {\n display: @display;\n width: 100% \\9; // Force IE10 and below to size SVG images correctly\n max-width: 100%; // Part 1: Set a maximum relative to the parent\n height: auto; // Part 2: Scale the height according to the width, otherwise you get stretching\n}\n\n\n// Retina image\n//\n// Short retina mixin for setting background-image and -size. Note that the\n// spelling of `min--moz-device-pixel-ratio` is intentional.\n.img-retina(@file-1x; @file-2x; @width-1x; @height-1x) {\n background-image: url(\"@{file-1x}\");\n\n @media\n only screen and (-webkit-min-device-pixel-ratio: 2),\n only screen and ( min--moz-device-pixel-ratio: 2),\n only screen and ( -o-min-device-pixel-ratio: 2/1),\n only screen and ( min-device-pixel-ratio: 2),\n only screen and ( min-resolution: 192dpi),\n only screen and ( min-resolution: 2dppx) {\n background-image: url(\"@{file-2x}\");\n background-size: @width-1x @height-1x;\n }\n}\n","//\n// Typography\n// --------------------------------------------------\n\n\n// Headings\n// -------------------------\n\nh1, h2, h3, h4, h5, h6,\n.h1, .h2, .h3, .h4, .h5, .h6 {\n font-family: @headings-font-family;\n font-weight: @headings-font-weight;\n line-height: @headings-line-height;\n color: @headings-color;\n\n small,\n .small {\n font-weight: normal;\n line-height: 1;\n color: @headings-small-color;\n }\n}\n\nh1, .h1,\nh2, .h2,\nh3, .h3 {\n margin-top: @line-height-computed;\n margin-bottom: (@line-height-computed / 2);\n\n small,\n .small {\n font-size: 65%;\n }\n}\nh4, .h4,\nh5, .h5,\nh6, .h6 {\n margin-top: (@line-height-computed / 2);\n margin-bottom: (@line-height-computed / 2);\n\n small,\n .small {\n font-size: 75%;\n }\n}\n\nh1, .h1 { font-size: @font-size-h1; }\nh2, .h2 { font-size: @font-size-h2; }\nh3, .h3 { font-size: @font-size-h3; }\nh4, .h4 { font-size: @font-size-h4; }\nh5, .h5 { font-size: @font-size-h5; }\nh6, .h6 { font-size: @font-size-h6; }\n\n\n// Body text\n// -------------------------\n\np {\n margin: 0 0 (@line-height-computed / 2);\n}\n\n.lead {\n margin-bottom: @line-height-computed;\n font-size: floor((@font-size-base * 1.15));\n font-weight: 300;\n line-height: 1.4;\n\n @media (min-width: @screen-sm-min) {\n font-size: (@font-size-base * 1.5);\n }\n}\n\n\n// Emphasis & misc\n// -------------------------\n\n// Ex: (12px small font / 14px base font) * 100% = about 85%\nsmall,\n.small {\n font-size: floor((100% * @font-size-small / @font-size-base));\n}\n\n// Undo browser default styling\ncite {\n font-style: normal;\n}\n\nmark,\n.mark {\n background-color: @state-warning-bg;\n padding: .2em;\n}\n\n// Alignment\n.text-left { text-align: left; }\n.text-right { text-align: right; }\n.text-center { text-align: center; }\n.text-justify { text-align: justify; }\n.text-nowrap { white-space: nowrap; }\n\n// Transformation\n.text-lowercase { text-transform: lowercase; }\n.text-uppercase { text-transform: uppercase; }\n.text-capitalize { text-transform: capitalize; }\n\n// Contextual colors\n.text-muted {\n color: @text-muted;\n}\n.text-primary {\n .text-emphasis-variant(@brand-primary);\n}\n.text-success {\n .text-emphasis-variant(@state-success-text);\n}\n.text-info {\n .text-emphasis-variant(@state-info-text);\n}\n.text-warning {\n .text-emphasis-variant(@state-warning-text);\n}\n.text-danger {\n .text-emphasis-variant(@state-danger-text);\n}\n\n// Contextual backgrounds\n// For now we'll leave these alongside the text classes until v4 when we can\n// safely shift things around (per SemVer rules).\n.bg-primary {\n // Given the contrast here, this is the only class to have its color inverted\n // automatically.\n color: #fff;\n .bg-variant(@brand-primary);\n}\n.bg-success {\n .bg-variant(@state-success-bg);\n}\n.bg-info {\n .bg-variant(@state-info-bg);\n}\n.bg-warning {\n .bg-variant(@state-warning-bg);\n}\n.bg-danger {\n .bg-variant(@state-danger-bg);\n}\n\n\n// Page header\n// -------------------------\n\n.page-header {\n padding-bottom: ((@line-height-computed / 2) - 1);\n margin: (@line-height-computed * 2) 0 @line-height-computed;\n border-bottom: 1px solid @page-header-border-color;\n}\n\n\n// Lists\n// -------------------------\n\n// Unordered and Ordered lists\nul,\nol {\n margin-top: 0;\n margin-bottom: (@line-height-computed / 2);\n ul,\n ol {\n margin-bottom: 0;\n }\n}\n\n// List options\n\n// Unstyled keeps list items block level, just removes default browser padding and list-style\n.list-unstyled {\n padding-left: 0;\n list-style: none;\n}\n\n// Inline turns list items into inline-block\n.list-inline {\n .list-unstyled();\n margin-left: -5px;\n\n > li {\n display: inline-block;\n padding-left: 5px;\n padding-right: 5px;\n }\n}\n\n// Description Lists\ndl {\n margin-top: 0; // Remove browser default\n margin-bottom: @line-height-computed;\n}\ndt,\ndd {\n line-height: @line-height-base;\n}\ndt {\n font-weight: bold;\n}\ndd {\n margin-left: 0; // Undo browser default\n}\n\n// Horizontal description lists\n//\n// Defaults to being stacked without any of the below styles applied, until the\n// grid breakpoint is reached (default of ~768px).\n\n.dl-horizontal {\n dd {\n &:extend(.clearfix all); // Clear the floated `dt` if an empty `dd` is present\n }\n\n @media (min-width: @grid-float-breakpoint) {\n dt {\n float: left;\n width: (@dl-horizontal-offset - 20);\n clear: left;\n text-align: right;\n .text-overflow();\n }\n dd {\n margin-left: @dl-horizontal-offset;\n }\n }\n}\n\n\n// Misc\n// -------------------------\n\n// Abbreviations and acronyms\nabbr[title],\n// Add data-* attribute to help out our tooltip plugin, per https://github.com/twbs/bootstrap/issues/5257\nabbr[data-original-title] {\n cursor: help;\n border-bottom: 1px dotted @abbr-border-color;\n}\n.initialism {\n font-size: 90%;\n text-transform: uppercase;\n}\n\n// Blockquotes\nblockquote {\n padding: (@line-height-computed / 2) @line-height-computed;\n margin: 0 0 @line-height-computed;\n font-size: @blockquote-font-size;\n border-left: 5px solid @blockquote-border-color;\n\n p,\n ul,\n ol {\n &:last-child {\n margin-bottom: 0;\n }\n }\n\n // Note: Deprecated small and .small as of v3.1.0\n // Context: https://github.com/twbs/bootstrap/issues/11660\n footer,\n small,\n .small {\n display: block;\n font-size: 80%; // back to default font-size\n line-height: @line-height-base;\n color: @blockquote-small-color;\n\n &:before {\n content: '\\2014 \\00A0'; // em dash, nbsp\n }\n }\n}\n\n// Opposite alignment of blockquote\n//\n// Heads up: `blockquote.pull-right` has been deprecated as of v3.1.0.\n.blockquote-reverse,\nblockquote.pull-right {\n padding-right: 15px;\n padding-left: 0;\n border-right: 5px solid @blockquote-border-color;\n border-left: 0;\n text-align: right;\n\n // Account for citation\n footer,\n small,\n .small {\n &:before { content: ''; }\n &:after {\n content: '\\00A0 \\2014'; // nbsp, em dash\n }\n }\n}\n\n// Quotes\nblockquote:before,\nblockquote:after {\n content: \"\";\n}\n\n// Addresses\naddress {\n margin-bottom: @line-height-computed;\n font-style: normal;\n line-height: @line-height-base;\n}\n","// Typography\n\n.text-emphasis-variant(@color) {\n color: @color;\n a&:hover {\n color: darken(@color, 10%);\n }\n}\n","// Contextual backgrounds\n\n.bg-variant(@color) {\n background-color: @color;\n a&:hover {\n background-color: darken(@color, 10%);\n }\n}\n","// Text overflow\n// Requires inline-block or block for proper styling\n\n.text-overflow() {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n","//\n// Code (inline and block)\n// --------------------------------------------------\n\n\n// Inline and block code styles\ncode,\nkbd,\npre,\nsamp {\n font-family: @font-family-monospace;\n}\n\n// Inline code\ncode {\n padding: 2px 4px;\n font-size: 90%;\n color: @code-color;\n background-color: @code-bg;\n border-radius: @border-radius-base;\n}\n\n// User input typically entered via keyboard\nkbd {\n padding: 2px 4px;\n font-size: 90%;\n color: @kbd-color;\n background-color: @kbd-bg;\n border-radius: @border-radius-small;\n box-shadow: inset 0 -1px 0 rgba(0,0,0,.25);\n\n kbd {\n padding: 0;\n font-size: 100%;\n box-shadow: none;\n }\n}\n\n// Blocks of code\npre {\n display: block;\n padding: ((@line-height-computed - 1) / 2);\n margin: 0 0 (@line-height-computed / 2);\n font-size: (@font-size-base - 1); // 14px to 13px\n line-height: @line-height-base;\n word-break: break-all;\n word-wrap: break-word;\n color: @pre-color;\n background-color: @pre-bg;\n border: 1px solid @pre-border-color;\n border-radius: @border-radius-base;\n\n // Account for some code outputs that place code tags in pre tags\n code {\n padding: 0;\n font-size: inherit;\n color: inherit;\n white-space: pre-wrap;\n background-color: transparent;\n border-radius: 0;\n }\n}\n\n// Enable scrollable blocks of code\n.pre-scrollable {\n max-height: @pre-scrollable-max-height;\n overflow-y: scroll;\n}\n","//\n// Grid system\n// --------------------------------------------------\n\n\n// Container widths\n//\n// Set the container width, and override it for fixed navbars in media queries.\n\n.container {\n .container-fixed();\n\n @media (min-width: @screen-sm-min) {\n width: @container-sm;\n }\n @media (min-width: @screen-md-min) {\n width: @container-md;\n }\n @media (min-width: @screen-lg-min) {\n width: @container-lg;\n }\n}\n\n\n// Fluid container\n//\n// Utilizes the mixin meant for fixed width containers, but without any defined\n// width for fluid, full width layouts.\n\n.container-fluid {\n .container-fixed();\n}\n\n\n// Row\n//\n// Rows contain and clear the floats of your columns.\n\n.row {\n .make-row();\n}\n\n\n// Columns\n//\n// Common styles for small and large grid columns\n\n.make-grid-columns();\n\n\n// Extra small grid\n//\n// Columns, offsets, pushes, and pulls for extra small devices like\n// smartphones.\n\n.make-grid(xs);\n\n\n// Small grid\n//\n// Columns, offsets, pushes, and pulls for the small device range, from phones\n// to tablets.\n\n@media (min-width: @screen-sm-min) {\n .make-grid(sm);\n}\n\n\n// Medium grid\n//\n// Columns, offsets, pushes, and pulls for the desktop device range.\n\n@media (min-width: @screen-md-min) {\n .make-grid(md);\n}\n\n\n// Large grid\n//\n// Columns, offsets, pushes, and pulls for the large desktop device range.\n\n@media (min-width: @screen-lg-min) {\n .make-grid(lg);\n}\n","// Grid system\n//\n// Generate semantic grid columns with these mixins.\n\n// Centered container element\n.container-fixed(@gutter: @grid-gutter-width) {\n margin-right: auto;\n margin-left: auto;\n padding-left: (@gutter / 2);\n padding-right: (@gutter / 2);\n &:extend(.clearfix all);\n}\n\n// Creates a wrapper for a series of columns\n.make-row(@gutter: @grid-gutter-width) {\n margin-left: (@gutter / -2);\n margin-right: (@gutter / -2);\n &:extend(.clearfix all);\n}\n\n// Generate the extra small columns\n.make-xs-column(@columns; @gutter: @grid-gutter-width) {\n position: relative;\n float: left;\n width: percentage((@columns / @grid-columns));\n min-height: 1px;\n padding-left: (@gutter / 2);\n padding-right: (@gutter / 2);\n}\n.make-xs-column-offset(@columns) {\n margin-left: percentage((@columns / @grid-columns));\n}\n.make-xs-column-push(@columns) {\n left: percentage((@columns / @grid-columns));\n}\n.make-xs-column-pull(@columns) {\n right: percentage((@columns / @grid-columns));\n}\n\n// Generate the small columns\n.make-sm-column(@columns; @gutter: @grid-gutter-width) {\n position: relative;\n min-height: 1px;\n padding-left: (@gutter / 2);\n padding-right: (@gutter / 2);\n\n @media (min-width: @screen-sm-min) {\n float: left;\n width: percentage((@columns / @grid-columns));\n }\n}\n.make-sm-column-offset(@columns) {\n @media (min-width: @screen-sm-min) {\n margin-left: percentage((@columns / @grid-columns));\n }\n}\n.make-sm-column-push(@columns) {\n @media (min-width: @screen-sm-min) {\n left: percentage((@columns / @grid-columns));\n }\n}\n.make-sm-column-pull(@columns) {\n @media (min-width: @screen-sm-min) {\n right: percentage((@columns / @grid-columns));\n }\n}\n\n// Generate the medium columns\n.make-md-column(@columns; @gutter: @grid-gutter-width) {\n position: relative;\n min-height: 1px;\n padding-left: (@gutter / 2);\n padding-right: (@gutter / 2);\n\n @media (min-width: @screen-md-min) {\n float: left;\n width: percentage((@columns / @grid-columns));\n }\n}\n.make-md-column-offset(@columns) {\n @media (min-width: @screen-md-min) {\n margin-left: percentage((@columns / @grid-columns));\n }\n}\n.make-md-column-push(@columns) {\n @media (min-width: @screen-md-min) {\n left: percentage((@columns / @grid-columns));\n }\n}\n.make-md-column-pull(@columns) {\n @media (min-width: @screen-md-min) {\n right: percentage((@columns / @grid-columns));\n }\n}\n\n// Generate the large columns\n.make-lg-column(@columns; @gutter: @grid-gutter-width) {\n position: relative;\n min-height: 1px;\n padding-left: (@gutter / 2);\n padding-right: (@gutter / 2);\n\n @media (min-width: @screen-lg-min) {\n float: left;\n width: percentage((@columns / @grid-columns));\n }\n}\n.make-lg-column-offset(@columns) {\n @media (min-width: @screen-lg-min) {\n margin-left: percentage((@columns / @grid-columns));\n }\n}\n.make-lg-column-push(@columns) {\n @media (min-width: @screen-lg-min) {\n left: percentage((@columns / @grid-columns));\n }\n}\n.make-lg-column-pull(@columns) {\n @media (min-width: @screen-lg-min) {\n right: percentage((@columns / @grid-columns));\n }\n}\n","// Framework grid generation\n//\n// Used only by Bootstrap to generate the correct number of grid classes given\n// any value of `@grid-columns`.\n\n.make-grid-columns() {\n // Common styles for all sizes of grid columns, widths 1-12\n .col(@index) when (@index = 1) { // initial\n @item: ~\".col-xs-@{index}, .col-sm-@{index}, .col-md-@{index}, .col-lg-@{index}\";\n .col((@index + 1), @item);\n }\n .col(@index, @list) when (@index =< @grid-columns) { // general; \"=<\" isn't a typo\n @item: ~\".col-xs-@{index}, .col-sm-@{index}, .col-md-@{index}, .col-lg-@{index}\";\n .col((@index + 1), ~\"@{list}, @{item}\");\n }\n .col(@index, @list) when (@index > @grid-columns) { // terminal\n @{list} {\n position: relative;\n // Prevent columns from collapsing when empty\n min-height: 1px;\n // Inner gutter via padding\n padding-left: (@grid-gutter-width / 2);\n padding-right: (@grid-gutter-width / 2);\n }\n }\n .col(1); // kickstart it\n}\n\n.float-grid-columns(@class) {\n .col(@index) when (@index = 1) { // initial\n @item: ~\".col-@{class}-@{index}\";\n .col((@index + 1), @item);\n }\n .col(@index, @list) when (@index =< @grid-columns) { // general\n @item: ~\".col-@{class}-@{index}\";\n .col((@index + 1), ~\"@{list}, @{item}\");\n }\n .col(@index, @list) when (@index > @grid-columns) { // terminal\n @{list} {\n float: left;\n }\n }\n .col(1); // kickstart it\n}\n\n.calc-grid-column(@index, @class, @type) when (@type = width) and (@index > 0) {\n .col-@{class}-@{index} {\n width: percentage((@index / @grid-columns));\n }\n}\n.calc-grid-column(@index, @class, @type) when (@type = push) and (@index > 0) {\n .col-@{class}-push-@{index} {\n left: percentage((@index / @grid-columns));\n }\n}\n.calc-grid-column(@index, @class, @type) when (@type = push) and (@index = 0) {\n .col-@{class}-push-0 {\n left: auto;\n }\n}\n.calc-grid-column(@index, @class, @type) when (@type = pull) and (@index > 0) {\n .col-@{class}-pull-@{index} {\n right: percentage((@index / @grid-columns));\n }\n}\n.calc-grid-column(@index, @class, @type) when (@type = pull) and (@index = 0) {\n .col-@{class}-pull-0 {\n right: auto;\n }\n}\n.calc-grid-column(@index, @class, @type) when (@type = offset) {\n .col-@{class}-offset-@{index} {\n margin-left: percentage((@index / @grid-columns));\n }\n}\n\n// Basic looping in LESS\n.loop-grid-columns(@index, @class, @type) when (@index >= 0) {\n .calc-grid-column(@index, @class, @type);\n // next iteration\n .loop-grid-columns((@index - 1), @class, @type);\n}\n\n// Create grid for specific class\n.make-grid(@class) {\n .float-grid-columns(@class);\n .loop-grid-columns(@grid-columns, @class, width);\n .loop-grid-columns(@grid-columns, @class, pull);\n .loop-grid-columns(@grid-columns, @class, push);\n .loop-grid-columns(@grid-columns, @class, offset);\n}\n","//\n// Tables\n// --------------------------------------------------\n\n\ntable {\n background-color: @table-bg;\n}\nth {\n text-align: left;\n}\n\n\n// Baseline styles\n\n.table {\n width: 100%;\n max-width: 100%;\n margin-bottom: @line-height-computed;\n // Cells\n > thead,\n > tbody,\n > tfoot {\n > tr {\n > th,\n > td {\n padding: @table-cell-padding;\n line-height: @line-height-base;\n vertical-align: top;\n border-top: 1px solid @table-border-color;\n }\n }\n }\n // Bottom align for column headings\n > thead > tr > th {\n vertical-align: bottom;\n border-bottom: 2px solid @table-border-color;\n }\n // Remove top border from thead by default\n > caption + thead,\n > colgroup + thead,\n > thead:first-child {\n > tr:first-child {\n > th,\n > td {\n border-top: 0;\n }\n }\n }\n // Account for multiple tbody instances\n > tbody + tbody {\n border-top: 2px solid @table-border-color;\n }\n\n // Nesting\n .table {\n background-color: @body-bg;\n }\n}\n\n\n// Condensed table w/ half padding\n\n.table-condensed {\n > thead,\n > tbody,\n > tfoot {\n > tr {\n > th,\n > td {\n padding: @table-condensed-cell-padding;\n }\n }\n }\n}\n\n\n// Bordered version\n//\n// Add borders all around the table and between all the columns.\n\n.table-bordered {\n border: 1px solid @table-border-color;\n > thead,\n > tbody,\n > tfoot {\n > tr {\n > th,\n > td {\n border: 1px solid @table-border-color;\n }\n }\n }\n > thead > tr {\n > th,\n > td {\n border-bottom-width: 2px;\n }\n }\n}\n\n\n// Zebra-striping\n//\n// Default zebra-stripe styles (alternating gray and transparent backgrounds)\n\n.table-striped {\n > tbody > tr:nth-child(odd) {\n > td,\n > th {\n background-color: @table-bg-accent;\n }\n }\n}\n\n\n// Hover effect\n//\n// Placed here since it has to come after the potential zebra striping\n\n.table-hover {\n > tbody > tr:hover {\n > td,\n > th {\n background-color: @table-bg-hover;\n }\n }\n}\n\n\n// Table cell sizing\n//\n// Reset default table behavior\n\ntable col[class*=\"col-\"] {\n position: static; // Prevent border hiding in Firefox and IE9/10 (see https://github.com/twbs/bootstrap/issues/11623)\n float: none;\n display: table-column;\n}\ntable {\n td,\n th {\n &[class*=\"col-\"] {\n position: static; // Prevent border hiding in Firefox and IE9/10 (see https://github.com/twbs/bootstrap/issues/11623)\n float: none;\n display: table-cell;\n }\n }\n}\n\n\n// Table backgrounds\n//\n// Exact selectors below required to override `.table-striped` and prevent\n// inheritance to nested tables.\n\n// Generate the contextual variants\n.table-row-variant(active; @table-bg-active);\n.table-row-variant(success; @state-success-bg);\n.table-row-variant(info; @state-info-bg);\n.table-row-variant(warning; @state-warning-bg);\n.table-row-variant(danger; @state-danger-bg);\n\n\n// Responsive tables\n//\n// Wrap your tables in `.table-responsive` and we'll make them mobile friendly\n// by enabling horizontal scrolling. Only applies <768px. Everything above that\n// will display normally.\n\n.table-responsive {\n @media screen and (max-width: @screen-xs-max) {\n width: 100%;\n margin-bottom: (@line-height-computed * 0.75);\n overflow-y: hidden;\n overflow-x: auto;\n -ms-overflow-style: -ms-autohiding-scrollbar;\n border: 1px solid @table-border-color;\n -webkit-overflow-scrolling: touch;\n\n // Tighten up spacing\n > .table {\n margin-bottom: 0;\n\n // Ensure the content doesn't wrap\n > thead,\n > tbody,\n > tfoot {\n > tr {\n > th,\n > td {\n white-space: nowrap;\n }\n }\n }\n }\n\n // Special overrides for the bordered tables\n > .table-bordered {\n border: 0;\n\n // Nuke the appropriate borders so that the parent can handle them\n > thead,\n > tbody,\n > tfoot {\n > tr {\n > th:first-child,\n > td:first-child {\n border-left: 0;\n }\n > th:last-child,\n > td:last-child {\n border-right: 0;\n }\n }\n }\n\n // Only nuke the last row's bottom-border in `tbody` and `tfoot` since\n // chances are there will be only one `tr` in a `thead` and that would\n // remove the border altogether.\n > tbody,\n > tfoot {\n > tr:last-child {\n > th,\n > td {\n border-bottom: 0;\n }\n }\n }\n\n }\n }\n}\n","// Tables\n\n.table-row-variant(@state; @background) {\n // Exact selectors below required to override `.table-striped` and prevent\n // inheritance to nested tables.\n .table > thead > tr,\n .table > tbody > tr,\n .table > tfoot > tr {\n > td.@{state},\n > th.@{state},\n &.@{state} > td,\n &.@{state} > th {\n background-color: @background;\n }\n }\n\n // Hover states for `.table-hover`\n // Note: this is not available for cells or rows within `thead` or `tfoot`.\n .table-hover > tbody > tr {\n > td.@{state}:hover,\n > th.@{state}:hover,\n &.@{state}:hover > td,\n &:hover > .@{state},\n &.@{state}:hover > th {\n background-color: darken(@background, 5%);\n }\n }\n}\n","//\n// Forms\n// --------------------------------------------------\n\n\n// Normalize non-controls\n//\n// Restyle and baseline non-control form elements.\n\nfieldset {\n padding: 0;\n margin: 0;\n border: 0;\n // Chrome and Firefox set a `min-width: min-content;` on fieldsets,\n // so we reset that to ensure it behaves more like a standard block element.\n // See https://github.com/twbs/bootstrap/issues/12359.\n min-width: 0;\n}\n\nlegend {\n display: block;\n width: 100%;\n padding: 0;\n margin-bottom: @line-height-computed;\n font-size: (@font-size-base * 1.5);\n line-height: inherit;\n color: @legend-color;\n border: 0;\n border-bottom: 1px solid @legend-border-color;\n}\n\nlabel {\n display: inline-block;\n max-width: 100%; // Force IE8 to wrap long content (see https://github.com/twbs/bootstrap/issues/13141)\n margin-bottom: 5px;\n font-weight: bold;\n}\n\n\n// Normalize form controls\n//\n// While most of our form styles require extra classes, some basic normalization\n// is required to ensure optimum display with or without those classes to better\n// address browser inconsistencies.\n\n// Override content-box in Normalize (* isn't specific enough)\ninput[type=\"search\"] {\n .box-sizing(border-box);\n}\n\n// Position radios and checkboxes better\ninput[type=\"radio\"],\ninput[type=\"checkbox\"] {\n margin: 4px 0 0;\n margin-top: 1px \\9; // IE8-9\n line-height: normal;\n}\n\n// Set the height of file controls to match text inputs\ninput[type=\"file\"] {\n display: block;\n}\n\n// Make range inputs behave like textual form controls\ninput[type=\"range\"] {\n display: block;\n width: 100%;\n}\n\n// Make multiple select elements height not fixed\nselect[multiple],\nselect[size] {\n height: auto;\n}\n\n// Focus for file, radio, and checkbox\ninput[type=\"file\"]:focus,\ninput[type=\"radio\"]:focus,\ninput[type=\"checkbox\"]:focus {\n .tab-focus();\n}\n\n// Adjust output element\noutput {\n display: block;\n padding-top: (@padding-base-vertical + 1);\n font-size: @font-size-base;\n line-height: @line-height-base;\n color: @input-color;\n}\n\n\n// Common form controls\n//\n// Shared size and type resets for form controls. Apply `.form-control` to any\n// of the following form controls:\n//\n// select\n// textarea\n// input[type=\"text\"]\n// input[type=\"password\"]\n// input[type=\"datetime\"]\n// input[type=\"datetime-local\"]\n// input[type=\"date\"]\n// input[type=\"month\"]\n// input[type=\"time\"]\n// input[type=\"week\"]\n// input[type=\"number\"]\n// input[type=\"email\"]\n// input[type=\"url\"]\n// input[type=\"search\"]\n// input[type=\"tel\"]\n// input[type=\"color\"]\n\n.form-control {\n display: block;\n width: 100%;\n height: @input-height-base; // Make inputs at least the height of their button counterpart (base line-height + padding + border)\n padding: @padding-base-vertical @padding-base-horizontal;\n font-size: @font-size-base;\n line-height: @line-height-base;\n color: @input-color;\n background-color: @input-bg;\n background-image: none; // Reset unusual Firefox-on-Android default style; see https://github.com/necolas/normalize.css/issues/214\n border: 1px solid @input-border;\n border-radius: @input-border-radius;\n .box-shadow(inset 0 1px 1px rgba(0,0,0,.075));\n .transition(~\"border-color ease-in-out .15s, box-shadow ease-in-out .15s\");\n\n // Customize the `:focus` state to imitate native WebKit styles.\n .form-control-focus();\n\n // Placeholder\n .placeholder();\n\n // Disabled and read-only inputs\n //\n // HTML5 says that controls under a fieldset > legend:first-child won't be\n // disabled if the fieldset is disabled. Due to implementation difficulty, we\n // don't honor that edge case; we style them as disabled anyway.\n &[disabled],\n &[readonly],\n fieldset[disabled] & {\n cursor: not-allowed;\n background-color: @input-bg-disabled;\n opacity: 1; // iOS fix for unreadable disabled content\n }\n\n // Reset height for `textarea`s\n textarea& {\n height: auto;\n }\n}\n\n\n// Search inputs in iOS\n//\n// This overrides the extra rounded corners on search inputs in iOS so that our\n// `.form-control` class can properly style them. Note that this cannot simply\n// be added to `.form-control` as it's not specific enough. For details, see\n// https://github.com/twbs/bootstrap/issues/11586.\n\ninput[type=\"search\"] {\n -webkit-appearance: none;\n}\n\n\n// Special styles for iOS temporal inputs\n//\n// In Mobile Safari, setting `display: block` on temporal inputs causes the\n// text within the input to become vertically misaligned.\n// As a workaround, we set a pixel line-height that matches the\n// given height of the input. Since this fucks up everything else, we have to\n// appropriately reset it for Internet Explorer and the size variations.\n\ninput[type=\"date\"],\ninput[type=\"time\"],\ninput[type=\"datetime-local\"],\ninput[type=\"month\"] {\n line-height: @input-height-base;\n // IE8+ misaligns the text within date inputs, so we reset\n line-height: @line-height-base ~\"\\0\";\n\n &.input-sm {\n line-height: @input-height-small;\n }\n &.input-lg {\n line-height: @input-height-large;\n }\n}\n\n\n// Form groups\n//\n// Designed to help with the organization and spacing of vertical forms. For\n// horizontal forms, use the predefined grid classes.\n\n.form-group {\n margin-bottom: 15px;\n}\n\n\n// Checkboxes and radios\n//\n// Indent the labels to position radios/checkboxes as hanging controls.\n\n.radio,\n.checkbox {\n position: relative;\n display: block;\n min-height: @line-height-computed; // clear the floating input if there is no label text\n margin-top: 10px;\n margin-bottom: 10px;\n\n label {\n padding-left: 20px;\n margin-bottom: 0;\n font-weight: normal;\n cursor: pointer;\n }\n}\n.radio input[type=\"radio\"],\n.radio-inline input[type=\"radio\"],\n.checkbox input[type=\"checkbox\"],\n.checkbox-inline input[type=\"checkbox\"] {\n position: absolute;\n margin-left: -20px;\n margin-top: 4px \\9;\n}\n\n.radio + .radio,\n.checkbox + .checkbox {\n margin-top: -5px; // Move up sibling radios or checkboxes for tighter spacing\n}\n\n// Radios and checkboxes on same line\n.radio-inline,\n.checkbox-inline {\n display: inline-block;\n padding-left: 20px;\n margin-bottom: 0;\n vertical-align: middle;\n font-weight: normal;\n cursor: pointer;\n}\n.radio-inline + .radio-inline,\n.checkbox-inline + .checkbox-inline {\n margin-top: 0;\n margin-left: 10px; // space out consecutive inline controls\n}\n\n// Apply same disabled cursor tweak as for inputs\n// Some special care is needed because <label>s don't inherit their parent's `cursor`.\n//\n// Note: Neither radios nor checkboxes can be readonly.\ninput[type=\"radio\"],\ninput[type=\"checkbox\"] {\n &[disabled],\n &.disabled,\n fieldset[disabled] & {\n cursor: not-allowed;\n }\n}\n// These classes are used directly on <label>s\n.radio-inline,\n.checkbox-inline {\n &.disabled,\n fieldset[disabled] & {\n cursor: not-allowed;\n }\n}\n// These classes are used on elements with <label> descendants\n.radio,\n.checkbox {\n &.disabled,\n fieldset[disabled] & {\n label {\n cursor: not-allowed;\n }\n }\n}\n\n\n// Static form control text\n//\n// Apply class to a `p` element to make any string of text align with labels in\n// a horizontal form layout.\n\n.form-control-static {\n // Size it appropriately next to real form controls\n padding-top: (@padding-base-vertical + 1);\n padding-bottom: (@padding-base-vertical + 1);\n // Remove default margin from `p`\n margin-bottom: 0;\n\n &.input-lg,\n &.input-sm {\n padding-left: 0;\n padding-right: 0;\n }\n}\n\n\n// Form control sizing\n//\n// Build on `.form-control` with modifier classes to decrease or increase the\n// height and font-size of form controls.\n\n.input-sm {\n .input-size(@input-height-small; @padding-small-vertical; @padding-small-horizontal; @font-size-small; @line-height-small; @border-radius-small);\n}\n\n.input-lg {\n .input-size(@input-height-large; @padding-large-vertical; @padding-large-horizontal; @font-size-large; @line-height-large; @border-radius-large);\n}\n\n\n// Form control feedback states\n//\n// Apply contextual and semantic states to individual form controls.\n\n.has-feedback {\n // Enable absolute positioning\n position: relative;\n\n // Ensure icons don't overlap text\n .form-control {\n padding-right: (@input-height-base * 1.25);\n }\n}\n// Feedback icon (requires .glyphicon classes)\n.form-control-feedback {\n position: absolute;\n top: (@line-height-computed + 5); // Height of the `label` and its margin\n right: 0;\n z-index: 2; // Ensure icon is above input groups\n display: block;\n width: @input-height-base;\n height: @input-height-base;\n line-height: @input-height-base;\n text-align: center;\n}\n.input-lg + .form-control-feedback {\n width: @input-height-large;\n height: @input-height-large;\n line-height: @input-height-large;\n}\n.input-sm + .form-control-feedback {\n width: @input-height-small;\n height: @input-height-small;\n line-height: @input-height-small;\n}\n\n// Feedback states\n.has-success {\n .form-control-validation(@state-success-text; @state-success-text; @state-success-bg);\n}\n.has-warning {\n .form-control-validation(@state-warning-text; @state-warning-text; @state-warning-bg);\n}\n.has-error {\n .form-control-validation(@state-danger-text; @state-danger-text; @state-danger-bg);\n}\n\n\n// Reposition feedback icon if label is hidden with \"screenreader only\" state\n.has-feedback label.sr-only ~ .form-control-feedback {\n top: 0;\n}\n\n\n// Help text\n//\n// Apply to any element you wish to create light text for placement immediately\n// below a form control. Use for general help, formatting, or instructional text.\n\n.help-block {\n display: block; // account for any element using help-block\n margin-top: 5px;\n margin-bottom: 10px;\n color: lighten(@text-color, 25%); // lighten the text some for contrast\n}\n\n\n\n// Inline forms\n//\n// Make forms appear inline(-block) by adding the `.form-inline` class. Inline\n// forms begin stacked on extra small (mobile) devices and then go inline when\n// viewports reach <768px.\n//\n// Requires wrapping inputs and labels with `.form-group` for proper display of\n// default HTML form controls and our custom form controls (e.g., input groups).\n//\n// Heads up! This is mixin-ed into `.navbar-form` in navbars.less.\n\n.form-inline {\n\n // Kick in the inline\n @media (min-width: @screen-sm-min) {\n // Inline-block all the things for \"inline\"\n .form-group {\n display: inline-block;\n margin-bottom: 0;\n vertical-align: middle;\n }\n\n // In navbar-form, allow folks to *not* use `.form-group`\n .form-control {\n display: inline-block;\n width: auto; // Prevent labels from stacking above inputs in `.form-group`\n vertical-align: middle;\n }\n\n .input-group {\n display: inline-table;\n vertical-align: middle;\n\n .input-group-addon,\n .input-group-btn,\n .form-control {\n width: auto;\n }\n }\n\n // Input groups need that 100% width though\n .input-group > .form-control {\n width: 100%;\n }\n\n .control-label {\n margin-bottom: 0;\n vertical-align: middle;\n }\n\n // Remove default margin on radios/checkboxes that were used for stacking, and\n // then undo the floating of radios and checkboxes to match (which also avoids\n // a bug in WebKit: https://github.com/twbs/bootstrap/issues/1969).\n .radio,\n .checkbox {\n display: inline-block;\n margin-top: 0;\n margin-bottom: 0;\n vertical-align: middle;\n\n label {\n padding-left: 0;\n }\n }\n .radio input[type=\"radio\"],\n .checkbox input[type=\"checkbox\"] {\n position: relative;\n margin-left: 0;\n }\n\n // Validation states\n //\n // Reposition the icon because it's now within a grid column and columns have\n // `position: relative;` on them. Also accounts for the grid gutter padding.\n .has-feedback .form-control-feedback {\n top: 0;\n }\n }\n}\n\n\n// Horizontal forms\n//\n// Horizontal forms are built on grid classes and allow you to create forms with\n// labels on the left and inputs on the right.\n\n.form-horizontal {\n\n // Consistent vertical alignment of radios and checkboxes\n //\n // Labels also get some reset styles, but that is scoped to a media query below.\n .radio,\n .checkbox,\n .radio-inline,\n .checkbox-inline {\n margin-top: 0;\n margin-bottom: 0;\n padding-top: (@padding-base-vertical + 1); // Default padding plus a border\n }\n // Account for padding we're adding to ensure the alignment and of help text\n // and other content below items\n .radio,\n .checkbox {\n min-height: (@line-height-computed + (@padding-base-vertical + 1));\n }\n\n // Make form groups behave like rows\n .form-group {\n .make-row();\n }\n\n // Reset spacing and right align labels, but scope to media queries so that\n // labels on narrow viewports stack the same as a default form example.\n @media (min-width: @screen-sm-min) {\n .control-label {\n text-align: right;\n margin-bottom: 0;\n padding-top: (@padding-base-vertical + 1); // Default padding plus a border\n }\n }\n\n // Validation states\n //\n // Reposition the icon because it's now within a grid column and columns have\n // `position: relative;` on them. Also accounts for the grid gutter padding.\n .has-feedback .form-control-feedback {\n top: 0;\n right: (@grid-gutter-width / 2);\n }\n\n // Form group sizes\n //\n // Quick utility class for applying `.input-lg` and `.input-sm` styles to the\n // inputs and labels within a `.form-group`.\n .form-group-lg {\n @media (min-width: @screen-sm-min) {\n .control-label {\n padding-top: ((@padding-large-vertical * @line-height-large) + 1);\n }\n }\n .form-control {\n &:extend(.input-lg);\n }\n }\n .form-group-sm {\n @media (min-width: @screen-sm-min) {\n .control-label {\n padding-top: (@padding-small-vertical + 1);\n }\n }\n .form-control {\n &:extend(.input-sm);\n }\n }\n}\n","// Form validation states\n//\n// Used in forms.less to generate the form validation CSS for warnings, errors,\n// and successes.\n\n.form-control-validation(@text-color: #555; @border-color: #ccc; @background-color: #f5f5f5) {\n // Color the label and help text\n .help-block,\n .control-label,\n .radio,\n .checkbox,\n .radio-inline,\n .checkbox-inline {\n color: @text-color;\n }\n // Set the border and box shadow on specific inputs to match\n .form-control {\n border-color: @border-color;\n .box-shadow(inset 0 1px 1px rgba(0,0,0,.075)); // Redeclare so transitions work\n &:focus {\n border-color: darken(@border-color, 10%);\n @shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 6px lighten(@border-color, 20%);\n .box-shadow(@shadow);\n }\n }\n // Set validation states also for addons\n .input-group-addon {\n color: @text-color;\n border-color: @border-color;\n background-color: @background-color;\n }\n // Optional feedback icon\n .form-control-feedback {\n color: @text-color;\n }\n}\n\n\n// Form control focus state\n//\n// Generate a customized focus state and for any input with the specified color,\n// which defaults to the `@input-border-focus` variable.\n//\n// We highly encourage you to not customize the default value, but instead use\n// this to tweak colors on an as-needed basis. This aesthetic change is based on\n// WebKit's default styles, but applicable to a wider range of browsers. Its\n// usability and accessibility should be taken into account with any change.\n//\n// Example usage: change the default blue border and shadow to white for better\n// contrast against a dark gray background.\n.form-control-focus(@color: @input-border-focus) {\n @color-rgba: rgba(red(@color), green(@color), blue(@color), .6);\n &:focus {\n border-color: @color;\n outline: 0;\n .box-shadow(~\"inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px @{color-rgba}\");\n }\n}\n\n// Form control sizing\n//\n// Relative text size, padding, and border-radii changes for form controls. For\n// horizontal sizing, wrap controls in the predefined grid classes. `<select>`\n// element gets special love because it's special, and that's a fact!\n.input-size(@input-height; @padding-vertical; @padding-horizontal; @font-size; @line-height; @border-radius) {\n height: @input-height;\n padding: @padding-vertical @padding-horizontal;\n font-size: @font-size;\n line-height: @line-height;\n border-radius: @border-radius;\n\n select& {\n height: @input-height;\n line-height: @input-height;\n }\n\n textarea&,\n select[multiple]& {\n height: auto;\n }\n}\n","//\n// Buttons\n// --------------------------------------------------\n\n\n// Base styles\n// --------------------------------------------------\n\n.btn {\n display: inline-block;\n margin-bottom: 0; // For input.btn\n font-weight: @btn-font-weight;\n text-align: center;\n vertical-align: middle;\n cursor: pointer;\n background-image: none; // Reset unusual Firefox-on-Android default style; see https://github.com/necolas/normalize.css/issues/214\n border: 1px solid transparent;\n white-space: nowrap;\n .button-size(@padding-base-vertical; @padding-base-horizontal; @font-size-base; @line-height-base; @border-radius-base);\n .user-select(none);\n\n &,\n &:active,\n &.active {\n &:focus {\n .tab-focus();\n }\n }\n\n &:hover,\n &:focus {\n color: @btn-default-color;\n text-decoration: none;\n }\n\n &:active,\n &.active {\n outline: 0;\n background-image: none;\n .box-shadow(inset 0 3px 5px rgba(0,0,0,.125));\n }\n\n &.disabled,\n &[disabled],\n fieldset[disabled] & {\n cursor: not-allowed;\n pointer-events: none; // Future-proof disabling of clicks\n .opacity(.65);\n .box-shadow(none);\n }\n}\n\n\n// Alternate buttons\n// --------------------------------------------------\n\n.btn-default {\n .button-variant(@btn-default-color; @btn-default-bg; @btn-default-border);\n}\n.btn-primary {\n .button-variant(@btn-primary-color; @btn-primary-bg; @btn-primary-border);\n}\n// Success appears as green\n.btn-success {\n .button-variant(@btn-success-color; @btn-success-bg; @btn-success-border);\n}\n// Info appears as blue-green\n.btn-info {\n .button-variant(@btn-info-color; @btn-info-bg; @btn-info-border);\n}\n// Warning appears as orange\n.btn-warning {\n .button-variant(@btn-warning-color; @btn-warning-bg; @btn-warning-border);\n}\n// Danger and error appear as red\n.btn-danger {\n .button-variant(@btn-danger-color; @btn-danger-bg; @btn-danger-border);\n}\n\n\n// Link buttons\n// -------------------------\n\n// Make a button look and behave like a link\n.btn-link {\n color: @link-color;\n font-weight: normal;\n cursor: pointer;\n border-radius: 0;\n\n &,\n &:active,\n &[disabled],\n fieldset[disabled] & {\n background-color: transparent;\n .box-shadow(none);\n }\n &,\n &:hover,\n &:focus,\n &:active {\n border-color: transparent;\n }\n &:hover,\n &:focus {\n color: @link-hover-color;\n text-decoration: underline;\n background-color: transparent;\n }\n &[disabled],\n fieldset[disabled] & {\n &:hover,\n &:focus {\n color: @btn-link-disabled-color;\n text-decoration: none;\n }\n }\n}\n\n\n// Button Sizes\n// --------------------------------------------------\n\n.btn-lg {\n // line-height: ensure even-numbered height of button next to large input\n .button-size(@padding-large-vertical; @padding-large-horizontal; @font-size-large; @line-height-large; @border-radius-large);\n}\n.btn-sm {\n // line-height: ensure proper height of button next to small input\n .button-size(@padding-small-vertical; @padding-small-horizontal; @font-size-small; @line-height-small; @border-radius-small);\n}\n.btn-xs {\n .button-size(@padding-xs-vertical; @padding-xs-horizontal; @font-size-small; @line-height-small; @border-radius-small);\n}\n\n\n// Block button\n// --------------------------------------------------\n\n.btn-block {\n display: block;\n width: 100%;\n}\n\n// Vertically space out multiple block buttons\n.btn-block + .btn-block {\n margin-top: 5px;\n}\n\n// Specificity overrides\ninput[type=\"submit\"],\ninput[type=\"reset\"],\ninput[type=\"button\"] {\n &.btn-block {\n width: 100%;\n }\n}\n","// Button variants\n//\n// Easily pump out default styles, as well as :hover, :focus, :active,\n// and disabled options for all buttons\n\n.button-variant(@color; @background; @border) {\n color: @color;\n background-color: @background;\n border-color: @border;\n\n &:hover,\n &:focus,\n &:active,\n &.active,\n .open > .dropdown-toggle& {\n color: @color;\n background-color: darken(@background, 10%);\n border-color: darken(@border, 12%);\n }\n &:active,\n &.active,\n .open > .dropdown-toggle& {\n background-image: none;\n }\n &.disabled,\n &[disabled],\n fieldset[disabled] & {\n &,\n &:hover,\n &:focus,\n &:active,\n &.active {\n background-color: @background;\n border-color: @border;\n }\n }\n\n .badge {\n color: @background;\n background-color: @color;\n }\n}\n\n// Button sizes\n.button-size(@padding-vertical; @padding-horizontal; @font-size; @line-height; @border-radius) {\n padding: @padding-vertical @padding-horizontal;\n font-size: @font-size;\n line-height: @line-height;\n border-radius: @border-radius;\n}\n","// Opacity\n\n.opacity(@opacity) {\n opacity: @opacity;\n // IE8 filter\n @opacity-ie: (@opacity * 100);\n filter: ~\"alpha(opacity=@{opacity-ie})\";\n}\n","//\n// Component animations\n// --------------------------------------------------\n\n// Heads up!\n//\n// We don't use the `.opacity()` mixin here since it causes a bug with text\n// fields in IE7-8. Source: https://github.com/twbs/bootstrap/pull/3552.\n\n.fade {\n opacity: 0;\n .transition(opacity .15s linear);\n &.in {\n opacity: 1;\n }\n}\n\n.collapse {\n display: none;\n\n &.in { display: block; }\n tr&.in { display: table-row; }\n tbody&.in { display: table-row-group; }\n}\n\n.collapsing {\n position: relative;\n height: 0;\n overflow: hidden;\n .transition(height .35s ease);\n}\n","//\n// Dropdown menus\n// --------------------------------------------------\n\n\n// Dropdown arrow/caret\n.caret {\n display: inline-block;\n width: 0;\n height: 0;\n margin-left: 2px;\n vertical-align: middle;\n border-top: @caret-width-base solid;\n border-right: @caret-width-base solid transparent;\n border-left: @caret-width-base solid transparent;\n}\n\n// The dropdown wrapper (div)\n.dropdown {\n position: relative;\n}\n\n// Prevent the focus on the dropdown toggle when closing dropdowns\n.dropdown-toggle:focus {\n outline: 0;\n}\n\n// The dropdown menu (ul)\n.dropdown-menu {\n position: absolute;\n top: 100%;\n left: 0;\n z-index: @zindex-dropdown;\n display: none; // none by default, but block on \"open\" of the menu\n float: left;\n min-width: 160px;\n padding: 5px 0;\n margin: 2px 0 0; // override default ul\n list-style: none;\n font-size: @font-size-base;\n text-align: left; // Ensures proper alignment if parent has it changed (e.g., modal footer)\n background-color: @dropdown-bg;\n border: 1px solid @dropdown-fallback-border; // IE8 fallback\n border: 1px solid @dropdown-border;\n border-radius: @border-radius-base;\n .box-shadow(0 6px 12px rgba(0,0,0,.175));\n background-clip: padding-box;\n\n // Aligns the dropdown menu to right\n //\n // Deprecated as of 3.1.0 in favor of `.dropdown-menu-[dir]`\n &.pull-right {\n right: 0;\n left: auto;\n }\n\n // Dividers (basically an hr) within the dropdown\n .divider {\n .nav-divider(@dropdown-divider-bg);\n }\n\n // Links within the dropdown menu\n > li > a {\n display: block;\n padding: 3px 20px;\n clear: both;\n font-weight: normal;\n line-height: @line-height-base;\n color: @dropdown-link-color;\n white-space: nowrap; // prevent links from randomly breaking onto new lines\n }\n}\n\n// Hover/Focus state\n.dropdown-menu > li > a {\n &:hover,\n &:focus {\n text-decoration: none;\n color: @dropdown-link-hover-color;\n background-color: @dropdown-link-hover-bg;\n }\n}\n\n// Active state\n.dropdown-menu > .active > a {\n &,\n &:hover,\n &:focus {\n color: @dropdown-link-active-color;\n text-decoration: none;\n outline: 0;\n background-color: @dropdown-link-active-bg;\n }\n}\n\n// Disabled state\n//\n// Gray out text and ensure the hover/focus state remains gray\n\n.dropdown-menu > .disabled > a {\n &,\n &:hover,\n &:focus {\n color: @dropdown-link-disabled-color;\n }\n}\n// Nuke hover/focus effects\n.dropdown-menu > .disabled > a {\n &:hover,\n &:focus {\n text-decoration: none;\n background-color: transparent;\n background-image: none; // Remove CSS gradient\n .reset-filter();\n cursor: not-allowed;\n }\n}\n\n// Open state for the dropdown\n.open {\n // Show the menu\n > .dropdown-menu {\n display: block;\n }\n\n // Remove the outline when :focus is triggered\n > a {\n outline: 0;\n }\n}\n\n// Menu positioning\n//\n// Add extra class to `.dropdown-menu` to flip the alignment of the dropdown\n// menu with the parent.\n.dropdown-menu-right {\n left: auto; // Reset the default from `.dropdown-menu`\n right: 0;\n}\n// With v3, we enabled auto-flipping if you have a dropdown within a right\n// aligned nav component. To enable the undoing of that, we provide an override\n// to restore the default dropdown menu alignment.\n//\n// This is only for left-aligning a dropdown menu within a `.navbar-right` or\n// `.pull-right` nav component.\n.dropdown-menu-left {\n left: 0;\n right: auto;\n}\n\n// Dropdown section headers\n.dropdown-header {\n display: block;\n padding: 3px 20px;\n font-size: @font-size-small;\n line-height: @line-height-base;\n color: @dropdown-header-color;\n white-space: nowrap; // as with > li > a\n}\n\n// Backdrop to catch body clicks on mobile, etc.\n.dropdown-backdrop {\n position: fixed;\n left: 0;\n right: 0;\n bottom: 0;\n top: 0;\n z-index: (@zindex-dropdown - 10);\n}\n\n// Right aligned dropdowns\n.pull-right > .dropdown-menu {\n right: 0;\n left: auto;\n}\n\n// Allow for dropdowns to go bottom up (aka, dropup-menu)\n//\n// Just add .dropup after the standard .dropdown class and you're set, bro.\n// TODO: abstract this so that the navbar fixed styles are not placed here?\n\n.dropup,\n.navbar-fixed-bottom .dropdown {\n // Reverse the caret\n .caret {\n border-top: 0;\n border-bottom: @caret-width-base solid;\n content: \"\";\n }\n // Different positioning for bottom up menu\n .dropdown-menu {\n top: auto;\n bottom: 100%;\n margin-bottom: 1px;\n }\n}\n\n\n// Component alignment\n//\n// Reiterate per navbar.less and the modified component alignment there.\n\n@media (min-width: @grid-float-breakpoint) {\n .navbar-right {\n .dropdown-menu {\n .dropdown-menu-right();\n }\n // Necessary for overrides of the default right aligned menu.\n // Will remove come v4 in all likelihood.\n .dropdown-menu-left {\n .dropdown-menu-left();\n }\n }\n}\n\n","// Horizontal dividers\n//\n// Dividers (basically an hr) within dropdowns and nav lists\n\n.nav-divider(@color: #e5e5e5) {\n height: 1px;\n margin: ((@line-height-computed / 2) - 1) 0;\n overflow: hidden;\n background-color: @color;\n}\n","// Reset filters for IE\n//\n// When you need to remove a gradient background, do not forget to use this to reset\n// the IE filter for IE9 and below.\n\n.reset-filter() {\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(enabled = false)\"));\n}\n","//\n// Button groups\n// --------------------------------------------------\n\n// Make the div behave like a button\n.btn-group,\n.btn-group-vertical {\n position: relative;\n display: inline-block;\n vertical-align: middle; // match .btn alignment given font-size hack above\n > .btn {\n position: relative;\n float: left;\n // Bring the \"active\" button to the front\n &:hover,\n &:focus,\n &:active,\n &.active {\n z-index: 2;\n }\n &:focus {\n // Remove focus outline when dropdown JS adds it after closing the menu\n outline: 0;\n }\n }\n}\n\n// Prevent double borders when buttons are next to each other\n.btn-group {\n .btn + .btn,\n .btn + .btn-group,\n .btn-group + .btn,\n .btn-group + .btn-group {\n margin-left: -1px;\n }\n}\n\n// Optional: Group multiple button groups together for a toolbar\n.btn-toolbar {\n margin-left: -5px; // Offset the first child's margin\n &:extend(.clearfix all);\n\n .btn-group,\n .input-group {\n float: left;\n }\n > .btn,\n > .btn-group,\n > .input-group {\n margin-left: 5px;\n }\n}\n\n.btn-group > .btn:not(:first-child):not(:last-child):not(.dropdown-toggle) {\n border-radius: 0;\n}\n\n// Set corners individual because sometimes a single button can be in a .btn-group and we need :first-child and :last-child to both match\n.btn-group > .btn:first-child {\n margin-left: 0;\n &:not(:last-child):not(.dropdown-toggle) {\n .border-right-radius(0);\n }\n}\n// Need .dropdown-toggle since :last-child doesn't apply given a .dropdown-menu immediately after it\n.btn-group > .btn:last-child:not(:first-child),\n.btn-group > .dropdown-toggle:not(:first-child) {\n .border-left-radius(0);\n}\n\n// Custom edits for including btn-groups within btn-groups (useful for including dropdown buttons within a btn-group)\n.btn-group > .btn-group {\n float: left;\n}\n.btn-group > .btn-group:not(:first-child):not(:last-child) > .btn {\n border-radius: 0;\n}\n.btn-group > .btn-group:first-child {\n > .btn:last-child,\n > .dropdown-toggle {\n .border-right-radius(0);\n }\n}\n.btn-group > .btn-group:last-child > .btn:first-child {\n .border-left-radius(0);\n}\n\n// On active and open, don't show outline\n.btn-group .dropdown-toggle:active,\n.btn-group.open .dropdown-toggle {\n outline: 0;\n}\n\n\n// Sizing\n//\n// Remix the default button sizing classes into new ones for easier manipulation.\n\n.btn-group-xs > .btn { &:extend(.btn-xs); }\n.btn-group-sm > .btn { &:extend(.btn-sm); }\n.btn-group-lg > .btn { &:extend(.btn-lg); }\n\n\n// Split button dropdowns\n// ----------------------\n\n// Give the line between buttons some depth\n.btn-group > .btn + .dropdown-toggle {\n padding-left: 8px;\n padding-right: 8px;\n}\n.btn-group > .btn-lg + .dropdown-toggle {\n padding-left: 12px;\n padding-right: 12px;\n}\n\n// The clickable button for toggling the menu\n// Remove the gradient and set the same inset shadow as the :active state\n.btn-group.open .dropdown-toggle {\n .box-shadow(inset 0 3px 5px rgba(0,0,0,.125));\n\n // Show no shadow for `.btn-link` since it has no other button styles.\n &.btn-link {\n .box-shadow(none);\n }\n}\n\n\n// Reposition the caret\n.btn .caret {\n margin-left: 0;\n}\n// Carets in other button sizes\n.btn-lg .caret {\n border-width: @caret-width-large @caret-width-large 0;\n border-bottom-width: 0;\n}\n// Upside down carets for .dropup\n.dropup .btn-lg .caret {\n border-width: 0 @caret-width-large @caret-width-large;\n}\n\n\n// Vertical button groups\n// ----------------------\n\n.btn-group-vertical {\n > .btn,\n > .btn-group,\n > .btn-group > .btn {\n display: block;\n float: none;\n width: 100%;\n max-width: 100%;\n }\n\n // Clear floats so dropdown menus can be properly placed\n > .btn-group {\n &:extend(.clearfix all);\n > .btn {\n float: none;\n }\n }\n\n > .btn + .btn,\n > .btn + .btn-group,\n > .btn-group + .btn,\n > .btn-group + .btn-group {\n margin-top: -1px;\n margin-left: 0;\n }\n}\n\n.btn-group-vertical > .btn {\n &:not(:first-child):not(:last-child) {\n border-radius: 0;\n }\n &:first-child:not(:last-child) {\n border-top-right-radius: @border-radius-base;\n .border-bottom-radius(0);\n }\n &:last-child:not(:first-child) {\n border-bottom-left-radius: @border-radius-base;\n .border-top-radius(0);\n }\n}\n.btn-group-vertical > .btn-group:not(:first-child):not(:last-child) > .btn {\n border-radius: 0;\n}\n.btn-group-vertical > .btn-group:first-child:not(:last-child) {\n > .btn:last-child,\n > .dropdown-toggle {\n .border-bottom-radius(0);\n }\n}\n.btn-group-vertical > .btn-group:last-child:not(:first-child) > .btn:first-child {\n .border-top-radius(0);\n}\n\n\n\n// Justified button groups\n// ----------------------\n\n.btn-group-justified {\n display: table;\n width: 100%;\n table-layout: fixed;\n border-collapse: separate;\n > .btn,\n > .btn-group {\n float: none;\n display: table-cell;\n width: 1%;\n }\n > .btn-group .btn {\n width: 100%;\n }\n\n > .btn-group .dropdown-menu {\n left: auto;\n }\n}\n\n\n// Checkbox and radio options\n//\n// In order to support the browser's form validation feedback, powered by the\n// `required` attribute, we have to \"hide\" the inputs via `opacity`. We cannot\n// use `display: none;` or `visibility: hidden;` as that also hides the popover.\n// This way, we ensure a DOM element is visible to position the popover from.\n//\n// See https://github.com/twbs/bootstrap/pull/12794 for more.\n\n[data-toggle=\"buttons\"] > .btn > input[type=\"radio\"],\n[data-toggle=\"buttons\"] > .btn > input[type=\"checkbox\"] {\n position: absolute;\n z-index: -1;\n .opacity(0);\n}\n","// Single side border-radius\n\n.border-top-radius(@radius) {\n border-top-right-radius: @radius;\n border-top-left-radius: @radius;\n}\n.border-right-radius(@radius) {\n border-bottom-right-radius: @radius;\n border-top-right-radius: @radius;\n}\n.border-bottom-radius(@radius) {\n border-bottom-right-radius: @radius;\n border-bottom-left-radius: @radius;\n}\n.border-left-radius(@radius) {\n border-bottom-left-radius: @radius;\n border-top-left-radius: @radius;\n}\n","//\n// Input groups\n// --------------------------------------------------\n\n// Base styles\n// -------------------------\n.input-group {\n position: relative; // For dropdowns\n display: table;\n border-collapse: separate; // prevent input groups from inheriting border styles from table cells when placed within a table\n\n // Undo padding and float of grid classes\n &[class*=\"col-\"] {\n float: none;\n padding-left: 0;\n padding-right: 0;\n }\n\n .form-control {\n // Ensure that the input is always above the *appended* addon button for\n // proper border colors.\n position: relative;\n z-index: 2;\n\n // IE9 fubars the placeholder attribute in text inputs and the arrows on\n // select elements in input groups. To fix it, we float the input. Details:\n // https://github.com/twbs/bootstrap/issues/11561#issuecomment-28936855\n float: left;\n\n width: 100%;\n margin-bottom: 0;\n }\n}\n\n// Sizing options\n//\n// Remix the default form control sizing classes into new ones for easier\n// manipulation.\n\n.input-group-lg > .form-control,\n.input-group-lg > .input-group-addon,\n.input-group-lg > .input-group-btn > .btn {\n .input-lg();\n}\n.input-group-sm > .form-control,\n.input-group-sm > .input-group-addon,\n.input-group-sm > .input-group-btn > .btn {\n .input-sm();\n}\n\n\n// Display as table-cell\n// -------------------------\n.input-group-addon,\n.input-group-btn,\n.input-group .form-control {\n display: table-cell;\n\n &:not(:first-child):not(:last-child) {\n border-radius: 0;\n }\n}\n// Addon and addon wrapper for buttons\n.input-group-addon,\n.input-group-btn {\n width: 1%;\n white-space: nowrap;\n vertical-align: middle; // Match the inputs\n}\n\n// Text input groups\n// -------------------------\n.input-group-addon {\n padding: @padding-base-vertical @padding-base-horizontal;\n font-size: @font-size-base;\n font-weight: normal;\n line-height: 1;\n color: @input-color;\n text-align: center;\n background-color: @input-group-addon-bg;\n border: 1px solid @input-group-addon-border-color;\n border-radius: @border-radius-base;\n\n // Sizing\n &.input-sm {\n padding: @padding-small-vertical @padding-small-horizontal;\n font-size: @font-size-small;\n border-radius: @border-radius-small;\n }\n &.input-lg {\n padding: @padding-large-vertical @padding-large-horizontal;\n font-size: @font-size-large;\n border-radius: @border-radius-large;\n }\n\n // Nuke default margins from checkboxes and radios to vertically center within.\n input[type=\"radio\"],\n input[type=\"checkbox\"] {\n margin-top: 0;\n }\n}\n\n// Reset rounded corners\n.input-group .form-control:first-child,\n.input-group-addon:first-child,\n.input-group-btn:first-child > .btn,\n.input-group-btn:first-child > .btn-group > .btn,\n.input-group-btn:first-child > .dropdown-toggle,\n.input-group-btn:last-child > .btn:not(:last-child):not(.dropdown-toggle),\n.input-group-btn:last-child > .btn-group:not(:last-child) > .btn {\n .border-right-radius(0);\n}\n.input-group-addon:first-child {\n border-right: 0;\n}\n.input-group .form-control:last-child,\n.input-group-addon:last-child,\n.input-group-btn:last-child > .btn,\n.input-group-btn:last-child > .btn-group > .btn,\n.input-group-btn:last-child > .dropdown-toggle,\n.input-group-btn:first-child > .btn:not(:first-child),\n.input-group-btn:first-child > .btn-group:not(:first-child) > .btn {\n .border-left-radius(0);\n}\n.input-group-addon:last-child {\n border-left: 0;\n}\n\n// Button input groups\n// -------------------------\n.input-group-btn {\n position: relative;\n // Jankily prevent input button groups from wrapping with `white-space` and\n // `font-size` in combination with `inline-block` on buttons.\n font-size: 0;\n white-space: nowrap;\n\n // Negative margin for spacing, position for bringing hovered/focused/actived\n // element above the siblings.\n > .btn {\n position: relative;\n + .btn {\n margin-left: -1px;\n }\n // Bring the \"active\" button to the front\n &:hover,\n &:focus,\n &:active {\n z-index: 2;\n }\n }\n\n // Negative margin to only have a 1px border between the two\n &:first-child {\n > .btn,\n > .btn-group {\n margin-right: -1px;\n }\n }\n &:last-child {\n > .btn,\n > .btn-group {\n margin-left: -1px;\n }\n }\n}\n","//\n// Navs\n// --------------------------------------------------\n\n\n// Base class\n// --------------------------------------------------\n\n.nav {\n margin-bottom: 0;\n padding-left: 0; // Override default ul/ol\n list-style: none;\n &:extend(.clearfix all);\n\n > li {\n position: relative;\n display: block;\n\n > a {\n position: relative;\n display: block;\n padding: @nav-link-padding;\n &:hover,\n &:focus {\n text-decoration: none;\n background-color: @nav-link-hover-bg;\n }\n }\n\n // Disabled state sets text to gray and nukes hover/tab effects\n &.disabled > a {\n color: @nav-disabled-link-color;\n\n &:hover,\n &:focus {\n color: @nav-disabled-link-hover-color;\n text-decoration: none;\n background-color: transparent;\n cursor: not-allowed;\n }\n }\n }\n\n // Open dropdowns\n .open > a {\n &,\n &:hover,\n &:focus {\n background-color: @nav-link-hover-bg;\n border-color: @link-color;\n }\n }\n\n // Nav dividers (deprecated with v3.0.1)\n //\n // This should have been removed in v3 with the dropping of `.nav-list`, but\n // we missed it. We don't currently support this anywhere, but in the interest\n // of maintaining backward compatibility in case you use it, it's deprecated.\n .nav-divider {\n .nav-divider();\n }\n\n // Prevent IE8 from misplacing imgs\n //\n // See https://github.com/h5bp/html5-boilerplate/issues/984#issuecomment-3985989\n > li > a > img {\n max-width: none;\n }\n}\n\n\n// Tabs\n// -------------------------\n\n// Give the tabs something to sit on\n.nav-tabs {\n border-bottom: 1px solid @nav-tabs-border-color;\n > li {\n float: left;\n // Make the list-items overlay the bottom border\n margin-bottom: -1px;\n\n // Actual tabs (as links)\n > a {\n margin-right: 2px;\n line-height: @line-height-base;\n border: 1px solid transparent;\n border-radius: @border-radius-base @border-radius-base 0 0;\n &:hover {\n border-color: @nav-tabs-link-hover-border-color @nav-tabs-link-hover-border-color @nav-tabs-border-color;\n }\n }\n\n // Active state, and its :hover to override normal :hover\n &.active > a {\n &,\n &:hover,\n &:focus {\n color: @nav-tabs-active-link-hover-color;\n background-color: @nav-tabs-active-link-hover-bg;\n border: 1px solid @nav-tabs-active-link-hover-border-color;\n border-bottom-color: transparent;\n cursor: default;\n }\n }\n }\n // pulling this in mainly for less shorthand\n &.nav-justified {\n .nav-justified();\n .nav-tabs-justified();\n }\n}\n\n\n// Pills\n// -------------------------\n.nav-pills {\n > li {\n float: left;\n\n // Links rendered as pills\n > a {\n border-radius: @nav-pills-border-radius;\n }\n + li {\n margin-left: 2px;\n }\n\n // Active state\n &.active > a {\n &,\n &:hover,\n &:focus {\n color: @nav-pills-active-link-hover-color;\n background-color: @nav-pills-active-link-hover-bg;\n }\n }\n }\n}\n\n\n// Stacked pills\n.nav-stacked {\n > li {\n float: none;\n + li {\n margin-top: 2px;\n margin-left: 0; // no need for this gap between nav items\n }\n }\n}\n\n\n// Nav variations\n// --------------------------------------------------\n\n// Justified nav links\n// -------------------------\n\n.nav-justified {\n width: 100%;\n\n > li {\n float: none;\n > a {\n text-align: center;\n margin-bottom: 5px;\n }\n }\n\n > .dropdown .dropdown-menu {\n top: auto;\n left: auto;\n }\n\n @media (min-width: @screen-sm-min) {\n > li {\n display: table-cell;\n width: 1%;\n > a {\n margin-bottom: 0;\n }\n }\n }\n}\n\n// Move borders to anchors instead of bottom of list\n//\n// Mixin for adding on top the shared `.nav-justified` styles for our tabs\n.nav-tabs-justified {\n border-bottom: 0;\n\n > li > a {\n // Override margin from .nav-tabs\n margin-right: 0;\n border-radius: @border-radius-base;\n }\n\n > .active > a,\n > .active > a:hover,\n > .active > a:focus {\n border: 1px solid @nav-tabs-justified-link-border-color;\n }\n\n @media (min-width: @screen-sm-min) {\n > li > a {\n border-bottom: 1px solid @nav-tabs-justified-link-border-color;\n border-radius: @border-radius-base @border-radius-base 0 0;\n }\n > .active > a,\n > .active > a:hover,\n > .active > a:focus {\n border-bottom-color: @nav-tabs-justified-active-link-border-color;\n }\n }\n}\n\n\n// Tabbable tabs\n// -------------------------\n\n// Hide tabbable panes to start, show them when `.active`\n.tab-content {\n > .tab-pane {\n display: none;\n }\n > .active {\n display: block;\n }\n}\n\n\n// Dropdowns\n// -------------------------\n\n// Specific dropdowns\n.nav-tabs .dropdown-menu {\n // make dropdown border overlap tab border\n margin-top: -1px;\n // Remove the top rounded corners here since there is a hard edge above the menu\n .border-top-radius(0);\n}\n","//\n// Navbars\n// --------------------------------------------------\n\n\n// Wrapper and base class\n//\n// Provide a static navbar from which we expand to create full-width, fixed, and\n// other navbar variations.\n\n.navbar {\n position: relative;\n min-height: @navbar-height; // Ensure a navbar always shows (e.g., without a .navbar-brand in collapsed mode)\n margin-bottom: @navbar-margin-bottom;\n border: 1px solid transparent;\n\n // Prevent floats from breaking the navbar\n &:extend(.clearfix all);\n\n @media (min-width: @grid-float-breakpoint) {\n border-radius: @navbar-border-radius;\n }\n}\n\n\n// Navbar heading\n//\n// Groups `.navbar-brand` and `.navbar-toggle` into a single component for easy\n// styling of responsive aspects.\n\n.navbar-header {\n &:extend(.clearfix all);\n\n @media (min-width: @grid-float-breakpoint) {\n float: left;\n }\n}\n\n\n// Navbar collapse (body)\n//\n// Group your navbar content into this for easy collapsing and expanding across\n// various device sizes. By default, this content is collapsed when <768px, but\n// will expand past that for a horizontal display.\n//\n// To start (on mobile devices) the navbar links, forms, and buttons are stacked\n// vertically and include a `max-height` to overflow in case you have too much\n// content for the user's viewport.\n\n.navbar-collapse {\n overflow-x: visible;\n padding-right: @navbar-padding-horizontal;\n padding-left: @navbar-padding-horizontal;\n border-top: 1px solid transparent;\n box-shadow: inset 0 1px 0 rgba(255,255,255,.1);\n &:extend(.clearfix all);\n -webkit-overflow-scrolling: touch;\n\n &.in {\n overflow-y: auto;\n }\n\n @media (min-width: @grid-float-breakpoint) {\n width: auto;\n border-top: 0;\n box-shadow: none;\n\n &.collapse {\n display: block !important;\n height: auto !important;\n padding-bottom: 0; // Override default setting\n overflow: visible !important;\n }\n\n &.in {\n overflow-y: visible;\n }\n\n // Undo the collapse side padding for navbars with containers to ensure\n // alignment of right-aligned contents.\n .navbar-fixed-top &,\n .navbar-static-top &,\n .navbar-fixed-bottom & {\n padding-left: 0;\n padding-right: 0;\n }\n }\n}\n\n.navbar-fixed-top,\n.navbar-fixed-bottom {\n .navbar-collapse {\n max-height: @navbar-collapse-max-height;\n\n @media (max-width: @screen-xs-min) and (orientation: landscape) {\n max-height: 200px;\n }\n }\n}\n\n\n// Both navbar header and collapse\n//\n// When a container is present, change the behavior of the header and collapse.\n\n.container,\n.container-fluid {\n > .navbar-header,\n > .navbar-collapse {\n margin-right: -@navbar-padding-horizontal;\n margin-left: -@navbar-padding-horizontal;\n\n @media (min-width: @grid-float-breakpoint) {\n margin-right: 0;\n margin-left: 0;\n }\n }\n}\n\n\n//\n// Navbar alignment options\n//\n// Display the navbar across the entirety of the page or fixed it to the top or\n// bottom of the page.\n\n// Static top (unfixed, but 100% wide) navbar\n.navbar-static-top {\n z-index: @zindex-navbar;\n border-width: 0 0 1px;\n\n @media (min-width: @grid-float-breakpoint) {\n border-radius: 0;\n }\n}\n\n// Fix the top/bottom navbars when screen real estate supports it\n.navbar-fixed-top,\n.navbar-fixed-bottom {\n position: fixed;\n right: 0;\n left: 0;\n z-index: @zindex-navbar-fixed;\n .translate3d(0, 0, 0);\n\n // Undo the rounded corners\n @media (min-width: @grid-float-breakpoint) {\n border-radius: 0;\n }\n}\n.navbar-fixed-top {\n top: 0;\n border-width: 0 0 1px;\n}\n.navbar-fixed-bottom {\n bottom: 0;\n margin-bottom: 0; // override .navbar defaults\n border-width: 1px 0 0;\n}\n\n\n// Brand/project name\n\n.navbar-brand {\n float: left;\n padding: @navbar-padding-vertical @navbar-padding-horizontal;\n font-size: @font-size-large;\n line-height: @line-height-computed;\n height: @navbar-height;\n\n &:hover,\n &:focus {\n text-decoration: none;\n }\n\n @media (min-width: @grid-float-breakpoint) {\n .navbar > .container &,\n .navbar > .container-fluid & {\n margin-left: -@navbar-padding-horizontal;\n }\n }\n}\n\n\n// Navbar toggle\n//\n// Custom button for toggling the `.navbar-collapse`, powered by the collapse\n// JavaScript plugin.\n\n.navbar-toggle {\n position: relative;\n float: right;\n margin-right: @navbar-padding-horizontal;\n padding: 9px 10px;\n .navbar-vertical-align(34px);\n background-color: transparent;\n background-image: none; // Reset unusual Firefox-on-Android default style; see https://github.com/necolas/normalize.css/issues/214\n border: 1px solid transparent;\n border-radius: @border-radius-base;\n\n // We remove the `outline` here, but later compensate by attaching `:hover`\n // styles to `:focus`.\n &:focus {\n outline: 0;\n }\n\n // Bars\n .icon-bar {\n display: block;\n width: 22px;\n height: 2px;\n border-radius: 1px;\n }\n .icon-bar + .icon-bar {\n margin-top: 4px;\n }\n\n @media (min-width: @grid-float-breakpoint) {\n display: none;\n }\n}\n\n\n// Navbar nav links\n//\n// Builds on top of the `.nav` components with its own modifier class to make\n// the nav the full height of the horizontal nav (above 768px).\n\n.navbar-nav {\n margin: (@navbar-padding-vertical / 2) -@navbar-padding-horizontal;\n\n > li > a {\n padding-top: 10px;\n padding-bottom: 10px;\n line-height: @line-height-computed;\n }\n\n @media (max-width: @grid-float-breakpoint-max) {\n // Dropdowns get custom display when collapsed\n .open .dropdown-menu {\n position: static;\n float: none;\n width: auto;\n margin-top: 0;\n background-color: transparent;\n border: 0;\n box-shadow: none;\n > li > a,\n .dropdown-header {\n padding: 5px 15px 5px 25px;\n }\n > li > a {\n line-height: @line-height-computed;\n &:hover,\n &:focus {\n background-image: none;\n }\n }\n }\n }\n\n // Uncollapse the nav\n @media (min-width: @grid-float-breakpoint) {\n float: left;\n margin: 0;\n\n > li {\n float: left;\n > a {\n padding-top: @navbar-padding-vertical;\n padding-bottom: @navbar-padding-vertical;\n }\n }\n\n &.navbar-right:last-child {\n margin-right: -@navbar-padding-horizontal;\n }\n }\n}\n\n\n// Component alignment\n//\n// Repurpose the pull utilities as their own navbar utilities to avoid specificity\n// issues with parents and chaining. Only do this when the navbar is uncollapsed\n// though so that navbar contents properly stack and align in mobile.\n\n@media (min-width: @grid-float-breakpoint) {\n .navbar-left { .pull-left(); }\n .navbar-right { .pull-right(); }\n}\n\n\n// Navbar form\n//\n// Extension of the `.form-inline` with some extra flavor for optimum display in\n// our navbars.\n\n.navbar-form {\n margin-left: -@navbar-padding-horizontal;\n margin-right: -@navbar-padding-horizontal;\n padding: 10px @navbar-padding-horizontal;\n border-top: 1px solid transparent;\n border-bottom: 1px solid transparent;\n @shadow: inset 0 1px 0 rgba(255,255,255,.1), 0 1px 0 rgba(255,255,255,.1);\n .box-shadow(@shadow);\n\n // Mixin behavior for optimum display\n .form-inline();\n\n .form-group {\n @media (max-width: @grid-float-breakpoint-max) {\n margin-bottom: 5px;\n }\n }\n\n // Vertically center in expanded, horizontal navbar\n .navbar-vertical-align(@input-height-base);\n\n // Undo 100% width for pull classes\n @media (min-width: @grid-float-breakpoint) {\n width: auto;\n border: 0;\n margin-left: 0;\n margin-right: 0;\n padding-top: 0;\n padding-bottom: 0;\n .box-shadow(none);\n\n // Outdent the form if last child to line up with content down the page\n &.navbar-right:last-child {\n margin-right: -@navbar-padding-horizontal;\n }\n }\n}\n\n\n// Dropdown menus\n\n// Menu position and menu carets\n.navbar-nav > li > .dropdown-menu {\n margin-top: 0;\n .border-top-radius(0);\n}\n// Menu position and menu caret support for dropups via extra dropup class\n.navbar-fixed-bottom .navbar-nav > li > .dropdown-menu {\n .border-bottom-radius(0);\n}\n\n\n// Buttons in navbars\n//\n// Vertically center a button within a navbar (when *not* in a form).\n\n.navbar-btn {\n .navbar-vertical-align(@input-height-base);\n\n &.btn-sm {\n .navbar-vertical-align(@input-height-small);\n }\n &.btn-xs {\n .navbar-vertical-align(22);\n }\n}\n\n\n// Text in navbars\n//\n// Add a class to make any element properly align itself vertically within the navbars.\n\n.navbar-text {\n .navbar-vertical-align(@line-height-computed);\n\n @media (min-width: @grid-float-breakpoint) {\n float: left;\n margin-left: @navbar-padding-horizontal;\n margin-right: @navbar-padding-horizontal;\n\n // Outdent the form if last child to line up with content down the page\n &.navbar-right:last-child {\n margin-right: 0;\n }\n }\n}\n\n// Alternate navbars\n// --------------------------------------------------\n\n// Default navbar\n.navbar-default {\n background-color: @navbar-default-bg;\n border-color: @navbar-default-border;\n\n .navbar-brand {\n color: @navbar-default-brand-color;\n &:hover,\n &:focus {\n color: @navbar-default-brand-hover-color;\n background-color: @navbar-default-brand-hover-bg;\n }\n }\n\n .navbar-text {\n color: @navbar-default-color;\n }\n\n .navbar-nav {\n > li > a {\n color: @navbar-default-link-color;\n\n &:hover,\n &:focus {\n color: @navbar-default-link-hover-color;\n background-color: @navbar-default-link-hover-bg;\n }\n }\n > .active > a {\n &,\n &:hover,\n &:focus {\n color: @navbar-default-link-active-color;\n background-color: @navbar-default-link-active-bg;\n }\n }\n > .disabled > a {\n &,\n &:hover,\n &:focus {\n color: @navbar-default-link-disabled-color;\n background-color: @navbar-default-link-disabled-bg;\n }\n }\n }\n\n .navbar-toggle {\n border-color: @navbar-default-toggle-border-color;\n &:hover,\n &:focus {\n background-color: @navbar-default-toggle-hover-bg;\n }\n .icon-bar {\n background-color: @navbar-default-toggle-icon-bar-bg;\n }\n }\n\n .navbar-collapse,\n .navbar-form {\n border-color: @navbar-default-border;\n }\n\n // Dropdown menu items\n .navbar-nav {\n // Remove background color from open dropdown\n > .open > a {\n &,\n &:hover,\n &:focus {\n background-color: @navbar-default-link-active-bg;\n color: @navbar-default-link-active-color;\n }\n }\n\n @media (max-width: @grid-float-breakpoint-max) {\n // Dropdowns get custom display when collapsed\n .open .dropdown-menu {\n > li > a {\n color: @navbar-default-link-color;\n &:hover,\n &:focus {\n color: @navbar-default-link-hover-color;\n background-color: @navbar-default-link-hover-bg;\n }\n }\n > .active > a {\n &,\n &:hover,\n &:focus {\n color: @navbar-default-link-active-color;\n background-color: @navbar-default-link-active-bg;\n }\n }\n > .disabled > a {\n &,\n &:hover,\n &:focus {\n color: @navbar-default-link-disabled-color;\n background-color: @navbar-default-link-disabled-bg;\n }\n }\n }\n }\n }\n\n\n // Links in navbars\n //\n // Add a class to ensure links outside the navbar nav are colored correctly.\n\n .navbar-link {\n color: @navbar-default-link-color;\n &:hover {\n color: @navbar-default-link-hover-color;\n }\n }\n\n .btn-link {\n color: @navbar-default-link-color;\n &:hover,\n &:focus {\n color: @navbar-default-link-hover-color;\n }\n &[disabled],\n fieldset[disabled] & {\n &:hover,\n &:focus {\n color: @navbar-default-link-disabled-color;\n }\n }\n }\n}\n\n// Inverse navbar\n\n.navbar-inverse {\n background-color: @navbar-inverse-bg;\n border-color: @navbar-inverse-border;\n\n .navbar-brand {\n color: @navbar-inverse-brand-color;\n &:hover,\n &:focus {\n color: @navbar-inverse-brand-hover-color;\n background-color: @navbar-inverse-brand-hover-bg;\n }\n }\n\n .navbar-text {\n color: @navbar-inverse-color;\n }\n\n .navbar-nav {\n > li > a {\n color: @navbar-inverse-link-color;\n\n &:hover,\n &:focus {\n color: @navbar-inverse-link-hover-color;\n background-color: @navbar-inverse-link-hover-bg;\n }\n }\n > .active > a {\n &,\n &:hover,\n &:focus {\n color: @navbar-inverse-link-active-color;\n background-color: @navbar-inverse-link-active-bg;\n }\n }\n > .disabled > a {\n &,\n &:hover,\n &:focus {\n color: @navbar-inverse-link-disabled-color;\n background-color: @navbar-inverse-link-disabled-bg;\n }\n }\n }\n\n // Darken the responsive nav toggle\n .navbar-toggle {\n border-color: @navbar-inverse-toggle-border-color;\n &:hover,\n &:focus {\n background-color: @navbar-inverse-toggle-hover-bg;\n }\n .icon-bar {\n background-color: @navbar-inverse-toggle-icon-bar-bg;\n }\n }\n\n .navbar-collapse,\n .navbar-form {\n border-color: darken(@navbar-inverse-bg, 7%);\n }\n\n // Dropdowns\n .navbar-nav {\n > .open > a {\n &,\n &:hover,\n &:focus {\n background-color: @navbar-inverse-link-active-bg;\n color: @navbar-inverse-link-active-color;\n }\n }\n\n @media (max-width: @grid-float-breakpoint-max) {\n // Dropdowns get custom display\n .open .dropdown-menu {\n > .dropdown-header {\n border-color: @navbar-inverse-border;\n }\n .divider {\n background-color: @navbar-inverse-border;\n }\n > li > a {\n color: @navbar-inverse-link-color;\n &:hover,\n &:focus {\n color: @navbar-inverse-link-hover-color;\n background-color: @navbar-inverse-link-hover-bg;\n }\n }\n > .active > a {\n &,\n &:hover,\n &:focus {\n color: @navbar-inverse-link-active-color;\n background-color: @navbar-inverse-link-active-bg;\n }\n }\n > .disabled > a {\n &,\n &:hover,\n &:focus {\n color: @navbar-inverse-link-disabled-color;\n background-color: @navbar-inverse-link-disabled-bg;\n }\n }\n }\n }\n }\n\n .navbar-link {\n color: @navbar-inverse-link-color;\n &:hover {\n color: @navbar-inverse-link-hover-color;\n }\n }\n\n .btn-link {\n color: @navbar-inverse-link-color;\n &:hover,\n &:focus {\n color: @navbar-inverse-link-hover-color;\n }\n &[disabled],\n fieldset[disabled] & {\n &:hover,\n &:focus {\n color: @navbar-inverse-link-disabled-color;\n }\n }\n }\n}\n","// Navbar vertical align\n//\n// Vertically center elements in the navbar.\n// Example: an element has a height of 30px, so write out `.navbar-vertical-align(30px);` to calculate the appropriate top margin.\n\n.navbar-vertical-align(@element-height) {\n margin-top: ((@navbar-height - @element-height) / 2);\n margin-bottom: ((@navbar-height - @element-height) / 2);\n}\n","//\n// Utility classes\n// --------------------------------------------------\n\n\n// Floats\n// -------------------------\n\n.clearfix {\n .clearfix();\n}\n.center-block {\n .center-block();\n}\n.pull-right {\n float: right !important;\n}\n.pull-left {\n float: left !important;\n}\n\n\n// Toggling content\n// -------------------------\n\n// Note: Deprecated .hide in favor of .hidden or .sr-only (as appropriate) in v3.0.1\n.hide {\n display: none !important;\n}\n.show {\n display: block !important;\n}\n.invisible {\n visibility: hidden;\n}\n.text-hide {\n .text-hide();\n}\n\n\n// Hide from screenreaders and browsers\n//\n// Credit: HTML5 Boilerplate\n\n.hidden {\n display: none !important;\n visibility: hidden !important;\n}\n\n\n// For Affix plugin\n// -------------------------\n\n.affix {\n position: fixed;\n .translate3d(0, 0, 0);\n}\n","//\n// Breadcrumbs\n// --------------------------------------------------\n\n\n.breadcrumb {\n padding: @breadcrumb-padding-vertical @breadcrumb-padding-horizontal;\n margin-bottom: @line-height-computed;\n list-style: none;\n background-color: @breadcrumb-bg;\n border-radius: @border-radius-base;\n\n > li {\n display: inline-block;\n\n + li:before {\n content: \"@{breadcrumb-separator}\\00a0\"; // Unicode space added since inline-block means non-collapsing white-space\n padding: 0 5px;\n color: @breadcrumb-color;\n }\n }\n\n > .active {\n color: @breadcrumb-active-color;\n }\n}\n","//\n// Pagination (multiple pages)\n// --------------------------------------------------\n.pagination {\n display: inline-block;\n padding-left: 0;\n margin: @line-height-computed 0;\n border-radius: @border-radius-base;\n\n > li {\n display: inline; // Remove list-style and block-level defaults\n > a,\n > span {\n position: relative;\n float: left; // Collapse white-space\n padding: @padding-base-vertical @padding-base-horizontal;\n line-height: @line-height-base;\n text-decoration: none;\n color: @pagination-color;\n background-color: @pagination-bg;\n border: 1px solid @pagination-border;\n margin-left: -1px;\n }\n &:first-child {\n > a,\n > span {\n margin-left: 0;\n .border-left-radius(@border-radius-base);\n }\n }\n &:last-child {\n > a,\n > span {\n .border-right-radius(@border-radius-base);\n }\n }\n }\n\n > li > a,\n > li > span {\n &:hover,\n &:focus {\n color: @pagination-hover-color;\n background-color: @pagination-hover-bg;\n border-color: @pagination-hover-border;\n }\n }\n\n > .active > a,\n > .active > span {\n &,\n &:hover,\n &:focus {\n z-index: 2;\n color: @pagination-active-color;\n background-color: @pagination-active-bg;\n border-color: @pagination-active-border;\n cursor: default;\n }\n }\n\n > .disabled {\n > span,\n > span:hover,\n > span:focus,\n > a,\n > a:hover,\n > a:focus {\n color: @pagination-disabled-color;\n background-color: @pagination-disabled-bg;\n border-color: @pagination-disabled-border;\n cursor: not-allowed;\n }\n }\n}\n\n// Sizing\n// --------------------------------------------------\n\n// Large\n.pagination-lg {\n .pagination-size(@padding-large-vertical; @padding-large-horizontal; @font-size-large; @border-radius-large);\n}\n\n// Small\n.pagination-sm {\n .pagination-size(@padding-small-vertical; @padding-small-horizontal; @font-size-small; @border-radius-small);\n}\n","// Pagination\n\n.pagination-size(@padding-vertical; @padding-horizontal; @font-size; @border-radius) {\n > li {\n > a,\n > span {\n padding: @padding-vertical @padding-horizontal;\n font-size: @font-size;\n }\n &:first-child {\n > a,\n > span {\n .border-left-radius(@border-radius);\n }\n }\n &:last-child {\n > a,\n > span {\n .border-right-radius(@border-radius);\n }\n }\n }\n}\n","//\n// Pager pagination\n// --------------------------------------------------\n\n\n.pager {\n padding-left: 0;\n margin: @line-height-computed 0;\n list-style: none;\n text-align: center;\n &:extend(.clearfix all);\n li {\n display: inline;\n > a,\n > span {\n display: inline-block;\n padding: 5px 14px;\n background-color: @pager-bg;\n border: 1px solid @pager-border;\n border-radius: @pager-border-radius;\n }\n\n > a:hover,\n > a:focus {\n text-decoration: none;\n background-color: @pager-hover-bg;\n }\n }\n\n .next {\n > a,\n > span {\n float: right;\n }\n }\n\n .previous {\n > a,\n > span {\n float: left;\n }\n }\n\n .disabled {\n > a,\n > a:hover,\n > a:focus,\n > span {\n color: @pager-disabled-color;\n background-color: @pager-bg;\n cursor: not-allowed;\n }\n }\n\n}\n","//\n// Labels\n// --------------------------------------------------\n\n.label {\n display: inline;\n padding: .2em .6em .3em;\n font-size: 75%;\n font-weight: bold;\n line-height: 1;\n color: @label-color;\n text-align: center;\n white-space: nowrap;\n vertical-align: baseline;\n border-radius: .25em;\n\n // Add hover effects, but only for links\n a& {\n &:hover,\n &:focus {\n color: @label-link-hover-color;\n text-decoration: none;\n cursor: pointer;\n }\n }\n\n // Empty labels collapse automatically (not available in IE8)\n &:empty {\n display: none;\n }\n\n // Quick fix for labels in buttons\n .btn & {\n position: relative;\n top: -1px;\n }\n}\n\n// Colors\n// Contextual variations (linked labels get darker on :hover)\n\n.label-default {\n .label-variant(@label-default-bg);\n}\n\n.label-primary {\n .label-variant(@label-primary-bg);\n}\n\n.label-success {\n .label-variant(@label-success-bg);\n}\n\n.label-info {\n .label-variant(@label-info-bg);\n}\n\n.label-warning {\n .label-variant(@label-warning-bg);\n}\n\n.label-danger {\n .label-variant(@label-danger-bg);\n}\n","// Labels\n\n.label-variant(@color) {\n background-color: @color;\n \n &[href] {\n &:hover,\n &:focus {\n background-color: darken(@color, 10%);\n }\n }\n}\n","//\n// Badges\n// --------------------------------------------------\n\n\n// Base class\n.badge {\n display: inline-block;\n min-width: 10px;\n padding: 3px 7px;\n font-size: @font-size-small;\n font-weight: @badge-font-weight;\n color: @badge-color;\n line-height: @badge-line-height;\n vertical-align: baseline;\n white-space: nowrap;\n text-align: center;\n background-color: @badge-bg;\n border-radius: @badge-border-radius;\n\n // Empty badges collapse automatically (not available in IE8)\n &:empty {\n display: none;\n }\n\n // Quick fix for badges in buttons\n .btn & {\n position: relative;\n top: -1px;\n }\n .btn-xs & {\n top: 0;\n padding: 1px 5px;\n }\n\n // Hover state, but only for links\n a& {\n &:hover,\n &:focus {\n color: @badge-link-hover-color;\n text-decoration: none;\n cursor: pointer;\n }\n }\n\n // Account for badges in navs\n a.list-group-item.active > &,\n .nav-pills > .active > a > & {\n color: @badge-active-color;\n background-color: @badge-active-bg;\n }\n .nav-pills > li > a > & {\n margin-left: 3px;\n }\n}\n","//\n// Jumbotron\n// --------------------------------------------------\n\n\n.jumbotron {\n padding: @jumbotron-padding;\n margin-bottom: @jumbotron-padding;\n color: @jumbotron-color;\n background-color: @jumbotron-bg;\n\n h1,\n .h1 {\n color: @jumbotron-heading-color;\n }\n p {\n margin-bottom: (@jumbotron-padding / 2);\n font-size: @jumbotron-font-size;\n font-weight: 200;\n }\n\n > hr {\n border-top-color: darken(@jumbotron-bg, 10%);\n }\n\n .container & {\n border-radius: @border-radius-large; // Only round corners at higher resolutions if contained in a container\n }\n\n .container {\n max-width: 100%;\n }\n\n @media screen and (min-width: @screen-sm-min) {\n padding-top: (@jumbotron-padding * 1.6);\n padding-bottom: (@jumbotron-padding * 1.6);\n\n .container & {\n padding-left: (@jumbotron-padding * 2);\n padding-right: (@jumbotron-padding * 2);\n }\n\n h1,\n .h1 {\n font-size: (@font-size-base * 4.5);\n }\n }\n}\n","//\n// Thumbnails\n// --------------------------------------------------\n\n\n// Mixin and adjust the regular image class\n.thumbnail {\n display: block;\n padding: @thumbnail-padding;\n margin-bottom: @line-height-computed;\n line-height: @line-height-base;\n background-color: @thumbnail-bg;\n border: 1px solid @thumbnail-border;\n border-radius: @thumbnail-border-radius;\n .transition(all .2s ease-in-out);\n\n > img,\n a > img {\n &:extend(.img-responsive);\n margin-left: auto;\n margin-right: auto;\n }\n\n // Add a hover state for linked versions only\n a&:hover,\n a&:focus,\n a&.active {\n border-color: @link-color;\n }\n\n // Image captions\n .caption {\n padding: @thumbnail-caption-padding;\n color: @thumbnail-caption-color;\n }\n}\n","//\n// Alerts\n// --------------------------------------------------\n\n\n// Base styles\n// -------------------------\n\n.alert {\n padding: @alert-padding;\n margin-bottom: @line-height-computed;\n border: 1px solid transparent;\n border-radius: @alert-border-radius;\n\n // Headings for larger alerts\n h4 {\n margin-top: 0;\n // Specified for the h4 to prevent conflicts of changing @headings-color\n color: inherit;\n }\n // Provide class for links that match alerts\n .alert-link {\n font-weight: @alert-link-font-weight;\n }\n\n // Improve alignment and spacing of inner content\n > p,\n > ul {\n margin-bottom: 0;\n }\n > p + p {\n margin-top: 5px;\n }\n}\n\n// Dismissible alerts\n//\n// Expand the right padding and account for the close button's positioning.\n\n.alert-dismissable, // The misspelled .alert-dismissable was deprecated in 3.2.0.\n.alert-dismissible {\n padding-right: (@alert-padding + 20);\n\n // Adjust close link position\n .close {\n position: relative;\n top: -2px;\n right: -21px;\n color: inherit;\n }\n}\n\n// Alternate styles\n//\n// Generate contextual modifier classes for colorizing the alert.\n\n.alert-success {\n .alert-variant(@alert-success-bg; @alert-success-border; @alert-success-text);\n}\n.alert-info {\n .alert-variant(@alert-info-bg; @alert-info-border; @alert-info-text);\n}\n.alert-warning {\n .alert-variant(@alert-warning-bg; @alert-warning-border; @alert-warning-text);\n}\n.alert-danger {\n .alert-variant(@alert-danger-bg; @alert-danger-border; @alert-danger-text);\n}\n","// Alerts\n\n.alert-variant(@background; @border; @text-color) {\n background-color: @background;\n border-color: @border;\n color: @text-color;\n\n hr {\n border-top-color: darken(@border, 5%);\n }\n .alert-link {\n color: darken(@text-color, 10%);\n }\n}\n","//\n// Progress bars\n// --------------------------------------------------\n\n\n// Bar animations\n// -------------------------\n\n// WebKit\n@-webkit-keyframes progress-bar-stripes {\n from { background-position: 40px 0; }\n to { background-position: 0 0; }\n}\n\n// Spec and IE10+\n@keyframes progress-bar-stripes {\n from { background-position: 40px 0; }\n to { background-position: 0 0; }\n}\n\n\n\n// Bar itself\n// -------------------------\n\n// Outer container\n.progress {\n overflow: hidden;\n height: @line-height-computed;\n margin-bottom: @line-height-computed;\n background-color: @progress-bg;\n border-radius: @border-radius-base;\n .box-shadow(inset 0 1px 2px rgba(0,0,0,.1));\n}\n\n// Bar of progress\n.progress-bar {\n float: left;\n width: 0%;\n height: 100%;\n font-size: @font-size-small;\n line-height: @line-height-computed;\n color: @progress-bar-color;\n text-align: center;\n background-color: @progress-bar-bg;\n .box-shadow(inset 0 -1px 0 rgba(0,0,0,.15));\n .transition(width .6s ease);\n}\n\n// Striped bars\n//\n// `.progress-striped .progress-bar` is deprecated as of v3.2.0 in favor of the\n// `.progress-bar-striped` class, which you just add to an existing\n// `.progress-bar`.\n.progress-striped .progress-bar,\n.progress-bar-striped {\n #gradient > .striped();\n background-size: 40px 40px;\n}\n\n// Call animation for the active one\n//\n// `.progress.active .progress-bar` is deprecated as of v3.2.0 in favor of the\n// `.progress-bar.active` approach.\n.progress.active .progress-bar,\n.progress-bar.active {\n .animation(progress-bar-stripes 2s linear infinite);\n}\n\n// Account for lower percentages\n.progress-bar {\n &[aria-valuenow=\"1\"],\n &[aria-valuenow=\"2\"] {\n min-width: 30px;\n }\n\n &[aria-valuenow=\"0\"] {\n color: @gray-light;\n min-width: 30px;\n background-color: transparent;\n background-image: none;\n box-shadow: none;\n }\n}\n\n\n\n// Variations\n// -------------------------\n\n.progress-bar-success {\n .progress-bar-variant(@progress-bar-success-bg);\n}\n\n.progress-bar-info {\n .progress-bar-variant(@progress-bar-info-bg);\n}\n\n.progress-bar-warning {\n .progress-bar-variant(@progress-bar-warning-bg);\n}\n\n.progress-bar-danger {\n .progress-bar-variant(@progress-bar-danger-bg);\n}\n","// Gradients\n\n#gradient {\n\n // Horizontal gradient, from left to right\n //\n // Creates two color stops, start and end, by specifying a color and position for each color stop.\n // Color stops are not available in IE9 and below.\n .horizontal(@start-color: #555; @end-color: #333; @start-percent: 0%; @end-percent: 100%) {\n background-image: -webkit-linear-gradient(left, @start-color @start-percent, @end-color @end-percent); // Safari 5.1-6, Chrome 10+\n background-image: -o-linear-gradient(left, @start-color @start-percent, @end-color @end-percent); // Opera 12\n background-image: linear-gradient(to right, @start-color @start-percent, @end-color @end-percent); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+\n background-repeat: repeat-x;\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=1)\",argb(@start-color),argb(@end-color))); // IE9 and down\n }\n\n // Vertical gradient, from top to bottom\n //\n // Creates two color stops, start and end, by specifying a color and position for each color stop.\n // Color stops are not available in IE9 and below.\n .vertical(@start-color: #555; @end-color: #333; @start-percent: 0%; @end-percent: 100%) {\n background-image: -webkit-linear-gradient(top, @start-color @start-percent, @end-color @end-percent); // Safari 5.1-6, Chrome 10+\n background-image: -o-linear-gradient(top, @start-color @start-percent, @end-color @end-percent); // Opera 12\n background-image: linear-gradient(to bottom, @start-color @start-percent, @end-color @end-percent); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+\n background-repeat: repeat-x;\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=0)\",argb(@start-color),argb(@end-color))); // IE9 and down\n }\n\n .directional(@start-color: #555; @end-color: #333; @deg: 45deg) {\n background-repeat: repeat-x;\n background-image: -webkit-linear-gradient(@deg, @start-color, @end-color); // Safari 5.1-6, Chrome 10+\n background-image: -o-linear-gradient(@deg, @start-color, @end-color); // Opera 12\n background-image: linear-gradient(@deg, @start-color, @end-color); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+\n }\n .horizontal-three-colors(@start-color: #00b3ee; @mid-color: #7a43b6; @color-stop: 50%; @end-color: #c3325f) {\n background-image: -webkit-linear-gradient(left, @start-color, @mid-color @color-stop, @end-color);\n background-image: -o-linear-gradient(left, @start-color, @mid-color @color-stop, @end-color);\n background-image: linear-gradient(to right, @start-color, @mid-color @color-stop, @end-color);\n background-repeat: no-repeat;\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=1)\",argb(@start-color),argb(@end-color))); // IE9 and down, gets no color-stop at all for proper fallback\n }\n .vertical-three-colors(@start-color: #00b3ee; @mid-color: #7a43b6; @color-stop: 50%; @end-color: #c3325f) {\n background-image: -webkit-linear-gradient(@start-color, @mid-color @color-stop, @end-color);\n background-image: -o-linear-gradient(@start-color, @mid-color @color-stop, @end-color);\n background-image: linear-gradient(@start-color, @mid-color @color-stop, @end-color);\n background-repeat: no-repeat;\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=0)\",argb(@start-color),argb(@end-color))); // IE9 and down, gets no color-stop at all for proper fallback\n }\n .radial(@inner-color: #555; @outer-color: #333) {\n background-image: -webkit-radial-gradient(circle, @inner-color, @outer-color);\n background-image: radial-gradient(circle, @inner-color, @outer-color);\n background-repeat: no-repeat;\n }\n .striped(@color: rgba(255,255,255,.15); @angle: 45deg) {\n background-image: -webkit-linear-gradient(@angle, @color 25%, transparent 25%, transparent 50%, @color 50%, @color 75%, transparent 75%, transparent);\n background-image: -o-linear-gradient(@angle, @color 25%, transparent 25%, transparent 50%, @color 50%, @color 75%, transparent 75%, transparent);\n background-image: linear-gradient(@angle, @color 25%, transparent 25%, transparent 50%, @color 50%, @color 75%, transparent 75%, transparent);\n }\n}\n","// Progress bars\n\n.progress-bar-variant(@color) {\n background-color: @color;\n\n // Deprecated parent class requirement as of v3.2.0\n .progress-striped & {\n #gradient > .striped();\n }\n}\n","// Media objects\n// Source: http://stubbornella.org/content/?p=497\n// --------------------------------------------------\n\n\n// Common styles\n// -------------------------\n\n// Clear the floats\n.media,\n.media-body {\n overflow: hidden;\n zoom: 1;\n}\n\n// Proper spacing between instances of .media\n.media,\n.media .media {\n margin-top: 15px;\n}\n.media:first-child {\n margin-top: 0;\n}\n\n// For images and videos, set to block\n.media-object {\n display: block;\n}\n\n// Reset margins on headings for tighter default spacing\n.media-heading {\n margin: 0 0 5px;\n}\n\n\n// Media image alignment\n// -------------------------\n\n.media {\n > .pull-left {\n margin-right: 10px;\n }\n > .pull-right {\n margin-left: 10px;\n }\n}\n\n\n// Media list variation\n// -------------------------\n\n// Undo default ul/ol styles\n.media-list {\n padding-left: 0;\n list-style: none;\n}\n","//\n// List groups\n// --------------------------------------------------\n\n\n// Base class\n//\n// Easily usable on <ul>, <ol>, or <div>.\n\n.list-group {\n // No need to set list-style: none; since .list-group-item is block level\n margin-bottom: 20px;\n padding-left: 0; // reset padding because ul and ol\n}\n\n\n// Individual list items\n//\n// Use on `li`s or `div`s within the `.list-group` parent.\n\n.list-group-item {\n position: relative;\n display: block;\n padding: 10px 15px;\n // Place the border on the list items and negative margin up for better styling\n margin-bottom: -1px;\n background-color: @list-group-bg;\n border: 1px solid @list-group-border;\n\n // Round the first and last items\n &:first-child {\n .border-top-radius(@list-group-border-radius);\n }\n &:last-child {\n margin-bottom: 0;\n .border-bottom-radius(@list-group-border-radius);\n }\n\n // Align badges within list items\n > .badge {\n float: right;\n }\n > .badge + .badge {\n margin-right: 5px;\n }\n}\n\n\n// Linked list items\n//\n// Use anchor elements instead of `li`s or `div`s to create linked list items.\n// Includes an extra `.active` modifier class for showing selected items.\n\na.list-group-item {\n color: @list-group-link-color;\n\n .list-group-item-heading {\n color: @list-group-link-heading-color;\n }\n\n // Hover state\n &:hover,\n &:focus {\n text-decoration: none;\n color: @list-group-link-hover-color;\n background-color: @list-group-hover-bg;\n }\n}\n\n.list-group-item {\n // Disabled state\n &.disabled,\n &.disabled:hover,\n &.disabled:focus {\n background-color: @list-group-disabled-bg;\n color: @list-group-disabled-color;\n\n // Force color to inherit for custom content\n .list-group-item-heading {\n color: inherit;\n }\n .list-group-item-text {\n color: @list-group-disabled-text-color;\n }\n }\n\n // Active class on item itself, not parent\n &.active,\n &.active:hover,\n &.active:focus {\n z-index: 2; // Place active items above their siblings for proper border styling\n color: @list-group-active-color;\n background-color: @list-group-active-bg;\n border-color: @list-group-active-border;\n\n // Force color to inherit for custom content\n .list-group-item-heading,\n .list-group-item-heading > small,\n .list-group-item-heading > .small {\n color: inherit;\n }\n .list-group-item-text {\n color: @list-group-active-text-color;\n }\n }\n}\n\n\n// Contextual variants\n//\n// Add modifier classes to change text and background color on individual items.\n// Organizationally, this must come after the `:hover` states.\n\n.list-group-item-variant(success; @state-success-bg; @state-success-text);\n.list-group-item-variant(info; @state-info-bg; @state-info-text);\n.list-group-item-variant(warning; @state-warning-bg; @state-warning-text);\n.list-group-item-variant(danger; @state-danger-bg; @state-danger-text);\n\n\n// Custom content options\n//\n// Extra classes for creating well-formatted content within `.list-group-item`s.\n\n.list-group-item-heading {\n margin-top: 0;\n margin-bottom: 5px;\n}\n.list-group-item-text {\n margin-bottom: 0;\n line-height: 1.3;\n}\n","// List Groups\n\n.list-group-item-variant(@state; @background; @color) {\n .list-group-item-@{state} {\n color: @color;\n background-color: @background;\n\n a& {\n color: @color;\n\n .list-group-item-heading {\n color: inherit;\n }\n\n &:hover,\n &:focus {\n color: @color;\n background-color: darken(@background, 5%);\n }\n &.active,\n &.active:hover,\n &.active:focus {\n color: #fff;\n background-color: @color;\n border-color: @color;\n }\n }\n }\n}\n","//\n// Panels\n// --------------------------------------------------\n\n\n// Base class\n.panel {\n margin-bottom: @line-height-computed;\n background-color: @panel-bg;\n border: 1px solid transparent;\n border-radius: @panel-border-radius;\n .box-shadow(0 1px 1px rgba(0,0,0,.05));\n}\n\n// Panel contents\n.panel-body {\n padding: @panel-body-padding;\n &:extend(.clearfix all);\n}\n\n// Optional heading\n.panel-heading {\n padding: @panel-heading-padding;\n border-bottom: 1px solid transparent;\n .border-top-radius((@panel-border-radius - 1));\n\n > .dropdown .dropdown-toggle {\n color: inherit;\n }\n}\n\n// Within heading, strip any `h*` tag of its default margins for spacing.\n.panel-title {\n margin-top: 0;\n margin-bottom: 0;\n font-size: ceil((@font-size-base * 1.125));\n color: inherit;\n\n > a {\n color: inherit;\n }\n}\n\n// Optional footer (stays gray in every modifier class)\n.panel-footer {\n padding: @panel-footer-padding;\n background-color: @panel-footer-bg;\n border-top: 1px solid @panel-inner-border;\n .border-bottom-radius((@panel-border-radius - 1));\n}\n\n\n// List groups in panels\n//\n// By default, space out list group content from panel headings to account for\n// any kind of custom content between the two.\n\n.panel {\n > .list-group {\n margin-bottom: 0;\n\n .list-group-item {\n border-width: 1px 0;\n border-radius: 0;\n }\n\n // Add border top radius for first one\n &:first-child {\n .list-group-item:first-child {\n border-top: 0;\n .border-top-radius((@panel-border-radius - 1));\n }\n }\n // Add border bottom radius for last one\n &:last-child {\n .list-group-item:last-child {\n border-bottom: 0;\n .border-bottom-radius((@panel-border-radius - 1));\n }\n }\n }\n}\n// Collapse space between when there's no additional content.\n.panel-heading + .list-group {\n .list-group-item:first-child {\n border-top-width: 0;\n }\n}\n.list-group + .panel-footer {\n border-top-width: 0;\n}\n\n// Tables in panels\n//\n// Place a non-bordered `.table` within a panel (not within a `.panel-body`) and\n// watch it go full width.\n\n.panel {\n > .table,\n > .table-responsive > .table,\n > .panel-collapse > .table {\n margin-bottom: 0;\n }\n // Add border top radius for first one\n > .table:first-child,\n > .table-responsive:first-child > .table:first-child {\n .border-top-radius((@panel-border-radius - 1));\n\n > thead:first-child,\n > tbody:first-child {\n > tr:first-child {\n td:first-child,\n th:first-child {\n border-top-left-radius: (@panel-border-radius - 1);\n }\n td:last-child,\n th:last-child {\n border-top-right-radius: (@panel-border-radius - 1);\n }\n }\n }\n }\n // Add border bottom radius for last one\n > .table:last-child,\n > .table-responsive:last-child > .table:last-child {\n .border-bottom-radius((@panel-border-radius - 1));\n\n > tbody:last-child,\n > tfoot:last-child {\n > tr:last-child {\n td:first-child,\n th:first-child {\n border-bottom-left-radius: (@panel-border-radius - 1);\n }\n td:last-child,\n th:last-child {\n border-bottom-right-radius: (@panel-border-radius - 1);\n }\n }\n }\n }\n > .panel-body + .table,\n > .panel-body + .table-responsive {\n border-top: 1px solid @table-border-color;\n }\n > .table > tbody:first-child > tr:first-child th,\n > .table > tbody:first-child > tr:first-child td {\n border-top: 0;\n }\n > .table-bordered,\n > .table-responsive > .table-bordered {\n border: 0;\n > thead,\n > tbody,\n > tfoot {\n > tr {\n > th:first-child,\n > td:first-child {\n border-left: 0;\n }\n > th:last-child,\n > td:last-child {\n border-right: 0;\n }\n }\n }\n > thead,\n > tbody {\n > tr:first-child {\n > td,\n > th {\n border-bottom: 0;\n }\n }\n }\n > tbody,\n > tfoot {\n > tr:last-child {\n > td,\n > th {\n border-bottom: 0;\n }\n }\n }\n }\n > .table-responsive {\n border: 0;\n margin-bottom: 0;\n }\n}\n\n\n// Collapsable panels (aka, accordion)\n//\n// Wrap a series of panels in `.panel-group` to turn them into an accordion with\n// the help of our collapse JavaScript plugin.\n\n.panel-group {\n margin-bottom: @line-height-computed;\n\n // Tighten up margin so it's only between panels\n .panel {\n margin-bottom: 0;\n border-radius: @panel-border-radius;\n + .panel {\n margin-top: 5px;\n }\n }\n\n .panel-heading {\n border-bottom: 0;\n + .panel-collapse > .panel-body {\n border-top: 1px solid @panel-inner-border;\n }\n }\n .panel-footer {\n border-top: 0;\n + .panel-collapse .panel-body {\n border-bottom: 1px solid @panel-inner-border;\n }\n }\n}\n\n\n// Contextual variations\n.panel-default {\n .panel-variant(@panel-default-border; @panel-default-text; @panel-default-heading-bg; @panel-default-border);\n}\n.panel-primary {\n .panel-variant(@panel-primary-border; @panel-primary-text; @panel-primary-heading-bg; @panel-primary-border);\n}\n.panel-success {\n .panel-variant(@panel-success-border; @panel-success-text; @panel-success-heading-bg; @panel-success-border);\n}\n.panel-info {\n .panel-variant(@panel-info-border; @panel-info-text; @panel-info-heading-bg; @panel-info-border);\n}\n.panel-warning {\n .panel-variant(@panel-warning-border; @panel-warning-text; @panel-warning-heading-bg; @panel-warning-border);\n}\n.panel-danger {\n .panel-variant(@panel-danger-border; @panel-danger-text; @panel-danger-heading-bg; @panel-danger-border);\n}\n","// Panels\n\n.panel-variant(@border; @heading-text-color; @heading-bg-color; @heading-border) {\n border-color: @border;\n\n & > .panel-heading {\n color: @heading-text-color;\n background-color: @heading-bg-color;\n border-color: @heading-border;\n\n + .panel-collapse > .panel-body {\n border-top-color: @border;\n }\n .badge {\n color: @heading-bg-color;\n background-color: @heading-text-color;\n }\n }\n & > .panel-footer {\n + .panel-collapse > .panel-body {\n border-bottom-color: @border;\n }\n }\n}\n","// Embeds responsive\n//\n// Credit: Nicolas Gallagher and SUIT CSS.\n\n.embed-responsive {\n position: relative;\n display: block;\n height: 0;\n padding: 0;\n overflow: hidden;\n\n .embed-responsive-item,\n iframe,\n embed,\n object {\n position: absolute;\n top: 0;\n left: 0;\n bottom: 0;\n height: 100%;\n width: 100%;\n border: 0;\n }\n\n // Modifier class for 16:9 aspect ratio\n &.embed-responsive-16by9 {\n padding-bottom: 56.25%;\n }\n\n // Modifier class for 4:3 aspect ratio\n &.embed-responsive-4by3 {\n padding-bottom: 75%;\n }\n}\n","//\n// Wells\n// --------------------------------------------------\n\n\n// Base class\n.well {\n min-height: 20px;\n padding: 19px;\n margin-bottom: 20px;\n background-color: @well-bg;\n border: 1px solid @well-border;\n border-radius: @border-radius-base;\n .box-shadow(inset 0 1px 1px rgba(0,0,0,.05));\n blockquote {\n border-color: #ddd;\n border-color: rgba(0,0,0,.15);\n }\n}\n\n// Sizes\n.well-lg {\n padding: 24px;\n border-radius: @border-radius-large;\n}\n.well-sm {\n padding: 9px;\n border-radius: @border-radius-small;\n}\n","//\n// Close icons\n// --------------------------------------------------\n\n\n.close {\n float: right;\n font-size: (@font-size-base * 1.5);\n font-weight: @close-font-weight;\n line-height: 1;\n color: @close-color;\n text-shadow: @close-text-shadow;\n .opacity(.2);\n\n &:hover,\n &:focus {\n color: @close-color;\n text-decoration: none;\n cursor: pointer;\n .opacity(.5);\n }\n\n // Additional properties for button version\n // iOS requires the button element instead of an anchor tag.\n // If you want the anchor version, it requires `href=\"#\"`.\n button& {\n padding: 0;\n cursor: pointer;\n background: transparent;\n border: 0;\n -webkit-appearance: none;\n }\n}\n","//\n// Modals\n// --------------------------------------------------\n\n// .modal-open - body class for killing the scroll\n// .modal - container to scroll within\n// .modal-dialog - positioning shell for the actual modal\n// .modal-content - actual modal w/ bg and corners and shit\n\n// Kill the scroll on the body\n.modal-open {\n overflow: hidden;\n}\n\n// Container that the modal scrolls within\n.modal {\n display: none;\n overflow: hidden;\n position: fixed;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: @zindex-modal;\n -webkit-overflow-scrolling: touch;\n\n // Prevent Chrome on Windows from adding a focus outline. For details, see\n // https://github.com/twbs/bootstrap/pull/10951.\n outline: 0;\n\n // When fading in the modal, animate it to slide down\n &.fade .modal-dialog {\n .translate3d(0, -25%, 0);\n .transition-transform(~\"0.3s ease-out\");\n }\n &.in .modal-dialog { .translate3d(0, 0, 0) }\n}\n.modal-open .modal {\n overflow-x: hidden;\n overflow-y: auto;\n}\n\n// Shell div to position the modal with bottom padding\n.modal-dialog {\n position: relative;\n width: auto;\n margin: 10px;\n}\n\n// Actual modal\n.modal-content {\n position: relative;\n background-color: @modal-content-bg;\n border: 1px solid @modal-content-fallback-border-color; //old browsers fallback (ie8 etc)\n border: 1px solid @modal-content-border-color;\n border-radius: @border-radius-large;\n .box-shadow(0 3px 9px rgba(0,0,0,.5));\n background-clip: padding-box;\n // Remove focus outline from opened modal\n outline: 0;\n}\n\n// Modal background\n.modal-backdrop {\n position: fixed;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: @zindex-modal-background;\n background-color: @modal-backdrop-bg;\n // Fade for backdrop\n &.fade { .opacity(0); }\n &.in { .opacity(@modal-backdrop-opacity); }\n}\n\n// Modal header\n// Top section of the modal w/ title and dismiss\n.modal-header {\n padding: @modal-title-padding;\n border-bottom: 1px solid @modal-header-border-color;\n min-height: (@modal-title-padding + @modal-title-line-height);\n}\n// Close icon\n.modal-header .close {\n margin-top: -2px;\n}\n\n// Title text within header\n.modal-title {\n margin: 0;\n line-height: @modal-title-line-height;\n}\n\n// Modal body\n// Where all modal content resides (sibling of .modal-header and .modal-footer)\n.modal-body {\n position: relative;\n padding: @modal-inner-padding;\n}\n\n// Footer (for actions)\n.modal-footer {\n padding: @modal-inner-padding;\n text-align: right; // right align buttons\n border-top: 1px solid @modal-footer-border-color;\n &:extend(.clearfix all); // clear it in case folks use .pull-* classes on buttons\n\n // Properly space out buttons\n .btn + .btn {\n margin-left: 5px;\n margin-bottom: 0; // account for input[type=\"submit\"] which gets the bottom margin like all other inputs\n }\n // but override that for button groups\n .btn-group .btn + .btn {\n margin-left: -1px;\n }\n // and override it for block buttons as well\n .btn-block + .btn-block {\n margin-left: 0;\n }\n}\n\n// Measure scrollbar width for padding body during modal show/hide\n.modal-scrollbar-measure {\n position: absolute;\n top: -9999px;\n width: 50px;\n height: 50px;\n overflow: scroll;\n}\n\n// Scale up the modal\n@media (min-width: @screen-sm-min) {\n // Automatically set modal's width for larger viewports\n .modal-dialog {\n width: @modal-md;\n margin: 30px auto;\n }\n .modal-content {\n .box-shadow(0 5px 15px rgba(0,0,0,.5));\n }\n\n // Modal sizes\n .modal-sm { width: @modal-sm; }\n}\n\n@media (min-width: @screen-md-min) {\n .modal-lg { width: @modal-lg; }\n}\n","//\n// Tooltips\n// --------------------------------------------------\n\n\n// Base class\n.tooltip {\n position: absolute;\n z-index: @zindex-tooltip;\n display: block;\n visibility: visible;\n font-size: @font-size-small;\n line-height: 1.4;\n .opacity(0);\n\n &.in { .opacity(@tooltip-opacity); }\n &.top { margin-top: -3px; padding: @tooltip-arrow-width 0; }\n &.right { margin-left: 3px; padding: 0 @tooltip-arrow-width; }\n &.bottom { margin-top: 3px; padding: @tooltip-arrow-width 0; }\n &.left { margin-left: -3px; padding: 0 @tooltip-arrow-width; }\n}\n\n// Wrapper for the tooltip content\n.tooltip-inner {\n max-width: @tooltip-max-width;\n padding: 3px 8px;\n color: @tooltip-color;\n text-align: center;\n text-decoration: none;\n background-color: @tooltip-bg;\n border-radius: @border-radius-base;\n}\n\n// Arrows\n.tooltip-arrow {\n position: absolute;\n width: 0;\n height: 0;\n border-color: transparent;\n border-style: solid;\n}\n.tooltip {\n &.top .tooltip-arrow {\n bottom: 0;\n left: 50%;\n margin-left: -@tooltip-arrow-width;\n border-width: @tooltip-arrow-width @tooltip-arrow-width 0;\n border-top-color: @tooltip-arrow-color;\n }\n &.top-left .tooltip-arrow {\n bottom: 0;\n left: @tooltip-arrow-width;\n border-width: @tooltip-arrow-width @tooltip-arrow-width 0;\n border-top-color: @tooltip-arrow-color;\n }\n &.top-right .tooltip-arrow {\n bottom: 0;\n right: @tooltip-arrow-width;\n border-width: @tooltip-arrow-width @tooltip-arrow-width 0;\n border-top-color: @tooltip-arrow-color;\n }\n &.right .tooltip-arrow {\n top: 50%;\n left: 0;\n margin-top: -@tooltip-arrow-width;\n border-width: @tooltip-arrow-width @tooltip-arrow-width @tooltip-arrow-width 0;\n border-right-color: @tooltip-arrow-color;\n }\n &.left .tooltip-arrow {\n top: 50%;\n right: 0;\n margin-top: -@tooltip-arrow-width;\n border-width: @tooltip-arrow-width 0 @tooltip-arrow-width @tooltip-arrow-width;\n border-left-color: @tooltip-arrow-color;\n }\n &.bottom .tooltip-arrow {\n top: 0;\n left: 50%;\n margin-left: -@tooltip-arrow-width;\n border-width: 0 @tooltip-arrow-width @tooltip-arrow-width;\n border-bottom-color: @tooltip-arrow-color;\n }\n &.bottom-left .tooltip-arrow {\n top: 0;\n left: @tooltip-arrow-width;\n border-width: 0 @tooltip-arrow-width @tooltip-arrow-width;\n border-bottom-color: @tooltip-arrow-color;\n }\n &.bottom-right .tooltip-arrow {\n top: 0;\n right: @tooltip-arrow-width;\n border-width: 0 @tooltip-arrow-width @tooltip-arrow-width;\n border-bottom-color: @tooltip-arrow-color;\n }\n}\n","//\n// Popovers\n// --------------------------------------------------\n\n\n.popover {\n position: absolute;\n top: 0;\n left: 0;\n z-index: @zindex-popover;\n display: none;\n max-width: @popover-max-width;\n padding: 1px;\n text-align: left; // Reset given new insertion method\n background-color: @popover-bg;\n background-clip: padding-box;\n border: 1px solid @popover-fallback-border-color;\n border: 1px solid @popover-border-color;\n border-radius: @border-radius-large;\n .box-shadow(0 5px 10px rgba(0,0,0,.2));\n\n // Overrides for proper insertion\n white-space: normal;\n\n // Offset the popover to account for the popover arrow\n &.top { margin-top: -@popover-arrow-width; }\n &.right { margin-left: @popover-arrow-width; }\n &.bottom { margin-top: @popover-arrow-width; }\n &.left { margin-left: -@popover-arrow-width; }\n}\n\n.popover-title {\n margin: 0; // reset heading margin\n padding: 8px 14px;\n font-size: @font-size-base;\n font-weight: normal;\n line-height: 18px;\n background-color: @popover-title-bg;\n border-bottom: 1px solid darken(@popover-title-bg, 5%);\n border-radius: (@border-radius-large - 1) (@border-radius-large - 1) 0 0;\n}\n\n.popover-content {\n padding: 9px 14px;\n}\n\n// Arrows\n//\n// .arrow is outer, .arrow:after is inner\n\n.popover > .arrow {\n &,\n &:after {\n position: absolute;\n display: block;\n width: 0;\n height: 0;\n border-color: transparent;\n border-style: solid;\n }\n}\n.popover > .arrow {\n border-width: @popover-arrow-outer-width;\n}\n.popover > .arrow:after {\n border-width: @popover-arrow-width;\n content: \"\";\n}\n\n.popover {\n &.top > .arrow {\n left: 50%;\n margin-left: -@popover-arrow-outer-width;\n border-bottom-width: 0;\n border-top-color: @popover-arrow-outer-fallback-color; // IE8 fallback\n border-top-color: @popover-arrow-outer-color;\n bottom: -@popover-arrow-outer-width;\n &:after {\n content: \" \";\n bottom: 1px;\n margin-left: -@popover-arrow-width;\n border-bottom-width: 0;\n border-top-color: @popover-arrow-color;\n }\n }\n &.right > .arrow {\n top: 50%;\n left: -@popover-arrow-outer-width;\n margin-top: -@popover-arrow-outer-width;\n border-left-width: 0;\n border-right-color: @popover-arrow-outer-fallback-color; // IE8 fallback\n border-right-color: @popover-arrow-outer-color;\n &:after {\n content: \" \";\n left: 1px;\n bottom: -@popover-arrow-width;\n border-left-width: 0;\n border-right-color: @popover-arrow-color;\n }\n }\n &.bottom > .arrow {\n left: 50%;\n margin-left: -@popover-arrow-outer-width;\n border-top-width: 0;\n border-bottom-color: @popover-arrow-outer-fallback-color; // IE8 fallback\n border-bottom-color: @popover-arrow-outer-color;\n top: -@popover-arrow-outer-width;\n &:after {\n content: \" \";\n top: 1px;\n margin-left: -@popover-arrow-width;\n border-top-width: 0;\n border-bottom-color: @popover-arrow-color;\n }\n }\n\n &.left > .arrow {\n top: 50%;\n right: -@popover-arrow-outer-width;\n margin-top: -@popover-arrow-outer-width;\n border-right-width: 0;\n border-left-color: @popover-arrow-outer-fallback-color; // IE8 fallback\n border-left-color: @popover-arrow-outer-color;\n &:after {\n content: \" \";\n right: 1px;\n border-right-width: 0;\n border-left-color: @popover-arrow-color;\n bottom: -@popover-arrow-width;\n }\n }\n\n}\n","//\n// Carousel\n// --------------------------------------------------\n\n\n// Wrapper for the slide container and indicators\n.carousel {\n position: relative;\n}\n\n.carousel-inner {\n position: relative;\n overflow: hidden;\n width: 100%;\n\n > .item {\n display: none;\n position: relative;\n .transition(.6s ease-in-out left);\n\n // Account for jankitude on images\n > img,\n > a > img {\n &:extend(.img-responsive);\n line-height: 1;\n }\n }\n\n > .active,\n > .next,\n > .prev {\n display: block;\n }\n\n > .active {\n left: 0;\n }\n\n > .next,\n > .prev {\n position: absolute;\n top: 0;\n width: 100%;\n }\n\n > .next {\n left: 100%;\n }\n > .prev {\n left: -100%;\n }\n > .next.left,\n > .prev.right {\n left: 0;\n }\n\n > .active.left {\n left: -100%;\n }\n > .active.right {\n left: 100%;\n }\n\n}\n\n// Left/right controls for nav\n// ---------------------------\n\n.carousel-control {\n position: absolute;\n top: 0;\n left: 0;\n bottom: 0;\n width: @carousel-control-width;\n .opacity(@carousel-control-opacity);\n font-size: @carousel-control-font-size;\n color: @carousel-control-color;\n text-align: center;\n text-shadow: @carousel-text-shadow;\n // We can't have this transition here because WebKit cancels the carousel\n // animation if you trip this while in the middle of another animation.\n\n // Set gradients for backgrounds\n &.left {\n #gradient > .horizontal(@start-color: rgba(0,0,0,.5); @end-color: rgba(0,0,0,.0001));\n }\n &.right {\n left: auto;\n right: 0;\n #gradient > .horizontal(@start-color: rgba(0,0,0,.0001); @end-color: rgba(0,0,0,.5));\n }\n\n // Hover/focus state\n &:hover,\n &:focus {\n outline: 0;\n color: @carousel-control-color;\n text-decoration: none;\n .opacity(.9);\n }\n\n // Toggles\n .icon-prev,\n .icon-next,\n .glyphicon-chevron-left,\n .glyphicon-chevron-right {\n position: absolute;\n top: 50%;\n z-index: 5;\n display: inline-block;\n }\n .icon-prev,\n .glyphicon-chevron-left {\n left: 50%;\n margin-left: -10px;\n }\n .icon-next,\n .glyphicon-chevron-right {\n right: 50%;\n margin-right: -10px;\n }\n .icon-prev,\n .icon-next {\n width: 20px;\n height: 20px;\n margin-top: -10px;\n font-family: serif;\n }\n\n\n .icon-prev {\n &:before {\n content: '\\2039';// SINGLE LEFT-POINTING ANGLE QUOTATION MARK (U+2039)\n }\n }\n .icon-next {\n &:before {\n content: '\\203a';// SINGLE RIGHT-POINTING ANGLE QUOTATION MARK (U+203A)\n }\n }\n}\n\n// Optional indicator pips\n//\n// Add an unordered list with the following class and add a list item for each\n// slide your carousel holds.\n\n.carousel-indicators {\n position: absolute;\n bottom: 10px;\n left: 50%;\n z-index: 15;\n width: 60%;\n margin-left: -30%;\n padding-left: 0;\n list-style: none;\n text-align: center;\n\n li {\n display: inline-block;\n width: 10px;\n height: 10px;\n margin: 1px;\n text-indent: -999px;\n border: 1px solid @carousel-indicator-border-color;\n border-radius: 10px;\n cursor: pointer;\n\n // IE8-9 hack for event handling\n //\n // Internet Explorer 8-9 does not support clicks on elements without a set\n // `background-color`. We cannot use `filter` since that's not viewed as a\n // background color by the browser. Thus, a hack is needed.\n //\n // For IE8, we set solid black as it doesn't support `rgba()`. For IE9, we\n // set alpha transparency for the best results possible.\n background-color: #000 \\9; // IE8\n background-color: rgba(0,0,0,0); // IE9\n }\n .active {\n margin: 0;\n width: 12px;\n height: 12px;\n background-color: @carousel-indicator-active-bg;\n }\n}\n\n// Optional captions\n// -----------------------------\n// Hidden by default for smaller viewports\n.carousel-caption {\n position: absolute;\n left: 15%;\n right: 15%;\n bottom: 20px;\n z-index: 10;\n padding-top: 20px;\n padding-bottom: 20px;\n color: @carousel-caption-color;\n text-align: center;\n text-shadow: @carousel-text-shadow;\n & .btn {\n text-shadow: none; // No shadow for button elements in carousel-caption\n }\n}\n\n\n// Scale up controls for tablets and up\n@media screen and (min-width: @screen-sm-min) {\n\n // Scale up the controls a smidge\n .carousel-control {\n .glyphicon-chevron-left,\n .glyphicon-chevron-right,\n .icon-prev,\n .icon-next {\n width: 30px;\n height: 30px;\n margin-top: -15px;\n font-size: 30px;\n }\n .glyphicon-chevron-left,\n .icon-prev {\n margin-left: -15px;\n }\n .glyphicon-chevron-right,\n .icon-next {\n margin-right: -15px;\n }\n }\n\n // Show and left align the captions\n .carousel-caption {\n left: 20%;\n right: 20%;\n padding-bottom: 30px;\n }\n\n // Move up the indicators\n .carousel-indicators {\n bottom: 20px;\n }\n}\n","// Clearfix\n//\n// For modern browsers\n// 1. The space content is one way to avoid an Opera bug when the\n// contenteditable attribute is included anywhere else in the document.\n// Otherwise it causes space to appear at the top and bottom of elements\n// that are clearfixed.\n// 2. The use of `table` rather than `block` is only necessary if using\n// `:before` to contain the top-margins of child elements.\n//\n// Source: http://nicolasgallagher.com/micro-clearfix-hack/\n\n.clearfix() {\n &:before,\n &:after {\n content: \" \"; // 1\n display: table; // 2\n }\n &:after {\n clear: both;\n }\n}\n","// Center-align a block level element\n\n.center-block() {\n display: block;\n margin-left: auto;\n margin-right: auto;\n}\n","// CSS image replacement\n//\n// Heads up! v3 launched with with only `.hide-text()`, but per our pattern for\n// mixins being reused as classes with the same name, this doesn't hold up. As\n// of v3.0.1 we have added `.text-hide()` and deprecated `.hide-text()`.\n//\n// Source: https://github.com/h5bp/html5-boilerplate/commit/aa0396eae757\n\n// Deprecated as of v3.0.1 (will be removed in v4)\n.hide-text() {\n font: ~\"0/0\" a;\n color: transparent;\n text-shadow: none;\n background-color: transparent;\n border: 0;\n}\n\n// New mixin to use as of v3.0.1\n.text-hide() {\n .hide-text();\n}\n","//\n// Responsive: Utility classes\n// --------------------------------------------------\n\n\n// IE10 in Windows (Phone) 8\n//\n// Support for responsive views via media queries is kind of borked in IE10, for\n// Surface/desktop in split view and for Windows Phone 8. This particular fix\n// must be accompanied by a snippet of JavaScript to sniff the user agent and\n// apply some conditional CSS to *only* the Surface/desktop Windows 8. Look at\n// our Getting Started page for more information on this bug.\n//\n// For more information, see the following:\n//\n// Issue: https://github.com/twbs/bootstrap/issues/10497\n// Docs: http://getbootstrap.com/getting-started/#support-ie10-width\n// Source: http://timkadlec.com/2013/01/windows-phone-8-and-device-width/\n// Source: http://timkadlec.com/2012/10/ie10-snap-mode-and-responsive-design/\n\n@-ms-viewport {\n width: device-width;\n}\n\n\n// Visibility utilities\n// Note: Deprecated .visible-xs, .visible-sm, .visible-md, and .visible-lg as of v3.2.0\n.visible-xs,\n.visible-sm,\n.visible-md,\n.visible-lg {\n .responsive-invisibility();\n}\n\n.visible-xs-block,\n.visible-xs-inline,\n.visible-xs-inline-block,\n.visible-sm-block,\n.visible-sm-inline,\n.visible-sm-inline-block,\n.visible-md-block,\n.visible-md-inline,\n.visible-md-inline-block,\n.visible-lg-block,\n.visible-lg-inline,\n.visible-lg-inline-block {\n display: none !important;\n}\n\n.visible-xs {\n @media (max-width: @screen-xs-max) {\n .responsive-visibility();\n }\n}\n.visible-xs-block {\n @media (max-width: @screen-xs-max) {\n display: block !important;\n }\n}\n.visible-xs-inline {\n @media (max-width: @screen-xs-max) {\n display: inline !important;\n }\n}\n.visible-xs-inline-block {\n @media (max-width: @screen-xs-max) {\n display: inline-block !important;\n }\n}\n\n.visible-sm {\n @media (min-width: @screen-sm-min) and (max-width: @screen-sm-max) {\n .responsive-visibility();\n }\n}\n.visible-sm-block {\n @media (min-width: @screen-sm-min) and (max-width: @screen-sm-max) {\n display: block !important;\n }\n}\n.visible-sm-inline {\n @media (min-width: @screen-sm-min) and (max-width: @screen-sm-max) {\n display: inline !important;\n }\n}\n.visible-sm-inline-block {\n @media (min-width: @screen-sm-min) and (max-width: @screen-sm-max) {\n display: inline-block !important;\n }\n}\n\n.visible-md {\n @media (min-width: @screen-md-min) and (max-width: @screen-md-max) {\n .responsive-visibility();\n }\n}\n.visible-md-block {\n @media (min-width: @screen-md-min) and (max-width: @screen-md-max) {\n display: block !important;\n }\n}\n.visible-md-inline {\n @media (min-width: @screen-md-min) and (max-width: @screen-md-max) {\n display: inline !important;\n }\n}\n.visible-md-inline-block {\n @media (min-width: @screen-md-min) and (max-width: @screen-md-max) {\n display: inline-block !important;\n }\n}\n\n.visible-lg {\n @media (min-width: @screen-lg-min) {\n .responsive-visibility();\n }\n}\n.visible-lg-block {\n @media (min-width: @screen-lg-min) {\n display: block !important;\n }\n}\n.visible-lg-inline {\n @media (min-width: @screen-lg-min) {\n display: inline !important;\n }\n}\n.visible-lg-inline-block {\n @media (min-width: @screen-lg-min) {\n display: inline-block !important;\n }\n}\n\n.hidden-xs {\n @media (max-width: @screen-xs-max) {\n .responsive-invisibility();\n }\n}\n.hidden-sm {\n @media (min-width: @screen-sm-min) and (max-width: @screen-sm-max) {\n .responsive-invisibility();\n }\n}\n.hidden-md {\n @media (min-width: @screen-md-min) and (max-width: @screen-md-max) {\n .responsive-invisibility();\n }\n}\n.hidden-lg {\n @media (min-width: @screen-lg-min) {\n .responsive-invisibility();\n }\n}\n\n\n// Print utilities\n//\n// Media queries are placed on the inside to be mixin-friendly.\n\n// Note: Deprecated .visible-print as of v3.2.0\n.visible-print {\n .responsive-invisibility();\n\n @media print {\n .responsive-visibility();\n }\n}\n.visible-print-block {\n display: none !important;\n\n @media print {\n display: block !important;\n }\n}\n.visible-print-inline {\n display: none !important;\n\n @media print {\n display: inline !important;\n }\n}\n.visible-print-inline-block {\n display: none !important;\n\n @media print {\n display: inline-block !important;\n }\n}\n\n.hidden-print {\n @media print {\n .responsive-invisibility();\n }\n}\n","// Responsive utilities\n\n//\n// More easily include all the states for responsive-utilities.less.\n.responsive-visibility() {\n display: block !important;\n table& { display: table; }\n tr& { display: table-row !important; }\n th&,\n td& { display: table-cell !important; }\n}\n\n.responsive-invisibility() {\n display: none !important;\n}\n"]} \ No newline at end of file diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/demultiplexing/html/bootstrap3/css/bootstrap.min.css b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/demultiplexing/html/bootstrap3/css/bootstrap.min.css deleted file mode 100644 index a9f35ceedfac7fc0559b121bed105eaf80f10bf2..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/demultiplexing/html/bootstrap3/css/bootstrap.min.css +++ /dev/null @@ -1,5 +0,0 @@ -/*! - * Bootstrap v3.2.0 (http://getbootstrap.com) - * Copyright 2011-2014 Twitter, Inc. - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) - *//*! normalize.css v3.0.1 | MIT License | git.io/normalize */html{font-family:sans-serif;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%}body{margin:0}article,aside,details,figcaption,figure,footer,header,hgroup,main,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block;vertical-align:baseline}audio:not([controls]){display:none;height:0}[hidden],template{display:none}a{background:0 0}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:700}dfn{font-style:italic}h1{margin:.67em 0;font-size:2em}mark{color:#000;background:#ff0}small{font-size:80%}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sup{top:-.5em}sub{bottom:-.25em}img{border:0}svg:not(:root){overflow:hidden}figure{margin:1em 40px}hr{height:0;-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box}pre{overflow:auto}code,kbd,pre,samp{font-family:monospace,monospace;font-size:1em}button,input,optgroup,select,textarea{margin:0;font:inherit;color:inherit}button{overflow:visible}button,select{text-transform:none}button,html input[type=button],input[type=reset],input[type=submit]{-webkit-appearance:button;cursor:pointer}button[disabled],html input[disabled]{cursor:default}button::-moz-focus-inner,input::-moz-focus-inner{padding:0;border:0}input{line-height:normal}input[type=checkbox],input[type=radio]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;padding:0}input[type=number]::-webkit-inner-spin-button,input[type=number]::-webkit-outer-spin-button{height:auto}input[type=search]{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;-webkit-appearance:textfield}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}fieldset{padding:.35em .625em .75em;margin:0 2px;border:1px solid silver}legend{padding:0;border:0}textarea{overflow:auto}optgroup{font-weight:700}table{border-spacing:0;border-collapse:collapse}td,th{padding:0}@media print{*{color:#000!important;text-shadow:none!important;background:transparent!important;-webkit-box-shadow:none!important;box-shadow:none!important}a,a:visited{text-decoration:underline}a[href]:after{content:" (" attr(href) ")"}abbr[title]:after{content:" (" attr(title) ")"}a[href^="javascript:"]:after,a[href^="#"]:after{content:""}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100%!important}p,h2,h3{orphans:3;widows:3}h2,h3{page-break-after:avoid}select{background:#fff!important}.navbar{display:none}.table td,.table th{background-color:#fff!important}.btn>.caret,.dropup>.btn>.caret{border-top-color:#000!important}.label{border:1px solid #000}.table{border-collapse:collapse!important}.table-bordered th,.table-bordered td{border:1px solid #ddd!important}}@font-face{font-family:'Glyphicons Halflings';src:url(../fonts/glyphicons-halflings-regular.eot);src:url(../fonts/glyphicons-halflings-regular.eot?#iefix) format('embedded-opentype'),url(../fonts/glyphicons-halflings-regular.woff) format('woff'),url(../fonts/glyphicons-halflings-regular.ttf) format('truetype'),url(../fonts/glyphicons-halflings-regular.svg#glyphicons_halflingsregular) format('svg')}.glyphicon{position:relative;top:1px;display:inline-block;font-family:'Glyphicons Halflings';font-style:normal;font-weight:400;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.glyphicon-asterisk:before{content:"\2a"}.glyphicon-plus:before{content:"\2b"}.glyphicon-euro:before{content:"\20ac"}.glyphicon-minus:before{content:"\2212"}.glyphicon-cloud:before{content:"\2601"}.glyphicon-envelope:before{content:"\2709"}.glyphicon-pencil:before{content:"\270f"}.glyphicon-glass:before{content:"\e001"}.glyphicon-music:before{content:"\e002"}.glyphicon-search:before{content:"\e003"}.glyphicon-heart:before{content:"\e005"}.glyphicon-star:before{content:"\e006"}.glyphicon-star-empty:before{content:"\e007"}.glyphicon-user:before{content:"\e008"}.glyphicon-film:before{content:"\e009"}.glyphicon-th-large:before{content:"\e010"}.glyphicon-th:before{content:"\e011"}.glyphicon-th-list:before{content:"\e012"}.glyphicon-ok:before{content:"\e013"}.glyphicon-remove:before{content:"\e014"}.glyphicon-zoom-in:before{content:"\e015"}.glyphicon-zoom-out:before{content:"\e016"}.glyphicon-off:before{content:"\e017"}.glyphicon-signal:before{content:"\e018"}.glyphicon-cog:before{content:"\e019"}.glyphicon-trash:before{content:"\e020"}.glyphicon-home:before{content:"\e021"}.glyphicon-file:before{content:"\e022"}.glyphicon-time:before{content:"\e023"}.glyphicon-road:before{content:"\e024"}.glyphicon-download-alt:before{content:"\e025"}.glyphicon-download:before{content:"\e026"}.glyphicon-upload:before{content:"\e027"}.glyphicon-inbox:before{content:"\e028"}.glyphicon-play-circle:before{content:"\e029"}.glyphicon-repeat:before{content:"\e030"}.glyphicon-refresh:before{content:"\e031"}.glyphicon-list-alt:before{content:"\e032"}.glyphicon-lock:before{content:"\e033"}.glyphicon-flag:before{content:"\e034"}.glyphicon-headphones:before{content:"\e035"}.glyphicon-volume-off:before{content:"\e036"}.glyphicon-volume-down:before{content:"\e037"}.glyphicon-volume-up:before{content:"\e038"}.glyphicon-qrcode:before{content:"\e039"}.glyphicon-barcode:before{content:"\e040"}.glyphicon-tag:before{content:"\e041"}.glyphicon-tags:before{content:"\e042"}.glyphicon-book:before{content:"\e043"}.glyphicon-bookmark:before{content:"\e044"}.glyphicon-print:before{content:"\e045"}.glyphicon-camera:before{content:"\e046"}.glyphicon-font:before{content:"\e047"}.glyphicon-bold:before{content:"\e048"}.glyphicon-italic:before{content:"\e049"}.glyphicon-text-height:before{content:"\e050"}.glyphicon-text-width:before{content:"\e051"}.glyphicon-align-left:before{content:"\e052"}.glyphicon-align-center:before{content:"\e053"}.glyphicon-align-right:before{content:"\e054"}.glyphicon-align-justify:before{content:"\e055"}.glyphicon-list:before{content:"\e056"}.glyphicon-indent-left:before{content:"\e057"}.glyphicon-indent-right:before{content:"\e058"}.glyphicon-facetime-video:before{content:"\e059"}.glyphicon-picture:before{content:"\e060"}.glyphicon-map-marker:before{content:"\e062"}.glyphicon-adjust:before{content:"\e063"}.glyphicon-tint:before{content:"\e064"}.glyphicon-edit:before{content:"\e065"}.glyphicon-share:before{content:"\e066"}.glyphicon-check:before{content:"\e067"}.glyphicon-move:before{content:"\e068"}.glyphicon-step-backward:before{content:"\e069"}.glyphicon-fast-backward:before{content:"\e070"}.glyphicon-backward:before{content:"\e071"}.glyphicon-play:before{content:"\e072"}.glyphicon-pause:before{content:"\e073"}.glyphicon-stop:before{content:"\e074"}.glyphicon-forward:before{content:"\e075"}.glyphicon-fast-forward:before{content:"\e076"}.glyphicon-step-forward:before{content:"\e077"}.glyphicon-eject:before{content:"\e078"}.glyphicon-chevron-left:before{content:"\e079"}.glyphicon-chevron-right:before{content:"\e080"}.glyphicon-plus-sign:before{content:"\e081"}.glyphicon-minus-sign:before{content:"\e082"}.glyphicon-remove-sign:before{content:"\e083"}.glyphicon-ok-sign:before{content:"\e084"}.glyphicon-question-sign:before{content:"\e085"}.glyphicon-info-sign:before{content:"\e086"}.glyphicon-screenshot:before{content:"\e087"}.glyphicon-remove-circle:before{content:"\e088"}.glyphicon-ok-circle:before{content:"\e089"}.glyphicon-ban-circle:before{content:"\e090"}.glyphicon-arrow-left:before{content:"\e091"}.glyphicon-arrow-right:before{content:"\e092"}.glyphicon-arrow-up:before{content:"\e093"}.glyphicon-arrow-down:before{content:"\e094"}.glyphicon-share-alt:before{content:"\e095"}.glyphicon-resize-full:before{content:"\e096"}.glyphicon-resize-small:before{content:"\e097"}.glyphicon-exclamation-sign:before{content:"\e101"}.glyphicon-gift:before{content:"\e102"}.glyphicon-leaf:before{content:"\e103"}.glyphicon-fire:before{content:"\e104"}.glyphicon-eye-open:before{content:"\e105"}.glyphicon-eye-close:before{content:"\e106"}.glyphicon-warning-sign:before{content:"\e107"}.glyphicon-plane:before{content:"\e108"}.glyphicon-calendar:before{content:"\e109"}.glyphicon-random:before{content:"\e110"}.glyphicon-comment:before{content:"\e111"}.glyphicon-magnet:before{content:"\e112"}.glyphicon-chevron-up:before{content:"\e113"}.glyphicon-chevron-down:before{content:"\e114"}.glyphicon-retweet:before{content:"\e115"}.glyphicon-shopping-cart:before{content:"\e116"}.glyphicon-folder-close:before{content:"\e117"}.glyphicon-folder-open:before{content:"\e118"}.glyphicon-resize-vertical:before{content:"\e119"}.glyphicon-resize-horizontal:before{content:"\e120"}.glyphicon-hdd:before{content:"\e121"}.glyphicon-bullhorn:before{content:"\e122"}.glyphicon-bell:before{content:"\e123"}.glyphicon-certificate:before{content:"\e124"}.glyphicon-thumbs-up:before{content:"\e125"}.glyphicon-thumbs-down:before{content:"\e126"}.glyphicon-hand-right:before{content:"\e127"}.glyphicon-hand-left:before{content:"\e128"}.glyphicon-hand-up:before{content:"\e129"}.glyphicon-hand-down:before{content:"\e130"}.glyphicon-circle-arrow-right:before{content:"\e131"}.glyphicon-circle-arrow-left:before{content:"\e132"}.glyphicon-circle-arrow-up:before{content:"\e133"}.glyphicon-circle-arrow-down:before{content:"\e134"}.glyphicon-globe:before{content:"\e135"}.glyphicon-wrench:before{content:"\e136"}.glyphicon-tasks:before{content:"\e137"}.glyphicon-filter:before{content:"\e138"}.glyphicon-briefcase:before{content:"\e139"}.glyphicon-fullscreen:before{content:"\e140"}.glyphicon-dashboard:before{content:"\e141"}.glyphicon-paperclip:before{content:"\e142"}.glyphicon-heart-empty:before{content:"\e143"}.glyphicon-link:before{content:"\e144"}.glyphicon-phone:before{content:"\e145"}.glyphicon-pushpin:before{content:"\e146"}.glyphicon-usd:before{content:"\e148"}.glyphicon-gbp:before{content:"\e149"}.glyphicon-sort:before{content:"\e150"}.glyphicon-sort-by-alphabet:before{content:"\e151"}.glyphicon-sort-by-alphabet-alt:before{content:"\e152"}.glyphicon-sort-by-order:before{content:"\e153"}.glyphicon-sort-by-order-alt:before{content:"\e154"}.glyphicon-sort-by-attributes:before{content:"\e155"}.glyphicon-sort-by-attributes-alt:before{content:"\e156"}.glyphicon-unchecked:before{content:"\e157"}.glyphicon-expand:before{content:"\e158"}.glyphicon-collapse-down:before{content:"\e159"}.glyphicon-collapse-up:before{content:"\e160"}.glyphicon-log-in:before{content:"\e161"}.glyphicon-flash:before{content:"\e162"}.glyphicon-log-out:before{content:"\e163"}.glyphicon-new-window:before{content:"\e164"}.glyphicon-record:before{content:"\e165"}.glyphicon-save:before{content:"\e166"}.glyphicon-open:before{content:"\e167"}.glyphicon-saved:before{content:"\e168"}.glyphicon-import:before{content:"\e169"}.glyphicon-export:before{content:"\e170"}.glyphicon-send:before{content:"\e171"}.glyphicon-floppy-disk:before{content:"\e172"}.glyphicon-floppy-saved:before{content:"\e173"}.glyphicon-floppy-remove:before{content:"\e174"}.glyphicon-floppy-save:before{content:"\e175"}.glyphicon-floppy-open:before{content:"\e176"}.glyphicon-credit-card:before{content:"\e177"}.glyphicon-transfer:before{content:"\e178"}.glyphicon-cutlery:before{content:"\e179"}.glyphicon-header:before{content:"\e180"}.glyphicon-compressed:before{content:"\e181"}.glyphicon-earphone:before{content:"\e182"}.glyphicon-phone-alt:before{content:"\e183"}.glyphicon-tower:before{content:"\e184"}.glyphicon-stats:before{content:"\e185"}.glyphicon-sd-video:before{content:"\e186"}.glyphicon-hd-video:before{content:"\e187"}.glyphicon-subtitles:before{content:"\e188"}.glyphicon-sound-stereo:before{content:"\e189"}.glyphicon-sound-dolby:before{content:"\e190"}.glyphicon-sound-5-1:before{content:"\e191"}.glyphicon-sound-6-1:before{content:"\e192"}.glyphicon-sound-7-1:before{content:"\e193"}.glyphicon-copyright-mark:before{content:"\e194"}.glyphicon-registration-mark:before{content:"\e195"}.glyphicon-cloud-download:before{content:"\e197"}.glyphicon-cloud-upload:before{content:"\e198"}.glyphicon-tree-conifer:before{content:"\e199"}.glyphicon-tree-deciduous:before{content:"\e200"}*{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}:before,:after{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}html{font-size:10px;-webkit-tap-highlight-color:rgba(0,0,0,0)}body{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;line-height:1.42857143;color:#333;background-color:#fff}input,button,select,textarea{font-family:inherit;font-size:inherit;line-height:inherit}a{color:#428bca;text-decoration:none}a:hover,a:focus{color:#2a6496;text-decoration:underline}a:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}figure{margin:0}img{vertical-align:middle}.img-responsive,.thumbnail>img,.thumbnail a>img,.carousel-inner>.item>img,.carousel-inner>.item>a>img{display:block;width:100% \9;max-width:100%;height:auto}.img-rounded{border-radius:6px}.img-thumbnail{display:inline-block;width:100% \9;max-width:100%;height:auto;padding:4px;line-height:1.42857143;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:all .2s ease-in-out;-o-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.img-circle{border-radius:50%}hr{margin-top:20px;margin-bottom:20px;border:0;border-top:1px solid #eee}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}h1,h2,h3,h4,h5,h6,.h1,.h2,.h3,.h4,.h5,.h6{font-family:inherit;font-weight:500;line-height:1.1;color:inherit}h1 small,h2 small,h3 small,h4 small,h5 small,h6 small,.h1 small,.h2 small,.h3 small,.h4 small,.h5 small,.h6 small,h1 .small,h2 .small,h3 .small,h4 .small,h5 .small,h6 .small,.h1 .small,.h2 .small,.h3 .small,.h4 .small,.h5 .small,.h6 .small{font-weight:400;line-height:1;color:#777}h1,.h1,h2,.h2,h3,.h3{margin-top:20px;margin-bottom:10px}h1 small,.h1 small,h2 small,.h2 small,h3 small,.h3 small,h1 .small,.h1 .small,h2 .small,.h2 .small,h3 .small,.h3 .small{font-size:65%}h4,.h4,h5,.h5,h6,.h6{margin-top:10px;margin-bottom:10px}h4 small,.h4 small,h5 small,.h5 small,h6 small,.h6 small,h4 .small,.h4 .small,h5 .small,.h5 .small,h6 .small,.h6 .small{font-size:75%}h1,.h1{font-size:36px}h2,.h2{font-size:30px}h3,.h3{font-size:24px}h4,.h4{font-size:18px}h5,.h5{font-size:14px}h6,.h6{font-size:12px}p{margin:0 0 10px}.lead{margin-bottom:20px;font-size:16px;font-weight:300;line-height:1.4}@media (min-width:768px){.lead{font-size:21px}}small,.small{font-size:85%}cite{font-style:normal}mark,.mark{padding:.2em;background-color:#fcf8e3}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}.text-justify{text-align:justify}.text-nowrap{white-space:nowrap}.text-lowercase{text-transform:lowercase}.text-uppercase{text-transform:uppercase}.text-capitalize{text-transform:capitalize}.text-muted{color:#777}.text-primary{color:#428bca}a.text-primary:hover{color:#3071a9}.text-success{color:#3c763d}a.text-success:hover{color:#2b542c}.text-info{color:#31708f}a.text-info:hover{color:#245269}.text-warning{color:#8a6d3b}a.text-warning:hover{color:#66512c}.text-danger{color:#a94442}a.text-danger:hover{color:#843534}.bg-primary{color:#fff;background-color:#428bca}a.bg-primary:hover{background-color:#3071a9}.bg-success{background-color:#dff0d8}a.bg-success:hover{background-color:#c1e2b3}.bg-info{background-color:#d9edf7}a.bg-info:hover{background-color:#afd9ee}.bg-warning{background-color:#fcf8e3}a.bg-warning:hover{background-color:#f7ecb5}.bg-danger{background-color:#f2dede}a.bg-danger:hover{background-color:#e4b9b9}.page-header{padding-bottom:9px;margin:40px 0 20px;border-bottom:1px solid #eee}ul,ol{margin-top:0;margin-bottom:10px}ul ul,ol ul,ul ol,ol ol{margin-bottom:0}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;margin-left:-5px;list-style:none}.list-inline>li{display:inline-block;padding-right:5px;padding-left:5px}dl{margin-top:0;margin-bottom:20px}dt,dd{line-height:1.42857143}dt{font-weight:700}dd{margin-left:0}@media (min-width:768px){.dl-horizontal dt{float:left;width:160px;overflow:hidden;clear:left;text-align:right;text-overflow:ellipsis;white-space:nowrap}.dl-horizontal dd{margin-left:180px}}abbr[title],abbr[data-original-title]{cursor:help;border-bottom:1px dotted #777}.initialism{font-size:90%;text-transform:uppercase}blockquote{padding:10px 20px;margin:0 0 20px;font-size:17.5px;border-left:5px solid #eee}blockquote p:last-child,blockquote ul:last-child,blockquote ol:last-child{margin-bottom:0}blockquote footer,blockquote small,blockquote .small{display:block;font-size:80%;line-height:1.42857143;color:#777}blockquote footer:before,blockquote small:before,blockquote .small:before{content:'\2014 \00A0'}.blockquote-reverse,blockquote.pull-right{padding-right:15px;padding-left:0;text-align:right;border-right:5px solid #eee;border-left:0}.blockquote-reverse footer:before,blockquote.pull-right footer:before,.blockquote-reverse small:before,blockquote.pull-right small:before,.blockquote-reverse .small:before,blockquote.pull-right .small:before{content:''}.blockquote-reverse footer:after,blockquote.pull-right footer:after,.blockquote-reverse small:after,blockquote.pull-right small:after,.blockquote-reverse .small:after,blockquote.pull-right .small:after{content:'\00A0 \2014'}blockquote:before,blockquote:after{content:""}address{margin-bottom:20px;font-style:normal;line-height:1.42857143}code,kbd,pre,samp{font-family:Menlo,Monaco,Consolas,"Courier New",monospace}code{padding:2px 4px;font-size:90%;color:#c7254e;background-color:#f9f2f4;border-radius:4px}kbd{padding:2px 4px;font-size:90%;color:#fff;background-color:#333;border-radius:3px;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,.25);box-shadow:inset 0 -1px 0 rgba(0,0,0,.25)}kbd kbd{padding:0;font-size:100%;-webkit-box-shadow:none;box-shadow:none}pre{display:block;padding:9.5px;margin:0 0 10px;font-size:13px;line-height:1.42857143;color:#333;word-break:break-all;word-wrap:break-word;background-color:#f5f5f5;border:1px solid #ccc;border-radius:4px}pre code{padding:0;font-size:inherit;color:inherit;white-space:pre-wrap;background-color:transparent;border-radius:0}.pre-scrollable{max-height:340px;overflow-y:scroll}.container{padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}@media (min-width:768px){.container{width:750px}}@media (min-width:992px){.container{width:970px}}@media (min-width:1200px){.container{width:1170px}}.container-fluid{padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}.row{margin-right:-15px;margin-left:-15px}.col-xs-1,.col-sm-1,.col-md-1,.col-lg-1,.col-xs-2,.col-sm-2,.col-md-2,.col-lg-2,.col-xs-3,.col-sm-3,.col-md-3,.col-lg-3,.col-xs-4,.col-sm-4,.col-md-4,.col-lg-4,.col-xs-5,.col-sm-5,.col-md-5,.col-lg-5,.col-xs-6,.col-sm-6,.col-md-6,.col-lg-6,.col-xs-7,.col-sm-7,.col-md-7,.col-lg-7,.col-xs-8,.col-sm-8,.col-md-8,.col-lg-8,.col-xs-9,.col-sm-9,.col-md-9,.col-lg-9,.col-xs-10,.col-sm-10,.col-md-10,.col-lg-10,.col-xs-11,.col-sm-11,.col-md-11,.col-lg-11,.col-xs-12,.col-sm-12,.col-md-12,.col-lg-12{position:relative;min-height:1px;padding-right:15px;padding-left:15px}.col-xs-1,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9,.col-xs-10,.col-xs-11,.col-xs-12{float:left}.col-xs-12{width:100%}.col-xs-11{width:91.66666667%}.col-xs-10{width:83.33333333%}.col-xs-9{width:75%}.col-xs-8{width:66.66666667%}.col-xs-7{width:58.33333333%}.col-xs-6{width:50%}.col-xs-5{width:41.66666667%}.col-xs-4{width:33.33333333%}.col-xs-3{width:25%}.col-xs-2{width:16.66666667%}.col-xs-1{width:8.33333333%}.col-xs-pull-12{right:100%}.col-xs-pull-11{right:91.66666667%}.col-xs-pull-10{right:83.33333333%}.col-xs-pull-9{right:75%}.col-xs-pull-8{right:66.66666667%}.col-xs-pull-7{right:58.33333333%}.col-xs-pull-6{right:50%}.col-xs-pull-5{right:41.66666667%}.col-xs-pull-4{right:33.33333333%}.col-xs-pull-3{right:25%}.col-xs-pull-2{right:16.66666667%}.col-xs-pull-1{right:8.33333333%}.col-xs-pull-0{right:auto}.col-xs-push-12{left:100%}.col-xs-push-11{left:91.66666667%}.col-xs-push-10{left:83.33333333%}.col-xs-push-9{left:75%}.col-xs-push-8{left:66.66666667%}.col-xs-push-7{left:58.33333333%}.col-xs-push-6{left:50%}.col-xs-push-5{left:41.66666667%}.col-xs-push-4{left:33.33333333%}.col-xs-push-3{left:25%}.col-xs-push-2{left:16.66666667%}.col-xs-push-1{left:8.33333333%}.col-xs-push-0{left:auto}.col-xs-offset-12{margin-left:100%}.col-xs-offset-11{margin-left:91.66666667%}.col-xs-offset-10{margin-left:83.33333333%}.col-xs-offset-9{margin-left:75%}.col-xs-offset-8{margin-left:66.66666667%}.col-xs-offset-7{margin-left:58.33333333%}.col-xs-offset-6{margin-left:50%}.col-xs-offset-5{margin-left:41.66666667%}.col-xs-offset-4{margin-left:33.33333333%}.col-xs-offset-3{margin-left:25%}.col-xs-offset-2{margin-left:16.66666667%}.col-xs-offset-1{margin-left:8.33333333%}.col-xs-offset-0{margin-left:0}@media (min-width:768px){.col-sm-1,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-sm-10,.col-sm-11,.col-sm-12{float:left}.col-sm-12{width:100%}.col-sm-11{width:91.66666667%}.col-sm-10{width:83.33333333%}.col-sm-9{width:75%}.col-sm-8{width:66.66666667%}.col-sm-7{width:58.33333333%}.col-sm-6{width:50%}.col-sm-5{width:41.66666667%}.col-sm-4{width:33.33333333%}.col-sm-3{width:25%}.col-sm-2{width:16.66666667%}.col-sm-1{width:8.33333333%}.col-sm-pull-12{right:100%}.col-sm-pull-11{right:91.66666667%}.col-sm-pull-10{right:83.33333333%}.col-sm-pull-9{right:75%}.col-sm-pull-8{right:66.66666667%}.col-sm-pull-7{right:58.33333333%}.col-sm-pull-6{right:50%}.col-sm-pull-5{right:41.66666667%}.col-sm-pull-4{right:33.33333333%}.col-sm-pull-3{right:25%}.col-sm-pull-2{right:16.66666667%}.col-sm-pull-1{right:8.33333333%}.col-sm-pull-0{right:auto}.col-sm-push-12{left:100%}.col-sm-push-11{left:91.66666667%}.col-sm-push-10{left:83.33333333%}.col-sm-push-9{left:75%}.col-sm-push-8{left:66.66666667%}.col-sm-push-7{left:58.33333333%}.col-sm-push-6{left:50%}.col-sm-push-5{left:41.66666667%}.col-sm-push-4{left:33.33333333%}.col-sm-push-3{left:25%}.col-sm-push-2{left:16.66666667%}.col-sm-push-1{left:8.33333333%}.col-sm-push-0{left:auto}.col-sm-offset-12{margin-left:100%}.col-sm-offset-11{margin-left:91.66666667%}.col-sm-offset-10{margin-left:83.33333333%}.col-sm-offset-9{margin-left:75%}.col-sm-offset-8{margin-left:66.66666667%}.col-sm-offset-7{margin-left:58.33333333%}.col-sm-offset-6{margin-left:50%}.col-sm-offset-5{margin-left:41.66666667%}.col-sm-offset-4{margin-left:33.33333333%}.col-sm-offset-3{margin-left:25%}.col-sm-offset-2{margin-left:16.66666667%}.col-sm-offset-1{margin-left:8.33333333%}.col-sm-offset-0{margin-left:0}}@media (min-width:992px){.col-md-1,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-md-10,.col-md-11,.col-md-12{float:left}.col-md-12{width:100%}.col-md-11{width:91.66666667%}.col-md-10{width:83.33333333%}.col-md-9{width:75%}.col-md-8{width:66.66666667%}.col-md-7{width:58.33333333%}.col-md-6{width:50%}.col-md-5{width:41.66666667%}.col-md-4{width:33.33333333%}.col-md-3{width:25%}.col-md-2{width:16.66666667%}.col-md-1{width:8.33333333%}.col-md-pull-12{right:100%}.col-md-pull-11{right:91.66666667%}.col-md-pull-10{right:83.33333333%}.col-md-pull-9{right:75%}.col-md-pull-8{right:66.66666667%}.col-md-pull-7{right:58.33333333%}.col-md-pull-6{right:50%}.col-md-pull-5{right:41.66666667%}.col-md-pull-4{right:33.33333333%}.col-md-pull-3{right:25%}.col-md-pull-2{right:16.66666667%}.col-md-pull-1{right:8.33333333%}.col-md-pull-0{right:auto}.col-md-push-12{left:100%}.col-md-push-11{left:91.66666667%}.col-md-push-10{left:83.33333333%}.col-md-push-9{left:75%}.col-md-push-8{left:66.66666667%}.col-md-push-7{left:58.33333333%}.col-md-push-6{left:50%}.col-md-push-5{left:41.66666667%}.col-md-push-4{left:33.33333333%}.col-md-push-3{left:25%}.col-md-push-2{left:16.66666667%}.col-md-push-1{left:8.33333333%}.col-md-push-0{left:auto}.col-md-offset-12{margin-left:100%}.col-md-offset-11{margin-left:91.66666667%}.col-md-offset-10{margin-left:83.33333333%}.col-md-offset-9{margin-left:75%}.col-md-offset-8{margin-left:66.66666667%}.col-md-offset-7{margin-left:58.33333333%}.col-md-offset-6{margin-left:50%}.col-md-offset-5{margin-left:41.66666667%}.col-md-offset-4{margin-left:33.33333333%}.col-md-offset-3{margin-left:25%}.col-md-offset-2{margin-left:16.66666667%}.col-md-offset-1{margin-left:8.33333333%}.col-md-offset-0{margin-left:0}}@media (min-width:1200px){.col-lg-1,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-lg-10,.col-lg-11,.col-lg-12{float:left}.col-lg-12{width:100%}.col-lg-11{width:91.66666667%}.col-lg-10{width:83.33333333%}.col-lg-9{width:75%}.col-lg-8{width:66.66666667%}.col-lg-7{width:58.33333333%}.col-lg-6{width:50%}.col-lg-5{width:41.66666667%}.col-lg-4{width:33.33333333%}.col-lg-3{width:25%}.col-lg-2{width:16.66666667%}.col-lg-1{width:8.33333333%}.col-lg-pull-12{right:100%}.col-lg-pull-11{right:91.66666667%}.col-lg-pull-10{right:83.33333333%}.col-lg-pull-9{right:75%}.col-lg-pull-8{right:66.66666667%}.col-lg-pull-7{right:58.33333333%}.col-lg-pull-6{right:50%}.col-lg-pull-5{right:41.66666667%}.col-lg-pull-4{right:33.33333333%}.col-lg-pull-3{right:25%}.col-lg-pull-2{right:16.66666667%}.col-lg-pull-1{right:8.33333333%}.col-lg-pull-0{right:auto}.col-lg-push-12{left:100%}.col-lg-push-11{left:91.66666667%}.col-lg-push-10{left:83.33333333%}.col-lg-push-9{left:75%}.col-lg-push-8{left:66.66666667%}.col-lg-push-7{left:58.33333333%}.col-lg-push-6{left:50%}.col-lg-push-5{left:41.66666667%}.col-lg-push-4{left:33.33333333%}.col-lg-push-3{left:25%}.col-lg-push-2{left:16.66666667%}.col-lg-push-1{left:8.33333333%}.col-lg-push-0{left:auto}.col-lg-offset-12{margin-left:100%}.col-lg-offset-11{margin-left:91.66666667%}.col-lg-offset-10{margin-left:83.33333333%}.col-lg-offset-9{margin-left:75%}.col-lg-offset-8{margin-left:66.66666667%}.col-lg-offset-7{margin-left:58.33333333%}.col-lg-offset-6{margin-left:50%}.col-lg-offset-5{margin-left:41.66666667%}.col-lg-offset-4{margin-left:33.33333333%}.col-lg-offset-3{margin-left:25%}.col-lg-offset-2{margin-left:16.66666667%}.col-lg-offset-1{margin-left:8.33333333%}.col-lg-offset-0{margin-left:0}}table{background-color:transparent}th{text-align:left}.table{width:100%;max-width:100%;margin-bottom:20px}.table>thead>tr>th,.table>tbody>tr>th,.table>tfoot>tr>th,.table>thead>tr>td,.table>tbody>tr>td,.table>tfoot>tr>td{padding:8px;line-height:1.42857143;vertical-align:top;border-top:1px solid #ddd}.table>thead>tr>th{vertical-align:bottom;border-bottom:2px solid #ddd}.table>caption+thead>tr:first-child>th,.table>colgroup+thead>tr:first-child>th,.table>thead:first-child>tr:first-child>th,.table>caption+thead>tr:first-child>td,.table>colgroup+thead>tr:first-child>td,.table>thead:first-child>tr:first-child>td{border-top:0}.table>tbody+tbody{border-top:2px solid #ddd}.table .table{background-color:#fff}.table-condensed>thead>tr>th,.table-condensed>tbody>tr>th,.table-condensed>tfoot>tr>th,.table-condensed>thead>tr>td,.table-condensed>tbody>tr>td,.table-condensed>tfoot>tr>td{padding:5px}.table-bordered{border:1px solid #ddd}.table-bordered>thead>tr>th,.table-bordered>tbody>tr>th,.table-bordered>tfoot>tr>th,.table-bordered>thead>tr>td,.table-bordered>tbody>tr>td,.table-bordered>tfoot>tr>td{border:1px solid #ddd}.table-bordered>thead>tr>th,.table-bordered>thead>tr>td{border-bottom-width:2px}.table-striped>tbody>tr:nth-child(odd)>td,.table-striped>tbody>tr:nth-child(odd)>th{background-color:#f9f9f9}.table-hover>tbody>tr:hover>td,.table-hover>tbody>tr:hover>th{background-color:#f5f5f5}table col[class*=col-]{position:static;display:table-column;float:none}table td[class*=col-],table th[class*=col-]{position:static;display:table-cell;float:none}.table>thead>tr>td.active,.table>tbody>tr>td.active,.table>tfoot>tr>td.active,.table>thead>tr>th.active,.table>tbody>tr>th.active,.table>tfoot>tr>th.active,.table>thead>tr.active>td,.table>tbody>tr.active>td,.table>tfoot>tr.active>td,.table>thead>tr.active>th,.table>tbody>tr.active>th,.table>tfoot>tr.active>th{background-color:#f5f5f5}.table-hover>tbody>tr>td.active:hover,.table-hover>tbody>tr>th.active:hover,.table-hover>tbody>tr.active:hover>td,.table-hover>tbody>tr:hover>.active,.table-hover>tbody>tr.active:hover>th{background-color:#e8e8e8}.table>thead>tr>td.success,.table>tbody>tr>td.success,.table>tfoot>tr>td.success,.table>thead>tr>th.success,.table>tbody>tr>th.success,.table>tfoot>tr>th.success,.table>thead>tr.success>td,.table>tbody>tr.success>td,.table>tfoot>tr.success>td,.table>thead>tr.success>th,.table>tbody>tr.success>th,.table>tfoot>tr.success>th{background-color:#dff0d8}.table-hover>tbody>tr>td.success:hover,.table-hover>tbody>tr>th.success:hover,.table-hover>tbody>tr.success:hover>td,.table-hover>tbody>tr:hover>.success,.table-hover>tbody>tr.success:hover>th{background-color:#d0e9c6}.table>thead>tr>td.info,.table>tbody>tr>td.info,.table>tfoot>tr>td.info,.table>thead>tr>th.info,.table>tbody>tr>th.info,.table>tfoot>tr>th.info,.table>thead>tr.info>td,.table>tbody>tr.info>td,.table>tfoot>tr.info>td,.table>thead>tr.info>th,.table>tbody>tr.info>th,.table>tfoot>tr.info>th{background-color:#d9edf7}.table-hover>tbody>tr>td.info:hover,.table-hover>tbody>tr>th.info:hover,.table-hover>tbody>tr.info:hover>td,.table-hover>tbody>tr:hover>.info,.table-hover>tbody>tr.info:hover>th{background-color:#c4e3f3}.table>thead>tr>td.warning,.table>tbody>tr>td.warning,.table>tfoot>tr>td.warning,.table>thead>tr>th.warning,.table>tbody>tr>th.warning,.table>tfoot>tr>th.warning,.table>thead>tr.warning>td,.table>tbody>tr.warning>td,.table>tfoot>tr.warning>td,.table>thead>tr.warning>th,.table>tbody>tr.warning>th,.table>tfoot>tr.warning>th{background-color:#fcf8e3}.table-hover>tbody>tr>td.warning:hover,.table-hover>tbody>tr>th.warning:hover,.table-hover>tbody>tr.warning:hover>td,.table-hover>tbody>tr:hover>.warning,.table-hover>tbody>tr.warning:hover>th{background-color:#faf2cc}.table>thead>tr>td.danger,.table>tbody>tr>td.danger,.table>tfoot>tr>td.danger,.table>thead>tr>th.danger,.table>tbody>tr>th.danger,.table>tfoot>tr>th.danger,.table>thead>tr.danger>td,.table>tbody>tr.danger>td,.table>tfoot>tr.danger>td,.table>thead>tr.danger>th,.table>tbody>tr.danger>th,.table>tfoot>tr.danger>th{background-color:#f2dede}.table-hover>tbody>tr>td.danger:hover,.table-hover>tbody>tr>th.danger:hover,.table-hover>tbody>tr.danger:hover>td,.table-hover>tbody>tr:hover>.danger,.table-hover>tbody>tr.danger:hover>th{background-color:#ebcccc}@media screen and (max-width:767px){.table-responsive{width:100%;margin-bottom:15px;overflow-x:auto;overflow-y:hidden;-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar;border:1px solid #ddd}.table-responsive>.table{margin-bottom:0}.table-responsive>.table>thead>tr>th,.table-responsive>.table>tbody>tr>th,.table-responsive>.table>tfoot>tr>th,.table-responsive>.table>thead>tr>td,.table-responsive>.table>tbody>tr>td,.table-responsive>.table>tfoot>tr>td{white-space:nowrap}.table-responsive>.table-bordered{border:0}.table-responsive>.table-bordered>thead>tr>th:first-child,.table-responsive>.table-bordered>tbody>tr>th:first-child,.table-responsive>.table-bordered>tfoot>tr>th:first-child,.table-responsive>.table-bordered>thead>tr>td:first-child,.table-responsive>.table-bordered>tbody>tr>td:first-child,.table-responsive>.table-bordered>tfoot>tr>td:first-child{border-left:0}.table-responsive>.table-bordered>thead>tr>th:last-child,.table-responsive>.table-bordered>tbody>tr>th:last-child,.table-responsive>.table-bordered>tfoot>tr>th:last-child,.table-responsive>.table-bordered>thead>tr>td:last-child,.table-responsive>.table-bordered>tbody>tr>td:last-child,.table-responsive>.table-bordered>tfoot>tr>td:last-child{border-right:0}.table-responsive>.table-bordered>tbody>tr:last-child>th,.table-responsive>.table-bordered>tfoot>tr:last-child>th,.table-responsive>.table-bordered>tbody>tr:last-child>td,.table-responsive>.table-bordered>tfoot>tr:last-child>td{border-bottom:0}}fieldset{min-width:0;padding:0;margin:0;border:0}legend{display:block;width:100%;padding:0;margin-bottom:20px;font-size:21px;line-height:inherit;color:#333;border:0;border-bottom:1px solid #e5e5e5}label{display:inline-block;max-width:100%;margin-bottom:5px;font-weight:700}input[type=search]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}input[type=radio],input[type=checkbox]{margin:4px 0 0;margin-top:1px \9;line-height:normal}input[type=file]{display:block}input[type=range]{display:block;width:100%}select[multiple],select[size]{height:auto}input[type=file]:focus,input[type=radio]:focus,input[type=checkbox]:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}output{display:block;padding-top:7px;font-size:14px;line-height:1.42857143;color:#555}.form-control{display:block;width:100%;height:34px;padding:6px 12px;font-size:14px;line-height:1.42857143;color:#555;background-color:#fff;background-image:none;border:1px solid #ccc;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075);-webkit-transition:border-color ease-in-out .15s,-webkit-box-shadow ease-in-out .15s;-o-transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s;transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s}.form-control:focus{border-color:#66afe9;outline:0;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.6);box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.6)}.form-control::-moz-placeholder{color:#777;opacity:1}.form-control:-ms-input-placeholder{color:#777}.form-control::-webkit-input-placeholder{color:#777}.form-control[disabled],.form-control[readonly],fieldset[disabled] .form-control{cursor:not-allowed;background-color:#eee;opacity:1}textarea.form-control{height:auto}input[type=search]{-webkit-appearance:none}input[type=date],input[type=time],input[type=datetime-local],input[type=month]{line-height:34px;line-height:1.42857143 \0}input[type=date].input-sm,input[type=time].input-sm,input[type=datetime-local].input-sm,input[type=month].input-sm{line-height:30px}input[type=date].input-lg,input[type=time].input-lg,input[type=datetime-local].input-lg,input[type=month].input-lg{line-height:46px}.form-group{margin-bottom:15px}.radio,.checkbox{position:relative;display:block;min-height:20px;margin-top:10px;margin-bottom:10px}.radio label,.checkbox label{padding-left:20px;margin-bottom:0;font-weight:400;cursor:pointer}.radio input[type=radio],.radio-inline input[type=radio],.checkbox input[type=checkbox],.checkbox-inline input[type=checkbox]{position:absolute;margin-top:4px \9;margin-left:-20px}.radio+.radio,.checkbox+.checkbox{margin-top:-5px}.radio-inline,.checkbox-inline{display:inline-block;padding-left:20px;margin-bottom:0;font-weight:400;vertical-align:middle;cursor:pointer}.radio-inline+.radio-inline,.checkbox-inline+.checkbox-inline{margin-top:0;margin-left:10px}input[type=radio][disabled],input[type=checkbox][disabled],input[type=radio].disabled,input[type=checkbox].disabled,fieldset[disabled] input[type=radio],fieldset[disabled] input[type=checkbox]{cursor:not-allowed}.radio-inline.disabled,.checkbox-inline.disabled,fieldset[disabled] .radio-inline,fieldset[disabled] .checkbox-inline{cursor:not-allowed}.radio.disabled label,.checkbox.disabled label,fieldset[disabled] .radio label,fieldset[disabled] .checkbox label{cursor:not-allowed}.form-control-static{padding-top:7px;padding-bottom:7px;margin-bottom:0}.form-control-static.input-lg,.form-control-static.input-sm{padding-right:0;padding-left:0}.input-sm,.form-horizontal .form-group-sm .form-control{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-sm{height:30px;line-height:30px}textarea.input-sm,select[multiple].input-sm{height:auto}.input-lg,.form-horizontal .form-group-lg .form-control{height:46px;padding:10px 16px;font-size:18px;line-height:1.33;border-radius:6px}select.input-lg{height:46px;line-height:46px}textarea.input-lg,select[multiple].input-lg{height:auto}.has-feedback{position:relative}.has-feedback .form-control{padding-right:42.5px}.form-control-feedback{position:absolute;top:25px;right:0;z-index:2;display:block;width:34px;height:34px;line-height:34px;text-align:center}.input-lg+.form-control-feedback{width:46px;height:46px;line-height:46px}.input-sm+.form-control-feedback{width:30px;height:30px;line-height:30px}.has-success .help-block,.has-success .control-label,.has-success .radio,.has-success .checkbox,.has-success .radio-inline,.has-success .checkbox-inline{color:#3c763d}.has-success .form-control{border-color:#3c763d;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-success .form-control:focus{border-color:#2b542c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #67b168;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #67b168}.has-success .input-group-addon{color:#3c763d;background-color:#dff0d8;border-color:#3c763d}.has-success .form-control-feedback{color:#3c763d}.has-warning .help-block,.has-warning .control-label,.has-warning .radio,.has-warning .checkbox,.has-warning .radio-inline,.has-warning .checkbox-inline{color:#8a6d3b}.has-warning .form-control{border-color:#8a6d3b;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-warning .form-control:focus{border-color:#66512c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #c0a16b;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #c0a16b}.has-warning .input-group-addon{color:#8a6d3b;background-color:#fcf8e3;border-color:#8a6d3b}.has-warning .form-control-feedback{color:#8a6d3b}.has-error .help-block,.has-error .control-label,.has-error .radio,.has-error .checkbox,.has-error .radio-inline,.has-error .checkbox-inline{color:#a94442}.has-error .form-control{border-color:#a94442;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-error .form-control:focus{border-color:#843534;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ce8483;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ce8483}.has-error .input-group-addon{color:#a94442;background-color:#f2dede;border-color:#a94442}.has-error .form-control-feedback{color:#a94442}.has-feedback label.sr-only~.form-control-feedback{top:0}.help-block{display:block;margin-top:5px;margin-bottom:10px;color:#737373}@media (min-width:768px){.form-inline .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.form-inline .form-control{display:inline-block;width:auto;vertical-align:middle}.form-inline .input-group{display:inline-table;vertical-align:middle}.form-inline .input-group .input-group-addon,.form-inline .input-group .input-group-btn,.form-inline .input-group .form-control{width:auto}.form-inline .input-group>.form-control{width:100%}.form-inline .control-label{margin-bottom:0;vertical-align:middle}.form-inline .radio,.form-inline .checkbox{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.form-inline .radio label,.form-inline .checkbox label{padding-left:0}.form-inline .radio input[type=radio],.form-inline .checkbox input[type=checkbox]{position:relative;margin-left:0}.form-inline .has-feedback .form-control-feedback{top:0}}.form-horizontal .radio,.form-horizontal .checkbox,.form-horizontal .radio-inline,.form-horizontal .checkbox-inline{padding-top:7px;margin-top:0;margin-bottom:0}.form-horizontal .radio,.form-horizontal .checkbox{min-height:27px}.form-horizontal .form-group{margin-right:-15px;margin-left:-15px}@media (min-width:768px){.form-horizontal .control-label{padding-top:7px;margin-bottom:0;text-align:right}}.form-horizontal .has-feedback .form-control-feedback{top:0;right:15px}@media (min-width:768px){.form-horizontal .form-group-lg .control-label{padding-top:14.3px}}@media (min-width:768px){.form-horizontal .form-group-sm .control-label{padding-top:6px}}.btn{display:inline-block;padding:6px 12px;margin-bottom:0;font-size:14px;font-weight:400;line-height:1.42857143;text-align:center;white-space:nowrap;vertical-align:middle;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;background-image:none;border:1px solid transparent;border-radius:4px}.btn:focus,.btn:active:focus,.btn.active:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.btn:hover,.btn:focus{color:#333;text-decoration:none}.btn:active,.btn.active{background-image:none;outline:0;-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn.disabled,.btn[disabled],fieldset[disabled] .btn{pointer-events:none;cursor:not-allowed;filter:alpha(opacity=65);-webkit-box-shadow:none;box-shadow:none;opacity:.65}.btn-default{color:#333;background-color:#fff;border-color:#ccc}.btn-default:hover,.btn-default:focus,.btn-default:active,.btn-default.active,.open>.dropdown-toggle.btn-default{color:#333;background-color:#e6e6e6;border-color:#adadad}.btn-default:active,.btn-default.active,.open>.dropdown-toggle.btn-default{background-image:none}.btn-default.disabled,.btn-default[disabled],fieldset[disabled] .btn-default,.btn-default.disabled:hover,.btn-default[disabled]:hover,fieldset[disabled] .btn-default:hover,.btn-default.disabled:focus,.btn-default[disabled]:focus,fieldset[disabled] .btn-default:focus,.btn-default.disabled:active,.btn-default[disabled]:active,fieldset[disabled] .btn-default:active,.btn-default.disabled.active,.btn-default[disabled].active,fieldset[disabled] .btn-default.active{background-color:#fff;border-color:#ccc}.btn-default .badge{color:#fff;background-color:#333}.btn-primary{color:#fff;background-color:#428bca;border-color:#357ebd}.btn-primary:hover,.btn-primary:focus,.btn-primary:active,.btn-primary.active,.open>.dropdown-toggle.btn-primary{color:#fff;background-color:#3071a9;border-color:#285e8e}.btn-primary:active,.btn-primary.active,.open>.dropdown-toggle.btn-primary{background-image:none}.btn-primary.disabled,.btn-primary[disabled],fieldset[disabled] .btn-primary,.btn-primary.disabled:hover,.btn-primary[disabled]:hover,fieldset[disabled] .btn-primary:hover,.btn-primary.disabled:focus,.btn-primary[disabled]:focus,fieldset[disabled] .btn-primary:focus,.btn-primary.disabled:active,.btn-primary[disabled]:active,fieldset[disabled] .btn-primary:active,.btn-primary.disabled.active,.btn-primary[disabled].active,fieldset[disabled] .btn-primary.active{background-color:#428bca;border-color:#357ebd}.btn-primary .badge{color:#428bca;background-color:#fff}.btn-success{color:#fff;background-color:#5cb85c;border-color:#4cae4c}.btn-success:hover,.btn-success:focus,.btn-success:active,.btn-success.active,.open>.dropdown-toggle.btn-success{color:#fff;background-color:#449d44;border-color:#398439}.btn-success:active,.btn-success.active,.open>.dropdown-toggle.btn-success{background-image:none}.btn-success.disabled,.btn-success[disabled],fieldset[disabled] .btn-success,.btn-success.disabled:hover,.btn-success[disabled]:hover,fieldset[disabled] .btn-success:hover,.btn-success.disabled:focus,.btn-success[disabled]:focus,fieldset[disabled] .btn-success:focus,.btn-success.disabled:active,.btn-success[disabled]:active,fieldset[disabled] .btn-success:active,.btn-success.disabled.active,.btn-success[disabled].active,fieldset[disabled] .btn-success.active{background-color:#5cb85c;border-color:#4cae4c}.btn-success .badge{color:#5cb85c;background-color:#fff}.btn-info{color:#fff;background-color:#5bc0de;border-color:#46b8da}.btn-info:hover,.btn-info:focus,.btn-info:active,.btn-info.active,.open>.dropdown-toggle.btn-info{color:#fff;background-color:#31b0d5;border-color:#269abc}.btn-info:active,.btn-info.active,.open>.dropdown-toggle.btn-info{background-image:none}.btn-info.disabled,.btn-info[disabled],fieldset[disabled] .btn-info,.btn-info.disabled:hover,.btn-info[disabled]:hover,fieldset[disabled] .btn-info:hover,.btn-info.disabled:focus,.btn-info[disabled]:focus,fieldset[disabled] .btn-info:focus,.btn-info.disabled:active,.btn-info[disabled]:active,fieldset[disabled] .btn-info:active,.btn-info.disabled.active,.btn-info[disabled].active,fieldset[disabled] .btn-info.active{background-color:#5bc0de;border-color:#46b8da}.btn-info .badge{color:#5bc0de;background-color:#fff}.btn-warning{color:#fff;background-color:#f0ad4e;border-color:#eea236}.btn-warning:hover,.btn-warning:focus,.btn-warning:active,.btn-warning.active,.open>.dropdown-toggle.btn-warning{color:#fff;background-color:#ec971f;border-color:#d58512}.btn-warning:active,.btn-warning.active,.open>.dropdown-toggle.btn-warning{background-image:none}.btn-warning.disabled,.btn-warning[disabled],fieldset[disabled] .btn-warning,.btn-warning.disabled:hover,.btn-warning[disabled]:hover,fieldset[disabled] .btn-warning:hover,.btn-warning.disabled:focus,.btn-warning[disabled]:focus,fieldset[disabled] .btn-warning:focus,.btn-warning.disabled:active,.btn-warning[disabled]:active,fieldset[disabled] .btn-warning:active,.btn-warning.disabled.active,.btn-warning[disabled].active,fieldset[disabled] .btn-warning.active{background-color:#f0ad4e;border-color:#eea236}.btn-warning .badge{color:#f0ad4e;background-color:#fff}.btn-danger{color:#fff;background-color:#d9534f;border-color:#d43f3a}.btn-danger:hover,.btn-danger:focus,.btn-danger:active,.btn-danger.active,.open>.dropdown-toggle.btn-danger{color:#fff;background-color:#c9302c;border-color:#ac2925}.btn-danger:active,.btn-danger.active,.open>.dropdown-toggle.btn-danger{background-image:none}.btn-danger.disabled,.btn-danger[disabled],fieldset[disabled] .btn-danger,.btn-danger.disabled:hover,.btn-danger[disabled]:hover,fieldset[disabled] .btn-danger:hover,.btn-danger.disabled:focus,.btn-danger[disabled]:focus,fieldset[disabled] .btn-danger:focus,.btn-danger.disabled:active,.btn-danger[disabled]:active,fieldset[disabled] .btn-danger:active,.btn-danger.disabled.active,.btn-danger[disabled].active,fieldset[disabled] .btn-danger.active{background-color:#d9534f;border-color:#d43f3a}.btn-danger .badge{color:#d9534f;background-color:#fff}.btn-link{font-weight:400;color:#428bca;cursor:pointer;border-radius:0}.btn-link,.btn-link:active,.btn-link[disabled],fieldset[disabled] .btn-link{background-color:transparent;-webkit-box-shadow:none;box-shadow:none}.btn-link,.btn-link:hover,.btn-link:focus,.btn-link:active{border-color:transparent}.btn-link:hover,.btn-link:focus{color:#2a6496;text-decoration:underline;background-color:transparent}.btn-link[disabled]:hover,fieldset[disabled] .btn-link:hover,.btn-link[disabled]:focus,fieldset[disabled] .btn-link:focus{color:#777;text-decoration:none}.btn-lg,.btn-group-lg>.btn{padding:10px 16px;font-size:18px;line-height:1.33;border-radius:6px}.btn-sm,.btn-group-sm>.btn{padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.btn-xs,.btn-group-xs>.btn{padding:1px 5px;font-size:12px;line-height:1.5;border-radius:3px}.btn-block{display:block;width:100%}.btn-block+.btn-block{margin-top:5px}input[type=submit].btn-block,input[type=reset].btn-block,input[type=button].btn-block{width:100%}.fade{opacity:0;-webkit-transition:opacity .15s linear;-o-transition:opacity .15s linear;transition:opacity .15s linear}.fade.in{opacity:1}.collapse{display:none}.collapse.in{display:block}tr.collapse.in{display:table-row}tbody.collapse.in{display:table-row-group}.collapsing{position:relative;height:0;overflow:hidden;-webkit-transition:height .35s ease;-o-transition:height .35s ease;transition:height .35s ease}.caret{display:inline-block;width:0;height:0;margin-left:2px;vertical-align:middle;border-top:4px solid;border-right:4px solid transparent;border-left:4px solid transparent}.dropdown{position:relative}.dropdown-toggle:focus{outline:0}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:160px;padding:5px 0;margin:2px 0 0;font-size:14px;text-align:left;list-style:none;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #ccc;border:1px solid rgba(0,0,0,.15);border-radius:4px;-webkit-box-shadow:0 6px 12px rgba(0,0,0,.175);box-shadow:0 6px 12px rgba(0,0,0,.175)}.dropdown-menu.pull-right{right:0;left:auto}.dropdown-menu .divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.dropdown-menu>li>a{display:block;padding:3px 20px;clear:both;font-weight:400;line-height:1.42857143;color:#333;white-space:nowrap}.dropdown-menu>li>a:hover,.dropdown-menu>li>a:focus{color:#262626;text-decoration:none;background-color:#f5f5f5}.dropdown-menu>.active>a,.dropdown-menu>.active>a:hover,.dropdown-menu>.active>a:focus{color:#fff;text-decoration:none;background-color:#428bca;outline:0}.dropdown-menu>.disabled>a,.dropdown-menu>.disabled>a:hover,.dropdown-menu>.disabled>a:focus{color:#777}.dropdown-menu>.disabled>a:hover,.dropdown-menu>.disabled>a:focus{text-decoration:none;cursor:not-allowed;background-color:transparent;background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.open>.dropdown-menu{display:block}.open>a{outline:0}.dropdown-menu-right{right:0;left:auto}.dropdown-menu-left{right:auto;left:0}.dropdown-header{display:block;padding:3px 20px;font-size:12px;line-height:1.42857143;color:#777;white-space:nowrap}.dropdown-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:990}.pull-right>.dropdown-menu{right:0;left:auto}.dropup .caret,.navbar-fixed-bottom .dropdown .caret{content:"";border-top:0;border-bottom:4px solid}.dropup .dropdown-menu,.navbar-fixed-bottom .dropdown .dropdown-menu{top:auto;bottom:100%;margin-bottom:1px}@media (min-width:768px){.navbar-right .dropdown-menu{right:0;left:auto}.navbar-right .dropdown-menu-left{right:auto;left:0}}.btn-group,.btn-group-vertical{position:relative;display:inline-block;vertical-align:middle}.btn-group>.btn,.btn-group-vertical>.btn{position:relative;float:left}.btn-group>.btn:hover,.btn-group-vertical>.btn:hover,.btn-group>.btn:focus,.btn-group-vertical>.btn:focus,.btn-group>.btn:active,.btn-group-vertical>.btn:active,.btn-group>.btn.active,.btn-group-vertical>.btn.active{z-index:2}.btn-group>.btn:focus,.btn-group-vertical>.btn:focus{outline:0}.btn-group .btn+.btn,.btn-group .btn+.btn-group,.btn-group .btn-group+.btn,.btn-group .btn-group+.btn-group{margin-left:-1px}.btn-toolbar{margin-left:-5px}.btn-toolbar .btn-group,.btn-toolbar .input-group{float:left}.btn-toolbar>.btn,.btn-toolbar>.btn-group,.btn-toolbar>.input-group{margin-left:5px}.btn-group>.btn:not(:first-child):not(:last-child):not(.dropdown-toggle){border-radius:0}.btn-group>.btn:first-child{margin-left:0}.btn-group>.btn:first-child:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn:last-child:not(:first-child),.btn-group>.dropdown-toggle:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.btn-group>.btn-group{float:left}.btn-group>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group>.btn-group:first-child>.btn:last-child,.btn-group>.btn-group:first-child>.dropdown-toggle{border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn-group:last-child>.btn:first-child{border-top-left-radius:0;border-bottom-left-radius:0}.btn-group .dropdown-toggle:active,.btn-group.open .dropdown-toggle{outline:0}.btn-group>.btn+.dropdown-toggle{padding-right:8px;padding-left:8px}.btn-group>.btn-lg+.dropdown-toggle{padding-right:12px;padding-left:12px}.btn-group.open .dropdown-toggle{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn-group.open .dropdown-toggle.btn-link{-webkit-box-shadow:none;box-shadow:none}.btn .caret{margin-left:0}.btn-lg .caret{border-width:5px 5px 0;border-bottom-width:0}.dropup .btn-lg .caret{border-width:0 5px 5px}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group,.btn-group-vertical>.btn-group>.btn{display:block;float:none;width:100%;max-width:100%}.btn-group-vertical>.btn-group>.btn{float:none}.btn-group-vertical>.btn+.btn,.btn-group-vertical>.btn+.btn-group,.btn-group-vertical>.btn-group+.btn,.btn-group-vertical>.btn-group+.btn-group{margin-top:-1px;margin-left:0}.btn-group-vertical>.btn:not(:first-child):not(:last-child){border-radius:0}.btn-group-vertical>.btn:first-child:not(:last-child){border-top-right-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn:last-child:not(:first-child){border-top-left-radius:0;border-top-right-radius:0;border-bottom-left-radius:4px}.btn-group-vertical>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group-vertical>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group-vertical>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn-group:last-child:not(:first-child)>.btn:first-child{border-top-left-radius:0;border-top-right-radius:0}.btn-group-justified{display:table;width:100%;table-layout:fixed;border-collapse:separate}.btn-group-justified>.btn,.btn-group-justified>.btn-group{display:table-cell;float:none;width:1%}.btn-group-justified>.btn-group .btn{width:100%}.btn-group-justified>.btn-group .dropdown-menu{left:auto}[data-toggle=buttons]>.btn>input[type=radio],[data-toggle=buttons]>.btn>input[type=checkbox]{position:absolute;z-index:-1;filter:alpha(opacity=0);opacity:0}.input-group{position:relative;display:table;border-collapse:separate}.input-group[class*=col-]{float:none;padding-right:0;padding-left:0}.input-group .form-control{position:relative;z-index:2;float:left;width:100%;margin-bottom:0}.input-group-lg>.form-control,.input-group-lg>.input-group-addon,.input-group-lg>.input-group-btn>.btn{height:46px;padding:10px 16px;font-size:18px;line-height:1.33;border-radius:6px}select.input-group-lg>.form-control,select.input-group-lg>.input-group-addon,select.input-group-lg>.input-group-btn>.btn{height:46px;line-height:46px}textarea.input-group-lg>.form-control,textarea.input-group-lg>.input-group-addon,textarea.input-group-lg>.input-group-btn>.btn,select[multiple].input-group-lg>.form-control,select[multiple].input-group-lg>.input-group-addon,select[multiple].input-group-lg>.input-group-btn>.btn{height:auto}.input-group-sm>.form-control,.input-group-sm>.input-group-addon,.input-group-sm>.input-group-btn>.btn{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-group-sm>.form-control,select.input-group-sm>.input-group-addon,select.input-group-sm>.input-group-btn>.btn{height:30px;line-height:30px}textarea.input-group-sm>.form-control,textarea.input-group-sm>.input-group-addon,textarea.input-group-sm>.input-group-btn>.btn,select[multiple].input-group-sm>.form-control,select[multiple].input-group-sm>.input-group-addon,select[multiple].input-group-sm>.input-group-btn>.btn{height:auto}.input-group-addon,.input-group-btn,.input-group .form-control{display:table-cell}.input-group-addon:not(:first-child):not(:last-child),.input-group-btn:not(:first-child):not(:last-child),.input-group .form-control:not(:first-child):not(:last-child){border-radius:0}.input-group-addon,.input-group-btn{width:1%;white-space:nowrap;vertical-align:middle}.input-group-addon{padding:6px 12px;font-size:14px;font-weight:400;line-height:1;color:#555;text-align:center;background-color:#eee;border:1px solid #ccc;border-radius:4px}.input-group-addon.input-sm{padding:5px 10px;font-size:12px;border-radius:3px}.input-group-addon.input-lg{padding:10px 16px;font-size:18px;border-radius:6px}.input-group-addon input[type=radio],.input-group-addon input[type=checkbox]{margin-top:0}.input-group .form-control:first-child,.input-group-addon:first-child,.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group>.btn,.input-group-btn:first-child>.dropdown-toggle,.input-group-btn:last-child>.btn:not(:last-child):not(.dropdown-toggle),.input-group-btn:last-child>.btn-group:not(:last-child)>.btn{border-top-right-radius:0;border-bottom-right-radius:0}.input-group-addon:first-child{border-right:0}.input-group .form-control:last-child,.input-group-addon:last-child,.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group>.btn,.input-group-btn:last-child>.dropdown-toggle,.input-group-btn:first-child>.btn:not(:first-child),.input-group-btn:first-child>.btn-group:not(:first-child)>.btn{border-top-left-radius:0;border-bottom-left-radius:0}.input-group-addon:last-child{border-left:0}.input-group-btn{position:relative;font-size:0;white-space:nowrap}.input-group-btn>.btn{position:relative}.input-group-btn>.btn+.btn{margin-left:-1px}.input-group-btn>.btn:hover,.input-group-btn>.btn:focus,.input-group-btn>.btn:active{z-index:2}.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group{margin-right:-1px}.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group{margin-left:-1px}.nav{padding-left:0;margin-bottom:0;list-style:none}.nav>li{position:relative;display:block}.nav>li>a{position:relative;display:block;padding:10px 15px}.nav>li>a:hover,.nav>li>a:focus{text-decoration:none;background-color:#eee}.nav>li.disabled>a{color:#777}.nav>li.disabled>a:hover,.nav>li.disabled>a:focus{color:#777;text-decoration:none;cursor:not-allowed;background-color:transparent}.nav .open>a,.nav .open>a:hover,.nav .open>a:focus{background-color:#eee;border-color:#428bca}.nav .nav-divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.nav>li>a>img{max-width:none}.nav-tabs{border-bottom:1px solid #ddd}.nav-tabs>li{float:left;margin-bottom:-1px}.nav-tabs>li>a{margin-right:2px;line-height:1.42857143;border:1px solid transparent;border-radius:4px 4px 0 0}.nav-tabs>li>a:hover{border-color:#eee #eee #ddd}.nav-tabs>li.active>a,.nav-tabs>li.active>a:hover,.nav-tabs>li.active>a:focus{color:#555;cursor:default;background-color:#fff;border:1px solid #ddd;border-bottom-color:transparent}.nav-tabs.nav-justified{width:100%;border-bottom:0}.nav-tabs.nav-justified>li{float:none}.nav-tabs.nav-justified>li>a{margin-bottom:5px;text-align:center}.nav-tabs.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media (min-width:768px){.nav-tabs.nav-justified>li{display:table-cell;width:1%}.nav-tabs.nav-justified>li>a{margin-bottom:0}}.nav-tabs.nav-justified>li>a{margin-right:0;border-radius:4px}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:hover,.nav-tabs.nav-justified>.active>a:focus{border:1px solid #ddd}@media (min-width:768px){.nav-tabs.nav-justified>li>a{border-bottom:1px solid #ddd;border-radius:4px 4px 0 0}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:hover,.nav-tabs.nav-justified>.active>a:focus{border-bottom-color:#fff}}.nav-pills>li{float:left}.nav-pills>li>a{border-radius:4px}.nav-pills>li+li{margin-left:2px}.nav-pills>li.active>a,.nav-pills>li.active>a:hover,.nav-pills>li.active>a:focus{color:#fff;background-color:#428bca}.nav-stacked>li{float:none}.nav-stacked>li+li{margin-top:2px;margin-left:0}.nav-justified{width:100%}.nav-justified>li{float:none}.nav-justified>li>a{margin-bottom:5px;text-align:center}.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media (min-width:768px){.nav-justified>li{display:table-cell;width:1%}.nav-justified>li>a{margin-bottom:0}}.nav-tabs-justified{border-bottom:0}.nav-tabs-justified>li>a{margin-right:0;border-radius:4px}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:hover,.nav-tabs-justified>.active>a:focus{border:1px solid #ddd}@media (min-width:768px){.nav-tabs-justified>li>a{border-bottom:1px solid #ddd;border-radius:4px 4px 0 0}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:hover,.nav-tabs-justified>.active>a:focus{border-bottom-color:#fff}}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.nav-tabs .dropdown-menu{margin-top:-1px;border-top-left-radius:0;border-top-right-radius:0}.navbar{position:relative;min-height:50px;margin-bottom:20px;border:1px solid transparent}@media (min-width:768px){.navbar{border-radius:4px}}@media (min-width:768px){.navbar-header{float:left}}.navbar-collapse{padding-right:15px;padding-left:15px;overflow-x:visible;-webkit-overflow-scrolling:touch;border-top:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px 0 rgba(255,255,255,.1)}.navbar-collapse.in{overflow-y:auto}@media (min-width:768px){.navbar-collapse{width:auto;border-top:0;-webkit-box-shadow:none;box-shadow:none}.navbar-collapse.collapse{display:block!important;height:auto!important;padding-bottom:0;overflow:visible!important}.navbar-collapse.in{overflow-y:visible}.navbar-fixed-top .navbar-collapse,.navbar-static-top .navbar-collapse,.navbar-fixed-bottom .navbar-collapse{padding-right:0;padding-left:0}}.navbar-fixed-top .navbar-collapse,.navbar-fixed-bottom .navbar-collapse{max-height:340px}@media (max-width:480px) and (orientation:landscape){.navbar-fixed-top .navbar-collapse,.navbar-fixed-bottom .navbar-collapse{max-height:200px}}.container>.navbar-header,.container-fluid>.navbar-header,.container>.navbar-collapse,.container-fluid>.navbar-collapse{margin-right:-15px;margin-left:-15px}@media (min-width:768px){.container>.navbar-header,.container-fluid>.navbar-header,.container>.navbar-collapse,.container-fluid>.navbar-collapse{margin-right:0;margin-left:0}}.navbar-static-top{z-index:1000;border-width:0 0 1px}@media (min-width:768px){.navbar-static-top{border-radius:0}}.navbar-fixed-top,.navbar-fixed-bottom{position:fixed;right:0;left:0;z-index:1030;-webkit-transform:translate3d(0,0,0);-o-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}@media (min-width:768px){.navbar-fixed-top,.navbar-fixed-bottom{border-radius:0}}.navbar-fixed-top{top:0;border-width:0 0 1px}.navbar-fixed-bottom{bottom:0;margin-bottom:0;border-width:1px 0 0}.navbar-brand{float:left;height:50px;padding:15px 15px;font-size:18px;line-height:20px}.navbar-brand:hover,.navbar-brand:focus{text-decoration:none}@media (min-width:768px){.navbar>.container .navbar-brand,.navbar>.container-fluid .navbar-brand{margin-left:-15px}}.navbar-toggle{position:relative;float:right;padding:9px 10px;margin-top:8px;margin-right:15px;margin-bottom:8px;background-color:transparent;background-image:none;border:1px solid transparent;border-radius:4px}.navbar-toggle:focus{outline:0}.navbar-toggle .icon-bar{display:block;width:22px;height:2px;border-radius:1px}.navbar-toggle .icon-bar+.icon-bar{margin-top:4px}@media (min-width:768px){.navbar-toggle{display:none}}.navbar-nav{margin:7.5px -15px}.navbar-nav>li>a{padding-top:10px;padding-bottom:10px;line-height:20px}@media (max-width:767px){.navbar-nav .open .dropdown-menu{position:static;float:none;width:auto;margin-top:0;background-color:transparent;border:0;-webkit-box-shadow:none;box-shadow:none}.navbar-nav .open .dropdown-menu>li>a,.navbar-nav .open .dropdown-menu .dropdown-header{padding:5px 15px 5px 25px}.navbar-nav .open .dropdown-menu>li>a{line-height:20px}.navbar-nav .open .dropdown-menu>li>a:hover,.navbar-nav .open .dropdown-menu>li>a:focus{background-image:none}}@media (min-width:768px){.navbar-nav{float:left;margin:0}.navbar-nav>li{float:left}.navbar-nav>li>a{padding-top:15px;padding-bottom:15px}.navbar-nav.navbar-right:last-child{margin-right:-15px}}@media (min-width:768px){.navbar-left{float:left!important}.navbar-right{float:right!important}}.navbar-form{padding:10px 15px;margin-top:8px;margin-right:-15px;margin-bottom:8px;margin-left:-15px;border-top:1px solid transparent;border-bottom:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.1),0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px 0 rgba(255,255,255,.1),0 1px 0 rgba(255,255,255,.1)}@media (min-width:768px){.navbar-form .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.navbar-form .form-control{display:inline-block;width:auto;vertical-align:middle}.navbar-form .input-group{display:inline-table;vertical-align:middle}.navbar-form .input-group .input-group-addon,.navbar-form .input-group .input-group-btn,.navbar-form .input-group .form-control{width:auto}.navbar-form .input-group>.form-control{width:100%}.navbar-form .control-label{margin-bottom:0;vertical-align:middle}.navbar-form .radio,.navbar-form .checkbox{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.navbar-form .radio label,.navbar-form .checkbox label{padding-left:0}.navbar-form .radio input[type=radio],.navbar-form .checkbox input[type=checkbox]{position:relative;margin-left:0}.navbar-form .has-feedback .form-control-feedback{top:0}}@media (max-width:767px){.navbar-form .form-group{margin-bottom:5px}}@media (min-width:768px){.navbar-form{width:auto;padding-top:0;padding-bottom:0;margin-right:0;margin-left:0;border:0;-webkit-box-shadow:none;box-shadow:none}.navbar-form.navbar-right:last-child{margin-right:-15px}}.navbar-nav>li>.dropdown-menu{margin-top:0;border-top-left-radius:0;border-top-right-radius:0}.navbar-fixed-bottom .navbar-nav>li>.dropdown-menu{border-bottom-right-radius:0;border-bottom-left-radius:0}.navbar-btn{margin-top:8px;margin-bottom:8px}.navbar-btn.btn-sm{margin-top:10px;margin-bottom:10px}.navbar-btn.btn-xs{margin-top:14px;margin-bottom:14px}.navbar-text{margin-top:15px;margin-bottom:15px}@media (min-width:768px){.navbar-text{float:left;margin-right:15px;margin-left:15px}.navbar-text.navbar-right:last-child{margin-right:0}}.navbar-default{background-color:#f8f8f8;border-color:#e7e7e7}.navbar-default .navbar-brand{color:#777}.navbar-default .navbar-brand:hover,.navbar-default .navbar-brand:focus{color:#5e5e5e;background-color:transparent}.navbar-default .navbar-text{color:#777}.navbar-default .navbar-nav>li>a{color:#777}.navbar-default .navbar-nav>li>a:hover,.navbar-default .navbar-nav>li>a:focus{color:#333;background-color:transparent}.navbar-default .navbar-nav>.active>a,.navbar-default .navbar-nav>.active>a:hover,.navbar-default .navbar-nav>.active>a:focus{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav>.disabled>a,.navbar-default .navbar-nav>.disabled>a:hover,.navbar-default .navbar-nav>.disabled>a:focus{color:#ccc;background-color:transparent}.navbar-default .navbar-toggle{border-color:#ddd}.navbar-default .navbar-toggle:hover,.navbar-default .navbar-toggle:focus{background-color:#ddd}.navbar-default .navbar-toggle .icon-bar{background-color:#888}.navbar-default .navbar-collapse,.navbar-default .navbar-form{border-color:#e7e7e7}.navbar-default .navbar-nav>.open>a,.navbar-default .navbar-nav>.open>a:hover,.navbar-default .navbar-nav>.open>a:focus{color:#555;background-color:#e7e7e7}@media (max-width:767px){.navbar-default .navbar-nav .open .dropdown-menu>li>a{color:#777}.navbar-default .navbar-nav .open .dropdown-menu>li>a:hover,.navbar-default .navbar-nav .open .dropdown-menu>li>a:focus{color:#333;background-color:transparent}.navbar-default .navbar-nav .open .dropdown-menu>.active>a,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:hover,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:focus{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:hover,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:focus{color:#ccc;background-color:transparent}}.navbar-default .navbar-link{color:#777}.navbar-default .navbar-link:hover{color:#333}.navbar-default .btn-link{color:#777}.navbar-default .btn-link:hover,.navbar-default .btn-link:focus{color:#333}.navbar-default .btn-link[disabled]:hover,fieldset[disabled] .navbar-default .btn-link:hover,.navbar-default .btn-link[disabled]:focus,fieldset[disabled] .navbar-default .btn-link:focus{color:#ccc}.navbar-inverse{background-color:#222;border-color:#080808}.navbar-inverse .navbar-brand{color:#777}.navbar-inverse .navbar-brand:hover,.navbar-inverse .navbar-brand:focus{color:#fff;background-color:transparent}.navbar-inverse .navbar-text{color:#777}.navbar-inverse .navbar-nav>li>a{color:#777}.navbar-inverse .navbar-nav>li>a:hover,.navbar-inverse .navbar-nav>li>a:focus{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav>.active>a,.navbar-inverse .navbar-nav>.active>a:hover,.navbar-inverse .navbar-nav>.active>a:focus{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav>.disabled>a,.navbar-inverse .navbar-nav>.disabled>a:hover,.navbar-inverse .navbar-nav>.disabled>a:focus{color:#444;background-color:transparent}.navbar-inverse .navbar-toggle{border-color:#333}.navbar-inverse .navbar-toggle:hover,.navbar-inverse .navbar-toggle:focus{background-color:#333}.navbar-inverse .navbar-toggle .icon-bar{background-color:#fff}.navbar-inverse .navbar-collapse,.navbar-inverse .navbar-form{border-color:#101010}.navbar-inverse .navbar-nav>.open>a,.navbar-inverse .navbar-nav>.open>a:hover,.navbar-inverse .navbar-nav>.open>a:focus{color:#fff;background-color:#080808}@media (max-width:767px){.navbar-inverse .navbar-nav .open .dropdown-menu>.dropdown-header{border-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu .divider{background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a{color:#777}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:hover,.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:focus{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:hover,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:focus{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:hover,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:focus{color:#444;background-color:transparent}}.navbar-inverse .navbar-link{color:#777}.navbar-inverse .navbar-link:hover{color:#fff}.navbar-inverse .btn-link{color:#777}.navbar-inverse .btn-link:hover,.navbar-inverse .btn-link:focus{color:#fff}.navbar-inverse .btn-link[disabled]:hover,fieldset[disabled] .navbar-inverse .btn-link:hover,.navbar-inverse .btn-link[disabled]:focus,fieldset[disabled] .navbar-inverse .btn-link:focus{color:#444}.breadcrumb{padding:8px 15px;margin-bottom:20px;list-style:none;background-color:#f5f5f5;border-radius:4px}.breadcrumb>li{display:inline-block}.breadcrumb>li+li:before{padding:0 5px;color:#ccc;content:"/\00a0"}.breadcrumb>.active{color:#777}.pagination{display:inline-block;padding-left:0;margin:20px 0;border-radius:4px}.pagination>li{display:inline}.pagination>li>a,.pagination>li>span{position:relative;float:left;padding:6px 12px;margin-left:-1px;line-height:1.42857143;color:#428bca;text-decoration:none;background-color:#fff;border:1px solid #ddd}.pagination>li:first-child>a,.pagination>li:first-child>span{margin-left:0;border-top-left-radius:4px;border-bottom-left-radius:4px}.pagination>li:last-child>a,.pagination>li:last-child>span{border-top-right-radius:4px;border-bottom-right-radius:4px}.pagination>li>a:hover,.pagination>li>span:hover,.pagination>li>a:focus,.pagination>li>span:focus{color:#2a6496;background-color:#eee;border-color:#ddd}.pagination>.active>a,.pagination>.active>span,.pagination>.active>a:hover,.pagination>.active>span:hover,.pagination>.active>a:focus,.pagination>.active>span:focus{z-index:2;color:#fff;cursor:default;background-color:#428bca;border-color:#428bca}.pagination>.disabled>span,.pagination>.disabled>span:hover,.pagination>.disabled>span:focus,.pagination>.disabled>a,.pagination>.disabled>a:hover,.pagination>.disabled>a:focus{color:#777;cursor:not-allowed;background-color:#fff;border-color:#ddd}.pagination-lg>li>a,.pagination-lg>li>span{padding:10px 16px;font-size:18px}.pagination-lg>li:first-child>a,.pagination-lg>li:first-child>span{border-top-left-radius:6px;border-bottom-left-radius:6px}.pagination-lg>li:last-child>a,.pagination-lg>li:last-child>span{border-top-right-radius:6px;border-bottom-right-radius:6px}.pagination-sm>li>a,.pagination-sm>li>span{padding:5px 10px;font-size:12px}.pagination-sm>li:first-child>a,.pagination-sm>li:first-child>span{border-top-left-radius:3px;border-bottom-left-radius:3px}.pagination-sm>li:last-child>a,.pagination-sm>li:last-child>span{border-top-right-radius:3px;border-bottom-right-radius:3px}.pager{padding-left:0;margin:20px 0;text-align:center;list-style:none}.pager li{display:inline}.pager li>a,.pager li>span{display:inline-block;padding:5px 14px;background-color:#fff;border:1px solid #ddd;border-radius:15px}.pager li>a:hover,.pager li>a:focus{text-decoration:none;background-color:#eee}.pager .next>a,.pager .next>span{float:right}.pager .previous>a,.pager .previous>span{float:left}.pager .disabled>a,.pager .disabled>a:hover,.pager .disabled>a:focus,.pager .disabled>span{color:#777;cursor:not-allowed;background-color:#fff}.label{display:inline;padding:.2em .6em .3em;font-size:75%;font-weight:700;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25em}a.label:hover,a.label:focus{color:#fff;text-decoration:none;cursor:pointer}.label:empty{display:none}.btn .label{position:relative;top:-1px}.label-default{background-color:#777}.label-default[href]:hover,.label-default[href]:focus{background-color:#5e5e5e}.label-primary{background-color:#428bca}.label-primary[href]:hover,.label-primary[href]:focus{background-color:#3071a9}.label-success{background-color:#5cb85c}.label-success[href]:hover,.label-success[href]:focus{background-color:#449d44}.label-info{background-color:#5bc0de}.label-info[href]:hover,.label-info[href]:focus{background-color:#31b0d5}.label-warning{background-color:#f0ad4e}.label-warning[href]:hover,.label-warning[href]:focus{background-color:#ec971f}.label-danger{background-color:#d9534f}.label-danger[href]:hover,.label-danger[href]:focus{background-color:#c9302c}.badge{display:inline-block;min-width:10px;padding:3px 7px;font-size:12px;font-weight:700;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:baseline;background-color:#777;border-radius:10px}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.btn-xs .badge{top:0;padding:1px 5px}a.badge:hover,a.badge:focus{color:#fff;text-decoration:none;cursor:pointer}a.list-group-item.active>.badge,.nav-pills>.active>a>.badge{color:#428bca;background-color:#fff}.nav-pills>li>a>.badge{margin-left:3px}.jumbotron{padding:30px;margin-bottom:30px;color:inherit;background-color:#eee}.jumbotron h1,.jumbotron .h1{color:inherit}.jumbotron p{margin-bottom:15px;font-size:21px;font-weight:200}.jumbotron>hr{border-top-color:#d5d5d5}.container .jumbotron{border-radius:6px}.jumbotron .container{max-width:100%}@media screen and (min-width:768px){.jumbotron{padding-top:48px;padding-bottom:48px}.container .jumbotron{padding-right:60px;padding-left:60px}.jumbotron h1,.jumbotron .h1{font-size:63px}}.thumbnail{display:block;padding:4px;margin-bottom:20px;line-height:1.42857143;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:all .2s ease-in-out;-o-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.thumbnail>img,.thumbnail a>img{margin-right:auto;margin-left:auto}a.thumbnail:hover,a.thumbnail:focus,a.thumbnail.active{border-color:#428bca}.thumbnail .caption{padding:9px;color:#333}.alert{padding:15px;margin-bottom:20px;border:1px solid transparent;border-radius:4px}.alert h4{margin-top:0;color:inherit}.alert .alert-link{font-weight:700}.alert>p,.alert>ul{margin-bottom:0}.alert>p+p{margin-top:5px}.alert-dismissable,.alert-dismissible{padding-right:35px}.alert-dismissable .close,.alert-dismissible .close{position:relative;top:-2px;right:-21px;color:inherit}.alert-success{color:#3c763d;background-color:#dff0d8;border-color:#d6e9c6}.alert-success hr{border-top-color:#c9e2b3}.alert-success .alert-link{color:#2b542c}.alert-info{color:#31708f;background-color:#d9edf7;border-color:#bce8f1}.alert-info hr{border-top-color:#a6e1ec}.alert-info .alert-link{color:#245269}.alert-warning{color:#8a6d3b;background-color:#fcf8e3;border-color:#faebcc}.alert-warning hr{border-top-color:#f7e1b5}.alert-warning .alert-link{color:#66512c}.alert-danger{color:#a94442;background-color:#f2dede;border-color:#ebccd1}.alert-danger hr{border-top-color:#e4b9c0}.alert-danger .alert-link{color:#843534}@-webkit-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-o-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}.progress{height:20px;margin-bottom:20px;overflow:hidden;background-color:#f5f5f5;border-radius:4px;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,.1);box-shadow:inset 0 1px 2px rgba(0,0,0,.1)}.progress-bar{float:left;width:0;height:100%;font-size:12px;line-height:20px;color:#fff;text-align:center;background-color:#428bca;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,.15);box-shadow:inset 0 -1px 0 rgba(0,0,0,.15);-webkit-transition:width .6s ease;-o-transition:width .6s ease;transition:width .6s ease}.progress-striped .progress-bar,.progress-bar-striped{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);-webkit-background-size:40px 40px;background-size:40px 40px}.progress.active .progress-bar,.progress-bar.active{-webkit-animation:progress-bar-stripes 2s linear infinite;-o-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite}.progress-bar[aria-valuenow="1"],.progress-bar[aria-valuenow="2"]{min-width:30px}.progress-bar[aria-valuenow="0"]{min-width:30px;color:#777;background-color:transparent;background-image:none;-webkit-box-shadow:none;box-shadow:none}.progress-bar-success{background-color:#5cb85c}.progress-striped .progress-bar-success{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-info{background-color:#5bc0de}.progress-striped .progress-bar-info{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-warning{background-color:#f0ad4e}.progress-striped .progress-bar-warning{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-danger{background-color:#d9534f}.progress-striped .progress-bar-danger{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.media,.media-body{overflow:hidden;zoom:1}.media,.media .media{margin-top:15px}.media:first-child{margin-top:0}.media-object{display:block}.media-heading{margin:0 0 5px}.media>.pull-left{margin-right:10px}.media>.pull-right{margin-left:10px}.media-list{padding-left:0;list-style:none}.list-group{padding-left:0;margin-bottom:20px}.list-group-item{position:relative;display:block;padding:10px 15px;margin-bottom:-1px;background-color:#fff;border:1px solid #ddd}.list-group-item:first-child{border-top-left-radius:4px;border-top-right-radius:4px}.list-group-item:last-child{margin-bottom:0;border-bottom-right-radius:4px;border-bottom-left-radius:4px}.list-group-item>.badge{float:right}.list-group-item>.badge+.badge{margin-right:5px}a.list-group-item{color:#555}a.list-group-item .list-group-item-heading{color:#333}a.list-group-item:hover,a.list-group-item:focus{color:#555;text-decoration:none;background-color:#f5f5f5}.list-group-item.disabled,.list-group-item.disabled:hover,.list-group-item.disabled:focus{color:#777;background-color:#eee}.list-group-item.disabled .list-group-item-heading,.list-group-item.disabled:hover .list-group-item-heading,.list-group-item.disabled:focus .list-group-item-heading{color:inherit}.list-group-item.disabled .list-group-item-text,.list-group-item.disabled:hover .list-group-item-text,.list-group-item.disabled:focus .list-group-item-text{color:#777}.list-group-item.active,.list-group-item.active:hover,.list-group-item.active:focus{z-index:2;color:#fff;background-color:#428bca;border-color:#428bca}.list-group-item.active .list-group-item-heading,.list-group-item.active:hover .list-group-item-heading,.list-group-item.active:focus .list-group-item-heading,.list-group-item.active .list-group-item-heading>small,.list-group-item.active:hover .list-group-item-heading>small,.list-group-item.active:focus .list-group-item-heading>small,.list-group-item.active .list-group-item-heading>.small,.list-group-item.active:hover .list-group-item-heading>.small,.list-group-item.active:focus .list-group-item-heading>.small{color:inherit}.list-group-item.active .list-group-item-text,.list-group-item.active:hover .list-group-item-text,.list-group-item.active:focus .list-group-item-text{color:#e1edf7}.list-group-item-success{color:#3c763d;background-color:#dff0d8}a.list-group-item-success{color:#3c763d}a.list-group-item-success .list-group-item-heading{color:inherit}a.list-group-item-success:hover,a.list-group-item-success:focus{color:#3c763d;background-color:#d0e9c6}a.list-group-item-success.active,a.list-group-item-success.active:hover,a.list-group-item-success.active:focus{color:#fff;background-color:#3c763d;border-color:#3c763d}.list-group-item-info{color:#31708f;background-color:#d9edf7}a.list-group-item-info{color:#31708f}a.list-group-item-info .list-group-item-heading{color:inherit}a.list-group-item-info:hover,a.list-group-item-info:focus{color:#31708f;background-color:#c4e3f3}a.list-group-item-info.active,a.list-group-item-info.active:hover,a.list-group-item-info.active:focus{color:#fff;background-color:#31708f;border-color:#31708f}.list-group-item-warning{color:#8a6d3b;background-color:#fcf8e3}a.list-group-item-warning{color:#8a6d3b}a.list-group-item-warning .list-group-item-heading{color:inherit}a.list-group-item-warning:hover,a.list-group-item-warning:focus{color:#8a6d3b;background-color:#faf2cc}a.list-group-item-warning.active,a.list-group-item-warning.active:hover,a.list-group-item-warning.active:focus{color:#fff;background-color:#8a6d3b;border-color:#8a6d3b}.list-group-item-danger{color:#a94442;background-color:#f2dede}a.list-group-item-danger{color:#a94442}a.list-group-item-danger .list-group-item-heading{color:inherit}a.list-group-item-danger:hover,a.list-group-item-danger:focus{color:#a94442;background-color:#ebcccc}a.list-group-item-danger.active,a.list-group-item-danger.active:hover,a.list-group-item-danger.active:focus{color:#fff;background-color:#a94442;border-color:#a94442}.list-group-item-heading{margin-top:0;margin-bottom:5px}.list-group-item-text{margin-bottom:0;line-height:1.3}.panel{margin-bottom:20px;background-color:#fff;border:1px solid transparent;border-radius:4px;-webkit-box-shadow:0 1px 1px rgba(0,0,0,.05);box-shadow:0 1px 1px rgba(0,0,0,.05)}.panel-body{padding:15px}.panel-heading{padding:10px 15px;border-bottom:1px solid transparent;border-top-left-radius:3px;border-top-right-radius:3px}.panel-heading>.dropdown .dropdown-toggle{color:inherit}.panel-title{margin-top:0;margin-bottom:0;font-size:16px;color:inherit}.panel-title>a{color:inherit}.panel-footer{padding:10px 15px;background-color:#f5f5f5;border-top:1px solid #ddd;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.list-group{margin-bottom:0}.panel>.list-group .list-group-item{border-width:1px 0;border-radius:0}.panel>.list-group:first-child .list-group-item:first-child{border-top:0;border-top-left-radius:3px;border-top-right-radius:3px}.panel>.list-group:last-child .list-group-item:last-child{border-bottom:0;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel-heading+.list-group .list-group-item:first-child{border-top-width:0}.list-group+.panel-footer{border-top-width:0}.panel>.table,.panel>.table-responsive>.table,.panel>.panel-collapse>.table{margin-bottom:0}.panel>.table:first-child,.panel>.table-responsive:first-child>.table:first-child{border-top-left-radius:3px;border-top-right-radius:3px}.panel>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table:first-child>thead:first-child>tr:first-child th:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:first-child{border-top-left-radius:3px}.panel>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table:first-child>thead:first-child>tr:first-child th:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:last-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:last-child{border-top-right-radius:3px}.panel>.table:last-child,.panel>.table-responsive:last-child>.table:last-child{border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:first-child{border-bottom-left-radius:3px}.panel>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:last-child{border-bottom-right-radius:3px}.panel>.panel-body+.table,.panel>.panel-body+.table-responsive{border-top:1px solid #ddd}.panel>.table>tbody:first-child>tr:first-child th,.panel>.table>tbody:first-child>tr:first-child td{border-top:0}.panel>.table-bordered,.panel>.table-responsive>.table-bordered{border:0}.panel>.table-bordered>thead>tr>th:first-child,.panel>.table-responsive>.table-bordered>thead>tr>th:first-child,.panel>.table-bordered>tbody>tr>th:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:first-child,.panel>.table-bordered>tfoot>tr>th:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:first-child,.panel>.table-bordered>thead>tr>td:first-child,.panel>.table-responsive>.table-bordered>thead>tr>td:first-child,.panel>.table-bordered>tbody>tr>td:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:first-child,.panel>.table-bordered>tfoot>tr>td:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:first-child{border-left:0}.panel>.table-bordered>thead>tr>th:last-child,.panel>.table-responsive>.table-bordered>thead>tr>th:last-child,.panel>.table-bordered>tbody>tr>th:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:last-child,.panel>.table-bordered>tfoot>tr>th:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:last-child,.panel>.table-bordered>thead>tr>td:last-child,.panel>.table-responsive>.table-bordered>thead>tr>td:last-child,.panel>.table-bordered>tbody>tr>td:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:last-child,.panel>.table-bordered>tfoot>tr>td:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:last-child{border-right:0}.panel>.table-bordered>thead>tr:first-child>td,.panel>.table-responsive>.table-bordered>thead>tr:first-child>td,.panel>.table-bordered>tbody>tr:first-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>td,.panel>.table-bordered>thead>tr:first-child>th,.panel>.table-responsive>.table-bordered>thead>tr:first-child>th,.panel>.table-bordered>tbody>tr:first-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>th{border-bottom:0}.panel>.table-bordered>tbody>tr:last-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>td,.panel>.table-bordered>tfoot>tr:last-child>td,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>td,.panel>.table-bordered>tbody>tr:last-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>th,.panel>.table-bordered>tfoot>tr:last-child>th,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>th{border-bottom:0}.panel>.table-responsive{margin-bottom:0;border:0}.panel-group{margin-bottom:20px}.panel-group .panel{margin-bottom:0;border-radius:4px}.panel-group .panel+.panel{margin-top:5px}.panel-group .panel-heading{border-bottom:0}.panel-group .panel-heading+.panel-collapse>.panel-body{border-top:1px solid #ddd}.panel-group .panel-footer{border-top:0}.panel-group .panel-footer+.panel-collapse .panel-body{border-bottom:1px solid #ddd}.panel-default{border-color:#ddd}.panel-default>.panel-heading{color:#333;background-color:#f5f5f5;border-color:#ddd}.panel-default>.panel-heading+.panel-collapse>.panel-body{border-top-color:#ddd}.panel-default>.panel-heading .badge{color:#f5f5f5;background-color:#333}.panel-default>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#ddd}.panel-primary{border-color:#428bca}.panel-primary>.panel-heading{color:#fff;background-color:#428bca;border-color:#428bca}.panel-primary>.panel-heading+.panel-collapse>.panel-body{border-top-color:#428bca}.panel-primary>.panel-heading .badge{color:#428bca;background-color:#fff}.panel-primary>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#428bca}.panel-success{border-color:#d6e9c6}.panel-success>.panel-heading{color:#3c763d;background-color:#dff0d8;border-color:#d6e9c6}.panel-success>.panel-heading+.panel-collapse>.panel-body{border-top-color:#d6e9c6}.panel-success>.panel-heading .badge{color:#dff0d8;background-color:#3c763d}.panel-success>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#d6e9c6}.panel-info{border-color:#bce8f1}.panel-info>.panel-heading{color:#31708f;background-color:#d9edf7;border-color:#bce8f1}.panel-info>.panel-heading+.panel-collapse>.panel-body{border-top-color:#bce8f1}.panel-info>.panel-heading .badge{color:#d9edf7;background-color:#31708f}.panel-info>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#bce8f1}.panel-warning{border-color:#faebcc}.panel-warning>.panel-heading{color:#8a6d3b;background-color:#fcf8e3;border-color:#faebcc}.panel-warning>.panel-heading+.panel-collapse>.panel-body{border-top-color:#faebcc}.panel-warning>.panel-heading .badge{color:#fcf8e3;background-color:#8a6d3b}.panel-warning>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#faebcc}.panel-danger{border-color:#ebccd1}.panel-danger>.panel-heading{color:#a94442;background-color:#f2dede;border-color:#ebccd1}.panel-danger>.panel-heading+.panel-collapse>.panel-body{border-top-color:#ebccd1}.panel-danger>.panel-heading .badge{color:#f2dede;background-color:#a94442}.panel-danger>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#ebccd1}.embed-responsive{position:relative;display:block;height:0;padding:0;overflow:hidden}.embed-responsive .embed-responsive-item,.embed-responsive iframe,.embed-responsive embed,.embed-responsive object{position:absolute;top:0;bottom:0;left:0;width:100%;height:100%;border:0}.embed-responsive.embed-responsive-16by9{padding-bottom:56.25%}.embed-responsive.embed-responsive-4by3{padding-bottom:75%}.well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#f5f5f5;border:1px solid #e3e3e3;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.05);box-shadow:inset 0 1px 1px rgba(0,0,0,.05)}.well blockquote{border-color:#ddd;border-color:rgba(0,0,0,.15)}.well-lg{padding:24px;border-radius:6px}.well-sm{padding:9px;border-radius:3px}.close{float:right;font-size:21px;font-weight:700;line-height:1;color:#000;text-shadow:0 1px 0 #fff;filter:alpha(opacity=20);opacity:.2}.close:hover,.close:focus{color:#000;text-decoration:none;cursor:pointer;filter:alpha(opacity=50);opacity:.5}button.close{-webkit-appearance:none;padding:0;cursor:pointer;background:0 0;border:0}.modal-open{overflow:hidden}.modal{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1050;display:none;overflow:hidden;-webkit-overflow-scrolling:touch;outline:0}.modal.fade .modal-dialog{-webkit-transition:-webkit-transform .3s ease-out;-o-transition:-o-transform .3s ease-out;transition:transform .3s ease-out;-webkit-transform:translate3d(0,-25%,0);-o-transform:translate3d(0,-25%,0);transform:translate3d(0,-25%,0)}.modal.in .modal-dialog{-webkit-transform:translate3d(0,0,0);-o-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}.modal-open .modal{overflow-x:hidden;overflow-y:auto}.modal-dialog{position:relative;width:auto;margin:10px}.modal-content{position:relative;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #999;border:1px solid rgba(0,0,0,.2);border-radius:6px;outline:0;-webkit-box-shadow:0 3px 9px rgba(0,0,0,.5);box-shadow:0 3px 9px rgba(0,0,0,.5)}.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;background-color:#000}.modal-backdrop.fade{filter:alpha(opacity=0);opacity:0}.modal-backdrop.in{filter:alpha(opacity=50);opacity:.5}.modal-header{min-height:16.43px;padding:15px;border-bottom:1px solid #e5e5e5}.modal-header .close{margin-top:-2px}.modal-title{margin:0;line-height:1.42857143}.modal-body{position:relative;padding:15px}.modal-footer{padding:15px;text-align:right;border-top:1px solid #e5e5e5}.modal-footer .btn+.btn{margin-bottom:0;margin-left:5px}.modal-footer .btn-group .btn+.btn{margin-left:-1px}.modal-footer .btn-block+.btn-block{margin-left:0}.modal-scrollbar-measure{position:absolute;top:-9999px;width:50px;height:50px;overflow:scroll}@media (min-width:768px){.modal-dialog{width:600px;margin:30px auto}.modal-content{-webkit-box-shadow:0 5px 15px rgba(0,0,0,.5);box-shadow:0 5px 15px rgba(0,0,0,.5)}.modal-sm{width:300px}}@media (min-width:992px){.modal-lg{width:900px}}.tooltip{position:absolute;z-index:1070;display:block;font-size:12px;line-height:1.4;visibility:visible;filter:alpha(opacity=0);opacity:0}.tooltip.in{filter:alpha(opacity=90);opacity:.9}.tooltip.top{padding:5px 0;margin-top:-3px}.tooltip.right{padding:0 5px;margin-left:3px}.tooltip.bottom{padding:5px 0;margin-top:3px}.tooltip.left{padding:0 5px;margin-left:-3px}.tooltip-inner{max-width:200px;padding:3px 8px;color:#fff;text-align:center;text-decoration:none;background-color:#000;border-radius:4px}.tooltip-arrow{position:absolute;width:0;height:0;border-color:transparent;border-style:solid}.tooltip.top .tooltip-arrow{bottom:0;left:50%;margin-left:-5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.top-left .tooltip-arrow{bottom:0;left:5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.top-right .tooltip-arrow{right:5px;bottom:0;border-width:5px 5px 0;border-top-color:#000}.tooltip.right .tooltip-arrow{top:50%;left:0;margin-top:-5px;border-width:5px 5px 5px 0;border-right-color:#000}.tooltip.left .tooltip-arrow{top:50%;right:0;margin-top:-5px;border-width:5px 0 5px 5px;border-left-color:#000}.tooltip.bottom .tooltip-arrow{top:0;left:50%;margin-left:-5px;border-width:0 5px 5px;border-bottom-color:#000}.tooltip.bottom-left .tooltip-arrow{top:0;left:5px;border-width:0 5px 5px;border-bottom-color:#000}.tooltip.bottom-right .tooltip-arrow{top:0;right:5px;border-width:0 5px 5px;border-bottom-color:#000}.popover{position:absolute;top:0;left:0;z-index:1060;display:none;max-width:276px;padding:1px;text-align:left;white-space:normal;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #ccc;border:1px solid rgba(0,0,0,.2);border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,.2);box-shadow:0 5px 10px rgba(0,0,0,.2)}.popover.top{margin-top:-10px}.popover.right{margin-left:10px}.popover.bottom{margin-top:10px}.popover.left{margin-left:-10px}.popover-title{padding:8px 14px;margin:0;font-size:14px;font-weight:400;line-height:18px;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;border-radius:5px 5px 0 0}.popover-content{padding:9px 14px}.popover>.arrow,.popover>.arrow:after{position:absolute;display:block;width:0;height:0;border-color:transparent;border-style:solid}.popover>.arrow{border-width:11px}.popover>.arrow:after{content:"";border-width:10px}.popover.top>.arrow{bottom:-11px;left:50%;margin-left:-11px;border-top-color:#999;border-top-color:rgba(0,0,0,.25);border-bottom-width:0}.popover.top>.arrow:after{bottom:1px;margin-left:-10px;content:" ";border-top-color:#fff;border-bottom-width:0}.popover.right>.arrow{top:50%;left:-11px;margin-top:-11px;border-right-color:#999;border-right-color:rgba(0,0,0,.25);border-left-width:0}.popover.right>.arrow:after{bottom:-10px;left:1px;content:" ";border-right-color:#fff;border-left-width:0}.popover.bottom>.arrow{top:-11px;left:50%;margin-left:-11px;border-top-width:0;border-bottom-color:#999;border-bottom-color:rgba(0,0,0,.25)}.popover.bottom>.arrow:after{top:1px;margin-left:-10px;content:" ";border-top-width:0;border-bottom-color:#fff}.popover.left>.arrow{top:50%;right:-11px;margin-top:-11px;border-right-width:0;border-left-color:#999;border-left-color:rgba(0,0,0,.25)}.popover.left>.arrow:after{right:1px;bottom:-10px;content:" ";border-right-width:0;border-left-color:#fff}.carousel{position:relative}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel-inner>.item{position:relative;display:none;-webkit-transition:.6s ease-in-out left;-o-transition:.6s ease-in-out left;transition:.6s ease-in-out left}.carousel-inner>.item>img,.carousel-inner>.item>a>img{line-height:1}.carousel-inner>.active,.carousel-inner>.next,.carousel-inner>.prev{display:block}.carousel-inner>.active{left:0}.carousel-inner>.next,.carousel-inner>.prev{position:absolute;top:0;width:100%}.carousel-inner>.next{left:100%}.carousel-inner>.prev{left:-100%}.carousel-inner>.next.left,.carousel-inner>.prev.right{left:0}.carousel-inner>.active.left{left:-100%}.carousel-inner>.active.right{left:100%}.carousel-control{position:absolute;top:0;bottom:0;left:0;width:15%;font-size:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,.6);filter:alpha(opacity=50);opacity:.5}.carousel-control.left{background-image:-webkit-linear-gradient(left,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);background-image:-o-linear-gradient(left,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);background-image:-webkit-gradient(linear,left top,right top,from(rgba(0,0,0,.5)),to(rgba(0,0,0,.0001)));background-image:linear-gradient(to right,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1);background-repeat:repeat-x}.carousel-control.right{right:0;left:auto;background-image:-webkit-linear-gradient(left,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);background-image:-o-linear-gradient(left,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);background-image:-webkit-gradient(linear,left top,right top,from(rgba(0,0,0,.0001)),to(rgba(0,0,0,.5)));background-image:linear-gradient(to right,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1);background-repeat:repeat-x}.carousel-control:hover,.carousel-control:focus{color:#fff;text-decoration:none;filter:alpha(opacity=90);outline:0;opacity:.9}.carousel-control .icon-prev,.carousel-control .icon-next,.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right{position:absolute;top:50%;z-index:5;display:inline-block}.carousel-control .icon-prev,.carousel-control .glyphicon-chevron-left{left:50%;margin-left:-10px}.carousel-control .icon-next,.carousel-control .glyphicon-chevron-right{right:50%;margin-right:-10px}.carousel-control .icon-prev,.carousel-control .icon-next{width:20px;height:20px;margin-top:-10px;font-family:serif}.carousel-control .icon-prev:before{content:'\2039'}.carousel-control .icon-next:before{content:'\203a'}.carousel-indicators{position:absolute;bottom:10px;left:50%;z-index:15;width:60%;padding-left:0;margin-left:-30%;text-align:center;list-style:none}.carousel-indicators li{display:inline-block;width:10px;height:10px;margin:1px;text-indent:-999px;cursor:pointer;background-color:#000 \9;background-color:rgba(0,0,0,0);border:1px solid #fff;border-radius:10px}.carousel-indicators .active{width:12px;height:12px;margin:0;background-color:#fff}.carousel-caption{position:absolute;right:15%;bottom:20px;left:15%;z-index:10;padding-top:20px;padding-bottom:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,.6)}.carousel-caption .btn{text-shadow:none}@media screen and (min-width:768px){.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right,.carousel-control .icon-prev,.carousel-control .icon-next{width:30px;height:30px;margin-top:-15px;font-size:30px}.carousel-control .glyphicon-chevron-left,.carousel-control .icon-prev{margin-left:-15px}.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next{margin-right:-15px}.carousel-caption{right:20%;left:20%;padding-bottom:30px}.carousel-indicators{bottom:20px}}.clearfix:before,.clearfix:after,.dl-horizontal dd:before,.dl-horizontal dd:after,.container:before,.container:after,.container-fluid:before,.container-fluid:after,.row:before,.row:after,.form-horizontal .form-group:before,.form-horizontal .form-group:after,.btn-toolbar:before,.btn-toolbar:after,.btn-group-vertical>.btn-group:before,.btn-group-vertical>.btn-group:after,.nav:before,.nav:after,.navbar:before,.navbar:after,.navbar-header:before,.navbar-header:after,.navbar-collapse:before,.navbar-collapse:after,.pager:before,.pager:after,.panel-body:before,.panel-body:after,.modal-footer:before,.modal-footer:after{display:table;content:" "}.clearfix:after,.dl-horizontal dd:after,.container:after,.container-fluid:after,.row:after,.form-horizontal .form-group:after,.btn-toolbar:after,.btn-group-vertical>.btn-group:after,.nav:after,.navbar:after,.navbar-header:after,.navbar-collapse:after,.pager:after,.panel-body:after,.modal-footer:after{clear:both}.center-block{display:block;margin-right:auto;margin-left:auto}.pull-right{float:right!important}.pull-left{float:left!important}.hide{display:none!important}.show{display:block!important}.invisible{visibility:hidden}.text-hide{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.hidden{display:none!important;visibility:hidden!important}.affix{position:fixed;-webkit-transform:translate3d(0,0,0);-o-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}@-ms-viewport{width:device-width}.visible-xs,.visible-sm,.visible-md,.visible-lg{display:none!important}.visible-xs-block,.visible-xs-inline,.visible-xs-inline-block,.visible-sm-block,.visible-sm-inline,.visible-sm-inline-block,.visible-md-block,.visible-md-inline,.visible-md-inline-block,.visible-lg-block,.visible-lg-inline,.visible-lg-inline-block{display:none!important}@media (max-width:767px){.visible-xs{display:block!important}table.visible-xs{display:table}tr.visible-xs{display:table-row!important}th.visible-xs,td.visible-xs{display:table-cell!important}}@media (max-width:767px){.visible-xs-block{display:block!important}}@media (max-width:767px){.visible-xs-inline{display:inline!important}}@media (max-width:767px){.visible-xs-inline-block{display:inline-block!important}}@media (min-width:768px) and (max-width:991px){.visible-sm{display:block!important}table.visible-sm{display:table}tr.visible-sm{display:table-row!important}th.visible-sm,td.visible-sm{display:table-cell!important}}@media (min-width:768px) and (max-width:991px){.visible-sm-block{display:block!important}}@media (min-width:768px) and (max-width:991px){.visible-sm-inline{display:inline!important}}@media (min-width:768px) and (max-width:991px){.visible-sm-inline-block{display:inline-block!important}}@media (min-width:992px) and (max-width:1199px){.visible-md{display:block!important}table.visible-md{display:table}tr.visible-md{display:table-row!important}th.visible-md,td.visible-md{display:table-cell!important}}@media (min-width:992px) and (max-width:1199px){.visible-md-block{display:block!important}}@media (min-width:992px) and (max-width:1199px){.visible-md-inline{display:inline!important}}@media (min-width:992px) and (max-width:1199px){.visible-md-inline-block{display:inline-block!important}}@media (min-width:1200px){.visible-lg{display:block!important}table.visible-lg{display:table}tr.visible-lg{display:table-row!important}th.visible-lg,td.visible-lg{display:table-cell!important}}@media (min-width:1200px){.visible-lg-block{display:block!important}}@media (min-width:1200px){.visible-lg-inline{display:inline!important}}@media (min-width:1200px){.visible-lg-inline-block{display:inline-block!important}}@media (max-width:767px){.hidden-xs{display:none!important}}@media (min-width:768px) and (max-width:991px){.hidden-sm{display:none!important}}@media (min-width:992px) and (max-width:1199px){.hidden-md{display:none!important}}@media (min-width:1200px){.hidden-lg{display:none!important}}.visible-print{display:none!important}@media print{.visible-print{display:block!important}table.visible-print{display:table}tr.visible-print{display:table-row!important}th.visible-print,td.visible-print{display:table-cell!important}}.visible-print-block{display:none!important}@media print{.visible-print-block{display:block!important}}.visible-print-inline{display:none!important}@media print{.visible-print-inline{display:inline!important}}.visible-print-inline-block{display:none!important}@media print{.visible-print-inline-block{display:inline-block!important}}@media print{.hidden-print{display:none!important}} \ No newline at end of file diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/demultiplexing/html/bootstrap3/fonts/glyphicons-halflings-regular.eot b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/demultiplexing/html/bootstrap3/fonts/glyphicons-halflings-regular.eot deleted file mode 100644 index 4a4ca865d67e86f961bc6e2ef00bffa4e34bb9ed..0000000000000000000000000000000000000000 Binary files a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/demultiplexing/html/bootstrap3/fonts/glyphicons-halflings-regular.eot and /dev/null differ diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/demultiplexing/html/bootstrap3/fonts/glyphicons-halflings-regular.svg b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/demultiplexing/html/bootstrap3/fonts/glyphicons-halflings-regular.svg deleted file mode 100644 index e3e2dc739dd851f2d7d291be032e30b909e3e95f..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/demultiplexing/html/bootstrap3/fonts/glyphicons-halflings-regular.svg +++ /dev/null @@ -1,229 +0,0 @@ -<?xml version="1.0" standalone="no"?> -<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" > -<svg xmlns="http://www.w3.org/2000/svg"> -<metadata></metadata> -<defs> -<font id="glyphicons_halflingsregular" horiz-adv-x="1200" > -<font-face units-per-em="1200" ascent="960" descent="-240" /> -<missing-glyph horiz-adv-x="500" /> -<glyph /> -<glyph /> -<glyph unicode="
" /> -<glyph unicode=" " /> -<glyph unicode="*" d="M100 500v200h259l-183 183l141 141l183 -183v259h200v-259l183 183l141 -141l-183 -183h259v-200h-259l183 -183l-141 -141l-183 183v-259h-200v259l-183 -183l-141 141l183 183h-259z" /> -<glyph unicode="+" d="M0 400v300h400v400h300v-400h400v-300h-400v-400h-300v400h-400z" /> -<glyph unicode=" " /> -<glyph unicode=" " horiz-adv-x="652" /> -<glyph unicode=" " horiz-adv-x="1304" /> -<glyph unicode=" " horiz-adv-x="652" /> -<glyph unicode=" " horiz-adv-x="1304" /> -<glyph unicode=" " horiz-adv-x="434" /> -<glyph unicode=" " horiz-adv-x="326" /> -<glyph unicode=" " horiz-adv-x="217" /> -<glyph unicode=" " horiz-adv-x="217" /> -<glyph unicode=" " horiz-adv-x="163" /> -<glyph unicode=" " horiz-adv-x="260" /> -<glyph unicode=" " horiz-adv-x="72" /> -<glyph unicode=" " horiz-adv-x="260" /> -<glyph unicode=" " horiz-adv-x="326" /> -<glyph unicode="€" d="M100 500l100 100h113q0 47 5 100h-218l100 100h135q37 167 112 257q117 141 297 141q242 0 354 -189q60 -103 66 -209h-181q0 55 -25.5 99t-63.5 68t-75 36.5t-67 12.5q-24 0 -52.5 -10t-62.5 -32t-65.5 -67t-50.5 -107h379l-100 -100h-300q-6 -46 -6 -100h406l-100 -100 h-300q9 -74 33 -132t52.5 -91t62 -54.5t59 -29t46.5 -7.5q29 0 66 13t75 37t63.5 67.5t25.5 96.5h174q-31 -172 -128 -278q-107 -117 -274 -117q-205 0 -324 158q-36 46 -69 131.5t-45 205.5h-217z" /> -<glyph unicode="−" d="M200 400h900v300h-900v-300z" /> -<glyph unicode="◼" horiz-adv-x="500" d="M0 0z" /> -<glyph unicode="☁" d="M-14 494q0 -80 56.5 -137t135.5 -57h750q120 0 205 86.5t85 207.5t-85 207t-205 86q-46 0 -90 -14q-44 97 -134.5 156.5t-200.5 59.5q-152 0 -260 -107.5t-108 -260.5q0 -25 2 -37q-66 -14 -108.5 -67.5t-42.5 -122.5z" /> -<glyph unicode="✉" d="M0 100l400 400l200 -200l200 200l400 -400h-1200zM0 300v600l300 -300zM0 1100l600 -603l600 603h-1200zM900 600l300 300v-600z" /> -<glyph unicode="✏" d="M-13 -13l333 112l-223 223zM187 403l214 -214l614 614l-214 214zM887 1103l214 -214l99 92q13 13 13 32.5t-13 33.5l-153 153q-15 13 -33 13t-33 -13z" /> -<glyph unicode="" d="M0 1200h1200l-500 -550v-550h300v-100h-800v100h300v550z" /> -<glyph unicode="" d="M14 84q18 -55 86 -75.5t147 5.5q65 21 109 69t44 90v606l600 155v-521q-64 16 -138 -7q-79 -26 -122.5 -83t-25.5 -111q18 -55 86 -75.5t147 4.5q70 23 111.5 63.5t41.5 95.5v881q0 10 -7 15.5t-17 2.5l-752 -193q-10 -3 -17 -12.5t-7 -19.5v-689q-64 17 -138 -7 q-79 -25 -122.5 -82t-25.5 -112z" /> -<glyph unicode="" d="M23 693q0 200 142 342t342 142t342 -142t142 -342q0 -142 -78 -261l300 -300q7 -8 7 -18t-7 -18l-109 -109q-8 -7 -18 -7t-18 7l-300 300q-119 -78 -261 -78q-200 0 -342 142t-142 342zM176 693q0 -136 97 -233t234 -97t233.5 96.5t96.5 233.5t-96.5 233.5t-233.5 96.5 t-234 -97t-97 -233z" /> -<glyph unicode="" d="M100 784q0 64 28 123t73 100.5t104.5 64t119 20.5t120 -38.5t104.5 -104.5q48 69 109.5 105t121.5 38t118.5 -20.5t102.5 -64t71 -100.5t27 -123q0 -57 -33.5 -117.5t-94 -124.5t-126.5 -127.5t-150 -152.5t-146 -174q-62 85 -145.5 174t-149.5 152.5t-126.5 127.5 t-94 124.5t-33.5 117.5z" /> -<glyph unicode="" d="M-72 800h479l146 400h2l146 -400h472l-382 -278l145 -449l-384 275l-382 -275l146 447zM168 71l2 1z" /> -<glyph unicode="" d="M-72 800h479l146 400h2l146 -400h472l-382 -278l145 -449l-384 275l-382 -275l146 447zM168 71l2 1zM237 700l196 -142l-73 -226l192 140l195 -141l-74 229l193 140h-235l-77 211l-78 -211h-239z" /> -<glyph unicode="" d="M0 0v143l400 257v100q-37 0 -68.5 74.5t-31.5 125.5v200q0 124 88 212t212 88t212 -88t88 -212v-200q0 -51 -31.5 -125.5t-68.5 -74.5v-100l400 -257v-143h-1200z" /> -<glyph unicode="" d="M0 0v1100h1200v-1100h-1200zM100 100h100v100h-100v-100zM100 300h100v100h-100v-100zM100 500h100v100h-100v-100zM100 700h100v100h-100v-100zM100 900h100v100h-100v-100zM300 100h600v400h-600v-400zM300 600h600v400h-600v-400zM1000 100h100v100h-100v-100z M1000 300h100v100h-100v-100zM1000 500h100v100h-100v-100zM1000 700h100v100h-100v-100zM1000 900h100v100h-100v-100z" /> -<glyph unicode="" d="M0 50v400q0 21 14.5 35.5t35.5 14.5h400q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5zM0 650v400q0 21 14.5 35.5t35.5 14.5h400q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-400 q-21 0 -35.5 14.5t-14.5 35.5zM600 50v400q0 21 14.5 35.5t35.5 14.5h400q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5zM600 650v400q0 21 14.5 35.5t35.5 14.5h400q21 0 35.5 -14.5t14.5 -35.5v-400 q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5z" /> -<glyph unicode="" d="M0 50v200q0 21 14.5 35.5t35.5 14.5h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5zM0 450v200q0 21 14.5 35.5t35.5 14.5h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200 q-21 0 -35.5 14.5t-14.5 35.5zM0 850v200q0 21 14.5 35.5t35.5 14.5h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5zM400 50v200q0 21 14.5 35.5t35.5 14.5h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5 t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5zM400 450v200q0 21 14.5 35.5t35.5 14.5h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5zM400 850v200q0 21 14.5 35.5t35.5 14.5h200q21 0 35.5 -14.5t14.5 -35.5 v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5zM800 50v200q0 21 14.5 35.5t35.5 14.5h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5zM800 450v200q0 21 14.5 35.5t35.5 14.5h200 q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5zM800 850v200q0 21 14.5 35.5t35.5 14.5h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5z" /> -<glyph unicode="" d="M0 50v200q0 21 14.5 35.5t35.5 14.5h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5zM0 450q0 -21 14.5 -35.5t35.5 -14.5h200q21 0 35.5 14.5t14.5 35.5v200q0 21 -14.5 35.5t-35.5 14.5h-200q-21 0 -35.5 -14.5 t-14.5 -35.5v-200zM0 850v200q0 21 14.5 35.5t35.5 14.5h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5zM400 50v200q0 21 14.5 35.5t35.5 14.5h700q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5 t-35.5 -14.5h-700q-21 0 -35.5 14.5t-14.5 35.5zM400 450v200q0 21 14.5 35.5t35.5 14.5h700q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-700q-21 0 -35.5 14.5t-14.5 35.5zM400 850v200q0 21 14.5 35.5t35.5 14.5h700q21 0 35.5 -14.5t14.5 -35.5 v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-700q-21 0 -35.5 14.5t-14.5 35.5z" /> -<glyph unicode="" d="M29 454l419 -420l818 820l-212 212l-607 -607l-206 207z" /> -<glyph unicode="" d="M106 318l282 282l-282 282l212 212l282 -282l282 282l212 -212l-282 -282l282 -282l-212 -212l-282 282l-282 -282z" /> -<glyph unicode="" d="M23 693q0 200 142 342t342 142t342 -142t142 -342q0 -142 -78 -261l300 -300q7 -8 7 -18t-7 -18l-109 -109q-8 -7 -18 -7t-18 7l-300 300q-119 -78 -261 -78q-200 0 -342 142t-142 342zM176 693q0 -136 97 -233t234 -97t233.5 96.5t96.5 233.5t-96.5 233.5t-233.5 96.5 t-234 -97t-97 -233zM300 600v200h100v100h200v-100h100v-200h-100v-100h-200v100h-100z" /> -<glyph unicode="" d="M23 694q0 200 142 342t342 142t342 -142t142 -342q0 -141 -78 -262l300 -299q7 -7 7 -18t-7 -18l-109 -109q-8 -8 -18 -8t-18 8l-300 300q-119 -78 -261 -78q-200 0 -342 142t-142 342zM176 694q0 -136 97 -233t234 -97t233.5 97t96.5 233t-96.5 233t-233.5 97t-234 -97 t-97 -233zM300 601h400v200h-400v-200z" /> -<glyph unicode="" d="M23 600q0 183 105 331t272 210v-166q-103 -55 -165 -155t-62 -220q0 -177 125 -302t302 -125t302 125t125 302q0 120 -62 220t-165 155v166q167 -62 272 -210t105 -331q0 -118 -45.5 -224.5t-123 -184t-184 -123t-224.5 -45.5t-224.5 45.5t-184 123t-123 184t-45.5 224.5 zM500 750q0 -21 14.5 -35.5t35.5 -14.5h100q21 0 35.5 14.5t14.5 35.5v400q0 21 -14.5 35.5t-35.5 14.5h-100q-21 0 -35.5 -14.5t-14.5 -35.5v-400z" /> -<glyph unicode="" d="M100 1h200v300h-200v-300zM400 1v500h200v-500h-200zM700 1v800h200v-800h-200zM1000 1v1200h200v-1200h-200z" /> -<glyph unicode="" d="M26 601q0 -33 6 -74l151 -38l2 -6q14 -49 38 -93l3 -5l-80 -134q45 -59 105 -105l133 81l5 -3q45 -26 94 -39l5 -2l38 -151q40 -5 74 -5q27 0 74 5l38 151l6 2q46 13 93 39l5 3l134 -81q56 44 104 105l-80 134l3 5q24 44 39 93l1 6l152 38q5 40 5 74q0 28 -5 73l-152 38 l-1 6q-16 51 -39 93l-3 5l80 134q-44 58 -104 105l-134 -81l-5 3q-45 25 -93 39l-6 1l-38 152q-40 5 -74 5q-27 0 -74 -5l-38 -152l-5 -1q-50 -14 -94 -39l-5 -3l-133 81q-59 -47 -105 -105l80 -134l-3 -5q-25 -47 -38 -93l-2 -6l-151 -38q-6 -48 -6 -73zM385 601 q0 88 63 151t152 63t152 -63t63 -151q0 -89 -63 -152t-152 -63t-152 63t-63 152z" /> -<glyph unicode="" d="M100 1025v50q0 10 7.5 17.5t17.5 7.5h275v100q0 41 29.5 70.5t70.5 29.5h300q41 0 70.5 -29.5t29.5 -70.5v-100h275q10 0 17.5 -7.5t7.5 -17.5v-50q0 -11 -7 -18t-18 -7h-1050q-11 0 -18 7t-7 18zM200 100v800h900v-800q0 -41 -29.5 -71t-70.5 -30h-700q-41 0 -70.5 30 t-29.5 71zM300 100h100v700h-100v-700zM500 100h100v700h-100v-700zM500 1100h300v100h-300v-100zM700 100h100v700h-100v-700zM900 100h100v700h-100v-700z" /> -<glyph unicode="" d="M1 601l656 644l644 -644h-200v-600h-300v400h-300v-400h-300v600h-200z" /> -<glyph unicode="" d="M100 25v1150q0 11 7 18t18 7h475v-500h400v-675q0 -11 -7 -18t-18 -7h-850q-11 0 -18 7t-7 18zM700 800v300l300 -300h-300z" /> -<glyph unicode="" d="M4 600q0 162 80 299t217 217t299 80t299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299zM186 600q0 -171 121.5 -292.5t292.5 -121.5t292.5 121.5t121.5 292.5t-121.5 292.5t-292.5 121.5t-292.5 -121.5t-121.5 -292.5zM500 500v400h100 v-300h200v-100h-300z" /> -<glyph unicode="" d="M-100 0l431 1200h209l-21 -300h162l-20 300h208l431 -1200h-538l-41 400h-242l-40 -400h-539zM488 500h224l-27 300h-170z" /> -<glyph unicode="" d="M0 0v400h490l-290 300h200v500h300v-500h200l-290 -300h490v-400h-1100zM813 200h175v100h-175v-100z" /> -<glyph unicode="" d="M1 600q0 122 47.5 233t127.5 191t191 127.5t233 47.5t233 -47.5t191 -127.5t127.5 -191t47.5 -233t-47.5 -233t-127.5 -191t-191 -127.5t-233 -47.5t-233 47.5t-191 127.5t-127.5 191t-47.5 233zM188 600q0 -170 121 -291t291 -121t291 121t121 291t-121 291t-291 121 t-291 -121t-121 -291zM350 600h150v300h200v-300h150l-250 -300z" /> -<glyph unicode="" d="M4 600q0 162 80 299t217 217t299 80t299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299zM186 600q0 -171 121.5 -292.5t292.5 -121.5t292.5 121.5t121.5 292.5t-121.5 292.5t-292.5 121.5t-292.5 -121.5t-121.5 -292.5zM350 600l250 300 l250 -300h-150v-300h-200v300h-150z" /> -<glyph unicode="" d="M0 25v475l200 700h800l199 -700l1 -475q0 -11 -7 -18t-18 -7h-1150q-11 0 -18 7t-7 18zM200 500h200l50 -200h300l50 200h200l-97 500h-606z" /> -<glyph unicode="" d="M4 600q0 162 80 299t217 217t299 80t299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299zM186 600q0 -172 121.5 -293t292.5 -121t292.5 121t121.5 293q0 171 -121.5 292.5t-292.5 121.5t-292.5 -121.5t-121.5 -292.5zM500 397v401 l297 -200z" /> -<glyph unicode="" d="M23 600q0 -118 45.5 -224.5t123 -184t184 -123t224.5 -45.5t224.5 45.5t184 123t123 184t45.5 224.5h-150q0 -177 -125 -302t-302 -125t-302 125t-125 302t125 302t302 125q136 0 246 -81l-146 -146h400v400l-145 -145q-157 122 -355 122q-118 0 -224.5 -45.5t-184 -123 t-123 -184t-45.5 -224.5z" /> -<glyph unicode="" d="M23 600q0 118 45.5 224.5t123 184t184 123t224.5 45.5q198 0 355 -122l145 145v-400h-400l147 147q-112 80 -247 80q-177 0 -302 -125t-125 -302h-150zM100 0v400h400l-147 -147q112 -80 247 -80q177 0 302 125t125 302h150q0 -118 -45.5 -224.5t-123 -184t-184 -123 t-224.5 -45.5q-198 0 -355 122z" /> -<glyph unicode="" d="M100 0h1100v1200h-1100v-1200zM200 100v900h900v-900h-900zM300 200v100h100v-100h-100zM300 400v100h100v-100h-100zM300 600v100h100v-100h-100zM300 800v100h100v-100h-100zM500 200h500v100h-500v-100zM500 400v100h500v-100h-500zM500 600v100h500v-100h-500z M500 800v100h500v-100h-500z" /> -<glyph unicode="" d="M0 100v600q0 41 29.5 70.5t70.5 29.5h100v200q0 82 59 141t141 59h300q82 0 141 -59t59 -141v-200h100q41 0 70.5 -29.5t29.5 -70.5v-600q0 -41 -29.5 -70.5t-70.5 -29.5h-900q-41 0 -70.5 29.5t-29.5 70.5zM400 800h300v150q0 21 -14.5 35.5t-35.5 14.5h-200 q-21 0 -35.5 -14.5t-14.5 -35.5v-150z" /> -<glyph unicode="" d="M100 0v1100h100v-1100h-100zM300 400q60 60 127.5 84t127.5 17.5t122 -23t119 -30t110 -11t103 42t91 120.5v500q-40 -81 -101.5 -115.5t-127.5 -29.5t-138 25t-139.5 40t-125.5 25t-103 -29.5t-65 -115.5v-500z" /> -<glyph unicode="" d="M0 275q0 -11 7 -18t18 -7h50q11 0 18 7t7 18v300q0 127 70.5 231.5t184.5 161.5t245 57t245 -57t184.5 -161.5t70.5 -231.5v-300q0 -11 7 -18t18 -7h50q11 0 18 7t7 18v300q0 116 -49.5 227t-131 192.5t-192.5 131t-227 49.5t-227 -49.5t-192.5 -131t-131 -192.5 t-49.5 -227v-300zM200 20v460q0 8 6 14t14 6h160q8 0 14 -6t6 -14v-460q0 -8 -6 -14t-14 -6h-160q-8 0 -14 6t-6 14zM800 20v460q0 8 6 14t14 6h160q8 0 14 -6t6 -14v-460q0 -8 -6 -14t-14 -6h-160q-8 0 -14 6t-6 14z" /> -<glyph unicode="" d="M0 400h300l300 -200v800l-300 -200h-300v-400zM688 459l141 141l-141 141l71 71l141 -141l141 141l71 -71l-141 -141l141 -141l-71 -71l-141 141l-141 -141z" /> -<glyph unicode="" d="M0 400h300l300 -200v800l-300 -200h-300v-400zM700 857l69 53q111 -135 111 -310q0 -169 -106 -302l-67 54q86 110 86 248q0 146 -93 257z" /> -<glyph unicode="" d="M0 401v400h300l300 200v-800l-300 200h-300zM702 858l69 53q111 -135 111 -310q0 -170 -106 -303l-67 55q86 110 86 248q0 145 -93 257zM889 951l7 -8q123 -151 123 -344q0 -189 -119 -339l-7 -8l81 -66l6 8q142 178 142 405q0 230 -144 408l-6 8z" /> -<glyph unicode="" d="M0 0h500v500h-200v100h-100v-100h-200v-500zM0 600h100v100h400v100h100v100h-100v300h-500v-600zM100 100v300h300v-300h-300zM100 800v300h300v-300h-300zM200 200v100h100v-100h-100zM200 900h100v100h-100v-100zM500 500v100h300v-300h200v-100h-100v-100h-200v100 h-100v100h100v200h-200zM600 0v100h100v-100h-100zM600 1000h100v-300h200v-300h300v200h-200v100h200v500h-600v-200zM800 800v300h300v-300h-300zM900 0v100h300v-100h-300zM900 900v100h100v-100h-100zM1100 200v100h100v-100h-100z" /> -<glyph unicode="" d="M0 200h100v1000h-100v-1000zM100 0v100h300v-100h-300zM200 200v1000h100v-1000h-100zM500 0v91h100v-91h-100zM500 200v1000h200v-1000h-200zM700 0v91h100v-91h-100zM800 200v1000h100v-1000h-100zM900 0v91h200v-91h-200zM1000 200v1000h200v-1000h-200z" /> -<glyph unicode="" d="M0 700l1 475q0 10 7.5 17.5t17.5 7.5h474l700 -700l-500 -500zM148 953q0 -42 29 -71q30 -30 71.5 -30t71.5 30q29 29 29 71t-29 71q-30 30 -71.5 30t-71.5 -30q-29 -29 -29 -71z" /> -<glyph unicode="" d="M1 700l1 475q0 11 7 18t18 7h474l700 -700l-500 -500zM148 953q0 -42 30 -71q29 -30 71 -30t71 30q30 29 30 71t-30 71q-29 30 -71 30t-71 -30q-30 -29 -30 -71zM701 1200h100l700 -700l-500 -500l-50 50l450 450z" /> -<glyph unicode="" d="M100 0v1025l175 175h925v-1000l-100 -100v1000h-750l-100 -100h750v-1000h-900z" /> -<glyph unicode="" d="M200 0l450 444l450 -443v1150q0 20 -14.5 35t-35.5 15h-800q-21 0 -35.5 -15t-14.5 -35v-1151z" /> -<glyph unicode="" d="M0 100v700h200l100 -200h600l100 200h200v-700h-200v200h-800v-200h-200zM253 829l40 -124h592l62 124l-94 346q-2 11 -10 18t-18 7h-450q-10 0 -18 -7t-10 -18zM281 24l38 152q2 10 11.5 17t19.5 7h500q10 0 19.5 -7t11.5 -17l38 -152q2 -10 -3.5 -17t-15.5 -7h-600 q-10 0 -15.5 7t-3.5 17z" /> -<glyph unicode="" d="M0 200q0 -41 29.5 -70.5t70.5 -29.5h1000q41 0 70.5 29.5t29.5 70.5v600q0 41 -29.5 70.5t-70.5 29.5h-150q-4 8 -11.5 21.5t-33 48t-53 61t-69 48t-83.5 21.5h-200q-41 0 -82 -20.5t-70 -50t-52 -59t-34 -50.5l-12 -20h-150q-41 0 -70.5 -29.5t-29.5 -70.5v-600z M356 500q0 100 72 172t172 72t172 -72t72 -172t-72 -172t-172 -72t-172 72t-72 172zM494 500q0 -44 31 -75t75 -31t75 31t31 75t-31 75t-75 31t-75 -31t-31 -75zM900 700v100h100v-100h-100z" /> -<glyph unicode="" d="M53 0h365v66q-41 0 -72 11t-49 38t1 71l92 234h391l82 -222q16 -45 -5.5 -88.5t-74.5 -43.5v-66h417v66q-34 1 -74 43q-18 19 -33 42t-21 37l-6 13l-385 998h-93l-399 -1006q-24 -48 -52 -75q-12 -12 -33 -25t-36 -20l-15 -7v-66zM416 521l178 457l46 -140l116 -317h-340 z" /> -<glyph unicode="" d="M100 0v89q41 7 70.5 32.5t29.5 65.5v827q0 28 -1 39.5t-5.5 26t-15.5 21t-29 14t-49 14.5v71l471 -1q120 0 213 -88t93 -228q0 -55 -11.5 -101.5t-28 -74t-33.5 -47.5t-28 -28l-12 -7q8 -3 21.5 -9t48 -31.5t60.5 -58t47.5 -91.5t21.5 -129q0 -84 -59 -156.5t-142 -111 t-162 -38.5h-500zM400 200h161q89 0 153 48.5t64 132.5q0 90 -62.5 154.5t-156.5 64.5h-159v-400zM400 700h139q76 0 130 61.5t54 138.5q0 82 -84 130.5t-239 48.5v-379z" /> -<glyph unicode="" d="M200 0v57q77 7 134.5 40.5t65.5 80.5l173 849q10 56 -10 74t-91 37q-6 1 -10.5 2.5t-9.5 2.5v57h425l2 -57q-33 -8 -62 -25.5t-46 -37t-29.5 -38t-17.5 -30.5l-5 -12l-128 -825q-10 -52 14 -82t95 -36v-57h-500z" /> -<glyph unicode="" d="M-75 200h75v800h-75l125 167l125 -167h-75v-800h75l-125 -167zM300 900v300h150h700h150v-300h-50q0 29 -8 48.5t-18.5 30t-33.5 15t-39.5 5.5t-50.5 1h-200v-850l100 -50v-100h-400v100l100 50v850h-200q-34 0 -50.5 -1t-40 -5.5t-33.5 -15t-18.5 -30t-8.5 -48.5h-49z " /> -<glyph unicode="" d="M33 51l167 125v-75h800v75l167 -125l-167 -125v75h-800v-75zM100 901v300h150h700h150v-300h-50q0 29 -8 48.5t-18 30t-33.5 15t-40 5.5t-50.5 1h-200v-650l100 -50v-100h-400v100l100 50v650h-200q-34 0 -50.5 -1t-39.5 -5.5t-33.5 -15t-18.5 -30t-8 -48.5h-50z" /> -<glyph unicode="" d="M0 50q0 -20 14.5 -35t35.5 -15h1100q21 0 35.5 15t14.5 35v100q0 21 -14.5 35.5t-35.5 14.5h-1100q-21 0 -35.5 -14.5t-14.5 -35.5v-100zM0 350q0 -20 14.5 -35t35.5 -15h800q21 0 35.5 15t14.5 35v100q0 21 -14.5 35.5t-35.5 14.5h-800q-21 0 -35.5 -14.5t-14.5 -35.5 v-100zM0 650q0 -20 14.5 -35t35.5 -15h1000q21 0 35.5 15t14.5 35v100q0 21 -14.5 35.5t-35.5 14.5h-1000q-21 0 -35.5 -14.5t-14.5 -35.5v-100zM0 950q0 -20 14.5 -35t35.5 -15h600q21 0 35.5 15t14.5 35v100q0 21 -14.5 35.5t-35.5 14.5h-600q-21 0 -35.5 -14.5 t-14.5 -35.5v-100z" /> -<glyph unicode="" d="M0 50q0 -20 14.5 -35t35.5 -15h1100q21 0 35.5 15t14.5 35v100q0 21 -14.5 35.5t-35.5 14.5h-1100q-21 0 -35.5 -14.5t-14.5 -35.5v-100zM0 650q0 -20 14.5 -35t35.5 -15h1100q21 0 35.5 15t14.5 35v100q0 21 -14.5 35.5t-35.5 14.5h-1100q-21 0 -35.5 -14.5t-14.5 -35.5 v-100zM200 350q0 -20 14.5 -35t35.5 -15h700q21 0 35.5 15t14.5 35v100q0 21 -14.5 35.5t-35.5 14.5h-700q-21 0 -35.5 -14.5t-14.5 -35.5v-100zM200 950q0 -20 14.5 -35t35.5 -15h700q21 0 35.5 15t14.5 35v100q0 21 -14.5 35.5t-35.5 14.5h-700q-21 0 -35.5 -14.5 t-14.5 -35.5v-100z" /> -<glyph unicode="" d="M0 50v100q0 21 14.5 35.5t35.5 14.5h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-1100q-21 0 -35.5 15t-14.5 35zM100 650v100q0 21 14.5 35.5t35.5 14.5h1000q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-1000q-21 0 -35.5 15 t-14.5 35zM300 350v100q0 21 14.5 35.5t35.5 14.5h800q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-800q-21 0 -35.5 15t-14.5 35zM500 950v100q0 21 14.5 35.5t35.5 14.5h600q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-600 q-21 0 -35.5 15t-14.5 35z" /> -<glyph unicode="" d="M0 50v100q0 21 14.5 35.5t35.5 14.5h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-1100q-21 0 -35.5 15t-14.5 35zM0 350v100q0 21 14.5 35.5t35.5 14.5h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-1100q-21 0 -35.5 15 t-14.5 35zM0 650v100q0 21 14.5 35.5t35.5 14.5h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-1100q-21 0 -35.5 15t-14.5 35zM0 950v100q0 21 14.5 35.5t35.5 14.5h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-1100 q-21 0 -35.5 15t-14.5 35z" /> -<glyph unicode="" d="M0 50v100q0 21 14.5 35.5t35.5 14.5h100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-100q-21 0 -35.5 15t-14.5 35zM0 350v100q0 21 14.5 35.5t35.5 14.5h100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-100q-21 0 -35.5 15 t-14.5 35zM0 650v100q0 21 14.5 35.5t35.5 14.5h100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-100q-21 0 -35.5 15t-14.5 35zM0 950v100q0 21 14.5 35.5t35.5 14.5h100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-100q-21 0 -35.5 15 t-14.5 35zM300 50v100q0 21 14.5 35.5t35.5 14.5h800q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-800q-21 0 -35.5 15t-14.5 35zM300 350v100q0 21 14.5 35.5t35.5 14.5h800q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-800 q-21 0 -35.5 15t-14.5 35zM300 650v100q0 21 14.5 35.5t35.5 14.5h800q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-800q-21 0 -35.5 15t-14.5 35zM300 950v100q0 21 14.5 35.5t35.5 14.5h800q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15 h-800q-21 0 -35.5 15t-14.5 35z" /> -<glyph unicode="" d="M-101 500v100h201v75l166 -125l-166 -125v75h-201zM300 0h100v1100h-100v-1100zM500 50q0 -20 14.5 -35t35.5 -15h600q20 0 35 15t15 35v100q0 21 -15 35.5t-35 14.5h-600q-21 0 -35.5 -14.5t-14.5 -35.5v-100zM500 350q0 -20 14.5 -35t35.5 -15h300q20 0 35 15t15 35 v100q0 21 -15 35.5t-35 14.5h-300q-21 0 -35.5 -14.5t-14.5 -35.5v-100zM500 650q0 -20 14.5 -35t35.5 -15h500q20 0 35 15t15 35v100q0 21 -15 35.5t-35 14.5h-500q-21 0 -35.5 -14.5t-14.5 -35.5v-100zM500 950q0 -20 14.5 -35t35.5 -15h100q20 0 35 15t15 35v100 q0 21 -15 35.5t-35 14.5h-100q-21 0 -35.5 -14.5t-14.5 -35.5v-100z" /> -<glyph unicode="" d="M1 50q0 -20 14.5 -35t35.5 -15h600q20 0 35 15t15 35v100q0 21 -15 35.5t-35 14.5h-600q-21 0 -35.5 -14.5t-14.5 -35.5v-100zM1 350q0 -20 14.5 -35t35.5 -15h300q20 0 35 15t15 35v100q0 21 -15 35.5t-35 14.5h-300q-21 0 -35.5 -14.5t-14.5 -35.5v-100zM1 650 q0 -20 14.5 -35t35.5 -15h500q20 0 35 15t15 35v100q0 21 -15 35.5t-35 14.5h-500q-21 0 -35.5 -14.5t-14.5 -35.5v-100zM1 950q0 -20 14.5 -35t35.5 -15h100q20 0 35 15t15 35v100q0 21 -15 35.5t-35 14.5h-100q-21 0 -35.5 -14.5t-14.5 -35.5v-100zM801 0v1100h100v-1100 h-100zM934 550l167 -125v75h200v100h-200v75z" /> -<glyph unicode="" d="M0 275v650q0 31 22 53t53 22h750q31 0 53 -22t22 -53v-650q0 -31 -22 -53t-53 -22h-750q-31 0 -53 22t-22 53zM900 600l300 300v-600z" /> -<glyph unicode="" d="M0 44v1012q0 18 13 31t31 13h1112q19 0 31.5 -13t12.5 -31v-1012q0 -18 -12.5 -31t-31.5 -13h-1112q-18 0 -31 13t-13 31zM100 263l247 182l298 -131l-74 156l293 318l236 -288v500h-1000v-737zM208 750q0 56 39 95t95 39t95 -39t39 -95t-39 -95t-95 -39t-95 39t-39 95z " /> -<glyph unicode="" d="M148 745q0 124 60.5 231.5t165 172t226.5 64.5q123 0 227 -63t164.5 -169.5t60.5 -229.5t-73 -272q-73 -114 -166.5 -237t-150.5 -189l-57 -66q-10 9 -27 26t-66.5 70.5t-96 109t-104 135.5t-100.5 155q-63 139 -63 262zM342 772q0 -107 75.5 -182.5t181.5 -75.5 q107 0 182.5 75.5t75.5 182.5t-75.5 182t-182.5 75t-182 -75.5t-75 -181.5z" /> -<glyph unicode="" d="M1 600q0 122 47.5 233t127.5 191t191 127.5t233 47.5t233 -47.5t191 -127.5t127.5 -191t47.5 -233t-47.5 -233t-127.5 -191t-191 -127.5t-233 -47.5t-233 47.5t-191 127.5t-127.5 191t-47.5 233zM173 600q0 -177 125.5 -302t301.5 -125v854q-176 0 -301.5 -125 t-125.5 -302z" /> -<glyph unicode="" d="M117 406q0 94 34 186t88.5 172.5t112 159t115 177t87.5 194.5q21 -71 57.5 -142.5t76 -130.5t83 -118.5t82 -117t70 -116t50 -125.5t18.5 -136q0 -89 -39 -165.5t-102 -126.5t-140 -79.5t-156 -33.5q-114 6 -211.5 53t-161.5 139t-64 210zM243 414q14 -82 59.5 -136 t136.5 -80l16 98q-7 6 -18 17t-34 48t-33 77q-15 73 -14 143.5t10 122.5l9 51q-92 -110 -119.5 -185t-12.5 -156z" /> -<glyph unicode="" d="M0 400v300q0 165 117.5 282.5t282.5 117.5q366 -6 397 -14l-186 -186h-311q-41 0 -70.5 -29.5t-29.5 -70.5v-500q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5v125l200 200v-225q0 -165 -117.5 -282.5t-282.5 -117.5h-300q-165 0 -282.5 117.5 t-117.5 282.5zM436 341l161 50l412 412l-114 113l-405 -405zM995 1015l113 -113l113 113l-21 85l-92 28z" /> -<glyph unicode="" d="M0 400v300q0 165 117.5 282.5t282.5 117.5h261l2 -80q-133 -32 -218 -120h-145q-41 0 -70.5 -29.5t-29.5 -70.5v-500q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5l200 153v-53q0 -165 -117.5 -282.5t-282.5 -117.5h-300q-165 0 -282.5 117.5t-117.5 282.5 zM423 524q30 38 81.5 64t103 35.5t99 14t77.5 3.5l29 -1v-209l360 324l-359 318v-216q-7 0 -19 -1t-48 -8t-69.5 -18.5t-76.5 -37t-76.5 -59t-62 -88t-39.5 -121.5z" /> -<glyph unicode="" d="M0 400v300q0 165 117.5 282.5t282.5 117.5h300q61 0 127 -23l-178 -177h-349q-41 0 -70.5 -29.5t-29.5 -70.5v-500q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5v69l200 200v-169q0 -165 -117.5 -282.5t-282.5 -117.5h-300q-165 0 -282.5 117.5 t-117.5 282.5zM342 632l283 -284l567 567l-137 137l-430 -431l-146 147z" /> -<glyph unicode="" d="M0 603l300 296v-198h200v200h-200l300 300l295 -300h-195v-200h200v198l300 -296l-300 -300v198h-200v-200h195l-295 -300l-300 300h200v200h-200v-198z" /> -<glyph unicode="" d="M200 50v1000q0 21 14.5 35.5t35.5 14.5h100q21 0 35.5 -14.5t14.5 -35.5v-437l500 487v-1100l-500 488v-438q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5z" /> -<glyph unicode="" d="M0 50v1000q0 21 14.5 35.5t35.5 14.5h100q21 0 35.5 -14.5t14.5 -35.5v-437l500 487v-487l500 487v-1100l-500 488v-488l-500 488v-438q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5z" /> -<glyph unicode="" d="M136 550l564 550v-487l500 487v-1100l-500 488v-488z" /> -<glyph unicode="" d="M200 0l900 550l-900 550v-1100z" /> -<glyph unicode="" d="M200 150q0 -21 14.5 -35.5t35.5 -14.5h200q21 0 35.5 14.5t14.5 35.5v800q0 21 -14.5 35.5t-35.5 14.5h-200q-21 0 -35.5 -14.5t-14.5 -35.5v-800zM600 150q0 -21 14.5 -35.5t35.5 -14.5h200q21 0 35.5 14.5t14.5 35.5v800q0 21 -14.5 35.5t-35.5 14.5h-200 q-21 0 -35.5 -14.5t-14.5 -35.5v-800z" /> -<glyph unicode="" d="M200 150q0 -20 14.5 -35t35.5 -15h800q21 0 35.5 15t14.5 35v800q0 21 -14.5 35.5t-35.5 14.5h-800q-21 0 -35.5 -14.5t-14.5 -35.5v-800z" /> -<glyph unicode="" d="M0 0v1100l500 -487v487l564 -550l-564 -550v488z" /> -<glyph unicode="" d="M0 0v1100l500 -487v487l500 -487v437q0 21 14.5 35.5t35.5 14.5h100q21 0 35.5 -14.5t14.5 -35.5v-1000q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v438l-500 -488v488z" /> -<glyph unicode="" d="M300 0v1100l500 -487v437q0 21 14.5 35.5t35.5 14.5h100q21 0 35.5 -14.5t14.5 -35.5v-1000q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v438z" /> -<glyph unicode="" d="M100 250v100q0 21 14.5 35.5t35.5 14.5h1000q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-1000q-21 0 -35.5 14.5t-14.5 35.5zM100 500h1100l-550 564z" /> -<glyph unicode="" d="M185 599l592 -592l240 240l-353 353l353 353l-240 240z" /> -<glyph unicode="" d="M272 194l353 353l-353 353l241 240l572 -571l21 -22l-1 -1v-1l-592 -591z" /> -<glyph unicode="" d="M3 600q0 162 80 299.5t217.5 217.5t299.5 80t299.5 -80t217.5 -217.5t80 -299.5t-80 -299.5t-217.5 -217.5t-299.5 -80t-299.5 80t-217.5 217.5t-80 299.5zM300 500h200v-200h200v200h200v200h-200v200h-200v-200h-200v-200z" /> -<glyph unicode="" d="M3 600q0 162 80 299.5t217.5 217.5t299.5 80t299.5 -80t217.5 -217.5t80 -299.5t-80 -299.5t-217.5 -217.5t-299.5 -80t-299.5 80t-217.5 217.5t-80 299.5zM300 500h600v200h-600v-200z" /> -<glyph unicode="" d="M3 600q0 162 80 299.5t217.5 217.5t299.5 80t299.5 -80t217.5 -217.5t80 -299.5t-80 -299.5t-217.5 -217.5t-299.5 -80t-299.5 80t-217.5 217.5t-80 299.5zM246 459l213 -213l141 142l141 -142l213 213l-142 141l142 141l-213 212l-141 -141l-141 142l-212 -213l141 -141 z" /> -<glyph unicode="" d="M3 600q0 162 80 299.5t217.5 217.5t299.5 80t299.5 -80t217.5 -217.5t80 -299.5t-80 -299.5t-217.5 -217.5t-299.5 -80t-299.5 80t-217.5 217.5t-80 299.5zM270 551l276 -277l411 411l-175 174l-236 -236l-102 102z" /> -<glyph unicode="" d="M3 600q0 162 80 299.5t217.5 217.5t299.5 80t299.5 -80t217.5 -217.5t80 -299.5t-80 -299.5t-217.5 -217.5t-299.5 -80t-299.5 80t-217.5 217.5t-80 299.5zM364 700h143q4 0 11.5 -1t11 -1t6.5 3t3 9t1 11t3.5 8.5t3.5 6t5.5 4t6.5 2.5t9 1.5t9 0.5h11.5h12.5 q19 0 30 -10t11 -26q0 -22 -4 -28t-27 -22q-5 -1 -12.5 -3t-27 -13.5t-34 -27t-26.5 -46t-11 -68.5h200q5 3 14 8t31.5 25.5t39.5 45.5t31 69t14 94q0 51 -17.5 89t-42 58t-58.5 32t-58.5 15t-51.5 3q-50 0 -90.5 -12t-75 -38.5t-53.5 -74.5t-19 -114zM500 300h200v100h-200 v-100z" /> -<glyph unicode="" d="M3 600q0 162 80 299.5t217.5 217.5t299.5 80t299.5 -80t217.5 -217.5t80 -299.5t-80 -299.5t-217.5 -217.5t-299.5 -80t-299.5 80t-217.5 217.5t-80 299.5zM400 300h400v100h-100v300h-300v-100h100v-200h-100v-100zM500 800h200v100h-200v-100z" /> -<glyph unicode="" d="M0 500v200h195q31 125 98.5 199.5t206.5 100.5v200h200v-200q54 -20 113 -60t112.5 -105.5t71.5 -134.5h203v-200h-203q-25 -102 -116.5 -186t-180.5 -117v-197h-200v197q-140 27 -208 102.5t-98 200.5h-194zM290 500q24 -73 79.5 -127.5t130.5 -78.5v206h200v-206 q149 48 201 206h-201v200h200q-25 74 -75.5 127t-124.5 77v-204h-200v203q-75 -23 -130 -77t-79 -126h209v-200h-210z" /> -<glyph unicode="" d="M4 600q0 162 80 299t217 217t299 80t299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299zM186 600q0 -171 121.5 -292.5t292.5 -121.5t292.5 121.5t121.5 292.5t-121.5 292.5t-292.5 121.5t-292.5 -121.5t-121.5 -292.5zM356 465l135 135 l-135 135l109 109l135 -135l135 135l109 -109l-135 -135l135 -135l-109 -109l-135 135l-135 -135z" /> -<glyph unicode="" d="M4 600q0 162 80 299t217 217t299 80t299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299zM186 600q0 -171 121.5 -292.5t292.5 -121.5t292.5 121.5t121.5 292.5t-121.5 292.5t-292.5 121.5t-292.5 -121.5t-121.5 -292.5zM322 537l141 141 l87 -87l204 205l142 -142l-346 -345z" /> -<glyph unicode="" d="M4 600q0 162 80 299t217 217t299 80t299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299zM186 600q0 -115 62 -215l568 567q-100 62 -216 62q-171 0 -292.5 -121.5t-121.5 -292.5zM391 245q97 -59 209 -59q171 0 292.5 121.5t121.5 292.5 q0 112 -59 209z" /> -<glyph unicode="" d="M0 547l600 453v-300h600v-300h-600v-301z" /> -<glyph unicode="" d="M0 400v300h600v300l600 -453l-600 -448v301h-600z" /> -<glyph unicode="" d="M204 600l450 600l444 -600h-298v-600h-300v600h-296z" /> -<glyph unicode="" d="M104 600h296v600h300v-600h298l-449 -600z" /> -<glyph unicode="" d="M0 200q6 132 41 238.5t103.5 193t184 138t271.5 59.5v271l600 -453l-600 -448v301q-95 -2 -183 -20t-170 -52t-147 -92.5t-100 -135.5z" /> -<glyph unicode="" d="M0 0v400l129 -129l294 294l142 -142l-294 -294l129 -129h-400zM635 777l142 -142l294 294l129 -129v400h-400l129 -129z" /> -<glyph unicode="" d="M34 176l295 295l-129 129h400v-400l-129 130l-295 -295zM600 600v400l129 -129l295 295l142 -141l-295 -295l129 -130h-400z" /> -<glyph unicode="" d="M23 600q0 118 45.5 224.5t123 184t184 123t224.5 45.5t224.5 -45.5t184 -123t123 -184t45.5 -224.5t-45.5 -224.5t-123 -184t-184 -123t-224.5 -45.5t-224.5 45.5t-184 123t-123 184t-45.5 224.5zM456 851l58 -302q4 -20 21.5 -34.5t37.5 -14.5h54q20 0 37.5 14.5 t21.5 34.5l58 302q4 20 -8 34.5t-32 14.5h-207q-21 0 -33 -14.5t-8 -34.5zM500 300h200v100h-200v-100z" /> -<glyph unicode="" d="M0 800h100v-200h400v300h200v-300h400v200h100v100h-111q1 1 1 6.5t-1.5 15t-3.5 17.5l-34 172q-11 39 -41.5 63t-69.5 24q-32 0 -61 -17l-239 -144q-22 -13 -40 -35q-19 24 -40 36l-238 144q-33 18 -62 18q-39 0 -69.5 -23t-40.5 -61l-35 -177q-2 -8 -3 -18t-1 -15v-6 h-111v-100zM100 0h400v400h-400v-400zM200 900q-3 0 14 48t36 96l18 47l213 -191h-281zM700 0v400h400v-400h-400zM731 900l202 197q5 -12 12 -32.5t23 -64t25 -72t7 -28.5h-269z" /> -<glyph unicode="" d="M0 -22v143l216 193q-9 53 -13 83t-5.5 94t9 113t38.5 114t74 124q47 60 99.5 102.5t103 68t127.5 48t145.5 37.5t184.5 43.5t220 58.5q0 -189 -22 -343t-59 -258t-89 -181.5t-108.5 -120t-122 -68t-125.5 -30t-121.5 -1.5t-107.5 12.5t-87.5 17t-56.5 7.5l-99 -55z M238.5 300.5q19.5 -6.5 86.5 76.5q55 66 367 234q70 38 118.5 69.5t102 79t99 111.5t86.5 148q22 50 24 60t-6 19q-7 5 -17 5t-26.5 -14.5t-33.5 -39.5q-35 -51 -113.5 -108.5t-139.5 -89.5l-61 -32q-369 -197 -458 -401q-48 -111 -28.5 -117.5z" /> -<glyph unicode="" d="M111 408q0 -33 5 -63q9 -56 44 -119.5t105 -108.5q31 -21 64 -16t62 23.5t57 49.5t48 61.5t35 60.5q32 66 39 184.5t-13 157.5q79 -80 122 -164t26 -184q-5 -33 -20.5 -69.5t-37.5 -80.5q-10 -19 -14.5 -29t-12 -26t-9 -23.5t-3 -19t2.5 -15.5t11 -9.5t19.5 -5t30.5 2.5 t42 8q57 20 91 34t87.5 44.5t87 64t65.5 88.5t47 122q38 172 -44.5 341.5t-246.5 278.5q22 -44 43 -129q39 -159 -32 -154q-15 2 -33 9q-79 33 -120.5 100t-44 175.5t48.5 257.5q-13 -8 -34 -23.5t-72.5 -66.5t-88.5 -105.5t-60 -138t-8 -166.5q2 -12 8 -41.5t8 -43t6 -39.5 t3.5 -39.5t-1 -33.5t-6 -31.5t-13.5 -24t-21 -20.5t-31 -12q-38 -10 -67 13t-40.5 61.5t-15 81.5t10.5 75q-52 -46 -83.5 -101t-39 -107t-7.5 -85z" /> -<glyph unicode="" d="M-61 600l26 40q6 10 20 30t49 63.5t74.5 85.5t97 90t116.5 83.5t132.5 59t145.5 23.5t145.5 -23.5t132.5 -59t116.5 -83.5t97 -90t74.5 -85.5t49 -63.5t20 -30l26 -40l-26 -40q-6 -10 -20 -30t-49 -63.5t-74.5 -85.5t-97 -90t-116.5 -83.5t-132.5 -59t-145.5 -23.5 t-145.5 23.5t-132.5 59t-116.5 83.5t-97 90t-74.5 85.5t-49 63.5t-20 30zM120 600q7 -10 40.5 -58t56 -78.5t68 -77.5t87.5 -75t103 -49.5t125 -21.5t123.5 20t100.5 45.5t85.5 71.5t66.5 75.5t58 81.5t47 66q-1 1 -28.5 37.5t-42 55t-43.5 53t-57.5 63.5t-58.5 54 q49 -74 49 -163q0 -124 -88 -212t-212 -88t-212 88t-88 212q0 85 46 158q-102 -87 -226 -258zM377 656q49 -124 154 -191l105 105q-37 24 -75 72t-57 84l-20 36z" /> -<glyph unicode="" d="M-61 600l26 40q6 10 20 30t49 63.5t74.5 85.5t97 90t116.5 83.5t132.5 59t145.5 23.5q61 0 121 -17l37 142h148l-314 -1200h-148l37 143q-82 21 -165 71.5t-140 102t-109.5 112t-72 88.5t-29.5 43zM120 600q210 -282 393 -336l37 141q-107 18 -178.5 101.5t-71.5 193.5 q0 85 46 158q-102 -87 -226 -258zM377 656q49 -124 154 -191l47 47l23 87q-30 28 -59 69t-44 68l-14 26zM780 161l38 145q22 15 44.5 34t46 44t40.5 44t41 50.5t33.5 43.5t33 44t24.5 34q-97 127 -140 175l39 146q67 -54 131.5 -125.5t87.5 -103.5t36 -52l26 -40l-26 -40 q-7 -12 -25.5 -38t-63.5 -79.5t-95.5 -102.5t-124 -100t-146.5 -79z" /> -<glyph unicode="" d="M-97.5 34q13.5 -34 50.5 -34h1294q37 0 50.5 35.5t-7.5 67.5l-642 1056q-20 34 -48 36.5t-48 -29.5l-642 -1066q-21 -32 -7.5 -66zM155 200l445 723l445 -723h-345v100h-200v-100h-345zM500 600l100 -300l100 300v100h-200v-100z" /> -<glyph unicode="" d="M100 262v41q0 20 11 44.5t26 38.5l363 325v339q0 62 44 106t106 44t106 -44t44 -106v-339l363 -325q15 -14 26 -38.5t11 -44.5v-41q0 -20 -12 -26.5t-29 5.5l-359 249v-263q100 -91 100 -113v-64q0 -20 -13 -28.5t-32 0.5l-94 78h-222l-94 -78q-19 -9 -32 -0.5t-13 28.5 v64q0 22 100 113v263l-359 -249q-17 -12 -29 -5.5t-12 26.5z" /> -<glyph unicode="" d="M0 50q0 -20 14.5 -35t35.5 -15h1000q21 0 35.5 15t14.5 35v750h-1100v-750zM0 900h1100v150q0 21 -14.5 35.5t-35.5 14.5h-150v100h-100v-100h-500v100h-100v-100h-150q-21 0 -35.5 -14.5t-14.5 -35.5v-150zM100 100v100h100v-100h-100zM100 300v100h100v-100h-100z M100 500v100h100v-100h-100zM300 100v100h100v-100h-100zM300 300v100h100v-100h-100zM300 500v100h100v-100h-100zM500 100v100h100v-100h-100zM500 300v100h100v-100h-100zM500 500v100h100v-100h-100zM700 100v100h100v-100h-100zM700 300v100h100v-100h-100zM700 500 v100h100v-100h-100zM900 100v100h100v-100h-100zM900 300v100h100v-100h-100zM900 500v100h100v-100h-100z" /> -<glyph unicode="" d="M0 200v200h259l600 600h241v198l300 -295l-300 -300v197h-159l-600 -600h-341zM0 800h259l122 -122l141 142l-181 180h-341v-200zM678 381l141 142l122 -123h159v198l300 -295l-300 -300v197h-241z" /> -<glyph unicode="" d="M0 400v600q0 41 29.5 70.5t70.5 29.5h1000q41 0 70.5 -29.5t29.5 -70.5v-600q0 -41 -29.5 -70.5t-70.5 -29.5h-596l-304 -300v300h-100q-41 0 -70.5 29.5t-29.5 70.5z" /> -<glyph unicode="" d="M100 600v200h300v-250q0 -113 6 -145q17 -92 102 -117q39 -11 92 -11q37 0 66.5 5.5t50 15.5t36 24t24 31.5t14 37.5t7 42t2.5 45t0 47v25v250h300v-200q0 -42 -3 -83t-15 -104t-31.5 -116t-58 -109.5t-89 -96.5t-129 -65.5t-174.5 -25.5t-174.5 25.5t-129 65.5t-89 96.5 t-58 109.5t-31.5 116t-15 104t-3 83zM100 900v300h300v-300h-300zM800 900v300h300v-300h-300z" /> -<glyph unicode="" d="M-30 411l227 -227l352 353l353 -353l226 227l-578 579z" /> -<glyph unicode="" d="M70 797l580 -579l578 579l-226 227l-353 -353l-352 353z" /> -<glyph unicode="" d="M-198 700l299 283l300 -283h-203v-400h385l215 -200h-800v600h-196zM402 1000l215 -200h381v-400h-198l299 -283l299 283h-200v600h-796z" /> -<glyph unicode="" d="M18 939q-5 24 10 42q14 19 39 19h896l38 162q5 17 18.5 27.5t30.5 10.5h94q20 0 35 -14.5t15 -35.5t-15 -35.5t-35 -14.5h-54l-201 -961q-2 -4 -6 -10.5t-19 -17.5t-33 -11h-31v-50q0 -20 -14.5 -35t-35.5 -15t-35.5 15t-14.5 35v50h-300v-50q0 -20 -14.5 -35t-35.5 -15 t-35.5 15t-14.5 35v50h-50q-21 0 -35.5 15t-14.5 35q0 21 14.5 35.5t35.5 14.5h535l48 200h-633q-32 0 -54.5 21t-27.5 43z" /> -<glyph unicode="" d="M0 0v800h1200v-800h-1200zM0 900v100h200q0 41 29.5 70.5t70.5 29.5h300q41 0 70.5 -29.5t29.5 -70.5h500v-100h-1200z" /> -<glyph unicode="" d="M1 0l300 700h1200l-300 -700h-1200zM1 400v600h200q0 41 29.5 70.5t70.5 29.5h300q41 0 70.5 -29.5t29.5 -70.5h500v-200h-1000z" /> -<glyph unicode="" d="M302 300h198v600h-198l298 300l298 -300h-198v-600h198l-298 -300z" /> -<glyph unicode="" d="M0 600l300 298v-198h600v198l300 -298l-300 -297v197h-600v-197z" /> -<glyph unicode="" d="M0 100v100q0 41 29.5 70.5t70.5 29.5h1000q41 0 70.5 -29.5t29.5 -70.5v-100q0 -41 -29.5 -70.5t-70.5 -29.5h-1000q-41 0 -70.5 29.5t-29.5 70.5zM31 400l172 739q5 22 23 41.5t38 19.5h672q19 0 37.5 -22.5t23.5 -45.5l172 -732h-1138zM800 100h100v100h-100v-100z M1000 100h100v100h-100v-100z" /> -<glyph unicode="" d="M-101 600v50q0 24 25 49t50 38l25 13v-250l-11 5.5t-24 14t-30 21.5t-24 27.5t-11 31.5zM100 500v250v8v8v7t0.5 7t1.5 5.5t2 5t3 4t4.5 3.5t6 1.5t7.5 0.5h200l675 250v-850l-675 200h-38l47 -276q2 -12 -3 -17.5t-11 -6t-21 -0.5h-8h-83q-20 0 -34.5 14t-18.5 35 q-55 337 -55 351zM1100 200v850q0 21 14.5 35.5t35.5 14.5q20 0 35 -14.5t15 -35.5v-850q0 -20 -15 -35t-35 -15q-21 0 -35.5 15t-14.5 35z" /> -<glyph unicode="" d="M74 350q0 21 13.5 35.5t33.5 14.5h18l117 173l63 327q15 77 76 140t144 83l-18 32q-6 19 3 32t29 13h94q20 0 29 -10.5t3 -29.5q-18 -36 -18 -37q83 -19 144 -82.5t76 -140.5l63 -327l118 -173h17q20 0 33.5 -14.5t13.5 -35.5q0 -20 -13 -40t-31 -27q-8 -3 -23 -8.5 t-65 -20t-103 -25t-132.5 -19.5t-158.5 -9q-125 0 -245.5 20.5t-178.5 40.5l-58 20q-18 7 -31 27.5t-13 40.5zM497 110q12 -49 40 -79.5t63 -30.5t63 30.5t39 79.5q-48 -6 -102 -6t-103 6z" /> -<glyph unicode="" d="M21 445l233 -45l-78 -224l224 78l45 -233l155 179l155 -179l45 233l224 -78l-78 224l234 45l-180 155l180 156l-234 44l78 225l-224 -78l-45 233l-155 -180l-155 180l-45 -233l-224 78l78 -225l-233 -44l179 -156z" /> -<glyph unicode="" d="M0 200h200v600h-200v-600zM300 275q0 -75 100 -75h61q124 -100 139 -100h250q46 0 83 57l238 344q29 31 29 74v100q0 44 -30.5 84.5t-69.5 40.5h-328q28 118 28 125v150q0 44 -30.5 84.5t-69.5 40.5h-50q-27 0 -51 -20t-38 -48l-96 -198l-145 -196q-20 -26 -20 -63v-400z M400 300v375l150 213l100 212h50v-175l-50 -225h450v-125l-250 -375h-214l-136 100h-100z" /> -<glyph unicode="" d="M0 400v600h200v-600h-200zM300 525v400q0 75 100 75h61q124 100 139 100h250q46 0 83 -57l238 -344q29 -31 29 -74v-100q0 -44 -30.5 -84.5t-69.5 -40.5h-328q28 -118 28 -125v-150q0 -44 -30.5 -84.5t-69.5 -40.5h-50q-27 0 -51 20t-38 48l-96 198l-145 196 q-20 26 -20 63zM400 525l150 -212l100 -213h50v175l-50 225h450v125l-250 375h-214l-136 -100h-100v-375z" /> -<glyph unicode="" d="M8 200v600h200v-600h-200zM308 275v525q0 17 14 35.5t28 28.5l14 9l362 230q14 6 25 6q17 0 29 -12l109 -112q14 -14 14 -34q0 -18 -11 -32l-85 -121h302q85 0 138.5 -38t53.5 -110t-54.5 -111t-138.5 -39h-107l-130 -339q-7 -22 -20.5 -41.5t-28.5 -19.5h-341 q-7 0 -90 81t-83 94zM408 289l100 -89h293l131 339q6 21 19.5 41t28.5 20h203q16 0 25 15t9 36q0 20 -9 34.5t-25 14.5h-457h-6.5h-7.5t-6.5 0.5t-6 1t-5 1.5t-5.5 2.5t-4 4t-4 5.5q-5 12 -5 20q0 14 10 27l147 183l-86 83l-339 -236v-503z" /> -<glyph unicode="" d="M-101 651q0 72 54 110t139 38l302 -1l-85 121q-11 16 -11 32q0 21 14 34l109 113q13 12 29 12q11 0 25 -6l365 -230q7 -4 17 -10.5t26.5 -26t16.5 -36.5v-526q0 -13 -86 -93.5t-94 -80.5h-341q-16 0 -29.5 20t-19.5 41l-130 339h-107q-84 0 -139 39t-55 111zM-1 601h222 q15 0 28.5 -20.5t19.5 -40.5l131 -339h293l107 89v502l-343 237l-87 -83l145 -184q10 -11 10 -26q0 -11 -5 -20q-1 -3 -3.5 -5.5l-4 -4t-5 -2.5t-5.5 -1.5t-6.5 -1t-6.5 -0.5h-7.5h-6.5h-476v-100zM1000 201v600h200v-600h-200z" /> -<glyph unicode="" d="M97 719l230 -363q4 -6 10.5 -15.5t26 -25t36.5 -15.5h525q13 0 94 83t81 90v342q0 15 -20 28.5t-41 19.5l-339 131v106q0 84 -39 139t-111 55t-110 -53.5t-38 -138.5v-302l-121 84q-15 12 -33.5 11.5t-32.5 -13.5l-112 -110q-22 -22 -6 -53zM172 739l83 86l183 -146 q22 -18 47 -5q3 1 5.5 3.5l4 4t2.5 5t1.5 5.5t1 6.5t0.5 6.5v7.5v6.5v456q0 22 25 31t50 -0.5t25 -30.5v-202q0 -16 20 -29.5t41 -19.5l339 -130v-294l-89 -100h-503zM400 0v200h600v-200h-600z" /> -<glyph unicode="" d="M2 585q-16 -31 6 -53l112 -110q13 -13 32 -13.5t34 10.5l121 85q0 -51 -0.5 -153.5t-0.5 -148.5q0 -84 38.5 -138t110.5 -54t111 55t39 139v106l339 131q20 6 40.5 19.5t20.5 28.5v342q0 7 -81 90t-94 83h-525q-17 0 -35.5 -14t-28.5 -28l-10 -15zM77 565l236 339h503 l89 -100v-294l-340 -130q-20 -6 -40 -20t-20 -29v-202q0 -22 -25 -31t-50 0t-25 31v456v14.5t-1.5 11.5t-5 12t-9.5 7q-24 13 -46 -5l-184 -146zM305 1104v200h600v-200h-600z" /> -<glyph unicode="" d="M5 597q0 122 47.5 232.5t127.5 190.5t190.5 127.5t232.5 47.5q162 0 299.5 -80t217.5 -218t80 -300t-80 -299.5t-217.5 -217.5t-299.5 -80t-300 80t-218 217.5t-80 299.5zM298 701l2 -201h300l-2 -194l402 294l-402 298v-197h-300z" /> -<glyph unicode="" d="M0 597q0 122 47.5 232.5t127.5 190.5t190.5 127.5t231.5 47.5q122 0 232.5 -47.5t190.5 -127.5t127.5 -190.5t47.5 -232.5q0 -162 -80 -299.5t-218 -217.5t-300 -80t-299.5 80t-217.5 217.5t-80 299.5zM200 600l402 -294l-2 194h300l2 201h-300v197z" /> -<glyph unicode="" d="M5 597q0 122 47.5 232.5t127.5 190.5t190.5 127.5t232.5 47.5q162 0 299.5 -80t217.5 -218t80 -300t-80 -299.5t-217.5 -217.5t-299.5 -80t-300 80t-218 217.5t-80 299.5zM300 600h200v-300h200v300h200l-300 400z" /> -<glyph unicode="" d="M5 597q0 122 47.5 232.5t127.5 190.5t190.5 127.5t232.5 47.5q162 0 299.5 -80t217.5 -218t80 -300t-80 -299.5t-217.5 -217.5t-299.5 -80t-300 80t-218 217.5t-80 299.5zM300 600l300 -400l300 400h-200v300h-200v-300h-200z" /> -<glyph unicode="" d="M5 597q0 122 47.5 232.5t127.5 190.5t190.5 127.5t232.5 47.5q121 0 231.5 -47.5t190.5 -127.5t127.5 -190.5t47.5 -232.5q0 -162 -80 -299.5t-217.5 -217.5t-299.5 -80t-300 80t-218 217.5t-80 299.5zM254 780q-8 -33 5.5 -92.5t7.5 -87.5q0 -9 17 -44t16 -60 q12 0 23 -5.5t23 -15t20 -13.5q24 -12 108 -42q22 -8 53 -31.5t59.5 -38.5t57.5 -11q8 -18 -15 -55t-20 -57q42 -71 87 -80q0 -6 -3 -15.5t-3.5 -14.5t4.5 -17q104 -3 221 112q30 29 47 47t34.5 49t20.5 62q-14 9 -37 9.5t-36 7.5q-14 7 -49 15t-52 19q-9 0 -39.5 -0.5 t-46.5 -1.5t-39 -6.5t-39 -16.5q-50 -35 -66 -12q-4 2 -3.5 25.5t0.5 25.5q-6 13 -26.5 17t-24.5 7q2 22 -2 41t-16.5 28t-38.5 -20q-23 -25 -42 4q-19 28 -8 58q6 16 22 22q6 -1 26 -1.5t33.5 -4t19.5 -13.5q12 -19 32 -37.5t34 -27.5l14 -8q0 3 9.5 39.5t5.5 57.5 q-4 23 14.5 44.5t22.5 31.5q5 14 10 35t8.5 31t15.5 22.5t34 21.5q-6 18 10 37q8 0 23.5 -1.5t24.5 -1.5t20.5 4.5t20.5 15.5q-10 23 -30.5 42.5t-38 30t-49 26.5t-43.5 23q11 39 2 44q31 -13 58 -14.5t39 3.5l11 4q7 36 -16.5 53.5t-64.5 28.5t-56 23q-19 -3 -37 0 q-15 -12 -36.5 -21t-34.5 -12t-44 -8t-39 -6q-15 -3 -45.5 0.5t-45.5 -2.5q-21 -7 -52 -26.5t-34 -34.5q-3 -11 6.5 -22.5t8.5 -18.5q-3 -34 -27.5 -90.5t-29.5 -79.5zM518 916q3 12 16 30t16 25q10 -10 18.5 -10t14 6t14.5 14.5t16 12.5q0 -24 17 -66.5t17 -43.5 q-9 2 -31 5t-36 5t-32 8t-30 14zM692 1003h1h-1z" /> -<glyph unicode="" d="M0 164.5q0 21.5 15 37.5l600 599q-33 101 6 201.5t135 154.5q164 92 306 -9l-259 -138l145 -232l251 126q13 -175 -151 -267q-123 -70 -253 -23l-596 -596q-15 -16 -36.5 -16t-36.5 16l-111 110q-15 15 -15 36.5z" /> -<glyph unicode="" horiz-adv-x="1220" d="M0 196v100q0 41 29.5 70.5t70.5 29.5h1000q41 0 70.5 -29.5t29.5 -70.5v-100q0 -41 -29.5 -70.5t-70.5 -29.5h-1000q-41 0 -70.5 29.5t-29.5 70.5zM0 596v100q0 41 29.5 70.5t70.5 29.5h1000q41 0 70.5 -29.5t29.5 -70.5v-100q0 -41 -29.5 -70.5t-70.5 -29.5h-1000 q-41 0 -70.5 29.5t-29.5 70.5zM0 996v100q0 41 29.5 70.5t70.5 29.5h1000q41 0 70.5 -29.5t29.5 -70.5v-100q0 -41 -29.5 -70.5t-70.5 -29.5h-1000q-41 0 -70.5 29.5t-29.5 70.5zM600 596h500v100h-500v-100zM800 196h300v100h-300v-100zM900 996h200v100h-200v-100z" /> -<glyph unicode="" d="M100 1100v100h1000v-100h-1000zM150 1000h900l-350 -500v-300l-200 -200v500z" /> -<glyph unicode="" d="M0 200v200h1200v-200q0 -41 -29.5 -70.5t-70.5 -29.5h-1000q-41 0 -70.5 29.5t-29.5 70.5zM0 500v400q0 41 29.5 70.5t70.5 29.5h300v100q0 41 29.5 70.5t70.5 29.5h200q41 0 70.5 -29.5t29.5 -70.5v-100h300q41 0 70.5 -29.5t29.5 -70.5v-400h-500v100h-200v-100h-500z M500 1000h200v100h-200v-100z" /> -<glyph unicode="" d="M0 0v400l129 -129l200 200l142 -142l-200 -200l129 -129h-400zM0 800l129 129l200 -200l142 142l-200 200l129 129h-400v-400zM729 329l142 142l200 -200l129 129v-400h-400l129 129zM729 871l200 200l-129 129h400v-400l-129 129l-200 -200z" /> -<glyph unicode="" d="M0 596q0 162 80 299t217 217t299 80t299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299zM182 596q0 -172 121.5 -293t292.5 -121t292.5 121t121.5 293q0 171 -121.5 292.5t-292.5 121.5t-292.5 -121.5t-121.5 -292.5zM291 655 q0 23 15.5 38.5t38.5 15.5t39 -16t16 -38q0 -23 -16 -39t-39 -16q-22 0 -38 16t-16 39zM400 850q0 22 16 38.5t39 16.5q22 0 38 -16t16 -39t-16 -39t-38 -16q-23 0 -39 16.5t-16 38.5zM514 609q0 32 20.5 56.5t51.5 29.5l122 126l1 1q-9 14 -9 28q0 22 16 38.5t39 16.5 q22 0 38 -16t16 -39t-16 -39t-38 -16q-14 0 -29 10l-55 -145q17 -22 17 -51q0 -36 -25.5 -61.5t-61.5 -25.5t-61.5 25.5t-25.5 61.5zM800 655q0 22 16 38t39 16t38.5 -15.5t15.5 -38.5t-16 -39t-38 -16q-23 0 -39 16t-16 39z" /> -<glyph unicode="" d="M-40 375q-13 -95 35 -173q35 -57 94 -89t129 -32q63 0 119 28q33 16 65 40.5t52.5 45.5t59.5 64q40 44 57 61l394 394q35 35 47 84t-3 96q-27 87 -117 104q-20 2 -29 2q-46 0 -78.5 -16.5t-67.5 -51.5l-389 -396l-7 -7l69 -67l377 373q20 22 39 38q23 23 50 23 q38 0 53 -36q16 -39 -20 -75l-547 -547q-52 -52 -125 -52q-55 0 -100 33t-54 96q-5 35 2.5 66t31.5 63t42 50t56 54q24 21 44 41l348 348q52 52 82.5 79.5t84 54t107.5 26.5q25 0 48 -4q95 -17 154 -94.5t51 -175.5q-7 -101 -98 -192l-252 -249l-253 -256l7 -7l69 -60 l517 511q67 67 95 157t11 183q-16 87 -67 154t-130 103q-69 33 -152 33q-107 0 -197 -55q-40 -24 -111 -95l-512 -512q-68 -68 -81 -163z" /> -<glyph unicode="" d="M80 784q0 131 98.5 229.5t230.5 98.5q143 0 241 -129q103 129 246 129q129 0 226 -98.5t97 -229.5q0 -46 -17.5 -91t-61 -99t-77 -89.5t-104.5 -105.5q-197 -191 -293 -322l-17 -23l-16 23q-43 58 -100 122.5t-92 99.5t-101 100q-71 70 -104.5 105.5t-77 89.5t-61 99 t-17.5 91zM250 784q0 -27 30.5 -70t61.5 -75.5t95 -94.5l22 -22q93 -90 190 -201q82 92 195 203l12 12q64 62 97.5 97t64.5 79t31 72q0 71 -48 119.5t-105 48.5q-74 0 -132 -83l-118 -171l-114 174q-51 80 -123 80q-60 0 -109.5 -49.5t-49.5 -118.5z" /> -<glyph unicode="" d="M57 353q0 -95 66 -159l141 -142q68 -66 159 -66q93 0 159 66l283 283q66 66 66 159t-66 159l-141 141q-8 9 -19 17l-105 -105l212 -212l-389 -389l-247 248l95 95l-18 18q-46 45 -75 101l-55 -55q-66 -66 -66 -159zM269 706q0 -93 66 -159l141 -141q7 -7 19 -17l105 105 l-212 212l389 389l247 -247l-95 -96l18 -17q47 -49 77 -100l29 29q35 35 62.5 88t27.5 96q0 93 -66 159l-141 141q-66 66 -159 66q-95 0 -159 -66l-283 -283q-66 -64 -66 -159z" /> -<glyph unicode="" d="M200 100v953q0 21 30 46t81 48t129 38t163 15t162 -15t127 -38t79 -48t29 -46v-953q0 -41 -29.5 -70.5t-70.5 -29.5h-600q-41 0 -70.5 29.5t-29.5 70.5zM300 300h600v700h-600v-700zM496 150q0 -43 30.5 -73.5t73.5 -30.5t73.5 30.5t30.5 73.5t-30.5 73.5t-73.5 30.5 t-73.5 -30.5t-30.5 -73.5z" /> -<glyph unicode="" d="M0 0l303 380l207 208l-210 212h300l267 279l-35 36q-15 14 -15 35t15 35q14 15 35 15t35 -15l283 -282q15 -15 15 -36t-15 -35q-14 -15 -35 -15t-35 15l-36 35l-279 -267v-300l-212 210l-208 -207z" /> -<glyph unicode="" d="M295 433h139q5 -77 48.5 -126.5t117.5 -64.5v335q-6 1 -15.5 4t-11.5 3q-46 14 -79 26.5t-72 36t-62.5 52t-40 72.5t-16.5 99q0 92 44 159.5t109 101t144 40.5v78h100v-79q38 -4 72.5 -13.5t75.5 -31.5t71 -53.5t51.5 -84t24.5 -118.5h-159q-8 72 -35 109.5t-101 50.5 v-307l64 -14q34 -7 64 -16.5t70 -31.5t67.5 -52t47.5 -80.5t20 -112.5q0 -139 -89 -224t-244 -96v-77h-100v78q-152 17 -237 104q-40 40 -52.5 93.5t-15.5 139.5zM466 889q0 -29 8 -51t16.5 -34t29.5 -22.5t31 -13.5t38 -10q7 -2 11 -3v274q-61 -8 -97.5 -37.5t-36.5 -102.5 zM700 237q170 18 170 151q0 64 -44 99.5t-126 60.5v-311z" /> -<glyph unicode="" d="M100 600v100h166q-24 49 -44 104q-10 26 -14.5 55.5t-3 72.5t25 90t68.5 87q97 88 263 88q129 0 230 -89t101 -208h-153q0 52 -34 89.5t-74 51.5t-76 14q-37 0 -79 -14.5t-62 -35.5q-41 -44 -41 -101q0 -28 16.5 -69.5t28 -62.5t41.5 -72h241v-100h-197q8 -50 -2.5 -115 t-31.5 -94q-41 -59 -99 -113q35 11 84 18t70 7q33 1 103 -16t103 -17q76 0 136 30l50 -147q-41 -25 -80.5 -36.5t-59 -13t-61.5 -1.5q-23 0 -128 33t-155 29q-39 -4 -82 -17t-66 -25l-24 -11l-55 145l16.5 11t15.5 10t13.5 9.5t14.5 12t14.5 14t17.5 18.5q48 55 54 126.5 t-30 142.5h-221z" /> -<glyph unicode="" d="M2 300l298 -300l298 300h-198v900h-200v-900h-198zM602 900l298 300l298 -300h-198v-900h-200v900h-198z" /> -<glyph unicode="" d="M2 300h198v900h200v-900h198l-298 -300zM700 0v200h100v-100h200v-100h-300zM700 400v100h300v-200h-99v-100h-100v100h99v100h-200zM700 700v500h300v-500h-100v100h-100v-100h-100zM801 900h100v200h-100v-200z" /> -<glyph unicode="" d="M2 300h198v900h200v-900h198l-298 -300zM700 0v500h300v-500h-100v100h-100v-100h-100zM700 700v200h100v-100h200v-100h-300zM700 1100v100h300v-200h-99v-100h-100v100h99v100h-200zM801 200h100v200h-100v-200z" /> -<glyph unicode="" d="M2 300l298 -300l298 300h-198v900h-200v-900h-198zM800 100v400h300v-500h-100v100h-200zM800 1100v100h200v-500h-100v400h-100zM901 200h100v200h-100v-200z" /> -<glyph unicode="" d="M2 300l298 -300l298 300h-198v900h-200v-900h-198zM800 400v100h200v-500h-100v400h-100zM800 800v400h300v-500h-100v100h-200zM901 900h100v200h-100v-200z" /> -<glyph unicode="" d="M2 300l298 -300l298 300h-198v900h-200v-900h-198zM700 100v200h500v-200h-500zM700 400v200h400v-200h-400zM700 700v200h300v-200h-300zM700 1000v200h200v-200h-200z" /> -<glyph unicode="" d="M2 300l298 -300l298 300h-198v900h-200v-900h-198zM700 100v200h200v-200h-200zM700 400v200h300v-200h-300zM700 700v200h400v-200h-400zM700 1000v200h500v-200h-500z" /> -<glyph unicode="" d="M0 400v300q0 165 117.5 282.5t282.5 117.5h300q162 0 281 -118.5t119 -281.5v-300q0 -165 -118.5 -282.5t-281.5 -117.5h-300q-165 0 -282.5 117.5t-117.5 282.5zM200 300q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5v500q0 41 -29.5 70.5t-70.5 29.5 h-500q-41 0 -70.5 -29.5t-29.5 -70.5v-500z" /> -<glyph unicode="" d="M0 400v300q0 163 119 281.5t281 118.5h300q165 0 282.5 -117.5t117.5 -282.5v-300q0 -165 -117.5 -282.5t-282.5 -117.5h-300q-163 0 -281.5 117.5t-118.5 282.5zM200 300q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5v500q0 41 -29.5 70.5t-70.5 29.5 h-500q-41 0 -70.5 -29.5t-29.5 -70.5v-500zM400 300l333 250l-333 250v-500z" /> -<glyph unicode="" d="M0 400v300q0 163 117.5 281.5t282.5 118.5h300q163 0 281.5 -119t118.5 -281v-300q0 -165 -117.5 -282.5t-282.5 -117.5h-300q-165 0 -282.5 117.5t-117.5 282.5zM200 300q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5v500q0 41 -29.5 70.5t-70.5 29.5 h-500q-41 0 -70.5 -29.5t-29.5 -70.5v-500zM300 700l250 -333l250 333h-500z" /> -<glyph unicode="" d="M0 400v300q0 165 117.5 282.5t282.5 117.5h300q165 0 282.5 -117.5t117.5 -282.5v-300q0 -162 -118.5 -281t-281.5 -119h-300q-165 0 -282.5 118.5t-117.5 281.5zM200 300q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5v500q0 41 -29.5 70.5t-70.5 29.5 h-500q-41 0 -70.5 -29.5t-29.5 -70.5v-500zM300 400h500l-250 333z" /> -<glyph unicode="" d="M0 400v300h300v200l400 -350l-400 -350v200h-300zM500 0v200h500q41 0 70.5 29.5t29.5 70.5v500q0 41 -29.5 70.5t-70.5 29.5h-500v200h400q165 0 282.5 -117.5t117.5 -282.5v-300q0 -165 -117.5 -282.5t-282.5 -117.5h-400z" /> -<glyph unicode="" d="M217 519q8 -19 31 -19h302q-155 -438 -160 -458q-5 -21 4 -32l9 -8h9q14 0 26 15q11 13 274.5 321.5t264.5 308.5q14 19 5 36q-8 17 -31 17l-301 -1q1 4 78 219.5t79 227.5q2 15 -5 27l-9 9h-9q-15 0 -25 -16q-4 -6 -98 -111.5t-228.5 -257t-209.5 -237.5q-16 -19 -6 -41 z" /> -<glyph unicode="" d="M0 400q0 -165 117.5 -282.5t282.5 -117.5h300q47 0 100 15v185h-500q-41 0 -70.5 29.5t-29.5 70.5v500q0 41 29.5 70.5t70.5 29.5h500v185q-14 4 -114 7.5t-193 5.5l-93 2q-165 0 -282.5 -117.5t-117.5 -282.5v-300zM600 400v300h300v200l400 -350l-400 -350v200h-300z " /> -<glyph unicode="" d="M0 400q0 -165 117.5 -282.5t282.5 -117.5h300q163 0 281.5 117.5t118.5 282.5v98l-78 73l-122 -123v-148q0 -41 -29.5 -70.5t-70.5 -29.5h-500q-41 0 -70.5 29.5t-29.5 70.5v500q0 41 29.5 70.5t70.5 29.5h156l118 122l-74 78h-100q-165 0 -282.5 -117.5t-117.5 -282.5 v-300zM496 709l353 342l-149 149h500v-500l-149 149l-342 -353z" /> -<glyph unicode="" d="M4 600q0 162 80 299t217 217t299 80t299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299zM186 600q0 -171 121.5 -292.5t292.5 -121.5t292.5 121.5t121.5 292.5t-121.5 292.5t-292.5 121.5t-292.5 -121.5t-121.5 -292.5zM406 600 q0 80 57 137t137 57t137 -57t57 -137t-57 -137t-137 -57t-137 57t-57 137z" /> -<glyph unicode="" d="M0 0v275q0 11 7 18t18 7h1048q11 0 19 -7.5t8 -17.5v-275h-1100zM100 800l445 -500l450 500h-295v400h-300v-400h-300zM900 150h100v50h-100v-50z" /> -<glyph unicode="" d="M0 0v275q0 11 7 18t18 7h1048q11 0 19 -7.5t8 -17.5v-275h-1100zM100 700h300v-300h300v300h295l-445 500zM900 150h100v50h-100v-50z" /> -<glyph unicode="" d="M0 0v275q0 11 7 18t18 7h1048q11 0 19 -7.5t8 -17.5v-275h-1100zM100 705l305 -305l596 596l-154 155l-442 -442l-150 151zM900 150h100v50h-100v-50z" /> -<glyph unicode="" d="M0 0v275q0 11 7 18t18 7h1048q11 0 19 -7.5t8 -17.5v-275h-1100zM100 988l97 -98l212 213l-97 97zM200 400l697 1l3 699l-250 -239l-149 149l-212 -212l149 -149zM900 150h100v50h-100v-50z" /> -<glyph unicode="" d="M0 0v275q0 11 7 18t18 7h1048q11 0 19 -7.5t8 -17.5v-275h-1100zM200 612l212 -212l98 97l-213 212zM300 1200l239 -250l-149 -149l212 -212l149 148l249 -237l-1 697zM900 150h100v50h-100v-50z" /> -<glyph unicode="" d="M23 415l1177 784v-1079l-475 272l-310 -393v416h-392zM494 210l672 938l-672 -712v-226z" /> -<glyph unicode="" d="M0 150v1000q0 20 14.5 35t35.5 15h250v-300h500v300h100l200 -200v-850q0 -21 -15 -35.5t-35 -14.5h-150v400h-700v-400h-150q-21 0 -35.5 14.5t-14.5 35.5zM600 1000h100v200h-100v-200z" /> -<glyph unicode="" d="M0 150v1000q0 20 14.5 35t35.5 15h250v-300h500v300h100l200 -200v-218l-276 -275l-120 120l-126 -127h-378v-400h-150q-21 0 -35.5 14.5t-14.5 35.5zM581 306l123 123l120 -120l353 352l123 -123l-475 -476zM600 1000h100v200h-100v-200z" /> -<glyph unicode="" d="M0 150v1000q0 20 14.5 35t35.5 15h250v-300h500v300h100l200 -200v-269l-103 -103l-170 170l-298 -298h-329v-400h-150q-21 0 -35.5 14.5t-14.5 35.5zM600 1000h100v200h-100v-200zM700 133l170 170l-170 170l127 127l170 -170l170 170l127 -128l-170 -169l170 -170 l-127 -127l-170 170l-170 -170z" /> -<glyph unicode="" d="M0 150v1000q0 20 14.5 35t35.5 15h250v-300h500v300h100l200 -200v-300h-400v-200h-500v-400h-150q-21 0 -35.5 14.5t-14.5 35.5zM600 300l300 -300l300 300h-200v300h-200v-300h-200zM600 1000v200h100v-200h-100z" /> -<glyph unicode="" d="M0 150v1000q0 20 14.5 35t35.5 15h250v-300h500v300h100l200 -200v-402l-200 200l-298 -298h-402v-400h-150q-21 0 -35.5 14.5t-14.5 35.5zM600 300h200v-300h200v300h200l-300 300zM600 1000v200h100v-200h-100z" /> -<glyph unicode="" d="M0 250q0 -21 14.5 -35.5t35.5 -14.5h1100q21 0 35.5 14.5t14.5 35.5v550h-1200v-550zM0 900h1200v150q0 21 -14.5 35.5t-35.5 14.5h-1100q-21 0 -35.5 -14.5t-14.5 -35.5v-150zM100 300v200h400v-200h-400z" /> -<glyph unicode="" d="M0 400l300 298v-198h400v-200h-400v-198zM100 800v200h100v-200h-100zM300 800v200h100v-200h-100zM500 800v200h400v198l300 -298l-300 -298v198h-400zM800 300v200h100v-200h-100zM1000 300h100v200h-100v-200z" /> -<glyph unicode="" d="M100 700v400l50 100l50 -100v-300h100v300l50 100l50 -100v-300h100v300l50 100l50 -100v-400l-100 -203v-447q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v447zM800 597q0 -29 10.5 -55.5t25 -43t29 -28.5t25.5 -18l10 -5v-397q0 -21 14.5 -35.5 t35.5 -14.5h200q21 0 35.5 14.5t14.5 35.5v1106q0 31 -18 40.5t-44 -7.5l-276 -116q-25 -17 -43.5 -51.5t-18.5 -65.5v-359z" /> -<glyph unicode="" d="M100 0h400v56q-75 0 -87.5 6t-12.5 44v394h500v-394q0 -38 -12.5 -44t-87.5 -6v-56h400v56q-4 0 -11 0.5t-24 3t-30 7t-24 15t-11 24.5v888q0 22 25 34.5t50 13.5l25 2v56h-400v-56q75 0 87.5 -6t12.5 -44v-394h-500v394q0 38 12.5 44t87.5 6v56h-400v-56q4 0 11 -0.5 t24 -3t30 -7t24 -15t11 -24.5v-888q0 -22 -25 -34.5t-50 -13.5l-25 -2v-56z" /> -<glyph unicode="" d="M0 300q0 -41 29.5 -70.5t70.5 -29.5h300q41 0 70.5 29.5t29.5 70.5v500q0 41 -29.5 70.5t-70.5 29.5h-300q-41 0 -70.5 -29.5t-29.5 -70.5v-500zM100 100h400l200 200h105l295 98v-298h-425l-100 -100h-375zM100 300v200h300v-200h-300zM100 600v200h300v-200h-300z M100 1000h400l200 -200v-98l295 98h105v200h-425l-100 100h-375zM700 402v163l400 133v-163z" /> -<glyph unicode="" d="M16.5 974.5q0.5 -21.5 16 -90t46.5 -140t104 -177.5t175 -208q103 -103 207.5 -176t180 -103.5t137 -47t92.5 -16.5l31 1l163 162q17 18 13.5 41t-22.5 37l-192 136q-19 14 -45 12t-42 -19l-118 -118q-142 101 -268 227t-227 268l118 118q17 17 20 41.5t-11 44.5 l-139 194q-14 19 -36.5 22t-40.5 -14l-162 -162q-1 -11 -0.5 -32.5z" /> -<glyph unicode="" d="M0 50v212q0 20 10.5 45.5t24.5 39.5l365 303v50q0 4 1 10.5t12 22.5t30 28.5t60 23t97 10.5t97 -10t60 -23.5t30 -27.5t12 -24l1 -10v-50l365 -303q14 -14 24.5 -39.5t10.5 -45.5v-212q0 -21 -14.5 -35.5t-35.5 -14.5h-1100q-20 0 -35 14.5t-15 35.5zM0 712 q0 -21 14.5 -33.5t34.5 -8.5l202 33q20 4 34.5 21t14.5 38v146q141 24 300 24t300 -24v-146q0 -21 14.5 -38t34.5 -21l202 -33q20 -4 34.5 8.5t14.5 33.5v200q-6 8 -19 20.5t-63 45t-112 57t-171 45t-235 20.5q-92 0 -175 -10.5t-141.5 -27t-108.5 -36.5t-81.5 -40 t-53.5 -36.5t-31 -27.5l-9 -10v-200z" /> -<glyph unicode="" d="M100 0v100h1100v-100h-1100zM175 200h950l-125 150v250l100 100v400h-100v-200h-100v200h-200v-200h-100v200h-200v-200h-100v200h-100v-400l100 -100v-250z" /> -<glyph unicode="" d="M100 0h300v400q0 41 -29.5 70.5t-70.5 29.5h-100q-41 0 -70.5 -29.5t-29.5 -70.5v-400zM500 0v1000q0 41 29.5 70.5t70.5 29.5h100q41 0 70.5 -29.5t29.5 -70.5v-1000h-300zM900 0v700q0 41 29.5 70.5t70.5 29.5h100q41 0 70.5 -29.5t29.5 -70.5v-700h-300z" /> -<glyph unicode="" d="M-100 300v500q0 124 88 212t212 88h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212zM100 200h900v700h-900v-700zM200 300h300v300h-200v100h200v100h-300v-300h200v-100h-200v-100zM600 300h200v100h100v300h-100v100h-200v-500 zM700 400v300h100v-300h-100z" /> -<glyph unicode="" d="M-100 300v500q0 124 88 212t212 88h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212zM100 200h900v700h-900v-700zM200 300h100v200h100v-200h100v500h-100v-200h-100v200h-100v-500zM600 300h200v100h100v300h-100v100h-200v-500 zM700 400v300h100v-300h-100z" /> -<glyph unicode="" d="M-100 300v500q0 124 88 212t212 88h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212zM100 200h900v700h-900v-700zM200 300h300v100h-200v300h200v100h-300v-500zM600 300h300v100h-200v300h200v100h-300v-500z" /> -<glyph unicode="" d="M-100 300v500q0 124 88 212t212 88h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212zM100 200h900v700h-900v-700zM200 550l300 -150v300zM600 400l300 150l-300 150v-300z" /> -<glyph unicode="" d="M-100 300v500q0 124 88 212t212 88h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212zM100 200h900v700h-900v-700zM200 300v500h700v-500h-700zM300 400h130q41 0 68 42t27 107t-28.5 108t-66.5 43h-130v-300zM575 549 q0 -65 27 -107t68 -42h130v300h-130q-38 0 -66.5 -43t-28.5 -108z" /> -<glyph unicode="" d="M-100 300v500q0 124 88 212t212 88h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212zM100 200h900v700h-900v-700zM200 300h300v300h-200v100h200v100h-300v-300h200v-100h-200v-100zM601 300h100v100h-100v-100zM700 700h100 v-400h100v500h-200v-100z" /> -<glyph unicode="" d="M-100 300v500q0 124 88 212t212 88h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212zM100 200h900v700h-900v-700zM200 300h300v400h-200v100h-100v-500zM301 400v200h100v-200h-100zM601 300h100v100h-100v-100zM700 700h100 v-400h100v500h-200v-100z" /> -<glyph unicode="" d="M-100 300v500q0 124 88 212t212 88h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212zM100 200h900v700h-900v-700zM200 700v100h300v-300h-99v-100h-100v100h99v200h-200zM201 300v100h100v-100h-100zM601 300v100h100v-100h-100z M700 700v100h200v-500h-100v400h-100z" /> -<glyph unicode="" d="M4 600q0 162 80 299t217 217t299 80t299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299zM186 600q0 -171 121.5 -292.5t292.5 -121.5t292.5 121.5t121.5 292.5t-121.5 292.5t-292.5 121.5t-292.5 -121.5t-121.5 -292.5zM400 500v200 l100 100h300v-100h-300v-200h300v-100h-300z" /> -<glyph unicode="" d="M0 600q0 162 80 299t217 217t299 80t299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299zM182 600q0 -171 121.5 -292.5t292.5 -121.5t292.5 121.5t121.5 292.5t-121.5 292.5t-292.5 121.5t-292.5 -121.5t-121.5 -292.5zM400 400v400h300 l100 -100v-100h-100v100h-200v-100h200v-100h-200v-100h-100zM700 400v100h100v-100h-100z" /> -<glyph unicode="" d="M-14 494q0 -80 56.5 -137t135.5 -57h222v300h400v-300h128q120 0 205 86.5t85 207.5t-85 207t-205 86q-46 0 -90 -14q-44 97 -134.5 156.5t-200.5 59.5q-152 0 -260 -107.5t-108 -260.5q0 -25 2 -37q-66 -14 -108.5 -67.5t-42.5 -122.5zM300 200h200v300h200v-300h200 l-300 -300z" /> -<glyph unicode="" d="M-14 494q0 -80 56.5 -137t135.5 -57h8l414 414l403 -403q94 26 154.5 104.5t60.5 178.5q0 120 -85 206.5t-205 86.5q-46 0 -90 -14q-44 97 -134.5 156.5t-200.5 59.5q-152 0 -260 -107.5t-108 -260.5q0 -25 2 -37q-66 -14 -108.5 -67.5t-42.5 -122.5zM300 200l300 300 l300 -300h-200v-300h-200v300h-200z" /> -<glyph unicode="" d="M100 200h400v-155l-75 -45h350l-75 45v155h400l-270 300h170l-270 300h170l-300 333l-300 -333h170l-270 -300h170z" /> -<glyph unicode="" d="M121 700q0 -53 28.5 -97t75.5 -65q-4 -16 -4 -38q0 -74 52.5 -126.5t126.5 -52.5q56 0 100 30v-306l-75 -45h350l-75 45v306q46 -30 100 -30q74 0 126.5 52.5t52.5 126.5q0 24 -9 55q50 32 79.5 83t29.5 112q0 90 -61.5 155.5t-150.5 71.5q-26 89 -99.5 145.5 t-167.5 56.5q-116 0 -197.5 -81.5t-81.5 -197.5q0 -4 1 -11.5t1 -11.5q-14 2 -23 2q-74 0 -126.5 -52.5t-52.5 -126.5z" /> -</font> -</defs></svg> \ No newline at end of file diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/demultiplexing/html/bootstrap3/fonts/glyphicons-halflings-regular.ttf b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/demultiplexing/html/bootstrap3/fonts/glyphicons-halflings-regular.ttf deleted file mode 100644 index 67fa00bf83801d2fa568546b982c80d27f6ef74e..0000000000000000000000000000000000000000 Binary files a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/demultiplexing/html/bootstrap3/fonts/glyphicons-halflings-regular.ttf and /dev/null differ diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/demultiplexing/html/bootstrap3/fonts/glyphicons-halflings-regular.woff b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/demultiplexing/html/bootstrap3/fonts/glyphicons-halflings-regular.woff deleted file mode 100644 index 8c54182aa5d4d1ab3c9171976b615c1dcb1dc187..0000000000000000000000000000000000000000 Binary files a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/demultiplexing/html/bootstrap3/fonts/glyphicons-halflings-regular.woff and /dev/null differ diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/demultiplexing/html/bootstrap3/js/bootstrap.js b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/demultiplexing/html/bootstrap3/js/bootstrap.js deleted file mode 100644 index 53da1c77c084d31b416536df1d7c055a5e362637..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/demultiplexing/html/bootstrap3/js/bootstrap.js +++ /dev/null @@ -1,2114 +0,0 @@ -/*! - * Bootstrap v3.2.0 (http://getbootstrap.com) - * Copyright 2011-2014 Twitter, Inc. - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) - */ - -if (typeof jQuery === 'undefined') { throw new Error('Bootstrap\'s JavaScript requires jQuery') } - -/* ======================================================================== - * Bootstrap: transition.js v3.2.0 - * http://getbootstrap.com/javascript/#transitions - * ======================================================================== - * Copyright 2011-2014 Twitter, Inc. - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) - * ======================================================================== */ - - -+function ($) { - 'use strict'; - - // CSS TRANSITION SUPPORT (Shoutout: http://www.modernizr.com/) - // ============================================================ - - function transitionEnd() { - var el = document.createElement('bootstrap') - - var transEndEventNames = { - WebkitTransition : 'webkitTransitionEnd', - MozTransition : 'transitionend', - OTransition : 'oTransitionEnd otransitionend', - transition : 'transitionend' - } - - for (var name in transEndEventNames) { - if (el.style[name] !== undefined) { - return { end: transEndEventNames[name] } - } - } - - return false // explicit for ie8 ( ._.) - } - - // http://blog.alexmaccaw.com/css-transitions - $.fn.emulateTransitionEnd = function (duration) { - var called = false - var $el = this - $(this).one('bsTransitionEnd', function () { called = true }) - var callback = function () { if (!called) $($el).trigger($.support.transition.end) } - setTimeout(callback, duration) - return this - } - - $(function () { - $.support.transition = transitionEnd() - - if (!$.support.transition) return - - $.event.special.bsTransitionEnd = { - bindType: $.support.transition.end, - delegateType: $.support.transition.end, - handle: function (e) { - if ($(e.target).is(this)) return e.handleObj.handler.apply(this, arguments) - } - } - }) - -}(jQuery); - -/* ======================================================================== - * Bootstrap: alert.js v3.2.0 - * http://getbootstrap.com/javascript/#alerts - * ======================================================================== - * Copyright 2011-2014 Twitter, Inc. - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) - * ======================================================================== */ - - -+function ($) { - 'use strict'; - - // ALERT CLASS DEFINITION - // ====================== - - var dismiss = '[data-dismiss="alert"]' - var Alert = function (el) { - $(el).on('click', dismiss, this.close) - } - - Alert.VERSION = '3.2.0' - - Alert.prototype.close = function (e) { - var $this = $(this) - var selector = $this.attr('data-target') - - if (!selector) { - selector = $this.attr('href') - selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') // strip for ie7 - } - - var $parent = $(selector) - - if (e) e.preventDefault() - - if (!$parent.length) { - $parent = $this.hasClass('alert') ? $this : $this.parent() - } - - $parent.trigger(e = $.Event('close.bs.alert')) - - if (e.isDefaultPrevented()) return - - $parent.removeClass('in') - - function removeElement() { - // detach from parent, fire event then clean up data - $parent.detach().trigger('closed.bs.alert').remove() - } - - $.support.transition && $parent.hasClass('fade') ? - $parent - .one('bsTransitionEnd', removeElement) - .emulateTransitionEnd(150) : - removeElement() - } - - - // ALERT PLUGIN DEFINITION - // ======================= - - function Plugin(option) { - return this.each(function () { - var $this = $(this) - var data = $this.data('bs.alert') - - if (!data) $this.data('bs.alert', (data = new Alert(this))) - if (typeof option == 'string') data[option].call($this) - }) - } - - var old = $.fn.alert - - $.fn.alert = Plugin - $.fn.alert.Constructor = Alert - - - // ALERT NO CONFLICT - // ================= - - $.fn.alert.noConflict = function () { - $.fn.alert = old - return this - } - - - // ALERT DATA-API - // ============== - - $(document).on('click.bs.alert.data-api', dismiss, Alert.prototype.close) - -}(jQuery); - -/* ======================================================================== - * Bootstrap: button.js v3.2.0 - * http://getbootstrap.com/javascript/#buttons - * ======================================================================== - * Copyright 2011-2014 Twitter, Inc. - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) - * ======================================================================== */ - - -+function ($) { - 'use strict'; - - // BUTTON PUBLIC CLASS DEFINITION - // ============================== - - var Button = function (element, options) { - this.$element = $(element) - this.options = $.extend({}, Button.DEFAULTS, options) - this.isLoading = false - } - - Button.VERSION = '3.2.0' - - Button.DEFAULTS = { - loadingText: 'loading...' - } - - Button.prototype.setState = function (state) { - var d = 'disabled' - var $el = this.$element - var val = $el.is('input') ? 'val' : 'html' - var data = $el.data() - - state = state + 'Text' - - if (data.resetText == null) $el.data('resetText', $el[val]()) - - $el[val](data[state] == null ? this.options[state] : data[state]) - - // push to event loop to allow forms to submit - setTimeout($.proxy(function () { - if (state == 'loadingText') { - this.isLoading = true - $el.addClass(d).attr(d, d) - } else if (this.isLoading) { - this.isLoading = false - $el.removeClass(d).removeAttr(d) - } - }, this), 0) - } - - Button.prototype.toggle = function () { - var changed = true - var $parent = this.$element.closest('[data-toggle="buttons"]') - - if ($parent.length) { - var $input = this.$element.find('input') - if ($input.prop('type') == 'radio') { - if ($input.prop('checked') && this.$element.hasClass('active')) changed = false - else $parent.find('.active').removeClass('active') - } - if (changed) $input.prop('checked', !this.$element.hasClass('active')).trigger('change') - } - - if (changed) this.$element.toggleClass('active') - } - - - // BUTTON PLUGIN DEFINITION - // ======================== - - function Plugin(option) { - return this.each(function () { - var $this = $(this) - var data = $this.data('bs.button') - var options = typeof option == 'object' && option - - if (!data) $this.data('bs.button', (data = new Button(this, options))) - - if (option == 'toggle') data.toggle() - else if (option) data.setState(option) - }) - } - - var old = $.fn.button - - $.fn.button = Plugin - $.fn.button.Constructor = Button - - - // BUTTON NO CONFLICT - // ================== - - $.fn.button.noConflict = function () { - $.fn.button = old - return this - } - - - // BUTTON DATA-API - // =============== - - $(document).on('click.bs.button.data-api', '[data-toggle^="button"]', function (e) { - var $btn = $(e.target) - if (!$btn.hasClass('btn')) $btn = $btn.closest('.btn') - Plugin.call($btn, 'toggle') - e.preventDefault() - }) - -}(jQuery); - -/* ======================================================================== - * Bootstrap: carousel.js v3.2.0 - * http://getbootstrap.com/javascript/#carousel - * ======================================================================== - * Copyright 2011-2014 Twitter, Inc. - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) - * ======================================================================== */ - - -+function ($) { - 'use strict'; - - // CAROUSEL CLASS DEFINITION - // ========================= - - var Carousel = function (element, options) { - this.$element = $(element).on('keydown.bs.carousel', $.proxy(this.keydown, this)) - this.$indicators = this.$element.find('.carousel-indicators') - this.options = options - this.paused = - this.sliding = - this.interval = - this.$active = - this.$items = null - - this.options.pause == 'hover' && this.$element - .on('mouseenter.bs.carousel', $.proxy(this.pause, this)) - .on('mouseleave.bs.carousel', $.proxy(this.cycle, this)) - } - - Carousel.VERSION = '3.2.0' - - Carousel.DEFAULTS = { - interval: 5000, - pause: 'hover', - wrap: true - } - - Carousel.prototype.keydown = function (e) { - switch (e.which) { - case 37: this.prev(); break - case 39: this.next(); break - default: return - } - - e.preventDefault() - } - - Carousel.prototype.cycle = function (e) { - e || (this.paused = false) - - this.interval && clearInterval(this.interval) - - this.options.interval - && !this.paused - && (this.interval = setInterval($.proxy(this.next, this), this.options.interval)) - - return this - } - - Carousel.prototype.getItemIndex = function (item) { - this.$items = item.parent().children('.item') - return this.$items.index(item || this.$active) - } - - Carousel.prototype.to = function (pos) { - var that = this - var activeIndex = this.getItemIndex(this.$active = this.$element.find('.item.active')) - - if (pos > (this.$items.length - 1) || pos < 0) return - - if (this.sliding) return this.$element.one('slid.bs.carousel', function () { that.to(pos) }) // yes, "slid" - if (activeIndex == pos) return this.pause().cycle() - - return this.slide(pos > activeIndex ? 'next' : 'prev', $(this.$items[pos])) - } - - Carousel.prototype.pause = function (e) { - e || (this.paused = true) - - if (this.$element.find('.next, .prev').length && $.support.transition) { - this.$element.trigger($.support.transition.end) - this.cycle(true) - } - - this.interval = clearInterval(this.interval) - - return this - } - - Carousel.prototype.next = function () { - if (this.sliding) return - return this.slide('next') - } - - Carousel.prototype.prev = function () { - if (this.sliding) return - return this.slide('prev') - } - - Carousel.prototype.slide = function (type, next) { - var $active = this.$element.find('.item.active') - var $next = next || $active[type]() - var isCycling = this.interval - var direction = type == 'next' ? 'left' : 'right' - var fallback = type == 'next' ? 'first' : 'last' - var that = this - - if (!$next.length) { - if (!this.options.wrap) return - $next = this.$element.find('.item')[fallback]() - } - - if ($next.hasClass('active')) return (this.sliding = false) - - var relatedTarget = $next[0] - var slideEvent = $.Event('slide.bs.carousel', { - relatedTarget: relatedTarget, - direction: direction - }) - this.$element.trigger(slideEvent) - if (slideEvent.isDefaultPrevented()) return - - this.sliding = true - - isCycling && this.pause() - - if (this.$indicators.length) { - this.$indicators.find('.active').removeClass('active') - var $nextIndicator = $(this.$indicators.children()[this.getItemIndex($next)]) - $nextIndicator && $nextIndicator.addClass('active') - } - - var slidEvent = $.Event('slid.bs.carousel', { relatedTarget: relatedTarget, direction: direction }) // yes, "slid" - if ($.support.transition && this.$element.hasClass('slide')) { - $next.addClass(type) - $next[0].offsetWidth // force reflow - $active.addClass(direction) - $next.addClass(direction) - $active - .one('bsTransitionEnd', function () { - $next.removeClass([type, direction].join(' ')).addClass('active') - $active.removeClass(['active', direction].join(' ')) - that.sliding = false - setTimeout(function () { - that.$element.trigger(slidEvent) - }, 0) - }) - .emulateTransitionEnd($active.css('transition-duration').slice(0, -1) * 1000) - } else { - $active.removeClass('active') - $next.addClass('active') - this.sliding = false - this.$element.trigger(slidEvent) - } - - isCycling && this.cycle() - - return this - } - - - // CAROUSEL PLUGIN DEFINITION - // ========================== - - function Plugin(option) { - return this.each(function () { - var $this = $(this) - var data = $this.data('bs.carousel') - var options = $.extend({}, Carousel.DEFAULTS, $this.data(), typeof option == 'object' && option) - var action = typeof option == 'string' ? option : options.slide - - if (!data) $this.data('bs.carousel', (data = new Carousel(this, options))) - if (typeof option == 'number') data.to(option) - else if (action) data[action]() - else if (options.interval) data.pause().cycle() - }) - } - - var old = $.fn.carousel - - $.fn.carousel = Plugin - $.fn.carousel.Constructor = Carousel - - - // CAROUSEL NO CONFLICT - // ==================== - - $.fn.carousel.noConflict = function () { - $.fn.carousel = old - return this - } - - - // CAROUSEL DATA-API - // ================= - - $(document).on('click.bs.carousel.data-api', '[data-slide], [data-slide-to]', function (e) { - var href - var $this = $(this) - var $target = $($this.attr('data-target') || (href = $this.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '')) // strip for ie7 - if (!$target.hasClass('carousel')) return - var options = $.extend({}, $target.data(), $this.data()) - var slideIndex = $this.attr('data-slide-to') - if (slideIndex) options.interval = false - - Plugin.call($target, options) - - if (slideIndex) { - $target.data('bs.carousel').to(slideIndex) - } - - e.preventDefault() - }) - - $(window).on('load', function () { - $('[data-ride="carousel"]').each(function () { - var $carousel = $(this) - Plugin.call($carousel, $carousel.data()) - }) - }) - -}(jQuery); - -/* ======================================================================== - * Bootstrap: collapse.js v3.2.0 - * http://getbootstrap.com/javascript/#collapse - * ======================================================================== - * Copyright 2011-2014 Twitter, Inc. - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) - * ======================================================================== */ - - -+function ($) { - 'use strict'; - - // COLLAPSE PUBLIC CLASS DEFINITION - // ================================ - - var Collapse = function (element, options) { - this.$element = $(element) - this.options = $.extend({}, Collapse.DEFAULTS, options) - this.transitioning = null - - if (this.options.parent) this.$parent = $(this.options.parent) - if (this.options.toggle) this.toggle() - } - - Collapse.VERSION = '3.2.0' - - Collapse.DEFAULTS = { - toggle: true - } - - Collapse.prototype.dimension = function () { - var hasWidth = this.$element.hasClass('width') - return hasWidth ? 'width' : 'height' - } - - Collapse.prototype.show = function () { - if (this.transitioning || this.$element.hasClass('in')) return - - var startEvent = $.Event('show.bs.collapse') - this.$element.trigger(startEvent) - if (startEvent.isDefaultPrevented()) return - - var actives = this.$parent && this.$parent.find('> .panel > .in') - - if (actives && actives.length) { - var hasData = actives.data('bs.collapse') - if (hasData && hasData.transitioning) return - Plugin.call(actives, 'hide') - hasData || actives.data('bs.collapse', null) - } - - var dimension = this.dimension() - - this.$element - .removeClass('collapse') - .addClass('collapsing')[dimension](0) - - this.transitioning = 1 - - var complete = function () { - this.$element - .removeClass('collapsing') - .addClass('collapse in')[dimension]('') - this.transitioning = 0 - this.$element - .trigger('shown.bs.collapse') - } - - if (!$.support.transition) return complete.call(this) - - var scrollSize = $.camelCase(['scroll', dimension].join('-')) - - this.$element - .one('bsTransitionEnd', $.proxy(complete, this)) - .emulateTransitionEnd(350)[dimension](this.$element[0][scrollSize]) - } - - Collapse.prototype.hide = function () { - if (this.transitioning || !this.$element.hasClass('in')) return - - var startEvent = $.Event('hide.bs.collapse') - this.$element.trigger(startEvent) - if (startEvent.isDefaultPrevented()) return - - var dimension = this.dimension() - - this.$element[dimension](this.$element[dimension]())[0].offsetHeight - - this.$element - .addClass('collapsing') - .removeClass('collapse') - .removeClass('in') - - this.transitioning = 1 - - var complete = function () { - this.transitioning = 0 - this.$element - .trigger('hidden.bs.collapse') - .removeClass('collapsing') - .addClass('collapse') - } - - if (!$.support.transition) return complete.call(this) - - this.$element - [dimension](0) - .one('bsTransitionEnd', $.proxy(complete, this)) - .emulateTransitionEnd(350) - } - - Collapse.prototype.toggle = function () { - this[this.$element.hasClass('in') ? 'hide' : 'show']() - } - - - // COLLAPSE PLUGIN DEFINITION - // ========================== - - function Plugin(option) { - return this.each(function () { - var $this = $(this) - var data = $this.data('bs.collapse') - var options = $.extend({}, Collapse.DEFAULTS, $this.data(), typeof option == 'object' && option) - - if (!data && options.toggle && option == 'show') option = !option - if (!data) $this.data('bs.collapse', (data = new Collapse(this, options))) - if (typeof option == 'string') data[option]() - }) - } - - var old = $.fn.collapse - - $.fn.collapse = Plugin - $.fn.collapse.Constructor = Collapse - - - // COLLAPSE NO CONFLICT - // ==================== - - $.fn.collapse.noConflict = function () { - $.fn.collapse = old - return this - } - - - // COLLAPSE DATA-API - // ================= - - $(document).on('click.bs.collapse.data-api', '[data-toggle="collapse"]', function (e) { - var href - var $this = $(this) - var target = $this.attr('data-target') - || e.preventDefault() - || (href = $this.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '') // strip for ie7 - var $target = $(target) - var data = $target.data('bs.collapse') - var option = data ? 'toggle' : $this.data() - var parent = $this.attr('data-parent') - var $parent = parent && $(parent) - - if (!data || !data.transitioning) { - if ($parent) $parent.find('[data-toggle="collapse"][data-parent="' + parent + '"]').not($this).addClass('collapsed') - $this[$target.hasClass('in') ? 'addClass' : 'removeClass']('collapsed') - } - - Plugin.call($target, option) - }) - -}(jQuery); - -/* ======================================================================== - * Bootstrap: dropdown.js v3.2.0 - * http://getbootstrap.com/javascript/#dropdowns - * ======================================================================== - * Copyright 2011-2014 Twitter, Inc. - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) - * ======================================================================== */ - - -+function ($) { - 'use strict'; - - // DROPDOWN CLASS DEFINITION - // ========================= - - var backdrop = '.dropdown-backdrop' - var toggle = '[data-toggle="dropdown"]' - var Dropdown = function (element) { - $(element).on('click.bs.dropdown', this.toggle) - } - - Dropdown.VERSION = '3.2.0' - - Dropdown.prototype.toggle = function (e) { - var $this = $(this) - - if ($this.is('.disabled, :disabled')) return - - var $parent = getParent($this) - var isActive = $parent.hasClass('open') - - clearMenus() - - if (!isActive) { - if ('ontouchstart' in document.documentElement && !$parent.closest('.navbar-nav').length) { - // if mobile we use a backdrop because click events don't delegate - $('<div class="dropdown-backdrop"/>').insertAfter($(this)).on('click', clearMenus) - } - - var relatedTarget = { relatedTarget: this } - $parent.trigger(e = $.Event('show.bs.dropdown', relatedTarget)) - - if (e.isDefaultPrevented()) return - - $this.trigger('focus') - - $parent - .toggleClass('open') - .trigger('shown.bs.dropdown', relatedTarget) - } - - return false - } - - Dropdown.prototype.keydown = function (e) { - if (!/(38|40|27)/.test(e.keyCode)) return - - var $this = $(this) - - e.preventDefault() - e.stopPropagation() - - if ($this.is('.disabled, :disabled')) return - - var $parent = getParent($this) - var isActive = $parent.hasClass('open') - - if (!isActive || (isActive && e.keyCode == 27)) { - if (e.which == 27) $parent.find(toggle).trigger('focus') - return $this.trigger('click') - } - - var desc = ' li:not(.divider):visible a' - var $items = $parent.find('[role="menu"]' + desc + ', [role="listbox"]' + desc) - - if (!$items.length) return - - var index = $items.index($items.filter(':focus')) - - if (e.keyCode == 38 && index > 0) index-- // up - if (e.keyCode == 40 && index < $items.length - 1) index++ // down - if (!~index) index = 0 - - $items.eq(index).trigger('focus') - } - - function clearMenus(e) { - if (e && e.which === 3) return - $(backdrop).remove() - $(toggle).each(function () { - var $parent = getParent($(this)) - var relatedTarget = { relatedTarget: this } - if (!$parent.hasClass('open')) return - $parent.trigger(e = $.Event('hide.bs.dropdown', relatedTarget)) - if (e.isDefaultPrevented()) return - $parent.removeClass('open').trigger('hidden.bs.dropdown', relatedTarget) - }) - } - - function getParent($this) { - var selector = $this.attr('data-target') - - if (!selector) { - selector = $this.attr('href') - selector = selector && /#[A-Za-z]/.test(selector) && selector.replace(/.*(?=#[^\s]*$)/, '') // strip for ie7 - } - - var $parent = selector && $(selector) - - return $parent && $parent.length ? $parent : $this.parent() - } - - - // DROPDOWN PLUGIN DEFINITION - // ========================== - - function Plugin(option) { - return this.each(function () { - var $this = $(this) - var data = $this.data('bs.dropdown') - - if (!data) $this.data('bs.dropdown', (data = new Dropdown(this))) - if (typeof option == 'string') data[option].call($this) - }) - } - - var old = $.fn.dropdown - - $.fn.dropdown = Plugin - $.fn.dropdown.Constructor = Dropdown - - - // DROPDOWN NO CONFLICT - // ==================== - - $.fn.dropdown.noConflict = function () { - $.fn.dropdown = old - return this - } - - - // APPLY TO STANDARD DROPDOWN ELEMENTS - // =================================== - - $(document) - .on('click.bs.dropdown.data-api', clearMenus) - .on('click.bs.dropdown.data-api', '.dropdown form', function (e) { e.stopPropagation() }) - .on('click.bs.dropdown.data-api', toggle, Dropdown.prototype.toggle) - .on('keydown.bs.dropdown.data-api', toggle + ', [role="menu"], [role="listbox"]', Dropdown.prototype.keydown) - -}(jQuery); - -/* ======================================================================== - * Bootstrap: modal.js v3.2.0 - * http://getbootstrap.com/javascript/#modals - * ======================================================================== - * Copyright 2011-2014 Twitter, Inc. - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) - * ======================================================================== */ - - -+function ($) { - 'use strict'; - - // MODAL CLASS DEFINITION - // ====================== - - var Modal = function (element, options) { - this.options = options - this.$body = $(document.body) - this.$element = $(element) - this.$backdrop = - this.isShown = null - this.scrollbarWidth = 0 - - if (this.options.remote) { - this.$element - .find('.modal-content') - .load(this.options.remote, $.proxy(function () { - this.$element.trigger('loaded.bs.modal') - }, this)) - } - } - - Modal.VERSION = '3.2.0' - - Modal.DEFAULTS = { - backdrop: true, - keyboard: true, - show: true - } - - Modal.prototype.toggle = function (_relatedTarget) { - return this.isShown ? this.hide() : this.show(_relatedTarget) - } - - Modal.prototype.show = function (_relatedTarget) { - var that = this - var e = $.Event('show.bs.modal', { relatedTarget: _relatedTarget }) - - this.$element.trigger(e) - - if (this.isShown || e.isDefaultPrevented()) return - - this.isShown = true - - this.checkScrollbar() - this.$body.addClass('modal-open') - - this.setScrollbar() - this.escape() - - this.$element.on('click.dismiss.bs.modal', '[data-dismiss="modal"]', $.proxy(this.hide, this)) - - this.backdrop(function () { - var transition = $.support.transition && that.$element.hasClass('fade') - - if (!that.$element.parent().length) { - that.$element.appendTo(that.$body) // don't move modals dom position - } - - that.$element - .show() - .scrollTop(0) - - if (transition) { - that.$element[0].offsetWidth // force reflow - } - - that.$element - .addClass('in') - .attr('aria-hidden', false) - - that.enforceFocus() - - var e = $.Event('shown.bs.modal', { relatedTarget: _relatedTarget }) - - transition ? - that.$element.find('.modal-dialog') // wait for modal to slide in - .one('bsTransitionEnd', function () { - that.$element.trigger('focus').trigger(e) - }) - .emulateTransitionEnd(300) : - that.$element.trigger('focus').trigger(e) - }) - } - - Modal.prototype.hide = function (e) { - if (e) e.preventDefault() - - e = $.Event('hide.bs.modal') - - this.$element.trigger(e) - - if (!this.isShown || e.isDefaultPrevented()) return - - this.isShown = false - - this.$body.removeClass('modal-open') - - this.resetScrollbar() - this.escape() - - $(document).off('focusin.bs.modal') - - this.$element - .removeClass('in') - .attr('aria-hidden', true) - .off('click.dismiss.bs.modal') - - $.support.transition && this.$element.hasClass('fade') ? - this.$element - .one('bsTransitionEnd', $.proxy(this.hideModal, this)) - .emulateTransitionEnd(300) : - this.hideModal() - } - - Modal.prototype.enforceFocus = function () { - $(document) - .off('focusin.bs.modal') // guard against infinite focus loop - .on('focusin.bs.modal', $.proxy(function (e) { - if (this.$element[0] !== e.target && !this.$element.has(e.target).length) { - this.$element.trigger('focus') - } - }, this)) - } - - Modal.prototype.escape = function () { - if (this.isShown && this.options.keyboard) { - this.$element.on('keyup.dismiss.bs.modal', $.proxy(function (e) { - e.which == 27 && this.hide() - }, this)) - } else if (!this.isShown) { - this.$element.off('keyup.dismiss.bs.modal') - } - } - - Modal.prototype.hideModal = function () { - var that = this - this.$element.hide() - this.backdrop(function () { - that.$element.trigger('hidden.bs.modal') - }) - } - - Modal.prototype.removeBackdrop = function () { - this.$backdrop && this.$backdrop.remove() - this.$backdrop = null - } - - Modal.prototype.backdrop = function (callback) { - var that = this - var animate = this.$element.hasClass('fade') ? 'fade' : '' - - if (this.isShown && this.options.backdrop) { - var doAnimate = $.support.transition && animate - - this.$backdrop = $('<div class="modal-backdrop ' + animate + '" />') - .appendTo(this.$body) - - this.$element.on('click.dismiss.bs.modal', $.proxy(function (e) { - if (e.target !== e.currentTarget) return - this.options.backdrop == 'static' - ? this.$element[0].focus.call(this.$element[0]) - : this.hide.call(this) - }, this)) - - if (doAnimate) this.$backdrop[0].offsetWidth // force reflow - - this.$backdrop.addClass('in') - - if (!callback) return - - doAnimate ? - this.$backdrop - .one('bsTransitionEnd', callback) - .emulateTransitionEnd(150) : - callback() - - } else if (!this.isShown && this.$backdrop) { - this.$backdrop.removeClass('in') - - var callbackRemove = function () { - that.removeBackdrop() - callback && callback() - } - $.support.transition && this.$element.hasClass('fade') ? - this.$backdrop - .one('bsTransitionEnd', callbackRemove) - .emulateTransitionEnd(150) : - callbackRemove() - - } else if (callback) { - callback() - } - } - - Modal.prototype.checkScrollbar = function () { - if (document.body.clientWidth >= window.innerWidth) return - this.scrollbarWidth = this.scrollbarWidth || this.measureScrollbar() - } - - Modal.prototype.setScrollbar = function () { - var bodyPad = parseInt((this.$body.css('padding-right') || 0), 10) - if (this.scrollbarWidth) this.$body.css('padding-right', bodyPad + this.scrollbarWidth) - } - - Modal.prototype.resetScrollbar = function () { - this.$body.css('padding-right', '') - } - - Modal.prototype.measureScrollbar = function () { // thx walsh - var scrollDiv = document.createElement('div') - scrollDiv.className = 'modal-scrollbar-measure' - this.$body.append(scrollDiv) - var scrollbarWidth = scrollDiv.offsetWidth - scrollDiv.clientWidth - this.$body[0].removeChild(scrollDiv) - return scrollbarWidth - } - - - // MODAL PLUGIN DEFINITION - // ======================= - - function Plugin(option, _relatedTarget) { - return this.each(function () { - var $this = $(this) - var data = $this.data('bs.modal') - var options = $.extend({}, Modal.DEFAULTS, $this.data(), typeof option == 'object' && option) - - if (!data) $this.data('bs.modal', (data = new Modal(this, options))) - if (typeof option == 'string') data[option](_relatedTarget) - else if (options.show) data.show(_relatedTarget) - }) - } - - var old = $.fn.modal - - $.fn.modal = Plugin - $.fn.modal.Constructor = Modal - - - // MODAL NO CONFLICT - // ================= - - $.fn.modal.noConflict = function () { - $.fn.modal = old - return this - } - - - // MODAL DATA-API - // ============== - - $(document).on('click.bs.modal.data-api', '[data-toggle="modal"]', function (e) { - var $this = $(this) - var href = $this.attr('href') - var $target = $($this.attr('data-target') || (href && href.replace(/.*(?=#[^\s]+$)/, ''))) // strip for ie7 - var option = $target.data('bs.modal') ? 'toggle' : $.extend({ remote: !/#/.test(href) && href }, $target.data(), $this.data()) - - if ($this.is('a')) e.preventDefault() - - $target.one('show.bs.modal', function (showEvent) { - if (showEvent.isDefaultPrevented()) return // only register focus restorer if modal will actually get shown - $target.one('hidden.bs.modal', function () { - $this.is(':visible') && $this.trigger('focus') - }) - }) - Plugin.call($target, option, this) - }) - -}(jQuery); - -/* ======================================================================== - * Bootstrap: tooltip.js v3.2.0 - * http://getbootstrap.com/javascript/#tooltip - * Inspired by the original jQuery.tipsy by Jason Frame - * ======================================================================== - * Copyright 2011-2014 Twitter, Inc. - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) - * ======================================================================== */ - - -+function ($) { - 'use strict'; - - // TOOLTIP PUBLIC CLASS DEFINITION - // =============================== - - var Tooltip = function (element, options) { - this.type = - this.options = - this.enabled = - this.timeout = - this.hoverState = - this.$element = null - - this.init('tooltip', element, options) - } - - Tooltip.VERSION = '3.2.0' - - Tooltip.DEFAULTS = { - animation: true, - placement: 'top', - selector: false, - template: '<div class="tooltip" role="tooltip"><div class="tooltip-arrow"></div><div class="tooltip-inner"></div></div>', - trigger: 'hover focus', - title: '', - delay: 0, - html: false, - container: false, - viewport: { - selector: 'body', - padding: 0 - } - } - - Tooltip.prototype.init = function (type, element, options) { - this.enabled = true - this.type = type - this.$element = $(element) - this.options = this.getOptions(options) - this.$viewport = this.options.viewport && $(this.options.viewport.selector || this.options.viewport) - - var triggers = this.options.trigger.split(' ') - - for (var i = triggers.length; i--;) { - var trigger = triggers[i] - - if (trigger == 'click') { - this.$element.on('click.' + this.type, this.options.selector, $.proxy(this.toggle, this)) - } else if (trigger != 'manual') { - var eventIn = trigger == 'hover' ? 'mouseenter' : 'focusin' - var eventOut = trigger == 'hover' ? 'mouseleave' : 'focusout' - - this.$element.on(eventIn + '.' + this.type, this.options.selector, $.proxy(this.enter, this)) - this.$element.on(eventOut + '.' + this.type, this.options.selector, $.proxy(this.leave, this)) - } - } - - this.options.selector ? - (this._options = $.extend({}, this.options, { trigger: 'manual', selector: '' })) : - this.fixTitle() - } - - Tooltip.prototype.getDefaults = function () { - return Tooltip.DEFAULTS - } - - Tooltip.prototype.getOptions = function (options) { - options = $.extend({}, this.getDefaults(), this.$element.data(), options) - - if (options.delay && typeof options.delay == 'number') { - options.delay = { - show: options.delay, - hide: options.delay - } - } - - return options - } - - Tooltip.prototype.getDelegateOptions = function () { - var options = {} - var defaults = this.getDefaults() - - this._options && $.each(this._options, function (key, value) { - if (defaults[key] != value) options[key] = value - }) - - return options - } - - Tooltip.prototype.enter = function (obj) { - var self = obj instanceof this.constructor ? - obj : $(obj.currentTarget).data('bs.' + this.type) - - if (!self) { - self = new this.constructor(obj.currentTarget, this.getDelegateOptions()) - $(obj.currentTarget).data('bs.' + this.type, self) - } - - clearTimeout(self.timeout) - - self.hoverState = 'in' - - if (!self.options.delay || !self.options.delay.show) return self.show() - - self.timeout = setTimeout(function () { - if (self.hoverState == 'in') self.show() - }, self.options.delay.show) - } - - Tooltip.prototype.leave = function (obj) { - var self = obj instanceof this.constructor ? - obj : $(obj.currentTarget).data('bs.' + this.type) - - if (!self) { - self = new this.constructor(obj.currentTarget, this.getDelegateOptions()) - $(obj.currentTarget).data('bs.' + this.type, self) - } - - clearTimeout(self.timeout) - - self.hoverState = 'out' - - if (!self.options.delay || !self.options.delay.hide) return self.hide() - - self.timeout = setTimeout(function () { - if (self.hoverState == 'out') self.hide() - }, self.options.delay.hide) - } - - Tooltip.prototype.show = function () { - var e = $.Event('show.bs.' + this.type) - - if (this.hasContent() && this.enabled) { - this.$element.trigger(e) - - var inDom = $.contains(document.documentElement, this.$element[0]) - if (e.isDefaultPrevented() || !inDom) return - var that = this - - var $tip = this.tip() - - var tipId = this.getUID(this.type) - - this.setContent() - $tip.attr('id', tipId) - this.$element.attr('aria-describedby', tipId) - - if (this.options.animation) $tip.addClass('fade') - - var placement = typeof this.options.placement == 'function' ? - this.options.placement.call(this, $tip[0], this.$element[0]) : - this.options.placement - - var autoToken = /\s?auto?\s?/i - var autoPlace = autoToken.test(placement) - if (autoPlace) placement = placement.replace(autoToken, '') || 'top' - - $tip - .detach() - .css({ top: 0, left: 0, display: 'block' }) - .addClass(placement) - .data('bs.' + this.type, this) - - this.options.container ? $tip.appendTo(this.options.container) : $tip.insertAfter(this.$element) - - var pos = this.getPosition() - var actualWidth = $tip[0].offsetWidth - var actualHeight = $tip[0].offsetHeight - - if (autoPlace) { - var orgPlacement = placement - var $parent = this.$element.parent() - var parentDim = this.getPosition($parent) - - placement = placement == 'bottom' && pos.top + pos.height + actualHeight - parentDim.scroll > parentDim.height ? 'top' : - placement == 'top' && pos.top - parentDim.scroll - actualHeight < 0 ? 'bottom' : - placement == 'right' && pos.right + actualWidth > parentDim.width ? 'left' : - placement == 'left' && pos.left - actualWidth < parentDim.left ? 'right' : - placement - - $tip - .removeClass(orgPlacement) - .addClass(placement) - } - - var calculatedOffset = this.getCalculatedOffset(placement, pos, actualWidth, actualHeight) - - this.applyPlacement(calculatedOffset, placement) - - var complete = function () { - that.$element.trigger('shown.bs.' + that.type) - that.hoverState = null - } - - $.support.transition && this.$tip.hasClass('fade') ? - $tip - .one('bsTransitionEnd', complete) - .emulateTransitionEnd(150) : - complete() - } - } - - Tooltip.prototype.applyPlacement = function (offset, placement) { - var $tip = this.tip() - var width = $tip[0].offsetWidth - var height = $tip[0].offsetHeight - - // manually read margins because getBoundingClientRect includes difference - var marginTop = parseInt($tip.css('margin-top'), 10) - var marginLeft = parseInt($tip.css('margin-left'), 10) - - // we must check for NaN for ie 8/9 - if (isNaN(marginTop)) marginTop = 0 - if (isNaN(marginLeft)) marginLeft = 0 - - offset.top = offset.top + marginTop - offset.left = offset.left + marginLeft - - // $.fn.offset doesn't round pixel values - // so we use setOffset directly with our own function B-0 - $.offset.setOffset($tip[0], $.extend({ - using: function (props) { - $tip.css({ - top: Math.round(props.top), - left: Math.round(props.left) - }) - } - }, offset), 0) - - $tip.addClass('in') - - // check to see if placing tip in new offset caused the tip to resize itself - var actualWidth = $tip[0].offsetWidth - var actualHeight = $tip[0].offsetHeight - - if (placement == 'top' && actualHeight != height) { - offset.top = offset.top + height - actualHeight - } - - var delta = this.getViewportAdjustedDelta(placement, offset, actualWidth, actualHeight) - - if (delta.left) offset.left += delta.left - else offset.top += delta.top - - var arrowDelta = delta.left ? delta.left * 2 - width + actualWidth : delta.top * 2 - height + actualHeight - var arrowPosition = delta.left ? 'left' : 'top' - var arrowOffsetPosition = delta.left ? 'offsetWidth' : 'offsetHeight' - - $tip.offset(offset) - this.replaceArrow(arrowDelta, $tip[0][arrowOffsetPosition], arrowPosition) - } - - Tooltip.prototype.replaceArrow = function (delta, dimension, position) { - this.arrow().css(position, delta ? (50 * (1 - delta / dimension) + '%') : '') - } - - Tooltip.prototype.setContent = function () { - var $tip = this.tip() - var title = this.getTitle() - - $tip.find('.tooltip-inner')[this.options.html ? 'html' : 'text'](title) - $tip.removeClass('fade in top bottom left right') - } - - Tooltip.prototype.hide = function () { - var that = this - var $tip = this.tip() - var e = $.Event('hide.bs.' + this.type) - - this.$element.removeAttr('aria-describedby') - - function complete() { - if (that.hoverState != 'in') $tip.detach() - that.$element.trigger('hidden.bs.' + that.type) - } - - this.$element.trigger(e) - - if (e.isDefaultPrevented()) return - - $tip.removeClass('in') - - $.support.transition && this.$tip.hasClass('fade') ? - $tip - .one('bsTransitionEnd', complete) - .emulateTransitionEnd(150) : - complete() - - this.hoverState = null - - return this - } - - Tooltip.prototype.fixTitle = function () { - var $e = this.$element - if ($e.attr('title') || typeof ($e.attr('data-original-title')) != 'string') { - $e.attr('data-original-title', $e.attr('title') || '').attr('title', '') - } - } - - Tooltip.prototype.hasContent = function () { - return this.getTitle() - } - - Tooltip.prototype.getPosition = function ($element) { - $element = $element || this.$element - var el = $element[0] - var isBody = el.tagName == 'BODY' - return $.extend({}, (typeof el.getBoundingClientRect == 'function') ? el.getBoundingClientRect() : null, { - scroll: isBody ? document.documentElement.scrollTop || document.body.scrollTop : $element.scrollTop(), - width: isBody ? $(window).width() : $element.outerWidth(), - height: isBody ? $(window).height() : $element.outerHeight() - }, isBody ? { top: 0, left: 0 } : $element.offset()) - } - - Tooltip.prototype.getCalculatedOffset = function (placement, pos, actualWidth, actualHeight) { - return placement == 'bottom' ? { top: pos.top + pos.height, left: pos.left + pos.width / 2 - actualWidth / 2 } : - placement == 'top' ? { top: pos.top - actualHeight, left: pos.left + pos.width / 2 - actualWidth / 2 } : - placement == 'left' ? { top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left - actualWidth } : - /* placement == 'right' */ { top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left + pos.width } - - } - - Tooltip.prototype.getViewportAdjustedDelta = function (placement, pos, actualWidth, actualHeight) { - var delta = { top: 0, left: 0 } - if (!this.$viewport) return delta - - var viewportPadding = this.options.viewport && this.options.viewport.padding || 0 - var viewportDimensions = this.getPosition(this.$viewport) - - if (/right|left/.test(placement)) { - var topEdgeOffset = pos.top - viewportPadding - viewportDimensions.scroll - var bottomEdgeOffset = pos.top + viewportPadding - viewportDimensions.scroll + actualHeight - if (topEdgeOffset < viewportDimensions.top) { // top overflow - delta.top = viewportDimensions.top - topEdgeOffset - } else if (bottomEdgeOffset > viewportDimensions.top + viewportDimensions.height) { // bottom overflow - delta.top = viewportDimensions.top + viewportDimensions.height - bottomEdgeOffset - } - } else { - var leftEdgeOffset = pos.left - viewportPadding - var rightEdgeOffset = pos.left + viewportPadding + actualWidth - if (leftEdgeOffset < viewportDimensions.left) { // left overflow - delta.left = viewportDimensions.left - leftEdgeOffset - } else if (rightEdgeOffset > viewportDimensions.width) { // right overflow - delta.left = viewportDimensions.left + viewportDimensions.width - rightEdgeOffset - } - } - - return delta - } - - Tooltip.prototype.getTitle = function () { - var title - var $e = this.$element - var o = this.options - - title = $e.attr('data-original-title') - || (typeof o.title == 'function' ? o.title.call($e[0]) : o.title) - - return title - } - - Tooltip.prototype.getUID = function (prefix) { - do prefix += ~~(Math.random() * 1000000) - while (document.getElementById(prefix)) - return prefix - } - - Tooltip.prototype.tip = function () { - return (this.$tip = this.$tip || $(this.options.template)) - } - - Tooltip.prototype.arrow = function () { - return (this.$arrow = this.$arrow || this.tip().find('.tooltip-arrow')) - } - - Tooltip.prototype.validate = function () { - if (!this.$element[0].parentNode) { - this.hide() - this.$element = null - this.options = null - } - } - - Tooltip.prototype.enable = function () { - this.enabled = true - } - - Tooltip.prototype.disable = function () { - this.enabled = false - } - - Tooltip.prototype.toggleEnabled = function () { - this.enabled = !this.enabled - } - - Tooltip.prototype.toggle = function (e) { - var self = this - if (e) { - self = $(e.currentTarget).data('bs.' + this.type) - if (!self) { - self = new this.constructor(e.currentTarget, this.getDelegateOptions()) - $(e.currentTarget).data('bs.' + this.type, self) - } - } - - self.tip().hasClass('in') ? self.leave(self) : self.enter(self) - } - - Tooltip.prototype.destroy = function () { - clearTimeout(this.timeout) - this.hide().$element.off('.' + this.type).removeData('bs.' + this.type) - } - - - // TOOLTIP PLUGIN DEFINITION - // ========================= - - function Plugin(option) { - return this.each(function () { - var $this = $(this) - var data = $this.data('bs.tooltip') - var options = typeof option == 'object' && option - - if (!data && option == 'destroy') return - if (!data) $this.data('bs.tooltip', (data = new Tooltip(this, options))) - if (typeof option == 'string') data[option]() - }) - } - - var old = $.fn.tooltip - - $.fn.tooltip = Plugin - $.fn.tooltip.Constructor = Tooltip - - - // TOOLTIP NO CONFLICT - // =================== - - $.fn.tooltip.noConflict = function () { - $.fn.tooltip = old - return this - } - -}(jQuery); - -/* ======================================================================== - * Bootstrap: popover.js v3.2.0 - * http://getbootstrap.com/javascript/#popovers - * ======================================================================== - * Copyright 2011-2014 Twitter, Inc. - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) - * ======================================================================== */ - - -+function ($) { - 'use strict'; - - // POPOVER PUBLIC CLASS DEFINITION - // =============================== - - var Popover = function (element, options) { - this.init('popover', element, options) - } - - if (!$.fn.tooltip) throw new Error('Popover requires tooltip.js') - - Popover.VERSION = '3.2.0' - - Popover.DEFAULTS = $.extend({}, $.fn.tooltip.Constructor.DEFAULTS, { - placement: 'right', - trigger: 'click', - content: '', - template: '<div class="popover" role="tooltip"><div class="arrow"></div><h3 class="popover-title"></h3><div class="popover-content"></div></div>' - }) - - - // NOTE: POPOVER EXTENDS tooltip.js - // ================================ - - Popover.prototype = $.extend({}, $.fn.tooltip.Constructor.prototype) - - Popover.prototype.constructor = Popover - - Popover.prototype.getDefaults = function () { - return Popover.DEFAULTS - } - - Popover.prototype.setContent = function () { - var $tip = this.tip() - var title = this.getTitle() - var content = this.getContent() - - $tip.find('.popover-title')[this.options.html ? 'html' : 'text'](title) - $tip.find('.popover-content').empty()[ // we use append for html objects to maintain js events - this.options.html ? (typeof content == 'string' ? 'html' : 'append') : 'text' - ](content) - - $tip.removeClass('fade top bottom left right in') - - // IE8 doesn't accept hiding via the `:empty` pseudo selector, we have to do - // this manually by checking the contents. - if (!$tip.find('.popover-title').html()) $tip.find('.popover-title').hide() - } - - Popover.prototype.hasContent = function () { - return this.getTitle() || this.getContent() - } - - Popover.prototype.getContent = function () { - var $e = this.$element - var o = this.options - - return $e.attr('data-content') - || (typeof o.content == 'function' ? - o.content.call($e[0]) : - o.content) - } - - Popover.prototype.arrow = function () { - return (this.$arrow = this.$arrow || this.tip().find('.arrow')) - } - - Popover.prototype.tip = function () { - if (!this.$tip) this.$tip = $(this.options.template) - return this.$tip - } - - - // POPOVER PLUGIN DEFINITION - // ========================= - - function Plugin(option) { - return this.each(function () { - var $this = $(this) - var data = $this.data('bs.popover') - var options = typeof option == 'object' && option - - if (!data && option == 'destroy') return - if (!data) $this.data('bs.popover', (data = new Popover(this, options))) - if (typeof option == 'string') data[option]() - }) - } - - var old = $.fn.popover - - $.fn.popover = Plugin - $.fn.popover.Constructor = Popover - - - // POPOVER NO CONFLICT - // =================== - - $.fn.popover.noConflict = function () { - $.fn.popover = old - return this - } - -}(jQuery); - -/* ======================================================================== - * Bootstrap: scrollspy.js v3.2.0 - * http://getbootstrap.com/javascript/#scrollspy - * ======================================================================== - * Copyright 2011-2014 Twitter, Inc. - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) - * ======================================================================== */ - - -+function ($) { - 'use strict'; - - // SCROLLSPY CLASS DEFINITION - // ========================== - - function ScrollSpy(element, options) { - var process = $.proxy(this.process, this) - - this.$body = $('body') - this.$scrollElement = $(element).is('body') ? $(window) : $(element) - this.options = $.extend({}, ScrollSpy.DEFAULTS, options) - this.selector = (this.options.target || '') + ' .nav li > a' - this.offsets = [] - this.targets = [] - this.activeTarget = null - this.scrollHeight = 0 - - this.$scrollElement.on('scroll.bs.scrollspy', process) - this.refresh() - this.process() - } - - ScrollSpy.VERSION = '3.2.0' - - ScrollSpy.DEFAULTS = { - offset: 10 - } - - ScrollSpy.prototype.getScrollHeight = function () { - return this.$scrollElement[0].scrollHeight || Math.max(this.$body[0].scrollHeight, document.documentElement.scrollHeight) - } - - ScrollSpy.prototype.refresh = function () { - var offsetMethod = 'offset' - var offsetBase = 0 - - if (!$.isWindow(this.$scrollElement[0])) { - offsetMethod = 'position' - offsetBase = this.$scrollElement.scrollTop() - } - - this.offsets = [] - this.targets = [] - this.scrollHeight = this.getScrollHeight() - - var self = this - - this.$body - .find(this.selector) - .map(function () { - var $el = $(this) - var href = $el.data('target') || $el.attr('href') - var $href = /^#./.test(href) && $(href) - - return ($href - && $href.length - && $href.is(':visible') - && [[$href[offsetMethod]().top + offsetBase, href]]) || null - }) - .sort(function (a, b) { return a[0] - b[0] }) - .each(function () { - self.offsets.push(this[0]) - self.targets.push(this[1]) - }) - } - - ScrollSpy.prototype.process = function () { - var scrollTop = this.$scrollElement.scrollTop() + this.options.offset - var scrollHeight = this.getScrollHeight() - var maxScroll = this.options.offset + scrollHeight - this.$scrollElement.height() - var offsets = this.offsets - var targets = this.targets - var activeTarget = this.activeTarget - var i - - if (this.scrollHeight != scrollHeight) { - this.refresh() - } - - if (scrollTop >= maxScroll) { - return activeTarget != (i = targets[targets.length - 1]) && this.activate(i) - } - - if (activeTarget && scrollTop <= offsets[0]) { - return activeTarget != (i = targets[0]) && this.activate(i) - } - - for (i = offsets.length; i--;) { - activeTarget != targets[i] - && scrollTop >= offsets[i] - && (!offsets[i + 1] || scrollTop <= offsets[i + 1]) - && this.activate(targets[i]) - } - } - - ScrollSpy.prototype.activate = function (target) { - this.activeTarget = target - - $(this.selector) - .parentsUntil(this.options.target, '.active') - .removeClass('active') - - var selector = this.selector + - '[data-target="' + target + '"],' + - this.selector + '[href="' + target + '"]' - - var active = $(selector) - .parents('li') - .addClass('active') - - if (active.parent('.dropdown-menu').length) { - active = active - .closest('li.dropdown') - .addClass('active') - } - - active.trigger('activate.bs.scrollspy') - } - - - // SCROLLSPY PLUGIN DEFINITION - // =========================== - - function Plugin(option) { - return this.each(function () { - var $this = $(this) - var data = $this.data('bs.scrollspy') - var options = typeof option == 'object' && option - - if (!data) $this.data('bs.scrollspy', (data = new ScrollSpy(this, options))) - if (typeof option == 'string') data[option]() - }) - } - - var old = $.fn.scrollspy - - $.fn.scrollspy = Plugin - $.fn.scrollspy.Constructor = ScrollSpy - - - // SCROLLSPY NO CONFLICT - // ===================== - - $.fn.scrollspy.noConflict = function () { - $.fn.scrollspy = old - return this - } - - - // SCROLLSPY DATA-API - // ================== - - $(window).on('load.bs.scrollspy.data-api', function () { - $('[data-spy="scroll"]').each(function () { - var $spy = $(this) - Plugin.call($spy, $spy.data()) - }) - }) - -}(jQuery); - -/* ======================================================================== - * Bootstrap: tab.js v3.2.0 - * http://getbootstrap.com/javascript/#tabs - * ======================================================================== - * Copyright 2011-2014 Twitter, Inc. - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) - * ======================================================================== */ - - -+function ($) { - 'use strict'; - - // TAB CLASS DEFINITION - // ==================== - - var Tab = function (element) { - this.element = $(element) - } - - Tab.VERSION = '3.2.0' - - Tab.prototype.show = function () { - var $this = this.element - var $ul = $this.closest('ul:not(.dropdown-menu)') - var selector = $this.data('target') - - if (!selector) { - selector = $this.attr('href') - selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') // strip for ie7 - } - - if ($this.parent('li').hasClass('active')) return - - var previous = $ul.find('.active:last a')[0] - var e = $.Event('show.bs.tab', { - relatedTarget: previous - }) - - $this.trigger(e) - - if (e.isDefaultPrevented()) return - - var $target = $(selector) - - this.activate($this.closest('li'), $ul) - this.activate($target, $target.parent(), function () { - $this.trigger({ - type: 'shown.bs.tab', - relatedTarget: previous - }) - }) - } - - Tab.prototype.activate = function (element, container, callback) { - var $active = container.find('> .active') - var transition = callback - && $.support.transition - && $active.hasClass('fade') - - function next() { - $active - .removeClass('active') - .find('> .dropdown-menu > .active') - .removeClass('active') - - element.addClass('active') - - if (transition) { - element[0].offsetWidth // reflow for transition - element.addClass('in') - } else { - element.removeClass('fade') - } - - if (element.parent('.dropdown-menu')) { - element.closest('li.dropdown').addClass('active') - } - - callback && callback() - } - - transition ? - $active - .one('bsTransitionEnd', next) - .emulateTransitionEnd(150) : - next() - - $active.removeClass('in') - } - - - // TAB PLUGIN DEFINITION - // ===================== - - function Plugin(option) { - return this.each(function () { - var $this = $(this) - var data = $this.data('bs.tab') - - if (!data) $this.data('bs.tab', (data = new Tab(this))) - if (typeof option == 'string') data[option]() - }) - } - - var old = $.fn.tab - - $.fn.tab = Plugin - $.fn.tab.Constructor = Tab - - - // TAB NO CONFLICT - // =============== - - $.fn.tab.noConflict = function () { - $.fn.tab = old - return this - } - - - // TAB DATA-API - // ============ - - $(document).on('click.bs.tab.data-api', '[data-toggle="tab"], [data-toggle="pill"]', function (e) { - e.preventDefault() - Plugin.call($(this), 'show') - }) - -}(jQuery); - -/* ======================================================================== - * Bootstrap: affix.js v3.2.0 - * http://getbootstrap.com/javascript/#affix - * ======================================================================== - * Copyright 2011-2014 Twitter, Inc. - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) - * ======================================================================== */ - - -+function ($) { - 'use strict'; - - // AFFIX CLASS DEFINITION - // ====================== - - var Affix = function (element, options) { - this.options = $.extend({}, Affix.DEFAULTS, options) - - this.$target = $(this.options.target) - .on('scroll.bs.affix.data-api', $.proxy(this.checkPosition, this)) - .on('click.bs.affix.data-api', $.proxy(this.checkPositionWithEventLoop, this)) - - this.$element = $(element) - this.affixed = - this.unpin = - this.pinnedOffset = null - - this.checkPosition() - } - - Affix.VERSION = '3.2.0' - - Affix.RESET = 'affix affix-top affix-bottom' - - Affix.DEFAULTS = { - offset: 0, - target: window - } - - Affix.prototype.getPinnedOffset = function () { - if (this.pinnedOffset) return this.pinnedOffset - this.$element.removeClass(Affix.RESET).addClass('affix') - var scrollTop = this.$target.scrollTop() - var position = this.$element.offset() - return (this.pinnedOffset = position.top - scrollTop) - } - - Affix.prototype.checkPositionWithEventLoop = function () { - setTimeout($.proxy(this.checkPosition, this), 1) - } - - Affix.prototype.checkPosition = function () { - if (!this.$element.is(':visible')) return - - var scrollHeight = $(document).height() - var scrollTop = this.$target.scrollTop() - var position = this.$element.offset() - var offset = this.options.offset - var offsetTop = offset.top - var offsetBottom = offset.bottom - - if (typeof offset != 'object') offsetBottom = offsetTop = offset - if (typeof offsetTop == 'function') offsetTop = offset.top(this.$element) - if (typeof offsetBottom == 'function') offsetBottom = offset.bottom(this.$element) - - var affix = this.unpin != null && (scrollTop + this.unpin <= position.top) ? false : - offsetBottom != null && (position.top + this.$element.height() >= scrollHeight - offsetBottom) ? 'bottom' : - offsetTop != null && (scrollTop <= offsetTop) ? 'top' : false - - if (this.affixed === affix) return - if (this.unpin != null) this.$element.css('top', '') - - var affixType = 'affix' + (affix ? '-' + affix : '') - var e = $.Event(affixType + '.bs.affix') - - this.$element.trigger(e) - - if (e.isDefaultPrevented()) return - - this.affixed = affix - this.unpin = affix == 'bottom' ? this.getPinnedOffset() : null - - this.$element - .removeClass(Affix.RESET) - .addClass(affixType) - .trigger($.Event(affixType.replace('affix', 'affixed'))) - - if (affix == 'bottom') { - this.$element.offset({ - top: scrollHeight - this.$element.height() - offsetBottom - }) - } - } - - - // AFFIX PLUGIN DEFINITION - // ======================= - - function Plugin(option) { - return this.each(function () { - var $this = $(this) - var data = $this.data('bs.affix') - var options = typeof option == 'object' && option - - if (!data) $this.data('bs.affix', (data = new Affix(this, options))) - if (typeof option == 'string') data[option]() - }) - } - - var old = $.fn.affix - - $.fn.affix = Plugin - $.fn.affix.Constructor = Affix - - - // AFFIX NO CONFLICT - // ================= - - $.fn.affix.noConflict = function () { - $.fn.affix = old - return this - } - - - // AFFIX DATA-API - // ============== - - $(window).on('load', function () { - $('[data-spy="affix"]').each(function () { - var $spy = $(this) - var data = $spy.data() - - data.offset = data.offset || {} - - if (data.offsetBottom) data.offset.bottom = data.offsetBottom - if (data.offsetTop) data.offset.top = data.offsetTop - - Plugin.call($spy, data) - }) - }) - -}(jQuery); diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/demultiplexing/html/bootstrap3/js/bootstrap.min.js b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/demultiplexing/html/bootstrap3/js/bootstrap.min.js deleted file mode 100644 index 7c1561a8b96d7b6242c0b2135eafa28796603cbf..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/demultiplexing/html/bootstrap3/js/bootstrap.min.js +++ /dev/null @@ -1,6 +0,0 @@ -/*! - * Bootstrap v3.2.0 (http://getbootstrap.com) - * Copyright 2011-2014 Twitter, Inc. - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) - */ -if("undefined"==typeof jQuery)throw new Error("Bootstrap's JavaScript requires jQuery");+function(a){"use strict";function b(){var a=document.createElement("bootstrap"),b={WebkitTransition:"webkitTransitionEnd",MozTransition:"transitionend",OTransition:"oTransitionEnd otransitionend",transition:"transitionend"};for(var c in b)if(void 0!==a.style[c])return{end:b[c]};return!1}a.fn.emulateTransitionEnd=function(b){var c=!1,d=this;a(this).one("bsTransitionEnd",function(){c=!0});var e=function(){c||a(d).trigger(a.support.transition.end)};return setTimeout(e,b),this},a(function(){a.support.transition=b(),a.support.transition&&(a.event.special.bsTransitionEnd={bindType:a.support.transition.end,delegateType:a.support.transition.end,handle:function(b){return a(b.target).is(this)?b.handleObj.handler.apply(this,arguments):void 0}})})}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var c=a(this),e=c.data("bs.alert");e||c.data("bs.alert",e=new d(this)),"string"==typeof b&&e[b].call(c)})}var c='[data-dismiss="alert"]',d=function(b){a(b).on("click",c,this.close)};d.VERSION="3.2.0",d.prototype.close=function(b){function c(){f.detach().trigger("closed.bs.alert").remove()}var d=a(this),e=d.attr("data-target");e||(e=d.attr("href"),e=e&&e.replace(/.*(?=#[^\s]*$)/,""));var f=a(e);b&&b.preventDefault(),f.length||(f=d.hasClass("alert")?d:d.parent()),f.trigger(b=a.Event("close.bs.alert")),b.isDefaultPrevented()||(f.removeClass("in"),a.support.transition&&f.hasClass("fade")?f.one("bsTransitionEnd",c).emulateTransitionEnd(150):c())};var e=a.fn.alert;a.fn.alert=b,a.fn.alert.Constructor=d,a.fn.alert.noConflict=function(){return a.fn.alert=e,this},a(document).on("click.bs.alert.data-api",c,d.prototype.close)}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.button"),f="object"==typeof b&&b;e||d.data("bs.button",e=new c(this,f)),"toggle"==b?e.toggle():b&&e.setState(b)})}var c=function(b,d){this.$element=a(b),this.options=a.extend({},c.DEFAULTS,d),this.isLoading=!1};c.VERSION="3.2.0",c.DEFAULTS={loadingText:"loading..."},c.prototype.setState=function(b){var c="disabled",d=this.$element,e=d.is("input")?"val":"html",f=d.data();b+="Text",null==f.resetText&&d.data("resetText",d[e]()),d[e](null==f[b]?this.options[b]:f[b]),setTimeout(a.proxy(function(){"loadingText"==b?(this.isLoading=!0,d.addClass(c).attr(c,c)):this.isLoading&&(this.isLoading=!1,d.removeClass(c).removeAttr(c))},this),0)},c.prototype.toggle=function(){var a=!0,b=this.$element.closest('[data-toggle="buttons"]');if(b.length){var c=this.$element.find("input");"radio"==c.prop("type")&&(c.prop("checked")&&this.$element.hasClass("active")?a=!1:b.find(".active").removeClass("active")),a&&c.prop("checked",!this.$element.hasClass("active")).trigger("change")}a&&this.$element.toggleClass("active")};var d=a.fn.button;a.fn.button=b,a.fn.button.Constructor=c,a.fn.button.noConflict=function(){return a.fn.button=d,this},a(document).on("click.bs.button.data-api",'[data-toggle^="button"]',function(c){var d=a(c.target);d.hasClass("btn")||(d=d.closest(".btn")),b.call(d,"toggle"),c.preventDefault()})}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.carousel"),f=a.extend({},c.DEFAULTS,d.data(),"object"==typeof b&&b),g="string"==typeof b?b:f.slide;e||d.data("bs.carousel",e=new c(this,f)),"number"==typeof b?e.to(b):g?e[g]():f.interval&&e.pause().cycle()})}var c=function(b,c){this.$element=a(b).on("keydown.bs.carousel",a.proxy(this.keydown,this)),this.$indicators=this.$element.find(".carousel-indicators"),this.options=c,this.paused=this.sliding=this.interval=this.$active=this.$items=null,"hover"==this.options.pause&&this.$element.on("mouseenter.bs.carousel",a.proxy(this.pause,this)).on("mouseleave.bs.carousel",a.proxy(this.cycle,this))};c.VERSION="3.2.0",c.DEFAULTS={interval:5e3,pause:"hover",wrap:!0},c.prototype.keydown=function(a){switch(a.which){case 37:this.prev();break;case 39:this.next();break;default:return}a.preventDefault()},c.prototype.cycle=function(b){return b||(this.paused=!1),this.interval&&clearInterval(this.interval),this.options.interval&&!this.paused&&(this.interval=setInterval(a.proxy(this.next,this),this.options.interval)),this},c.prototype.getItemIndex=function(a){return this.$items=a.parent().children(".item"),this.$items.index(a||this.$active)},c.prototype.to=function(b){var c=this,d=this.getItemIndex(this.$active=this.$element.find(".item.active"));return b>this.$items.length-1||0>b?void 0:this.sliding?this.$element.one("slid.bs.carousel",function(){c.to(b)}):d==b?this.pause().cycle():this.slide(b>d?"next":"prev",a(this.$items[b]))},c.prototype.pause=function(b){return b||(this.paused=!0),this.$element.find(".next, .prev").length&&a.support.transition&&(this.$element.trigger(a.support.transition.end),this.cycle(!0)),this.interval=clearInterval(this.interval),this},c.prototype.next=function(){return this.sliding?void 0:this.slide("next")},c.prototype.prev=function(){return this.sliding?void 0:this.slide("prev")},c.prototype.slide=function(b,c){var d=this.$element.find(".item.active"),e=c||d[b](),f=this.interval,g="next"==b?"left":"right",h="next"==b?"first":"last",i=this;if(!e.length){if(!this.options.wrap)return;e=this.$element.find(".item")[h]()}if(e.hasClass("active"))return this.sliding=!1;var j=e[0],k=a.Event("slide.bs.carousel",{relatedTarget:j,direction:g});if(this.$element.trigger(k),!k.isDefaultPrevented()){if(this.sliding=!0,f&&this.pause(),this.$indicators.length){this.$indicators.find(".active").removeClass("active");var l=a(this.$indicators.children()[this.getItemIndex(e)]);l&&l.addClass("active")}var m=a.Event("slid.bs.carousel",{relatedTarget:j,direction:g});return a.support.transition&&this.$element.hasClass("slide")?(e.addClass(b),e[0].offsetWidth,d.addClass(g),e.addClass(g),d.one("bsTransitionEnd",function(){e.removeClass([b,g].join(" ")).addClass("active"),d.removeClass(["active",g].join(" ")),i.sliding=!1,setTimeout(function(){i.$element.trigger(m)},0)}).emulateTransitionEnd(1e3*d.css("transition-duration").slice(0,-1))):(d.removeClass("active"),e.addClass("active"),this.sliding=!1,this.$element.trigger(m)),f&&this.cycle(),this}};var d=a.fn.carousel;a.fn.carousel=b,a.fn.carousel.Constructor=c,a.fn.carousel.noConflict=function(){return a.fn.carousel=d,this},a(document).on("click.bs.carousel.data-api","[data-slide], [data-slide-to]",function(c){var d,e=a(this),f=a(e.attr("data-target")||(d=e.attr("href"))&&d.replace(/.*(?=#[^\s]+$)/,""));if(f.hasClass("carousel")){var g=a.extend({},f.data(),e.data()),h=e.attr("data-slide-to");h&&(g.interval=!1),b.call(f,g),h&&f.data("bs.carousel").to(h),c.preventDefault()}}),a(window).on("load",function(){a('[data-ride="carousel"]').each(function(){var c=a(this);b.call(c,c.data())})})}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.collapse"),f=a.extend({},c.DEFAULTS,d.data(),"object"==typeof b&&b);!e&&f.toggle&&"show"==b&&(b=!b),e||d.data("bs.collapse",e=new c(this,f)),"string"==typeof b&&e[b]()})}var c=function(b,d){this.$element=a(b),this.options=a.extend({},c.DEFAULTS,d),this.transitioning=null,this.options.parent&&(this.$parent=a(this.options.parent)),this.options.toggle&&this.toggle()};c.VERSION="3.2.0",c.DEFAULTS={toggle:!0},c.prototype.dimension=function(){var a=this.$element.hasClass("width");return a?"width":"height"},c.prototype.show=function(){if(!this.transitioning&&!this.$element.hasClass("in")){var c=a.Event("show.bs.collapse");if(this.$element.trigger(c),!c.isDefaultPrevented()){var d=this.$parent&&this.$parent.find("> .panel > .in");if(d&&d.length){var e=d.data("bs.collapse");if(e&&e.transitioning)return;b.call(d,"hide"),e||d.data("bs.collapse",null)}var f=this.dimension();this.$element.removeClass("collapse").addClass("collapsing")[f](0),this.transitioning=1;var g=function(){this.$element.removeClass("collapsing").addClass("collapse in")[f](""),this.transitioning=0,this.$element.trigger("shown.bs.collapse")};if(!a.support.transition)return g.call(this);var h=a.camelCase(["scroll",f].join("-"));this.$element.one("bsTransitionEnd",a.proxy(g,this)).emulateTransitionEnd(350)[f](this.$element[0][h])}}},c.prototype.hide=function(){if(!this.transitioning&&this.$element.hasClass("in")){var b=a.Event("hide.bs.collapse");if(this.$element.trigger(b),!b.isDefaultPrevented()){var c=this.dimension();this.$element[c](this.$element[c]())[0].offsetHeight,this.$element.addClass("collapsing").removeClass("collapse").removeClass("in"),this.transitioning=1;var d=function(){this.transitioning=0,this.$element.trigger("hidden.bs.collapse").removeClass("collapsing").addClass("collapse")};return a.support.transition?void this.$element[c](0).one("bsTransitionEnd",a.proxy(d,this)).emulateTransitionEnd(350):d.call(this)}}},c.prototype.toggle=function(){this[this.$element.hasClass("in")?"hide":"show"]()};var d=a.fn.collapse;a.fn.collapse=b,a.fn.collapse.Constructor=c,a.fn.collapse.noConflict=function(){return a.fn.collapse=d,this},a(document).on("click.bs.collapse.data-api",'[data-toggle="collapse"]',function(c){var d,e=a(this),f=e.attr("data-target")||c.preventDefault()||(d=e.attr("href"))&&d.replace(/.*(?=#[^\s]+$)/,""),g=a(f),h=g.data("bs.collapse"),i=h?"toggle":e.data(),j=e.attr("data-parent"),k=j&&a(j);h&&h.transitioning||(k&&k.find('[data-toggle="collapse"][data-parent="'+j+'"]').not(e).addClass("collapsed"),e[g.hasClass("in")?"addClass":"removeClass"]("collapsed")),b.call(g,i)})}(jQuery),+function(a){"use strict";function b(b){b&&3===b.which||(a(e).remove(),a(f).each(function(){var d=c(a(this)),e={relatedTarget:this};d.hasClass("open")&&(d.trigger(b=a.Event("hide.bs.dropdown",e)),b.isDefaultPrevented()||d.removeClass("open").trigger("hidden.bs.dropdown",e))}))}function c(b){var c=b.attr("data-target");c||(c=b.attr("href"),c=c&&/#[A-Za-z]/.test(c)&&c.replace(/.*(?=#[^\s]*$)/,""));var d=c&&a(c);return d&&d.length?d:b.parent()}function d(b){return this.each(function(){var c=a(this),d=c.data("bs.dropdown");d||c.data("bs.dropdown",d=new g(this)),"string"==typeof b&&d[b].call(c)})}var e=".dropdown-backdrop",f='[data-toggle="dropdown"]',g=function(b){a(b).on("click.bs.dropdown",this.toggle)};g.VERSION="3.2.0",g.prototype.toggle=function(d){var e=a(this);if(!e.is(".disabled, :disabled")){var f=c(e),g=f.hasClass("open");if(b(),!g){"ontouchstart"in document.documentElement&&!f.closest(".navbar-nav").length&&a('<div class="dropdown-backdrop"/>').insertAfter(a(this)).on("click",b);var h={relatedTarget:this};if(f.trigger(d=a.Event("show.bs.dropdown",h)),d.isDefaultPrevented())return;e.trigger("focus"),f.toggleClass("open").trigger("shown.bs.dropdown",h)}return!1}},g.prototype.keydown=function(b){if(/(38|40|27)/.test(b.keyCode)){var d=a(this);if(b.preventDefault(),b.stopPropagation(),!d.is(".disabled, :disabled")){var e=c(d),g=e.hasClass("open");if(!g||g&&27==b.keyCode)return 27==b.which&&e.find(f).trigger("focus"),d.trigger("click");var h=" li:not(.divider):visible a",i=e.find('[role="menu"]'+h+', [role="listbox"]'+h);if(i.length){var j=i.index(i.filter(":focus"));38==b.keyCode&&j>0&&j--,40==b.keyCode&&j<i.length-1&&j++,~j||(j=0),i.eq(j).trigger("focus")}}}};var h=a.fn.dropdown;a.fn.dropdown=d,a.fn.dropdown.Constructor=g,a.fn.dropdown.noConflict=function(){return a.fn.dropdown=h,this},a(document).on("click.bs.dropdown.data-api",b).on("click.bs.dropdown.data-api",".dropdown form",function(a){a.stopPropagation()}).on("click.bs.dropdown.data-api",f,g.prototype.toggle).on("keydown.bs.dropdown.data-api",f+', [role="menu"], [role="listbox"]',g.prototype.keydown)}(jQuery),+function(a){"use strict";function b(b,d){return this.each(function(){var e=a(this),f=e.data("bs.modal"),g=a.extend({},c.DEFAULTS,e.data(),"object"==typeof b&&b);f||e.data("bs.modal",f=new c(this,g)),"string"==typeof b?f[b](d):g.show&&f.show(d)})}var c=function(b,c){this.options=c,this.$body=a(document.body),this.$element=a(b),this.$backdrop=this.isShown=null,this.scrollbarWidth=0,this.options.remote&&this.$element.find(".modal-content").load(this.options.remote,a.proxy(function(){this.$element.trigger("loaded.bs.modal")},this))};c.VERSION="3.2.0",c.DEFAULTS={backdrop:!0,keyboard:!0,show:!0},c.prototype.toggle=function(a){return this.isShown?this.hide():this.show(a)},c.prototype.show=function(b){var c=this,d=a.Event("show.bs.modal",{relatedTarget:b});this.$element.trigger(d),this.isShown||d.isDefaultPrevented()||(this.isShown=!0,this.checkScrollbar(),this.$body.addClass("modal-open"),this.setScrollbar(),this.escape(),this.$element.on("click.dismiss.bs.modal",'[data-dismiss="modal"]',a.proxy(this.hide,this)),this.backdrop(function(){var d=a.support.transition&&c.$element.hasClass("fade");c.$element.parent().length||c.$element.appendTo(c.$body),c.$element.show().scrollTop(0),d&&c.$element[0].offsetWidth,c.$element.addClass("in").attr("aria-hidden",!1),c.enforceFocus();var e=a.Event("shown.bs.modal",{relatedTarget:b});d?c.$element.find(".modal-dialog").one("bsTransitionEnd",function(){c.$element.trigger("focus").trigger(e)}).emulateTransitionEnd(300):c.$element.trigger("focus").trigger(e)}))},c.prototype.hide=function(b){b&&b.preventDefault(),b=a.Event("hide.bs.modal"),this.$element.trigger(b),this.isShown&&!b.isDefaultPrevented()&&(this.isShown=!1,this.$body.removeClass("modal-open"),this.resetScrollbar(),this.escape(),a(document).off("focusin.bs.modal"),this.$element.removeClass("in").attr("aria-hidden",!0).off("click.dismiss.bs.modal"),a.support.transition&&this.$element.hasClass("fade")?this.$element.one("bsTransitionEnd",a.proxy(this.hideModal,this)).emulateTransitionEnd(300):this.hideModal())},c.prototype.enforceFocus=function(){a(document).off("focusin.bs.modal").on("focusin.bs.modal",a.proxy(function(a){this.$element[0]===a.target||this.$element.has(a.target).length||this.$element.trigger("focus")},this))},c.prototype.escape=function(){this.isShown&&this.options.keyboard?this.$element.on("keyup.dismiss.bs.modal",a.proxy(function(a){27==a.which&&this.hide()},this)):this.isShown||this.$element.off("keyup.dismiss.bs.modal")},c.prototype.hideModal=function(){var a=this;this.$element.hide(),this.backdrop(function(){a.$element.trigger("hidden.bs.modal")})},c.prototype.removeBackdrop=function(){this.$backdrop&&this.$backdrop.remove(),this.$backdrop=null},c.prototype.backdrop=function(b){var c=this,d=this.$element.hasClass("fade")?"fade":"";if(this.isShown&&this.options.backdrop){var e=a.support.transition&&d;if(this.$backdrop=a('<div class="modal-backdrop '+d+'" />').appendTo(this.$body),this.$element.on("click.dismiss.bs.modal",a.proxy(function(a){a.target===a.currentTarget&&("static"==this.options.backdrop?this.$element[0].focus.call(this.$element[0]):this.hide.call(this))},this)),e&&this.$backdrop[0].offsetWidth,this.$backdrop.addClass("in"),!b)return;e?this.$backdrop.one("bsTransitionEnd",b).emulateTransitionEnd(150):b()}else if(!this.isShown&&this.$backdrop){this.$backdrop.removeClass("in");var f=function(){c.removeBackdrop(),b&&b()};a.support.transition&&this.$element.hasClass("fade")?this.$backdrop.one("bsTransitionEnd",f).emulateTransitionEnd(150):f()}else b&&b()},c.prototype.checkScrollbar=function(){document.body.clientWidth>=window.innerWidth||(this.scrollbarWidth=this.scrollbarWidth||this.measureScrollbar())},c.prototype.setScrollbar=function(){var a=parseInt(this.$body.css("padding-right")||0,10);this.scrollbarWidth&&this.$body.css("padding-right",a+this.scrollbarWidth)},c.prototype.resetScrollbar=function(){this.$body.css("padding-right","")},c.prototype.measureScrollbar=function(){var a=document.createElement("div");a.className="modal-scrollbar-measure",this.$body.append(a);var b=a.offsetWidth-a.clientWidth;return this.$body[0].removeChild(a),b};var d=a.fn.modal;a.fn.modal=b,a.fn.modal.Constructor=c,a.fn.modal.noConflict=function(){return a.fn.modal=d,this},a(document).on("click.bs.modal.data-api",'[data-toggle="modal"]',function(c){var d=a(this),e=d.attr("href"),f=a(d.attr("data-target")||e&&e.replace(/.*(?=#[^\s]+$)/,"")),g=f.data("bs.modal")?"toggle":a.extend({remote:!/#/.test(e)&&e},f.data(),d.data());d.is("a")&&c.preventDefault(),f.one("show.bs.modal",function(a){a.isDefaultPrevented()||f.one("hidden.bs.modal",function(){d.is(":visible")&&d.trigger("focus")})}),b.call(f,g,this)})}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.tooltip"),f="object"==typeof b&&b;(e||"destroy"!=b)&&(e||d.data("bs.tooltip",e=new c(this,f)),"string"==typeof b&&e[b]())})}var c=function(a,b){this.type=this.options=this.enabled=this.timeout=this.hoverState=this.$element=null,this.init("tooltip",a,b)};c.VERSION="3.2.0",c.DEFAULTS={animation:!0,placement:"top",selector:!1,template:'<div class="tooltip" role="tooltip"><div class="tooltip-arrow"></div><div class="tooltip-inner"></div></div>',trigger:"hover focus",title:"",delay:0,html:!1,container:!1,viewport:{selector:"body",padding:0}},c.prototype.init=function(b,c,d){this.enabled=!0,this.type=b,this.$element=a(c),this.options=this.getOptions(d),this.$viewport=this.options.viewport&&a(this.options.viewport.selector||this.options.viewport);for(var e=this.options.trigger.split(" "),f=e.length;f--;){var g=e[f];if("click"==g)this.$element.on("click."+this.type,this.options.selector,a.proxy(this.toggle,this));else if("manual"!=g){var h="hover"==g?"mouseenter":"focusin",i="hover"==g?"mouseleave":"focusout";this.$element.on(h+"."+this.type,this.options.selector,a.proxy(this.enter,this)),this.$element.on(i+"."+this.type,this.options.selector,a.proxy(this.leave,this))}}this.options.selector?this._options=a.extend({},this.options,{trigger:"manual",selector:""}):this.fixTitle()},c.prototype.getDefaults=function(){return c.DEFAULTS},c.prototype.getOptions=function(b){return b=a.extend({},this.getDefaults(),this.$element.data(),b),b.delay&&"number"==typeof b.delay&&(b.delay={show:b.delay,hide:b.delay}),b},c.prototype.getDelegateOptions=function(){var b={},c=this.getDefaults();return this._options&&a.each(this._options,function(a,d){c[a]!=d&&(b[a]=d)}),b},c.prototype.enter=function(b){var c=b instanceof this.constructor?b:a(b.currentTarget).data("bs."+this.type);return c||(c=new this.constructor(b.currentTarget,this.getDelegateOptions()),a(b.currentTarget).data("bs."+this.type,c)),clearTimeout(c.timeout),c.hoverState="in",c.options.delay&&c.options.delay.show?void(c.timeout=setTimeout(function(){"in"==c.hoverState&&c.show()},c.options.delay.show)):c.show()},c.prototype.leave=function(b){var c=b instanceof this.constructor?b:a(b.currentTarget).data("bs."+this.type);return c||(c=new this.constructor(b.currentTarget,this.getDelegateOptions()),a(b.currentTarget).data("bs."+this.type,c)),clearTimeout(c.timeout),c.hoverState="out",c.options.delay&&c.options.delay.hide?void(c.timeout=setTimeout(function(){"out"==c.hoverState&&c.hide()},c.options.delay.hide)):c.hide()},c.prototype.show=function(){var b=a.Event("show.bs."+this.type);if(this.hasContent()&&this.enabled){this.$element.trigger(b);var c=a.contains(document.documentElement,this.$element[0]);if(b.isDefaultPrevented()||!c)return;var d=this,e=this.tip(),f=this.getUID(this.type);this.setContent(),e.attr("id",f),this.$element.attr("aria-describedby",f),this.options.animation&&e.addClass("fade");var g="function"==typeof this.options.placement?this.options.placement.call(this,e[0],this.$element[0]):this.options.placement,h=/\s?auto?\s?/i,i=h.test(g);i&&(g=g.replace(h,"")||"top"),e.detach().css({top:0,left:0,display:"block"}).addClass(g).data("bs."+this.type,this),this.options.container?e.appendTo(this.options.container):e.insertAfter(this.$element);var j=this.getPosition(),k=e[0].offsetWidth,l=e[0].offsetHeight;if(i){var m=g,n=this.$element.parent(),o=this.getPosition(n);g="bottom"==g&&j.top+j.height+l-o.scroll>o.height?"top":"top"==g&&j.top-o.scroll-l<0?"bottom":"right"==g&&j.right+k>o.width?"left":"left"==g&&j.left-k<o.left?"right":g,e.removeClass(m).addClass(g)}var p=this.getCalculatedOffset(g,j,k,l);this.applyPlacement(p,g);var q=function(){d.$element.trigger("shown.bs."+d.type),d.hoverState=null};a.support.transition&&this.$tip.hasClass("fade")?e.one("bsTransitionEnd",q).emulateTransitionEnd(150):q()}},c.prototype.applyPlacement=function(b,c){var d=this.tip(),e=d[0].offsetWidth,f=d[0].offsetHeight,g=parseInt(d.css("margin-top"),10),h=parseInt(d.css("margin-left"),10);isNaN(g)&&(g=0),isNaN(h)&&(h=0),b.top=b.top+g,b.left=b.left+h,a.offset.setOffset(d[0],a.extend({using:function(a){d.css({top:Math.round(a.top),left:Math.round(a.left)})}},b),0),d.addClass("in");var i=d[0].offsetWidth,j=d[0].offsetHeight;"top"==c&&j!=f&&(b.top=b.top+f-j);var k=this.getViewportAdjustedDelta(c,b,i,j);k.left?b.left+=k.left:b.top+=k.top;var l=k.left?2*k.left-e+i:2*k.top-f+j,m=k.left?"left":"top",n=k.left?"offsetWidth":"offsetHeight";d.offset(b),this.replaceArrow(l,d[0][n],m)},c.prototype.replaceArrow=function(a,b,c){this.arrow().css(c,a?50*(1-a/b)+"%":"")},c.prototype.setContent=function(){var a=this.tip(),b=this.getTitle();a.find(".tooltip-inner")[this.options.html?"html":"text"](b),a.removeClass("fade in top bottom left right")},c.prototype.hide=function(){function b(){"in"!=c.hoverState&&d.detach(),c.$element.trigger("hidden.bs."+c.type)}var c=this,d=this.tip(),e=a.Event("hide.bs."+this.type);return this.$element.removeAttr("aria-describedby"),this.$element.trigger(e),e.isDefaultPrevented()?void 0:(d.removeClass("in"),a.support.transition&&this.$tip.hasClass("fade")?d.one("bsTransitionEnd",b).emulateTransitionEnd(150):b(),this.hoverState=null,this)},c.prototype.fixTitle=function(){var a=this.$element;(a.attr("title")||"string"!=typeof a.attr("data-original-title"))&&a.attr("data-original-title",a.attr("title")||"").attr("title","")},c.prototype.hasContent=function(){return this.getTitle()},c.prototype.getPosition=function(b){b=b||this.$element;var c=b[0],d="BODY"==c.tagName;return a.extend({},"function"==typeof c.getBoundingClientRect?c.getBoundingClientRect():null,{scroll:d?document.documentElement.scrollTop||document.body.scrollTop:b.scrollTop(),width:d?a(window).width():b.outerWidth(),height:d?a(window).height():b.outerHeight()},d?{top:0,left:0}:b.offset())},c.prototype.getCalculatedOffset=function(a,b,c,d){return"bottom"==a?{top:b.top+b.height,left:b.left+b.width/2-c/2}:"top"==a?{top:b.top-d,left:b.left+b.width/2-c/2}:"left"==a?{top:b.top+b.height/2-d/2,left:b.left-c}:{top:b.top+b.height/2-d/2,left:b.left+b.width}},c.prototype.getViewportAdjustedDelta=function(a,b,c,d){var e={top:0,left:0};if(!this.$viewport)return e;var f=this.options.viewport&&this.options.viewport.padding||0,g=this.getPosition(this.$viewport);if(/right|left/.test(a)){var h=b.top-f-g.scroll,i=b.top+f-g.scroll+d;h<g.top?e.top=g.top-h:i>g.top+g.height&&(e.top=g.top+g.height-i)}else{var j=b.left-f,k=b.left+f+c;j<g.left?e.left=g.left-j:k>g.width&&(e.left=g.left+g.width-k)}return e},c.prototype.getTitle=function(){var a,b=this.$element,c=this.options;return a=b.attr("data-original-title")||("function"==typeof c.title?c.title.call(b[0]):c.title)},c.prototype.getUID=function(a){do a+=~~(1e6*Math.random());while(document.getElementById(a));return a},c.prototype.tip=function(){return this.$tip=this.$tip||a(this.options.template)},c.prototype.arrow=function(){return this.$arrow=this.$arrow||this.tip().find(".tooltip-arrow")},c.prototype.validate=function(){this.$element[0].parentNode||(this.hide(),this.$element=null,this.options=null)},c.prototype.enable=function(){this.enabled=!0},c.prototype.disable=function(){this.enabled=!1},c.prototype.toggleEnabled=function(){this.enabled=!this.enabled},c.prototype.toggle=function(b){var c=this;b&&(c=a(b.currentTarget).data("bs."+this.type),c||(c=new this.constructor(b.currentTarget,this.getDelegateOptions()),a(b.currentTarget).data("bs."+this.type,c))),c.tip().hasClass("in")?c.leave(c):c.enter(c)},c.prototype.destroy=function(){clearTimeout(this.timeout),this.hide().$element.off("."+this.type).removeData("bs."+this.type)};var d=a.fn.tooltip;a.fn.tooltip=b,a.fn.tooltip.Constructor=c,a.fn.tooltip.noConflict=function(){return a.fn.tooltip=d,this}}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.popover"),f="object"==typeof b&&b;(e||"destroy"!=b)&&(e||d.data("bs.popover",e=new c(this,f)),"string"==typeof b&&e[b]())})}var c=function(a,b){this.init("popover",a,b)};if(!a.fn.tooltip)throw new Error("Popover requires tooltip.js");c.VERSION="3.2.0",c.DEFAULTS=a.extend({},a.fn.tooltip.Constructor.DEFAULTS,{placement:"right",trigger:"click",content:"",template:'<div class="popover" role="tooltip"><div class="arrow"></div><h3 class="popover-title"></h3><div class="popover-content"></div></div>'}),c.prototype=a.extend({},a.fn.tooltip.Constructor.prototype),c.prototype.constructor=c,c.prototype.getDefaults=function(){return c.DEFAULTS},c.prototype.setContent=function(){var a=this.tip(),b=this.getTitle(),c=this.getContent();a.find(".popover-title")[this.options.html?"html":"text"](b),a.find(".popover-content").empty()[this.options.html?"string"==typeof c?"html":"append":"text"](c),a.removeClass("fade top bottom left right in"),a.find(".popover-title").html()||a.find(".popover-title").hide()},c.prototype.hasContent=function(){return this.getTitle()||this.getContent()},c.prototype.getContent=function(){var a=this.$element,b=this.options;return a.attr("data-content")||("function"==typeof b.content?b.content.call(a[0]):b.content)},c.prototype.arrow=function(){return this.$arrow=this.$arrow||this.tip().find(".arrow")},c.prototype.tip=function(){return this.$tip||(this.$tip=a(this.options.template)),this.$tip};var d=a.fn.popover;a.fn.popover=b,a.fn.popover.Constructor=c,a.fn.popover.noConflict=function(){return a.fn.popover=d,this}}(jQuery),+function(a){"use strict";function b(c,d){var e=a.proxy(this.process,this);this.$body=a("body"),this.$scrollElement=a(a(c).is("body")?window:c),this.options=a.extend({},b.DEFAULTS,d),this.selector=(this.options.target||"")+" .nav li > a",this.offsets=[],this.targets=[],this.activeTarget=null,this.scrollHeight=0,this.$scrollElement.on("scroll.bs.scrollspy",e),this.refresh(),this.process()}function c(c){return this.each(function(){var d=a(this),e=d.data("bs.scrollspy"),f="object"==typeof c&&c;e||d.data("bs.scrollspy",e=new b(this,f)),"string"==typeof c&&e[c]()})}b.VERSION="3.2.0",b.DEFAULTS={offset:10},b.prototype.getScrollHeight=function(){return this.$scrollElement[0].scrollHeight||Math.max(this.$body[0].scrollHeight,document.documentElement.scrollHeight)},b.prototype.refresh=function(){var b="offset",c=0;a.isWindow(this.$scrollElement[0])||(b="position",c=this.$scrollElement.scrollTop()),this.offsets=[],this.targets=[],this.scrollHeight=this.getScrollHeight();var d=this;this.$body.find(this.selector).map(function(){var d=a(this),e=d.data("target")||d.attr("href"),f=/^#./.test(e)&&a(e);return f&&f.length&&f.is(":visible")&&[[f[b]().top+c,e]]||null}).sort(function(a,b){return a[0]-b[0]}).each(function(){d.offsets.push(this[0]),d.targets.push(this[1])})},b.prototype.process=function(){var a,b=this.$scrollElement.scrollTop()+this.options.offset,c=this.getScrollHeight(),d=this.options.offset+c-this.$scrollElement.height(),e=this.offsets,f=this.targets,g=this.activeTarget;if(this.scrollHeight!=c&&this.refresh(),b>=d)return g!=(a=f[f.length-1])&&this.activate(a);if(g&&b<=e[0])return g!=(a=f[0])&&this.activate(a);for(a=e.length;a--;)g!=f[a]&&b>=e[a]&&(!e[a+1]||b<=e[a+1])&&this.activate(f[a])},b.prototype.activate=function(b){this.activeTarget=b,a(this.selector).parentsUntil(this.options.target,".active").removeClass("active");var c=this.selector+'[data-target="'+b+'"],'+this.selector+'[href="'+b+'"]',d=a(c).parents("li").addClass("active");d.parent(".dropdown-menu").length&&(d=d.closest("li.dropdown").addClass("active")),d.trigger("activate.bs.scrollspy")};var d=a.fn.scrollspy;a.fn.scrollspy=c,a.fn.scrollspy.Constructor=b,a.fn.scrollspy.noConflict=function(){return a.fn.scrollspy=d,this},a(window).on("load.bs.scrollspy.data-api",function(){a('[data-spy="scroll"]').each(function(){var b=a(this);c.call(b,b.data())})})}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.tab");e||d.data("bs.tab",e=new c(this)),"string"==typeof b&&e[b]()})}var c=function(b){this.element=a(b)};c.VERSION="3.2.0",c.prototype.show=function(){var b=this.element,c=b.closest("ul:not(.dropdown-menu)"),d=b.data("target");if(d||(d=b.attr("href"),d=d&&d.replace(/.*(?=#[^\s]*$)/,"")),!b.parent("li").hasClass("active")){var e=c.find(".active:last a")[0],f=a.Event("show.bs.tab",{relatedTarget:e});if(b.trigger(f),!f.isDefaultPrevented()){var g=a(d);this.activate(b.closest("li"),c),this.activate(g,g.parent(),function(){b.trigger({type:"shown.bs.tab",relatedTarget:e})})}}},c.prototype.activate=function(b,c,d){function e(){f.removeClass("active").find("> .dropdown-menu > .active").removeClass("active"),b.addClass("active"),g?(b[0].offsetWidth,b.addClass("in")):b.removeClass("fade"),b.parent(".dropdown-menu")&&b.closest("li.dropdown").addClass("active"),d&&d()}var f=c.find("> .active"),g=d&&a.support.transition&&f.hasClass("fade");g?f.one("bsTransitionEnd",e).emulateTransitionEnd(150):e(),f.removeClass("in")};var d=a.fn.tab;a.fn.tab=b,a.fn.tab.Constructor=c,a.fn.tab.noConflict=function(){return a.fn.tab=d,this},a(document).on("click.bs.tab.data-api",'[data-toggle="tab"], [data-toggle="pill"]',function(c){c.preventDefault(),b.call(a(this),"show")})}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.affix"),f="object"==typeof b&&b;e||d.data("bs.affix",e=new c(this,f)),"string"==typeof b&&e[b]()})}var c=function(b,d){this.options=a.extend({},c.DEFAULTS,d),this.$target=a(this.options.target).on("scroll.bs.affix.data-api",a.proxy(this.checkPosition,this)).on("click.bs.affix.data-api",a.proxy(this.checkPositionWithEventLoop,this)),this.$element=a(b),this.affixed=this.unpin=this.pinnedOffset=null,this.checkPosition()};c.VERSION="3.2.0",c.RESET="affix affix-top affix-bottom",c.DEFAULTS={offset:0,target:window},c.prototype.getPinnedOffset=function(){if(this.pinnedOffset)return this.pinnedOffset;this.$element.removeClass(c.RESET).addClass("affix");var a=this.$target.scrollTop(),b=this.$element.offset();return this.pinnedOffset=b.top-a},c.prototype.checkPositionWithEventLoop=function(){setTimeout(a.proxy(this.checkPosition,this),1)},c.prototype.checkPosition=function(){if(this.$element.is(":visible")){var b=a(document).height(),d=this.$target.scrollTop(),e=this.$element.offset(),f=this.options.offset,g=f.top,h=f.bottom;"object"!=typeof f&&(h=g=f),"function"==typeof g&&(g=f.top(this.$element)),"function"==typeof h&&(h=f.bottom(this.$element));var i=null!=this.unpin&&d+this.unpin<=e.top?!1:null!=h&&e.top+this.$element.height()>=b-h?"bottom":null!=g&&g>=d?"top":!1;if(this.affixed!==i){null!=this.unpin&&this.$element.css("top","");var j="affix"+(i?"-"+i:""),k=a.Event(j+".bs.affix");this.$element.trigger(k),k.isDefaultPrevented()||(this.affixed=i,this.unpin="bottom"==i?this.getPinnedOffset():null,this.$element.removeClass(c.RESET).addClass(j).trigger(a.Event(j.replace("affix","affixed"))),"bottom"==i&&this.$element.offset({top:b-this.$element.height()-h}))}}};var d=a.fn.affix;a.fn.affix=b,a.fn.affix.Constructor=c,a.fn.affix.noConflict=function(){return a.fn.affix=d,this},a(window).on("load",function(){a('[data-spy="affix"]').each(function(){var c=a(this),d=c.data();d.offset=d.offset||{},d.offsetBottom&&(d.offset.bottom=d.offsetBottom),d.offsetTop&&(d.offset.top=d.offsetTop),b.call(c,d)})})}(jQuery); \ No newline at end of file diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/demultiplexing/html/bootstrapvalidator/css/bootstrapValidator.min.css b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/demultiplexing/html/bootstrapvalidator/css/bootstrapValidator.min.css deleted file mode 100644 index 70c1136cf5fa7ea1cc59863a50b8105af3a0b028..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/demultiplexing/html/bootstrapvalidator/css/bootstrapValidator.min.css +++ /dev/null @@ -1,13 +0,0 @@ -/** - * BootstrapValidator (http://bootstrapvalidator.com) - * - * A jQuery plugin to validate form fields. Use with Bootstrap 3 - * - * @version v0.4.4 - * @author https://twitter.com/nghuuphuoc - * @copyright (c) 2013 - 2014 Nguyen Huu Phuoc - * @license MIT - */ - - -.bv-form .help-block{margin-bottom:0}.nav-tabs li.bv-tab-success>a{color:#3c763d}.nav-tabs li.bv-tab-error>a{color:#a94442} \ No newline at end of file diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/demultiplexing/html/bootstrapvalidator/js/bootstrapValidator.min.js b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/demultiplexing/html/bootstrapvalidator/js/bootstrapValidator.min.js deleted file mode 100644 index 08e2906447cea6eb6032c0643933d9157dd3c4f8..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/demultiplexing/html/bootstrapvalidator/js/bootstrapValidator.min.js +++ /dev/null @@ -1,13 +0,0 @@ -/** - * BootstrapValidator (http://bootstrapvalidator.com) - * - * A jQuery plugin to validate form fields. Use with Bootstrap 3 - * - * @version v0.4.4 - * @author https://twitter.com/nghuuphuoc - * @copyright (c) 2013 - 2014 Nguyen Huu Phuoc - * @license MIT - */ - -!function(a){var b=function(c,d){this.$form=a(c),this.options=a.extend({},b.DEFAULT_OPTIONS,d),this.$invalidField=null,this.$submitButton=null,this.STATUS_NOT_VALIDATED="NOT_VALIDATED",this.STATUS_VALIDATING="VALIDATING",this.STATUS_INVALID="INVALID",this.STATUS_VALID="VALID";var e=function(){for(var a=3,b=document.createElement("div"),c=b.all||[];b.innerHTML="<!--[if gt IE "+ ++a+"]><br><![endif]-->",c[0];);return a>4?a:!a}(),f=document.createElement("div");this._changeEvent=9!==e&&"oninput"in f?"input":"keyup",this._submitIfValid=null,this._init()};b.DEFAULT_OPTIONS={elementClass:"bv-form",message:"This value is not valid",excluded:[":disabled",":hidden",":not(:visible)"],feedbackIcons:{valid:null,invalid:null,validating:null},submitButtons:'button[type="submit"]',submitHandler:null,live:"enabled",fields:null},b.prototype={constructor:b,_init:function(){var b,c,d,e,f,g,h,i=this,j={excluded:this.$form.attr("data-bv-excluded"),trigger:this.$form.attr("data-bv-trigger"),message:this.$form.attr("data-bv-message"),submitButtons:this.$form.attr("data-bv-submitbuttons"),live:this.$form.attr("data-bv-live"),fields:{},feedbackIcons:{valid:this.$form.attr("data-bv-feedbackicons-valid"),invalid:this.$form.attr("data-bv-feedbackicons-invalid"),validating:this.$form.attr("data-bv-feedbackicons-validating")}};this.$form.attr("novalidate","novalidate").addClass(this.options.elementClass).on("submit.bv",function(a){a.preventDefault(),i.validate()}).on("click",this.options.submitButtons,function(){i.$submitButton=a(this),i._submitIfValid=!0}).find("[name], [data-bv-field]").each(function(){var i=a(this);if("hidden"!=i.attr("type")){var k=i.attr("name")||i.attr("data-bv-field");i.attr("data-bv-field",k),j.fields[k]=a.extend({},{trigger:i.attr("data-bv-trigger"),message:i.attr("data-bv-message"),container:i.attr("data-bv-container"),selector:i.attr("data-bv-selector"),validators:{}},j.fields[k]);for(c in a.fn.bootstrapValidator.validators)if(b=a.fn.bootstrapValidator.validators[c],d=i.attr("data-bv-"+c.toLowerCase())+"",h="function"==typeof b.enableByHtml5?b.enableByHtml5(a(this)):null,h&&"false"!=d||h!==!0&&(""==d||"true"==d)){b.html5Attributes=b.html5Attributes||{message:"message"},j.fields[k].validators[c]=a.extend({},1==h?{}:h,j.fields[k].validators[c]);for(g in b.html5Attributes)e=b.html5Attributes[g],f=i.attr("data-bv-"+c.toLowerCase()+"-"+g),f&&("true"==f?f=!0:"false"==f&&(f=!1),j.fields[k].validators[c][e]=f)}}}),this.options=a.extend(!0,this.options,j),"string"==typeof this.options.excluded&&(this.options.excluded=a.map(this.options.excluded.split(","),function(b){return a.trim(b)}));for(var k in this.options.fields)this._initField(k);this.setLiveMode(this.options.live)},_initField:function(b){if(null!=this.options.fields[b]&&null!=this.options.fields[b].validators){var c=this.getFieldElements(b);if(null==c)return void delete this.options.fields[b];for(var d in this.options.fields[b].validators)a.fn.bootstrapValidator.validators[d]||delete this.options.fields[b].validators[d];for(var e=this,f=c.attr("type"),g="radio"==f||"checkbox"==f||"file"==f||"SELECT"==c[0].tagName?"change":e._changeEvent,h=c.length,i=1==h||"radio"==f||"checkbox"==f,j=0;h>j;j++){var k=a(c[j]),l=k.parents(".form-group"),m=this.options.fields[b].container?l.find(this.options.fields[b].container):this._getMessageContainer(k);this.options.fields[b].selector&&k.attr("data-bv-field",b),k.on(g+".update.bv",function(){e._submitIfValid=!1,i?e.updateStatus(b,e.STATUS_NOT_VALIDATED,null):e.updateElementStatus(a(this),e.STATUS_NOT_VALIDATED,null)}),k.data("bv.messages",m);for(d in this.options.fields[b].validators)k.data("bv.result."+d,this.STATUS_NOT_VALIDATED),i&&j!=h-1||a("<small/>").css("display","none").attr("data-bv-validator",d).attr("data-bv-validator-for",b).html(this.options.fields[b].validators[d].message||this.options.fields[b].message||this.options.message).addClass("help-block").appendTo(m);if(this.options.feedbackIcons&&this.options.feedbackIcons.validating&&this.options.feedbackIcons.invalid&&this.options.feedbackIcons.valid&&(!i||j==h-1)){l.addClass("has-feedback");var n=a("<i/>").css("display","none").addClass("form-control-feedback").attr("data-bv-field",b).insertAfter(k);0==l.find("label").length&&n.css("top",0)}}null==this.options.fields[b].enabled&&(this.options.fields[b].enabled=!0)}},_getMessageContainer:function(a){var b=a.parent();if(b.hasClass("form-group"))return b;var c=b.attr("class");if(!c)return this._getMessageContainer(b);c=c.split(" ");for(var d=c.length,e=0;d>e;e++)if(/^col-(xs|sm|md|lg)-\d+$/.test(c[e])||/^col-(xs|sm|md|lg)-offset-\d+$/.test(c[e]))return b;return this._getMessageContainer(b)},_submit:function(){if(this.isValid())this.options.submitHandler&&"function"==typeof this.options.submitHandler?this.options.submitHandler.call(this,this,this.$form,this.$submitButton):this.disableSubmitButtons(!0).defaultSubmit();else if("submitted"==this.options.live&&this.setLiveMode("enabled"),this.$invalidField){var b,c=this.$invalidField.parents(".tab-pane");c&&(b=c.attr("id"))&&a('a[href="#'+b+'"][data-toggle="tab"]').trigger("click.bs.tab.data-api"),this.$invalidField.focus()}},_isExcluded:function(a){if(this.options.excluded)for(var b in this.options.excluded)if("string"==typeof this.options.excluded[b]&&a.is(this.options.excluded[b])||"function"==typeof this.options.excluded[b]&&1==this.options.excluded[b].call(this,a,this))return!0;return!1},getFieldElements:function(b){var c=this.options.fields[b].selector?a(this.options.fields[b].selector):this.$form.find('[name="'+b+'"]');return 0==c.length?null:c},setLiveMode:function(b){if(this.options.live=b,"submitted"==b)return this;var c=this;for(var d in this.options.fields)!function(e){var f=c.getFieldElements(e);if(f)for(var g=f.attr("type"),h=f.length,i=1==h||"radio"==g||"checkbox"==g,j=c.options.fields[d].trigger||c.options.trigger||("radio"==g||"checkbox"==g||"file"==g||"SELECT"==f[0].tagName?"change":c._changeEvent),k=a.map(j.split(" "),function(a){return a+".live.bv"}).join(" "),l=0;h>l;l++)"enabled"==b?a(f[l]).on(k,function(){i?c.validateField(e):c.validateFieldElement(a(this),!1)}):a(f[l]).off(k)}(d);return this},disableSubmitButtons:function(a){return a?"disabled"!=this.options.live&&this.$form.find(this.options.submitButtons).attr("disabled","disabled"):this.$form.find(this.options.submitButtons).removeAttr("disabled"),this},validate:function(){if(!this.options.fields)return this;this.disableSubmitButtons(!0);for(var a in this.options.fields)this.validateField(a);return this.$submitButton&&this._submit(),this},validateField:function(b){for(var c=this.getFieldElements(b),d=c.attr("type"),e="radio"==d||"checkbox"==d?1:c.length,f=0;e>f;f++)this.validateFieldElement(a(c[f]),1==e);return this},validateFieldElement:function(b,c){var d,e,f=this,g=b.attr("data-bv-field"),h=this.options.fields[g].validators;if(!this.options.fields[g].enabled||this._isExcluded(b))return this;for(d in h){b.data("bv.dfs."+d)&&b.data("bv.dfs."+d).reject();var i=b.data("bv.result."+d);i!=this.STATUS_VALID&&i!=this.STATUS_INVALID&&(b.data("bv.result."+d,this.STATUS_VALIDATING),e=a.fn.bootstrapValidator.validators[d].validate(this,b,h[d]),"object"==typeof e?(c?this.updateStatus(g,this.STATUS_VALIDATING,d):this.updateElementStatus(b,this.STATUS_VALIDATING,d),b.data("bv.dfs."+d,e),e.done(function(a,b,d){a.removeData("bv.dfs."+b),c?f.updateStatus(a.attr("data-bv-field"),d?f.STATUS_VALID:f.STATUS_INVALID,b):f.updateElementStatus(a,d?f.STATUS_VALID:f.STATUS_INVALID,b),d&&1==f._submitIfValid&&f._submit()})):"boolean"==typeof e&&(c?this.updateStatus(g,e?this.STATUS_VALID:this.STATUS_INVALID,d):this.updateElementStatus(b,e?this.STATUS_VALID:this.STATUS_INVALID,d)))}return this},updateStatus:function(b,c,d){for(var e=this.getFieldElements(b),f=e.attr("type"),g="radio"==f||"checkbox"==f?1:e.length,h=0;g>h;h++)this.updateElementStatus(a(e[h]),c,d);return this},updateElementStatus:function(b,c,d){var e=this,f=b.attr("data-bv-field"),g=b.parents(".form-group"),h=b.data("bv.messages"),i=h.find(".help-block[data-bv-validator]"),j=g.find('.form-control-feedback[data-bv-field="'+f+'"]');if(d)b.data("bv.result."+d,c);else for(var k in this.options.fields[f].validators)b.data("bv.result."+k,c);var l,m,n=b.parents(".tab-pane");switch(n&&(l=n.attr("id"))&&(m=a('a[href="#'+l+'"][data-toggle="tab"]').parent()),c){case this.STATUS_VALIDATING:this.disableSubmitButtons(!0),g.removeClass("has-success").removeClass("has-error"),d?i.filter('.help-block[data-bv-validator="'+d+'"]').hide():i.hide(),j&&j.removeClass(this.options.feedbackIcons.valid).removeClass(this.options.feedbackIcons.invalid).addClass(this.options.feedbackIcons.validating).show(),m&&m.removeClass("bv-tab-success").removeClass("bv-tab-error");break;case this.STATUS_INVALID:this.disableSubmitButtons(!0),g.removeClass("has-success").addClass("has-error"),d?i.filter('[data-bv-validator="'+d+'"]').show():i.show(),j&&j.removeClass(this.options.feedbackIcons.valid).removeClass(this.options.feedbackIcons.validating).addClass(this.options.feedbackIcons.invalid).show(),m&&m.removeClass("bv-tab-success").addClass("bv-tab-error");break;case this.STATUS_VALID:d?i.filter('[data-bv-validator="'+d+'"]').hide():i.hide();var o=0==i.filter(function(){var c=a(this).css("display"),d=a(this).attr("data-bv-validator");return"block"==c||b.data("bv.result."+d)!=e.STATUS_VALID}).length;this.disableSubmitButtons(o?!1:!0),j&&j.removeClass(this.options.feedbackIcons.invalid).removeClass(this.options.feedbackIcons.validating).removeClass(this.options.feedbackIcons.valid).addClass(o?this.options.feedbackIcons.valid:this.options.feedbackIcons.invalid).show();var p=function(c){return 0==c.find(".help-block[data-bv-validator]").filter(function(){var c=a(this).css("display"),d=a(this).attr("data-bv-validator");return"block"==c||b.data("bv.result."+d)&&b.data("bv.result."+d)!=e.STATUS_VALID}).length};g.removeClass("has-error has-success").addClass(p(g)?"has-success":"has-error"),m&&m.removeClass("bv-tab-success").removeClass("bv-tab-error").addClass(p(n)?"bv-tab-success":"bv-tab-error");break;case this.STATUS_NOT_VALIDATED:default:this.disableSubmitButtons(!1),g.removeClass("has-success").removeClass("has-error"),d?i.filter('.help-block[data-bv-validator="'+d+'"]').hide():i.hide(),j&&j.removeClass(this.options.feedbackIcons.valid).removeClass(this.options.feedbackIcons.invalid).removeClass(this.options.feedbackIcons.validating).hide(),m&&m.removeClass("bv-tab-success").removeClass("bv-tab-error")}return this},isValid:function(){var b,c,d,e,f,g,h,i;for(c in this.options.fields)if(null!=this.options.fields[c]&&this.options.fields[c].enabled)for(b=this.getFieldElements(c),e=b.attr("type"),h="radio"==e||"checkbox"==e?1:b.length,i=0;h>i;i++)if(d=a(b[i]),!this._isExcluded(d))for(g in this.options.fields[c].validators){if(f=d.data("bv.result."+g),f==this.STATUS_NOT_VALIDATED||f==this.STATUS_VALIDATING)return!1;if(f==this.STATUS_INVALID)return this.$invalidField=d,!1}return!0},defaultSubmit:function(){this.$form.off("submit.bv").submit()},resetForm:function(b){var c,d,e,f,g;for(c in this.options.fields){d=this.getFieldElements(c),e=d.length;for(var h=0;e>h;h++)for(g in this.options.fields[c].validators)a(d[h]).removeData("bv.dfs."+g);this.updateStatus(c,this.STATUS_NOT_VALIDATED,null),b&&(f=d.attr("type"),"radio"==f||"checkbox"==f?d.removeAttr("checked").removeAttr("selected"):d.val(""))}return this.$invalidField=null,this.$submitButton=null,this.disableSubmitButtons(!1),this},enableFieldValidators:function(a,b){return this.options.fields[a].enabled=b,this.updateStatus(a,this.STATUS_NOT_VALIDATED,null),this}},a.fn.bootstrapValidator=function(c,d){return this.each(function(){var e=a(this),f=e.data("bootstrapValidator"),g="object"==typeof c&&c;f||(f=new b(this,g),e.data("bootstrapValidator",f)),"string"==typeof c&&f[c](d)})},a.fn.bootstrapValidator.validators={},a.fn.bootstrapValidator.Constructor=b,a.fn.bootstrapValidator.helpers={luhn:function(a){for(var b=a.length,c=0,d=[[0,1,2,3,4,5,6,7,8,9],[0,2,4,6,8,1,3,5,7,9]],e=0;b--;)e+=d[c][parseInt(a.charAt(b),10)],c^=1;return e%10===0&&e>0},mod_11_10:function(a){for(var b=5,c=a.length,d=0;c>d;d++)b=(2*(b||10)%11+parseInt(a.charAt(d),10))%10;return 1==b},mod_37_36:function(a,b){b=b||"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";for(var c=b.length,d=a.length,e=Math.floor(c/2),f=0;d>f;f++)e=(2*(e||c)%(c+1)+b.indexOf(a.charAt(f)))%c;return 1==e}}}(window.jQuery),function(a){a.fn.bootstrapValidator.validators.base64={validate:function(a,b){var c=b.val();return""==c?!0:/^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=|[A-Za-z0-9+/]{4})$/.test(c)}}}(window.jQuery),function(a){a.fn.bootstrapValidator.validators.between={html5Attributes:{message:"message",min:"min",max:"max",inclusive:"inclusive"},enableByHtml5:function(a){return"range"==a.attr("type")?{min:a.attr("min"),max:a.attr("max")}:!1},validate:function(a,b,c){var d=b.val();return""==d?!0:(d=parseFloat(d),c.inclusive===!0?d>c.min&&d<c.max:d>=c.min&&d<=c.max)}}}(window.jQuery),function(a){a.fn.bootstrapValidator.validators.callback={validate:function(b,c,d){var e=c.val();if(d.callback&&"function"==typeof d.callback){var f=new a.Deferred;return f.resolve(c,"callback",d.callback.call(this,e,b)),f}return!0}}}(window.jQuery),function(a){a.fn.bootstrapValidator.validators.choice={html5Attributes:{message:"message",min:"min",max:"max"},validate:function(a,b,c){var d=b.is("select")?a.getFieldElements(b.attr("data-bv-field")).find("option").filter(":selected").length:a.getFieldElements(b.attr("data-bv-field")).filter(":checked").length;return c.min&&d<c.min||c.max&&d>c.max?!1:!0}}}(window.jQuery),function(a){a.fn.bootstrapValidator.validators.creditCard={validate:function(b,c){var d=c.val();if(""==d)return!0;if(/[^0-9-\s]+/.test(d))return!1;if(d=d.replace(/\D/g,""),!a.fn.bootstrapValidator.helpers.luhn(d))return!1;var e,f,g={AMERICAN_EXPRESS:{length:[15],prefix:["34","37"]},DINERS_CLUB:{length:[14],prefix:["300","301","302","303","304","305","36"]},DINERS_CLUB_US:{length:[16],prefix:["54","55"]},DISCOVER:{length:[16],prefix:["6011","622126","622127","622128","622129","62213","62214","62215","62216","62217","62218","62219","6222","6223","6224","6225","6226","6227","6228","62290","62291","622920","622921","622922","622923","622924","622925","644","645","646","647","648","649","65"]},JCB:{length:[16],prefix:["3528","3529","353","354","355","356","357","358"]},LASER:{length:[16,17,18,19],prefix:["6304","6706","6771","6709"]},MAESTRO:{length:[12,13,14,15,16,17,18,19],prefix:["5018","5020","5038","6304","6759","6761","6762","6763","6764","6765","6766"]},MASTERCARD:{length:[16],prefix:["51","52","53","54","55"]},SOLO:{length:[16,18,19],prefix:["6334","6767"]},UNIONPAY:{length:[16,17,18,19],prefix:["622126","622127","622128","622129","62213","62214","62215","62216","62217","62218","62219","6222","6223","6224","6225","6226","6227","6228","62290","62291","622920","622921","622922","622923","622924","622925"]},VISA:{length:[16],prefix:["4"]}};for(e in g)for(f in g[e].prefix)if(d.substr(0,g[e].prefix[f].length)==g[e].prefix[f]&&-1!=g[e].length.indexOf(d.length))return!0;return!1}}}(window.jQuery),function(a){a.fn.bootstrapValidator.validators.cvv={html5Attributes:{message:"message",ccfield:"creditCardField"},validate:function(a,b,c){var d=b.val();if(""==d)return!0;if(!/^[0-9]{3,4}$/.test(d))return!1;if(!c.creditCardField)return!0;var e=a.getFieldElements(c.creditCardField).val();if(""==e)return!0;var f,g,h={AMERICAN_EXPRESS:{length:[15],prefix:["34","37"]},DINERS_CLUB:{length:[14],prefix:["300","301","302","303","304","305","36"]},DINERS_CLUB_US:{length:[16],prefix:["54","55"]},DISCOVER:{length:[16],prefix:["6011","622126","622127","622128","622129","62213","62214","62215","62216","62217","62218","62219","6222","6223","6224","6225","6226","6227","6228","62290","62291","622920","622921","622922","622923","622924","622925","644","645","646","647","648","649","65"]},JCB:{length:[16],prefix:["3528","3529","353","354","355","356","357","358"]},LASER:{length:[16,17,18,19],prefix:["6304","6706","6771","6709"]},MAESTRO:{length:[12,13,14,15,16,17,18,19],prefix:["5018","5020","5038","6304","6759","6761","6762","6763","6764","6765","6766"]},MASTERCARD:{length:[16],prefix:["51","52","53","54","55"]},SOLO:{length:[16,18,19],prefix:["6334","6767"]},UNIONPAY:{length:[16,17,18,19],prefix:["622126","622127","622128","622129","62213","62214","62215","62216","62217","62218","62219","6222","6223","6224","6225","6226","6227","6228","62290","62291","622920","622921","622922","622923","622924","622925"]},VISA:{length:[16],prefix:["4"]}},i=null;for(f in h)for(g in h[f].prefix)if(e.substr(0,h[f].prefix[g].length)==h[f].prefix[g]&&-1!=h[f].length.indexOf(e.length)){i=f;break}return null==i?!1:"AMERICAN_EXPRESS"==i?4==d.length:3==d.length}}}(window.jQuery),function(a){a.fn.bootstrapValidator.validators.date={html5Attributes:{message:"message",format:"format"},validate:function(a,b,c){var d=b.val();if(""==d)return!0;c.format=c.format||"MM/DD/YYYY";var e=c.format.split(" "),f=e[0],g=e.length>1?e[1]:null,h=e.length>2?e[2]:null,i=d.split(" "),j=i[0],k=i.length>1?i[1]:null;if(e.length!=i.length)return!1;var l=-1!=j.indexOf("/")?"/":-1!=j.indexOf("-")?"-":null;if(null==l)return!1;j=j.split(l),f=f.split(l);var m=j[f.indexOf("YYYY")],n=j[f.indexOf("MM")],o=j[f.indexOf("DD")],p=null,q=null,r=null;if(g){if(g=g.split(":"),k=k.split(":"),g.length!=k.length)return!1;if(q=k.length>0?k[0]:null,p=k.length>1?k[1]:null,r=k.length>2?k[2]:null,r&&(r=parseInt(r,10),0>r||r>60))return!1;if(q&&(q=parseInt(q,10),0>q||q>=24||h&&q>12))return!1;if(p&&(p=parseInt(p,10),0>p||p>59))return!1}if(o=parseInt(o,10),n=parseInt(n,10),m=parseInt(m,10),1e3>m||m>9999||0==n||n>12)return!1;var s=[31,28,31,30,31,30,31,31,30,31,30,31];return(m%400==0||m%100!=0&&m%4==0)&&(s[1]=29),o>0&&o<=s[n-1]}}}(window.jQuery),function(a){a.fn.bootstrapValidator.validators.different={html5Attributes:{message:"message",field:"field"},validate:function(a,b,c){var d=b.val();if(""==d)return!0;var e=a.getFieldElements(c.field);return null==e?!0:d!=e.val()?(a.updateStatus(c.field,a.STATUS_VALID,"different"),!0):!1}}}(window.jQuery),function(a){a.fn.bootstrapValidator.validators.digits={validate:function(a,b){var c=b.val();return""==c?!0:/^\d+$/.test(c)}}}(window.jQuery),function(a){a.fn.bootstrapValidator.validators.ean={validate:function(a,b){var c=b.val();if(""==c)return!0;if(!/^(\d{8}|\d{12}|\d{13})$/.test(c))return!1;for(var d=c.length,e=0,f=8==d?[3,1]:[1,3],g=0;d-1>g;g++)e+=parseInt(c.charAt(g))*f[g%2];return e=10-e%10,e==c.charAt(d-1)}}}(window.jQuery),function(a){a.fn.bootstrapValidator.validators.emailAddress={enableByHtml5:function(a){return"email"==a.attr("type")},validate:function(a,b){var c=b.val();if(""==c)return!0;var d=/^(([^<>()[\]\\.,;:\s@\"]+(\.[^<>()[\]\\.,;:\s@\"]+)*)|(\".+\"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/;return d.test(c)}}}(window.jQuery),function(a){a.fn.bootstrapValidator.validators.file={html5Attributes:{extension:"extension",maxsize:"maxSize",message:"message",type:"type"},validate:function(a,b,c){var d=b.val();if(""==d)return!0;var e,f=c.extension?c.extension.split(","):null,g=c.type?c.type.split(","):null,h=window.File&&window.FileList&&window.FileReader;if(h)for(var i=b.get(0).files,j=i.length,k=0;j>k;k++){if(c.maxSize&&i[k].size>parseInt(c.maxSize))return!1;if(e=i[k].name.substr(i[k].name.lastIndexOf(".")+1),f&&-1==f.indexOf(e))return!1;if(g&&-1==g.indexOf(i[k].type))return!1}else if(e=d.substr(d.lastIndexOf(".")+1),f&&-1==f.indexOf(e))return!1;return!0}}}(window.jQuery),function(a){a.fn.bootstrapValidator.validators.greaterThan={html5Attributes:{message:"message",value:"value",inclusive:"inclusive"},enableByHtml5:function(a){var b=a.attr("min");return b?{value:b}:!1},validate:function(a,b,c){var d=b.val();return""==d?!0:(d=parseFloat(d),c.inclusive===!0?d>c.value:d>=c.value)}}}(window.jQuery),function(a){a.fn.bootstrapValidator.validators.grid={validate:function(b,c){var d=c.val();return""==d?!0:(d=d.toUpperCase(),/^[GRID:]*([0-9A-Z]{2})[-\s]*([0-9A-Z]{5})[-\s]*([0-9A-Z]{10})[-\s]*([0-9A-Z]{1})$/g.test(d)?(d=d.replace(/\s/g,"").replace(/-/g,""),"GRID:"==d.substr(0,5)&&(d=d.substr(5)),a.fn.bootstrapValidator.helpers.mod_37_36(d)):!1)}}}(window.jQuery),function(a){a.fn.bootstrapValidator.validators.hex={validate:function(a,b){var c=b.val();return""==c?!0:/^[0-9a-fA-F]+$/.test(c)}}}(window.jQuery),function(a){a.fn.bootstrapValidator.validators.hexColor={enableByHtml5:function(a){return"color"==a.attr("type")},validate:function(a,b){var c=b.val();return""==c?!0:/(^#[0-9A-F]{6}$)|(^#[0-9A-F]{3}$)/i.test(c)}}}(window.jQuery),function(a){a.fn.bootstrapValidator.validators.iban={html5Attributes:{message:"message",country:"country"},validate:function(a,b,c){var d=b.val();if(""==d)return!0;var e={AD:"AD[0-9]{2}[0-9]{4}[0-9]{4}[A-Z0-9]{12}",AE:"AE[0-9]{2}[0-9]{3}[0-9]{16}",AL:"AL[0-9]{2}[0-9]{8}[A-Z0-9]{16}",AO:"AO[0-9]{2}[0-9]{21}",AT:"AT[0-9]{2}[0-9]{5}[0-9]{11}",AZ:"AZ[0-9]{2}[A-Z]{4}[A-Z0-9]{20}",BA:"BA[0-9]{2}[0-9]{3}[0-9]{3}[0-9]{8}[0-9]{2}",BE:"BE[0-9]{2}[0-9]{3}[0-9]{7}[0-9]{2}",BF:"BF[0-9]{2}[0-9]{23}",BG:"BG[0-9]{2}[A-Z]{4}[0-9]{4}[0-9]{2}[A-Z0-9]{8}",BH:"BH[0-9]{2}[A-Z]{4}[A-Z0-9]{14}",BI:"BI[0-9]{2}[0-9]{12}",BJ:"BJ[0-9]{2}[A-Z]{1}[0-9]{23}",BR:"BR[0-9]{2}[0-9]{8}[0-9]{5}[0-9]{10}[A-Z][A-Z0-9]",CH:"CH[0-9]{2}[0-9]{5}[A-Z0-9]{12}",CI:"CI[0-9]{2}[A-Z]{1}[0-9]{23}",CM:"CM[0-9]{2}[0-9]{23}",CR:"CR[0-9]{2}[0-9]{3}[0-9]{14}",CV:"CV[0-9]{2}[0-9]{21}",CY:"CY[0-9]{2}[0-9]{3}[0-9]{5}[A-Z0-9]{16}",CZ:"CZ[0-9]{2}[0-9]{20}",DE:"DE[0-9]{2}[0-9]{8}[0-9]{10}",DK:"DK[0-9]{2}[0-9]{14}",DO:"DO[0-9]{2}[A-Z0-9]{4}[0-9]{20}",DZ:"DZ[0-9]{2}[0-9]{20}",EE:"EE[0-9]{2}[0-9]{2}[0-9]{2}[0-9]{11}[0-9]{1}",ES:"ES[0-9]{2}[0-9]{4}[0-9]{4}[0-9]{1}[0-9]{1}[0-9]{10}",FI:"FI[0-9]{2}[0-9]{6}[0-9]{7}[0-9]{1}",FO:"FO[0-9]{2}[0-9]{4}[0-9]{9}[0-9]{1}",FR:"FR[0-9]{2}[0-9]{5}[0-9]{5}[A-Z0-9]{11}[0-9]{2}",GB:"GB[0-9]{2}[A-Z]{4}[0-9]{6}[0-9]{8}",GE:"GE[0-9]{2}[A-Z]{2}[0-9]{16}",GI:"GI[0-9]{2}[A-Z]{4}[A-Z0-9]{15}",GL:"GL[0-9]{2}[0-9]{4}[0-9]{9}[0-9]{1}",GR:"GR[0-9]{2}[0-9]{3}[0-9]{4}[A-Z0-9]{16}",GT:"GT[0-9]{2}[A-Z0-9]{4}[A-Z0-9]{20}",HR:"HR[0-9]{2}[0-9]{7}[0-9]{10}",HU:"HU[0-9]{2}[0-9]{3}[0-9]{4}[0-9]{1}[0-9]{15}[0-9]{1}",IE:"IE[0-9]{2}[A-Z]{4}[0-9]{6}[0-9]{8}",IL:"IL[0-9]{2}[0-9]{3}[0-9]{3}[0-9]{13}",IR:"IR[0-9]{2}[0-9]{22}",IS:"IS[0-9]{2}[0-9]{4}[0-9]{2}[0-9]{6}[0-9]{10}",IT:"IT[0-9]{2}[A-Z]{1}[0-9]{5}[0-9]{5}[A-Z0-9]{12}",JO:"JO[0-9]{2}[A-Z]{4}[0-9]{4}[0]{8}[A-Z0-9]{10}",KW:"KW[0-9]{2}[A-Z]{4}[0-9]{22}",KZ:"KZ[0-9]{2}[0-9]{3}[A-Z0-9]{13}",LB:"LB[0-9]{2}[0-9]{4}[A-Z0-9]{20}",LI:"LI[0-9]{2}[0-9]{5}[A-Z0-9]{12}",LT:"LT[0-9]{2}[0-9]{5}[0-9]{11}",LU:"LU[0-9]{2}[0-9]{3}[A-Z0-9]{13}",LV:"LV[0-9]{2}[A-Z]{4}[A-Z0-9]{13}",MC:"MC[0-9]{2}[0-9]{5}[0-9]{5}[A-Z0-9]{11}[0-9]{2}",MD:"MD[0-9]{2}[A-Z0-9]{20}",ME:"ME[0-9]{2}[0-9]{3}[0-9]{13}[0-9]{2}",MG:"MG[0-9]{2}[0-9]{23}",MK:"MK[0-9]{2}[0-9]{3}[A-Z0-9]{10}[0-9]{2}",ML:"ML[0-9]{2}[A-Z]{1}[0-9]{23}",MR:"MR13[0-9]{5}[0-9]{5}[0-9]{11}[0-9]{2}",MT:"MT[0-9]{2}[A-Z]{4}[0-9]{5}[A-Z0-9]{18}",MU:"MU[0-9]{2}[A-Z]{4}[0-9]{2}[0-9]{2}[0-9]{12}[0-9]{3}[A-Z]{3}",MZ:"MZ[0-9]{2}[0-9]{21}",NL:"NL[0-9]{2}[A-Z]{4}[0-9]{10}",NO:"NO[0-9]{2}[0-9]{4}[0-9]{6}[0-9]{1}",PK:"PK[0-9]{2}[A-Z]{4}[A-Z0-9]{16}",PL:"PL[0-9]{2}[0-9]{8}[0-9]{16}",PS:"PS[0-9]{2}[A-Z]{4}[A-Z0-9]{21}",PT:"PT[0-9]{2}[0-9]{4}[0-9]{4}[0-9]{11}[0-9]{2}",QA:"QA[0-9]{2}[A-Z]{4}[A-Z0-9]{21}",RO:"RO[0-9]{2}[A-Z]{4}[A-Z0-9]{16}",RS:"RS[0-9]{2}[0-9]{3}[0-9]{13}[0-9]{2}",SA:"SA[0-9]{2}[0-9]{2}[A-Z0-9]{18}",SE:"SE[0-9]{2}[0-9]{3}[0-9]{16}[0-9]{1}",SI:"SI[0-9]{2}[0-9]{5}[0-9]{8}[0-9]{2}",SK:"SK[0-9]{2}[0-9]{4}[0-9]{6}[0-9]{10}",SM:"SM[0-9]{2}[A-Z]{1}[0-9]{5}[0-9]{5}[A-Z0-9]{12}",SN:"SN[0-9]{2}[A-Z]{1}[0-9]{23}",TN:"TN59[0-9]{2}[0-9]{3}[0-9]{13}[0-9]{2}",TR:"TR[0-9]{2}[0-9]{5}[A-Z0-9]{1}[A-Z0-9]{16}",VG:"VG[0-9]{2}[A-Z]{4}[0-9]{16}"};d=d.replace(/[^a-zA-Z0-9]/g,"").toUpperCase();var f=c.country||d.substr(0,2);if(!e[f])return!1;if(!new RegExp("^"+e[f]+"$").test(d))return!1;d=d.substr(4)+d.substr(0,4),d=d.split("").map(function(a){var b=a.charCodeAt(0);return b>="A".charCodeAt(0)&&b<="Z".charCodeAt(0)?b-"A".charCodeAt(0)+10:a}).join("");for(var g=parseInt(d.substr(0,1),10),h=d.length,i=1;h>i;++i)g=(10*g+parseInt(d.substr(i,1),10))%97;return 1==g}}}(window.jQuery),function(a){a.fn.bootstrapValidator.validators.identical={html5Attributes:{message:"message",field:"field"},validate:function(a,b,c){var d=b.val();if(""==d)return!0;var e=a.getFieldElements(c.field);return null==e?!0:d==e.val()?(a.updateStatus(c.field,a.STATUS_VALID,"identical"),!0):!1}}}(window.jQuery),function(a){a.fn.bootstrapValidator.validators.imei={validate:function(b,c){var d=c.val();if(""==d)return!0;switch(!0){case/^\d{15}$/.test(d):case/^\d{2}-\d{6}-\d{6}-\d{1}$/.test(d):case/^\d{2}\s\d{6}\s\d{6}\s\d{1}$/.test(d):return d=d.replace(/[^0-9]/g,""),a.fn.bootstrapValidator.helpers.luhn(d);case/^\d{14}$/.test(d):case/^\d{16}$/.test(d):case/^\d{2}-\d{6}-\d{6}(|-\d{2})$/.test(d):case/^\d{2}\s\d{6}\s\d{6}(|\s\d{2})$/.test(d):return!0;default:return!1}}}}(window.jQuery),function(a){a.fn.bootstrapValidator.validators.integer={enableByHtml5:function(a){return"number"==a.attr("type")},validate:function(a,b){var c=b.val();return""==c?!0:/^(?:-?(?:0|[1-9][0-9]*))$/.test(c)}}}(window.jQuery),function(a){a.fn.bootstrapValidator.validators.ip={html5Attributes:{message:"message",ipv4:"ipv4",ipv6:"ipv6"},validate:function(b,c,d){var e=c.val();return""==e?!0:(d=a.extend({},{ipv4:!0,ipv6:!0},d),d.ipv4?/^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$/.test(e):d.ipv6?/^\s*((([0-9A-Fa-f]{1,4}:){7}([0-9A-Fa-f]{1,4}|:))|(([0-9A-Fa-f]{1,4}:){6}(:[0-9A-Fa-f]{1,4}|((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(([0-9A-Fa-f]{1,4}:){5}(((:[0-9A-Fa-f]{1,4}){1,2})|:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(([0-9A-Fa-f]{1,4}:){4}(((:[0-9A-Fa-f]{1,4}){1,3})|((:[0-9A-Fa-f]{1,4})?:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){3}(((:[0-9A-Fa-f]{1,4}){1,4})|((:[0-9A-Fa-f]{1,4}){0,2}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){2}(((:[0-9A-Fa-f]{1,4}){1,5})|((:[0-9A-Fa-f]{1,4}){0,3}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){1}(((:[0-9A-Fa-f]{1,4}){1,6})|((:[0-9A-Fa-f]{1,4}){0,4}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(:(((:[0-9A-Fa-f]{1,4}){1,7})|((:[0-9A-Fa-f]{1,4}){0,5}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:)))(%.+)?\s*$/.test(str):!1)}}}(window.jQuery),function(a){a.fn.bootstrapValidator.validators.isbn={validate:function(a,b){var c=b.val();if(""==c)return!0;var d;switch(!0){case/^\d{9}[\dX]$/.test(c):case 13==c.length&&/^(\d+)-(\d+)-(\d+)-([\dX])$/.test(c):case 13==c.length&&/^(\d+)\s(\d+)\s(\d+)\s([\dX])$/.test(c):d="ISBN10";break;case/^(978|979)\d{9}[\dX]$/.test(c):case 17==c.length&&/^(978|979)-(\d+)-(\d+)-(\d+)-([\dX])$/.test(c):case 17==c.length&&/^(978|979)\s(\d+)\s(\d+)\s(\d+)\s([\dX])$/.test(c):d="ISBN13";break;default:return!1}c=c.replace(/[^0-9X]/gi,"");var e,f=c.split(""),g=f.length,h=0;switch(d){case"ISBN10":h=0;for(var i=0;g-1>i;i++)h+=(10-i)*parseInt(f[i]);return e=11-h%11,11==e?e=0:10==e&&(e="X"),e+""==f[g-1];case"ISBN13":h=0;for(var i=0;g-1>i;i++)h+=i%2==0?parseInt(f[i]):3*parseInt(f[i]);return e=10-h%10,10==e&&(e="0"),e+""==f[g-1];default:return!1}}}}(window.jQuery),function(a){a.fn.bootstrapValidator.validators.ismn={validate:function(a,b){var c=b.val();if(""==c)return!0;var d;switch(!0){case/^M\d{9}$/.test(c):case/^M-\d{4}-\d{4}-\d{1}$/.test(c):case/^M\s\d{4}\s\d{4}\s\d{1}$/.test(c):d="ISMN10";break;case/^9790\d{9}$/.test(c):case/^979-0-\d{4}-\d{4}-\d{1}$/.test(c):case/^979\s0\s\d{4}\s\d{4}\s\d{1}$/.test(c):d="ISMN13";break;default:return!1}"ISMN10"==d&&(c="9790"+c.substr(1)),c=c.replace(/[^0-9]/gi,"");for(var e=c.length,f=0,g=[1,3],h=0;e-1>h;h++)f+=parseInt(c.charAt(h))*g[h%2];return f=10-f%10,f==c.charAt(e-1)}}}(window.jQuery),function(a){a.fn.bootstrapValidator.validators.issn={validate:function(a,b){var c=b.val();if(""==c)return!0;if(!/^\d{4}\-\d{3}[\dX]$/.test(c))return!1;c=c.replace(/[^0-9X]/gi,"");var d=c.split(""),e=d.length,f=0;"X"==d[7]&&(d[7]=10);for(var g=0;e>g;g++)f+=(8-g)*parseInt(d[g]);return f%11==0}}}(window.jQuery),function(a){a.fn.bootstrapValidator.validators.lessThan={html5Attributes:{message:"message",value:"value",inclusive:"inclusive"},enableByHtml5:function(a){var b=a.attr("max");return b?{value:b}:!1},validate:function(a,b,c){var d=b.val();return""==d?!0:(d=parseFloat(d),c.inclusive===!1?d<=c.value:d<c.value)}}}(window.jQuery),function(a){a.fn.bootstrapValidator.validators.mac={validate:function(a,b){var c=b.val();return""==c?!0:/^([0-9A-F]{2}[:-]){5}([0-9A-F]{2})$/.test(c)}}}(window.jQuery),function(a){a.fn.bootstrapValidator.validators.notEmpty={enableByHtml5:function(a){var b=a.attr("required")+"";return"required"==b||"true"==b},validate:function(b,c){var d=c.attr("type");return"radio"==d||"checkbox"==d?b.getFieldElements(c.attr("data-bv-field")).filter(":checked").length>0:""!=a.trim(c.val())}}}(window.jQuery),function(a){a.fn.bootstrapValidator.validators.numeric={validate:function(a,b){var c=b.val();return""==c?!0:!isNaN(parseFloat(c))&&isFinite(c)}}}(window.jQuery),function(a){a.fn.bootstrapValidator.validators.phone={html5Attributes:{message:"message",country:"country"},validate:function(a,b,c){var d=b.val();if(""==d)return!0;var e=(c.country||"US").toUpperCase();switch(e){case"US":default:return d=d.replace(/\D/g,""),/^(?:(1\-?)|(\+1 ?))?\(?(\d{3})[\)\-\.]?(\d{3})[\-\.]?(\d{4})$/.test(d)&&10==d.length}}}}(window.jQuery),function(a){a.fn.bootstrapValidator.validators.regexp={html5Attributes:{message:"message",regexp:"regexp"},enableByHtml5:function(a){var b=a.attr("pattern");return b?{regexp:b}:!1},validate:function(a,b,c){var d=b.val();if(""==d)return!0;var e="string"==typeof c.regexp?new RegExp(c.regexp):c.regexp;return e.test(d)}}}(window.jQuery),function(a){a.fn.bootstrapValidator.validators.remote={html5Attributes:{message:"message",url:"url",name:"name"},validate:function(b,c,d){var e=c.val();if(""==e)return!0;var f=c.attr("data-bv-field"),g=d.data;null==g&&(g={}),"function"==typeof g&&(g=g.call(this,b)),g[d.name||f]=e;var h=new a.Deferred,i=a.ajax({type:"POST",url:d.url,dataType:"json",data:g});return i.then(function(a){h.resolve(c,"remote",a.valid===!0||"true"===a.valid)}),h.fail(function(){i.abort()}),h}}}(window.jQuery),function(a){a.fn.bootstrapValidator.validators.siren={validate:function(b,c){var d=c.val();return""==d?!0:/^\d{9}$/.test(d)?a.fn.bootstrapValidator.helpers.luhn(d):!1}}}(window.jQuery),function(a){a.fn.bootstrapValidator.validators.siret={validate:function(a,b){var c=b.val();if(""==c)return!0;for(var d,e=0,f=c.length,g=0;f>g;g++)d=parseInt(c.charAt(g),10),g%2==0&&(d=2*d,d>9&&(d-=9)),e+=d;return e%10==0}}}(window.jQuery),function(a){a.fn.bootstrapValidator.validators.step={html5Attributes:{message:"message",base:"baseValue",step:"step"},validate:function(b,c,d){var e=c.val();if(""==e)return!0;if(d=a.extend({},{baseValue:0,step:1},d),e=parseFloat(e),isNaN(e)||!isFinite(e))return!1;var f=function(a,b){var c=Math.pow(10,b);a*=c;var d=a>0|-(0>a),e=a%1===.5*d;return e?(Math.floor(a)+(d>0))/c:Math.round(a)/c},g=function(a,b){if(0==b)return 1;var c=(a+"").split("."),d=(b+"").split("."),e=(1==c.length?0:c[1].length)+(1==d.length?0:d[1].length);return f(a-b*Math.floor(a/b),e)},h=g(e-d.baseValue,d.step);return 0==h||h==d.step}}}(window.jQuery),function(a){a.fn.bootstrapValidator.validators.stringCase={html5Attributes:{message:"message","case":"case"},validate:function(a,b,c){var d=b.val();if(""==d)return!0;var e=(c["case"]||"lower").toLowerCase();switch(e){case"upper":return d===d.toUpperCase();case"lower":default:return d===d.toLowerCase() -}}}}(window.jQuery),function(a){a.fn.bootstrapValidator.validators.stringLength={html5Attributes:{message:"message",min:"min",max:"max"},enableByHtml5:function(a){var b=a.attr("maxlength");return b?{max:parseInt(b,10)}:!1},validate:function(b,c,d){var e=c.val();if(""==e)return!0;var f=a.trim(e).length;return d.min&&f<d.min||d.max&&f>d.max?!1:!0}}}(window.jQuery),function(a){a.fn.bootstrapValidator.validators.uri={enableByHtml5:function(a){return"url"==a.attr("type")},validate:function(a,b){var c=b.val();if(""==c)return!0;var d=new RegExp("^(?:(?:https?|ftp)://)(?:\\S+(?::\\S*)?@)?(?:(?!10(?:\\.\\d{1,3}){3})(?!127(?:\\.\\d{1,3}){3})(?!169\\.254(?:\\.\\d{1,3}){2})(?!192\\.168(?:\\.\\d{1,3}){2})(?!172\\.(?:1[6-9]|2\\d|3[0-1])(?:\\.\\d{1,3}){2})(?:[1-9]\\d?|1\\d\\d|2[01]\\d|22[0-3])(?:\\.(?:1?\\d{1,2}|2[0-4]\\d|25[0-5])){2}(?:\\.(?:[1-9]\\d?|1\\d\\d|2[0-4]\\d|25[0-4]))|(?:(?:[a-z\\u00a1-\\uffff0-9]+-?)*[a-z\\u00a1-\\uffff0-9]+)(?:\\.(?:[a-z\\u00a1-\\uffff0-9]+-?)*[a-z\\u00a1-\\uffff0-9]+)*(?:\\.(?:[a-z\\u00a1-\\uffff]{2,})))(?::\\d{2,5})?(?:/[^\\s]*)?$","i");return d.test(c)}}}(window.jQuery),function(a){a.fn.bootstrapValidator.validators.uuid={html5Attributes:{message:"message",version:"version"},validate:function(a,b,c){var d=b.val();if(""==d)return!0;var e={3:/^[0-9A-F]{8}-[0-9A-F]{4}-3[0-9A-F]{3}-[0-9A-F]{4}-[0-9A-F]{12}$/i,4:/^[0-9A-F]{8}-[0-9A-F]{4}-4[0-9A-F]{3}-[89AB][0-9A-F]{3}-[0-9A-F]{12}$/i,5:/^[0-9A-F]{8}-[0-9A-F]{4}-5[0-9A-F]{3}-[89AB][0-9A-F]{3}-[0-9A-F]{12}$/i,all:/^[0-9A-F]{8}-[0-9A-F]{4}-[0-9A-F]{4}-[0-9A-F]{4}-[0-9A-F]{12}$/i},f=c.version?c.version+"":"all";return null==e[f]?!0:e[f].test(d)}}}(window.jQuery),function(a){a.fn.bootstrapValidator.validators.vat={html5Attributes:{message:"message",country:"country"},validate:function(a,b,c){var d=b.val();if(""==d)return!0;var e=c.country||d.substr(0,2),f=["_",e.toLowerCase()].join("");return this[f]&&"function"==typeof this[f]?this[f](d):!0},_at:function(a){if(!/^ATU[0-9]{8}$/.test(a))return!1;a=a.substr(3);for(var b=0,c=[1,2,1,2,1,2,1],d=0,e=0;7>e;e++)d=parseInt(a.charAt(e))*c[e],d>9&&(d=Math.floor(d/10)+d%10),b+=d;return b=10-(b+4)%10,10==b&&(b=0),b==a.substr(7,1)},_be:function(a){if(!/^BE[0]{0,1}[0-9]{9}$/.test(a))return!1;if(a=a.substr(2),9==a.length&&(a="0"+a),0==a.substr(1,1))return!1;var b=parseInt(a.substr(0,8),10)+parseInt(a.substr(8,2),10);return b%97==0},_bg:function(a){if(!/^BG[0-9]{9,10}$/.test(a))return!1;a=a.substr(2);var b=0,c=0;if(9==a.length){for(c=0;8>c;c++)b+=parseInt(a.charAt(c))*(c+1);if(b%=11,10==b)for(b=0,c=0;8>c;c++)b+=parseInt(a.charAt(c))*(c+3);return b%=10,b==a.substr(8)}if(10==a.length){var d=function(a){var b=parseInt(a.substr(0,2),10)+1900,c=parseInt(a.substr(2,2),10),d=parseInt(a.substr(4,2),10);c>40?(b+=100,c-=40):c>20&&(b-=100,c-=20);try{{new Date(b,c,d)}}catch(e){return!1}for(var f=0,g=[2,4,8,5,10,9,7,3,6],h=0;9>h;h++)f+=parseInt(a.charAt(h))*g[h];return f=f%11%10,f==a.substr(9,1)},e=function(a){for(var b=0,c=[21,19,17,13,11,9,7,3,1],d=0;9>d;d++)b+=parseInt(a.charAt(d))*c[d];return b%=10,b==a.substr(9,1)},f=function(a){for(var b=0,c=[4,3,2,7,6,5,4,3,2],d=0;9>d;d++)b+=parseInt(a.charAt(d))*c[d];return b=11-b%11,10==b?!1:(11==b&&(b=0),b==a.substr(9,1))};return d(a)||e(a)||f(a)}return!1},_ch:function(a){if(!/^CHE[0-9]{9}(MWST)?$/.test(a))return!1;a=a.substr(3);for(var b=0,c=[5,4,3,2,7,6,5,4],d=0;8>d;d++)b+=parseInt(a.charAt(d),10)*c[d];return b=11-b%11,10==b?!1:(11==b&&(b=0),b==a.substr(8,1))},_cy:function(a){if(!/^CY[0-5|9]{1}[0-9]{7}[A-Z]{1}$/.test(a))return!1;if(a=a.substr(2),"12"==a.substr(0,2))return!1;for(var b=0,c={0:1,1:0,2:5,3:7,4:9,5:13,6:15,7:17,8:19,9:21},d=0;8>d;d++){var e=parseInt(a.charAt(d),10);d%2==0&&(e=c[e+""]),b+=e}return b="ABCDEFGHIJKLMNOPQRSTUVWXYZ"[b%26],b==a.substr(8,1)},_cz:function(a){if(!/^CZ[0-9]{8,10}$/.test(a))return!1;a=a.substr(2);var b=0,c=0;if(8==a.length){if(a.charAt(0)+""=="9")return!1;for(b=0,c=0;7>c;c++)b+=parseInt(a.charAt(c),10)*(8-c);return b=11-b%11,10==b&&(b=0),11==b&&(b=1),b==a.substr(7,1)}if(9==a.length&&a.charAt(0)+""=="6"){for(b=0,c=0;7>c;c++)b+=parseInt(a.charAt(c+1),10)*(8-c);return b=11-b%11,10==b&&(b=0),11==b&&(b=1),b=[8,7,6,5,4,3,2,1,0,9,10][b-1],b==a.substr(8,1)}if(9==a.length||10==a.length){var d=1900+parseInt(a.substr(0,2)),e=parseInt(a.substr(2,2))%50%20,f=parseInt(a.substr(4,2));if(9==a.length){if(d>=1980&&(d-=100),d>1953)return!1}else 1954>d&&(d+=100);try{{new Date(d,e,f)}}catch(g){return!1}if(10==a.length){var h=parseInt(a.substr(0,9),10)%11;return 1985>d&&(h%=10),h==a.substr(9,1)}return!0}return!1},_de:function(b){return/^DE[0-9]{9}$/.test(b)?(b=b.substr(2),a.fn.bootstrapValidator.helpers.mod_11_10(b)):!1},_dk:function(a){if(!/^DK[0-9]{8}$/.test(a))return!1;a=a.substr(2);for(var b=0,c=[2,7,6,5,4,3,2,1],d=0;8>d;d++)b+=parseInt(a.charAt(d),10)*c[d];return b%11==0},_ee:function(a){if(!/^EE[0-9]{9}$/.test(a))return!1;a=a.substr(2);for(var b=0,c=[3,7,1,3,7,1,3,7,1],d=0;9>d;d++)b+=parseInt(a.charAt(d))*c[d];return b%10==0},_es:function(a){if(!/^ES[0-9A-Z][0-9]{7}[0-9A-Z]$/.test(a))return!1;a=a.substr(2);var b=function(a){var b=parseInt(a.substr(0,8),10);return b="TRWAGMYFPDXBNJZSQVHLCKE"[b%23],b==a.substr(8,1)},c=function(a){var b=["XYZ".indexOf(a.charAt(0)),a.substr(1)].join("");return b=parseInt(b,10),b="TRWAGMYFPDXBNJZSQVHLCKE"[b%23],b==a.substr(8,1)},d=function(a){var b,c=a.charAt(0);if(-1!="KLM".indexOf(c))return b=parseInt(a.substr(1,8),10),b="TRWAGMYFPDXBNJZSQVHLCKE"[b%23],b==a.substr(8,1);if(-1!="ABCDEFGHJNPQRSUVW".indexOf(c)){for(var d=0,e=[2,1,2,1,2,1,2],f=0,g=0;7>g;g++)f=parseInt(a.charAt(g+1))*e[g],f>9&&(f=Math.floor(f/10)+f%10),d+=f;return d=10-d%10,d==a.substr(8,1)||"JABCDEFGHI"[d]==a.substr(8,1)}return!1},e=a.charAt(0);return/^[0-9]$/.test(e)?b(a):/^[XYZ]$/.test(e)?c(a):d(a)},_fi:function(a){if(!/^FI[0-9]{8}$/.test(a))return!1;a=a.substr(2);for(var b=0,c=[7,9,10,5,8,4,2,1],d=0;8>d;d++)b+=parseInt(a.charAt(d))*c[d];return b%11==0},_fr:function(b){if(!/^FR[0-9A-Z]{2}[0-9]{9}$/.test(b))return!1;if(b=b.substr(2),!a.fn.bootstrapValidator.helpers.luhn(b.substr(2)))return!1;if(/^[0-9]{2}$/.test(b.substr(0,2)))return b.substr(0,2)==parseInt(b.substr(2)+"12",10)%97;var c,d="0123456789ABCDEFGHJKLMNPQRSTUVWXYZ";return c=/^[0-9]{1}$/.test(b.charAt(0))?24*d.indexOf(b.charAt(0))+d.indexOf(b.charAt(1))-10:34*d.indexOf(b.charAt(0))+d.indexOf(b.charAt(1))-100,(parseInt(b.substr(2),10)+1+Math.floor(c/11))%11==c%11},_gb:function(a){if(!(/^GB[0-9]{9}$/.test(a)||/^GB[0-9]{12}$/.test(a)||/^GBGD[0-9]{3}$/.test(a)||/^GBHA[0-9]{3}$/.test(a)||/^GB(GD|HA)8888[0-9]{5}$/.test(a)))return!1;a=a.substr(2);var b=a.length;if(5==b){var c=a.substr(0,2),d=parseInt(a.substr(2));return"GD"==c&&500>d||"HA"==c&&d>=500}if(11==b&&("GD8888"==a.substr(0,6)||"HA8888"==a.substr(0,6)))return"GD"==a.substr(0,2)&&parseInt(a.substr(6,3))>=500||"HA"==a.substr(0,2)&&parseInt(a.substr(6,3))<500?!1:parseInt(a.substr(6,3))%97==parseInt(a.substr(9,2));if(9==b||12==b){for(var e=0,f=[8,7,6,5,4,3,2,10,1],g=0;9>g;g++)e+=parseInt(a.charAt(g))*f[g];return e%=97,parseInt(a.substr(0,3))>=100?0==e||42==e||55==e:0==e}return!0},_gr:function(a){if(!/^GR[0-9]{9}$/.test(a))return!1;a=a.substr(2),8==a.length&&(a="0"+a);for(var b=0,c=[256,128,64,32,16,8,4,2],d=0;8>d;d++)b+=parseInt(a.charAt(d))*c[d];return b=b%11%10,b==a.substr(8,1)},_el:function(a){return/^EL[0-9]{9}$/.test(a)?(a="GR"+a.substr(2),this._gr(a)):!1},_hu:function(a){if(!/^HU[0-9]{8}$/.test(a))return!1;a=a.substr(2);for(var b=0,c=[9,7,3,1,9,7,3,1],d=0;8>d;d++)b+=parseInt(a.charAt(d))*c[d];return b%10==0},_hr:function(b){return/^HR[0-9]{11}$/.test(b)?(b=b.substr(2),a.fn.bootstrapValidator.helpers.mod_11_10(b)):!1},_ie:function(a){if(!/^IE[0-9]{1}[0-9A-Z\*\+]{1}[0-9]{5}[A-Z]{1,2}$/.test(a))return!1;a=a.substr(2);var b=function(a){for(;a.length<7;)a="0"+a;for(var b="WABCDEFGHIJKLMNOPQRSTUV",c=0,d=0;7>d;d++)c+=parseInt(a.charAt(d))*(8-d);return c+=9*b.indexOf(a.substr(7)),b[c%23]};return/^[0-9]+$/.test(a.substr(0,7))?a.charAt(7)==b(a.substr(0,7)+a.substr(8)+""):-1!="ABCDEFGHIJKLMNOPQRSTUVWXYZ+*".indexOf(a.charAt(1))?a.charAt(7)==b(a.substr(2,5)+a.substr(0,1)+""):!0},_it:function(b){if(!/^IT[0-9]{11}$/.test(b))return!1;if(b=b.substr(2),0==parseInt(b.substr(0,7)))return!1;var c=parseInt(b.substr(7,3));return 1>c||c>201&&999!=c&&888!=c?!1:a.fn.bootstrapValidator.helpers.luhn(b)},_lt:function(a){if(!/^LT([0-9]{7}1[0-9]{1}|[0-9]{10}1[0-9]{1})$/.test(a))return!1;a=a.substr(2);for(var b=a.length,c=0,d=0;b-1>d;d++)c+=parseInt(a.charAt(d))*(1+d%9);var e=c%11;if(10==e){c=0;for(var d=0;b-1>d;d++)c+=parseInt(a.charAt(d))*(1+(d+2)%9)}return e=e%11%10,e==a.charAt(b-1)},_lu:function(a){return/^LU[0-9]{8}$/.test(a)?(a=a.substr(2),a.substr(0,6)%89==a.substr(6,2)):!1},_lv:function(a){if(!/^LV[0-9]{11}$/.test(a))return!1;a=a.substr(2);var b=parseInt(a.charAt(0)),c=0,d=[],e=0,f=a.length;if(b>3){for(c=0,d=[9,1,4,8,3,10,2,5,7,6,1],e=0;f>e;e++)c+=parseInt(a.charAt(e))*d[e];return c%=11,3==c}var g=parseInt(a.substr(0,2)),h=parseInt(a.substr(2,2)),i=parseInt(a.substr(4,2));i=i+1800+100*parseInt(a.charAt(6));try{{new Date(i,h,g)}}catch(j){return!1}for(c=0,d=[10,5,8,4,2,1,6,3,7,9],e=0;f-1>e;e++)c+=parseInt(a.charAt(e))*d[e];return c=(c+1)%11%10,c==a.charAt(f-1)},_mt:function(a){if(!/^MT[0-9]{8}$/.test(a))return!1;a=a.substr(2);for(var b=0,c=[3,4,6,7,8,9,10,1],d=0;8>d;d++)b+=parseInt(a.charAt(d))*c[d];return b%37==0},_nl:function(a){if(!/^NL[0-9]{9}B[0-9]{2}$/.test(a))return!1;a=a.substr(2);for(var b=0,c=[9,8,7,6,5,4,3,2],d=0;8>d;d++)b+=parseInt(a.charAt(d))*c[d];return b%=11,b>9&&(b=0),b==a.substr(8,1)},_no:function(a){if(!/^NO[0-9]{9}$/.test(a))return!1;a=a.substr(2);for(var b=0,c=[3,2,7,6,5,4,3,2],d=0;8>d;d++)b+=parseInt(a.charAt(d))*c[d];return b=11-b%11,11==b&&(b=0),b==a.substr(8,1)},_pl:function(a){if(!/^PL[0-9]{10}$/.test(a))return!1;a=a.substr(2);for(var b=0,c=[6,5,7,2,3,4,5,6,7,-1],d=0;10>d;d++)b+=parseInt(a.charAt(d))*c[d];return b%11==0},_pt:function(a){if(!/^PT[0-9]{9}$/.test(a))return!1;a=a.substr(2);for(var b=0,c=[9,8,7,6,5,4,3,2],d=0;8>d;d++)b+=parseInt(a.charAt(d))*c[d];return b=11-b%11,b>9&&(b=0),b==a.substr(8,1)},_ro:function(a){if(!/^RO[1-9][0-9]{1,9}$/.test(a))return!1;a=a.substr(2);for(var b=a.length,c=[7,5,3,2,1,7,5,3,2].slice(10-b),d=0,e=0;b-1>e;e++)d+=parseInt(a.charAt(e))*c[e];return d=10*d%11%10,d==a.substr(b-1,1)},_ru:function(a){if(!/^RU([0-9]{9}|[0-9]{12})$/.test(a))return!1;if(a=a.substr(2),10==a.length){for(var b=0,c=[2,4,10,3,5,9,4,6,8,0],d=0;10>d;d++)b+=parseInt(a.charAt(d))*c[d];return b%=11,b>9&&(b%=10),b==a.substr(9,1)}if(12==a.length){for(var e=0,f=[7,2,4,10,3,5,9,4,6,8,0],g=0,h=[3,7,2,4,10,3,5,9,4,6,8,0],d=0;11>d;d++)e+=parseInt(a.charAt(d))*f[d],g+=parseInt(a.charAt(d))*h[d];return e%=11,e>9&&(e%=10),g%=11,g>9&&(g%=10),e==a.substr(10,1)&&g==a.substr(11,1)}return!1},_rs:function(a){if(!/^RS[0-9]{9}$/.test(a))return!1;a=a.substr(2);for(var b=10,c=0,d=0;8>d;d++)c=(parseInt(a.charAt(d))+b)%10,0==c&&(c=10),b=2*c%11;return(b+parseInt(a.substr(8,1)))%10==1},_se:function(b){return/^SE[0-9]{10}01$/.test(b)?(b=b.substr(2,10),a.fn.bootstrapValidator.helpers.luhn(b)):!1},_si:function(a){if(!/^SI[0-9]{8}$/.test(a))return!1;a=a.substr(2);for(var b=0,c=[8,7,6,5,4,3,2],d=0;7>d;d++)b+=parseInt(a.charAt(d))*c[d];return b=11-b%11,10==b&&(b=0),b==a.substr(7,1)},_sk:function(a){return/^SK[1-9][0-9][(2-4)|(6-9)][0-9]{7}$/.test(a)?(a=a.substr(2),a%11==0):!1}}}(window.jQuery),function(a){a.fn.bootstrapValidator.validators.vin={validate:function(a,b){var c=b.val();if(""==c)return!0;if(!/^[a-hj-npr-z0-9]{8}[0-9xX][a-hj-npr-z0-9]{8}$/i.test(c))return!1;c=c.toUpperCase();for(var d={A:1,B:2,C:3,D:4,E:5,F:6,G:7,H:8,J:1,K:2,L:3,M:4,N:5,P:7,R:9,S:2,T:3,U:4,V:5,W:6,X:7,Y:8,Z:9,1:1,2:2,3:3,4:4,5:5,6:6,7:7,8:8,9:9,0:0},e=[8,7,6,5,4,3,2,10,0,9,8,7,6,5,4,3,2],f=0,g=c.length,h=0;g>h;h++)f+=d[c.charAt(h)+""]*e[h];var i=f%11;return 10==i&&(i="X"),i==c.charAt(8)}}}(window.jQuery),function(a){a.fn.bootstrapValidator.validators.zipCode={html5Attributes:{message:"message",country:"country"},validate:function(a,b,c){var d=b.val();if(""==d||!c.country)return!0;var e=(c.country||"US").toUpperCase();switch(e){case"CA":return/(?:A|B|C|E|G|J|K|L|M|N|P|R|S|T|V|X|Y){1}[0-9]{1}(?:A|B|C|E|G|J|K|L|M|N|P|R|S|T|V|X|Y){1}\s?[0-9]{1}(?:A|B|C|E|G|J|K|L|M|N|P|R|S|T|V|X|Y){1}[0-9]{1}/i.test(d);case"DK":return/^(DK(-|\s)?)?\d{4}$/i.test(d);case"GB":return this._gb(d);case"SE":return/^(S-)?\d{3}\s?\d{2}$/i.test(d);case"US":default:return/^\d{4,5}([\-]\d{4})?$/.test(d)}},_gb:function(a){for(var b="[ABCDEFGHIJKLMNOPRSTUWYZ]",c="[ABCDEFGHKLMNOPQRSTUVWXY]",d="[ABCDEFGHJKPMNRSTUVWXY]",e="[ABEHMNPRVWXY]",f="[ABDEFGHJLNPQRSTUWXYZ]",g=[new RegExp("^("+b+"{1}"+c+"?[0-9]{1,2})(\\s*)([0-9]{1}"+f+"{2})$","i"),new RegExp("^("+b+"{1}[0-9]{1}"+d+"{1})(\\s*)([0-9]{1}"+f+"{2})$","i"),new RegExp("^("+b+"{1}"+c+"{1}?[0-9]{1}"+e+"{1})(\\s*)([0-9]{1}"+f+"{2})$","i"),new RegExp("^(BF1)(\\s*)([0-6]{1}[ABDEFGHJLNPQRST]{1}[ABDEFGHJLNPQRSTUWZYZ]{1})$","i"),/^(GIR)(\s*)(0AA)$/i,/^(BFPO)(\s*)([0-9]{1,4})$/i,/^(BFPO)(\s*)(c\/o\s*[0-9]{1,3})$/i,/^([A-Z]{4})(\s*)(1ZZ)$/i,/^(AI-2640)$/i],h=0;h<g.length;h++)if(g[h].test(a))return!0;return!1}}}(window.jQuery); \ No newline at end of file diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/demultiplexing/html/css/main.css b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/demultiplexing/html/css/main.css deleted file mode 100644 index cefa731bec90a2db1a69656c8d271febf9090127..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/demultiplexing/html/css/main.css +++ /dev/null @@ -1,8 +0,0 @@ -.validatedField { - float:left; - padding-left:5px; -} - -.fieldLabel { - float:left; -} \ No newline at end of file diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/demultiplexing/html/images/openBIS_Logo.svg b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/demultiplexing/html/images/openBIS_Logo.svg deleted file mode 100644 index 811623c73d2ef53c4a15be466eee3af98cf19822..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/demultiplexing/html/images/openBIS_Logo.svg +++ /dev/null @@ -1,68 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- Generator: Adobe Illustrator 15.0.2, SVG Export Plug-In . SVG Version: 6.00 Build 0) --> -<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> -<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" - width="400.023px" height="174.566px" viewBox="0 0 400.023 174.566" enable-background="new 0 0 400.023 174.566" - xml:space="preserve"> -<g id="Layer_1"> - <g> - <text transform="matrix(1 0 0 1 46.4854 154.2764)"><tspan x="0" y="0" fill="#010101" font-family="'HelveticaNeue-Bold'" font-size="93.505" letter-spacing="-4">open</tspan><tspan x="204.679" y="0" fill="#231F20" font-family="'HelveticaNeue'" font-size="93.505">BIS</tspan></text> - <rect x="204.234" y="158.748" fill="none" width="192.64" height="14.936"/> - <text transform="matrix(1 0 0 1 204.2329 169.876)" fill="#010101" font-family="'HelveticaNeue'" font-size="15.5842">Biology Information System</text> - <g> - <g> - <g> - <g> - <polygon fill="#068172" points="125.213,81.967 141.416,98.167 147.252,92.333 131.053,76.132 125.213,76.132 "/> - </g> - <g> - <g> - <polygon fill="#068172" points="120.206,81.967 104.005,98.167 98.168,92.333 114.368,76.132 120.206,76.132 "/> - </g> - <g> - <polygon fill="#068172" points="120.206,65.286 104.005,49.084 98.168,54.92 114.368,71.12 120.206,71.12 "/> - </g> - </g> - </g> - <g> - <polygon fill="#068172" points="125.213,65.286 141.416,49.084 147.252,54.92 131.053,71.12 125.213,71.12 "/> - </g> - </g> - <g> - <g> - <polygon fill="#A4A4A4" points="76.131,16.201 92.331,0 98.168,5.836 81.969,22.036 76.13,22.036 "/> - </g> - <g> - <g> - <polygon fill="#ADACAF" points="76.131,32.882 92.331,49.084 98.168,43.247 81.969,27.048 76.13,27.048 "/> - </g> - <g> - <g> - <polygon fill="#ADACAF" points="71.122,32.882 54.921,49.084 49.084,43.247 65.283,27.048 71.123,27.048 "/> - </g> - <g> - <polygon fill="#ADACAF" points="71.122,16.201 54.921,0 49.084,5.836 65.283,22.036 71.123,22.036 "/> - </g> - </g> - </g> - </g> - <g> - <g> - <polygon fill="#ADACAF" points="27.046,65.286 43.247,49.084 49.083,54.92 32.884,71.12 27.045,71.12 "/> - </g> - <g> - <polygon fill="#ADACAF" points="27.046,81.967 43.247,98.167 49.083,92.333 32.884,76.132 27.045,76.132 "/> - </g> - <g> - <polygon fill="#ADACAF" points="22.038,81.967 5.837,98.167 0,92.333 16.199,76.132 22.038,76.132 "/> - </g> - <g> - <polygon fill="#ADACAF" points="22.038,65.286 5.837,49.084 0,54.92 16.199,71.12 22.038,71.12 "/> - </g> - </g> - </g> - </g> -</g> -<g id="Layer_2"> -</g> -</svg> diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/demultiplexing/html/index.html b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/demultiplexing/html/index.html deleted file mode 100644 index fc6ef3a33fe5ee5e055b6fd51b9316365232ba8d..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/demultiplexing/html/index.html +++ /dev/null @@ -1,175 +0,0 @@ -<head> -<title></title> -<link rel="stylesheet" href="bootstrap3/css/bootstrap.min.css"> -<link rel="stylesheet" - href="bootstrapvalidator/css/bootstrapValidator.min.css"> -<link rel="stylesheet" - href="css/main.css"> -<script type="text/javascript" src="js/d3.v2.min.js"></script> -<script type="text/javascript" src="js/jquery-1.8.2.min.js"></script> -<script type="text/javascript" src="bootstrap3/js/bootstrap.min.js"></script> -<script type="text/javascript" src="bootstrapvalidator/js/bootstrapValidator.min.js"></script> -<script type="text/javascript" src="js/spin.min.js"></script> -<script type="text/javascript" src="js/openbis.js"></script> -<script type="text/javascript" src="js/openbis-dsu.js"></script> -<script type="text/javascript" src="js/main.js"></script> - -<!-- To speed development, cache the requests --> -<!-- <script type="text/javascript" src="openbis-request-cache.js"></script> --> -<script> - - dsu = new openbis_dsu('/openbis/openbis', '/datastore_server'); - var vis; - var didCreateVis = false; - var context = new openbisWebAppContext(); - - $(document).ready(function () { - setValidators(); - refresh(); - setInterval(refresh, 600000); - }); - </script> -</head> -<body> - <div class="container"> - <div class="row"> - <div class="col-lg-12"> - - <h2> - Demultiplexing <small>QGF</small> - </h2> - </div> - </div> - </div> - <br> - <div class="container"> - <div class="panel panel-default" id="lanePanel"> - <div class="panel-heading"> - <h3 class="panel-title">Choose Lane</h3> - </div> - <div class="panel-body"> - <div class="container"> - <div class="row"> - <div class="col-sm-10"> - <div class="checkbox"> - <label> <input type="checkbox" id="allLanes"> Analyze all Lanes</label> - </div> - </div> - </div> - </div> - <script type="text/javascript"> - $("#allLanes").change(function() { - if(this.checked) { - $('#laneRange').prop('disabled', true); - }else { - $('#laneRange').prop('disabled', false); - } - }); - </script> - <form class="form-inline validatedField"" role="form" id="laneRangeForm"> - <div class="form-group"> - <div class="input-group"> - <span class="input-group-addon">Lane Range</span> - <input type="text" class="form-control" id="laneRange" name="laneRange" - placeholder="1-3, 5, 7-8"> - </div> - </div> - </form> - </div> - </div> - <script type="text/javascript"> $('#allLanes').prop('checked', true); $('#laneRange').prop('disabled', true);</script> - - <div class="panel panel-default"> - <div class="panel-heading"> - <h3 class="panel-title">Options</h3> - </div> - <div class="panel-body"> - <form class="form-horizontal" role="form"> - <div class="form-group"> - <div class="col-sm-10"> - <div class="checkbox"> - <label> - <input type="checkbox" id="sampleSheet">Recreate Sample Sheet - <span class="help-block">uses latest meta data from openBIS</span> - </label> - </div> - </div> - </div> - </form> - <script type="text/javascript"> $('#sampleSheet').prop('checked', true);</script> - <form class="form-horizontal" role="form"> - <div class="form-group"> - <div class="col-sm-10"> - <div class="checkbox"> - <label> - <input type="checkbox" id="failedReads">Include reads which do not pass the Illumina filter - <span class="help-block">Non PF reads are also in the FASTQ file</span> - </label> - </div> - </div> - </div> - </form> - <script type="text/javascript"> $('#failedReads').prop('checked', true);</script> - - <form class="form-inline validatedField"" role="form" id="MismatchesInIndexForm"> - <div class="form-group"> - <div class="input-group"> - <span class="input-group-addon">Allowed Index Mismatch</span> - <input type="text" class="form-control" id="indexMismatch" name="indexMismatch" - placeholder="0" value="0" > - </div> - </div> - </form> - - - <form class="form-horizontal" role="form"> - <div class="form-group"> - <div class="col-sm-10"> - <div class="checkbox"> - <label> - <input type="checkbox" id="email">Send Email when finished - <span class="help-block"> </span> - </label> - </div> - </div> - </div> - </form> - - </div> - </div> - <br> - <p> - <div class="container"> - <div class="row"> - <div class="col-md-3"> - <button class="btn btn-default" type="submit" id="submitBtn" - onclick="callIngestionService('startJob');">Start</button> - <button type="button" class="btn btn-default" onclick="refresh();"> - <span class="glyphicon glyphicon-refresh"></span> Refresh - </button> - </div> - </div> - </div> - </p> - <br> - <!-- Placeholder for the output coming back from the server --> - <div class="container"> - <div class="row"> - <div class="col-lg-12"> - <div id="main"></div> - </div> - </div> - </div> - - <!-- Footer ================================================== --> - - <footer class="bs-footer" role="contentinfo"> - <h6 div class="container"> - <a href="" target="_blank">Powered by ...</a> - </div> - </h6> - </footer> - - -</body> -</html> diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/demultiplexing/html/js/d3.v2.min.js b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/demultiplexing/html/js/d3.v2.min.js deleted file mode 100644 index 0b4ea58fdb3898737cf1be2c06ce6d7532e87878..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/demultiplexing/html/js/d3.v2.min.js +++ /dev/null @@ -1,4 +0,0 @@ -(function(){function e(e,t){try{for(var n in t)Object.defineProperty(e.prototype,n,{value:t[n],enumerable:!1})}catch(r){e.prototype=t}}function t(e){var t=-1,n=e.length,r=[];while(++t<n)r.push(e[t]);return r}function n(e){return Array.prototype.slice.call(e)}function r(){}function i(e){return e}function s(){return this}function o(){return!0}function u(e){return typeof e=="function"?e:function(){return e}}function a(e,t,n){return function(){var r=n.apply(t,arguments);return arguments.length?e:r}}function f(e){return e!=null&&!isNaN(e)}function l(e){return e.length}function c(e){return e==null}function h(e){return e.trim().replace(/\s+/g," ")}function p(e){var t=1;while(e*t%1)t*=10;return t}function d(){}function v(e){function t(){var t=n,r=-1,i=t.length,s;while(++r<i)(s=t[r].on)&&s.apply(this,arguments);return e}var n=[],i=new r;return t.on=function(t,r){var s=i.get(t),o;return arguments.length<2?s&&s.on:(s&&(s.on=null,n=n.slice(0,o=n.indexOf(s)).concat(n.slice(o+1)),i.remove(t)),r&&n.push(i.set(t,{on:r})),e)},t}function m(e,t){return t-(e?1+Math.floor(Math.log(e+Math.pow(10,1+Math.floor(Math.log(e)/Math.LN10)-t))/Math.LN10):1)}function g(e){return e+""}function y(e){var t=e.lastIndexOf("."),n=t>=0?e.substring(t):(t=e.length,""),r=[];while(t>0)r.push(e.substring(t-=3,t+3));return r.reverse().join(",")+n}function b(e,t){var n=Math.pow(10,Math.abs(8-t)*3);return{scale:t>8?function(e){return e/n}:function(e){return e*n},symbol:e}}function w(e){return function(t){return t<=0?0:t>=1?1:e(t)}}function E(e){return function(t){return 1-e(1-t)}}function S(e){return function(t){return.5*(t<.5?e(2*t):2-e(2-2*t))}}function x(e){return e}function T(e){return function(t){return Math.pow(t,e)}}function N(e){return 1-Math.cos(e*Math.PI/2)}function C(e){return Math.pow(2,10*(e-1))}function k(e){return 1-Math.sqrt(1-e*e)}function L(e,t){var n;return arguments.length<2&&(t=.45),arguments.length<1?(e=1,n=t/4):n=t/(2*Math.PI)*Math.asin(1/e),function(r){return 1+e*Math.pow(2,10*-r)*Math.sin((r-n)*2*Math.PI/t)}}function A(e){return e||(e=1.70158),function(t){return t*t*((e+1)*t-e)}}function O(e){return e<1/2.75?7.5625*e*e:e<2/2.75?7.5625*(e-=1.5/2.75)*e+.75:e<2.5/2.75?7.5625*(e-=2.25/2.75)*e+.9375:7.5625*(e-=2.625/2.75)*e+.984375}function M(){d3.event.stopPropagation(),d3.event.preventDefault()}function _(){var e=d3.event,t;while(t=e.sourceEvent)e=t;return e}function D(e){var t=new d,n=0,r=arguments.length;while(++n<r)t[arguments[n]]=v(t);return t.of=function(n,r){return function(i){try{var s=i.sourceEvent=d3.event;i.target=e,d3.event=i,t[i.type].apply(n,r)}finally{d3.event=s}}},t}function P(e){var t=[e.a,e.b],n=[e.c,e.d],r=B(t),i=H(t,n),s=B(j(n,t,-i))||0;t[0]*n[1]<n[0]*t[1]&&(t[0]*=-1,t[1]*=-1,r*=-1,i*=-1),this.rotate=(r?Math.atan2(t[1],t[0]):Math.atan2(-n[0],n[1]))*ls,this.translate=[e.e,e.f],this.scale=[r,s],this.skew=s?Math.atan2(i,s)*ls:0}function H(e,t){return e[0]*t[0]+e[1]*t[1]}function B(e){var t=Math.sqrt(H(e,e));return t&&(e[0]/=t,e[1]/=t),t}function j(e,t,n){return e[0]+=n*t[0],e[1]+=n*t[1],e}function F(e){return e=="transform"?d3.interpolateTransform:d3.interpolate}function I(e,t){return t=t-(e=+e)?1/(t-e):0,function(n){return(n-e)*t}}function q(e,t){return t=t-(e=+e)?1/(t-e):0,function(n){return Math.max(0,Math.min(1,(n-e)*t))}}function R(){}function U(e,t,n){return new z(e,t,n)}function z(e,t,n){this.r=e,this.g=t,this.b=n}function W(e){return e<16?"0"+Math.max(0,e).toString(16):Math.min(255,e).toString(16)}function X(e,t,n){var r=0,i=0,s=0,o,u,a;o=/([a-z]+)\((.*)\)/i.exec(e);if(o){u=o[2].split(",");switch(o[1]){case"hsl":return n(parseFloat(u[0]),parseFloat(u[1])/100,parseFloat(u[2])/100);case"rgb":return t(K(u[0]),K(u[1]),K(u[2]))}}return(a=ds.get(e))?t(a.r,a.g,a.b):(e!=null&&e.charAt(0)==="#"&&(e.length===4?(r=e.charAt(1),r+=r,i=e.charAt(2),i+=i,s=e.charAt(3),s+=s):e.length===7&&(r=e.substring(1,3),i=e.substring(3,5),s=e.substring(5,7)),r=parseInt(r,16),i=parseInt(i,16),s=parseInt(s,16)),t(r,i,s))}function V(e,t,n){var r=Math.min(e/=255,t/=255,n/=255),i=Math.max(e,t,n),s=i-r,o,u,a=(i+r)/2;return s?(u=a<.5?s/(i+r):s/(2-i-r),e==i?o=(t-n)/s+(t<n?6:0):t==i?o=(n-e)/s+2:o=(e-t)/s+4,o*=60):u=o=0,Q(o,u,a)}function $(e,t,n){e=J(e),t=J(t),n=J(n);var r=ut((.4124564*e+.3575761*t+.1804375*n)/ys),i=ut((.2126729*e+.7151522*t+.072175*n)/bs),s=ut((.0193339*e+.119192*t+.9503041*n)/ws);return nt(116*i-16,500*(r-i),200*(i-s))}function J(e){return(e/=255)<=.04045?e/12.92:Math.pow((e+.055)/1.055,2.4)}function K(e){var t=parseFloat(e);return e.charAt(e.length-1)==="%"?Math.round(t*2.55):t}function Q(e,t,n){return new G(e,t,n)}function G(e,t,n){this.h=e,this.s=t,this.l=n}function Y(e,t,n){function r(e){return e>360?e-=360:e<0&&(e+=360),e<60?s+(o-s)*e/60:e<180?o:e<240?s+(o-s)*(240-e)/60:s}function i(e){return Math.round(r(e)*255)}var s,o;return e%=360,e<0&&(e+=360),t=t<0?0:t>1?1:t,n=n<0?0:n>1?1:n,o=n<=.5?n*(1+t):n+t-n*t,s=2*n-o,U(i(e+120),i(e),i(e-120))}function Z(e,t,n){return new et(e,t,n)}function et(e,t,n){this.h=e,this.c=t,this.l=n}function tt(e,t,n){return nt(n,Math.cos(e*=Math.PI/180)*t,Math.sin(e)*t)}function nt(e,t,n){return new rt(e,t,n)}function rt(e,t,n){this.l=e,this.a=t,this.b=n}function it(e,t,n){var r=(e+16)/116,i=r+t/500,s=r-n/200;return i=ot(i)*ys,r=ot(r)*bs,s=ot(s)*ws,U(at(3.2404542*i-1.5371385*r-.4985314*s),at(-0.969266*i+1.8760108*r+.041556*s),at(.0556434*i-.2040259*r+1.0572252*s))}function st(e,t,n){return Z(Math.atan2(n,t)/Math.PI*180,Math.sqrt(t*t+n*n),e)}function ot(e){return e>.206893034?e*e*e:(e-4/29)/7.787037}function ut(e){return e>.008856?Math.pow(e,1/3):7.787037*e+4/29}function at(e){return Math.round(255*(e<=.00304?12.92*e:1.055*Math.pow(e,1/2.4)-.055))}function ft(e){return Qi(e,ks),e}function lt(e){return function(){return Ss(e,this)}}function ct(e){return function(){return xs(e,this)}}function ht(e,t){function n(){this.removeAttribute(e)}function r(){this.removeAttributeNS(e.space,e.local)}function i(){this.setAttribute(e,t)}function s(){this.setAttributeNS(e.space,e.local,t)}function o(){var n=t.apply(this,arguments);n==null?this.removeAttribute(e):this.setAttribute(e,n)}function u(){var n=t.apply(this,arguments);n==null?this.removeAttributeNS(e.space,e.local):this.setAttributeNS(e.space,e.local,n)}return e=d3.ns.qualify(e),t==null?e.local?r:n:typeof t=="function"?e.local?u:o:e.local?s:i}function pt(e){return new RegExp("(?:^|\\s+)"+d3.requote(e)+"(?:\\s+|$)","g")}function dt(e,t){function n(){var n=-1;while(++n<i)e[n](this,t)}function r(){var n=-1,r=t.apply(this,arguments);while(++n<i)e[n](this,r)}e=e.trim().split(/\s+/).map(vt);var i=e.length;return typeof t=="function"?r:n}function vt(e){var t=pt(e);return function(n,r){if(i=n.classList)return r?i.add(e):i.remove(e);var i=n.className,s=i.baseVal!=null,o=s?i.baseVal:i;r?(t.lastIndex=0,t.test(o)||(o=h(o+" "+e),s?i.baseVal=o:n.className=o)):o&&(o=h(o.replace(t," ")),s?i.baseVal=o:n.className=o)}}function mt(e,t,n){function r(){this.style.removeProperty(e)}function i(){this.style.setProperty(e,t,n)}function s(){var r=t.apply(this,arguments);r==null?this.style.removeProperty(e):this.style.setProperty(e,r,n)}return t==null?r:typeof t=="function"?s:i}function gt(e,t){function n(){delete this[e]}function r(){this[e]=t}function i(){var n=t.apply(this,arguments);n==null?delete this[e]:this[e]=n}return t==null?n:typeof t=="function"?i:r}function yt(e){return{__data__:e}}function bt(e){return function(){return Cs(this,e)}}function wt(e){return arguments.length||(e=d3.ascending),function(t,n){return e(t&&t.__data__,n&&n.__data__)}}function Et(e,t,n){function r(){var t=this[s];t&&(this.removeEventListener(e,t,t.$),delete this[s])}function i(){function i(e){var n=d3.event;d3.event=e,u[0]=o.__data__;try{t.apply(o,u)}finally{d3.event=n}}var o=this,u=arguments;r.call(this),this.addEventListener(e,this[s]=i,i.$=n),i._=t}var s="__on"+e,o=e.indexOf(".");return o>0&&(e=e.substring(0,o)),t?i:r}function St(e,t){for(var n=0,r=e.length;n<r;n++)for(var i=e[n],s=0,o=i.length,u;s<o;s++)(u=i[s])&&t(u,s,n);return e}function xt(e){return Qi(e,As),e}function Tt(e,t,n){Qi(e,Os);var i=new r,s=d3.dispatch("start","end"),o=Fs;return e.id=t,e.time=n,e.tween=function(t,n){return arguments.length<2?i.get(t):(n==null?i.remove(t):i.set(t,n),e)},e.ease=function(t){return arguments.length?(o=typeof t=="function"?t:d3.ease.apply(d3,arguments),e):o},e.each=function(t,n){return arguments.length<2?Nt.call(e,t):(s.on(t,n),e)},d3.timer(function(r){return St(e,function(e,u,a){function f(r){return v.active>t?c():(v.active=t,i.forEach(function(t,n){(n=n.call(e,m,u))&&h.push(n)}),s.start.call(e,m,u),l(r)||d3.timer(l,0,n),1)}function l(n){if(v.active!==t)return c();var r=(n-p)/d,i=o(r),a=h.length;while(a>0)h[--a].call(e,i);if(r>=1)return c(),_s=t,s.end.call(e,m,u),_s=0,1}function c(){return--v.count||delete e.__transition__,1}var h=[],p=e.delay,d=e.duration,v=(e=e.node).__transition__||(e.__transition__={active:0,count:0}),m=e.__data__;++v.count,p<=r?f(r):d3.timer(f,p,n)})},0,n),e}function Nt(e){var t=_s,n=Fs,r=Bs,i=js;return _s=this.id,Fs=this.ease(),St(this,function(t,n,r){Bs=t.delay,js=t.duration,e.call(t=t.node,t.__data__,n,r)}),_s=t,Fs=n,Bs=r,js=i,this}function Ct(e,t,n){return n!=""&&Is}function kt(e,t){return d3.tween(e,F(t))}function Lt(){var e,t=Date.now(),n=Us;while(n)e=t-n.then,e>=n.delay&&(n.flush=n.callback(e)),n=n.next;var r=At()-t;r>24?(isFinite(r)&&(clearTimeout(Ws),Ws=setTimeout(Lt,r)),zs=0):(zs=1,Xs(Lt))}function At(){var e=null,t=Us,n=Infinity;while(t)t.flush?(delete Rs[t.callback.id],t=e?e.next=t.next:Us=t.next):(n=Math.min(n,t.then+t.delay),t=(e=t).next);return n}function Ot(e,t){var n=e.ownerSVGElement||e;if(n.createSVGPoint){var r=n.createSVGPoint();if(Vs<0&&(window.scrollX||window.scrollY)){n=d3.select(document.body).append("svg").style("position","absolute").style("top",0).style("left",0);var i=n[0][0].getScreenCTM();Vs=!i.f&&!i.e,n.remove()}return Vs?(r.x=t.pageX,r.y=t.pageY):(r.x=t.clientX,r.y=t.clientY),r=r.matrixTransform(e.getScreenCTM().inverse()),[r.x,r.y]}var s=e.getBoundingClientRect();return[t.clientX-s.left-e.clientLeft,t.clientY-s.top-e.clientTop]}function Mt(){}function _t(e){var t=e[0],n=e[e.length-1];return t<n?[t,n]:[n,t]}function Dt(e){return e.rangeExtent?e.rangeExtent():_t(e.range())}function Pt(e,t){var n=0,r=e.length-1,i=e[n],s=e[r],o;s<i&&(o=n,n=r,r=o,o=i,i=s,s=o);if(t=t(s-i))e[n]=t.floor(i),e[r]=t.ceil(s);return e}function Ht(){return Math}function Bt(e,t,n,r){function i(){var i=Math.min(e.length,t.length)>2?zt:Ut,a=r?q:I;return o=i(e,t,a,n),u=i(t,e,a,d3.interpolate),s}function s(e){return o(e)}var o,u;return s.invert=function(e){return u(e)},s.domain=function(t){return arguments.length?(e=t.map(Number),i()):e},s.range=function(e){return arguments.length?(t=e,i()):t},s.rangeRound=function(e){return s.range(e).interpolate(d3.interpolateRound)},s.clamp=function(e){return arguments.length?(r=e,i()):r},s.interpolate=function(e){return arguments.length?(n=e,i()):n},s.ticks=function(t){return qt(e,t)},s.tickFormat=function(t){return Rt(e,t)},s.nice=function(){return Pt(e,Ft),i()},s.copy=function(){return Bt(e,t,n,r)},i()}function jt(e,t){return d3.rebind(e,t,"range","rangeRound","interpolate","clamp")}function Ft(e){return e=Math.pow(10,Math.round(Math.log(e)/Math.LN10)-1),e&&{floor:function(t){return Math.floor(t/e)*e},ceil:function(t){return Math.ceil(t/e)*e}}}function It(e,t){var n=_t(e),r=n[1]-n[0],i=Math.pow(10,Math.floor(Math.log(r/t)/Math.LN10)),s=t/r*i;return s<=.15?i*=10:s<=.35?i*=5:s<=.75&&(i*=2),n[0]=Math.ceil(n[0]/i)*i,n[1]=Math.floor(n[1]/i)*i+i*.5,n[2]=i,n}function qt(e,t){return d3.range.apply(d3,It(e,t))}function Rt(e,t){return d3.format(",."+Math.max(0,-Math.floor(Math.log(It(e,t)[2])/Math.LN10+.01))+"f")}function Ut(e,t,n,r){var i=n(e[0],e[1]),s=r(t[0],t[1]);return function(e){return s(i(e))}}function zt(e,t,n,r){var i=[],s=[],o=0,u=Math.min(e.length,t.length)-1;e[u]<e[0]&&(e=e.slice().reverse(),t=t.slice().reverse());while(++o<=u)i.push(n(e[o-1],e[o])),s.push(r(t[o-1],t[o]));return function(t){var n=d3.bisect(e,t,1,u)-1;return s[n](i[n](t))}}function Wt(e,t){function n(n){return e(t(n))}var r=t.pow;return n.invert=function(t){return r(e.invert(t))},n.domain=function(i){return arguments.length?(t=i[0]<0?Vt:Xt,r=t.pow,e.domain(i.map(t)),n):e.domain().map(r)},n.nice=function(){return e.domain(Pt(e.domain(),Ht)),n},n.ticks=function(){var n=_t(e.domain()),i=[];if(n.every(isFinite)){var s=Math.floor(n[0]),o=Math.ceil(n[1]),u=r(n[0]),a=r(n[1]);if(t===Vt){i.push(r(s));for(;s++<o;)for(var f=9;f>0;f--)i.push(r(s)*f)}else{for(;s<o;s++)for(var f=1;f<10;f++)i.push(r(s)*f);i.push(r(s))}for(s=0;i[s]<u;s++);for(o=i.length;i[o-1]>a;o--);i=i.slice(s,o)}return i},n.tickFormat=function(e,i){arguments.length<2&&(i=$s);if(arguments.length<1)return i;var s=Math.max(.1,e/n.ticks().length),o=t===Vt?(u=-1e-12,Math.floor):(u=1e-12,Math.ceil),u;return function(e){return e/r(o(t(e)+u))<=s?i(e):""}},n.copy=function(){return Wt(e.copy(),t)},jt(n,e)}function Xt(e){return Math.log(e<0?0:e)/Math.LN10}function Vt(e){return-Math.log(e>0?0:-e)/Math.LN10}function $t(e,t){function n(t){return e(r(t))}var r=Jt(t),i=Jt(1/t);return n.invert=function(t){return i(e.invert(t))},n.domain=function(t){return arguments.length?(e.domain(t.map(r)),n):e.domain().map(i)},n.ticks=function(e){return qt(n.domain(),e)},n.tickFormat=function(e){return Rt(n.domain(),e)},n.nice=function(){return n.domain(Pt(n.domain(),Ft))},n.exponent=function(e){if(!arguments.length)return t;var s=n.domain();return r=Jt(t=e),i=Jt(1/t),n.domain(s)},n.copy=function(){return $t(e.copy(),t)},jt(n,e)}function Jt(e){return function(t){return t<0?-Math.pow(-t,e):Math.pow(t,e)}}function Kt(e,t){function n(t){return o[((s.get(t)||s.set(t,e.push(t)))-1)%o.length]}function i(t,n){return d3.range(e.length).map(function(e){return t+n*e})}var s,o,u;return n.domain=function(i){if(!arguments.length)return e;e=[],s=new r;var o=-1,u=i.length,a;while(++o<u)s.has(a=i[o])||s.set(a,e.push(a));return n[t.t].apply(n,t.a)},n.range=function(e){return arguments.length?(o=e,u=0,t={t:"range",a:arguments},n):o},n.rangePoints=function(r,s){arguments.length<2&&(s=0);var a=r[0],f=r[1],l=(f-a)/(Math.max(1,e.length-1)+s);return o=i(e.length<2?(a+f)/2:a+l*s/2,l),u=0,t={t:"rangePoints",a:arguments},n},n.rangeBands=function(r,s,a){arguments.length<2&&(s=0),arguments.length<3&&(a=s);var f=r[1]<r[0],l=r[f-0],c=r[1-f],h=(c-l)/(e.length-s+2*a);return o=i(l+h*a,h),f&&o.reverse(),u=h*(1-s),t={t:"rangeBands",a:arguments},n},n.rangeRoundBands=function(r,s,a){arguments.length<2&&(s=0),arguments.length<3&&(a=s);var f=r[1]<r[0],l=r[f-0],c=r[1-f],h=Math.floor((c-l)/(e.length-s+2*a)),p=c-l-(e.length-s)*h;return o=i(l+Math.round(p/2),h),f&&o.reverse(),u=Math.round(h*(1-s)),t={t:"rangeRoundBands",a:arguments},n},n.rangeBand=function(){return u},n.rangeExtent=function(){return _t(t.a[0])},n.copy=function(){return Kt(e,t)},n.domain(e)}function Qt(e,t){function n(){var n=0,s=e.length,o=t.length;i=[];while(++n<o)i[n-1]=d3.quantile(e,n/o);return r}function r(e){return isNaN(e=+e)?NaN:t[d3.bisect(i,e)]}var i;return r.domain=function(t){return arguments.length?(e=t.filter(function(e){return!isNaN(e)}).sort(d3.ascending),n()):e},r.range=function(e){return arguments.length?(t=e,n()):t},r.quantiles=function(){return i},r.copy=function(){return Qt(e,t)},n()}function Gt(e,t,n){function r(t){return n[Math.max(0,Math.min(o,Math.floor(s*(t-e))))]}function i(){return s=n.length/(t-e),o=n.length-1,r}var s,o;return r.domain=function(n){return arguments.length?(e=+n[0],t=+n[n.length-1],i()):[e,t]},r.range=function(e){return arguments.length?(n=e,i()):n},r.copy=function(){return Gt(e,t,n)},i()}function Yt(e,t){function n(n){return t[d3.bisect(e,n)]}return n.domain=function(t){return arguments.length?(e=t,n):e},n.range=function(e){return arguments.length?(t=e,n):t},n.copy=function(){return Yt(e,t)},n}function Zt(e){function t(e){return+e}return t.invert=t,t.domain=t.range=function(n){return arguments.length?(e=n.map(t),t):e},t.ticks=function(t){return qt(e,t)},t.tickFormat=function(t){return Rt(e,t)},t.copy=function(){return Zt(e)},t}function en(e){return e.innerRadius}function tn(e){return e.outerRadius}function nn(e){return e.startAngle}function rn(e){return e.endAngle}function sn(e){function t(t){function o(){a.push("M",s(e(l),f))}var a=[],l=[],c=-1,h=t.length,p,d=u(n),v=u(r);while(++c<h)i.call(this,p=t[c],c)?l.push([+d.call(this,p,c),+v.call(this,p,c)]):l.length&&(o(),l=[]);return l.length&&o(),a.length?a.join(""):null}var n=on,r=un,i=o,s=an,a=s.key,f=.7;return t.x=function(e){return arguments.length?(n=e,t):n},t.y=function(e){return arguments.length?(r=e,t):r},t.defined=function(e){return arguments.length?(i=e,t):i},t.interpolate=function(e){return arguments.length?(typeof e=="function"?a=s=e:a=(s=eo.get(e)||an).key,t):a},t.tension=function(e){return arguments.length?(f=e,t):f},t}function on(e){return e[0]}function un(e){return e[1]}function an(e){return e.join("L")}function fn(e){return an(e)+"Z"}function ln(e){var t=0,n=e.length,r=e[0],i=[r[0],",",r[1]];while(++t<n)i.push("V",(r=e[t])[1],"H",r[0]);return i.join("")}function cn(e){var t=0,n=e.length,r=e[0],i=[r[0],",",r[1]];while(++t<n)i.push("H",(r=e[t])[0],"V",r[1]);return i.join("")}function hn(e,t){return e.length<4?an(e):e[1]+vn(e.slice(1,e.length-1),mn(e,t))}function pn(e,t){return e.length<3?an(e):e[0]+vn((e.push(e[0]),e),mn([e[e.length-2]].concat(e,[e[1]]),t))}function dn(e,t,n){return e.length<3?an(e):e[0]+vn(e,mn(e,t))}function vn(e,t){if(t.length<1||e.length!=t.length&&e.length!=t.length+2)return an(e);var n=e.length!=t.length,r="",i=e[0],s=e[1],o=t[0],u=o,a=1;n&&(r+="Q"+(s[0]-o[0]*2/3)+","+(s[1]-o[1]*2/3)+","+s[0]+","+s[1],i=e[1],a=2);if(t.length>1){u=t[1],s=e[a],a++,r+="C"+(i[0]+o[0])+","+(i[1]+o[1])+","+(s[0]-u[0])+","+(s[1]-u[1])+","+s[0]+","+s[1];for(var f=2;f<t.length;f++,a++)s=e[a],u=t[f],r+="S"+(s[0]-u[0])+","+(s[1]-u[1])+","+s[0]+","+s[1]}if(n){var l=e[a];r+="Q"+(s[0]+u[0]*2/3)+","+(s[1]+u[1]*2/3)+","+l[0]+","+l[1]}return r}function mn(e,t){var n=[],r=(1-t)/2,i,s=e[0],o=e[1],u=1,a=e.length;while(++u<a)i=s,s=o,o=e[u],n.push([r*(o[0]-i[0]),r*(o[1]-i[1])]);return n}function gn(e){if(e.length<3)return an(e);var t=1,n=e.length,r=e[0],i=r[0],s=r[1],o=[i,i,i,(r=e[1])[0]],u=[s,s,s,r[1]],a=[i,",",s];Sn(a,o,u);while(++t<n)r=e[t],o.shift(),o.push(r[0]),u.shift(),u.push(r[1]),Sn(a,o,u);t=-1;while(++t<2)o.shift(),o.push(r[0]),u.shift(),u.push(r[1]),Sn(a,o,u);return a.join("")}function yn(e){if(e.length<4)return an(e);var t=[],n=-1,r=e.length,i,s=[0],o=[0];while(++n<3)i=e[n],s.push(i[0]),o.push(i[1]);t.push(En(ro,s)+","+En(ro,o)),--n;while(++n<r)i=e[n],s.shift(),s.push(i[0]),o.shift(),o.push(i[1]),Sn(t,s,o);return t.join("")}function bn(e){var t,n=-1,r=e.length,i=r+4,s,o=[],u=[];while(++n<4)s=e[n%r],o.push(s[0]),u.push(s[1]);t=[En(ro,o),",",En(ro,u)],--n;while(++n<i)s=e[n%r],o.shift(),o.push(s[0]),u.shift(),u.push(s[1]),Sn(t,o,u);return t.join("")}function wn(e,t){var n=e.length-1;if(n){var r=e[0][0],i=e[0][1],s=e[n][0]-r,o=e[n][1]-i,u=-1,a,f;while(++u<=n)a=e[u],f=u/n,a[0]=t*a[0]+(1-t)*(r+f*s),a[1]=t*a[1]+(1-t)*(i+f*o)}return gn(e)}function En(e,t){return e[0]*t[0]+e[1]*t[1]+e[2]*t[2]+e[3]*t[3]}function Sn(e,t,n){e.push("C",En(to,t),",",En(to,n),",",En(no,t),",",En(no,n),",",En(ro,t),",",En(ro,n))}function xn(e,t){return(t[1]-e[1])/(t[0]-e[0])}function Tn(e){var t=0,n=e.length-1,r=[],i=e[0],s=e[1],o=r[0]=xn(i,s);while(++t<n)r[t]=(o+(o=xn(i=s,s=e[t+1])))/2;return r[t]=o,r}function Nn(e){var t=[],n,r,i,s,o=Tn(e),u=-1,a=e.length-1;while(++u<a)n=xn(e[u],e[u+1]),Math.abs(n)<1e-6?o[u]=o[u+1]=0:(r=o[u]/n,i=o[u+1]/n,s=r*r+i*i,s>9&&(s=n*3/Math.sqrt(s),o[u]=s*r,o[u+1]=s*i));u=-1;while(++u<=a)s=(e[Math.min(a,u+1)][0]-e[Math.max(0,u-1)][0])/(6*(1+o[u]*o[u])),t.push([s||0,o[u]*s||0]);return t}function Cn(e){return e.length<3?an(e):e[0]+vn(e,Nn(e))}function kn(e){var t,n=-1,r=e.length,i,s;while(++n<r)t=e[n],i=t[0],s=t[1]+Ys,t[0]=i*Math.cos(s),t[1]=i*Math.sin(s);return e}function Ln(e){function t(t){function o(){l.push("M",f(e(v),p),h,c(e(d.reverse()),p),"Z")}var l=[],d=[],v=[],m=-1,g=t.length,y,b=u(n),w=u(i),E=n===r?function(){return x}:u(r),S=i===s?function(){return T}:u(s),x,T;while(++m<g)a.call(this,y=t[m],m)?(d.push([x=+b.call(this,y,m),T=+w.call(this,y,m)]),v.push([+E.call(this,y,m),+S.call(this,y,m)])):d.length&&(o(),d=[],v=[]);return d.length&&o(),l.length?l.join(""):null}var n=on,r=on,i=0,s=un,a=o,f=an,l=f.key,c=f,h="L",p=.7;return t.x=function(e){return arguments.length?(n=r=e,t):r},t.x0=function(e){return arguments.length?(n=e,t):n},t.x1=function(e){return arguments.length?(r=e,t):r},t.y=function(e){return arguments.length?(i=s=e,t):s},t.y0=function(e){return arguments.length?(i=e,t):i},t.y1=function(e){return arguments.length?(s=e,t):s},t.defined=function(e){return arguments.length?(a=e,t):a},t.interpolate=function(e){return arguments.length?(typeof e=="function"?l=f=e:l=(f=eo.get(e)||an).key,c=f.reverse||f,h=f.closed?"M":"L",t):l},t.tension=function(e){return arguments.length?(p=e,t):p},t}function An(e){return e.source}function On(e){return e.target}function Mn(e){return e.radius}function _n(e){return e.startAngle}function Dn(e){return e.endAngle}function Pn(e){return[e.x,e.y]}function Hn(e){return function(){var t=e.apply(this,arguments),n=t[0],r=t[1]+Ys;return[n*Math.cos(r),n*Math.sin(r)]}}function Bn(){return 64}function jn(){return"circle"}function Fn(e){var t=Math.sqrt(e/Math.PI);return"M0,"+t+"A"+t+","+t+" 0 1,1 0,"+ -t+"A"+t+","+t+" 0 1,1 0,"+t+"Z"}function In(e,t){e.attr("transform",function(e){return"translate("+t(e)+",0)"})}function qn(e,t){e.attr("transform",function(e){return"translate(0,"+t(e)+")"})}function Rn(e,t,n){i=[];if(n&&t.length>1){var r=_t(e.domain()),i,s=-1,o=t.length,u=(t[1]-t[0])/++n,a,f;while(++s<o)for(a=n;--a>0;)(f=+t[s]-a*u)>=r[0]&&i.push(f);for(--s,a=0;++a<n&&(f=+t[s]+a*u)<r[1];)i.push(f)}return i}function Un(){fo||(fo=d3.select("body").append("div").style("visibility","hidden").style("top",0).style("height",0).style("width",0).style("overflow-y","scroll").append("div").style("height","2000px").node().parentNode);var e=d3.event,t;try{fo.scrollTop=1e3,fo.dispatchEvent(e),t=1e3-fo.scrollTop}catch(n){t=e.wheelDelta||-e.detail*5}return t}function zn(e){var t=e.source,n=e.target,r=Xn(t,n),i=[t];while(t!==r)t=t.parent,i.push(t);var s=i.length;while(n!==r)i.splice(s,0,n),n=n.parent;return i}function Wn(e){var t=[],n=e.parent;while(n!=null)t.push(e),e=n,n=n.parent;return t.push(e),t}function Xn(e,t){if(e===t)return e;var n=Wn(e),r=Wn(t),i=n.pop(),s=r.pop(),o=null;while(i===s)o=i,i=n.pop(),s=r.pop();return o}function Vn(e){e.fixed|=2}function $n(e){e.fixed&=1}function Jn(e){e.fixed|=4}function Kn(e){e.fixed&=3}function Qn(e,t,n){var r=0,i=0;e.charge=0;if(!e.leaf){var s=e.nodes,o=s.length,u=-1,a;while(++u<o){a=s[u];if(a==null)continue;Qn(a,t,n),e.charge+=a.charge,r+=a.charge*a.cx,i+=a.charge*a.cy}}if(e.point){e.leaf||(e.point.x+=Math.random()-.5,e.point.y+=Math.random()-.5);var f=t*n[e.point.index];e.charge+=e.pointCharge=f,r+=f*e.point.x,i+=f*e.point.y}e.cx=r/e.charge,e.cy=i/e.charge}function Gn(e){return 20}function Yn(e){return 1}function Zn(e){return e.x}function er(e){return e.y}function tr(e,t,n){e.y0=t,e.y=n}function nr(e){return d3.range(e.length)}function rr(e){var t=-1,n=e[0].length,r=[];while(++t<n)r[t]=0;return r}function ir(e){var t=1,n=0,r=e[0][1],i,s=e.length;for(;t<s;++t)(i=e[t][1])>r&&(n=t,r=i);return n}function sr(e){return e.reduce(or,0)}function or(e,t){return e+t[1]}function ur(e,t){return ar(e,Math.ceil(Math.log(t.length)/Math.LN2+1))}function ar(e,t){var n=-1,r=+e[0],i=(e[1]-r)/t,s=[];while(++n<=t)s[n]=i*n+r;return s}function fr(e){return[d3.min(e),d3.max(e)]}function lr(e,t){return d3.rebind(e,t,"sort","children","value"),e.links=dr,e.nodes=function(t){return vo=!0,(e.nodes=e)(t)},e}function cr(e){return e.children}function hr(e){return e.value}function pr(e,t){return t.value-e.value}function dr(e){return d3.merge(e.map(function(e){return(e.children||[]).map(function(t){return{source:e,target:t}})}))}function vr(e,t){return e.value-t.value}function mr(e,t){var n=e._pack_next;e._pack_next=t,t._pack_prev=e,t._pack_next=n,n._pack_prev=t}function gr(e,t){e._pack_next=t,t._pack_prev=e}function yr(e,t){var n=t.x-e.x,r=t.y-e.y,i=e.r+t.r;return i*i-n*n-r*r>.001}function br(e){function t(e){r=Math.min(e.x-e.r,r),i=Math.max(e.x+e.r,i),s=Math.min(e.y-e.r,s),o=Math.max(e.y+e.r,o)}if(!(n=e.children)||!(p=n.length))return;var n,r=Infinity,i=-Infinity,s=Infinity,o=-Infinity,u,a,f,l,c,h,p;n.forEach(wr),u=n[0],u.x=-u.r,u.y=0,t(u);if(p>1){a=n[1],a.x=a.r,a.y=0,t(a);if(p>2){f=n[2],xr(u,a,f),t(f),mr(u,f),u._pack_prev=f,mr(f,a),a=u._pack_next;for(l=3;l<p;l++){xr(u,a,f=n[l]);var d=0,v=1,m=1;for(c=a._pack_next;c!==a;c=c._pack_next,v++)if(yr(c,f)){d=1;break}if(d==1)for(h=u._pack_prev;h!==c._pack_prev;h=h._pack_prev,m++)if(yr(h,f))break;d?(v<m||v==m&&a.r<u.r?gr(u,a=c):gr(u=h,a),l--):(mr(u,f),a=f,t(f))}}}var g=(r+i)/2,y=(s+o)/2,b=0;for(l=0;l<p;l++)f=n[l],f.x-=g,f.y-=y,b=Math.max(b,f.r+Math.sqrt(f.x*f.x+f.y*f.y));e.r=b,n.forEach(Er)}function wr(e){e._pack_next=e._pack_prev=e}function Er(e){delete e._pack_next,delete e._pack_prev}function Sr(e,t,n,r){var i=e.children;e.x=t+=r*e.x,e.y=n+=r*e.y,e.r*=r;if(i){var s=-1,o=i.length;while(++s<o)Sr(i[s],t,n,r)}}function xr(e,t,n){var r=e.r+n.r,i=t.x-e.x,s=t.y-e.y;if(r&&(i||s)){var o=t.r+n.r,u=i*i+s*s;o*=o,r*=r;var a=.5+(r-o)/(2*u),f=Math.sqrt(Math.max(0,2*o*(r+u)-(r-=u)*r-o*o))/(2*u);n.x=e.x+a*i+f*s,n.y=e.y+a*s-f*i}else n.x=e.x+r,n.y=e.y}function Tr(e){return 1+d3.max(e,function(e){return e.y})}function Nr(e){return e.reduce(function(e,t){return e+t.x},0)/e.length}function Cr(e){var t=e.children;return t&&t.length?Cr(t[0]):e}function kr(e){var t=e.children,n;return t&&(n=t.length)?kr(t[n-1]):e}function Lr(e,t){return e.parent==t.parent?1:2}function Ar(e){var t=e.children;return t&&t.length?t[0]:e._tree.thread}function Or(e){var t=e.children,n;return t&&(n=t.length)?t[n-1]:e._tree.thread}function Mr(e,t){var n=e.children;if(n&&(i=n.length)){var r,i,s=-1;while(++s<i)t(r=Mr(n[s],t),e)>0&&(e=r)}return e}function _r(e,t){return e.x-t.x}function Dr(e,t){return t.x-e.x}function Pr(e,t){return e.depth-t.depth}function Hr(e,t){function n(e,r){var i=e.children;if(i&&(a=i.length)){var s,o=null,u=-1,a;while(++u<a)s=i[u],n(s,o),o=s}t(e,r)}n(e,null)}function Br(e){var t=0,n=0,r=e.children,i=r.length,s;while(--i>=0)s=r[i]._tree,s.prelim+=t,s.mod+=t,t+=s.shift+(n+=s.change)}function jr(e,t,n){e=e._tree,t=t._tree;var r=n/(t.number-e.number);e.change+=r,t.change-=r,t.shift+=n,t.prelim+=n,t.mod+=n}function Fr(e,t,n){return e._tree.ancestor.parent==t.parent?e._tree.ancestor:n}function Ir(e){return{x:e.x,y:e.y,dx:e.dx,dy:e.dy}}function qr(e,t){var n=e.x+t[3],r=e.y+t[0],i=e.dx-t[1]-t[3],s=e.dy-t[0]-t[2];return i<0&&(n+=i/2,i=0),s<0&&(r+=s/2,s=0),{x:n,y:r,dx:i,dy:s}}function Rr(e,t){function n(e,r){d3.text(e,t,function(e){r(e&&n.parse(e))})}function r(t){return t.map(i).join(e)}function i(e){return o.test(e)?'"'+e.replace(/\"/g,'""')+'"':e}var s=new RegExp("\r\n|["+e+"\r\n]","g"),o=new RegExp('["'+e+"\n]"),u=e.charCodeAt(0);return n.parse=function(e){var t;return n.parseRows(e,function(e,n){if(n){var r={},i=-1,s=t.length;while(++i<s)r[t[i]]=e[i];return r}return t=e,null})},n.parseRows=function(e,t){function n(){if(s.lastIndex>=e.length)return i;if(l)return l=!1,r;var t=s.lastIndex;if(e.charCodeAt(t)===34){var n=t;while(n++<e.length)if(e.charCodeAt(n)===34){if(e.charCodeAt(n+1)!==34)break;n++}s.lastIndex=n+2;var o=e.charCodeAt(n+1);return o===13?(l=!0,e.charCodeAt(n+2)===10&&s.lastIndex++):o===10&&(l=!0),e.substring(t+1,n).replace(/""/g,'"')}var a=s.exec(e);return a?(l=a[0].charCodeAt(0)!==u,e.substring(t,a.index)):(s.lastIndex=e.length,e.substring(t))}var r={},i={},o=[],a=0,f,l;s.lastIndex=0;while((f=n())!==i){var c=[];while(f!==r&&f!==i)c.push(f),f=n();if(t&&!(c=t(c,a++)))continue;o.push(c)}return o},n.format=function(e){return e.map(r).join("\n")},n}function Ur(e,t){return function(n){return n&&e.hasOwnProperty(n.type)?e[n.type](n):t}}function zr(e){return"m0,"+e+"a"+e+","+e+" 0 1,1 0,"+ -2*e+"a"+e+","+e+" 0 1,1 0,"+2*e+"z"}function Wr(e,t){go.hasOwnProperty(e.type)&&go[e.type](e,t)}function Xr(e,t){Wr(e.geometry,t)}function Vr(e,t){for(var n=e.features,r=0,i=n.length;r<i;r++)Wr(n[r].geometry,t)}function $r(e,t){for(var n=e.geometries,r=0,i=n.length;r<i;r++)Wr(n[r],t)}function Jr(e,t){for(var n=e.coordinates,r=0,i=n.length;r<i;r++)t.apply(null,n[r])}function Kr(e,t){for(var n=e.coordinates,r=0,i=n.length;r<i;r++)for(var s=n[r],o=0,u=s.length;o<u;o++)t.apply(null,s[o])}function Qr(e,t){for(var n=e.coordinates,r=0,i=n.length;r<i;r++)for(var s=n[r][0],o=0,u=s.length;o<u;o++)t.apply(null,s[o])}function Gr(e,t){t.apply(null,e.coordinates)}function Yr(e,t){for(var n=e.coordinates[0],r=0,i=n.length;r<i;r++)t.apply(null,n[r])}function Zr(e){return e.source}function ei(e){return e.target}function ti(){function e(e){var t=Math.sin(e*=p)*d,n=Math.sin(p-e)*d,r=n*s+t*c,u=n*o+t*h,a=n*i+t*l;return[Math.atan2(u,r)/mo,Math.atan2(a,Math.sqrt(r*r+u*u))/mo]}var t,n,r,i,s,o,u,a,f,l,c,h,p,d;return e.distance=function(){return p==null&&(d=1/Math.sin(p=Math.acos(Math.max(-1,Math.min(1,i*l+r*f*Math.cos(u-t)))))),p},e.source=function(u){var a=Math.cos(t=u[0]*mo),f=Math.sin(t);return r=Math.cos(n=u[1]*mo),i=Math.sin(n),s=r*a,o=r*f,p=null,e},e.target=function(t){var n=Math.cos(u=t[0]*mo),r=Math.sin(u);return f=Math.cos(a=t[1]*mo),l=Math.sin(a),c=f*n,h=f*r,p=null,e},e}function ni(e,t){var n=ti().source(e).target(t);return n.distance(),n}function ri(e){var t=0,n=0;for(;;){if(e(t,n))return[t,n];t===0?(t=n+1,n=0):(t-=1,n+=1)}}function ii(e,t,n,r){var i,s,o,u,a,f,l;return i=r[e],s=i[0],o=i[1],i=r[t],u=i[0],a=i[1],i=r[n],f=i[0],l=i[1],(l-o)*(u-s)-(a-o)*(f-s)>0}function si(e,t,n){return(n[0]-t[0])*(e[1]-t[1])<(n[1]-t[1])*(e[0]-t[0])}function oi(e,t,n,r){var i=e[0],s=t[0],o=n[0],u=r[0],a=e[1],f=t[1],l=n[1],c=r[1],h=i-o,p=s-i,d=u-o,v=a-l,m=f-a,g=c-l,y=(d*v-g*h)/(g*p-d*m);return[i+y*p,a+y*m]}function ui(e,t){var n={list:e.map(function(e,t){return{index:t,x:e[0],y:e[1]}}).sort(function(e,t){return e.y<t.y?-1:e.y>t.y?1:e.x<t.x?-1:e.x>t.x?1:0}),bottomSite:null},r={list:[],leftEnd:null,rightEnd:null,init:function(){r.leftEnd=r.createHalfEdge(null,"l"),r.rightEnd=r.createHalfEdge(null,"l"),r.leftEnd.r=r.rightEnd,r.rightEnd.l=r.leftEnd,r.list.unshift(r.leftEnd,r.rightEnd)},createHalfEdge:function(e,t){return{edge:e,side:t,vertex:null,l:null,r:null}},insert:function(e,t){t.l=e,t.r=e.r,e.r.l=t,e.r=t},leftBound:function(e){var t=r.leftEnd;do t=t.r;while(t!=r.rightEnd&&i.rightOf(t,e));return t=t.l,t},del:function(e){e.l.r=e.r,e.r.l=e.l,e.edge=null},right:function(e){return e.r},left:function(e){return e.l},leftRegion:function(e){return e.edge==null?n.bottomSite:e.edge.region[e.side]},rightRegion:function(e){return e.edge==null?n.bottomSite:e.edge.region[wo[e.side]]}},i={bisect:function(e,t){var n={region:{l:e,r:t},ep:{l:null,r:null}},r=t.x-e.x,i=t.y-e.y,s=r>0?r:-r,o=i>0?i:-i;return n.c=e.x*r+e.y*i+(r*r+i*i)*.5,s>o?(n.a=1,n.b=i/r,n.c/=r):(n.b=1,n.a=r/i,n.c/=i),n},intersect:function(e,t){var n=e.edge,r=t.edge;if(!n||!r||n.region.r==r.region.r)return null;var i=n.a*r.b-n.b*r.a;if(Math.abs(i)<1e-10)return null;var s=(n.c*r.b-r.c*n.b)/i,o=(r.c*n.a-n.c*r.a)/i,u=n.region.r,a=r.region.r,f,l;u.y<a.y||u.y==a.y&&u.x<a.x?(f=e,l=n):(f=t,l=r);var c=s>=l.region.r.x;return c&&f.side==="l"||!c&&f.side==="r"?null:{x:s,y:o}},rightOf:function(e,t){var n=e.edge,r=n.region.r,i=t.x>r.x;if(i&&e.side==="l")return 1;if(!i&&e.side==="r")return 0;if(n.a===1){var s=t.y-r.y,o=t.x-r.x,u=0,a=0;!i&&n.b<0||i&&n.b>=0?a=u=s>=n.b*o:(a=t.x+t.y*n.b>n.c,n.b<0&&(a=!a),a||(u=1));if(!u){var f=r.x-n.region.l.x;a=n.b*(o*o-s*s)<f*s*(1+2*o/f+n.b*n.b),n.b<0&&(a=!a)}}else{var l=n.c-n.a*t.x,c=t.y-l,h=t.x-r.x,p=l-r.y;a=c*c>h*h+p*p}return e.side==="l"?a:!a},endPoint:function(e,n,r){e.ep[n]=r;if(!e.ep[wo[n]])return;t(e)},distance:function(e,t){var n=e.x-t.x,r=e.y-t.y;return Math.sqrt(n*n+r*r)}},s={list:[],insert:function(e,t,n){e.vertex=t,e.ystar=t.y+n;for(var r=0,i=s.list,o=i.length;r<o;r++){var u=i[r];if(e.ystar>u.ystar||e.ystar==u.ystar&&t.x>u.vertex.x)continue;break}i.splice(r,0,e)},del:function(e){for(var t=0,n=s.list,r=n.length;t<r&&n[t]!=e;++t);n.splice(t,1)},empty:function(){return s.list.length===0},nextEvent:function(e){for(var t=0,n=s.list,r=n.length;t<r;++t)if(n[t]==e)return n[t+1];return null},min:function(){var e=s.list[0];return{x:e.vertex.x,y:e.ystar}},extractMin:function(){return s.list.shift()}};r.init(),n.bottomSite=n.list.shift();var o=n.list.shift(),u,a,f,l,c,h,p,d,v,m,g,y,b;for(;;){s.empty()||(u=s.min());if(o&&(s.empty()||o.y<u.y||o.y==u.y&&o.x<u.x))a=r.leftBound(o),f=r.right(a),p=r.rightRegion(a),y=i.bisect(p,o),h=r.createHalfEdge(y,"l"),r.insert(a,h),m=i.intersect(a,h),m&&(s.del(a),s.insert(a,m,i. -distance(m,o))),a=h,h=r.createHalfEdge(y,"r"),r.insert(a,h),m=i.intersect(h,f),m&&s.insert(h,m,i.distance(m,o)),o=n.list.shift();else{if(!!s.empty())break;a=s.extractMin(),l=r.left(a),f=r.right(a),c=r.right(f),p=r.leftRegion(a),d=r.rightRegion(f),g=a.vertex,i.endPoint(a.edge,a.side,g),i.endPoint(f.edge,f.side,g),r.del(a),s.del(f),r.del(f),b="l",p.y>d.y&&(v=p,p=d,d=v,b="r"),y=i.bisect(p,d),h=r.createHalfEdge(y,b),r.insert(l,h),i.endPoint(y,wo[b],g),m=i.intersect(l,h),m&&(s.del(l),s.insert(l,m,i.distance(m,p))),m=i.intersect(h,c),m&&s.insert(h,m,i.distance(m,p))}}for(a=r.right(r.leftEnd);a!=r.rightEnd;a=r.right(a))t(a.edge)}function ai(){return{leaf:!0,nodes:[],point:null}}function fi(e,t,n,r,i,s){if(!e(t,n,r,i,s)){var o=(n+i)*.5,u=(r+s)*.5,a=t.nodes;a[0]&&fi(e,a[0],n,r,o,u),a[1]&&fi(e,a[1],o,r,i,u),a[2]&&fi(e,a[2],n,u,o,s),a[3]&&fi(e,a[3],o,u,i,s)}}function li(e){return{x:e[0],y:e[1]}}function ci(){this._=new Date(arguments.length>1?Date.UTC.apply(this,arguments):arguments[0])}function hi(e){return e.substring(0,3)}function pi(e,t,n,r){var i,s,o=0,u=t.length,a=n.length;while(o<u){if(r>=a)return-1;i=t.charCodeAt(o++);if(i==37){s=Uo[t.charAt(o++)];if(!s||(r=s(e,n,r))<0)return-1}else if(i!=n.charCodeAt(r++))return-1}return r}function di(e){return new RegExp("^(?:"+e.map(d3.requote).join("|")+")","i")}function vi(e){var t=new r,n=-1,i=e.length;while(++n<i)t.set(e[n].toLowerCase(),n);return t}function mi(e,t,n){Bo.lastIndex=0;var r=Bo.exec(t.substring(n));return r?n+=r[0].length:-1}function gi(e,t,n){Ho.lastIndex=0;var r=Ho.exec(t.substring(n));return r?n+=r[0].length:-1}function yi(e,t,n){Io.lastIndex=0;var r=Io.exec(t.substring(n));return r?(e.m=qo.get(r[0].toLowerCase()),n+=r[0].length):-1}function bi(e,t,n){jo.lastIndex=0;var r=jo.exec(t.substring(n));return r?(e.m=Fo.get(r[0].toLowerCase()),n+=r[0].length):-1}function wi(e,t,n){return pi(e,Ro.c.toString(),t,n)}function Ei(e,t,n){return pi(e,Ro.x.toString(),t,n)}function Si(e,t,n){return pi(e,Ro.X.toString(),t,n)}function xi(e,t,n){zo.lastIndex=0;var r=zo.exec(t.substring(n,n+4));return r?(e.y=+r[0],n+=r[0].length):-1}function Ti(e,t,n){zo.lastIndex=0;var r=zo.exec(t.substring(n,n+2));return r?(e.y=Ni(+r[0]),n+=r[0].length):-1}function Ni(e){return e+(e>68?1900:2e3)}function Ci(e,t,n){zo.lastIndex=0;var r=zo.exec(t.substring(n,n+2));return r?(e.m=r[0]-1,n+=r[0].length):-1}function ki(e,t,n){zo.lastIndex=0;var r=zo.exec(t.substring(n,n+2));return r?(e.d=+r[0],n+=r[0].length):-1}function Li(e,t,n){zo.lastIndex=0;var r=zo.exec(t.substring(n,n+2));return r?(e.H=+r[0],n+=r[0].length):-1}function Ai(e,t,n){zo.lastIndex=0;var r=zo.exec(t.substring(n,n+2));return r?(e.M=+r[0],n+=r[0].length):-1}function Oi(e,t,n){zo.lastIndex=0;var r=zo.exec(t.substring(n,n+2));return r?(e.S=+r[0],n+=r[0].length):-1}function Mi(e,t,n){zo.lastIndex=0;var r=zo.exec(t.substring(n,n+3));return r?(e.L=+r[0],n+=r[0].length):-1}function _i(e,t,n){var r=Wo.get(t.substring(n,n+=2).toLowerCase());return r==null?-1:(e.p=r,n)}function Di(e){var t=e.getTimezoneOffset(),n=t>0?"-":"+",r=~~(Math.abs(t)/60),i=Math.abs(t)%60;return n+Mo(r)+Mo(i)}function Pi(e){return e.toISOString()}function Hi(e,t,n){function r(t){var n=e(t),r=s(n,1);return t-n<r-t?n:r}function i(n){return t(n=e(new Eo(n-1)),1),n}function s(e,n){return t(e=new Eo(+e),n),e}function o(e,r,s){var o=i(e),u=[];if(s>1)while(o<r)n(o)%s||u.push(new Date(+o)),t(o,1);else while(o<r)u.push(new Date(+o)),t(o,1);return u}function u(e,t,n){try{Eo=ci;var r=new ci;return r._=e,o(r,t,n)}finally{Eo=Date}}e.floor=e,e.round=r,e.ceil=i,e.offset=s,e.range=o;var a=e.utc=Bi(e);return a.floor=a,a.round=Bi(r),a.ceil=Bi(i),a.offset=Bi(s),a.range=u,e}function Bi(e){return function(t,n){try{Eo=ci;var r=new ci;return r._=t,e(r,n)._}finally{Eo=Date}}}function ji(e,t,n){function r(t){return e(t)}return r.invert=function(t){return Ii(e.invert(t))},r.domain=function(t){return arguments.length?(e.domain(t),r):e.domain().map(Ii)},r.nice=function(e){return r.domain(Pt(r.domain(),function(){return e}))},r.ticks=function(n,i){var s=Fi(r.domain());if(typeof n!="function"){var o=s[1]-s[0],u=o/n,a=d3.bisect(Vo,u);if(a==Vo.length)return t.year(s,n);if(!a)return e.ticks(n).map(Ii);Math.log(u/Vo[a-1])<Math.log(Vo[a]/u)&&--a,n=t[a],i=n[1],n=n[0].range}return n(s[0],new Date(+s[1]+1),i)},r.tickFormat=function(){return n},r.copy=function(){return ji(e.copy(),t,n)},d3.rebind(r,e,"range","rangeRound","interpolate","clamp")}function Fi(e){var t=e[0],n=e[e.length-1];return t<n?[t,n]:[n,t]}function Ii(e){return new Date(e)}function qi(e){return function(t){var n=e.length-1,r=e[n];while(!r[1](t))r=e[--n];return r[0](t)}}function Ri(e){var t=new Date(e,0,1);return t.setFullYear(e),t}function Ui(e){var t=e.getFullYear(),n=Ri(t),r=Ri(t+1);return t+(e-n)/(r-n)}function zi(e){var t=new Date(Date.UTC(e,0,1));return t.setUTCFullYear(e),t}function Wi(e){var t=e.getUTCFullYear(),n=zi(t),r=zi(t+1);return t+(e-n)/(r-n)}Date.now||(Date.now=function(){return+(new Date)});try{document.createElement("div").style.setProperty("opacity",0,"")}catch(Xi){var Vi=CSSStyleDeclaration.prototype,$i=Vi.setProperty;Vi.setProperty=function(e,t,n){$i.call(this,e,t+"",n)}}d3={version:"2.10.3"};var Ji=n;try{Ji(document.documentElement.childNodes)[0].nodeType}catch(Ki){Ji=t}var Qi=[].__proto__?function(e,t){e.__proto__=t}:function(e,t){for(var n in t)e[n]=t[n]};d3.map=function(e){var t=new r;for(var n in e)t.set(n,e[n]);return t},e(r,{has:function(e){return Gi+e in this},get:function(e){return this[Gi+e]},set:function(e,t){return this[Gi+e]=t},remove:function(e){return e=Gi+e,e in this&&delete this[e]},keys:function(){var e=[];return this.forEach(function(t){e.push(t)}),e},values:function(){var e=[];return this.forEach(function(t,n){e.push(n)}),e},entries:function(){var e=[];return this.forEach(function(t,n){e.push({key:t,value:n})}),e},forEach:function(e){for(var t in this)t.charCodeAt(0)===Yi&&e.call(this,t.substring(1),this[t])}});var Gi="\0",Yi=Gi.charCodeAt(0);d3.functor=u,d3.rebind=function(e,t){var n=1,r=arguments.length,i;while(++n<r)e[i=arguments[n]]=a(e,t,t[i]);return e},d3.ascending=function(e,t){return e<t?-1:e>t?1:e>=t?0:NaN},d3.descending=function(e,t){return t<e?-1:t>e?1:t>=e?0:NaN},d3.mean=function(e,t){var n=e.length,r,i=0,s=-1,o=0;if(arguments.length===1)while(++s<n)f(r=e[s])&&(i+=(r-i)/++o);else while(++s<n)f(r=t.call(e,e[s],s))&&(i+=(r-i)/++o);return o?i:undefined},d3.median=function(e,t){return arguments.length>1&&(e=e.map(t)),e=e.filter(f),e.length?d3.quantile(e.sort(d3.ascending),.5):undefined},d3.min=function(e,t){var n=-1,r=e.length,i,s;if(arguments.length===1){while(++n<r&&((i=e[n])==null||i!=i))i=undefined;while(++n<r)(s=e[n])!=null&&i>s&&(i=s)}else{while(++n<r&&((i=t.call(e,e[n],n))==null||i!=i))i=undefined;while(++n<r)(s=t.call(e,e[n],n))!=null&&i>s&&(i=s)}return i},d3.max=function(e,t){var n=-1,r=e.length,i,s;if(arguments.length===1){while(++n<r&&((i=e[n])==null||i!=i))i=undefined;while(++n<r)(s=e[n])!=null&&s>i&&(i=s)}else{while(++n<r&&((i=t.call(e,e[n],n))==null||i!=i))i=undefined;while(++n<r)(s=t.call(e,e[n],n))!=null&&s>i&&(i=s)}return i},d3.extent=function(e,t){var n=-1,r=e.length,i,s,o;if(arguments.length===1){while(++n<r&&((i=o=e[n])==null||i!=i))i=o=undefined;while(++n<r)(s=e[n])!=null&&(i>s&&(i=s),o<s&&(o=s))}else{while(++n<r&&((i=o=t.call(e,e[n],n))==null||i!=i))i=undefined;while(++n<r)(s=t.call(e,e[n],n))!=null&&(i>s&&(i=s),o<s&&(o=s))}return[i,o]},d3.random={normal:function(e,t){var n=arguments.length;return n<2&&(t=1),n<1&&(e=0),function(){var n,r,i;do n=Math.random()*2-1,r=Math.random()*2-1,i=n*n+r*r;while(!i||i>1);return e+t*n*Math.sqrt(-2*Math.log(i)/i)}},logNormal:function(e,t){var n=arguments.length;n<2&&(t=1),n<1&&(e=0);var r=d3.random.normal();return function(){return Math.exp(e+t*r())}},irwinHall:function(e){return function(){for(var t=0,n=0;n<e;n++)t+=Math.random();return t/e}}},d3.sum=function(e,t){var n=0,r=e.length,i,s=-1;if(arguments.length===1)while(++s<r)isNaN(i=+e[s])||(n+=i);else while(++s<r)isNaN(i=+t.call(e,e[s],s))||(n+=i);return n},d3.quantile=function(e,t){var n=(e.length-1)*t+1,r=Math.floor(n),i=e[r-1],s=n-r;return s?i+s*(e[r]-i):i},d3.transpose=function(e){return d3.zip.apply(d3,e)},d3.zip=function(){if(!(i=arguments.length))return[];for(var e=-1,t=d3.min(arguments,l),n=new Array(t);++e<t;)for(var r=-1,i,s=n[e]=new Array(i);++r<i;)s[r]=arguments[r][e];return n},d3.bisector=function(e){return{left:function(t,n,r,i){arguments.length<3&&(r=0),arguments.length<4&&(i=t.length);while(r<i){var s=r+i>>>1;e.call(t,t[s],s)<n?r=s+1:i=s}return r},right:function(t,n,r,i){arguments.length<3&&(r=0),arguments.length<4&&(i=t.length);while(r<i){var s=r+i>>>1;n<e.call(t,t[s],s)?i=s:r=s+1}return r}}};var Zi=d3.bisector(function(e){return e});d3.bisectLeft=Zi.left,d3.bisect=d3.bisectRight=Zi.right,d3.first=function(e,t){var n=0,r=e.length,i=e[0],s;arguments.length===1&&(t=d3.ascending);while(++n<r)t.call(e,i,s=e[n])>0&&(i=s);return i},d3.last=function(e,t){var n=0,r=e.length,i=e[0],s;arguments.length===1&&(t=d3.ascending);while(++n<r)t.call(e,i,s=e[n])<=0&&(i=s);return i},d3.nest=function(){function e(t,s){if(s>=i.length)return u?u.call(n,t):o?t.sort(o):t;var a=-1,f=t.length,l=i[s++],c,h,p=new r,d,v={};while(++a<f)(d=p.get(c=l(h=t[a])))?d.push(h):p.set(c,[h]);return p.forEach(function(t,n){v[t]=e(n,s)}),v}function t(e,n){if(n>=i.length)return e;var r=[],o=s[n++],u;for(u in e)r.push({key:u,values:t(e[u],n)});return o&&r.sort(function(e,t){return o(e.key,t.key)}),r}var n={},i=[],s=[],o,u;return n.map=function(t){return e(t,0)},n.entries=function(n){return t(e(n,0),0)},n.key=function(e){return i.push(e),n},n.sortKeys=function(e){return s[i.length-1]=e,n},n.sortValues=function(e){return o=e,n},n.rollup=function(e){return u=e,n},n},d3.keys=function(e){var t=[];for(var n in e)t.push(n);return t},d3.values=function(e){var t=[];for(var n in e)t.push(e[n]);return t},d3.entries=function(e){var t=[];for(var n in e)t.push({key:n,value:e[n]});return t},d3.permute=function(e,t){var n=[],r=-1,i=t.length;while(++r<i)n[r]=e[t[r]];return n},d3.merge=function(e){return Array.prototype.concat.apply([],e)},d3.split=function(e,t){var n=[],r=[],i,s=-1,o=e.length;arguments.length<2&&(t=c);while(++s<o)t.call(r,i=e[s],s)?r=[]:(r.length||n.push(r),r.push(i));return n},d3.range=function(e,t,n){arguments.length<3&&(n=1,arguments.length<2&&(t=e,e=0));if((t-e)/n===Infinity)throw new Error("infinite range");var r=[],i=p(Math.abs(n)),s=-1,o;e*=i,t*=i,n*=i;if(n<0)while((o=e+n*++s)>t)r.push(o/i);else while((o=e+n*++s)<t)r.push(o/i);return r},d3.requote=function(e){return e.replace(es,"\\$&")};var es=/[\\\^\$\*\+\?\|\[\]\(\)\.\{\}]/g;d3.round=function(e,t){return t?Math.round(e*(t=Math.pow(10,t)))/t:Math.round(e)},d3.xhr=function(e,t,n){var r=new XMLHttpRequest;arguments.length<3?(n=t,t=null):t&&r.overrideMimeType&&r.overrideMimeType(t),r.open("GET",e,!0),t&&r.setRequestHeader("Accept",t),r.onreadystatechange=function(){if(r.readyState===4){var e=r.status;n(!e&&r.response||e>=200&&e<300||e===304?r:null)}},r.send(null)},d3.text=function(e,t,n){function r(e){n(e&&e.responseText)}arguments.length<3&&(n=t,t=null),d3.xhr(e,t,r)},d3.json=function(e,t){d3.text(e,"application/json",function(e){t(e?JSON.parse(e):null)})},d3.html=function(e,t){d3.text(e,"text/html",function(e){if(e!=null){var n=document.createRange();n.selectNode(document.body),e=n.createContextualFragment(e)}t(e)})},d3.xml=function(e,t,n){function r(e){n(e&&e.responseXML)}arguments.length<3&&(n=t,t=null),d3.xhr(e,t,r)};var ts={svg:"http://www.w3.org/2000/svg",xhtml:"http://www.w3.org/1999/xhtml",xlink:"http://www.w3.org/1999/xlink",xml:"http://www.w3.org/XML/1998/namespace",xmlns:"http://www.w3.org/2000/xmlns/"};d3.ns={prefix:ts,qualify:function(e){var t=e.indexOf(":"),n=e;return t>=0&&(n=e.substring(0,t),e=e.substring(t+1)),ts.hasOwnProperty(n)?{space:ts[n],local:e}:e}},d3.dispatch=function(){var e=new d,t=-1,n=arguments.length;while(++t<n)e[arguments[t]]=v(e);return e},d.prototype.on=function(e,t){var n=e.indexOf("."),r="";return n>0&&(r=e.substring(n+1),e=e.substring(0,n)),arguments.length<2?this[e].on(r):this[e].on(r,t)},d3.format=function(e){var t=ns.exec(e),n=t[1]||" ",r=t[3]||"",i=t[5],s=+t[6],o=t[7],u=t[8],a=t[9],f=1,l="",c=!1;u&&(u=+u.substring(1)),i&&(n="0",o&&(s-=Math.floor((s-1)/4)));switch(a){case"n":o=!0,a="g";break;case"%":f=100,l="%",a="f";break;case"p":f=100,l="%",a="r";break;case"d":c=!0,u=0;break;case"s":f=-1,a="r"}return a=="r"&&!u&&(a="g"),a=rs.get(a)||g,function(e){if(c&&e%1)return"";var t=e<0&&(e=-e)?"-":r;if(f<0){var h=d3.formatPrefix(e,u);e=h.scale(e),l=h.symbol}else e*=f;e=a(e,u);if(i){var p=e.length+t.length;p<s&&(e=(new Array(s-p+1)).join(n)+e),o&&(e=y(e)),e=t+e}else{o&&(e=y(e)),e=t+e;var p=e.length;p<s&&(e=(new Array(s-p+1)).join(n)+e)}return e+l}};var ns=/(?:([^{])?([<>=^]))?([+\- ])?(#)?(0)?([0-9]+)?(,)?(\.[0-9]+)?([a-zA-Z%])?/,rs=d3.map({g:function(e,t){return e.toPrecision(t)},e:function(e,t){return e.toExponential(t)},f:function(e,t){return e.toFixed(t)},r:function(e,t){return d3.round(e,t=m(e,t)).toFixed(Math.max(0,Math.min(20,t)))}}),is=["y","z","a","f","p","n","μ","m","","k","M","G","T","P","E","Z","Y"].map(b);d3.formatPrefix=function(e,t){var n=0;return e&&(e<0&&(e*=-1),t&&(e=d3.round(e,m(e,t))),n=1+Math.floor(1e-12+Math.log(e)/Math.LN10),n=Math.max(-24,Math.min(24,Math.floor((n<=0?n+1:n-1)/3)*3))),is[8+n/3]};var ss=T(2),os=T(3),us=function(){return x},as=d3.map({linear:us,poly:T,quad:function(){return ss},cubic:function(){return os},sin:function(){return N},exp:function(){return C},circle:function(){return k},elastic:L,back:A,bounce:function(){return O}}),fs=d3.map({"in":x,out:E,"in-out":S,"out-in":function(e){return S(E(e))}});d3.ease=function(e){var t=e.indexOf("-"),n=t>=0?e.substring(0,t):e,r=t>=0?e.substring(t+1):"in";return n=as.get(n)||us,r=fs.get(r)||x,w(r(n.apply(null,Array.prototype.slice.call(arguments,1))))},d3.event=null,d3.transform=function(e){var t=document.createElementNS(d3.ns.prefix.svg,"g");return(d3.transform=function(e){t.setAttribute("transform",e);var n=t.transform.baseVal.consolidate();return new P(n?n.matrix:cs)})(e)},P.prototype.toString=function(){return"translate("+this.translate+")rotate("+this.rotate+")skewX("+this.skew+")scale("+this.scale+")"};var ls=180/Math.PI,cs={a:1,b:0,c:0,d:1,e:0,f:0};d3.interpolate=function(e,t){var n=d3.interpolators.length,r;while(--n>=0&&!(r=d3.interpolators[n](e,t)));return r},d3.interpolateNumber=function(e,t){return t-=e,function(n){return e+t*n}},d3.interpolateRound=function(e,t){return t-=e,function(n){return Math.round(e+t*n)}},d3.interpolateString=function(e,t){var n,r,i,s=0,o=0,u=[],a=[],f,l;hs.lastIndex=0;for(r=0;n=hs.exec(t);++r)n.index&&u.push(t.substring(s,o=n.index)),a.push({i:u.length,x:n[0]}),u.push(null),s=hs.lastIndex;s<t.length&&u.push(t.substring(s));for(r=0,f=a.length;(n=hs.exec(e))&&r<f;++r){l=a[r];if(l.x==n[0]){if(l.i)if(u[l.i+1]==null){u[l.i-1]+=l.x,u.splice(l.i,1);for(i=r+1;i<f;++i)a[i].i--}else{u[l.i-1]+=l.x+u[l.i+1],u.splice(l.i,2);for(i=r+1;i<f;++i)a[i].i-=2}else if(u[l.i+1]==null)u[l.i]=l.x;else{u[l.i]=l.x+u[l.i+1],u.splice(l.i+1,1);for(i=r+1;i<f;++i)a[i].i--}a.splice(r,1),f--,r--}else l.x=d3.interpolateNumber(parseFloat(n[0]),parseFloat(l.x))}while(r<f)l=a.pop(),u[l.i+1]==null?u[l.i]=l.x:(u[l.i]=l.x+u[l.i+1],u.splice(l.i+1,1)),f--;return u.length===1?u[0]==null?a[0].x:function(){return t}:function(e){for(r=0;r<f;++r)u[(l=a[r]).i]=l.x(e);return u.join("")}},d3.interpolateTransform=function(e,t){var n=[],r=[],i,s=d3.transform(e),o=d3.transform(t),u=s.translate,a=o.translate,f=s.rotate,l=o.rotate,c=s.skew,h=o.skew,p=s.scale,d=o.scale;return u[0]!=a[0]||u[1]!=a[1]?(n.push("translate(",null,",",null,")"),r.push({i:1,x:d3.interpolateNumber(u[0],a[0])},{i:3,x:d3.interpolateNumber(u[1],a[1])})):a[0]||a[1]?n.push("translate("+a+")"):n.push(""),f!=l?(f-l>180?l+=360:l-f>180&&(f+=360),r.push({i:n.push(n.pop()+"rotate(",null,")")-2,x:d3.interpolateNumber(f,l)})):l&&n.push(n.pop()+"rotate("+l+")"),c!=h?r.push({i:n.push(n.pop()+"skewX(",null,")")-2,x:d3.interpolateNumber(c,h)}):h&&n.push(n.pop()+"skewX("+h+")"),p[0]!=d[0]||p[1]!=d[1]?(i=n.push(n.pop()+"scale(",null,",",null,")"),r.push({i:i-4,x:d3.interpolateNumber(p[0],d[0])},{i:i-2,x:d3.interpolateNumber(p[1],d[1])})):(d[0]!=1||d[1]!=1)&&n.push(n.pop()+"scale("+d+")"),i=r.length,function(e){var t=-1,s;while(++t<i)n[(s=r[t]).i]=s.x(e);return n.join("")}},d3.interpolateRgb=function(e,t){e=d3.rgb(e),t=d3.rgb(t);var n=e.r,r=e.g,i=e.b,s=t.r-n,o=t.g-r,u=t.b-i;return function(e){return"#"+W(Math.round(n+s*e))+W(Math.round(r+o*e))+W(Math.round(i+u*e))}},d3.interpolateHsl=function(e,t){e=d3.hsl(e),t=d3.hsl(t);var n=e.h,r=e.s,i=e.l,s=t.h-n,o=t.s-r,u=t.l-i;return s>180?s-=360:s<-180&&(s+=360),function(e){return Y(n+s*e,r+o*e,i+u*e)+""}},d3.interpolateLab=function(e,t){e=d3.lab(e),t=d3.lab(t);var n=e.l,r=e.a,i=e.b,s=t.l-n,o=t.a-r,u=t.b-i;return function(e){return it(n+s*e,r+o*e,i+u*e)+""}},d3.interpolateHcl=function(e,t){e=d3.hcl(e),t=d3.hcl(t);var n=e.h,r=e.c,i=e.l,s=t.h-n,o=t.c-r,u=t.l-i;return s>180?s-=360:s<-180&&(s+=360),function(e){return tt(n+s*e,r+o*e,i+u*e)+""}},d3.interpolateArray=function(e,t){var n=[],r=[],i=e.length,s=t.length,o=Math.min(e.length,t.length),u;for(u=0;u<o;++u)n.push(d3.interpolate(e[u],t[u]));for(;u<i;++u)r[u]=e[u];for(;u<s;++u)r[u]=t[u];return function(e){for(u=0;u<o;++u)r[u]=n[u](e);return r}},d3.interpolateObject=function(e,t){var n={},r={},i;for(i in e)i in t?n[i]=F(i)(e[i],t[i]):r[i]=e[i];for(i in t)i in e||(r[i]=t[i]);return function(e){for(i in n)r[i]=n[i](e);return r}};var hs=/[-+]?(?:\d+\.?\d*|\.?\d+)(?:[eE][-+]?\d+)?/g;d3.interpolators=[d3.interpolateObject,function(e,t){return t instanceof Array&&d3.interpolateArray(e,t)},function(e,t){return(typeof e=="string"||typeof t=="string")&&d3.interpolateString(e+"",t+"")},function(e,t){return(typeof t=="string"?ds.has(t)||/^(#|rgb\(|hsl\()/.test(t):t instanceof R)&&d3.interpolateRgb(e,t)},function(e,t){return!isNaN(e=+e)&&!isNaN(t=+t)&&d3.interpolateNumber(e,t)}],R.prototype.toString=function(){return this.rgb()+""},d3.rgb=function(e,t,n){return arguments.length===1?e instanceof z?U(e.r,e.g,e.b):X(""+e,U,Y):U(~~e,~~t,~~n)};var ps=z.prototype=new R;ps.brighter=function(e){e=Math.pow(.7,arguments.length?e:1);var t=this.r,n=this.g,r=this.b,i=30;return!t&&!n&&!r?U(i,i,i):(t&&t<i&&(t=i),n&&n<i&&(n=i),r&&r<i&&(r=i),U(Math.min(255,Math.floor(t/e)),Math.min(255,Math.floor(n/e)),Math.min(255,Math.floor(r/e))))},ps.darker=function(e){return e=Math.pow(.7,arguments.length?e:1),U(Math.floor(e*this.r),Math.floor(e*this.g),Math.floor(e*this.b))},ps.hsl=function(){return V(this.r,this.g,this.b)},ps.toString=function(){return"#"+W(this.r)+W(this.g)+W(this.b)};var ds=d3.map({aliceblue:"#f0f8ff",antiquewhite:"#faebd7",aqua:"#00ffff",aquamarine:"#7fffd4",azure:"#f0ffff",beige:"#f5f5dc",bisque:"#ffe4c4",black:"#000000",blanchedalmond:"#ffebcd",blue:"#0000ff",blueviolet:"#8a2be2",brown:"#a52a2a",burlywood:"#deb887",cadetblue:"#5f9ea0",chartreuse:"#7fff00",chocolate:"#d2691e",coral:"#ff7f50",cornflowerblue:"#6495ed",cornsilk:"#fff8dc",crimson:"#dc143c",cyan:"#00ffff",darkblue:"#00008b",darkcyan:"#008b8b",darkgoldenrod:"#b8860b",darkgray:"#a9a9a9",darkgreen:"#006400",darkgrey:"#a9a9a9",darkkhaki:"#bdb76b",darkmagenta:"#8b008b",darkolivegreen:"#556b2f",darkorange:"#ff8c00",darkorchid:"#9932cc",darkred:"#8b0000",darksalmon:"#e9967a",darkseagreen:"#8fbc8f",darkslateblue:"#483d8b",darkslategray:"#2f4f4f",darkslategrey:"#2f4f4f",darkturquoise:"#00ced1",darkviolet:"#9400d3",deeppink:"#ff1493",deepskyblue:"#00bfff",dimgray:"#696969",dimgrey:"#696969",dodgerblue:"#1e90ff",firebrick:"#b22222",floralwhite:"#fffaf0",forestgreen:"#228b22",fuchsia:"#ff00ff",gainsboro:"#dcdcdc",ghostwhite:"#f8f8ff",gold:"#ffd700",goldenrod:"#daa520",gray:"#808080",green:"#008000",greenyellow:"#adff2f",grey:"#808080",honeydew:"#f0fff0",hotpink:"#ff69b4",indianred:"#cd5c5c",indigo:"#4b0082",ivory:"#fffff0",khaki:"#f0e68c",lavender:"#e6e6fa",lavenderblush:"#fff0f5",lawngreen:"#7cfc00",lemonchiffon:"#fffacd",lightblue:"#add8e6",lightcoral:"#f08080",lightcyan:"#e0ffff",lightgoldenrodyellow:"#fafad2",lightgray:"#d3d3d3",lightgreen:"#90ee90",lightgrey:"#d3d3d3",lightpink:"#ffb6c1",lightsalmon:"#ffa07a",lightseagreen:"#20b2aa",lightskyblue:"#87cefa",lightslategray:"#778899",lightslategrey:"#778899",lightsteelblue:"#b0c4de",lightyellow:"#ffffe0",lime:"#00ff00",limegreen:"#32cd32",linen:"#faf0e6",magenta:"#ff00ff",maroon:"#800000",mediumaquamarine:"#66cdaa",mediumblue:"#0000cd",mediumorchid:"#ba55d3",mediumpurple:"#9370db",mediumseagreen:"#3cb371",mediumslateblue:"#7b68ee",mediumspringgreen:"#00fa9a",mediumturquoise:"#48d1cc",mediumvioletred:"#c71585",midnightblue:"#191970",mintcream:"#f5fffa",mistyrose:"#ffe4e1",moccasin:"#ffe4b5",navajowhite:"#ffdead",navy:"#000080",oldlace:"#fdf5e6",olive:"#808000",olivedrab:"#6b8e23",orange:"#ffa500",orangered:"#ff4500",orchid:"#da70d6",palegoldenrod:"#eee8aa",palegreen:"#98fb98",paleturquoise:"#afeeee",palevioletred:"#db7093",papayawhip:"#ffefd5",peachpuff:"#ffdab9",peru:"#cd853f",pink:"#ffc0cb",plum:"#dda0dd",powderblue:"#b0e0e6",purple:"#800080",red:"#ff0000",rosybrown:"#bc8f8f",royalblue:"#4169e1",saddlebrown:"#8b4513",salmon:"#fa8072",sandybrown:"#f4a460",seagreen:"#2e8b57",seashell:"#fff5ee",sienna:"#a0522d",silver:"#c0c0c0",skyblue:"#87ceeb",slateblue:"#6a5acd",slategray:"#708090",slategrey:"#708090",snow:"#fffafa",springgreen:"#00ff7f",steelblue:"#4682b4",tan:"#d2b48c",teal:"#008080",thistle:"#d8bfd8",tomato:"#ff6347",turquoise:"#40e0d0",violet:"#ee82ee",wheat:"#f5deb3",white:"#ffffff",whitesmoke:"#f5f5f5",yellow:"#ffff00",yellowgreen:"#9acd32"});ds.forEach(function(e,t){ds.set(e,X(t,U,Y))}),d3.hsl=function(e,t,n){return arguments.length===1?e instanceof G?Q(e.h,e.s,e.l):X(""+e,V,Q):Q(+e,+t,+n)};var vs=G.prototype=new R;vs.brighter=function(e){return e=Math.pow(.7,arguments.length?e:1),Q(this.h,this.s,this.l/e)},vs.darker=function(e){return e=Math.pow(.7,arguments.length?e:1),Q(this.h,this.s,e*this.l)},vs.rgb=function(){return Y(this.h,this.s,this.l)},d3.hcl=function(e,t,n){return arguments.length===1?e instanceof et?Z(e.h,e.c,e.l):e instanceof rt?st(e.l,e.a,e.b):st((e=$((e=d3.rgb(e)).r,e.g,e.b)).l,e.a,e.b):Z(+e,+t,+n)};var ms=et.prototype=new R;ms.brighter=function(e){return Z(this.h,this.c,Math.min(100,this.l+gs*(arguments.length?e:1)))},ms.darker=function(e){return Z(this.h,this.c,Math.max(0,this.l-gs*(arguments.length?e:1)))},ms.rgb=function(){return tt(this.h,this.c,this.l).rgb()},d3.lab=function(e,t,n){return arguments.length===1?e instanceof rt?nt(e.l,e.a,e.b):e instanceof et?tt(e.l,e.c,e.h):$((e=d3.rgb(e)).r,e.g,e.b):nt(+e,+t,+n)};var gs=18,ys=.95047,bs=1,ws=1.08883,Es=rt.prototype=new R;Es.brighter=function(e){return nt(Math.min(100,this.l+gs*(arguments.length?e:1)),this.a,this.b)},Es.darker=function(e){return nt(Math.max(0,this.l-gs*(arguments.length?e:1)),this.a,this.b)},Es.rgb=function(){return it(this.l,this.a,this.b)};var Ss=function(e,t){return t.querySelector(e)},xs=function(e,t){return t.querySelectorAll(e)},Ts=document.documentElement,Ns=Ts.matchesSelector||Ts.webkitMatchesSelector||Ts.mozMatchesSelector||Ts.msMatchesSelector||Ts.oMatchesSelector,Cs=function(e,t){return Ns.call(e,t)};typeof Sizzle=="function"&&(Ss=function(e,t){return Sizzle(e,t)[0]||null},xs=function(e,t){return Sizzle.uniqueSort(Sizzle(e,t))},Cs=Sizzle.matchesSelector);var ks=[];d3.selection=function(){return Ls},d3.selection.prototype=ks,ks.select=function(e){var t=[],n,r,i,s;typeof e!="function"&&(e=lt(e));for(var o=-1,u=this.length;++o<u;){t.push(n=[]),n.parentNode=(i=this[o]).parentNode;for(var a=-1,f=i.length;++a<f;)(s=i[a])?(n.push(r=e.call(s,s.__data__,a)),r&&"__data__"in s&&(r.__data__=s.__data__)):n.push(null)}return ft(t)},ks.selectAll=function(e){var t=[],n,r;typeof e!="function"&&(e=ct(e));for(var i=-1,s=this.length;++i<s;)for(var o=this[i],u=-1,a=o.length;++u<a;)if(r=o[u])t.push(n=Ji(e.call(r,r.__data__,u))),n.parentNode=r;return ft(t)},ks.attr=function(e,t){if(arguments.length<2){if(typeof e=="string"){var n=this.node();return e=d3.ns.qualify(e),e.local?n.getAttributeNS(e.space,e.local):n.getAttribute(e)}for(t in e)this.each(ht(t,e[t]));return this}return this.each(ht(e,t))},ks.classed=function(e,t){if(arguments.length<2){if(typeof e=="string"){var n=this.node(),r=(e=e.trim().split(/^|\s+/g)).length,i=-1;if(t=n.classList){while(++i<r)if(!t.contains(e[i]))return!1}else{t=n.className,t.baseVal!=null&&(t=t.baseVal);while(++i<r)if(!pt(e[i]).test(t))return!1}return!0}for(t in e)this.each(dt(t,e[t]));return this}return this.each(dt(e,t))},ks.style=function(e,t,n){var r=arguments.length;if(r<3){if(typeof e!="string"){r<2&&(t="");for(n in e)this.each(mt(n,e[n],t));return this}if(r<2)return window.getComputedStyle(this.node(),null).getPropertyValue(e);n=""}return this.each(mt(e,t,n))},ks.property=function(e,t){if(arguments.length<2){if(typeof e=="string")return this.node()[e];for(t in e)this.each(gt(t,e[t]));return this}return this.each(gt(e,t))},ks.text=function(e){return arguments.length<1?this.node().textContent:this.each(typeof e=="function"?function(){var t=e.apply(this,arguments);this.textContent=t==null?"":t}:e==null?function(){this.textContent=""}:function(){this.textContent=e})},ks.html=function(e){return arguments.length<1?this.node().innerHTML:this.each(typeof e=="function"?function(){var t=e.apply(this,arguments);this.innerHTML=t==null?"":t}:e==null?function(){this.innerHTML=""}:function(){this.innerHTML=e})},ks.append=function(e){function t(){return this.appendChild(document.createElementNS(this.namespaceURI,e))}function n(){return this.appendChild(document.createElementNS(e.space,e.local))}return e=d3.ns.qualify(e),this.select(e.local?n:t)},ks.insert=function(e,t){function n(){return this.insertBefore(document.createElementNS(this.namespaceURI,e),Ss(t,this))}function r(){return this.insertBefore(document.createElementNS(e.space,e.local),Ss(t,this))}return e=d3.ns.qualify(e),this.select(e.local?r:n)},ks.remove=function(){return this.each(function(){var e=this.parentNode;e&&e.removeChild(this)})},ks.data=function(e,t){function n(e,n){var i,s=e.length,o=n.length,u=Math.min(s,o),c=Math.max(s,o),h=[],p=[],d=[],v,m;if(t){var g=new r,y=[],b,w=n.length;for(i=-1;++i<s;)b=t.call(v=e[i],v.__data__,i),g.has(b)?d[w++]=v:g.set(b,v),y.push(b);for(i=-1;++i<o;)b=t.call(n,m=n[i],i),g.has(b)?(h[i]=v=g.get(b),v.__data__=m,p[i]=d[i]=null):(p[i]=yt(m),h[i]=d[i]=null),g.remove(b);for(i=-1;++i<s;)g.has(y[i])&&(d[i]=e[i])}else{for(i=-1;++i<u;)v=e[i],m=n[i],v?(v.__data__=m,h[i]=v,p[i]=d[i]=null):(p[i]=yt(m),h[i]=d[i]=null);for(;i<o;++i)p[i]=yt(n[i]),h[i]=d[i]=null;for(;i<c;++i)d[i]=e[i],p[i]=h[i]=null}p.update=h,p.parentNode=h.parentNode=d.parentNode=e.parentNode,a.push(p),f.push(h),l.push(d)}var i=-1,s=this.length,o,u;if(!arguments.length){e=new Array(s=(o=this[0]).length);while(++i<s)if(u=o[i])e[i]=u.__data__;return e}var a=xt([]),f=ft([]),l=ft([]);if(typeof e=="function")while(++i<s)n(o=this[i],e.call(o,o.parentNode.__data__,i));else while(++i<s)n(o=this[i],e);return f.enter=function(){return a},f.exit=function(){return l},f},ks.datum=ks.map=function(e){return arguments.length<1?this.property("__data__"):this.property("__data__",e)},ks.filter=function(e){var t=[],n,r,i;typeof e!="function"&&(e=bt(e));for(var s=0,o=this.length;s<o;s++){t.push(n=[]),n.parentNode=(r=this[s]).parentNode;for(var u=0,a=r.length;u<a;u++)(i=r[u])&&e.call(i,i.__data__,u)&&n.push(i)}return ft(t)},ks.order=function(){for(var e=-1,t=this.length;++e<t;)for(var n=this[e],r=n.length-1,i=n[r],s;--r>=0;)if(s=n[r])i&&i!==s.nextSibling&&i.parentNode.insertBefore(s,i),i=s;return this},ks.sort=function(e){e=wt.apply(this,arguments);for(var t=-1,n=this.length;++t<n;)this[t].sort(e);return this.order()},ks.on=function(e,t,n){var r=arguments.length;if(r<3){if(typeof e!="string"){r<2&&(t=!1);for(n in e)this.each(Et(n,e[n],t));return this}if(r<2)return(r=this.node()["__on"+e])&&r._;n=!1}return this.each(Et(e,t,n))},ks.each=function(e){return St(this,function(t,n,r){e.call(t,t.__data__,n,r)})},ks.call=function(e){return e.apply(this,(arguments[0]=this,arguments)),this},ks.empty=function(){return!this.node()},ks.node=function(e){for(var t=0,n=this.length;t<n;t++)for(var r=this[t],i=0,s=r.length;i<s;i++){var o=r[i];if(o)return o}return null},ks.transition=function(){var e=[],t,n;for(var r=-1,i=this.length;++r<i;){e.push(t=[]);for(var s=this[r],o=-1,u=s.length;++o<u;)t.push((n=s[o])?{node:n,delay:Bs,duration:js}:null)}return Tt(e,_s||++Ms,Date.now())};var Ls=ft([[document]]);Ls[0].parentNode=Ts,d3.select=function(e){return typeof e=="string"?Ls.select(e):ft([[e]])},d3.selectAll=function(e){return typeof e=="string"?Ls.selectAll(e):ft([Ji(e)])};var As=[];d3.selection.enter=xt,d3.selection.enter.prototype=As,As.append=ks.append,As.insert=ks.insert,As.empty=ks.empty,As.node=ks.node,As.select=function(e){var t=[],n,r,i,s,o;for(var u=-1,a=this.length;++u<a;){i=(s=this[u]).update,t.push(n=[]),n.parentNode=s.parentNode;for(var f=-1,l=s.length;++f<l;)(o=s[f])?(n.push(i[f]=r=e.call(s.parentNode,o.__data__,f)),r.__data__=o.__data__):n.push(null)}return ft(t)};var Os=[],Ms=0,_s=0,Ds=0,Ps=250,Hs=d3.ease("cubic-in-out"),Bs=Ds,js=Ps,Fs=Hs;Os.call=ks.call,d3.transition=function(e){return arguments.length?_s?e.transition():e:Ls.transition()},d3.transition.prototype=Os,Os.select=function(e){var t=[],n,r,i;typeof e!="function"&&(e=lt(e));for(var s=-1,o=this.length;++s<o;){t.push(n=[]);for(var u=this[s],a=-1,f=u.length;++a<f;)(i=u[a])&&(r=e.call(i.node,i.node.__data__,a))?("__data__"in i.node&&(r.__data__=i.node.__data__),n.push({node:r,delay:i.delay,duration:i.duration})):n.push(null)}return Tt(t,this.id,this.time).ease(this.ease())},Os.selectAll=function(e){var t=[],n,r,i;typeof e!="function"&&(e=ct(e));for(var s=-1,o=this.length;++s<o;)for(var u=this[s],a=-1,f=u.length;++a<f;)if(i=u[a]){r=e.call(i.node,i.node.__data__,a),t.push(n=[]);for(var l=-1,c=r.length;++l<c;)n.push({node:r[l],delay:i.delay,duration:i.duration})}return Tt(t,this.id,this.time).ease(this.ease())},Os.filter=function(e){var t=[],n,r,i;typeof e!="function"&&(e=bt(e));for(var s=0,o=this.length;s<o;s++){t.push(n=[]);for(var r=this[s],u=0,a=r.length;u<a;u++)(i=r[u])&&e.call(i.node,i.node.__data__,u)&&n.push(i)}return Tt(t,this.id,this.time).ease(this.ease())},Os.attr=function(e,t){if(arguments.length<2){for(t in e)this.attrTween(t,kt(e[t],t));return this}return this.attrTween(e,kt(t,e))},Os.attrTween=function(e,t){function n(e,n){var r=t.call(this,e,n,this.getAttribute(i));return r===Is?(this.removeAttribute(i),null):r&&function(e){this.setAttribute(i,r(e))}}function r(e,n){var r=t.call(this,e,n,this.getAttributeNS(i.space,i.local));return r===Is?(this.removeAttributeNS(i.space,i.local),null):r&&function(e){this.setAttributeNS(i.space,i.local,r(e))}}var i=d3.ns.qualify(e);return this.tween("attr."+e,i.local?r:n)},Os.style=function(e,t,n){var r=arguments.length;if(r<3){if(typeof e!="string"){r<2&&(t="");for(n in e)this.styleTween(n,kt(e[n],n),t);return this}n=""}return this.styleTween(e,kt(t,e),n)},Os.styleTween=function(e,t,n){return arguments.length<3&&(n=""),this.tween("style."+e,function(r,i){var s=t.call(this,r,i,window.getComputedStyle(this,null).getPropertyValue(e));return s===Is?(this.style.removeProperty(e),null):s&&function(t){this.style.setProperty(e,s(t),n)}})},Os.text=function(e){return this.tween("text",function(t,n){this.textContent=typeof e=="function"?e.call(this,t,n):e})},Os.remove=function(){return this.each("end.transition",function(){var e;!this.__transition__&&(e=this.parentNode)&&e.removeChild(this)})},Os.delay=function(e){return St(this,typeof e=="function"?function(t,n,r){t.delay=e.call(t=t.node,t.__data__,n,r)|0}:(e|=0,function(t){t.delay=e}))},Os.duration=function(e){return St(this,typeof e=="function"?function(t,n,r){t.duration=Math.max(1,e.call(t=t.node,t.__data__,n,r)|0)}:(e=Math.max(1,e|0),function(t){t.duration=e}))},Os.transition=function(){return this.select(s)},d3.tween=function(e,t){function n(n,r,i){var s=e.call(this,n,r);return s==null?i!=""&&Is:i!=s&&t(i,s+"")}function r(n,r,i){return i!=e&&t(i,e)}return typeof e=="function"?n:e==null?Ct:(e+="",r)};var Is={},qs=0,Rs={},Us=null,zs,Ws;d3.timer=function(e,t,n){if(arguments.length<3){if(arguments.length<2)t=0;else if(!isFinite(t))return;n=Date.now()}var r=Rs[e.id];r&&r.callback===e?(r.then=n,r.delay=t):Rs[e.id=++qs]=Us={callback:e,then:n,delay:t,next:Us},zs||(Ws=clearTimeout(Ws),zs=1,Xs(Lt))},d3.timer.flush=function(){var e,t=Date.now(),n=Us;while(n)e=t-n.then,n.delay||(n.flush=n.callback(e)),n=n.next;At()};var Xs=window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||window.oRequestAnimationFrame||window.msRequestAnimationFrame||function(e){setTimeout -(e,17)};d3.mouse=function(e){return Ot(e,_())};var Vs=/WebKit/.test(navigator.userAgent)?-1:0;d3.touches=function(e,t){return arguments.length<2&&(t=_().touches),t?Ji(t).map(function(t){var n=Ot(e,t);return n.identifier=t.identifier,n}):[]},d3.scale={},d3.scale.linear=function(){return Bt([0,1],[0,1],d3.interpolate,!1)},d3.scale.log=function(){return Wt(d3.scale.linear(),Xt)};var $s=d3.format(".0e");Xt.pow=function(e){return Math.pow(10,e)},Vt.pow=function(e){return-Math.pow(10,-e)},d3.scale.pow=function(){return $t(d3.scale.linear(),1)},d3.scale.sqrt=function(){return d3.scale.pow().exponent(.5)},d3.scale.ordinal=function(){return Kt([],{t:"range",a:[[]]})},d3.scale.category10=function(){return d3.scale.ordinal().range(Js)},d3.scale.category20=function(){return d3.scale.ordinal().range(Ks)},d3.scale.category20b=function(){return d3.scale.ordinal().range(Qs)},d3.scale.category20c=function(){return d3.scale.ordinal().range(Gs)};var Js=["#1f77b4","#ff7f0e","#2ca02c","#d62728","#9467bd","#8c564b","#e377c2","#7f7f7f","#bcbd22","#17becf"],Ks=["#1f77b4","#aec7e8","#ff7f0e","#ffbb78","#2ca02c","#98df8a","#d62728","#ff9896","#9467bd","#c5b0d5","#8c564b","#c49c94","#e377c2","#f7b6d2","#7f7f7f","#c7c7c7","#bcbd22","#dbdb8d","#17becf","#9edae5"],Qs=["#393b79","#5254a3","#6b6ecf","#9c9ede","#637939","#8ca252","#b5cf6b","#cedb9c","#8c6d31","#bd9e39","#e7ba52","#e7cb94","#843c39","#ad494a","#d6616b","#e7969c","#7b4173","#a55194","#ce6dbd","#de9ed6"],Gs=["#3182bd","#6baed6","#9ecae1","#c6dbef","#e6550d","#fd8d3c","#fdae6b","#fdd0a2","#31a354","#74c476","#a1d99b","#c7e9c0","#756bb1","#9e9ac8","#bcbddc","#dadaeb","#636363","#969696","#bdbdbd","#d9d9d9"];d3.scale.quantile=function(){return Qt([],[])},d3.scale.quantize=function(){return Gt(0,1,[0,1])},d3.scale.threshold=function(){return Yt([.5],[0,1])},d3.scale.identity=function(){return Zt([0,1])},d3.svg={},d3.svg.arc=function(){function e(){var e=t.apply(this,arguments),s=n.apply(this,arguments),o=r.apply(this,arguments)+Ys,u=i.apply(this,arguments)+Ys,a=(u<o&&(a=o,o=u,u=a),u-o),f=a<Math.PI?"0":"1",l=Math.cos(o),c=Math.sin(o),h=Math.cos(u),p=Math.sin(u);return a>=Zs?e?"M0,"+s+"A"+s+","+s+" 0 1,1 0,"+ -s+"A"+s+","+s+" 0 1,1 0,"+s+"M0,"+e+"A"+e+","+e+" 0 1,0 0,"+ -e+"A"+e+","+e+" 0 1,0 0,"+e+"Z":"M0,"+s+"A"+s+","+s+" 0 1,1 0,"+ -s+"A"+s+","+s+" 0 1,1 0,"+s+"Z":e?"M"+s*l+","+s*c+"A"+s+","+s+" 0 "+f+",1 "+s*h+","+s*p+"L"+e*h+","+e*p+"A"+e+","+e+" 0 "+f+",0 "+e*l+","+e*c+"Z":"M"+s*l+","+s*c+"A"+s+","+s+" 0 "+f+",1 "+s*h+","+s*p+"L0,0"+"Z"}var t=en,n=tn,r=nn,i=rn;return e.innerRadius=function(n){return arguments.length?(t=u(n),e):t},e.outerRadius=function(t){return arguments.length?(n=u(t),e):n},e.startAngle=function(t){return arguments.length?(r=u(t),e):r},e.endAngle=function(t){return arguments.length?(i=u(t),e):i},e.centroid=function(){var e=(t.apply(this,arguments)+n.apply(this,arguments))/2,s=(r.apply(this,arguments)+i.apply(this,arguments))/2+Ys;return[Math.cos(s)*e,Math.sin(s)*e]},e};var Ys=-Math.PI/2,Zs=2*Math.PI-1e-6;d3.svg.line=function(){return sn(i)};var eo=d3.map({linear:an,"linear-closed":fn,"step-before":ln,"step-after":cn,basis:gn,"basis-open":yn,"basis-closed":bn,bundle:wn,cardinal:dn,"cardinal-open":hn,"cardinal-closed":pn,monotone:Cn});eo.forEach(function(e,t){t.key=e,t.closed=/-closed$/.test(e)});var to=[0,2/3,1/3,0],no=[0,1/3,2/3,0],ro=[0,1/6,2/3,1/6];d3.svg.line.radial=function(){var e=sn(kn);return e.radius=e.x,delete e.x,e.angle=e.y,delete e.y,e},ln.reverse=cn,cn.reverse=ln,d3.svg.area=function(){return Ln(i)},d3.svg.area.radial=function(){var e=Ln(kn);return e.radius=e.x,delete e.x,e.innerRadius=e.x0,delete e.x0,e.outerRadius=e.x1,delete e.x1,e.angle=e.y,delete e.y,e.startAngle=e.y0,delete e.y0,e.endAngle=e.y1,delete e.y1,e},d3.svg.chord=function(){function e(e,u){var a=t(this,s,e,u),f=t(this,o,e,u);return"M"+a.p0+r(a.r,a.p1,a.a1-a.a0)+(n(a,f)?i(a.r,a.p1,a.r,a.p0):i(a.r,a.p1,f.r,f.p0)+r(f.r,f.p1,f.a1-f.a0)+i(f.r,f.p1,a.r,a.p0))+"Z"}function t(e,t,n,r){var i=t.call(e,n,r),s=a.call(e,i,r),o=f.call(e,i,r)+Ys,u=l.call(e,i,r)+Ys;return{r:s,a0:o,a1:u,p0:[s*Math.cos(o),s*Math.sin(o)],p1:[s*Math.cos(u),s*Math.sin(u)]}}function n(e,t){return e.a0==t.a0&&e.a1==t.a1}function r(e,t,n){return"A"+e+","+e+" 0 "+ +(n>Math.PI)+",1 "+t}function i(e,t,n,r){return"Q 0,0 "+r}var s=An,o=On,a=Mn,f=nn,l=rn;return e.radius=function(t){return arguments.length?(a=u(t),e):a},e.source=function(t){return arguments.length?(s=u(t),e):s},e.target=function(t){return arguments.length?(o=u(t),e):o},e.startAngle=function(t){return arguments.length?(f=u(t),e):f},e.endAngle=function(t){return arguments.length?(l=u(t),e):l},e},d3.svg.diagonal=function(){function e(e,i){var s=t.call(this,e,i),o=n.call(this,e,i),u=(s.y+o.y)/2,a=[s,{x:s.x,y:u},{x:o.x,y:u},o];return a=a.map(r),"M"+a[0]+"C"+a[1]+" "+a[2]+" "+a[3]}var t=An,n=On,r=Pn;return e.source=function(n){return arguments.length?(t=u(n),e):t},e.target=function(t){return arguments.length?(n=u(t),e):n},e.projection=function(t){return arguments.length?(r=t,e):r},e},d3.svg.diagonal.radial=function(){var e=d3.svg.diagonal(),t=Pn,n=e.projection;return e.projection=function(e){return arguments.length?n(Hn(t=e)):t},e},d3.svg.mouse=d3.mouse,d3.svg.touches=d3.touches,d3.svg.symbol=function(){function e(e,r){return(io.get(t.call(this,e,r))||Fn)(n.call(this,e,r))}var t=jn,n=Bn;return e.type=function(n){return arguments.length?(t=u(n),e):t},e.size=function(t){return arguments.length?(n=u(t),e):n},e};var io=d3.map({circle:Fn,cross:function(e){var t=Math.sqrt(e/5)/2;return"M"+ -3*t+","+ -t+"H"+ -t+"V"+ -3*t+"H"+t+"V"+ -t+"H"+3*t+"V"+t+"H"+t+"V"+3*t+"H"+ -t+"V"+t+"H"+ -3*t+"Z"},diamond:function(e){var t=Math.sqrt(e/(2*oo)),n=t*oo;return"M0,"+ -t+"L"+n+",0"+" 0,"+t+" "+ -n+",0"+"Z"},square:function(e){var t=Math.sqrt(e)/2;return"M"+ -t+","+ -t+"L"+t+","+ -t+" "+t+","+t+" "+ -t+","+t+"Z"},"triangle-down":function(e){var t=Math.sqrt(e/so),n=t*so/2;return"M0,"+n+"L"+t+","+ -n+" "+ -t+","+ -n+"Z"},"triangle-up":function(e){var t=Math.sqrt(e/so),n=t*so/2;return"M0,"+ -n+"L"+t+","+n+" "+ -t+","+n+"Z"}});d3.svg.symbolTypes=io.keys();var so=Math.sqrt(3),oo=Math.tan(30*Math.PI/180);d3.svg.axis=function(){function e(e){e.each(function(){var e=d3.select(this),c=a==null?t.ticks?t.ticks.apply(t,u):t.domain():a,h=f==null?t.tickFormat?t.tickFormat.apply(t,u):String:f,p=Rn(t,c,l),d=e.selectAll(".minor").data(p,String),v=d.enter().insert("line","g").attr("class","tick minor").style("opacity",1e-6),m=d3.transition(d.exit()).style("opacity",1e-6).remove(),g=d3.transition(d).style("opacity",1),y=e.selectAll("g").data(c,String),b=y.enter().insert("g","path").style("opacity",1e-6),w=d3.transition(y.exit()).style("opacity",1e-6).remove(),E=d3.transition(y).style("opacity",1),S,x=Dt(t),T=e.selectAll(".domain").data([0]),N=T.enter().append("path").attr("class","domain"),C=d3.transition(T),k=t.copy(),L=this.__chart__||k;this.__chart__=k,b.append("line").attr("class","tick"),b.append("text");var A=b.select("line"),O=E.select("line"),M=y.select("text").text(h),_=b.select("text"),D=E.select("text");switch(n){case"bottom":S=In,v.attr("y2",i),g.attr("x2",0).attr("y2",i),A.attr("y2",r),_.attr("y",Math.max(r,0)+o),O.attr("x2",0).attr("y2",r),D.attr("x",0).attr("y",Math.max(r,0)+o),M.attr("dy",".71em").attr("text-anchor","middle"),C.attr("d","M"+x[0]+","+s+"V0H"+x[1]+"V"+s);break;case"top":S=In,v.attr("y2",-i),g.attr("x2",0).attr("y2",-i),A.attr("y2",-r),_.attr("y",-(Math.max(r,0)+o)),O.attr("x2",0).attr("y2",-r),D.attr("x",0).attr("y",-(Math.max(r,0)+o)),M.attr("dy","0em").attr("text-anchor","middle"),C.attr("d","M"+x[0]+","+ -s+"V0H"+x[1]+"V"+ -s);break;case"left":S=qn,v.attr("x2",-i),g.attr("x2",-i).attr("y2",0),A.attr("x2",-r),_.attr("x",-(Math.max(r,0)+o)),O.attr("x2",-r).attr("y2",0),D.attr("x",-(Math.max(r,0)+o)).attr("y",0),M.attr("dy",".32em").attr("text-anchor","end"),C.attr("d","M"+ -s+","+x[0]+"H0V"+x[1]+"H"+ -s);break;case"right":S=qn,v.attr("x2",i),g.attr("x2",i).attr("y2",0),A.attr("x2",r),_.attr("x",Math.max(r,0)+o),O.attr("x2",r).attr("y2",0),D.attr("x",Math.max(r,0)+o).attr("y",0),M.attr("dy",".32em").attr("text-anchor","start"),C.attr("d","M"+s+","+x[0]+"H0V"+x[1]+"H"+s)}if(t.ticks)b.call(S,L),E.call(S,k),w.call(S,k),v.call(S,L),g.call(S,k),m.call(S,k);else{var P=k.rangeBand()/2,H=function(e){return k(e)+P};b.call(S,H),E.call(S,H)}})}var t=d3.scale.linear(),n="bottom",r=6,i=6,s=6,o=3,u=[10],a=null,f,l=0;return e.scale=function(n){return arguments.length?(t=n,e):t},e.orient=function(t){return arguments.length?(n=t,e):n},e.ticks=function(){return arguments.length?(u=arguments,e):u},e.tickValues=function(t){return arguments.length?(a=t,e):a},e.tickFormat=function(t){return arguments.length?(f=t,e):f},e.tickSize=function(t,n,o){if(!arguments.length)return r;var u=arguments.length-1;return r=+t,i=u>1?+n:r,s=u>0?+arguments[u]:r,e},e.tickPadding=function(t){return arguments.length?(o=+t,e):o},e.tickSubdivide=function(t){return arguments.length?(l=+t,e):l},e},d3.svg.brush=function(){function e(s){s.each(function(){var s=d3.select(this),f=s.selectAll(".background").data([0]),l=s.selectAll(".extent").data([0]),c=s.selectAll(".resize").data(a,String),h;s.style("pointer-events","all").on("mousedown.brush",i).on("touchstart.brush",i),f.enter().append("rect").attr("class","background").style("visibility","hidden").style("cursor","crosshair"),l.enter().append("rect").attr("class","extent").style("cursor","move"),c.enter().append("g").attr("class",function(e){return"resize "+e}).style("cursor",function(e){return uo[e]}).append("rect").attr("x",function(e){return/[ew]$/.test(e)?-3:null}).attr("y",function(e){return/^[ns]/.test(e)?-3:null}).attr("width",6).attr("height",6).style("visibility","hidden"),c.style("display",e.empty()?"none":null),c.exit().remove(),o&&(h=Dt(o),f.attr("x",h[0]).attr("width",h[1]-h[0]),n(s)),u&&(h=Dt(u),f.attr("y",h[0]).attr("height",h[1]-h[0]),r(s)),t(s)})}function t(e){e.selectAll(".resize").attr("transform",function(e){return"translate("+f[+/e$/.test(e)][0]+","+f[+/^s/.test(e)][1]+")"})}function n(e){e.select(".extent").attr("x",f[0][0]),e.selectAll(".extent,.n>rect,.s>rect").attr("width",f[1][0]-f[0][0])}function r(e){e.select(".extent").attr("y",f[0][1]),e.selectAll(".extent,.e>rect,.w>rect").attr("height",f[1][1]-f[0][1])}function i(){function i(){var e=d3.event.changedTouches;return e?d3.touches(v,e)[0]:d3.mouse(v)}function a(){d3.event.keyCode==32&&(S||(x=null,T[0]-=f[1][0],T[1]-=f[1][1],S=2),M())}function c(){d3.event.keyCode==32&&S==2&&(T[0]+=f[1][0],T[1]+=f[1][1],S=0,M())}function h(){var e=i(),s=!1;N&&(e[0]+=N[0],e[1]+=N[1]),S||(d3.event.altKey?(x||(x=[(f[0][0]+f[1][0])/2,(f[0][1]+f[1][1])/2]),T[0]=f[+(e[0]<x[0])][0],T[1]=f[+(e[1]<x[1])][1]):x=null),w&&p(e,o,0)&&(n(y),s=!0),E&&p(e,u,1)&&(r(y),s=!0),s&&(t(y),g({type:"brush",mode:S?"move":"resize"}))}function p(e,t,n){var r=Dt(t),i=r[0],s=r[1],o=T[n],u=f[1][n]-f[0][n],a,c;S&&(i-=o,s-=u+o),a=Math.max(i,Math.min(s,e[n])),S?c=(a+=o)+u:(x&&(o=Math.max(i,Math.min(s,2*x[n]-a))),o<a?(c=a,a=o):c=o);if(f[0][n]!==a||f[1][n]!==c)return l=null,f[0][n]=a,f[1][n]=c,!0}function d(){h(),y.style("pointer-events","all").selectAll(".resize").style("display",e.empty()?"none":null),d3.select("body").style("cursor",null),C.on("mousemove.brush",null).on("mouseup.brush",null).on("touchmove.brush",null).on("touchend.brush",null).on("keydown.brush",null).on("keyup.brush",null),g({type:"brushend"}),M()}var v=this,m=d3.select(d3.event.target),g=s.of(v,arguments),y=d3.select(v),b=m.datum(),w=!/^(n|s)$/.test(b)&&o,E=!/^(e|w)$/.test(b)&&u,S=m.classed("extent"),x,T=i(),N,C=d3.select(window).on("mousemove.brush",h).on("mouseup.brush",d).on("touchmove.brush",h).on("touchend.brush",d).on("keydown.brush",a).on("keyup.brush",c);if(S)T[0]=f[0][0]-T[0],T[1]=f[0][1]-T[1];else if(b){var k=+/w$/.test(b),L=+/^n/.test(b);N=[f[1-k][0]-T[0],f[1-L][1]-T[1]],T[0]=f[k][0],T[1]=f[L][1]}else d3.event.altKey&&(x=T.slice());y.style("pointer-events","none").selectAll(".resize").style("display",null),d3.select("body").style("cursor",m.style("cursor")),g({type:"brushstart"}),h(),M()}var s=D(e,"brushstart","brush","brushend"),o=null,u=null,a=ao[0],f=[[0,0],[0,0]],l;return e.x=function(t){return arguments.length?(o=t,a=ao[!o<<1|!u],e):o},e.y=function(t){return arguments.length?(u=t,a=ao[!o<<1|!u],e):u},e.extent=function(t){var n,r,i,s,a;return arguments.length?(l=[[0,0],[0,0]],o&&(n=t[0],r=t[1],u&&(n=n[0],r=r[0]),l[0][0]=n,l[1][0]=r,o.invert&&(n=o(n),r=o(r)),r<n&&(a=n,n=r,r=a),f[0][0]=n|0,f[1][0]=r|0),u&&(i=t[0],s=t[1],o&&(i=i[1],s=s[1]),l[0][1]=i,l[1][1]=s,u.invert&&(i=u(i),s=u(s)),s<i&&(a=i,i=s,s=a),f[0][1]=i|0,f[1][1]=s|0),e):(t=l||f,o&&(n=t[0][0],r=t[1][0],l||(n=f[0][0],r=f[1][0],o.invert&&(n=o.invert(n),r=o.invert(r)),r<n&&(a=n,n=r,r=a))),u&&(i=t[0][1],s=t[1][1],l||(i=f[0][1],s=f[1][1],u.invert&&(i=u.invert(i),s=u.invert(s)),s<i&&(a=i,i=s,s=a))),o&&u?[[n,i],[r,s]]:o?[n,r]:u&&[i,s])},e.clear=function(){return l=null,f[0][0]=f[0][1]=f[1][0]=f[1][1]=0,e},e.empty=function(){return o&&f[0][0]===f[1][0]||u&&f[0][1]===f[1][1]},d3.rebind(e,s,"on")};var uo={n:"ns-resize",e:"ew-resize",s:"ns-resize",w:"ew-resize",nw:"nwse-resize",ne:"nesw-resize",se:"nwse-resize",sw:"nesw-resize"},ao=[["n","e","s","w","nw","ne","se","sw"],["e","w"],["n","s"],[]];d3.behavior={},d3.behavior.drag=function(){function e(){this.on("mousedown.drag",t).on("touchstart.drag",t)}function t(){function e(){var e=o.parentNode;return f?d3.touches(e).filter(function(e){return e.identifier===f})[0]:d3.mouse(e)}function t(){if(!o.parentNode)return i();var t=e(),n=t[0]-c[0],r=t[1]-c[1];h|=n|r,c=t,M(),u({type:"drag",x:t[0]+l[0],y:t[1]+l[1],dx:n,dy:r})}function i(){u({type:"dragend"}),h&&(M(),d3.event.target===a&&p.on("click.drag",s,!0)),p.on(f?"touchmove.drag-"+f:"mousemove.drag",null).on(f?"touchend.drag-"+f:"mouseup.drag",null)}function s(){M(),p.on("click.drag",null)}var o=this,u=n.of(o,arguments),a=d3.event.target,f=d3.event.touches&&d3.event.changedTouches[0].identifier,l,c=e(),h=0,p=d3.select(window).on(f?"touchmove.drag-"+f:"mousemove.drag",t).on(f?"touchend.drag-"+f:"mouseup.drag",i,!0);r?(l=r.apply(o,arguments),l=[l.x-c[0],l.y-c[1]]):l=[0,0],f||M(),u({type:"dragstart"})}var n=D(e,"drag","dragstart","dragend"),r=null;return e.origin=function(t){return arguments.length?(r=t,e):r},d3.rebind(e,n,"on")},d3.behavior.zoom=function(){function e(){this.on("mousedown.zoom",o).on("mousewheel.zoom",u).on("mousemove.zoom",a).on("DOMMouseScroll.zoom",u).on("dblclick.zoom",f).on("touchstart.zoom",l).on("touchmove.zoom",c).on("touchend.zoom",l)}function t(e){return[(e[0]-h[0])/d,(e[1]-h[1])/d]}function n(e){return[e[0]*d+h[0],e[1]*d+h[1]]}function r(e){d=Math.max(m[0],Math.min(m[1],e))}function i(e,t){t=n(t),h[0]+=e[0]-t[0],h[1]+=e[1]-t[1]}function s(e){b&&b.domain(y.range().map(function(e){return(e-h[0])/d}).map(y.invert)),E&&E.domain(w.range().map(function(e){return(e-h[1])/d}).map(w.invert)),d3.event.preventDefault(),e({type:"zoom",scale:d,translate:h})}function o(){function e(){f=1,i(d3.mouse(o),c),s(u)}function n(){f&&M(),l.on("mousemove.zoom",null).on("mouseup.zoom",null),f&&d3.event.target===a&&l.on("click.zoom",r,!0)}function r(){M(),l.on("click.zoom",null)}var o=this,u=g.of(o,arguments),a=d3.event.target,f=0,l=d3.select(window).on("mousemove.zoom",e).on("mouseup.zoom",n),c=t(d3.mouse(o));window.focus(),M()}function u(){p||(p=t(d3.mouse(this))),r(Math.pow(2,Un()*.002)*d),i(d3.mouse(this),p),s(g.of(this,arguments))}function a(){p=null}function f(){var e=d3.mouse(this),n=t(e);r(d3.event.shiftKey?d/2:d*2),i(e,n),s(g.of(this,arguments))}function l(){var e=d3.touches(this),n=Date.now();v=d,p={},e.forEach(function(e){p[e.identifier]=t(e)}),M();if(e.length===1){if(n-S<500){var o=e[0],u=t(e[0]);r(d*2),i(o,u),s(g.of(this,arguments))}S=n}}function c(){var e=d3.touches(this),t=e[0],n=p[t.identifier];if(o=e[1]){var o,u=p[o.identifier];t=[(t[0]+o[0])/2,(t[1]+o[1])/2],n=[(n[0]+u[0])/2,(n[1]+u[1])/2],r(d3.event.scale*v)}i(t,n),S=null,s(g.of(this,arguments))}var h=[0,0],p,d=1,v,m=lo,g=D(e,"zoom"),y,b,w,E,S;return e.translate=function(t){return arguments.length?(h=t.map(Number),e):h},e.scale=function(t){return arguments.length?(d=+t,e):d},e.scaleExtent=function(t){return arguments.length?(m=t==null?lo:t.map(Number),e):m},e.x=function(t){return arguments.length?(b=t,y=t.copy(),e):b},e.y=function(t){return arguments.length?(E=t,w=t.copy(),e):E},d3.rebind(e,g,"on")};var fo,lo=[0,Infinity];d3.layout={},d3.layout.bundle=function(){return function(e){var t=[],n=-1,r=e.length;while(++n<r)t.push(zn(e[n]));return t}},d3.layout.chord=function(){function e(){var e={},n=[],c=d3.range(o),h=[],p,d,v,m,g;r=[],i=[],p=0,m=-1;while(++m<o){d=0,g=-1;while(++g<o)d+=s[m][g];n.push(d),h.push(d3.range(o)),p+=d}a&&c.sort(function(e,t){return a(n[e],n[t])}),f&&h.forEach(function(e,t){e.sort(function(e,n){return f(s[t][e],s[t][n])})}),p=(2*Math.PI-u*o)/p,d=0,m=-1;while(++m<o){v=d,g=-1;while(++g<o){var y=c[m],b=h[y][g],w=s[y][b],E=d,S=d+=w*p;e[y+"-"+b]={index:y,subindex:b,startAngle:E,endAngle:S,value:w}}i[y]={index:y,startAngle:v,endAngle:d,value:(d-v)/p},d+=u}m=-1;while(++m<o){g=m-1;while(++g<o){var x=e[m+"-"+g],T=e[g+"-"+m];(x.value||T.value)&&r.push(x.value<T.value?{source:T,target:x}:{source:x,target:T})}}l&&t()}function t(){r.sort(function(e,t){return l((e.source.value+e.target.value)/2,(t.source.value+t.target.value)/2)})}var n={},r,i,s,o,u=0,a,f,l;return n.matrix=function(e){return arguments.length?(o=(s=e)&&s.length,r=i=null,n):s},n.padding=function(e){return arguments.length?(u=e,r=i=null,n):u},n.sortGroups=function(e){return arguments.length?(a=e,r=i=null,n):a},n.sortSubgroups=function(e){return arguments.length?(f=e,r=null,n):f},n.sortChords=function(e){return arguments.length?(l=e,r&&t(),n):l},n.chords=function(){return r||e(),r},n.groups=function(){return i||e(),i},n},d3.layout.force=function(){function e(e){return function(t,n,r,i,s){if(t.point!==e){var o=t.cx-e.x,u=t.cy-e.y,a=1/Math.sqrt(o*o+u*u);if((i-n)*a<d){var f=t.charge*a*a;return e.px-=o*f,e.py-=u*f,!0}if(t.point&&isFinite(a)){var f=t.pointCharge*a*a;e.px-=o*f,e.py-=u*f}}return!t.charge}}function t(e){e.px=d3.event.x,e.py=d3.event.y,n.resume()}var n={},r=d3.dispatch("start","tick","end"),s=[1,1],o,a,f=.9,l=Gn,c=Yn,h=-30,p=.1,d=.8,v,m=[],g=[],y,b,w;return n.tick=function(){if((a*=.99)<.005)return r.end({type:"end",alpha:a=0}),!0;var t=m.length,n=g.length,i,o,u,l,c,d,v,E,S;for(o=0;o<n;++o){u=g[o],l=u.source,c=u.target,E=c.x-l.x,S=c.y-l.y;if(d=E*E+S*S)d=a*b[o]*((d=Math.sqrt(d))-y[o])/d,E*=d,S*=d,c.x-=E*(v=l.weight/(c.weight+l.weight)),c.y-=S*v,l.x+=E*(v=1-v),l.y+=S*v}if(v=a*p){E=s[0]/2,S=s[1]/2,o=-1;if(v)while(++o<t)u=m[o],u.x+=(E-u.x)*v,u.y+=(S-u.y)*v}if(h){Qn(i=d3.geom.quadtree(m),a,w),o=-1;while(++o<t)(u=m[o]).fixed||i.visit(e(u))}o=-1;while(++o<t)u=m[o],u.fixed?(u.x=u.px,u.y=u.py):(u.x-=(u.px-(u.px=u.x))*f,u.y-=(u.py-(u.py=u.y))*f);r.tick({type:"tick",alpha:a})},n.nodes=function(e){return arguments.length?(m=e,n):m},n.links=function(e){return arguments.length?(g=e,n):g},n.size=function(e){return arguments.length?(s=e,n):s},n.linkDistance=function(e){return arguments.length?(l=u(e),n):l},n.distance=n.linkDistance,n.linkStrength=function(e){return arguments.length?(c=u(e),n):c},n.friction=function(e){return arguments.length?(f=e,n):f},n.charge=function(e){return arguments.length?(h=typeof e=="function"?e:+e,n):h},n.gravity=function(e){return arguments.length?(p=e,n):p},n.theta=function(e){return arguments.length?(d=e,n):d},n.alpha=function(e){return arguments.length?(a?e>0?a=e:a=0:e>0&&(r.start({type:"start",alpha:a=e}),d3.timer(n.tick)),n):a},n.start=function(){function e(e,n){var i=t(r),s=-1,o=i.length,u;while(++s<o)if(!isNaN(u=i[s][e]))return u;return Math.random()*n}function t(){if(!p){p=[];for(i=0;i<o;++i)p[i]=[];for(i=0;i<u;++i){var e=g[i];p[e.source.index].push(e.target),p[e.target.index].push(e.source)}}return p[r]}var r,i,o=m.length,u=g.length,a=s[0],f=s[1],p,d;for(r=0;r<o;++r)(d=m[r]).index=r,d.weight=0;y=[],b=[];for(r=0;r<u;++r)d=g[r],typeof d.source=="number"&&(d.source=m[d.source]),typeof d.target=="number"&&(d.target=m[d.target]),y[r]=l.call(this,d,r),b[r]=c.call(this,d,r),++d.source.weight,++d.target.weight;for(r=0;r<o;++r)d=m[r],isNaN(d.x)&&(d.x=e("x",a)),isNaN(d.y)&&(d.y=e("y",f)),isNaN(d.px)&&(d.px=d.x),isNaN(d.py)&&(d.py=d.y);w=[];if(typeof h=="function")for(r=0;r<o;++r)w[r]=+h.call(this,m[r],r);else for(r=0;r<o;++r)w[r]=h;return n.resume()},n.resume=function(){return n.alpha(.1)},n.stop=function(){return n.alpha(0)},n.drag=function(){o||(o=d3.behavior.drag().origin(i).on("dragstart",Vn).on("drag",t).on("dragend",$n)),this.on("mouseover.force",Jn).on("mouseout.force",Kn).call(o)},d3.rebind(n,r,"on")},d3.layout.partition=function(){function e(t,n,r,i){var s=t.children;t.x=n,t.y=t.depth*i,t.dx=r,t.dy=i;if(s&&(u=s.length)){var o=-1,u,a,f;r=t.value?r/t.value:0;while(++o<u)e(a=s[o],n,f=a.value*r,i),n+=f}}function t(e){var n=e.children,r=0;if(n&&(s=n.length)){var i=-1,s;while(++i<s)r=Math.max(r,t(n[i]))}return 1+r}function n(n,s){var o=r.call(this,n,s);return e(o[0],0,i[0],i[1]/t(o[0])),o}var r=d3.layout.hierarchy(),i=[1,1];return n.size=function(e){return arguments.length?(i=e,n):i},lr(n,r)},d3.layout.pie=function(){function e(s,o){var u=s.map(function(n,r){return+t.call(e,n,r)}),a=+(typeof r=="function"?r.apply(this,arguments):r),f=((typeof i=="function"?i.apply(this,arguments):i)-r)/d3.sum(u),l=d3.range(s.length);n!=null&&l.sort(n===co?function(e,t){return u[t]-u[e]}:function(e,t){return n(s[e],s[t])});var c=[];return l.forEach(function(e){var t;c[e]={data:s[e],value:t=u[e],startAngle:a,endAngle:a+=t*f}}),c}var t=Number,n=co,r=0,i=2*Math.PI;return e.value=function(n){return arguments.length?(t=n,e):t},e.sort=function(t){return arguments.length?(n=t,e):n},e.startAngle=function(t){return arguments.length?(r=t,e):r},e.endAngle=function(t){return arguments.length?(i=t,e):i},e};var co={};d3.layout.stack=function(){function e(i,a){var f=i.map(function(n,r){return t.call(e,n,r)}),l=f.map(function(t,n){return t.map(function(t,n){return[o.call(e,t,n),u.call(e,t,n)]})}),c=n.call(e,l,a);f=d3.permute(f,c),l=d3.permute(l,c);var h=r.call(e,l,a),p=f.length,d=f[0].length,v,m,g;for(m=0;m<d;++m){s.call(e,f[0][m],g=h[m],l[0][m][1]);for(v=1;v<p;++v)s.call(e,f[v][m],g+=l[v-1][m][1],l[v][m][1])}return i}var t=i,n=nr,r=rr,s=tr,o=Zn,u=er;return e.values=function(n){return arguments.length?(t=n,e):t},e.order=function(t){return arguments.length?(n=typeof t=="function"?t:ho.get(t)||nr,e):n},e.offset=function(t){return arguments.length?(r=typeof t=="function"?t:po.get(t)||rr,e):r},e.x=function(t){return arguments.length?(o=t,e):o},e.y=function(t){return arguments.length?(u=t,e):u},e.out=function(t){return arguments.length?(s=t,e):s},e};var ho=d3.map({"inside-out":function(e){var t=e.length,n,r,i=e.map(ir),s=e.map(sr),o=d3.range(t).sort(function(e,t){return i[e]-i[t]}),u=0,a=0,f=[],l=[];for(n=0;n<t;++n)r=o[n],u<a?(u+=s[r],f.push(r)):(a+=s[r],l.push(r));return l.reverse().concat(f)},reverse:function(e){return d3.range(e.length).reverse()},"default":nr}),po=d3.map({silhouette:function(e){var t=e.length,n=e[0].length,r=[],i=0,s,o,u,a=[];for(o=0;o<n;++o){for(s=0,u=0;s<t;s++)u+=e[s][o][1];u>i&&(i=u),r.push(u)}for(o=0;o<n;++o)a[o]=(i-r[o])/2;return a},wiggle:function(e){var t=e.length,n=e[0],r=n.length,i=0,s,o,u,a,f,l,c,h,p,d=[];d[0]=h=p=0;for(o=1;o<r;++o){for(s=0,a=0;s<t;++s)a+=e[s][o][1];for(s=0,f=0,c=n[o][0]-n[o-1][0];s<t;++s){for(u=0,l=(e[s][o][1]-e[s][o-1][1])/(2*c);u<s;++u)l+=(e[u][o][1]-e[u][o-1][1])/c;f+=l*e[s][o][1]}d[o]=h-=a?f/a*c:0,h<p&&(p=h)}for(o=0;o<r;++o)d[o]-=p;return d},expand:function(e){var t=e.length,n=e[0].length,r=1/t,i,s,o,u=[];for(s=0;s<n;++s){for(i=0,o=0;i<t;i++)o+=e[i][s][1];if(o)for(i=0;i<t;i++)e[i][s][1]/=o;else for(i=0;i<t;i++)e[i][s][1]=r}for(s=0;s<n;++s)u[s]=0;return u},zero:rr});d3.layout.histogram=function(){function e(e,s){var o=[],u=e.map(n,this),a=r.call(this,u,s),f=i.call(this,a,u,s),l,s=-1,c=u.length,h=f.length-1,p=t?1:1/c,d;while(++s<h)l=o[s]=[],l.dx=f[s+1]-(l.x=f[s]),l.y=0;if(h>0){s=-1;while(++s<c)d=u[s],d>=a[0]&&d<=a[1]&&(l=o[d3.bisect(f,d,1,h)-1],l.y+=p,l.push(e[s]))}return o}var t=!0,n=Number,r=fr,i=ur;return e.value=function(t){return arguments.length?(n=t,e):n},e.range=function(t){return arguments.length?(r=u(t),e):r},e.bins=function(t){return arguments.length?(i=typeof t=="number"?function(e){return ar(e,t)}:u(t),e):i},e.frequency=function(n){return arguments.length?(t=!!n,e):t},e},d3.layout.hierarchy=function(){function e(t,o,u){var a=i.call(n,t,o),f=vo?t:{data:t};f.depth=o,u.push(f);if(a&&(c=a.length)){var l=-1,c,h=f.children=[],p=0,d=o+1,v;while(++l<c)v=e(a[l],d,u),v.parent=f,h.push(v),p+=v.value;r&&h.sort(r),s&&(f.value=p)}else s&&(f.value=+s.call(n,t,o)||0);return f}function t(e,r){var i=e.children,o=0;if(i&&(a=i.length)){var u=-1,a,f=r+1;while(++u<a)o+=t(i[u],f)}else s&&(o=+s.call(n,vo?e:e.data,r)||0);return s&&(e.value=o),o}function n(t){var n=[];return e(t,0,n),n}var r=pr,i=cr,s=hr;return n.sort=function(e){return arguments.length?(r=e,n):r},n.children=function(e){return arguments.length?(i=e,n):i},n.value=function(e){return arguments.length?(s=e,n):s},n.revalue=function(e){return t(e,0),e},n};var vo=!1;d3.layout.pack=function(){function e(e,i){var s=t.call(this,e,i),o=s[0];o.x=0,o.y=0,Hr(o,function(e){e.r=Math.sqrt(e.value)}),Hr(o,br);var u=r[0],a=r[1],f=Math.max(2*o.r/u,2*o.r/a);if(n>0){var l=n*f/2;Hr(o,function(e){e.r+=l}),Hr(o,br),Hr(o,function(e){e.r-=l}),f=Math.max(2*o.r/u,2*o.r/a)}return Sr(o,u/2,a/2,1/f),s}var t=d3.layout.hierarchy().sort(vr),n=0,r=[1,1];return e.size=function(t){return arguments.length?(r=t,e):r},e.padding=function(t){return arguments.length?(n=+t,e):n},lr(e,t)},d3.layout.cluster=function(){function e(e,i){var s=t.call(this,e,i),o=s[0],u,a=0,f,l;Hr(o,function(e){var t=e.children;t&&t.length?(e.x=Nr(t),e.y=Tr(t)):(e.x=u?a+=n(e,u):0,e.y=0,u=e)});var c=Cr(o),h=kr(o),p=c.x-n(c,h)/2,d=h.x+n(h,c)/2;return Hr(o,function(e){e.x=(e.x-p)/(d-p)*r[0],e.y=(1-(o.y?e.y/o.y:1))*r[1]}),s}var t=d3.layout.hierarchy().sort(null).value(null),n=Lr,r=[1,1];return e.separation=function(t){return arguments.length?(n=t,e):n},e.size=function(t){return arguments.length?(r=t,e):r},lr(e,t)},d3.layout.tree=function(){function e(e,i){function s(e,t){var r=e.children,i=e._tree;if(r&&(o=r.length)){var o,a=r[0],f,l=a,c,h=-1;while(++h<o)c=r[h],s(c,f),l=u(c,f,l),f=c;Br(e);var p=.5*(a._tree.prelim+c._tree.prelim);t?(i.prelim=t._tree.prelim+n(e,t),i.mod=i.prelim-p):i.prelim=p}else t&&(i.prelim=t._tree.prelim+n(e,t))}function o(e,t){e.x=e._tree.prelim+t;var n=e.children;if(n&&(i=n.length)){var r=-1,i;t+=e._tree.mod;while(++r<i)o(n[r],t)}}function u(e,t,r){if(t){var i=e,s=e,o=t,u=e.parent.children[0],a=i._tree.mod,f=s._tree.mod,l=o._tree.mod,c=u._tree.mod,h;while(o=Or(o),i=Ar(i),o&&i)u=Ar(u),s=Or(s),s._tree.ancestor=e,h=o._tree.prelim+l-i._tree.prelim-a+n(o,i),h>0&&(jr(Fr(o,e,r),e,h),a+=h,f+=h),l+=o._tree.mod,a+=i._tree.mod,c+=u._tree.mod,f+=s._tree.mod;o&&!Or(s)&&(s._tree.thread=o,s._tree.mod+=l-f),i&&!Ar(u)&&(u._tree.thread=i,u._tree.mod+=a-c,r=e)}return r}var a=t.call(this,e,i),f=a[0];Hr(f,function(e,t){e._tree={ancestor:e,prelim:0,mod:0,change:0,shift:0,number:t?t._tree.number+1:0}}),s(f),o(f,-f._tree.prelim);var l=Mr(f,Dr),c=Mr(f,_r),h=Mr(f,Pr),p=l.x-n(l,c)/2,d=c.x+n(c,l)/2,v=h.depth||1;return Hr(f,function(e){e.x=(e.x-p)/(d-p)*r[0],e.y=e.depth/v*r[1],delete e._tree}),a}var t=d3.layout.hierarchy().sort(null).value(null),n=Lr,r=[1,1];return e.separation=function(t){return arguments.length?(n=t,e):n},e.size=function(t){return arguments.length?(r=t,e):r},lr(e,t)},d3.layout.treemap=function(){function e(e,t){var n=-1,r=e.length,i,s;while(++n<r)s=(i=e[n]).value*(t<0?0:t),i.area=isNaN(s)||s<=0?0:s}function t(n){var s=n.children;if(s&&s.length){var o=l(n),u=[],a=s.slice(),f,c=Infinity,h,p=Math.min(o.dx,o.dy),d;e(a,o.dx*o.dy/n.value),u.area=0;while((d=a.length)>0)u.push(f=a[d-1]),u.area+=f.area,(h=r(u,p))<=c?(a.pop(),c=h):(u.area-=u.pop().area,i(u,p,o,!1),p=Math.min(o.dx,o.dy),u.length=u.area=0,c=Infinity);u.length&&(i(u,p,o,!0),u.length=u.area=0),s.forEach(t)}}function n(t){var r=t.children;if(r&&r.length){var s=l(t),o=r.slice(),u,a=[];e(o,s.dx*s.dy/t.value),a.area=0;while(u=o.pop())a.push(u),a.area+=u.area,u.z!=null&&(i(a,u.z?s.dx:s.dy,s,!o.length),a.length=a.area=0);r.forEach(n)}}function r(e,t){var n=e.area,r,i=0,s=Infinity,o=-1,u=e.length;while(++o<u){if(!(r=e[o].area))continue;r<s&&(s=r),r>i&&(i=r)}return n*=n,t*=t,n?Math.max(t*i*p/n,n/(t*s*p)):Infinity}function i(e,t,n,r){var i=-1,s=e.length,o=n.x,a=n.y,f=t?u(e.area/t):0,l;if(t==n.dx){if(r||f>n.dy)f=n.dy;while(++i<s)l=e[i],l.x=o,l.y=a,l.dy=f,o+=l.dx=Math.min(n.x+n.dx-o,f?u(l.area/f):0);l.z=!0,l.dx+=n.x+n.dx-o,n.y+=f,n.dy-=f}else{if(r||f>n.dx)f=n.dx;while(++i<s)l=e[i],l.x=o,l.y=a,l.dx=f,a+=l.dy=Math.min(n.y+n.dy-a,f?u(l.area/f):0);l.z=!1,l.dy+=n.y+n.dy-a,n.x+=f,n.dx-=f}}function s(r){var i=h||o(r),s=i[0];return s.x=0,s.y=0,s.dx=a[0],s.dy=a[1],h&&o.revalue(s),e([s],s.dx*s.dy/s.value),(h?n:t)(s),c&&(h=i),i}var o=d3.layout.hierarchy(),u=Math.round,a=[1,1],f=null,l=Ir,c=!1,h,p=.5*(1+Math.sqrt(5));return s.size=function(e){return arguments.length?(a=e,s):a},s.padding=function(e){function t(t){var n=e.call(s,t,t.depth);return n==null?Ir(t):qr(t,typeof n=="number"?[n,n,n,n]:n)}function n(t){return qr(t,e)}if(!arguments.length)return f;var r;return l=(f=e)==null?Ir:(r=typeof e)==="function"?t:r==="number"?(e=[e,e,e,e],n):n,s},s.round=function(e){return arguments.length?(u=e?Math.round:Number,s):u!=Number},s.sticky=function(e){return arguments.length?(c=e,h=null,s):c},s.ratio=function(e){return arguments.length?(p=e,s):p},lr(s,o)},d3.csv=Rr(",","text/csv"),d3.tsv=Rr(" ","text/tab-separated-values"),d3.geo={};var mo=Math.PI/180;d3.geo.azimuthal=function(){function e(e){var n=e[0]*mo-s,o=e[1]*mo,f=Math.cos(n),l=Math.sin(n),c=Math.cos(o),h=Math.sin(o),p=t!=="orthographic"?a*h+u*c*f:null,d,v=t==="stereographic"?1/(1+p):t==="gnomonic"?1/p:t==="equidistant"?(d=Math.acos(p),d?d/Math.sin(d):0):t==="equalarea"?Math.sqrt(2/(1+p)):1,m=v*c*l,g=v*(a*c*f-u*h);return[r*m+i[0],r*g+i[1]]}var t="orthographic",n,r=200,i=[480,250],s,o,u,a;return e.invert=function(e){var n=(e[0]-i[0])/r,o=(e[1]-i[1])/r,f=Math.sqrt(n*n+o*o),l=t==="stereographic"?2*Math.atan(f):t==="gnomonic"?Math.atan(f):t==="equidistant"?f:t==="equalarea"?2*Math.asin(.5*f):Math.asin(f),c=Math.sin(l),h=Math.cos(l);return[(s+Math.atan2(n*c,f*u*h+o*a*c))/mo,Math.asin(h*a-(f?o*c*u/f:0))/mo]},e.mode=function(n){return arguments.length?(t=n+"",e):t},e.origin=function(t){return arguments.length?(n=t,s=n[0]*mo,o=n[1]*mo,u=Math.cos(o),a=Math.sin(o),e):n},e.scale=function(t){return arguments.length?(r=+t,e):r},e.translate=function(t){return arguments.length?(i=[+t[0],+t[1]],e):i},e.origin([0,0])},d3.geo.albers=function(){function e(e){var t=u*(mo*e[0]-o),n=Math.sqrt(a-2*u*Math.sin(mo*e[1]))/u;return[i*n*Math.sin(t)+s[0],i*(n*Math.cos(t)-f)+s[1]]}function t(){var t=mo*r[0],i=mo*r[1],s=mo*n[1],l=Math.sin(t),c=Math.cos(t);return o=mo*n[0],u=.5*(l+Math.sin(i)),a=c*c+2*u*l,f=Math.sqrt(a-2*u*Math.sin(s))/u,e}var n=[-98,38],r=[29.5,45.5],i=1e3,s=[480,250],o,u,a,f;return e.invert=function(e){var t=(e[0]-s[0])/i,n=(e[1]-s[1])/i,r=f+n,l=Math.atan2(t,r),c=Math.sqrt(t*t+r*r);return[(o+l/u)/mo,Math.asin((a-c*c*u*u)/(2*u))/mo]},e.origin=function(e){return arguments.length?(n=[+e[0],+e[1]],t()):n},e.parallels=function(e){return arguments.length?(r=[+e[0],+e[1]],t()):r},e.scale=function(t){return arguments.length?(i=+t,e):i},e.translate=function(t){return arguments.length?(s=[+t[0],+t[1]],e):s},t()},d3.geo.albersUsa=function(){function e(e){var s=e[0],o=e[1];return(o>50?n:s<-140?r:o<21?i:t)(e)}var t=d3.geo.albers(),n=d3.geo.albers().origin([-160,60]).parallels([55,65]),r=d3.geo.albers().origin([-160,20]).parallels([8,18]),i=d3.geo.albers().origin([-60,10]).parallels([8,18]);return e.scale=function(s){return arguments.length?(t.scale(s),n.scale(s*.6),r.scale(s),i.scale(s*1.5),e.translate(t.translate())):t.scale()},e.translate=function(s){if(!arguments.length)return t.translate();var o=t.scale()/1e3,u=s[0],a=s[1];return t.translate(s),n.translate([u-400*o,a+170*o]),r.translate([u-190*o,a+200*o]),i.translate([u+580*o,a+430*o]),e},e.scale(t.scale())},d3.geo.bonne=function(){function e(e){var u=e[0]*mo-r,a=e[1]*mo-i;if(s){var f=o+s-a,l=u*Math.cos(a)/f;u=f*Math.sin(l),a=f*Math.cos(l)-o}else u*=Math.cos(a),a*=-1;return[t*u+n[0],t*a+n[1]]}var t=200,n=[480,250],r,i,s,o;return e.invert=function(e){var i=(e[0]-n[0])/t,u=(e[1]-n[1])/t;if(s){var a=o+u,f=Math.sqrt(i*i+a*a);u=o+s-f,i=r+f*Math.atan2(i,a)/Math.cos(u)}else u*=-1,i/=Math.cos(u);return[i/mo,u/mo]},e.parallel=function(t){return arguments.length?(o=1/Math.tan(s=t*mo),e):s/mo},e.origin=function(t){return arguments.length?(r=t[0]*mo,i=t[1]*mo,e):[r/mo,i/mo]},e.scale=function( -n){return arguments.length?(t=+n,e):t},e.translate=function(t){return arguments.length?(n=[+t[0],+t[1]],e):n},e.origin([0,0]).parallel(45)},d3.geo.equirectangular=function(){function e(e){var r=e[0]/360,i=-e[1]/360;return[t*r+n[0],t*i+n[1]]}var t=500,n=[480,250];return e.invert=function(e){var r=(e[0]-n[0])/t,i=(e[1]-n[1])/t;return[360*r,-360*i]},e.scale=function(n){return arguments.length?(t=+n,e):t},e.translate=function(t){return arguments.length?(n=[+t[0],+t[1]],e):n},e},d3.geo.mercator=function(){function e(e){var r=e[0]/360,i=-(Math.log(Math.tan(Math.PI/4+e[1]*mo/2))/mo)/360;return[t*r+n[0],t*Math.max(-0.5,Math.min(.5,i))+n[1]]}var t=500,n=[480,250];return e.invert=function(e){var r=(e[0]-n[0])/t,i=(e[1]-n[1])/t;return[360*r,2*Math.atan(Math.exp(-360*i*mo))/mo-90]},e.scale=function(n){return arguments.length?(t=+n,e):t},e.translate=function(t){return arguments.length?(n=[+t[0],+t[1]],e):n},e},d3.geo.path=function(){function e(e,t){typeof s=="function"&&(o=zr(s.apply(this,arguments))),f(e);var n=a.length?a.join(""):null;return a=[],n}function t(e){return u(e).join(",")}function n(e){var t=i(e[0]),n=0,r=e.length;while(++n<r)t-=i(e[n]);return t}function r(e){var t=d3.geom.polygon(e[0].map(u)),n=t.area(),r=t.centroid(n<0?(n*=-1,1):-1),i=r[0],s=r[1],o=n,a=0,f=e.length;while(++a<f)t=d3.geom.polygon(e[a].map(u)),n=t.area(),r=t.centroid(n<0?(n*=-1,1):-1),i-=r[0],s-=r[1],o-=n;return[i,s,6*o]}function i(e){return Math.abs(d3.geom.polygon(e.map(u)).area())}var s=4.5,o=zr(s),u=d3.geo.albersUsa(),a=[],f=Ur({FeatureCollection:function(e){var t=e.features,n=-1,r=t.length;while(++n<r)a.push(f(t[n].geometry))},Feature:function(e){f(e.geometry)},Point:function(e){a.push("M",t(e.coordinates),o)},MultiPoint:function(e){var n=e.coordinates,r=-1,i=n.length;while(++r<i)a.push("M",t(n[r]),o)},LineString:function(e){var n=e.coordinates,r=-1,i=n.length;a.push("M");while(++r<i)a.push(t(n[r]),"L");a.pop()},MultiLineString:function(e){var n=e.coordinates,r=-1,i=n.length,s,o,u;while(++r<i){s=n[r],o=-1,u=s.length,a.push("M");while(++o<u)a.push(t(s[o]),"L");a.pop()}},Polygon:function(e){var n=e.coordinates,r=-1,i=n.length,s,o,u;while(++r<i){s=n[r],o=-1;if((u=s.length-1)>0){a.push("M");while(++o<u)a.push(t(s[o]),"L");a[a.length-1]="Z"}}},MultiPolygon:function(e){var n=e.coordinates,r=-1,i=n.length,s,o,u,f,l,c;while(++r<i){s=n[r],o=-1,u=s.length;while(++o<u){f=s[o],l=-1;if((c=f.length-1)>0){a.push("M");while(++l<c)a.push(t(f[l]),"L");a[a.length-1]="Z"}}}},GeometryCollection:function(e){var t=e.geometries,n=-1,r=t.length;while(++n<r)a.push(f(t[n]))}}),l=e.area=Ur({FeatureCollection:function(e){var t=0,n=e.features,r=-1,i=n.length;while(++r<i)t+=l(n[r]);return t},Feature:function(e){return l(e.geometry)},Polygon:function(e){return n(e.coordinates)},MultiPolygon:function(e){var t=0,r=e.coordinates,i=-1,s=r.length;while(++i<s)t+=n(r[i]);return t},GeometryCollection:function(e){var t=0,n=e.geometries,r=-1,i=n.length;while(++r<i)t+=l(n[r]);return t}},0),c=e.centroid=Ur({Feature:function(e){return c(e.geometry)},Polygon:function(e){var t=r(e.coordinates);return[t[0]/t[2],t[1]/t[2]]},MultiPolygon:function(e){var t=0,n=e.coordinates,i,s=0,o=0,u=0,a=-1,f=n.length;while(++a<f)i=r(n[a]),s+=i[0],o+=i[1],u+=i[2];return[s/u,o/u]}});return e.projection=function(t){return u=t,e},e.pointRadius=function(t){return typeof t=="function"?s=t:(s=+t,o=zr(s)),e},e},d3.geo.bounds=function(e){var t=Infinity,n=Infinity,r=-Infinity,i=-Infinity;return Wr(e,function(e,s){e<t&&(t=e),e>r&&(r=e),s<n&&(n=s),s>i&&(i=s)}),[[t,n],[r,i]]};var go={Feature:Xr,FeatureCollection:Vr,GeometryCollection:$r,LineString:Jr,MultiLineString:Kr,MultiPoint:Jr,MultiPolygon:Qr,Point:Gr,Polygon:Yr};d3.geo.circle=function(){function e(){}function t(e){return a.distance(e)<u}function n(e){var t=-1,n=e.length,i=[],s,o,f,l,c;while(++t<n)c=a.distance(f=e[t]),c<u?(o&&i.push(ni(o,f)((l-u)/(l-c))),i.push(f),s=o=null):(o=f,!s&&i.length&&(i.push(ni(i[i.length-1],o)((u-l)/(c-l))),s=o)),l=c;return s=e[0],o=i[0],o&&f[0]===s[0]&&f[1]===s[1]&&(f[0]!==o[0]||f[1]!==o[1])&&i.push(o),r(i)}function r(e){var t=0,n=e.length,r,i,s=n?[e[0]]:e,o,u=a.source();while(++t<n){o=a.source(e[t-1])(e[t]).coordinates;for(r=0,i=o.length;++r<i;)s.push(o[r])}return a.source(u),s}var s=[0,0],o=89.99,u=o*mo,a=d3.geo.greatArc().source(s).target(i);e.clip=function(e){return typeof s=="function"&&a.source(s.apply(this,arguments)),f(e)||null};var f=Ur({FeatureCollection:function(e){var t=e.features.map(f).filter(i);return t&&(e=Object.create(e),e.features=t,e)},Feature:function(e){var t=f(e.geometry);return t&&(e=Object.create(e),e.geometry=t,e)},Point:function(e){return t(e.coordinates)&&e},MultiPoint:function(e){var n=e.coordinates.filter(t);return n.length&&{type:e.type,coordinates:n}},LineString:function(e){var t=n(e.coordinates);return t.length&&(e=Object.create(e),e.coordinates=t,e)},MultiLineString:function(e){var t=e.coordinates.map(n).filter(function(e){return e.length});return t.length&&(e=Object.create(e),e.coordinates=t,e)},Polygon:function(e){var t=e.coordinates.map(n);return t[0].length&&(e=Object.create(e),e.coordinates=t,e)},MultiPolygon:function(e){var t=e.coordinates.map(function(e){return e.map(n)}).filter(function(e){return e[0].length});return t.length&&(e=Object.create(e),e.coordinates=t,e)},GeometryCollection:function(e){var t=e.geometries.map(f).filter(i);return t.length&&(e=Object.create(e),e.geometries=t,e)}});return e.origin=function(t){return arguments.length?(s=t,typeof s!="function"&&a.source(s),e):s},e.angle=function(t){return arguments.length?(u=(o=+t)*mo,e):o},d3.rebind(e,a,"precision")},d3.geo.greatArc=function(){function e(){var t=e.distance.apply(this,arguments),r=0,u=s/t,a=[n];while((r+=u)<1)a.push(o(r));return a.push(i),{type:"LineString",coordinates:a}}var t=Zr,n,r=ei,i,s=6*mo,o=ti();return e.distance=function(){return typeof t=="function"&&o.source(n=t.apply(this,arguments)),typeof r=="function"&&o.target(i=r.apply(this,arguments)),o.distance()},e.source=function(r){return arguments.length?(t=r,typeof t!="function"&&o.source(n=t),e):t},e.target=function(t){return arguments.length?(r=t,typeof r!="function"&&o.target(i=r),e):r},e.precision=function(t){return arguments.length?(s=t*mo,e):s/mo},e},d3.geo.greatCircle=d3.geo.circle,d3.geom={},d3.geom.contour=function(e,t){var n=t||ri(e),r=[],i=n[0],s=n[1],o=0,u=0,a=NaN,f=NaN,l=0;do l=0,e(i-1,s-1)&&(l+=1),e(i,s-1)&&(l+=2),e(i-1,s)&&(l+=4),e(i,s)&&(l+=8),l===6?(o=f===-1?-1:1,u=0):l===9?(o=0,u=a===1?-1:1):(o=yo[l],u=bo[l]),o!=a&&u!=f&&(r.push([i,s]),a=o,f=u),i+=o,s+=u;while(n[0]!=i||n[1]!=s);return r};var yo=[1,0,1,1,-1,0,-1,1,0,0,0,0,-1,0,-1,NaN],bo=[0,-1,0,0,0,-1,0,0,1,-1,1,1,0,-1,0,NaN];d3.geom.hull=function(e){if(e.length<3)return[];var t=e.length,n=t-1,r=[],i=[],s,o,u=0,a,f,l,c,h,p,d,v;for(s=1;s<t;++s)e[s][1]<e[u][1]?u=s:e[s][1]==e[u][1]&&(u=e[s][0]<e[u][0]?s:u);for(s=0;s<t;++s){if(s===u)continue;f=e[s][1]-e[u][1],a=e[s][0]-e[u][0],r.push({angle:Math.atan2(f,a),index:s})}r.sort(function(e,t){return e.angle-t.angle}),d=r[0].angle,p=r[0].index,h=0;for(s=1;s<n;++s)o=r[s].index,d==r[s].angle?(a=e[p][0]-e[u][0],f=e[p][1]-e[u][1],l=e[o][0]-e[u][0],c=e[o][1]-e[u][1],a*a+f*f>=l*l+c*c?r[s].index=-1:(r[h].index=-1,d=r[s].angle,h=s,p=o)):(d=r[s].angle,h=s,p=o);i.push(u);for(s=0,o=0;s<2;++o)r[o].index!==-1&&(i.push(r[o].index),s++);v=i.length;for(;o<n;++o){if(r[o].index===-1)continue;while(!ii(i[v-2],i[v-1],r[o].index,e))--v;i[v++]=r[o].index}var m=[];for(s=0;s<v;++s)m.push(e[i[s]]);return m},d3.geom.polygon=function(e){return e.area=function(){var t=0,n=e.length,r=e[n-1][0]*e[0][1],i=e[n-1][1]*e[0][0];while(++t<n)r+=e[t-1][0]*e[t][1],i+=e[t-1][1]*e[t][0];return(i-r)*.5},e.centroid=function(t){var n=-1,r=e.length,i=0,s=0,o,u=e[r-1],a;arguments.length||(t=-1/(6*e.area()));while(++n<r)o=u,u=e[n],a=o[0]*u[1]-u[0]*o[1],i+=(o[0]+u[0])*a,s+=(o[1]+u[1])*a;return[i*t,s*t]},e.clip=function(t){var n,r=-1,i=e.length,s,o,u=e[i-1],a,f,l;while(++r<i){n=t.slice(),t.length=0,a=e[r],f=n[(o=n.length)-1],s=-1;while(++s<o)l=n[s],si(l,u,a)?(si(f,u,a)||t.push(oi(f,l,u,a)),t.push(l)):si(f,u,a)&&t.push(oi(f,l,u,a)),f=l;u=a}return t},e},d3.geom.voronoi=function(e){var t=e.map(function(){return[]});return ui(e,function(e){var n,r,i,s,o,u;e.a===1&&e.b>=0?(n=e.ep.r,r=e.ep.l):(n=e.ep.l,r=e.ep.r),e.a===1?(o=n?n.y:-1e6,i=e.c-e.b*o,u=r?r.y:1e6,s=e.c-e.b*u):(i=n?n.x:-1e6,o=e.c-e.a*i,s=r?r.x:1e6,u=e.c-e.a*s);var a=[i,o],f=[s,u];t[e.region.l.index].push(a,f),t[e.region.r.index].push(a,f)}),t.map(function(t,n){var r=e[n][0],i=e[n][1];return t.forEach(function(e){e.angle=Math.atan2(e[0]-r,e[1]-i)}),t.sort(function(e,t){return e.angle-t.angle}).filter(function(e,n){return!n||e.angle-t[n-1].angle>1e-10})})};var wo={l:"r",r:"l"};d3.geom.delaunay=function(e){var t=e.map(function(){return[]}),n=[];return ui(e,function(n){t[n.region.l.index].push(e[n.region.r.index])}),t.forEach(function(t,r){var i=e[r],s=i[0],o=i[1];t.forEach(function(e){e.angle=Math.atan2(e[0]-s,e[1]-o)}),t.sort(function(e,t){return e.angle-t.angle});for(var u=0,a=t.length-1;u<a;u++)n.push([i,t[u],t[u+1]])}),n},d3.geom.quadtree=function(e,t,n,r,i){function s(e,t,n,r,i,s){if(isNaN(t.x)||isNaN(t.y))return;if(e.leaf){var u=e.point;u?Math.abs(u.x-t.x)+Math.abs(u.y-t.y)<.01?o(e,t,n,r,i,s):(e.point=null,o(e,u,n,r,i,s),o(e,t,n,r,i,s)):e.point=t}else o(e,t,n,r,i,s)}function o(e,t,n,r,i,o){var u=(n+i)*.5,a=(r+o)*.5,f=t.x>=u,l=t.y>=a,c=(l<<1)+f;e.leaf=!1,e=e.nodes[c]||(e.nodes[c]=ai()),f?n=u:i=u,l?r=a:o=a,s(e,t,n,r,i,o)}var u,a=-1,f=e.length;f&&isNaN(e[0].x)&&(e=e.map(li));if(arguments.length<5)if(arguments.length===3)i=r=n,n=t;else{t=n=Infinity,r=i=-Infinity;while(++a<f)u=e[a],u.x<t&&(t=u.x),u.y<n&&(n=u.y),u.x>r&&(r=u.x),u.y>i&&(i=u.y);var l=r-t,c=i-n;l>c?i=n+l:r=t+c}var h=ai();return h.add=function(e){s(h,e,t,n,r,i)},h.visit=function(e){fi(e,h,t,n,r,i)},e.forEach(h.add),h},d3.time={};var Eo=Date,So=["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"];ci.prototype={getDate:function(){return this._.getUTCDate()},getDay:function(){return this._.getUTCDay()},getFullYear:function(){return this._.getUTCFullYear()},getHours:function(){return this._.getUTCHours()},getMilliseconds:function(){return this._.getUTCMilliseconds()},getMinutes:function(){return this._.getUTCMinutes()},getMonth:function(){return this._.getUTCMonth()},getSeconds:function(){return this._.getUTCSeconds()},getTime:function(){return this._.getTime()},getTimezoneOffset:function(){return 0},valueOf:function(){return this._.valueOf()},setDate:function(){xo.setUTCDate.apply(this._,arguments)},setDay:function(){xo.setUTCDay.apply(this._,arguments)},setFullYear:function(){xo.setUTCFullYear.apply(this._,arguments)},setHours:function(){xo.setUTCHours.apply(this._,arguments)},setMilliseconds:function(){xo.setUTCMilliseconds.apply(this._,arguments)},setMinutes:function(){xo.setUTCMinutes.apply(this._,arguments)},setMonth:function(){xo.setUTCMonth.apply(this._,arguments)},setSeconds:function(){xo.setUTCSeconds.apply(this._,arguments)},setTime:function(){xo.setTime.apply(this._,arguments)}};var xo=Date.prototype,To="%a %b %e %H:%M:%S %Y",No="%m/%d/%y",Co="%H:%M:%S",ko=So,Lo=ko.map(hi),Ao=["January","February","March","April","May","June","July","August","September","October","November","December"],Oo=Ao.map(hi);d3.time.format=function(e){function t(t){var r=[],i=-1,s=0,o,u;while(++i<n)e.charCodeAt(i)==37&&(r.push(e.substring(s,i),(u=Ro[o=e.charAt(++i)])?u(t):o),s=i+1);return r.push(e.substring(s,i)),r.join("")}var n=e.length;return t.parse=function(t){var n={y:1900,m:0,d:1,H:0,M:0,S:0,L:0},r=pi(n,e,t,0);if(r!=t.length)return null;"p"in n&&(n.H=n.H%12+n.p*12);var i=new Eo;return i.setFullYear(n.y,n.m,n.d),i.setHours(n.H,n.M,n.S,n.L),i},t.toString=function(){return e},t};var Mo=d3.format("02d"),_o=d3.format("03d"),Do=d3.format("04d"),Po=d3.format("2d"),Ho=di(ko),Bo=di(Lo),jo=di(Ao),Fo=vi(Ao),Io=di(Oo),qo=vi(Oo),Ro={a:function(e){return Lo[e.getDay()]},A:function(e){return ko[e.getDay()]},b:function(e){return Oo[e.getMonth()]},B:function(e){return Ao[e.getMonth()]},c:d3.time.format(To),d:function(e){return Mo(e.getDate())},e:function(e){return Po(e.getDate())},H:function(e){return Mo(e.getHours())},I:function(e){return Mo(e.getHours()%12||12)},j:function(e){return _o(1+d3.time.dayOfYear(e))},L:function(e){return _o(e.getMilliseconds())},m:function(e){return Mo(e.getMonth()+1)},M:function(e){return Mo(e.getMinutes())},p:function(e){return e.getHours()>=12?"PM":"AM"},S:function(e){return Mo(e.getSeconds())},U:function(e){return Mo(d3.time.sundayOfYear(e))},w:function(e){return e.getDay()},W:function(e){return Mo(d3.time.mondayOfYear(e))},x:d3.time.format(No),X:d3.time.format(Co),y:function(e){return Mo(e.getFullYear()%100)},Y:function(e){return Do(e.getFullYear()%1e4)},Z:Di,"%":function(e){return"%"}},Uo={a:mi,A:gi,b:yi,B:bi,c:wi,d:ki,e:ki,H:Li,I:Li,L:Mi,m:Ci,M:Ai,p:_i,S:Oi,x:Ei,X:Si,y:Ti,Y:xi},zo=/^\s*\d+/,Wo=d3.map({am:0,pm:1});d3.time.format.utc=function(e){function t(e){try{Eo=ci;var t=new Eo;return t._=e,n(t)}finally{Eo=Date}}var n=d3.time.format(e);return t.parse=function(e){try{Eo=ci;var t=n.parse(e);return t&&t._}finally{Eo=Date}},t.toString=n.toString,t};var Xo=d3.time.format.utc("%Y-%m-%dT%H:%M:%S.%LZ");d3.time.format.iso=Date.prototype.toISOString?Pi:Xo,Pi.parse=function(e){var t=new Date(e);return isNaN(t)?null:t},Pi.toString=Xo.toString,d3.time.second=Hi(function(e){return new Eo(Math.floor(e/1e3)*1e3)},function(e,t){e.setTime(e.getTime()+Math.floor(t)*1e3)},function(e){return e.getSeconds()}),d3.time.seconds=d3.time.second.range,d3.time.seconds.utc=d3.time.second.utc.range,d3.time.minute=Hi(function(e){return new Eo(Math.floor(e/6e4)*6e4)},function(e,t){e.setTime(e.getTime()+Math.floor(t)*6e4)},function(e){return e.getMinutes()}),d3.time.minutes=d3.time.minute.range,d3.time.minutes.utc=d3.time.minute.utc.range,d3.time.hour=Hi(function(e){var t=e.getTimezoneOffset()/60;return new Eo((Math.floor(e/36e5-t)+t)*36e5)},function(e,t){e.setTime(e.getTime()+Math.floor(t)*36e5)},function(e){return e.getHours()}),d3.time.hours=d3.time.hour.range,d3.time.hours.utc=d3.time.hour.utc.range,d3.time.day=Hi(function(e){var t=new Eo(1970,0);return t.setFullYear(e.getFullYear(),e.getMonth(),e.getDate()),t},function(e,t){e.setDate(e.getDate()+t)},function(e){return e.getDate()-1}),d3.time.days=d3.time.day.range,d3.time.days.utc=d3.time.day.utc.range,d3.time.dayOfYear=function(e){var t=d3.time.year(e);return Math.floor((e-t-(e.getTimezoneOffset()-t.getTimezoneOffset())*6e4)/864e5)},So.forEach(function(e,t){e=e.toLowerCase(),t=7-t;var n=d3.time[e]=Hi(function(e){return(e=d3.time.day(e)).setDate(e.getDate()-(e.getDay()+t)%7),e},function(e,t){e.setDate(e.getDate()+Math.floor(t)*7)},function(e){var n=d3.time.year(e).getDay();return Math.floor((d3.time.dayOfYear(e)+(n+t)%7)/7)-(n!==t)});d3.time[e+"s"]=n.range,d3.time[e+"s"].utc=n.utc.range,d3.time[e+"OfYear"]=function(e){var n=d3.time.year(e).getDay();return Math.floor((d3.time.dayOfYear(e)+(n+t)%7)/7)}}),d3.time.week=d3.time.sunday,d3.time.weeks=d3.time.sunday.range,d3.time.weeks.utc=d3.time.sunday.utc.range,d3.time.weekOfYear=d3.time.sundayOfYear,d3.time.month=Hi(function(e){return e=d3.time.day(e),e.setDate(1),e},function(e,t){e.setMonth(e.getMonth()+t)},function(e){return e.getMonth()}),d3.time.months=d3.time.month.range,d3.time.months.utc=d3.time.month.utc.range,d3.time.year=Hi(function(e){return e=d3.time.day(e),e.setMonth(0,1),e},function(e,t){e.setFullYear(e.getFullYear()+t)},function(e){return e.getFullYear()}),d3.time.years=d3.time.year.range,d3.time.years.utc=d3.time.year.utc.range;var Vo=[1e3,5e3,15e3,3e4,6e4,3e5,9e5,18e5,36e5,108e5,216e5,432e5,864e5,1728e5,6048e5,2592e6,7776e6,31536e6],$o=[[d3.time.second,1],[d3.time.second,5],[d3.time.second,15],[d3.time.second,30],[d3.time.minute,1],[d3.time.minute,5],[d3.time.minute,15],[d3.time.minute,30],[d3.time.hour,1],[d3.time.hour,3],[d3.time.hour,6],[d3.time.hour,12],[d3.time.day,1],[d3.time.day,2],[d3.time.week,1],[d3.time.month,1],[d3.time.month,3],[d3.time.year,1]],Jo=[[d3.time.format("%Y"),function(e){return!0}],[d3.time.format("%B"),function(e){return e.getMonth()}],[d3.time.format("%b %d"),function(e){return e.getDate()!=1}],[d3.time.format("%a %d"),function(e){return e.getDay()&&e.getDate()!=1}],[d3.time.format("%I %p"),function(e){return e.getHours()}],[d3.time.format("%I:%M"),function(e){return e.getMinutes()}],[d3.time.format(":%S"),function(e){return e.getSeconds()}],[d3.time.format(".%L"),function(e){return e.getMilliseconds()}]],Ko=d3.scale.linear(),Qo=qi(Jo);$o.year=function(e,t){return Ko.domain(e.map(Ui)).ticks(t).map(Ri)},d3.time.scale=function(){return ji(d3.scale.linear(),$o,Qo)};var Go=$o.map(function(e){return[e[0].utc,e[1]]}),Yo=[[d3.time.format.utc("%Y"),function(e){return!0}],[d3.time.format.utc("%B"),function(e){return e.getUTCMonth()}],[d3.time.format.utc("%b %d"),function(e){return e.getUTCDate()!=1}],[d3.time.format.utc("%a %d"),function(e){return e.getUTCDay()&&e.getUTCDate()!=1}],[d3.time.format.utc("%I %p"),function(e){return e.getUTCHours()}],[d3.time.format.utc("%I:%M"),function(e){return e.getUTCMinutes()}],[d3.time.format.utc(":%S"),function(e){return e.getUTCSeconds()}],[d3.time.format.utc(".%L"),function(e){return e.getUTCMilliseconds()}]],Zo=qi(Yo);Go.year=function(e,t){return Ko.domain(e.map(Wi)).ticks(t).map(zi)},d3.time.scale.utc=function(){return ji(d3.scale.linear(),Go,Zo)}})(); \ No newline at end of file diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/demultiplexing/html/js/jquery-1.8.2.min.js b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/demultiplexing/html/js/jquery-1.8.2.min.js deleted file mode 100644 index bc3fbc81b261b9dd759fd83917b93664138faa4a..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/demultiplexing/html/js/jquery-1.8.2.min.js +++ /dev/null @@ -1,2 +0,0 @@ -/*! jQuery v1.8.2 jquery.com | jquery.org/license */ -(function(a,b){function G(a){var b=F[a]={};return p.each(a.split(s),function(a,c){b[c]=!0}),b}function J(a,c,d){if(d===b&&a.nodeType===1){var e="data-"+c.replace(I,"-$1").toLowerCase();d=a.getAttribute(e);if(typeof d=="string"){try{d=d==="true"?!0:d==="false"?!1:d==="null"?null:+d+""===d?+d:H.test(d)?p.parseJSON(d):d}catch(f){}p.data(a,c,d)}else d=b}return d}function K(a){var b;for(b in a){if(b==="data"&&p.isEmptyObject(a[b]))continue;if(b!=="toJSON")return!1}return!0}function ba(){return!1}function bb(){return!0}function bh(a){return!a||!a.parentNode||a.parentNode.nodeType===11}function bi(a,b){do a=a[b];while(a&&a.nodeType!==1);return a}function bj(a,b,c){b=b||0;if(p.isFunction(b))return p.grep(a,function(a,d){var e=!!b.call(a,d,a);return e===c});if(b.nodeType)return p.grep(a,function(a,d){return a===b===c});if(typeof b=="string"){var d=p.grep(a,function(a){return a.nodeType===1});if(be.test(b))return p.filter(b,d,!c);b=p.filter(b,d)}return p.grep(a,function(a,d){return p.inArray(a,b)>=0===c})}function bk(a){var b=bl.split("|"),c=a.createDocumentFragment();if(c.createElement)while(b.length)c.createElement(b.pop());return c}function bC(a,b){return a.getElementsByTagName(b)[0]||a.appendChild(a.ownerDocument.createElement(b))}function bD(a,b){if(b.nodeType!==1||!p.hasData(a))return;var c,d,e,f=p._data(a),g=p._data(b,f),h=f.events;if(h){delete g.handle,g.events={};for(c in h)for(d=0,e=h[c].length;d<e;d++)p.event.add(b,c,h[c][d])}g.data&&(g.data=p.extend({},g.data))}function bE(a,b){var c;if(b.nodeType!==1)return;b.clearAttributes&&b.clearAttributes(),b.mergeAttributes&&b.mergeAttributes(a),c=b.nodeName.toLowerCase(),c==="object"?(b.parentNode&&(b.outerHTML=a.outerHTML),p.support.html5Clone&&a.innerHTML&&!p.trim(b.innerHTML)&&(b.innerHTML=a.innerHTML)):c==="input"&&bv.test(a.type)?(b.defaultChecked=b.checked=a.checked,b.value!==a.value&&(b.value=a.value)):c==="option"?b.selected=a.defaultSelected:c==="input"||c==="textarea"?b.defaultValue=a.defaultValue:c==="script"&&b.text!==a.text&&(b.text=a.text),b.removeAttribute(p.expando)}function bF(a){return typeof a.getElementsByTagName!="undefined"?a.getElementsByTagName("*"):typeof a.querySelectorAll!="undefined"?a.querySelectorAll("*"):[]}function bG(a){bv.test(a.type)&&(a.defaultChecked=a.checked)}function bY(a,b){if(b in a)return b;var c=b.charAt(0).toUpperCase()+b.slice(1),d=b,e=bW.length;while(e--){b=bW[e]+c;if(b in a)return b}return d}function bZ(a,b){return a=b||a,p.css(a,"display")==="none"||!p.contains(a.ownerDocument,a)}function b$(a,b){var c,d,e=[],f=0,g=a.length;for(;f<g;f++){c=a[f];if(!c.style)continue;e[f]=p._data(c,"olddisplay"),b?(!e[f]&&c.style.display==="none"&&(c.style.display=""),c.style.display===""&&bZ(c)&&(e[f]=p._data(c,"olddisplay",cc(c.nodeName)))):(d=bH(c,"display"),!e[f]&&d!=="none"&&p._data(c,"olddisplay",d))}for(f=0;f<g;f++){c=a[f];if(!c.style)continue;if(!b||c.style.display==="none"||c.style.display==="")c.style.display=b?e[f]||"":"none"}return a}function b_(a,b,c){var d=bP.exec(b);return d?Math.max(0,d[1]-(c||0))+(d[2]||"px"):b}function ca(a,b,c,d){var e=c===(d?"border":"content")?4:b==="width"?1:0,f=0;for(;e<4;e+=2)c==="margin"&&(f+=p.css(a,c+bV[e],!0)),d?(c==="content"&&(f-=parseFloat(bH(a,"padding"+bV[e]))||0),c!=="margin"&&(f-=parseFloat(bH(a,"border"+bV[e]+"Width"))||0)):(f+=parseFloat(bH(a,"padding"+bV[e]))||0,c!=="padding"&&(f+=parseFloat(bH(a,"border"+bV[e]+"Width"))||0));return f}function cb(a,b,c){var d=b==="width"?a.offsetWidth:a.offsetHeight,e=!0,f=p.support.boxSizing&&p.css(a,"boxSizing")==="border-box";if(d<=0||d==null){d=bH(a,b);if(d<0||d==null)d=a.style[b];if(bQ.test(d))return d;e=f&&(p.support.boxSizingReliable||d===a.style[b]),d=parseFloat(d)||0}return d+ca(a,b,c||(f?"border":"content"),e)+"px"}function cc(a){if(bS[a])return bS[a];var b=p("<"+a+">").appendTo(e.body),c=b.css("display");b.remove();if(c==="none"||c===""){bI=e.body.appendChild(bI||p.extend(e.createElement("iframe"),{frameBorder:0,width:0,height:0}));if(!bJ||!bI.createElement)bJ=(bI.contentWindow||bI.contentDocument).document,bJ.write("<!doctype html><html><body>"),bJ.close();b=bJ.body.appendChild(bJ.createElement(a)),c=bH(b,"display"),e.body.removeChild(bI)}return bS[a]=c,c}function ci(a,b,c,d){var e;if(p.isArray(b))p.each(b,function(b,e){c||ce.test(a)?d(a,e):ci(a+"["+(typeof e=="object"?b:"")+"]",e,c,d)});else if(!c&&p.type(b)==="object")for(e in b)ci(a+"["+e+"]",b[e],c,d);else d(a,b)}function cz(a){return function(b,c){typeof b!="string"&&(c=b,b="*");var d,e,f,g=b.toLowerCase().split(s),h=0,i=g.length;if(p.isFunction(c))for(;h<i;h++)d=g[h],f=/^\+/.test(d),f&&(d=d.substr(1)||"*"),e=a[d]=a[d]||[],e[f?"unshift":"push"](c)}}function cA(a,c,d,e,f,g){f=f||c.dataTypes[0],g=g||{},g[f]=!0;var h,i=a[f],j=0,k=i?i.length:0,l=a===cv;for(;j<k&&(l||!h);j++)h=i[j](c,d,e),typeof h=="string"&&(!l||g[h]?h=b:(c.dataTypes.unshift(h),h=cA(a,c,d,e,h,g)));return(l||!h)&&!g["*"]&&(h=cA(a,c,d,e,"*",g)),h}function cB(a,c){var d,e,f=p.ajaxSettings.flatOptions||{};for(d in c)c[d]!==b&&((f[d]?a:e||(e={}))[d]=c[d]);e&&p.extend(!0,a,e)}function cC(a,c,d){var e,f,g,h,i=a.contents,j=a.dataTypes,k=a.responseFields;for(f in k)f in d&&(c[k[f]]=d[f]);while(j[0]==="*")j.shift(),e===b&&(e=a.mimeType||c.getResponseHeader("content-type"));if(e)for(f in i)if(i[f]&&i[f].test(e)){j.unshift(f);break}if(j[0]in d)g=j[0];else{for(f in d){if(!j[0]||a.converters[f+" "+j[0]]){g=f;break}h||(h=f)}g=g||h}if(g)return g!==j[0]&&j.unshift(g),d[g]}function cD(a,b){var c,d,e,f,g=a.dataTypes.slice(),h=g[0],i={},j=0;a.dataFilter&&(b=a.dataFilter(b,a.dataType));if(g[1])for(c in a.converters)i[c.toLowerCase()]=a.converters[c];for(;e=g[++j];)if(e!=="*"){if(h!=="*"&&h!==e){c=i[h+" "+e]||i["* "+e];if(!c)for(d in i){f=d.split(" ");if(f[1]===e){c=i[h+" "+f[0]]||i["* "+f[0]];if(c){c===!0?c=i[d]:i[d]!==!0&&(e=f[0],g.splice(j--,0,e));break}}}if(c!==!0)if(c&&a["throws"])b=c(b);else try{b=c(b)}catch(k){return{state:"parsererror",error:c?k:"No conversion from "+h+" to "+e}}}h=e}return{state:"success",data:b}}function cL(){try{return new a.XMLHttpRequest}catch(b){}}function cM(){try{return new a.ActiveXObject("Microsoft.XMLHTTP")}catch(b){}}function cU(){return setTimeout(function(){cN=b},0),cN=p.now()}function cV(a,b){p.each(b,function(b,c){var d=(cT[b]||[]).concat(cT["*"]),e=0,f=d.length;for(;e<f;e++)if(d[e].call(a,b,c))return})}function cW(a,b,c){var d,e=0,f=0,g=cS.length,h=p.Deferred().always(function(){delete i.elem}),i=function(){var b=cN||cU(),c=Math.max(0,j.startTime+j.duration-b),d=1-(c/j.duration||0),e=0,f=j.tweens.length;for(;e<f;e++)j.tweens[e].run(d);return h.notifyWith(a,[j,d,c]),d<1&&f?c:(h.resolveWith(a,[j]),!1)},j=h.promise({elem:a,props:p.extend({},b),opts:p.extend(!0,{specialEasing:{}},c),originalProperties:b,originalOptions:c,startTime:cN||cU(),duration:c.duration,tweens:[],createTween:function(b,c,d){var e=p.Tween(a,j.opts,b,c,j.opts.specialEasing[b]||j.opts.easing);return j.tweens.push(e),e},stop:function(b){var c=0,d=b?j.tweens.length:0;for(;c<d;c++)j.tweens[c].run(1);return b?h.resolveWith(a,[j,b]):h.rejectWith(a,[j,b]),this}}),k=j.props;cX(k,j.opts.specialEasing);for(;e<g;e++){d=cS[e].call(j,a,k,j.opts);if(d)return d}return cV(j,k),p.isFunction(j.opts.start)&&j.opts.start.call(a,j),p.fx.timer(p.extend(i,{anim:j,queue:j.opts.queue,elem:a})),j.progress(j.opts.progress).done(j.opts.done,j.opts.complete).fail(j.opts.fail).always(j.opts.always)}function cX(a,b){var c,d,e,f,g;for(c in a){d=p.camelCase(c),e=b[d],f=a[c],p.isArray(f)&&(e=f[1],f=a[c]=f[0]),c!==d&&(a[d]=f,delete a[c]),g=p.cssHooks[d];if(g&&"expand"in g){f=g.expand(f),delete a[d];for(c in f)c in a||(a[c]=f[c],b[c]=e)}else b[d]=e}}function cY(a,b,c){var d,e,f,g,h,i,j,k,l=this,m=a.style,n={},o=[],q=a.nodeType&&bZ(a);c.queue||(j=p._queueHooks(a,"fx"),j.unqueued==null&&(j.unqueued=0,k=j.empty.fire,j.empty.fire=function(){j.unqueued||k()}),j.unqueued++,l.always(function(){l.always(function(){j.unqueued--,p.queue(a,"fx").length||j.empty.fire()})})),a.nodeType===1&&("height"in b||"width"in b)&&(c.overflow=[m.overflow,m.overflowX,m.overflowY],p.css(a,"display")==="inline"&&p.css(a,"float")==="none"&&(!p.support.inlineBlockNeedsLayout||cc(a.nodeName)==="inline"?m.display="inline-block":m.zoom=1)),c.overflow&&(m.overflow="hidden",p.support.shrinkWrapBlocks||l.done(function(){m.overflow=c.overflow[0],m.overflowX=c.overflow[1],m.overflowY=c.overflow[2]}));for(d in b){f=b[d];if(cP.exec(f)){delete b[d];if(f===(q?"hide":"show"))continue;o.push(d)}}g=o.length;if(g){h=p._data(a,"fxshow")||p._data(a,"fxshow",{}),q?p(a).show():l.done(function(){p(a).hide()}),l.done(function(){var b;p.removeData(a,"fxshow",!0);for(b in n)p.style(a,b,n[b])});for(d=0;d<g;d++)e=o[d],i=l.createTween(e,q?h[e]:0),n[e]=h[e]||p.style(a,e),e in h||(h[e]=i.start,q&&(i.end=i.start,i.start=e==="width"||e==="height"?1:0))}}function cZ(a,b,c,d,e){return new cZ.prototype.init(a,b,c,d,e)}function c$(a,b){var c,d={height:a},e=0;b=b?1:0;for(;e<4;e+=2-b)c=bV[e],d["margin"+c]=d["padding"+c]=a;return b&&(d.opacity=d.width=a),d}function da(a){return p.isWindow(a)?a:a.nodeType===9?a.defaultView||a.parentWindow:!1}var c,d,e=a.document,f=a.location,g=a.navigator,h=a.jQuery,i=a.$,j=Array.prototype.push,k=Array.prototype.slice,l=Array.prototype.indexOf,m=Object.prototype.toString,n=Object.prototype.hasOwnProperty,o=String.prototype.trim,p=function(a,b){return new p.fn.init(a,b,c)},q=/[\-+]?(?:\d*\.|)\d+(?:[eE][\-+]?\d+|)/.source,r=/\S/,s=/\s+/,t=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,u=/^(?:[^#<]*(<[\w\W]+>)[^>]*$|#([\w\-]*)$)/,v=/^<(\w+)\s*\/?>(?:<\/\1>|)$/,w=/^[\],:{}\s]*$/,x=/(?:^|:|,)(?:\s*\[)+/g,y=/\\(?:["\\\/bfnrt]|u[\da-fA-F]{4})/g,z=/"[^"\\\r\n]*"|true|false|null|-?(?:\d\d*\.|)\d+(?:[eE][\-+]?\d+|)/g,A=/^-ms-/,B=/-([\da-z])/gi,C=function(a,b){return(b+"").toUpperCase()},D=function(){e.addEventListener?(e.removeEventListener("DOMContentLoaded",D,!1),p.ready()):e.readyState==="complete"&&(e.detachEvent("onreadystatechange",D),p.ready())},E={};p.fn=p.prototype={constructor:p,init:function(a,c,d){var f,g,h,i;if(!a)return this;if(a.nodeType)return this.context=this[0]=a,this.length=1,this;if(typeof a=="string"){a.charAt(0)==="<"&&a.charAt(a.length-1)===">"&&a.length>=3?f=[null,a,null]:f=u.exec(a);if(f&&(f[1]||!c)){if(f[1])return c=c instanceof p?c[0]:c,i=c&&c.nodeType?c.ownerDocument||c:e,a=p.parseHTML(f[1],i,!0),v.test(f[1])&&p.isPlainObject(c)&&this.attr.call(a,c,!0),p.merge(this,a);g=e.getElementById(f[2]);if(g&&g.parentNode){if(g.id!==f[2])return d.find(a);this.length=1,this[0]=g}return this.context=e,this.selector=a,this}return!c||c.jquery?(c||d).find(a):this.constructor(c).find(a)}return p.isFunction(a)?d.ready(a):(a.selector!==b&&(this.selector=a.selector,this.context=a.context),p.makeArray(a,this))},selector:"",jquery:"1.8.2",length:0,size:function(){return this.length},toArray:function(){return k.call(this)},get:function(a){return a==null?this.toArray():a<0?this[this.length+a]:this[a]},pushStack:function(a,b,c){var d=p.merge(this.constructor(),a);return d.prevObject=this,d.context=this.context,b==="find"?d.selector=this.selector+(this.selector?" ":"")+c:b&&(d.selector=this.selector+"."+b+"("+c+")"),d},each:function(a,b){return p.each(this,a,b)},ready:function(a){return p.ready.promise().done(a),this},eq:function(a){return a=+a,a===-1?this.slice(a):this.slice(a,a+1)},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},slice:function(){return this.pushStack(k.apply(this,arguments),"slice",k.call(arguments).join(","))},map:function(a){return this.pushStack(p.map(this,function(b,c){return a.call(b,c,b)}))},end:function(){return this.prevObject||this.constructor(null)},push:j,sort:[].sort,splice:[].splice},p.fn.init.prototype=p.fn,p.extend=p.fn.extend=function(){var a,c,d,e,f,g,h=arguments[0]||{},i=1,j=arguments.length,k=!1;typeof h=="boolean"&&(k=h,h=arguments[1]||{},i=2),typeof h!="object"&&!p.isFunction(h)&&(h={}),j===i&&(h=this,--i);for(;i<j;i++)if((a=arguments[i])!=null)for(c in a){d=h[c],e=a[c];if(h===e)continue;k&&e&&(p.isPlainObject(e)||(f=p.isArray(e)))?(f?(f=!1,g=d&&p.isArray(d)?d:[]):g=d&&p.isPlainObject(d)?d:{},h[c]=p.extend(k,g,e)):e!==b&&(h[c]=e)}return h},p.extend({noConflict:function(b){return a.$===p&&(a.$=i),b&&a.jQuery===p&&(a.jQuery=h),p},isReady:!1,readyWait:1,holdReady:function(a){a?p.readyWait++:p.ready(!0)},ready:function(a){if(a===!0?--p.readyWait:p.isReady)return;if(!e.body)return setTimeout(p.ready,1);p.isReady=!0;if(a!==!0&&--p.readyWait>0)return;d.resolveWith(e,[p]),p.fn.trigger&&p(e).trigger("ready").off("ready")},isFunction:function(a){return p.type(a)==="function"},isArray:Array.isArray||function(a){return p.type(a)==="array"},isWindow:function(a){return a!=null&&a==a.window},isNumeric:function(a){return!isNaN(parseFloat(a))&&isFinite(a)},type:function(a){return a==null?String(a):E[m.call(a)]||"object"},isPlainObject:function(a){if(!a||p.type(a)!=="object"||a.nodeType||p.isWindow(a))return!1;try{if(a.constructor&&!n.call(a,"constructor")&&!n.call(a.constructor.prototype,"isPrototypeOf"))return!1}catch(c){return!1}var d;for(d in a);return d===b||n.call(a,d)},isEmptyObject:function(a){var b;for(b in a)return!1;return!0},error:function(a){throw new Error(a)},parseHTML:function(a,b,c){var d;return!a||typeof a!="string"?null:(typeof b=="boolean"&&(c=b,b=0),b=b||e,(d=v.exec(a))?[b.createElement(d[1])]:(d=p.buildFragment([a],b,c?null:[]),p.merge([],(d.cacheable?p.clone(d.fragment):d.fragment).childNodes)))},parseJSON:function(b){if(!b||typeof b!="string")return null;b=p.trim(b);if(a.JSON&&a.JSON.parse)return a.JSON.parse(b);if(w.test(b.replace(y,"@").replace(z,"]").replace(x,"")))return(new Function("return "+b))();p.error("Invalid JSON: "+b)},parseXML:function(c){var d,e;if(!c||typeof c!="string")return null;try{a.DOMParser?(e=new DOMParser,d=e.parseFromString(c,"text/xml")):(d=new ActiveXObject("Microsoft.XMLDOM"),d.async="false",d.loadXML(c))}catch(f){d=b}return(!d||!d.documentElement||d.getElementsByTagName("parsererror").length)&&p.error("Invalid XML: "+c),d},noop:function(){},globalEval:function(b){b&&r.test(b)&&(a.execScript||function(b){a.eval.call(a,b)})(b)},camelCase:function(a){return a.replace(A,"ms-").replace(B,C)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toLowerCase()===b.toLowerCase()},each:function(a,c,d){var e,f=0,g=a.length,h=g===b||p.isFunction(a);if(d){if(h){for(e in a)if(c.apply(a[e],d)===!1)break}else for(;f<g;)if(c.apply(a[f++],d)===!1)break}else if(h){for(e in a)if(c.call(a[e],e,a[e])===!1)break}else for(;f<g;)if(c.call(a[f],f,a[f++])===!1)break;return a},trim:o&&!o.call(" ")?function(a){return a==null?"":o.call(a)}:function(a){return a==null?"":(a+"").replace(t,"")},makeArray:function(a,b){var c,d=b||[];return a!=null&&(c=p.type(a),a.length==null||c==="string"||c==="function"||c==="regexp"||p.isWindow(a)?j.call(d,a):p.merge(d,a)),d},inArray:function(a,b,c){var d;if(b){if(l)return l.call(b,a,c);d=b.length,c=c?c<0?Math.max(0,d+c):c:0;for(;c<d;c++)if(c in b&&b[c]===a)return c}return-1},merge:function(a,c){var d=c.length,e=a.length,f=0;if(typeof d=="number")for(;f<d;f++)a[e++]=c[f];else while(c[f]!==b)a[e++]=c[f++];return a.length=e,a},grep:function(a,b,c){var d,e=[],f=0,g=a.length;c=!!c;for(;f<g;f++)d=!!b(a[f],f),c!==d&&e.push(a[f]);return e},map:function(a,c,d){var e,f,g=[],h=0,i=a.length,j=a instanceof p||i!==b&&typeof i=="number"&&(i>0&&a[0]&&a[i-1]||i===0||p.isArray(a));if(j)for(;h<i;h++)e=c(a[h],h,d),e!=null&&(g[g.length]=e);else for(f in a)e=c(a[f],f,d),e!=null&&(g[g.length]=e);return g.concat.apply([],g)},guid:1,proxy:function(a,c){var d,e,f;return typeof c=="string"&&(d=a[c],c=a,a=d),p.isFunction(a)?(e=k.call(arguments,2),f=function(){return a.apply(c,e.concat(k.call(arguments)))},f.guid=a.guid=a.guid||p.guid++,f):b},access:function(a,c,d,e,f,g,h){var i,j=d==null,k=0,l=a.length;if(d&&typeof d=="object"){for(k in d)p.access(a,c,k,d[k],1,g,e);f=1}else if(e!==b){i=h===b&&p.isFunction(e),j&&(i?(i=c,c=function(a,b,c){return i.call(p(a),c)}):(c.call(a,e),c=null));if(c)for(;k<l;k++)c(a[k],d,i?e.call(a[k],k,c(a[k],d)):e,h);f=1}return f?a:j?c.call(a):l?c(a[0],d):g},now:function(){return(new Date).getTime()}}),p.ready.promise=function(b){if(!d){d=p.Deferred();if(e.readyState==="complete")setTimeout(p.ready,1);else if(e.addEventListener)e.addEventListener("DOMContentLoaded",D,!1),a.addEventListener("load",p.ready,!1);else{e.attachEvent("onreadystatechange",D),a.attachEvent("onload",p.ready);var c=!1;try{c=a.frameElement==null&&e.documentElement}catch(f){}c&&c.doScroll&&function g(){if(!p.isReady){try{c.doScroll("left")}catch(a){return setTimeout(g,50)}p.ready()}}()}}return d.promise(b)},p.each("Boolean Number String Function Array Date RegExp Object".split(" "),function(a,b){E["[object "+b+"]"]=b.toLowerCase()}),c=p(e);var F={};p.Callbacks=function(a){a=typeof a=="string"?F[a]||G(a):p.extend({},a);var c,d,e,f,g,h,i=[],j=!a.once&&[],k=function(b){c=a.memory&&b,d=!0,h=f||0,f=0,g=i.length,e=!0;for(;i&&h<g;h++)if(i[h].apply(b[0],b[1])===!1&&a.stopOnFalse){c=!1;break}e=!1,i&&(j?j.length&&k(j.shift()):c?i=[]:l.disable())},l={add:function(){if(i){var b=i.length;(function d(b){p.each(b,function(b,c){var e=p.type(c);e==="function"&&(!a.unique||!l.has(c))?i.push(c):c&&c.length&&e!=="string"&&d(c)})})(arguments),e?g=i.length:c&&(f=b,k(c))}return this},remove:function(){return i&&p.each(arguments,function(a,b){var c;while((c=p.inArray(b,i,c))>-1)i.splice(c,1),e&&(c<=g&&g--,c<=h&&h--)}),this},has:function(a){return p.inArray(a,i)>-1},empty:function(){return i=[],this},disable:function(){return i=j=c=b,this},disabled:function(){return!i},lock:function(){return j=b,c||l.disable(),this},locked:function(){return!j},fireWith:function(a,b){return b=b||[],b=[a,b.slice?b.slice():b],i&&(!d||j)&&(e?j.push(b):k(b)),this},fire:function(){return l.fireWith(this,arguments),this},fired:function(){return!!d}};return l},p.extend({Deferred:function(a){var b=[["resolve","done",p.Callbacks("once memory"),"resolved"],["reject","fail",p.Callbacks("once memory"),"rejected"],["notify","progress",p.Callbacks("memory")]],c="pending",d={state:function(){return c},always:function(){return e.done(arguments).fail(arguments),this},then:function(){var a=arguments;return p.Deferred(function(c){p.each(b,function(b,d){var f=d[0],g=a[b];e[d[1]](p.isFunction(g)?function(){var a=g.apply(this,arguments);a&&p.isFunction(a.promise)?a.promise().done(c.resolve).fail(c.reject).progress(c.notify):c[f+"With"](this===e?c:this,[a])}:c[f])}),a=null}).promise()},promise:function(a){return a!=null?p.extend(a,d):d}},e={};return d.pipe=d.then,p.each(b,function(a,f){var g=f[2],h=f[3];d[f[1]]=g.add,h&&g.add(function(){c=h},b[a^1][2].disable,b[2][2].lock),e[f[0]]=g.fire,e[f[0]+"With"]=g.fireWith}),d.promise(e),a&&a.call(e,e),e},when:function(a){var b=0,c=k.call(arguments),d=c.length,e=d!==1||a&&p.isFunction(a.promise)?d:0,f=e===1?a:p.Deferred(),g=function(a,b,c){return function(d){b[a]=this,c[a]=arguments.length>1?k.call(arguments):d,c===h?f.notifyWith(b,c):--e||f.resolveWith(b,c)}},h,i,j;if(d>1){h=new Array(d),i=new Array(d),j=new Array(d);for(;b<d;b++)c[b]&&p.isFunction(c[b].promise)?c[b].promise().done(g(b,j,c)).fail(f.reject).progress(g(b,i,h)):--e}return e||f.resolveWith(j,c),f.promise()}}),p.support=function(){var b,c,d,f,g,h,i,j,k,l,m,n=e.createElement("div");n.setAttribute("className","t"),n.innerHTML=" <link/><table></table><a href='/a'>a</a><input type='checkbox'/>",c=n.getElementsByTagName("*"),d=n.getElementsByTagName("a")[0],d.style.cssText="top:1px;float:left;opacity:.5";if(!c||!c.length)return{};f=e.createElement("select"),g=f.appendChild(e.createElement("option")),h=n.getElementsByTagName("input")[0],b={leadingWhitespace:n.firstChild.nodeType===3,tbody:!n.getElementsByTagName("tbody").length,htmlSerialize:!!n.getElementsByTagName("link").length,style:/top/.test(d.getAttribute("style")),hrefNormalized:d.getAttribute("href")==="/a",opacity:/^0.5/.test(d.style.opacity),cssFloat:!!d.style.cssFloat,checkOn:h.value==="on",optSelected:g.selected,getSetAttribute:n.className!=="t",enctype:!!e.createElement("form").enctype,html5Clone:e.createElement("nav").cloneNode(!0).outerHTML!=="<:nav></:nav>",boxModel:e.compatMode==="CSS1Compat",submitBubbles:!0,changeBubbles:!0,focusinBubbles:!1,deleteExpando:!0,noCloneEvent:!0,inlineBlockNeedsLayout:!1,shrinkWrapBlocks:!1,reliableMarginRight:!0,boxSizingReliable:!0,pixelPosition:!1},h.checked=!0,b.noCloneChecked=h.cloneNode(!0).checked,f.disabled=!0,b.optDisabled=!g.disabled;try{delete n.test}catch(o){b.deleteExpando=!1}!n.addEventListener&&n.attachEvent&&n.fireEvent&&(n.attachEvent("onclick",m=function(){b.noCloneEvent=!1}),n.cloneNode(!0).fireEvent("onclick"),n.detachEvent("onclick",m)),h=e.createElement("input"),h.value="t",h.setAttribute("type","radio"),b.radioValue=h.value==="t",h.setAttribute("checked","checked"),h.setAttribute("name","t"),n.appendChild(h),i=e.createDocumentFragment(),i.appendChild(n.lastChild),b.checkClone=i.cloneNode(!0).cloneNode(!0).lastChild.checked,b.appendChecked=h.checked,i.removeChild(h),i.appendChild(n);if(n.attachEvent)for(k in{submit:!0,change:!0,focusin:!0})j="on"+k,l=j in n,l||(n.setAttribute(j,"return;"),l=typeof n[j]=="function"),b[k+"Bubbles"]=l;return p(function(){var c,d,f,g,h="padding:0;margin:0;border:0;display:block;overflow:hidden;",i=e.getElementsByTagName("body")[0];if(!i)return;c=e.createElement("div"),c.style.cssText="visibility:hidden;border:0;width:0;height:0;position:static;top:0;margin-top:1px",i.insertBefore(c,i.firstChild),d=e.createElement("div"),c.appendChild(d),d.innerHTML="<table><tr><td></td><td>t</td></tr></table>",f=d.getElementsByTagName("td"),f[0].style.cssText="padding:0;margin:0;border:0;display:none",l=f[0].offsetHeight===0,f[0].style.display="",f[1].style.display="none",b.reliableHiddenOffsets=l&&f[0].offsetHeight===0,d.innerHTML="",d.style.cssText="box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;padding:1px;border:1px;display:block;width:4px;margin-top:1%;position:absolute;top:1%;",b.boxSizing=d.offsetWidth===4,b.doesNotIncludeMarginInBodyOffset=i.offsetTop!==1,a.getComputedStyle&&(b.pixelPosition=(a.getComputedStyle(d,null)||{}).top!=="1%",b.boxSizingReliable=(a.getComputedStyle(d,null)||{width:"4px"}).width==="4px",g=e.createElement("div"),g.style.cssText=d.style.cssText=h,g.style.marginRight=g.style.width="0",d.style.width="1px",d.appendChild(g),b.reliableMarginRight=!parseFloat((a.getComputedStyle(g,null)||{}).marginRight)),typeof d.style.zoom!="undefined"&&(d.innerHTML="",d.style.cssText=h+"width:1px;padding:1px;display:inline;zoom:1",b.inlineBlockNeedsLayout=d.offsetWidth===3,d.style.display="block",d.style.overflow="visible",d.innerHTML="<div></div>",d.firstChild.style.width="5px",b.shrinkWrapBlocks=d.offsetWidth!==3,c.style.zoom=1),i.removeChild(c),c=d=f=g=null}),i.removeChild(n),c=d=f=g=h=i=n=null,b}();var H=/(?:\{[\s\S]*\}|\[[\s\S]*\])$/,I=/([A-Z])/g;p.extend({cache:{},deletedIds:[],uuid:0,expando:"jQuery"+(p.fn.jquery+Math.random()).replace(/\D/g,""),noData:{embed:!0,object:"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",applet:!0},hasData:function(a){return a=a.nodeType?p.cache[a[p.expando]]:a[p.expando],!!a&&!K(a)},data:function(a,c,d,e){if(!p.acceptData(a))return;var f,g,h=p.expando,i=typeof c=="string",j=a.nodeType,k=j?p.cache:a,l=j?a[h]:a[h]&&h;if((!l||!k[l]||!e&&!k[l].data)&&i&&d===b)return;l||(j?a[h]=l=p.deletedIds.pop()||p.guid++:l=h),k[l]||(k[l]={},j||(k[l].toJSON=p.noop));if(typeof c=="object"||typeof c=="function")e?k[l]=p.extend(k[l],c):k[l].data=p.extend(k[l].data,c);return f=k[l],e||(f.data||(f.data={}),f=f.data),d!==b&&(f[p.camelCase(c)]=d),i?(g=f[c],g==null&&(g=f[p.camelCase(c)])):g=f,g},removeData:function(a,b,c){if(!p.acceptData(a))return;var d,e,f,g=a.nodeType,h=g?p.cache:a,i=g?a[p.expando]:p.expando;if(!h[i])return;if(b){d=c?h[i]:h[i].data;if(d){p.isArray(b)||(b in d?b=[b]:(b=p.camelCase(b),b in d?b=[b]:b=b.split(" ")));for(e=0,f=b.length;e<f;e++)delete d[b[e]];if(!(c?K:p.isEmptyObject)(d))return}}if(!c){delete h[i].data;if(!K(h[i]))return}g?p.cleanData([a],!0):p.support.deleteExpando||h!=h.window?delete h[i]:h[i]=null},_data:function(a,b,c){return p.data(a,b,c,!0)},acceptData:function(a){var b=a.nodeName&&p.noData[a.nodeName.toLowerCase()];return!b||b!==!0&&a.getAttribute("classid")===b}}),p.fn.extend({data:function(a,c){var d,e,f,g,h,i=this[0],j=0,k=null;if(a===b){if(this.length){k=p.data(i);if(i.nodeType===1&&!p._data(i,"parsedAttrs")){f=i.attributes;for(h=f.length;j<h;j++)g=f[j].name,g.indexOf("data-")||(g=p.camelCase(g.substring(5)),J(i,g,k[g]));p._data(i,"parsedAttrs",!0)}}return k}return typeof a=="object"?this.each(function(){p.data(this,a)}):(d=a.split(".",2),d[1]=d[1]?"."+d[1]:"",e=d[1]+"!",p.access(this,function(c){if(c===b)return k=this.triggerHandler("getData"+e,[d[0]]),k===b&&i&&(k=p.data(i,a),k=J(i,a,k)),k===b&&d[1]?this.data(d[0]):k;d[1]=c,this.each(function(){var b=p(this);b.triggerHandler("setData"+e,d),p.data(this,a,c),b.triggerHandler("changeData"+e,d)})},null,c,arguments.length>1,null,!1))},removeData:function(a){return this.each(function(){p.removeData(this,a)})}}),p.extend({queue:function(a,b,c){var d;if(a)return b=(b||"fx")+"queue",d=p._data(a,b),c&&(!d||p.isArray(c)?d=p._data(a,b,p.makeArray(c)):d.push(c)),d||[]},dequeue:function(a,b){b=b||"fx";var c=p.queue(a,b),d=c.length,e=c.shift(),f=p._queueHooks(a,b),g=function(){p.dequeue(a,b)};e==="inprogress"&&(e=c.shift(),d--),e&&(b==="fx"&&c.unshift("inprogress"),delete f.stop,e.call(a,g,f)),!d&&f&&f.empty.fire()},_queueHooks:function(a,b){var c=b+"queueHooks";return p._data(a,c)||p._data(a,c,{empty:p.Callbacks("once memory").add(function(){p.removeData(a,b+"queue",!0),p.removeData(a,c,!0)})})}}),p.fn.extend({queue:function(a,c){var d=2;return typeof a!="string"&&(c=a,a="fx",d--),arguments.length<d?p.queue(this[0],a):c===b?this:this.each(function(){var b=p.queue(this,a,c);p._queueHooks(this,a),a==="fx"&&b[0]!=="inprogress"&&p.dequeue(this,a)})},dequeue:function(a){return this.each(function(){p.dequeue(this,a)})},delay:function(a,b){return a=p.fx?p.fx.speeds[a]||a:a,b=b||"fx",this.queue(b,function(b,c){var d=setTimeout(b,a);c.stop=function(){clearTimeout(d)}})},clearQueue:function(a){return this.queue(a||"fx",[])},promise:function(a,c){var d,e=1,f=p.Deferred(),g=this,h=this.length,i=function(){--e||f.resolveWith(g,[g])};typeof a!="string"&&(c=a,a=b),a=a||"fx";while(h--)d=p._data(g[h],a+"queueHooks"),d&&d.empty&&(e++,d.empty.add(i));return i(),f.promise(c)}});var L,M,N,O=/[\t\r\n]/g,P=/\r/g,Q=/^(?:button|input)$/i,R=/^(?:button|input|object|select|textarea)$/i,S=/^a(?:rea|)$/i,T=/^(?:autofocus|autoplay|async|checked|controls|defer|disabled|hidden|loop|multiple|open|readonly|required|scoped|selected)$/i,U=p.support.getSetAttribute;p.fn.extend({attr:function(a,b){return p.access(this,p.attr,a,b,arguments.length>1)},removeAttr:function(a){return this.each(function(){p.removeAttr(this,a)})},prop:function(a,b){return p.access(this,p.prop,a,b,arguments.length>1)},removeProp:function(a){return a=p.propFix[a]||a,this.each(function(){try{this[a]=b,delete this[a]}catch(c){}})},addClass:function(a){var b,c,d,e,f,g,h;if(p.isFunction(a))return this.each(function(b){p(this).addClass(a.call(this,b,this.className))});if(a&&typeof a=="string"){b=a.split(s);for(c=0,d=this.length;c<d;c++){e=this[c];if(e.nodeType===1)if(!e.className&&b.length===1)e.className=a;else{f=" "+e.className+" ";for(g=0,h=b.length;g<h;g++)f.indexOf(" "+b[g]+" ")<0&&(f+=b[g]+" ");e.className=p.trim(f)}}}return this},removeClass:function(a){var c,d,e,f,g,h,i;if(p.isFunction(a))return this.each(function(b){p(this).removeClass(a.call(this,b,this.className))});if(a&&typeof a=="string"||a===b){c=(a||"").split(s);for(h=0,i=this.length;h<i;h++){e=this[h];if(e.nodeType===1&&e.className){d=(" "+e.className+" ").replace(O," ");for(f=0,g=c.length;f<g;f++)while(d.indexOf(" "+c[f]+" ")>=0)d=d.replace(" "+c[f]+" "," ");e.className=a?p.trim(d):""}}}return this},toggleClass:function(a,b){var c=typeof a,d=typeof b=="boolean";return p.isFunction(a)?this.each(function(c){p(this).toggleClass(a.call(this,c,this.className,b),b)}):this.each(function(){if(c==="string"){var e,f=0,g=p(this),h=b,i=a.split(s);while(e=i[f++])h=d?h:!g.hasClass(e),g[h?"addClass":"removeClass"](e)}else if(c==="undefined"||c==="boolean")this.className&&p._data(this,"__className__",this.className),this.className=this.className||a===!1?"":p._data(this,"__className__")||""})},hasClass:function(a){var b=" "+a+" ",c=0,d=this.length;for(;c<d;c++)if(this[c].nodeType===1&&(" "+this[c].className+" ").replace(O," ").indexOf(b)>=0)return!0;return!1},val:function(a){var c,d,e,f=this[0];if(!arguments.length){if(f)return c=p.valHooks[f.type]||p.valHooks[f.nodeName.toLowerCase()],c&&"get"in c&&(d=c.get(f,"value"))!==b?d:(d=f.value,typeof d=="string"?d.replace(P,""):d==null?"":d);return}return e=p.isFunction(a),this.each(function(d){var f,g=p(this);if(this.nodeType!==1)return;e?f=a.call(this,d,g.val()):f=a,f==null?f="":typeof f=="number"?f+="":p.isArray(f)&&(f=p.map(f,function(a){return a==null?"":a+""})),c=p.valHooks[this.type]||p.valHooks[this.nodeName.toLowerCase()];if(!c||!("set"in c)||c.set(this,f,"value")===b)this.value=f})}}),p.extend({valHooks:{option:{get:function(a){var b=a.attributes.value;return!b||b.specified?a.value:a.text}},select:{get:function(a){var b,c,d,e,f=a.selectedIndex,g=[],h=a.options,i=a.type==="select-one";if(f<0)return null;c=i?f:0,d=i?f+1:h.length;for(;c<d;c++){e=h[c];if(e.selected&&(p.support.optDisabled?!e.disabled:e.getAttribute("disabled")===null)&&(!e.parentNode.disabled||!p.nodeName(e.parentNode,"optgroup"))){b=p(e).val();if(i)return b;g.push(b)}}return i&&!g.length&&h.length?p(h[f]).val():g},set:function(a,b){var c=p.makeArray(b);return p(a).find("option").each(function(){this.selected=p.inArray(p(this).val(),c)>=0}),c.length||(a.selectedIndex=-1),c}}},attrFn:{},attr:function(a,c,d,e){var f,g,h,i=a.nodeType;if(!a||i===3||i===8||i===2)return;if(e&&p.isFunction(p.fn[c]))return p(a)[c](d);if(typeof a.getAttribute=="undefined")return p.prop(a,c,d);h=i!==1||!p.isXMLDoc(a),h&&(c=c.toLowerCase(),g=p.attrHooks[c]||(T.test(c)?M:L));if(d!==b){if(d===null){p.removeAttr(a,c);return}return g&&"set"in g&&h&&(f=g.set(a,d,c))!==b?f:(a.setAttribute(c,d+""),d)}return g&&"get"in g&&h&&(f=g.get(a,c))!==null?f:(f=a.getAttribute(c),f===null?b:f)},removeAttr:function(a,b){var c,d,e,f,g=0;if(b&&a.nodeType===1){d=b.split(s);for(;g<d.length;g++)e=d[g],e&&(c=p.propFix[e]||e,f=T.test(e),f||p.attr(a,e,""),a.removeAttribute(U?e:c),f&&c in a&&(a[c]=!1))}},attrHooks:{type:{set:function(a,b){if(Q.test(a.nodeName)&&a.parentNode)p.error("type property can't be changed");else if(!p.support.radioValue&&b==="radio"&&p.nodeName(a,"input")){var c=a.value;return a.setAttribute("type",b),c&&(a.value=c),b}}},value:{get:function(a,b){return L&&p.nodeName(a,"button")?L.get(a,b):b in a?a.value:null},set:function(a,b,c){if(L&&p.nodeName(a,"button"))return L.set(a,b,c);a.value=b}}},propFix:{tabindex:"tabIndex",readonly:"readOnly","for":"htmlFor","class":"className",maxlength:"maxLength",cellspacing:"cellSpacing",cellpadding:"cellPadding",rowspan:"rowSpan",colspan:"colSpan",usemap:"useMap",frameborder:"frameBorder",contenteditable:"contentEditable"},prop:function(a,c,d){var e,f,g,h=a.nodeType;if(!a||h===3||h===8||h===2)return;return g=h!==1||!p.isXMLDoc(a),g&&(c=p.propFix[c]||c,f=p.propHooks[c]),d!==b?f&&"set"in f&&(e=f.set(a,d,c))!==b?e:a[c]=d:f&&"get"in f&&(e=f.get(a,c))!==null?e:a[c]},propHooks:{tabIndex:{get:function(a){var c=a.getAttributeNode("tabindex");return c&&c.specified?parseInt(c.value,10):R.test(a.nodeName)||S.test(a.nodeName)&&a.href?0:b}}}}),M={get:function(a,c){var d,e=p.prop(a,c);return e===!0||typeof e!="boolean"&&(d=a.getAttributeNode(c))&&d.nodeValue!==!1?c.toLowerCase():b},set:function(a,b,c){var d;return b===!1?p.removeAttr(a,c):(d=p.propFix[c]||c,d in a&&(a[d]=!0),a.setAttribute(c,c.toLowerCase())),c}},U||(N={name:!0,id:!0,coords:!0},L=p.valHooks.button={get:function(a,c){var d;return d=a.getAttributeNode(c),d&&(N[c]?d.value!=="":d.specified)?d.value:b},set:function(a,b,c){var d=a.getAttributeNode(c);return d||(d=e.createAttribute(c),a.setAttributeNode(d)),d.value=b+""}},p.each(["width","height"],function(a,b){p.attrHooks[b]=p.extend(p.attrHooks[b],{set:function(a,c){if(c==="")return a.setAttribute(b,"auto"),c}})}),p.attrHooks.contenteditable={get:L.get,set:function(a,b,c){b===""&&(b="false"),L.set(a,b,c)}}),p.support.hrefNormalized||p.each(["href","src","width","height"],function(a,c){p.attrHooks[c]=p.extend(p.attrHooks[c],{get:function(a){var d=a.getAttribute(c,2);return d===null?b:d}})}),p.support.style||(p.attrHooks.style={get:function(a){return a.style.cssText.toLowerCase()||b},set:function(a,b){return a.style.cssText=b+""}}),p.support.optSelected||(p.propHooks.selected=p.extend(p.propHooks.selected,{get:function(a){var b=a.parentNode;return b&&(b.selectedIndex,b.parentNode&&b.parentNode.selectedIndex),null}})),p.support.enctype||(p.propFix.enctype="encoding"),p.support.checkOn||p.each(["radio","checkbox"],function(){p.valHooks[this]={get:function(a){return a.getAttribute("value")===null?"on":a.value}}}),p.each(["radio","checkbox"],function(){p.valHooks[this]=p.extend(p.valHooks[this],{set:function(a,b){if(p.isArray(b))return a.checked=p.inArray(p(a).val(),b)>=0}})});var V=/^(?:textarea|input|select)$/i,W=/^([^\.]*|)(?:\.(.+)|)$/,X=/(?:^|\s)hover(\.\S+|)\b/,Y=/^key/,Z=/^(?:mouse|contextmenu)|click/,$=/^(?:focusinfocus|focusoutblur)$/,_=function(a){return p.event.special.hover?a:a.replace(X,"mouseenter$1 mouseleave$1")};p.event={add:function(a,c,d,e,f){var g,h,i,j,k,l,m,n,o,q,r;if(a.nodeType===3||a.nodeType===8||!c||!d||!(g=p._data(a)))return;d.handler&&(o=d,d=o.handler,f=o.selector),d.guid||(d.guid=p.guid++),i=g.events,i||(g.events=i={}),h=g.handle,h||(g.handle=h=function(a){return typeof p!="undefined"&&(!a||p.event.triggered!==a.type)?p.event.dispatch.apply(h.elem,arguments):b},h.elem=a),c=p.trim(_(c)).split(" ");for(j=0;j<c.length;j++){k=W.exec(c[j])||[],l=k[1],m=(k[2]||"").split(".").sort(),r=p.event.special[l]||{},l=(f?r.delegateType:r.bindType)||l,r=p.event.special[l]||{},n=p.extend({type:l,origType:k[1],data:e,handler:d,guid:d.guid,selector:f,needsContext:f&&p.expr.match.needsContext.test(f),namespace:m.join(".")},o),q=i[l];if(!q){q=i[l]=[],q.delegateCount=0;if(!r.setup||r.setup.call(a,e,m,h)===!1)a.addEventListener?a.addEventListener(l,h,!1):a.attachEvent&&a.attachEvent("on"+l,h)}r.add&&(r.add.call(a,n),n.handler.guid||(n.handler.guid=d.guid)),f?q.splice(q.delegateCount++,0,n):q.push(n),p.event.global[l]=!0}a=null},global:{},remove:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,n,o,q,r=p.hasData(a)&&p._data(a);if(!r||!(m=r.events))return;b=p.trim(_(b||"")).split(" ");for(f=0;f<b.length;f++){g=W.exec(b[f])||[],h=i=g[1],j=g[2];if(!h){for(h in m)p.event.remove(a,h+b[f],c,d,!0);continue}n=p.event.special[h]||{},h=(d?n.delegateType:n.bindType)||h,o=m[h]||[],k=o.length,j=j?new RegExp("(^|\\.)"+j.split(".").sort().join("\\.(?:.*\\.|)")+"(\\.|$)"):null;for(l=0;l<o.length;l++)q=o[l],(e||i===q.origType)&&(!c||c.guid===q.guid)&&(!j||j.test(q.namespace))&&(!d||d===q.selector||d==="**"&&q.selector)&&(o.splice(l--,1),q.selector&&o.delegateCount--,n.remove&&n.remove.call(a,q));o.length===0&&k!==o.length&&((!n.teardown||n.teardown.call(a,j,r.handle)===!1)&&p.removeEvent(a,h,r.handle),delete m[h])}p.isEmptyObject(m)&&(delete r.handle,p.removeData(a,"events",!0))},customEvent:{getData:!0,setData:!0,changeData:!0},trigger:function(c,d,f,g){if(!f||f.nodeType!==3&&f.nodeType!==8){var h,i,j,k,l,m,n,o,q,r,s=c.type||c,t=[];if($.test(s+p.event.triggered))return;s.indexOf("!")>=0&&(s=s.slice(0,-1),i=!0),s.indexOf(".")>=0&&(t=s.split("."),s=t.shift(),t.sort());if((!f||p.event.customEvent[s])&&!p.event.global[s])return;c=typeof c=="object"?c[p.expando]?c:new p.Event(s,c):new p.Event(s),c.type=s,c.isTrigger=!0,c.exclusive=i,c.namespace=t.join("."),c.namespace_re=c.namespace?new RegExp("(^|\\.)"+t.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,m=s.indexOf(":")<0?"on"+s:"";if(!f){h=p.cache;for(j in h)h[j].events&&h[j].events[s]&&p.event.trigger(c,d,h[j].handle.elem,!0);return}c.result=b,c.target||(c.target=f),d=d!=null?p.makeArray(d):[],d.unshift(c),n=p.event.special[s]||{};if(n.trigger&&n.trigger.apply(f,d)===!1)return;q=[[f,n.bindType||s]];if(!g&&!n.noBubble&&!p.isWindow(f)){r=n.delegateType||s,k=$.test(r+s)?f:f.parentNode;for(l=f;k;k=k.parentNode)q.push([k,r]),l=k;l===(f.ownerDocument||e)&&q.push([l.defaultView||l.parentWindow||a,r])}for(j=0;j<q.length&&!c.isPropagationStopped();j++)k=q[j][0],c.type=q[j][1],o=(p._data(k,"events")||{})[c.type]&&p._data(k,"handle"),o&&o.apply(k,d),o=m&&k[m],o&&p.acceptData(k)&&o.apply&&o.apply(k,d)===!1&&c.preventDefault();return c.type=s,!g&&!c.isDefaultPrevented()&&(!n._default||n._default.apply(f.ownerDocument,d)===!1)&&(s!=="click"||!p.nodeName(f,"a"))&&p.acceptData(f)&&m&&f[s]&&(s!=="focus"&&s!=="blur"||c.target.offsetWidth!==0)&&!p.isWindow(f)&&(l=f[m],l&&(f[m]=null),p.event.triggered=s,f[s](),p.event.triggered=b,l&&(f[m]=l)),c.result}return},dispatch:function(c){c=p.event.fix(c||a.event);var d,e,f,g,h,i,j,l,m,n,o=(p._data(this,"events")||{})[c.type]||[],q=o.delegateCount,r=k.call(arguments),s=!c.exclusive&&!c.namespace,t=p.event.special[c.type]||{},u=[];r[0]=c,c.delegateTarget=this;if(t.preDispatch&&t.preDispatch.call(this,c)===!1)return;if(q&&(!c.button||c.type!=="click"))for(f=c.target;f!=this;f=f.parentNode||this)if(f.disabled!==!0||c.type!=="click"){h={},j=[];for(d=0;d<q;d++)l=o[d],m=l.selector,h[m]===b&&(h[m]=l.needsContext?p(m,this).index(f)>=0:p.find(m,this,null,[f]).length),h[m]&&j.push(l);j.length&&u.push({elem:f,matches:j})}o.length>q&&u.push({elem:this,matches:o.slice(q)});for(d=0;d<u.length&&!c.isPropagationStopped();d++){i=u[d],c.currentTarget=i.elem;for(e=0;e<i.matches.length&&!c.isImmediatePropagationStopped();e++){l=i.matches[e];if(s||!c.namespace&&!l.namespace||c.namespace_re&&c.namespace_re.test(l.namespace))c.data=l.data,c.handleObj=l,g=((p.event.special[l.origType]||{}).handle||l.handler).apply(i.elem,r),g!==b&&(c.result=g,g===!1&&(c.preventDefault(),c.stopPropagation()))}}return t.postDispatch&&t.postDispatch.call(this,c),c.result},props:"attrChange attrName relatedNode srcElement altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),fixHooks:{},keyHooks:{props:"char charCode key keyCode".split(" "),filter:function(a,b){return a.which==null&&(a.which=b.charCode!=null?b.charCode:b.keyCode),a}},mouseHooks:{props:"button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "),filter:function(a,c){var d,f,g,h=c.button,i=c.fromElement;return a.pageX==null&&c.clientX!=null&&(d=a.target.ownerDocument||e,f=d.documentElement,g=d.body,a.pageX=c.clientX+(f&&f.scrollLeft||g&&g.scrollLeft||0)-(f&&f.clientLeft||g&&g.clientLeft||0),a.pageY=c.clientY+(f&&f.scrollTop||g&&g.scrollTop||0)-(f&&f.clientTop||g&&g.clientTop||0)),!a.relatedTarget&&i&&(a.relatedTarget=i===a.target?c.toElement:i),!a.which&&h!==b&&(a.which=h&1?1:h&2?3:h&4?2:0),a}},fix:function(a){if(a[p.expando])return a;var b,c,d=a,f=p.event.fixHooks[a.type]||{},g=f.props?this.props.concat(f.props):this.props;a=p.Event(d);for(b=g.length;b;)c=g[--b],a[c]=d[c];return a.target||(a.target=d.srcElement||e),a.target.nodeType===3&&(a.target=a.target.parentNode),a.metaKey=!!a.metaKey,f.filter?f.filter(a,d):a},special:{load:{noBubble:!0},focus:{delegateType:"focusin"},blur:{delegateType:"focusout"},beforeunload:{setup:function(a,b,c){p.isWindow(this)&&(this.onbeforeunload=c)},teardown:function(a,b){this.onbeforeunload===b&&(this.onbeforeunload=null)}}},simulate:function(a,b,c,d){var e=p.extend(new p.Event,c,{type:a,isSimulated:!0,originalEvent:{}});d?p.event.trigger(e,null,b):p.event.dispatch.call(b,e),e.isDefaultPrevented()&&c.preventDefault()}},p.event.handle=p.event.dispatch,p.removeEvent=e.removeEventListener?function(a,b,c){a.removeEventListener&&a.removeEventListener(b,c,!1)}:function(a,b,c){var d="on"+b;a.detachEvent&&(typeof a[d]=="undefined"&&(a[d]=null),a.detachEvent(d,c))},p.Event=function(a,b){if(this instanceof p.Event)a&&a.type?(this.originalEvent=a,this.type=a.type,this.isDefaultPrevented=a.defaultPrevented||a.returnValue===!1||a.getPreventDefault&&a.getPreventDefault()?bb:ba):this.type=a,b&&p.extend(this,b),this.timeStamp=a&&a.timeStamp||p.now(),this[p.expando]=!0;else return new p.Event(a,b)},p.Event.prototype={preventDefault:function(){this.isDefaultPrevented=bb;var a=this.originalEvent;if(!a)return;a.preventDefault?a.preventDefault():a.returnValue=!1},stopPropagation:function(){this.isPropagationStopped=bb;var a=this.originalEvent;if(!a)return;a.stopPropagation&&a.stopPropagation(),a.cancelBubble=!0},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=bb,this.stopPropagation()},isDefaultPrevented:ba,isPropagationStopped:ba,isImmediatePropagationStopped:ba},p.each({mouseenter:"mouseover",mouseleave:"mouseout"},function(a,b){p.event.special[a]={delegateType:b,bindType:b,handle:function(a){var c,d=this,e=a.relatedTarget,f=a.handleObj,g=f.selector;if(!e||e!==d&&!p.contains(d,e))a.type=f.origType,c=f.handler.apply(this,arguments),a.type=b;return c}}}),p.support.submitBubbles||(p.event.special.submit={setup:function(){if(p.nodeName(this,"form"))return!1;p.event.add(this,"click._submit keypress._submit",function(a){var c=a.target,d=p.nodeName(c,"input")||p.nodeName(c,"button")?c.form:b;d&&!p._data(d,"_submit_attached")&&(p.event.add(d,"submit._submit",function(a){a._submit_bubble=!0}),p._data(d,"_submit_attached",!0))})},postDispatch:function(a){a._submit_bubble&&(delete a._submit_bubble,this.parentNode&&!a.isTrigger&&p.event.simulate("submit",this.parentNode,a,!0))},teardown:function(){if(p.nodeName(this,"form"))return!1;p.event.remove(this,"._submit")}}),p.support.changeBubbles||(p.event.special.change={setup:function(){if(V.test(this.nodeName)){if(this.type==="checkbox"||this.type==="radio")p.event.add(this,"propertychange._change",function(a){a.originalEvent.propertyName==="checked"&&(this._just_changed=!0)}),p.event.add(this,"click._change",function(a){this._just_changed&&!a.isTrigger&&(this._just_changed=!1),p.event.simulate("change",this,a,!0)});return!1}p.event.add(this,"beforeactivate._change",function(a){var b=a.target;V.test(b.nodeName)&&!p._data(b,"_change_attached")&&(p.event.add(b,"change._change",function(a){this.parentNode&&!a.isSimulated&&!a.isTrigger&&p.event.simulate("change",this.parentNode,a,!0)}),p._data(b,"_change_attached",!0))})},handle:function(a){var b=a.target;if(this!==b||a.isSimulated||a.isTrigger||b.type!=="radio"&&b.type!=="checkbox")return a.handleObj.handler.apply(this,arguments)},teardown:function(){return p.event.remove(this,"._change"),!V.test(this.nodeName)}}),p.support.focusinBubbles||p.each({focus:"focusin",blur:"focusout"},function(a,b){var c=0,d=function(a){p.event.simulate(b,a.target,p.event.fix(a),!0)};p.event.special[b]={setup:function(){c++===0&&e.addEventListener(a,d,!0)},teardown:function(){--c===0&&e.removeEventListener(a,d,!0)}}}),p.fn.extend({on:function(a,c,d,e,f){var g,h;if(typeof a=="object"){typeof c!="string"&&(d=d||c,c=b);for(h in a)this.on(h,c,d,a[h],f);return this}d==null&&e==null?(e=c,d=c=b):e==null&&(typeof c=="string"?(e=d,d=b):(e=d,d=c,c=b));if(e===!1)e=ba;else if(!e)return this;return f===1&&(g=e,e=function(a){return p().off(a),g.apply(this,arguments)},e.guid=g.guid||(g.guid=p.guid++)),this.each(function(){p.event.add(this,a,e,d,c)})},one:function(a,b,c,d){return this.on(a,b,c,d,1)},off:function(a,c,d){var e,f;if(a&&a.preventDefault&&a.handleObj)return e=a.handleObj,p(a.delegateTarget).off(e.namespace?e.origType+"."+e.namespace:e.origType,e.selector,e.handler),this;if(typeof a=="object"){for(f in a)this.off(f,c,a[f]);return this}if(c===!1||typeof c=="function")d=c,c=b;return d===!1&&(d=ba),this.each(function(){p.event.remove(this,a,d,c)})},bind:function(a,b,c){return this.on(a,null,b,c)},unbind:function(a,b){return this.off(a,null,b)},live:function(a,b,c){return p(this.context).on(a,this.selector,b,c),this},die:function(a,b){return p(this.context).off(a,this.selector||"**",b),this},delegate:function(a,b,c,d){return this.on(b,a,c,d)},undelegate:function(a,b,c){return arguments.length===1?this.off(a,"**"):this.off(b,a||"**",c)},trigger:function(a,b){return this.each(function(){p.event.trigger(a,b,this)})},triggerHandler:function(a,b){if(this[0])return p.event.trigger(a,b,this[0],!0)},toggle:function(a){var b=arguments,c=a.guid||p.guid++,d=0,e=function(c){var e=(p._data(this,"lastToggle"+a.guid)||0)%d;return p._data(this,"lastToggle"+a.guid,e+1),c.preventDefault(),b[e].apply(this,arguments)||!1};e.guid=c;while(d<b.length)b[d++].guid=c;return this.click(e)},hover:function(a,b){return this.mouseenter(a).mouseleave(b||a)}}),p.each("blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error contextmenu".split(" "),function(a,b){p.fn[b]=function(a,c){return c==null&&(c=a,a=null),arguments.length>0?this.on(b,null,a,c):this.trigger(b)},Y.test(b)&&(p.event.fixHooks[b]=p.event.keyHooks),Z.test(b)&&(p.event.fixHooks[b]=p.event.mouseHooks)}),function(a,b){function bc(a,b,c,d){c=c||[],b=b||r;var e,f,i,j,k=b.nodeType;if(!a||typeof a!="string")return c;if(k!==1&&k!==9)return[];i=g(b);if(!i&&!d)if(e=P.exec(a))if(j=e[1]){if(k===9){f=b.getElementById(j);if(!f||!f.parentNode)return c;if(f.id===j)return c.push(f),c}else if(b.ownerDocument&&(f=b.ownerDocument.getElementById(j))&&h(b,f)&&f.id===j)return c.push(f),c}else{if(e[2])return w.apply(c,x.call(b.getElementsByTagName(a),0)),c;if((j=e[3])&&_&&b.getElementsByClassName)return w.apply(c,x.call(b.getElementsByClassName(j),0)),c}return bp(a.replace(L,"$1"),b,c,d,i)}function bd(a){return function(b){var c=b.nodeName.toLowerCase();return c==="input"&&b.type===a}}function be(a){return function(b){var c=b.nodeName.toLowerCase();return(c==="input"||c==="button")&&b.type===a}}function bf(a){return z(function(b){return b=+b,z(function(c,d){var e,f=a([],c.length,b),g=f.length;while(g--)c[e=f[g]]&&(c[e]=!(d[e]=c[e]))})})}function bg(a,b,c){if(a===b)return c;var d=a.nextSibling;while(d){if(d===b)return-1;d=d.nextSibling}return 1}function bh(a,b){var c,d,f,g,h,i,j,k=C[o][a];if(k)return b?0:k.slice(0);h=a,i=[],j=e.preFilter;while(h){if(!c||(d=M.exec(h)))d&&(h=h.slice(d[0].length)),i.push(f=[]);c=!1;if(d=N.exec(h))f.push(c=new q(d.shift())),h=h.slice(c.length),c.type=d[0].replace(L," ");for(g in e.filter)(d=W[g].exec(h))&&(!j[g]||(d=j[g](d,r,!0)))&&(f.push(c=new q(d.shift())),h=h.slice(c.length),c.type=g,c.matches=d);if(!c)break}return b?h.length:h?bc.error(a):C(a,i).slice(0)}function bi(a,b,d){var e=b.dir,f=d&&b.dir==="parentNode",g=u++;return b.first?function(b,c,d){while(b=b[e])if(f||b.nodeType===1)return a(b,c,d)}:function(b,d,h){if(!h){var i,j=t+" "+g+" ",k=j+c;while(b=b[e])if(f||b.nodeType===1){if((i=b[o])===k)return b.sizset;if(typeof i=="string"&&i.indexOf(j)===0){if(b.sizset)return b}else{b[o]=k;if(a(b,d,h))return b.sizset=!0,b;b.sizset=!1}}}else while(b=b[e])if(f||b.nodeType===1)if(a(b,d,h))return b}}function bj(a){return a.length>1?function(b,c,d){var e=a.length;while(e--)if(!a[e](b,c,d))return!1;return!0}:a[0]}function bk(a,b,c,d,e){var f,g=[],h=0,i=a.length,j=b!=null;for(;h<i;h++)if(f=a[h])if(!c||c(f,d,e))g.push(f),j&&b.push(h);return g}function bl(a,b,c,d,e,f){return d&&!d[o]&&(d=bl(d)),e&&!e[o]&&(e=bl(e,f)),z(function(f,g,h,i){if(f&&e)return;var j,k,l,m=[],n=[],o=g.length,p=f||bo(b||"*",h.nodeType?[h]:h,[],f),q=a&&(f||!b)?bk(p,m,a,h,i):p,r=c?e||(f?a:o||d)?[]:g:q;c&&c(q,r,h,i);if(d){l=bk(r,n),d(l,[],h,i),j=l.length;while(j--)if(k=l[j])r[n[j]]=!(q[n[j]]=k)}if(f){j=a&&r.length;while(j--)if(k=r[j])f[m[j]]=!(g[m[j]]=k)}else r=bk(r===g?r.splice(o,r.length):r),e?e(null,g,r,i):w.apply(g,r)})}function bm(a){var b,c,d,f=a.length,g=e.relative[a[0].type],h=g||e.relative[" "],i=g?1:0,j=bi(function(a){return a===b},h,!0),k=bi(function(a){return y.call(b,a)>-1},h,!0),m=[function(a,c,d){return!g&&(d||c!==l)||((b=c).nodeType?j(a,c,d):k(a,c,d))}];for(;i<f;i++)if(c=e.relative[a[i].type])m=[bi(bj(m),c)];else{c=e.filter[a[i].type].apply(null,a[i].matches);if(c[o]){d=++i;for(;d<f;d++)if(e.relative[a[d].type])break;return bl(i>1&&bj(m),i>1&&a.slice(0,i-1).join("").replace(L,"$1"),c,i<d&&bm(a.slice(i,d)),d<f&&bm(a=a.slice(d)),d<f&&a.join(""))}m.push(c)}return bj(m)}function bn(a,b){var d=b.length>0,f=a.length>0,g=function(h,i,j,k,m){var n,o,p,q=[],s=0,u="0",x=h&&[],y=m!=null,z=l,A=h||f&&e.find.TAG("*",m&&i.parentNode||i),B=t+=z==null?1:Math.E;y&&(l=i!==r&&i,c=g.el);for(;(n=A[u])!=null;u++){if(f&&n){for(o=0;p=a[o];o++)if(p(n,i,j)){k.push(n);break}y&&(t=B,c=++g.el)}d&&((n=!p&&n)&&s--,h&&x.push(n))}s+=u;if(d&&u!==s){for(o=0;p=b[o];o++)p(x,q,i,j);if(h){if(s>0)while(u--)!x[u]&&!q[u]&&(q[u]=v.call(k));q=bk(q)}w.apply(k,q),y&&!h&&q.length>0&&s+b.length>1&&bc.uniqueSort(k)}return y&&(t=B,l=z),x};return g.el=0,d?z(g):g}function bo(a,b,c,d){var e=0,f=b.length;for(;e<f;e++)bc(a,b[e],c,d);return c}function bp(a,b,c,d,f){var g,h,j,k,l,m=bh(a),n=m.length;if(!d&&m.length===1){h=m[0]=m[0].slice(0);if(h.length>2&&(j=h[0]).type==="ID"&&b.nodeType===9&&!f&&e.relative[h[1].type]){b=e.find.ID(j.matches[0].replace(V,""),b,f)[0];if(!b)return c;a=a.slice(h.shift().length)}for(g=W.POS.test(a)?-1:h.length-1;g>=0;g--){j=h[g];if(e.relative[k=j.type])break;if(l=e.find[k])if(d=l(j.matches[0].replace(V,""),R.test(h[0].type)&&b.parentNode||b,f)){h.splice(g,1),a=d.length&&h.join("");if(!a)return w.apply(c,x.call(d,0)),c;break}}}return i(a,m)(d,b,f,c,R.test(a)),c}function bq(){}var c,d,e,f,g,h,i,j,k,l,m=!0,n="undefined",o=("sizcache"+Math.random()).replace(".",""),q=String,r=a.document,s=r.documentElement,t=0,u=0,v=[].pop,w=[].push,x=[].slice,y=[].indexOf||function(a){var b=0,c=this.length;for(;b<c;b++)if(this[b]===a)return b;return-1},z=function(a,b){return a[o]=b==null||b,a},A=function(){var a={},b=[];return z(function(c,d){return b.push(c)>e.cacheLength&&delete a[b.shift()],a[c]=d},a)},B=A(),C=A(),D=A(),E="[\\x20\\t\\r\\n\\f]",F="(?:\\\\.|[-\\w]|[^\\x00-\\xa0])+",G=F.replace("w","w#"),H="([*^$|!~]?=)",I="\\["+E+"*("+F+")"+E+"*(?:"+H+E+"*(?:(['\"])((?:\\\\.|[^\\\\])*?)\\3|("+G+")|)|)"+E+"*\\]",J=":("+F+")(?:\\((?:(['\"])((?:\\\\.|[^\\\\])*?)\\2|([^()[\\]]*|(?:(?:"+I+")|[^:]|\\\\.)*|.*))\\)|)",K=":(even|odd|eq|gt|lt|nth|first|last)(?:\\("+E+"*((?:-\\d)?\\d*)"+E+"*\\)|)(?=[^-]|$)",L=new RegExp("^"+E+"+|((?:^|[^\\\\])(?:\\\\.)*)"+E+"+$","g"),M=new RegExp("^"+E+"*,"+E+"*"),N=new RegExp("^"+E+"*([\\x20\\t\\r\\n\\f>+~])"+E+"*"),O=new RegExp(J),P=/^(?:#([\w\-]+)|(\w+)|\.([\w\-]+))$/,Q=/^:not/,R=/[\x20\t\r\n\f]*[+~]/,S=/:not\($/,T=/h\d/i,U=/input|select|textarea|button/i,V=/\\(?!\\)/g,W={ID:new RegExp("^#("+F+")"),CLASS:new RegExp("^\\.("+F+")"),NAME:new RegExp("^\\[name=['\"]?("+F+")['\"]?\\]"),TAG:new RegExp("^("+F.replace("w","w*")+")"),ATTR:new RegExp("^"+I),PSEUDO:new RegExp("^"+J),POS:new RegExp(K,"i"),CHILD:new RegExp("^:(only|nth|first|last)-child(?:\\("+E+"*(even|odd|(([+-]|)(\\d*)n|)"+E+"*(?:([+-]|)"+E+"*(\\d+)|))"+E+"*\\)|)","i"),needsContext:new RegExp("^"+E+"*[>+~]|"+K,"i")},X=function(a){var b=r.createElement("div");try{return a(b)}catch(c){return!1}finally{b=null}},Y=X(function(a){return a.appendChild(r.createComment("")),!a.getElementsByTagName("*").length}),Z=X(function(a){return a.innerHTML="<a href='#'></a>",a.firstChild&&typeof a.firstChild.getAttribute!==n&&a.firstChild.getAttribute("href")==="#"}),$=X(function(a){a.innerHTML="<select></select>";var b=typeof a.lastChild.getAttribute("multiple");return b!=="boolean"&&b!=="string"}),_=X(function(a){return a.innerHTML="<div class='hidden e'></div><div class='hidden'></div>",!a.getElementsByClassName||!a.getElementsByClassName("e").length?!1:(a.lastChild.className="e",a.getElementsByClassName("e").length===2)}),ba=X(function(a){a.id=o+0,a.innerHTML="<a name='"+o+"'></a><div name='"+o+"'></div>",s.insertBefore(a,s.firstChild);var b=r.getElementsByName&&r.getElementsByName(o).length===2+r.getElementsByName(o+0).length;return d=!r.getElementById(o),s.removeChild(a),b});try{x.call(s.childNodes,0)[0].nodeType}catch(bb){x=function(a){var b,c=[];for(;b=this[a];a++)c.push(b);return c}}bc.matches=function(a,b){return bc(a,null,null,b)},bc.matchesSelector=function(a,b){return bc(b,null,null,[a]).length>0},f=bc.getText=function(a){var b,c="",d=0,e=a.nodeType;if(e){if(e===1||e===9||e===11){if(typeof a.textContent=="string")return a.textContent;for(a=a.firstChild;a;a=a.nextSibling)c+=f(a)}else if(e===3||e===4)return a.nodeValue}else for(;b=a[d];d++)c+=f(b);return c},g=bc.isXML=function(a){var b=a&&(a.ownerDocument||a).documentElement;return b?b.nodeName!=="HTML":!1},h=bc.contains=s.contains?function(a,b){var c=a.nodeType===9?a.documentElement:a,d=b&&b.parentNode;return a===d||!!(d&&d.nodeType===1&&c.contains&&c.contains(d))}:s.compareDocumentPosition?function(a,b){return b&&!!(a.compareDocumentPosition(b)&16)}:function(a,b){while(b=b.parentNode)if(b===a)return!0;return!1},bc.attr=function(a,b){var c,d=g(a);return d||(b=b.toLowerCase()),(c=e.attrHandle[b])?c(a):d||$?a.getAttribute(b):(c=a.getAttributeNode(b),c?typeof a[b]=="boolean"?a[b]?b:null:c.specified?c.value:null:null)},e=bc.selectors={cacheLength:50,createPseudo:z,match:W,attrHandle:Z?{}:{href:function(a){return a.getAttribute("href",2)},type:function(a){return a.getAttribute("type")}},find:{ID:d?function(a,b,c){if(typeof b.getElementById!==n&&!c){var d=b.getElementById(a);return d&&d.parentNode?[d]:[]}}:function(a,c,d){if(typeof c.getElementById!==n&&!d){var e=c.getElementById(a);return e?e.id===a||typeof e.getAttributeNode!==n&&e.getAttributeNode("id").value===a?[e]:b:[]}},TAG:Y?function(a,b){if(typeof b.getElementsByTagName!==n)return b.getElementsByTagName(a)}:function(a,b){var c=b.getElementsByTagName(a);if(a==="*"){var d,e=[],f=0;for(;d=c[f];f++)d.nodeType===1&&e.push(d);return e}return c},NAME:ba&&function(a,b){if(typeof b.getElementsByName!==n)return b.getElementsByName(name)},CLASS:_&&function(a,b,c){if(typeof b.getElementsByClassName!==n&&!c)return b.getElementsByClassName(a)}},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(a){return a[1]=a[1].replace(V,""),a[3]=(a[4]||a[5]||"").replace(V,""),a[2]==="~="&&(a[3]=" "+a[3]+" "),a.slice(0,4)},CHILD:function(a){return a[1]=a[1].toLowerCase(),a[1]==="nth"?(a[2]||bc.error(a[0]),a[3]=+(a[3]?a[4]+(a[5]||1):2*(a[2]==="even"||a[2]==="odd")),a[4]=+(a[6]+a[7]||a[2]==="odd")):a[2]&&bc.error(a[0]),a},PSEUDO:function(a){var b,c;if(W.CHILD.test(a[0]))return null;if(a[3])a[2]=a[3];else if(b=a[4])O.test(b)&&(c=bh(b,!0))&&(c=b.indexOf(")",b.length-c)-b.length)&&(b=b.slice(0,c),a[0]=a[0].slice(0,c)),a[2]=b;return a.slice(0,3)}},filter:{ID:d?function(a){return a=a.replace(V,""),function(b){return b.getAttribute("id")===a}}:function(a){return a=a.replace(V,""),function(b){var c=typeof b.getAttributeNode!==n&&b.getAttributeNode("id");return c&&c.value===a}},TAG:function(a){return a==="*"?function(){return!0}:(a=a.replace(V,"").toLowerCase(),function(b){return b.nodeName&&b.nodeName.toLowerCase()===a})},CLASS:function(a){var b=B[o][a];return b||(b=B(a,new RegExp("(^|"+E+")"+a+"("+E+"|$)"))),function(a){return b.test(a.className||typeof a.getAttribute!==n&&a.getAttribute("class")||"")}},ATTR:function(a,b,c){return function(d,e){var f=bc.attr(d,a);return f==null?b==="!=":b?(f+="",b==="="?f===c:b==="!="?f!==c:b==="^="?c&&f.indexOf(c)===0:b==="*="?c&&f.indexOf(c)>-1:b==="$="?c&&f.substr(f.length-c.length)===c:b==="~="?(" "+f+" ").indexOf(c)>-1:b==="|="?f===c||f.substr(0,c.length+1)===c+"-":!1):!0}},CHILD:function(a,b,c,d){return a==="nth"?function(a){var b,e,f=a.parentNode;if(c===1&&d===0)return!0;if(f){e=0;for(b=f.firstChild;b;b=b.nextSibling)if(b.nodeType===1){e++;if(a===b)break}}return e-=d,e===c||e%c===0&&e/c>=0}:function(b){var c=b;switch(a){case"only":case"first":while(c=c.previousSibling)if(c.nodeType===1)return!1;if(a==="first")return!0;c=b;case"last":while(c=c.nextSibling)if(c.nodeType===1)return!1;return!0}}},PSEUDO:function(a,b){var c,d=e.pseudos[a]||e.setFilters[a.toLowerCase()]||bc.error("unsupported pseudo: "+a);return d[o]?d(b):d.length>1?(c=[a,a,"",b],e.setFilters.hasOwnProperty(a.toLowerCase())?z(function(a,c){var e,f=d(a,b),g=f.length;while(g--)e=y.call(a,f[g]),a[e]=!(c[e]=f[g])}):function(a){return d(a,0,c)}):d}},pseudos:{not:z(function(a){var b=[],c=[],d=i(a.replace(L,"$1"));return d[o]?z(function(a,b,c,e){var f,g=d(a,null,e,[]),h=a.length;while(h--)if(f=g[h])a[h]=!(b[h]=f)}):function(a,e,f){return b[0]=a,d(b,null,f,c),!c.pop()}}),has:z(function(a){return function(b){return bc(a,b).length>0}}),contains:z(function(a){return function(b){return(b.textContent||b.innerText||f(b)).indexOf(a)>-1}}),enabled:function(a){return a.disabled===!1},disabled:function(a){return a.disabled===!0},checked:function(a){var b=a.nodeName.toLowerCase();return b==="input"&&!!a.checked||b==="option"&&!!a.selected},selected:function(a){return a.parentNode&&a.parentNode.selectedIndex,a.selected===!0},parent:function(a){return!e.pseudos.empty(a)},empty:function(a){var b;a=a.firstChild;while(a){if(a.nodeName>"@"||(b=a.nodeType)===3||b===4)return!1;a=a.nextSibling}return!0},header:function(a){return T.test(a.nodeName)},text:function(a){var b,c;return a.nodeName.toLowerCase()==="input"&&(b=a.type)==="text"&&((c=a.getAttribute("type"))==null||c.toLowerCase()===b)},radio:bd("radio"),checkbox:bd("checkbox"),file:bd("file"),password:bd("password"),image:bd("image"),submit:be("submit"),reset:be("reset"),button:function(a){var b=a.nodeName.toLowerCase();return b==="input"&&a.type==="button"||b==="button"},input:function(a){return U.test(a.nodeName)},focus:function(a){var b=a.ownerDocument;return a===b.activeElement&&(!b.hasFocus||b.hasFocus())&&(!!a.type||!!a.href)},active:function(a){return a===a.ownerDocument.activeElement},first:bf(function(a,b,c){return[0]}),last:bf(function(a,b,c){return[b-1]}),eq:bf(function(a,b,c){return[c<0?c+b:c]}),even:bf(function(a,b,c){for(var d=0;d<b;d+=2)a.push(d);return a}),odd:bf(function(a,b,c){for(var d=1;d<b;d+=2)a.push(d);return a}),lt:bf(function(a,b,c){for(var d=c<0?c+b:c;--d>=0;)a.push(d);return a}),gt:bf(function(a,b,c){for(var d=c<0?c+b:c;++d<b;)a.push(d);return a})}},j=s.compareDocumentPosition?function(a,b){return a===b?(k=!0,0):(!a.compareDocumentPosition||!b.compareDocumentPosition?a.compareDocumentPosition:a.compareDocumentPosition(b)&4)?-1:1}:function(a,b){if(a===b)return k=!0,0;if(a.sourceIndex&&b.sourceIndex)return a.sourceIndex-b.sourceIndex;var c,d,e=[],f=[],g=a.parentNode,h=b.parentNode,i=g;if(g===h)return bg(a,b);if(!g)return-1;if(!h)return 1;while(i)e.unshift(i),i=i.parentNode;i=h;while(i)f.unshift(i),i=i.parentNode;c=e.length,d=f.length;for(var j=0;j<c&&j<d;j++)if(e[j]!==f[j])return bg(e[j],f[j]);return j===c?bg(a,f[j],-1):bg(e[j],b,1)},[0,0].sort(j),m=!k,bc.uniqueSort=function(a){var b,c=1;k=m,a.sort(j);if(k)for(;b=a[c];c++)b===a[c-1]&&a.splice(c--,1);return a},bc.error=function(a){throw new Error("Syntax error, unrecognized expression: "+a)},i=bc.compile=function(a,b){var c,d=[],e=[],f=D[o][a];if(!f){b||(b=bh(a)),c=b.length;while(c--)f=bm(b[c]),f[o]?d.push(f):e.push(f);f=D(a,bn(e,d))}return f},r.querySelectorAll&&function(){var a,b=bp,c=/'|\\/g,d=/\=[\x20\t\r\n\f]*([^'"\]]*)[\x20\t\r\n\f]*\]/g,e=[":focus"],f=[":active",":focus"],h=s.matchesSelector||s.mozMatchesSelector||s.webkitMatchesSelector||s.oMatchesSelector||s.msMatchesSelector;X(function(a){a.innerHTML="<select><option selected=''></option></select>",a.querySelectorAll("[selected]").length||e.push("\\["+E+"*(?:checked|disabled|ismap|multiple|readonly|selected|value)"),a.querySelectorAll(":checked").length||e.push(":checked")}),X(function(a){a.innerHTML="<p test=''></p>",a.querySelectorAll("[test^='']").length&&e.push("[*^$]="+E+"*(?:\"\"|'')"),a.innerHTML="<input type='hidden'/>",a.querySelectorAll(":enabled").length||e.push(":enabled",":disabled")}),e=new RegExp(e.join("|")),bp=function(a,d,f,g,h){if(!g&&!h&&(!e||!e.test(a))){var i,j,k=!0,l=o,m=d,n=d.nodeType===9&&a;if(d.nodeType===1&&d.nodeName.toLowerCase()!=="object"){i=bh(a),(k=d.getAttribute("id"))?l=k.replace(c,"\\$&"):d.setAttribute("id",l),l="[id='"+l+"'] ",j=i.length;while(j--)i[j]=l+i[j].join("");m=R.test(a)&&d.parentNode||d,n=i.join(",")}if(n)try{return w.apply(f,x.call(m.querySelectorAll(n),0)),f}catch(p){}finally{k||d.removeAttribute("id")}}return b(a,d,f,g,h)},h&&(X(function(b){a=h.call(b,"div");try{h.call(b,"[test!='']:sizzle"),f.push("!=",J)}catch(c){}}),f=new RegExp(f.join("|")),bc.matchesSelector=function(b,c){c=c.replace(d,"='$1']");if(!g(b)&&!f.test(c)&&(!e||!e.test(c)))try{var i=h.call(b,c);if(i||a||b.document&&b.document.nodeType!==11)return i}catch(j){}return bc(c,null,null,[b]).length>0})}(),e.pseudos.nth=e.pseudos.eq,e.filters=bq.prototype=e.pseudos,e.setFilters=new bq,bc.attr=p.attr,p.find=bc,p.expr=bc.selectors,p.expr[":"]=p.expr.pseudos,p.unique=bc.uniqueSort,p.text=bc.getText,p.isXMLDoc=bc.isXML,p.contains=bc.contains}(a);var bc=/Until$/,bd=/^(?:parents|prev(?:Until|All))/,be=/^.[^:#\[\.,]*$/,bf=p.expr.match.needsContext,bg={children:!0,contents:!0,next:!0,prev:!0};p.fn.extend({find:function(a){var b,c,d,e,f,g,h=this;if(typeof a!="string")return p(a).filter(function(){for(b=0,c=h.length;b<c;b++)if(p.contains(h[b],this))return!0});g=this.pushStack("","find",a);for(b=0,c=this.length;b<c;b++){d=g.length,p.find(a,this[b],g);if(b>0)for(e=d;e<g.length;e++)for(f=0;f<d;f++)if(g[f]===g[e]){g.splice(e--,1);break}}return g},has:function(a){var b,c=p(a,this),d=c.length;return this.filter(function(){for(b=0;b<d;b++)if(p.contains(this,c[b]))return!0})},not:function(a){return this.pushStack(bj(this,a,!1),"not",a)},filter:function(a){return this.pushStack(bj(this,a,!0),"filter",a)},is:function(a){return!!a&&(typeof a=="string"?bf.test(a)?p(a,this.context).index(this[0])>=0:p.filter(a,this).length>0:this.filter(a).length>0)},closest:function(a,b){var c,d=0,e=this.length,f=[],g=bf.test(a)||typeof a!="string"?p(a,b||this.context):0;for(;d<e;d++){c=this[d];while(c&&c.ownerDocument&&c!==b&&c.nodeType!==11){if(g?g.index(c)>-1:p.find.matchesSelector(c,a)){f.push(c);break}c=c.parentNode}}return f=f.length>1?p.unique(f):f,this.pushStack(f,"closest",a)},index:function(a){return a?typeof a=="string"?p.inArray(this[0],p(a)):p.inArray(a.jquery?a[0]:a,this):this[0]&&this[0].parentNode?this.prevAll().length:-1},add:function(a,b){var c=typeof a=="string"?p(a,b):p.makeArray(a&&a.nodeType?[a]:a),d=p.merge(this.get(),c);return this.pushStack(bh(c[0])||bh(d[0])?d:p.unique(d))},addBack:function(a){return this.add(a==null?this.prevObject:this.prevObject.filter(a))}}),p.fn.andSelf=p.fn.addBack,p.each({parent:function(a){var b=a.parentNode;return b&&b.nodeType!==11?b:null},parents:function(a){return p.dir(a,"parentNode")},parentsUntil:function(a,b,c){return p.dir(a,"parentNode",c)},next:function(a){return bi(a,"nextSibling")},prev:function(a){return bi(a,"previousSibling")},nextAll:function(a){return p.dir(a,"nextSibling")},prevAll:function(a){return p.dir(a,"previousSibling")},nextUntil:function(a,b,c){return p.dir(a,"nextSibling",c)},prevUntil:function(a,b,c){return p.dir(a,"previousSibling",c)},siblings:function(a){return p.sibling((a.parentNode||{}).firstChild,a)},children:function(a){return p.sibling(a.firstChild)},contents:function(a){return p.nodeName(a,"iframe")?a.contentDocument||a.contentWindow.document:p.merge([],a.childNodes)}},function(a,b){p.fn[a]=function(c,d){var e=p.map(this,b,c);return bc.test(a)||(d=c),d&&typeof d=="string"&&(e=p.filter(d,e)),e=this.length>1&&!bg[a]?p.unique(e):e,this.length>1&&bd.test(a)&&(e=e.reverse()),this.pushStack(e,a,k.call(arguments).join(","))}}),p.extend({filter:function(a,b,c){return c&&(a=":not("+a+")"),b.length===1?p.find.matchesSelector(b[0],a)?[b[0]]:[]:p.find.matches(a,b)},dir:function(a,c,d){var e=[],f=a[c];while(f&&f.nodeType!==9&&(d===b||f.nodeType!==1||!p(f).is(d)))f.nodeType===1&&e.push(f),f=f[c];return e},sibling:function(a,b){var c=[];for(;a;a=a.nextSibling)a.nodeType===1&&a!==b&&c.push(a);return c}});var bl="abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",bm=/ jQuery\d+="(?:null|\d+)"/g,bn=/^\s+/,bo=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,bp=/<([\w:]+)/,bq=/<tbody/i,br=/<|&#?\w+;/,bs=/<(?:script|style|link)/i,bt=/<(?:script|object|embed|option|style)/i,bu=new RegExp("<(?:"+bl+")[\\s/>]","i"),bv=/^(?:checkbox|radio)$/,bw=/checked\s*(?:[^=]|=\s*.checked.)/i,bx=/\/(java|ecma)script/i,by=/^\s*<!(?:\[CDATA\[|\-\-)|[\]\-]{2}>\s*$/g,bz={option:[1,"<select multiple='multiple'>","</select>"],legend:[1,"<fieldset>","</fieldset>"],thead:[1,"<table>","</table>"],tr:[2,"<table><tbody>","</tbody></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],col:[2,"<table><tbody></tbody><colgroup>","</colgroup></table>"],area:[1,"<map>","</map>"],_default:[0,"",""]},bA=bk(e),bB=bA.appendChild(e.createElement("div"));bz.optgroup=bz.option,bz.tbody=bz.tfoot=bz.colgroup=bz.caption=bz.thead,bz.th=bz.td,p.support.htmlSerialize||(bz._default=[1,"X<div>","</div>"]),p.fn.extend({text:function(a){return p.access(this,function(a){return a===b?p.text(this):this.empty().append((this[0]&&this[0].ownerDocument||e).createTextNode(a))},null,a,arguments.length)},wrapAll:function(a){if(p.isFunction(a))return this.each(function(b){p(this).wrapAll(a.call(this,b))});if(this[0]){var b=p(a,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&b.insertBefore(this[0]),b.map(function(){var a=this;while(a.firstChild&&a.firstChild.nodeType===1)a=a.firstChild;return a}).append(this)}return this},wrapInner:function(a){return p.isFunction(a)?this.each(function(b){p(this).wrapInner(a.call(this,b))}):this.each(function(){var b=p(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){var b=p.isFunction(a);return this.each(function(c){p(this).wrapAll(b?a.call(this,c):a)})},unwrap:function(){return this.parent().each(function(){p.nodeName(this,"body")||p(this).replaceWith(this.childNodes)}).end()},append:function(){return this.domManip(arguments,!0,function(a){(this.nodeType===1||this.nodeType===11)&&this.appendChild(a)})},prepend:function(){return this.domManip(arguments,!0,function(a){(this.nodeType===1||this.nodeType===11)&&this.insertBefore(a,this.firstChild)})},before:function(){if(!bh(this[0]))return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this)});if(arguments.length){var a=p.clean(arguments);return this.pushStack(p.merge(a,this),"before",this.selector)}},after:function(){if(!bh(this[0]))return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this.nextSibling)});if(arguments.length){var a=p.clean(arguments);return this.pushStack(p.merge(this,a),"after",this.selector)}},remove:function(a,b){var c,d=0;for(;(c=this[d])!=null;d++)if(!a||p.filter(a,[c]).length)!b&&c.nodeType===1&&(p.cleanData(c.getElementsByTagName("*")),p.cleanData([c])),c.parentNode&&c.parentNode.removeChild(c);return this},empty:function(){var a,b=0;for(;(a=this[b])!=null;b++){a.nodeType===1&&p.cleanData(a.getElementsByTagName("*"));while(a.firstChild)a.removeChild(a.firstChild)}return this},clone:function(a,b){return a=a==null?!1:a,b=b==null?a:b,this.map(function(){return p.clone(this,a,b)})},html:function(a){return p.access(this,function(a){var c=this[0]||{},d=0,e=this.length;if(a===b)return c.nodeType===1?c.innerHTML.replace(bm,""):b;if(typeof a=="string"&&!bs.test(a)&&(p.support.htmlSerialize||!bu.test(a))&&(p.support.leadingWhitespace||!bn.test(a))&&!bz[(bp.exec(a)||["",""])[1].toLowerCase()]){a=a.replace(bo,"<$1></$2>");try{for(;d<e;d++)c=this[d]||{},c.nodeType===1&&(p.cleanData(c.getElementsByTagName("*")),c.innerHTML=a);c=0}catch(f){}}c&&this.empty().append(a)},null,a,arguments.length)},replaceWith:function(a){return bh(this[0])?this.length?this.pushStack(p(p.isFunction(a)?a():a),"replaceWith",a):this:p.isFunction(a)?this.each(function(b){var c=p(this),d=c.html();c.replaceWith(a.call(this,b,d))}):(typeof a!="string"&&(a=p(a).detach()),this.each(function(){var b=this.nextSibling,c=this.parentNode;p(this).remove(),b?p(b).before(a):p(c).append(a)}))},detach:function(a){return this.remove(a,!0)},domManip:function(a,c,d){a=[].concat.apply([],a);var e,f,g,h,i=0,j=a[0],k=[],l=this.length;if(!p.support.checkClone&&l>1&&typeof j=="string"&&bw.test(j))return this.each(function(){p(this).domManip(a,c,d)});if(p.isFunction(j))return this.each(function(e){var f=p(this);a[0]=j.call(this,e,c?f.html():b),f.domManip(a,c,d)});if(this[0]){e=p.buildFragment(a,this,k),g=e.fragment,f=g.firstChild,g.childNodes.length===1&&(g=f);if(f){c=c&&p.nodeName(f,"tr");for(h=e.cacheable||l-1;i<l;i++)d.call(c&&p.nodeName(this[i],"table")?bC(this[i],"tbody"):this[i],i===h?g:p.clone(g,!0,!0))}g=f=null,k.length&&p.each(k,function(a,b){b.src?p.ajax?p.ajax({url:b.src,type:"GET",dataType:"script",async:!1,global:!1,"throws":!0}):p.error("no ajax"):p.globalEval((b.text||b.textContent||b.innerHTML||"").replace(by,"")),b.parentNode&&b.parentNode.removeChild(b)})}return this}}),p.buildFragment=function(a,c,d){var f,g,h,i=a[0];return c=c||e,c=!c.nodeType&&c[0]||c,c=c.ownerDocument||c,a.length===1&&typeof i=="string"&&i.length<512&&c===e&&i.charAt(0)==="<"&&!bt.test(i)&&(p.support.checkClone||!bw.test(i))&&(p.support.html5Clone||!bu.test(i))&&(g=!0,f=p.fragments[i],h=f!==b),f||(f=c.createDocumentFragment(),p.clean(a,c,f,d),g&&(p.fragments[i]=h&&f)),{fragment:f,cacheable:g}},p.fragments={},p.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){p.fn[a]=function(c){var d,e=0,f=[],g=p(c),h=g.length,i=this.length===1&&this[0].parentNode;if((i==null||i&&i.nodeType===11&&i.childNodes.length===1)&&h===1)return g[b](this[0]),this;for(;e<h;e++)d=(e>0?this.clone(!0):this).get(),p(g[e])[b](d),f=f.concat(d);return this.pushStack(f,a,g.selector)}}),p.extend({clone:function(a,b,c){var d,e,f,g;p.support.html5Clone||p.isXMLDoc(a)||!bu.test("<"+a.nodeName+">")?g=a.cloneNode(!0):(bB.innerHTML=a.outerHTML,bB.removeChild(g=bB.firstChild));if((!p.support.noCloneEvent||!p.support.noCloneChecked)&&(a.nodeType===1||a.nodeType===11)&&!p.isXMLDoc(a)){bE(a,g),d=bF(a),e=bF(g);for(f=0;d[f];++f)e[f]&&bE(d[f],e[f])}if(b){bD(a,g);if(c){d=bF(a),e=bF(g);for(f=0;d[f];++f)bD(d[f],e[f])}}return d=e=null,g},clean:function(a,b,c,d){var f,g,h,i,j,k,l,m,n,o,q,r,s=b===e&&bA,t=[];if(!b||typeof b.createDocumentFragment=="undefined")b=e;for(f=0;(h=a[f])!=null;f++){typeof h=="number"&&(h+="");if(!h)continue;if(typeof h=="string")if(!br.test(h))h=b.createTextNode(h);else{s=s||bk(b),l=b.createElement("div"),s.appendChild(l),h=h.replace(bo,"<$1></$2>"),i=(bp.exec(h)||["",""])[1].toLowerCase(),j=bz[i]||bz._default,k=j[0],l.innerHTML=j[1]+h+j[2];while(k--)l=l.lastChild;if(!p.support.tbody){m=bq.test(h),n=i==="table"&&!m?l.firstChild&&l.firstChild.childNodes:j[1]==="<table>"&&!m?l.childNodes:[];for(g=n.length-1;g>=0;--g)p.nodeName(n[g],"tbody")&&!n[g].childNodes.length&&n[g].parentNode.removeChild(n[g])}!p.support.leadingWhitespace&&bn.test(h)&&l.insertBefore(b.createTextNode(bn.exec(h)[0]),l.firstChild),h=l.childNodes,l.parentNode.removeChild(l)}h.nodeType?t.push(h):p.merge(t,h)}l&&(h=l=s=null);if(!p.support.appendChecked)for(f=0;(h=t[f])!=null;f++)p.nodeName(h,"input")?bG(h):typeof h.getElementsByTagName!="undefined"&&p.grep(h.getElementsByTagName("input"),bG);if(c){q=function(a){if(!a.type||bx.test(a.type))return d?d.push(a.parentNode?a.parentNode.removeChild(a):a):c.appendChild(a)};for(f=0;(h=t[f])!=null;f++)if(!p.nodeName(h,"script")||!q(h))c.appendChild(h),typeof h.getElementsByTagName!="undefined"&&(r=p.grep(p.merge([],h.getElementsByTagName("script")),q),t.splice.apply(t,[f+1,0].concat(r)),f+=r.length)}return t},cleanData:function(a,b){var c,d,e,f,g=0,h=p.expando,i=p.cache,j=p.support.deleteExpando,k=p.event.special;for(;(e=a[g])!=null;g++)if(b||p.acceptData(e)){d=e[h],c=d&&i[d];if(c){if(c.events)for(f in c.events)k[f]?p.event.remove(e,f):p.removeEvent(e,f,c.handle);i[d]&&(delete i[d],j?delete e[h]:e.removeAttribute?e.removeAttribute(h):e[h]=null,p.deletedIds.push(d))}}}}),function(){var a,b;p.uaMatch=function(a){a=a.toLowerCase();var b=/(chrome)[ \/]([\w.]+)/.exec(a)||/(webkit)[ \/]([\w.]+)/.exec(a)||/(opera)(?:.*version|)[ \/]([\w.]+)/.exec(a)||/(msie) ([\w.]+)/.exec(a)||a.indexOf("compatible")<0&&/(mozilla)(?:.*? rv:([\w.]+)|)/.exec(a)||[];return{browser:b[1]||"",version:b[2]||"0"}},a=p.uaMatch(g.userAgent),b={},a.browser&&(b[a.browser]=!0,b.version=a.version),b.chrome?b.webkit=!0:b.webkit&&(b.safari=!0),p.browser=b,p.sub=function(){function a(b,c){return new a.fn.init(b,c)}p.extend(!0,a,this),a.superclass=this,a.fn=a.prototype=this(),a.fn.constructor=a,a.sub=this.sub,a.fn.init=function c(c,d){return d&&d instanceof p&&!(d instanceof a)&&(d=a(d)),p.fn.init.call(this,c,d,b)},a.fn.init.prototype=a.fn;var b=a(e);return a}}();var bH,bI,bJ,bK=/alpha\([^)]*\)/i,bL=/opacity=([^)]*)/,bM=/^(top|right|bottom|left)$/,bN=/^(none|table(?!-c[ea]).+)/,bO=/^margin/,bP=new RegExp("^("+q+")(.*)$","i"),bQ=new RegExp("^("+q+")(?!px)[a-z%]+$","i"),bR=new RegExp("^([-+])=("+q+")","i"),bS={},bT={position:"absolute",visibility:"hidden",display:"block"},bU={letterSpacing:0,fontWeight:400},bV=["Top","Right","Bottom","Left"],bW=["Webkit","O","Moz","ms"],bX=p.fn.toggle;p.fn.extend({css:function(a,c){return p.access(this,function(a,c,d){return d!==b?p.style(a,c,d):p.css(a,c)},a,c,arguments.length>1)},show:function(){return b$(this,!0)},hide:function(){return b$(this)},toggle:function(a,b){var c=typeof a=="boolean";return p.isFunction(a)&&p.isFunction(b)?bX.apply(this,arguments):this.each(function(){(c?a:bZ(this))?p(this).show():p(this).hide()})}}),p.extend({cssHooks:{opacity:{get:function(a,b){if(b){var c=bH(a,"opacity");return c===""?"1":c}}}},cssNumber:{fillOpacity:!0,fontWeight:!0,lineHeight:!0,opacity:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":p.support.cssFloat?"cssFloat":"styleFloat"},style:function(a,c,d,e){if(!a||a.nodeType===3||a.nodeType===8||!a.style)return;var f,g,h,i=p.camelCase(c),j=a.style;c=p.cssProps[i]||(p.cssProps[i]=bY(j,i)),h=p.cssHooks[c]||p.cssHooks[i];if(d===b)return h&&"get"in h&&(f=h.get(a,!1,e))!==b?f:j[c];g=typeof d,g==="string"&&(f=bR.exec(d))&&(d=(f[1]+1)*f[2]+parseFloat(p.css(a,c)),g="number");if(d==null||g==="number"&&isNaN(d))return;g==="number"&&!p.cssNumber[i]&&(d+="px");if(!h||!("set"in h)||(d=h.set(a,d,e))!==b)try{j[c]=d}catch(k){}},css:function(a,c,d,e){var f,g,h,i=p.camelCase(c);return c=p.cssProps[i]||(p.cssProps[i]=bY(a.style,i)),h=p.cssHooks[c]||p.cssHooks[i],h&&"get"in h&&(f=h.get(a,!0,e)),f===b&&(f=bH(a,c)),f==="normal"&&c in bU&&(f=bU[c]),d||e!==b?(g=parseFloat(f),d||p.isNumeric(g)?g||0:f):f},swap:function(a,b,c){var d,e,f={};for(e in b)f[e]=a.style[e],a.style[e]=b[e];d=c.call(a);for(e in b)a.style[e]=f[e];return d}}),a.getComputedStyle?bH=function(b,c){var d,e,f,g,h=a.getComputedStyle(b,null),i=b.style;return h&&(d=h[c],d===""&&!p.contains(b.ownerDocument,b)&&(d=p.style(b,c)),bQ.test(d)&&bO.test(c)&&(e=i.width,f=i.minWidth,g=i.maxWidth,i.minWidth=i.maxWidth=i.width=d,d=h.width,i.width=e,i.minWidth=f,i.maxWidth=g)),d}:e.documentElement.currentStyle&&(bH=function(a,b){var c,d,e=a.currentStyle&&a.currentStyle[b],f=a.style;return e==null&&f&&f[b]&&(e=f[b]),bQ.test(e)&&!bM.test(b)&&(c=f.left,d=a.runtimeStyle&&a.runtimeStyle.left,d&&(a.runtimeStyle.left=a.currentStyle.left),f.left=b==="fontSize"?"1em":e,e=f.pixelLeft+"px",f.left=c,d&&(a.runtimeStyle.left=d)),e===""?"auto":e}),p.each(["height","width"],function(a,b){p.cssHooks[b]={get:function(a,c,d){if(c)return a.offsetWidth===0&&bN.test(bH(a,"display"))?p.swap(a,bT,function(){return cb(a,b,d)}):cb(a,b,d)},set:function(a,c,d){return b_(a,c,d?ca(a,b,d,p.support.boxSizing&&p.css(a,"boxSizing")==="border-box"):0)}}}),p.support.opacity||(p.cssHooks.opacity={get:function(a,b){return bL.test((b&&a.currentStyle?a.currentStyle.filter:a.style.filter)||"")?.01*parseFloat(RegExp.$1)+"":b?"1":""},set:function(a,b){var c=a.style,d=a.currentStyle,e=p.isNumeric(b)?"alpha(opacity="+b*100+")":"",f=d&&d.filter||c.filter||"";c.zoom=1;if(b>=1&&p.trim(f.replace(bK,""))===""&&c.removeAttribute){c.removeAttribute("filter");if(d&&!d.filter)return}c.filter=bK.test(f)?f.replace(bK,e):f+" "+e}}),p(function(){p.support.reliableMarginRight||(p.cssHooks.marginRight={get:function(a,b){return p.swap(a,{display:"inline-block"},function(){if(b)return bH(a,"marginRight")})}}),!p.support.pixelPosition&&p.fn.position&&p.each(["top","left"],function(a,b){p.cssHooks[b]={get:function(a,c){if(c){var d=bH(a,b);return bQ.test(d)?p(a).position()[b]+"px":d}}}})}),p.expr&&p.expr.filters&&(p.expr.filters.hidden=function(a){return a.offsetWidth===0&&a.offsetHeight===0||!p.support.reliableHiddenOffsets&&(a.style&&a.style.display||bH(a,"display"))==="none"},p.expr.filters.visible=function(a){return!p.expr.filters.hidden(a)}),p.each({margin:"",padding:"",border:"Width"},function(a,b){p.cssHooks[a+b]={expand:function(c){var d,e=typeof c=="string"?c.split(" "):[c],f={};for(d=0;d<4;d++)f[a+bV[d]+b]=e[d]||e[d-2]||e[0];return f}},bO.test(a)||(p.cssHooks[a+b].set=b_)});var cd=/%20/g,ce=/\[\]$/,cf=/\r?\n/g,cg=/^(?:color|date|datetime|datetime-local|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,ch=/^(?:select|textarea)/i;p.fn.extend({serialize:function(){return p.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?p.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||ch.test(this.nodeName)||cg.test(this.type))}).map(function(a,b){var c=p(this).val();return c==null?null:p.isArray(c)?p.map(c,function(a,c){return{name:b.name,value:a.replace(cf,"\r\n")}}):{name:b.name,value:c.replace(cf,"\r\n")}}).get()}}),p.param=function(a,c){var d,e=[],f=function(a,b){b=p.isFunction(b)?b():b==null?"":b,e[e.length]=encodeURIComponent(a)+"="+encodeURIComponent(b)};c===b&&(c=p.ajaxSettings&&p.ajaxSettings.traditional);if(p.isArray(a)||a.jquery&&!p.isPlainObject(a))p.each(a,function(){f(this.name,this.value)});else for(d in a)ci(d,a[d],c,f);return e.join("&").replace(cd,"+")};var cj,ck,cl=/#.*$/,cm=/^(.*?):[ \t]*([^\r\n]*)\r?$/mg,cn=/^(?:about|app|app\-storage|.+\-extension|file|res|widget):$/,co=/^(?:GET|HEAD)$/,cp=/^\/\//,cq=/\?/,cr=/<script\b[^<]*(?:(?!<\/script>)<[^<]*)*<\/script>/gi,cs=/([?&])_=[^&]*/,ct=/^([\w\+\.\-]+:)(?:\/\/([^\/?#:]*)(?::(\d+)|)|)/,cu=p.fn.load,cv={},cw={},cx=["*/"]+["*"];try{ck=f.href}catch(cy){ck=e.createElement("a"),ck.href="",ck=ck.href}cj=ct.exec(ck.toLowerCase())||[],p.fn.load=function(a,c,d){if(typeof a!="string"&&cu)return cu.apply(this,arguments);if(!this.length)return this;var e,f,g,h=this,i=a.indexOf(" ");return i>=0&&(e=a.slice(i,a.length),a=a.slice(0,i)),p.isFunction(c)?(d=c,c=b):c&&typeof c=="object"&&(f="POST"),p.ajax({url:a,type:f,dataType:"html",data:c,complete:function(a,b){d&&h.each(d,g||[a.responseText,b,a])}}).done(function(a){g=arguments,h.html(e?p("<div>").append(a.replace(cr,"")).find(e):a)}),this},p.each("ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "),function(a,b){p.fn[b]=function(a){return this.on(b,a)}}),p.each(["get","post"],function(a,c){p[c]=function(a,d,e,f){return p.isFunction(d)&&(f=f||e,e=d,d=b),p.ajax({type:c,url:a,data:d,success:e,dataType:f})}}),p.extend({getScript:function(a,c){return p.get(a,b,c,"script")},getJSON:function(a,b,c){return p.get(a,b,c,"json")},ajaxSetup:function(a,b){return b?cB(a,p.ajaxSettings):(b=a,a=p.ajaxSettings),cB(a,b),a},ajaxSettings:{url:ck,isLocal:cn.test(cj[1]),global:!0,type:"GET",contentType:"application/x-www-form-urlencoded; charset=UTF-8",processData:!0,async:!0,accepts:{xml:"application/xml, text/xml",html:"text/html",text:"text/plain",json:"application/json, text/javascript","*":cx},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText"},converters:{"* text":a.String,"text html":!0,"text json":p.parseJSON,"text xml":p.parseXML},flatOptions:{context:!0,url:!0}},ajaxPrefilter:cz(cv),ajaxTransport:cz(cw),ajax:function(a,c){function y(a,c,f,i){var k,s,t,u,w,y=c;if(v===2)return;v=2,h&&clearTimeout(h),g=b,e=i||"",x.readyState=a>0?4:0,f&&(u=cC(l,x,f));if(a>=200&&a<300||a===304)l.ifModified&&(w=x.getResponseHeader("Last-Modified"),w&&(p.lastModified[d]=w),w=x.getResponseHeader("Etag"),w&&(p.etag[d]=w)),a===304?(y="notmodified",k=!0):(k=cD(l,u),y=k.state,s=k.data,t=k.error,k=!t);else{t=y;if(!y||a)y="error",a<0&&(a=0)}x.status=a,x.statusText=(c||y)+"",k?o.resolveWith(m,[s,y,x]):o.rejectWith(m,[x,y,t]),x.statusCode(r),r=b,j&&n.trigger("ajax"+(k?"Success":"Error"),[x,l,k?s:t]),q.fireWith(m,[x,y]),j&&(n.trigger("ajaxComplete",[x,l]),--p.active||p.event.trigger("ajaxStop"))}typeof a=="object"&&(c=a,a=b),c=c||{};var d,e,f,g,h,i,j,k,l=p.ajaxSetup({},c),m=l.context||l,n=m!==l&&(m.nodeType||m instanceof p)?p(m):p.event,o=p.Deferred(),q=p.Callbacks("once memory"),r=l.statusCode||{},t={},u={},v=0,w="canceled",x={readyState:0,setRequestHeader:function(a,b){if(!v){var c=a.toLowerCase();a=u[c]=u[c]||a,t[a]=b}return this},getAllResponseHeaders:function(){return v===2?e:null},getResponseHeader:function(a){var c;if(v===2){if(!f){f={};while(c=cm.exec(e))f[c[1].toLowerCase()]=c[2]}c=f[a.toLowerCase()]}return c===b?null:c},overrideMimeType:function(a){return v||(l.mimeType=a),this},abort:function(a){return a=a||w,g&&g.abort(a),y(0,a),this}};o.promise(x),x.success=x.done,x.error=x.fail,x.complete=q.add,x.statusCode=function(a){if(a){var b;if(v<2)for(b in a)r[b]=[r[b],a[b]];else b=a[x.status],x.always(b)}return this},l.url=((a||l.url)+"").replace(cl,"").replace(cp,cj[1]+"//"),l.dataTypes=p.trim(l.dataType||"*").toLowerCase().split(s),l.crossDomain==null&&(i=ct.exec(l.url.toLowerCase())||!1,l.crossDomain=i&&i.join(":")+(i[3]?"":i[1]==="http:"?80:443)!==cj.join(":")+(cj[3]?"":cj[1]==="http:"?80:443)),l.data&&l.processData&&typeof l.data!="string"&&(l.data=p.param(l.data,l.traditional)),cA(cv,l,c,x);if(v===2)return x;j=l.global,l.type=l.type.toUpperCase(),l.hasContent=!co.test(l.type),j&&p.active++===0&&p.event.trigger("ajaxStart");if(!l.hasContent){l.data&&(l.url+=(cq.test(l.url)?"&":"?")+l.data,delete l.data),d=l.url;if(l.cache===!1){var z=p.now(),A=l.url.replace(cs,"$1_="+z);l.url=A+(A===l.url?(cq.test(l.url)?"&":"?")+"_="+z:"")}}(l.data&&l.hasContent&&l.contentType!==!1||c.contentType)&&x.setRequestHeader("Content-Type",l.contentType),l.ifModified&&(d=d||l.url,p.lastModified[d]&&x.setRequestHeader("If-Modified-Since",p.lastModified[d]),p.etag[d]&&x.setRequestHeader("If-None-Match",p.etag[d])),x.setRequestHeader("Accept",l.dataTypes[0]&&l.accepts[l.dataTypes[0]]?l.accepts[l.dataTypes[0]]+(l.dataTypes[0]!=="*"?", "+cx+"; q=0.01":""):l.accepts["*"]);for(k in l.headers)x.setRequestHeader(k,l.headers[k]);if(!l.beforeSend||l.beforeSend.call(m,x,l)!==!1&&v!==2){w="abort";for(k in{success:1,error:1,complete:1})x[k](l[k]);g=cA(cw,l,c,x);if(!g)y(-1,"No Transport");else{x.readyState=1,j&&n.trigger("ajaxSend",[x,l]),l.async&&l.timeout>0&&(h=setTimeout(function(){x.abort("timeout")},l.timeout));try{v=1,g.send(t,y)}catch(B){if(v<2)y(-1,B);else throw B}}return x}return x.abort()},active:0,lastModified:{},etag:{}});var cE=[],cF=/\?/,cG=/(=)\?(?=&|$)|\?\?/,cH=p.now();p.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var a=cE.pop()||p.expando+"_"+cH++;return this[a]=!0,a}}),p.ajaxPrefilter("json jsonp",function(c,d,e){var f,g,h,i=c.data,j=c.url,k=c.jsonp!==!1,l=k&&cG.test(j),m=k&&!l&&typeof i=="string"&&!(c.contentType||"").indexOf("application/x-www-form-urlencoded")&&cG.test(i);if(c.dataTypes[0]==="jsonp"||l||m)return f=c.jsonpCallback=p.isFunction(c.jsonpCallback)?c.jsonpCallback():c.jsonpCallback,g=a[f],l?c.url=j.replace(cG,"$1"+f):m?c.data=i.replace(cG,"$1"+f):k&&(c.url+=(cF.test(j)?"&":"?")+c.jsonp+"="+f),c.converters["script json"]=function(){return h||p.error(f+" was not called"),h[0]},c.dataTypes[0]="json",a[f]=function(){h=arguments},e.always(function(){a[f]=g,c[f]&&(c.jsonpCallback=d.jsonpCallback,cE.push(f)),h&&p.isFunction(g)&&g(h[0]),h=g=b}),"script"}),p.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/javascript|ecmascript/},converters:{"text script":function(a){return p.globalEval(a),a}}}),p.ajaxPrefilter("script",function(a){a.cache===b&&(a.cache=!1),a.crossDomain&&(a.type="GET",a.global=!1)}),p.ajaxTransport("script",function(a){if(a.crossDomain){var c,d=e.head||e.getElementsByTagName("head")[0]||e.documentElement;return{send:function(f,g){c=e.createElement("script"),c.async="async",a.scriptCharset&&(c.charset=a.scriptCharset),c.src=a.url,c.onload=c.onreadystatechange=function(a,e){if(e||!c.readyState||/loaded|complete/.test(c.readyState))c.onload=c.onreadystatechange=null,d&&c.parentNode&&d.removeChild(c),c=b,e||g(200,"success")},d.insertBefore(c,d.firstChild)},abort:function(){c&&c.onload(0,1)}}}});var cI,cJ=a.ActiveXObject?function(){for(var a in cI)cI[a](0,1)}:!1,cK=0;p.ajaxSettings.xhr=a.ActiveXObject?function(){return!this.isLocal&&cL()||cM()}:cL,function(a){p.extend(p.support,{ajax:!!a,cors:!!a&&"withCredentials"in a})}(p.ajaxSettings.xhr()),p.support.ajax&&p.ajaxTransport(function(c){if(!c.crossDomain||p.support.cors){var d;return{send:function(e,f){var g,h,i=c.xhr();c.username?i.open(c.type,c.url,c.async,c.username,c.password):i.open(c.type,c.url,c.async);if(c.xhrFields)for(h in c.xhrFields)i[h]=c.xhrFields[h];c.mimeType&&i.overrideMimeType&&i.overrideMimeType(c.mimeType),!c.crossDomain&&!e["X-Requested-With"]&&(e["X-Requested-With"]="XMLHttpRequest");try{for(h in e)i.setRequestHeader(h,e[h])}catch(j){}i.send(c.hasContent&&c.data||null),d=function(a,e){var h,j,k,l,m;try{if(d&&(e||i.readyState===4)){d=b,g&&(i.onreadystatechange=p.noop,cJ&&delete cI[g]);if(e)i.readyState!==4&&i.abort();else{h=i.status,k=i.getAllResponseHeaders(),l={},m=i.responseXML,m&&m.documentElement&&(l.xml=m);try{l.text=i.responseText}catch(a){}try{j=i.statusText}catch(n){j=""}!h&&c.isLocal&&!c.crossDomain?h=l.text?200:404:h===1223&&(h=204)}}}catch(o){e||f(-1,o)}l&&f(h,j,l,k)},c.async?i.readyState===4?setTimeout(d,0):(g=++cK,cJ&&(cI||(cI={},p(a).unload(cJ)),cI[g]=d),i.onreadystatechange=d):d()},abort:function(){d&&d(0,1)}}}});var cN,cO,cP=/^(?:toggle|show|hide)$/,cQ=new RegExp("^(?:([-+])=|)("+q+")([a-z%]*)$","i"),cR=/queueHooks$/,cS=[cY],cT={"*":[function(a,b){var c,d,e=this.createTween(a,b),f=cQ.exec(b),g=e.cur(),h=+g||0,i=1,j=20;if(f){c=+f[2],d=f[3]||(p.cssNumber[a]?"":"px");if(d!=="px"&&h){h=p.css(e.elem,a,!0)||c||1;do i=i||".5",h=h/i,p.style(e.elem,a,h+d);while(i!==(i=e.cur()/g)&&i!==1&&--j)}e.unit=d,e.start=h,e.end=f[1]?h+(f[1]+1)*c:c}return e}]};p.Animation=p.extend(cW,{tweener:function(a,b){p.isFunction(a)?(b=a,a=["*"]):a=a.split(" ");var c,d=0,e=a.length;for(;d<e;d++)c=a[d],cT[c]=cT[c]||[],cT[c].unshift(b)},prefilter:function(a,b){b?cS.unshift(a):cS.push(a)}}),p.Tween=cZ,cZ.prototype={constructor:cZ,init:function(a,b,c,d,e,f){this.elem=a,this.prop=c,this.easing=e||"swing",this.options=b,this.start=this.now=this.cur(),this.end=d,this.unit=f||(p.cssNumber[c]?"":"px")},cur:function(){var a=cZ.propHooks[this.prop];return a&&a.get?a.get(this):cZ.propHooks._default.get(this)},run:function(a){var b,c=cZ.propHooks[this.prop];return this.options.duration?this.pos=b=p.easing[this.easing](a,this.options.duration*a,0,1,this.options.duration):this.pos=b=a,this.now=(this.end-this.start)*b+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),c&&c.set?c.set(this):cZ.propHooks._default.set(this),this}},cZ.prototype.init.prototype=cZ.prototype,cZ.propHooks={_default:{get:function(a){var b;return a.elem[a.prop]==null||!!a.elem.style&&a.elem.style[a.prop]!=null?(b=p.css(a.elem,a.prop,!1,""),!b||b==="auto"?0:b):a.elem[a.prop]},set:function(a){p.fx.step[a.prop]?p.fx.step[a.prop](a):a.elem.style&&(a.elem.style[p.cssProps[a.prop]]!=null||p.cssHooks[a.prop])?p.style(a.elem,a.prop,a.now+a.unit):a.elem[a.prop]=a.now}}},cZ.propHooks.scrollTop=cZ.propHooks.scrollLeft={set:function(a){a.elem.nodeType&&a.elem.parentNode&&(a.elem[a.prop]=a.now)}},p.each(["toggle","show","hide"],function(a,b){var c=p.fn[b];p.fn[b]=function(d,e,f){return d==null||typeof d=="boolean"||!a&&p.isFunction(d)&&p.isFunction(e)?c.apply(this,arguments):this.animate(c$(b,!0),d,e,f)}}),p.fn.extend({fadeTo:function(a,b,c,d){return this.filter(bZ).css("opacity",0).show().end().animate({opacity:b},a,c,d)},animate:function(a,b,c,d){var e=p.isEmptyObject(a),f=p.speed(b,c,d),g=function(){var b=cW(this,p.extend({},a),f);e&&b.stop(!0)};return e||f.queue===!1?this.each(g):this.queue(f.queue,g)},stop:function(a,c,d){var e=function(a){var b=a.stop;delete a.stop,b(d)};return typeof a!="string"&&(d=c,c=a,a=b),c&&a!==!1&&this.queue(a||"fx",[]),this.each(function(){var b=!0,c=a!=null&&a+"queueHooks",f=p.timers,g=p._data(this);if(c)g[c]&&g[c].stop&&e(g[c]);else for(c in g)g[c]&&g[c].stop&&cR.test(c)&&e(g[c]);for(c=f.length;c--;)f[c].elem===this&&(a==null||f[c].queue===a)&&(f[c].anim.stop(d),b=!1,f.splice(c,1));(b||!d)&&p.dequeue(this,a)})}}),p.each({slideDown:c$("show"),slideUp:c$("hide"),slideToggle:c$("toggle"),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(a,b){p.fn[a]=function(a,c,d){return this.animate(b,a,c,d)}}),p.speed=function(a,b,c){var d=a&&typeof a=="object"?p.extend({},a):{complete:c||!c&&b||p.isFunction(a)&&a,duration:a,easing:c&&b||b&&!p.isFunction(b)&&b};d.duration=p.fx.off?0:typeof d.duration=="number"?d.duration:d.duration in p.fx.speeds?p.fx.speeds[d.duration]:p.fx.speeds._default;if(d.queue==null||d.queue===!0)d.queue="fx";return d.old=d.complete,d.complete=function(){p.isFunction(d.old)&&d.old.call(this),d.queue&&p.dequeue(this,d.queue)},d},p.easing={linear:function(a){return a},swing:function(a){return.5-Math.cos(a*Math.PI)/2}},p.timers=[],p.fx=cZ.prototype.init,p.fx.tick=function(){var a,b=p.timers,c=0;for(;c<b.length;c++)a=b[c],!a()&&b[c]===a&&b.splice(c--,1);b.length||p.fx.stop()},p.fx.timer=function(a){a()&&p.timers.push(a)&&!cO&&(cO=setInterval(p.fx.tick,p.fx.interval))},p.fx.interval=13,p.fx.stop=function(){clearInterval(cO),cO=null},p.fx.speeds={slow:600,fast:200,_default:400},p.fx.step={},p.expr&&p.expr.filters&&(p.expr.filters.animated=function(a){return p.grep(p.timers,function(b){return a===b.elem}).length});var c_=/^(?:body|html)$/i;p.fn.offset=function(a){if(arguments.length)return a===b?this:this.each(function(b){p.offset.setOffset(this,a,b)});var c,d,e,f,g,h,i,j={top:0,left:0},k=this[0],l=k&&k.ownerDocument;if(!l)return;return(d=l.body)===k?p.offset.bodyOffset(k):(c=l.documentElement,p.contains(c,k)?(typeof k.getBoundingClientRect!="undefined"&&(j=k.getBoundingClientRect()),e=da(l),f=c.clientTop||d.clientTop||0,g=c.clientLeft||d.clientLeft||0,h=e.pageYOffset||c.scrollTop,i=e.pageXOffset||c.scrollLeft,{top:j.top+h-f,left:j.left+i-g}):j)},p.offset={bodyOffset:function(a){var b=a.offsetTop,c=a.offsetLeft;return p.support.doesNotIncludeMarginInBodyOffset&&(b+=parseFloat(p.css(a,"marginTop"))||0,c+=parseFloat(p.css(a,"marginLeft"))||0),{top:b,left:c}},setOffset:function(a,b,c){var d=p.css(a,"position");d==="static"&&(a.style.position="relative");var e=p(a),f=e.offset(),g=p.css(a,"top"),h=p.css(a,"left"),i=(d==="absolute"||d==="fixed")&&p.inArray("auto",[g,h])>-1,j={},k={},l,m;i?(k=e.position(),l=k.top,m=k.left):(l=parseFloat(g)||0,m=parseFloat(h)||0),p.isFunction(b)&&(b=b.call(a,c,f)),b.top!=null&&(j.top=b.top-f.top+l),b.left!=null&&(j.left=b.left-f.left+m),"using"in b?b.using.call(a,j):e.css(j)}},p.fn.extend({position:function(){if(!this[0])return;var a=this[0],b=this.offsetParent(),c=this.offset(),d=c_.test(b[0].nodeName)?{top:0,left:0}:b.offset();return c.top-=parseFloat(p.css(a,"marginTop"))||0,c.left-=parseFloat(p.css(a,"marginLeft"))||0,d.top+=parseFloat(p.css(b[0],"borderTopWidth"))||0,d.left+=parseFloat(p.css(b[0],"borderLeftWidth"))||0,{top:c.top-d.top,left:c.left-d.left}},offsetParent:function(){return this.map(function(){var a=this.offsetParent||e.body;while(a&&!c_.test(a.nodeName)&&p.css(a,"position")==="static")a=a.offsetParent;return a||e.body})}}),p.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(a,c){var d=/Y/.test(c);p.fn[a]=function(e){return p.access(this,function(a,e,f){var g=da(a);if(f===b)return g?c in g?g[c]:g.document.documentElement[e]:a[e];g?g.scrollTo(d?p(g).scrollLeft():f,d?f:p(g).scrollTop()):a[e]=f},a,e,arguments.length,null)}}),p.each({Height:"height",Width:"width"},function(a,c){p.each({padding:"inner"+a,content:c,"":"outer"+a},function(d,e){p.fn[e]=function(e,f){var g=arguments.length&&(d||typeof e!="boolean"),h=d||(e===!0||f===!0?"margin":"border");return p.access(this,function(c,d,e){var f;return p.isWindow(c)?c.document.documentElement["client"+a]:c.nodeType===9?(f=c.documentElement,Math.max(c.body["scroll"+a],f["scroll"+a],c.body["offset"+a],f["offset"+a],f["client"+a])):e===b?p.css(c,d,e,h):p.style(c,d,e,h)},c,g?e:b,g,null)}})}),a.jQuery=a.$=p,typeof define=="function"&&define.amd&&define.amd.jQuery&&define("jquery",[],function(){return p})})(window); \ No newline at end of file diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/demultiplexing/html/js/main.js b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/demultiplexing/html/js/main.js deleted file mode 100644 index 328ecd528a9d4cc2b09684d70cf5fa162ab58964..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/demultiplexing/html/js/main.js +++ /dev/null @@ -1,180 +0,0 @@ - -function setValidators() { - $('#MismatchesInIndexForm').bootstrapValidator({ - fields: { - indexMismatch: { - validators: { - regexp: { - regexp: /^(([0-1]))$/i, - message: 'The value is not 0 or 1' - } - } - } - } - }); - $('#laneRangeForm').bootstrapValidator({ - fields: { - laneRange: { - validators: { - regexp: { - regexp: /^(([1-8]+)|([1-8]+-[1-8]+))((,(\s*)(([1-8]+)|([1-8]+-[1-8]+)))*)$/i, - message: 'The value is not list of valid lanes or intervals.' - } - } - } - } - }); -} - -function createVis() { - if (didCreateVis) return; - vis = d3.select("#main").append("div").attr("id", "vis"); - didCreateVis = true; -} - -function enableSubmission() { - $('#submitBtn').prop('disabled', false); -} - -function disableSubmission() { - $('#submitBtn').prop('disabled', true); -} - -function displayReturnedTable(data) { - if (data.error) { - console.log(data.error); - vis.append("p").text("Could not retrieve data."); - return; - } - - var dataToShow = data.result; - console.log(dataToShow.rows[0][0].value); - - d3.select("#progress").remove() - d3.select("#button-group").remove() - - vis.append("p").text(""); - // Pick all div elements of the visualization - vis.selectAll("div").attr("class", "alert") - .data(dataToShow.rows) - .enter() - .append("div") - .attr("class", function (row) { - if (row[0].value == 0 || row[0].value > 99) { - if(row[0].value == 100) - enableSubmission(); - if(row[0].value == 101) - disableSubmission(); - return "alert alert-success"; - } - return "alert alert-danger"; - }) - .html(function (row) { - return row[1].value; - }) - - var button = d3.select("#container") - .append("div") - - button.selectAll("button") - .data(dataToShow.rows) - .enter() - .append("div") - .append("button") - .attr("id", function (row) { - return row[0].value; - }) - .attr("class", function (row) { - if (row[0].value == 100) { - return "btn btn-success"; - } - return "btn btn-danger"; - }) - //.attr("onclick", function(row) { return "callIngestionSetInvoice('" + row + "');" }) - .text(function (row) { - if (row[0].value == 0) { - return "OK" ; - } - return "Fail"; - }); - -} - -function hideButtons(data) { - var buttonId = data.result.rows[0][0].value; - d3.select("#setInvoice").remove() - d3.select("#main").append("div").attr("id", "Done").append("p").text("Done " + buttonId); - d3.select("button#" + String(buttonId)).remove(); -} - -function spinner(target) { - var opts = { - lines: 13, // The number of lines to draw - length: 7, // The length of each line - width: 4, // The line thickness - radius: 10, // The radius of the inner circle - corners: 1, // Corner roundness (0..1) - rotate: 0, // The rotation offset - color: '#000', // #rgb or #rrggbb - speed: 1, // Rounds per second - trail: 60, // Afterglow percentage - shadow: false, // Whether to render a shadow - hwaccel: false, // Whether to use hardware acceleration - className: 'spinner', // The CSS class to assign to the spinner - zIndex: 2e9, // The z-index (defaults to 2000000000) - top: 250, // Top position relative to parent in px - left: 'auto' // Left position relative to parent in px - }; - var spinner = new Spinner(opts).spin(target); -} - -function callIngestionService(method) { - d3.select("#main").select("#progress").remove() - d3.select("#main").select("#vis").remove() - - if(method == 'startJob') { - $('#laneRangeForm').data('bootstrapValidator').validate() - if(!$('#laneRangeForm').data('bootstrapValidator').isValid()) { - $('#laneRangeForm').focus(); - return; - } - } - - didCreateVis = false; - dsu.server.useSession(context.getSessionId()); - createVis() - - - var permIdentifier = context.getEntityIdentifier() - myUserId = context.getSessionId().split("-")[0]; - - var submissionParameters = - { - sampleId: permIdentifier, - userId : myUserId, - method: method, - type : context.getEntityKind() - }; - addProcessingParameters(submissionParameters); - - console.log(submissionParameters) - - var target = document.getElementById('progress'); - spinner(target) -// dsu.server.createReportFromAggregationService("DSS1", "triggerbee", submissionParameters, displayReturnedTable); -} - -function addProcessingParameters(parameters) { - if($('#allLanes').is(':checked')) - parameters.laneRange = 'all'; - else - parameters.laneRange = $('#laneRange').val(); - parameters.sampleSheet = $('#sampleSheet').is(':checked'); - parameters.failedReads = $('#failedReads').is(':checked'); - parameters.mismatch = $('#indexMismatch').val(); - parameters.email =$('#email').is(':checked'); -} - -function refresh() { - callIngestionService("pollJob") -} \ No newline at end of file diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/demultiplexing/html/js/openbis-action-deferrer.js b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/demultiplexing/html/js/openbis-action-deferrer.js deleted file mode 100644 index ee2e81717388b2c3649e0b754199ae5d8898e7c5..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/demultiplexing/html/js/openbis-action-deferrer.js +++ /dev/null @@ -1,31 +0,0 @@ -/** - * A utility class for deferring an action until all of some kind of action has completed - * - * @argument dependencies An array of the keys for the dependencies. - */ - -function openbisActionDeferrer(pendingAction, dependencies) { - this.pendingAction = pendingAction; - this.dependencies = {}; - var newme = this; - dependencies.forEach(function(key) { - newme.dependencies[key] = false; - }); -} - -/** - * Note that a dependency completed. Execute the pending action if appropriate. - */ -openbisActionDeferrer.prototype.dependencyCompleted = function(key) { - this.dependencies[key] = true; - var shouldExecute = true; - for (prop in this.dependencies) { - if (false == this.dependencies[prop]) { - shouldExecute = false; - break; - } - } - if (shouldExecute) { - this.pendingAction(); - } -} \ No newline at end of file diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/demultiplexing/html/js/openbis-dsu.js b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/demultiplexing/html/js/openbis-dsu.js deleted file mode 100644 index 52e7336254ad191bc7f4756967e79f55ab1faa58..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/demultiplexing/html/js/openbis-dsu.js +++ /dev/null @@ -1,103 +0,0 @@ -/** - * openbis-dsu.js - * OpenBIS-DSU API - * - * A DSU-specific API for accessing openBIS. Depends on openbis.js. - * @author Chandrasekhar Ramakrishnan - */ - -/** - * The openbis_dsu object provides a dsu-specific interface to openbis. - * - * It creates objects for projects, experiments, samples, and datasets. These objects - * are designed to be passed on to GUI libraries (like d3). The openbis version of each - * object is stored in the bis variable. - * @constructor - */ -function openbis_dsu(url, dssUrl) { - this.server = new openbis(url, dssUrl); -} - -/** - * Request the sequencing samples for a project - */ -openbis_dsu.prototype.retrieveSequencingSamples = function(action) -{ - var sampleCriteria = - { - matchClauses : - [ {"@type":"AttributeMatchClause", - attribute : "TYPE", - fieldType : "ATTRIBUTE", - desiredValue : "ILLUMINA_SEQUENCING" - } ], - operator : "MATCH_ALL_CLAUSES" - }; - - this.server.searchForSamples(sampleCriteria, action); -} - -/** - * Get the flow lanes for a sequencing sample. - */ -openbis_dsu.prototype.retrieveFlowLanesForSequencingSample = function(sample, action) -{ - var projectCode = null; - - if(sample.bis.experimentIdentifierOrNull){ - var experimentIdentifierRegexp = /\/(.*)\/(.*)\/(.*)/g; - var experimentIdentifierMatch = experimentIdentifierRegexp.exec(sample.bis.experimentIdentifierOrNull); - projectCode = experimentIdentifierMatch[2]; - }else{ - action(null); - return; - } - - var experimentCriteria = - { - targetEntityKind : "EXPERIMENT", - criteria : { - matchClauses : - [ {"@type":"AttributeMatchClause", - "attribute":"PROJECT", - "fieldType":"ATTRIBUTE", - "desiredValue": projectCode - } ] - } - }; - - var parentCriteria = - { - targetEntityKind : "SAMPLE_PARENT", - criteria : { - matchClauses : - [ {"@type":"AttributeMatchClause", - "attribute":"CODE", - "fieldType":"ATTRIBUTE", - "desiredValue": sample.bis.code - } ] - } - }; - - var sampleCriteria = - { - subCriterias : [ experimentCriteria, parentCriteria ], - matchClauses : - [ {"@type":"AttributeMatchClause", - attribute : "TYPE", - fieldType : "ATTRIBUTE", - desiredValue : "ILLUMINA_FLOW_LANE" - } ], - operator : "MATCH_ALL_CLAUSES" - }; - - this.server.searchForSamples(sampleCriteria, action) -} - -/** - * Get all data sets connected to a sequencing sample - */ -openbis_dsu.prototype.retrieveDataSetsForSequencingSample = function(sequencing, action) -{ - this.server.listDataSetsForSample(sequencing.bis, false, action); -} diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/demultiplexing/html/js/openbis-login.js b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/demultiplexing/html/js/openbis-login.js deleted file mode 100644 index 7d1ece5965cac06666f12b6e03d20871bc65fb36..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/demultiplexing/html/js/openbis-login.js +++ /dev/null @@ -1,77 +0,0 @@ -/** - * A module for configuring the login page to openBIS. It hides and shows - * the login form and main content as necessary. It invokes a specified - * function on successful login. - * - * This module assumes that the page follows the structure of our standard - * login page. This means that the Following elements are defined : - * - * div#login-form-div - * form#login-form - * input#username - * input#password - * button#login-button - * div#main - * button#logout-button - * - * Assuming these elements are defined, this module configures their appeareance - * and behavior.The div#main element is initially hidden until the user logs in. - * Once logged in, the div#login-form-div element is hidden and the div#main - * element is made visible. - * - * @module openbis-login - * @requires jquery - */ - - -/** - * Configure the login page to hide and show the login form and main content - * as appropriate - * - * @param openbis The openbis facade object - * @param onLogin The function to be called when login succeeds. - * @function - */ - -function openbisLoginPage(openbis, onLogin) -{ - this.openbis = openbis; - this.onLogin = onLogin; -} - -openbisLoginPage.prototype.configure = function(){ - var loginPage = this; - - $('#main').hide(); - - var username = $("#username").value; - if(username == null || username.length==0) { - $("#username").focus(); - } else { - $("#login-button").focus(); - } - - $('#logout-button').click(function() { - loginPage.openbis.logout(function(data) { - $("#login-form-div").show(); - $("#main").hide(); - $("#username").focus(); - }); - }); - - $('#login-form').submit(function() { - loginPage.openbis.login( $.trim($('#username').val()), $.trim($('#password').val()), function(data) { loginPage.onLogin(data) }) - }); - - loginPage.openbis.ifRestoredSessionActive(function(data) { loginPage.onLogin(data) }); - - // Make the ENTER key the default button - $("login-form input").keypress(function (e) { - if ((e.which && e.which == 13) || (e.keyCode && e.keyCode == 13)) { - $('button[type=submit].default').click(); - return false; - } else { - return true; - } - }); -} \ No newline at end of file diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/demultiplexing/html/js/openbis-request-cache.js b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/demultiplexing/html/js/openbis-request-cache.js deleted file mode 100644 index 29c57a8145e7b8a2db781e04949de3168865d04f..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/demultiplexing/html/js/openbis-request-cache.js +++ /dev/null @@ -1,51 +0,0 @@ -/** - * Caches openBIS JSON responses into the local browser storage. - * - * Once the local storage is populated with data from real - * server interactions, the UI development can be done offline - * based on the cached server responses. - * - * USAGE : include this script in your app *after* the openbis facade. - * Be careful not to distribute it to your customers. - * - * <script type="text/javascript" src="openbis-request-cache.js"></script> - * - * To clear the cache, you can call "localStorage.clear()" in a browser console. - */ - -var original_ajax_request_func = _openbisInternal.prototype.ajaxRequest; - -_openbisInternal.prototype.ajaxRequest = function(settings) { - - function getCacheId(settings) { - var methodName = settings.data['method'] - if (methodName.toLowerCase().indexOf('authenticate') != -1) { - // do not store sensitive parameters information - // for login methods (e.g. username/password) - return methodName - } else { - var params = settings.data['params'] - return methodName + '-' + JSON.stringify(params) - } - } - - var cacheId = getCacheId(settings) - var cachedResponse = localStorage.getItem(cacheId) - - if (cachedResponse == null) { - var originalCallback = settings.success - settings.success = function(response) { - localStorage.setItem(cacheId, JSON.stringify(response)) - originalCallback(response) - } - original_ajax_request_func(settings); - } else { - // async execution after a delay of 100ms - setTimeout(function() { - settings.success(JSON.parse(cachedResponse)) - }, 100) - - } -} - -alert("This app includes development code. For production, do not forget to remove the reference to openbis-request-cache.js") \ No newline at end of file diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/demultiplexing/html/js/openbis-screening.js b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/demultiplexing/html/js/openbis-screening.js deleted file mode 100644 index a39730902bbc401f5a740a2a6c8d58f311f80cb3..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/demultiplexing/html/js/openbis-screening.js +++ /dev/null @@ -1,655 +0,0 @@ -/** - * ======================================================= - * OpenBIS screening facade internal code (DO NOT USE!!!) - * ======================================================= - */ - -if(typeof openbis == 'undefined' || typeof _openbisInternal == 'undefined'){ - alert('Loading of openbis-screening.js failed - openbis.js is missing'); -} - -var _openbisInternalGeneric = _openbisInternal; - -var _openbisInternal = function(openbisUrlOrNull){ - this.init(openbisUrlOrNull); -} - -$.extend(_openbisInternal.prototype, _openbisInternalGeneric.prototype); - -_openbisInternal.prototype.init = function(openbisUrlOrNull){ - _openbisInternalGeneric.prototype.init.call(this, openbisUrlOrNull); - this.screeningUrl = this.openbisUrl + "/rmi-screening-api-v1.json" -} - -_openbisInternal.prototype.getScreeningDataStoreApiUrlForDataStoreUrl = function(dataStoreUrl){ - return dataStoreUrl + "/rmi-datastore-server-screening-api-v1.json" -} - -var _openbisGeneric = openbis; - -/** - * ========================= - * OpenBIS screening facade - * ========================= - * - * The facade provides access to the following services: - * - * - all services that the generic OpenBIS facade provides (see openbis.js file) - * - ch.systemsx.cisd.openbis.plugin.screening.shared.api.v1.IScreeningApiServer - * - ch.systemsx.cisd.openbis.dss.screening.shared.api.v1.IDssServiceRpcScreening - * - */ - -var openbis = function(openbisUrlOrNull){ - this._internal = new _openbisInternal(openbisUrlOrNull); -} - -$.extend(openbis.prototype, _openbisGeneric.prototype); - -/** - * ==================================================================================== - * ch.systemsx.cisd.openbis.plugin.screening.shared.api.v1.IScreeningApiServer methods - * ==================================================================================== - */ - -/** - * @see IScreeningApiServer.listPlates(String) - * @method - */ -openbis.prototype.listPlates = function(action) { - this._internal.ajaxRequest({ - url: this._internal.screeningUrl, - data: { "method" : "listPlates", - "params" : [ this.getSession() ] }, - success: action - }); -} - -/** - * @see IScreeningApiServer.listPlates(String, ExperimentIdentifier) - * @method - */ -openbis.prototype.listPlatesForExperiment = function(experimentIdentifier, action) { - this._internal.ajaxRequest({ - url: this._internal.screeningUrl, - data: { "method" : "listPlates", - "params" : [ this.getSession(), experimentIdentifier ] }, - success: action - }); -} - -/** - * @see IScreeningApiServer.getPlateMetadataList(String, List<? extends PlateIdentifier>) - * @method - */ -openbis.prototype.getPlateMetadataList = function(plateIdentifiers, action) { - this._internal.ajaxRequest({ - url: this._internal.screeningUrl, - data: { "method" : "getPlateMetadataList", - "params" : [ this.getSession(), plateIdentifiers ] }, - success: action - }); -} - -/** - * @see IScreeningApiServer.listExperiments(String) - * @method - */ -openbis.prototype.listAllExperiments = function(action) { - this._internal.ajaxRequest({ - url: this._internal.screeningUrl, - data: { "method" : "listExperiments", - "params" : [ this.getSession() ] }, - success: action - }); -} - -/** - * @see IScreeningApiServer.listExperiments(String, String) - * @method - */ -openbis.prototype.listExperimentsVisibleToUser = function(userId, action) { - this._internal.ajaxRequest({ - url: this._internal.screeningUrl, - data: { "method" : "listExperiments", - "params" : [ this.getSession(), userId ] }, - success: action - }); -} - -/** - * @see IScreeningApiServer.listFeatureVectorDatasets(String, List<? extends PlateIdentifier>) - * @method - */ -openbis.prototype.listFeatureVectorDatasets = function(plateIdentifiers, action) { - this._internal.ajaxRequest({ - url: this._internal.screeningUrl, - data: { "method" : "listFeatureVectorDatasets", - "params" : [ this.getSession(), plateIdentifiers ] }, - success: action - }); -} - -/** - * @see IScreeningApiServer.listImageDatasets(String, List<? extends PlateIdentifier>) - * @method - */ -openbis.prototype.listImageDatasets = function(plateIdentifiers, action) { - this._internal.ajaxRequest({ - url: this._internal.screeningUrl, - data: { "method" : "listImageDatasets", - "params" : [ this.getSession(), plateIdentifiers ] }, - success: action - }); -} - -/** - * @see IScreeningApiServer.listRawImageDatasets(String, List<? extends PlateIdentifier>) - * @method - */ -openbis.prototype.listRawImageDatasets = function(plateIdentifiers, action) { - this._internal.ajaxRequest({ - url: this._internal.screeningUrl, - data: { "method" : "listRawImageDatasets", - "params" : [ this.getSession(), plateIdentifiers ] }, - success: action - }); -} - -/** - * @see IScreeningApiServer.listSegmentationImageDatasets(String, List<? extends PlateIdentifier>) - * @method - */ -openbis.prototype.listSegmentationImageDatasets = function(plateIdentifiers, action) { - this._internal.ajaxRequest({ - url: this._internal.screeningUrl, - data: { "method" : "listSegmentationImageDatasets", - "params" : [ this.getSession(), plateIdentifiers ] }, - success: action - }); -} - -/** - * @see IScreeningApiServer.getDatasetIdentifiers(String, List<String>) - * @method - */ -openbis.prototype.getDatasetIdentifiers = function(datasetCodes, action) { - this._internal.ajaxRequest({ - url: this._internal.screeningUrl, - data: { "method" : "getDatasetIdentifiers", - "params" : [ this.getSession(), datasetCodes ] }, - success: action - }); -} - -/** - * @see IScreeningApiServer.listPlateWells(String, ExperimentIdentifier, MaterialIdentifier, boolean) - * @method - */ -openbis.prototype.listPlateWellsForExperimentAndMaterial = function(experimentIdentifer, materialIdentifier, findDatasets, action) { - this._internal.ajaxRequest({ - url: this._internal.screeningUrl, - data: { "method" : "listPlateWells", - "params" : [ this.getSession(), experimentIdentifer, materialIdentifier, findDatasets ] }, - success: action - }); -} - -/** - * @see IScreeningApiServer.listPlateWells(String, MaterialIdentifier, boolean) - * @method - */ -openbis.prototype.listPlateWellsForMaterial = function(materialIdentifier, findDatasets, action) { - this._internal.ajaxRequest({ - url: this._internal.screeningUrl, - data: { "method" : "listPlateWells", - "params" : [ this.getSession(), materialIdentifier, findDatasets ] }, - success: action - }); -} - -/** - * @see IScreeningApiServer.listPlateWells(String, PlateIdentifier) - * @method - */ -openbis.prototype.listPlateWells = function(plateIdentifier, action) { - this._internal.ajaxRequest({ - url: this._internal.screeningUrl, - data: { "method" : "listPlateWells", - "params" : [ this.getSession(), plateIdentifier ] }, - success: action - }); -} - -/** - * @see IScreeningApiServer.getWellSample(String, WellIdentifier) - * @method - */ -openbis.prototype.getWellSample = function(wellIdentifier, action) { - this._internal.ajaxRequest({ - url: this._internal.screeningUrl, - data: { "method" : "getWellSample", - "params" : [ this.getSession(), wellIdentifier ] }, - success: action - }); -} - -/** - * @see IScreeningApiServer.getPlateSample(String, PlateIdentifier) - * @method - */ -openbis.prototype.getPlateSample = function(plateIdentifier, action) { - this._internal.ajaxRequest({ - url: this._internal.screeningUrl, - data: { "method" : "getPlateSample", - "params" : [ this.getSession(), plateIdentifier ] }, - success: action - }); -} - -/** - * @see IScreeningApiServer.listPlateMaterialMapping(String, List<PlateIdentifier>, MaterialTypeIdentifier) - * @method - */ -openbis.prototype.listPlateMaterialMapping = function(plateIdentifiers, materialTypeIdentifierOrNull, action) { - this._internal.ajaxRequest({ - url: this._internal.screeningUrl, - data: { "method" : "listPlateMaterialMapping", - "params" : [ this.getSession(), plateIdentifiers, materialTypeIdentifierOrNull ] }, - success: action - }); -} - -/** - * @see IScreeningApiServer.getExperimentImageMetadata(String, ExperimentIdentifier) - * @method - */ -openbis.prototype.getExperimentImageMetadata = function(experimentIdentifer, action) { - this._internal.ajaxRequest({ - url: this._internal.screeningUrl, - data: { "method" : "getExperimentImageMetadata", - "params" : [ this.getSession(), experimentIdentifer ] }, - success: action - }); -} - -/** - * @see IScreeningApiServer.listAvailableFeatureCodes(String, List<? extends IFeatureVectorDatasetIdentifier>) - * @method - */ -openbis.prototype.listAvailableFeatureCodes = function(featureDatasets, action) { - this._internal.ajaxRequest({ - url: this._internal.screeningUrl, - data: { "method" : "listAvailableFeatureCodes", - "params" : [ this.getSession(), featureDatasets ] }, - success: action - }); -} - -/** - * @see IScreeningApiServer.listAvailableFeatures(String, List<? extends IFeatureVectorDatasetIdentifier>) - * @method - */ -openbis.prototype.listAvailableFeatures = function(featureDatasets, action) { - this._internal.ajaxRequest({ - url: this._internal.screeningUrl, - data: { "method" : "listAvailableFeatures", - "params" : [ this.getSession(), featureDatasets ] }, - success: action - }); -} - -/** - * @see IScreeningApiServer.loadFeatures(String, List<FeatureVectorDatasetReference>, List<String>) - * @method - */ -openbis.prototype.loadFeatures = function(featureDatasets, featureCodes, action) { - this._internal.ajaxRequest({ - url: this._internal.screeningUrl, - data: { "method" : "loadFeatures", - "params" : [ this.getSession(), featureDatasets, featureCodes ] }, - success: action - }); -} - -/** - * @see IScreeningApiServer.loadFeaturesForDatasetWellReferences(String, List<FeatureVectorDatasetWellReference>, List<String>) - * @method - */ -openbis.prototype.loadFeaturesForDatasetWellReferences = function(datasetWellReferences, featureCodes, action) { - this._internal.ajaxRequest({ - url: this._internal.screeningUrl, - data: { "method" : "loadFeaturesForDatasetWellReferences", - "params" : [ this.getSession(), datasetWellReferences, featureCodes ] }, - success: action - }); -} - -/** - * @see IScreeningApiServer.loadImagesBase64(String, List<PlateImageReference>, boolean) - * @method - */ -openbis.prototype.loadImagesBase64ForImageReferencesAndImageConversion = function(imageReferences, convertToPng, action) { - this._internal.ajaxRequest({ - url: this._internal.screeningUrl, - data: { "method" : "loadImagesBase64", - "params" : { - "sessionToken" : this.getSession(), - "imageReferences" : imageReferences, - "convertToPng" : convertToPng - } - }, - success: action - }); -} - -/** - * @see IScreeningApiServer.loadThumbnailImagesBase64(String, List<PlateImageReference>) - * @method - */ -openbis.prototype.loadThumbnailImagesBase64ForImageReferences = function(imageReferences, action) { - this._internal.ajaxRequest({ - url: this._internal.screeningUrl, - data: { "method" : "loadThumbnailImagesBase64", - "params" : { - "sessionToken" : this.getSession(), - "imageReferences" : imageReferences - } - }, - success: action - }); -} - -/** - * @see IScreeningApiServer.loadImagesBase64(String, List<PlateImageReference>, ImageSize) - * @method - */ -openbis.prototype.loadImagesBase64ForImageReferencesAndImageSize = function(imageReferences, size, action) { - this._internal.ajaxRequest({ - url: this._internal.screeningUrl, - data: { "method" : "loadImagesBase64", - "params" : { - "sessionToken" : this.getSession(), - "imageReferences" : imageReferences, - "size" : size - } - }, - success: action - }); -} - -/** - * @see IScreeningApiServer.loadImagesBase64(String, List<PlateImageReference>) - * @method - */ -openbis.prototype.loadImagesBase64ForImageReferences = function(imageReferences, action) { - this._internal.ajaxRequest({ - url: this._internal.screeningUrl, - data: { "method" : "loadImagesBase64", - "params" : { - "sessionToken" : this.getSession(), - "imageReferences" : imageReferences - } - }, - success: action - }); -} - -/** - * @see IScreeningApiServer.loadImagesBase64(String, List<PlateImageReference>, LoadImageConfiguration) - * @method - */ -openbis.prototype.loadImagesBase64ForImageReferencesAndImageConfiguration = function(imageReferences, configuration, action) { - this._internal.ajaxRequest({ - url: this._internal.screeningUrl, - data: { "method" : "loadImagesBase64", - "params" : { - "sessionToken" : this.getSession(), - "imageReferences" : imageReferences, - "configuration" : configuration - } - }, - success: action - }); -} - -/** - * @see IScreeningApiServer.loadImagesBase64(String, List<PlateImageReference>, ImageRepresentationFormat) - * @method - */ -openbis.prototype.loadImagesBase64ForImageReferencesAndImageRepresentationFormat = function(imageReferences, format, action) { - this._internal.ajaxRequest({ - url: this._internal.screeningUrl, - data: { "method" : "loadImagesBase64", - "params" : { - "sessionToken" : this.getSession(), - "imageReferences" : imageReferences, - "format" : format - } - }, - success: action - }); -} - -/** - * @see IScreeningApiServer.loadImagesBase64(String, List<PlateImageReference>, IImageRepresentationFormatSelectionCriterion...) - * @method - */ -openbis.prototype.loadImagesBase64ForImageReferencesAndImageRepresentationFormatCriteria = function(imageReferences, criteria, action) { - this._internal.ajaxRequest({ - url: this._internal.screeningUrl, - data: { "method" : "loadImagesBase64", - "params" : { - "sessionToken" : this.getSession(), - "imageReferences" : imageReferences, - "criteria" : criteria - } - }, - success: action - }); -} - -/** - * @see IScreeningApiServer.listImageMetadata(String, List<? extends IImageDatasetIdentifier>) - * @method - */ -openbis.prototype.listImageMetadata = function(imageDatasets, action) { - this._internal.ajaxRequest({ - url: this._internal.screeningUrl, - data: { "method" : "listImageMetadata", - "params" : [ this.getSession(), imageDatasets ] }, - success: action - }); -} - -/** - * @see IScreeningApiServer.listAvailableImageRepresentationFormats(String, List<? extends IDatasetIdentifier>) - * @method - */ -openbis.prototype.listAvailableImageRepresentationFormats = function(imageDatasets, action) { - this._internal.ajaxRequest({ - url: this._internal.screeningUrl, - data: { "method" : "listAvailableImageRepresentationFormats", - "params" : [ this.getSession(), imageDatasets ] }, - success: action - }); -} - -/** - * @see IScreeningApiServer.loadPhysicalThumbnailsBase64(String, List<PlateImageReference>, ImageRepresentationFormat) - * @method - */ -openbis.prototype.loadPhysicalThumbnailsBase64ForImageReferencesAndImageRepresentationFormat = function(imageReferences, format, action) { - this._internal.ajaxRequest({ - url: this._internal.screeningUrl, - data: { "method" : "loadPhysicalThumbnailsBase64", - "params" : [ this.getSession(), imageReferences, format ] }, - success: action - }); -} - -/** - * ===================================================================================== - * ch.systemsx.cisd.openbis.dss.screening.shared.api.v1.IDssServiceRpcScreening methods - * ===================================================================================== - */ - -/** - * @see IDssServiceRpcScreening.loadImagesBase64(String, IDatasetIdentifier, List<WellPosition>, String, ImageSize) - * @method - */ -openbis.prototype.loadImagesBase64ForDataSetIdentifierAndWellPositionsAndChannelAndImageSize = function(dataSetIdentifier, wellPositions, channel, thumbnailSizeOrNull, action) { - this._internal.ajaxRequest({ - url: this._internal.getScreeningDataStoreApiUrlForDataStoreUrl(dataSetIdentifier.datastoreServerUrl), - data: { "method" : "loadImagesBase64", - "params" : { - "sessionToken" : this.getSession(), - "dataSetIdentifier" : dataSetIdentifier, - "wellPositions" : wellPositions, - "channel" : channel, - "thumbnailSizeOrNull" : thumbnailSizeOrNull - } - }, - success: action - }); -} - -/** - * @see IDssServiceRpcScreening.loadImagesBase64(String, IDatasetIdentifier, String, ImageSize) - * @method - */ -openbis.prototype.loadImagesBase64ForDataSetIdentifierAndChannelAndImageSize = function(dataSetIdentifier, channel, thumbnailSizeOrNull, action) { - this._internal.ajaxRequest({ - url: this._internal.getScreeningDataStoreApiUrlForDataStoreUrl(dataSetIdentifier.datastoreServerUrl), - data: { "method" : "loadImagesBase64", - "params" : { - "sessionToken" : this.getSession(), - "dataSetIdentifier" : dataSetIdentifier, - "channel" : channel, - "thumbnailSizeOrNull" : thumbnailSizeOrNull - } - }, - success: action - }); -} - -/** - * @see IDssServiceRpcScreening.loadThumbnailImagesBase64(String, IDatasetIdentifier, List<String>) - * @method - */ -openbis.prototype.loadThumbnailImagesBase64ForDataSetIdentifierAndChannels = function(dataSetIdentifier, channels, action) { - this._internal.ajaxRequest({ - url: this._internal.getScreeningDataStoreApiUrlForDataStoreUrl(dataSetIdentifier.datastoreServerUrl), - data: { "method" : "loadThumbnailImagesBase64", - "params" : { - "sessionToken" : this.getSession(), - "dataSetIdentifier" : dataSetIdentifier, - "channels" : channels - } - }, - success: action - }); -} - -/** - * @see IDssServiceRpcScreening.listPlateImageReferences(String, IDatasetIdentifier, List<WellPosition>, String) - * @method - */ -openbis.prototype.listPlateImageReferencesForDataSetIdentifierAndWellPositionsAndChannel = function(dataSetIdentifier, wellPositions, channel, action) { - this._internal.ajaxRequest({ - url: this._internal.getScreeningDataStoreApiUrlForDataStoreUrl(dataSetIdentifier.datastoreServerUrl), - data: { "method" : "listPlateImageReferences", - "params" : { - "sessionToken" : this.getSession(), - "dataSetIdentifier" : dataSetIdentifier, - "wellPositions" : wellPositions, - "channel" : channel - } - }, - success: action - }); -} - -/** - * @see IDssServiceRpcScreening.listPlateImageReferences(String, IDatasetIdentifier, List<WellPosition>, List<String>) - * @method - */ -openbis.prototype.listPlateImageReferencesForDataSetIdentifierAndWellPositionsAndChannels = function(dataSetIdentifier, wellPositions, channels, action) { - this._internal.ajaxRequest({ - url: this._internal.getScreeningDataStoreApiUrlForDataStoreUrl(dataSetIdentifier.datastoreServerUrl), - data: { "method" : "listPlateImageReferences", - "params" : { - "sessionToken" : this.getSession(), - "dataSetIdentifier" : dataSetIdentifier, - "wellPositions" : wellPositions, - "channels" : channels - } - }, - success: action - }); -} - -/** - * @see IDssServiceRpcScreening.listImageReferences(String, IDatasetIdentifier, String) - * @method - */ -openbis.prototype.listImageReferencesForDataSetIdentifierAndChannel = function(dataSetIdentifier, channel, action) { - this._internal.ajaxRequest({ - url: this._internal.getScreeningDataStoreApiUrlForDataStoreUrl(dataSetIdentifier.datastoreServerUrl), - data: { "method" : "listImageReferences", - "params" : { - "sessionToken" : this.getSession(), - "dataSetIdentifier" : dataSetIdentifier, - "channel" : channel - } - }, - success: action - }); -} - -/** - * @see IDssServiceRpcScreening.listImageReferences(String, IDatasetIdentifier, List<String>) - * @method - */ -openbis.prototype.listImageReferencesForDataSetIdentifierAndChannels = function(dataSetIdentifier, channels, action) { - this._internal.ajaxRequest({ - url: this._internal.getScreeningDataStoreApiUrlForDataStoreUrl(dataSetIdentifier.datastoreServerUrl), - data: { "method" : "listImageReferences", - "params" : { - "sessionToken" : this.getSession(), - "dataSetIdentifier" : dataSetIdentifier, - "channels" : channels - } - }, - success: action - }); -} - -/** - * @see IDssServiceRpcScreening.listAvailableFeatureLists(String, IFeatureVectorDatasetIdentifier) - * @method - */ -openbis.prototype.listAvailableFeatureLists = function(featureVectorDataSet, action) { - this._internal.ajaxRequest({ - url: this._internal.getScreeningDataStoreApiUrlForDataStoreUrl(featureVectorDataSet.datastoreServerUrl), - data: { "method" : "listAvailableFeatureLists", - params : [this.getSession(), featureVectorDataSet] - }, - success: action - }); -}; - -/** - * @see IDssServiceRpcScreening.getFeatureList(String, IFeatureVectorDatasetIdentifier, String) - * @method - */ -openbis.prototype.getFeatureList = function(featureVectorDataSet, featureListCode, action) { - this._internal.ajaxRequest({ - url: this._internal.getScreeningDataStoreApiUrlForDataStoreUrl(featureVectorDataSet.datastoreServerUrl), - data: { "method" : "getFeatureList", - params : [this.getSession(), featureVectorDataSet, featureListCode] - }, - success: action - }); -}; - diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/demultiplexing/html/js/openbis.js b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/demultiplexing/html/js/openbis.js deleted file mode 100644 index f5476a74d56f0f72713d4c678d306fa0f8405326..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/demultiplexing/html/js/openbis.js +++ /dev/null @@ -1,1987 +0,0 @@ -/** - * ============================================= - * OpenBIS facade internal code (DO NOT USE!!!) - * ============================================= - */ - -if(typeof $ == 'undefined'){ - alert('Loading of openbis.js failed - jquery.js is missing'); -} - -function _openbisInternal(openbisUrlOrNull){ - this.init(openbisUrlOrNull); -} - -_openbisInternal.prototype.init = function(openbisUrlOrNull){ - this.openbisUrl = this.normalizeOpenbisUrl(openbisUrlOrNull); - this.generalInfoServiceUrl = this.openbisUrl + "/rmi-general-information-v1.json"; - this.generalInfoChangingServiceUrl = this.openbisUrl + "/rmi-general-information-changing-v1.json"; - this.queryServiceUrl = this.openbisUrl + "/rmi-query-v1.json"; - this.webInfoServiceUrl = this.openbisUrl + "/rmi-web-information-v1.json" -} - -_openbisInternal.prototype.log = function(msg){ - if(console){ - console.log(msg); - } -} - -_openbisInternal.prototype.normalizeOpenbisUrl = function(openbisUrlOrNull){ - var parts = this.parseUri(window.location); - - if(openbisUrlOrNull){ - var openbisParts = this.parseUri(openbisUrlOrNull); - - for(openbisPartName in openbisParts){ - var openbisPartValue = openbisParts[openbisPartName]; - - if(openbisPartValue){ - parts[openbisPartName] = openbisPartValue; - } - } - } - - return parts.protocol + "://" + parts.authority + "/openbis/openbis"; -} - -_openbisInternal.prototype.jsonRequestData = function(params) { - params["id"] = "1"; - params["jsonrpc"] = "2.0"; - return JSON.stringify(params) -} - -_openbisInternal.prototype.ajaxRequest = function(settings) { - settings.type = "POST"; - settings.processData = false; - settings.dataType = "json"; - settings.data = this.jsonRequestData(settings.data); - settings.success = this.ajaxRequestSuccess(settings.success); - // we call the same settings.success function for backward compatibility - settings.error = this.ajaxRequestError(settings.success); - $.ajax(settings) -} - -_openbisInternal.prototype.ajaxRequestSuccess = function(action){ - var openbisObj = this; - return function(response){ - if(response.error){ - openbisObj.log("Request failed: " + JSON.stringify(response.error)); - } - if(action){ - action(response); - } - }; -} - -_openbisInternal.prototype.ajaxRequestError = function(action){ - var openbisObj = this; - return function(xhr, status, error){ - openbisObj.log("Request failed: " + error); - if(action){ - action({ - "error" : "Request failed: " + error - }); - } - }; -} - -// Functions for working with cookies (see http://www.quirksmode.org/js/cookies.html) - -_openbisInternal.prototype.createCookie = function(name,value,days) { - if (days) { - var date = new Date(); - date.setTime(date.getTime()+(days*24*60*60*1000)); - var expires = "; expires="+date.toGMTString(); - } - else var expires = ""; - document.cookie = name+"="+value+expires+"; path=/"; -} - -_openbisInternal.prototype.readCookie = function(name) { - var nameEQ = name + "="; - var ca = document.cookie.split(';'); - for(var i=0;i < ca.length;i++) { - var c = ca[i]; - while (c.charAt(0)==' ') c = c.substring(1,c.length); - if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length,c.length); - } - return null; -} - -_openbisInternal.prototype.eraseCookie = function(name) { - this.createCookie(name,"",-1); -} - -// parseUri 1.2.2 (c) Steven Levithan <stevenlevithan.com> MIT License (see http://blog.stevenlevithan.com/archives/parseuri) - -_openbisInternal.prototype.parseUri = function(str) { - var options = { - strictMode: false, - key: ["source","protocol","authority","userInfo","user","password","host","port","relative","path","directory","file","query","anchor"], - q: { - name: "queryKey", - parser: /(?:^|&)([^&=]*)=?([^&]*)/g - }, - parser: { - strict: /^(?:([^:\/?#]+):)?(?:\/\/((?:(([^:@]*)(?::([^:@]*))?)?@)?([^:\/?#]*)(?::(\d*))?))?((((?:[^?#\/]*\/)*)([^?#]*))(?:\?([^#]*))?(?:#(.*))?)/, - loose: /^(?:(?![^:@]+:[^:@\/]*@)([^:\/?#.]+):)?(?:\/\/)?((?:(([^:@]*)(?::([^:@]*))?)?@)?([^:\/?#]*)(?::(\d*))?)(((\/(?:[^?#](?![^?#\/]*\.[^?#\/.]+(?:[?#]|$)))*\/?)?([^?#\/]*))(?:\?([^#]*))?(?:#(.*))?)/ - } - }; - - var o = options, - m = o.parser[o.strictMode ? "strict" : "loose"].exec(str), - uri = {}, - i = 14; - - while (i--) uri[o.key[i]] = m[i] || ""; - - uri[o.q.name] = {}; - uri[o.key[12]].replace(o.q.parser, function ($0, $1, $2) { - if ($1) uri[o.q.name][$1] = $2; - }); - - return uri; -} - -_openbisInternal.prototype.listDataStores = function(action){ - this.ajaxRequest({ - url: this.generalInfoServiceUrl, - data: { "method" : "listDataStores", - "params" : [ this.sessionToken ] - }, - success: action - }); -} - -_openbisInternal.prototype.initDataStores = function(action){ - var openbisInternal = this; - - if(typeof this.dataStores === "undefined"){ - this.listDataStores(function(response){ - if(response.result){ - openbisInternal.dataStores = response.result; - }else{ - openbisInternal.dataStores = []; - } - action(); - }); - }else{ - action(); - } -} - -_openbisInternal.prototype.getDataStoreUrlForDataStoreCode = function(dataStoreCodeOrNull, action) { - var openbisInternal = this; - - this.initDataStores(function(){ - if(openbisInternal.dataStores.length == 0){ - throw "Couldn't get a data store url as there are no data stores configured."; - }else{ - if(dataStoreCodeOrNull){ - var dataStoreUrl = null; - $.each(openbisInternal.dataStores, function(index, dataStore){ - if(dataStore.code == dataStoreCodeOrNull){ - dataStoreUrl = dataStore.downloadUrl; - } - }); - if(dataStoreUrl){ - action(dataStoreUrl); - }else{ - throw "Couldn't get a data store url because data store with " + dataStoreCodeOrNull + " code does not exist."; - } - }else{ - if(openbisInternal.dataStores.length == 1){ - action(openbisInternal.dataStores[0].downloadUrl); - }else{ - throw "There is more than one data store configured. Please specify a data store code to get a data store url."; - } - } - } - }); -} - -_openbisInternal.prototype.getDataStoreUrlForDataSetCode = function(dataSetCode, action) { - var openbisInternal = this; - - this.initDataStores(function(){ - if(openbisInternal.dataStores.length == 0){ - throw "Couldn't get a data store url as there are no data stores configured."; - }else if(openbisInternal.dataStores.length == 1){ - action(openbisInternal.dataStores[0].downloadUrl); - }else{ - openbisInternal.ajaxRequest({ - url: openbisInternal.generalInfoServiceUrl, - data: { "method" : "tryGetDataStoreBaseURL", - "params" : [ openbisInternal.sessionToken, dataSetCode ] - }, - success: function(response){ - var hostUrl = response.result; - - if(hostUrl){ - action(hostUrl + "/datastore_server"); - }else{ - throw "Couldn't get a data store url for a data set with " + dataSetCode + " code because the data set does not exist."; - } - } - }); - } - }); -} - -_openbisInternal.prototype.getDataStoreApiUrlForDataStoreCode = function(dataStoreCodeOrNull, action) { - this.getDataStoreUrlForDataStoreCode(dataStoreCodeOrNull, function(dataStoreUrl){ - action(dataStoreUrl + "/rmi-dss-api-v1.json"); - }); -} - -_openbisInternal.prototype.getDataStoreApiUrlForDataSetCode = function(dataSetCode, action) { - this.getDataStoreUrlForDataSetCode(dataSetCode, function(dataStoreUrl){ - action(dataStoreUrl + "/rmi-dss-api-v1.json"); - }); -} - -_openbisInternal.prototype.getDataStoreHostForDataStoreCode = function(dataStoreCodeOrNull, action) { - var openbisObj = this; - - this.getDataStoreUrlForDataStoreCode(dataStoreCodeOrNull, function(dataStoreUrl){ - var parts = openbisObj.parseUri(dataStoreUrl); - action(parts.protocol + "://" + parts.authority); - }); -} - -/** - * =============== - * OpenBIS facade - * =============== - * - * The facade provides access to the following services: - * - * - ch.systemsx.cisd.openbis.generic.shared.api.v1.IGeneralInformationService - * - ch.systemsx.cisd.openbis.generic.shared.api.v1.IGeneralInformationChangingService - * - ch.systemsx.cisd.openbis.plugin.query.shared.api.v1.IQueryApiServer - * - ch.systemsx.cisd.openbis.generic.shared.api.v1.IWebInformationService - * - ch.systemsx.cisd.openbis.dss.generic.shared.api.v1.IDssServiceRpcGeneric - * - * @class - * - */ - -function openbis(openbisUrlOrNull) { - this._internal = new _openbisInternal(openbisUrlOrNull); -} - -/** - * ================================================================================== - * ch.systemsx.cisd.openbis.generic.shared.api.v1.IGeneralInformationService methods - * ================================================================================== - */ - -/** - * Log into openBIS. - * - * @see IGeneralInformationService.tryToAuthenticateForAllServices(String, String) - * @method - */ -openbis.prototype.login = function(userId, userPassword, action) { - var openbisObj = this - this._internal.ajaxRequest({ - url: this._internal.generalInfoServiceUrl, - data: { "method" : "tryToAuthenticateForAllServices", - "params" : [ userId, userPassword ] - }, - success: - function(loginResponse) { - if(loginResponse.error){ - alert("Login failed"); - }else{ - openbisObj._internal.sessionToken = loginResponse.result; - openbisObj.rememberSession(); - } - openbisObj._internal.initDataStores(function(){ - action(loginResponse); - }); - } - }); -} - -/** - * Stores the current session in a cookie. - * - * @method - */ -openbis.prototype.rememberSession = function() { - this._internal.createCookie('openbis', this.getSession(), 1); -} - -/** - * Removes the current session from a cookie. - * - * @method - */ -openbis.prototype.forgetSession = function() { - this._internal.eraseCookie('openbis'); -} - -/** - * Restores the current session from a cookie. - * - * @method - */ -openbis.prototype.restoreSession = function() { - this._internal.sessionToken = this._internal.readCookie('openbis'); -} - -/** - * Sets the current session. - * - * @method - */ -openbis.prototype.useSession = function(sessionToken){ - this._internal.sessionToken = sessionToken; -} - -/** - * Returns the current session. - * - * @method - */ -openbis.prototype.getSession = function(){ - return this._internal.sessionToken; -} - -/** - * Checks whether the current session is still active. - * - * @see IGeneralInformationService.isSessionActive(String) - * @method - */ -openbis.prototype.isSessionActive = function(action) { - if(this.getSession()){ - this._internal.ajaxRequest({ - url: this._internal.generalInfoServiceUrl, - data: { "method" : "isSessionActive", - "params" : [ this.getSession() ] - }, - success: action - }); - }else{ - action({ result : false }) - } -} - -/** - * Restores the current session from a cookie and executes - * the specified action if the session is still active. - * - * @see restoreSession() - * @see isSessionActive() - * @method - */ -openbis.prototype.ifRestoredSessionActive = function(action) { - this.restoreSession(); - this.isSessionActive(function(data) { if (data.result) action(data) }); -} - -/** - * Log out of openBIS. - * - * @see IGeneralInformationService.logout(String) - * @method - */ -openbis.prototype.logout = function(action) { - this.forgetSession(); - - if(this.getSession()){ - this._internal.ajaxRequest({ - url: this._internal.generalInfoServiceUrl, - data: { "method" : "logout", - "params" : [ this.getSession() ] - }, - success: action - }); - }else if(action){ - action({ result : null }); - } -} - -/** - * @see IGeneralInformationService.listNamedRoleSets(String) - * @method - */ -openbis.prototype.listNamedRoleSets = function(action) { - this._internal.ajaxRequest({ - url: this._internal.generalInfoServiceUrl, - data: { "method" : "listNamedRoleSets", - "params" : [ this.getSession() ] - }, - success: action - }); -} - -/** - * @see IGeneralInformationService.listSpacesWithProjectsAndRoleAssignments(String, String) - * @method - */ -openbis.prototype.listSpacesWithProjectsAndRoleAssignments = function(databaseInstanceCodeOrNull, action) { - this._internal.ajaxRequest({ - url: this._internal.generalInfoServiceUrl, - data: { "method" : "listSpacesWithProjectsAndRoleAssignments", - "params" : [ this.getSession(), databaseInstanceCodeOrNull ] - }, - success: action - }); -} - -/** - * @see IGeneralInformationService.searchForSamples(String, SearchCriteria) - * @method - */ -openbis.prototype.searchForSamples = function(searchCriteria, action) { - this._internal.ajaxRequest({ - url: this._internal.generalInfoServiceUrl, - data: { "method" : "searchForSamples", - "params" : [ this.getSession(), - searchCriteria ] }, - success: action - }); -} - -/** - * @see IGeneralInformationService.searchForSamples(String, SearchCriteria, EnumSet<SampleFetchOption>) - * @method - */ -openbis.prototype.searchForSamplesWithFetchOptions = function(searchCriteria, fetchOptions, action) { - this._internal.ajaxRequest({ - url: this._internal.generalInfoServiceUrl, - data: { - "method" : "searchForSamples", - "params" : [ - this.getSession(), - searchCriteria, - fetchOptions ] - }, - success: action - }); -} - -/** - * @see IGeneralInformationService.searchForSamplesOnBehalfOfUser(String, SearchCriteria, EnumSet<SampleFetchOption>, String) - * @method - */ -openbis.prototype.searchForSamplesOnBehalfOfUser = function(searchCriteria, fetchOptions, userId, action) { - this._internal.ajaxRequest({ - url: this._internal.generalInfoServiceUrl, - data: { - "method" : "searchForSamplesOnBehalfOfUser", - "params" : [ - this.getSession(), - searchCriteria, - fetchOptions, - userId ] - }, - success: action - }); -} - -/** - * @see IGeneralInformationService.filterSamplesVisibleToUser(String, List<Sample>, String) - * @method - */ -openbis.prototype.filterSamplesVisibleToUser = function(allSamples, userId, action) { - this._internal.ajaxRequest({ - url: this._internal.generalInfoServiceUrl, - data: { - "method" : "filterSamplesVisibleToUser", - "params" : [ - this.getSession(), - allSamples, - userId ] - }, - success: action - }); -} - -/** - * @see IGeneralInformationService.listSamplesForExperiment(String, String) - * @method - */ -openbis.prototype.listSamplesForExperiment = function(experimentIdentifier, action) { - this._internal.ajaxRequest({ - url: this._internal.generalInfoServiceUrl, - data: { "method" : "listSamplesForExperiment", - "params" : [ this.getSession(), experimentIdentifier ] - }, - success: action - }); -} - -/** - * @see IGeneralInformationService.listSamplesForExperimentOnBehalfOfUser(String, String, String) - * @method - */ -openbis.prototype.listSamplesForExperimentOnBehalfOfUser = function(experimentIdentifier, userId, action) { - this._internal.ajaxRequest({ - url: this._internal.generalInfoServiceUrl, - data: { "method" : "listSamplesForExperimentOnBehalfOfUser", - "params" : [ this.getSession(), experimentIdentifier, userId ] - }, - success: action - }); -} - -/** - * @see IGeneralInformationService.listDataSets(String, List<Sample>) - * @method - */ -openbis.prototype.listDataSetsForSamples = function(samples, action) { - this._internal.ajaxRequest({ - url: this._internal.generalInfoServiceUrl, - data: { "method" : "listDataSets", - "params" : [ this.getSession(), samples ] - }, - success: action - }); -} - -/** - * @see IGeneralInformationService.listExperiments(String, List<Project>, String) - * @method - */ -openbis.prototype.listExperiments = function(projects, experimentType, action) { - this._internal.ajaxRequest({ - url: this._internal.generalInfoServiceUrl, - data: { "method" : "listExperiments", - "params" : [ this.getSession(), projects, experimentType ] - }, - success: action - }); -} - -/** - * @see IGeneralInformationService.listExperimentsHavingSamples(String, List<Project>, String) - * @method - */ -openbis.prototype.listExperimentsHavingSamples = function(projects, experimentType, action) { - this._internal.ajaxRequest({ - url: this._internal.generalInfoServiceUrl, - data: { "method" : "listExperimentsHavingSamples", - "params" : [ this.getSession(), projects, experimentType ] - }, - success: action - }); -} - -/** - * @see IGeneralInformationService.listExperimentsHavingDataSets(String, List<Project>, String) - * @method - */ -openbis.prototype.listExperimentsHavingDataSets = function(projects, experimentType, action) { - this._internal.ajaxRequest({ - url: this._internal.generalInfoServiceUrl, - data: { "method" : "listExperimentsHavingDataSets", - "params" : [ this.getSession(), projects, experimentType ] - }, - success: action - }); -} - -/** - * @see IGeneralInformationService.filterExperimentsVisibleToUser(String, List<Experiment>, String) - * @method - */ -openbis.prototype.filterExperimentsVisibleToUser = function(allExperiments, userId, action) { - this._internal.ajaxRequest({ - url: this._internal.generalInfoServiceUrl, - data: { "method" : "filterExperimentsVisibleToUser", - "params" : [ this.getSession(), allExperiments, userId ] - }, - success: action - }); -} - -/** - * @see IGeneralInformationService.listDataSetsForSample(String, Sample, boolean) - * @method - */ -openbis.prototype.listDataSetsForSample = function(sample, restrictToDirectlyConnected, action) { - this._internal.ajaxRequest({ - url: this._internal.generalInfoServiceUrl, - data: { "method" : "listDataSetsForSample", - "params" : [ this.getSession(), sample, restrictToDirectlyConnected ] - }, - success: action - }); -} - -/** - * @see IGeneralInformationService.listDataStores(String) - * @method - */ -openbis.prototype.listDataStores = function(action) { - this._internal.listDataStores(action); -} - -/** - * @see IGeneralInformationService.getDefaultPutDataStoreBaseURL(String) - * @method - */ -openbis.prototype.getDefaultPutDataStoreBaseURL = function(action) { - this._internal.ajaxRequest({ - url: this._internal.generalInfoServiceUrl, - data: { "method" : "getDefaultPutDataStoreBaseURL", - "params" : [ this.getSession() ] - }, - success: action - }); -} - -/** - * @see IGeneralInformationService.tryGetDataStoreBaseURL(String) - * @method - */ -openbis.prototype.tryGetDataStoreBaseURL = function(dataSetCode, action) { - this._internal.ajaxRequest({ - url: this._internal.generalInfoServiceUrl, - data: { "method" : "tryGetDataStoreBaseURL", - "params" : [ this.getSession(), dataSetCode ] - }, - success: action - }); -} - -/** - * @see IGeneralInformationService.getDataStoreBaseURLs(String, List<String>) - * @method - */ -openbis.prototype.getDataStoreBaseURLs = function(dataSetCodes, action) { - this._internal.ajaxRequest({ - url: this._internal.generalInfoServiceUrl, - data: { "method" : "getDataStoreBaseURLs", - "params" : [ this.getSession(), dataSetCodes ] - }, - success: action - }); -} - -/** - * @see IGeneralInformationService.listDataSetTypes(String) - * @method - */ -openbis.prototype.listDataSetTypes = function(action) { - this._internal.ajaxRequest({ - url: this._internal.generalInfoServiceUrl, - data: { "method" : "listDataSetTypes", - "params" : [ this.getSession() ] - }, - success: action - }); -} - -/** - * @see IGeneralInformationService.listSampleTypes(String) - * @method - */ -openbis.prototype.listSampleTypes = function(action) { - this._internal.ajaxRequest({ - url: this._internal.generalInfoServiceUrl, - data: { "method" : "listSampleTypes", - "params" : [ this.getSession() ] - }, - success: action - }); -} - -/** - * @see IGeneralInformationService.listExperimentTypes(String) - * @method - */ -openbis.prototype.listExperimentTypes = function(action) { - this._internal.ajaxRequest({ - url: this._internal.generalInfoServiceUrl, - data: { "method" : "listExperimentTypes", - "params" : [ this.getSession() ] - }, - success: action - }); -} - -/** - * @see IGeneralInformationService.listVocabularies(String) - * @method - */ -openbis.prototype.listVocabularies = function(action) { - this._internal.ajaxRequest({ - url: this._internal.generalInfoServiceUrl, - data: { "method" : "listVocabularies", - "params" : [ this.getSession() ] - }, - success: action - }); -} - -/** - * @see IGeneralInformationService.listDataSets(String, List<Sample>, EnumSet<Connections>) - * @method - */ -openbis.prototype.listDataSetsForSamplesWithConnections = function(samples, connectionsToGet, action) { - this._internal.ajaxRequest({ - url: this._internal.generalInfoServiceUrl, - data: { "method" : "listDataSets", - "params" : [ this.getSession(), samples, connectionsToGet ] - }, - success: action - }); -} - -/** - * @see IGeneralInformationService.listDataSetsOnBehalfOfUser(String, List<Sample>, EnumSet<Connections>, String) - * @method - */ -openbis.prototype.listDataSetsForSamplesOnBehalfOfUser = function(samples, connectionsToGet, userId, action) { - this._internal.ajaxRequest({ - url: this._internal.generalInfoServiceUrl, - data: { "method" : "listDataSetsOnBehalfOfUser", - "params" : [ this.getSession(), samples, connectionsToGet, userId ] - }, - success: action - }); -} - -/** - * @see IGeneralInformationService.listDataSetsForExperiments(String, List<Experiment>, EnumSet<Connections>) - * @method - */ -openbis.prototype.listDataSetsForExperiments = function(experiments, connectionsToGet, action) { - this._internal.ajaxRequest({ - url: this._internal.generalInfoServiceUrl, - data: { "method" : "listDataSetsForExperiments", - "params" : [ this.getSession(), experiments, connectionsToGet ] - }, - success: action - }); -} - -/** - * @see IGeneralInformationService.listDataSetsForExperimentsOnBehalfOfUser(String, List<Experiment>, EnumSet<Connections>, String) - * @method - */ -openbis.prototype.listDataSetsForExperimentsOnBehalfOfUser = function(experiments, connectionsToGet, userId, action) { - this._internal.ajaxRequest({ - url: this._internal.generalInfoServiceUrl, - data: { "method" : "listDataSetsForExperimentsOnBehalfOfUser", - "params" : [ this.getSession(), experiments, connectionsToGet, userId ] - }, - success: action - }); -} - -/** - * @see IGeneralInformationService.getDataSetMetaData(String, List<String>) - * @method - */ -openbis.prototype.getDataSetMetaData = function(dataSetCodes, action) { - this._internal.ajaxRequest({ - url: this._internal.generalInfoServiceUrl, - data: { "method" : "getDataSetMetaData", - "params" : [ this.getSession(), dataSetCodes ] - }, - success: action - }); -} - -/** - * @see IGeneralInformationService.getDataSetMetaData(String, List<String>, EnumSet<DataSetFetchOption>) - * @method - */ -openbis.prototype.getDataSetMetaDataWithFetchOptions = function(dataSetCodes, fetchOptions, action) { - this._internal.ajaxRequest({ - url: this._internal.generalInfoServiceUrl, - data: { "method" : "getDataSetMetaData", - "params" : [ this.getSession(), dataSetCodes, fetchOptions ] - }, - success: action - }); -} - -/** - * @see IGeneralInformationService.searchForDataSets(String, SearchCriteria) - * @method - */ -openbis.prototype.searchForDataSets = function(searchCriteria, action) { - this._internal.ajaxRequest({ - url: this._internal.generalInfoServiceUrl, - data: { "method" : "searchForDataSets", - "params" : [ this.getSession(), - searchCriteria ] }, - success: action - }); -} - -/** - * @see IGeneralInformationService.searchForDataSetsOnBehalfOfUser(String, SearchCriteria, String) - * @method - */ -openbis.prototype.searchForDataSetsOnBehalfOfUser = function(searchCriteria, userId, action) { - this._internal.ajaxRequest({ - url: this._internal.generalInfoServiceUrl, - data: { "method" : "searchForDataSetsOnBehalfOfUser", - "params" : [ this.getSession(), - searchCriteria, - userId ] }, - success: action - }); -} - -/** - * @see IGeneralInformationService.filterDataSetsVisibleToUser(String, List<DataSet>, String) - * @method - */ -openbis.prototype.filterDataSetsVisibleToUser = function(allDataSets, userId, action) { - this._internal.ajaxRequest({ - url: this._internal.generalInfoServiceUrl, - data: { "method" : "filterDataSetsVisibleToUser", - "params" : [ this.getSession(), - allDataSets, - userId ] }, - success: action - }); -} - -/** - * @see IGeneralInformationService.listExperiments(String, List<String>) - * @method - */ -openbis.prototype.listExperimentsForIdentifiers = function(experimentIdentifiers, action) { - this._internal.ajaxRequest({ - url: this._internal.generalInfoServiceUrl, - data: { "method" : "listExperiments", - "params" : [ this.getSession(), - experimentIdentifiers ] }, - success: action - }); -} - -/** - * @see IGeneralInformationService.searchForExperiments(String, SearchCriteria) - * @method - */ -openbis.prototype.searchForExperiments = function(searchCriteria, action) { - this._internal.ajaxRequest({ - url: this._internal.generalInfoServiceUrl, - data: { "method" : "searchForExperiments", - "params" : [ this.getSession(), - searchCriteria ] }, - success: action - }); -} - -/** - * @see IGeneralInformationService.listProjects(String) - * @method - */ -openbis.prototype.listProjects = function(action) { - this._internal.ajaxRequest({ - url: this._internal.generalInfoServiceUrl, - data: { "method" : "listProjects", - "params" : [ this.getSession() ] - }, - success: action - }); -} - -/** - * @see IGeneralInformationService.listProjectsOnBehalfOfUser(String, String) - * @method - */ -openbis.prototype.listProjectsOnBehalfOfUser = function(userId, action) { - this._internal.ajaxRequest({ - url: this._internal.generalInfoServiceUrl, - data: { "method" : "listProjectsOnBehalfOfUser", - "params" : [ this.getSession(), userId ] - }, - success: action - }); -} - -/** - * @see IGeneralInformationService.getMaterialByCodes(String, List<MaterialIdentifier>) - * @method - */ -openbis.prototype.getMaterialByCodes = function(materialIdentifiers, action) { - this._internal.ajaxRequest({ - url: this._internal.generalInfoServiceUrl, - data: { "method" : "getMaterialByCodes", - "params" : [ this.getSession(), materialIdentifiers ] - }, - success: action - }); -} - -/** - * @see IGeneralInformationService.searchForMaterials(String, SearchCriteria) - * @method - */ -openbis.prototype.searchForMaterials = function(searchCriteria, action) { - this._internal.ajaxRequest({ - url: this._internal.generalInfoServiceUrl, - data: { "method" : "searchForMaterials", - "params" : [ this.getSession(), searchCriteria ] - }, - success: action - }); -} - -/** - * @see IGeneralInformationService.listMetaprojects(String) - * @method - */ -openbis.prototype.listMetaprojects = function(action) { - this._internal.ajaxRequest({ - url: this._internal.generalInfoServiceUrl, - data: { "method" : "listMetaprojects", - "params" : [ this.getSession() ] - }, - success: action - }); -} - -/** - * @see IGeneralInformationService.listMetaprojectsOnBehalfOfUser(String, String) - * @method - */ -openbis.prototype.listMetaprojectsOnBehalfOfUser = function(userId, action) { - this._internal.ajaxRequest({ - url: this._internal.generalInfoServiceUrl, - data: { "method" : "listMetaprojectsOnBehalfOfUser", - "params" : [ this.getSession(), userId ] - }, - success: action - }); -} - -/** - * @see IGeneralInformationService.getMetaproject(String, IMetaprojectId) - * @method - */ -openbis.prototype.getMetaproject = function(metaprojectId, action) { - this._internal.ajaxRequest({ - url: this._internal.generalInfoServiceUrl, - data: { "method" : "getMetaproject", - "params" : [ this.getSession(), metaprojectId ] - }, - success: action - }); -} - -/** - * @see IGeneralInformationService.getMetaprojectOnBehalfOfUser(String, IMetaprojectId, String) - * @method - */ -openbis.prototype.getMetaprojectOnBehalfOfUser = function(metaprojectId, userId, action) { - this._internal.ajaxRequest({ - url: this._internal.generalInfoServiceUrl, - data: { "method" : "getMetaprojectOnBehalfOfUser", - "params" : [ this.getSession(), metaprojectId, userId ] - }, - success: action - }); -} - -/** - * @see IGeneralInformationService.listAttachmentsForProject(String, IProjectId, boolean) - * @method - */ -openbis.prototype.listAttachmentsForProject = function(projectId, allVersions, action) { - this._internal.ajaxRequest({ - url: this._internal.generalInfoServiceUrl, - data: { "method" : "listAttachmentsForProject", - "params" : [ this.getSession(), projectId, allVersions ] - }, - success: action - }); -} - -/** - * @see IGeneralInformationService.listAttachmentsForExperiment(String, IExperimentId, boolean) - * @method - */ -openbis.prototype.listAttachmentsForExperiment = function(experimentId, allVersions, action) { - this._internal.ajaxRequest({ - url: this._internal.generalInfoServiceUrl, - data: { "method" : "listAttachmentsForExperiment", - "params" : [ this.getSession(), experimentId, allVersions ] - }, - success: action - }); -} - -/** - * @see IGeneralInformationService.listAttachmentsForSample(String, ISampleId, boolean) - * @method - */ -openbis.prototype.listAttachmentsForSample = function(sampleId, allVersions, action) { - this._internal.ajaxRequest({ - url: this._internal.generalInfoServiceUrl, - data: { "method" : "listAttachmentsForSample", - "params" : [ this.getSession(), sampleId, allVersions ] - }, - success: action - }); -} - -/** - * ========================================================================================== - * ch.systemsx.cisd.openbis.generic.shared.api.v1.IGeneralInformationChangingService methods - * ========================================================================================== - */ - -/** - * @see IGeneralInformationChangingService.updateSampleProperties(String, long, Map<String,String>) - * @method - */ -openbis.prototype.updateSampleProperties = function(sampleId, properties, action) { - this._internal.ajaxRequest({ - url: this._internal.generalInfoChangingServiceUrl, - data: { "method" : "updateSampleProperties", - "params" : [ this.getSession(), sampleId, properties ] - }, - success: action - }); -} - -/** - * @see IGeneralInformationChangingService.addUnofficialVocabularyTerm(String, Long, NewVocabularyTerm) - * @method - */ -openbis.prototype.addUnofficialVocabularyTerm = function(vocabularyId, term, action) { - this._internal.ajaxRequest({ - url: this._internal.generalInfoChangingServiceUrl, - data: { "method" : "addUnofficialVocabularyTerm", - "params" : [ this.getSession(), vocabularyId, term ] - }, - success: action - }); -} - -/** - * @see IGeneralInformationChangingService.getWebAppSettings(String, String) - * @method - */ -openbis.prototype.getWebAppSettings = function(webappId, action) { - this._internal.ajaxRequest({ - url: this._internal.generalInfoChangingServiceUrl, - data: { "method" : "getWebAppSettings", - params : [ this.getSession(), webappId ] }, - success: action - }); -} - -/** - * @see IGeneralInformationChangingService.setWebAppSettings(String, WebAppSettings) - * @method - */ -openbis.prototype.setWebAppSettings = function(webappSettings, action) { - this._internal.ajaxRequest({ - url: this._internal.generalInfoChangingServiceUrl, - data: { "method" : "setWebAppSettings", - params : [ this.getSession(), webappSettings ] }, - success: action - }); -} - -/** - * @see IGeneralInformationChangingService.createMetaproject(String, String, String) - * @method - */ -openbis.prototype.createMetaproject = function(name, descriptionOrNull, action) { - this._internal.ajaxRequest({ - url: this._internal.generalInfoChangingServiceUrl, - data: { "method" : "createMetaproject", - params : [ this.getSession(), name, descriptionOrNull ] }, - success: action - }); -} - -/** - * @see IGeneralInformationChangingService.updateMetaproject(String, IMetaprojectId, String, String) - * @method - */ -openbis.prototype.updateMetaproject = function(metaprojectId, name, descriptionOrNull, action) { - this._internal.ajaxRequest({ - url: this._internal.generalInfoChangingServiceUrl, - data: { "method" : "updateMetaproject", - params : [ this.getSession(), metaprojectId, name, descriptionOrNull ] }, - success: action - }); -} - -/** - * @see IGeneralInformationChangingService.deleteMetaproject(String, IMetaprojectId) - * @method - */ -openbis.prototype.deleteMetaproject = function(metaprojectId, action) { - this._internal.ajaxRequest({ - url: this._internal.generalInfoChangingServiceUrl, - data: { "method" : "deleteMetaproject", - params : [ this.getSession(), metaprojectId ] }, - success: action - }); -} - -/** - * @see IGeneralInformationChangingService.addToMetaproject(String, IMetaprojectId, MetaprojectAssignmentsIds) - * @method - */ -openbis.prototype.addToMetaproject = function(metaprojectId, assignmentsToAdd, action) { - this._internal.ajaxRequest({ - url: this._internal.generalInfoChangingServiceUrl, - data: { "method" : "addToMetaproject", - params : [ this.getSession(), metaprojectId, assignmentsToAdd ] }, - success: action - }); -} - -/** - * @see IGeneralInformationChangingService.removeFromMetaproject(String, IMetaprojectId, MetaprojectAssignmentsIds) - * @method - */ -openbis.prototype.removeFromMetaproject = function(metaprojectId, assignmentsToRemove, action) { - this._internal.ajaxRequest({ - url: this._internal.generalInfoChangingServiceUrl, - data: { "method" : "removeFromMetaproject", - params : [ this.getSession(), metaprojectId, assignmentsToRemove ] }, - success: action - }); -} - -/** - * ============================================================================ - * ch.systemsx.cisd.openbis.plugin.query.shared.api.v1.IQueryApiServer methods - * ============================================================================ - */ - -/** - * @see IQueryApiServer.listQueries(String) - * @method - */ -openbis.prototype.listQueries = function(action) { - this._internal.ajaxRequest({ - url: this._internal.queryServiceUrl, - data: { "method" : "listQueries", - "params" : [ this.getSession() ] }, - success: action - }); -} - -/** - * @see IQueryApiServer.executeQuery(String, long, Map<String, String>) - * @method - */ -openbis.prototype.executeQuery = function(queryId, parameterBindings, action) { - this._internal.ajaxRequest({ - url: this._internal.queryServiceUrl, - data: { "method" : "executeQuery", - "params" : [ this.getSession(), queryId, parameterBindings ] }, - success: action - }); -} - -/** - * @see IQueryApiServer.listTableReportDescriptions(String) - * @method - */ -openbis.prototype.listTableReportDescriptions = function(action) { - this._internal.ajaxRequest({ - url: this._internal.queryServiceUrl, - data: { "method" : "listTableReportDescriptions", - "params" : [ this.getSession() ] }, - success: action - }); -} - -/** - * @see IQueryApiServer.createReportFromDataSets(String, String, String, List<String>) - * @method - */ -openbis.prototype.createReportFromDataSets = function(dataStoreCode, serviceKey, dataSetCodes, action) { - this._internal.ajaxRequest({ - url: this._internal.queryServiceUrl, - data: { "method" : "createReportFromDataSets", - params : [ this.getSession(), dataStoreCode, serviceKey, dataSetCodes ] }, - success: action - }); -} - -/** - * @see IQueryApiServer.listAggregationServices(String) - * @method - */ -openbis.prototype.listAggregationServices = function(action) { - this._internal.ajaxRequest({ - url: this._internal.queryServiceUrl, - data: { "method" : "listAggregationServices", - params : [ this.getSession() ] }, - success: action - }); -} - -/** - * @see IQueryApiServer.createReportFromAggregationService(String, String, String, Map<String, Object>) - * @method - */ -openbis.prototype.createReportFromAggregationService = function(dataStoreCode, serviceKey, parameters, action) { - this._internal.ajaxRequest({ - url: this._internal.queryServiceUrl, - data: { "method" : "createReportFromAggregationService", - params : [ this.getSession(), dataStoreCode, serviceKey, parameters ] }, - success: action - }); -} - - -/** - * ============================================================================== - * ch.systemsx.cisd.openbis.generic.shared.api.v1.IWebInformationService methods - * ============================================================================== - */ - -/** - * Returns the current server side session. - * - * @see IWebInformationService.getSessionToken() - * @method - */ -openbis.prototype.getSessionTokenFromServer = function(action) { - this._internal.ajaxRequest({ - url: this._internal.webInfoServiceUrl, - data: { "method" : "getSessionToken" }, - success: action - }); -} - -/** - * ================================================================================= - * ch.systemsx.cisd.openbis.dss.generic.shared.api.v1.IDssServiceRpcGeneric methods - * ================================================================================= - */ - -/** - * @see IDssServiceRpcGeneric.listFilesForDataSet(String, DataSetFileDTO) - * @method - */ -openbis.prototype.listFilesForDataSetFile = function(fileOrFolder, action) { - var openbisObj = this; - this._internal.getDataStoreApiUrlForDataSetCode(fileOrFolder.dataSetCode, function(dataStoreApiUrl){ - openbisObj._internal.ajaxRequest({ - url: dataStoreApiUrl, - data: { "method" : "listFilesForDataSet", - "params" : [ openbisObj.getSession(), fileOrFolder ] }, - success: action - }); - }); -} - -/** - * @see IDssServiceRpcGeneric.getDownloadUrlForFileForDataSet(String, DataSetFileDTO) - * @method - */ -openbis.prototype.getDownloadUrlForFileForDataSetFile = function(fileOrFolder, action) { - var openbisObj = this; - this._internal.getDataStoreApiUrlForDataSetCode(fileOrFolder.dataSetCode, function(dataStoreApiUrl){ - openbisObj._internal.ajaxRequest({ - url: dataStoreApiUrl, - data: { "method" : "getDownloadUrlForFileForDataSet", - "params" : [ openbisObj.getSession(), fileOrFolder ] }, - success: action - }); - }); -} - -/** - * Returns a download url that is valid as long as the user session is valid. - * @method - */ -openbis.prototype.getDownloadUrlForFileForDataSetFileInSession = function(fileOrFolder, action) { - this.getDownloadUrlForFileForDataSetInSession(fileOrFolder.dataSetCode, fileOrFolder.path, action); -} - -/** - * @see IDssServiceRpcGeneric.getDownloadUrlForFileForDataSetWithTimeout(String, DataSetFileDTO, long) - * @method - */ -openbis.prototype.getDownloadUrlForFileForDataSetFileWithTimeout = function(fileOrFolder, validityDurationInSeconds, action) { - var openbisObj = this; - this._internal.getDataStoreApiUrlForDataSetCode(fileOrFolder.dataSetCode, function(dataStoreApiUrl){ - openbisObj._internal.ajaxRequest({ - url: dataStoreApiUrl, - data: { "method" : "getDownloadUrlForFileForDataSetWithTimeout", - "params" : [ openbisObj.getSession(), fileOrFolder, validityDurationInSeconds ] }, - success: action - }); - }); -} - -/** - * @see IDssServiceRpcGeneric.listFilesForDataSet(String, String, String, boolean) - * @method - */ -openbis.prototype.listFilesForDataSet = function(dataSetCode, path, recursive, action) { - var openbisObj = this; - this._internal.getDataStoreApiUrlForDataSetCode(dataSetCode, function(dataStoreApiUrl){ - openbisObj._internal.ajaxRequest({ - url: dataStoreApiUrl, - data: { "method" : "listFilesForDataSet", - "params" : [ openbisObj.getSession(), dataSetCode, path, recursive ] }, - success: action - }); - }); -} - -/** - * @see IDssServiceRpcGeneric.getDownloadUrlForFileForDataSet(String, String, String) - * @method - */ -openbis.prototype.getDownloadUrlForFileForDataSet = function(dataSetCode, path, action) { - var openbisObj = this; - this._internal.getDataStoreApiUrlForDataSetCode(dataSetCode, function(dataStoreApiUrl){ - openbisObj._internal.ajaxRequest({ - url: dataStoreApiUrl, - data: { "method" : "getDownloadUrlForFileForDataSet", - "params" : [ openbisObj.getSession(), dataSetCode, path ] }, - success: action - }); - }); -} - -/** - * Returns a download url that is valid as long as the user session is valid. - * @method - */ -openbis.prototype.getDownloadUrlForFileForDataSetInSession = function(dataSetCode, path, action) { - var openbisObj = this; - this._internal.getDataStoreUrlForDataSetCode(dataSetCode, function(dataStoreUrl){ - var pathWithoutSlash = path.charAt(0) == "/" ? path.substr(1) : path; - var url = dataStoreUrl + "/" + dataSetCode + "/" + pathWithoutSlash + "?sessionID=" + openbisObj.getSession(); - action(url); - }); -} - -/** - * @see IDssServiceRpcGeneric.getDownloadUrlForFileForDataSetWithTimeout(String, String, String, long) - * @method - */ -openbis.prototype.getDownloadUrlForFileForDataSetWithTimeout = function(dataSetCode, path, validityDurationInSeconds, action) { - var openbisObj = this; - this._internal.getDataStoreApiUrlForDataSetCode(dataSetCode, function(dataStoreApiUrl){ - openbisObj._internal.ajaxRequest({ - url: dataStoreApiUrl, - data: { "method" : "getDownloadUrlForFileForDataSetWithTimeout", - "params" : [ openbisObj.getSession(), dataSetCode, path, validityDurationInSeconds ] }, - success: action - }); - }); -} - -/** - * Creates a session workspace file uploader inside the specified uploaderContainer element and for the default data store. - * @method - */ -openbis.prototype.createSessionWorkspaceUploader = function(uploaderContainer, oncomplete){ - this.createSessionWorkspaceUploaderForDataStore(uploaderContainer, null, oncomplete); -} - -/** - * Creates a session workspace file uploader inside the specified uploaderContainer element and for the specified data store. - * @method - */ -openbis.prototype.createSessionWorkspaceUploaderForDataStore = function(uploaderContainer, dataStoreCodeOrNull, oncomplete){ - var uploaderSupported = window.File && window.FileReader && window.XMLHttpRequest; - - if(!uploaderSupported){ - alert("Uploader is not supported by your browser."); - return; - } - - var $this = this; - this._internal.getDataStoreUrlForDataStoreCode(dataStoreCodeOrNull, function(dataStoreUrl){ - // figure out what is the location of the openbis.js script and assume that uploader resources are served by the same server - var openbisScriptLocation = $('script[src*=openbis\\.js]').attr('src'); - var uploaderDirectoryLocation = jsFileLocation = openbisScriptLocation.replace(/js\/openbis\.js/g, 'uploader'); - - $('head').append('<link rel="stylesheet" media="screen" type="text/css" href="' + uploaderDirectoryLocation + '/css/src/upload.css" />'); - $('head').append('<script charset="utf-8" type="text/javascript" src="' + uploaderDirectoryLocation + '/js/src/upload.js" />'); - - $(uploaderContainer).load(uploaderDirectoryLocation + "/index.html", function(){ - Uploader.init({ - smart_mode: true, - chunk_size: 1000*1024, - file_upload_url: dataStoreUrl + "/session_workspace_file_upload", - form_upload_url: dataStoreUrl + "/session_workspace_form_upload", - file_download_url: dataStoreUrl + "/session_workspace_file_download", - oncomplete: oncomplete, - sessionID: $this.getSession() - }); - }); - }); -} - -/** - * Creates a session workspace download url for a file with the specified filePath and for the default data store. - * @method - */ -openbis.prototype.createSessionWorkspaceDownloadUrl = function(filePath, action){ - return this.createSessionWorkspaceDownloadUrlForDataStore(filePath, null, action); -} - -/** - * Creates a session workspace download url for a file with the specified filePath and for the specified data store. - * @method - */ -openbis.prototype.createSessionWorkspaceDownloadUrlForDataStore = function(filePath, dataStoreCodeOrNull, action){ - var openbisObj = this; - - this._internal.getDataStoreUrlForDataStoreCode(dataStoreCodeOrNull, function(dataStoreUrl){ - var downloadUrl = dataStoreUrl + "/session_workspace_file_download?sessionID=" + openbisObj.getSession() + "&filePath=" + filePath; - action(downloadUrl); - }); -} - -/** - * Create a session workspace download link for a file with the specified filePath at the default data store. - * @method - */ -openbis.prototype.createSessionWorkspaceDownloadLink = function(filePath, linkText, action){ - return this.createSessionWorkspaceDownloadLinkForDataStore(filePath, linkText, null, action); -} - -/** - * Create a session workspace download link for a file with the specified filePath at the specified data store. - * @method - */ -openbis.prototype.createSessionWorkspaceDownloadLinkForDataStore = function(filePath, linkText, dataStoreCodeOrNull, action){ - this.createSessionWorkspaceDownloadUrlForDataStore(filePath, dataStoreCodeOrNull, function(downloadUrl){ - var link = $("<a href='" + downloadUrl + "'>" + (linkText ? linkText : filePath) + "</a>"); - action(link); - }); -} - -/** - * Downloads a session workspace file with the specified filePath from the default data store. - * @method - */ -openbis.prototype.downloadSessionWorkspaceFile = function(filePath, action) { - this.downloadSessionWorkspaceFileForDataStore(filePath, null, action); -} - -/** - * Downloads a session workspace file with the specified filePath from the specified data store. - * @method - */ -openbis.prototype.downloadSessionWorkspaceFileForDataStore = function(filePath, dataStoreCodeOrNull, action) { - var openbisObj = this; - - this.createSessionWorkspaceDownloadUrlForDataStore(filePath, dataStoreCodeOrNull, function(downloadUrl){ - $.ajax({ - type: "GET", - dataType: "text", - url: downloadUrl, - success: openbisObj._internal.ajaxRequestSuccess(action), - error: openbisObj._internal.ajaxRequestError(action) - }); - }); -} - -/** - * Deletes a session workspace file with the specified filePath from the default data store. - * @method - */ -openbis.prototype.deleteSessionWorkspaceFile = function(filePath, action) { - this.deleteSessionWorkspaceFileForDataStore(filePath, null, action) -} - -/** - * Deletes a session workspace file with the specified filePath from the specified data store. - * @method - */ -openbis.prototype.deleteSessionWorkspaceFileForDataStore = function(filePath, dataStoreCodeOrNull, action) { - var openbisObj = this; - - this._internal.getDataStoreApiUrlForDataStoreCode(dataStoreCodeOrNull, function(dataStoreApiUrl){ - openbisObj._internal.ajaxRequest({ - url: dataStoreApiUrl, - data: { - "method" : "deleteSessionWorkspaceFile", - "params" : [ openbisObj.getSession(), filePath ] - }, - success: action - }); - }); -} - -/** - * @see IDssServiceRpcGeneric.getPathToDataSet(String, String, String) - * @method - */ -openbis.prototype.getPathToDataSet = function(dataSetCode, overrideStoreRootPathOrNull, action) { - var openbisObj = this; - this._internal.getDataStoreApiUrlForDataSetCode(dataSetCode, function(dataStoreApiUrl){ - openbisObj._internal.ajaxRequest({ - url: dataStoreApiUrl, - data: { "method" : "getPathToDataSet", - "params" : [ openbisObj.getSession(), dataSetCode, overrideStoreRootPathOrNull ] }, - success: action - }); - }); -} - -/** - * @see IDssServiceRpcGeneric.tryGetPathToDataSet(String, String, String) - * @method - */ -openbis.prototype.tryGetPathToDataSet = function(dataSetCode, overrideStoreRootPathOrNull, action) { - var openbisObj = this; - this._internal.getDataStoreApiUrlForDataSetCode(dataSetCode, function(dataStoreApiUrl){ - openbisObj._internal.ajaxRequest({ - url: dataStoreApiUrl, - data: { "method" : "tryGetPathToDataSet", - "params" : [ openbisObj.getSession(), dataSetCode, overrideStoreRootPathOrNull ] }, - success: action - }); - }); -} - -/** - * List shares from the default data store. - * - * @see IDssServiceRpcGeneric.listAllShares(String) - * @method - */ -openbis.prototype.listAllShares = function(action) { - this.listAllSharesForDataStore(null, action); -} - -/** - * List shares from the specified data store. - * - * @see IDssServiceRpcGeneric.listAllShares(String) - * @method - */ -openbis.prototype.listAllSharesForDataStore = function(dataStoreCodeOrNull, action) { - var openbisObj = this; - - this._internal.getDataStoreApiUrlForDataStoreCode(dataStoreCodeOrNull, function(dataStoreApiUrl){ - openbisObj._internal.ajaxRequest({ - url: dataStoreApiUrl, - data: { - "method" : "listAllShares", - "params" : [ openbisObj.getSession() ] - }, - success: action - }); - }); -} - -/** - * @see IDssServiceRpcGeneric.shuffleDataSet(String, String, String) - * @method - */ -openbis.prototype.shuffleDataSet = function(dataSetCode, shareId, action) { - var openbisObj = this; - this._internal.getDataStoreApiUrlForDataSetCode(dataSetCode, function(dataStoreApiUrl){ - openbisObj._internal.ajaxRequest({ - url: dataStoreApiUrl, - data: { "method" : "shuffleDataSet", - "params" : [ openbisObj.getSession(), dataSetCode, shareId ] }, - success: action - }); - }); -} - -/** - * Get a validation script from the default data store. - * - * @see IDssServiceRpcGeneric.getValidationScript(String, String) - * @method - */ -openbis.prototype.getValidationScript = function(dataSetTypeOrNull, action) { - this.getValidationScriptForDataStore(dataSetTypeOrNull, null, action); -} - -/** - * Get a validation script from the specified data store. - * - * @see IDssServiceRpcGeneric.getValidationScript(String, String) - * @method - */ -openbis.prototype.getValidationScriptForDataStore = function(dataSetTypeOrNull, dataStoreCodeOrNull, action) { - var openbisObj = this; - - this._internal.getDataStoreApiUrlForDataStoreCode(dataStoreCodeOrNull, function(dataStoreApiUrl){ - openbisObj._internal.ajaxRequest({ - url: dataStoreApiUrl, - data: { - "method" : "getValidationScript", - "params" : [ openbisObj.getSession(), dataSetTypeOrNull ] - }, - success: action - }); - }); -} - -/** - * Get a url that will produce a graph with the given configuration at the default data store. - * - * @method - */ -openbis.prototype.getGraphUrl = function(graphConfig, action) { - this.getGraphUrlForDataStore(graphConfig, null, action); -} - -/** - * Get a url that will produce a graph with the given configuration at the specified data store. - * - * @method - */ -openbis.prototype.getGraphUrlForDataStore = function(graphConfig, dataStoreCodeOrNull, action) { - var openbisObj = this; - - this._internal.getDataStoreHostForDataStoreCode(dataStoreCodeOrNull, function(dataStoreHost) { - var graphUrl = dataStoreHost + "/graphservice/?sessionID=" + openbisObj.getSession(); - for (prop in graphConfig) { - graphUrl += "&" + prop + "=" + encodeURIComponent(graphConfig[prop]); - } - action(graphUrl); - }); -} - -/** - * ===================== - * OpenBIS graph config - * ===================== - * - * Defines the configuration for a graph generated by the server's graphservice. - * - * To use, set properties on the object with keys that match the name of the servlet - * parameters of the graphservice and then call the method getGraphUrl on the openbis - * object. Do *not* set the sessionID paramter -- this will be filled in by the openbis - * object. - * - * The graphservice is documented here: https://wiki-bsse.ethz.ch/display/openBISDoc/Configuring+Graphs+and+Plots - * - * @class - * - */ -function openbisGraphConfig(filename, graphtype, title) { - this.file = filename; - this["graph-type"] = graphtype; - this.title = title; -} - - -/** - * ===================================================== - * OpenBIS webapp context internal code (DO NOT USE!!!) - * ===================================================== - */ - -function _openbisWebAppContextInternal(){ - this.webappCode = this.getParameter("webapp-code"); - this.sessionId = this.getParameter("session-id"); - this.entityKind = this.getParameter("entity-kind"); - this.entityType = this.getParameter("entity-type"); - this.entityIdentifier = this.getParameter("entity-identifier"); - this.entityPermId = this.getParameter("entity-perm-id"); -} - -_openbisWebAppContextInternal.prototype.getParameter = function(parameterName){ - var match = location.search.match(RegExp("[?|&]"+parameterName+'=(.+?)(&|$)')); - if(match && match[1]){ - return decodeURIComponent(match[1].replace(/\+/g,' ')); - }else{ - return null; - } -} - -/** - * ======================= - * OpenBIS webapp context - * ======================= - * - * Provides a context information for webapps that are embedded inside the OpenBIS UI. - * - * @class - * - */ -function openbisWebAppContext(){ - this._internal = new _openbisWebAppContextInternal(); -} - -openbisWebAppContext.prototype.getWebappCode = function(){ - return this._internal.webappCode; -} - -openbisWebAppContext.prototype.getSessionId = function(){ - return this._internal.sessionId; -} - -openbisWebAppContext.prototype.getEntityKind = function(){ - return this._internal.entityKind; -} - -openbisWebAppContext.prototype.getEntityType = function(){ - return this._internal.entityType; -} - -openbisWebAppContext.prototype.getEntityIdentifier = function(){ - return this._internal.entityIdentifier; -} - -openbisWebAppContext.prototype.getEntityPermId = function(){ - return this._internal.entityPermId; -} - -openbisWebAppContext.prototype.getParameter = function(parameterName){ - return this._internal.getParameter(parameterName); -} - -/** - * ======================= - * OpenBIS Search Criteria - * ======================= - * - * Methods and classes for constructing search criteria objects for use in searches. - */ - -/** - * It is easier to construct instances of match clauses using one of the factory methods: - * - * createPropertyMatch - * createAttributeMatch - * createTimeAttributeMatch - * createAnyPropertyMatch - * createAnyFieldMatch - * - * @see ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.SearchCriteria.MatchClause - * @class - */ -function SearchCriteriaMatchClause(type, fieldType, fieldCode, desiredValue) { - this["@type"] = type; - this["fieldType"] = fieldType; - this["fieldCode"] = fieldCode; - this["desiredValue"] = desiredValue; - // compareMode should be one of "LESS_THAN_OR_EQUAL", "EQUALS", "GREATER_THAN_OR_EQUAL" - this["compareMode"] = "EQUALS"; -} - -/** - * Factory method to create a match for a property. - * - * @param propertyCode The code of the property to compare against - * @param desiredValue The value used in the comparison - * @see ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.SearchCriteria.MatchClause.createPropertyMatch(String, String) - * @method - */ -SearchCriteriaMatchClause.createPropertyMatch = function(propertyCode, desiredValue) { - var matchClause = new SearchCriteriaMatchClause("PropertyMatchClause", "PROPERTY", propertyCode, desiredValue); - matchClause["propertyCode"] = propertyCode; - return matchClause; -} - -/** - * Factory method to create a match for an attribute. - * - * @param attribute Should be a valid ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.SearchCriteria.MatchClauseAttribute. - * It should come from this list: - * // common - * "CODE", "TYPE", "PERM_ID", - * // for sample or experiment - * "SPACE", - * // for experiment - * "PROJECT", - * // for all types of entities - * "METAPROJECT" - * @param desiredValue The value used in the comparison - * @see ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.SearchCriteria.MatchClause.createAttributeMatch(MatchClauseAttribute, String) - * @method - */ -SearchCriteriaMatchClause.createAttributeMatch = function(attribute, desiredValue) { - var matchClause = new SearchCriteriaMatchClause("AttributeMatchClause", "ATTRIBUTE", attribute, desiredValue); - matchClause["attribute"] = attribute; - return matchClause; -} - -/** - * Factory method to create a MatchClause matching against registration or modification - * date. - * - * @param attribute Should be a valid ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.SearchCriteria.MatchClauseTimeAttribute - * It should come from this list: REGISTRATION_DATE, MODIFICATION_DATE - * - * @param mode One of "LESS_THAN_OR_EQUAL", "EQUALS", "GREATER_THAN_OR_EQUAL" - * @param date The date to compare against, format YYYY-MM-DD - * @timezone The time zone of the date ("+1", "-5", "0", etc.) - * @see ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.SearchCriteria.MatchClause.createAttributeMatch(MatchClauseTimeAttribute, CompareMode, String, String) - * @method - */ -SearchCriteriaMatchClause.createTimeAttributeMatch = function(attribute, mode, date, timezone) -{ - var matchClause = new SearchCriteriaMatchClause("TimeAttributeMatchClause", "ATTRIBUTE", attribute, date); - matchClause["attribute"] = attribute; - matchClause["compareMode"] = mode; - matchClause["timeZone"] = timezone; - return matchClause; -} - -/** - * Factory method to create a match for against any property. - * - * @param desiredValue The value used in the comparison - * @see ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.SearchCriteria.MatchClause.createAnyPropertyMatch(String) - * @method - */ -SearchCriteriaMatchClause.createAnyPropertyMatch = function(desiredValue) { - var matchClause = new SearchCriteriaMatchClause("AnyPropertyMatchClause", "ANY_PROPERTY", null, desiredValue); - return matchClause; -} - -/** - * Factory method to create a match for against any field (property or attribute). - * - * @param desiredValue The value used in the comparison - * @see ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.SearchCriteria.MatchClause.createAnyFieldMatch(String) - * @method - */ -SearchCriteriaMatchClause.createAnyFieldMatch = function(desiredValue) { - var matchClause = new SearchCriteriaMatchClause("AnyFieldMatchClause", "ANY_FIELD", null, desiredValue); - return matchClause; -} - -/** - * @see ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.SearchCriteria - * @class - */ -function SearchCriteria() { - this["@type"] = "SearchCriteria"; - // operator should be either of "MATCH_ALL_CLAUSES" or "MATCH_ANY_CLAUSES" - this["operator"] = "MATCH_ALL_CLAUSES"; - this["matchClauses"] = []; - this["subCriterias"] = []; -} - -/** - * @see ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.SearchCriteria.addMatchClause(MatchClause) - * @method - */ -SearchCriteria.prototype.addMatchClause = function(matchClause) { - this["matchClauses"].push(matchClause); -}; - -/** - * @see ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.SearchCriteria.addSubCriteria(SearchSubCriteria) - * @method - */ -SearchCriteria.prototype.addSubCriteria = function(subCriteria) { - this["subCriterias"].push(subCriteria); -}; - - -/** - * It is easier to construct instances of sub criteria using one of the factory methods: - * - * createSampleParentCriteria - * createSampleChildCriteria - * createSampleContainerCriteria - * createSampleCriteria - * createExperimentCriteria - * createDataSetContainerCriteria - * createDataSetParentCriteria - * createDataSetChildCriteria - * - * @see ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.SearchSubCriteria - * @class - */ -function SearchSubCriteria(targetEntityKind, searchCriteria) { - this["@type"] = "SearchSubCriteria"; - this["targetEntityKind"] = targetEntityKind; - this["criteria"] = searchCriteria; -} - -/** - * Factory method to create a match for a sample parent. - * - * @see ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.SearchSubCriteria.createSampleParentCriteria(SearchCriteria) - * @method - */ -SearchSubCriteria.createSampleParentCriteria = function(searchCriteria) { - return new SearchSubCriteria("SAMPLE_PARENT", searchCriteria) -} - -/** - * Factory method to create a match for a sample child. - * - * @see ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.SearchSubCriteria.createSampleChildCriteria(SearchCriteria) - * @method - */ -SearchSubCriteria.createSampleChildCriteria = function(searchCriteria) { - return new SearchSubCriteria("SAMPLE_CHILD", searchCriteria) -} - -/** - * Factory method to create a match for a sample container. - * - * @see ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.SearchSubCriteria.createSampleContainerCriteria(SearchCriteria) - * @method - */ -SearchSubCriteria.createSampleContainerCriteria = function(searchCriteria) { - return new SearchSubCriteria("SAMPLE_CONTAINER", searchCriteria) -} - -/** - * Factory method to create a match for a sample. - * - * @see ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.SearchSubCriteria.createSampleCriteria(SearchCriteria) - * @method - */ -SearchSubCriteria.createSampleCriteria = function(searchCriteria) { - return new SearchSubCriteria("SAMPLE", searchCriteria) -} - -/** - * Factory method to create a match for an experiment. - * - * @see ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.SearchSubCriteria.createExperimentCriteria(SearchCriteria) - * @method - */ -SearchSubCriteria.createExperimentCriteria = function(searchCriteria) { - return new SearchSubCriteria("EXPERIMENT", searchCriteria) -} - -/** - * Factory method to create a match for a data set container. - * - * @see ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.SearchSubCriteria.createDataSetContainerCriteria(SearchCriteria) - * @method - */ -SearchSubCriteria.createDataSetContainerCriteria = function(searchCriteria) { - return new SearchSubCriteria("DATA_SET_CONTAINER", searchCriteria) -} - -/** - * Factory method to create a match for a data set parent. - * - * @see ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.SearchSubCriteria.createDataSetParentCriteria(SearchCriteria) - * @method - */ -SearchSubCriteria.createDataSetParentCriteria = function(searchCriteria) { - return new SearchSubCriteria("DATA_SET_PARENT", searchCriteria) -} - -/** - * Factory method to create a match for a data set child. - * - * @see ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.SearchSubCriteria.createDataSetChildCriteria(SearchCriteria) - * @method - */ -SearchSubCriteria.createDataSetChildCriteria = function(searchCriteria) { - return new SearchSubCriteria("DATA_SET_CHILD", searchCriteria) -} diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/demultiplexing/html/js/spin.min.js b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/demultiplexing/html/js/spin.min.js deleted file mode 100644 index 942980c82a07821ba453cc6cdba7524e038a72c6..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/demultiplexing/html/js/spin.min.js +++ /dev/null @@ -1,2 +0,0 @@ -//fgnass.github.com/spin.js#v1.2.7 -!function(e,t,n){function o(e,n){var r=t.createElement(e||"div"),i;for(i in n)r[i]=n[i];return r}function u(e){for(var t=1,n=arguments.length;t<n;t++)e.appendChild(arguments[t]);return e}function f(e,t,n,r){var o=["opacity",t,~~(e*100),n,r].join("-"),u=.01+n/r*100,f=Math.max(1-(1-e)/t*(100-u),e),l=s.substring(0,s.indexOf("Animation")).toLowerCase(),c=l&&"-"+l+"-"||"";return i[o]||(a.insertRule("@"+c+"keyframes "+o+"{"+"0%{opacity:"+f+"}"+u+"%{opacity:"+e+"}"+(u+.01)+"%{opacity:1}"+(u+t)%100+"%{opacity:"+e+"}"+"100%{opacity:"+f+"}"+"}",a.cssRules.length),i[o]=1),o}function l(e,t){var i=e.style,s,o;if(i[t]!==n)return t;t=t.charAt(0).toUpperCase()+t.slice(1);for(o=0;o<r.length;o++){s=r[o]+t;if(i[s]!==n)return s}}function c(e,t){for(var n in t)e.style[l(e,n)||n]=t[n];return e}function h(e){for(var t=1;t<arguments.length;t++){var r=arguments[t];for(var i in r)e[i]===n&&(e[i]=r[i])}return e}function p(e){var t={x:e.offsetLeft,y:e.offsetTop};while(e=e.offsetParent)t.x+=e.offsetLeft,t.y+=e.offsetTop;return t}var r=["webkit","Moz","ms","O"],i={},s,a=function(){var e=o("style",{type:"text/css"});return u(t.getElementsByTagName("head")[0],e),e.sheet||e.styleSheet}(),d={lines:12,length:7,width:5,radius:10,rotate:0,corners:1,color:"#000",speed:1,trail:100,opacity:.25,fps:20,zIndex:2e9,className:"spinner",top:"auto",left:"auto",position:"relative"},v=function m(e){if(!this.spin)return new m(e);this.opts=h(e||{},m.defaults,d)};v.defaults={},h(v.prototype,{spin:function(e){this.stop();var t=this,n=t.opts,r=t.el=c(o(0,{className:n.className}),{position:n.position,width:0,zIndex:n.zIndex}),i=n.radius+n.length+n.width,u,a;e&&(e.insertBefore(r,e.firstChild||null),a=p(e),u=p(r),c(r,{left:(n.left=="auto"?a.x-u.x+(e.offsetWidth>>1):parseInt(n.left,10)+i)+"px",top:(n.top=="auto"?a.y-u.y+(e.offsetHeight>>1):parseInt(n.top,10)+i)+"px"})),r.setAttribute("aria-role","progressbar"),t.lines(r,t.opts);if(!s){var f=0,l=n.fps,h=l/n.speed,d=(1-n.opacity)/(h*n.trail/100),v=h/n.lines;(function m(){f++;for(var e=n.lines;e;e--){var i=Math.max(1-(f+e*v)%h*d,n.opacity);t.opacity(r,n.lines-e,i,n)}t.timeout=t.el&&setTimeout(m,~~(1e3/l))})()}return t},stop:function(){var e=this.el;return e&&(clearTimeout(this.timeout),e.parentNode&&e.parentNode.removeChild(e),this.el=n),this},lines:function(e,t){function i(e,r){return c(o(),{position:"absolute",width:t.length+t.width+"px",height:t.width+"px",background:e,boxShadow:r,transformOrigin:"left",transform:"rotate("+~~(360/t.lines*n+t.rotate)+"deg) translate("+t.radius+"px"+",0)",borderRadius:(t.corners*t.width>>1)+"px"})}var n=0,r;for(;n<t.lines;n++)r=c(o(),{position:"absolute",top:1+~(t.width/2)+"px",transform:t.hwaccel?"translate3d(0,0,0)":"",opacity:t.opacity,animation:s&&f(t.opacity,t.trail,n,t.lines)+" "+1/t.speed+"s linear infinite"}),t.shadow&&u(r,c(i("#000","0 0 4px #000"),{top:"2px"})),u(e,u(r,i(t.color,"0 0 1px rgba(0,0,0,.1)")));return e},opacity:function(e,t,n){t<e.childNodes.length&&(e.childNodes[t].style.opacity=n)}}),function(){function e(e,t){return o("<"+e+' xmlns="urn:schemas-microsoft.com:vml" class="spin-vml">',t)}var t=c(o("group"),{behavior:"url(#default#VML)"});!l(t,"transform")&&t.adj?(a.addRule(".spin-vml","behavior:url(#default#VML)"),v.prototype.lines=function(t,n){function s(){return c(e("group",{coordsize:i+" "+i,coordorigin:-r+" "+ -r}),{width:i,height:i})}function l(t,i,o){u(a,u(c(s(),{rotation:360/n.lines*t+"deg",left:~~i}),u(c(e("roundrect",{arcsize:n.corners}),{width:r,height:n.width,left:n.radius,top:-n.width>>1,filter:o}),e("fill",{color:n.color,opacity:n.opacity}),e("stroke",{opacity:0}))))}var r=n.length+n.width,i=2*r,o=-(n.width+n.length)*2+"px",a=c(s(),{position:"absolute",top:o,left:o}),f;if(n.shadow)for(f=1;f<=n.lines;f++)l(f,-2,"progid:DXImageTransform.Microsoft.Blur(pixelradius=2,makeshadow=1,shadowopacity=.3)");for(f=1;f<=n.lines;f++)l(f);return u(t,a)},v.prototype.opacity=function(e,t,n,r){var i=e.firstChild;r=r.shadow&&r.lines||0,i&&t+r<i.childNodes.length&&(i=i.childNodes[t+r],i=i&&i.firstChild,i=i&&i.firstChild,i&&(i.opacity=n))}):s=l(t,"animation")}(),typeof define=="function"&&define.amd?define(function(){return v}):e.Spinner=v}(window,document); \ No newline at end of file diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/demultiplexing/plugin.properties b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/demultiplexing/plugin.properties deleted file mode 100644 index 26b2c9b16e7fa15ea82659568b1058ecc6a2ae69..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/demultiplexing/plugin.properties +++ /dev/null @@ -1,6 +0,0 @@ -# The properties file for an example webapps plugin -# This file has no properties defined because none need to be defined. -webapp-folder = html -openbisui-contexts = sample-details-view -sample-entity-types = ILLUMINA_FLOW_CELL -label = Demultiplex diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/downloader/html/body-style.css b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/downloader/html/body-style.css deleted file mode 100644 index 31d719328341c5b3abef4fc62090b33ad95e4ebb..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/downloader/html/body-style.css +++ /dev/null @@ -1,60 +0,0 @@ - -input { -border: 0px solid; -height: 25px; -border-color:#000000; -outline: none; -font: 18px "Trebuchet MS"; -} - -body { font: 14px "Trebuchet MS", sans-serif; } - -h1 { -font: 10px; -color:#999999; - } -h3 { font: 12px; } - -.greytext {font: 18px "Trebuchet MS";} -.greytext:link {color:#BDBDBD; text-decoration:none} -.greytext:visited {color:#BDBDBD; text-decoration:none} -.greytext:active {color:#BDBDBD; text-decoration:none} -.greytext:hover {color:#000000; text-decoration:none} -.greytext input {color:#999999; text-decoration:none} - - -.box { -background-color: white; -text-rendering: optimizeLegibility; --webkit-border-radius: 6px; -height: 50px; -width: 480px; -margin-top: 30px; -padding: 8px 8px 8px 50px; -border: 3px solid #999999; -box-sizing: border-box; --webkit-box-sizing: border-box; --moz-box-sizing: border-box; -border-radius: 6px 6px 6px 6px; -} - -.loginname { -background-image: url(images/sprite.png); -background-repeat: no-repeat; -background-position: 5px 10px; -} - -.password { -background-image: url(images/sprite.png); -background-repeat: no-repeat; -background-position: 5px -30px; -} - -.loginbutton { -margin-top: 30px; -} - -div -{ -} - diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/downloader/html/button.css b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/downloader/html/button.css deleted file mode 100644 index 37c8cbc7bef279a06ef349058098d2698922e5a0..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/downloader/html/button.css +++ /dev/null @@ -1,39 +0,0 @@ -button { - font: 18px "Trebuchet MS"; - background-color: #222; - background-image: -moz-linear-gradient(top, rgba(255,255,255,.25), rgba(255,255,255,.11)); - background-image: -webkit-gradient(linear,left top,left bottom,color-stop(0, rgba(255,255,255,.25)),color-stop(1, rgba(255,255,255,.11))); - background-image: -webkit-linear-gradient(rgba(255,255,255,.25), rgba(255,255,255,.11)); - color: #fff; - text-rendering: optimizeLegibility; - text-shadow: 0 -1px 1px #222; - padding: 3px 5px 3px 5px; - border: 0; - border-radius: 6px; - border-bottom: 1px solid #222; - margin: 0; - -moz-box-shadow: 0 1px 3px #999; - -webkit-box-shadow: 0 1px 3px #999; - box-shadow: 0 1px 3px #999; - width: 150px; -} - -button.first { - border-top-left-radius: 6px; - border-bottom-left-radius: 6px; -} - -button.last { - border-top-right-radius: 6px; - border-bottom-right-radius: 6px; -} - -button.active { - background-color:red; -} - -button:hover { - background-color: grey; - cursor: pointer; -} - diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/downloader/html/d3.time.js b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/downloader/html/d3.time.js deleted file mode 100644 index e1c0831c88e2984fbabc189a5347238bde72abb2..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/downloader/html/d3.time.js +++ /dev/null @@ -1,692 +0,0 @@ -(function(){d3.time = {}; - -var d3_time = Date; -d3.time.format = function(template) { - var n = template.length; - - function format(date) { - var string = [], - i = -1, - j = 0, - c, - f; - while (++i < n) { - if (template.charCodeAt(i) == 37) { - string.push( - template.substring(j, i), - (f = d3_time_formats[c = template.charAt(++i)]) - ? f(date) : c); - j = i + 1; - } - } - string.push(template.substring(j, i)); - return string.join(""); - } - - format.parse = function(string) { - var date = new d3_time(1900, 0, 1), - i = d3_time_parse(date, template, string, 0); - if (i != string.length) return null; - if (date.hour12) { - var hours = date.getHours() % 12; - date.setHours(date.hour12pm ? hours + 12 : hours); - } - delete date.hour12; - delete date.hour12pm; - return date; - }; - - format.toString = function() { - return template; - }; - - return format; -}; - -function d3_time_parse(date, template, string, j) { - var c, - p, - i = 0, - n = template.length, - m = string.length; - while (i < n) { - if (j >= m) return -1; - c = template.charCodeAt(i++); - if (c == 37) { - p = d3_time_parsers[template.charAt(i++)]; - if (!p || ((j = p(date, string, j)) < 0)) return -1; - } else if (c != string.charCodeAt(j++)) { - return -1; - } - } - return j; -} - -var d3_time_zfill2 = d3.format("02d"), - d3_time_zfill3 = d3.format("03d"), - d3_time_zfill4 = d3.format("04d"), - d3_time_sfill2 = d3.format("2d"); - -var d3_time_formats = { - a: function(d) { return d3_time_weekdays[d.getDay()].substring(0, 3); }, - A: function(d) { return d3_time_weekdays[d.getDay()]; }, - b: function(d) { return d3_time_months[d.getMonth()].substring(0, 3); }, - B: function(d) { return d3_time_months[d.getMonth()]; }, - c: d3.time.format("%a %b %e %H:%M:%S %Y"), - d: function(d) { return d3_time_zfill2(d.getDate()); }, - e: function(d) { return d3_time_sfill2(d.getDate()); }, - H: function(d) { return d3_time_zfill2(d.getHours()); }, - I: function(d) { return d3_time_zfill2(d.getHours() % 12 || 12); }, - j: d3_time_dayOfYear, - L: function(d) { return d3_time_zfill3(d.getMilliseconds()); }, - m: function(d) { return d3_time_zfill2(d.getMonth() + 1); }, - M: function(d) { return d3_time_zfill2(d.getMinutes()); }, - p: function(d) { return d.getHours() >= 12 ? "PM" : "AM"; }, - S: function(d) { return d3_time_zfill2(d.getSeconds()); }, - U: d3_time_weekNumberSunday, - w: function(d) { return d.getDay(); }, - W: d3_time_weekNumberMonday, - x: d3.time.format("%m/%d/%y"), - X: d3.time.format("%H:%M:%S"), - y: function(d) { return d3_time_zfill2(d.getFullYear() % 100); }, - Y: function(d) { return d3_time_zfill4(d.getFullYear() % 10000); }, - Z: d3_time_zone, - "%": function(d) { return "%"; } -}; - -var d3_time_parsers = { - a: d3_time_parseWeekdayAbbrev, - A: d3_time_parseWeekday, - b: d3_time_parseMonthAbbrev, - B: d3_time_parseMonth, - c: d3_time_parseLocaleFull, - d: d3_time_parseDay, - e: d3_time_parseDay, - H: d3_time_parseHour24, - I: d3_time_parseHour12, - // j: function(d, s, i) { /*TODO day of year [001,366] */ return i; }, - L: d3_time_parseMilliseconds, - m: d3_time_parseMonthNumber, - M: d3_time_parseMinutes, - p: d3_time_parseAmPm, - S: d3_time_parseSeconds, - // U: function(d, s, i) { /*TODO week number (sunday) [00,53] */ return i; }, - // w: function(d, s, i) { /*TODO weekday [0,6] */ return i; }, - // W: function(d, s, i) { /*TODO week number (monday) [00,53] */ return i; }, - x: d3_time_parseLocaleDate, - X: d3_time_parseLocaleTime, - y: d3_time_parseYear, - Y: d3_time_parseFullYear - // , - // Z: function(d, s, i) { /*TODO time zone */ return i; }, - // "%": function(d, s, i) { /*TODO literal % */ return i; } -}; - -// Note: weekday is validated, but does not set the date. -function d3_time_parseWeekdayAbbrev(date, string, i) { - return string.substring(i, i += 3).toLowerCase() in d3_time_weekdayAbbrevLookup ? i : -1; -} - -var d3_time_weekdayAbbrevLookup = { - sun: 3, - mon: 3, - tue: 3, - wed: 3, - thu: 3, - fri: 3, - sat: 3 -}; - -// Note: weekday is validated, but does not set the date. -function d3_time_parseWeekday(date, string, i) { - d3_time_weekdayRe.lastIndex = 0; - var n = d3_time_weekdayRe.exec(string.substring(i, i + 10)); - return n ? i += n[0].length : -1; -} - -var d3_time_weekdayRe = /^(?:Sunday|Monday|Tuesday|Wednesday|Thursday|Friday|Saturday)/ig; - -var d3_time_weekdays = [ - "Sunday", - "Monday", - "Tuesday", - "Wednesday", - "Thursday", - "Friday", - "Saturday" -]; - -function d3_time_parseMonthAbbrev(date, string, i) { - var n = d3_time_monthAbbrevLookup[string.substring(i, i += 3).toLowerCase()]; - return n == null ? -1 : (date.setMonth(n), i); -} - -var d3_time_monthAbbrevLookup = { - jan: 0, - feb: 1, - mar: 2, - apr: 3, - may: 4, - jun: 5, - jul: 6, - aug: 7, - sep: 8, - oct: 9, - nov: 10, - dec: 11 -}; - -function d3_time_parseMonth(date, string, i) { - d3_time_monthRe.lastIndex = 0; - var n = d3_time_monthRe.exec(string.substring(i, i + 12)); - return n ? (date.setMonth(d3_time_monthLookup[n[0].toLowerCase()]), i += n[0].length) : -1; -} - -var d3_time_monthRe = /^(?:January|February|March|April|May|June|July|August|September|October|November|December)/ig; - -var d3_time_monthLookup = { - january: 0, - february: 1, - march: 2, - april: 3, - may: 4, - june: 5, - july: 6, - august: 7, - september: 8, - october: 9, - november: 10, - december: 11 -}; - -var d3_time_months = [ - "January", - "February", - "March", - "April", - "May", - "June", - "July", - "August", - "September", - "October", - "November", - "December" -]; - -function d3_time_parseLocaleFull(date, string, i) { - return d3_time_parse(date, d3_time_formats.c.toString(), string, i); -} - -function d3_time_parseLocaleDate(date, string, i) { - return d3_time_parse(date, d3_time_formats.x.toString(), string, i); -} - -function d3_time_parseLocaleTime(date, string, i) { - return d3_time_parse(date, d3_time_formats.X.toString(), string, i); -} - -function d3_time_parseFullYear(date, string, i) { - d3_time_numberRe.lastIndex = 0; - var n = d3_time_numberRe.exec(string.substring(i, i + 4)); - return n ? (date.setFullYear(n[0]), i += n[0].length) : -1; -} - -function d3_time_parseYear(date, string, i) { - d3_time_numberRe.lastIndex = 0; - var n = d3_time_numberRe.exec(string.substring(i, i + 2)); - return n ? (date.setFullYear(d3_time_century() + +n[0]), i += n[0].length) : -1; -} - -function d3_time_century() { - return ~~(new Date().getFullYear() / 1000) * 1000; -} - -function d3_time_parseMonthNumber(date, string, i) { - d3_time_numberRe.lastIndex = 0; - var n = d3_time_numberRe.exec(string.substring(i, i + 2)); - return n ? (date.setMonth(n[0] - 1), i += n[0].length) : -1; -} - -function d3_time_parseDay(date, string, i) { - d3_time_numberRe.lastIndex = 0; - var n = d3_time_numberRe.exec(string.substring(i, i + 2)); - return n ? (date.setDate(+n[0]), i += n[0].length) : -1; -} - -// Note: we don't validate that the hour is in the range [0,23]. -function d3_time_parseHour24(date, string, i) { - d3_time_numberRe.lastIndex = 0; - var n = d3_time_numberRe.exec(string.substring(i, i + 2)); - return n ? (date.setHours(+n[0]), i += n[0].length) : -1; -} - -// Note: we don't validate that the hour is in the range [1,12]. -function d3_time_parseHour12(date, string, i) { - date.hour12 = true; - return d3_time_parseHour24(date, string, i); -} - -function d3_time_parseMinutes(date, string, i) { - d3_time_numberRe.lastIndex = 0; - var n = d3_time_numberRe.exec(string.substring(i, i + 2)); - return n ? (date.setMinutes(+n[0]), i += n[0].length) : -1; -} - -function d3_time_parseSeconds(date, string, i) { - d3_time_numberRe.lastIndex = 0; - var n = d3_time_numberRe.exec(string.substring(i, i + 2)); - return n ? (date.setSeconds(+n[0]), i += n[0].length) : -1; -} - -function d3_time_parseMilliseconds(date, string, i) { - d3_time_numberRe.lastIndex = 0; - var n = d3_time_numberRe.exec(string.substring(i, i + 3)); - return n ? (date.setMilliseconds(+n[0]), i += n[0].length) : -1; -} - -// Note: we don't look at the next directive. -var d3_time_numberRe = /\s*\d+/; - -function d3_time_parseAmPm(date, string, i) { - var n = d3_time_amPmLookup[string.substring(i, i += 2).toLowerCase()]; - return n == null ? -1 : (date.hour12pm = n, i); -} - -var d3_time_amPmLookup = { - am: 0, - pm: 1 -}; - -function d3_time_year(d) { - return new d3_time(d.getFullYear(), 0, 1); -} - -function d3_time_daysElapsed(d0, d1) { - return ~~((d1 - d0) / 864e5 - (d1.getTimezoneOffset() - d0.getTimezoneOffset()) / 1440); -} - -function d3_time_dayOfYear(d) { - return d3_time_zfill3(1 + d3_time_daysElapsed(d3_time_year(d), d)); -} - -function d3_time_weekNumberSunday(d) { - var d0 = d3_time_year(d); - return d3_time_zfill2(~~((d3_time_daysElapsed(d0, d) + d0.getDay()) / 7)); -} - -function d3_time_weekNumberMonday(d) { - var d0 = d3_time_year(d); - return d3_time_zfill2(~~((d3_time_daysElapsed(d0, d) + (d0.getDay() + 6) % 7) / 7)); -} - -// TODO table of time zone offset names? -function d3_time_zone(d) { - var z = d.getTimezoneOffset(), - zs = z > 0 ? "-" : "+", - zh = ~~(Math.abs(z) / 60), - zm = Math.abs(z) % 60; - return zs + d3_time_zfill2(zh) + d3_time_zfill2(zm); -} -d3.time.format.utc = function(template) { - var local = d3.time.format(template); - - function format(date) { - try { - d3_time = d3_time_format_utc; - var utc = new d3_time(); - utc._ = date; - return local(utc); - } finally { - d3_time = Date; - } - } - - format.parse = function(string) { - try { - d3_time = d3_time_format_utc; - var date = local.parse(string); - return date && date._; - } finally { - d3_time = Date; - } - }; - - format.toString = local.toString; - - return format; -}; - -function d3_time_format_utc() { - this._ = new Date(Date.UTC.apply(this, arguments)); -} - -d3_time_format_utc.prototype = { - getDate: function() { return this._.getUTCDate(); }, - getDay: function() { return this._.getUTCDay(); }, - getFullYear: function() { return this._.getUTCFullYear(); }, - getHours: function() { return this._.getUTCHours(); }, - getMilliseconds: function() { return this._.getUTCMilliseconds(); }, - getMinutes: function() { return this._.getUTCMinutes(); }, - getMonth: function() { return this._.getUTCMonth(); }, - getSeconds: function() { return this._.getUTCSeconds(); }, - getTimezoneOffset: function() { return 0; }, - valueOf: function() { return this._.getTime(); }, - setDate: function(x) { this._.setUTCDate(x); }, - setDay: function(x) { this._.setUTCDay(x); }, - setFullYear: function(x) { this._.setUTCFullYear(x); }, - setHours: function(x) { this._.setUTCHours(x); }, - setMilliseconds: function(x) { this._.setUTCMilliseconds(x); }, - setMinutes: function(x) { this._.setUTCMinutes(x); }, - setMonth: function(x) { this._.setUTCMonth(x); }, - setSeconds: function(x) { this._.setUTCSeconds(x); } -}; -var d3_time_formatIso = d3.time.format.utc("%Y-%m-%dT%H:%M:%S.%LZ"); - -d3.time.format.iso = Date.prototype.toISOString ? d3_time_formatIsoNative : d3_time_formatIso; - -function d3_time_formatIsoNative(date) { - return date.toISOString(); -} - -d3_time_formatIsoNative.parse = function(string) { - return new Date(string); -}; - -d3_time_formatIsoNative.toString = d3_time_formatIso.toString; -function d3_time_range(floor, step, number) { - return function(t0, t1, dt) { - var time = floor(t0), times = []; - if (time < t0) step(time); - if (dt > 1) { - while (time < t1) { - var date = new Date(+time); - if (!(number(date) % dt)) times.push(date); - step(time); - } - } else { - while (time < t1) times.push(new Date(+time)), step(time); - } - return times; - }; -} -d3.time.second = function(date) { - return new Date(~~(date / 1e3) * 1e3); -}; - -d3.time.second.utc = d3.time.second; -d3.time.seconds = d3_time_range(d3.time.second, function(date) { - date.setTime(date.getTime() + 1e3); -}, function(date) { - return date.getSeconds(); -}); - -d3.time.seconds.utc = d3.time.seconds; -d3.time.minute = function(date) { - return new Date(~~(date / 6e4) * 6e4); -}; - -d3.time.minute.utc = d3.time.minute;d3.time.minutes = d3_time_range(d3.time.minute, d3_time_minutesStep, function(date) { - return date.getMinutes(); -}); - -d3.time.minutes.utc = d3_time_range(d3.time.minute, d3_time_minutesStep, function(date) { - return date.getUTCMinutes(); -}); - -function d3_time_minutesStep(date) { - date.setTime(date.getTime() + 6e4); // assumes no leap seconds -} -d3.time.hour = function(date) { - var offset = date.getTimezoneOffset() / 60; - return new Date((~~(date / 36e5 - offset) + offset) * 36e5); -}; - -d3.time.hour.utc = function(date) { - return new Date(~~(date / 36e5) * 36e5); -}; -d3.time.hours = d3_time_range(d3.time.hour, d3_time_hoursStep, function(date) { - return date.getHours(); -}); - -d3.time.hours.utc = d3_time_range(d3.time.hour.utc, d3_time_hoursStep, function(date) { - return date.getUTCHours(); -}); - -function d3_time_hoursStep(date) { - date.setTime(date.getTime() + 36e5); -} -d3.time.day = function(date) { - return new Date(date.getFullYear(), date.getMonth(), date.getDate()); -}; - -d3.time.day.utc = function(date) { - return new Date(~~(date / 864e5) * 864e5); -}; -d3.time.days = d3_time_range(d3.time.day, function(date) { - date.setDate(date.getDate() + 1); -}, function(date) { - return date.getDate() - 1; -}); - -d3.time.days.utc = d3_time_range(d3.time.day.utc, function(date) { - date.setUTCDate(date.getUTCDate() + 1); -}, function(date) { - return date.getUTCDate() - 1; -}); -d3.time.week = function(date) { - (date = d3.time.day(date)).setDate(date.getDate() - date.getDay()); - return date; -}; - -d3.time.week.utc = function(date) { - (date = d3.time.day.utc(date)).setUTCDate(date.getUTCDate() - date.getUTCDay()); - return date; -}; -d3.time.weeks = d3_time_range(d3.time.week, function(date) { - date.setDate(date.getDate() + 7); -}, function(date) { - return ~~((date - new Date(date.getFullYear(), 0, 1)) / 6048e5); -}); - -d3.time.weeks.utc = d3_time_range(d3.time.week.utc, function(date) { - date.setUTCDate(date.getUTCDate() + 7); -}, function(date) { - return ~~((date - Date.UTC(date.getUTCFullYear(), 0, 1)) / 6048e5); -}); -d3.time.month = function(date) { - return new Date(date.getFullYear(), date.getMonth(), 1); -}; - -d3.time.month.utc = function(date) { - return new Date(Date.UTC(date.getUTCFullYear(), date.getUTCMonth(), 1)); -}; -d3.time.months = d3_time_range(d3.time.month, function(date) { - date.setMonth(date.getMonth() + 1); -}, function(date) { - return date.getMonth(); -}); - -d3.time.months.utc = d3_time_range(d3.time.month.utc, function(date) { - date.setUTCMonth(date.getUTCMonth() + 1); -}, function(date) { - return date.getUTCMonth(); -}); -d3.time.year = function(date) { - return new Date(date.getFullYear(), 0, 1); -}; - -d3.time.year.utc = function(date) { - return new Date(Date.UTC(date.getUTCFullYear(), 0, 1)); -}; -d3.time.years = d3_time_range(d3.time.year, function(date) { - date.setFullYear(date.getFullYear() + 1); -}, function(date) { - return date.getFullYear(); -}); - -d3.time.years.utc = d3_time_range(d3.time.year.utc, function(date) { - date.setUTCFullYear(date.getUTCFullYear() + 1); -}, function(date) { - return date.getUTCFullYear(); -}); -// TODO nice -function d3_time_scale(linear, methods, format) { - - function scale(x) { - return linear(x); - } - - scale.invert = function(x) { - return d3_time_scaleDate(linear.invert(x)); - }; - - scale.domain = function(x) { - if (!arguments.length) return linear.domain().map(d3_time_scaleDate); - linear.domain(x); - return scale; - }; - - scale.ticks = function(m, k) { - var extent = d3_time_scaleExtent(scale.domain()); - if (typeof m !== "function") { - var span = extent[1] - extent[0], - target = span / m, - i = d3.bisect(d3_time_scaleSteps, target, 1, d3_time_scaleSteps.length - 1); - if (Math.log(target / d3_time_scaleSteps[i - 1]) < Math.log(d3_time_scaleSteps[i] / target)) --i; - m = methods[i]; - k = m[1]; - m = m[0]; - } - return m(extent[0], extent[1], k); - }; - - scale.tickFormat = function() { - return format; - }; - - scale.copy = function() { - return d3_time_scale(linear.copy(), methods, format); - }; - - // TOOD expose d3_scale_linear_rebind? - scale.range = d3.rebind(scale, linear.range); - scale.rangeRound = d3.rebind(scale, linear.rangeRound); - scale.interpolate = d3.rebind(scale, linear.interpolate); - scale.clamp = d3.rebind(scale, linear.clamp); - - return scale; -} - -// TODO expose d3_scaleExtent? -function d3_time_scaleExtent(domain) { - var start = domain[0], stop = domain[domain.length - 1]; - return start < stop ? [start, stop] : [stop, start]; -} - -function d3_time_scaleDate(t) { - return new Date(t); -} - -function d3_time_scaleFormat(formats) { - return function(date) { - var i = formats.length - 1, f = formats[i]; - while (!f[1](date)) f = formats[--i]; - return f[0](date); - }; -} - -var d3_time_scaleSteps = [ - 1e3, // 1-second - 5e3, // 5-second - 15e3, // 15-second - 3e4, // 30-second - 6e4, // 1-minute - 3e5, // 5-minute - 9e5, // 15-minute - 18e5, // 30-minute - 36e5, // 1-hour - 108e5, // 3-hour - 216e5, // 6-hour - 432e5, // 12-hour - 864e5, // 1-day - 1728e5, // 2-day - 6048e5, // 1-week - 1728e6, // 1-month - 7776e6, // 3-month - 31536e6 // 1-year -]; - -var d3_time_scaleLocalMethods = [ - [d3.time.seconds, 1], - [d3.time.seconds, 5], - [d3.time.seconds, 15], - [d3.time.seconds, 30], - [d3.time.minutes, 1], - [d3.time.minutes, 5], - [d3.time.minutes, 15], - [d3.time.minutes, 30], - [d3.time.hours, 1], - [d3.time.hours, 3], - [d3.time.hours, 6], - [d3.time.hours, 12], - [d3.time.days, 1], - [d3.time.days, 2], - [d3.time.weeks, 1], - [d3.time.months, 1], - [d3.time.months, 3], - [d3.time.years, 1] -]; - -var d3_time_scaleLocalFormats = [ - [d3.time.format("%Y"), function(d) { return true; }], - [d3.time.format("%B"), function(d) { return d.getMonth(); }], - [d3.time.format("%b %d"), function(d) { return d.getDate() != 1; }], - [d3.time.format("%a %d"), function(d) { return d.getDay() && d.getDate() != 1; }], - [d3.time.format("%I %p"), function(d) { return d.getHours(); }], - [d3.time.format("%I:%M"), function(d) { return d.getMinutes(); }], - [d3.time.format(":%S"), function(d) { return d.getSeconds() || d.getMilliseconds(); }] -]; - -var d3_time_scaleLocalFormat = d3_time_scaleFormat(d3_time_scaleLocalFormats); - -d3.time.scale = function() { - return d3_time_scale(d3.scale.linear(), d3_time_scaleLocalMethods, d3_time_scaleLocalFormat); -}; -var d3_time_scaleUTCMethods = [ - [d3.time.seconds.utc, 1], - [d3.time.seconds.utc, 5], - [d3.time.seconds.utc, 15], - [d3.time.seconds.utc, 30], - [d3.time.minutes.utc, 1], - [d3.time.minutes.utc, 5], - [d3.time.minutes.utc, 15], - [d3.time.minutes.utc, 30], - [d3.time.hours.utc, 1], - [d3.time.hours.utc, 3], - [d3.time.hours.utc, 6], - [d3.time.hours.utc, 12], - [d3.time.days.utc, 1], - [d3.time.days.utc, 2], - [d3.time.weeks.utc, 1], - [d3.time.months.utc, 1], - [d3.time.months.utc, 3], - [d3.time.years.utc, 1] -]; - -var d3_time_scaleUTCFormats = [ - [d3.time.format.utc("%Y"), function(d) { return true; }], - [d3.time.format.utc("%B"), function(d) { return d.getUTCMonth(); }], - [d3.time.format.utc("%b %d"), function(d) { return d.getUTCDate() != 1; }], - [d3.time.format.utc("%a %d"), function(d) { return d.getUTCDay() && d.getUTCDate() != 1; }], - [d3.time.format.utc("%I %p"), function(d) { return d.getUTCHours(); }], - [d3.time.format.utc("%I:%M"), function(d) { return d.getUTCMinutes(); }], - [d3.time.format.utc(":%S"), function(d) { return d.getUTCSeconds() || d.getUTCMilliseconds(); }] -]; - -var d3_time_scaleUTCFormat = d3_time_scaleFormat(d3_time_scaleUTCFormats); - -d3.time.scale.utc = function() { - return d3_time_scale(d3.scale.linear(), d3_time_scaleUTCMethods, d3_time_scaleUTCFormat); -}; -})(); diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/downloader/html/images/openBIS_Logo.svg b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/downloader/html/images/openBIS_Logo.svg deleted file mode 100755 index 70ac6c77f2774a5a5e8f6875e3c8ae1acb8e952a..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/downloader/html/images/openBIS_Logo.svg +++ /dev/null @@ -1,68 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- Generator: Adobe Illustrator 15.0.2, SVG Export Plug-In . SVG Version: 6.00 Build 0) --> -<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> -<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" - width="400.023px" height="174.566px" viewBox="0 0 400.023 174.566" enable-background="new 0 0 400.023 174.566" - xml:space="preserve"> -<g id="Layer_1"> - <g> - <text transform="matrix(1 0 0 1 46.4854 154.2764)"><tspan x="0" y="0" fill="#010101" font-family="'HelveticaNeue-Bold'" font-size="93.505" letter-spacing="-4">open</tspan><tspan x="204.679" y="0" fill="#231F20" font-family="'HelveticaNeue'" font-size="93.505">BIS</tspan></text> - <rect x="204.234" y="158.748" fill="none" width="192.64" height="14.936"/> - <text transform="matrix(1 0 0 1 204.2329 169.876)" fill="#010101" font-family="'HelveticaNeue'" font-size="15.5842">Biology Information System</text> - <g> - <g> - <g> - <g> - <polygon fill="#068172" points="125.213,81.967 141.416,98.167 147.252,92.333 131.053,76.132 125.213,76.132 "/> - </g> - <g> - <g> - <polygon fill="#068172" points="120.206,81.967 104.005,98.167 98.168,92.333 114.368,76.132 120.206,76.132 "/> - </g> - <g> - <polygon fill="#068172" points="120.206,65.286 104.005,49.084 98.168,54.92 114.368,71.12 120.206,71.12 "/> - </g> - </g> - </g> - <g> - <polygon fill="#068172" points="125.213,65.286 141.416,49.084 147.252,54.92 131.053,71.12 125.213,71.12 "/> - </g> - </g> - <g> - <g> - <polygon fill="#A4A4A4" points="76.131,16.201 92.331,0 98.168,5.836 81.969,22.036 76.13,22.036 "/> - </g> - <g> - <g> - <polygon fill="#ADACAF" points="76.131,32.882 92.331,49.084 98.168,43.247 81.969,27.048 76.13,27.048 "/> - </g> - <g> - <g> - <polygon fill="#ADACAF" points="71.122,32.882 54.921,49.084 49.084,43.247 65.283,27.048 71.123,27.048 "/> - </g> - <g> - <polygon fill="#ADACAF" points="71.122,16.201 54.921,0 49.084,5.836 65.283,22.036 71.123,22.036 "/> - </g> - </g> - </g> - </g> - <g> - <g> - <polygon fill="#ADACAF" points="27.046,65.286 43.247,49.084 49.083,54.92 32.884,71.12 27.045,71.12 "/> - </g> - <g> - <polygon fill="#ADACAF" points="27.046,81.967 43.247,98.167 49.083,92.333 32.884,76.132 27.045,76.132 "/> - </g> - <g> - <polygon fill="#ADACAF" points="22.038,81.967 5.837,98.167 0,92.333 16.199,76.132 22.038,76.132 "/> - </g> - <g> - <polygon fill="#ADACAF" points="22.038,65.286 5.837,49.084 0,54.92 16.199,71.12 22.038,71.12 "/> - </g> - </g> - </g> - </g> -</g> -<g id="Layer_2"> -</g> -</svg> diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/downloader/html/images/sprite.png b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/downloader/html/images/sprite.png deleted file mode 100644 index b9e19ef18acf68223cf6878c397ffa47ae933478..0000000000000000000000000000000000000000 Binary files a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/downloader/html/images/sprite.png and /dev/null differ diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/downloader/html/index.html b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/downloader/html/index.html deleted file mode 120000 index 3391e4bfcdee2ad774b097315c77cc47691ae725..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/downloader/html/index.html +++ /dev/null @@ -1 +0,0 @@ -openbis-dsu-downloader.html \ No newline at end of file diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/downloader/html/openbis-dsu-downloader.html b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/downloader/html/openbis-dsu-downloader.html deleted file mode 100644 index 941a6fb603d164e480cd358b91194945b962a706..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/downloader/html/openbis-dsu-downloader.html +++ /dev/null @@ -1,836 +0,0 @@ -<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> -<html xmlns="http://www.w3.org/1999/xhtml"> -<head> - <title>Quantitative Genomics Facility</title> - - <meta http-equiv="X-UA-Compatible" content="IE=Edge" /> - <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> - <meta name="google" value="notranslate"> - - <link type="text/css" rel="stylesheet" href="body-style.css" /> - <link type="text/css" rel="stylesheet" href="button.css" /> - <link type="text/css" rel="stylesheet" href="tree.css" /> - <script type="text/javascript" src="/openbis/resources/js/d3.v3.min.js"></script> - <script type="text/javascript" src="/openbis/resources/js/d3.layout.js"></script> - <script type="text/javascript" src="d3.time.js"></script> - <script type="text/javascript" src="/openbis/resources/js/jquery.js"></script> - <script type="text/javascript" src="/openbis/resources/js/openbis.js"></script> - <script type="text/javascript" src="/openbis/resources/js/openbis-dsu.js"></script> - <!-- To speed development, cache the requests --> - <!-- <script type="text/javascript" src="openbis-request-cache.js"></script> --> - <script> - -dsu = new openbis_dsu('https://openbis-dsu.ethz.ch/openbis/openbis', 'https://openbis-dsu.ethz.ch/datastore_server'); - -//After logout the URL redirected to, just go to current URL in this case -var logouturl = $(location).attr('href'); - -// A helper function for drawing the lines between nodes -var diagonal = d3.svg.diagonal().projection(function(d) { return [d.y, d.x] }); - -// The tree visualization -var vis; - -// The node inspectors -var inspectors; - -var inspectorsWidth = 600; - -// The root of the tree -var root = { code : "QGF", label: "QGF", children : [], type: 'ROOT' }; - -// The inspected elements -var inspected = []; - -// A date formatter for grouping samples by registration year / month -var yearmonthformat = d3.time.format("%Y-%m"); - -/// -/// FUNCTIONS FOR PUTTING DATA INTO THE TREE -/// - -function initTree(){ - dsu.retrieveSequencingSamples(function(data){ - addSamplesToTree(data.result); - showSpaces(); - updateDiagram(500); - }); -} - -function addSamplesToTree(samples) -{ - if (samples == null){ - return; - } - - // Create sample nodes - samples = samples.map(function(sample) { - return { - code : sample.permId, - label: sample.properties["EXTERNAL_SAMPLE_NAME"] + " [" + sample.code + "]", - bis: sample, - type: 'SAMPLE' - } - }); - - sortArray(samples, 'code', false); - - // Create sample group nodes (group by registration date) - var sampleGroupsMap = []; - var sampleGroups = []; - - samples.forEach(function(sample) { - var date = yearmonthformat(new Date(sample.bis.registrationDetails.registrationDate)); - var sampleGroup = sampleGroupsMap[date]; - - if (undefined === sampleGroup) { - sampleGroup = { - code: date, - label: date, - samples: [], - type: 'SAMPLE_GROUP' - }; - sampleGroupsMap[date] = sampleGroup; - sampleGroups.push(sampleGroup); - } - sampleGroup.samples.push(sample); - }); - - // Sort sample groups from newest to oldest - sortArray(sampleGroups, 'code', false); - - // Create space nodes - var isFirstSampleGroup = true; - sampleGroups.forEach(function(sampleGroup){ - var spacesMap = []; - var spaces = []; - - sampleGroup.samples.forEach(function(sample){ - var spaceCode = sample.bis.spaceCode; - var space = spacesMap[spaceCode]; - - if(undefined == space){ - space = { - code: sampleGroup.code + "#" + spaceCode, - label: spaceCode, - _children: [], - type: 'SPACE' - } - spacesMap[spaceCode] = space; - spaces.push(space); - } - space._children.push(sample); - }); - - // Sort spacees - spaces.sort(function(space1, space2) { - if (space1.label == space2.label) return 0; - return (space1.label < space2.label) ? -1 : 1; - }); - - if(spaces.length > 1){ - sortArray(spaces, 'label', true); - sampleGroup._children = spaces; - }else{ - sampleGroup._children = sampleGroup.samples; - } - - if(isFirstSampleGroup){ - openAllForNode(sampleGroup); - isFirstSampleGroup = false; - } - }); - - if (samples.length > 0){ - root.children = sampleGroups; - } - -} - -function getAppHeight(){ - return Math.max($(window).height() - 50, getVisibleLeafsCountForNode(root) * 20); -} - -function getAppWidth(){ - return $(window).width(); -} - -function closeAll(){ - root.children.forEach(function(sampleGroup){ - closeAllForNode(sampleGroup); - }); - - if(inspected.length > 0){ - var inspectedCopy = inspected.slice(0); - inspectedCopy.forEach(function(elem){ - if(elem.inspected){ - toggle_inspected(elem); - } - }); - }else{ - updateDiagram(500); - } -} - -function closeAllForNode(node){ - closeChildren(node); - getChildren(node).forEach(function(child){ - closeAllForNode(child); - }); -} - -function openAllForNode(node){ - openChildren(node); - getChildren(node).forEach(function(child){ - openAllForNode(child); - }); -} - -function getVisibleLeafsCountForNode(node){ - if(node.children){ - var count = 0; - node.children.forEach(function(child){ - count += getVisibleLeafsCountForNode(child); - }); - return count; - }else{ - return 1; - } -} - -function getVisibleLabelsMaxLength(node){ - if(node.children){ - var length = 0; - node.children.forEach(function(child){ - var childLength = getVisibleLabelsMaxLength(child); - if(childLength > length){ - length = childLength; - } - }); - return length; - }else{ - return node.label.length * 13; - } -} - -function showSpaces() -{ - // Don't show anything yet, just initialize the visualization - createVis(); -} - - -var didCreateVis = false; - -/** - * Create the DOM elements to store the visualization (tree + inspectors) - */ -function createVis() -{ - if (didCreateVis) return; - - // Create a div to house the tree visualization and the inspectors - visgroup = d3.select("#main").append("div"); - - // An svg element for the tree visualization - vis = visgroup.append("svg:svg") - .attr("id","mainVis") - .append("svg:g") - .attr("transform", "translate(40, 0)"); - - var legend = vis.append("svg:g") - .attr("class","legend") - .attr("transform", "translate(-30, 0)"); - - var legendSeq = legend.append("svg:g").attr("class","sequenced").attr("transform","translate(0, 20)"); - legendSeq.append("svg:circle").attr("r", 5.5); - legendSeq.append("svg:text").text("Sequenced").attr("dx", 10).attr("dy",4); - - var legendNotSeq = legend.append("svg:g").attr("class","notsequenced").attr("transform","translate(0, 40)"); - legendNotSeq.append("svg:circle").attr("r", 5.5); - legendNotSeq.append("svg:text").text("Not Sequenced").attr("dx", 10).attr("dy",4); - - // An element for the inspectors. - inspectors = visgroup.append("span") - .attr("id","inspectorsContainer") - .style("width", + inspectorsWidth + "px") - .style("position", "relative") - .style("overflow", "auto") - .style("float", "right") - .style("top", "20px") - .style("display", "none"); - - didCreateVis = true; -} - - -/** - * Draw / update the tree - */ -function updateDiagram(duration) -{ - log('Updating diagram'); - - var inspectorsSize = inspected.length > 0 ? inspectorsWidth : 0; - var labelsSize = getVisibleLabelsMaxLength(root); - - var treeWidth = Math.max(300, getAppWidth() - inspectorsSize - labelsSize); - var treeHeight = Math.max(100, getAppHeight()); - - var visWidth = treeWidth + labelsSize - 20; - var visHeight = treeHeight; - - var mainWidth = visWidth + inspectorsSize; - var mainHeight = visHeight; - - // Adjust a size of the vis - d3.select("#mainVis") - .attr("width", visWidth) - .attr("height", visHeight); - - d3.select("#main") - .style("width", mainWidth) - .style("height", mainHeight); - - // Adjust a size of the tree - tree = d3.layout.tree().size([treeHeight, treeWidth]) - - // Update the root and compute the new layout - var nodes = tree.nodes(root); - - // Draw / update the links - var link = vis.selectAll("path.link").data(tree.links(nodes), function(d) { return d.code }); - - link.enter().append("svg:path") - .attr("class", "link") - .attr("d", function(d) { - var y0 = (null != d.source.y0) ? d.source.y0 : d.source.y; - var x0 = (null != d.source.x0) ? d.source.x0 : d.source.x; - var o = {x: x0, y: y0}; - return diagonal({source: o, target: o}); - }) - .transition() - .duration(duration) - .attr("d", diagonal); - - link.transition() - .duration(duration) - .attr("d", diagonal); - - link.exit().transition() - .duration(duration) - .attr("d", function(d) { - var y0 = (null != d.source.y0) ? d.source.y0 : d.source.y; - var x0 = (null != d.source.x0) ? d.source.x0 : d.source.x; - var o = {x: x0, y: y0}; - return diagonal({source: o, target: o}); - }) - .remove(); - - // Draw / update the nodes - var node = vis.selectAll("g.node").data(nodes, function(d) { return d.code }); - - var nodeEnter = - node.enter().append("svg:g") - .attr("class", classForNode) - .attr("transform", translateSrc) - .on("click", toggle_open); - - nodeEnter.append("svg:circle") - .attr("r", 5.5); - - nodeEnter.append("svg:text") - .attr("dx", function(d) { return hasChildren(d) ? -8 : 8 }) - .attr("dy", 3) - .attr("text-anchor", function(d) { return getTextAnchorType(d) }) - .text(function(d) { return d.label }); - - nodeEnter - .transition() - .duration(duration) - .attr("transform", translateDst); - - - // Transition nodes to their new position. - node.transition() - .duration(duration) - .attr("class", classForNode) - .attr("transform", translateDst); - - // Move the text elements to the appropriate position - node.selectAll("text").transition() - .duration(duration) - .attr("dx", function(d) { return hasChildren(d) ? -8 : 8 }) - .attr("text-anchor", function(d) { return getTextAnchorType(d) }); - - node.exit().transition() - .duration(duration) - .attr("transform", translateSrc) - .remove(); -} - -function classForNode(d) { - // Use whether the node has open children or not to compute the class - var cssClass = "node " + d.type; - if (d.inspected) cssClass = cssClass + " inspected"; - if(d.hasFilesLoaded){ - if (d.hasFiles) { - cssClass = cssClass + " sequenced"; - } else { - cssClass = cssClass + " notsequenced"; - } - } - return cssClass; -} - -function translateSrc(d) -{ - var translate; - if (d.parent != undefined) { - var y0 = (null != d.parent.y0) ? d.parent.y0 : d.parent.y; - var x0 = (null != d.parent.x0) ? d.parent.x0 : d.parent.x; - translate = "translate(" + y0 + "," + x0 + ")"; - } else { - translate = "translate(" + 0 + "," + 0 + ")"; - } - - return translate; -} - -function translateDst(d) -{ - d.x0 = d.x; - d.y0 = d.y; - var translate = "translate(" + d.y + "," + d.x + ")"; - - return translate; -} - -function getChildren(d){ - if(d.children != null){ - return d.children; - }else if(d._children != null){ - return d._children; - }else{ - return []; - } -} - -function hasChildren(d) -{ - return d.children != null || d._children != null; -} - -function hasChildrenOpen(d){ - return d.children != null; -} - -function hasChildrenClosed(d){ - return d._children != null; -} - -function closeChildren(d){ - if(hasChildrenOpen(d)){ - d._children = d.children; - d.children = null; - } -} - -function openChildren(d){ - if(hasChildrenClosed(d)){ - d.children = d._children; - d._children = null; - - var hasSampleChildren = d.children && d.children[0].type == 'SAMPLE'; - - if(hasSampleChildren && !d.hasFilesLoaded && !d.hasFilesLoading){ - d.hasFilesLoading = true; - - // Get datasets for each sequencing sample - var sampleDeferrer = - new actionDeferrer( - function() { - log("Loaded HAS_FILES for all samples"); - d.hasFilesLoaded = true; - d.hasFilesLoading = false; - updateDiagram(500); - }, - d.children.map(function(samp) { return samp.bis.code; })); - - d.children.forEach(function(sample) { - loadHasFilesForSample(sample, function(){ - sampleDeferrer.dependencyCompleted(sample.bis.code); - }); - }); - } - } -} - -function loadHasFilesForSample(sample, callback){ - dsu.retrieveDataSetsForSequencingSample(sample, function(data) { - var datasets = data.result; - - log("Got " + (datasets ? datasets.length : 0) + " datasets for sample: " + sample.bis.code); - - if (!datasets || datasets.length == 0){ - sample.hasFiles = false; - sample.hasFilesLoaded = true; - callback(); - }else{ - var listFiles = function(dataset){ - dsu.server.listFilesForDataSet(dataset.code, "/", true, function(data) { - var files = data.result; - - log("Got " + (files ? files.length : 0) + " files for sample: " + sample.bis.code + " dataset: " + dataset.code); - - if (!files || files.length == 0) { - if(datasets.length > 0){ - log("Sample: " + sample.bis.code + " no files found yet - will try in the next dataset"); - listFilesFunction(datasets.pop()); - }else{ - log("Sample: " + sample.bis.code + " HAS_NO_FILES"); - sample.hasFiles = false; - sample.hasFilesLoaded = true; - callback(); - } - }else{ - log("Sample: " + sample.bis.code + " HAS_FILES"); - sample.hasFiles = true; - sample.hasFilesLoaded = true; - callback(); - } - }); - }; - listFiles(datasets.pop()); - } - }); -} - -function loadFilesForSample(sample, callback){ - dsu.retrieveDataSetsForSequencingSample(sample, function(data) { - var datasets = data.result; - - log("Got " + (datasets ? datasets.length : 0) + " datasets for sample: " + sample.bis.code); - - if (!datasets || datasets.length == 0){ - sample.files = []; - sample.filesLoaded = true; - callback(); - }else{ - sample.datasets = data.result.map(function(bisds) { return {bis : bisds} }); - sample.files = []; - sample.filesLoaded = false; - - // Get all the files from the sequencing sample's datasets - var datasetDeferrer = - new actionDeferrer( - function() { - log("Loaded ALL datasets' files for sample: " + sample.bis.code); - sortArray(sample.files, 'label', true); - sample.filesLoaded = true; - callback(); - }, - sample.datasets.map(function(ds) { return ds.bis.code; })); - - sample.datasets.forEach(function(ds) { - dsu.server.listFilesForDataSet(ds.bis.code, "/", true, function(data) { - log("Got " + (data.result ? data.result.length : 0) + " files for sample: " + sample.bis.code + " dataset: " + ds.bis.code); - - if (!data.result || data.result.length == 0) { - datasetDeferrer.dependencyCompleted(ds.bis.code); - return; - } - data.result.forEach(function (file) { - file.dataset = ds; - file.label = file.pathInListing.split("/").pop(); - }); - - data.result = data.result.filter(function(file) { - var regex= (/gz$|tsv$/); - return (regex.test(file.pathInListing) & !file.isDirectory); }); - sample.files = sample.files.concat(data.result); - datasetDeferrer.dependencyCompleted(ds.bis.code); - }) - }); - } - }); -} - -function getTextAnchorType(d){ - return d.type == 'SAMPLE' ? 'start' : 'end'; -} - -// Toggle children on click. -function toggle_open(d) { - if (!hasChildren(d)) { - d.svgNode = this; - return toggle_inspected.call(this, d); - } - - if (hasChildrenOpen(d)) { - closeChildren(d); - } else { - openChildren(d); - } - updateDiagram(500); -} - -/** - * Draw / update node inspectors - */ -function updateInspectors(duration) -{ - // Draw / update the inspectors - var inspector = inspectors.selectAll("div.inspector").data(inspected, function (d) { return d.code }); - var box = inspector.enter().append("div") - .attr("class", "inspector") - .text(function(d) { return d.label }); - - box.append("span") - .attr("class", "close") - .on("click", toggle_inspected) - .text("x"); - - var propsTable = box.append("table").attr("class", "properties"); - propsTable.selectAll("tr").data(function(d) { return props_to_pairs(d.bis.properties) }) - .enter() - .append("tr") - .selectAll("td").data(function(d) { return d }).enter() - .append("td") - .attr("class", "property") - .style("opacity", "0") - .text(function(d) { return d }) - .transition() - .style("opacity", "1"); - - var downloadTable = inspector.selectAll("table.downloads").data(function(d) { return [d] }); - - downloadTable - .enter() - .append("table") - .attr("width", "100%") - .attr("class", "downloads"); - - // Add a caption, but make sure there is just one (this does not work with select()) - downloadTable.selectAll("caption") - .data(downloadTableCaption) - .enter() - .append("caption").text(function(d) { return d; }); - - // We just want to see non-directories here - var downloadTableRow = downloadTable.selectAll("tr").data(filesForSequencingSample, function(d) { return d.pathInDataSet }); - downloadTableRow - .enter() - .append("tr") - .append("td") - .style("text-align", "left") - .on("click", downloadTableFile) - .text(function(d) { return d.label; }); - downloadTableRow - .exit() - .transition() - .duration(duration) - .style("opacity", "0") - .remove(); - - inspector.exit().transition() - .duration(duration) - .style("opacity", "0") - .remove(); -} - -// Toggle children on click. -function toggle_inspected(d) { - var count = inspected.length; - - if (d.inspected) { - var index = inspected.indexOf(d) - if (index > -1) inspected.splice(index, 1); - d.inspected = false; - d3.select(d.svgNode).attr("class", classForNode(d)) - } else { - d.inspected = true; - inspected.push(d); - d3.select(d.svgNode).attr("class", classForNode(d)) - if(!d.filesLoaded){ - loadFilesForSample(d, function(){ - updateInspectors(500); - }); - } - } - - if(inspected.length > 0){ - $("#inspectorsContainer").show(); - }else{ - $("#inspectorsContainer").hide(); - } - - if(count == 0 && inspected.length > 0 || count > 0 && inspected.length == 0){ - updateDiagram(500); - setTimeout(function(){ - updateInspectors(500); - }, 500); - }else{ - updateInspectors(500); - } -} - -function sortArray(array, sortingFieldName, ascending){ - array.sort(function(item1, item2){ - var value1 = item1[sortingFieldName]; - var value2 = item2[sortingFieldName]; - - if(value1){ - value1 = new String(value1).toLowerCase(); - } - if(value2){ - value2 = new String(value2).toLowerCase(); - } - - if(ascending){ - return (value1 >= value2) ? 1: -1; - }else{ - return (value1 <= value2) ? 1: -1; - } - }); -} - -/** - * Convert properties to pairs - */ -function props_to_pairs(d) -{ - var pairs = []; - for (var prop in d) { - var pair = [prop, d[prop]]; - pairs.push(pair); - } - pairs.sort(function(a, b) { - if (a[0] == b[0]) return 0; - // Sort in reverse lexicographical - return (a[0] < b[0]) ? -1 : 1; - }); - return pairs; -} - - -function downloadTableCaption(d) -{ - if(d.filesLoaded){ - if(d.files && d.files.length > 0){ - return ["Files"] - }else{ - return ["Not Yet Sequenced"]; - } - } -} - -function downloadTableFile(d) -{ - // If there is no dataset, this is just a marker for loading - if (!d.dataset) return; - - var action = function(data) { - try { - document.location.href = data.result - } catch (err) { - // just ignore errors - } - }; - dsu.server.getDownloadUrlForFileForDataSet(d.dataset.bis.code, d.pathInDataSet, action); -} - -function filesForSequencingSample(d) -{ - return d.filesLoaded ? d.files : [{ label : "Loading..." }]; -} - -function enterApp(data) -{ - if(data.result == null){ - alert("Login or password incorrect"); - $("#loginname").focus(); - $('#login-button').html('Login'); - return; - } - - $("#login-form-div").hide(); - $("#main").show(); - - initTree(); - - $('#openbis-logo').height(30); - $('#openbis-logo').hide(); - -} - - -$(document).ready(function() { - //if ( $.browser.msie ) { - // alert("Currently no Internet Explorer is supported!"); - //} - $('#main').hide() - - $('#logout-button').click(function() { - dsu.server.logout(function(data) {$(location).attr('href',logouturl)}); - }); - - dsu.server.ifRestoredSessionActive(function(data) { enterApp(data) }); - $('#login-form').submit(function() { - $('#login-button').html('Logging in...'); - dsu.server.login( $.trim($('#loginname').val()), $.trim($('#password').val()), function(data) { enterApp(data) }) - }); - -}); - -// set the focus -function onPageLoad(){ - if(loginname.value.length==0) { - $("#loginname").focus(); - } - else { - $("#login-button").focus(); - } -} - -function log(msg){ - - if(console){ - console.log(msg); - } - -} - - - </script> -</head> -<body onload="onPageLoad()"> -<img id="openbis-logo" src="images/openBIS_Logo.svg" alt="openBIS" style="position: absolute; left: 330px; top: 230px; height: 70px;"/> -<link rel="shortcut icon" href="../images/favicon.ico" /> -<link rel="icon" type="image/png" href="../images/favicon.png" /> - -<div id="login-form-div"> - <h1>BSSE - Quantitative Genomics Facility</h1> - <form id="login-form" action="javascript:"> - <div class="box greytext loginname"> - <input value="Login Name" type="text" required="required" maxlength="40" size="40" onfocus="this.value=(this.value=='Login Name') ? '' : this.value;" onblur="this.value=(this.value=='') ? 'Login Name' : this.value;" id="loginname"> </input> - </div> - <div class="box greytext password"> - <input value="Password" id="password" type="password" required="required" size="40" onfocus="this.value=(this.value=='Password') ? '' : this.value;" onblur="this.value=(this.value=='') ? 'Password' : this.value;" id="password"> </input> - </div> - <div class="loginbutton"> - <button id="login-button">Login</button> - </div> - <br> - <a href="https://crowd-bsse.ethz.ch/crowd/console/forgottenlogindetails!default.action" id="resetpassword" class="greytext">Reset password</a> - </form> -</div> - -<div id="main"> - <div id="button-group"> - <button id="logout-button">Logout</button> - <button id="close-all-button" onclick="closeAll();">Close All</button> - </div> -</div> -</body> -</html> diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/downloader/html/tree.css b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/downloader/html/tree.css deleted file mode 100644 index e54d6d1d5d368a8bf87ca8879de415d497cea305..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/downloader/html/tree.css +++ /dev/null @@ -1,138 +0,0 @@ -.node circle { - fill: #fff; - stroke: #444444; - stroke-width: 1.5px; -} - -.node { - font: 14px "Verdana", sans-serif; - z-index: 1; - cursor: pointer; - left: -15px; -} - -.node:hover circle{ - fill: #444444; -} - -.node:hover{ - font-weight: bold; -} - -.link { - fill: none; - stroke: #ccc; - stroke-width: 1.5px; - z-index: -1; -} - -.SAMPLE.inspected { - font-weight: bold -} - -.SAMPLE.sequenced circle { - stroke: DarkGreen; -} - -.SAMPLE.sequenced:hover circle { - fill: DarkGreen; -} - -.SAMPLE.notsequenced circle { - stroke: DarkRed; -} - -.SAMPLE.notsequenced:hover circle { - fill: DarkRed; -} - -/* Inspector */ - -div.inspector { - font: 14px "Verdana", sans-serif; - padding: 10px; - border: 1px solid gray; - margin: 10px 2px; - font-weight: bold; -} - -.property { - font-size: 10px; -} - -.properties { - width: 100%; -} - -.properties tr:nth-child(odd) { - background-color:#eee; -} - -.properties tr:nth-child(even) { - background-color:#fff; -} - -.close { - float: right; -} - -.close:hover { - opacity: 0.5; - color: #AAA; - cursor: pointer; -} - -.downloads { - color: black; - background-color: #E3E3E3; -} - -table.downloads { - font-family: "Trebuchet MS", sans-serif; - font-size: 10px; - table-layout: fixed; - border-collapse: collapse; - margin: 0px; - padding: 0px; -} - -/* -.downloads caption { - text-align: left; -} -*/ - -.downloads tr { - padding: 0px; -} - -.downloads td { - border: 2px solid #FFFFFF; - padding: 2px; -} - -.downloads td:hover { - cursor: pointer; - text-decoration: underline -} - -input:focus{ -background-color: white; -} - -/* Legend */ - -.legend .sequenced circle { - font: 14px "Verdana", sans-serif; - stroke-width: 1.5px; - fill: white; - stroke: DarkGreen; -} - -.legend .notsequenced circle { - font: 14px "Verdana", sans-serif; - stroke-width: 1.5px; - fill: white; - stroke: DarkRed; -} - diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/downloader/plugin.properties b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/downloader/plugin.properties deleted file mode 100644 index cb40f34f644331e58c2af13a14c7ff10d778153d..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/downloader/plugin.properties +++ /dev/null @@ -1,3 +0,0 @@ -# The properties file for an example webapps plugin -# This file has no properties defined because none need to be defined. -webapp-folder = html diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/invoicing/html/index.html b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/invoicing/html/index.html deleted file mode 100644 index 435b335ce8c33a0199424c0a388bc91bf19c13db..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/invoicing/html/index.html +++ /dev/null @@ -1,179 +0,0 @@ -<head> - <title>Quantitative Genomics Facility Invoice Generator</title> - <script type="text/javascript" src="/openbis/resources/js/d3.v3.min.js"></script> - <script type="text/javascript" src="/openbis/resources/js/jquery.js"></script> - <script type="text/javascript" src="/openbis/resources/js/spin.min.js"></script> - <script type="text/javascript" src="/openbis/resources/js/openbis.js"></script> - <script type="text/javascript" src="/openbis/resources/js/openbis-dsu.js"></script> - <link rel="stylesheet" href="//netdna.bootstrapcdn.com/bootstrap/3.0.0-rc1/css/bootstrap.min.css"> - <!-- To speed development, cache the requests --> - <!-- <script type="text/javascript" src="openbis-request-cache.js"></script> --> - <script> - -dsu = new openbis_dsu('/openbis/openbis', '/datastore_server'); -var vis; -var didCreateVis = false; - -$(document).ready(function() { -}); - -function createVis() -{ - if (didCreateVis) return; - vis = d3.select("#main").append("div").attr("id", "vis"); - didCreateVis = true; -} - -function displayReturnedTable(data) -{ - if (data.error) { - console.log(data.error); - vis.append("p").text("Could not retrieve data."); - return; - } - - //console.log(data.result); - var dataToShow = data.result; - - d3.select("#progress").remove() - d3.select("#button-group").remove() - - vis.append("p").text(""); - // Pick all div elements of the visualization - vis.selectAll("div") - .data(dataToShow.rows) - .enter() - .append("div") - .html(function(row) { return row[0].value }) - - var button = d3.select("body") - .append("div") - - var invoices = []; - for (var i=0;i<data.result.rows.length;i++) { - var val = data.result.rows[i][1].value; - if (val) { - invoices.push(val) - } - } - - //console.log(invoices) - - button.selectAll("button") - .data(invoices) - .enter() - .append("div") - .append("button") - .attr("class", "btn btn-default btn-xs") - .attr("id", function(row) { return row; }) - .attr("onclick", function(row) { return "callIngestionSetInvoice('" + row + "');" }) - .text(function(row) { return "Set Invoice sent: " + row;}); - - /*.attr("id", function(row) { return row[1].value.split(' ')[3].split('.')[0] }) - .attr("onclick", function(row) { return "callIngestionSetInvoice('" + row[1].value.split(' ')[3].split('.')[0] + "');" }) - .text(function(row) { return row[1].value.split(' ')[3].split('.')[0];}); */ -} - -function hideButtons(data) -{ - var buttonId = data.result.rows[0][0].value; - d3.select("#setInvoice").remove() - d3.select("#main").append("div").attr("id", "Done").append("p").text("Done " + buttonId); - //console.log(buttonId); - d3.select("button#" + String(buttonId)).remove(); -} - - -/** - * See ch.systemsx.cisd.openbis.plugin.query.shared.api.v1.IQueryApiServer.createReportFromAggregationService(String, String, String, Map<String, Object>) -openbis.prototype.createReportFromAggregationService = function(dataStoreCode, serviceKey, parameters, action) { - ajaxRequest({ - url: this.queryServiceUrl, - data: { "method" : "createReportFromAggregationService", - params : [ this.sessionToken, dataStoreCode, serviceKey, parameters ] }, - success: action - }); -} - -*/ - -function spinner (target) { - var opts = { - lines: 13, // The number of lines to draw - length: 7, // The length of each line - width: 4, // The line thickness - radius: 10, // The radius of the inner circle - corners: 1, // Corner roundness (0..1) - rotate: 0, // The rotation offset - color: '#000', // #rgb or #rrggbb - speed: 1, // Rounds per second - trail: 60, // Afterglow percentage - shadow: false, // Whether to render a shadow - hwaccel: false, // Whether to use hardware acceleration - className: 'spinner', // The CSS class to assign to the spinner - zIndex: 2e9, // The z-index (defaults to 2000000000) - top: 250, // Top position relative to parent in px - left: 'auto' // Left position relative to parent in px - }; - var spinner = new Spinner(opts).spin(target); -} - - -function callIngestionSetInvoice(piFile) -{ - var context = new openbisWebAppContext(); - var sampleIdentifier = context.getEntityIdentifier() - var principalInvestigator = piFile.split(".")[0] - console.log('principalInvestigator:') - console.log(principalInvestigator) - - dsu.server.useSession(context.getSessionId()); - var parameters = - { - sampleId : sampleIdentifier, - pI : principalInvestigator - }; - - d3.select("#main").append("div").attr("id", "setInvoice").append("p").text("Setting Invoice Sent Property of " + piFile); - var target = document.getElementById('setInvoice'); - spinner(target) - dsu.server.createReportFromAggregationService("DSS1", "setInvoiceSent", parameters, hideButtons); -} - - -function callIngestionService() -{ - var context = new openbisWebAppContext(); - var sampleIdentifier = context.getEntityIdentifier() - var mySendEmail = $('input[name=sendEmail]').is(':checked') - - d3.select("#main").select("#progress").remove() - d3.select("#main").select("#vis").remove() - didCreateVis = false; - dsu.server.useSession(context.getSessionId()); - createVis() - var parameters = - { - sampleId : sampleIdentifier, - sendEmail : mySendEmail - }; - - d3.select("#main").append("div").attr("id", "progress").append("p").text("Creating invoices..."); - var target = document.getElementById('progress'); - spinner(target) - dsu.server.createReportFromAggregationService("DSS1", "triggerInvoice", parameters, displayReturnedTable); -} - - </script> -</head> -<body> -<div id="main"> - <div id="checkbox-group"> - <br> - </div> - <div id="button-group"> - <button class="btn btn-default btn-xs" id="createInvoice-button" onclick="callIngestionService();">Create Invoices</button> - </div> -</div> -</body> -</html> diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/invoicing/plugin.properties b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/invoicing/plugin.properties deleted file mode 100644 index e88648bf0ece40ee1681a3f9ab816993b3e6d211..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/invoicing/plugin.properties +++ /dev/null @@ -1,6 +0,0 @@ -# The properties file for an example webapps plugin -# This file has no properties defined because none need to be defined. -webapp-folder = html -openbisui-contexts = sample-details-view -sample-entity-types = ILLUMINA_FLOW_CELL -label = Invoices diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/laneStatistics/html/index.html b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/laneStatistics/html/index.html deleted file mode 100644 index bc7cc543b84f04bf9aa44e209160cb1aa69d0e31..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/laneStatistics/html/index.html +++ /dev/null @@ -1,1037 +0,0 @@ - <!DOCTYPE html> -<html> - <head> - <title>Lane Statistics</title> - <script type="text/javascript" src="/openbis/resources/js/d3.v3.min.js"></script> - <script type="text/javascript" src="/openbis/resources/js/d3.layout.js"></script> - <script type="text/javascript" src="/openbis/resources/js/jquery.js"></script> - <script type="text/javascript" src="/openbis/resources/js/pie.js"></script> - <script type="text/javascript" src="/openbis/resources/js/openbis.js"></script> - <script type="text/javascript" src="/openbis/resources/js/openbis-dsu.js"></script> - <script type="text/javascript" src="/openbis/resources/js/FileSaver.js"></script> - <link rel="stylesheet" href="//maxcdn.bootstrapcdn.com/bootstrap/3.2.0/css/bootstrap.min.css"> - <link rel="stylesheet" type="text/css" href="style.css" /> - </head> - <body> - <script> - - dsu = new openbis_dsu('/openbis/openbis', '/datastore_server'); - var webAppContext = new openbisWebAppContext(); - dsu.server.useSession(webAppContext.getSessionId()); - - globalWidthBar = 80 - - var div = d3.select("body").append("div") - .attr("class", "tooltip") - .style("opacity", 0); - - // used for sorting by of the final array of objects - function compare(a,b) { - if (a.externalSampleName < b.externalSampleName) - return -1; - if (a.externalSampleName > b.externalSampleName) - return 1; - return 0; - } - - if (typeof String.prototype.startsWith != 'function') { - // see below for better implementation! - String.prototype.startsWith = function (str){ - return this.indexOf(str) === 0; - }; -} - - - /* - * Natural Sort algorithm for Javascript - Version 0.6 - Released under MIT license - * Author: Jim Palmer (based on chunking idea from Dave Koelle) - * Contributors: Mike Grier (mgrier.com), Clint Priest, Kyle Adams, guillermo - */ - function naturalSort (a, b) { - var re = /(^-?[0-9]+(\.?[0-9]*)[df]?e?[0-9]?$|^0x[0-9a-f]+$|[0-9]+)/gi, - sre = /(^[ ]*|[ ]*$)/g, - dre = /(^([\w ]+,?[\w ]+)?[\w ]+,?[\w ]+\d+:\d+(:\d+)?[\w ]?|^\d{1,4}[\/\-]\d{1,4}[\/\-]\d{1,4}|^\w+, \w+ \d+, \d{4})/, - hre = /^0x[0-9a-f]+$/i, - ore = /^0/, - // convert all to strings and trim() - x = a.externalSampleName.toString().replace(sre, '') || '', - y = b.externalSampleName.toString().replace(sre, '') || '', - // chunk/tokenize - xN = x.replace(re, '\0$1\0').replace(/\0$/,'').replace(/^\0/,'').split('\0'), - yN = y.replace(re, '\0$1\0').replace(/\0$/,'').replace(/^\0/,'').split('\0'), - // numeric, hex or date detection - xD = parseInt(x.match(hre)) || (xN.length != 1 && x.match(dre) && Date.parse(x)), - yD = parseInt(y.match(hre)) || xD && y.match(dre) && Date.parse(y) || null; - // first try and sort Hex codes or Dates - if (yD) - if ( xD < yD ) return -1; - else if ( xD > yD ) return 1; - // natural sorting through split numeric strings and default strings - for(var cLoc=0, numS=Math.max(xN.length, yN.length); cLoc < numS; cLoc++) { - // find floats not starting with '0', string or 0 if not defined (Clint Priest) - oFxNcL = !(xN[cLoc] || '').match(ore) && parseFloat(xN[cLoc]) || xN[cLoc] || 0; - oFyNcL = !(yN[cLoc] || '').match(ore) && parseFloat(yN[cLoc]) || yN[cLoc] || 0; - // handle numeric vs string comparison - number < string - (Kyle Adams) - if (isNaN(oFxNcL) !== isNaN(oFyNcL)) return (isNaN(oFxNcL)) ? 1 : -1; - // rely on string comparison if different types - i.e. '02' < 2 != '02' < '2' - else if (typeof oFxNcL !== typeof oFyNcL) { - oFxNcL += ''; - oFyNcL += ''; - } - if (oFxNcL < oFyNcL) return -1; - if (oFxNcL > oFyNcL) return 1; - } - return 0; - } - - - loadData() - -function loadData () { - - sampleToParentsMap = {}; - dataSetToParentMap = {}; - dataSetMap = {}; - parentToDataSets = {}; - realValueMap = {}; - bclVersion = ""; - - d3.select("body") - .append("text") - .attr("id", "generating") - .text("Generating graphics...") - - dsu.retrieveSampleParents(webAppContext.getEntityPermId(), function(parentResponse){ - //console.log("Got parents: " + parentResponse.result.length); - var parentPermIds = []; - - parentResponse.result.forEach(function(parent){ - parentPermIds.push(parent.permId); - }); - - dsu.retrieveSampleChildren(parentPermIds, function(childrenResponse){ - // console.log("Got children: " + childrenResponse.result.length); - - var childrenPermIds = []; - - childrenResponse.result.forEach(function(child){ - childrenPermIds.push(child.permId); - sampleToParentsMap[child.identifier] = child.parents; - }); - - dsu.retrieveDataSetsForSampleWithPermIds(childrenPermIds, function(dataSetResponse){ - // console.log("Got datasets: " + dataSetResponse.result.length); - - dataSetResponse.result.forEach(function(dataSet){ - var index1 = dataSet.properties['BARCODE']; - var index2 = dataSet.properties['INDEX2']; - var parents = sampleToParentsMap[dataSet.sampleIdentifierOrNull]; - - dataSetMap[dataSet.code] = dataSet - - // console.log("DATA Set:") - // console.log(index1) - //console.log(index2) - - parents.forEach(function(parent){ - var parentIndex1 = parent.properties['BARCODE']; - var parentIndex2 = parent.properties['INDEX2']; - - // console.log("PARENT SAMPLE:") - // console.log(parentIndex1) - // console.log(parentIndex2) - - if(index1 == parentIndex1 && (!index2 || !parentIndex2 || index2 == parentIndex2 || index2 == "NOINDEX")){ - dataSetToParentMap[dataSet.code] = parent; - if (!(parent.code in parentToDataSets)) { - parentToDataSets[parent.code] = [dataSet] - } - else { - // key already exists - parentToDataSets[parent.code].push(dataSet) - } - } - // non-multiplexed run, so no index set - if (parentIndex1 == undefined && parentIndex2 == undefined) { - dataSetToParentMap[dataSet.code] = parent; - parentToDataSets[parent.code] = [dataSet] - } - if (parentIndex2 == undefined) { - - } - - - }); - }); - // console.log("SampleToParentsMap: "); - // console.log(sampleToParentsMap); - // console.log("DataSetToParentMap: "); - // console.log(dataSetToParentMap); - // console.log("DataSets: "); - // console.log(dataSetMap) - // console.log("parentToDataSets: "); - // console.log(parentToDataSets) - - $.each( parentToDataSets, function( key, value ) { - var cumSumYieldMbases = 0; - var cumSumPfReadsSum = 0; - // console.log( key ); - $.each (value, function (index, dataset) { - - cumSumYieldMbases += parseInt(dataset.properties['YIELD_MBASES']); - cumSumPfReadsSum += parseInt(dataset.properties['PF_READS_SUM']); - }); - realValueMap[key] = [cumSumYieldMbases, cumSumPfReadsSum] - }); - //console.log(realValueMap) - - - statisticsArray = []; - targetedArray = []; - noIndex = false; - - var dataSetProperties; - dsu.retrieveDataSetsForSample(webAppContext.getEntityIdentifier(), getProperties); - - function getProperties(dataSetProperties) { - - dsu.retrieveSampleParents(webAppContext.getEntityPermId(), getParentProperties); - - function getParentProperties (sampleProperties) { - - // d3.select("body").append("text").text("Loading...") - - for (var i = 0; i < sampleProperties.result.length; i++) { - targetedArray.push ({ - 'targeted_yield_in_gigabases_pf' : sampleProperties.result[i].properties.TARGETED_YIELD_IN_GIGABASES_PF, - 'targeted_read_count_in_million_pf' : sampleProperties.result[i].properties.TARGETED_READ_COUNT_IN_MILLION_PF, - 'externalSampleName' : sampleProperties.result[i].properties.EXTERNAL_SAMPLE_NAME, - 'parentSampleCode' : sampleProperties.result[i].code - }); - } - // console.log("targetedArray:"); - // console.log(targetedArray); - // console.log(dataSetProperties) - // console.log("realValueMap:") - // console.log(realValueMap) - - for (var i = 0; i < dataSetProperties.result.length; i++) { - for (var j = 0; j < targetedArray.length; j++) { - if (targetedArray[j]['externalSampleName'] == dataSetProperties.result[i].properties.EXTERNAL_SAMPLE_NAME){ - - //console.log(targetedArray[j]['externalSampleName']) - - //console.log(realValueMap) - //console.log(targetedArray[j]) - statisticsArray.push({ - 'qgfName' : targetedArray[j]['parentSampleCode'], - 'externalSampleName' : dataSetProperties.result[i].properties.EXTERNAL_SAMPLE_NAME, - 'index1': dataSetProperties.result[i].properties.BARCODE, - 'index2': dataSetProperties.result[i].properties.INDEX2, - 'percFilteringPass' : parseFloat(dataSetProperties.result[i].properties.PERCENTAGE_PASSED_FILTERING).toFixed(2), - 'rawReadsSum' : dataSetProperties.result[i].properties.RAW_READS_SUM, - 'pfReadsSum' : dataSetProperties.result[i].properties.PF_READS_SUM, - 'rawYieldMbases' : dataSetProperties.result[i].properties.RAW_YIELD_MBASES, - 'yieldMbases' : dataSetProperties.result[i].properties.YIELD_MBASES, - 'percRawClustersPerLane': parseFloat(dataSetProperties.result[i].properties.PERCENTAGE_RAW_CLUSTERS_PER_LANE).toFixed(2), - 'pfMeanQualityScore' : parseFloat(dataSetProperties.result[i].properties.PFMEANQUALITYSCORE).toFixed(2), - 'pfYieldq30Percentage' : parseFloat(dataSetProperties.result[i].properties.PFYIELDQ30PERCENTAGE).toFixed(2), - 'real_yield_in_gigabases_pf' : realValueMap[targetedArray[j]['parentSampleCode']][0], - 'real_read_count_in_million_pf' : realValueMap[targetedArray[j]['parentSampleCode']][1], - 'targeted_yield_in_gigabases_pf' : parseFloat(targetedArray[j]['targeted_yield_in_gigabases_pf']), - 'targeted_read_count_in_million_pf' : targetedArray[j]['targeted_read_count_in_million_pf'] - }); - } - else if (dataSetProperties.result[i].properties.BARCODE == 'NOINDEX' && noIndex == false) { - noIndex = true; - statisticsArray.push({ - 'qgfName' : 'NA', - 'externalSampleName' : "NOINDEX", - 'index1': dataSetProperties.result[i].properties.BARCODE, - 'index2': dataSetProperties.result[i].properties.INDEX2, - 'percFilteringPass' : parseFloat(dataSetProperties.result[i].properties.PERCENTAGE_PASSED_FILTERING).toFixed(2), - 'rawReadsSum' : dataSetProperties.result[i].properties.RAW_READS_SUM, - 'pfReadsSum' : dataSetProperties.result[i].properties.PF_READS_SUM, - 'rawYieldMbases' : dataSetProperties.result[i].properties.RAW_YIELD_MBASES, - 'yieldMbases' : dataSetProperties.result[i].properties.YIELD_MBASES, - 'percRawClustersPerLane': parseFloat(dataSetProperties.result[i].properties.PERCENTAGE_RAW_CLUSTERS_PER_LANE).toFixed(2), - 'pfMeanQualityScore' : parseFloat(dataSetProperties.result[i].properties.PFMEANQUALITYSCORE).toFixed(2), - 'pfYieldq30Percentage' : parseFloat(dataSetProperties.result[i].properties.PFYIELDQ30PERCENTAGE).toFixed(2), - 'real_yield_in_gigabases_pf' : 0, - 'real_read_count_in_million_pf' : 0, - 'targeted_yield_in_gigabases_pf' : parseFloat(0.0), - 'targeted_read_count_in_million_pf' : 0 - }); - } // else if - } // for - } // for - - // console.log("statisticsArray") - // console.log(statisticsArray) - - statisticsArray.sort(naturalSort); - var sums = calculateSum(statisticsArray, true) - var sumsWithNOINDEX = calculateSum(statisticsArray, false) - d3.select("#generating").remove(); - - dsu.retrieveSampleWithProperties(webAppContext.getEntityPermId(), function(laneResponse){ - bclVersion = laneResponse.result[0].properties.BCL_VERSION - if (bclVersion !== undefined) { - if (bclVersion.startsWith("bcl2fastq v2")) { - clusters = "Clusters"; - } - else { - clusters = "Reads"; - } - } - else {clusters = "Reads"}; - if (! isNaN(statisticsArray[0].percFilteringPass)) { - plotLaneTable(sumsWithNOINDEX, false) - // TODO: removed for now, as there is a bug - // placeholder(); - // plotLaneTable(sums, true) - placeholder(); - plotTable (statisticsArray, clusters); - downloadButton ("tableStats"); - placeholder(); - plotPercFilteringPass (statisticsArray); - downloadButton ("filteredChart"); - plotReadsSum (statisticsArray, sums, clusters); - downloadButton ("unfilteredReads"); - plotPFReads (statisticsArray, sums, clusters); - downloadButton ("PFReads"); - plotPercRawClustersPerLane (statisticsArray); - downloadButton ("percRawClusters"); - - $("#save_as" + "tableStats").click(function() { submit_download_form("html", "tableStats"); }); - $("#save_as" + "filteredChart").click(function() { submit_download_form("svg", "filteredChart"); }); - $("#save_as" + "unfilteredReads").click(function() { submit_download_form("svg", "unfilteredReads"); }); - $("#save_as" + "PFReads").click(function() { submit_download_form("svg", "PFReads"); }); - $("#save_as" + "percRawClusters").click(function() { submit_download_form("svg", "percRawClusters"); }); - } - - else { - d3.select("body").append("text").text("No data available!") - } - }); //retrieveSampleWithProperties - } // function getParentProperties (sampleProperties) - } // function getProperties(dataSetProperties) - }); - }); - }); - -} - -colors = ["#FED976", "#FEB24C", "#FD8D3C", "#FC4E2A", "#E31A1C", "#800026", "#610B5E", "#4C0B5F", - "#0B0B61", "#0B4C5F", "#0B5F48","#0B5F1E", "#4C5F0B", "#5F480B", "#5F1E0B", "#5F0B22", - ] -var formatThousands = d3.format(","); - -function isNumber(n) { - return !isNaN(parseFloat(n)) && isFinite(n); -} - -function plotLaneTable (sums, withNOINDEX) { - - //d3.select("body").append("text") - // .text("Lane Based Summary Table") - // .attr("class", "h5"); - - d3.select("body").append("text") - .text(function (){if (withNOINDEX) {return "Lane without reads which failed demultiplexing (NOINDEX)";} return " Total Lane";}) - .attr("class", "h6"); - - - var laneTableStats = d3.select("body") - .append("table") - .attr("id", "tableLaneStats") - .attr("class", "tableStats") - ; - - headerplotLaneTable = {}; - headerplotLaneTable ["Average Passed Filtering (PF)"] = 1 - headerplotLaneTable ["Sum Raw " + clusters] = 1 - headerplotLaneTable ["Sum PF " + clusters] = 1 - headerplotLaneTable ["Sum Raw Bases"] = 1 - headerplotLaneTable ["Sum PF Bases"] = 1 - headerplotLaneTable ["Average Raw " + clusters + " in % per Index"] = 1 - headerplotLaneTable ["Average PF Phred Score"] = 1 - headerplotLaneTable ["Average > 30 Phred Score"] = 1 - - // create the table header - var thead = laneTableStats.selectAll("th") - .data(d3.keys(headerplotLaneTable)) - .enter().append("th") - .text(function(d){return d}) - ; - - // fill the table - // create rows - var tr = laneTableStats.selectAll("tr") - .data(sums).enter().append("tr") - - // cells - var td = tr.selectAll("td") - .data(function(d){return d3.values(d)}) - .enter().append("td") - .text(function(d) {if (isNumber(d)) {return formatThousands(d)}; return d;}) - .style("text-align", function(d){if (isNumber(d)) {return "right"} return "left"}) - ; -} - -function plotTable (statisticsArray, clusters) { - - /* - d3.select("body").append("text") - .text("Index Based Summary Table") - .attr("class", "h4"); - */ - - var tableStats = d3.select("body") - .append("table") - .attr("id", "tableStats") - .attr("class", "tableStats") - ; - - header = {}; - - header["Sample ID"] = "Unique Genomics Facility Identifier of sample" - header["Sample Name"] = "Sample name given by customer" - header["Index1"] = "First Index" - header["Index2"] = "Second Index" - header["% PF " + clusters] = "High quality reads passing Illumina filtering criteria" - header["Raw " + clusters] = "Number of all " + clusters - header["PF " + clusters] = "Number of " + clusters + " which passed the Illumina Filter" - header["Raw Bases"] = "Number of all Bases" - header["PF Bases"] = "Number of all Bases which passed the Illumina Filter" - header["% in Lane"] = "Percentage of this Index within the Lane" - header["Mean Phred Score"] = "Mean Phred Score (0-40)" - header["% of >= Q30 Bases (PF)"] = "" - header["Total Yield"] = "Total yield (bases) over all lanes the sample was sequenced" - header["Total " + clusters + " #"] = "Total " + clusters + " count over all lanes the sample was sequenced" - header["Targeted Yield"] = "Targeted yield inheader" - header["Targeted " + clusters + " #"] = "Targeted " + clusters + " Count in million (PF)" - - // create the table header - var thead = tableStats.selectAll("th") - //.data(d3.keys(statisticsArray[0])) // got replaced with more readable names - .data(d3.keys(header)) - .enter().append("th") - .text(function(d){return d}) - .data(d3.values(header)) - .on("mouseover", function(d) { - div.transition() - .duration(200) - .style("opacity", .9); - div.style("width", "140px") - div.html(d) - .style("left", (d3.event.pageX - 70) +"px") - .style("top", (d3.event.pageY + 42) + "px"); - }) - .on("mouseout", function(d) { - div.transition() - .duration(500) - .style("opacity", 0); - }) - ; - - // fill the table - // create rows - var tr = tableStats.selectAll("tr") - .data(statisticsArray).enter().append("tr") - - // cells - var td = tr.selectAll("td") - .data(function(d){return d3.values(d)}) - .enter().append("td") - .text(function(d) {if (isNumber(d)) {return formatThousands(d)}; return d;}) - //.on("mouseover", function(){d3.select(this).style("background-color", "aliceblue")}) - //.on("mouseout", function(){d3.select(this).style("background-color", "white")}) - .style("text-align", function(d){if (isNumber(d)) {return "right"} return "left"}) - .attr('class', function(d,i){ return "col_" + i; }) - /*.style("background", function(d,i){ if (d3.values(statisticsArray)[i] != undefined) { - console.log(d3.values(statisticsArray)[i]); - // if (parseInt(d3.values(statisticsArray)[i].pfReadsSum) >= 1000000 ) - if (parseInt(d3.values(statisticsArray)[i].pfReadsSum) >= 1000000 * parseInt(d3.values(statisticsArray)[i].targeted_read_count_in_million_pf)) - {return "lightgreen";} return "red" - ;} - }); - */ - - realValue = 0; - realValueBases = 0; - var td = d3.selectAll("#tableStats tr").selectAll("td") - td.style("color", function(d, i) { - if (i==13) {realValue = d;} - if (i==12) {realValueBases = d;} - if (d != undefined) { - if (i==15) { - // console.log(parseInt(d) * 1000000 + ">= " + realValue); - if ( parseInt(d) * 1000000 >= realValue) {return "red"; } - else { return "green";} - } - if (i==14) { - // console.log(realValueBases + " >= " + parseFloat(d) * 1000000000); - if ( realValueBases >= parseFloat(d) * 1000000000 ) {return "green"; } - else { return "red";} - } - } - }); - - //console.log(statisticsArray) -} - - -function placeholder() { - -var space = d3.select("body") - .append("svg") - .attr("id", "placeholder") - .attr("width", 1000) - .attr("height", 30) - ; -} - -function plotPercFilteringPass (statisticsArray) { - - if (statisticsArray.length > 60) {var svgWidth = 7000;} - else if (statisticsArray.length > 10) {var svgWidth = 5000;} - else {var svgWidth = 3000;} - - svgWidth = statisticsArray.length * globalWidthBar - if (svgWidth < 200) {svgWidth = 400;} - - - var barPadding = 1; - var valuePadding = 0.02; - var agenda = [100,90,80,70,60,50,40,30,20,10,0] - var agendaWidth = 100 - var AgendaWidthOffset = 30 - - var margin = {top: 20, right: 20, bottom: 40, left: 40}, - svgWidth = svgWidth - margin.left - margin.right, - svgHeight = 250 - margin.top - margin.bottom; - - // var svgFilteredChartAgenda = d3.select("body") - // .append("svg") - // .attr("id", "chartAgenda") - // .attr("width", agendaWidth ) - // .attr("height", svgHeight + margin.top + margin.bottom) - // ; - - // var filteredChartAgenda = svgFilteredChartAgenda.selectAll("percFilteringPassChartAgenda") - // .data(agenda) - // .enter() - // .append("rect") - // .attr("rx", 3) - // .attr("y", function(d, i) { return i * (svgHeight / agenda.length) ;}) - // .attr("x", function(d) { return 0; }) - // .attr("width", function (d) { return agendaWidth - AgendaWidthOffset }) - // .attr("height", function (d) { return svgHeight / agenda.length - barPadding;}) - // .attr("fill", function (d) { return "hsla("+ Math.round(d)*1.2 +", 40%, 30%, 1)"}); - - // svgFilteredChartAgenda.selectAll("agendaText") - // .data(agenda) - // .enter() - // .append("text") - // .text(function(d) { return d + " %"; }) - // .attr("fill", function(d) { return "white";}) - // .attr("x", function(d) { return (agendaWidth - AgendaWidthOffset)/2 ; }) - // .attr("y", function(d, i) { return i * (svgHeight / agenda.length) + (svgHeight / agenda.length - barPadding) / 2 + 3;}) - // .attr("font-family", "sans-serif") - // .attr("font-size", "10px") - // .attr("text-anchor", "middle") - // ; - - var svgFilteredChart = d3.select("body") - .append("svg") - .attr("id", "filteredChart") - .attr("width", svgWidth + margin.left + margin.right) - .attr("height", svgHeight + margin.top + margin.bottom) - .append("g") - .attr("transform", "translate(" + margin.left + "," + margin.top + ")") - ; - - svgFilteredChart.append('text') - .text("% passes Illumina Filtering (PF)") - .attr("transform", "translate(" + (svgWidth/2) + "," + (svgHeight - 200) + ")") - .attr("font-family", "sans-serif") - .attr("font-size", "14px") - .attr("text-anchor", "middle") - ; - - var x = d3.scale.ordinal() - .rangeRoundBands([0, svgWidth], valuePadding); - //.rangeRoundBands([0, svgWidth], .001); - - var y = d3.scale.linear() - .range([svgHeight, 0]); - - var xAxis = d3.svg.axis() - .scale(x) - .orient("bottom") - //.tickPadding(25); - - var yAxis = d3.svg.axis() - .scale(y) - .orient("left"); - //.tickFormat(formatPercent); - - //x.domain(statisticsArray.map(function(d) { return d.externalSampleName+": "+d.index1;} )); - x.domain(statisticsArray.map(function(d) { if (d.externalSampleName == undefined ) {return d.index1}; return d.externalSampleName; })); - //y.domain([0, d3.max(statisticsArray, function(d) { return d.percFilteringPass; })]); - y.domain([0, 100]); - - svgFilteredChart.append("g") - .attr("class", "axis") - .attr("transform", "translate(0," + svgHeight + ")") - .call(xAxis); - - var filteredChart = svgFilteredChart.selectAll("percFilteringPassChart") - .data(statisticsArray) - .enter() - .append("rect") - .attr("rx", 3) - .attr ("x", function (d) {return x(d.externalSampleName+d.index1);}) - .attr ("width", x.rangeBand()) - .attr ("y", function (d,i) {return y(d.percFilteringPass);}) - .attr("height", function (d,i) {return svgHeight - y(d.percFilteringPass);}) - .attr("fill", function (d) { return "hsla("+ Math.round(d.percFilteringPass)*1.2 +", 40%, 30%, 1)"}); - - svgFilteredChart.selectAll(".axis text") // select all the text elements for the xaxis - .data(statisticsArray) - .attr ("y", function(d, i) {if (i%2 == 0) {return 8} return 22}); // if index is even then put the text up, else further down - - svgFilteredChart.append("g") - .attr("class", "y axis") - .call(yAxis) - .append("text") - .attr("transform", "rotate(0)") - .attr("x", 16) - .attr("dy", ".71em") - .style("text-anchor", "end") - .text("%"); - - - svgFilteredChart.selectAll("svgFilteredChartText") - .data(statisticsArray) - .enter() - .append("text") - .text(function(d) { return d.percFilteringPass + " %"; }) - //.attr("x", function(d, i) { return i * 1/(1+valuePadding)*(svgWidth / statisticsArray.length) + ((svgWidth /statisticsArray.length ) /2) -15; }) - //.attr("x", function(d, i) { return i * 1/(1+0.007)*(svgWidth / statisticsArray.length) + ((svgWidth /statisticsArray.length ) /2) ; }) - .attr ("x", function (d) {return x(d.externalSampleName+d.index1) + 15;}) - .attr("y", function(d) { - if (d.percFilteringPass < 40) { return svgHeight - d.percFilteringPass - margin.top - margin.bottom; } - return (svgHeight - d.percFilteringPass - margin.bottom) ; - }) - .attr("font-family", "sans-serif") - .attr("font-size", "12px") - .attr("fill", function(d) { if (d.percFilteringPass < 60) { return "black";} - return "white";}) -} - - -function plotReadsSum (statisticsArray, sums, clusters){ - - svgWidth = statisticsArray.length * globalWidthBar - if (svgWidth < 200) {svgWidth = 300;} - - var formatThousands = d3.format(","); - var colorRange = d3.scale.ordinal() - .range(colors); - - - - var margin = {top: 50, right: 20, bottom: 30, left: 40}, - svgWidth = svgWidth - margin.left - margin.right, - svgHeight = 250 - margin.top - margin.bottom; - - var barPadding = 1; - var valuePadding = 0.01; - - var svgReadsSum = d3.select("body") - .append("svg") - .attr("id", "unfilteredReads") - .attr("width", svgWidth + margin.left + margin.right) - .attr("height", svgHeight + margin.top + margin.bottom) - .append("g") - .attr("transform", "translate(" + margin.left + "," + margin.top + ")") - ; - - var rawReadsSum = 0; - rawReadsSum = sums[0].rawReadsSum - - svgReadsSum.append('text') - .text("Number of raw " + clusters + ": " + formatThousands(rawReadsSum)) - .attr("transform", "translate(" + (svgWidth/2) + "," + (svgHeight - 200) + ")") - .attr("font-family", "sans-serif") - .attr("font-size", "14px") - .attr("text-anchor", "middle") - ; - - - var x = d3.scale.ordinal() - .rangeRoundBands([0, svgWidth], valuePadding); - - var y = d3.scale.linear() - .range([svgHeight, 0]); - - var xAxis = d3.svg.axis() - .scale(x) - .orient("bottom"); - - var yAxis = d3.svg.axis() - .scale(y) - .orient("left"); - - x.domain(statisticsArray.map(function(d) { if (d.externalSampleName == undefined ) {return d.index1}; return d.externalSampleName; })); - y.domain([0, d3.max(statisticsArray, function(d) { return d.rawReadsSum - 20; })]); - - svgReadsSum.append("g") - .attr("class", "axis") - .attr("transform", "translate(0," + svgHeight + ")") - .call(xAxis); - - // alternate between minimal padding and high padding of the tick names - svgReadsSum.selectAll(".axis text") // select all the text elements for the xaxis - .data(statisticsArray) - .attr ("y", function(d, i) {if (i%2 == 0) {return 8} return 22}); // if index is even the put the text up, else further down - - - var ReadsSum = svgReadsSum.selectAll("ReadsSum") - .data(statisticsArray) - .enter() - .append("rect") - .attr("rx", 3) - .attr ("x", function (d) {return x(d.externalSampleName+d.index1);}) - .attr ("width", x.rangeBand()) - .attr ("y", function (d,i) {return y(d.rawReadsSum) ;}) - .attr("height", function (d,i) {return svgHeight - y(d.rawReadsSum);}) - // .attr("fill", function (d) { return "hsla("+ Math.round(d.rawReadsSum)*1.2 +", 40%, 30%, 1)"}); - .attr("fill", function(d) { return colorRange(d.rawReadsSum); }) - ; - - svgReadsSum.selectAll("svgReadsSumText") - .data(statisticsArray) - .enter() - .append("text") - .text(function(d) { return formatThousands(d.rawReadsSum); }) - //.attr("x", function(d, i) { return i * 1/(1+valuePadding)*(svgWidth / statisticsArray.length) + ((svgWidth /statisticsArray.length ) /2) -10; }) - .attr ("x", function (d) {return x(d.externalSampleName+d.index1) + 10;}) - // .attr("y", function(d) { - // return (svgHeight - margin.top - margin.bottom + 20) ; - // }) - .attr("y", function(d) {return y(d.rawReadsSum) - 8;}) - .attr("font-family", "sans-serif") - .attr("font-size", "10px") - .attr("fill", function(d) { if (d.rawReadsSum < 30000000) { return "black";} - return "black";}) - - ; - -} - - - -function plotPFReads (statisticsArray, sums, clusters){ - - svgWidth = statisticsArray.length * globalWidthBar - if (svgWidth < 200) {svgWidth = 300;} - - var formatThousands = d3.format(","); - var colorRange = d3.scale.ordinal() - .range(colors); - - - - var margin = {top: 50, right: 20, bottom: 30, left: 40}, - svgWidth = svgWidth - margin.left - margin.right, - svgHeight = 250 - margin.top - margin.bottom; - - var barPadding = 1; - var valuePadding = 0.01; - - var svgPFReads = d3.select("body") - .append("svg") - .attr("id", "PFReads") - .attr("width", svgWidth + margin.left + margin.right) - .attr("height", svgHeight + margin.top + margin.bottom) - .append("g") - .attr("transform", "translate(" + margin.left + "," + margin.top + ")") - ; - - var pfReadsSum = 0; - pfReadsSum = sums[0].pfReadsSum - - svgPFReads.append('text') - .text("Number of PF " + clusters + ": " + formatThousands(pfReadsSum)) - .attr("transform", "translate(" + (svgWidth/2) + "," + (svgHeight - 200) + ")") - .attr("font-family", "sans-serif") - .attr("font-size", "14px") - .attr("text-anchor", "middle") - ; - - - var x = d3.scale.ordinal() - .rangeRoundBands([0, svgWidth], valuePadding); - - var y = d3.scale.linear() - .range([svgHeight, 0]); - - var xAxis = d3.svg.axis() - .scale(x) - .orient("bottom"); - - var yAxis = d3.svg.axis() - .scale(y) - .orient("left"); - - x.domain(statisticsArray.map(function(d) { if (d.externalSampleName == undefined ) {return d.index1}; return d.externalSampleName; })); - y.domain([0, d3.max(statisticsArray, function(d) { return d.pfReadsSum - 20; })]); - - svgPFReads.append("g") - .attr("class", "axis") - .attr("transform", "translate(0," + svgHeight + ")") - .call(xAxis); - - // alternate between minimal padding and high padding of the tick names - svgPFReads.selectAll(".axis text") // select all the text elements for the xaxis - .data(statisticsArray) - .attr ("y", function(d, i) {if (i%2 == 0) {return 8} return 22}); // if index is even the put the text up, else further down - - - var ReadsSum = svgPFReads.selectAll("ReadsSum") - .data(statisticsArray) - .enter() - .append("rect") - .attr("rx", 3) - .attr ("x", function (d) {return x(d.externalSampleName+d.index1);}) - .attr ("width", x.rangeBand()) - .attr ("y", function (d,i) {return y(d.pfReadsSum) ;}) - .attr("height", function (d,i) {return svgHeight - y(d.pfReadsSum);}) - // .attr("fill", function (d) { return "hsla("+ Math.round(d.pfReadsSum)*1.2 +", 40%, 30%, 1)"}); - .attr("fill", function(d) { return colorRange(d.pfReadsSum); }) - ; - - svgPFReads.selectAll("svgPFReadsText") - .data(statisticsArray) - .enter() - .append("text") - .text(function(d) { return formatThousands(d.pfReadsSum); }) - //.attr("x", function(d, i) { return i * 1/(1+valuePadding)*(svgWidth / statisticsArray.length) + ((svgWidth /statisticsArray.length ) /2) -10; }) - .attr ("x", function (d) {return x(d.externalSampleName+d.index1) + 10;}) - // .attr("y", function(d) { - // return (svgHeight - margin.top - margin.bottom + 20) ; - // }) - .attr("y", function(d) {return y(d.pfReadsSum) - 8;}) - .attr("font-family", "sans-serif") - .attr("font-size", "10px") - .attr("fill", function(d) { if (d.pfReadsSum < 30000000) { return "black";} - return "black";}) - - ; - -} - - -function roundFloat(myFloat) { - return Number(myFloat).toFixed(2); -} - - -function calculateSum(statisticsArray, withNOINDEX) { - - var sums = [] - var averagePercFilteringPass = 0; - var sumRawReads = 0; - var sumPfReads = 0; - var sumRawYieldMbases = 0; - var sumYieldMbases = 0; - var averagePercRawClustersPerLane = 0; - var averagePfMeanQualityScore = 0; - var averagePfYieldq30Percentage = 0; - - for (var i = 0; i < statisticsArray.length; i++) { - // do not calculate with the NOINDEX reads - if ((typeof (statisticsArray[i].externalSampleName) == 'undefined') && withNOINDEX) { - continue; - } else { - - averagePercFilteringPass = averagePercFilteringPass + parseFloat(statisticsArray[i].percFilteringPass); - sumRawReads = sumRawReads + parseInt(statisticsArray[i].rawReadsSum); - sumPfReads = sumPfReads + parseInt(statisticsArray[i].pfReadsSum); - sumRawYieldMbases = sumRawYieldMbases + parseInt(statisticsArray[i].rawYieldMbases); - sumYieldMbases = sumYieldMbases + parseInt(statisticsArray[i].yieldMbases); - averagePercRawClustersPerLane = averagePercRawClustersPerLane + parseInt(statisticsArray[i].percRawClustersPerLane); - averagePfMeanQualityScore = averagePfMeanQualityScore + parseInt(statisticsArray[i].pfMeanQualityScore); - averagePfYieldq30Percentage = averagePfYieldq30Percentage + parseInt(statisticsArray[i].pfYieldq30Percentage); - } - } - if (withNOINDEX) {penalty = -1} else {penalty = 0} - - // added the Math.max function to make sure that there is no division by zero, - // can happen when a single sample is on a lane (no multiplexing) - averagePercFilteringPass = roundFloat(averagePercFilteringPass / Math.max((statisticsArray.length + penalty),1)); - averagePercRawClustersPerLane = roundFloat(averagePercRawClustersPerLane /Math.max((statisticsArray.length + penalty),1)); - averagePfMeanQualityScore = roundFloat(averagePfMeanQualityScore / Math.max((statisticsArray.length + penalty),1)); - averagePfYieldq30Percentage = roundFloat(averagePfYieldq30Percentage / Math.max((statisticsArray.length + penalty),1)); - - sums.push({ - 'averagePercFilteringPass' : averagePercFilteringPass, - 'rawReadsSum' : sumRawReads, - 'pfReadsSum' : sumPfReads, - 'rawYieldMbases' : sumRawYieldMbases, - 'yieldMbases' : sumYieldMbases, - 'percRawClustersPerLane': averagePercRawClustersPerLane, - 'pfMeanQualityScore' : averagePfMeanQualityScore, - 'pfYieldq30Percentage' : averagePfYieldq30Percentage - }); - - //console.log(sums); - return sums; - -} - - -function plotPercRawClustersPerLane (percRawClustersPerLaneArray) { - - var colorRange = d3.scale.ordinal() - .range(colors) - - var margin = {top: 60, right: 20, bottom: 40, left: 40}, - width = 500 - margin.left - margin.right, - height = 500 - margin.top - margin.bottom; - - var radius = Math.min(width, height) / 2; - - var arc = d3.svg.arc() - .outerRadius(radius - 50) - .innerRadius(radius - 90); - - var pie = d3.layout.pie() - .sort(null) - .value(function(d) { return d.percRawClustersPerLane; }); - - var svgPercRawClustersPerLaneChart = d3.select("body").append("svg") - .attr("id", "percRawClusters") - .attr("width", width) - .attr("height", height) - .append("g") - .attr("transform", "translate(" + width / 2 + "," + height / 2+ ")"); - - percRawClustersPerLaneArray.forEach(function(d) { - d.percRawClustersPerLane = +d.percRawClustersPerLane; - }); - - var g = svgPercRawClustersPerLaneChart.selectAll(".arc") - .data(pie(percRawClustersPerLaneArray)) - .enter().append("g") - .attr("class", "arc"); - - g.append("path") - .attr("d", arc) - .style("fill", function(d) { return colorRange(d.data.index1); }); - - g.append("text") - .attr("transform", function(d) { return "translate(" + arc.centroid(d) + ")"; }) - .attr("dy", ".35em") - .style("text-anchor", "middle") - .attr("font-family", "sans-serif") - .attr("font-size", "10px") - .attr("text-anchor", "middle") - .text(function (d) { - var perc = d.data.percRawClustersPerLane + " %"; - if (d.data.externalSampleName == undefined || d.data.externalSampleName.length > 10) {return d.data.index1 + " " + perc} - return d.data.externalSampleName + " " + perc }) - .on("mouseover", function(d) { - div.transition() - .duration(200) - .style("opacity", .9); - div.style("width", Math.max(d.data.externalSampleName.length, d.data.index1.length) * 8 + "px") - div.html(d.data.externalSampleName + "<br/>" + d.data.index1 + "<br/>" + d.data.percRawClustersPerLane + " %") - .style("left", (d3.event.pageX) + "px") - .style("top", (d3.event.pageY - 42) + "px"); - }) - .on("mouseout", function(d) { - div.transition() - .duration(500) - .style("opacity", 0); - }); - - - svgPercRawClustersPerLaneChart.append('text') - .text("% in Lane") - .attr("fill", "black") - .attr("transform", "translate(" + "0" + "," + (height -220) + ")") - .attr("font-family", "sans-serif") - .attr("font-size", "14px") - .attr("text-anchor", "middle") - ; - -} - - -function downloadButton (buttonName) { - - - var div = d3.select("body").append("button") - .attr("class", "btn-xs") - .attr("type", "submit") - .attr("id", "save_as" + buttonName) - .attr("value", "") - .text("Save") - ; -} - - function submit_download_form(output_format, svgName) - { - var rawSampleName = webAppContext.getEntityIdentifier() - var split = rawSampleName.split(":") - var fc = split[0].split("/")[2] - var lane = split[1] - - // Get the d3js SVG element - var tmp = document.getElementById(svgName); - - if (output_format == "svg") { - - // Extract the data as SVG text string - var svg_xml = "<svg xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\"> <style>" + - ".axis path,"+ - ".axis line {"+ - " fill: none;"+ - " stroke: #000;"+ - " shape-rendering: crispEdges;"+ - "}"+ - - ".axis text {"+ - " font-family: sans-serif;"+ - " font-size: 10px;"+ - "}"+ - "</style>" + (new XMLSerializer).serializeToString(tmp) + "</svg>"; - - var blob = new Blob([svg_xml], {type: "image/svg+xml;charset=utf-8"}); - } - if (output_format == "html") { - var html = "<html> <head> <title></title> <style type=\"text/css\">" + - "table.tableStats { font-family: sans-serif; font-size: 14px; border-collapse:collapse; }" + - ".tableStats th { padding:6px 10px; color:#444; font-weight:bold; text-shadow:1px 1px 1px #fff; border-bottom:2px solid #444; }" + - ".tableStats tr:nth-child(even) { background: WhiteSmoke; }" + - ".tableStats td { padding:0px 10px 10px 10px; }" + - "</style> </head> <body>" + - (new XMLSerializer).serializeToString(tmp) + - "</body> </html>" - var blob = new Blob([html], {type: "image/html;charset=utf-8"}); - } - if (output_format == "png") { - console.log("png") - } - - saveAs(blob, fc + "_Lane_" + lane + "_" + svgName + "." + output_format); - - } - - </script> - </body> -</html> diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/laneStatistics/html/style.css b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/laneStatistics/html/style.css deleted file mode 100644 index a2f1db8832b76aaaa5bbfe3ea6ed95f1a5c15665..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/laneStatistics/html/style.css +++ /dev/null @@ -1,52 +0,0 @@ - .axis path, - .axis line { - fill: none; - stroke: #000; - shape-rendering: crispEdges; - } - - .axis text { - font-family: sans-serif; - font-size: 10px; - } - - table.tableStats { - width:100%; - font-family: sans-serif; - font-size: 12px; - border-collapse:collapse; - } - - .tableStats th { - padding: 0.5rem; - text-align: right; - color:#444; - font-weight:bold; - /*text-shadow:1px 1px 1px #fff;*/ - border-bottom:1px solid #444; - background: #D9D9D9; - } - - .tableStats tr:nth-child(even) { - background: WhiteSmoke; - } - .tableStats td { - /*border: 1px solid #999;*/ - padding-left: 0.5rem; - padding-right: 0.5rem; - /*padding:0px 10px 10px 10px;*/ - - } - - div.tooltip { - position: absolute; - text-align: center; - width: 100px; - height: 42px; - padding: 2px; - font: 12px sans-serif; - background: LightSalmon; - border: 0px; - border-radius: 8px; - pointer-events: none; - } diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/laneStatistics/plugin.properties b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/laneStatistics/plugin.properties deleted file mode 100644 index 0508c9d27854911576e8cd4365d3ae369dadb1a8..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/laneStatistics/plugin.properties +++ /dev/null @@ -1,6 +0,0 @@ -# The properties file for an example webapps plugin -# This file has no properties defined because none need to be defined. -webapp-folder = html -openbisui-contexts = sample-details-view -sample-entity-types = ILLUMINA_FLOW_LANE -label = Lane Statistics diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/openbis-dsu.js b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/openbis-dsu.js deleted file mode 100644 index a1cc807e5a815f9c4715df316c09719b47d98531..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/openbis-dsu.js +++ /dev/null @@ -1,358 +0,0 @@ -/** - * openbis-dsu.js - * OpenBIS-DSU API - * - * A DSU-specific API for accessing openBIS. Depends on openbis.js. - * @author Chandrasekhar Ramakrishnan - */ - -/** - * The openbis_dsu object provides a dsu-specific interface to openbis. - * - * It creates objects for projects, experiments, samples, and datasets. These objects - * are designed to be passed on to GUI libraries (like d3). The openbis version of each - * object is stored in the bis variable. - * @constructor - */ -function openbis_dsu(url, dssUrl) { - this.server = new openbis(url, dssUrl); -} - -/** - * Request the sequencing samples for a project - */ -openbis_dsu.prototype.retrieveSequencingSamples = function(action) -{ - var sampleCriteria = - { - matchClauses : - [ {"@type":"AttributeMatchClause", - attribute : "TYPE", - fieldType : "ATTRIBUTE", - desiredValue : "ILLUMINA_SEQUENCING" - } ], - operator : "MATCH_ALL_CLAUSES" - }; - - this.server.searchForSamples(sampleCriteria, action); -} - - -/** - * Request a Sample using the code - */ -openbis_dsu.prototype.retrieveSample = function(sampleIdentifier, action) -{ - var sampleCriteria = - { - matchClauses : - [ {"@type":"AttributeMatchClause", - attribute : "CODE", - fieldType : "ATTRIBUTE", - desiredValue : sampleIdentifier - } ], - operator : "MATCH_ALL_CLAUSES" - }; - - this.server.searchForSamples(sampleCriteria, action); -} - - -/** - * Request a Sample with Properties using the code - */ -openbis_dsu.prototype.retrieveSampleWithPropertiesCode = function(sampleIdentifier, action) -{ - var sampleCriteria = - { - matchClauses : - [ {"@type":"AttributeMatchClause", - attribute : "CODE", - fieldType : "ATTRIBUTE", - desiredValue : sampleIdentifier - } ], - operator : "MATCH_ALL_CLAUSES" - }; - - var fetchOptions = ["PROPERTIES"]; - - var thisDsu = this; - this.server.searchForSamplesWithFetchOptions(sampleCriteria, fetchOptions, function(response){ - response.result = thisDsu.getInitializedSamples(response.result); - action(response); - }); -} - - -/** - * Request a Sample with Properties using the permID - */ -openbis_dsu.prototype.retrieveSampleWithProperties = function(samplePermId, action) -{ - var sampleCriteria = - { - matchClauses : - [ {"@type":"AttributeMatchClause", - attribute : "PERM_ID", - fieldType : "ATTRIBUTE", - desiredValue : samplePermId - } ], - operator : "MATCH_ALL_CLAUSES" - }; - - var fetchOptions = ["PROPERTIES"]; - - var thisDsu = this; - this.server.searchForSamplesWithFetchOptions(sampleCriteria, fetchOptions, function(response){ - response.result = thisDsu.getInitializedSamples(response.result); - action(response); - }); -} - - - -/** - * Request Parent Samples including properties - */ - -openbis_dsu.prototype.retrieveSampleParents = function(samplePermId, action) -{ - var sampleCriteria = - { - targetEntityKind : "SAMPLE_CHILD", - criteria : { - matchClauses : - [ {"@type":"AttributeMatchClause", - "attribute":"PERM_ID", - "fieldType":"ATTRIBUTE", - "desiredValue": samplePermId - }] - } - }; - - var parentCriteria = - { - subCriterias : [ sampleCriteria ], - matchClauses : - [ - ], - operator : "MATCH_ALL_CLAUSES" - }; - - var fetchOptions = ["PROPERTIES"]; - - var thisDsu = this; - this.server.searchForSamplesWithFetchOptions(parentCriteria, fetchOptions, function(response){ - response.result = thisDsu.getInitializedSamples(response.result); - action(response); - }); -} - - -/** - * Request Child Samples including properties - */ - -openbis_dsu.prototype.retrieveSampleChildren = function(samplePermIds, action) -{ - var permIdClauses = []; - - samplePermIds.forEach(function(samplePermId){ - var clause = {"@type":"AttributeMatchClause", - "attribute":"PERM_ID", - "fieldType":"ATTRIBUTE", - "desiredValue": samplePermId - } - permIdClauses.push(clause) - }); - - var sampleCriteria = - { - targetEntityKind : "SAMPLE_PARENT", - criteria : { - matchClauses : permIdClauses, - operator : "MATCH_ANY_CLAUSES" - } - }; - - var childCriteria = - { - subCriterias : [ sampleCriteria ], - matchClauses : - [ - ], - operator : "MATCH_ALL_CLAUSES" - }; - - var fetchOptions = ["PROPERTIES", "PARENTS"]; - - var thisDsu = this; - this.server.searchForSamplesWithFetchOptions(childCriteria, fetchOptions, function(response){ - response.result = thisDsu.getInitializedSamples(response.result); - action(response); - }); -} - -/** - * Get the data sets for a sample specified by sample permId - */ -openbis_dsu.prototype.retrieveDataSetsForSampleWithPermIds = function(samplePermIds, action) -{ - var clauses = []; - - samplePermIds.forEach(function(samplePermId){ - var clause = {"@type":"AttributeMatchClause", - "attribute":"PERM_ID", - "fieldType":"ATTRIBUTE", - "desiredValue": samplePermId - } - clauses.push(clause) - }); - - var sampleCriteria = - { - targetEntityKind : "SAMPLE", - criteria : { - matchClauses : clauses, - operator: "MATCH_ANY_CLAUSES" - } - }; - - var dataSetCriteria = - { - subCriterias : [ sampleCriteria ], - matchClauses : - [ {"@type":"AttributeMatchClause", - attribute : "TYPE", - fieldType : "ATTRIBUTE", - desiredValue : "FASTQ_GZ" - } ], - operator : "MATCH_ALL_CLAUSES" - }; - - this.server.searchForDataSets(dataSetCriteria, action) -} - - - -/** - * Get the data sets for a sample specified by sample identifier - */ -openbis_dsu.prototype.retrieveDataSetsForSample = function(sampleIdentifier, action) -{ - var sampleIdentifierTokens = sampleIdentifier.split("/"); - var sampleCriteria = - { - targetEntityKind : "SAMPLE", - criteria : { - matchClauses : - [ {"@type":"AttributeMatchClause", - "attribute":"CODE", - "fieldType":"ATTRIBUTE", - "desiredValue": sampleIdentifierTokens[2] - }] - } - }; - - var dataSetCriteria = - { - subCriterias : [ sampleCriteria ], - matchClauses : - [ {"@type":"AttributeMatchClause", - attribute : "TYPE", - fieldType : "ATTRIBUTE", - desiredValue : "FASTQ_GZ" - } ], - operator : "MATCH_ALL_CLAUSES" - }; - - this.server.searchForDataSets(dataSetCriteria, action) -} - -/** - * Get all data sets connected to a sequencing sample - */ -openbis_dsu.prototype.retrieveDataSetsForSequencingSample = function(sequencing, action) -{ - this.server.listDataSetsForSample(sequencing.bis, false, action); -} - -openbis_dsu.prototype.getInitializedSamples = function(result) { - // - // Fill Map that uses as key the sample @id and value the sample object - // - var samplesById = {}; - - function storeSamplesById(originalSample) - { - var stack = [originalSample]; - - var referredSample = null; - while (referredSample = stack.pop()) { - if (isNaN(referredSample)) { - samplesById[referredSample["@id"]] = referredSample; - if (referredSample.parents) { - for(var i = 0, len = referredSample.parents.length; i < len; ++i) { - stack.push(referredSample.parents[i]); - } - } - if (referredSample.children) { - for(var i = 0, len = referredSample.children.length; i < len; ++i) { - stack.push(referredSample.children[i]); - } - } - } - } - } - - for(var i = 0; i < result.length; i++) { - var sampleOrId = result[i]; - storeSamplesById(sampleOrId); - } - - // - // Fix Result List - // - function fixSamples(result) - { - for(var i = 0; i < result.length; i++) - { - var sampleOrId = result[i]; - if (isNaN(sampleOrId)) - { - sampleOrId = samplesById[sampleOrId["@id"]]; - } else - { - sampleOrId = samplesById[sampleOrId]; - } - result[i] = sampleOrId; - - - //Fill Parents - if(sampleOrId.parents) { - for(var j = 0; j < sampleOrId.parents.length; j++) { - var parentOrId = sampleOrId.parents[j]; - if(!isNaN(parentOrId)) { //If is an Id get the reference - sampleOrId.parents[j] = samplesById[parentOrId]; - } - } - fixSamples(sampleOrId.parents); - } - - //Fill Children - if(sampleOrId.children) { - for(var j = 0; j < sampleOrId.children.length; j++) { - var childOrId = sampleOrId.children[j]; - if(!isNaN(childOrId)) { //If is an Id get the reference - sampleOrId.children[j] = samplesById[childOrId]; - } - } - fixSamples(sampleOrId.children); - } - } - } - - fixSamples(result); - - return result; - } diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/sampleSheet/html/body-style.css b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/sampleSheet/html/body-style.css deleted file mode 100644 index 629f097de8b49fc14a36161fdc19abedc20b628d..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/sampleSheet/html/body-style.css +++ /dev/null @@ -1,4 +0,0 @@ -body { font: 14px "Trebuchet MS", sans-serif; } - -h1 { font: 16px; } -h3 { font: 12px; } diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/sampleSheet/html/button.css b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/sampleSheet/html/button.css deleted file mode 100644 index 6b1dccf1a6261b81a38333c2fdb2c2b4c9bb4697..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/sampleSheet/html/button.css +++ /dev/null @@ -1,54 +0,0 @@ -button { - font: 14px "Trebuchet MS"; - background-color: #222; - background-image: -moz-linear-gradient(top, rgba(255,255,255,.25), rgba(255,255,255,.11)); - background-image: -webkit-gradient(linear,left top,left bottom,color-stop(0, rgba(255,255,255,.25)),color-stop(1, rgba(255,255,255,.11))); - background-image: -webkit-linear-gradient(rgba(255,255,255,.25), rgba(255,255,255,.11)); - color: #fff; - text-rendering: optimizeLegibility; - text-shadow: 0 -1px 1px #222; - padding: 3px 5px 3px 5px; - border: 0; - border-radius: 0; - border-bottom: 1px solid #222; - margin: 0; - -moz-box-shadow: 0 1px 3px #999; - -webkit-box-shadow: 0 1px 3px #999; - box-shadow: 0 1px 3px #999; -} - -button.first { - border-top-left-radius: 5px; - border-bottom-left-radius: 5px; -} - -button.last { - border-top-right-radius: 5px; - border-bottom-right-radius: 5px; -} - -button.active { - background-color: rgb(65,102,133); -} - -button:hover { - background-color: grey; - cursor: pointer; -} - -input { - font: 14px "Trebuchet MS"; - background-image: -moz-linear-gradient(top, rgba(255,255,255,.25), rgba(255,255,255,.11)); - background-image: -webkit-gradient(linear,left top,left bottom,color-stop(0, rgba(255,255,255,.25)),color-stop(1, rgba(255,255,255,.11))); - background-image: -webkit-linear-gradient(rgba(255,255,255,.5), rgba(255,255,255,.1)); - color: #000; - text-rendering: optimizeLegibility; - padding: 3px 5px 3px 5px; - border: 0; - border-radius: 0; - margin: 0; - -moz-box-shadow: 0 1px 3px #999; - -webkit-box-shadow: 0 1px 3px #999; - box-shadow: 0 1px 3px #999; -} - diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/sampleSheet/html/index.html b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/sampleSheet/html/index.html deleted file mode 100644 index 06d4e850cd42a7ca299d9b535bf5be3f4c1e2f75..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/sampleSheet/html/index.html +++ /dev/null @@ -1,155 +0,0 @@ -<head> - <title>Quantitative Genomics Facility Sample Sheet Generator</title> - <link type="text/css" rel="stylesheet" href="button.css" /> - <link type="text/css" rel="stylesheet" href="body-style.css" /> - <script type="text/javascript" src="/openbis/resources/js/d3.v3.min.js"></script> - <script type="text/javascript" src="/openbis/resources/js/jquery.js"></script> - <script type="text/javascript" src="/openbis/resources/js/spin.min.js"></script> - <script type="text/javascript" src="/openbis/resources/js/openbis.js"></script> - <script type="text/javascript" src="/openbis/resources/js/openbis-dsu.js"></script> - <script type="text/javascript" src="/openbis/resources/js/openbis-action-deferrer.js"></script> - <!-- To speed development, cache the requests --> - <!-- <script type="text/javascript" src="openbis-request-cache.js"></script> --> - <script> - -dsu = new openbis_dsu('/openbis/openbis', '/datastore_server'); -console.log(openbis_dsu) -var context = new openbisWebAppContext(); -dsu.server.useSession(context.getSessionId()); -var vis; -var didCreateVis = false; - -$(document).ready(function() { -}); - -function createVis() -{ - if (didCreateVis) return; - vis = d3.select("#main").append("div").attr("id", "vis"); - didCreateVis = true; -} - -function displayReturnedTable(data) -{ - if (data.error) { - console.log(data.error); - vis.append("p").text("Could not retrieve data."); - return; - } - - // This will show the object in the log -- helpful for debugging - // console.log(data.result); - var dataToShow = data.result; - - vis.append("p").text(""); - // Pick all div elements of the visualization - vis.selectAll("div").data(dataToShow.rows) - // Code under enter is run if there is no HTML element for a data element - .enter() - .append("div") - .text(function(row) { return row[0].value }) - d3.select("#progress").remove() - d3.select("#runType").remove() - //console.log(data); -} - - -function spinner (target) { - var opts = { - lines: 13, // The number of lines to draw - length: 7, // The length of each line - width: 4, // The line thickness - radius: 10, // The radius of the inner circle - corners: 1, // Corner roundness (0..1) - rotate: 0, // The rotation offset - color: '#000', // #rgb or #rrggbb - speed: 1, // Rounds per second - trail: 60, // Afterglow percentage - shadow: false, // Whether to render a shadow - hwaccel: false, // Whether to use hardware acceleration - className: 'spinner', // The CSS class to assign to the spinner - zIndex: 2e9, // The z-index (defaults to 2000000000) - top: 'auto', // Top position relative to parent in px - left: 'auto' // Left position relative to parent in px - }; - var spinner = new Spinner(opts).spin(target); -} - -function loadProperties () { - - var sampleCodes = []; - var miSeqRun = false; - - sampleCodes.push(context.getEntityIdentifier()); - - var deferrer = new openbisActionDeferrer(function(){ - d3.select("#main").select("#progress").remove(); - d3.select("#main").select("#vis").remove(); - if (miSeqRun == true) { - d3.select("#main").append("div").attr("id", "runType").append("p").text("Detected MiSeq Run."); - } - else { - d3.select("#main").append("div").attr("id", "runType").append("p").text("Detected HiSeq Run."); - } - d3.select("#main").append("div").attr("id", "progress").append("p").text("Creating sample sheet..."); - var target = document.getElementById('progress'); - spinner(target); - }, sampleCodes); - - sampleCodes.forEach(function(sampleCode){ - dsu.retrieveSample(sampleCode, function(response) { - getProperties(response); - //console.log("got response " + sampleCode); - deferrer.dependencyCompleted(sampleCode); - callAggregationService(miSeqRun) - }); - }); - - function getProperties(response) { - flowcellProperties = response.result[0].properties; - numberOfLanes = (flowcellProperties.LANECOUNT); - sequencer = (flowcellProperties.SEQUENCER); - if (sequencer == "M01761") { - miSeqRun = true; - } - else { - miSeqRun = false; - } - } -} - - -function callAggregationService(miSeqRun) -{ - var sampleCode = context.getEntityIdentifier(); - var mySendEmail = $('input[name=sendEmail]').is(':checked'); - - didCreateVis = false; - createVis() - - var parameters = - { - sampleId : sampleCode, - sendEmail : mySendEmail, - miSeqRun : miSeqRun - }; - console.log(parameters) - - dsu.server.createReportFromAggregationService("DSS1", "triggerCreateSampleSheet", parameters, displayReturnedTable); -} - - </script> -</head> -<body> -<div id="main"> - <div id="checkbox-group"> - <input type="checkbox" name="sendEmail" value="mail"> Send Sample Sheet By Mail? <br> - <!--<input type="checkbox" name="singlelane" value="singlelane"> Single Lane Mode? <br> --> - <br> - </div> - <div id="button-group"> - <button id="createSampleSheet-button" onclick="loadProperties();">Create Sample Sheet</button> - </div> -</div> -</body> -</html> diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/sampleSheet/plugin.properties b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/sampleSheet/plugin.properties deleted file mode 100644 index a8230cd14eea23cd0326fb874e3d184f5617bdab..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/sampleSheet/plugin.properties +++ /dev/null @@ -1,6 +0,0 @@ -# The properties file for an example webapps plugin -# This file has no properties defined because none need to be defined. -webapp-folder = html -openbisui-contexts = sample-details-view -sample-entity-types = ILLUMINA_FLOW_CELL -label = Sample Sheet Creator diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/create-flowcell-hiseq/create-flowcell-hiseq.py b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/create-flowcell-hiseq/create-flowcell-hiseq.py deleted file mode 100644 index 8fd666f38f254f7fb84ba78e024d7e91d58903e1..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/create-flowcell-hiseq/create-flowcell-hiseq.py +++ /dev/null @@ -1,221 +0,0 @@ -''' -@copyright: -2012 ETH Zuerich, CISD - -@license: -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - -http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. - -@description: -Parses the two Illumina provided files 'runParameters.xml' and 'RunInfo.xml' -and creates one Sample of type 'ILLUMINA_FLOW_CELL' and sets Sample properties -from those two XML files. Additionally the number of lanes are read out and -are created as contained samples of type 'ILLUMINA_FLOW_LANE'. - -@note: -print statements go to: <openBIS_HOME>/datastore_server/log/startup_log.txt -expected incoming Name for HiSeq runs: 110715_SN792_0054_BC035RACXX -expected incoming Name for GAII runs: 110812_6353WAAXX - -@author: -Manuel Kohler -''' - -import os -import shutil -import re -from time import * -from datetime import * -import xml.etree.ElementTree as etree -from ch.systemsx.cisd.openbis.generic.shared.api.v1.dto import SearchCriteria - -IS_HISEQ_RUN=False -RUNPARAMETERS = 'runParameters.xml' -RUNINFO = 'RunInfo.xml' -FLOWCELL_SPACE='BSSE_FLOWCELLS' -FLOWCELL_PROJECT='FLOWCELLS' -EXPERIMENT_TYPE_CODE='HT_SEQUENCING' - -FLOWCELL_PROJECT_ID = "/%(FLOWCELL_SPACE)s/%(FLOWCELL_PROJECT)s/" % vars() - -# Mapping between XML file naming and used in here -RUNPARAMETERS_XML = {'FLOWCELL':'Flowcell', 'RTAVERSION':'RTAVersion', - 'CONTROLLANE':'ControlLane', 'SBS':'Sbs', 'INDEX':'Index', - 'CYCLES_REQUESTED_BY_CUSTOMER':'Read1', 'PE':'Pe', 'RUN_MODE': 'RunMode'} -RUNINFO_XML = {'LANECOUNT':'LaneCount', 'SURFACECOUNT':'SurfaceCount', - 'SWATHCOUNT':'SwathCount', 'TILECOUNT':'TileCount'} - -class parseXmlFile: - - def __init__(self, xmlFile): - self.xmlFile = xmlFile - self.tree = etree.parse(self.xmlFile) - self.root = self.tree.getroot() - - def getXmlElement (self, elementName): - ''' - Returns the text value of a given XML element - ''' - for e in self.root.getchildren(): - element = e.find(elementName) - if element is None: - return 'None' - else: - return element.text - - def getAllchildren (self, elementName): - ''' - finds all children of a given XML Element and returns them as list - ''' - for e in self.root.getchildren(): - # the '//' means look recursively for all children not only direct ones - childList = self.tree.findall('//' + elementName) - return childList - -# ----------------------------------------------------------------------------- - -def create_openbis_timestamp (): - ''' - Create an openBIS conform timestamp - ''' - tz=localtime()[3]-gmtime()[3] - d=datetime.now() - return d.strftime("%Y-%m-%d %H:%M:%S GMT"+"%+.2d" % tz+":00") - -# ----------------------------------------------------------------------------- - -def createOpenbisTimeStamp(file): - ''' - Creates a openBIS compatible time stamp of a file time stamp - ''' - mtime = os.path.getmtime(file) - lt = localtime(mtime) - tz = localtime().tm_hour - gmtime().tm_hour - return (strftime("%Y-%m-%d %H:%M:%S GMT" + "%+.2d" % tz + ":00", lt)) - -# ----------------------------------------------------------------------------- - -def registerFlowLane(transaction, a_lane, name, newFlowCell): - ''' - Registers a new Flow lane - ''' - newFlowLane = transaction.createNewSample('/' + FLOWCELL_SPACE + '/' + name + ':' + str(a_lane), "ILLUMINA_FLOW_LANE") - newFlowLane.setContainer(newFlowCell) - newFlowLane.setPropertyValue('CONCENTRATION_FLOWLANE', str(0)) - -# ----------------------------------------------------------------------------- - -def addVocabularyTerm(transaction, vocabularyName, vocabularyCode): - modifiableVocabulary = transaction.getVocabularyForUpdate(vocabularyName) - if not (modifiableVocabulary.containsTerm(vocabularyCode)): - ordinals = [] - terms = modifiableVocabulary.getTerms() - for term in terms: - ordinals.append(term.getOrdinal()) - - newOrdinal = max(ordinals)+1; - newTerm = transaction.createNewVocabularyTerm(); - newTerm.setCode(vocabularyCode) - newTerm.setOrdinal(newOrdinal) - modifiableVocabulary.addTerm(newTerm) - -# ----------------------------------------------------------------------------- - -def sanitizeString(myString): - return re.sub('[^A-Za-z0-9]+', '_', myString) - -# ----------------------------------------------------------------------------- - -def setFcProperty(searchId, dict, newFlowCell, runInfo): - children = runInfo.getAllchildren(searchId) - for element in (dict): - if (element <> '') and (dict[element] <> ''): - newFlowCell.setPropertyValue(element, children[0].attrib[dict[element]]) - -# ----------------------------------------------------------------------------- - -def process(transaction): - incoming = transaction.getIncoming() - incomingPath = incoming.getAbsolutePath() - space = None - - # Get the incoming name - name = incoming.getName() - split=name.split("_") - - # Parse the RunInfo.xml file - runInfo = parseXmlFile(incomingPath + '/' + RUNINFO) - maxLanes = runInfo.getAllchildren('FlowcellLayout')[0].attrib[RUNINFO_XML['LANECOUNT']] - - # Search for the sample and check if there is already sample with this name - search_service = transaction.getSearchService() - sc = SearchCriteria() - sc.addMatchClause(SearchCriteria.MatchClause.createAttributeMatch(SearchCriteria.MatchClauseAttribute.CODE, name)); - foundSamples = search_service.searchForSamples(sc) - if foundSamples.size() > 0: - print('Already found a Flow Cell with the following name: '+ name + ". Will re-set the properties...") - newFlowCell = transaction.getSampleForUpdate(foundSamples[0].getSampleIdentifier()) - else: - # Create a new Flow Cell and set the experiment - print ("Creating new Flow Cell " + name) - - newFlowCell = transaction.createNewSample('/' + FLOWCELL_SPACE + '/' + name, "ILLUMINA_FLOW_CELL") - exp = transaction.getExperiment(FLOWCELL_PROJECT_ID + datetime.now().strftime("%Y.%m")) - if exp == None: - exp = transaction.createNewExperiment(FLOWCELL_PROJECT_ID + datetime.now().strftime("%Y.%m"), - EXPERIMENT_TYPE_CODE) - newFlowCell.setExperiment(exp) - [registerFlowLane(transaction, lane, name, newFlowCell) for lane in range(1,int(maxLanes)+1)] - - run = runInfo.getAllchildren('Run')[0].attrib - if (run['Id'] != name): - raise NameError('Flowcell names do not match between directory name '+ name + - ' and ' + RUNINFO + ' property file: ' + run['Id']) - - # The HiSeq is providing more infos, which we will parse here: - runParameters = parseXmlFile(incomingPath + '/' + RUNPARAMETERS) - addVocabularyTerm(transaction, "PIPELINE_VERSION", runParameters.getXmlElement(RUNPARAMETERS_XML['RTAVERSION'])) - - newFlowCell.setPropertyValue("ILLUMINA_PIPELINE_VERSION", runParameters.getXmlElement(RUNPARAMETERS_XML['RTAVERSION'])) - newFlowCell.setPropertyValue("FLOWCELLTYPE", runParameters.getXmlElement(RUNPARAMETERS_XML['FLOWCELL'])) - newFlowCell.setPropertyValue("CONTROL_LANE", runParameters.getXmlElement(RUNPARAMETERS_XML['CONTROLLANE'])) - newFlowCell.setPropertyValue("SBS_KIT", runParameters.getXmlElement(RUNPARAMETERS_XML['SBS'])) - - runMode = sanitizeString(runParameters.getXmlElement(RUNPARAMETERS_XML['RUN_MODE'])) - addVocabularyTerm(transaction, "RUN_MODE_VOCABULARY", runMode) - - newFlowCell.setPropertyValue("RUN_MODE", runMode) - newFlowCell.setPropertyValue("RUN_NAME_FOLDER", name) - - numberOfCycles = runParameters.getAllchildren('Read1')[0].text - cyclesVocabularyName = "CYCLES" - addVocabularyTerm(transaction, cyclesVocabularyName, numberOfCycles) - newFlowCell.setPropertyValue("CYCLES_REQUESTED_BY_CUSTOMER", numberOfCycles) - - read2 = runParameters.getAllchildren('Read2') - if (str(read2[0].text) == '0'): - newFlowCell.setPropertyValue("END_TYPE", "SINGLE_READ") - else: - newFlowCell.setPropertyValue("END_TYPE", "PAIRED_END") - newFlowCell.setPropertyValue("PAIRED_END_KIT", runParameters.getXmlElement(RUNPARAMETERS_XML['PE'])) - - indexRead1 = runParameters.getAllchildren('IndexRead1') - newFlowCell.setPropertyValue("INDEXREAD", indexRead1[0].text) - - indexRead2 = runParameters.getAllchildren('IndexRead2') - newFlowCell.setPropertyValue("INDEXREAD2", indexRead2[0].text) - - setFcProperty('FlowcellLayout', RUNINFO_XML, newFlowCell, runInfo) - - sequencer = runInfo.getAllchildren('Instrument') - newFlowCell.setPropertyValue("SEQUENCER", sequencer[0].text) - newFlowCell.setPropertyValue("FLOW_CELL_SEQUENCED_ON", createOpenbisTimeStamp(incomingPath + '/' + RUNPARAMETERS)) diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/create-flowcell-hiseq/plugin.properties b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/create-flowcell-hiseq/plugin.properties deleted file mode 100644 index 5c56666b206b67339b5155b80f2d5812c1ac34b0..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/create-flowcell-hiseq/plugin.properties +++ /dev/null @@ -1,12 +0,0 @@ -# -# Drop box for creating a flow cell based on runParameters.xml and RunInfo.xml created by an -# Illumina HiSeq -# -# Variables: -# incoming-root-dir -# Path to the directory which contains incoming directories for drop boxes. -incoming-dir = ${incoming-root-dir}/create-flowcell-hiseq -incoming-data-completeness-condition = marker-file -top-level-data-set-handler = ch.systemsx.cisd.etlserver.registrator.api.v2.JythonTopLevelDataSetHandlerV2 -script-path = create-flowcell-hiseq.py -storage-processor = ch.systemsx.cisd.etlserver.DefaultStorageProcessor diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/create-flowcell-miseq/create-flow-cell-miseq.py b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/create-flowcell-miseq/create-flow-cell-miseq.py deleted file mode 100755 index cfde834eb21569593cff76d70856daead0e6aa0f..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/create-flowcell-miseq/create-flow-cell-miseq.py +++ /dev/null @@ -1,251 +0,0 @@ -''' -@copyright: -2012, 2013 ETH Zuerich, CISD - -@license: -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - -http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. - -@description: -Parses the two Illumina provided files 'RunParameters.xml' and 'RunInfo.xml' -and creates one Sample of type 'ILLUMINA_FLOW_CELL' and sets Sample properties -from those two XML files. Additionally the number of lanes are read out and -are created as contained samples of type 'ILLUMINA_FLOW_LANE'. - -@note: -print statements go to: <openBIS_HOME>/datastore_server/log/startup_log.txt -expected incoming Name for MiSeq runs: 120726_M00721_0011_A000000000-A1FVF - -@author: -Manuel Kohler -''' - -import os -import shutil -from time import * -from datetime import * -import xml.etree.ElementTree as etree -from ch.systemsx.cisd.openbis.generic.shared.api.v1.dto import SearchCriteria -from ch.systemsx.cisd.common.mail import EMailAddress - -#RUNPARAMETERS = 'RunParameters.xml' -RUNPARAMETERS = 'runParameters.xml' -RUNINFO = 'RunInfo.xml' -FLOWCELL_SPACE='/BSSE_FLOWCELLS/' -FLOWCELL_PROJECT='FLOWCELLS/' -EXPERIMENT_TYPE_CODE='HT_SEQUENCING' - -# Mapping between XML file naming and openBIS properties - -RUNINFO_XML = {'LANECOUNT':'LaneCount', 'SURFACECOUNT':'SurfaceCount', - 'SWATHCOUNT':'SwathCount', 'TILECOUNT':'TileCount'} - -#------------------------------------------------------------------------------ - -class parseXmlFile: - - def __init__(self, xmlFile): - self.xmlFile = xmlFile - self.tree = etree.parse(self.xmlFile) - self.root = self.tree.getroot() - - def getXmlElement (self, elementName): - ''' - Returns the text value of a given XML element - ''' - for e in self.root.getchildren(): - element = e.find(elementName) - if element is None: - return 'None' - else: - return element.text - - def getAllchildren (self, elementName): - ''' - finds all children of a given XML Element and returns them as list - ''' - for e in self.root.getchildren(): - # the '//' means look recursively for all children not only direct ones - childList = self.tree.findall('//' + elementName) - return childList - -# ----------------------------------------------------------------------------- - -def create_openbis_timestamp (): - ''' - Create an openBIS conform timestamp - ''' - tz=localtime()[3]-gmtime()[3] - d=datetime.now() - return d.strftime("%Y-%m-%d %H:%M:%S GMT"+"%+.2d" % tz+":00") - -# ----------------------------------------------------------------------------- - -def createOpenbisTimeStamp(file): - ''' - Creates a openBIS compatible time stamp of a file time stamp - ''' - mtime = os.path.getmtime(file) - lt = localtime(mtime) - tz = localtime().tm_hour - gmtime().tm_hour - return (strftime("%Y-%m-%d %H:%M:%S GMT" + "%+.2d" % tz + ":00", lt)) - -# ----------------------------------------------------------------------------- - -def registerFlowLane(a_lane, transaction, name, newFlowCell): - ''' - Registers a new Flow lane - ''' - newFlowLane = transaction.createNewSample(FLOWCELL_SPACE + name + ':' + str(a_lane), "ILLUMINA_FLOW_LANE") - newFlowLane.setPropertyValue('CONCENTRATION_FLOWLANE', str(0)) - newFlowLane.setContainer(newFlowCell) - -# ----------------------------------------------------------------------------- - -def addVocabularyTerm(transaction, vocabularyName, vocabularyCode): - modifiableVocabulary = transaction.getVocabularyForUpdate(vocabularyName) - if not (modifiableVocabulary.containsTerm(vocabularyCode)): - ordinals = [] - terms = modifiableVocabulary.getTerms() - for term in terms: - ordinals.append(term.getOrdinal()) - - newOrdinal = max(ordinals)+1; - - newTerm = transaction.createNewVocabularyTerm(); - newTerm.setCode(vocabularyCode) - newTerm.setOrdinal(newOrdinal) - modifiableVocabulary.addTerm(newTerm) - -# ----------------------------------------------------------------------------- - -def process(transaction): - - incoming = transaction.getIncoming() - incomingPath = incoming.getAbsolutePath() - - name = incoming.getName() - # ['120726', 'M00721', '0011', 'A000000000-A1FVF'] - runDate, MiseqID, runningNumber, trayAndFcId = name.split("_") - tray = trayAndFcId[0] - fcId = trayAndFcId[1:] - - # ----------------------------------------------------------------------------- - - # Search for the sample and check if there is already sample with this name - search_service = transaction.getSearchService() - sc = SearchCriteria() - sc.addMatchClause(SearchCriteria.MatchClause.createAttributeMatch(SearchCriteria.MatchClauseAttribute.CODE, name)); - foundSamples = search_service.searchForSamples(sc) - if foundSamples.size() > 0: - raise NameError('Already found a Flow Cell with the following name: '+ name) - - # Parse the RunInfo.xml file - runInfo = parseXmlFile(incomingPath + '/' + RUNINFO) - - # Create a new Flow Cell and set the experiment - newFlowCell = transaction.createNewSample(FLOWCELL_SPACE + name, "ILLUMINA_FLOW_CELL") - exp = transaction.getExperiment(FLOWCELL_SPACE + FLOWCELL_PROJECT + datetime.now().strftime("%Y.%m")) - if exp == None: - exp = transaction.createNewExperiment(FLOWCELL_SPACE + FLOWCELL_PROJECT + datetime.now().strftime("%Y.%m"), - EXPERIMENT_TYPE_CODE) - newFlowCell.setExperiment(exp) - - run = runInfo.getAllchildren('Run')[0].attrib - if (run['Id'] != name): - raise NameError('Flowcell names do not match between directory name '+ name + - ' and ' + RUNINFO + 'property file: ' + run['Id']) - - runParameters = parseXmlFile(incomingPath + '/' + RUNPARAMETERS) - RTAversion = (runParameters.getAllchildren('RTAVersion'))[0].text - ReagentKitBarcode = (runParameters.getAllchildren('ReagentKitBarcode'))[0].text - print RTAversion - addVocabularyTerm(transaction, "PIPELINE_VERSION", RTAversion) - newFlowCell.setPropertyValue("ILLUMINA_PIPELINE_VERSION", RTAversion) - newFlowCell.setPropertyValue("SBS_KIT", ReagentKitBarcode) - - def setFcProperty(searchId, dict): - children = runInfo.getAllchildren(searchId) - for element in (dict): - if (element <> '') and (dict[element] <> ''): - newFlowCell.setPropertyValue(element, children[0].attrib[dict[element]]) - - # Reading out <FlowcellLayout LaneCount="1" SurfaceCount="1" SwathCount="1" TileCount="12" /> - setFcProperty('FlowcellLayout', RUNINFO_XML) - - sequencer = runInfo.getAllchildren('Instrument') - newFlowCell.setPropertyValue("SEQUENCER", sequencer[0].text) - - readMap = {} - reads = runInfo.getAllchildren('Reads') - read = reads[0].findall('Read') - - for r in read: - cycles = r.get('NumCycles', 'str') - number = r.get('Number', 'str') - isIndexed = r.get('IsIndexedRead', 'str') - readMap[number] = [cycles, isIndexed] - - # example of readMap: {'1': ['151', 'N'], '2': ['8', 'Y'], '3': ['8', 'Y'], '4': ['151', 'N']} - numberOfCycles = readMap['1'][0] - cyclesVocabularyName = "CYCLES" - - addVocabularyTerm(transaction, cyclesVocabularyName, numberOfCycles) - - newFlowCell.setPropertyValue("CYCLES_REQUESTED_BY_CUSTOMER", numberOfCycles) - - indexCount = 0 - readCount = 0 - - for e in readMap: - if readMap[e][1] == 'Y': - indexCount += 1 - else: - readCount += 1 - - if readCount == 2: - newFlowCell.setPropertyValue("END_TYPE", "PAIRED_END") - else: - newFlowCell.setPropertyValue("END_TYPE", "SINGLE_READ") - - try: - newFlowCell.setPropertyValue("INDEXREAD", readMap['2'][0]) - except: - newFlowCell.setPropertyValue("INDEXREAD", '0') - - try: - if indexCount == 2: - newFlowCell.setPropertyValue("INDEXREAD2", readMap['3'][0]) - else: - newFlowCell.setPropertyValue("INDEXREAD2", '0') - except: - newFlowCell.setPropertyValue("INDEXREAD2", '0') - - newFlowCell.setPropertyValue("FLOW_CELL_SEQUENCED_ON", createOpenbisTimeStamp(incomingPath + '/' + RUNPARAMETERS)) - newFlowCell.setPropertyValue("RUN_NAME_FOLDER", name) - - # get the number of lanes - maxLanes = runInfo.getAllchildren('FlowcellLayout')[0].attrib[RUNINFO_XML['LANECOUNT']] - - [registerFlowLane(lane, transaction, name, newFlowCell) for lane in range(1,int(maxLanes)+1)] - - replyTo = EMailAddress("manuel.kohler@bsse.ethz.ch") - fromAddress = replyTo - manuel = EMailAddress("manuel.kohler@bsse.ethz.ch") - ina = EMailAddress("ina.nissen@bsse.ethz.ch") - christian = EMailAddress("christian.beisel@bsse.ethz.ch") - katja = EMailAddress("katja.eschbach@bsse.ethz.ch") - - transaction.getGlobalState().getMailClient().sendEmailMessage("Automatically created new flow cell " + name + " in openBIS", \ - "A new sequencing run got started using flow cell " + name, replyTo, fromAddress, ina, katja, christian, manuel); - - shutil.rmtree(incomingPath) diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/create-flowcell-miseq/plugin.properties b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/create-flowcell-miseq/plugin.properties deleted file mode 100644 index 27b2927d980645467e2a914b046150369c6263a9..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/create-flowcell-miseq/plugin.properties +++ /dev/null @@ -1,12 +0,0 @@ -# -# Drop box for creating a flow cell -# -# Variables: -# incoming-root-dir -# Path to the directory which contains incoming directories for drop boxes. -incoming-dir = ${incoming-root-dir}/create-flowcell-miseq -incoming-data-completeness-condition = marker-file -top-level-data-set-handler = ch.systemsx.cisd.etlserver.registrator.api.v2.JythonTopLevelDataSetHandlerV2 -script-path = create-flow-cell-miseq.py -storage-processor = ch.systemsx.cisd.etlserver.DefaultStorageProcessor - diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/create-flowcell-nextseq/create-flow-cell-nextseq.py b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/create-flowcell-nextseq/create-flow-cell-nextseq.py deleted file mode 100755 index 981db5dd2ab13b04167ea3da66ac3523764335a8..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/create-flowcell-nextseq/create-flow-cell-nextseq.py +++ /dev/null @@ -1,290 +0,0 @@ -''' -@copyright: -2014 ETH Zuerich, CISD - -@license: -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - -http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. - -@description: -Parses the two Illumina provided files 'RunParameters.xml' and 'RunInfo.xml' -and creates one Sample of type 'ILLUMINA_FLOW_CELL' and sets Sample properties -from those two XML files. Additionally the number of lanes are read out and -are created as contained samples of type 'ILLUMINA_FLOW_LANE'. - -@note: -print statements go to: <openBIS_HOME>/datastore_server/log/startup_log.txt -expected incoming Name for NextSeq runs: 140729_NS500318_0002_AH0T25AGXX - -@author: -Manuel Kohler -''' - -import os -import shutil -import re -from time import * -from datetime import * -import xml.etree.ElementTree as etree -from ch.systemsx.cisd.openbis.generic.shared.api.v1.dto import SearchCriteria -from ch.systemsx.cisd.common.mail import EMailAddress - -RUNPARAMETERS = 'RunParameters.xml' -RUNINFO = 'RunInfo.xml' -FLOWCELL_SPACE='/BSSE_FLOWCELLS/' -FLOWCELL_PROJECT='FLOWCELLS/' -EXPERIMENT_TYPE_CODE='HT_SEQUENCING' -CYCLES_VOCABULARY_NAME = "CYCLES" - -# Mapping between XML file naming and openBIS properties - -RUNINFO_XML = {'LANECOUNT':'LaneCount', 'SURFACECOUNT':'SurfaceCount', - 'SWATHCOUNT':'SwathCount', 'TILECOUNT':'TileCount'} - -PERSISTANT_KEY_MAP = "persistant_key_map" - -#------------------------------------------------------------------------------ - -class parseXmlFile: - - def __init__(self, xmlFile): - self.xmlFile = xmlFile - self.tree = etree.parse(self.xmlFile) - self.root = self.tree.getroot() - - def getXmlElement (self, elementName): - ''' - Returns the text value of a given XML element - ''' - for e in self.root.getchildren(): - element = e.find(elementName) - if element is None: - return 'None' - else: - return element.text - - def getAllchildren (self, elementName): - ''' - finds all children of a given XML Element and returns them as list - ''' - for e in self.root.getchildren(): - # the '//' means look recursively for all children not only direct ones - childList = self.tree.findall('//' + elementName) - return childList - -# ----------------------------------------------------------------------------- - -def createOpenbisTimeStamp(file): - ''' - Creates a openBIS compatible time stamp of a file time stamp - ''' - mtime = os.path.getmtime(file) - lt = localtime(mtime) - tz = localtime().tm_hour - gmtime().tm_hour - return (strftime("%Y-%m-%d %H:%M:%S GMT" + "%+.2d" % tz + ":00", lt)) - -# ----------------------------------------------------------------------------- - -def registerFlowLane(a_lane, transaction, name, newFlowCell): - ''' - Registers a new Flow lane - ''' - newFlowLane = transaction.createNewSample(FLOWCELL_SPACE + name + ':' + str(a_lane), "ILLUMINA_FLOW_LANE") - newFlowLane.setPropertyValue('CONCENTRATION_FLOWLANE', str(0)) - newFlowLane.setContainer(newFlowCell) - -# ----------------------------------------------------------------------------- - -def addVocabularyTerm(transaction, vocabularyName, vocabularyCode): - modifiableVocabulary = transaction.getVocabularyForUpdate(vocabularyName) - if not (modifiableVocabulary.containsTerm(vocabularyCode)): - ordinals = [] - terms = modifiableVocabulary.getTerms() - for term in terms: - ordinals.append(term.getOrdinal()) - - newOrdinal = max(ordinals)+1; - - newTerm = transaction.createNewVocabularyTerm(); - newTerm.setCode(vocabularyCode) - newTerm.setOrdinal(newOrdinal) - modifiableVocabulary.addTerm(newTerm) - -# ----------------------------------------------------------------------------- - -def sendEmail(mailClient, fcId): - - replyTo = EMailAddress("manuel.kohler@bsse.ethz.ch") - fromAddress = replyTo - manuel = EMailAddress("manuel.kohler@bsse.ethz.ch") - ina = EMailAddress("ina.nissen@bsse.ethz.ch") - christian = EMailAddress("christian.beisel@bsse.ethz.ch") - katja = EMailAddress("katja.eschbach@bsse.ethz.ch") - philippe = EMailAddress("philippe.demougin@unibas.ch") - elodie = EMailAddress("belodie@ethz.ch") - - mailClient.sendEmailMessage("Automatically created new NextSeq flow cell " + fcId + " in openBIS", \ - "A new NextSeq run got started with flow cell: " + fcId , replyTo, fromAddress, ina, katja, christian, philippe, manuel, elodie); - -# ----------------------------------------------------------------------------- - -def post_storage(context): - mailClient = context.getGlobalState().getMailClient() - results = context.getPersistentMap().get(PERSISTANT_KEY_MAP) - sendEmail(mailClient, results[0]) - -# ----------------------------------------------------------------------------- - -def searchSample(transaction, sampleName): - - # Search for the sample and check if there is already sample with this fcId - search_service = transaction.getSearchService() - sc = SearchCriteria() - sc.addMatchClause(SearchCriteria.MatchClause.createAttributeMatch(SearchCriteria.MatchClauseAttribute.CODE, sampleName)); - foundSamples = search_service.searchForSamples(sc) - return foundSamples - -# ----------------------------------------------------------------------------- - -def setFcProperty(searchId, dict, runInfo, newFlowCell): - children = runInfo.getAllchildren(searchId) - for element in (dict): - if (element <> '') and (dict[element] <> ''): - newFlowCell.setPropertyValue(element, children[0].attrib[dict[element]]) - -# ----------------------------------------------------------------------------- - -def setIndexLengths (readMap, newFlowCell): - - indexCount = 0 - readCount = 0 - - print(readMap) - for entry in readMap: - if readMap[entry][1] == 'Y': - indexCount += 1 - else: - readCount += 1 - - if readCount == 2: - newFlowCell.setPropertyValue("END_TYPE", "PAIRED_END") - else: - newFlowCell.setPropertyValue("END_TYPE", "SINGLE_READ") - - try: - if indexCount == 1: - newFlowCell.setPropertyValue("INDEXREAD", readMap['2'][0]) - else: - newFlowCell.setPropertyValue("INDEXREAD", '0') - except: - newFlowCell.setPropertyValue("INDEXREAD", '0') - - try: - if indexCount == 2: - newFlowCell.setPropertyValue("INDEXREAD2", readMap['3'][0]) - newFlowCell.setPropertyValue("INDEXREAD", readMap['2'][0]) - else: - newFlowCell.setPropertyValue("INDEXREAD2", '0') - except: - newFlowCell.setPropertyValue("INDEXREAD2", '0') - -# ----------------------------------------------------------------------------- - -def sanitizeString(myString): - return re.sub('[^A-Za-z0-9]+', '_', myString) - -# ----------------------------------------------------------------------------- - -def get_version(my_path): - return my_path[-4:-2] - -# ----------------------------------------------------------------------------- - -def process(transaction): - - incoming = transaction.getIncoming() - incomingPath = incoming.getAbsolutePath() - - name = incoming.getName() - # ['120726', 'M00721', '0011', 'A000000000-A1FVF'] - # NextSeq: 140729_NS500318_0002_AH0T25AGXX - - runDate, MiseqID, runningNumber, trayAndFcId = name.split("_") - tray = trayAndFcId[0] - fcId = trayAndFcId[1:] - transaction.getRegistrationContext().getPersistentMap().put(PERSISTANT_KEY_MAP, [fcId]) - - # Parse the RunInfo.xml and RunParameters.xml - runInfo = parseXmlFile(incomingPath + '/' + RUNINFO) - runParameters = parseXmlFile(incomingPath + '/' + RUNPARAMETERS) - - # get the number of lanes - maxLanes = runInfo.getAllchildren('FlowcellLayout')[0].attrib[RUNINFO_XML['LANECOUNT']] - - foundSamples = searchSample(transaction, fcId) - # if flow cell already exists then just get it for an update - if foundSamples.size() > 0: - print('Already found a Flow Cell with the following name: '+ name + ". Will re-set the properties...") - newFlowCell = transaction.getSampleForUpdate(foundSamples[0].getSampleIdentifier()) - else: - # Create a new Flow Cell - newFlowCell = transaction.createNewSample(FLOWCELL_SPACE + fcId, "ILLUMINA_FLOW_CELL") - - exp = transaction.getExperiment(FLOWCELL_SPACE + FLOWCELL_PROJECT + datetime.now().strftime("%Y.%m")) - if exp == None: - exp = transaction.createNewExperiment(FLOWCELL_SPACE + FLOWCELL_PROJECT + datetime.now().strftime("%Y.%m"), - EXPERIMENT_TYPE_CODE) - newFlowCell.setExperiment(exp) - - foundLanes = searchSample(transaction, fcId + ":1") - if not foundLanes: - # Create flow lanes, but we ignore the maxLanes, as we have 4 physical lanes but only one logical lane - [registerFlowLane(lane, transaction, fcId, newFlowCell) for lane in range(1,int(1)+1)] - - run = runInfo.getAllchildren('Run')[0].attrib - RTAversion = (runParameters.getAllchildren('RTAVersion'))[0].text - addVocabularyTerm(transaction, "PIPELINE_VERSION", RTAversion) - newFlowCell.setPropertyValue("ILLUMINA_PIPELINE_VERSION", RTAversion) - - runMode = sanitizeString(runParameters.getAllchildren('Chemistry')[0].text) - addVocabularyTerm(transaction, "RUN_MODE_VOCABULARY", runMode) - newFlowCell.setPropertyValue("RUN_MODE", runMode) - - recipe_folder = (runParameters.getAllchildren('RecipeFolder'))[0].text - major_version = get_version(recipe_folder) - - # Reading out <FlowcellLayout LaneCount="1" SurfaceCount="1" SwathCount="1" TileCount="12" /> - setFcProperty('FlowcellLayout', RUNINFO_XML, runInfo, newFlowCell) - - sequencer = runInfo.getAllchildren('Instrument') - newFlowCell.setPropertyValue("SEQUENCER", sequencer[0].text) - newFlowCell.setPropertyValue("FLOW_CELL_SEQUENCED_ON", createOpenbisTimeStamp(incomingPath + '/' + RUNPARAMETERS)) - newFlowCell.setPropertyValue("RUN_NAME_FOLDER", name) - newFlowCell.setPropertyValue("SBS_KIT", major_version) - - readMap = {} - reads = runInfo.getAllchildren('Reads') - read = reads[0].findall('Read') - - for r in read: - cycles = r.get('NumCycles', 'str') - number = r.get('Number', 'str') - isIndexed = r.get('IsIndexedRead', 'str') - readMap[number] = [cycles, isIndexed] - - # example of readMap: {'1': ['151', 'N'], '2': ['8', 'Y'], '3': ['8', 'Y'], '4': ['151', 'N']} - numberOfCycles = readMap['1'][0] - addVocabularyTerm(transaction, CYCLES_VOCABULARY_NAME, numberOfCycles) - newFlowCell.setPropertyValue("CYCLES_REQUESTED_BY_CUSTOMER", numberOfCycles) - - setIndexLengths (readMap, newFlowCell) - diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/create-flowcell-nextseq/plugin.properties b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/create-flowcell-nextseq/plugin.properties deleted file mode 100644 index 8131d29f94d90fcb7a6dec10f068a2d68f6f0828..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/create-flowcell-nextseq/plugin.properties +++ /dev/null @@ -1,12 +0,0 @@ -# -# Drop box for creating a flow cell -# -# Variables: -# incoming-root-dir -# Path to the directory which contains incoming directories for drop boxes. -incoming-dir = ${incoming-root-dir}/create-flowcell-nextseq -incoming-data-completeness-condition = marker-file -top-level-data-set-handler = ch.systemsx.cisd.etlserver.registrator.api.v2.JythonTopLevelDataSetHandlerV2 -script-path = create-flow-cell-nextseq.py -storage-processor = ch.systemsx.cisd.etlserver.DefaultStorageProcessor - diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/create-flowcell/create-flowcell.py b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/create-flowcell/create-flowcell.py deleted file mode 100644 index 9ab05190fe88bd8b1e14c50c181c46f4dfa9ffb4..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/create-flowcell/create-flowcell.py +++ /dev/null @@ -1,309 +0,0 @@ -''' -@copyright: -2015 ETH Zuerich, SIS - -@license: -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - -http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. - -@description: -Parses the two Illumina provided files 'RunParameters.xml' / 'runParameters.xml -'and 'RunInfo.xml' and creates one Sample of type 'ILLUMINA_FLOW_CELL' -and sets Sample properties from those two XML files. Additionally the -number of lanes are read out and are created as contained samples of -type 'ILLUMINA_FLOW_LANE'. - -@note: -print statements go to: <openBIS_HOME>/datastore_server/log/startup_log.txt - -@author: -Manuel Kohler -''' - -import os -import shutil -import re -from time import * -from datetime import * -import xml.etree.ElementTree as etree -from ch.systemsx.cisd.openbis.generic.shared.api.v1.dto import SearchCriteria -from ch.systemsx.cisd.common.mail import EMailAddress - -# The following module is located in the path defined in the datastore_server.conf -# Look for: -Dpython.path} -from gfb_utils import * - -RUNPARAMETERS = 'RunParameters.xml' -ALTERNATIVE_RUNPARAMETERS = 'runParameters.xml' -RUNINFO = 'RunInfo.xml' -FLOWCELL_SPACE='/BSSE_FLOWCELLS/' -FLOWCELL_PROJECT='FLOWCELLS/' -EXPERIMENT_TYPE_CODE='HT_SEQUENCING' -CYCLES_VOCABULARY_NAME = "CYCLES" - -# Mapping between XML file naming and openBIS properties - -RUNINFO_XML = {'LANECOUNT':'LaneCount', 'SURFACECOUNT':'SurfaceCount', - 'SWATHCOUNT':'SwathCount', 'TILECOUNT':'TileCount'} -RUNPARAMETERS_XML = {'FLOWCELL':'Flowcell', 'RTAVERSION':'RTAVersion', - 'CONTROLLANE':'ControlLane', 'SBS':'Sbs', 'INDEX':'Index', - 'CYCLES_REQUESTED_BY_CUSTOMER':'Read1', 'PE':'Pe', 'RUN_MODE': 'RunMode', - 'CONTROL_SOFTWARE_VERSION': 'ApplicationVersion'} - -PERSISTENT_KEY_MAP = "persistent_key_map" - - -class parseXmlFile: - - def __init__(self, xmlFile): - self.xmlFile = xmlFile - self.tree = etree.parse(self.xmlFile) - self.root = self.tree.getroot() - - - def getXmlElement (self, elementName): - ''' - Returns the text value of a given XML element - ''' - for e in self.root.getchildren(): - element = e.find(elementName) - if element is None: - return 'None' - else: - return element.text - - - def getAllchildren (self, elementName): - ''' - finds all children of a given XML Element and returns them as list - ''' - for e in self.root.getchildren(): - # the '//' means look recursively for all children not only direct ones - childList = self.tree.findall('.//' + elementName) - return childList - - -def registerFlowLane(a_lane, transaction, name, newFlowCell): - ''' - Registers a new Flow lane - ''' - newFlowLane = transaction.createNewSample(FLOWCELL_SPACE + name + ':' + str(a_lane), "ILLUMINA_FLOW_LANE") - newFlowLane.setPropertyValue('CONCENTRATION_FLOWLANE', str(0)) - newFlowLane.setContainer(newFlowCell) - - -def addVocabularyTerm(transaction, vocabularyName, vocabularyCode): - modifiableVocabulary = transaction.getVocabularyForUpdate(vocabularyName) - if not (modifiableVocabulary.containsTerm(vocabularyCode)): - ordinals = [] - terms = modifiableVocabulary.getTerms() - for term in terms: - ordinals.append(term.getOrdinal()) - - newOrdinal = max(ordinals)+1; - - newTerm = transaction.createNewVocabularyTerm(); - newTerm.setCode(vocabularyCode) - newTerm.setOrdinal(newOrdinal) - modifiableVocabulary.addTerm(newTerm) - - -def send_email(mailClient, persistent_map): - - replyTo = EMailAddress("no-reply@bsse.ethz.ch") - fromAddress = replyTo - manuel = EMailAddress("manuel.kohler@id.ethz.ch") - ina = EMailAddress("ina.nissen@bsse.ethz.ch") - christian = EMailAddress("christian.beisel@bsse.ethz.ch") - katja = EMailAddress("katja.eschbach@bsse.ethz.ch") - philippe = EMailAddress("philippe.demougin@unibas.ch") - elodie = EMailAddress("belodie@ethz.ch") - - subject = "Automatically created new " + persistent_map[1] + " flow cell " + persistent_map[0] + " in openBIS" - body = "A new run got started with flow cell: " + persistent_map [0] + "\nHave a good day!" - mailClient.sendEmailMessage(subject, body, replyTo, fromAddress, ina, katja, christian, - philippe, manuel, elodie); - - -def post_storage(context): - mailClient = context.getGlobalState().getMailClient() - persistent_map = context.getPersistentMap().get(PERSISTENT_KEY_MAP) - send_email(mailClient, persistent_map) - - -def searchSample(transaction, sampleName): - - search_service = transaction.getSearchService() - sc = SearchCriteria() - sc.addMatchClause(SearchCriteria.MatchClause.createAttributeMatch(SearchCriteria.MatchClauseAttribute.CODE, sampleName)); - foundSamples = search_service.searchForSamples(sc) - return foundSamples - - -def setFcProperty(searchId, my_dict, runInfo, newFlowCell): - children = runInfo.getAllchildren(searchId) - for element in (my_dict): - if (element != '') and (my_dict[element] != ''): - newFlowCell.setPropertyValue(element, children[0].attrib[my_dict[element]]) - - -def set_index_lengths (readMap, newFlowCell): - - indexCount = 0 - readCount = 0 - - for entry in readMap: - if readMap[entry][1] == 'Y': - indexCount += 1 - else: - readCount += 1 - - if readCount == 2: - newFlowCell.setPropertyValue("END_TYPE", "PAIRED_END") - else: - newFlowCell.setPropertyValue("END_TYPE", "SINGLE_READ") - - try: - if indexCount == 1: - newFlowCell.setPropertyValue("INDEXREAD", readMap['2'][0]) - else: - newFlowCell.setPropertyValue("INDEXREAD", '0') - except: - newFlowCell.setPropertyValue("INDEXREAD", '0') - - try: - if indexCount == 2: - newFlowCell.setPropertyValue("INDEXREAD2", readMap['3'][0]) - newFlowCell.setPropertyValue("INDEXREAD", readMap['2'][0]) - else: - newFlowCell.setPropertyValue("INDEXREAD2", '0') - except: - newFlowCell.setPropertyValue("INDEXREAD2", '0') - - -def sanitizeString(myString): - return re.sub('[^A-Za-z0-9]+', '_', myString) - - -def get_version(my_path): - return my_path[-4:-2] - - -def create_or_update_flowcell(transaction, fcId): - - found_samples = searchSample(transaction, fcId) - # if flow cell already exists then just get it for an update - if found_samples.size() > 0: - print('Already found a Flow Cell with the following name: ' + fcId + ". Will re-set the properties...") - new_flowcell = transaction.getSampleForUpdate(found_samples[0].getSampleIdentifier()) - else: - new_flowcell = transaction.createNewSample(FLOWCELL_SPACE + fcId, "ILLUMINA_FLOW_CELL") - exp = transaction.getExperiment(FLOWCELL_SPACE + FLOWCELL_PROJECT + datetime.now().strftime("%Y.%m")) - if exp is None: - exp = transaction.createNewExperiment(FLOWCELL_SPACE + FLOWCELL_PROJECT + - datetime.now().strftime("%Y.%m"), EXPERIMENT_TYPE_CODE) - new_flowcell.setExperiment(exp) - return new_flowcell - - -def set_run_mode(transaction, new_flowcell, run_mode): - addVocabularyTerm(transaction, "RUN_MODE_VOCABULARY", run_mode) - new_flowcell.setPropertyValue("RUN_MODE", run_mode) - -def process(transaction): - - incoming = transaction.getIncoming() - incomingPath = incoming.getAbsolutePath() - - run_id = incoming.getName() - model = get_model(run_id) - print("Auto-detected Illumina model: " + model) - - run_date, sequencer_id, running_number, tray_and_fcId = run_id.split("_") - tray = tray_and_fcId[0] - if model in [Sequencers.MISEQ]: - fc_id = tray_and_fcId - else: - fc_id = tray_and_fcId[1:] - transaction.getRegistrationContext().getPersistentMap().put(PERSISTENT_KEY_MAP, [fc_id, model]) - - # Parse the RunInfo.xml and RunParameters.xml - runInfo = parseXmlFile(os.path.join(incomingPath, RUNINFO)) - try: - runParameters = parseXmlFile(os.path.join(incomingPath, RUNPARAMETERS)) - except: - runParameters = parseXmlFile(os.path.join(incomingPath, ALTERNATIVE_RUNPARAMETERS)) - - # get the number of lanes - max_lanes = runInfo.getAllchildren('FlowcellLayout')[0].attrib[RUNINFO_XML['LANECOUNT']] - new_flowcell = create_or_update_flowcell(transaction, fc_id) - - flow_lanes = new_flowcell.getContainedSamples() - if len(flow_lanes) is 0: - if model in [Sequencers.NEXTSEQ_500]: - max_lanes = 1 - [registerFlowLane(lane, transaction, fc_id, new_flowcell) for lane in range(1,int(max_lanes)+1)] - - # NextSeq specific - if model in [Sequencers.NEXTSEQ_500]: - run_mode = sanitizeString(runParameters.getAllchildren('Chemistry')[0].text) - set_run_mode(transaction, new_flowcell, run_mode) - recipe_folder = (runParameters.getAllchildren('RecipeFolder'))[0].text - major_version = get_version(recipe_folder) - new_flowcell.setPropertyValue("SBS_KIT", major_version) - new_flowcell.setPropertyValue("CONTROL_SOFTWARE_VERSION", runParameters.getAllchildren('ApplicationVersion')[0].text) - - # MiSeq specific - if model in [Sequencers.MISEQ]: - ReagentKitBarcode = (runParameters.getAllchildren('ReagentKitBarcode'))[0].text - new_flowcell.setPropertyValue("SBS_KIT", ReagentKitBarcode) - new_flowcell.setPropertyValue("CONTROL_SOFTWARE_VERSION", runParameters.getAllchildren('ApplicationVersion')[0].text) - - # HiSeq specific - if model in HISEQ_LIST: - run_mode = sanitizeString(runParameters.getXmlElement(RUNPARAMETERS_XML['RUN_MODE'])) - new_flowcell.setPropertyValue("FLOWCELLTYPE", runParameters.getXmlElement(RUNPARAMETERS_XML['FLOWCELL'])) - new_flowcell.setPropertyValue("SBS_KIT", runParameters.getXmlElement(RUNPARAMETERS_XML['SBS'])) - new_flowcell.setPropertyValue("CONTROL_SOFTWARE_VERSION", runParameters.getXmlElement(RUNPARAMETERS_XML['CONTROL_SOFTWARE_VERSION'])) - if (new_flowcell.getPropertyValue("END_TYPE")) == "PAIRED_END": - new_flowcell.setPropertyValue("PAIRED_END_KIT", runParameters.getXmlElement(RUNPARAMETERS_XML['PE'])) - set_run_mode(transaction, new_flowcell, run_mode) - - rta_version = (runParameters.getAllchildren('RTAVersion'))[0].text - addVocabularyTerm(transaction, "PIPELINE_VERSION", rta_version) - new_flowcell.setPropertyValue("ILLUMINA_PIPELINE_VERSION", rta_version) - - # Reading out <FlowcellLayout LaneCount="1" SurfaceCount="1" SwathCount="1" TileCount="12" /> - setFcProperty('FlowcellLayout', RUNINFO_XML, runInfo, new_flowcell) - - sequencer = runInfo.getAllchildren('Instrument') - addVocabularyTerm(transaction, "SEQUENCER", sequencer[0].text) - new_flowcell.setPropertyValue("SEQUENCER", sequencer[0].text) - new_flowcell.setPropertyValue("FLOW_CELL_SEQUENCED_ON", create_openbis_timestamp(os.path.join(incomingPath, RUNINFO))) - new_flowcell.setPropertyValue("RUN_NAME_FOLDER", run_id) - - readMap = {} - reads = runInfo.getAllchildren('Reads') - read = reads[0].findall('Read') - - for r in read: - cycles = r.get('NumCycles', 'str') - number = r.get('Number', 'str') - is_indexed = r.get('IsIndexedRead', 'str') - readMap[number] = [cycles, is_indexed] - - # example of readMap: {'1': ['151', 'N'], '2': ['8', 'Y'], '3': ['8', 'Y'], '4': ['151', 'N']} - number_of_cycles = readMap['1'][0] - addVocabularyTerm(transaction, CYCLES_VOCABULARY_NAME, number_of_cycles) - new_flowcell.setPropertyValue("CYCLES_REQUESTED_BY_CUSTOMER", number_of_cycles) - - set_index_lengths(readMap, new_flowcell) \ No newline at end of file diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/create-flowcell/plugin.properties b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/create-flowcell/plugin.properties deleted file mode 100644 index dd75e75ff45741de5cf5c598ba18323d0613f284..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/create-flowcell/plugin.properties +++ /dev/null @@ -1,9 +0,0 @@ -# -# Drop box for creating a flow cell -# -incoming-dir = ${incoming-root-dir}/create-flowcell -incoming-data-completeness-condition = marker-file -top-level-data-set-handler = ch.systemsx.cisd.etlserver.registrator.api.v2.JythonTopLevelDataSetHandlerV2 -script-path = create-flowcell.py -storage-processor = ch.systemsx.cisd.etlserver.DefaultStorageProcessor -jython-version=2.7 \ No newline at end of file diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/export-meta-data/export-meta-data.py b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/export-meta-data/export-meta-data.py deleted file mode 100644 index f5253bc08749ffdd20d0faad672fc9a3765af137..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/export-meta-data/export-meta-data.py +++ /dev/null @@ -1,464 +0,0 @@ -''' -Processes each flow lane of a Sequencing run - -Expects as incoming folder: -BSSE_QGF_22266_H0W8YBGXX_1 -or -Undetermined_H0W8YBGXX - -Note: -print statements go to: ~openbis/sprint/datastore_server/log/startup_log.txt -''' - -import os -import fnmatch -import time -import shutil -import re -import subprocess -from time import * -from datetime import * -from ch.systemsx.cisd.openbis.generic.shared.api.v1.dto import SearchCriteria -from ch.systemsx.cisd.openbis.dss.generic.shared import DataSourceQueryService - -FASTQ_GZ_PATTERN = "*.fastq.gz" -METADATA_FILE_SUFFIX = "_metadata.tsv" -AFFILIATION= {'FMI': '/links/shared/dsu/dss/customers/fmi/drop-box/', - 'BIOCENTER_BASEL': '/links/shared/dsu/dss/customers/biozentrum/drop-box/', - 'NEUROSTEMX': '/links/shared/dsu/dss/customers/biozentrum/drop-box/', - 'SWISS_TPH' : '/links/shared/dsu/dss/customers/biozentrum/drop-box/'} -AFFILIATION_PROPERTY_NAME='AFFILIATION' -INDEX1='BARCODE' -INDEX2='INDEX2' -EXTERNAL_SAMPLE_NAME='EXTERNAL_SAMPLE_NAME' -INDEXREAD1='INDEXREAD' -INDEXREAD2='INDEXREAD2' -SAMPLE_TYPE = 'SAMPLE_TYPE' -SAMPLE_CODE = 'SAMPLE_CODE' -NCBI_ORGANISM_TAXONOMY='NCBI_ORGANISM_TAXONOMY' -PHIX_TAXONOMY_ID='10847' -DEFAULT_INDEX='NoIndex' -CRC32_PATH='lib/crc32' - -# ------------------------------------------------------------------------------- - -def getThreadProperties(transaction): - threadPropertyDict = {} - threadProperties = transaction.getGlobalState().getThreadParameters().getThreadProperties() - for key in threadProperties: - try: - threadPropertyDict[key] = threadProperties.getProperty(key) - except: - pass - return threadPropertyDict - -def CRC32_from_file(filename, transaction): - threadPropertyDict = getThreadProperties(transaction) - absolutePath = os.path.dirname(os.path.realpath(threadPropertyDict['script-path'])) - fullPathCrc32 = (os.path.join(absolutePath, CRC32_PATH)) - if os.path.exists(fullPathCrc32): - args = [fullPathCrc32, filename] - p = subprocess.Popen(args, stdout=subprocess.PIPE) - cksum = (p.communicate()[0]) - print("Calculated crc32 checksum for: "+ os.path.basename(filename) + " " + cksum) - else: - cksum = 0 & 0xFFFFFFFF - return cksum - -def getFileNames(path): - ''' - Gets all files matching a PATTERN in a path recursively - and returns the result as a list - ''' - matches = [] - for root, dirnames, filenames in os.walk(path): - for filename in fnmatch.filter(filenames, FASTQ_GZ_PATTERN): - matches.append(os.path.join(root, filename)) - matches.sort() - return(matches) - -def writeMetadataFile(transaction, folder_name, meta_data_file_name, sequencing_sample_properties_dict, - fcMetaDataDict, experiment, affiliation_name, fastqFileList, flowLane): - ''' - Writes a file of meta data related to one sample - ''' - - sequencing_sample_properties_list = sequencing_sample_properties_dict.keys() - sequencing_sample_properties_list.sort() - - expId = experiment.getExperimentIdentifier() - try: - meta_data_file = open(meta_data_file_name,'w') - for propertyType in sequencing_sample_properties_list: - if (propertyType in [u'FLOW_CELL_PROPERTIES']): - continue - if propertyType in [SAMPLE_TYPE] or propertyType in [SAMPLE_CODE]: - meta_data_file.write(propertyType.encode('utf-8') + "\t" + - str(sequencing_sample_properties_dict[propertyType])+ "\n") - else: - meta_data_file.write(propertyType.encode('utf-8') + "\t" + - sequencing_sample_properties_dict[propertyType].encode('utf-8').replace('\n',',') + "\n") - - meta_data_file.write("EXPERIMENT\t" + expId + "\n".encode('utf-8')) - meta_data_file.write("\nFLOWCELL PROPERTIES\n".encode('utf-8')) - fcMetaDataDict["LANE_NUMBER"] = flowLane - keys = fcMetaDataDict.keys() - keys.sort() - - sequencer_vocabulary_description = get_vocabulary_descriptions(transaction, 'SEQUENCER') - meta_data_file.write('SEQUENCER_MODEL' + "\t" + sequencer_vocabulary_description[fcMetaDataDict['SEQUENCER']].encode('utf-8') + "\n") - - for k in keys: - meta_data_file.write(k.encode('utf-8') + "\t" + fcMetaDataDict[k].encode('utf-8') + "\n") - - meta_data_file.write("\nFASTQ_FILES\n".encode('utf-8')) - for file in fastqFileList: - meta_data_file.write(os.path.basename(file) + "\t" + str(CRC32_from_file(file, transaction)) + "\n") - - except IOError: - print ('File error, could not write '+ file) - finally: - meta_data_file.close() - - destinationFolder = folder_name - #extraCopy (affiliation_name, meta_data_file_name) - #extraCopySciCore (affiliation_name, meta_data_file_name, destinationFolder) - -def create_openbis_timestamp (): - ''' - Create an openBIS conform timestamp - ''' - tz=localtime()[3]-gmtime()[3] - d=datetime.now() - return d.strftime("%Y-%m-%d %H:%M:%S GMT"+"%+.2d" % tz+":00") - -# ------------------------------------------------------------------------------- - - def sortedDictValues(adict): - ''' - Given a dictionary it returns the values of this dict sorted - by the keys - d = {2:1, 4:1, 1:1, 100:3, 3:5} - sortedDictValues(d) - [1, 1, 5, 1, 3] - ''' - keys = adict.keys() - keys.sort() - return map(adict.get, keys) - -# ------------------------------------------------------------------------------- - -def extraCopy (affiliation_name, path): - ''' - @deprecated: replaced with extraCopySciCore - Handles the extra copies of the data for transfer with datamover via the - bc2 network to the FMI and BIOCENTER - For the BIOCENTER there is a folder created in which all data gets into - ''' - if (affiliation_name in AFFILIATION): - if (affiliation_name == 'BIOCENTER_BASEL' or affiliation_name == 'NEUROSTEMX' ): - dirname = AFFILIATION[affiliation_name] + datetime.now().strftime("%Y-%m-%d") - if not os.path.exists(dirname): - os.mkdir(dirname) - shutil.copy(path, dirname) - else: - shutil.copy(path, AFFILIATION[affiliation_name]) - -# ------------------------------------------------------------------------------- - -def extraCopySciCore (affiliation_name, filePath, destinationFolder=""): - ''' - Handles the extra copies of the data for transfer with datamover for SCICORE - ''' - - #dropBoxFolder = '/tmp/scicore' - dropBoxFolder = '/links/shared/dsu/dss/customers/biozentrum_scicore/drop-box' - basename = os.path.basename(filePath) - - print("extraCopySciCore") - print basename - print affiliation_name - - if (affiliation_name in ['BIOCENTER_BASEL', 'NEUROSTEMX', 'SWISS_TPH']): - dirname = os.path.join(dropBoxFolder, destinationFolder) - if not os.path.exists(dirname): - os.mkdir(dirname) - print("COPYING " + filePath + " TO " + dirname) - shutil.copy(filePath, dirname) - -# ------------------------------------------------------------------------------- - -def get_sample_properties (transaction, sample): - - sample_properties_dict = {} - # returns Map<String, String> - sample_properties = sample.getSample().getProperties() - sequencing_sample_type = sample.getSampleType() - sequencing_sample_code = sample.getCode() - sample_properties_dict[SAMPLE_TYPE] = sequencing_sample_type - sample_properties_dict[SAMPLE_CODE] = sequencing_sample_code - - for property in sample_properties: - code = property.getPropertyType().getSimpleCode() - sample_properties_dict[code] = property.tryGetAsString() - - return sample_properties_dict - -# ------------------------------------------------------------------------------- - -def searchParents (search_service, parents): - - # search for the parents - sc = SearchCriteria() - # set the Search Criteria to an OR condition, default is AND - sc.setOperator(SearchCriteria.SearchOperator.MATCH_ANY_CLAUSES) - # Get the codes for all parents - for parent in parents: - parentSubCode = parent.getSubCode() - sc.addMatchClause(SearchCriteria.MatchClause.createAttributeMatch(SearchCriteria.MatchClauseAttribute.CODE, parentSubCode)); - # all parents of the flow lane - foundParents = search_service.searchForSamples(sc) - - return foundParents - -# ------------------------------------------------------------------------------- - -def sanitizeString(myString): - return re.sub('[^A-Za-z0-9]+', '_', myString) - -# ------------------------------------------------------------------------------- - -def searchSample (sample_code, search_service): - sc = SearchCriteria() - print('Searching sample: '+ str(sample_code)) - sc.addMatchClause(SearchCriteria.MatchClause.createAttributeMatch(SearchCriteria.MatchClauseAttribute.CODE, sample_code)); - foundSamples = search_service.searchForSamples(sc) - return foundSamples - - -def renameFiles (fastq_files, undetermined, flow_cell_id): - - newFastqFileList = [] - for file in fastq_files: - if undetermined: - folder = os.path.dirname(file) - fileName = os.path.basename(file) - filepart, suffix = fileName.split('.',1) - new_file = folder + "/" + flow_cell_id + '_' + filepart + "." + suffix - print ("Renaming file " + file + " to " + new_file) - os.rename(file, new_file) - else: - new_file = file - newFastqFileList.append(new_file) - return newFastqFileList - -# ------------------------------------------------------------------------------- - -def put_files_to_dataset (transaction, dataSet, fastq_files, folder_name, flow_cell_id, affiliation_name, undetermined): - - for file in fastq_files: - extraCopySciCore (affiliation_name, file, folder_name) - transaction.moveFile(file, dataSet, folder_name) - -# ------------------------------------------------------------------------------- - -def split_incoming_folder_name (name): - split=name.split("_") - - # expected incoming Name, e.g.: BSSE_QGF_22266_H0W8YBGXX_1 - if (len(split) == 5): - sample_code = '-'.join([split[0], split[1], split[2]]) - flowCellId = split[3] - flowLane = split[-1] - undetermined = False - - # expected Undetermined_H0W8YBGXX - if (len(split) == 2): - sample_code = '' - flowCellId = split[-1] - flowLane = "1" - undetermined = True - - incoming_sample = flowCellId + ':' + flowLane - return sample_code, flowCellId, flowLane, incoming_sample, undetermined - -# ------------------------------------------------------------------------------- - -def get_vocabulary_descriptions (transaction, vocabulary_name): - vocabulary_descriptions_dict = {} - vocabulary = transaction.getVocabulary(vocabulary_name) - vocabulary_terms = vocabulary.getTerms() - for term in vocabulary_terms: - vocabulary_descriptions_dict[term.getCode()] = term.getDescription() - return vocabulary_descriptions_dict - -# ------------------------------------------------------------------------------- - -def process(transaction): - - undetermined = False - - print("\n" + str(datetime.now())) - - incomingPath = transaction.getIncoming().getAbsolutePath() - name = transaction.getIncoming().getName() - # Get the search service - search_service = transaction.getSearchService() - - def searchSampleInSpace (type, search_service): - - spaceCode = "UNI_BASEL_GAGNEUX" - sc = SearchCriteria() -# print('Searching sample: '+ str(code)) - sc.addMatchClause(SearchCriteria.MatchClause.createAttributeMatch(SearchCriteria.MatchClauseAttribute.SPACE, spaceCode)); - sc.addMatchClause(SearchCriteria.MatchClause.createAttributeMatch(SearchCriteria.MatchClauseAttribute.TYPE, type)); - foundSamples = search_service.searchForSamples(sc) - return foundSamples - - samples = searchSampleInSpace("ILLUMINA_SEQUENCING", search_service) - print(samples.size()) - - - - - for sample in samples[0:5]: - - sequencing_sample_properties_dict = get_sample_properties (transaction, sample) - meta_data_file_name = sequencing_sample_properties_dict["SAMPLE_CODE"] + METADATA_FILE_SUFFIX - - sampleName = sequencing_sample_properties_dict["SAMPLE_CODE"] - - print(meta_data_file_name) - print(sequencing_sample_properties_dict) - - flowCellId = "150109_D00535_0042_AHB2K0ADXX" - - flowcell_sample_immutable = searchSample (flowCellId, search_service) - fcMetaDataDict = get_sample_properties(transaction, flowcell_sample_immutable[0]) - - experiment = sample.getExperiment() - affiliation_name = "dummy" - flowLane = "1" - newFastqFiles = ["/tmp/hello.txt", "/tmp/bio.txt"] - - meta_data_file_path = '/tmp/metadata_'+ sampleName - - DATA_SOURCE = "pathinfo_dev" - QUERY = """ - SELECT ds.code as "data_set_code", dsf.* - FROM data_sets ds, data_set_files dsf - WHERE ds.code = ?{1} AND dsf.dase_id = ds.id - """ - - dsqs = DataSourceQueryService() - - dsqs.select(DATA_SOURCE, QUERY) - #results = queryService.select(DATA_SOURCE, QUERY, ['20150108225105804-60446532']) - print(results) - - - writeMetadataFile(transaction, sampleName, meta_data_file_path, sequencing_sample_properties_dict, - fcMetaDataDict, experiment, affiliation_name, newFastqFiles, flowLane) - -# sample_code, flowCellId, flowLane, incoming_sample, undetermined = split_incoming_folder_name (name) -# -# # get all fastqs -# fastq_files=getFileNames(incomingPath) -# -# # BSSE-QGF-22266-H0W8YBGXX-1-654-BC3-TTAGGC_S1_L001_R1_001.fastq.gz -# # BSSE-QGF-22051-H0T25AGXX-1-1-1-TAAGGCGA-CTCTCTAT_S46_L001_R1_001.fastq.gz -# first_fastq_file = os.path.basename(fastq_files[0]) -# -# flowcell_sample_immutable = searchSample (flowCellId, search_service) -# fcMetaDataDict = get_sample_properties(transaction, flowcell_sample_immutable[0]) -# foundLane = searchSample (incoming_sample, search_service) -# -# # there should be only one sample because it is unique within one Flow Cell -# if (len(foundLane) > 1): -# raise Exception("More than one sample found! No unique code: " + incoming_sample) -# elif (len(foundLane) == 0): -# raise Exception("No matching sample found for: " + incoming_sample) -# else : -# sample = foundLane[0].getSample() -# parents = sample.getParents() -# -# # Create a data set and set type -# dataSet = transaction.createNewDataSet("FASTQ_GZ") -# dataSet.setMeasuredData(False) -# dataSet.setPropertyValue(INDEX1, DEFAULT_INDEX) -# dataSet.setPropertyValue(INDEX2, DEFAULT_INDEX) -# dirName = transaction.createNewDirectory(dataSet,name) -# -# if not undetermined: -# newFastqFiles = fastq_files -# foundSample = searchSample (sample_code, search_service) -# sequencing_sample = foundSample[0].getSample() -# experiment = sequencing_sample.getExperiment() -# sequencing_sample_code = sequencing_sample.getCode() -# print("sequencing_sample_code: "+ sequencing_sample_code) -# -# sequencing_sample_properties_dict = get_sample_properties (transaction, foundSample[0]) -# -# if (INDEX1 in sequencing_sample_properties_dict) and (fcMetaDataDict[INDEXREAD1] > 0): -# #print(sequencing_sample_properties_dict[INDEX1]) -# dataSet.setPropertyValue(INDEX1, sequencing_sample_properties_dict[INDEX1]) -# if (INDEX2 in sequencing_sample_properties_dict) and (fcMetaDataDict[INDEXREAD2] > 0): -# dataSet.setPropertyValue(INDEX2, sequencing_sample_properties_dict[INDEX2]) -# dataSet.setPropertyValue(EXTERNAL_SAMPLE_NAME, sequencing_sample_properties_dict[EXTERNAL_SAMPLE_NAME]) -# -# if (AFFILIATION_PROPERTY_NAME in sequencing_sample_properties_dict): -# affiliation_name = sequencing_sample_properties_dict[AFFILIATION_PROPERTY_NAME] -# -# filepart, suffix = first_fastq_file.split('.',1) -# meta_data_file_name = filepart.rsplit('_',2)[0] + METADATA_FILE_SUFFIX -# # get a file from the IDataSetRegistrationTransaction so it is automatically part of the data set -# meta_data_file_path = transaction.createNewFile(dataSet, name, meta_data_file_name) -# writeMetadataFile(transaction, name, meta_data_file_path, sequencing_sample_properties_dict, -# fcMetaDataDict, experiment, affiliation_name, fastq_files, flowLane) -# -# # Undetermined Files -# else: -# affiliation_name = "" -# affiliation_for_Undetermined = "" -# newFastqFiles = [] -# lane_parents = searchParents (search_service, parents) -# newFastqFiles = renameFiles(fastq_files, undetermined, flowCellId) -# for parent in lane_parents: -# sequencing_sample_properties_dict = get_sample_properties (transaction, parent) -# parent_sample = parent.getSample() -# sample_code = parent_sample.getCode() -# experiment = parent_sample.getExperiment() -# if (AFFILIATION_PROPERTY_NAME in sequencing_sample_properties_dict): -# affiliation_name = sequencing_sample_properties_dict[AFFILIATION_PROPERTY_NAME] -# -# # Special Sample Types without index (e.g. ILLUMINA_SEQUENCING_NEUROSTEMX_SINGLECELL) are caught here. -# # as those samples do not have a NCBI ORGANISM TAXONOMY -# if NCBI_ORGANISM_TAXONOMY not in sequencing_sample_properties_dict: -# print(sample_code + ": Processing Sample without NCBI ORGANISM TAXONOMY: ILLUMINA_SEQUENCING_NEUROSTEMX_SINGLECELL") -# meta_data_file_path = transaction.createNewFile(dataSet, name, sample_code + '_' + flowCellId + '_' + first_fastq_file.split('.')[0] + METADATA_FILE_SUFFIX) -# writeMetadataFile(transaction, name, meta_data_file_path, sequencing_sample_properties_dict, -# fcMetaDataDict, experiment, affiliation_name, newFastqFiles, flowLane) -# affiliation_for_Undetermined = affiliation_name -# -# elif (INDEX1 not in sequencing_sample_properties_dict) and (INDEX2 not in sequencing_sample_properties_dict) and \ -# (sequencing_sample_properties_dict[NCBI_ORGANISM_TAXONOMY] != PHIX_TAXONOMY_ID): -# print('NONINDEXED sample and Taxonomy id is NOT' + PHIX_TAXONOMY_ID +', probably a pool: ' + sample_code) -# meta_data_file_path = transaction.createNewFile(dataSet, name, sample_code + '_' + flowCellId + '_' + first_fastq_file.split('.')[0] + METADATA_FILE_SUFFIX) -# writeMetadataFile(transaction, name, meta_data_file_path, sequencing_sample_properties_dict, -# fcMetaDataDict, experiment, affiliation_name, newFastqFiles, flowLane) -# affiliation_for_Undetermined = affiliation_name -# # PARENTS: -# else: -# # Create Parent Meta data -# print(sample_code + ": Create parent meta data file") -# meta_data_file_path = transaction.createNewFile(dataSet, name, 'PARENT_' + sample_code + '_' + flowCellId + METADATA_FILE_SUFFIX) -# writeMetadataFile(transaction, name, meta_data_file_path, sequencing_sample_properties_dict, -# fcMetaDataDict, experiment, affiliation_name, [], flowLane) -# continue -# -# put_files_to_dataset (transaction, dataSet, newFastqFiles, name, flowCellId, affiliation_for_Undetermined, undetermined) -# -# if foundLane.size() > 0: -# sa = transaction.getSampleForUpdate(foundLane[0].getSampleIdentifier()) -# sa.setPropertyValue("DATA_TRANSFERRED", create_openbis_timestamp()) -# dataSet.setSample(foundLane[0]) diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/export-meta-data/lib/crc32 b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/export-meta-data/lib/crc32 deleted file mode 100755 index ffaf277227c6dfb0dae3fbe751d9db158bd5ae29..0000000000000000000000000000000000000000 Binary files a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/export-meta-data/lib/crc32 and /dev/null differ diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/export-meta-data/plugin.properties b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/export-meta-data/plugin.properties deleted file mode 100644 index 6e3d93e5e91dd176dec76e66af13591e5b639f5e..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/export-meta-data/plugin.properties +++ /dev/null @@ -1,12 +0,0 @@ -# -# Drop box for registering a flow cell output as a data set -# -# Variables: -# incoming-root-dir -# Path to the directory which contains incoming directories for drop boxes. -incoming-dir = ${incoming-root-dir}/export-meta-data -incoming-data-completeness-condition = marker-file -top-level-data-set-handler = ch.systemsx.cisd.etlserver.registrator.api.v2.JythonTopLevelDataSetHandlerV2 -script-path = export-meta-data.py -storage-processor = ch.systemsx.cisd.etlserver.DefaultStorageProcessor - diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/read-demultiplex-stats-miseq/plugin.properties b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/read-demultiplex-stats-miseq/plugin.properties deleted file mode 100644 index 2fcbb9bec082d6dbff83045f60819beff1c599ae..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/read-demultiplex-stats-miseq/plugin.properties +++ /dev/null @@ -1,10 +0,0 @@ -# -# Variables: -# incoming-root-dir -# Path to the directory which contains incoming directories for drop boxes. -incoming-dir = ${root}/dss/read-demultiplex-stats-miseq -incoming-data-completeness-condition = marker-file -top-level-data-set-handler = ch.systemsx.cisd.etlserver.registrator.api.v2.JythonTopLevelDataSetHandlerV2 -script-path = read-demultiplex-stats-miseq.py -storage-processor = ch.systemsx.cisd.etlserver.DefaultStorageProcessor - diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/read-demultiplex-stats-miseq/read-demultiplex-stats-miseq.py b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/read-demultiplex-stats-miseq/read-demultiplex-stats-miseq.py deleted file mode 100755 index 51e976dcc2e88c418c7083be352a77e735257106..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/read-demultiplex-stats-miseq/read-demultiplex-stats-miseq.py +++ /dev/null @@ -1,594 +0,0 @@ -''' - @copyright: 2012 ETH Zuerich, CISD - - @license: - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - - -@author: Manuel Kohler - -XML Structur which is processed: - -<?xml version="1.0"?> -<Summary> - <Lane index="8"> - <Sample index="lane8"> - <Barcode index="Undetermined"> - <Tile index="1101"> - <Read index="1"> - <Raw> - <Yield>1921250</Yield> - <YieldQ30>949680</YieldQ30> - <ClusterCount>38425</ClusterCount> - <ClusterCount0MismatchBarcode>0</ClusterCount0MismatchBarcode> - <ClusterCount1MismatchBarcode>0</ClusterCount1MismatchBarcode> - <QualityScoreSum>40995660</QualityScoreSum> - </Raw> - <Pf> - <Yield>945450</Yield> - <YieldQ30>854815</YieldQ30> - <ClusterCount>18909</ClusterCount> - <ClusterCount0MismatchBarcode>0</ClusterCount0MismatchBarcode> - <ClusterCount1MismatchBarcode>0</ClusterCount1MismatchBarcode> - <QualityScoreSum>33815505</QualityScoreSum> - </Pf> - </Read> - </Tile> - [...] - -@note: -print statements go to: <openBIS_HOME>/datastore_server/log/startup_log.txt -''' - -import time -import os -import fnmatch -import xml.etree.ElementTree as etree -from ch.systemsx.cisd.openbis.generic.shared.api.v1.dto import SearchCriteria -from ch.systemsx.cisd.openbis.generic.shared.api.v1.dto import SearchSubCriteria - - -class parseXmlFile: - - def __init__(self, xmlFile): - self.xmlFile = xmlFile - self.tree = etree.parse(self.xmlFile) - self.root = self.tree.getroot() - -# ----------------------------------------------------------------------------- - -class qcValues(object): - def __init__(self, Yield = 0, YieldQ30 = 0, ClusterCount = 0, - ClusterCount0MismatchBarcode = 0, ClusterCount1MismatchBarcode = 0, - QualityScoreSum = 0, *args, **kwargs): - self.Yield = Yield - self.YieldQ30 = YieldQ30 - self.ClusterCount = ClusterCount - self.ClusterCount0MismatchBarcode = ClusterCount0MismatchBarcode - self.ClusterCount1MismatchBarcode = ClusterCount1MismatchBarcode - self.QualityScoreSum = QualityScoreSum - - def __str__(self): - return "Yield: %s, YieldQ30: %s, ClusterCount: %s, ClusterCount0MismatchBarcode: %s," \ - " CusterCount1MismatchBarcode: %s, QualityScoreSum: %s" \ - % (self.Yield, self.YieldQ30, self.ClusterCount, self.ClusterCount0MismatchBarcode, - self.ClusterCount1MismatchBarcode, self.QualityScoreSum) - -class sample: - def __init__(self, Lane = 0, Sample = '', Barcode = '', Tile = '', Read = '', rawqc = qcValues([]), - pfqc = qcValues([]), *args, **kwargs): - self.Lane = Lane - self.Sample = Sample - self.Barcode = Barcode - self.Tile = Tile - self.Read = Read - self.rawqc = rawqc - self.pfqc = pfqc - - def __str__(self): - return "Lane: %s, Sample: %s, Barcode: %s, Tile: %s, Read: %s, rawqc: %s, pfqc: %s" \ - % (self.Lane, self.Sample, self.Barcode, self.Tile, self.Read, self.rawqc, self.pfqc) - -# ----------------------------------------------------------------------------- - -class Statistics: - def __init__(self, lane = 0, sampleName = "", index1 = "NoIndex", index2 = "NoIndex", pfYieldSum = 0, - rawYieldSum = 0, pfPercentage = 0.0, rawReadsSum = 0, pfReadsSum = 0, - pfYieldQ30Sum = 0, qualityScoreSum = 0, rawPercentageReadsPerLane = 0.0, - pfYieldQ30Percentage = 0.0, pfsumQualityScore = 0, pfmeanQualityScore = 0.0, - pfReadsSumWithoutUndetermined = 0): - self.lane = lane - self.sampleName = sampleName - self.index1 = index1 - self.index2 = index2 - self.pfYieldSum = pfYieldSum - self.rawYieldSum = rawYieldSum - self.pfPercentage = pfPercentage - self.rawReadsSum = rawReadsSum - self.pfReadsSum = pfReadsSum - self.pfYieldQ30Sum = pfYieldQ30Sum - self.qualityScoreSum = qualityScoreSum - self.rawPercentageReadsPerLane = rawPercentageReadsPerLane - self.pfYieldQ30Percentage = pfYieldQ30Percentage - self.pfsumQualityScore = pfsumQualityScore - self.pfmeanQualityScore = pfmeanQualityScore - self.pfReadsSumWithoutUndetermined = pfReadsSumWithoutUndetermined - - def __str__(self): - return "lane: %s, sampleName: %s, index1: %s, index2: %s, pfYieldSum: %s, pfPercentage: %s," \ - " rawReadsSum: %s, pfReadsSum: %s," \ - " rawPercentageReadsPerLane: %s, pfYieldQ30Percentage: %s," \ - " pfmeanQualityScore: %s" \ - % (self.lane, self.sampleName, self.index1, self.index2, self.pfYieldSum, self.pfPercentage, - self.rawReadsSum, self.pfReadsSum, - self.rawPercentageReadsPerLane, self.pfYieldQ30Percentage, self.pfmeanQualityScore) - - def calculatePercentagePF (self, rawYield = 0, pfYield = 1): - try: - return round(float(pfYield) / float(rawYield) * 100, 2) - except: - return 0.0 - - def calulateMeanQualityScore (self, pfqualityScoreSum = 0, pfYield = 1): - try: - return round (float(pfqualityScoreSum) / float(pfYield), 2) - except: - return 0.0 - - def calculateYieldQ30Percentage (self, pfYieldQ30 = 0, pfYield = 1): - try: - return round (float(pfYieldQ30) / float(pfYield) * 100, 2) - except: - return 0.0 - -class lane_statistics: - def __init__(self): - self.complete_lane_statistic = Statistics() - - def calculate_complete_lane_statistic(self, list_of_statistics): - - sample_number = len(list_of_statistics) - - for stat in list_of_statistics: - self.complete_lane_statistic.lane = stat.lane - self.complete_lane_statistic.pfYieldSum += stat.pfYieldSum - self.complete_lane_statistic.rawYieldSum += stat.rawYieldSum - self.complete_lane_statistic.pfReadsSum += stat.pfReadsSum - self.complete_lane_statistic.rawReadsSum += stat.rawReadsSum - self.complete_lane_statistic.pfPercentage += stat.pfPercentage - self.complete_lane_statistic.pfYieldQ30Percentage += stat.pfYieldQ30Percentage - self.complete_lane_statistic.pfmeanQualityScore += stat.pfmeanQualityScore - - if stat.index1 != "Undetermined": - self.complete_lane_statistic.pfReadsSumWithoutUndetermined += stat.pfReadsSum - - self.complete_lane_statistic.pfPercentage = self.complete_lane_statistic.pfPercentage / sample_number - self.complete_lane_statistic.pfYieldQ30Percentage = self.complete_lane_statistic.pfYieldQ30Percentage / sample_number - self.complete_lane_statistic.pfmeanQualityScore = self.complete_lane_statistic.pfmeanQualityScore/ sample_number - - return self.complete_lane_statistic - - -# ----------------------------------------------------------------------------- - -def xml2Memory(DEMULTIPLEX_XML): - ''' - Parse the XML file and put all values in a memory structure: - List of: - lane, sample, barcode, tile, read, qcRawList, qcPfList - ''' - - RAW_TAG = "Raw" - PF_TAG = "Pf" - - sampleList = [] - - xml = parseXmlFile(DEMULTIPLEX_XML) - r = xml.tree.getroot() - - for lane in r.getchildren(): - for mysample in lane: - for barcode in mysample: - for tile in barcode: - for read in tile: - - qcRaw = qcValues() - qcPf = qcValues() - qcRawList = [] - qcPfList = [] - - # Read out the Raw fields - raw = read.find(RAW_TAG) - for child in raw.getchildren(): - # equivalent to a Java reflection - setattr(qcRaw, child.tag, int(child.text)) - - # Read out the Pf fields - pf = read.find(PF_TAG) - for child in pf.getchildren(): - # equivalent to a Java reflection - setattr(qcPf, child.tag, int(child.text)) - - qcRawList.append(qcRaw) - qcPfList.append(qcPf) - - singleElement = sample () - - setattr(singleElement, lane.tag, lane.attrib) - setattr(singleElement, mysample.tag, mysample.attrib) - setattr(singleElement, barcode.tag, barcode.attrib) - setattr(singleElement, tile.tag, tile.attrib) - setattr(singleElement, read.tag, read.attrib) - singleElement.rawqc = qcRawList - singleElement.pfqc = qcPfList - - sampleList.append(singleElement) - return sampleList - -# ----------------------------------------------------------------------------- - -def calculateStatistics(listofSamples): - ''' - Structure of 'listofSamples' - Lane: {'index': '6'}, Sample: {'index': 'BSSE-QGF-3524_C0NKPACXX'}, Barcode: {'index': 'TGACCA'}, - Tile: {'index': '2307'}, Read: {'index': '1'}, rawqc:<mem>, pfqc:<mem> - ''' - - numberOfTiles = len(listofSamples) - - tile = sample() - raw = qcValues () - pf = qcValues () - stats = Statistics() - - for tile in listofSamples: - raw = tile.rawqc[0] - pf = tile.pfqc[0] - - stats.pfYieldSum += pf.Yield - stats.rawYieldSum += raw.Yield - stats.rawReadsSum += raw.ClusterCount - stats.pfReadsSum += pf.ClusterCount - stats.pfYieldQ30Sum += pf.YieldQ30 - stats.qualityScoreSum += pf.QualityScoreSum - - # Can not be set here, needs to be calculated later - #stats.rawPercentageReadsPerLane = rawPercentageReadsPerLane - stats.pfPercentage = stats.calculatePercentagePF(stats.rawYieldSum, stats.pfYieldSum) - stats.pfYieldQ30Percentage = stats.calculateYieldQ30Percentage(stats.pfYieldQ30Sum, stats.pfYieldSum) - stats.pfmeanQualityScore = stats.calulateMeanQualityScore(stats.qualityScoreSum, stats.pfYieldSum) - stats.lane = listofSamples[0].Lane.values()[0] - stats.sampleName = listofSamples[0].Sample.values()[0] - index = listofSamples[0].Barcode.values()[0] - try: - stats.index1, stats.index2 = index.split("-") - except: - stats.index1 = index - return stats - -# ----------------------------------------------------------------------------- - - -def rawReadSumPerSamples(stat): - ''' - Creates a dictionary with the lanes as keys - The values are a list where the elements are a dictionary again. - This dictionary has the sample names as key and the RawReadSum as value. - - Example: - {4': [{'BSSE-QGF-3434_C0NKPACXX': 248999502}], '7': [{'lane7': 123921974}, - {'BSSE-QGF-3527_C0NKPACXX': 38587703}, {'BSSE-QGF-3529_C0NKPACXX': 30130893}, - {'BSSE-QGF-3528_C0NKPACXX': 34519296}, {'BSSE-QGF-3526_C0NKPACXX': 34980179}]} - ''' - - laneDict = {} - for e in stat: - if e.lane not in laneDict: - laneDict[e.lane] = [{e.sampleName:e.rawReadsSum}] - else: - laneDict[e.lane].append({e.sampleName:e.rawReadsSum}) - return laneDict - -# ----------------------------------------------------------------------------- - -def createSumRawReadsPerLane(laneDict): - ''' - Creates a dictionary with lane as key and sum of Raw Reads as value: - {'1': 183180877, '3': 244968562, '2': 191496395, '5': 193466239, '4': 248999502, - '7': 262140045, '6': 257136830, '8': 209948449} - ''' - sumRawReadsDict = {} - for lane in laneDict: - sumRawReads = 0 - for sampleNameDict in laneDict[lane]: - sumRawReads += sampleNameDict.values()[0] - - sumRawReadsDict[lane] = sumRawReads - return sumRawReadsDict - -# ----------------------------------------------------------------------------- - -def createPercentagePerLane(laneDict, sumRawReadsDict): - ''' - Creates a dictionary with the sample Name as key and the percentage of raw reads related to - all reads in the same lane - {'lane7': 47.27, 'BSSE-QGF-3433_C0NKPACXX': 100.0, 'BSSE-QGF-3666_C0NKPACXX': 54.12} - ''' - - relRawReadsDict = {} - for lane in laneDict: - for sampleName in laneDict[lane]: - relRawReadsDict[sampleName.keys()[0]] = round(float(sampleName.values()[0]) / - float(sumRawReadsDict[lane]) * 100, 2) - return relRawReadsDict - -# ----------------------------------------------------------------------------- - -def locate(pattern, root): - '''Locate all files matching supplied filename pattern in and below - supplied root directory.''' - for path, dirs, files in os.walk(os.path.abspath(root)): - for filename in fnmatch.filter(files, pattern): - yield os.path.join(path, filename) - -# ----------------------------------------------------------------------------- - -def getVocabulary(transaction, vocabularyCode): - - vocabularyTermList = [] - vocabulary = transaction.getSearchService().searchForVocabulary(vocabularyCode) - if (vocabulary is None): - print 'VOCABULARY %s does not exist' % (vocabularyCode) - else: - print "Getting VOCABULARY: " + vocabulary.getCode() - for term in vocabulary.getTerms(): - vocabularyTermList.append(term.getCode()) - vocabularyTermList.sort() - return vocabularyTermList - -# ----------------------------------------------------------------------------- - -def getFlowCellMetaData (transaction,flowCellId): - - def sortedDictValues(adict): - keys = adict.keys() - keys.sort() - return map(adict.get, keys) - - search = transaction.getSearchService() - sc = SearchCriteria() - print('Searching FlowCell: '+ str(flowCellId)) - sc.addMatchClause(SearchCriteria.MatchClause.createAttributeMatch(SearchCriteria.MatchClauseAttribute.CODE, flowCellId)); - foundFlowCells = search.searchForSamples(sc) - - try: - assert foundFlowCells.size() == 1 - except AssertionError: - print (str(foundFlowCells.size()) + \ - ' flow cells found which match the criterias: '+ flowCellId) - - fcPropertiesDict = {} - fcPropertyTypes = [] - - fcProperties = foundFlowCells[0].getSample().getProperties() - for property in fcProperties: - code = property.getPropertyType().getSimpleCode() - fcPropertyTypes.append(code) - fcPropertiesDict[code] = property.getValue() - - fcPropertyTypes.sort() - return fcPropertiesDict, fcPropertyTypes - -# ----------------------------------------------------------------------------- - -def sampleSearch(transaction, code=''): - sc = SearchCriteria() - numberOfLanes = 0 - sc.addMatchClause(SearchCriteria.MatchClause.createAttributeMatch(SearchCriteria.MatchClauseAttribute.CODE, code)); - search_service = transaction.getSearchService() - foundSample = search_service.searchForSamples(sc) - if foundSample.size() > 0: - # Search for contained samples - sampleSc = SearchCriteria() - sampleSc.addSubCriteria(SearchSubCriteria.createSampleContainerCriteria(sc)) - foundContainedSamples = search_service.searchForSamples(sampleSc) - numberOfLanes = foundContainedSamples.size() - return foundSample, foundContainedSamples, numberOfLanes - -#-------------------------------------------------------------------------------------------------------------------------------------- - -def searchDataSetsofSample(transaction, sample, index1, index2, DATA_SET_TYPE): - sc = SearchCriteria() - sc.addMatchClause(SearchCriteria.MatchClause.createAttributeMatch(SearchCriteria.MatchClauseAttribute.CODE, sample)); - search_service = transaction.getSearchService() - foundSample = search_service.searchForSamples(sc) - - dataSetSc = SearchCriteria() - # set the Search Criteria to an OR condition, default is AND - #dataSetSc.setOperator(SearchCriteria.SearchOperator.MATCH_ANY_CLAUSES) - dataSetSc.addMatchClause(SearchCriteria.MatchClause.createAttributeMatch(SearchCriteria.MatchClauseAttribute.TYPE, DATA_SET_TYPE)) - dataSetSc.addMatchClause(SearchCriteria.MatchClause.createPropertyMatch("BARCODE", index1 )) - dataSetSc.addMatchClause(SearchCriteria.MatchClause.createPropertyMatch("INDEX2", index2)) - dataSetSc.addSubCriteria(SearchSubCriteria.createSampleCriteria(sc)) - foundDataSets = search_service.searchForDataSets(dataSetSc) - print "foundDataSets.size() "+ str(foundDataSets.size()) - for ds in foundDataSets: - print "Index1 for found Data Set" + ds.getDataSetCode() + " " + ds.getPropertyValue('BARCODE') - print "Index2 for found Data Set" + ds.getDataSetCode() + " " + ds.getPropertyValue('INDEX2') - - return foundDataSets - -#-------------------------------------------------------------------------------------------------------------------------------------- - -def getIndexesofDataSetsofSample(transaction, sample, DATA_SET_TYPE): - - index1List = [] - index2List = [] - sc = SearchCriteria() - sc.addMatchClause(SearchCriteria.MatchClause.createAttributeMatch(SearchCriteria.MatchClauseAttribute.CODE, sample)); - search_service = transaction.getSearchService() - foundSample = search_service.searchForSamples(sc) - - dataSetSc = SearchCriteria() - dataSetSc.addMatchClause(SearchCriteria.MatchClause.createAttributeMatch(SearchCriteria.MatchClauseAttribute.TYPE, DATA_SET_TYPE)) - dataSetSc.addSubCriteria(SearchSubCriteria.createSampleCriteria(sc)) - foundDataSets = search_service.searchForDataSets(dataSetSc) - for ds in foundDataSets: - index1List.append(ds.getPropertyValue('BARCODE')) - index2List.append(ds.getPropertyValue('INDEX2')) - return index1List, index2List - -# ----------------------------------------------------------------------------- - -def process(transaction): - ''' - Main - ''' - - FASTQ_DATA_SET_TYPE='FASTQ_GZ' - DEMUX_FILE='Flowcell_demux_summary.xml' - NO_INDEX='NOINDEX' - UNDETERMINED='UNDETERMINED' - laneNumber = 1 - - incomingPath = transaction.getIncoming().getPath() - name = transaction.getIncoming().getName() - - print('\n'+time.ctime()) - - fcPropertiesDict, fcPropertyTypes = getFlowCellMetaData(transaction, name) - print fcPropertiesDict - print fcPropertyTypes - - search_service = transaction.getSearchService() - - FileGenerator= locate(DEMUX_FILE, incomingPath) - DEMULTIPLEX_XML = FileGenerator.next() - - sampleList = xml2Memory(DEMULTIPLEX_XML) - - sa = sample() - sampleDict = {} - - # key = sample name, value = sample() - for element in range(0, len(sampleList)): - sa = sampleList[element] - # Check if new sample - if (sa.Sample is not sampleList[element - 1].Sample): - sampleName = sa.Sample.values()[0] - sampleDict[sampleName] = [sa] - else: - sampleDict[sampleName].append(sa) - - stat = [calculateStatistics(sampleDict[mysample]) for mysample in sampleDict] - - flowcell, lanes, numberOfLanes = sampleSearch(transaction, name) - - full_lane_statistics = lane_statistics() - complete_lane_statistic = full_lane_statistics.calculate_complete_lane_statistic(stat) - - for lane in lanes: - if str(laneNumber) == lane.getSampleIdentifier().split(":")[-1]: - mutable_lane = transaction.getSampleForUpdate(lane.getSampleIdentifier()) - print("Setting Complete Lanes Statistics For: " + lane.getSampleIdentifier()) - break - - mutable_lane.setPropertyValue("YIELD_MBASES", str(complete_lane_statistic.pfYieldSum)) - mutable_lane.setPropertyValue('RAW_YIELD_MBASES', str(complete_lane_statistic.rawYieldSum)) - mutable_lane.setPropertyValue('PERCENTAGE_PASSED_FILTERING',str(complete_lane_statistic.pfPercentage)) - mutable_lane.setPropertyValue('PF_READS_SUM',str(complete_lane_statistic.pfReadsSum)) - mutable_lane.setPropertyValue('RAW_READS_SUM',str(complete_lane_statistic.rawReadsSum)) - mutable_lane.setPropertyValue('PFYIELDQ30PERCENTAGE', str(complete_lane_statistic.pfYieldQ30Percentage)) - mutable_lane.setPropertyValue('PFMEANQUALITYSCORE', str(complete_lane_statistic.pfmeanQualityScore)) - mutable_lane.setPropertyValue('CLUSTERS_PF_WITHOUT_NOINDEX', str(complete_lane_statistic.pfReadsSumWithoutUndetermined)) - - # calculate the relative amount of reads per index - laneDict = rawReadSumPerSamples(stat) - sumRawReadsDict = createSumRawReadsPerLane(laneDict) - relRawReadsDict = createPercentagePerLane(laneDict, sumRawReadsDict) - - # set the values in the object - for mye in stat: - mye.rawPercentageReadsPerLane = relRawReadsDict[mye.sampleName] - - index1Length = fcPropertiesDict['INDEXREAD'] - index2Length = fcPropertiesDict['INDEXREAD2'] - - for mystat in stat: - laneCode = flowcell[0].getCode() + ":" + mystat.lane - searchIndex1 = mystat.index1.upper() - searchIndex2 = mystat.index2.upper() - print '\n' - print mystat - - index1List, index2List = getIndexesofDataSetsofSample(transaction, laneCode, FASTQ_DATA_SET_TYPE) - print "Searching for "+ searchIndex1 + " in " + str(index1List) - print "Searching for "+ searchIndex2 + " in " + str(index2List) - - if searchIndex1 not in (NO_INDEX): - if searchIndex1 not in (UNDETERMINED): - if index1Length > 7: - searchIndex1List = [ index1 for index1 in index1List if searchIndex1 in index1] - else: - searchIndex1List = [ index1 for index1 in index1List if searchIndex1 in index1[:-2]] - try: - if len(searchIndex1List) > 1: - if searchIndex1List[0].startswith(searchIndex1): - searchIndex1 = searchIndex1List[0] - else: - searchIndex1 = searchIndex1List[1] - else: - searchIndex1 = searchIndex1List[0] - print searchIndex1 - except: - searchIndex1 = 'MISSING' - else: - searchIndex1 = NO_INDEX - if searchIndex2 not in (NO_INDEX): - if searchIndex2 not in (UNDETERMINED): - if index2Length > 7: - searchIndex2 = [ index2 for index2 in index2List if searchIndex2 in index2] - else: - searchIndex2 = [ index2 for index2 in index2List if searchIndex2 in index2[:-2]] - try: - searchIndex2 = searchIndex2[0] - except: - searchIndex1 = 'MISSING' - else: - searchIndex2 = NO_INDEX - - print "searchIndex1 " + str(searchIndex1) - print "searchIndex2 " + str(searchIndex2) - - # Search for a data set with those two indices - DataSet = searchDataSetsofSample(transaction, laneCode, searchIndex1, searchIndex2, FASTQ_DATA_SET_TYPE) - try: - assert DataSet.size() == 1 - except AssertionError: - print (str(DataSet.size()) + ' data sets found which match the criterias: '+ - str(laneCode), searchIndex1, searchIndex2) - continue - - sa = transaction.getDataSetForUpdate(DataSet[0].getDataSetCode()) - sa.setPropertyValue('YIELD_MBASES', str(mystat.pfYieldSum)) - sa.setPropertyValue('RAW_YIELD_MBASES', str(mystat.rawYieldSum)) - sa.setPropertyValue('PERCENTAGE_PASSED_FILTERING',str(mystat.pfPercentage)) - sa.setPropertyValue('PF_READS_SUM',str(mystat.pfReadsSum)) - sa.setPropertyValue('RAW_READS_SUM',str(mystat.rawReadsSum)) - sa.setPropertyValue('PERCENTAGE_RAW_CLUSTERS_PER_LANE', str(mystat.rawPercentageReadsPerLane)) - sa.setPropertyValue('PFYIELDQ30PERCENTAGE', str(mystat.pfYieldQ30Percentage)) - sa.setPropertyValue('PFMEANQUALITYSCORE', str(mystat.pfmeanQualityScore)) - - print "Modified data sets properties of: " + DataSet[0].getDataSetCode() - - print "DONE" diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/read-demultiplex-stats-nextseq/plugin.properties b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/read-demultiplex-stats-nextseq/plugin.properties deleted file mode 100644 index 102a5fe3f83698dc29055fd828dd2fd1518d6bf7..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/read-demultiplex-stats-nextseq/plugin.properties +++ /dev/null @@ -1,10 +0,0 @@ -# -# Variables: -# incoming-root-dir -# Path to the directory which contains incoming directories for drop boxes. -incoming-dir = ${incoming-root-dir}/read-demultiplex-stats-nextseq -incoming-data-completeness-condition = marker-file -top-level-data-set-handler = ch.systemsx.cisd.etlserver.registrator.api.v2.JythonTopLevelDataSetHandlerV2 -script-path = read-demultiplex-stats-nextseq.py -storage-processor = ch.systemsx.cisd.etlserver.DefaultStorageProcessor - diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/read-demultiplex-stats-nextseq/read-demultiplex-stats-nextseq.py b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/read-demultiplex-stats-nextseq/read-demultiplex-stats-nextseq.py deleted file mode 100755 index 787e008d89cdd572872779fb5cfabb5247681c83..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/read-demultiplex-stats-nextseq/read-demultiplex-stats-nextseq.py +++ /dev/null @@ -1,364 +0,0 @@ -''' -@copyright: 2012 ETH Zuerich, CISD - -@license: -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. - -@author: Fabian Gemperle - -@note: print statements go to ~/openbis/servers/datastore_server/log/startup_log.txt - -''' - -import time -import math -import os -import fnmatch -# Load Java-Library to import XML data: -import read_demultiplex_stats -# Load openBIS-Libraries: -from ch.systemsx.cisd.openbis.generic.shared.api.v1.dto import SearchCriteria -from ch.systemsx.cisd.openbis.generic.shared.api.v1.dto import SearchSubCriteria - - -def process(transaction): - ''' - Main method in corresponding openBIS dropbox - ''' - - # Constants: - XML_FILENAME = 'ConversionStats.xml' - TYPE_DATASET = 'FASTQ_GZ' - INDEX_NO = 'NOINDEX' - INDEX_UNKNOWN = 'UNKNOWN' - INDEX_EMPTY = '' - CODE_INDEX1 = 'BARCODE' - CODE_INDEX2 = 'INDEX2' - CODE_INDEX1LENGTH = 'INDEXREAD' - CODE_INDEX2LENGTH = 'INDEXREAD2' - BARCODE_SPLIT_CHAR = "+" - - - ########################################################## - def locate(pattern, root): - '''Locate all files matching supplied filename pattern in and below supplied root directory.''' - for path, dirs, files in os.walk(os.path.abspath(root)): - for filename in fnmatch.filter(files, pattern): - yield os.path.join(path, filename) - - ########################################################## - def getInfoVocabularyTerms(vocabularyCode): - ''' - Get information about Terms of certain Vocabulary in openBIS. - Input: - - vocabularyCode: code of Vocabulary to be investigated - Output: - - vocabularyTerms: list of Terms in Vocabulary - ''' - vocabulary = transaction.getSearchService().searchForVocabulary(vocabularyCode) - - vocabularyTerms = [] - if (vocabulary is None): - print '\nOCCURRED EXCEPTION: Vocabulary %s does not exist' % (vocabularyCode) - else: - for term in vocabulary.getTerms(): - vocabularyTerms.append(term.getCode()) - vocabularyTerms.sort() - - return vocabularyTerms - - ########################################################## - def getInfoSampleProperties(sampleCode): - ''' - Get information about Properties of certain Sample in openBIS. - Input: - - sampleCode: code of Sample to be investigated - Outputs: - - propertiesCode: list of Properties' codes - - propertiesCodeValue: dictionary of Properties' codes and values - ''' - ss = transaction.getSearchService() - - scSample = SearchCriteria() - scSample.addMatchClause(SearchCriteria.MatchClause.createAttributeMatch(SearchCriteria.MatchClauseAttribute.CODE, sampleCode)); - foundSamples = ss.searchForSamples(scSample) - - propertiesCode = [] - propertiesCodeValue = {} - try: - assert foundSamples.size() == 1 - properties = foundSamples[0].getSample().getProperties() - for p in properties: - codeProperty = p.getPropertyType().getSimpleCode() - propertiesCode.append(codeProperty) - propertiesCodeValue[codeProperty] = p.getValue() - propertiesCode.sort() - except AssertionError: - print ('\nOCCURRED EXCEPTION: ' + str(foundSamples.size()) + ' Samples found which match the criteria code \"' + sampleCode + '\".') - - return propertiesCode, propertiesCodeValue - - ########################################################## - def getInfoDataSetPropertiesOfSample(sampleCode): - ''' - Get information about Properties of some DataSet of certain Sample in openBIS. - Input: - - sampleCode: code of DataSet's Sample to be investigated - Outputs: - - propertiesCode: list of Properties' codes - - propertiesCodeValue: dictionary of Properties' codes and values - ''' - ss = transaction.getSearchService() - - scSample = SearchCriteria() - scSample.addMatchClause(SearchCriteria.MatchClause.createAttributeMatch(SearchCriteria.MatchClauseAttribute.CODE, sampleCode)); - #foundSamples = ss.searchForSamples(scSample) - - scDataSet = SearchCriteria() - scDataSet.addMatchClause(SearchCriteria.MatchClause.createAttributeMatch(SearchCriteria.MatchClauseAttribute.TYPE, TYPE_DATASET)) - scDataSet.addSubCriteria(SearchSubCriteria.createSampleCriteria(scSample)) - foundDataSets = ss.searchForDataSets(scDataSet) - - propertiesCode = [] - propertiesCodeValue = {} - try: - assert foundDataSets.size() > 0 - codeProperties = foundDataSets[0].getAllPropertyCodes() - for cp in codeProperties: - propertiesCode.append(cp) - propertiesCodeValue[cp] = foundDataSets[0].getPropertyValue(cp) - propertiesCode.sort() - except AssertionError: - print ('\nOCCURRED EXCEPTION: ' + str(foundDataSets.size()) + ' DataSets found which Sample match the criteria code \"' + sampleCode + '\" and type \"' + TYPE_DATASET + '\".') - - return propertiesCode, propertiesCodeValue - - ########################################################## - def getIndexesOfDataSetsOfSample(sampleFlowLaneCode): - ''' - Get both indexes (parts of barcode) of all DataSets of certain FlowLane-Sample in openBIS. - Inputs: - - sampleFlowLaneCode: code of DataSet's Sample - Outputs: - - indexes1: list of first index of DataSets - - indexes2: list of second index of DataSets - ''' - ss = transaction.getSearchService() - - scSample = SearchCriteria() - scSample.addMatchClause(SearchCriteria.MatchClause.createAttributeMatch(SearchCriteria.MatchClauseAttribute.CODE, sampleFlowLaneCode)); - #foundSamples = ss.searchForSamples(scSample) - - scDataSet = SearchCriteria() - scDataSet.addMatchClause(SearchCriteria.MatchClause.createAttributeMatch(SearchCriteria.MatchClauseAttribute.TYPE, TYPE_DATASET)) - scDataSet.addSubCriteria(SearchSubCriteria.createSampleCriteria(scSample)) - foundDataSets = ss.searchForDataSets(scDataSet) - - indexes1 = [] - indexes2 = [] - try: - assert foundDataSets.size() > 0 - except AssertionError: - print ('\nOCCURRED EXCEPTION: ' + str(foundDataSets.size()) + ' DataSets found which Sample match the criteria code \"' + sampleFlowLaneCode + '\" and type \"' + TYPE_DATASET + '\".') - for ds in foundDataSets: - indexes1.append(ds.getPropertyValue(CODE_INDEX1)) - indexes2.append(ds.getPropertyValue(CODE_INDEX2)) - - return indexes1, indexes2 - - ########################################################## - def searchDataSetsOfSample(sampleFlowLaneCode, index1, index2): - ''' - Search DataSets by corresponding indexes (parts of barcode) of certain FlowLane-Sample in openBIS. - Inputs: - - sampleFlowLaneCode: code of DataSet's Sample - - index1: first index of DataSet - - index2: second index of DataSet - Output: - - foundDataSets: DataSets corresponding to inputs and constant TYPE_DATASET - ''' - ss = transaction.getSearchService() - - scSample = SearchCriteria() - scSample.addMatchClause(SearchCriteria.MatchClause.createAttributeMatch(SearchCriteria.MatchClauseAttribute.CODE, sampleFlowLaneCode)); - #foundSample = ss.searchForSamples(scSample) - - scDataSet = SearchCriteria() - scDataSet.addMatchClause(SearchCriteria.MatchClause.createAttributeMatch(SearchCriteria.MatchClauseAttribute.TYPE, TYPE_DATASET)) - scDataSet.addMatchClause(SearchCriteria.MatchClause.createPropertyMatch(CODE_INDEX1, index1)) - scDataSet.addMatchClause(SearchCriteria.MatchClause.createPropertyMatch(CODE_INDEX2, index2)) - scDataSet.addSubCriteria(SearchSubCriteria.createSampleCriteria(scSample)) - foundDataSets = ss.searchForDataSets(scDataSet) - for ds in foundDataSets: - print "Index1 of found DataSet " + ds.getDataSetCode() + ": " + ds.getPropertyValue(CODE_INDEX1) - print "Index2 of found DataSet " + ds.getDataSetCode() + ": " + ds.getPropertyValue(CODE_INDEX2) - - return foundDataSets - - ########################################################## - def reversecomplement(sequence): - ''' - Reverse sequence and replace each nucleotide by its complement. - Input: - - sequence: sequence of nucleotides - Output: - - reverse_complement_sequence: reversed and complemented sequence - ''' - lookup_table = {'A': 'T', 'T': 'A', 'G': 'C', 'C': 'G'} - reverse_complement_sequence = '' - for nucleotide in reversed(sequence): - reverse_complement_sequence += lookup_table[nucleotide] - return reverse_complement_sequence - - ########################################################## - - def sampleSearch(transaction, code=''): - sc = SearchCriteria() - numberOfLanes = 0 - sc.addMatchClause(SearchCriteria.MatchClause.createAttributeMatch(SearchCriteria.MatchClauseAttribute.CODE, code)); - search_service = transaction.getSearchService() - flowcell = search_service.searchForSamples(sc) - if flowcell.size() > 0: - # Search for contained samples - sampleSc = SearchCriteria() - sampleSc.addSubCriteria(SearchSubCriteria.createSampleContainerCriteria(sc)) - lanes = search_service.searchForSamples(sampleSc) - numberOfLanes = lanes.size() - return flowcell, lanes, numberOfLanes - - ########################################################## - - def updateLane(transaction, codeSampleFlowCell, totalLaneStatistics): - - print("Setting Complete Lanes Statistics For: " + lane.getSampleIdentifier()) - mutable_lane = transaction.getSampleForUpdate(lane.getSampleIdentifier()) - mutable_lane.setPropertyValue("YIELD_MBASES", str(int(totalLaneStatistics.get(lane_in_int).Sum_PfYield))) - mutable_lane.setPropertyValue('RAW_YIELD_MBASES', str(int(totalLaneStatistics.get(lane_in_int).Sum_RawYield))) - mutable_lane.setPropertyValue('PERCENTAGE_PASSED_FILTERING',str(int(totalLaneStatistics.get(lane_in_int).Percentage_PfClusterCount_RawClusterCount))) - mutable_lane.setPropertyValue('PF_READS_SUM',str(int(totalLaneStatistics.get(lane_in_int).Sum_PfClusterCount))) - mutable_lane.setPropertyValue('RAW_READS_SUM',str(int(totalLaneStatistics.get(lane_in_int).Sum_RawClusterCount))) - mutable_lane.setPropertyValue('PFYIELDQ30PERCENTAGE', str(int(totalLaneStatistics.get(lane_in_int).Percentage_PfYieldQ30_PfYield))) - mutable_lane.setPropertyValue('PFMEANQUALITYSCORE', str(totalLaneStatistics.get(lane_in_int).Fraction_PfQualityScoreSum_PfYield)) - mutable_lane.setPropertyValue('CLUSTERS_PF_WITHOUT_NOINDEX', str(int(totalLaneStatistics.get(lane_in_int).Clusters_PfWithoutNoindex))) - - ########################################################## - - def update_datatsets(transaction, samplestatisticslist, codeSampleFlowLane, codeSampleFlowCell): - # Prepare links between XML and openBIS w.r.t to indexes in DataSet (openBIS): - print(codeSampleFlowLane) - index1list, index2list = getIndexesOfDataSetsOfSample(codeSampleFlowLane) - print(index1list) - - propertiesCode, propertiesCodeValue = getInfoSampleProperties(codeSampleFlowCell) - index1length = int(propertiesCodeValue[CODE_INDEX1LENGTH]) - index2length = int(propertiesCodeValue[CODE_INDEX2LENGTH]) - - nprocessedDataSets = 0 - for s in samplestatisticslist: - print "\nContent in XML file:\n", s - - # Prepare link between XML and openBIS w.r.t to indexes in Barcode (XML): - indexes = s.Barcode.split(BARCODE_SPLIT_CHAR) - if len(indexes) == 1: # only first part in Barcode - index1search = indexes[0].upper() - index2search = INDEX_EMPTY - elif len(indexes) == 2: # both parts in Barcode - index1search = indexes[0].upper() - index2search = indexes[1].upper() - else: - index1search = INDEX_EMPTY - index2search = INDEX_EMPTY - - # Set link between XML and openBIS w.r.t to indexes in DataSet (openBIS): - if index1search == INDEX_EMPTY or index1search == INDEX_UNKNOWN: - index1 = INDEX_NO - else: # Hint: just two cases were known about index1length, that is 8 or 6 - if index1length > 7: - index1 = [ index1 for index1 in index1list if index1search == index1 ] - else: # for smaller indexlength, the index is by 1 shorter in XML-file than in openBIS - index1 = [ index1 for index1 in index1list if index1search == index1[:index1length] ] - try: - index1 = index1[0] - except: - print '\nOCCURRED EXCEPTION: First index \"' + index1search + '\" of Barcode in XML file has no corresponding DataSet in openBIS!' - index1 = 'MISSING' - if index2search == INDEX_EMPTY or index2search == INDEX_UNKNOWN: - index2 = INDEX_NO - else: # Hint: just one case was known about index2length, that is 8 - if index2length > 7: # second and larger index must be reversed and complemented in contrast to first or smaller index - index2 = [ index2 for index2 in index2list if reversecomplement(index2search) == index2 ] - else: # second and smaller index is unknown how to handle - index2 = [ index2 for index2 in index2list if reversecomplement(index2search) == index2 ] - try: - index2 = index2[0] - except: - print '\nOCCURRED EXCEPTION: Second index \"' + index2search + '\" of Barcode in XML file has no corresponding DataSet in openBIS!' - index2 = 'MISSING' - - # Get DataSet of openBIS corresponding to Project/Sample/Barcode of XML file: - correspondingDataSet = searchDataSetsOfSample(codeSampleFlowLane, index1, index2) - try: - assert correspondingDataSet.size() == 1 - except AssertionError: - print ('\nOCCURRED EXCEPTION: ' + str(correspondingDataSet.size()) + ' DataSets found which Sample match the criteria index1 \"' + str(index1) + '\" and index2 \"' + str(index2) + '\" and code \"' + codeSampleFlowLane + '\" and type \"' + TYPE_DATASET + '\".') - continue - - # Modify Properties of corresponding DataSet: - # (method setPropertyValue requires Strings as Input, but Number format must fit to Properties already defined in openBIS) - ds = transaction.getDataSetForUpdate(correspondingDataSet[0].getDataSetCode()) - ds.setPropertyValue('YIELD_MBASES', str(int(s.Mega_PfYield))) - ds.setPropertyValue('RAW_YIELD_MBASES', str(int(s.Mega_RawYield))) - ds.setPropertyValue('PERCENTAGE_PASSED_FILTERING',str(s.Percentage_PfClusterCount_RawClusterCount)) - ds.setPropertyValue('PF_READS_SUM',str(int(s.Sum_PfClusterCount))) # convert first to Integer, then to String - ds.setPropertyValue('RAW_READS_SUM',str(int(s.Sum_RawClusterCount))) # convert first to Integer, then to String - ds.setPropertyValue('PERCENTAGE_RAW_CLUSTERS_PER_LANE', str(s.Percentage_RawClusterCount_AllRawClusterCounts)) - ds.setPropertyValue('PFYIELDQ30PERCENTAGE', str(s.Percentage_PfYieldQ30_PfYield)) - ds.setPropertyValue('PFMEANQUALITYSCORE', str(s.Fraction_PfQualityScoreSum_PfYield)) - print "Properties in DataSet \"" + correspondingDataSet[0].getDataSetCode() + "\" are modified." - nprocessedDataSets += 1 - - return nprocessedDataSets - - - ########################################################## - - print('\nPROCESS RUNNING '+time.ctime()) - incomingPath = transaction.getIncoming().getPath() - FileGenerator= locate(XML_FILENAME, incomingPath) - xmlfile = FileGenerator.next() - print "File: " + xmlfile - - # Import data of XML file (independent of openBIS data): - JavaClassToProcessXML = read_demultiplex_stats() # this function is implemented as Class in Java: - samplestatisticslist = JavaClassToProcessXML.importXmlAndCalculateStatistics(xmlfile) - totalLaneStatistics = JavaClassToProcessXML.calculateTotalLaneStatistics(samplestatisticslist) - - if len(samplestatisticslist) == 0: - print "\nNo Projects/Samples/Barcodes are contained in XML-file " + xmlfile + "!" - return - - print(samplestatisticslist[0].Flowcell) - codeSampleFlowCell = samplestatisticslist[0].Flowcell # expect just one equal FlowCell - flowcell, lanes, numberOfLanes = sampleSearch(transaction, codeSampleFlowCell) - - for lane in lanes: - lane_in_int = int(lane.getCode().split(":")[-1]) - if (lane_in_int in totalLaneStatistics.keySet()): - updateLane(transaction, codeSampleFlowCell, totalLaneStatistics) - - codeSampleFlowLane = ":".join([codeSampleFlowCell, str(lane_in_int)]) - nprocessedDataSets = update_datatsets(transaction, samplestatisticslist, codeSampleFlowLane, codeSampleFlowCell) - - print "\n", nprocessedDataSets, " openBIS-DataSets were processed." - print len(samplestatisticslist), " XML-Projects/-Samples/-Barcodes were processed." - print("PROCESS DONE "+time.ctime()) diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/read-demultiplex-stats-nextseq/read_demultiplex_stats.java b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/read-demultiplex-stats-nextseq/read_demultiplex_stats.java deleted file mode 100644 index 385601962cd58ad7ecb1f3d8c4e4d07fad32071f..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/read-demultiplex-stats-nextseq/read_demultiplex_stats.java +++ /dev/null @@ -1,736 +0,0 @@ -/* -@copyright: 2015 ETH Zuerich, CISD - -@license: -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. - -@author: Fabian Gemperle -@autor: Manuel Kohler - -@note: This Class is in Jython importable as Java-Library after compiling it. - In compilation 4 Class files arise: - - read_demultiplex_stats.class - - read_demultiplex_stats$SampleItem.class - - read_demultiplex_stats$Sample.class - - read_demultiplex_stats$Statistics.class - */ - - -import javax.xml.stream.XMLInputFactory; -import javax.xml.stream.XMLStreamConstants; -import javax.xml.stream.XMLStreamException; -import javax.xml.stream.XMLStreamReader; -import java.io.FileInputStream; -import java.io.FileNotFoundException; -import java.io.InputStream; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -//########################################################## - -public final class read_demultiplex_stats -{ - - public static ArrayList<Statistics> importXmlAndCalculateStatistics(String XMLFile) throws Exception { - - ArrayList<Statistics> stats = executeImportXmlAndCalculateStatistics(XMLFile); - HashMap<Integer, ArrayList<Statistics>> groupedList = groupByLane(stats); - - for (Statistics s : stats) - s.adaptStatisticsWithRespectToAllSamples(stats, groupedList); - return stats; - } - - /** - * - * Streams through a given XML file, parses the data and writes it into a Statistics object - * - * @param XMLfile: ConversionStats.xml - * @return a ArrayList of <Statistics> - */ - private static ArrayList<Statistics> executeImportXmlAndCalculateStatistics(String XMLfile) throws Exception { - ArrayList<Statistics> sampleStatisticsList = new ArrayList<>(); - - /*Parse corresponding XML file, put all values into a memory structure, calculate statistics overall samples. - Output: sampleStatisticsList (list of Sample-Statistics-Objects) - Input: XMLfile having structure of file ConversionStats.xml (Example of 1.10.2014): - <?xml version="1.0" encoding="utf-8"?> => Assumptions about XML structure: - <Stats> => Element is singlechild - <Flowcell flowcell-id="H0YVKBGXX"> => Element is singlechild - <Project name="BSSE_QGF_23096_H0YVKBGXX_1"> => Element is one of many children, additionally there is summary-element with attribute name="all" - <Sample name="BSSE_QGF_23096_H0YVKBGXX_1_PZ27_PZ33_CelSEQ_"> => Element is singlechild except second summary-element with attribute name="all" - <Barcode name="unknown"> => Element is singlechild except second summary-element with attribute name="all" - <Lane number="1"> => Element is one of several children - <Tile number="11101"> => Element is one of many children - <Raw> => Element is singlechild - <ClusterCount>328653</ClusterCount> => Element is singlechild - <Read number="1"> => Element is one of several children - <Yield>24977628</Yield> => Element is singlechild - <YieldQ30>16162292</YieldQ30> => Element is singlechild - <QualityScoreSum>703070796</QualityScoreSum> => Element is singlechild - </Read> - <Read number="2"> => Element is one of several children - <Yield>24977628</Yield> => Element is singlechild - <YieldQ30>16233173</YieldQ30> => Element is singlechild - <QualityScoreSum>699507245</QualityScoreSum> => Element is singlechild - </Read> - </Raw> - <Pf> => Element is singlechild - <ClusterCount>302121</ClusterCount> => Element is singlechild - <Read number="1"> => Element is one of several children - <Yield>22961196</Yield> => Element is singlechild - <YieldQ30>15842531</YieldQ30> => Element is singlechild - <QualityScoreSum>686898532</QualityScoreSum> => Element is singlechild - </Read> - <Read number="2"> => Element is one of several children - <Yield>22961196</Yield> => Element is singlechild - <YieldQ30>16233173</YieldQ30> => Element is singlechild - <QualityScoreSum>699507245</QualityScoreSum> => Element is singlechild - </Read> - </Pf> - </Tile> - <Tile number="11102"> - [...] - - </Project> - <Lane number="2"> - <TopUnknownBarcodes> - <Barcode count="150988002" sequence="NNNNNNN"/> - <Barcode count="167095" sequence="CCCCCCC"/> - <Barcode count="57859" sequence="CCCGTCC"/> - <Barcode count="49993" sequence="CCGATGT"/> - <Barcode count="42981" sequence="GTCCCGC"/> - <Barcode count="40446" sequence="TAAAATT"/> - <Barcode count="39962" sequence="CCAGATC"/> - <Barcode count="34688" sequence="GATGTAT"/> - <Barcode count="32013" sequence="AAAAAGT"/> - <Barcode count="30501" sequence="AGATCAT"/> - </TopUnknownBarcodes> - </Lane> - [...] - */ - -// Map<Integer, Map<String, Integer>> barcodesPerLane = null; - - try { - String errorMessage; - int event; - int skip; - String flowcellName = ""; - String projectName = ""; - String sampleName = ""; - String barcodeName = ""; - int laneNumber = 0; - int tileNumber; - Sample currentSample = null; - Statistics statistics; - SampleItem rawItem; - SampleItem pfItem; - Map<String, Integer> barcodesMap = new HashMap<>(); - Map<Integer, Map<String, Integer>> barcodesPerLane = new HashMap<>(); - - InputStream xmlFile = new FileInputStream(XMLfile); - XMLInputFactory xmlFactory = XMLInputFactory.newInstance(); - XMLStreamReader xmlParser = xmlFactory.createXMLStreamReader(xmlFile); - - // Start-Tag "Stats": - event = xmlParser.nextTag(); // Assumption: just white space or comments are aside explicit start-tag - if (event != XMLStreamConstants.START_ELEMENT || !xmlParser.getLocalName().equals("Stats")) { - errorMessage = - "STRANGE ERROR IN METHOD importXmlAndCalculateStatistics WHEN READING IN XMLFILE. => CHECK CODE AND XMLFILE-STRUCTURE! Got " + event; - throw new Exception(errorMessage); - } - - // Loop over potential Tags "Flowcell": - event = xmlParser.nextTag(); // Assumption: just white spaces or comments are aside start- or end-tag - // List<Statistics> samplestatistics = new ArrayList<Statistics>(); - boolean doimport = true; - while (doimport) { - // concerning tag Flowcell: - if (event == XMLStreamConstants.START_ELEMENT && xmlParser.getLocalName().equals("Flowcell")) { - flowcellName = xmlParser.getAttributeValue(0); - event = xmlParser.nextTag(); - } else if (event == XMLStreamConstants.END_ELEMENT && xmlParser.getLocalName().equals("Flowcell")) { - flowcellName = ""; - event = xmlParser.nextTag(); - - // concerning tag Project: - } else if (event == XMLStreamConstants.START_ELEMENT && xmlParser.getLocalName().equals("Project")) { - if (xmlParser.getAttributeValue(0).equals("all")) { - //skip the current XML element and all of its following subelements: - skip = 1; - while (skip > 0) { - event = xmlParser.next(); - switch (event) { - case XMLStreamConstants.END_ELEMENT: - skip -= 1; - break; - case XMLStreamConstants.START_ELEMENT: - skip += 1; - break; - default: - skip += 0; // text elements, spaces, ... - break; - } - } - } else { - projectName = xmlParser.getAttributeValue(0); - - } - event = xmlParser.nextTag(); - } else if (event == XMLStreamConstants.END_ELEMENT && xmlParser.getLocalName().equals("Project")) { - projectName = ""; - event = xmlParser.nextTag(); - - // concerning tag Sample: - } else if (event == XMLStreamConstants.START_ELEMENT && xmlParser.getLocalName().equals("Sample")) { - if (xmlParser.getAttributeValue(0).equals("all")) { - // skip the current XML element and all of its following subelements: - skip = 1; - while (skip > 0) { - event = xmlParser.next(); - switch (event) { - case XMLStreamConstants.END_ELEMENT: - skip -= 1; - break; - case XMLStreamConstants.START_ELEMENT: - skip += 1; - break; - default: - skip += 0; // text elements, spaces, ... - break; - } - } - } else { - sampleName = xmlParser.getAttributeValue(0); - } - event = xmlParser.nextTag(); - } else if (event == XMLStreamConstants.END_ELEMENT && xmlParser.getLocalName().equals("Sample")) { - sampleName = ""; - event = xmlParser.nextTag(); - - // concerning tag Barcode (which is as well the start/end of Project-/Sample-Entry): - } else if (event == XMLStreamConstants.START_ELEMENT && xmlParser.getLocalName().equals("Barcode")) { - if (xmlParser.getAttributeValue(0).equals("all")) { - // skip the current XML element and all of its following subelements: - skip = 1; - while (skip > 0) { - event = xmlParser.next(); - switch (event) { - case XMLStreamConstants.END_ELEMENT: - skip -= 1; - break; - case XMLStreamConstants.START_ELEMENT: - skip += 1; - break; - default: - skip += 0; // text elements, spaces, ... - break; - } - } - } else { - barcodeName = xmlParser.getAttributeValue(0); - } - event = xmlParser.nextTag(); - } else if (event == XMLStreamConstants.END_ELEMENT && xmlParser.getLocalName().equals("Barcode")) { - barcodeName = ""; - event = xmlParser.nextTag(); - - - // concerning Lane: - } else if (event == XMLStreamConstants.START_ELEMENT && xmlParser.getLocalName().equals("Lane")) { -// System.out.println("\nStart-Element with tag " + xmlparser.getLocalName() + " with " + xmlparser.getAttributeCount() + " attributes with first attribute: " + xmlparser.getAttributeLocalName(0) +" = " + xmlparser.getAttributeValue(0)); - laneNumber = Integer.parseInt(xmlParser.getAttributeValue(0)); - - // Now we have everything we need, we put it into a Sample - currentSample = new Sample(); - - if (sampleName.startsWith("Undetermined")) { - currentSample.Sample = sampleName + "_" + flowcellName + "_" + laneNumber; - } else { - currentSample.Sample = sampleName; - } - - currentSample.Flowcell = flowcellName; - currentSample.Lane = laneNumber; - currentSample.Project = projectName; - currentSample.Barcode = barcodeName; - event = xmlParser.nextTag(); -// System.out.println(currentSample.Sample); - - - } else if (event == XMLStreamConstants.END_ELEMENT && xmlParser.getLocalName().equals("Lane")) { - // Statistics 1st step: calculate individual statistics per sample: - statistics = new Statistics(currentSample); - if (!currentSample.Project.equals("")) { - sampleStatisticsList.add(statistics); - } - currentSample = null; - statistics = null; - -// laneNumber = Double.NaN; - event = xmlParser.nextTag(); - - // concerning Tile with all its sub-elements: - } else if (event == XMLStreamConstants.START_ELEMENT && xmlParser.getLocalName().equals("Tile")) { - tileNumber = Integer.parseInt(xmlParser.getAttributeValue(0)); - // concerning Raw with Assumption: Raw-element is singlechild: - xmlParser.nextTag(); - rawItem = new SampleItem(); - rawItem.Type = "Raw"; - rawItem.Lane = laneNumber; - rawItem.Tile = tileNumber; - xmlParser.nextTag(); - rawItem.ClusterCount = Integer.parseInt(xmlParser.getElementText()); // Assumption: ClusterCount-element is numeric singlechild - //System.out.println("\nValue: ClusterCount=" + rawItem.ClusterCount); - xmlParser.nextTag(); - while (event == XMLStreamConstants.START_ELEMENT && xmlParser.getLocalName().equals("Read")) { - //System.out.println("\nStart-Element with tag " + xmlparser.getLocalName() + " with " + xmlparser.getAttributeCount() + " attributes with first attribute: " + xmlparser.getAttributeLocalName(0) +" = " + xmlparser.getAttributeValue(0)); - xmlParser.nextTag(); - rawItem.YieldList.add(Double.parseDouble(xmlParser.getElementText())); - xmlParser.nextTag(); - rawItem.YieldQ30List.add(Double.parseDouble(xmlParser.getElementText())); - xmlParser.nextTag(); - rawItem.QualityScoreSumList.add(Double.parseDouble(xmlParser.getElementText())); - xmlParser.nextTag(); - xmlParser.nextTag(); - //System.out.println("Values in Read: Yield=" + rawItem.YieldList.get(rawItem.YieldList.size()-1) + ", YieldQ30=" + rawItem.YieldQ30List.get(rawItem.YieldQ30List.size()-1) + ", QualityScoreSum=" + rawItem.QualityScoreSumList.get(rawItem.QualityScoreSumList.size()-1)); - } - //System.out.println("\nRaw-SampleItem " + rawItem); - currentSample.RawList.add(rawItem); - - - rawItem = null; - // concerning Pf with Assumption that entire Pf-element is structured same as Raw: - xmlParser.nextTag(); - //System.out.println("\nStart-Element with tag " + xmlparser.getLocalName()); - pfItem = new SampleItem(); - pfItem.Type = "Pf"; - pfItem.Lane = laneNumber; - pfItem.Tile = tileNumber; - xmlParser.nextTag(); - pfItem.ClusterCount = Integer.parseInt(xmlParser.getElementText()); - //System.out.println("\nValue: ClusterCount=" + pfItem.ClusterCount); - xmlParser.nextTag(); - while (event == XMLStreamConstants.START_ELEMENT && xmlParser.getLocalName().equals("Read")) { - //System.out.println("\nStart-Element with tag " + xmlparser.getLocalName() + " with " + xmlparser.getAttributeCount() + " attributes with first attribute: " + xmlparser.getAttributeLocalName(0) +" = " + xmlparser.getAttributeValue(0)); - xmlParser.nextTag(); - pfItem.YieldList.add(Double.parseDouble(xmlParser.getElementText())); - xmlParser.nextTag(); - pfItem.YieldQ30List.add(Double.parseDouble(xmlParser.getElementText())); - xmlParser.nextTag(); - pfItem.QualityScoreSumList.add(Double.parseDouble(xmlParser.getElementText())); - xmlParser.nextTag(); - xmlParser.nextTag(); - //System.out.println("Values in Read: Yield=" + pfItem.YieldList.get(pfItem.YieldList.size()-1) + ", YieldQ30=" + pfItem.YieldQ30List.get(pfItem.YieldQ30List.size()-1) + ", QualityScoreSum=" + pfItem.QualityScoreSumList.get(pfItem.QualityScoreSumList.size()-1)); - } - //System.out.println("\nPf-SampleItem " + pfItem); - currentSample.PfList.add(pfItem); - pfItem = null; - // attain end of current Tile and afterwards continue in next Tile/Lane/Barcode/Sample/Project: - event = xmlParser.nextTag(); - } else if (event == XMLStreamConstants.END_ELEMENT && xmlParser.getLocalName().equals("Tile")) { - tileNumber = 0; - event = xmlParser.nextTag(); - - - } else if (event == XMLStreamConstants.START_ELEMENT && xmlParser.getLocalName().equals("TopUnknownBarcodes")) { - - event = xmlParser.nextTag(); - while (event == XMLStreamConstants.START_ELEMENT && xmlParser.getLocalName().equals("Barcode")) { - Integer numberOfBarcodes = Integer.valueOf((xmlParser.getAttributeValue(0))); - String barcode = xmlParser.getAttributeValue(1); - barcodesMap.put(barcode, numberOfBarcodes); - xmlParser.nextTag(); - event = xmlParser.nextTag(); - } - - } else if (event == XMLStreamConstants.END_ELEMENT && xmlParser.getLocalName().equals("TopUnknownBarcodes")) { - - barcodesPerLane.put(laneNumber, barcodesMap); - event = xmlParser.nextTag(); - - // concerning finish of reading in XML or hit upon error due XML content: - } else if (event == XMLStreamConstants.END_ELEMENT && xmlParser.getLocalName().equals("Stats")) { - // this final part of while loop is just for analyzing potential errors, but - // could be removed and changed in: while xmlparser.getLocalName() != 'Stats' - doimport = false; - } else { - doimport = false; - System.out.println("Warning: Different XML structure than expectet. Got event: " + event); - } - } - xmlParser.close(); - - } catch (FileNotFoundException | XMLStreamException | IllegalArgumentException e) { - System.out.println("OCCURRED EXCEPTION " + e.toString()); - e.printStackTrace(); - } - return sampleStatisticsList; - } - - public static HashMap<Integer, LaneStatistics> calculateTotalLaneStatistics(ArrayList<Statistics> samplestatisticslist) - { - HashMap<Integer, LaneStatistics> listOfLaneStatistics= new HashMap<Integer, LaneStatistics>(); - - HashMap<Integer, ArrayList<Statistics>> groupedList = groupByLane(samplestatisticslist); - - for (Integer key : groupedList.keySet()) { - - LaneStatistics laneStats = new LaneStatistics(groupedList.get(key)); - laneStats.calculateOverallStats(key); - listOfLaneStatistics.put(key, laneStats); - } - return listOfLaneStatistics; - } - - - private static HashMap<Integer, ArrayList<Statistics>> groupByLane(ArrayList<Statistics> samplestatisticslist) { - // Group ArrayList by Lane - HashMap<Integer, ArrayList<Statistics>> groupedList = new HashMap <Integer, ArrayList<Statistics>>(); - for (Statistics s : samplestatisticslist) { - - if (groupedList.containsKey(s.Lane)) { - groupedList.get(s.Lane).add(s); - } - else { - ArrayList <Statistics> newEntry = new ArrayList<Statistics>(); - newEntry.add(s); - groupedList.put(s.Lane, newEntry); - } - } - return groupedList; - } - - - // ########################################################## - - private static class SampleItem - { - /* - * Object of an item in sample including - the corresponding type Raw or Pf - the index of corresponding Lane, Tile - measured value of - * ClusterCount and values in Lists (w.r.t. Read) of Yield, YieldQ30, QualityScoreSum - */ - - public String Type = ""; - - public Integer Lane = 0; - - public Integer Tile = 0; - - public Integer ClusterCount = 0; - - // Define unknown ArrayList of numerical values with changeable List size. Type Double(object) instead of double(primitive) is necessary in - // Lists. - public List<Double> YieldList = new ArrayList<>(); - - public List<Double> YieldQ30List = new ArrayList<>(); - - public List<Double> QualityScoreSumList = new ArrayList<>(); - - public String toString() - { - return "Type: " + this.Type + ", Lane: " + (long) this.Lane + ", Tile: " + (long) this.Tile - + ", ClusterCount: " + (long) this.ClusterCount + ", YieldList: " + this.YieldList - + ", YieldQ30List: " + this.YieldQ30List + ", QualityScoreSumList: " + this.QualityScoreSumList; - } - - } - - // ########################################################## - - public static class Sample - { - /* - * Object of an entire sample including - the name of Flowcell, Project, Sample, Barcode - the list of Raw and Pf SampleItem-Objects - */ - - public String Flowcell = ""; - - public Integer Lane = 0; - - public String Project = ""; - - public String Sample = ""; - - public String Barcode = ""; - - // Define unknown ArrayList of SampleItems: - public List<SampleItem> RawList = new ArrayList<>(); - - public List<SampleItem> PfList = new ArrayList<>(); - - public String toString() - { - return "Flowcell: " + this.Flowcell + ", Lane: " + this.Lane + ", Project: " + this.Project + ", Sample: " + this.Sample + ", Barcode: " + this.Barcode - + ", RawList: " + this.RawList + ", PfList: " + this.PfList; - } - - } - - // ########################################################## - - public static class Statistics extends Sample - { - /* - * Object of Statistics within one single sample inherited from Sample-Object - */ - - public Integer Sum_RawClusterCount = 0; - - public Integer Sum_PfClusterCount = 0; - - public double Sum_RawYield = Double.NaN; - - public double Sum_PfYield = Double.NaN; - - public double Sum_RawYieldQ30 = Double.NaN; - - public double Sum_PfYieldQ30 = Double.NaN; - - public double Sum_RawQualityScoreSum = Double.NaN; - - public double Sum_PfQualityScoreSum = Double.NaN; - - public double Mega_RawYield = Double.NaN; // obvious double, but could be turned into int - - public double Mega_PfYield = Double.NaN; // obvious double, but could be turned into int - - public double Percentage_PfYield_RawYield = Double.NaN; - - public double Percentage_PfYieldQ30_PfYield = Double.NaN; - - public double Fraction_PfQualityScoreSum_PfYield = Double.NaN; - - public double Percentage_PfClusterCount_RawClusterCount = Double.NaN; - - public double Percentage_RawClusterCount_AllRawClusterCounts = Double.NaN; - - public Statistics(Sample sample) - { - /* - * Constructor of derived class Initialization: Already initialized Sample-Object is necessary argument. - */ - - super(); - Flowcell = sample.Flowcell; - Lane = sample.Lane; - Project = sample.Project; - Sample = sample.Sample; - Barcode = sample.Barcode; - RawList = sample.RawList; - PfList = sample.PfList; - - if (RawList.size() > 0) - Sum_RawClusterCount = 0; - for (SampleItem s : RawList) - Sum_RawClusterCount += s.ClusterCount; - if (PfList.size() > 0) - Sum_PfClusterCount = 0; - for (SampleItem s : PfList) - Sum_PfClusterCount += s.ClusterCount; - if (RawList.size() > 0) - Sum_RawYield = 0; - for (SampleItem s : RawList) - for (double d : s.YieldList) - Sum_RawYield += d; - if (PfList.size() > 0) - Sum_PfYield = 0; - for (SampleItem s : PfList) - for (double d : s.YieldList) - Sum_PfYield += d; - if (RawList.size() > 0) - Sum_RawYieldQ30 = 0; - for (SampleItem s : RawList) - for (double d : s.YieldQ30List) - Sum_RawYieldQ30 += d; - if (PfList.size() > 0) - Sum_PfYieldQ30 = 0; - for (SampleItem s : PfList) - for (double d : s.YieldQ30List) - Sum_PfYieldQ30 += d; - if (RawList.size() > 0) - Sum_RawQualityScoreSum = 0; - for (SampleItem s : RawList) - for (double d : s.QualityScoreSumList) - Sum_RawQualityScoreSum += d; - if (PfList.size() > 0) - Sum_PfQualityScoreSum = 0; - for (SampleItem s : PfList) - for (double d : s.QualityScoreSumList) - Sum_PfQualityScoreSum += d; - // Mega_RawYield = calculate_MegaUnit(Sum_RawYield); - // Mega_PfYield = calculate_MegaUnit(Sum_PfYield); - - Mega_RawYield = Sum_RawYield; - Mega_PfYield = Sum_PfYield; - - Percentage_PfYield_RawYield = calculate_Percentage(Sum_PfYield, Sum_RawYield); - Percentage_PfYieldQ30_PfYield = calculate_Percentage(Sum_PfYieldQ30, Sum_PfYield); - Fraction_PfQualityScoreSum_PfYield = calculate_Fraction(Sum_PfQualityScoreSum, Sum_PfYield); - Percentage_PfClusterCount_RawClusterCount = calculate_Percentage(Sum_PfClusterCount, Sum_RawClusterCount); - // Calculation of attribute "Percentage_RawClusterCount_AllRawClusterCounts" needs statistics of all other included samples. => After - // initializing this object, apply method: adaptStatisticsWithRespectToAllSamples(statisticslist) - } - - public String toString() - { - return "Flowcell: " + this.Flowcell + ", Lane: "+ this.Lane + ", Project: " + this.Project + ", Sample: " + this.Sample + ", Barcode: " + this.Barcode - + ", Raw Clusters: " + (long) this.Sum_RawClusterCount + ", Mbases Raw Yield: " + this.Mega_RawYield - + ", % Raw Clusters overall: " + this.Percentage_RawClusterCount_AllRawClusterCounts - + ", Pf Clusters: " + (long) this.Sum_PfClusterCount + ", Mbases Pf Yield: " + this.Mega_PfYield - + ", % PfYield/RawYield: " + this.Percentage_PfYield_RawYield - + ", % PfYieldQ30/PfYield: " + this.Percentage_PfYieldQ30_PfYield - + ", Mean Pf Quality Score: " + this.Fraction_PfQualityScoreSum_PfYield - + ", % Passes Filtering: " + this.Percentage_PfClusterCount_RawClusterCount + "\n"; - } - - public void adaptStatisticsWithRespectToAllSamples(ArrayList<Statistics> statisticslist, HashMap<Integer, ArrayList<Statistics>> groupedList) - { - /* - * This Statistics-Object (corresponding to one sample) is adapted by employing a list of Statistics-Objects corresponding to all samples - * influencing the statistics of single sample. Input: statisticslist contains all Statistics-Objects - */ - if (statisticslist.size() == 0) - { // here it additionally should be checked, if calling object is included ... - Percentage_RawClusterCount_AllRawClusterCounts = Double.NaN; - String errormessage = - "INPUT ARGUMENT statisticslist MUST BE LIST OF Statistics OBJECTS INCLUDING THE CALLING OBJECT" + - " IN METHOD adaptStatisticsWithRespectToAllSamples!"; - throw new IllegalArgumentException(errormessage); // Exception reasonable since otherwise wrong results. - } else - { - for (Integer key : groupedList.keySet()) { - double sumAllRawClusterCounts = 0; - ArrayList<Statistics> groupList = groupedList.get(key); - for (Statistics element : groupList) { - sumAllRawClusterCounts += element.Sum_RawClusterCount; - } - for (Statistics element : groupList) { - element.Percentage_RawClusterCount_AllRawClusterCounts = - calculate_Percentage(element.Sum_RawClusterCount, sumAllRawClusterCounts); - } - } - } - } - - - public double calculate_Percentage(double x, double y) - { - double z = x / y; - if (z == Double.POSITIVE_INFINITY || z == Double.NEGATIVE_INFINITY || Double.isNaN(z)) - { - z = Double.NaN; - } else - { - z = 100 * z; - } - return z; - } - - public double calculate_Fraction(double x, double y) - { - double z = x / y; - if (z == Double.POSITIVE_INFINITY || z == Double.NEGATIVE_INFINITY || Double.isNaN(z)) - { - z = Double.NaN; - } - return z; - } - } - - public static class LaneStatistics - { - /* - * Total Lane Statistics - */ - public ArrayList<Statistics> statisticsList; - - public Integer Lane = 0; - - public double Sum_RawClusterCount = 0.0; - - public Integer Sum_PfClusterCount = 0; - - public double Sum_RawYield = 0.0; - - public double Sum_PfYield = 0.0; - - public double Sum_RawYieldQ30 = 0.0; - - public double Sum_PfYieldQ30 = 0.0; - - public double Sum_RawQualityScoreSum = 0.0; - - public double Sum_PfQualityScoreSum = 0.0; - - public double Percentage_PfYield_RawYield = 0.0; - - public double Percentage_PfYieldQ30_PfYield = 0.0; - - public double Fraction_PfQualityScoreSum_PfYield = 0.0; - - public double Percentage_PfClusterCount_RawClusterCount = 0.0; - - public double Percentage_RawClusterCount_AllRawClusterCounts = 0.0; - - public double Clusters_PfWithoutNoindex = 0.0; - - public LaneStatistics(ArrayList<Statistics> statisticsList) - { - this.statisticsList = statisticsList; - } - - public void calculateOverallStats(Integer key) - { - int sampleNumber = statisticsList.size(); - for (Statistics s : statisticsList) { - if (!s.Barcode.equals("") || s.Barcode.equals("unknown")) { - this.Clusters_PfWithoutNoindex += s.Sum_PfClusterCount; - } - - this.Sum_RawClusterCount += s.Sum_RawClusterCount; - this.Sum_PfClusterCount += s.Sum_PfClusterCount; - this.Sum_RawYield += s.Sum_RawYield; - this.Sum_PfYield += s.Sum_PfYield; - this.Sum_RawYieldQ30 += s.Sum_RawYieldQ30; - this.Sum_PfYieldQ30 += s.Sum_PfYieldQ30; - this.Sum_RawQualityScoreSum += s.Sum_RawQualityScoreSum; - this.Sum_PfQualityScoreSum += s.Sum_PfQualityScoreSum; - this.Percentage_PfYield_RawYield += s.Percentage_PfYield_RawYield; - if (!Double.isNaN(s.Percentage_PfYieldQ30_PfYield)) { - this.Percentage_PfYieldQ30_PfYield += s.Percentage_PfYieldQ30_PfYield; - } - this.Percentage_PfClusterCount_RawClusterCount += s.Percentage_PfClusterCount_RawClusterCount; - this.Fraction_PfQualityScoreSum_PfYield += s.Fraction_PfQualityScoreSum_PfYield; - } - - this.Lane = key; - this.Sum_RawQualityScoreSum = this.Sum_RawQualityScoreSum / sampleNumber; - this.Sum_PfQualityScoreSum = this.Sum_PfQualityScoreSum / sampleNumber; - this.Percentage_PfYield_RawYield = this.Percentage_PfYield_RawYield / sampleNumber; - this.Percentage_PfYieldQ30_PfYield = this.Percentage_PfYieldQ30_PfYield / (double) sampleNumber; - this.Percentage_PfClusterCount_RawClusterCount = this.Percentage_PfClusterCount_RawClusterCount / (double) sampleNumber; - this.Fraction_PfQualityScoreSum_PfYield = this.Fraction_PfQualityScoreSum_PfYield / (double) sampleNumber; - } - - public String toString() - { - return "Lane " + this.Lane + " Sum_RawClusterCount " + this.Sum_RawClusterCount + " Sum_PfClusterCount " + this.Sum_PfClusterCount + - " Percentage_PfYieldQ30_PfYield " + this.Percentage_PfYieldQ30_PfYield + - " Percentage_PfClusterCount_RawClusterCount " + this.Percentage_PfClusterCount_RawClusterCount; - } - } -} \ No newline at end of file diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/read-demultiplex-stats-nextseq/read_demultiplex_statsTest.java b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/read-demultiplex-stats-nextseq/read_demultiplex_statsTest.java deleted file mode 100644 index bc409770abff681616c7b2fd983db4769ca8d21a..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/read-demultiplex-stats-nextseq/read_demultiplex_statsTest.java +++ /dev/null @@ -1,64 +0,0 @@ -import java.util.ArrayList; -import java.util.HashMap; - -import static org.testng.AssertJUnit.assertEquals; - -public class read_demultiplex_statsTest { - - private String XMLfile = - "/Users/kohleman/Documents/workspace/datastore_server/targets/read-demultiplex-stats-nextseq/" + - "150724_J00121_0017_AH2VYMBBXX.sv/ConversionStats.xml"; - - - @org.testng.annotations.BeforeMethod - public void setUp() throws Exception { - } - - @org.testng.annotations.AfterMethod - public void tearDown() throws Exception { - - } - - @org.testng.annotations.Test - public void testImportXmlAndCalculateStatistics() throws Exception { - ArrayList<read_demultiplex_stats.Statistics> stat = read_demultiplex_stats.importXmlAndCalculateStatistics(XMLfile); - assertEquals(stat.size(), 39); - read_demultiplex_stats.Statistics eigth_element = stat.get(8); - assertEquals(eigth_element.Flowcell, "H2VYMBBXX"); - assertEquals(eigth_element.Barcode, "GCCAATA"); - assertEquals(eigth_element.Sum_RawClusterCount.intValue(), 27850973); - assertEquals(eigth_element.Sum_RawYield, 8.410993846E9); - assertEquals(eigth_element.Percentage_PfYieldQ30_PfYield, 87.6792784423112); - assertEquals(eigth_element.Fraction_PfQualityScoreSum_PfYield, 37.40267477898711); - assertEquals(eigth_element.Percentage_RawClusterCount_AllRawClusterCounts, 5.770060255141701); - } - - @org.testng.annotations.Test - public void testImportXmlAndCalculateStatistics_overall() throws Exception { - ArrayList<read_demultiplex_stats.Statistics> stat = read_demultiplex_stats.importXmlAndCalculateStatistics(XMLfile); - - Double percentage = 0.0; - for (read_demultiplex_stats.Statistics element : stat) { - if (element.Lane.equals(6)) { - percentage += element.Percentage_RawClusterCount_AllRawClusterCounts; - } - } - assertEquals(100.0, (double)Math.round(percentage * 1000) / 1000); - - } - - @org.testng.annotations.Test - public void testCalculateTotalLaneStatistics() throws Exception { - ArrayList<read_demultiplex_stats.Statistics> stat = - read_demultiplex_stats.importXmlAndCalculateStatistics(XMLfile); - - HashMap<Integer, read_demultiplex_stats.LaneStatistics> lanesStatistics = - read_demultiplex_stats.calculateTotalLaneStatistics(stat); - - read_demultiplex_stats.LaneStatistics lane2 = lanesStatistics.get(2); - assertEquals(lane2.Sum_RawClusterCount, 4.826808E8); - assertEquals(lane2.Sum_PfClusterCount.intValue(), 332293484); - assertEquals(lane2.Percentage_PfYieldQ30_PfYield, 86.14969791102051); - assertEquals(lane2.Percentage_PfClusterCount_RawClusterCount, 92.63902299583091); - } -} \ No newline at end of file diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/read-demultiplex-stats-nextseq/start_read_demultiplex_stats.java b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/read-demultiplex-stats-nextseq/start_read_demultiplex_stats.java deleted file mode 100644 index be097bcc3ede0eb484e8078c129b98bf08b9f9c8..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/read-demultiplex-stats-nextseq/start_read_demultiplex_stats.java +++ /dev/null @@ -1,21 +0,0 @@ -import java.util.ArrayList; -import java.util.HashMap; - -public class start_read_demultiplex_stats { - - public static void main(String[] args) { - - String XMLfile = - "/Users/kohleman/Documents/workspace/datastore_server/targets/read-demultiplex-stats-nextseq/" + - "150724_J00121_0017_AH2VYMBBXX.sv/ConversionStats.xml"; - ArrayList<read_demultiplex_stats.Statistics> stat = null; - try { - stat = read_demultiplex_stats.importXmlAndCalculateStatistics(XMLfile); - } catch (Exception e) { - e.printStackTrace(); - } - HashMap<Integer, read_demultiplex_stats.LaneStatistics> ls = read_demultiplex_stats.calculateTotalLaneStatistics(stat); -// System.out.println(stat); -// System.out.println(ls); - } -} diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/read-demultiplex-stats/plugin.properties b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/read-demultiplex-stats/plugin.properties deleted file mode 100644 index 1337bde948b0645c9713e3268dabd486e21275d3..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/read-demultiplex-stats/plugin.properties +++ /dev/null @@ -1,10 +0,0 @@ -# -# Variables: -# incoming-root-dir -# Path to the directory which contains incoming directories for drop boxes. -incoming-dir = ${incoming-root-dir}/read-demultiplex-stats -incoming-data-completeness-condition = marker-file -top-level-data-set-handler = ch.systemsx.cisd.etlserver.registrator.api.v2.JythonTopLevelDataSetHandlerV2 -script-path = read-demultiplex-stats.py -storage-processor = ch.systemsx.cisd.etlserver.DefaultStorageProcessor - diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/read-demultiplex-stats/read-demultiplex-stats.py b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/read-demultiplex-stats/read-demultiplex-stats.py deleted file mode 100755 index 5695473fe03672662132a53bcda83e242df4cd2a..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/read-demultiplex-stats/read-demultiplex-stats.py +++ /dev/null @@ -1,595 +0,0 @@ -''' - @copyright: 2012 ETH Zuerich, CISD - - @license: - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - - -@author: Manuel Kohler - -XML Structur which is processed: - -<?xml version="1.0"?> -<Summary> - <Lane index="8"> - <Sample index="lane8"> - <Barcode index="Undetermined"> - <Tile index="1101"> - <Read index="1"> - <Raw> - <Yield>1921250</Yield> - <YieldQ30>949680</YieldQ30> - <ClusterCount>38425</ClusterCount> - <ClusterCount0MismatchBarcode>0</ClusterCount0MismatchBarcode> - <ClusterCount1MismatchBarcode>0</ClusterCount1MismatchBarcode> - <QualityScoreSum>40995660</QualityScoreSum> - </Raw> - <Pf> - <Yield>945450</Yield> - <YieldQ30>854815</YieldQ30> - <ClusterCount>18909</ClusterCount> - <ClusterCount0MismatchBarcode>0</ClusterCount0MismatchBarcode> - <ClusterCount1MismatchBarcode>0</ClusterCount1MismatchBarcode> - <QualityScoreSum>33815505</QualityScoreSum> - </Pf> - </Read> - </Tile> - [...] - -@note: -print statements go to: <openBIS_HOME>/datastore_server/log/startup_log.txt -''' - -import time -import os -import fnmatch -import xml.etree.ElementTree as etree -from ch.systemsx.cisd.openbis.generic.shared.api.v1.dto import SearchCriteria -from ch.systemsx.cisd.openbis.generic.shared.api.v1.dto import SearchSubCriteria - - -class parseXmlFile: - - def __init__(self, xmlFile): - self.xmlFile = xmlFile - self.tree = etree.parse(self.xmlFile) - self.root = self.tree.getroot() - -# ----------------------------------------------------------------------------- - -class qcValues(object): - def __init__(self, Yield = 0, YieldQ30 = 0, ClusterCount = 0, - ClusterCount0MismatchBarcode = 0, ClusterCount1MismatchBarcode = 0, - QualityScoreSum = 0, *args, **kwargs): - self.Yield = Yield - self.YieldQ30 = YieldQ30 - self.ClusterCount = ClusterCount - self.ClusterCount0MismatchBarcode = ClusterCount0MismatchBarcode - self.ClusterCount1MismatchBarcode = ClusterCount1MismatchBarcode - self.QualityScoreSum = QualityScoreSum - - def __str__(self): - return "Yield: %s, YieldQ30: %s, ClusterCount: %s, ClusterCount0MismatchBarcode: %s," \ - " CusterCount1MismatchBarcode: %s, QualityScoreSum: %s" \ - % (self.Yield, self.YieldQ30, self.ClusterCount, self.ClusterCount0MismatchBarcode, - self.ClusterCount1MismatchBarcode, self.QualityScoreSum) - -class sample: - def __init__(self, Lane = 0, Sample = '', Barcode = '', Tile = '', Read = '', rawqc = qcValues([]), - pfqc = qcValues([]), *args, **kwargs): - self.Lane = Lane - self.Sample = Sample - self.Barcode = Barcode - self.Tile = Tile - self.Read = Read - self.rawqc = rawqc - self.pfqc = pfqc - - def __str__(self): - return "Lane: %s, Sample: %s, Barcode: %s, Tile: %s, Read: %s, rawqc: %s, pfqc: %s" \ - % (self.Lane, self.Sample, self.Barcode, self.Tile, self.Read, self.rawqc, self.pfqc) - -# ----------------------------------------------------------------------------- - -class Statistics: - def __init__(self, lane = 0, sampleName = "", index1 = "NoIndex", index2 = "NoIndex", pfYieldSum = 0, - rawYieldSum = 0, pfPercentage = 0.0, rawReadsSum = 0, pfReadsSum = 0, - pfYieldQ30Sum = 0, qualityScoreSum = 0, rawPercentageReadsPerLane = 0.0, - pfYieldQ30Percentage = 0.0, pfsumQualityScore = 0, pfmeanQualityScore = 0.0, - pfReadsSumWithoutUndetermined = 0): - self.lane = lane - self.sampleName = sampleName - self.index1 = index1 - self.index2 = index2 - self.pfYieldSum = pfYieldSum - self.rawYieldSum = rawYieldSum - self.pfPercentage = pfPercentage - self.rawReadsSum = rawReadsSum - self.pfReadsSum = pfReadsSum - self.pfYieldQ30Sum = pfYieldQ30Sum - self.qualityScoreSum = qualityScoreSum - self.rawPercentageReadsPerLane = rawPercentageReadsPerLane - self.pfYieldQ30Percentage = pfYieldQ30Percentage - self.pfsumQualityScore = pfsumQualityScore - self.pfmeanQualityScore = pfmeanQualityScore - self.pfReadsSumWithoutUndetermined = pfReadsSumWithoutUndetermined - - def __str__(self): - return "lane: %s, sampleName: %s, index1: %s, index2: %s, pfYieldSum: %s, pfPercentage: %s," \ - " rawReadsSum: %s, pfReadsSum: %s," \ - " rawPercentageReadsPerLane: %s, pfYieldQ30Percentage: %s," \ - " pfmeanQualityScore: %s" \ - % (self.lane, self.sampleName, self.index1, self.index2, self.pfYieldSum, self.pfPercentage, - self.rawReadsSum, self.pfReadsSum, - self.rawPercentageReadsPerLane, self.pfYieldQ30Percentage, self.pfmeanQualityScore) - - def calculatePercentagePF (self, rawYield = 0, pfYield = 1): - try: - return round(float(pfYield) / float(rawYield) * 100, 2) - except: - return 0.0 - - def calulateMeanQualityScore (self, pfqualityScoreSum = 0, pfYield = 1): - try: - return round (float(pfqualityScoreSum) / float(pfYield), 2) - except: - return 0.0 - - def calculateYieldQ30Percentage (self, pfYieldQ30 = 0, pfYield = 1): - try: - return round (float(pfYieldQ30) / float(pfYield) * 100, 2) - except: - return 0.0 - - -class lane_statistics: - def __init__(self): - self.complete_lane_statistic = Statistics() - - def caluclate_complete_lane_statistic(self, list_of_statistics): - - sample_number = len(list_of_statistics) - - for stat in list_of_statistics: - self.complete_lane_statistic.lane = stat.lane - self.complete_lane_statistic.pfYieldSum += stat.pfYieldSum - self.complete_lane_statistic.rawYieldSum += stat.rawYieldSum - self.complete_lane_statistic.pfReadsSum += stat.pfReadsSum - self.complete_lane_statistic.rawReadsSum += stat.rawReadsSum - self.complete_lane_statistic.pfPercentage += stat.pfPercentage - self.complete_lane_statistic.pfYieldQ30Percentage += stat.pfYieldQ30Percentage - self.complete_lane_statistic.pfmeanQualityScore += stat.pfmeanQualityScore - - if stat.index1 != "Undetermined": - self.complete_lane_statistic.pfReadsSumWithoutUndetermined += stat.pfReadsSum - - self.complete_lane_statistic.pfPercentage = self.complete_lane_statistic.pfPercentage / sample_number - self.complete_lane_statistic.pfYieldQ30Percentage = self.complete_lane_statistic.pfYieldQ30Percentage / sample_number - self.complete_lane_statistic.pfmeanQualityScore = self.complete_lane_statistic.pfmeanQualityScore/ sample_number - - return self.complete_lane_statistic - -# ----------------------------------------------------------------------------- - -def xml2Memory(DEMULTIPLEX_XML): - ''' - Parse the XML file and put all values in a memory structure: - List of: - lane, sample, barcode, tile, read, qcRawList, qcPfList - ''' - - RAW_TAG = "Raw" - PF_TAG = "Pf" - - sampleList = [] - - xml = parseXmlFile(DEMULTIPLEX_XML) - r = xml.tree.getroot() - - for lane in r.getchildren(): - for mysample in lane: - for barcode in mysample: - for tile in barcode: - for read in tile: - - qcRaw = qcValues() - qcPf = qcValues() - qcRawList = [] - qcPfList = [] - - # Read out the Raw fields - raw = read.find(RAW_TAG) - for child in raw.getchildren(): - # equivalent to a Java reflection - setattr(qcRaw, child.tag, int(child.text)) - - # Read out the Pf fields - pf = read.find(PF_TAG) - for child in pf.getchildren(): - # equivalent to a Java reflection - setattr(qcPf, child.tag, int(child.text)) - - qcRawList.append(qcRaw) - qcPfList.append(qcPf) - - singleElement = sample () - - setattr(singleElement, lane.tag, lane.attrib) - setattr(singleElement, mysample.tag, mysample.attrib) - setattr(singleElement, barcode.tag, barcode.attrib) - setattr(singleElement, tile.tag, tile.attrib) - setattr(singleElement, read.tag, read.attrib) - singleElement.rawqc = qcRawList - singleElement.pfqc = qcPfList - - sampleList.append(singleElement) - return sampleList - -# ----------------------------------------------------------------------------- - -def calculateStatistics(listofSamples): - ''' - Structure of 'listofSamples' - Lane: {'index': '6'}, Sample: {'index': 'BSSE-QGF-3524_C0NKPACXX'}, Barcode: {'index': 'TGACCA'}, - Tile: {'index': '2307'}, Read: {'index': '1'}, rawqc:<mem>, pfqc:<mem> - ''' - - numberOfTiles = len(listofSamples) - - tile = sample() - raw = qcValues () - pf = qcValues () - stats = Statistics() - - for tile in listofSamples: - raw = tile.rawqc[0] - pf = tile.pfqc[0] - - stats.pfYieldSum += pf.Yield - stats.rawYieldSum += raw.Yield - stats.rawReadsSum += raw.ClusterCount - stats.pfReadsSum += pf.ClusterCount - stats.pfYieldQ30Sum += pf.YieldQ30 - stats.qualityScoreSum += pf.QualityScoreSum - - # Can not be set here, needs to be calculated later - #stats.rawPercentageReadsPerLane = rawPercentageReadsPerLane - stats.pfPercentage = stats.calculatePercentagePF(stats.rawYieldSum, stats.pfYieldSum) - stats.pfYieldQ30Percentage = stats.calculateYieldQ30Percentage(stats.pfYieldQ30Sum, stats.pfYieldSum) - stats.pfmeanQualityScore = stats.calulateMeanQualityScore(stats.qualityScoreSum, stats.pfYieldSum) - stats.lane = listofSamples[0].Lane.values()[0] - stats.sampleName = listofSamples[0].Sample.values()[0] - index = listofSamples[0].Barcode.values()[0] - try: - stats.index1, stats.index2 = index.split("-") - except: - stats.index1 = index - return stats - -# ----------------------------------------------------------------------------- - - -def rawReadSumPerSamples(stat): - ''' - Creates a dictionary with the lanes as keys - The values are a list where the elements are a dictionary again. - This dictionary has the sample names as key and the RawReadSum as value. - - Example: - {4': [{'BSSE-QGF-3434_C0NKPACXX': 248999502}], '7': [{'lane7': 123921974}, - {'BSSE-QGF-3527_C0NKPACXX': 38587703}, {'BSSE-QGF-3529_C0NKPACXX': 30130893}, - {'BSSE-QGF-3528_C0NKPACXX': 34519296}, {'BSSE-QGF-3526_C0NKPACXX': 34980179}]} - ''' - - laneDict = {} - for e in stat: - if e.lane not in laneDict: - laneDict[e.lane] = [{e.sampleName:e.rawReadsSum}] - else: - laneDict[e.lane].append({e.sampleName:e.rawReadsSum}) - return laneDict - -# ----------------------------------------------------------------------------- - -def createSumRawReadsPerLane(laneDict): - ''' - Creates a dictionary with lane as key and sum of Raw Reads as value: - {'1': 183180877, '3': 244968562, '2': 191496395, '5': 193466239, '4': 248999502, - '7': 262140045, '6': 257136830, '8': 209948449} - ''' - sumRawReadsDict = {} - for lane in laneDict: - sumRawReads = 0 - for sampleNameDict in laneDict[lane]: - sumRawReads += sampleNameDict.values()[0] - - sumRawReadsDict[lane] = sumRawReads - return sumRawReadsDict - -# ----------------------------------------------------------------------------- - -def createPercentagePerLane(laneDict, sumRawReadsDict): - ''' - Creates a dictionary with the sample Name as key and the percentage of raw reads related to - all reads in the same lane - {'lane7': 47.27, 'BSSE-QGF-3433_C0NKPACXX': 100.0, 'BSSE-QGF-3666_C0NKPACXX': 54.12} - ''' - - relRawReadsDict = {} - for lane in laneDict: - for sampleName in laneDict[lane]: - relRawReadsDict[sampleName.keys()[0]] = round(float(sampleName.values()[0]) / - float(sumRawReadsDict[lane]) * 100, 2) - return relRawReadsDict - -# ----------------------------------------------------------------------------- - -def locate(pattern, root): - '''Locate all files matching supplied filename pattern in and below - supplied root directory.''' - for path, dirs, files in os.walk(os.path.abspath(root)): - for filename in fnmatch.filter(files, pattern): - yield os.path.join(path, filename) - -# ----------------------------------------------------------------------------- - -def getVocabulary(transaction, vocabularyCode): - - vocabularyTermList = [] - vocabulary = transaction.getSearchService().searchForVocabulary(vocabularyCode) - if (vocabulary is None): - print 'VOCABULARY %s does not exist' % (vocabularyCode) - else: - print "Getting VOCABULARY: " + vocabulary.getCode() - for term in vocabulary.getTerms(): - vocabularyTermList.append(term.getCode()) - vocabularyTermList.sort() - return vocabularyTermList - -# ----------------------------------------------------------------------------- - -def getFlowCellMetaData (transaction,flowCellId): - - def sortedDictValues(adict): - keys = adict.keys() - keys.sort() - return map(adict.get, keys) - - search = transaction.getSearchService() - sc = SearchCriteria() - print('Searching FlowCell: '+ str(flowCellId)) - sc.addMatchClause(SearchCriteria.MatchClause.createAttributeMatch(SearchCriteria.MatchClauseAttribute.CODE, flowCellId)); - foundFlowCells = search.searchForSamples(sc) - - try: - assert foundFlowCells.size() == 1 - except AssertionError: - print (str(foundFlowCells.size()) + \ - ' flow cells found which match the criterias: '+ flowCellId) - - fcPropertiesDict = {} - fcPropertyTypes = [] - - fcProperties = foundFlowCells[0].getSample().getProperties() - for property in fcProperties: - code = property.getPropertyType().getSimpleCode() - fcPropertyTypes.append(code) - fcPropertiesDict[code] = property.getValue() - - fcPropertyTypes.sort() - return fcPropertiesDict, fcPropertyTypes - -def getIndexesofDataSetsofSample(transaction, sample, DATA_SET_TYPE): - - index1List = [] - index2List = [] - sc = SearchCriteria() - sc.addMatchClause(SearchCriteria.MatchClause.createAttributeMatch(SearchCriteria.MatchClauseAttribute.CODE, sample)); - search_service = transaction.getSearchService() - foundSample = search_service.searchForSamples(sc) - - dataSetSc = SearchCriteria() - dataSetSc.addMatchClause(SearchCriteria.MatchClause.createAttributeMatch(SearchCriteria.MatchClauseAttribute.TYPE, DATA_SET_TYPE)) - dataSetSc.addSubCriteria(SearchSubCriteria.createSampleCriteria(sc)) - foundDataSets = search_service.searchForDataSets(dataSetSc) - for ds in foundDataSets: - index1List.append(ds.getPropertyValue('BARCODE')) - index2List.append(ds.getPropertyValue('INDEX2')) - return index1List, index2List - -def searchDataSetsofSample(transaction, sample, index1, index2, DATA_SET_TYPE): - sc = SearchCriteria() - sc.addMatchClause(SearchCriteria.MatchClause.createAttributeMatch(SearchCriteria.MatchClauseAttribute.CODE, sample)); - search_service = transaction.getSearchService() - foundSample = search_service.searchForSamples(sc) - - dataSetSc = SearchCriteria() - # set the Search Criteria to an OR condition, default is AND - #dataSetSc.setOperator(SearchCriteria.SearchOperator.MATCH_ANY_CLAUSES) - dataSetSc.addMatchClause(SearchCriteria.MatchClause.createAttributeMatch(SearchCriteria.MatchClauseAttribute.TYPE, DATA_SET_TYPE)) - dataSetSc.addMatchClause(SearchCriteria.MatchClause.createPropertyMatch("BARCODE", index1 )) - dataSetSc.addMatchClause(SearchCriteria.MatchClause.createPropertyMatch("INDEX2", index2)) - dataSetSc.addSubCriteria(SearchSubCriteria.createSampleCriteria(sc)) - foundDataSets = search_service.searchForDataSets(dataSetSc) - print "foundDataSets.size() "+ str(foundDataSets.size()) - for ds in foundDataSets: - print "Index1 for found Data Set" + ds.getDataSetCode() + " " + ds.getPropertyValue('BARCODE') - print "Index2 for found Data Set" + ds.getDataSetCode() + " " + ds.getPropertyValue('INDEX2') - - return foundDataSets - -def sampleSearch(transaction, code=''): - sc = SearchCriteria() - numberOfLanes = 0 - sc.addMatchClause(SearchCriteria.MatchClause.createAttributeMatch(SearchCriteria.MatchClauseAttribute.CODE, code)); - search_service = transaction.getSearchService() - foundSample = search_service.searchForSamples(sc) - if foundSample.size() > 0: - # Search for contained samples - sampleSc = SearchCriteria() - sampleSc.addSubCriteria(SearchSubCriteria.createSampleContainerCriteria(sc)) - foundContainedSamples = search_service.searchForSamples(sampleSc) - numberOfLanes = foundContainedSamples.size() - return foundSample, foundContainedSamples, numberOfLanes - -# ----------------------------------------------------------------------------- - -def process(transaction): - ''' - Main - ''' - - FASTQ_DATA_SET_TYPE='FASTQ_GZ' - DEMUX_FILE='Flowcell_demux_summary.xml' - NO_INDEX='NOINDEX' - UNDETERMINED='UNDETERMINED' - - incomingPath = transaction.getIncoming().getPath() - name, laneNumber = transaction.getIncoming().getName().split('-') - - print('\n'+time.ctime()) - - fcPropertiesDict, fcPropertyTypes = getFlowCellMetaData(transaction, name) - print fcPropertiesDict - print fcPropertyTypes - - search_service = transaction.getSearchService() - - FileGenerator= locate(DEMUX_FILE, incomingPath) - DEMULTIPLEX_XML = FileGenerator.next() - - sampleList = xml2Memory(DEMULTIPLEX_XML) - - sa = sample() - sampleDict = {} - print ("Length List samples x tiles x surface: " + str(len(sampleList))) - - # key = sample name, value = sample() - for element in range(0, len(sampleList)): - sa = sampleList[element] - # Check if new sample - if (sa.Sample is not sampleList[element - 1].Sample): - sampleName = sa.Sample.values()[0] - sampleDict[sampleName] = [sa] - print(sampleName) - else: - try: - sampleDict[sampleName].append(sa) - except: - sampleName = sa.Sample.values()[0] - sampleDict[sampleName] = [sa] - - stat = [calculateStatistics(sampleDict[mysample]) for mysample in sampleDict] - - # calculate the relative amount of reads per index - laneDict = rawReadSumPerSamples(stat) - sumRawReadsDict = createSumRawReadsPerLane(laneDict) - relRawReadsDict = createPercentagePerLane(laneDict, sumRawReadsDict) - - # set the values in the object - for mye in stat: - mye.rawPercentageReadsPerLane = relRawReadsDict[mye.sampleName] - - flowcell, lanes, numberOfLanes = sampleSearch(transaction, name) - - index1Length = fcPropertiesDict['INDEXREAD'] - index2Length = fcPropertiesDict['INDEXREAD2'] - - full_lane_statistics = lane_statistics() - complete_lane_statistic = full_lane_statistics.caluclate_complete_lane_statistic(stat) - - for lane in lanes: - if laneNumber == lane.getSampleIdentifier().split(":")[-1]: - mutable_lane = transaction.getSampleForUpdate(lane.getSampleIdentifier()) - print("Setting Complete Lanes Statistics For: " + lane.getSampleIdentifier()) - break - - mutable_lane.setPropertyValue("YIELD_MBASES", str(complete_lane_statistic.pfYieldSum)) - mutable_lane.setPropertyValue('RAW_YIELD_MBASES', str(complete_lane_statistic.rawYieldSum)) - mutable_lane.setPropertyValue('PERCENTAGE_PASSED_FILTERING',str(complete_lane_statistic.pfPercentage)) - mutable_lane.setPropertyValue('PF_READS_SUM',str(complete_lane_statistic.pfReadsSum)) - mutable_lane.setPropertyValue('RAW_READS_SUM',str(complete_lane_statistic.rawReadsSum)) - mutable_lane.setPropertyValue('PFYIELDQ30PERCENTAGE', str(complete_lane_statistic.pfYieldQ30Percentage)) - mutable_lane.setPropertyValue('PFMEANQUALITYSCORE', str(complete_lane_statistic.pfmeanQualityScore)) - mutable_lane.setPropertyValue('CLUSTERS_PF_WITHOUT_NOINDEX', str(complete_lane_statistic.pfReadsSumWithoutUndetermined)) - - for mystat in stat: - laneCode = flowcell[0].getCode() + ":" + mystat.lane - searchIndex1 = mystat.index1.upper() - searchIndex2 = mystat.index2.upper() - print '\n' - print mystat - - index1List, index2List = getIndexesofDataSetsofSample(transaction, laneCode, FASTQ_DATA_SET_TYPE) - print "Searching for "+ searchIndex1 + " in " + str(index1List) - print "Searching for "+ searchIndex2 + " in " + str(index2List) - - if searchIndex1 not in (NO_INDEX): - if searchIndex1 not in (UNDETERMINED): - if index1Length > 7: - searchIndex1 = [ index1 for index1 in index1List if searchIndex1 in index1] - else: - searchIndex1 = [ index1 for index1 in index1List if searchIndex1 in index1[:-1]] - try: - if len(searchIndex1) > 1: - print("AMBIGIOUS INDEX FOUND!") - print(searchIndex1) - if searchIndex1[0].startswith(mystat.index1.upper()): - searchIndex1 = searchIndex1[0] - else: - searchIndex1 = searchIndex1[1] - else: - searchIndex1 = searchIndex1[0] - - except: - searchIndex1 = 'MISSING' - else: - searchIndex1 = NO_INDEX - if searchIndex2 not in (NO_INDEX): - if searchIndex2 not in (UNDETERMINED): - if index2Length > 7: - searchIndex2 = [ index2 for index2 in index2List if searchIndex2 in index2] - else: - searchIndex2 = [ index2 for index2 in index2List if searchIndex2 in index2[:-1]] - try: - searchIndex2 = searchIndex2[0] - except: - searchIndex1 = 'MISSING' - else: - searchIndex2 = NO_INDEX - - print "searchIndex1 " + str(searchIndex1) - print "searchIndex2 " + str(searchIndex2) - - # Search for a data set with those two indices - DataSet = searchDataSetsofSample(transaction, laneCode, searchIndex1, searchIndex2, FASTQ_DATA_SET_TYPE) - try: - assert DataSet.size() == 1 - except AssertionError: - print (str(DataSet.size()) + ' data sets found which match the criterias: '+ - str(laneCode), searchIndex1, searchIndex2) - continue - - sa = transaction.getDataSetForUpdate(DataSet[0].getDataSetCode()) - sa.setPropertyValue('YIELD_MBASES', str(mystat.pfYieldSum)) - sa.setPropertyValue('RAW_YIELD_MBASES', str(mystat.rawYieldSum)) - sa.setPropertyValue('PERCENTAGE_PASSED_FILTERING',str(mystat.pfPercentage)) - sa.setPropertyValue('PF_READS_SUM',str(mystat.pfReadsSum)) - sa.setPropertyValue('RAW_READS_SUM',str(mystat.rawReadsSum)) - sa.setPropertyValue('PERCENTAGE_RAW_CLUSTERS_PER_LANE', str(mystat.rawPercentageReadsPerLane)) - sa.setPropertyValue('PFYIELDQ30PERCENTAGE', str(mystat.pfYieldQ30Percentage)) - sa.setPropertyValue('PFMEANQUALITYSCORE', str(mystat.pfmeanQualityScore)) - - print "Modified data sets properties of: " + DataSet[0].getDataSetCode() - - print "DONE" diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/read-rta-timestamp/plugin.properties b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/read-rta-timestamp/plugin.properties deleted file mode 100644 index 2c8f40225a20a6f5d644035354094806260e4a52..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/read-rta-timestamp/plugin.properties +++ /dev/null @@ -1,12 +0,0 @@ -# -# Drop box for registering a flow cell output as a data set -# -# Variables: -# incoming-root-dir -# Path to the directory which contains incoming directories for drop boxes. -incoming-dir = ${incoming-root-dir}/read-rta-timestamp -incoming-data-completeness-condition = marker-file -top-level-data-set-handler = ch.systemsx.cisd.etlserver.registrator.api.v2.JythonTopLevelDataSetHandlerV2 -script-path = read-rta-timestamp.py -storage-processor = ch.systemsx.cisd.etlserver.DefaultStorageProcessor -jython-version=2.7 \ No newline at end of file diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/read-rta-timestamp/read-rta-timestamp.py b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/read-rta-timestamp/read-rta-timestamp.py deleted file mode 100644 index c701f27f3d6ab8a935f631acc79664f9b9ce3f6d..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/read-rta-timestamp/read-rta-timestamp.py +++ /dev/null @@ -1,49 +0,0 @@ -import os -import shutil -from time import * -from datetime import * -from ch.systemsx.cisd.openbis.generic.shared.api.v1.dto import SearchCriteria - -MarkerGAComplete = 'RTAComplete.txt' -MarkerHiSeqComplete = 'RTAComplete.txt' -MarkerNextSeqComplete = 'RTAComplete.txt' - -def createOpenbisTimeStamp(file): - ''' - Creates a openBIS compatible time stamp of a file time stamp - ''' - mtime = os.path.getmtime(file) - lt = localtime(mtime) - tz = localtime().tm_hour - gmtime().tm_hour - return (strftime("%Y-%m-%d %H:%M:%S GMT" + "%+.2d" % tz + ":00", lt)) - -# ----------------------------------------------------------------------------- - -def process(transaction): - - incomingPath = transaction.getIncoming().getAbsolutePath() - # Get the incoming name - name = transaction.getIncoming().getName() - - split=name.split("_") - if (len(split) == 4): - if (split[1].startswith("NS")): - Markerfile = incomingPath + "/" + MarkerNextSeqComplete - name = split[-1][1:] - else: - IS_HISEQ_RUN=True - Markerfile = incomingPath + "/" + MarkerHiSeqComplete - if (len(split) == 2): - Markerfile = incomingPath + "/" + MarkerGAComplete - - # Search for the sample and check if there is already sample with this name - search_service = transaction.getSearchService() - sc = SearchCriteria() - sc.addMatchClause(SearchCriteria.MatchClause.createAttributeMatch(SearchCriteria.MatchClauseAttribute.CODE, name)); - foundSamples = search_service.searchForSamples(sc) - - if foundSamples.size() > 0: - sa = transaction.getSampleForUpdate(foundSamples[0].getSampleIdentifier()) - sa.setPropertyValue("SEQUENCER_FINISHED", createOpenbisTimeStamp(Markerfile)) - - shutil.rmtree(incomingPath) diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/register-basecall-stats/plugin.properties b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/register-basecall-stats/plugin.properties deleted file mode 100644 index d6e67945db5bcce4a1f3f1fa0c109a5d12b2544a..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/register-basecall-stats/plugin.properties +++ /dev/null @@ -1,11 +0,0 @@ -# -# Drop box for registering a flow cell output as a data set -# -# Variables: -# incoming-root-dir -# Path to the directory which contains incoming directories for drop boxes. -incoming-dir = ${incoming-root-dir}/register-basecall-stats -incoming-data-completeness-condition = marker-file -top-level-data-set-handler = ch.systemsx.cisd.etlserver.registrator.api.v2.JythonTopLevelDataSetHandlerV2 -script-path = register-basecall-stats.py -storage-processor = ch.systemsx.cisd.etlserver.DefaultStorageProcessor diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/register-basecall-stats/register-basecall-stats.py b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/register-basecall-stats/register-basecall-stats.py deleted file mode 100644 index 34ff5e55af111e72e12346b2da74ba623676f18c..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/register-basecall-stats/register-basecall-stats.py +++ /dev/null @@ -1,51 +0,0 @@ -''' -@copyright: -2012 ETH Zuerich, CISD - -@license: -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - -http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. - -@note: -print statements go to: <openBIS_HOME>/datastore_server/log/startup_log.txt - -@author: -Manuel Kohler -''' - -import os -from ch.systemsx.cisd.openbis.generic.shared.api.v1.dto import SearchCriteria -from ch.systemsx.cisd.openbis.generic.shared.api.v1.dto import SearchSubCriteria - -def process(transaction): - - incomingPath = transaction.getIncoming().getPath() - runFolder = transaction.getIncoming().getName() - flowCellId = runFolder.split("_")[-1][1:] - - # Create a data set and set type - dataSet = transaction.createNewDataSet("NEXTSEQ_BASECALL_STATS") - dataSet.setMeasuredData(False) - - # Get the search service - search_service = transaction.getSearchService() - - # Add the incoming file into the data set - transaction.moveFile(incomingPath, dataSet) - - # Search for the sample - sc = SearchCriteria() - sc.addMatchClause(SearchCriteria.MatchClause.createAttributeMatch(SearchCriteria.MatchClauseAttribute.CODE, flowCellId)) - foundSamples = search_service.searchForSamples(sc) - - if foundSamples.size() > 0: - dataSet.setSample(foundSamples[0]) diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/register-bee/plugin.properties b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/register-bee/plugin.properties deleted file mode 100644 index 2ee1197459089956ef53bfbf5eac6eae65ad4d4e..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/register-bee/plugin.properties +++ /dev/null @@ -1,11 +0,0 @@ -# -# Drop box for registering a flow cell output as a data set -# -# Variables: -# incoming-root-dir -# Path to the directory which contains incoming directories for drop boxes. -incoming-dir = ${root}/dss/register-bee -incoming-data-completeness-condition = marker-file -top-level-data-set-handler = ch.systemsx.cisd.etlserver.registrator.api.v2.JythonTopLevelDataSetHandlerV2 -script-path = register-bee.py -storage-processor = ch.systemsx.cisd.etlserver.DefaultStorageProcessor diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/register-bee/register-bee.py b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/register-bee/register-bee.py deleted file mode 100644 index 65def2a0afbab0a9dad7fffea0423346a5516b1d..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/register-bee/register-bee.py +++ /dev/null @@ -1,64 +0,0 @@ -from __future__ import with_statement -import os -from ch.systemsx.cisd.openbis.generic.shared.api.v1.dto import SearchCriteria -from ch.systemsx.cisd.common.mail import EMailAddress - -def process (transaction): - - - DATA_SET_TYPE_ALIGNMENT = "ALIGNMENT" - ETHZ_DOMAIN = "@ethz.ch" - METADATA_FILE='metadata.properties' - - def searchDs(transaction, dscode): - # search for the data set - search_service = transaction.getSearchService(); - sc = SearchCriteria(); - sc.addMatchClause(SearchCriteria.MatchClause.createAttributeMatch(SearchCriteria.MatchClauseAttribute.CODE, dscode)); - myds = search_service.searchForDataSets(sc); - assert (myds.size() == 1); - return myds; - - # Search for parent data set of the same sample - #dataSetSc = SearchCriteria() - #dataSetSc.addMatchClause(SearchCriteria.MatchClause.createAttributeMatch(SearchCriteria.MatchClauseAttribute.TYPE, 'FASTQ_GZ')) - #dataSetSc.addSubCriteria(SearchSubCriteria.createSampleCriteria(sc)) - #foundDataSets = search_service.searchForDataSets(dataSetSc) - #if foundDataSets.size() > 0: - # dataSet.setParentDatasets([ds.getDataSetCode() for ds in foundDataSets]) - - path = transaction.getIncoming().getAbsolutePath() - - myvars = {} - with open(os.path.join(path, METADATA_FILE)) as myfile: - for line in myfile: - name, var = line.partition("=")[::2] - myvars[name.strip()] = var - print myvars - userId = myvars['analysis_procedure'].split()[-1][1:-1] - dsCode = myvars['storage_provider.parent.dataset.id'] - print userId - print dsCode - - if (not "@" in userId): - userId = userId + ETHZ_DOMAIN; - - userMail = EMailAddress(userId) - - existingDs = searchDs(transaction, dsCode); - print existingDs - firstDs = existingDs.get(0); - - newDataSet = transaction.createNewDataSet(DATA_SET_TYPE_ALIGNMENT); - experiment = firstDs.getExperiment(); - - newDataSet.setParentDatasets([ds.getDataSetCode() for ds in existingDs]) - newDataSet.setExperiment(experiment); - transaction.moveFile(transaction.getIncoming().getAbsolutePath(), newDataSet); - - replyTo = EMailAddress("no-reply@bsse.ethz.ch") - fromAddress = replyTo - - # transaction.getGlobalState().getMailClient().sendEmailMessage(subject, content, replyToOrNull, fromOrNull, recipients) - transaction.getGlobalState().getMailClient().sendEmailMessage("openBIS Bee cluster job finished", - "Result data for " + dsCode + " got registered in openBIS.", replyTo, fromAddress, userMail); diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/register-bigwig/plugin.properties b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/register-bigwig/plugin.properties deleted file mode 100644 index 26d6bb1da8dcadf2f6be9b6359117a8c8d039a2f..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/register-bigwig/plugin.properties +++ /dev/null @@ -1,10 +0,0 @@ -# -# Variables: -# incoming-root-dir -# Path to the directory which contains incoming directories for drop boxes. -incoming-dir = ${incoming-root-dir}/register-bigwig/ -incoming-data-completeness-condition = marker-file -top-level-data-set-handler = ch.systemsx.cisd.etlserver.registrator.api.v2.JythonTopLevelDataSetHandlerV2 -script-path = register-bigwig.py -storage-processor = ch.systemsx.cisd.etlserver.DefaultStorageProcessor - diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/register-bigwig/register-bigwig.py b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/register-bigwig/register-bigwig.py deleted file mode 100755 index 31a0863709fb07a6f23a4912221d41763388ffd9..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/register-bigwig/register-bigwig.py +++ /dev/null @@ -1,140 +0,0 @@ -''' -@copyright: -2012 ETH Zuerich, CISD - -@license: -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - -http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. - -@note: -print statements go to: <openBIS_HOME>/datastore_server/log/startup_log.txt -expected incoming Name for HiSeq runs: 110715_SN792_0054_BC035RACXX -expected incoming Name for GAII runs: 110812_6353WAAXX - -@author: -Manuel Kohler -''' - -import os -import fnmatch -import re -from ch.systemsx.cisd.openbis.generic.shared.api.v1.dto import SearchCriteria -from ch.systemsx.cisd.openbis.generic.shared.api.v1.dto import SearchSubCriteria - -FOLDER='/links/shared/dsu/dss/register-bigwig/' -BIGWIGINFO='/links/application/dsu/bigWig/bigWigInfo ' -BW_PATTERN='*.bw' - -matches = [] - -# ----------------------------------------------------------------------------- - -def listSearch (myList, searchString): - ''' - Searches for a given String in a list. - Only lines matching the start of a line a considerd as a match - ''' - matches = [] - for i in range (0, len(myList)): - if(re.match(searchString, myList[i])): - matches.append(myList[i]) - return (matches) - -# ----------------------------------------------------------------------------- - -def translateBoolean (value): - if (value.lower() == 'yes') | (value.lower() =='y'): - return True - else: - return False - -def sanitizeInt (intNumber): - return intNumber.replace(',','') - -# ----------------------------------------------------------------------------- - -def convertListToDict(prop): - d={} - for i in range(0,len(prop)-1): - lineSplit = prop[i].split(':') - d[lineSplit[0].strip()] = lineSplit[1].strip() - return(d) - -# ----------------------------------------------------------------------------- - -def process(transaction): - - incomingPath = transaction.getIncoming().getPath() - name = transaction.getIncoming().getName() - - # Create a data set and set type - dataSet = transaction.createNewDataSet("BIGWIGGLE") - dataSet.setMeasuredData(False) - - # expected: - # Project_110907_SN792_0059_AC012FACXX_3/BSSE-DSU-1662_CGATGTA_L003_R1_001_sorted.bw - split=name.split('_') - if (len(split) == 6): - incoming_sample=split[1]+ '_'+ split[2] + '_' + split[3] + '_' + split[4]+ ':' + split[-1] - if (len(split) ==4): - incoming_sample=split[1]+ '_'+ split[2] + ':' + split[-1] - - # Looking for BWs: - for root, dirnames, filenames in os.walk(FOLDER + name): - for filename in fnmatch.filter(filenames, BW_PATTERN): - matches.append(os.path.join(root, filename)) - - # Extract values from a samtools view and set the results as DataSet properties - # Command: samtools view -H ETHZ_BSSE_110429_63558AAXX_1_sorted.bam - - arguments = BIGWIGINFO + matches[0] - #print('Arguments: '+ arguments) - cmdResult=os.popen(arguments).read() - - properties=cmdResult.split("\n") - dictProp = convertListToDict(properties) - #print(dictProp) - - dataSet.setPropertyValue("VERSION", dictProp['version']) - dataSet.setPropertyValue("ISCOMPRESSED", str(translateBoolean(dictProp['isCompressed']))) - dataSet.setPropertyValue("ISSWAPPED", dictProp['isSwapped']) - dataSet.setPropertyValue("PRIMARYDATASIZE", sanitizeInt(dictProp['primaryDataSize'])) - dataSet.setPropertyValue("PRIMARYINDEXSIZE", sanitizeInt(dictProp['primaryIndexSize'])) - dataSet.setPropertyValue("ZOOMLEVELS", dictProp['zoomLevels']) - dataSet.setPropertyValue("CHROMCOUNT", dictProp['chromCount']) - dataSet.setPropertyValue("BASESCOVERED", sanitizeInt(dictProp['basesCovered'])) - dataSet.setPropertyValue("MEAN", dictProp['mean']) - dataSet.setPropertyValue("MIN", dictProp['min']) - dataSet.setPropertyValue("MAX", dictProp['max']) - dataSet.setPropertyValue("STD", dictProp['std']) - - # Add the incoming file into the data set - transaction.moveFile(incomingPath, dataSet) - - # Get the search service - search_service = transaction.getSearchService() - - # Search for the sample - sc = SearchCriteria() - sc.addMatchClause(SearchCriteria.MatchClause.createAttributeMatch(SearchCriteria.MatchClauseAttribute.CODE, incoming_sample)); - foundSamples = search_service.searchForSamples(sc) - - if foundSamples.size() > 0: - dataSet.setSample(foundSamples[0]) - - # Search for parent data set of the same sample - dataSetSc = SearchCriteria() - dataSetSc.addMatchClause(SearchCriteria.MatchClause.createAttributeMatch(SearchCriteria.MatchClauseAttribute.TYPE, 'FASTQ_GZ')) - dataSetSc.addSubCriteria(SearchSubCriteria.createSampleCriteria(sc)) - foundDataSets = search_service.searchForDataSets(dataSetSc) - if foundDataSets.size() > 0: - dataSet.setParentDatasets([ds.getDataSetCode() for ds in foundDataSets]) diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/register-bowtie/plugin.properties b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/register-bowtie/plugin.properties deleted file mode 100644 index f0fac2c142a23dfcfcc5e3fb1a9946f4fd182fb6..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/register-bowtie/plugin.properties +++ /dev/null @@ -1,11 +0,0 @@ -# -# Drop box for registering a flow cell output as a data set -# -# Variables: -# incoming-root-dir -# Path to the directory which contains incoming directories for drop boxes. -incoming-dir = ${incoming-root-dir}/register-bowtie -incoming-data-completeness-condition = marker-file -top-level-data-set-handler = ch.systemsx.cisd.etlserver.registrator.api.v2.JythonTopLevelDataSetHandlerV2 -script-path = register-bowtie.py -storage-processor = ch.systemsx.cisd.etlserver.DefaultStorageProcessor diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/register-bowtie/register-bowtie.py b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/register-bowtie/register-bowtie.py deleted file mode 100644 index 0e8f218b29bc74f8c1113a0e3a3a5b1e54d379b7..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/register-bowtie/register-bowtie.py +++ /dev/null @@ -1,40 +0,0 @@ -''' -This is handling bowtie-BAM files and extracts some properties from the BAM header and -the samtools flagstat command. The results are formatted and attached as a property -to the openBIS DataSet. -Prerequisites are the DataSetType: ALIGNMENT and -the following properties assigned to the DataSetType mentioned above: -ALIGNMENT_SOFTWARE, ISSUED_COMMAND, SAMTOOLS_FLAGSTAT, -TOTAL_READS, MAPPED_READS - -Obviously you need a working samtools binary - -Uses 'flagstat' and 'view -H' -''' - -import os -import fnmatch -import re -from ch.systemsx.cisd.openbis.generic.shared.api.v1.dto import SearchCriteria -from ch.systemsx.cisd.openbis.generic.shared.api.v1.dto import SearchSubCriteria - -FOLDER='/links/shared/dsu/dss/register-bowtie/' -SAMTOOLS='/links/application/dsu/samtools/samtools' -BAM_PATTERN='*.bam' - -matches = [] -searchStrings = ['@PG'] -programList = [] - -# ----------------------------------------------------------------------------- - -def process(transaction): - - incomingPath = transaction.getIncoming().getName() - - dataSet = transaction.createNewDataSet("ALIGNMENT") - dataSet.setMeasuredData(False) - - matches.append(incomingPath) - # Add the incoming file into the data set - transaction.moveFile(incomingPath, dataSet) diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/register-cluster-alignment-java/lib/AlignmentJavaDataSetRegistrationDropboxV2.jar b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/register-cluster-alignment-java/lib/AlignmentJavaDataSetRegistrationDropboxV2.jar deleted file mode 100644 index 6b0737361eb622ffefb0267e2fa778eadb2bea9d..0000000000000000000000000000000000000000 Binary files a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/register-cluster-alignment-java/lib/AlignmentJavaDataSetRegistrationDropboxV2.jar and /dev/null differ diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/register-cluster-alignment-java/lib/alignment.jar.sv b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/register-cluster-alignment-java/lib/alignment.jar.sv deleted file mode 100644 index 118b26512a0893928a450b3b6e90e475ad11ff84..0000000000000000000000000000000000000000 Binary files a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/register-cluster-alignment-java/lib/alignment.jar.sv and /dev/null differ diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/register-cluster-alignment-java/lib/alignment.jar.sv2 b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/register-cluster-alignment-java/lib/alignment.jar.sv2 deleted file mode 100644 index 118b26512a0893928a450b3b6e90e475ad11ff84..0000000000000000000000000000000000000000 Binary files a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/register-cluster-alignment-java/lib/alignment.jar.sv2 and /dev/null differ diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/register-cluster-alignment-java/plugin.properties b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/register-cluster-alignment-java/plugin.properties deleted file mode 100644 index 35b2b5253d07f4bbba318804faa7f1534f691fca..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/register-cluster-alignment-java/plugin.properties +++ /dev/null @@ -1,7 +0,0 @@ -incoming-dir = ${root}/dss/register-cluster-alignment-java -top-level-data-set-handler = ch.systemsx.cisd.etlserver.registrator.api.v2.JavaTopLevelDataSetHandlerV2 -program-class = ch.systemsx.cisd.etlserver.registrator.api.v2.AlignmentJavaDataSetRegistrationDropboxV2 -#program-class = AlignmentJavaDataSetRegistrationDropboxV2 -storage-processor = ch.systemsx.cisd.etlserver.DefaultStorageProcessor -incoming-dir-create = true -incoming-data-completeness-condition = auto-detection diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/register-dummy/plugin.properties b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/register-dummy/plugin.properties deleted file mode 100644 index ad9cc236b385ad8c1a9d8d8119d276f3d428bdae..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/register-dummy/plugin.properties +++ /dev/null @@ -1,11 +0,0 @@ -# -# Drop box for registering a flow cell output as a data set -# -# Variables: -# incoming-root-dir -# Path to the directory which contains incoming directories for drop boxes. -incoming-dir = ${incoming-root-dir}/register-dummy -incoming-data-completeness-condition = marker-file -top-level-data-set-handler = ch.systemsx.cisd.etlserver.registrator.api.v2.JythonTopLevelDataSetHandlerV2 -script-path = register-dummy.py -storage-processor = ch.systemsx.cisd.etlserver.DefaultStorageProcessor diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/register-dummy/register-dummy.py b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/register-dummy/register-dummy.py deleted file mode 100644 index 01a2eec1e4fe3fd271f352be60b1b43211f84d29..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/register-dummy/register-dummy.py +++ /dev/null @@ -1,56 +0,0 @@ -''' -@copyright: -2014 ETH Zuerich, CISD - -@license: -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - -http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. - -@author: -Manuel Kohler -''' - -import os -import shutil -from ch.systemsx.cisd.openbis.generic.shared.api.v1.dto import SearchCriteria -from ch.systemsx.cisd.openbis.generic.shared.api.v1.dto import SearchSubCriteria - - -def splitFolderName (folderName): - runFolder, lane = folderName.rsplit("_", 1) - return runFolder + ":" + lane - -def searchSample (transaction, sampleCode): - # Get the search service - search_service = transaction.getSearchService() - - print("Searching for " + sampleCode) - # Search for the sample - sc = SearchCriteria() - sc.addMatchClause(SearchCriteria.MatchClause.createAttributeMatch(SearchCriteria.MatchClauseAttribute.CODE, sampleCode)) - foundSamples = search_service.searchForSamples(sc) - assert(len(foundSamples), 1) - return foundSamples[0] - -def process(transaction): - - # expected incoming folder names: - # 120917_SN792_0158_AC125KACXX_4 - - incomingFolder = transaction.getIncoming().getName() - flowLaneName = splitFolderName(incomingFolder) - flowLane = searchSample(transaction, flowLaneName) - - dataSet = transaction.createNewDataSet("ALIGNMENT") - dataSet.setMeasuredData(False) - dataSet.setSample(flowLane) - transaction.moveFile(transaction.getIncoming().getPath(), dataSet) diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/register-fastqc/plugin.properties b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/register-fastqc/plugin.properties deleted file mode 100644 index 353a2b7aa8a30b04423e2ffb0645814123ce71f4..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/register-fastqc/plugin.properties +++ /dev/null @@ -1,11 +0,0 @@ -# -# Drop box for registering a flow cell output as a data set -# -# Variables: -# incoming-root-dir -# Path to the directory which contains incoming directories for drop boxes. -incoming-dir = ${incoming-root-dir}/register-fastqc -incoming-data-completeness-condition = marker-file -top-level-data-set-handler = ch.systemsx.cisd.etlserver.registrator.api.v2.JythonTopLevelDataSetHandlerV2 -script-path = register-fastqc.py -storage-processor = ch.systemsx.cisd.etlserver.DefaultStorageProcessor diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/register-fastqc/register-fastqc.py b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/register-fastqc/register-fastqc.py deleted file mode 100644 index d538798b932ddb0c7c4edaafd2d31ba57cb9c3af..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/register-fastqc/register-fastqc.py +++ /dev/null @@ -1,82 +0,0 @@ -''' -@copyright: -2012 ETH Zuerich, CISD - -@license: -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - -http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. - -@note -print statements go to: <openBIS_HOME>/datastore_server/log/startup_log.txt -Expects as incoming folder: Project_120427_SN792_0110_AD0YCGACXX_1 - -@author: -Manuel Kohler -''' - -import os -import shutil -from ch.systemsx.cisd.openbis.generic.shared.api.v1.dto import SearchCriteria -from ch.systemsx.cisd.openbis.generic.shared.api.v1.dto import SearchSubCriteria - -def renameFiles(dir, flowcellName): - print dir - print flowcellName - for root, dirs, files in os.walk(dir): - for file in files: - print root + file - os.rename(root + '/' + file, root + "/" + flowcellName + "_" + file) - - -def process(transaction): - - incomingPath = transaction.getIncoming().getPath() - incomingFolder = transaction.getIncoming().getName() - - if (len(incomingFolder.split("_")) == 2): - flowCell, flowLane = incomingFolder.split("_") - else: - fcAndLane = incomingFolder.split("_",1)[-1] - flowCell, flowLane = fcAndLane.rsplit("_",1) - - nameLength = len(flowCell.split('_')) - if nameLength == 5: - flowCell = '-'.join(flowCell.rsplit('_',1)) - - print flowCell - print flowLane - - # Get the search service - search_service = transaction.getSearchService() - - # Search for the sample - sc = SearchCriteria() - sc.addMatchClause(SearchCriteria.MatchClause.createAttributeMatch(SearchCriteria.MatchClauseAttribute.CODE, flowCell)) - foundSamples = search_service.searchForSamples(sc) - - if foundSamples.size() > 0: - - # Search for another data set of the same sample and make it a child of it - sampleSc = SearchCriteria() - sampleSc.addSubCriteria(SearchSubCriteria.createSampleContainerCriteria(sc)) - foundContainedSamples = search_service.searchForSamples(sampleSc) - if foundContainedSamples.size() > 0: - dataSet = transaction.createNewDataSet("FASTQC") - dataSet.setMeasuredData(False) - for indx in range(0, len(foundContainedSamples)): - lane = foundContainedSamples[indx].getCode().split(':')[-1] - print lane - if (flowLane == lane): - dataSet.setSample(foundContainedSamples[indx]) - # Add the incoming file into the data set - transaction.moveFile(incomingPath + "/fastqc/", dataSet) - break diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/register-flowcell-hiseq/plugin.properties b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/register-flowcell-hiseq/plugin.properties deleted file mode 100644 index 8730e628162fd815db73599ea7cf4b7025b6a00b..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/register-flowcell-hiseq/plugin.properties +++ /dev/null @@ -1,12 +0,0 @@ -# -# Drop box for registering a flow cell output as a data set -# -# Variables: -# incoming-root-dir -# Path to the directory which contains incoming directories for drop boxes. -incoming-dir = ${incoming-root-dir}/register-flowcell-hiseq -#incoming-dir = /links/sonas/cisd/store/incoming-flowCell -incoming-data-completeness-condition = marker-file -top-level-data-set-handler = ch.systemsx.cisd.etlserver.registrator.api.v2.JythonTopLevelDataSetHandlerV2 -script-path = register-flowcell-hiseq.py -storage-processor = ch.systemsx.cisd.etlserver.DefaultStorageProcessor diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/register-flowcell-hiseq/register-flowcell-hiseq.py b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/register-flowcell-hiseq/register-flowcell-hiseq.py deleted file mode 100644 index 62ab3d79aa39045f4703b86a4161dce3deaf741a..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/register-flowcell-hiseq/register-flowcell-hiseq.py +++ /dev/null @@ -1,61 +0,0 @@ -''' -@copyright: -2012 ETH Zuerich, CISD - -@license: -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - -http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. - -@description: -Registers an incoming directory as a data set in openBIS. The name of the directory is used to -search for the matching sample. - -@note: -print statements go to: <openBIS_HOME>/datastore_server/log/startup_log.txt -expected incoming Name for HiSeq runs: 110715_SN792_0054_BC035RACXX -expected incoming Name for GAII runs: 110812_6353WAAXX - -@author: -Manuel Kohler -''' - -import os -import subprocess -from ch.systemsx.cisd.openbis.generic.shared.api.v1.dto import SearchCriteria - -def process(transaction): - - args = ['/links/application/dsu/export_QGF_master_data/export_QGF_master_data.sh'] - - try: - p = subprocess.Popen(args, stdout=subprocess.PIPE) - print(p.communicate()[0]) - except: - print("Could not run: " + str(args)) - - incomingPath = transaction.getIncoming().getPath() - name = transaction.getIncoming().getName() - - split=name.split("_") - if (len(split) == 4): - dataSet = transaction.createNewDataSet("ILLUMINA_HISEQ_OUTPUT") - - dataSet.setMeasuredData(False) - - search_service = transaction.getSearchService() - sc = SearchCriteria() - sc.addMatchClause(SearchCriteria.MatchClause.createAttributeMatch(SearchCriteria.MatchClauseAttribute.CODE, name)); - foundSamples = search_service.searchForSamples(sc) - - if foundSamples.size() > 0: - transaction.moveFile(incomingPath, dataSet) - dataSet.setSample(foundSamples[0]) \ No newline at end of file diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/register-flowcell-miseq/plugin.properties b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/register-flowcell-miseq/plugin.properties deleted file mode 100644 index 7f274a70db5ba39005bf8934437666fdbfdccda0..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/register-flowcell-miseq/plugin.properties +++ /dev/null @@ -1,12 +0,0 @@ -# -# Drop box for registering a flow cell output as a data set -# -# Variables: -# incoming-root-dir -# Path to the directory which contains incoming directories for drop boxes. -incoming-dir = ${incoming-root-dir}/register-flowcell-miseq -incoming-data-completeness-condition = marker-file -top-level-data-set-handler = ch.systemsx.cisd.etlserver.registrator.api.v2.JythonTopLevelDataSetHandlerV2 -script-path = register-flowcell-miseq.py -storage-processor = ch.systemsx.cisd.etlserver.DefaultStorageProcessor - diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/register-flowcell-miseq/register-flowcell-miseq.py b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/register-flowcell-miseq/register-flowcell-miseq.py deleted file mode 100644 index c9321e6c87eb162eeee01ea5a05a815d8563bf18..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/register-flowcell-miseq/register-flowcell-miseq.py +++ /dev/null @@ -1,60 +0,0 @@ -''' -@copyright: -2012 ETH Zuerich, CISD - -@license: -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - -http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. - -@description: -Registers an incoming directory as a data set in openBIS. The name of the directory is used to -search for the matching sample. - -@note: -print statements go to: <openBIS_HOME>/datastore_server/log/startup_log.txt -expected incoming Name for MiSeq runs: 120726_M00721_0011_A000000000-A1FVF - -@author: -Manuel Kohler -''' - -from ch.systemsx.cisd.openbis.generic.shared.api.v1.dto import SearchCriteria - -DATASET_TYPE_MISEQ = "ILLUMINA_MISEQ_OUTPUT" - -def process(transaction): - - incomingPath = transaction.getIncoming().getAbsolutePath() - flowCellId = transaction.getIncoming().getName() - dataSet = transaction.createNewDataSet(DATASET_TYPE_MISEQ) - - # Create a data set and set type - dataSet.setMeasuredData(False) - - # Get the search service - search_service = transaction.getSearchService() - - # Search for the sample - sc = SearchCriteria() - sc.addMatchClause(SearchCriteria.MatchClause.createAttributeMatch(SearchCriteria.MatchClauseAttribute.CODE, flowCellId)); - foundFlowCells = search_service.searchForSamples(sc) - - # Make sure there is only one Flow cell registered with this Flow Cell Name / ID - try: - assert foundFlowCells.size() == 1 - except AssertionError: - print (str(foundFlowCells.size()) + ' flow cells found which match the criterias: '+ flowCellId) - - print (foundFlowCells) - # Add the incoming file into the data set - transaction.moveFile(incomingPath, dataSet) - dataSet.setSample(foundFlowCells[0]) diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/register-flowcell-nextseq/plugin.properties b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/register-flowcell-nextseq/plugin.properties deleted file mode 100644 index 29183e5d548f13510b9a29102bb28789ff658b93..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/register-flowcell-nextseq/plugin.properties +++ /dev/null @@ -1,12 +0,0 @@ -# -# Drop box for registering a flow cell output as a data set -# -# Variables: -# incoming-root-dir -# Path to the directory which contains incoming directories for drop boxes. -incoming-dir = ${incoming-root-dir}/register-flowcell-nextseq -incoming-data-completeness-condition = marker-file -top-level-data-set-handler = ch.systemsx.cisd.etlserver.registrator.api.v2.JythonTopLevelDataSetHandlerV2 -script-path = register-flowcell-nextseq.py -storage-processor = ch.systemsx.cisd.etlserver.DefaultStorageProcessor - diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/register-flowcell-nextseq/register-flowcell-nextseq.py b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/register-flowcell-nextseq/register-flowcell-nextseq.py deleted file mode 100644 index 8f70c8c817e7f8d95c11dc99884318484b6958c7..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/register-flowcell-nextseq/register-flowcell-nextseq.py +++ /dev/null @@ -1,62 +0,0 @@ -''' -@copyright: -2012 ETH Zuerich, CISD - -@license: -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - -http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. - -@description: -Registers an incoming directory as a data set in openBIS. The name of the directory is used to -search for the matching sample. - -@note: -print statements go to: <openBIS_HOME>/datastore_server/log/startup_log.txt -expected incoming Name for MiSeq runs: 120726_M00721_0011_A000000000-A1FVF - -@author: -Manuel Kohler -''' - -from ch.systemsx.cisd.openbis.generic.shared.api.v1.dto import SearchCriteria - -DATASET_TYPE_MISEQ = "ILLUMINA_NEXTSEQ_OUTPUT" - -def process(transaction): - - incomingPath = transaction.getIncoming().getAbsolutePath() - runFolder = transaction.getIncoming().getName() - flowCellId = runFolder.split("_")[-1][1:] - dataSet = transaction.createNewDataSet(DATASET_TYPE_MISEQ) - - # Create a data set and set type - dataSet.setMeasuredData(False) - - # Get the search service - search_service = transaction.getSearchService() - - # Search for the sample - print("Searching for flowcell: " + flowCellId) - sc = SearchCriteria() - sc.addMatchClause(SearchCriteria.MatchClause.createAttributeMatch(SearchCriteria.MatchClauseAttribute.CODE, flowCellId)); - foundFlowCells = search_service.searchForSamples(sc) - - # Make sure there is only one Flow cell registered with this Flow Cell Name / ID - try: - assert foundFlowCells.size() == 1 - except AssertionError: - print (str(foundFlowCells.size()) + ' flow cells found which match the criterias: '+ flowCellId) - - print (foundFlowCells) - # Add the incoming file into the data set - transaction.moveFile(incomingPath, dataSet) - dataSet.setSample(foundFlowCells[0]) diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/register-flowcell/plugin.properties b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/register-flowcell/plugin.properties deleted file mode 100644 index 82d34c7fd9fa6be9a84252b453ee480fd32a41fa..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/register-flowcell/plugin.properties +++ /dev/null @@ -1,6 +0,0 @@ -incoming-dir = ${incoming-root-dir}/register-flowcell -incoming-data-completeness-condition = marker-file -top-level-data-set-handler = ch.systemsx.cisd.etlserver.registrator.api.v2.JythonTopLevelDataSetHandlerV2 -script-path = register-flowcell.py -storage-processor = ch.systemsx.cisd.etlserver.DefaultStorageProcessor -jython-version=2.7 diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/register-flowcell/register-flowcell.py b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/register-flowcell/register-flowcell.py deleted file mode 100644 index 2f712bfd7944ca8a0c3cb0c0c29e368e7f079957..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/register-flowcell/register-flowcell.py +++ /dev/null @@ -1,106 +0,0 @@ -''' -@copyright: -2015 ETH Zuerich, SIS - -@license: -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - -http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. - -@description: -Registers an incoming directory as a data set in openBIS. The name of the directory is used to -search for the matching sample. - -@note: -print statements go to: <openBIS_HOME>/datastore_server/log/startup_log.txt - -@author: -Manuel Kohler -''' - -import re -import glob -import os -from itertools import islice -from ch.systemsx.cisd.openbis.generic.shared.api.v1.dto import SearchCriteria - -# The following module is located in the path defined in the datastore_server.conf -# Look for: -Dpython.path} -from gfb_utils import * - -ILLUMINA_HISEQ_OUTPUT_DS_TYPE = "ILLUMINA_HISEQ_OUTPUT" -ILLUMINA_MISEQ_OUTPUT_DS_TYPE = "ILLUMINA_MISEQ_OUTPUT" -ILLUMINA_NEXTSEQ_OUTPUT_DS_TYPE = "ILLUMINA_NEXTSEQ_OUTPUT" - - -def get_bcl_version(file): - pattern = re.compile("bcl2fastq") - matching_line_list = [] - bcl_version = "Not specified" - number_of_lines_to_read = 3 - - if file: - with open(file[0]) as nohup: - head = list(islice(nohup, number_of_lines_to_read)) - for line in head: - if re.search(pattern, line): - matching_line_list.append(line) - else: - print("File " + str(file) + " not found!") - - if matching_line_list: - bcl_version = matching_line_list[0].strip() - return bcl_version - - -def process(transaction): - incoming = transaction.getIncoming() - incoming_path = incoming.getAbsolutePath() - run_id = incoming.getName() - model = get_model(run_id) - - if model in HISEQ_LIST: - DATASET_TYPE = ILLUMINA_HISEQ_OUTPUT_DS_TYPE - elif model in [Sequencers.NEXTSEQ_500]: - DATASET_TYPE = ILLUMINA_NEXTSEQ_OUTPUT_DS_TYPE - elif model in [Sequencers.MISEQ]: - DATASET_TYPE = ILLUMINA_MISEQ_OUTPUT_DS_TYPE - else: - print("Could set a data set type for flowcell data!") - - thread_property_dict = get_thread_properties(transaction) - absolutePath = os.path.dirname(os.path.realpath(thread_property_dict['script-path'])) - print(os.path.basename(absolutePath) + ": Auto-detected Illumina model: " + model) - - run_date, sequencer_id, running_number, tray_and_fcId = run_id.split("_") - tray = tray_and_fcId[0] - if model in [Sequencers.MISEQ]: - fc_id = tray_and_fcId - else: - fc_id = tray_and_fcId[1:] - - file = glob.glob(os.path.join(incoming_path, "nohup*")) - bcl_version = get_bcl_version(file) - - found_flow_cell = search_unique_sample(transaction, fc_id) - - search_service = transaction.getSearchService() - get_flowcell_with_contained_samples = search_service.getSample(found_flow_cell[0].getSampleIdentifier()) - flowlanes = get_flowcell_with_contained_samples.getContainedSamples() - - for lane in flowlanes: - mutable_lane = transaction.getSampleForUpdate(lane.getSampleIdentifier()) - mutable_lane.setPropertyValue("BCL_VERSION", bcl_version) - - dataSet = transaction.createNewDataSet(DATASET_TYPE) - dataSet.setMeasuredData(False) - transaction.moveFile(incoming_path, dataSet) - dataSet.setSample(found_flow_cell[0]) diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/register-flowlane/lib/crc32_v2.c b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/register-flowlane/lib/crc32_v2.c deleted file mode 100644 index b38d22d40f641254661994d4cc01492bb7c8d35a..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/register-flowlane/lib/crc32_v2.c +++ /dev/null @@ -1,206 +0,0 @@ -/*----------------------------------------------------------------------------*\ - * CRC-32 version 2.0.0 by Craig Bruce, 2006-04-29. - * - * This program generates the CRC-32 values for the files named in the - * command-line arguments. These are the same CRC-32 values used by GZIP, - * PKZIP, and ZMODEM. The Crc32_ComputeBuf() can also be detached and - * used independently. - * - * THIS PROGRAM IS PUBLIC-DOMAIN SOFTWARE. - * - * Based on the byte-oriented implementation "File Verification Using CRC" - * by Mark R. Nelson in Dr. Dobb's Journal, May 1992, pp. 64-67. - * - * v1.0.0: original release. - * v1.0.1: fixed printf formats. - * v1.0.2: fixed something else. - * v1.0.3: replaced CRC constant table by generator function. - * v1.0.4: reformatted code, made ANSI C. 1994-12-05. - * v2.0.0: rewrote to use memory buffer & static table, 2006-04-29. -\*----------------------------------------------------------------------------*/ - -#include <stdio.h> -#include <stdlib.h> - -/*----------------------------------------------------------------------------*\ - * Local functions -\*----------------------------------------------------------------------------*/ - -static int Crc32_ComputeFile( FILE *file, unsigned long *outCrc32 ); - -static unsigned long Crc32_ComputeBuf( unsigned long inCrc32, const void *buf, - size_t bufLen ); - -/*----------------------------------------------------------------------------*\ - * NAME: - * main() - main function for CRC-32 generation - * DESCRIPTION: - * Computes the CRC-32 value for the set of files named in the command- - * line arguments. - * ARGUMENTS: - * argc - command-line-argument count - * argv - command-line-argument strings - * RETURNS: - * err - 0 on success or executes exit(1) on error - * ERRORS: - * - file errors -\*----------------------------------------------------------------------------*/ - -int main( int argc, const char *argv[] ) -{ - FILE *file = NULL; - const char *filename; - unsigned long argIdx; - unsigned long crc32; - int err; - - /** compute crcs **/ - if (argc < 2) { - /** read from 'stdin' if no arguments given **/ - err = Crc32_ComputeFile( stdin, &crc32 ); - if (err == -1) goto ERR_EXIT; - printf("crc32 = 0x%08lX for (stdin)\n", crc32 ); - } else { - /** report named files in sequence **/ - for (argIdx=1; argIdx < argc; argIdx++) { - filename = argv[argIdx]; - file = fopen( filename, "rb" ); - if (file == NULL) { - fprintf( stderr, "error opening file \"%s\"!\n", filename ); - goto ERR_EXIT; - } - err = Crc32_ComputeFile( file, &crc32 ); - if (err == -1) goto ERR_EXIT; - /*printf("crc32 = 0x%08lX for \"%s\"\n", crc32, filename );*/ - printf("%08lX", crc32); - err = fclose( file ); - file = NULL; - if (err == EOF) { - fprintf( stderr, "error closing file \"%s\"!\n", filename ); - goto ERR_EXIT; - } - } - } - return( 0 ); - - /** error exit **/ -ERR_EXIT: - if (file != NULL) fclose( file ); - exit( 1 ); -} - -/*----------------------------------------------------------------------------*\ - * NAME: - * Crc32_ComputeFile() - compute CRC-32 value for a file - * DESCRIPTION: - * Computes the CRC-32 value for an opened file. - * ARGUMENTS: - * file - file pointer - * outCrc32 - (out) result CRC-32 value - * RETURNS: - * err - 0 on success or -1 on error - * ERRORS: - * - file errors -\*----------------------------------------------------------------------------*/ - -static int Crc32_ComputeFile( FILE *file, unsigned long *outCrc32 ) -{ -# define CRC_BUFFER_SIZE 8192 - unsigned char buf[CRC_BUFFER_SIZE]; - size_t bufLen; - - /** accumulate crc32 from file **/ - *outCrc32 = 0; - while (1) { - bufLen = fread( buf, 1, CRC_BUFFER_SIZE, file ); - if (bufLen == 0) { - if (ferror(file)) { - fprintf( stderr, "error reading file\n" ); - goto ERR_EXIT; - } - break; - } - *outCrc32 = Crc32_ComputeBuf( *outCrc32, buf, bufLen ); - } - return( 0 ); - - /** error exit **/ -ERR_EXIT: - return( -1 ); -} - -/*----------------------------------------------------------------------------*\ - * NAME: - * Crc32_ComputeBuf() - computes the CRC-32 value of a memory buffer - * DESCRIPTION: - * Computes or accumulates the CRC-32 value for a memory buffer. - * The 'inCrc32' gives a previously accumulated CRC-32 value to allow - * a CRC to be generated for multiple sequential buffer-fuls of data. - * The 'inCrc32' for the first buffer must be zero. - * ARGUMENTS: - * inCrc32 - accumulated CRC-32 value, must be 0 on first call - * buf - buffer to compute CRC-32 value for - * bufLen - number of bytes in buffer - * RETURNS: - * crc32 - computed CRC-32 value - * ERRORS: - * (no errors are possible) -\*----------------------------------------------------------------------------*/ - -static unsigned long Crc32_ComputeBuf( unsigned long inCrc32, const void *buf, - size_t bufLen ) -{ - static const unsigned long crcTable[256] = { - 0x00000000,0x77073096,0xEE0E612C,0x990951BA,0x076DC419,0x706AF48F,0xE963A535, - 0x9E6495A3,0x0EDB8832,0x79DCB8A4,0xE0D5E91E,0x97D2D988,0x09B64C2B,0x7EB17CBD, - 0xE7B82D07,0x90BF1D91,0x1DB71064,0x6AB020F2,0xF3B97148,0x84BE41DE,0x1ADAD47D, - 0x6DDDE4EB,0xF4D4B551,0x83D385C7,0x136C9856,0x646BA8C0,0xFD62F97A,0x8A65C9EC, - 0x14015C4F,0x63066CD9,0xFA0F3D63,0x8D080DF5,0x3B6E20C8,0x4C69105E,0xD56041E4, - 0xA2677172,0x3C03E4D1,0x4B04D447,0xD20D85FD,0xA50AB56B,0x35B5A8FA,0x42B2986C, - 0xDBBBC9D6,0xACBCF940,0x32D86CE3,0x45DF5C75,0xDCD60DCF,0xABD13D59,0x26D930AC, - 0x51DE003A,0xC8D75180,0xBFD06116,0x21B4F4B5,0x56B3C423,0xCFBA9599,0xB8BDA50F, - 0x2802B89E,0x5F058808,0xC60CD9B2,0xB10BE924,0x2F6F7C87,0x58684C11,0xC1611DAB, - 0xB6662D3D,0x76DC4190,0x01DB7106,0x98D220BC,0xEFD5102A,0x71B18589,0x06B6B51F, - 0x9FBFE4A5,0xE8B8D433,0x7807C9A2,0x0F00F934,0x9609A88E,0xE10E9818,0x7F6A0DBB, - 0x086D3D2D,0x91646C97,0xE6635C01,0x6B6B51F4,0x1C6C6162,0x856530D8,0xF262004E, - 0x6C0695ED,0x1B01A57B,0x8208F4C1,0xF50FC457,0x65B0D9C6,0x12B7E950,0x8BBEB8EA, - 0xFCB9887C,0x62DD1DDF,0x15DA2D49,0x8CD37CF3,0xFBD44C65,0x4DB26158,0x3AB551CE, - 0xA3BC0074,0xD4BB30E2,0x4ADFA541,0x3DD895D7,0xA4D1C46D,0xD3D6F4FB,0x4369E96A, - 0x346ED9FC,0xAD678846,0xDA60B8D0,0x44042D73,0x33031DE5,0xAA0A4C5F,0xDD0D7CC9, - 0x5005713C,0x270241AA,0xBE0B1010,0xC90C2086,0x5768B525,0x206F85B3,0xB966D409, - 0xCE61E49F,0x5EDEF90E,0x29D9C998,0xB0D09822,0xC7D7A8B4,0x59B33D17,0x2EB40D81, - 0xB7BD5C3B,0xC0BA6CAD,0xEDB88320,0x9ABFB3B6,0x03B6E20C,0x74B1D29A,0xEAD54739, - 0x9DD277AF,0x04DB2615,0x73DC1683,0xE3630B12,0x94643B84,0x0D6D6A3E,0x7A6A5AA8, - 0xE40ECF0B,0x9309FF9D,0x0A00AE27,0x7D079EB1,0xF00F9344,0x8708A3D2,0x1E01F268, - 0x6906C2FE,0xF762575D,0x806567CB,0x196C3671,0x6E6B06E7,0xFED41B76,0x89D32BE0, - 0x10DA7A5A,0x67DD4ACC,0xF9B9DF6F,0x8EBEEFF9,0x17B7BE43,0x60B08ED5,0xD6D6A3E8, - 0xA1D1937E,0x38D8C2C4,0x4FDFF252,0xD1BB67F1,0xA6BC5767,0x3FB506DD,0x48B2364B, - 0xD80D2BDA,0xAF0A1B4C,0x36034AF6,0x41047A60,0xDF60EFC3,0xA867DF55,0x316E8EEF, - 0x4669BE79,0xCB61B38C,0xBC66831A,0x256FD2A0,0x5268E236,0xCC0C7795,0xBB0B4703, - 0x220216B9,0x5505262F,0xC5BA3BBE,0xB2BD0B28,0x2BB45A92,0x5CB36A04,0xC2D7FFA7, - 0xB5D0CF31,0x2CD99E8B,0x5BDEAE1D,0x9B64C2B0,0xEC63F226,0x756AA39C,0x026D930A, - 0x9C0906A9,0xEB0E363F,0x72076785,0x05005713,0x95BF4A82,0xE2B87A14,0x7BB12BAE, - 0x0CB61B38,0x92D28E9B,0xE5D5BE0D,0x7CDCEFB7,0x0BDBDF21,0x86D3D2D4,0xF1D4E242, - 0x68DDB3F8,0x1FDA836E,0x81BE16CD,0xF6B9265B,0x6FB077E1,0x18B74777,0x88085AE6, - 0xFF0F6A70,0x66063BCA,0x11010B5C,0x8F659EFF,0xF862AE69,0x616BFFD3,0x166CCF45, - 0xA00AE278,0xD70DD2EE,0x4E048354,0x3903B3C2,0xA7672661,0xD06016F7,0x4969474D, - 0x3E6E77DB,0xAED16A4A,0xD9D65ADC,0x40DF0B66,0x37D83BF0,0xA9BCAE53,0xDEBB9EC5, - 0x47B2CF7F,0x30B5FFE9,0xBDBDF21C,0xCABAC28A,0x53B39330,0x24B4A3A6,0xBAD03605, - 0xCDD70693,0x54DE5729,0x23D967BF,0xB3667A2E,0xC4614AB8,0x5D681B02,0x2A6F2B94, - 0xB40BBE37,0xC30C8EA1,0x5A05DF1B,0x2D02EF8D }; - unsigned long crc32; - unsigned char *byteBuf; - size_t i; - - /** accumulate crc32 for buffer **/ - crc32 = inCrc32 ^ 0xFFFFFFFF; - byteBuf = (unsigned char*) buf; - for (i=0; i < bufLen; i++) { - crc32 = (crc32 >> 8) ^ crcTable[ (crc32 ^ byteBuf[i]) & 0xFF ]; - } - return( crc32 ^ 0xFFFFFFFF ); -} - -/*----------------------------------------------------------------------------*\ - * END OF MODULE: crc32.c -\*----------------------------------------------------------------------------*/ diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/register-flowlane/plugin.properties b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/register-flowlane/plugin.properties deleted file mode 100644 index 8f519c1de0b7c03a12454965c0d2de47e8184a0e..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/register-flowlane/plugin.properties +++ /dev/null @@ -1,6 +0,0 @@ -incoming-dir = ${incoming-root-dir}/register-flowlane -incoming-data-completeness-condition = marker-file -top-level-data-set-handler = ch.systemsx.cisd.etlserver.registrator.api.v2.JythonTopLevelDataSetHandlerV2 -script-path = register-flowlane.py -storage-processor = ch.systemsx.cisd.etlserver.DefaultStorageProcessor -jython-version=2.7 \ No newline at end of file diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/register-flowlane/register-flowlane.py b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/register-flowlane/register-flowlane.py deleted file mode 100644 index 073256eee865c8f7f8d785eb07d0f183f6472214..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/register-flowlane/register-flowlane.py +++ /dev/null @@ -1,360 +0,0 @@ -''' -@copyright: -2015 ETH Zuerich, SIS - -@license: -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - -http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. - -@note: -print statements go to: <openBIS_HOME>/datastore_server/log/startup_log.txt - -@author: -Manuel Kohler -''' - - -import os -import shutil -import re -import subprocess -from collections import OrderedDict -from ch.systemsx.cisd.openbis.generic.shared.api.v1.dto import SearchCriteria -# The following module is located in the path defined in the datastore_server.conf -# Look for: -Dpython.path} -from gfb_utils import * - -from __builtin__ import file - -FASTQ_GZ_PATTERN = "*.fastq.gz" -METADATA_FILE_SUFFIX = "_metadata.tsv" -AFFILIATION_PROPERTY_NAME='AFFILIATION' -INDEX1='BARCODE' -INDEX2='INDEX2' -EXTERNAL_SAMPLE_NAME='EXTERNAL_SAMPLE_NAME' -INDEXREAD1='INDEXREAD' -INDEXREAD2='INDEXREAD2' -SAMPLE_TYPE = 'SAMPLE_TYPE' -SAMPLE_CODE = 'SAMPLE_CODE' -NCBI_ORGANISM_TAXONOMY='NCBI_ORGANISM_TAXONOMY' -PHIX_TAXONOMY_ID='10847' -DEFAULT_INDEX='NoIndex' -CRC32_PATH='lib/crc32' -CRC32_PATH='lib/a.out' - - -def checkOnFileSize(file): - return os.stat(file).st_size == 0 - - -def CRC32_from_file(filename, transaction): - - if checkOnFileSize(filename): - raise Exception("FILE " + filename + " IS EMPTY!") - - threadPropertyDict = get_thread_properties(transaction) - absolutePath = os.path.dirname(os.path.realpath(threadPropertyDict['script-path'])) - fullPathCrc32 = (os.path.join(absolutePath, CRC32_PATH)) - if os.path.exists(fullPathCrc32): - args = [fullPathCrc32, filename] - p = subprocess.Popen(args, stdout=subprocess.PIPE) - cksum = (p.communicate()[0]) - print("Calculated crc32 checksum for: "+ os.path.basename(filename) + " " + cksum) - else: - cksum = 0 & 0xFFFFFFFF - return cksum - - -def writeMetadataFile(transaction, folder_name, meta_data_file_name, sequencing_sample_properties_dict, - fcMetaDataDict, experiment, sample_space, fastqFileList, flowLane): - ''' - Writes a file of meta data related to one sample - ''' - - sequencing_sample_properties_list = sequencing_sample_properties_dict.keys() - sequencing_sample_properties_list.sort() - - expId = experiment.getIdentifier() - try: - - - meta_data_file = open(meta_data_file_name,'w') - for propertyType in sequencing_sample_properties_list: - if (propertyType in [u'FLOW_CELL_PROPERTIES']): - continue - if propertyType in [SAMPLE_TYPE] or propertyType in [SAMPLE_CODE]: - meta_data_file.write(propertyType.encode('utf-8') + "\t" + - str(sequencing_sample_properties_dict[propertyType])+ "\n") - else: - meta_data_file.write(propertyType.encode('utf-8') + "\t" + - sequencing_sample_properties_dict[propertyType].encode('utf-8').replace('\n',',') + "\n") - - meta_data_file.write("EXPERIMENT\t" + expId + "\n".encode('utf-8')) - meta_data_file.write("\nFLOWCELL PROPERTIES\n".encode('utf-8')) - fcMetaDataDict["LANE_NUMBER"] = flowLane - keys = fcMetaDataDict.keys() - keys.sort() - - sequencer_vocabulary_description = get_vocabulary_descriptions(transaction, 'SEQUENCER') - meta_data_file.write('SEQUENCER_MODEL' + "\t" + - sequencer_vocabulary_description[fcMetaDataDict['SEQUENCER']].encode('utf-8') + "\n") - - for k in keys: - meta_data_file.write(k.encode('utf-8') + "\t" + fcMetaDataDict[k].encode('utf-8') + "\n") - - meta_data_file.write("\nFASTQ_FILES\n".encode('utf-8')) - for file in fastqFileList: - meta_data_file.write(os.path.basename(file) + "\t" + str(CRC32_from_file(file, transaction)) + "\n") - - except IOError: - print ('File error, could not write '+ file) - finally: - meta_data_file.close() - - destinationFolder = folder_name - extraCopySciCore (sample_space, meta_data_file_name, destinationFolder) - - -def extraCopySciCore (sample_space, filePath, destinationFolder=""): - ''' - Handles the extra copies of the data for transfer with datamover for SCICORE - ''' - - dropBoxFolder = '/Users/kohleman/tmp/scicore' - #dropBoxFolder = '/links/shared/dsu/dss/customers/biozentrum_scicore/drop-box' - - # if a sample is part of this space list then it will be transferred to sciCore - SPACE_LIST = ["UNI_BASEL_SALZBURGER", "BIOCENTER_HANDSCHIN", "BIOCENTER_ZAVOLAN", - "BIOCENTER_KELLER", "BIOCENTER_SILANDER", "ETHZ_NEUROSTEMX", - "UNI_BASEL_UTZINGER", "UNI_BASEL_GAGNEUX", "BIOZENTRUM_SPANG", - "BIOZENTRUM_JENAL"] - - basename = os.path.basename(filePath) - - if (sample_space in SPACE_LIST): - dirname = os.path.join(dropBoxFolder, destinationFolder) - if not os.path.exists(dirname): - os.mkdir(dirname) - print("COPYING " + filePath + " TO " + dirname) - shutil.copy(filePath, dirname) - else: - print(sample_space + " not in SPACE_LIST. Sample will not be copied to BC2.") - - -def get_sample_properties (transaction, sample): - - sample_properties_dict = {} - # returns Map<String, String> - sample_properties = sample.getSample().getProperties() - sequencing_sample_type = sample.getSampleType() - sequencing_sample_code = sample.getCode() - sample_properties_dict[SAMPLE_TYPE] = sequencing_sample_type - sample_properties_dict[SAMPLE_CODE] = sequencing_sample_code - - for property in sample_properties: - code = property.getPropertyType().getSimpleCode() - sample_properties_dict[code] = property.tryGetAsString() - - ordered_sample_properties_dict = OrderedDict(sorted(sample_properties_dict.items(), key=lambda t: t[0])) - return ordered_sample_properties_dict - - -def searchParents (search_service, parents): - - sc = SearchCriteria() - # set the Search Criteria to an OR condition, default is AND - sc.setOperator(SearchCriteria.SearchOperator.MATCH_ANY_CLAUSES) - # Get the codes for all parents - for parent in parents: - parentSubCode = parent.getSubCode() - sc.addMatchClause(SearchCriteria.MatchClause.createAttributeMatch(SearchCriteria.MatchClauseAttribute.CODE, parentSubCode)); - # all parents of the flow lane - foundParents = search_service.searchForSamples(sc) - return foundParents - - -def renameFiles (fastq_files, undetermined, flow_cell_id): - - newFastqFileList = [] - for file in fastq_files: - if undetermined: - folder = os.path.dirname(file) - fileName = os.path.basename(file) - filepart, suffix = fileName.split('.',1) - new_file = folder + "/" + flow_cell_id + '_' + filepart + "." + suffix - print ("Renaming file " + file + " to " + new_file) - os.rename(file, new_file) - else: - new_file = file - newFastqFileList.append(new_file) - return newFastqFileList - - -def put_files_to_dataset (transaction, dataSet, fastq_files, folder_name, flow_cell_id, sample_space, undetermined): - - for file in fastq_files: - extraCopySciCore (sample_space, file, folder_name) - transaction.moveFile(file, dataSet, folder_name) - -# ------------------------------------------------------------------------------- - -def split_incoming_folder_name (name): - split=name.split("_") - - # expected incoming Name, e.g.: BSSE_QGF_22266_H0W8YBGXX_1 - if (len(split) == 5): - sample_code = '-'.join([split[0], split[1], split[2]]) - flowCellId = split[3] - flowLane = split[-1] - undetermined = False - - # expected Undetermined_H0W8YBGXX - elif (len(split) == 2): - sample_code = '' - flowCellId = split[-1] - flowLane = '1' - undetermined = True - - # MiSeq BSSE_QGF_36097_000000000_AH4PH_1 - elif (len(split) == 6): - sample_code = '-'.join([split[0], split[1], split[2]]) - flowCellId = '-'.join([split[3],split[4]]) - flowLane = split[-1] - undetermined = False - - #MiSeq Undetermined_000000000_AH4PH_1 - elif (len(split) == 4): - sample_code = '' - flowCellId = '-'.join([split[1], split[2]]) - flowLane = split[-1] - undetermined = True - else: - print("Expected different naming schema!") - - incoming_sample = flowCellId + ':' + flowLane - return sample_code, flowCellId, flowLane, incoming_sample, undetermined - -# ------------------------------------------------------------------------------- - -def get_vocabulary_descriptions (transaction, vocabulary_name): - vocabulary_descriptions_dict = {} - vocabulary = transaction.getVocabulary(vocabulary_name) - vocabulary_terms = vocabulary.getTerms() - for term in vocabulary_terms: - vocabulary_descriptions_dict[term.getCode()] = term.getDescription() - return vocabulary_descriptions_dict - -# ------------------------------------------------------------------------------- - - -def process_regular_samples(transaction, name, sample_code, flowLane, fastq_files, first_fastq_file, search_unique_sample, fcMetaDataDict, dataSet): - foundSample = search_unique_sample(transaction, sample_code) - sequencing_sample = foundSample[0].getSample() - experiment = sequencing_sample.getExperiment() - sequencing_sample_code = sequencing_sample.getCode() - print "sequencing_sample_code: " + sequencing_sample_code - sequencing_sample_properties_dict = get_sample_properties(transaction, foundSample[0]) - if (INDEX1 in sequencing_sample_properties_dict) and (fcMetaDataDict[INDEXREAD1] > 0): - #print(sequencing_sample_properties_dict[INDEX1]) - dataSet.setPropertyValue(INDEX1, sequencing_sample_properties_dict[INDEX1]) - if (INDEX2 in sequencing_sample_properties_dict) and (fcMetaDataDict[INDEXREAD2] > 0): - dataSet.setPropertyValue(INDEX2, sequencing_sample_properties_dict[INDEX2]) - dataSet.setPropertyValue(EXTERNAL_SAMPLE_NAME, sequencing_sample_properties_dict[EXTERNAL_SAMPLE_NAME]) - sample_space = foundSample[0].getSpace() - filepart, suffix = first_fastq_file.split('.', 1) - meta_data_file_name = filepart.rsplit('_', 2)[0] + METADATA_FILE_SUFFIX - # get a file from the IDataSetRegistrationTransaction so it is automatically part of the data set - meta_data_file_path = transaction.createNewFile(dataSet, name, meta_data_file_name) - writeMetadataFile(transaction, name, meta_data_file_path, sequencing_sample_properties_dict, fcMetaDataDict, experiment, sample_space, fastq_files, flowLane) - - return fastq_files, sample_space - - -def process_undetermined(transaction, undetermined, name, flowCellId, flowLane, fastq_files, first_fastq_file, search_service, fcMetaDataDict, parents, dataSet): - sample_space = "" - newFastqFiles = [] - lane_parents = searchParents(search_service, parents) - print "Found " + str(lane_parents.size()) + " parents" - newFastqFiles = renameFiles(fastq_files, undetermined, flowCellId) - for parent in lane_parents: - sequencing_sample_properties_dict = get_sample_properties(transaction, parent) - parent_sample = parent.getSample() - sample_code = parent_sample.getCode() - experiment = parent_sample.getExperiment() - sample_space = parent.getSpace() - - # Special Sample Types without index (e.g. ILLUMINA_SEQUENCING_NEUROSTEMX_SINGLECELL) are caught here. - # as those samples do not have a NCBI ORGANISM TAXONOMY - if NCBI_ORGANISM_TAXONOMY not in sequencing_sample_properties_dict: - print sample_code + ": Processing Sample without NCBI ORGANISM TAXONOMY: ILLUMINA_SEQUENCING_NEUROSTEMX_SINGLECELL" - meta_data_file_path = transaction.createNewFile(dataSet, name, sample_code + '_' + flowCellId + '_' + first_fastq_file.split('.')[0] + METADATA_FILE_SUFFIX) - writeMetadataFile(transaction, name, meta_data_file_path, sequencing_sample_properties_dict, fcMetaDataDict, experiment, sample_space, newFastqFiles, flowLane) - - elif (INDEX1 not in sequencing_sample_properties_dict or sequencing_sample_properties_dict[INDEX1] == 'NOINDEX') and \ - (INDEX2 not in sequencing_sample_properties_dict or sequencing_sample_properties_dict[INDEX2] == 'NOINDEX') and \ - (sequencing_sample_properties_dict[NCBI_ORGANISM_TAXONOMY] != PHIX_TAXONOMY_ID): - print 'NONINDEXED sample and Taxonomy id is NOT ' + PHIX_TAXONOMY_ID + ', probably a pool: ' + sample_code - meta_data_file_path = transaction.createNewFile(dataSet, name, sample_code + '_' + flowCellId + '_' + first_fastq_file.split('.')[0] + METADATA_FILE_SUFFIX) - writeMetadataFile(transaction, name, meta_data_file_path, sequencing_sample_properties_dict, fcMetaDataDict, experiment, sample_space, newFastqFiles, flowLane) - - else: - print sample_code + ": Create parent meta data file" - meta_data_file_path = transaction.createNewFile(dataSet, name, 'PARENT_' + sample_code + '_' + flowCellId + METADATA_FILE_SUFFIX) - writeMetadataFile(transaction, name, meta_data_file_path, sequencing_sample_properties_dict, fcMetaDataDict, experiment, sample_space, [], flowLane) - - return newFastqFiles, sample_space - -def process(transaction): - - undetermined = False - print("\n" + str(datetime.now())) - - incomingPath = transaction.getIncoming().getAbsolutePath() - name = transaction.getIncoming().getName() - - sample_code, flowCellId, flowLane, incoming_sample, undetermined = split_incoming_folder_name (name) - - # get all fastqs - fastq_files = get_file_names(incomingPath, FASTQ_GZ_PATTERN) - - # BSSE-QGF-22266-H0W8YBGXX-1-654-BC3-TTAGGC_S1_L001_R1_001.fastq.gz - # BSSE-QGF-22051-H0T25AGXX-1-1-1-TAAGGCGA-CTCTCTAT_S46_L001_R1_001.fastq.gz - first_fastq_file = os.path.basename(fastq_files[0]) - - search_service = transaction.getSearchService() - - flowcell_sample_immutable = search_unique_sample (transaction, flowCellId) - fcMetaDataDict = get_sample_properties(transaction, flowcell_sample_immutable[0]) - flow_lane_immutable = search_unique_sample (transaction, incoming_sample) - - sample = flow_lane_immutable[0].getSample() - parents = sample.getParents() - - dataSet = transaction.createNewDataSet("FASTQ_GZ") - dataSet.setMeasuredData(False) - dataSet.setPropertyValue(INDEX1, DEFAULT_INDEX) - dataSet.setPropertyValue(INDEX2, DEFAULT_INDEX) - dirName = transaction.createNewDirectory(dataSet,name) - - if undetermined: - fastq_files, sample_space = process_undetermined(transaction, undetermined, name, flowCellId, flowLane, - fastq_files, first_fastq_file, search_service, fcMetaDataDict, parents, dataSet) - else: - fastq_files, sample_space = process_regular_samples(transaction, name, sample_code, flowLane, - fastq_files, first_fastq_file, search_unique_sample, fcMetaDataDict, dataSet) - - put_files_to_dataset (transaction, dataSet, fastq_files, name, flowCellId, sample_space, undetermined) - - sa = transaction.getSampleForUpdate(flow_lane_immutable[0].getSampleIdentifier()) - sa.setPropertyValue("DATA_TRANSFERRED", create_openbis_timestamp_now()) - dataSet.setSample(flow_lane_immutable[0]) - diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/register-lane-hiseq/lib/crc32 b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/register-lane-hiseq/lib/crc32 deleted file mode 100755 index 7959ca94a1fa61e47c2e4df815bb35fceb7bd809..0000000000000000000000000000000000000000 Binary files a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/register-lane-hiseq/lib/crc32 and /dev/null differ diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/register-lane-hiseq/plugin.properties b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/register-lane-hiseq/plugin.properties deleted file mode 100644 index f7523f7cdec8ed261c78152f3007f7bb9947f79b..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/register-lane-hiseq/plugin.properties +++ /dev/null @@ -1,12 +0,0 @@ -# -# Drop box for registering a flow cell output as a data set -# -# Variables: -# incoming-root-dir -# Path to the directory which contains incoming directories for drop boxes. -incoming-dir = ${incoming-root-dir}/register-lane-hiseq -incoming-data-completeness-condition = marker-file -top-level-data-set-handler = ch.systemsx.cisd.etlserver.registrator.api.v2.JythonTopLevelDataSetHandlerV2 -script-path = register-lane-hiseq.py -storage-processor = ch.systemsx.cisd.etlserver.DefaultStorageProcessor - diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/register-lane-hiseq/register-lane-hiseq.py b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/register-lane-hiseq/register-lane-hiseq.py deleted file mode 100755 index 05bd0e2ee5556f8092d3244c1ef704190cd41105..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/register-lane-hiseq/register-lane-hiseq.py +++ /dev/null @@ -1,493 +0,0 @@ -''' -Processes each flow lane of a Sequencing run - -Expects as incoming folder: -Project_<Flow Cell>_<Lane> -e.g.Project_110715_SN792_0054_BC035RACXX_1 or Project_110816_6354LAAXX_1 - -Note: -print statements go to: ~openbis/sprint/datastore_server/log/startup_log.txt -''' - -import os -import re -import fnmatch -import time -import shutil -import tempfile -import subprocess -from time import * -from datetime import * -from ch.systemsx.cisd.openbis.generic.shared.api.v1.dto import SearchCriteria - -FASTQ_GZ_PATTERN = "*.fastq.gz" -METADATA_FILE_SUFFIX = "_metadata.tsv" -AFFILIATION_PROPERTY_NAME='AFFILIATION' -INDEX1='BARCODE' -INDEX2='INDEX2' -EXTERNAL_SAMPLE_NAME='EXTERNAL_SAMPLE_NAME' -SAMPLE_TYPE = 'SAMPLE_TYPE' -SAMPLE_CODE = 'SAMPLE_CODE' -CRC32_PATH='lib/crc32' -#CRC32_PATH='lib/a.out' - -DEFAULT_INDEX='NoIndex' - -# ------------------------------------------------------------------------------- - -def getThreadProperties(transaction): - threadPropertyDict = {} - threadProperties = transaction.getGlobalState().getThreadParameters().getThreadProperties() - for key in threadProperties: - try: - threadPropertyDict[key] = threadProperties.getProperty(key) - except: - pass - return threadPropertyDict - -# ------------------------------------------------------------------------------- - -def CRC32_from_file(filename, transaction): - threadPropertyDict = getThreadProperties(transaction) - absolutePath = os.path.dirname(os.path.realpath(threadPropertyDict['script-path'])) - fullPathCrc32 = (os.path.join(absolutePath, CRC32_PATH)) - if os.path.exists(fullPathCrc32): - args = [fullPathCrc32, filename] - p = subprocess.Popen(args, stdout=subprocess.PIPE) - cksum = (p.communicate()[0]) - print("Calculated crc32 checksum for: "+ os.path.basename(filename) + " " + cksum) - else: - cksum = 0 & 0xFFFFFFFF - return cksum - - -def getFileNames(path): - ''' - Gets all files matching a PATTERN in a path recursively - and returns the result as a list - ''' - matches = [] - for root, dirnames, filenames in os.walk(path): - for filename in fnmatch.filter(filenames, FASTQ_GZ_PATTERN): - matches.append(os.path.join(root, filename)) - matches.sort() - return(matches) - -# ------------------------------------------------------------------------------- - -def sanitizeString(myString): - return re.sub('[^A-Za-z0-9]+', '_', myString) - -# ------------------------------------------------------------------------------- - -def get_vocabulary_descriptions (transaction, vocabulary_name): - vocabulary_descriptions_dict = {} - vocabulary = transaction.getVocabulary(vocabulary_name) - vocabulary_terms = vocabulary.getTerms() - for term in vocabulary_terms: - vocabulary_descriptions_dict[term.getCode()] = term.getDescription() - return vocabulary_descriptions_dict - -# ------------------------------------------------------------------------------- - -def writeMetadataFile (transaction, fileName, parentPropertyTypes, parentPropertiesMap, fcMetaDataDict, - experiment, fastqFileList, flowLane): - ''' - Writes a file of meta date related to one sample - ''' - - fastqFileList.sort() - - expId = experiment.getIdentifier() - try: - meta_data_file = open(fileName,'w') - for propertyType in parentPropertyTypes: - if (propertyType in [u'FLOW_CELL_PROPERTIES']): - continue - if propertyType in [SAMPLE_TYPE] or propertyType in [SAMPLE_CODE]: - meta_data_file.write(propertyType.encode('utf-8') + "\t" + - str(parentPropertiesMap[propertyType])+ "\n") - else: - meta_data_file.write(propertyType.encode('utf-8') + "\t" + - parentPropertiesMap[propertyType].tryGetAsString().encode('utf-8').replace('\n',',') + "\n") - - meta_data_file.write("EXPERIMENT\t" + expId + "\n".encode('utf-8')) - meta_data_file.write("\nFLOWCELL PROPERTIES\n".encode('utf-8')) - fcMetaDataDict["LANE_NUMBER"] = flowLane - keys = fcMetaDataDict.keys() - keys.sort() - - sequencer_vocabulary_description = get_vocabulary_descriptions(transaction, 'SEQUENCER') - meta_data_file.write('SEQUENCER_MODEL' + "\t" + sequencer_vocabulary_description[fcMetaDataDict['SEQUENCER']].encode('utf-8') + "\n") - - for k in keys: - meta_data_file.write(k.encode('utf-8') + "\t" + fcMetaDataDict[k].encode('utf-8') + "\n") - - meta_data_file.write("\nFASTQ_FILES\n".encode('utf-8')) - for file in fastqFileList: - meta_data_file.write(os.path.basename(file) + "\t" + str(CRC32_from_file(file, transaction)) + "\n") - - except IOError: - print ('File error, could not write '+ fileName) - finally: - meta_data_file.close() - -def create_openbis_timestamp (): - ''' - Create an openBIS conform timestamp - ''' - tz=localtime()[3]-gmtime()[3] - d=datetime.now() - return d.strftime("%Y-%m-%d %H:%M:%S GMT"+"%+.2d" % tz+":00") - -def extraCopy (affiliation_name, path): - ''' - Handles the extra copies of the data for transfer with datamover via the - bc2 network to the FMI and BIOCENTER - For the BIOCENTER there is a folder created in which all data gets into - ''' - if (affiliation_name in AFFILIATION): - if (affiliation_name == 'BIOCENTER_BASEL' or affiliation_name == 'NEUROSTEMX' or affiliation_name == 'SWISS_TPH'): - dirname = AFFILIATION[affiliation_name] + datetime.now().strftime("%Y-%m-%d") - if not os.path.exists(dirname): - os.mkdir(dirname) - shutil.copy(path, dirname) - else: - shutil.copy(path, AFFILIATION[affiliation_name]) - -# ------------------------------------------------------------------------------- - -def extraCopySciCore (sample_space, filePath, destinationFolder=""): - ''' - Handles the extra copies of the data for transfer with datamover for SCICORE - ''' - dirname = '' - # if a sample is part of this space list then it will be transferred to sciCore - SPACE_LIST = ["UNI_BASEL_SALZBURGER", "BIOCENTER_HANDSCHIN", "BIOCENTER_ZAVOLAN", - "BIOCENTER_KELLER", "BIOCENTER_SILANDER", "ETHZ_NEUROSTEMX", - "UNI_BASEL_UTZINGER", "UNI_BASEL_GAGNEUX"] - - dropBoxFolder = '/links/shared/dsu/dss/customers/biozentrum_scicore/drop-box/' - #dropBoxFolder = '/Users/kohleman/tmp/scicore' - basename = os.path.basename(filePath) - - splits = basename.split('_') - folderName = "_".join(splits[0:8]) - - if (sample_space in SPACE_LIST): - dirname = os.path.join(dropBoxFolder, folderName) - if destinationFolder: - shutil.copy(filePath, destinationFolder) - else: - if not os.path.exists(dirname): - os.mkdir(dirname) - shutil.copy(filePath, dirname) - print("Copied " + basename + " to " + dropBoxFolder + "\n") - return dirname - -# ------------------------------------------------------------------------------- - -def searchSample (sample_code, search_service): - sc = SearchCriteria() - print('Searching sample: '+ str(sample_code)) - sc.addMatchClause(SearchCriteria.MatchClause.createAttributeMatch(SearchCriteria.MatchClauseAttribute.CODE, sample_code)); - foundSamples = search_service.searchForSamples(sc) - return foundSamples - -# ------------------------------------------------------------------------------- - -def get_sample_properties (transaction, sample): - - sample_properties_dict = {} - # returns Map<String, String> - sample_properties = sample.getSample().getProperties() - sequencing_sample_type = sample.getSampleType() - sequencing_sample_code = sample.getCode() - sample_properties_dict[SAMPLE_TYPE] = sequencing_sample_type - sample_properties_dict[SAMPLE_CODE] = sequencing_sample_code - - for property in sample_properties: - code = property.getPropertyType().getSimpleCode() - sample_properties_dict[code] = property.tryGetAsString() - - return sample_properties_dict - -# ------------------------------------------------------------------------------- - -def getFlowCellMetaData (transaction, flowCellId): - - def sortedDictValues(adict): - keys = adict.keys() - keys.sort() - return map(adict.get, keys) - - search = transaction.getSearchService() - sc = SearchCriteria() - print('Searching FlowCell: '+ str(flowCellId)) - sc.addMatchClause(SearchCriteria.MatchClause.createAttributeMatch(SearchCriteria.MatchClauseAttribute.CODE, flowCellId)); - foundFlowCells = search.searchForSamples(sc) - - try: - assert foundFlowCells.size() == 1 - except AssertionError: - print (str(foundFlowCells.size()) + ' flow cells found which match the criterias: '+ flowCellId) - - fcPropertiesDict = {} - fcPropertyTypes = [] - - fcProperties = foundFlowCells[0].getSample().getProperties() - for property in fcProperties: - code = property.getPropertyType().getSimpleCode() - fcPropertyTypes.append(code) - fcPropertiesDict[code] = property - - fcPropertyTypes.sort() - return fcPropertiesDict, fcPropertyTypes - -# ------------------------------------------------------------------------------- - -def searchParents (search_service, parents): - ''' - Searches for all parents and returns a java.util.List<ISampleImmutable> - ''' - # search for the parents - sc = SearchCriteria() - # set the Search Criteria to an OR condition, default is AND - sc.setOperator(SearchCriteria.SearchOperator.MATCH_ANY_CLAUSES) - # Get the codes for all parents - for parent in parents: - parentSubCode = parent.getSubCode() - sc.addMatchClause(SearchCriteria.MatchClause.createAttributeMatch(SearchCriteria.MatchClauseAttribute.CODE, parentSubCode)); - # all parents of the flow lane - foundParents = search_service.searchForSamples(sc) - - return foundParents - -# ------------------------------------------------------------------------------- - -def getProperties (foundParent, fcMetaDataDict): - ''' - - ''' - parent = foundParent.getSample() - # ArrayList - parentProperties = parent.getProperties() - # just get the current code - parentCode = parent.getCode() - #print("Found parent code: "+ parentCode) - parentSampleType = parent.getSampleType() - - # reformat Java ArrayList and Sort - parentPropertyTypes = [] - parentPropertiesMap = {} - - parentPropertyTypes.append(SAMPLE_TYPE) - parentPropertyTypes.append(SAMPLE_CODE) - parentPropertiesMap[SAMPLE_TYPE] = parentSampleType - parentPropertiesMap[SAMPLE_CODE] = parentCode - experiment = parent.getExperiment() - - for property in parentProperties: - code = property.getPropertyType().getSimpleCode() - parentPropertyTypes.append(code) - parentPropertiesMap[code] = property - try: - barcode = parentPropertiesMap[INDEX1].tryGetAsString() - if barcode == "NOINDEX": - barcode = DEFAULT_INDEX - else: - barcode.split()[-1][:-1] - except: - barcode = DEFAULT_INDEX - - i2Length = int(fcMetaDataDict['INDEXREAD2'].tryGetAsString().encode('utf-8')) - if i2Length > 0: - try: - index2 = parentPropertiesMap[INDEX2].tryGetAsString() - if index2 == "NOINDEX": - index2 = DEFAULT_INDEX - else: - index2.split()[-1][:-1] - except: - index2 = DEFAULT_INDEX - else: - index2 = DEFAULT_INDEX - - completeBarcode=barcode + "-" + index2 - parentPropertyTypes.sort() - #print("parentPropertiesMap") - #print(parentPropertiesMap) - return parentCode, parentProperties, parentPropertyTypes, parentPropertiesMap, experiment, barcode, index2, completeBarcode - -# ------------------------------------------------------------------------------- - -def createMetDataFileName (parentCode, incoming_sample, completeBarcode, flowLane, METADATA_FILE_SUFFIX): - return parentCode.replace('-','_') + "_" + incoming_sample.replace(':', '_') + "_" + completeBarcode + "_L00" + flowLane +METADATA_FILE_SUFFIX - -# ------------------------------------------------------------------------------- - -def process(transaction): - - EXPERIMENT_CODE = 'EXPERIMENT' - - # useful for debugging: - print("\n" + str(datetime.now())) - - incomingPath = transaction.getIncoming().getAbsolutePath() - name = transaction.getIncoming().getName() - - folders=[] - folders=os.listdir(incomingPath) - - # expected incoming Name, e.g.: Project_110715_SN792_0054_BC035RACXX_1 - split=name.split("_") - if (len(split) == 6): - runningDate = split[1] - sequencerId = split[2] - sequentialNumber = split[3] - hiseqTray = split[4][0] - flowCellId = split[4][1:] - flowLane = split[-1] - incoming_sample=runningDate+ '_'+ sequencerId + '_' + sequentialNumber + '_' + hiseqTray + flowCellId + ':' + flowLane - - # Get the search service - search_service = transaction.getSearchService() - - # Search for the incoming_sample which is a Flow Lane - sc = SearchCriteria() - print('Processing sample: '+ str(incoming_sample)) - sc.addMatchClause(SearchCriteria.MatchClause.createAttributeMatch(SearchCriteria.MatchClauseAttribute.CODE, incoming_sample)); - foundSamples = search_service.searchForSamples(sc) - - # there should be only one sample because it is unique within one Flow Cell - if (len(foundSamples) > 1): - raise Exception("More than one sample found! No unique code: " + incoming_sample) - elif (len(foundSamples) == 0): - raise Exception("No matching sample found for: " + incoming_sample) - else : - sample = foundSamples[0].getSample() - parents = sample.getParents() - - foundParents = searchParents(search_service, parents) - - if foundSamples.size() > 0: - sa = transaction.getSampleForUpdate(foundSamples[0].getSampleIdentifier()) - sa.setPropertyValue("DATA_TRANSFERRED", create_openbis_timestamp()) - - # ------------------------------------------------------------------------------- - - flowcell_sample_immutable = searchSample (runningDate+ '_'+ sequencerId + '_' + sequentialNumber + '_' + hiseqTray + flowCellId , search_service) - fcMetaDataDict_NEW = get_sample_properties(transaction, flowcell_sample_immutable[0]) - fcMetaDataDict, fcMetaDataList = getFlowCellMetaData(transaction, incoming_sample.split(":")[0]) - - def addExternalSampleName (fastqFileList, usableExternalSampleName): - externalNamesFastqFileDict = {} - - for file in fastqFileList: - folder = os.path.dirname(file) - fileName = os.path.basename(file) - filepart, suffix = fileName.split('.',1) - sanitizedExternalSampleName = sanitizeString(usableExternalSampleName) - if sanitizedExternalSampleName: - newFile = folder + "/" + filepart + "_" + sanitizedExternalSampleName + "." + suffix - else: - newFile = file - externalNamesFastqFileDict[file] = newFile - return externalNamesFastqFileDict - - # loop over each Sample folder within a lane - for f in range(0,len(folders)): - # Create a data set and set type - dataSet = transaction.createNewDataSet("FASTQ_GZ") - dataSet.setMeasuredData(False) - dataSet.setPropertyValue(INDEX1, DEFAULT_INDEX) - dataSet.setPropertyValue(INDEX2, DEFAULT_INDEX) - - dataSet.setSample(foundSamples[0]) - dirName = transaction.createNewDirectory(dataSet,folders[f]) - usableExternalSampleName = "EXTERNAL_NAME" - - # if multiplexed samples then there is more than one folder - pathPerLane = incomingPath + '/' + folders[f] - - # get all fastqs in this dataSet - fastqFileList=getFileNames(pathPerLane) - - # get all properties of the parent samples - for foundParent in foundParents: - - parentCode, parentProperties, parentPropertyTypes, parentPropertiesMap, experiment, barcode, index2, completeBarcode = getProperties (foundParent, fcMetaDataDict) - nameOfFile = createMetDataFileName (parentCode, incoming_sample, completeBarcode, flowLane, METADATA_FILE_SUFFIX) - #print folders[f] - folderSplit = '-'.join(folders[f].split('_')[1:4]) - #print "Folder split: " + folderSplit - #print str(parentCode) - organism = parentPropertiesMap['NCBI_ORGANISM_TAXONOMY'].tryGetAsString().split(":")[-1].strip() - - if (parentCode == folderSplit): - sample_space = foundParent.getSpace() - - externalSampleName = parentPropertiesMap[EXTERNAL_SAMPLE_NAME].tryGetAsString() - lengthLimit = 30 - if len(externalSampleName) > lengthLimit: - usableExternalSampleName = externalSampleName[0:lengthLimit] - else: - usableExternalSampleName = externalSampleName - - nameOfFile = parentCode.replace('-','_') + "_" + incoming_sample.replace(':', '_') + "_" + completeBarcode + "_L00" + \ - flowLane + "_" + sanitizeString(usableExternalSampleName) + METADATA_FILE_SUFFIX - - dataSet.setPropertyValue(INDEX1, barcode) - dataSet.setPropertyValue(INDEX2, index2) - dataSet.setPropertyValue(EXTERNAL_SAMPLE_NAME, parentPropertiesMap[EXTERNAL_SAMPLE_NAME].tryGetAsString()) - print("Creating metadata file:" + nameOfFile) - # get a file from the IDataSetRegistrationTransaction so it is automatically part of the data set - pathToFile = transaction.createNewFile(dataSet, folders[f], nameOfFile) - externalNamesFastqFileDict = addExternalSampleName(fastqFileList, usableExternalSampleName) - - for extFileNameFastQ in externalNamesFastqFileDict: - print ("RENAME file " + str(os.path.basename(extFileNameFastQ)) + " TO " + str(os.path.basename(externalNamesFastqFileDict[extFileNameFastQ]))) - os.rename(extFileNameFastQ, externalNamesFastqFileDict[extFileNameFastQ]) - destinationFolder = '' - extraCopySciCore (sample_space, externalNamesFastqFileDict[extFileNameFastQ], destinationFolder) - - writeMetadataFile(transaction, pathToFile, parentPropertyTypes, parentPropertiesMap, fcMetaDataDict_NEW, experiment, externalNamesFastqFileDict.values(), flowLane) - extraCopySciCore (sample_space, pathToFile) - - for extFileNameFastQ in externalNamesFastqFileDict: - transaction.moveFile(externalNamesFastqFileDict[extFileNameFastQ] , dataSet, folders[f]) - - # Undetermined files ################################# - elif (folderSplit.startswith('lane') and barcode == "NoIndex" and index2 == "NoIndex" and organism !='10847'): - usableExternalSampleName = "" - print("********************** Creating metadata file for Undetermined:" + nameOfFile) - - # get a file from the IDataSetRegistrationTransaction so it is automatically part of the data set - pathToFile = transaction.createNewFile(dataSet, folders[f], nameOfFile) - externalNamesFastqFileDict = addExternalSampleName(fastqFileList, usableExternalSampleName) - writeMetadataFile(transaction, pathToFile, parentPropertyTypes, parentPropertiesMap, fcMetaDataDict_NEW, experiment, externalNamesFastqFileDict.values(), flowLane) - - sample_space = foundParent.getSpace() - dirName = extraCopySciCore (sample_space, pathToFile) - - externalNamesFastqFileDict = addExternalSampleName(fastqFileList, usableExternalSampleName) - for extFileNameFastQ in externalNamesFastqFileDict: - extraCopySciCore (sample_space, externalNamesFastqFileDict[extFileNameFastQ], dirName) - - # Write Meta data for Parents Files - for foundParent in foundParents: - addParentCode, parentProperties, parentPropertyTypes, parentPropertiesMap, experiment, barcode, index2, completeBarcode = getProperties (foundParent, fcMetaDataDict) - nameOfFile = createMetDataFileName (addParentCode, incoming_sample, completeBarcode, flowLane, METADATA_FILE_SUFFIX) - if (parentCode != addParentCode): - tmpDir = tempfile.mkdtemp() - fileName = os.path.join(tmpDir, "PARENT_" + nameOfFile) - writeMetadataFile(transaction, fileName, parentPropertyTypes, parentPropertiesMap, fcMetaDataDict_NEW, experiment, [], flowLane) - sample_space = foundParent.getSpace() - extraCopySciCore (sample_space, fileName, dirName) - - try: - for extFileNameFastQ in externalNamesFastqFileDict: - transaction.moveFile(externalNamesFastqFileDict[extFileNameFastQ] , dataSet, folders[f]) - except: - # Happens when we have more than one pool registered, then the files have been moved away already - pass diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/register-lane-miseq/lib/crc32 b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/register-lane-miseq/lib/crc32 deleted file mode 100755 index 7959ca94a1fa61e47c2e4df815bb35fceb7bd809..0000000000000000000000000000000000000000 Binary files a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/register-lane-miseq/lib/crc32 and /dev/null differ diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/register-lane-miseq/plugin.properties b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/register-lane-miseq/plugin.properties deleted file mode 100644 index 51c2eec3813da5c39b0241cf23c7ccdbcb611655..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/register-lane-miseq/plugin.properties +++ /dev/null @@ -1,12 +0,0 @@ -# -# Drop box for registering a flow cell output as a data set -# -# Variables: -# incoming-root-dir -# Path to the directory which contains incoming directories for drop boxes. -incoming-dir = ${incoming-root-dir}/register-lane-miseq -incoming-data-completeness-condition = marker-file -top-level-data-set-handler = ch.systemsx.cisd.etlserver.registrator.api.v2.JythonTopLevelDataSetHandlerV2 -script-path = register-lane-miseq.py -storage-processor = ch.systemsx.cisd.etlserver.DefaultStorageProcessor - diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/register-lane-miseq/register-lane-miseq.py b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/register-lane-miseq/register-lane-miseq.py deleted file mode 100644 index 985022f203b2e273160a28c76275b317056c477c..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/register-lane-miseq/register-lane-miseq.py +++ /dev/null @@ -1,327 +0,0 @@ -''' -Processes each flow lane of a Sequencing run - -Expects as incoming folder: -Project_<Flow Cell>_<Lane> -e.g.Project_110715_SN792_0054_BC035RACXX_1 or Project_110816_6354LAAXX_1 - -Note: -print statements go to: ~openbis/sprint/datastore_server/log/startup_log.txt -''' - -import os -import fnmatch -import time -import shutil -import re -from time import * -from datetime import * -from ch.systemsx.cisd.openbis.generic.shared.api.v1.dto import SearchCriteria - -FASTQ_GZ_PATTERN = "*.fastq.gz" -METADATA_FILE_SUFFIX = "_metadata.tsv" -AFFILIATION= {'FMI': '/links/shared/dsu/dss/customers/fmi/drop-box/','BIOCENTER_BASEL': '/links/shared/dsu/dss/customers/biozentrum/drop-box/', 'NEUROSTEMX': '/links/shared/dsu/dss/customers/biozentrum/drop-box/'} -AFFILIATION_PROPERTY_NAME='AFFILIATION' -INDEX1='BARCODE' -INDEX2='INDEX2' -EXTERNAL_SAMPLE_NAME='EXTERNAL_SAMPLE_NAME' - -DEFAULT_INDEX='NoIndex' - -# ------------------------------------------------------------------------------- - -def getFileNames(path): - ''' - Gets all files matching a PATTERN in a path recursively - and returns the result as a list - ''' - matches = [] - for root, dirnames, filenames in os.walk(path): - for filename in fnmatch.filter(filenames, FASTQ_GZ_PATTERN): - matches.append(os.path.join(root, filename)) - matches.sort() - return(matches) - -def writeMetadataFile (fileName, parentPropertyTypes, parentPropertiesMap, fcMetaDataDict, fcMetaDataList): - ''' - Writes a file of meta date related to one sample - ''' - try: - metaDataFile = open(fileName,'w') - for propertyType in parentPropertyTypes: - metaDataFile.write(propertyType.encode('utf-8') + "\t" + - parentPropertiesMap[propertyType].tryGetAsString().encode('utf-8') + "\n") - - metaDataFile.write("\nFLOWCELL PROPERTIES\n".encode('utf-8')) - - for fcMetaData in fcMetaDataList: - metaDataFile.write(fcMetaData.encode('utf-8') + "\t" + - fcMetaDataDict[fcMetaData].tryGetAsString().encode('utf-8') + "\n") - pass - except IOError: - print ('File error, could not write '+ fileName) - finally: - metaDataFile.close() - -def create_openbis_timestamp (): - ''' - Create an openBIS conform timestamp - ''' - tz=localtime()[3]-gmtime()[3] - d=datetime.now() - return d.strftime("%Y-%m-%d %H:%M:%S GMT"+"%+.2d" % tz+":00") - -def extraCopy (affiliation_name, path): - ''' - Handles the extra copies of the data for transfer with datamover via the - bc2 network to the FMI and BIOCENTER - For the BIOCENTER there is a folder created in which all data gets into - ''' - if (affiliation_name in AFFILIATION): - if (affiliation_name == 'BIOCENTER_BASEL' or affiliation_name == 'NEUROSTEMX' ): - dirname = AFFILIATION[affiliation_name] + datetime.now().strftime("%Y-%m-%d") - if not os.path.exists(dirname): - os.mkdir(dirname) - shutil.copy(path, dirname) - else: - shutil.copy(path, AFFILIATION[affiliation_name]) -# ------------------------------------------------------------------------------- - -def getFlowCellMetaData (transaction, flowCellId): - - def sortedDictValues(adict): - keys = adict.keys() - keys.sort() - return map(adict.get, keys) - - search = transaction.getSearchService() - sc = SearchCriteria() - print('Searching FlowCell: '+ str(flowCellId)) - sc.addMatchClause(SearchCriteria.MatchClause.createAttributeMatch(SearchCriteria.MatchClauseAttribute.CODE, flowCellId)); - foundFlowCells = search.searchForSamples(sc) - - try: - assert foundFlowCells.size() == 1 - except AssertionError: - print (str(foundFlowCells.size()) + ' flow cells found which match the criterias: '+ flowCellId) - - fcPropertiesDict = {} - fcPropertyTypes = [] - - fcProperties = foundFlowCells[0].getSample().getProperties() - for property in fcProperties: - code = property.getPropertyType().getSimpleCode() - fcPropertyTypes.append(code) - fcPropertiesDict[code] = property - - fcPropertyTypes.sort() - return fcPropertiesDict, fcPropertyTypes - -# ------------------------------------------------------------------------------- - -def searchParents (search_service, parents): - - # search for the parents - sc = SearchCriteria() - # set the Search Criteria to an OR condition, default is AND - sc.setOperator(SearchCriteria.SearchOperator.MATCH_ANY_CLAUSES) - # Get the codes for all parents - for parent in parents: - parentSubCode = parent.getSubCode() - sc.addMatchClause(SearchCriteria.MatchClause.createAttributeMatch(SearchCriteria.MatchClauseAttribute.CODE, parentSubCode)); - # all parents of the flow lane - foundParents = search_service.searchForSamples(sc) - - return foundParents - -# ------------------------------------------------------------------------------- - -def sanitizeString(myString): - return re.sub('[^A-Za-z0-9]+', '_', myString) - -# ------------------------------------------------------------------------------- - -def process(transaction): - - # useful for debugging: - print(datetime.now()) - - incomingPath = transaction.getIncoming().getAbsolutePath() - name = transaction.getIncoming().getName() - - folders=[] - folders=os.listdir(incomingPath) - - # expected incoming Name, e.g.: Project_131107_M01761_0043_000000000_A5BNW_1_1 - split=name.split("_") - if (len(split) == 8): - runningDate = split[1] - sequencerId = split[2] - sequentialNumber = split[3] - flowCellId = split[4] + "-" + split[5] - flowLane = "_".join(split[-2:]) - incoming_sample=runningDate+ '_'+ sequencerId + '_' + sequentialNumber + '_' + flowCellId + ':' + flowLane - - # expected Project_130805_M01761_0018_000000000_A59MV_1 - if (len(split) == 7): - runningDate = split[1] - sequencerId = split[2] - sequentialNumber = split[3] - flowCellId = split[4] + "-" + split[5] - flowLane = split[-1] - incoming_sample = '_'.join([runningDate, sequencerId, sequentialNumber, flowCellId]) + ':' + flowLane - - # Get the search service - search_service = transaction.getSearchService() - - # Search for the incoming_sample which is a Flow Lane - sc = SearchCriteria() - print('Processing sample: '+ str(incoming_sample)) - sc.addMatchClause(SearchCriteria.MatchClause.createAttributeMatch(SearchCriteria.MatchClauseAttribute.CODE, incoming_sample)); - foundSamples = search_service.searchForSamples(sc) - - # there should be only one sample because it is unique within one Flow Cell - if (len(foundSamples) > 1): - raise Exception("More than one sample found! No unique code: " + incoming_sample) - elif (len(foundSamples) == 0): - raise Exception("No matching sample found for: " + incoming_sample) - else : - sample = foundSamples[0].getSample() - parents = sample.getParents() - - foundParents = searchParents(search_service, parents) - - # ------------------------------------------------------------------------------- - - usableExternalSampleName = "" - - # loop over each Sample folder within a lane - for f in range(0,len(folders)): - # Create a data set and set type - dataSet = transaction.createNewDataSet("FASTQ_GZ") - dataSet.setMeasuredData(False) - dataSet.setPropertyValue(INDEX1, DEFAULT_INDEX) - dataSet.setPropertyValue(INDEX2, DEFAULT_INDEX) - dirName = transaction.createNewDirectory(dataSet,folders[f]) - - # if multiplexed samples then there is more than one folder - pathPerLane = incomingPath + '/' + folders[f] - print ("pathPerLane: " + pathPerLane) - - # get all properties of the parent samples - for foundParent in foundParents: - parent = foundParent.getSample() - # ArrayList - parentProperties = parent.getProperties() - # just get the current code - parentCode = parent.getCode() - #print("Found parent code: "+ parentCode) - - # reformat Java ArrayList and Sort - parentPropertyTypes = [] - parentPropertiesMap = {} - for property in parentProperties: - code = property.getPropertyType().getSimpleCode() - parentPropertyTypes.append(code) - parentPropertiesMap[code] = property - try: - barcode = parentPropertiesMap[INDEX1].tryGetAsString() - if barcode == "NOINDEX": - barcode = DEFAULT_INDEX - else: - barcode.split()[-1][:-1] - except: - barcode = DEFAULT_INDEX - - try: - index2 = parentPropertiesMap[INDEX2].tryGetAsString() - if index2 == "NOINDEX": - index2 = DEFAULT_INDEX - else: - index2.split()[-1][:-1] - except: - index2 = DEFAULT_INDEX - - # just use the first six nucleotides for the naming - completeBarcode=barcode + "-" + index2 - - parentPropertyTypes.sort() - - print folders[f] - folderSplit = '-'.join(folders[f].split('_')[1:4]) - print "Folder split: " + folderSplit - print str(parentCode) - - if (parentCode == folderSplit): - - # BSSE-1754_C0364ACXX_CTTGTAA-AACC_L007_R1_001.fastq.gz - # BSSE_QGF_10002_121130_SN792_0189_AD1FBTACXX_1_NoIndex_L001_R1_001.fastq.gz - externalSampleName = parentPropertiesMap[EXTERNAL_SAMPLE_NAME].tryGetAsString() - if len(externalSampleName) > 15: - usableExternalSampleName = externalSampleName[0:15] - else: - usableExternalSampleName = externalSampleName - - nameOfFile = parentCode.replace('-','_') + "_" + incoming_sample.replace(':', '_') + "_" + completeBarcode + "_L00" + \ - flowLane + "_" + sanitizeString(usableExternalSampleName) + METADATA_FILE_SUFFIX - dataSet.setPropertyValue(INDEX1, barcode) - dataSet.setPropertyValue(INDEX2, index2) - dataSet.setPropertyValue(EXTERNAL_SAMPLE_NAME, parentPropertiesMap[EXTERNAL_SAMPLE_NAME].tryGetAsString()) - print("Creating metadata file:" + nameOfFile) - # get a file from the IDataSetRegistrationTransaction so it is automatically part of the data set - pathToFile = transaction.createNewFile(dataSet, folders[f], nameOfFile) - - fcMetaDataDict, fcMetaDataList = getFlowCellMetaData(transaction, incoming_sample.split(":")[0]) - writeMetadataFile(pathToFile, parentPropertyTypes, parentPropertiesMap, fcMetaDataDict, fcMetaDataList) - - affiliation_name = parentPropertiesMap[AFFILIATION_PROPERTY_NAME].tryGetAsString() - extraCopy (affiliation_name, pathToFile) - - elif (folderSplit.startswith('lane') and barcode == "NoIndex" and index2 == "NoIndex"): - usableExternalSampleName = "" - #print("Creating metadata file for Undetermined:" + nameOfFile) - # get a file from the IDataSetRegistrationTransaction so it is automatically part of the data set - #pathToFile = transaction.createNewFile(dataSet, folders[f], nameOfFile) - #writeMetadataFile(pathToFile, parentPropertyTypes, parentPropertiesMap, fcMetaDataDict, fcMetaDataList, experiment) - #affiliation_name = parentPropertiesMap[AFFILIATION_PROPERTY_NAME].tryGetAsString() - #extraCopy (affiliation_name, pathToFile) - #for foundParent in foundParents: - # addParentCode, parentProperties, parentPropertyTypes, parentPropertiesMap, experiment, barcode, index2, completeBarcode = getProperties (foundParent, fcMetaDataDict) - # nameOfFile = createMetDataFileName (addParentCode, incoming_sample, completeBarcode, flowLane, METADATA_FILE_SUFFIX) - # if (parentCode != addParentCode): - # tmpDir = tempfile.mkdtemp() - # fileName = os.path.join(tmpDir, "PARENT_" + nameOfFile) - # writeMetadataFile(fileName, parentPropertyTypes, parentPropertiesMap, fcMetaDataDict, fcMetaDataList, experiment) - # affiliation_name = parentPropertiesMap[AFFILIATION_PROPERTY_NAME].tryGetAsString() - # extraCopy (affiliation_name, fileName) - - - # get all fastqs in this dataSet - fastqFileList=getFileNames(pathPerLane) - print("fastqFileList:") - print(fastqFileList) - - # put the files into the dataSet - affiliation_name = parentPropertiesMap[AFFILIATION_PROPERTY_NAME].tryGetAsString() - for file in fastqFileList: - folder = os.path.dirname(file) - fileName = os.path.basename(file) - filepart, suffix = fileName.split('.',1) - sanitizedExternalSampleName = sanitizeString(usableExternalSampleName) - - if sanitizedExternalSampleName: - newFile = folder + "/" + filepart + "_" + sanitizedExternalSampleName + "." + suffix - print ("RENAME file " + file + " TO " + newFile) - os.rename(file, newFile) - else: - # Undetermined file - newFile = file - - extraCopy (affiliation_name, newFile) - # finally add the files to the data set - transaction.moveFile(newFile , dataSet, folders[f]) - - if foundSamples.size() > 0: - sa = transaction.getSampleForUpdate(foundSamples[0].getSampleIdentifier()) - sa.setPropertyValue("DATA_TRANSFERRED", create_openbis_timestamp()) - dataSet.setSample(foundSamples[0]) diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/register-lane-nextseq/lib/crc32 b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/register-lane-nextseq/lib/crc32 deleted file mode 100755 index 7959ca94a1fa61e47c2e4df815bb35fceb7bd809..0000000000000000000000000000000000000000 Binary files a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/register-lane-nextseq/lib/crc32 and /dev/null differ diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/register-lane-nextseq/lib/crc32_v2.c b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/register-lane-nextseq/lib/crc32_v2.c deleted file mode 100644 index b38d22d40f641254661994d4cc01492bb7c8d35a..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/register-lane-nextseq/lib/crc32_v2.c +++ /dev/null @@ -1,206 +0,0 @@ -/*----------------------------------------------------------------------------*\ - * CRC-32 version 2.0.0 by Craig Bruce, 2006-04-29. - * - * This program generates the CRC-32 values for the files named in the - * command-line arguments. These are the same CRC-32 values used by GZIP, - * PKZIP, and ZMODEM. The Crc32_ComputeBuf() can also be detached and - * used independently. - * - * THIS PROGRAM IS PUBLIC-DOMAIN SOFTWARE. - * - * Based on the byte-oriented implementation "File Verification Using CRC" - * by Mark R. Nelson in Dr. Dobb's Journal, May 1992, pp. 64-67. - * - * v1.0.0: original release. - * v1.0.1: fixed printf formats. - * v1.0.2: fixed something else. - * v1.0.3: replaced CRC constant table by generator function. - * v1.0.4: reformatted code, made ANSI C. 1994-12-05. - * v2.0.0: rewrote to use memory buffer & static table, 2006-04-29. -\*----------------------------------------------------------------------------*/ - -#include <stdio.h> -#include <stdlib.h> - -/*----------------------------------------------------------------------------*\ - * Local functions -\*----------------------------------------------------------------------------*/ - -static int Crc32_ComputeFile( FILE *file, unsigned long *outCrc32 ); - -static unsigned long Crc32_ComputeBuf( unsigned long inCrc32, const void *buf, - size_t bufLen ); - -/*----------------------------------------------------------------------------*\ - * NAME: - * main() - main function for CRC-32 generation - * DESCRIPTION: - * Computes the CRC-32 value for the set of files named in the command- - * line arguments. - * ARGUMENTS: - * argc - command-line-argument count - * argv - command-line-argument strings - * RETURNS: - * err - 0 on success or executes exit(1) on error - * ERRORS: - * - file errors -\*----------------------------------------------------------------------------*/ - -int main( int argc, const char *argv[] ) -{ - FILE *file = NULL; - const char *filename; - unsigned long argIdx; - unsigned long crc32; - int err; - - /** compute crcs **/ - if (argc < 2) { - /** read from 'stdin' if no arguments given **/ - err = Crc32_ComputeFile( stdin, &crc32 ); - if (err == -1) goto ERR_EXIT; - printf("crc32 = 0x%08lX for (stdin)\n", crc32 ); - } else { - /** report named files in sequence **/ - for (argIdx=1; argIdx < argc; argIdx++) { - filename = argv[argIdx]; - file = fopen( filename, "rb" ); - if (file == NULL) { - fprintf( stderr, "error opening file \"%s\"!\n", filename ); - goto ERR_EXIT; - } - err = Crc32_ComputeFile( file, &crc32 ); - if (err == -1) goto ERR_EXIT; - /*printf("crc32 = 0x%08lX for \"%s\"\n", crc32, filename );*/ - printf("%08lX", crc32); - err = fclose( file ); - file = NULL; - if (err == EOF) { - fprintf( stderr, "error closing file \"%s\"!\n", filename ); - goto ERR_EXIT; - } - } - } - return( 0 ); - - /** error exit **/ -ERR_EXIT: - if (file != NULL) fclose( file ); - exit( 1 ); -} - -/*----------------------------------------------------------------------------*\ - * NAME: - * Crc32_ComputeFile() - compute CRC-32 value for a file - * DESCRIPTION: - * Computes the CRC-32 value for an opened file. - * ARGUMENTS: - * file - file pointer - * outCrc32 - (out) result CRC-32 value - * RETURNS: - * err - 0 on success or -1 on error - * ERRORS: - * - file errors -\*----------------------------------------------------------------------------*/ - -static int Crc32_ComputeFile( FILE *file, unsigned long *outCrc32 ) -{ -# define CRC_BUFFER_SIZE 8192 - unsigned char buf[CRC_BUFFER_SIZE]; - size_t bufLen; - - /** accumulate crc32 from file **/ - *outCrc32 = 0; - while (1) { - bufLen = fread( buf, 1, CRC_BUFFER_SIZE, file ); - if (bufLen == 0) { - if (ferror(file)) { - fprintf( stderr, "error reading file\n" ); - goto ERR_EXIT; - } - break; - } - *outCrc32 = Crc32_ComputeBuf( *outCrc32, buf, bufLen ); - } - return( 0 ); - - /** error exit **/ -ERR_EXIT: - return( -1 ); -} - -/*----------------------------------------------------------------------------*\ - * NAME: - * Crc32_ComputeBuf() - computes the CRC-32 value of a memory buffer - * DESCRIPTION: - * Computes or accumulates the CRC-32 value for a memory buffer. - * The 'inCrc32' gives a previously accumulated CRC-32 value to allow - * a CRC to be generated for multiple sequential buffer-fuls of data. - * The 'inCrc32' for the first buffer must be zero. - * ARGUMENTS: - * inCrc32 - accumulated CRC-32 value, must be 0 on first call - * buf - buffer to compute CRC-32 value for - * bufLen - number of bytes in buffer - * RETURNS: - * crc32 - computed CRC-32 value - * ERRORS: - * (no errors are possible) -\*----------------------------------------------------------------------------*/ - -static unsigned long Crc32_ComputeBuf( unsigned long inCrc32, const void *buf, - size_t bufLen ) -{ - static const unsigned long crcTable[256] = { - 0x00000000,0x77073096,0xEE0E612C,0x990951BA,0x076DC419,0x706AF48F,0xE963A535, - 0x9E6495A3,0x0EDB8832,0x79DCB8A4,0xE0D5E91E,0x97D2D988,0x09B64C2B,0x7EB17CBD, - 0xE7B82D07,0x90BF1D91,0x1DB71064,0x6AB020F2,0xF3B97148,0x84BE41DE,0x1ADAD47D, - 0x6DDDE4EB,0xF4D4B551,0x83D385C7,0x136C9856,0x646BA8C0,0xFD62F97A,0x8A65C9EC, - 0x14015C4F,0x63066CD9,0xFA0F3D63,0x8D080DF5,0x3B6E20C8,0x4C69105E,0xD56041E4, - 0xA2677172,0x3C03E4D1,0x4B04D447,0xD20D85FD,0xA50AB56B,0x35B5A8FA,0x42B2986C, - 0xDBBBC9D6,0xACBCF940,0x32D86CE3,0x45DF5C75,0xDCD60DCF,0xABD13D59,0x26D930AC, - 0x51DE003A,0xC8D75180,0xBFD06116,0x21B4F4B5,0x56B3C423,0xCFBA9599,0xB8BDA50F, - 0x2802B89E,0x5F058808,0xC60CD9B2,0xB10BE924,0x2F6F7C87,0x58684C11,0xC1611DAB, - 0xB6662D3D,0x76DC4190,0x01DB7106,0x98D220BC,0xEFD5102A,0x71B18589,0x06B6B51F, - 0x9FBFE4A5,0xE8B8D433,0x7807C9A2,0x0F00F934,0x9609A88E,0xE10E9818,0x7F6A0DBB, - 0x086D3D2D,0x91646C97,0xE6635C01,0x6B6B51F4,0x1C6C6162,0x856530D8,0xF262004E, - 0x6C0695ED,0x1B01A57B,0x8208F4C1,0xF50FC457,0x65B0D9C6,0x12B7E950,0x8BBEB8EA, - 0xFCB9887C,0x62DD1DDF,0x15DA2D49,0x8CD37CF3,0xFBD44C65,0x4DB26158,0x3AB551CE, - 0xA3BC0074,0xD4BB30E2,0x4ADFA541,0x3DD895D7,0xA4D1C46D,0xD3D6F4FB,0x4369E96A, - 0x346ED9FC,0xAD678846,0xDA60B8D0,0x44042D73,0x33031DE5,0xAA0A4C5F,0xDD0D7CC9, - 0x5005713C,0x270241AA,0xBE0B1010,0xC90C2086,0x5768B525,0x206F85B3,0xB966D409, - 0xCE61E49F,0x5EDEF90E,0x29D9C998,0xB0D09822,0xC7D7A8B4,0x59B33D17,0x2EB40D81, - 0xB7BD5C3B,0xC0BA6CAD,0xEDB88320,0x9ABFB3B6,0x03B6E20C,0x74B1D29A,0xEAD54739, - 0x9DD277AF,0x04DB2615,0x73DC1683,0xE3630B12,0x94643B84,0x0D6D6A3E,0x7A6A5AA8, - 0xE40ECF0B,0x9309FF9D,0x0A00AE27,0x7D079EB1,0xF00F9344,0x8708A3D2,0x1E01F268, - 0x6906C2FE,0xF762575D,0x806567CB,0x196C3671,0x6E6B06E7,0xFED41B76,0x89D32BE0, - 0x10DA7A5A,0x67DD4ACC,0xF9B9DF6F,0x8EBEEFF9,0x17B7BE43,0x60B08ED5,0xD6D6A3E8, - 0xA1D1937E,0x38D8C2C4,0x4FDFF252,0xD1BB67F1,0xA6BC5767,0x3FB506DD,0x48B2364B, - 0xD80D2BDA,0xAF0A1B4C,0x36034AF6,0x41047A60,0xDF60EFC3,0xA867DF55,0x316E8EEF, - 0x4669BE79,0xCB61B38C,0xBC66831A,0x256FD2A0,0x5268E236,0xCC0C7795,0xBB0B4703, - 0x220216B9,0x5505262F,0xC5BA3BBE,0xB2BD0B28,0x2BB45A92,0x5CB36A04,0xC2D7FFA7, - 0xB5D0CF31,0x2CD99E8B,0x5BDEAE1D,0x9B64C2B0,0xEC63F226,0x756AA39C,0x026D930A, - 0x9C0906A9,0xEB0E363F,0x72076785,0x05005713,0x95BF4A82,0xE2B87A14,0x7BB12BAE, - 0x0CB61B38,0x92D28E9B,0xE5D5BE0D,0x7CDCEFB7,0x0BDBDF21,0x86D3D2D4,0xF1D4E242, - 0x68DDB3F8,0x1FDA836E,0x81BE16CD,0xF6B9265B,0x6FB077E1,0x18B74777,0x88085AE6, - 0xFF0F6A70,0x66063BCA,0x11010B5C,0x8F659EFF,0xF862AE69,0x616BFFD3,0x166CCF45, - 0xA00AE278,0xD70DD2EE,0x4E048354,0x3903B3C2,0xA7672661,0xD06016F7,0x4969474D, - 0x3E6E77DB,0xAED16A4A,0xD9D65ADC,0x40DF0B66,0x37D83BF0,0xA9BCAE53,0xDEBB9EC5, - 0x47B2CF7F,0x30B5FFE9,0xBDBDF21C,0xCABAC28A,0x53B39330,0x24B4A3A6,0xBAD03605, - 0xCDD70693,0x54DE5729,0x23D967BF,0xB3667A2E,0xC4614AB8,0x5D681B02,0x2A6F2B94, - 0xB40BBE37,0xC30C8EA1,0x5A05DF1B,0x2D02EF8D }; - unsigned long crc32; - unsigned char *byteBuf; - size_t i; - - /** accumulate crc32 for buffer **/ - crc32 = inCrc32 ^ 0xFFFFFFFF; - byteBuf = (unsigned char*) buf; - for (i=0; i < bufLen; i++) { - crc32 = (crc32 >> 8) ^ crcTable[ (crc32 ^ byteBuf[i]) & 0xFF ]; - } - return( crc32 ^ 0xFFFFFFFF ); -} - -/*----------------------------------------------------------------------------*\ - * END OF MODULE: crc32.c -\*----------------------------------------------------------------------------*/ diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/register-lane-nextseq/plugin.properties b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/register-lane-nextseq/plugin.properties deleted file mode 100644 index e80d511ec82ecb2bae68242579df0eeeca78b7fe..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/register-lane-nextseq/plugin.properties +++ /dev/null @@ -1,12 +0,0 @@ -# -# Drop box for registering a flow cell output as a data set -# -# Variables: -# incoming-root-dir -# Path to the directory which contains incoming directories for drop boxes. -incoming-dir = ${incoming-root-dir}/register-lane-nextseq -incoming-data-completeness-condition = marker-file -top-level-data-set-handler = ch.systemsx.cisd.etlserver.registrator.api.v2.JythonTopLevelDataSetHandlerV2 -script-path = register-lane-nextseq.py -storage-processor = ch.systemsx.cisd.etlserver.DefaultStorageProcessor - diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/register-lane-nextseq/register-lane-nextseq.py b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/register-lane-nextseq/register-lane-nextseq.py deleted file mode 100644 index 5ca8462c770548a1bdf78b973a3e23fc48610e50..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/register-lane-nextseq/register-lane-nextseq.py +++ /dev/null @@ -1,398 +0,0 @@ -''' -Processes each flow lane of a Sequencing run - -Expects as incoming folder: -BSSE_QGF_22266_H0W8YBGXX_1 -or -Undetermined_H0W8YBGXX - -Note: -print statements go to: ~openbis/sprint/datastore_server/log/startup_log.txt -''' - -import os -import fnmatch -import time -import shutil -import re -import subprocess -from time import * -from datetime import * -from ch.systemsx.cisd.openbis.generic.shared.api.v1.dto import SearchCriteria -from __builtin__ import file - -FASTQ_GZ_PATTERN = "*.fastq.gz" -METADATA_FILE_SUFFIX = "_metadata.tsv" -AFFILIATION_PROPERTY_NAME='AFFILIATION' -INDEX1='BARCODE' -INDEX2='INDEX2' -EXTERNAL_SAMPLE_NAME='EXTERNAL_SAMPLE_NAME' -INDEXREAD1='INDEXREAD' -INDEXREAD2='INDEXREAD2' -SAMPLE_TYPE = 'SAMPLE_TYPE' -SAMPLE_CODE = 'SAMPLE_CODE' -NCBI_ORGANISM_TAXONOMY='NCBI_ORGANISM_TAXONOMY' -PHIX_TAXONOMY_ID='10847' -DEFAULT_INDEX='NoIndex' -CRC32_PATH='lib/crc32' -CRC32_PATH='lib/a.out' - -# ------------------------------------------------------------------------------- - -def getThreadProperties(transaction): - threadPropertyDict = {} - threadProperties = transaction.getGlobalState().getThreadParameters().getThreadProperties() - for key in threadProperties: - try: - threadPropertyDict[key] = threadProperties.getProperty(key) - except: - pass - return threadPropertyDict - -def checkOnFileSize(file): - return os.stat(file).st_size == 0 - -def CRC32_from_file(filename, transaction): - - if checkOnFileSize(filename): - raise Exception("FILE " + filename + " IS EMPTY!") - - threadPropertyDict = getThreadProperties(transaction) - absolutePath = os.path.dirname(os.path.realpath(threadPropertyDict['script-path'])) - fullPathCrc32 = (os.path.join(absolutePath, CRC32_PATH)) - if os.path.exists(fullPathCrc32): - args = [fullPathCrc32, filename] - p = subprocess.Popen(args, stdout=subprocess.PIPE) - cksum = (p.communicate()[0]) - print("Calculated crc32 checksum for: "+ os.path.basename(filename) + " " + cksum) - else: - cksum = 0 & 0xFFFFFFFF - return cksum - -def getFileNames(path): - ''' - Gets all files matching a PATTERN in a path recursively - and returns the result as a list - ''' - matches = [] - for root, dirnames, filenames in os.walk(path): - for filename in fnmatch.filter(filenames, FASTQ_GZ_PATTERN): - matches.append(os.path.join(root, filename)) - matches.sort() - return(matches) - -def writeMetadataFile(transaction, folder_name, meta_data_file_name, sequencing_sample_properties_dict, - fcMetaDataDict, experiment, sample_space, fastqFileList, flowLane): - ''' - Writes a file of meta data related to one sample - ''' - - sequencing_sample_properties_list = sequencing_sample_properties_dict.keys() - sequencing_sample_properties_list.sort() - - expId = experiment.getIdentifier() - try: - meta_data_file = open(meta_data_file_name,'w') - for propertyType in sequencing_sample_properties_list: - if (propertyType in [u'FLOW_CELL_PROPERTIES']): - continue - if propertyType in [SAMPLE_TYPE] or propertyType in [SAMPLE_CODE]: - meta_data_file.write(propertyType.encode('utf-8') + "\t" + - str(sequencing_sample_properties_dict[propertyType])+ "\n") - else: - meta_data_file.write(propertyType.encode('utf-8') + "\t" + - sequencing_sample_properties_dict[propertyType].encode('utf-8').replace('\n',',') + "\n") - - meta_data_file.write("EXPERIMENT\t" + expId + "\n".encode('utf-8')) - meta_data_file.write("\nFLOWCELL PROPERTIES\n".encode('utf-8')) - fcMetaDataDict["LANE_NUMBER"] = flowLane - keys = fcMetaDataDict.keys() - keys.sort() - - sequencer_vocabulary_description = get_vocabulary_descriptions(transaction, 'SEQUENCER') - meta_data_file.write('SEQUENCER_MODEL' + "\t" + sequencer_vocabulary_description[fcMetaDataDict['SEQUENCER']].encode('utf-8') + "\n") - - for k in keys: - meta_data_file.write(k.encode('utf-8') + "\t" + fcMetaDataDict[k].encode('utf-8') + "\n") - - meta_data_file.write("\nFASTQ_FILES\n".encode('utf-8')) - for file in fastqFileList: - meta_data_file.write(os.path.basename(file) + "\t" + str(CRC32_from_file(file, transaction)) + "\n") - - except IOError: - print ('File error, could not write '+ file) - finally: - meta_data_file.close() - - destinationFolder = folder_name - extraCopySciCore (sample_space, meta_data_file_name, destinationFolder) - -def create_openbis_timestamp (): - ''' - Create an openBIS conform timestamp - ''' - tz=localtime()[3]-gmtime()[3] - d=datetime.now() - return d.strftime("%Y-%m-%d %H:%M:%S GMT"+"%+.2d" % tz+":00") - -# ------------------------------------------------------------------------------- - - def sortedDictValues(adict): - ''' - Given a dictionary it returns the values of this dict sorted - by the keys - d = {2:1, 4:1, 1:1, 100:3, 3:5} - sortedDictValues(d) - [1, 1, 5, 1, 3] - ''' - keys = adict.keys() - keys.sort() - return map(adict.get, keys) - -# ------------------------------------------------------------------------------- - -def extraCopySciCore (sample_space, filePath, destinationFolder=""): - ''' - Handles the extra copies of the data for transfer with datamover for SCICORE - ''' - - dropBoxFolder = '/Users/kohleman/tmp/scicore' - #dropBoxFolder = '/links/shared/dsu/dss/customers/biozentrum_scicore/drop-box' - - # if a sample is part of this space list then it will be transferred to sciCore - SPACE_LIST = ["UNI_BASEL_SALZBURGER", "BIOCENTER_HANDSCHIN", "BIOCENTER_ZAVOLAN", - "BIOCENTER_KELLER", "BIOCENTER_SILANDER", "ETHZ_NEUROSTEMX", - "UNI_BASEL_UTZINGER", "UNI_BASEL_GAGNEUX"] - - basename = os.path.basename(filePath) - - if (sample_space in SPACE_LIST): - dirname = os.path.join(dropBoxFolder, destinationFolder) - if not os.path.exists(dirname): - os.mkdir(dirname) - print("COPYING " + filePath + " TO " + dirname) - shutil.copy(filePath, dirname) - -# ------------------------------------------------------------------------------- - -def get_sample_properties (transaction, sample): - - sample_properties_dict = {} - # returns Map<String, String> - sample_properties = sample.getSample().getProperties() - sequencing_sample_type = sample.getSampleType() - sequencing_sample_code = sample.getCode() - sample_properties_dict[SAMPLE_TYPE] = sequencing_sample_type - sample_properties_dict[SAMPLE_CODE] = sequencing_sample_code - - for property in sample_properties: - code = property.getPropertyType().getSimpleCode() - sample_properties_dict[code] = property.tryGetAsString() - - return sample_properties_dict - -# ------------------------------------------------------------------------------- - -def searchParents (search_service, parents): - - # search for the parents - sc = SearchCriteria() - # set the Search Criteria to an OR condition, default is AND - sc.setOperator(SearchCriteria.SearchOperator.MATCH_ANY_CLAUSES) - # Get the codes for all parents - for parent in parents: - parentSubCode = parent.getSubCode() - sc.addMatchClause(SearchCriteria.MatchClause.createAttributeMatch(SearchCriteria.MatchClauseAttribute.CODE, parentSubCode)); - # all parents of the flow lane - foundParents = search_service.searchForSamples(sc) - - return foundParents - -# ------------------------------------------------------------------------------- - -def sanitizeString(myString): - return re.sub('[^A-Za-z0-9]+', '_', myString) - -# ------------------------------------------------------------------------------- - -def searchSample (sample_code, search_service): - sc = SearchCriteria() - print('Searching sample: '+ str(sample_code)) - sc.addMatchClause(SearchCriteria.MatchClause.createAttributeMatch(SearchCriteria.MatchClauseAttribute.CODE, sample_code)); - foundSamples = search_service.searchForSamples(sc) - return foundSamples - - -def renameFiles (fastq_files, undetermined, flow_cell_id): - - newFastqFileList = [] - for file in fastq_files: - if undetermined: - folder = os.path.dirname(file) - fileName = os.path.basename(file) - filepart, suffix = fileName.split('.',1) - new_file = folder + "/" + flow_cell_id + '_' + filepart + "." + suffix - print ("Renaming file " + file + " to " + new_file) - os.rename(file, new_file) - else: - new_file = file - newFastqFileList.append(new_file) - return newFastqFileList - -# ------------------------------------------------------------------------------- - -def put_files_to_dataset (transaction, dataSet, fastq_files, folder_name, flow_cell_id, sample_space, undetermined): - - for file in fastq_files: - extraCopySciCore (sample_space, file, folder_name) - transaction.moveFile(file, dataSet, folder_name) - -# ------------------------------------------------------------------------------- - -def split_incoming_folder_name (name): - split=name.split("_") - - # expected incoming Name, e.g.: BSSE_QGF_22266_H0W8YBGXX_1 - if (len(split) == 5): - sample_code = '-'.join([split[0], split[1], split[2]]) - flowCellId = split[3] - flowLane = split[-1] - undetermined = False - - # expected Undetermined_H0W8YBGXX - if (len(split) == 2): - sample_code = '' - flowCellId = split[-1] - flowLane = "1" - undetermined = True - - incoming_sample = flowCellId + ':' + flowLane - return sample_code, flowCellId, flowLane, incoming_sample, undetermined - -# ------------------------------------------------------------------------------- - -def get_vocabulary_descriptions (transaction, vocabulary_name): - vocabulary_descriptions_dict = {} - vocabulary = transaction.getVocabulary(vocabulary_name) - vocabulary_terms = vocabulary.getTerms() - for term in vocabulary_terms: - vocabulary_descriptions_dict[term.getCode()] = term.getDescription() - return vocabulary_descriptions_dict - -# ------------------------------------------------------------------------------- - -def process(transaction): - - undetermined = False - - print("\n" + str(datetime.now())) - - incomingPath = transaction.getIncoming().getAbsolutePath() - name = transaction.getIncoming().getName() - print("register-lane-nextseq.py is processing: " + name) - sample_code, flowCellId, flowLane, incoming_sample, undetermined = split_incoming_folder_name (name) - - # get all fastqs - fastq_files=getFileNames(incomingPath) - - # BSSE-QGF-22266-H0W8YBGXX-1-654-BC3-TTAGGC_S1_L001_R1_001.fastq.gz - # BSSE-QGF-22051-H0T25AGXX-1-1-1-TAAGGCGA-CTCTCTAT_S46_L001_R1_001.fastq.gz - first_fastq_file = os.path.basename(fastq_files[0]) - - # Get the search service - search_service = transaction.getSearchService() - - flowcell_sample_immutable = searchSample (flowCellId, search_service) - fcMetaDataDict = get_sample_properties(transaction, flowcell_sample_immutable[0]) - foundLane = searchSample (incoming_sample, search_service) - - # there should be only one sample because it is unique within one Flow Cell - if (len(foundLane) > 1): - raise Exception("More than one sample found! No unique code: " + incoming_sample) - elif (len(foundLane) == 0): - raise Exception("No matching sample found for: " + incoming_sample) - else : - sample = foundLane[0].getSample() - parents = sample.getParents() - - # Create a data set and set type - dataSet = transaction.createNewDataSet("FASTQ_GZ") - dataSet.setMeasuredData(False) - dataSet.setPropertyValue(INDEX1, DEFAULT_INDEX) - dataSet.setPropertyValue(INDEX2, DEFAULT_INDEX) - dirName = transaction.createNewDirectory(dataSet,name) - - if not undetermined: - newFastqFiles = fastq_files - foundSample = searchSample (sample_code, search_service) - sequencing_sample = foundSample[0].getSample() - experiment = sequencing_sample.getExperiment() - sequencing_sample_code = sequencing_sample.getCode() - print("sequencing_sample_code: "+ sequencing_sample_code) - - sequencing_sample_properties_dict = get_sample_properties (transaction, foundSample[0]) - - if (INDEX1 in sequencing_sample_properties_dict) and (fcMetaDataDict[INDEXREAD1] > 0): - #print(sequencing_sample_properties_dict[INDEX1]) - dataSet.setPropertyValue(INDEX1, sequencing_sample_properties_dict[INDEX1]) - if (INDEX2 in sequencing_sample_properties_dict) and (fcMetaDataDict[INDEXREAD2] > 0): - dataSet.setPropertyValue(INDEX2, sequencing_sample_properties_dict[INDEX2]) - dataSet.setPropertyValue(EXTERNAL_SAMPLE_NAME, sequencing_sample_properties_dict[EXTERNAL_SAMPLE_NAME]) - sample_space = foundSample[0].getSpace() - - filepart, suffix = first_fastq_file.split('.',1) - meta_data_file_name = filepart.rsplit('_',2)[0] + METADATA_FILE_SUFFIX - # get a file from the IDataSetRegistrationTransaction so it is automatically part of the data set - meta_data_file_path = transaction.createNewFile(dataSet, name, meta_data_file_name) - writeMetadataFile(transaction, name, meta_data_file_path, sequencing_sample_properties_dict, - fcMetaDataDict, experiment, sample_space, fastq_files, flowLane) - affiliation_for_Undetermined = sample_space - - # Undetermined Files - else: - sample_space = "" - affiliation_for_Undetermined = "" - newFastqFiles = [] - lane_parents = searchParents (search_service, parents) - newFastqFiles = renameFiles(fastq_files, undetermined, flowCellId) - for parent in lane_parents: - sequencing_sample_properties_dict = get_sample_properties (transaction, parent) - parent_sample = parent.getSample() - sample_code = parent_sample.getCode() - experiment = parent_sample.getExperiment() - sample_space = parent.getSpace() - print(sample_space) - - # Special Sample Types without index (e.g. ILLUMINA_SEQUENCING_NEUROSTEMX_SINGLECELL) are caught here. - # as those samples do not have a NCBI ORGANISM TAXONOMY - if NCBI_ORGANISM_TAXONOMY not in sequencing_sample_properties_dict: - print(sample_code + ": Processing Sample without NCBI ORGANISM TAXONOMY: ILLUMINA_SEQUENCING_NEUROSTEMX_SINGLECELL") - meta_data_file_path = transaction.createNewFile(dataSet, name, sample_code + '_' + flowCellId + '_' + first_fastq_file.split('.')[0] + METADATA_FILE_SUFFIX) - writeMetadataFile(transaction, name, meta_data_file_path, sequencing_sample_properties_dict, - fcMetaDataDict, experiment, sample_space, newFastqFiles, flowLane) - affiliation_for_Undetermined = sample_space - - elif (INDEX1 not in sequencing_sample_properties_dict or sequencing_sample_properties_dict[INDEX1]== 'NOINDEX') and \ - (INDEX2 not in sequencing_sample_properties_dict or sequencing_sample_properties_dict[INDEX2]== 'NOINDEX') and \ - (sequencing_sample_properties_dict[NCBI_ORGANISM_TAXONOMY] != PHIX_TAXONOMY_ID): - print('NONINDEXED sample and Taxonomy id is NOT ' + PHIX_TAXONOMY_ID +', probably a pool: ' + sample_code) - meta_data_file_path = transaction.createNewFile(dataSet, name, sample_code + '_' + flowCellId + '_' + first_fastq_file.split('.')[0] + METADATA_FILE_SUFFIX) - writeMetadataFile(transaction, name, meta_data_file_path, sequencing_sample_properties_dict, - fcMetaDataDict, experiment, sample_space, newFastqFiles, flowLane) - affiliation_for_Undetermined = sample_space - # PARENTS: - else: - # Create Parent Meta data - print(sample_code + ": Create parent meta data file") - meta_data_file_path = transaction.createNewFile(dataSet, name, 'PARENT_' + sample_code + '_' + flowCellId + METADATA_FILE_SUFFIX) - writeMetadataFile(transaction, name, meta_data_file_path, sequencing_sample_properties_dict, - fcMetaDataDict, experiment, sample_space, [], flowLane) - continue - - put_files_to_dataset (transaction, dataSet, newFastqFiles, name, flowCellId, affiliation_for_Undetermined, undetermined) - - if foundLane.size() > 0: - sa = transaction.getSampleForUpdate(foundLane[0].getSampleIdentifier()) - sa.setPropertyValue("DATA_TRANSFERRED", create_openbis_timestamp()) - dataSet.setSample(foundLane[0]) - diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/register-macs/plugin.properties b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/register-macs/plugin.properties deleted file mode 100644 index 9d5511bd58c89dd27ce13ca63e47bf838d542bab..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/register-macs/plugin.properties +++ /dev/null @@ -1,11 +0,0 @@ -# -# Drop box for registering a flow cell output as a data set -# -# Variables: -# incoming-root-dir -# Path to the directory which contains incoming directories for drop boxes. -incoming-dir = ${incoming-root-dir}/register-macs -incoming-data-completeness-condition = marker-file -top-level-data-set-handler = ch.systemsx.cisd.etlserver.registrator.api.v2.JythonTopLevelDataSetHandlerV2 -script-path = register-macs.py -storage-processor = ch.systemsx.cisd.etlserver.DefaultStorageProcessor diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/register-macs/register-macs.py b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/register-macs/register-macs.py deleted file mode 100755 index 17a9d5b074ca2038531cb770bbe4468c25d22225..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/register-macs/register-macs.py +++ /dev/null @@ -1,22 +0,0 @@ - -def process(transaction): - # Create a data set and set type - dataSet = transaction.createNewDataSet("MACS_OUTPUT") - dataSet.setPropertyValue("MACS_VERSION", "1.4.0RC2") - dataSet.setMeasuredData(False) - - incomingPath = incoming.getAbsolutePath() - - # Add the incoming file into the data set - transaction.moveFile(incomingPath, dataSet) - - # rsplit not in Python 2.2 - #sampleName = ":".join(incomingPath.split("/")[-1].rsplit("_",1)) - flowCell = "_".join((incomingPath.split("/")[-1].split("_")[2:-1])) - lane = (incomingPath.split("/")[-1]).split("_")[-1] - sampleName = flowCell + ":" + lane - - # Set the owner of the data set -- the specified sample - sample = transaction.getSample("/BSSE_BEISEL/" + sampleName) - - dataSet.setSample(sample) diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/register-runstatistics/plugin.properties b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/register-runstatistics/plugin.properties deleted file mode 100644 index 8572688f22411a37ed1f5632e4410ad5944c439b..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/register-runstatistics/plugin.properties +++ /dev/null @@ -1,11 +0,0 @@ -# -# Drop box for registering a flow cell output as a data set -# -# Variables: -# incoming-root-dir -# Path to the directory which contains incoming directories for drop boxes. -incoming-dir = ${incoming-root-dir}/register-runstatistics -incoming-data-completeness-condition = marker-file -top-level-data-set-handler = ch.systemsx.cisd.etlserver.registrator.api.v2.JythonTopLevelDataSetHandlerV2 -script-path = register-runstatistics.py -storage-processor = ch.systemsx.cisd.etlserver.DefaultStorageProcessor diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/register-runstatistics/register-runstatistics.py b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/register-runstatistics/register-runstatistics.py deleted file mode 100644 index d7b8b8400d33aa61b42ecf6cee6b7fa3c23d5165..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/register-runstatistics/register-runstatistics.py +++ /dev/null @@ -1,73 +0,0 @@ -''' -@copyright: -2012 ETH Zuerich, CISD - -@license: -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - -http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. - -@description: -Registers an incoming directory as a data set in openBIS. The name of the directory is used to -search for the matching sample. - -@note: -print statements go to: <openBIS_HOME>/datastore_server/log/startup_log.txt -expected incoming Name for HiSeq runs: 110715_SN792_0054_BC035RACXX -expected incoming Name for GAII runs: 110812_6353WAAXX - -@author: -Manuel Kohler -''' - -import os -import shutil -from ch.systemsx.cisd.openbis.generic.shared.api.v1.dto import SearchCriteria -from ch.systemsx.cisd.openbis.generic.shared.api.v1.dto import SearchSubCriteria - -def process(transaction): - - incomingPath = transaction.getIncoming().getPath() - incomingFolder = transaction.getIncoming().getName() - - folders=[] - folders=os.listdir(incomingPath) - - split=incomingFolder.split("_") - if (len(split) == 4): - IS_HISEQ_RUN=True - if (len(split) == 2): - IS_HISEQ_RUN=False - - # Get the search service - search_service = transaction.getSearchService() - - # Search for the sample - sc = SearchCriteria() - sc.addMatchClause(SearchCriteria.MatchClause.createAttributeMatch(SearchCriteria.MatchClauseAttribute.CODE, incomingFolder)); - foundSamples = search_service.searchForSamples(sc) - - if foundSamples.size() > 0: - - # Search for another data set of the same sample and make it a child of it - sampleSc = SearchCriteria() - sampleSc.addSubCriteria(SearchSubCriteria.createSampleContainerCriteria(sc)) - foundContainedSamples = search_service.searchForSamples(sampleSc) - if foundContainedSamples.size() > 0: - for fcs in range(0,foundContainedSamples.size()): - dataSet = transaction.createNewDataSet("RUNINFO") - dataSet.setMeasuredData(False) - dataSet.setSample(foundContainedSamples[fcs]) - # Add the incoming file into the data set - shutil.copytree(incomingPath, incomingPath + "_" + str(fcs+1)) - transaction.moveFile(incomingPath + "_" + str(fcs+1), dataSet) - - shutil.rmtree(incomingPath) diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/register-thumbnails/plugin.properties b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/register-thumbnails/plugin.properties deleted file mode 100644 index 5b89e279f2f7570eaf55c26d183c4a2ff102de2f..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/register-thumbnails/plugin.properties +++ /dev/null @@ -1,12 +0,0 @@ -# -# Drop box for registering a flow cell output as a data set -# -# Variables: -# incoming-root-dir -# Path to the directory which contains incoming directories for drop boxes. -incoming-dir = ${incoming-root-dir}/register-thumbnails -#incoming-dir = /links/sonas/cisd/store/incoming-flowCell -incoming-data-completeness-condition = marker-file -top-level-data-set-handler = ch.systemsx.cisd.etlserver.registrator.api.v2.JythonTopLevelDataSetHandlerV2 -script-path = register-thumbnails.py -storage-processor = ch.systemsx.cisd.etlserver.DefaultStorageProcessor diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/register-thumbnails/register-thumbnails.py b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/register-thumbnails/register-thumbnails.py deleted file mode 100644 index 60937ed4520f013555638718adc54297f27880eb..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/register-thumbnails/register-thumbnails.py +++ /dev/null @@ -1,55 +0,0 @@ -''' -@copyright: -2012 ETH Zuerich, CISD - -@license: -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - -http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. - -@description: -Registers an incoming directory as a data set in openBIS. The name of the directory is used to -search for the matching sample. - -@note: -print statements go to: <openBIS_HOME>/datastore_server/log/startup_log.txt -expected incoming Name for HiSeq runs: 110715_SN792_0054_BC035RACXX -expected incoming Name for GAII runs: 110812_6353WAAXX - -@author: -Manuel Kohler -''' - -import xml.etree.ElementTree as etree -from ch.systemsx.cisd.openbis.generic.shared.api.v1.dto import SearchCriteria - -def process(transaction): - - incomingPath = transaction.getIncoming().getPath() - name = transaction.getIncoming().getName() - - dataSet = transaction.createNewDataSet("THUMBNAILS") - - # Create a data set and set type - dataSet.setMeasuredData(False) - - # Get the search service - search_service = transaction.getSearchService() - - # Search for the sample - sc = SearchCriteria() - sc.addMatchClause(SearchCriteria.MatchClause.createAttributeMatch(SearchCriteria.MatchClauseAttribute.CODE, name)); - foundSamples = search_service.searchForSamples(sc) - - if foundSamples.size() > 0: - # Add the incoming file into the data set - transaction.moveFile(incomingPath, dataSet) - dataSet.setSample(foundSamples[0]) diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/register-unaligned-miseq/plugin.properties b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/register-unaligned-miseq/plugin.properties deleted file mode 100644 index fd7c9481927692dc36665e26cbe382d899dfc674..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/register-unaligned-miseq/plugin.properties +++ /dev/null @@ -1,11 +0,0 @@ -# -# Drop box for registering a flow cell output as a data set -# -# Variables: -# incoming-root-dir -# Path to the directory which contains incoming directories for drop boxes. -incoming-dir = ${root}/dss/register-unaligned-miseq -incoming-data-completeness-condition = marker-file -top-level-data-set-handler = ch.systemsx.cisd.etlserver.registrator.api.v2.JythonTopLevelDataSetHandlerV2 -script-path = register-unaligned-miseq.py -storage-processor = ch.systemsx.cisd.etlserver.DefaultStorageProcessor diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/register-unaligned-miseq/register-unaligned-miseq.py b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/register-unaligned-miseq/register-unaligned-miseq.py deleted file mode 100755 index 97397b4e0bcb692700332252f98f97815afc26c0..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/register-unaligned-miseq/register-unaligned-miseq.py +++ /dev/null @@ -1,176 +0,0 @@ -''' -@copyright: -2012 ETH Zuerich, CISD - -@license: -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - -http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. - -@description: -Expects as incoming folder: <FlowCell>/Unaligned_no_mismatch - -@note: - -@author: -Manuel Kohler -''' - -import os -import glob -import shutil -import time -from ch.systemsx.cisd.openbis.generic.shared.api.v1.dto import SearchCriteria -from ch.systemsx.cisd.openbis.generic.shared.api.v1.dto import SearchSubCriteria - -BASECALL_STATS_FOLDER = 'Basecall_Stats_' -REGEX_FILES = '*.*' -REGEX_MAKEFILE = 'Make*' -REGEX_LANES='/P*' -REGEX_UNDETERMINED = '/U*/Sample*' -UNALIGNED_FOLDER='Unaligned_no_mismatch' -LANE_FOLDER='/links/shared/dsu/dss/register-lane-miseq/' -MARKER_STRING='.MARKER_is_finished_' - -def touch_markerfile(filename): - try: - # do a touch - open(filename, 'w').close() - except: - print('Could not touch ' + filename) - -def searchForLaneParents(transaction, sampleCode): - - search_service = transaction.getSearchService() - sc = SearchCriteria() - sc.addMatchClause(SearchCriteria.MatchClause.createAttributeMatch(SearchCriteria.MatchClauseAttribute.CODE, sampleCode)) - foundSamples = search_service.searchForSamples(sc) - # there should be only one sample because it is unique within one Flow Cell - if (len(foundSamples) > 1): - raise Exception("More than one sample found! No unique code: " + sampleCode) - elif (len(foundSamples) == 0): - raise Exception("No matching sample found for: " + sampleCode) - else : - sample = foundSamples[0].getSample() - parents = sample.getParents() - - # search for the parents - sc = SearchCriteria() - # set the Search Criteria to an OR condition, default is AND - sc.setOperator(SearchCriteria.SearchOperator.MATCH_ANY_CLAUSES) - # Get the codes for all parents - for parent in parents: - parentSubCode = parent.getSubCode() - sc.addMatchClause(SearchCriteria.MatchClause.createAttributeMatch(SearchCriteria.MatchClauseAttribute.CODE, parentSubCode)); - # all parents of the flow lane - foundParents = search_service.searchForSamples(sc) - - parentCodeList = [] - - for foundParent in foundParents: - parent = foundParent.getSample() - # ArrayList - parentProperties = parent.getProperties() - # just get the current code - parentCode = parent.getCode() - parentCodeList.append(parentCode) - #print("Found parent code: "+ parentCode) - - return parentCodeList - - -def renameFiles(transaction, dir, flowcellName): - # Limit of Samples when the Sample Code is still used in the renaming. If Number of Samples is - # bigger than this number, we just write the number in the file name. - - MAX_SAMPLES = 20 - FACILITY_CODE = "BSSE_QGF_" - - for root, dirs, files in os.walk(dir): - for file in files: - lane = file.split("_")[0][-1] - if lane.isdigit(): - sampleCode = flowcellName + ":" + lane - print sampleCode - parentCodeList = searchForLaneParents(transaction, sampleCode) - print parentCodeList - length = len(parentCodeList) - if length > MAX_SAMPLES: - # BSSE_QGF_96_samples_C1A8YACXX_Undetermined_L008_R1_001.fastq.gz - os.rename(root + '/' + file, root + "/" + FACILITY_CODE + str(length) + "_samples_" + flowcellName + "_" + file) - else: - # BSSE_QGF_10001_10002_10003_10004_C1A8YACXX_Undetermined_L008_R1_001.fastq.gz - SampleCodeString = "_".join([(e.split("-")[-1]) for e in parentCodeList]) - os.rename(root + '/' + file, root + "/" + FACILITY_CODE + SampleCodeString + "_" + flowcellName + "_" + file) - -def process(transaction): - - incomingPath = transaction.getIncoming().getPath() - name = transaction.getIncoming().getName() - - split=name.split("_") - DSTYPE='ILLUMINA_MISEQ_OUTPUT' - #flowcell=name.split('_')[-1].split('-')[-1] - flowcell=name.split('_')[-1] - - #move Lanes into a different drop box - laneList=glob.glob(incomingPath + '/'+ UNALIGNED_FOLDER + REGEX_LANES) - laneList.sort() - - undeterminedList=glob.glob(incomingPath + '/'+ UNALIGNED_FOLDER + REGEX_UNDETERMINED) - undeterminedList.sort() - - # add the Flow Cell Name to the Undetermined FASTQ files - [renameFiles(transaction, dir, name) for dir in undeterminedList] - - # Multiplexing: - # First move the Undetermined reads to the other ones - [shutil.move(undeterminedLane, laneList[int(undeterminedLane.split('/')[-1][-1])-1] +'/' + undeterminedLane.split('/')[-1]) for undeterminedLane in undeterminedList] - - [shutil.move(lane, LANE_FOLDER+lane.split('/')[-1]) for lane in laneList] - markerFileList = [touch_markerfile(LANE_FOLDER+MARKER_STRING+lane.split('/')[-1]) for lane in laneList] - - # Create a data set and set type - dataSet = transaction.createNewDataSet("BASECALL_STATS") - dataSet.setMeasuredData(False) - - # Build up a list of file which are part of the data set - fileList=glob.glob(incomingPath + '/'+ UNALIGNED_FOLDER + '/' + REGEX_FILES) - [fileList.append(i) for i in glob.glob(incomingPath + '/' + UNALIGNED_FOLDER +'/' +REGEX_MAKEFILE)] - - # Add the incoming file into the data set - transaction.createNewDirectory(dataSet, UNALIGNED_FOLDER) - # move all files is data set - [transaction.moveFile(file, dataSet, UNALIGNED_FOLDER) for file in fileList] - # move base call stat dir into data set - print("flowcell: "+flowcell) - transaction.moveFile(incomingPath + '/' + UNALIGNED_FOLDER + '/' + BASECALL_STATS_FOLDER + flowcell, dataSet, UNALIGNED_FOLDER + '/') - - # Get the search service - search_service = transaction.getSearchService() - - # Search for the sample - sc = SearchCriteria() - sc.addMatchClause(SearchCriteria.MatchClause.createAttributeMatch(SearchCriteria.MatchClauseAttribute.CODE, name)) - foundSamples = search_service.searchForSamples(sc) - - if foundSamples.size() > 0: - dataSet.setSample(foundSamples[0]) - - # Search for another data set of the same sample and make it a child of it - dataSetSc = SearchCriteria() - dataSetSc.addMatchClause(SearchCriteria.MatchClause.createAttributeMatch(SearchCriteria.MatchClauseAttribute.TYPE, DSTYPE)) - dataSetSc.addSubCriteria(SearchSubCriteria.createSampleCriteria(sc)) - foundDataSets = search_service.searchForDataSets(dataSetSc) - if foundDataSets.size() > 0: - dataSet.setParentDatasets([ds.getDataSetCode() for ds in foundDataSets]) - - shutil.rmtree(incomingPath) diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/register-unaligned/plugin.properties b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/register-unaligned/plugin.properties deleted file mode 100644 index 9c8c317b60db9215ca0b0c60a150018e92930dc1..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/register-unaligned/plugin.properties +++ /dev/null @@ -1,11 +0,0 @@ -# -# Drop box for registering a flow cell output as a data set -# -# Variables: -# incoming-root-dir -# Path to the directory which contains incoming directories for drop boxes. -incoming-dir = ${incoming-root-dir}/register-unaligned -incoming-data-completeness-condition = marker-file -top-level-data-set-handler = ch.systemsx.cisd.etlserver.registrator.api.v2.JythonTopLevelDataSetHandlerV2 -script-path = register-unaligned.py -storage-processor = ch.systemsx.cisd.etlserver.DefaultStorageProcessor diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/register-unaligned/register-unaligned.py b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/register-unaligned/register-unaligned.py deleted file mode 100755 index c8e364f179516ae5cff0a6ebf6a6ed18532f7f2d..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/register-unaligned/register-unaligned.py +++ /dev/null @@ -1,195 +0,0 @@ -''' -@copyright: -2012 ETH Zuerich, CISD - -@license: -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - -http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. - -@description: -Expects as incoming folder: <FlowCell>/Unaligned_no_mismatch - -@note: - -@author: -Manuel Kohler -''' - -import os -import glob -import shutil -import time -from ch.systemsx.cisd.openbis.generic.shared.api.v1.dto import SearchCriteria -from ch.systemsx.cisd.openbis.generic.shared.api.v1.dto import SearchSubCriteria - -BASECALL_STATS_FOLDER = 'Basecall_Stats_' -REGEX_FILES = '*.*' -REGEX_MAKEFILE = 'Make*' -REGEX_LANES='/P*' -REGEX_UNDETERMINED = '/U*/Sample*' -LANE_FOLDER='/links/shared/dsu/dss/register-lane-hiseq/' -MARKER_STRING='.MARKER_is_finished_' - -def touch_markerfile(filename): - try: - # do a touch - open(filename, 'w').close() - except: - print('Could not touch ' + filename) - -def searchForLaneParents(transaction, sampleCode): - - search_service = transaction.getSearchService() - sc = SearchCriteria() - sc.addMatchClause(SearchCriteria.MatchClause.createAttributeMatch(SearchCriteria.MatchClauseAttribute.CODE, sampleCode)) - foundSamples = search_service.searchForSamples(sc) - # there should be only one sample because it is unique within one Flow Cell - if (len(foundSamples) > 1): - raise Exception("More than one sample found! No unique code: " + sampleCode) - elif (len(foundSamples) == 0): - raise Exception("No matching sample found for: " + sampleCode) - else : - sample = foundSamples[0].getSample() - parents = sample.getParents() - - # search for the parents - sc = SearchCriteria() - # set the Search Criteria to an OR condition, default is AND - sc.setOperator(SearchCriteria.SearchOperator.MATCH_ANY_CLAUSES) - # Get the codes for all parents - for parent in parents: - parentSubCode = parent.getSubCode() - sc.addMatchClause(SearchCriteria.MatchClause.createAttributeMatch(SearchCriteria.MatchClauseAttribute.CODE, parentSubCode)); - # all parents of the flow lane - foundParents = search_service.searchForSamples(sc) - - parentCodeList = [] - - for foundParent in foundParents: - parent = foundParent.getSample() - # ArrayList - parentProperties = parent.getProperties() - # just get the current code - parentCode = parent.getCode() - parentCodeList.append(parentCode) - #print("Found parent code: "+ parentCode) - - return parentCodeList - - -def renameFiles(transaction, dir, flowcellName): - # Limit of Samples when the Sample Code is still used in the renaming. If Number of Samples is - # bigger than this number, we just write the number in the file name. - - MAX_SAMPLES = 20 - FACILITY_CODE = "BSSE_QGF_" - - for root, dirs, files in os.walk(dir): - for file in files: - lane = file.split("_")[0][-1] - if lane.isdigit(): - sampleCode = flowcellName + ":" + lane - print sampleCode - parentCodeList = searchForLaneParents(transaction, sampleCode) - print parentCodeList - length = len(parentCodeList) - if length > MAX_SAMPLES: - # BSSE_QGF_96_samples_C1A8YACXX_Undetermined_L008_R1_001.fastq.gz - os.rename(root + '/' + file, root + "/" + FACILITY_CODE + str(length) + "_samples_" + flowcellName + "_" + file) - else: - # BSSE_QGF_10001_10002_10003_10004_C1A8YACXX_Undetermined_L008_R1_001.fastq.gz - SampleCodeString = "_".join([(e.split("-")[-1]) for e in parentCodeList]) - os.rename(root + '/' + file, root + "/" + FACILITY_CODE + SampleCodeString + "_" + flowcellName + "_" + file) - -def process(transaction): - - incomingPath = transaction.getIncoming().getPath() - name = transaction.getIncoming().getName().split('-')[0] - print("incomingPath") - print(incomingPath) - UNALIGNED_FOLDER=glob.glob(os.path.join(incomingPath, 'Unaligned_[0-9]'))[0] - #UNALIGNED_FOLDER=incomingPath - - split=name.split("_") - if (len(split) == 4): - DSTYPE='ILLUMINA_HISEQ_OUTPUT' - flowcell=name.split("_")[-1][1:] - if (len(split) ==2): - DSTYPE='ILLUMINA_GA_OUTPUT' - flowcell=name.split("_")[-1] - - #move Lanes into a different drop box - laneList=glob.glob(UNALIGNED_FOLDER + REGEX_LANES) - laneList.sort() - print ("-------------- Lane List --------------") - print laneList - - undeterminedList=glob.glob(UNALIGNED_FOLDER + REGEX_UNDETERMINED) - print ("GLOB:") - print(UNALIGNED_FOLDER + REGEX_UNDETERMINED) - undeterminedList.sort() - print ("undeterminedList: ") - print (undeterminedList) - - # add the Flow Cell Name to the Undetermined FASTQ files - [renameFiles(transaction, dir, name) for dir in undeterminedList] - - # Multiplexing: - # First move the Undetermined reads to the other ones - try: - #[shutil.move(undeterminedLane, laneList[int(undeterminedLane.split('/')[-1][-1])-1] +'/' + undeterminedLane.split('/')[-1]) for undeterminedLane in undeterminedList] - print("SHUTIL:") - print(undeterminedList[0], os.path.join(laneList[0], os.path.basename(undeterminedList[0]))) - shutil.move(undeterminedList[0], os.path.join(laneList[0], os.path.basename(undeterminedList[0]))) - except: - print ("laneList is not matching the total number of lanes (Missing Project<xxx> folder?)") - - [shutil.move(lane, LANE_FOLDER+lane.split('/')[-1]) for lane in laneList] - markerFileList = [touch_markerfile(LANE_FOLDER+MARKER_STRING+lane.split('/')[-1]) for lane in laneList] - - # Create a data set and set type - dataSet = transaction.createNewDataSet("BASECALL_STATS") - dataSet.setMeasuredData(False) - - # Build up a list of file which are part of the data set - fileList=glob.glob(UNALIGNED_FOLDER + '/' + REGEX_FILES) - [fileList.append(i) for i in glob.glob( UNALIGNED_FOLDER +'/' +REGEX_MAKEFILE)] - - basename_folder = os.path.basename(UNALIGNED_FOLDER) - # Add the incoming file into the data set - transaction.createNewDirectory(dataSet, basename_folder) - # move all files in data set - [transaction.moveFile(file, dataSet, basename_folder) for file in fileList] - print("MOVE:") - print(os.path.join(UNALIGNED_FOLDER, BASECALL_STATS_FOLDER + flowcell)) - transaction.moveFile(os.path.join(UNALIGNED_FOLDER, BASECALL_STATS_FOLDER + flowcell), dataSet, basename_folder) - - # Get the search service - search_service = transaction.getSearchService() - - # Search for the sample - sc = SearchCriteria() - sc.addMatchClause(SearchCriteria.MatchClause.createAttributeMatch(SearchCriteria.MatchClauseAttribute.CODE, transaction.getIncoming().getName().replace("-", ":"))) - foundSamples = search_service.searchForSamples(sc) - - if foundSamples.size() > 0: - dataSet.setSample(foundSamples[0]) - - # Search for another data set of the same sample and make it a child of it - dataSetSc = SearchCriteria() - dataSetSc.addMatchClause(SearchCriteria.MatchClause.createAttributeMatch(SearchCriteria.MatchClauseAttribute.TYPE, DSTYPE)) - dataSetSc.addSubCriteria(SearchSubCriteria.createSampleCriteria(sc)) - foundDataSets = search_service.searchForDataSets(dataSetSc) - if foundDataSets.size() > 0: - dataSet.setParentDatasets([ds.getDataSetCode() for ds in foundDataSets]) - - #shutil.rmtree(incomingPath) diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/register-undetermined/plugin.properties b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/register-undetermined/plugin.properties deleted file mode 100644 index c78a57ca244766cc707cedd9945aaa31e6971d29..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/register-undetermined/plugin.properties +++ /dev/null @@ -1,11 +0,0 @@ -# -# Drop box for registering a flow cell output as a data set -# -# Variables: -# incoming-root-dir -# Path to the directory which contains incoming directories for drop boxes. -incoming-dir = ${incoming-root-dir}/register-undetermined -incoming-data-completeness-condition = marker-file -top-level-data-set-handler = ch.systemsx.cisd.etlserver.registrator.api.v2.JythonTopLevelDataSetHandlerV2 -script-path = register-undetermined.py -storage-processor = ch.systemsx.cisd.etlserver.DefaultStorageProcessor diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/register-undetermined/register-undetermined.py b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/register-undetermined/register-undetermined.py deleted file mode 100644 index 9a7414e40816ef57353bc3201dd0d006f454d20c..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/register-undetermined/register-undetermined.py +++ /dev/null @@ -1,63 +0,0 @@ -''' -@copyright: -2014 ETH Zuerich, CISD - -@license: -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - -http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. - -@author: -Manuel Kohler -''' - -import os -import shutil -from ch.systemsx.cisd.openbis.generic.shared.api.v1.dto import SearchCriteria -from ch.systemsx.cisd.openbis.generic.shared.api.v1.dto import SearchSubCriteria - - -def splitFolderName (folderName): - runFolder, lane = folderName.rsplit("-", 1) - - # check if it is a NextSeq run, as we use only the Flowcell code as a Sample code - if ("NS" in runFolder): - return runFolder.split("_")[-1][1:] + ":" + lane - - return runFolder + ":" + lane - -def searchSample (transaction, sampleCode): - # Get the search service - search_service = transaction.getSearchService() - - print("Searching for " + sampleCode) - # Search for the sample - sc = SearchCriteria() - sc.addMatchClause(SearchCriteria.MatchClause.createAttributeMatch(SearchCriteria.MatchClauseAttribute.CODE, sampleCode)) - foundSamples = search_service.searchForSamples(sc) - assert(len(foundSamples), 1) - return foundSamples[0] - -def process(transaction): - - # expected incoming folder names: - # MiSeq: 141217_D00535_0040_BC6GHLANXX-1 - # NextSeq: 141217_NS500318_0034_AH1766BGXX-1 - # HiSeq: 141204_D00535_0035_BC5LPVANXX-8 - - incomingFolder = transaction.getIncoming().getName() - flowLaneName = splitFolderName(incomingFolder) - flowLane = searchSample(transaction, flowLaneName) - - dataSet = transaction.createNewDataSet("UNDETERMINED_READS_DISTRIBUTION") - dataSet.setMeasuredData(False) - dataSet.setSample(flowLane) - transaction.moveFile(transaction.getIncoming().getPath(), dataSet) diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/register_aggregated-basecall-stats/plugin.properties b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/register_aggregated-basecall-stats/plugin.properties deleted file mode 100644 index b5620f9aa35ea00cc38d4648e29d2b12e8b0ae8e..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/register_aggregated-basecall-stats/plugin.properties +++ /dev/null @@ -1,11 +0,0 @@ -# -# Drop box for registering a flow cell output as a data set -# -# Variables: -# incoming-root-dir -# Path to the directory which contains incoming directories for drop boxes. -incoming-dir = ${root}/dss/register-aggregated-basecall-stats -incoming-data-completeness-condition = marker-file -top-level-data-set-handler = ch.systemsx.cisd.etlserver.registrator.api.v2.JythonTopLevelDataSetHandlerV2 -script-path = register-aggregated-basecall-stats.py -storage-processor = ch.systemsx.cisd.etlserver.DefaultStorageProcessor diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/register_aggregated-basecall-stats/register-aggregated-basecall-stats.py b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/register_aggregated-basecall-stats/register-aggregated-basecall-stats.py deleted file mode 100644 index b9bfdfb031c4ce5d4a1921117dfde2b0a36bc4d2..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/register_aggregated-basecall-stats/register-aggregated-basecall-stats.py +++ /dev/null @@ -1,72 +0,0 @@ -''' -@copyright: -2014 ETH Zuerich, CISD - -@license: -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - -http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. - -@description: -Registers an incoming directory as a data set in openBIS. The name of the directory is used to -search for the matching sample. - -@note: -print statements go to: <openBIS_HOME>/datastore_server/log/startup_log.txt -expected incoming Name for HiSeq runs: 110715_SN792_0054_BC035RACXX -expected incoming Name for GAII runs: 110812_6353WAAXX -expected incoming Name for MiSeq runs: 121218_M00721_0017_000000000-A0T19 - -@author: -Manuel Kohler -''' - -import os -from ch.systemsx.cisd.openbis.generic.shared.api.v1.dto import SearchCriteria -from ch.systemsx.cisd.openbis.generic.shared.api.v1.dto import SearchSubCriteria - -def process(transaction): - - incomingPath = transaction.getIncoming().getPath() - incomingFolder = transaction.getIncoming().getName() - - folders=os.listdir(incomingPath) - - # expected incoming Name, e.g.: 110715_SN792_0054_BC035RACXX - - # Create a data set and set type - dataSet = transaction.createNewDataSet("AGGREGATED_BASECALL_STATS") - dataSet.setMeasuredData(False) - - dataSet.setPropertyValue("MISMATCH_IN_INDEX", "NONE") - - # Get the search service - search_service = transaction.getSearchService() - - # Add the incoming file into the data set - transaction.moveFile(incomingPath, dataSet) - - # Search for the sample - sc = SearchCriteria() - sc.addMatchClause(SearchCriteria.MatchClause.createAttributeMatch(SearchCriteria.MatchClauseAttribute.CODE, incomingPath)) - foundSamples = search_service.searchForSamples(sc) - - - if foundSamples.size() > 0: - dataSet.setSample(foundSamples[0]) - - # Search for another data set of the same sample - #dataSetSc = SearchCriteria() - #dataSetSc.addMatchClause(SearchCriteria.MatchClause.createAttributeMatch(SearchCriteria.MatchClauseAttribute.TYPE, 'ILLUMINA_HISEQ_OUTPUT')) - #dataSetSc.addSubCriteria(SearchSubCriteria.createSampleCriteria(sc)) - #foundDataSets = search_service.searchForDataSets(dataSetSc) - #if foundDataSets.size() > 0: - # dataSet.setParentDatasets([ds.getDataSetCode() for ds in foundDataSets]) diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/reporting-plugins/setInvoiceSent/plugin.properties b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/reporting-plugins/setInvoiceSent/plugin.properties deleted file mode 100644 index 253d1a19bb66ff0f7d51115cd3015872093143aa..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/reporting-plugins/setInvoiceSent/plugin.properties +++ /dev/null @@ -1,3 +0,0 @@ -label = Set Invoice Sent property -class = ch.systemsx.cisd.openbis.dss.generic.server.plugins.jython.JythonIngestionService -script-path = script.py diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/reporting-plugins/setInvoiceSent/script.py b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/reporting-plugins/setInvoiceSent/script.py deleted file mode 100644 index a01000b8dc9574e0f785ca80d4e51315e3843c34..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/reporting-plugins/setInvoiceSent/script.py +++ /dev/null @@ -1,65 +0,0 @@ -def process(tr, parameters, tableBuilder): - - import subprocess - import os - import re - from java.util import EnumSet - from ch.systemsx.cisd.openbis.generic.shared.api.v1.dto import SearchCriteria - from ch.systemsx.cisd.openbis.dss.client.api.v1 import OpenbisServiceFacadeFactory - from ch.systemsx.cisd.openbis.generic.shared.api.v1.dto import SampleFetchOption - - def sanitizeString(myString): - myString = myString.replace(u'ä', 'ae') - myString = myString.replace(u'ü', 'ue') - myString = myString.replace(u'ö', 'oe') - return re.sub('[^A-Za-z0-9]+', '_', myString) - - sampleId = parameters.get("sampleId") - plainPi = parameters.get("pI") - flowcellId = sampleId.split('/')[-1] - - # Search for the sample - search_service = tr.getSearchService() - sc = SearchCriteria() - sc.addMatchClause(SearchCriteria.MatchClause.createAttributeMatch(SearchCriteria.MatchClauseAttribute.CODE, flowcellId)); - myFC = search_service.searchForSamples(sc) - try: - assert myFC.size() == 1 - except AssertionError: - print (str(myFC.size()) + " " + flowcellId) - - for p in myFC: - numberOfLanes = int(p.getPropertyValue('LANECOUNT')) - - for lane in range(1, numberOfLanes + 2): - myLane = flowcellId + ":" + str(lane) - laneSc = SearchCriteria(); - laneSc.addMatchClause(SearchCriteria.MatchClause.createAttributeMatch(SearchCriteria.MatchClauseAttribute.CODE, myLane)); - laneList = search_service.searchForSamples(laneSc) - - if not laneList: - myLane = flowcellId + ":1_" + str(lane) - print("myLane: " + myLane) - laneSc = SearchCriteria(); - laneSc.addMatchClause(SearchCriteria.MatchClause.createAttributeMatch(SearchCriteria.MatchClauseAttribute.CODE, myLane)); - laneList = search_service.searchForSamples(laneSc) - - for l in laneList: - laneParents = l.getParentSampleIdentifiers() - - for sampleCode in laneParents: - Sample = tr.getSample(sampleCode) - FullSamplePi = Sample.getPropertyValue('PRINCIPAL_INVESTIGATOR_NAME') - samplePi = sanitizeString(FullSamplePi) - print samplePi + " == " + sanitizeString(plainPi) + " ?" - - if (samplePi == sanitizeString(plainPi)): - print "Setting Property 'INVOICE_SENT' to true for sample: " + sampleCode - updateableSample = tr.getSampleForUpdate(sampleCode) - updateableSample.setPropertyValue('INVOICE', 'True') - - tableBuilder.addHeader("CSV") - - row = tableBuilder.addRow() - row.setCell("CSV",plainPi) - diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/reporting-plugins/triggerCreateSampleSheet/plugin.properties b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/reporting-plugins/triggerCreateSampleSheet/plugin.properties deleted file mode 100644 index f759e0ab0f49e73a3f4b763c5ac151b5209b38f4..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/reporting-plugins/triggerCreateSampleSheet/plugin.properties +++ /dev/null @@ -1,3 +0,0 @@ -label = Trigger Sample Sheet Creation -class = ch.systemsx.cisd.openbis.dss.generic.server.plugins.jython.JythonAggregationService -script-path = script.py diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/reporting-plugins/triggerCreateSampleSheet/script.py b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/reporting-plugins/triggerCreateSampleSheet/script.py deleted file mode 100644 index 6fbad460abe604021a453c42bfdeeac14c947b46..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/reporting-plugins/triggerCreateSampleSheet/script.py +++ /dev/null @@ -1,44 +0,0 @@ -def aggregate(parameters, tableBuilder): - - import subprocess - sampleSheetBinary = "/links/application/dsu/createSampleSheet/createSampleSheet.sh" - sampleSheetBinaryMiSeq = "/links/application/dsu/createSampleSheet/createSampleSheet_miseq.sh" - - miSeqPath = "/links/shared/dsu/runs/yoda" - - sampleId = parameters.get("sampleId") - sendEmail = parameters.get("sendEmail") - miSeqRun = parameters.get("miSeqRun") - flowcellId = sampleId.split('/')[-1] - - if '-' in flowcellId: - flowCellName = flowcellId.split('_')[3] - else: - flowCellName = flowcellId.split('_')[3][1:] - - sampleSheetFileName = "SampleSheet_" + flowCellName + ".csv" - - if miSeqRun: - binary = sampleSheetBinaryMiSeq - else: - binary = sampleSheetBinary - - sampleSheet = subprocess.Popen([binary, "-f", flowcellId, "-v", "-o", miSeqPath, "=l", "win32"], stdout=subprocess.PIPE) - result = sampleSheet.stdout.read() - ssList = result.split('\n') - if sendEmail: - mailService.createEmailSender().withSubject("Sample Sheet for flow cell: " + flowcellId).withAttachedText(result, sampleSheetFileName).send() - - tableBuilder.addHeader("CSV") - - row = tableBuilder.addRow() - row.setCell("CSV","Created Sample Sheet "+ sampleSheetFileName + " and stored here: " + "Y:/yoda") - row = tableBuilder.addRow() - row.setCell("CSV",200*"-") - - for line in ssList: - row = tableBuilder.addRow() - row.setCell("CSV",line) - - row = tableBuilder.addRow() - row.setCell("CSV",200*"-") diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/reporting-plugins/triggerInvoice/plugin.properties b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/reporting-plugins/triggerInvoice/plugin.properties deleted file mode 100644 index dd31feda5994d87315622c88e16f23fa9b10aa6f..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/reporting-plugins/triggerInvoice/plugin.properties +++ /dev/null @@ -1,3 +0,0 @@ -label = Trigger Invoice Creation -class = ch.systemsx.cisd.openbis.dss.generic.server.plugins.jython.JythonIngestionService -script-path = script.py diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/reporting-plugins/triggerInvoice/script.py b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/reporting-plugins/triggerInvoice/script.py deleted file mode 100644 index 5161cd0f050e0ebc66f527672074109a03d04439..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/reporting-plugins/triggerInvoice/script.py +++ /dev/null @@ -1,75 +0,0 @@ -def process(tr, parameters, tableBuilder): - - import subprocess - import os - from ch.systemsx.cisd.openbis.generic.shared.api.v1.dto import SearchCriteria - - base = "/home/sbsuser/openbis/createInvoices/" - createInvoiceBinary = base + "createInvoices.sh" - outDir = base + "invoices/" - magicString = "@Invoice@" - - invoiceSentList = [] - tmpIndexList = [] - - sampleId = parameters.get("sampleId") - sendEmail = parameters.get("sendEmail") - flowcellId = sampleId.split('/')[-1] - invoiceList = subprocess.Popen([createInvoiceBinary, "-f", flowcellId, "-o", outDir, "-d"], stdout=subprocess.PIPE) - result = invoiceList.stdout.read() - - ssList = result.split('\n') - print ssList - - for idx, element in enumerate(ssList): - if element.startswith(magicString): - tmpIndexList.append(idx) - invoiceSentList.append(element.split('@')[-1]) - - tmpIndexList.sort(reverse=True) - for idx in tmpIndexList: - ssList.pop(idx) - - ssList = ssList[:-1] - - if sendEmail: - mailService.createEmailSender().withSubject("Invoice for flow cell: " + flowcellId).withAttachedText(result, "Invoice_" + flowcellId + ".csv").send() - - # Search for the sample - search_service = tr.getSearchService() - sc = SearchCriteria() - sc.addMatchClause(SearchCriteria.MatchClause.createAttributeMatch(SearchCriteria.MatchClauseAttribute.CODE, flowcellId)); - myFC = search_service.searchForSamples(sc) - try: - assert myFC.size() == 1 - except AssertionError: - print (str(myFC.size()) + " " + myFC.getCode()) - - def attachFile(fileToAttach): - f = open(fileToAttach, 'r') - print ("Attaching " + fileToAttach + " to " + myFC[0].getSampleIdentifier()) - updateableSample = tr.getSampleForUpdate(myFC[0].getSampleIdentifier()) - updateableSample.addAttachment(fileToAttach, "Invoice for Flow Cell " + flowcellId, "Invoice", f.read()) - - column1 = "CSV" - column2 = "invoiceFlag" - - tableBuilder.addHeader(column1) - tableBuilder.addHeader(column2) - - for pI in invoiceSentList: - print pI - - for line in ssList: - XLXSfile = os.path.split(line)[-1] - print ("___________________________") - print line - print "File: " + XLXSfile - #line = '<a target="_self" href="' + filePath + XLXSfile + '">' + XLXSfile + '</a>' - attachFile(outDir + XLXSfile) - row = tableBuilder.addRow() - row.setCell(column1,"Attached file as " + XLXSfile) - - for pI in invoiceSentList: - row = tableBuilder.addRow() - row.setCell(column2, pI) diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/reporting-plugins/triggerbee/lib/jyson-1.0.2.jar b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/reporting-plugins/triggerbee/lib/jyson-1.0.2.jar deleted file mode 100644 index 9988738cfce62d14d74610118a57eb604d66d2fe..0000000000000000000000000000000000000000 Binary files a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/reporting-plugins/triggerbee/lib/jyson-1.0.2.jar and /dev/null differ diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/reporting-plugins/triggerbee/plugin.properties b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/reporting-plugins/triggerbee/plugin.properties deleted file mode 100644 index f868293375094314d81d81b0550cf957569bfb6a..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/reporting-plugins/triggerbee/plugin.properties +++ /dev/null @@ -1,3 +0,0 @@ -label = Trigger bee job -class = ch.systemsx.cisd.openbis.dss.generic.server.plugins.jython.JythonIngestionService -script-path = script.py diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/reporting-plugins/triggerbee/script.py b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/reporting-plugins/triggerbee/script.py deleted file mode 100644 index dd43a63be7e229cc294edb96af1219546f603c66..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/reporting-plugins/triggerbee/script.py +++ /dev/null @@ -1,194 +0,0 @@ -from __future__ import with_statement -import subprocess -import os -import time -import shutil -import sys -import datetime -import httplib -import urllib - -from com.xhaus.jyson import JysonCodec as json -from ch.systemsx.cisd.openbis.generic.shared.api.v1.dto import SearchCriteria - -ORGANISM_CODE = 'NCBI_ORGANISM_TAXONOMY' - -# here we have a lookup table to look for the the bowtie2 index names given -# by the NCBI/openBIS taxonomy - -ORGANISM_DICT = {"10090" : "mm10", # Mouse - "9606" : "hg19", # Human - "7227" : "dm3", # Fruit fly - "10847" : "phix", # phiX - "4932" : "sacCer3", # baker's yeast - "1773" : "myc_tub_h37rv_2", # M. tuberculosis H37Rv -} - -column1 = "resultCode" -column2 = "resultString" - -def process(tr, parameters, tableBuilder): - ''' - Main function which controls the output - ''' - method = parameters.get("method") - permId = parameters.get("permId") - userId = parameters.get("userId") - - tableBuilder.addHeader(column1) - tableBuilder.addHeader(column2) - - if method == "startJob": - print "Start the job" - startJob(tr, parameters, userId, tableBuilder) - - if method == "pollJob": - pollJob(tr, parameters, userId, tableBuilder) - -# -------------------------------------------------------------------- - -def startJob(tr, parameters, userId, tableBuilder): - ''' - Starts job - ''' - permId = parameters.get("permId") - sendEmail = parameters.get("sendEmail") - bowtieParam = parameters.get("bowtieParam") - clusteroption = parameters.get("clusteroptionsParam") - - outputDict = {} - result = "" - - def searchDs (tr, dscode): - # search for the data set - search_service = tr.getSearchService() - sc = SearchCriteria() - sc.addMatchClause(SearchCriteria.MatchClause.createAttributeMatch( \ - SearchCriteria.MatchClauseAttribute.CODE, dscode)); - myds = search_service.searchForDataSets(sc) - try: - assert myds.size() == 1 - except assertionerror: - print (str(myds.size()) + " " + myds.getcode()) - return myds - - # -------------------------------------------------------------------- - - def searchSample (tr, sampleCode): - search_service = tr.getSearchService() - sc = SearchCriteria() - sc.addMatchClause(SearchCriteria.MatchClause.createAttributeMatch( \ - SearchCriteria.MatchClauseAttribute.CODE, sampleCode)); - searchedSamples = search_service.searchForSamples(sc) - try: - assert searchedSamples.size() == 1 - except assertionerror: - print (str(searchedSamples.size()) + " " + searchedSamples.getcode()) - return searchedSamples - - # -------------------------------------------------------------------- - - dataSet = searchDs(tr, permId) - connectedSampleId = dataSet[0].getSample().getSampleIdentifier() - - # We have to do a second search for the sample, otherwise the peroperties - # are not present when using dataSet[0].getSample() fro accessing the sample - - content = contentProvider.getContent(permId) - #print content - pList = content.listMatchingNodes(".*.fastq.gz") - #print pList - - stop = False - taxonomyURL = "http://www.ncbi.nlm.nih.gov/Taxonomy/Browser/wwwtax.cgi?id=" - - def returnDict(outputDict): - for entry in outputDict: - row = tableBuilder.addRow() - row.setCell(column1, outputDict[entry][0]) - row.setCell(column2, outputDict[entry][1]) - - if pList: - sampleCode = "-".join(str(pList[0].tryGetFile()).split("/")[-1].split("_")[0:3]) - - print sampleCode - foundSample = searchSample(tr, sampleCode) - organism = foundSample[0].getPropertyValue(ORGANISM_CODE) - - if organism: - print organism - try: - org = ORGANISM_DICT[organism] - outputDict[0] = [0, "Found " + org + "[" +organism + \ - "] as reference genome - defined in Sample " + \ - sampleCode ] - except: - outputDict[0] = [1, 'Given organism <a href=\"' + taxonomyURL + organism + '\" target=\"_blank\">' + organism + '</a> from sample ' + sampleCode + ' is not available as bowtie2 index.'] - #sys.exit("Given organism not available as bowtie2 index") - stop = True - - if not bowtieParam: - bowtieParam = '--phred33' - - if not stop: - headers = {"Content-type": "application/x-www-form-urlencoded", "Accept": "text/plain"} - workflow = open('/home/sbsuser/bee/bowtie2_bee.xml').read() - params = urllib.urlencode({'workflow': workflow, 'api.datasetID': permId, 'api.organism': ORGANISM_DICT[organism], 'api.bowtieParams':bowtieParam, 'api.user' : userId}) - conn = httplib.HTTPConnection("127.0.0.1:9999") - conn.request("POST", "/apiv1/processes", params, headers) - resp = conn.getresponse() - conn.close() - outputDict[1] = [0, "Job started..."] - #outputDict[1] = [0, str(resp.read())] - #outputDict[2] = [0, str(resp.status)] - - else: - outputDict[0] = [1, "No organism specified in the sample. Making an alignment is not possible."] - - #sampleId, fcDate, seqSn, runningNumber, fcID, lane, index, fullLane, readNumber, fileNumber = filename.split('-')[-1].split('_') - - returnDict(outputDict) - -# -------------------------------------------------------------------- - -def pollJob(tr, parameters, userId, tableBuilder): - - permId = parameters.get("permId") - - conn = httplib.HTTPConnection("127.0.0.1:9999") - conn.request("GET", "/apiv1/processes?inputId=" + permId) - resp = conn.getresponse().read() - conn.close() - - if resp != 'null': - data = json.loads(resp) - processes = data['workflowDTO'] - strOut = "Processing history: \n" - else: - strOut = "No Job started." - processes = [] - - isThereRunning = False - - if not isinstance(processes, list): - processes = [processes] - - for p in processes: - d = datetime.datetime.fromtimestamp(float(p['startTime'])/1000.0) - strOut += "Process started: " + str(d) + " is in state: " + p['status'] + "\n" - if not isFinished(p['status']): - isThereRunning = True - - column1 = "resultCode" - column2 = "resultString" - - row = tableBuilder.addRow() - if not isThereRunning: - row.setCell(column1, 100 ) - row.setCell(column2, strOut ) - else: - row.setCell(column1, 101 ) - row.setCell(column2, strOut ) - -def isFinished(status): - return status == 'COMPLETE' or status == 'ABORTED' or status == 'ERROR' or status == 'WARNING' diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/reporting-plugins/triggergc3pie/plugin.properties b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/reporting-plugins/triggergc3pie/plugin.properties deleted file mode 100644 index 0755ced0278c17e575e8e246816c705dec53846c..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/reporting-plugins/triggergc3pie/plugin.properties +++ /dev/null @@ -1,3 +0,0 @@ -label = Trigger gc3pie job -class = ch.systemsx.cisd.openbis.dss.generic.server.plugins.jython.JythonIngestionService -script-path = script.py diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/reporting-plugins/triggergc3pie/script.py b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/reporting-plugins/triggergc3pie/script.py deleted file mode 100644 index 92d9e9d84cca15336b7acd49d4778730b0fc196c..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/reporting-plugins/triggergc3pie/script.py +++ /dev/null @@ -1,201 +0,0 @@ -from __future__ import with_statement -import subprocess -import os -import time -import shutil -import sys -from ch.systemsx.cisd.openbis.generic.shared.api.v1.dto import SearchCriteria - -ORGANISM_CODE = 'NCBI_ORGANISM_TAXONOMY' - -# here we have a lookup table to look for the the bowtie2 index names given -# by the NCBI/openBIS taxonomy - -ORGANISM_DICT = {"10090" : "mm10", # Mouse - "9606" : "hg19", # Human - "7227" : "dm3", # Fruit fly - "10847" : "phix", # phiX - "4932" : "sacCer3", # baker's yeast -} - -SESSIONDIR="/home/sbsuser/openbis/sprint/servers/datastore_server/dss-tmp/" - -column1 = "resultCode" -column2 = "resultString" - -# -------------------------------------------------------------------- - -def fileExists (fileName): - - #if os.path.isfile(fileName): - # return True - #else: - # return False - - try: - with open(fileName): - print fileName - print "exists!" - return True - except IOError: - print "no file" - return False - -# -------------------------------------------------------------------- - -def getSessionPath(permId, userId): - return SESSIONDIR + permId + "_" + userId - -# -------------------------------------------------------------------- - -def process(tr, parameters, tableBuilder): - ''' - Main function which controls the output - ''' - method = parameters.get("method") - permId = parameters.get("permId") - userId = parameters.get("userId") - - tableBuilder.addHeader(column1) - tableBuilder.addHeader(column2) - - if (method == "startJob" and not os.path.exists(getSessionPath(permId, userId))): - print "Start the job" - startJob(tr, parameters, userId, tableBuilder) - - if method == "pollJob": - pollJob(tr, parameters, userId, tableBuilder) - -# -------------------------------------------------------------------- - -def startJob(tr, parameters, userId, tableBuilder): - ''' - Starts job - ''' - permId = parameters.get("permId") - sendEmail = parameters.get("sendEmail") - bowtieParam = parameters.get("bowtieParam") - clusteroption = parameters.get("clusteroptionsParam") - - #print(permId) - #print(sendEmail) - #print(bowtieParam) - #print(clusteroption) - - outputDict = {} - result = "" - - CMD = "/home/sbsuser/openbis/bin/gc3_bowtie2.sh" - - def searchDs (tr, dscode): - # search for the data set - search_service = tr.getSearchService() - sc = SearchCriteria() - sc.addMatchClause(SearchCriteria.MatchClause.createAttributeMatch( \ - SearchCriteria.MatchClauseAttribute.CODE, dscode)); - myds = search_service.searchForDataSets(sc) - try: - assert myds.size() == 1 - except assertionerror: - print (str(myds.size()) + " " + myds.getcode()) - return myds - - # -------------------------------------------------------------------- - - def searchSample (tr, sampleCode): - search_service = tr.getSearchService() - sc = SearchCriteria() - sc.addMatchClause(SearchCriteria.MatchClause.createAttributeMatch( \ - SearchCriteria.MatchClauseAttribute.CODE, sampleCode)); - searchedSamples = search_service.searchForSamples(sc) - try: - assert searchedSamples.size() == 1 - except assertionerror: - print (str(searchedSamples.size()) + " " + searchedSamples.getcode()) - return searchedSamples - - # -------------------------------------------------------------------- - - dataSet = searchDs(tr, permId) - connectedSampleId = dataSet[0].getSample().getSampleIdentifier() - - # We have to do a second search for the sample, otherwise the peroperties - # are not present when using dataSet[0].getSample() fro accessing the sample - - content = contentProvider.getContent(permId) - #print content - pList = content.listMatchingNodes(".*.fastq.gz") - #print pList - - def returnDict(outputDict): - for entry in outputDict: - row = tableBuilder.addRow() - row.setCell(column1, outputDict[entry][0]) - row.setCell(column2, outputDict[entry][1]) - - - if pList: - sampleCode = "-".join(str(pList[0].tryGetFile()).split("/")[-1].split("_")[0:3]) - - print sampleCode - foundSample = searchSample(tr, sampleCode) - organism = foundSample[0].getPropertyValue(ORGANISM_CODE) - print organism - - if organism: - try: - outputDict[0] = [0, "Found " + ORGANISM_DICT[organism] + "[" +organism + \ - "] as reference genome - defined in Sample " + \ - sampleCode ] - - for element in pList: - print element.tryGetFile() - file = str(element.tryGetFile()) - - # here we actually start the job - proc = subprocess.Popen([CMD, file, permId + "_" + userId, ORGANISM_DICT[organism], "\'" + bowtieParam + "\'", clusteroption, "8" , getSessionPath(permId, userId)], stdout=subprocess.PIPE, stderr=subprocess.PIPE) - strOut, err = proc.communicate() - print strOut - print err - - filename = os.path.basename(file) - if len(err) == 0: - outputDict[5] = [0, strOut] - outputDict[1] = [0, "Processing " + filename] - outputDict[3] = [0, "Successfully submitted job to... "] - else: - outputDict[5] = [1, err] - - except: - outputDict[0] = [1, "Given organism " + organism + " from sample " + sampleCode + " is not available as bowtie2 index."] - else: - outputDict[0] = [1, "No organism specified in the sample. Making an alignment is not possible."] - - #sampleId, fcDate, seqSn, runningNumber, fcID, lane, index, fullLane, readNumber, fileNumber = filename.split('-')[-1].split('_') - - returnDict(outputDict) - -# -------------------------------------------------------------------- - -def pollJob(tr, parameters, userId, tableBuilder): - - permId = parameters.get("permId") - - output = subprocess.Popen(["/home/sbsuser/bela_play/gc3Status.sh", getSessionPath(permId, userId)], stdout=subprocess.PIPE, stderr=subprocess.PIPE) - strOut, err = output.communicate() - strOut = strOut.strip() - - column1 = "resultCode" - column2 = "resultString" - - row = tableBuilder.addRow() - if strOut == 'TERMINATED' or strOut == 'STOPPED' or strOut == 'Nope': - row.setCell(column1, 100 ) - row.setCell(column2, strOut ) - else: - row.setCell(column1, 101 ) - row.setCell(column2, strOut ) - - if strOut == 'TERMINATED' or strOut == 'STOPPED': - shutil.rmtree(getSessionPath(permId, userId)) - diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/jython-lib/gfb_utils.py b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/jython-lib/gfb_utils.py deleted file mode 100644 index eebbe6b7ac28e4a6d3f6ba1722d818c2010c49e1..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/jython-lib/gfb_utils.py +++ /dev/null @@ -1,120 +0,0 @@ -import os -import time -import fnmatch -from time import * -from datetime import * -from ch.systemsx.cisd.openbis.generic.shared.api.v1.dto import SearchCriteria - -# HISEQ_DICT = {'HISEQ_4000': 'Illumina HiSeq 4000', -# 'HISEQ_3000': 'Illumina HiSeq 3000', -# 'HISEQ_2500': 'Illumina HiSeq 2500', -# 'HISEQ_2000': 'Illumina HiSeq 2000', -# 'HISEQ_X': 'Illumina HiSeq X' -# } -# NEXTSEQ_DICT = {'NEXTSEQ_500': 'Illumina NextSeq 500'} -# MISEQ_DICT = {'MISEQ': 'Illumina MiSeq'} -# UNIDENTIFIED_DICT = {'UNIDENTIFIED': 'Unidentified'} - -# Instead of using Enum: -class Sequencers: - HISEQ_4000, HISEQ_3000, HISEQ_2500, HISEQ_2000, HISEQ_X, NEXTSEQ_500, MISEQ , UNIDENTIFIED= \ - ('Illumina HiSeq 4000','Illumina HiSeq 3000','Illumina HiSeq 2500','Illumina HiSeq 2000', - 'Illumina HiSeq X', 'Illumina NextSeq 500', 'Illumina MiSeq', 'Unidentified') - -HISEQ_LIST = [Sequencers.HISEQ_2000, Sequencers.HISEQ_2500, Sequencers.HISEQ_3000, Sequencers.HISEQ_4000, Sequencers.HISEQ_X] - - -def get_model(run_id): - """ - Guesses the sequencer model from the run folder name - - Current Naming schema for Illumina run folders, as far as I know, - no documentation found on this, Illumina introduced a field called - <InstrumentID> on the NextSeq runParameters.xml. That might be an - option for the future. Alternatively a combination of the fields - <ApplicationName> and <ApplicationVersion>. - - MiSeq: 150130_M01761_0114_000000000-ACUR0 - NextSeq: 150202_NS500318_0047_AH3KLMBGXX - HiSeq 2000: 130919_SN792_0281_BD2CHRACXX - HiSeq 2500: 150203_D00535_0052_AC66RWANXX - HiSeq 3000: 150724_J00121_0017_AH2VYMBBXX - HiSeq 4000: 150210_K00111_0013_AH2372BBXX - HiSeq X: 141121_ST-E00107_0356_AH00C3CCXX - """ - date, machine_id, run_number, fc_string = os.path.basename(run_id).split("_") - - if machine_id.startswith("NS"): - model = Sequencers.NEXTSEQ_500 - elif machine_id.startswith("M"): - model = Sequencers.MISEQ - elif machine_id.startswith("D"): - model = Sequencers.HISEQ_2500 - elif machine_id.startswith("SN"): - model = Sequencers.HISEQ_2000 - elif machine_id.startswith("J"): - model = Sequencers.HISEQ_3000 - elif machine_id.startswith("K"): - model = Sequencers.HISEQ_4000 - elif machine_id.startswith("ST"): - model = Sequencers.HISEQ_X - else: - model = Sequencers.UNIDENTIFIED - return model - - -def get_thread_properties(transaction): - threadPropertyDict = {} - threadProperties = transaction.getGlobalState().getThreadParameters().getThreadProperties() - for key in threadProperties: - try: - threadPropertyDict[key] = threadProperties.getProperty(key) - except: - pass - return threadPropertyDict - - -def create_openbis_timestamp(file): - ''' - Creates a openBIS compatible time stamp of a file time stamp - ''' - mtime = os.path.getmtime(file) - lt = localtime(mtime) - tz = localtime().tm_hour - gmtime().tm_hour - return (strftime("%Y-%m-%d %H:%M:%S GMT" + "%+.2d" % tz + ":00", lt)) - - -def create_openbis_timestamp_now(): - ''' - Create an openBIS conform timestamp - ''' - tz=localtime()[3]-gmtime()[3] - d=datetime.now() - return d.strftime("%Y-%m-%d %H:%M:%S GMT"+"%+.2d" % tz+":00") - - -def search_unique_sample(transaction, sample_code): - - search_service = transaction.getSearchService() - sc = SearchCriteria() - sc.addMatchClause(SearchCriteria.MatchClause.createAttributeMatch(SearchCriteria.MatchClauseAttribute.CODE, sample_code)); - found_sample = search_service.searchForSamples(sc) - try: - assert found_sample.size() == 1 - except AssertionError: - print (str(found_sample.size()) + ' samples found which match the criterias: '+ sample_code) - return found_sample - - -def get_file_names(path, pattern): - ''' - Gets all files matching a PATTERN in a path recursively - and returns the result as a list - ''' - matches = [] - for root, dirnames, filenames in os.walk(path): - for filename in fnmatch.filter(filenames, pattern): - matches.append(os.path.join(root, filename)) - matches.sort() - return(matches) - diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/2/dss/drop-boxes/create-flowcell/create-flowcell.py b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/2/dss/drop-boxes/create-flowcell/create-flowcell.py deleted file mode 100644 index 2fd4f6c157145886a4e7641a5e3b47554d458d7e..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/2/dss/drop-boxes/create-flowcell/create-flowcell.py +++ /dev/null @@ -1,312 +0,0 @@ -''' -@copyright: -2015 ETH Zuerich, SIS - -@license: -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - -http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. - -@description: -Parses the two Illumina provided files 'RunParameters.xml' / 'runParameters.xml -'and 'RunInfo.xml' and creates one Sample of type 'ILLUMINA_FLOW_CELL' -and sets Sample properties from those two XML files. Additionally the -number of lanes are read out and are created as contained samples of -type 'ILLUMINA_FLOW_LANE'. - -@note: -print statements go to: <openBIS_HOME>/datastore_server/log/startup_log.txt - -@author: -Manuel Kohler -''' - -import os -import shutil -import re -from time import * -from datetime import * -import xml.etree.ElementTree as etree -from ch.systemsx.cisd.openbis.generic.shared.api.v1.dto import SearchCriteria -from ch.systemsx.cisd.common.mail import EMailAddress - -# The following module is located in the path defined in the datastore_server.conf -# Look for: -Dpython.path} -from gfb_utils import * - -RUNPARAMETERS = 'RunParameters.xml' -ALTERNATIVE_RUNPARAMETERS = 'runParameters.xml' -RUNINFO = 'RunInfo.xml' -FLOWCELL_SPACE='/BSSE_FLOWCELLS/' -FLOWCELL_PROJECT='FLOWCELLS/' -EXPERIMENT_TYPE_CODE='HT_SEQUENCING' -CYCLES_VOCABULARY_NAME = "CYCLES" - -# Mapping between XML file naming and openBIS properties - -RUNINFO_XML = {'LANECOUNT':'LaneCount', 'SURFACECOUNT':'SurfaceCount', - 'SWATHCOUNT':'SwathCount', 'TILECOUNT':'TileCount'} -RUNPARAMETERS_XML = {'FLOWCELL':'Flowcell', 'RTAVERSION':'RTAVersion', - 'CONTROLLANE':'ControlLane', 'SBS':'Sbs', 'INDEX':'Index', - 'CYCLES_REQUESTED_BY_CUSTOMER':'Read1', 'PE':'Pe', 'RUN_MODE': 'RunMode', - 'CONTROL_SOFTWARE_VERSION': 'ApplicationVersion'} - -PERSISTENT_KEY_MAP = "persistent_key_map" - - -class parseXmlFile: - - def __init__(self, xmlFile): - self.xmlFile = xmlFile - self.tree = etree.parse(self.xmlFile) - self.root = self.tree.getroot() - - - def getXmlElement (self, elementName): - ''' - Returns the text value of a given XML element - ''' - for e in self.root.getchildren(): - element = e.find(elementName) - if element is None: - return 'None' - else: - return element.text - - - def getAllchildren (self, elementName): - ''' - finds all children of a given XML Element and returns them as list - ''' - for e in self.root.getchildren(): - # the '//' means look recursively for all children not only direct ones - childList = self.tree.findall('.//' + elementName) - return childList - - -def registerFlowLane(a_lane, transaction, name, newFlowCell): - ''' - Registers a new Flow lane - ''' - newFlowLane = transaction.createNewSample(FLOWCELL_SPACE + name + ':' + str(a_lane), "ILLUMINA_FLOW_LANE") - newFlowLane.setPropertyValue('CONCENTRATION_FLOWLANE', str(0)) - newFlowLane.setContainer(newFlowCell) - - -def addVocabularyTerm(transaction, vocabularyName, vocabularyCode): - modifiableVocabulary = transaction.getVocabularyForUpdate(vocabularyName) - if not (modifiableVocabulary.containsTerm(vocabularyCode)): - ordinals = [] - terms = modifiableVocabulary.getTerms() - for term in terms: - ordinals.append(term.getOrdinal()) - - newOrdinal = max(ordinals)+1; - - newTerm = transaction.createNewVocabularyTerm(); - newTerm.setCode(vocabularyCode) - newTerm.setOrdinal(newOrdinal) - modifiableVocabulary.addTerm(newTerm) - - -def send_email(mailClient, persistent_map): - - replyTo = EMailAddress("no-reply@bsse.ethz.ch") - fromAddress = replyTo - manuel = EMailAddress("manuel.kohler@id.ethz.ch") - ina = EMailAddress("ina.nissen@bsse.ethz.ch") - christian = EMailAddress("christian.beisel@bsse.ethz.ch") - katja = EMailAddress("katja.eschbach@bsse.ethz.ch") - philippe = EMailAddress("philippe.demougin@unibas.ch") - elodie = EMailAddress("belodie@ethz.ch") - fabian = EMailAddress("fabian.koechl@bsse.ethz.ch") - - subject = "Automatically created new " + persistent_map[1] + " flow cell " + persistent_map[0] + " in openBIS" - body = "A new run got started with flow cell: " + persistent_map [0] + \ - "\n Direct Link: https://openbis-dsu.bsse.ethz.ch/openbis/index.html?#entity=SAMPLE&permId=" + persistent_map[2] + "\nHave a good day! :-)" - mailClient.sendEmailMessage(subject, body, replyTo, fromAddress, ina, katja, christian, philippe, manuel, elodie, fabian); - #mailClient.sendEmailMessage(subject, body, replyTo, fromAddress, manuel); - - -def post_storage(context): - mailClient = context.getGlobalState().getMailClient() - persistent_map = context.getPersistentMap().get(PERSISTENT_KEY_MAP) - send_email(mailClient, persistent_map) - - -def searchSample(transaction, sampleName): - - search_service = transaction.getSearchService() - sc = SearchCriteria() - sc.addMatchClause(SearchCriteria.MatchClause.createAttributeMatch(SearchCriteria.MatchClauseAttribute.CODE, sampleName)); - foundSamples = search_service.searchForSamples(sc) - return foundSamples - - -def setFcProperty(searchId, my_dict, runInfo, newFlowCell): - children = runInfo.getAllchildren(searchId) - for element in (my_dict): - if (element != '') and (my_dict[element] != ''): - newFlowCell.setPropertyValue(element, children[0].attrib[my_dict[element]]) - - -def set_index_lengths (readMap, newFlowCell): - - indexCount = 0 - readCount = 0 - - for entry in readMap: - if readMap[entry][1] == 'Y': - indexCount += 1 - else: - readCount += 1 - - if readCount == 2: - newFlowCell.setPropertyValue("END_TYPE", "PAIRED_END") - else: - newFlowCell.setPropertyValue("END_TYPE", "SINGLE_READ") - - try: - if indexCount == 1: - newFlowCell.setPropertyValue("INDEXREAD", readMap['2'][0]) - else: - newFlowCell.setPropertyValue("INDEXREAD", '0') - except: - newFlowCell.setPropertyValue("INDEXREAD", '0') - - try: - if indexCount == 2: - newFlowCell.setPropertyValue("INDEXREAD2", readMap['3'][0]) - newFlowCell.setPropertyValue("INDEXREAD", readMap['2'][0]) - else: - newFlowCell.setPropertyValue("INDEXREAD2", '0') - except: - newFlowCell.setPropertyValue("INDEXREAD2", '0') - - -def sanitizeString(myString): - return re.sub('[^A-Za-z0-9]+', '_', myString) - - -def get_version(my_path): - return my_path[-4:-2] - - -def create_or_update_flowcell(transaction, fcId): - - found_samples = searchSample(transaction, fcId) - # if flow cell already exists then just get it for an update - if found_samples.size() > 0: - print('Already found a Flow Cell with the following name: ' + fcId + ". Will re-set the properties...") - new_flowcell = transaction.getSampleForUpdate(found_samples[0].getSampleIdentifier()) - else: - new_flowcell = transaction.createNewSample(FLOWCELL_SPACE + fcId, "ILLUMINA_FLOW_CELL") - exp = transaction.getExperiment(FLOWCELL_SPACE + FLOWCELL_PROJECT + datetime.now().strftime("%Y.%m")) - if exp is None: - exp = transaction.createNewExperiment(FLOWCELL_SPACE + FLOWCELL_PROJECT + - datetime.now().strftime("%Y.%m"), EXPERIMENT_TYPE_CODE) - new_flowcell.setExperiment(exp) - return new_flowcell - - -def set_run_mode(transaction, new_flowcell, run_mode): - addVocabularyTerm(transaction, "RUN_MODE_VOCABULARY", run_mode) - new_flowcell.setPropertyValue("RUN_MODE", run_mode) - -def process(transaction): - - incoming = transaction.getIncoming() - incomingPath = incoming.getAbsolutePath() - - run_id = incoming.getName() - model = get_model(run_id) - print("Auto-detected Illumina model: " + model) - - run_date, sequencer_id, running_number, tray_and_fcId = run_id.split("_") - tray = tray_and_fcId[0] - if model in [Sequencers.MISEQ]: - fc_id = tray_and_fcId - else: - fc_id = tray_and_fcId[1:] - - # Parse the RunInfo.xml and RunParameters.xml - runInfo = parseXmlFile(os.path.join(incomingPath, RUNINFO)) - try: - runParameters = parseXmlFile(os.path.join(incomingPath, RUNPARAMETERS)) - except: - runParameters = parseXmlFile(os.path.join(incomingPath, ALTERNATIVE_RUNPARAMETERS)) - - # get the number of lanes - max_lanes = runInfo.getAllchildren('FlowcellLayout')[0].attrib[RUNINFO_XML['LANECOUNT']] - new_flowcell = create_or_update_flowcell(transaction, fc_id) - permId = new_flowcell.getPermId() - transaction.getRegistrationContext().getPersistentMap().put(PERSISTENT_KEY_MAP, [fc_id, model, permId]) - - flow_lanes = new_flowcell.getContainedSamples() - if len(flow_lanes) is 0: - if model in [Sequencers.NEXTSEQ_500]: - max_lanes = 1 - [registerFlowLane(lane, transaction, fc_id, new_flowcell) for lane in range(1,int(max_lanes)+1)] - - # NextSeq specific - if model in [Sequencers.NEXTSEQ_500]: - run_mode = sanitizeString(runParameters.getAllchildren('Chemistry')[0].text) - set_run_mode(transaction, new_flowcell, run_mode) - recipe_folder = (runParameters.getAllchildren('RecipeFolder'))[0].text - major_version = get_version(recipe_folder) - new_flowcell.setPropertyValue("SBS_KIT", major_version) - new_flowcell.setPropertyValue("CONTROL_SOFTWARE_VERSION", runParameters.getAllchildren('ApplicationVersion')[0].text) - - # MiSeq specific - if model in [Sequencers.MISEQ]: - ReagentKitBarcode = (runParameters.getAllchildren('ReagentKitBarcode'))[0].text - new_flowcell.setPropertyValue("SBS_KIT", ReagentKitBarcode) - new_flowcell.setPropertyValue("CONTROL_SOFTWARE_VERSION", runParameters.getAllchildren('ApplicationVersion')[0].text) - - # HiSeq specific - if model in HISEQ_LIST: - run_mode = sanitizeString(runParameters.getXmlElement(RUNPARAMETERS_XML['RUN_MODE'])) - new_flowcell.setPropertyValue("FLOWCELLTYPE", runParameters.getXmlElement(RUNPARAMETERS_XML['FLOWCELL'])) - new_flowcell.setPropertyValue("SBS_KIT", runParameters.getXmlElement(RUNPARAMETERS_XML['SBS'])) - new_flowcell.setPropertyValue("CONTROL_SOFTWARE_VERSION", runParameters.getXmlElement(RUNPARAMETERS_XML['CONTROL_SOFTWARE_VERSION'])) - if (new_flowcell.getPropertyValue("END_TYPE") == "PAIRED_END"): - new_flowcell.setPropertyValue("PAIRED_END_KIT", runParameters.getXmlElement(RUNPARAMETERS_XML['PE'])) - set_run_mode(transaction, new_flowcell, run_mode) - - rta_version = (runParameters.getAllchildren('RTAVersion'))[0].text - addVocabularyTerm(transaction, "PIPELINE_VERSION", rta_version) - new_flowcell.setPropertyValue("ILLUMINA_PIPELINE_VERSION", rta_version) - - # Reading out <FlowcellLayout LaneCount="1" SurfaceCount="1" SwathCount="1" TileCount="12" /> - setFcProperty('FlowcellLayout', RUNINFO_XML, runInfo, new_flowcell) - - sequencer = runInfo.getAllchildren('Instrument') - addVocabularyTerm(transaction, "SEQUENCER", sequencer[0].text) - new_flowcell.setPropertyValue("SEQUENCER", sequencer[0].text) - new_flowcell.setPropertyValue("FLOW_CELL_SEQUENCED_ON", create_openbis_timestamp(os.path.join(incomingPath, RUNINFO))) - new_flowcell.setPropertyValue("RUN_NAME_FOLDER", run_id) - - readMap = {} - reads = runInfo.getAllchildren('Reads') - read = reads[0].findall('Read') - - for r in read: - cycles = r.get('NumCycles', 'str') - number = r.get('Number', 'str') - is_indexed = r.get('IsIndexedRead', 'str') - readMap[number] = [cycles, is_indexed] - - # example of readMap: {'1': ['151', 'N'], '2': ['8', 'Y'], '3': ['8', 'Y'], '4': ['151', 'N']} - number_of_cycles = readMap['1'][0] - addVocabularyTerm(transaction, CYCLES_VOCABULARY_NAME, number_of_cycles) - new_flowcell.setPropertyValue("CYCLES_REQUESTED_BY_CUSTOMER", number_of_cycles) - - set_index_lengths(readMap, new_flowcell) diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/2/dss/drop-boxes/create-flowcell/plugin.properties b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/2/dss/drop-boxes/create-flowcell/plugin.properties deleted file mode 100644 index dd75e75ff45741de5cf5c598ba18323d0613f284..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/2/dss/drop-boxes/create-flowcell/plugin.properties +++ /dev/null @@ -1,9 +0,0 @@ -# -# Drop box for creating a flow cell -# -incoming-dir = ${incoming-root-dir}/create-flowcell -incoming-data-completeness-condition = marker-file -top-level-data-set-handler = ch.systemsx.cisd.etlserver.registrator.api.v2.JythonTopLevelDataSetHandlerV2 -script-path = create-flowcell.py -storage-processor = ch.systemsx.cisd.etlserver.DefaultStorageProcessor -jython-version=2.7 \ No newline at end of file diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/2/dss/drop-boxes/read-demultiplex-stats-miseq-hiseq/plugin.properties b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/2/dss/drop-boxes/read-demultiplex-stats-miseq-hiseq/plugin.properties deleted file mode 100644 index 06c8edfcacbbe5a26273c833f18f9c3477aa7d68..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/2/dss/drop-boxes/read-demultiplex-stats-miseq-hiseq/plugin.properties +++ /dev/null @@ -1,6 +0,0 @@ -incoming-dir = ${incoming-root-dir}/read-demultiplex-stats-miseq-hiseq -incoming-data-completeness-condition = marker-file -top-level-data-set-handler = ch.systemsx.cisd.etlserver.registrator.api.v2.JythonTopLevelDataSetHandlerV2 -script-path = read-demultiplex-stats-miseq-hiseq.py -storage-processor = ch.systemsx.cisd.etlserver.DefaultStorageProcessor -jython-version=2.7 \ No newline at end of file diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/2/dss/drop-boxes/read-demultiplex-stats-miseq-hiseq/read-demultiplex-stats-miseq-hiseq.py b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/2/dss/drop-boxes/read-demultiplex-stats-miseq-hiseq/read-demultiplex-stats-miseq-hiseq.py deleted file mode 100755 index c10028aa6d1271dcccbec3ec2992b56b393d4f5a..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/2/dss/drop-boxes/read-demultiplex-stats-miseq-hiseq/read-demultiplex-stats-miseq-hiseq.py +++ /dev/null @@ -1,366 +0,0 @@ -''' -@copyright: 2012 ETH Zuerich, CISD - -@license: -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. - -@author: Manuel Kohler - -@note: print statements go to ~/openbis/servers/datastore_server/log/startup_log.txt - -''' - -import time -import math -import os -import fnmatch -# Load Java-Library to import XML data: -import read_demultiplex_stats_miseq_hiseq -# Load openBIS-Libraries: -from ch.systemsx.cisd.openbis.generic.shared.api.v1.dto import SearchCriteria -from ch.systemsx.cisd.openbis.generic.shared.api.v1.dto import SearchSubCriteria - - -def process(transaction): - ''' - Main method in corresponding openBIS dropbox - ''' - - # Constants: - XML_FILENAME = 'ConversionStats.xml' - TYPE_DATASET = 'FASTQ_GZ' - INDEX_NO = 'NOINDEX' - INDEX_UNKNOWN = 'UNKNOWN' - INDEX_EMPTY = '' - CODE_INDEX1 = 'BARCODE' - CODE_INDEX2 = 'INDEX2' - CODE_INDEX1LENGTH = 'INDEXREAD' - CODE_INDEX2LENGTH = 'INDEXREAD2' - BARCODE_SPLIT_CHAR = "+" - - - ########################################################## - def locate(pattern, root): - '''Locate all files matching supplied filename pattern in and below supplied root directory.''' - for path, dirs, files in os.walk(os.path.abspath(root)): - for filename in fnmatch.filter(files, pattern): - yield os.path.join(path, filename) - - ########################################################## - def getInfoVocabularyTerms(vocabularyCode): - ''' - Get information about Terms of certain Vocabulary in openBIS. - Input: - - vocabularyCode: code of Vocabulary to be investigated - Output: - - vocabularyTerms: list of Terms in Vocabulary - ''' - vocabulary = transaction.getSearchService().searchForVocabulary(vocabularyCode) - - vocabularyTerms = [] - if (vocabulary is None): - print '\nOCCURRED EXCEPTION: Vocabulary %s does not exist' % (vocabularyCode) - else: - for term in vocabulary.getTerms(): - vocabularyTerms.append(term.getCode()) - vocabularyTerms.sort() - - return vocabularyTerms - - ########################################################## - def getInfoSampleProperties(sampleCode): - ''' - Get information about Properties of certain Sample in openBIS. - Input: - - sampleCode: code of Sample to be investigated - Outputs: - - propertiesCode: list of Properties' codes - - propertiesCodeValue: dictionary of Properties' codes and values - ''' - ss = transaction.getSearchService() - - scSample = SearchCriteria() - scSample.addMatchClause(SearchCriteria.MatchClause.createAttributeMatch(SearchCriteria.MatchClauseAttribute.CODE, sampleCode)); - foundSamples = ss.searchForSamples(scSample) - - propertiesCode = [] - propertiesCodeValue = {} - try: - assert foundSamples.size() == 1 - properties = foundSamples[0].getSample().getProperties() - for p in properties: - codeProperty = p.getPropertyType().getSimpleCode() - propertiesCode.append(codeProperty) - propertiesCodeValue[codeProperty] = p.getValue() - propertiesCode.sort() - except AssertionError: - print ('\nOCCURRED EXCEPTION: ' + str(foundSamples.size()) + ' Samples found which match the criteria code \"' + sampleCode + '\".') - - return propertiesCode, propertiesCodeValue - - ########################################################## - def getInfoDataSetPropertiesOfSample(sampleCode): - ''' - Get information about Properties of some DataSet of certain Sample in openBIS. - Input: - - sampleCode: code of DataSet's Sample to be investigated - Outputs: - - propertiesCode: list of Properties' codes - - propertiesCodeValue: dictionary of Properties' codes and values - ''' - ss = transaction.getSearchService() - - scSample = SearchCriteria() - scSample.addMatchClause(SearchCriteria.MatchClause.createAttributeMatch(SearchCriteria.MatchClauseAttribute.CODE, sampleCode)); - #foundSamples = ss.searchForSamples(scSample) - - scDataSet = SearchCriteria() - scDataSet.addMatchClause(SearchCriteria.MatchClause.createAttributeMatch(SearchCriteria.MatchClauseAttribute.TYPE, TYPE_DATASET)) - scDataSet.addSubCriteria(SearchSubCriteria.createSampleCriteria(scSample)) - foundDataSets = ss.searchForDataSets(scDataSet) - - propertiesCode = [] - propertiesCodeValue = {} - try: - assert foundDataSets.size() > 0 - codeProperties = foundDataSets[0].getAllPropertyCodes() - for cp in codeProperties: - propertiesCode.append(cp) - propertiesCodeValue[cp] = foundDataSets[0].getPropertyValue(cp) - propertiesCode.sort() - except AssertionError: - print ('\nOCCURRED EXCEPTION: ' + str(foundDataSets.size()) + ' DataSets found which Sample match the criteria code \"' + sampleCode + '\" and type \"' + TYPE_DATASET + '\".') - - return propertiesCode, propertiesCodeValue - - ########################################################## - def getIndexesOfDataSetsOfSample(sampleFlowLaneCode): - ''' - Get both indexes (parts of barcode) of all DataSets of certain FlowLane-Sample in openBIS. - Inputs: - - sampleFlowLaneCode: code of DataSet's Sample - Outputs: - - indexes1: list of first index of DataSets - - indexes2: list of second index of DataSets - ''' - ss = transaction.getSearchService() - - scSample = SearchCriteria() - scSample.addMatchClause(SearchCriteria.MatchClause.createAttributeMatch(SearchCriteria.MatchClauseAttribute.CODE, sampleFlowLaneCode)); - #foundSamples = ss.searchForSamples(scSample) - - scDataSet = SearchCriteria() - scDataSet.addMatchClause(SearchCriteria.MatchClause.createAttributeMatch(SearchCriteria.MatchClauseAttribute.TYPE, TYPE_DATASET)) - scDataSet.addSubCriteria(SearchSubCriteria.createSampleCriteria(scSample)) - foundDataSets = ss.searchForDataSets(scDataSet) - - indexes1 = [] - indexes2 = [] - try: - assert foundDataSets.size() > 0 - except AssertionError: - print ('\nOCCURRED EXCEPTION: ' + str(foundDataSets.size()) + ' DataSets found which Sample match the criteria code \"' + sampleFlowLaneCode + '\" and type \"' + TYPE_DATASET + '\".') - for ds in foundDataSets: - indexes1.append(ds.getPropertyValue(CODE_INDEX1)) - indexes2.append(ds.getPropertyValue(CODE_INDEX2)) - - return indexes1, indexes2 - - ########################################################## - def searchDataSetsOfSample(sampleFlowLaneCode, index1, index2): - ''' - Search DataSets by corresponding indexes (parts of barcode) of certain FlowLane-Sample in openBIS. - Inputs: - - sampleFlowLaneCode: code of DataSet's Sample - - index1: first index of DataSet - - index2: second index of DataSet - Output: - - foundDataSets: DataSets corresponding to inputs and constant TYPE_DATASET - ''' - ss = transaction.getSearchService() - - scSample = SearchCriteria() - scSample.addMatchClause(SearchCriteria.MatchClause.createAttributeMatch(SearchCriteria.MatchClauseAttribute.CODE, sampleFlowLaneCode)); - #foundSample = ss.searchForSamples(scSample) - - scDataSet = SearchCriteria() - scDataSet.addMatchClause(SearchCriteria.MatchClause.createAttributeMatch(SearchCriteria.MatchClauseAttribute.TYPE, TYPE_DATASET)) - scDataSet.addMatchClause(SearchCriteria.MatchClause.createPropertyMatch(CODE_INDEX1, index1)) - scDataSet.addMatchClause(SearchCriteria.MatchClause.createPropertyMatch(CODE_INDEX2, index2)) - scDataSet.addSubCriteria(SearchSubCriteria.createSampleCriteria(scSample)) - foundDataSets = ss.searchForDataSets(scDataSet) - for ds in foundDataSets: - print "Index1 of found DataSet " + ds.getDataSetCode() + ": " + ds.getPropertyValue(CODE_INDEX1) - print "Index2 of found DataSet " + ds.getDataSetCode() + ": " + ds.getPropertyValue(CODE_INDEX2) - - return foundDataSets - - ########################################################## - def reversecomplement(sequence): - ''' - Reverse sequence and replace each nucleotide by its complement. - Input: - - sequence: sequence of nucleotides - Output: - - reverse_complement_sequence: reversed and complemented sequence - ''' - lookup_table = {'A': 'T', 'T': 'A', 'G': 'C', 'C': 'G'} - reverse_complement_sequence = '' - for nucleotide in reversed(sequence): - reverse_complement_sequence += lookup_table[nucleotide] - return reverse_complement_sequence - - ########################################################## - - def sampleSearch(transaction, code=''): - sc = SearchCriteria() - numberOfLanes = 0 - sc.addMatchClause(SearchCriteria.MatchClause.createAttributeMatch(SearchCriteria.MatchClauseAttribute.CODE, code)); - search_service = transaction.getSearchService() - flowcell = search_service.searchForSamples(sc) - if flowcell.size() > 0: - # Search for contained samples - sampleSc = SearchCriteria() - sampleSc.addSubCriteria(SearchSubCriteria.createSampleContainerCriteria(sc)) - lanes = search_service.searchForSamples(sampleSc) - numberOfLanes = lanes.size() - return flowcell, lanes, numberOfLanes - - ########################################################## - - def updateLane(transaction, codeSampleFlowCell, totalLaneStatistics): - - print("Setting Complete Lanes Statistics For: " + lane.getSampleIdentifier()) - mutable_lane = transaction.getSampleForUpdate(lane.getSampleIdentifier()) - mutable_lane.setPropertyValue("YIELD_MBASES", str(int(totalLaneStatistics.get(lane_in_int).Sum_PfYield))) - mutable_lane.setPropertyValue('RAW_YIELD_MBASES', str(int(totalLaneStatistics.get(lane_in_int).Sum_RawYield))) - mutable_lane.setPropertyValue('PERCENTAGE_PASSED_FILTERING',str(int(totalLaneStatistics.get(lane_in_int).Percentage_PfClusterCount_RawClusterCount))) - mutable_lane.setPropertyValue('PF_CLUSTERS_SUM',str(int(totalLaneStatistics.get(lane_in_int).Sum_PfClusterCount))) - mutable_lane.setPropertyValue('RAW_CLUSTERS_SUM',str(int(totalLaneStatistics.get(lane_in_int).Sum_RawClusterCount))) - mutable_lane.setPropertyValue('PFYIELDQ30PERCENTAGE', str(int(totalLaneStatistics.get(lane_in_int).Percentage_PfYieldQ30_PfYield))) - mutable_lane.setPropertyValue('PFMEANQUALITYSCORE', str(totalLaneStatistics.get(lane_in_int).Fraction_PfQualityScoreSum_PfYield)) - mutable_lane.setPropertyValue('CLUSTERS_PF_WITHOUT_NOINDEX', str(int(totalLaneStatistics.get(lane_in_int).Clusters_PfWithoutNoindex))) - - ########################################################## - - def update_datatsets(transaction, samplestatisticslist, codeSampleFlowLane, codeSampleFlowCell): - # Prepare links between XML and openBIS w.r.t to indexes in DataSet (openBIS): - - nprocessedDataSets = 0 - - index1list, index2list = getIndexesOfDataSetsOfSample(codeSampleFlowLane) -# print(index1list) - - propertiesCode, propertiesCodeValue = getInfoSampleProperties(codeSampleFlowCell) - index1length = int(propertiesCodeValue[CODE_INDEX1LENGTH]) - index2length = int(propertiesCodeValue[CODE_INDEX2LENGTH]) - - - pre_filtered_list = [sample for sample in samplestatisticslist if sample.Lane == int(codeSampleFlowLane[-1])] - print("Number of samples: " + str(len(pre_filtered_list)) + " for lane " + codeSampleFlowLane[-1]) - - for s in pre_filtered_list: - print "\nContent in XML file:\n", s - - # Prepare link between XML and openBIS w.r.t to indexes in Barcode (XML): - indexes = s.Barcode.split(BARCODE_SPLIT_CHAR) - if len(indexes) == 1: # only first part in Barcode - index1search = indexes[0].upper() - index2search = INDEX_EMPTY - elif len(indexes) == 2: # both parts in Barcode - index1search = indexes[0].upper() - index2search = indexes[1].upper() - else: - index1search = INDEX_EMPTY - index2search = INDEX_EMPTY - - # Set link between XML and openBIS w.r.t to indexes in DataSet (openBIS): - if index1search == INDEX_EMPTY or index1search == INDEX_UNKNOWN: - index1 = INDEX_NO - else: # Hint: just two cases were known about index1length, that is 8 or 6 - if index1length > 7: - index1 = [ index1 for index1 in index1list if index1search == index1 ] - else: # for smaller indexlength, the index is by 1 shorter in XML-file than in openBIS - index1 = [ index1 for index1 in index1list if index1search == index1[:index1length] ] - try: - index1 = index1[0] - except: - print '\nOCCURRED EXCEPTION: First index \"' + index1search + '\" of Barcode in XML file has no corresponding DataSet(' + str(index1list) + ') in openBIS!' - index1 = 'MISSING' - if index2search == INDEX_EMPTY or index2search == INDEX_UNKNOWN: - index2 = INDEX_NO - else: # Hint: just one case was known about index2length, that is 8 - index2 = [ index2 for index2 in index2list if (index2search) == index2 ] - try: - index2 = index2[0] - except: - print '\nOCCURRED EXCEPTION: Second index \"' + index2search + '\" of Barcode in XML file has no corresponding DataSet in openBIS!' - index2 = 'MISSING' - - # Get DataSet of openBIS corresponding to Project/Sample/Barcode of XML file: - correspondingDataSet = searchDataSetsOfSample(codeSampleFlowLane, index1, index2) - try: - assert correspondingDataSet.size() == 1 - except AssertionError: - print ('\nOCCURRED EXCEPTION: ' + str(correspondingDataSet.size()) + ' DataSets found which Sample match the criteria index1 \"' + str(index1) + '\" and index2 \"' + str(index2) + '\" and code \"' + codeSampleFlowLane + '\" and type \"' + TYPE_DATASET + '\".') - continue - - # Modify Properties of corresponding DataSet: - # (method setPropertyValue requires Strings as Input, but Number format must fit to Properties already defined in openBIS) - ds = transaction.getDataSetForUpdate(correspondingDataSet[0].getDataSetCode()) - ds.setPropertyValue('YIELD_MBASES', str(int(s.Mega_PfYield))) - ds.setPropertyValue('RAW_YIELD_MBASES', str(int(s.Mega_RawYield))) - ds.setPropertyValue('PERCENTAGE_PASSED_FILTERING',str(s.Percentage_PfClusterCount_RawClusterCount)) - ds.setPropertyValue('PF_READS_SUM',str(int(s.Sum_PfClusterCount))) # convert first to Integer, then to String - ds.setPropertyValue('RAW_READS_SUM',str(int(s.Sum_RawClusterCount))) # convert first to Integer, then to String - ds.setPropertyValue('PERCENTAGE_RAW_CLUSTERS_PER_LANE', str(s.Percentage_RawClusterCount_AllRawClusterCounts)) - ds.setPropertyValue('PFYIELDQ30PERCENTAGE', str(s.Percentage_PfYieldQ30_PfYield)) - ds.setPropertyValue('PFMEANQUALITYSCORE', str(s.Fraction_PfQualityScoreSum_PfYield)) - print "Properties in DataSet \"" + correspondingDataSet[0].getDataSetCode() + "\" are modified." - nprocessedDataSets += 1 - - return nprocessedDataSets - - - ########################################################## - - print('\nPROCESS RUNNING '+time.ctime()) - incomingPath = transaction.getIncoming().getPath() - FileGenerator= locate(XML_FILENAME, incomingPath) - xmlfile = FileGenerator.next() - print "File: " + xmlfile - - # Import data of XML file (independent of openBIS data): - JavaClassToProcessXML = read_demultiplex_stats_miseq_hiseq() # this function is implemented as Class in Java: - samplestatisticslist = JavaClassToProcessXML.importXmlAndCalculateStatistics(xmlfile) - totalLaneStatistics = JavaClassToProcessXML.calculateTotalLaneStatistics(samplestatisticslist) - - if len(samplestatisticslist) == 0: - print "\nNo Projects/Samples/Barcodes are contained in XML-file " + xmlfile + "!" - return - - print(samplestatisticslist[0].Flowcell) - codeSampleFlowCell = samplestatisticslist[0].Flowcell # expect just one equal FlowCell - flowcell, lanes, numberOfLanes = sampleSearch(transaction, codeSampleFlowCell) - - for lane in lanes: - lane_in_int = int(lane.getCode().split(":")[-1]) - if (lane_in_int in totalLaneStatistics.keySet()): - updateLane(transaction, codeSampleFlowCell, totalLaneStatistics) - - codeSampleFlowLane = ":".join([codeSampleFlowCell, str(lane_in_int)]) - nprocessedDataSets = update_datatsets(transaction, samplestatisticslist, codeSampleFlowLane, codeSampleFlowCell) - - print "\n", nprocessedDataSets, " openBIS-DataSets were processed." - print len(samplestatisticslist), " XML-Projects/-Samples/-Barcodes were processed." - print("PROCESS DONE "+time.ctime()) diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/2/dss/drop-boxes/read-demultiplex-stats-miseq-hiseq/read_demultiplex_stats_miseq_hiseq.java b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/2/dss/drop-boxes/read-demultiplex-stats-miseq-hiseq/read_demultiplex_stats_miseq_hiseq.java deleted file mode 100644 index 7f04fc6acbcac29325a74bfdbf1e7d2e8e42a3f8..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/2/dss/drop-boxes/read-demultiplex-stats-miseq-hiseq/read_demultiplex_stats_miseq_hiseq.java +++ /dev/null @@ -1,736 +0,0 @@ -/* -@copyright: 2015 ETH Zuerich, CISD - -@license: -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. - -@author: Fabian Gemperle -@autor: Manuel Kohler - -@note: This Class is in Jython importable as Java-Library after compiling it. - In compilation 4 Class files arise: - - read_demultiplex_stats.class - - read_demultiplex_stats$SampleItem.class - - read_demultiplex_stats$Sample.class - - read_demultiplex_stats$Statistics.class - */ - - -import javax.xml.stream.XMLInputFactory; -import javax.xml.stream.XMLStreamConstants; -import javax.xml.stream.XMLStreamException; -import javax.xml.stream.XMLStreamReader; -import java.io.FileInputStream; -import java.io.FileNotFoundException; -import java.io.InputStream; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -//########################################################## - -public final class read_demultiplex_stats_miseq_hiseq -{ - - public static ArrayList<Statistics> importXmlAndCalculateStatistics(String XMLFile) throws Exception { - - ArrayList<Statistics> stats = executeImportXmlAndCalculateStatistics(XMLFile); - HashMap<Integer, ArrayList<Statistics>> groupedList = groupByLane(stats); - - for (Statistics s : stats) - s.adaptStatisticsWithRespectToAllSamples(stats, groupedList); - return stats; - } - - /** - * - * Streams through a given XML file, parses the data and writes it into a Statistics object - * - * @param XMLfile: ConversionStats.xml - * @return a ArrayList of <Statistics> - */ - private static ArrayList<Statistics> executeImportXmlAndCalculateStatistics(String XMLfile) throws Exception { - ArrayList<Statistics> sampleStatisticsList = new ArrayList<>(); - - /*Parse corresponding XML file, put all values into a memory structure, calculate statistics overall samples. - Output: sampleStatisticsList (list of Sample-Statistics-Objects) - Input: XMLfile having structure of file ConversionStats.xml (Example of 1.10.2014): - <?xml version="1.0" encoding="utf-8"?> => Assumptions about XML structure: - <Stats> => Element is singlechild - <Flowcell flowcell-id="H0YVKBGXX"> => Element is singlechild - <Project name="BSSE_QGF_23096_H0YVKBGXX_1"> => Element is one of many children, additionally there is summary-element with attribute name="all" - <Sample name="BSSE_QGF_23096_H0YVKBGXX_1_PZ27_PZ33_CelSEQ_"> => Element is singlechild except second summary-element with attribute name="all" - <Barcode name="unknown"> => Element is singlechild except second summary-element with attribute name="all" - <Lane number="1"> => Element is one of several children - <Tile number="11101"> => Element is one of many children - <Raw> => Element is singlechild - <ClusterCount>328653</ClusterCount> => Element is singlechild - <Read number="1"> => Element is one of several children - <Yield>24977628</Yield> => Element is singlechild - <YieldQ30>16162292</YieldQ30> => Element is singlechild - <QualityScoreSum>703070796</QualityScoreSum> => Element is singlechild - </Read> - <Read number="2"> => Element is one of several children - <Yield>24977628</Yield> => Element is singlechild - <YieldQ30>16233173</YieldQ30> => Element is singlechild - <QualityScoreSum>699507245</QualityScoreSum> => Element is singlechild - </Read> - </Raw> - <Pf> => Element is singlechild - <ClusterCount>302121</ClusterCount> => Element is singlechild - <Read number="1"> => Element is one of several children - <Yield>22961196</Yield> => Element is singlechild - <YieldQ30>15842531</YieldQ30> => Element is singlechild - <QualityScoreSum>686898532</QualityScoreSum> => Element is singlechild - </Read> - <Read number="2"> => Element is one of several children - <Yield>22961196</Yield> => Element is singlechild - <YieldQ30>16233173</YieldQ30> => Element is singlechild - <QualityScoreSum>699507245</QualityScoreSum> => Element is singlechild - </Read> - </Pf> - </Tile> - <Tile number="11102"> - [...] - - </Project> - <Lane number="2"> - <TopUnknownBarcodes> - <Barcode count="150988002" sequence="NNNNNNN"/> - <Barcode count="167095" sequence="CCCCCCC"/> - <Barcode count="57859" sequence="CCCGTCC"/> - <Barcode count="49993" sequence="CCGATGT"/> - <Barcode count="42981" sequence="GTCCCGC"/> - <Barcode count="40446" sequence="TAAAATT"/> - <Barcode count="39962" sequence="CCAGATC"/> - <Barcode count="34688" sequence="GATGTAT"/> - <Barcode count="32013" sequence="AAAAAGT"/> - <Barcode count="30501" sequence="AGATCAT"/> - </TopUnknownBarcodes> - </Lane> - [...] - */ - -// Map<Integer, Map<String, Integer>> barcodesPerLane = null; - - try { - String errorMessage; - int event; - int skip; - String flowcellName = ""; - String projectName = ""; - String sampleName = ""; - String barcodeName = ""; - int laneNumber = 0; - int tileNumber; - Sample currentSample = null; - Statistics statistics; - SampleItem rawItem; - SampleItem pfItem; - Map<String, Integer> barcodesMap = new HashMap<>(); - Map<Integer, Map<String, Integer>> barcodesPerLane = new HashMap<>(); - - InputStream xmlFile = new FileInputStream(XMLfile); - XMLInputFactory xmlFactory = XMLInputFactory.newInstance(); - XMLStreamReader xmlParser = xmlFactory.createXMLStreamReader(xmlFile); - - // Start-Tag "Stats": - event = xmlParser.nextTag(); // Assumption: just white space or comments are aside explicit start-tag - if (event != XMLStreamConstants.START_ELEMENT || !xmlParser.getLocalName().equals("Stats")) { - errorMessage = - "STRANGE ERROR IN METHOD importXmlAndCalculateStatistics WHEN READING IN XMLFILE. => CHECK CODE AND XMLFILE-STRUCTURE! Got " + event; - throw new Exception(errorMessage); - } - - // Loop over potential Tags "Flowcell": - event = xmlParser.nextTag(); // Assumption: just white spaces or comments are aside start- or end-tag - // List<Statistics> samplestatistics = new ArrayList<Statistics>(); - boolean doimport = true; - while (doimport) { - // concerning tag Flowcell: - if (event == XMLStreamConstants.START_ELEMENT && xmlParser.getLocalName().equals("Flowcell")) { - flowcellName = xmlParser.getAttributeValue(0); - event = xmlParser.nextTag(); - } else if (event == XMLStreamConstants.END_ELEMENT && xmlParser.getLocalName().equals("Flowcell")) { - flowcellName = ""; - event = xmlParser.nextTag(); - - // concerning tag Project: - } else if (event == XMLStreamConstants.START_ELEMENT && xmlParser.getLocalName().equals("Project")) { - if (xmlParser.getAttributeValue(0).equals("all")) { - //skip the current XML element and all of its following subelements: - skip = 1; - while (skip > 0) { - event = xmlParser.next(); - switch (event) { - case XMLStreamConstants.END_ELEMENT: - skip -= 1; - break; - case XMLStreamConstants.START_ELEMENT: - skip += 1; - break; - default: - skip += 0; // text elements, spaces, ... - break; - } - } - } else { - projectName = xmlParser.getAttributeValue(0); - - } - event = xmlParser.nextTag(); - } else if (event == XMLStreamConstants.END_ELEMENT && xmlParser.getLocalName().equals("Project")) { - projectName = ""; - event = xmlParser.nextTag(); - - // concerning tag Sample: - } else if (event == XMLStreamConstants.START_ELEMENT && xmlParser.getLocalName().equals("Sample")) { - if (xmlParser.getAttributeValue(0).equals("all")) { - // skip the current XML element and all of its following subelements: - skip = 1; - while (skip > 0) { - event = xmlParser.next(); - switch (event) { - case XMLStreamConstants.END_ELEMENT: - skip -= 1; - break; - case XMLStreamConstants.START_ELEMENT: - skip += 1; - break; - default: - skip += 0; // text elements, spaces, ... - break; - } - } - } else { - sampleName = xmlParser.getAttributeValue(0); - } - event = xmlParser.nextTag(); - } else if (event == XMLStreamConstants.END_ELEMENT && xmlParser.getLocalName().equals("Sample")) { - sampleName = ""; - event = xmlParser.nextTag(); - - // concerning tag Barcode (which is as well the start/end of Project-/Sample-Entry): - } else if (event == XMLStreamConstants.START_ELEMENT && xmlParser.getLocalName().equals("Barcode")) { - if (xmlParser.getAttributeValue(0).equals("all")) { - // skip the current XML element and all of its following subelements: - skip = 1; - while (skip > 0) { - event = xmlParser.next(); - switch (event) { - case XMLStreamConstants.END_ELEMENT: - skip -= 1; - break; - case XMLStreamConstants.START_ELEMENT: - skip += 1; - break; - default: - skip += 0; // text elements, spaces, ... - break; - } - } - } else { - barcodeName = xmlParser.getAttributeValue(0); - } - event = xmlParser.nextTag(); - } else if (event == XMLStreamConstants.END_ELEMENT && xmlParser.getLocalName().equals("Barcode")) { - barcodeName = ""; - event = xmlParser.nextTag(); - - - // concerning Lane: - } else if (event == XMLStreamConstants.START_ELEMENT && xmlParser.getLocalName().equals("Lane")) { -// System.out.println("\nStart-Element with tag " + xmlparser.getLocalName() + " with " + xmlparser.getAttributeCount() + " attributes with first attribute: " + xmlparser.getAttributeLocalName(0) +" = " + xmlparser.getAttributeValue(0)); - laneNumber = Integer.parseInt(xmlParser.getAttributeValue(0)); - - // Now we have everything we need, we put it into a Sample - currentSample = new Sample(); - - if (sampleName.startsWith("Undetermined")) { - currentSample.Sample = sampleName + "_" + flowcellName + "_" + laneNumber; - } else { - currentSample.Sample = sampleName; - } - - currentSample.Flowcell = flowcellName; - currentSample.Lane = laneNumber; - currentSample.Project = projectName; - currentSample.Barcode = barcodeName; - event = xmlParser.nextTag(); -// System.out.println(currentSample.Sample); - - - } else if (event == XMLStreamConstants.END_ELEMENT && xmlParser.getLocalName().equals("Lane")) { - // Statistics 1st step: calculate individual statistics per sample: - statistics = new Statistics(currentSample); - if (!currentSample.Project.equals("")) { - sampleStatisticsList.add(statistics); - } - currentSample = null; - statistics = null; - -// laneNumber = Double.NaN; - event = xmlParser.nextTag(); - - // concerning Tile with all its sub-elements: - } else if (event == XMLStreamConstants.START_ELEMENT && xmlParser.getLocalName().equals("Tile")) { - tileNumber = Integer.parseInt(xmlParser.getAttributeValue(0)); - // concerning Raw with Assumption: Raw-element is singlechild: - xmlParser.nextTag(); - rawItem = new SampleItem(); - rawItem.Type = "Raw"; - rawItem.Lane = laneNumber; - rawItem.Tile = tileNumber; - xmlParser.nextTag(); - rawItem.ClusterCount = Integer.parseInt(xmlParser.getElementText()); // Assumption: ClusterCount-element is numeric singlechild - //System.out.println("\nValue: ClusterCount=" + rawItem.ClusterCount); - xmlParser.nextTag(); - while (event == XMLStreamConstants.START_ELEMENT && xmlParser.getLocalName().equals("Read")) { - //System.out.println("\nStart-Element with tag " + xmlparser.getLocalName() + " with " + xmlparser.getAttributeCount() + " attributes with first attribute: " + xmlparser.getAttributeLocalName(0) +" = " + xmlparser.getAttributeValue(0)); - xmlParser.nextTag(); - rawItem.YieldList.add(Double.parseDouble(xmlParser.getElementText())); - xmlParser.nextTag(); - rawItem.YieldQ30List.add(Double.parseDouble(xmlParser.getElementText())); - xmlParser.nextTag(); - rawItem.QualityScoreSumList.add(Double.parseDouble(xmlParser.getElementText())); - xmlParser.nextTag(); - xmlParser.nextTag(); - //System.out.println("Values in Read: Yield=" + rawItem.YieldList.get(rawItem.YieldList.size()-1) + ", YieldQ30=" + rawItem.YieldQ30List.get(rawItem.YieldQ30List.size()-1) + ", QualityScoreSum=" + rawItem.QualityScoreSumList.get(rawItem.QualityScoreSumList.size()-1)); - } - //System.out.println("\nRaw-SampleItem " + rawItem); - currentSample.RawList.add(rawItem); - - - rawItem = null; - // concerning Pf with Assumption that entire Pf-element is structured same as Raw: - xmlParser.nextTag(); - //System.out.println("\nStart-Element with tag " + xmlparser.getLocalName()); - pfItem = new SampleItem(); - pfItem.Type = "Pf"; - pfItem.Lane = laneNumber; - pfItem.Tile = tileNumber; - xmlParser.nextTag(); - pfItem.ClusterCount = Integer.parseInt(xmlParser.getElementText()); - //System.out.println("\nValue: ClusterCount=" + pfItem.ClusterCount); - xmlParser.nextTag(); - while (event == XMLStreamConstants.START_ELEMENT && xmlParser.getLocalName().equals("Read")) { - //System.out.println("\nStart-Element with tag " + xmlparser.getLocalName() + " with " + xmlparser.getAttributeCount() + " attributes with first attribute: " + xmlparser.getAttributeLocalName(0) +" = " + xmlparser.getAttributeValue(0)); - xmlParser.nextTag(); - pfItem.YieldList.add(Double.parseDouble(xmlParser.getElementText())); - xmlParser.nextTag(); - pfItem.YieldQ30List.add(Double.parseDouble(xmlParser.getElementText())); - xmlParser.nextTag(); - pfItem.QualityScoreSumList.add(Double.parseDouble(xmlParser.getElementText())); - xmlParser.nextTag(); - xmlParser.nextTag(); - //System.out.println("Values in Read: Yield=" + pfItem.YieldList.get(pfItem.YieldList.size()-1) + ", YieldQ30=" + pfItem.YieldQ30List.get(pfItem.YieldQ30List.size()-1) + ", QualityScoreSum=" + pfItem.QualityScoreSumList.get(pfItem.QualityScoreSumList.size()-1)); - } - //System.out.println("\nPf-SampleItem " + pfItem); - currentSample.PfList.add(pfItem); - pfItem = null; - // attain end of current Tile and afterwards continue in next Tile/Lane/Barcode/Sample/Project: - event = xmlParser.nextTag(); - } else if (event == XMLStreamConstants.END_ELEMENT && xmlParser.getLocalName().equals("Tile")) { - tileNumber = 0; - event = xmlParser.nextTag(); - - - } else if (event == XMLStreamConstants.START_ELEMENT && xmlParser.getLocalName().equals("TopUnknownBarcodes")) { - - event = xmlParser.nextTag(); - while (event == XMLStreamConstants.START_ELEMENT && xmlParser.getLocalName().equals("Barcode")) { - Integer numberOfBarcodes = Integer.valueOf((xmlParser.getAttributeValue(0))); - String barcode = xmlParser.getAttributeValue(1); - barcodesMap.put(barcode, numberOfBarcodes); - xmlParser.nextTag(); - event = xmlParser.nextTag(); - } - - } else if (event == XMLStreamConstants.END_ELEMENT && xmlParser.getLocalName().equals("TopUnknownBarcodes")) { - - barcodesPerLane.put(laneNumber, barcodesMap); - event = xmlParser.nextTag(); - - // concerning finish of reading in XML or hit upon error due XML content: - } else if (event == XMLStreamConstants.END_ELEMENT && xmlParser.getLocalName().equals("Stats")) { - // this final part of while loop is just for analyzing potential errors, but - // could be removed and changed in: while xmlparser.getLocalName() != 'Stats' - doimport = false; - } else { - doimport = false; - System.out.println("Warning: Different XML structure than expectet. Got event: " + event); - } - } - xmlParser.close(); - - } catch (FileNotFoundException | XMLStreamException | IllegalArgumentException e) { - System.out.println("OCCURRED EXCEPTION " + e.toString()); - e.printStackTrace(); - } - return sampleStatisticsList; - } - - public static HashMap<Integer, LaneStatistics> calculateTotalLaneStatistics(ArrayList<Statistics> samplestatisticslist) - { - HashMap<Integer, LaneStatistics> listOfLaneStatistics= new HashMap<Integer, LaneStatistics>(); - - HashMap<Integer, ArrayList<Statistics>> groupedList = groupByLane(samplestatisticslist); - - for (Integer key : groupedList.keySet()) { - - LaneStatistics laneStats = new LaneStatistics(groupedList.get(key)); - laneStats.calculateOverallStats(key); - listOfLaneStatistics.put(key, laneStats); - } - return listOfLaneStatistics; - } - - - private static HashMap<Integer, ArrayList<Statistics>> groupByLane(ArrayList<Statistics> samplestatisticslist) { - // Group ArrayList by Lane - HashMap<Integer, ArrayList<Statistics>> groupedList = new HashMap <Integer, ArrayList<Statistics>>(); - for (Statistics s : samplestatisticslist) { - - if (groupedList.containsKey(s.Lane)) { - groupedList.get(s.Lane).add(s); - } - else { - ArrayList <Statistics> newEntry = new ArrayList<Statistics>(); - newEntry.add(s); - groupedList.put(s.Lane, newEntry); - } - } - return groupedList; - } - - - // ########################################################## - - private static class SampleItem - { - /* - * Object of an item in sample including - the corresponding type Raw or Pf - the index of corresponding Lane, Tile - measured value of - * ClusterCount and values in Lists (w.r.t. Read) of Yield, YieldQ30, QualityScoreSum - */ - - public String Type = ""; - - public Integer Lane = 0; - - public Integer Tile = 0; - - public Integer ClusterCount = 0; - - // Define unknown ArrayList of numerical values with changeable List size. Type Double(object) instead of double(primitive) is necessary in - // Lists. - public List<Double> YieldList = new ArrayList<>(); - - public List<Double> YieldQ30List = new ArrayList<>(); - - public List<Double> QualityScoreSumList = new ArrayList<>(); - - public String toString() - { - return "Type: " + this.Type + ", Lane: " + (long) this.Lane + ", Tile: " + (long) this.Tile - + ", ClusterCount: " + (long) this.ClusterCount + ", YieldList: " + this.YieldList - + ", YieldQ30List: " + this.YieldQ30List + ", QualityScoreSumList: " + this.QualityScoreSumList; - } - - } - - // ########################################################## - - public static class Sample - { - /* - * Object of an entire sample including - the name of Flowcell, Project, Sample, Barcode - the list of Raw and Pf SampleItem-Objects - */ - - public String Flowcell = ""; - - public Integer Lane = 0; - - public String Project = ""; - - public String Sample = ""; - - public String Barcode = ""; - - // Define unknown ArrayList of SampleItems: - public List<SampleItem> RawList = new ArrayList<>(); - - public List<SampleItem> PfList = new ArrayList<>(); - - public String toString() - { - return "Flowcell: " + this.Flowcell + ", Lane: " + this.Lane + ", Project: " + this.Project + ", Sample: " + this.Sample + ", Barcode: " + this.Barcode - + ", RawList: " + this.RawList + ", PfList: " + this.PfList; - } - - } - - // ########################################################## - - public static class Statistics extends Sample - { - /* - * Object of Statistics within one single sample inherited from Sample-Object - */ - - public Integer Sum_RawClusterCount = 0; - - public Integer Sum_PfClusterCount = 0; - - public double Sum_RawYield = Double.NaN; - - public double Sum_PfYield = Double.NaN; - - public double Sum_RawYieldQ30 = Double.NaN; - - public double Sum_PfYieldQ30 = Double.NaN; - - public double Sum_RawQualityScoreSum = Double.NaN; - - public double Sum_PfQualityScoreSum = Double.NaN; - - public double Mega_RawYield = Double.NaN; // obvious double, but could be turned into int - - public double Mega_PfYield = Double.NaN; // obvious double, but could be turned into int - - public double Percentage_PfYield_RawYield = Double.NaN; - - public double Percentage_PfYieldQ30_PfYield = 0.0; - - public double Fraction_PfQualityScoreSum_PfYield = 0.0; - - public double Percentage_PfClusterCount_RawClusterCount = Double.NaN; - - public double Percentage_RawClusterCount_AllRawClusterCounts = Double.NaN; - - public Statistics(Sample sample) - { - /* - * Constructor of derived class Initialization: Already initialized Sample-Object is necessary argument. - */ - - super(); - Flowcell = sample.Flowcell; - Lane = sample.Lane; - Project = sample.Project; - Sample = sample.Sample; - Barcode = sample.Barcode; - RawList = sample.RawList; - PfList = sample.PfList; - - if (RawList.size() > 0) - Sum_RawClusterCount = 0; - for (SampleItem s : RawList) - Sum_RawClusterCount += s.ClusterCount; - if (PfList.size() > 0) - Sum_PfClusterCount = 0; - for (SampleItem s : PfList) - Sum_PfClusterCount += s.ClusterCount; - if (RawList.size() > 0) - Sum_RawYield = 0; - for (SampleItem s : RawList) - for (double d : s.YieldList) - Sum_RawYield += d; - if (PfList.size() > 0) - Sum_PfYield = 0; - for (SampleItem s : PfList) - for (double d : s.YieldList) - Sum_PfYield += d; - if (RawList.size() > 0) - Sum_RawYieldQ30 = 0; - for (SampleItem s : RawList) - for (double d : s.YieldQ30List) - Sum_RawYieldQ30 += d; - if (PfList.size() > 0) - Sum_PfYieldQ30 = 0; - for (SampleItem s : PfList) - for (double d : s.YieldQ30List) - Sum_PfYieldQ30 += d; - if (RawList.size() > 0) - Sum_RawQualityScoreSum = 0; - for (SampleItem s : RawList) - for (double d : s.QualityScoreSumList) - Sum_RawQualityScoreSum += d; - if (PfList.size() > 0) - Sum_PfQualityScoreSum = 0; - for (SampleItem s : PfList) - for (double d : s.QualityScoreSumList) - Sum_PfQualityScoreSum += d; - // Mega_RawYield = calculate_MegaUnit(Sum_RawYield); - // Mega_PfYield = calculate_MegaUnit(Sum_PfYield); - - Mega_RawYield = Sum_RawYield; - Mega_PfYield = Sum_PfYield; - - Percentage_PfYield_RawYield = calculate_Percentage(Sum_PfYield, Sum_RawYield); - Percentage_PfYieldQ30_PfYield = calculate_Percentage(Sum_PfYieldQ30, Sum_PfYield); - Fraction_PfQualityScoreSum_PfYield = calculate_Fraction(Sum_PfQualityScoreSum, Sum_PfYield); - Percentage_PfClusterCount_RawClusterCount = calculate_Percentage(Sum_PfClusterCount, Sum_RawClusterCount); - // Calculation of attribute "Percentage_RawClusterCount_AllRawClusterCounts" needs statistics of all other included samples. => After - // initializing this object, apply method: adaptStatisticsWithRespectToAllSamples(statisticslist) - } - - public String toString() - { - return "Flowcell: " + this.Flowcell + ", Lane: "+ this.Lane + ", Project: " + this.Project + ", Sample: " + this.Sample + ", Barcode: " + this.Barcode - + ", Raw Clusters: " + (long) this.Sum_RawClusterCount + ", Mbases Raw Yield: " + this.Mega_RawYield - + ", % Raw Clusters overall: " + this.Percentage_RawClusterCount_AllRawClusterCounts - + ", Pf Clusters: " + (long) this.Sum_PfClusterCount + ", Mbases Pf Yield: " + this.Mega_PfYield - + ", % PfYield/RawYield: " + this.Percentage_PfYield_RawYield - + ", % PfYieldQ30/PfYield: " + this.Percentage_PfYieldQ30_PfYield - + ", Mean Pf Quality Score: " + this.Fraction_PfQualityScoreSum_PfYield - + ", % Passes Filtering: " + this.Percentage_PfClusterCount_RawClusterCount + "\n"; - } - - public void adaptStatisticsWithRespectToAllSamples(ArrayList<Statistics> statisticslist, HashMap<Integer, ArrayList<Statistics>> groupedList) - { - /* - * This Statistics-Object (corresponding to one sample) is adapted by employing a list of Statistics-Objects corresponding to all samples - * influencing the statistics of single sample. Input: statisticslist contains all Statistics-Objects - */ - if (statisticslist.size() == 0) - { // here it additionally should be checked, if calling object is included ... - Percentage_RawClusterCount_AllRawClusterCounts = Double.NaN; - String errormessage = - "INPUT ARGUMENT statisticslist MUST BE LIST OF Statistics OBJECTS INCLUDING THE CALLING OBJECT" + - " IN METHOD adaptStatisticsWithRespectToAllSamples!"; - throw new IllegalArgumentException(errormessage); // Exception reasonable since otherwise wrong results. - } else - { - for (Integer key : groupedList.keySet()) { - double sumAllRawClusterCounts = 0; - ArrayList<Statistics> groupList = groupedList.get(key); - for (Statistics element : groupList) { - sumAllRawClusterCounts += element.Sum_RawClusterCount; - } - for (Statistics element : groupList) { - element.Percentage_RawClusterCount_AllRawClusterCounts = - calculate_Percentage(element.Sum_RawClusterCount, sumAllRawClusterCounts); - } - } - } - } - - - public double calculate_Percentage(double x, double y) - { - double z = x / y; - if (z == Double.POSITIVE_INFINITY || z == Double.NEGATIVE_INFINITY || Double.isNaN(z)) - { - z = 0.0; - } else - { - z = 100 * z; - } - return z; - } - - public double calculate_Fraction(double x, double y) - { - double z = x / y; - if (z == Double.POSITIVE_INFINITY || z == Double.NEGATIVE_INFINITY || Double.isNaN(z)) - { - z = 0.0; - } - return z; - } - } - - public static class LaneStatistics - { - /* - * Total Lane Statistics - */ - public ArrayList<Statistics> statisticsList; - - public Integer Lane = 0; - - public double Sum_RawClusterCount = 0.0; - - public Integer Sum_PfClusterCount = 0; - - public double Sum_RawYield = 0.0; - - public double Sum_PfYield = 0.0; - - public double Sum_RawYieldQ30 = 0.0; - - public double Sum_PfYieldQ30 = 0.0; - - public double Sum_RawQualityScoreSum = 0.0; - - public double Sum_PfQualityScoreSum = 0.0; - - public double Percentage_PfYield_RawYield = 0.0; - - public double Percentage_PfYieldQ30_PfYield = 0.0; - - public double Fraction_PfQualityScoreSum_PfYield = 0.0; - - public double Percentage_PfClusterCount_RawClusterCount = 0.0; - - public double Percentage_RawClusterCount_AllRawClusterCounts = 0.0; - - public double Clusters_PfWithoutNoindex = 0.0; - - public LaneStatistics(ArrayList<Statistics> statisticsList) - { - this.statisticsList = statisticsList; - } - - public void calculateOverallStats(Integer key) - { - int sampleNumber = statisticsList.size(); - for (Statistics s : statisticsList) { - if (!s.Barcode.equals("") || s.Barcode.equals("unknown")) { - this.Clusters_PfWithoutNoindex += s.Sum_PfClusterCount; - } - - this.Sum_RawClusterCount += s.Sum_RawClusterCount; - this.Sum_PfClusterCount += s.Sum_PfClusterCount; - this.Sum_RawYield += s.Sum_RawYield; - this.Sum_PfYield += s.Sum_PfYield; - this.Sum_RawYieldQ30 += s.Sum_RawYieldQ30; - this.Sum_PfYieldQ30 += s.Sum_PfYieldQ30; - this.Sum_RawQualityScoreSum += s.Sum_RawQualityScoreSum; - this.Sum_PfQualityScoreSum += s.Sum_PfQualityScoreSum; - this.Percentage_PfYield_RawYield += s.Percentage_PfYield_RawYield; - if (!Double.isNaN(s.Percentage_PfYieldQ30_PfYield)) { - this.Percentage_PfYieldQ30_PfYield += s.Percentage_PfYieldQ30_PfYield; - } - this.Percentage_PfClusterCount_RawClusterCount += s.Percentage_PfClusterCount_RawClusterCount; - this.Fraction_PfQualityScoreSum_PfYield += s.Fraction_PfQualityScoreSum_PfYield; - } - - this.Lane = key; - this.Sum_RawQualityScoreSum = this.Sum_RawQualityScoreSum / sampleNumber; - this.Sum_PfQualityScoreSum = this.Sum_PfQualityScoreSum / sampleNumber; - this.Percentage_PfYield_RawYield = this.Percentage_PfYield_RawYield / sampleNumber; - this.Percentage_PfYieldQ30_PfYield = this.Percentage_PfYieldQ30_PfYield / (double) sampleNumber; - this.Percentage_PfClusterCount_RawClusterCount = this.Percentage_PfClusterCount_RawClusterCount / (double) sampleNumber; - this.Fraction_PfQualityScoreSum_PfYield = this.Fraction_PfQualityScoreSum_PfYield / (double) sampleNumber; - } - - public String toString() - { - return "Lane " + this.Lane + " Sum_RawClusterCount " + this.Sum_RawClusterCount + " Sum_PfClusterCount " + this.Sum_PfClusterCount + - " Percentage_PfYieldQ30_PfYield " + this.Percentage_PfYieldQ30_PfYield + - " Percentage_PfClusterCount_RawClusterCount " + this.Percentage_PfClusterCount_RawClusterCount; - } - } -} \ No newline at end of file diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/2/dss/drop-boxes/read-demultiplex-stats-nextseq/plugin.properties b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/2/dss/drop-boxes/read-demultiplex-stats-nextseq/plugin.properties deleted file mode 100644 index 102a5fe3f83698dc29055fd828dd2fd1518d6bf7..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/2/dss/drop-boxes/read-demultiplex-stats-nextseq/plugin.properties +++ /dev/null @@ -1,10 +0,0 @@ -# -# Variables: -# incoming-root-dir -# Path to the directory which contains incoming directories for drop boxes. -incoming-dir = ${incoming-root-dir}/read-demultiplex-stats-nextseq -incoming-data-completeness-condition = marker-file -top-level-data-set-handler = ch.systemsx.cisd.etlserver.registrator.api.v2.JythonTopLevelDataSetHandlerV2 -script-path = read-demultiplex-stats-nextseq.py -storage-processor = ch.systemsx.cisd.etlserver.DefaultStorageProcessor - diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/2/dss/drop-boxes/read-demultiplex-stats-nextseq/read-demultiplex-stats-nextseq.py b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/2/dss/drop-boxes/read-demultiplex-stats-nextseq/read-demultiplex-stats-nextseq.py deleted file mode 100755 index b66873933cbf7cfa3ec86d19920f94fc1b56c92e..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/2/dss/drop-boxes/read-demultiplex-stats-nextseq/read-demultiplex-stats-nextseq.py +++ /dev/null @@ -1,353 +0,0 @@ -''' -@copyright: 2012 ETH Zuerich, CISD - -@license: -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. - -@author: Fabian Gemperle - -@note: print statements go to ~/openbis/servers/datastore_server/log/startup_log.txt - -''' - -import time -import math -import os -import fnmatch -# Load Java-Library to import XML data: -import read_demultiplex_stats -# Load openBIS-Libraries: -from ch.systemsx.cisd.openbis.generic.shared.api.v1.dto import SearchCriteria -from ch.systemsx.cisd.openbis.generic.shared.api.v1.dto import SearchSubCriteria - - -def process(transaction): - ''' - Main method in corresponding openBIS dropbox - ''' - - # Constants: - XML_FILENAME = 'ConversionStats.xml' - TYPE_DATASET = 'FASTQ_GZ' - INDEX_NO = 'NOINDEX' - INDEX_UNKNOWN = 'UNKNOWN' - INDEX_EMPTY = '' - CODE_INDEX1 = 'BARCODE' - CODE_INDEX2 = 'INDEX2' - CODE_INDEX1LENGTH = 'INDEXREAD' - CODE_INDEX2LENGTH = 'INDEXREAD2' - BARCODE_SPLIT_CHAR = "+" - - - ########################################################## - def locate(pattern, root): - '''Locate all files matching supplied filename pattern in and below supplied root directory.''' - for path, dirs, files in os.walk(os.path.abspath(root)): - for filename in fnmatch.filter(files, pattern): - yield os.path.join(path, filename) - - ########################################################## - def getInfoVocabularyTerms(vocabularyCode): - ''' - Get information about Terms of certain Vocabulary in openBIS. - Input: - - vocabularyCode: code of Vocabulary to be investigated - Output: - - vocabularyTerms: list of Terms in Vocabulary - ''' - vocabulary = transaction.getSearchService().searchForVocabulary(vocabularyCode) - - vocabularyTerms = [] - if (vocabulary is None): - print '\nOCCURRED EXCEPTION: Vocabulary %s does not exist' % (vocabularyCode) - else: - for term in vocabulary.getTerms(): - vocabularyTerms.append(term.getCode()) - vocabularyTerms.sort() - - return vocabularyTerms - - ########################################################## - def getInfoSampleProperties(sampleCode): - ''' - Get information about Properties of certain Sample in openBIS. - Input: - - sampleCode: code of Sample to be investigated - Outputs: - - propertiesCode: list of Properties' codes - - propertiesCodeValue: dictionary of Properties' codes and values - ''' - ss = transaction.getSearchService() - - scSample = SearchCriteria() - scSample.addMatchClause(SearchCriteria.MatchClause.createAttributeMatch(SearchCriteria.MatchClauseAttribute.CODE, sampleCode)); - foundSamples = ss.searchForSamples(scSample) - - propertiesCode = [] - propertiesCodeValue = {} - try: - assert foundSamples.size() == 1 - properties = foundSamples[0].getSample().getProperties() - for p in properties: - codeProperty = p.getPropertyType().getSimpleCode() - propertiesCode.append(codeProperty) - propertiesCodeValue[codeProperty] = p.getValue() - propertiesCode.sort() - except AssertionError: - print ('\nOCCURRED EXCEPTION: ' + str(foundSamples.size()) + ' Samples found which match the criteria code \"' + sampleCode + '\".') - - return propertiesCode, propertiesCodeValue - - ########################################################## - def getInfoDataSetPropertiesOfSample(sampleCode): - ''' - Get information about Properties of some DataSet of certain Sample in openBIS. - Input: - - sampleCode: code of DataSet's Sample to be investigated - Outputs: - - propertiesCode: list of Properties' codes - - propertiesCodeValue: dictionary of Properties' codes and values - ''' - ss = transaction.getSearchService() - - scSample = SearchCriteria() - scSample.addMatchClause(SearchCriteria.MatchClause.createAttributeMatch(SearchCriteria.MatchClauseAttribute.CODE, sampleCode)); - #foundSamples = ss.searchForSamples(scSample) - - scDataSet = SearchCriteria() - scDataSet.addMatchClause(SearchCriteria.MatchClause.createAttributeMatch(SearchCriteria.MatchClauseAttribute.TYPE, TYPE_DATASET)) - scDataSet.addSubCriteria(SearchSubCriteria.createSampleCriteria(scSample)) - foundDataSets = ss.searchForDataSets(scDataSet) - - propertiesCode = [] - propertiesCodeValue = {} - try: - assert foundDataSets.size() > 0 - codeProperties = foundDataSets[0].getAllPropertyCodes() - for cp in codeProperties: - propertiesCode.append(cp) - propertiesCodeValue[cp] = foundDataSets[0].getPropertyValue(cp) - propertiesCode.sort() - except AssertionError: - print ('\nOCCURRED EXCEPTION: ' + str(foundDataSets.size()) + ' DataSets found which Sample match the criteria code \"' + sampleCode + '\" and type \"' + TYPE_DATASET + '\".') - - return propertiesCode, propertiesCodeValue - - ########################################################## - def getIndexesOfDataSetsOfSample(sampleFlowLaneCode): - ''' - Get both indexes (parts of barcode) of all DataSets of certain FlowLane-Sample in openBIS. - Inputs: - - sampleFlowLaneCode: code of DataSet's Sample - Outputs: - - indexes1: list of first index of DataSets - - indexes2: list of second index of DataSets - ''' - ss = transaction.getSearchService() - - scSample = SearchCriteria() - scSample.addMatchClause(SearchCriteria.MatchClause.createAttributeMatch(SearchCriteria.MatchClauseAttribute.CODE, sampleFlowLaneCode)); - #foundSamples = ss.searchForSamples(scSample) - - scDataSet = SearchCriteria() - scDataSet.addMatchClause(SearchCriteria.MatchClause.createAttributeMatch(SearchCriteria.MatchClauseAttribute.TYPE, TYPE_DATASET)) - scDataSet.addSubCriteria(SearchSubCriteria.createSampleCriteria(scSample)) - foundDataSets = ss.searchForDataSets(scDataSet) - - indexes1 = [] - indexes2 = [] - try: - assert foundDataSets.size() > 0 - except AssertionError: - print ('\nOCCURRED EXCEPTION: ' + str(foundDataSets.size()) + ' DataSets found which Sample match the criteria code \"' + sampleFlowLaneCode + '\" and type \"' + TYPE_DATASET + '\".') - for ds in foundDataSets: - indexes1.append(ds.getPropertyValue(CODE_INDEX1)) - indexes2.append(ds.getPropertyValue(CODE_INDEX2)) - - return indexes1, indexes2 - - ########################################################## - def searchDataSetsOfSample(sampleFlowLaneCode, index1, index2): - ''' - Search DataSets by corresponding indexes (parts of barcode) of certain FlowLane-Sample in openBIS. - Inputs: - - sampleFlowLaneCode: code of DataSet's Sample - - index1: first index of DataSet - - index2: second index of DataSet - Output: - - foundDataSets: DataSets corresponding to inputs and constant TYPE_DATASET - ''' - ss = transaction.getSearchService() - - scSample = SearchCriteria() - scSample.addMatchClause(SearchCriteria.MatchClause.createAttributeMatch(SearchCriteria.MatchClauseAttribute.CODE, sampleFlowLaneCode)); - #foundSample = ss.searchForSamples(scSample) - - scDataSet = SearchCriteria() - scDataSet.addMatchClause(SearchCriteria.MatchClause.createAttributeMatch(SearchCriteria.MatchClauseAttribute.TYPE, TYPE_DATASET)) - scDataSet.addMatchClause(SearchCriteria.MatchClause.createPropertyMatch(CODE_INDEX1, index1)) - scDataSet.addMatchClause(SearchCriteria.MatchClause.createPropertyMatch(CODE_INDEX2, index2)) - scDataSet.addSubCriteria(SearchSubCriteria.createSampleCriteria(scSample)) - foundDataSets = ss.searchForDataSets(scDataSet) - for ds in foundDataSets: - print "Index1 of found DataSet " + ds.getDataSetCode() + ": " + ds.getPropertyValue(CODE_INDEX1) - print "Index2 of found DataSet " + ds.getDataSetCode() + ": " + ds.getPropertyValue(CODE_INDEX2) - - return foundDataSets - - ########################################################## - def reversecomplement(sequence): - ''' - Reverse sequence and replace each nucleotide by its complement. - Input: - - sequence: sequence of nucleotides - Output: - - reverse_complement_sequence: reversed and complemented sequence - ''' - lookup_table = {'A': 'T', 'T': 'A', 'G': 'C', 'C': 'G'} - reverse_complement_sequence = '' - for nucleotide in reversed(sequence): - reverse_complement_sequence += lookup_table[nucleotide] - return reverse_complement_sequence - - ########################################################## - - def sampleSearch(transaction, code=''): - sc = SearchCriteria() - numberOfLanes = 0 - sc.addMatchClause(SearchCriteria.MatchClause.createAttributeMatch(SearchCriteria.MatchClauseAttribute.CODE, code)); - search_service = transaction.getSearchService() - flowcell = search_service.searchForSamples(sc) - if flowcell.size() > 0: - # Search for contained samples - sampleSc = SearchCriteria() - sampleSc.addSubCriteria(SearchSubCriteria.createSampleContainerCriteria(sc)) - lanes = search_service.searchForSamples(sampleSc) - numberOfLanes = lanes.size() - return flowcell, lanes, numberOfLanes - - ########################################################## - - def updateLane(transaction, codeSampleFlowCell, totalLaneStatistics): - - flowcell, lanes, numberOfLanes = sampleSearch(transaction, codeSampleFlowCell) - lane = lanes[0] - mutable_lane = transaction.getSampleForUpdate(lane.getSampleIdentifier()) - print("Setting Complete Lanes Statistics For: " + lane.getSampleIdentifier()) - - mutable_lane.setPropertyValue("YIELD_MBASES", str(int(totalLaneStatistics.Sum_PfYield))) - mutable_lane.setPropertyValue('RAW_YIELD_MBASES', str(int(totalLaneStatistics.Sum_RawYield))) - mutable_lane.setPropertyValue('PERCENTAGE_PASSED_FILTERING',str(int(totalLaneStatistics.Percentage_PfClusterCount_RawClusterCount))) - mutable_lane.setPropertyValue('PF_READS_SUM',str(int(totalLaneStatistics.Sum_PfClusterCount))) - mutable_lane.setPropertyValue('RAW_READS_SUM',str(int(totalLaneStatistics.Sum_RawClusterCount))) - mutable_lane.setPropertyValue('PFYIELDQ30PERCENTAGE', str(int(totalLaneStatistics.Percentage_PfYieldQ30_PfYield))) - mutable_lane.setPropertyValue('PFMEANQUALITYSCORE', str(totalLaneStatistics.Fraction_PfQualityScoreSum_PfYield)) - mutable_lane.setPropertyValue('CLUSTERS_PF_WITHOUT_NOINDEX', str(int(totalLaneStatistics.Clusters_PfWithoutNoindex))) - - ########################################################## - - print('\nPROCESS RUNNING '+time.ctime()) - incomingPath = transaction.getIncoming().getPath() - FileGenerator= locate(XML_FILENAME, incomingPath) - xmlfile = FileGenerator.next() - print "File: " + xmlfile - - # Import data of XML file (independent of openBIS data): - JavaClassToProcessXML = read_demultiplex_stats() # this function is implemented as Class in Java: - samplestatisticslist = JavaClassToProcessXML.importXMLdata_and_calculateStatistics(xmlfile) - totalLaneStatistics = JavaClassToProcessXML.calculateTotalLaneStatistics(samplestatisticslist) - - if len(samplestatisticslist) == 0: - print "\nNo Projects/Samples/Barcodes are contained in XML-file " + xmlfile + "!" - return - - # Prepare links between XML and openBIS w.r.t. Samples: - codeSampleFlowCell = samplestatisticslist[0].Flowcell # expect just one equal FlowCell of all imported datasets - codeSampleFlowLane = samplestatisticslist[0].Flowcell + ":1" # expect just one equal FlowLane of all imported datasets - - updateLane(transaction, codeSampleFlowCell, totalLaneStatistics) - - # Prepare links between XML and openBIS w.r.t to indexes in DataSet (openBIS): - index1list, index2list = getIndexesOfDataSetsOfSample(codeSampleFlowLane) - propertiesCode, propertiesCodeValue = getInfoSampleProperties(codeSampleFlowCell) - index1length = int(propertiesCodeValue[CODE_INDEX1LENGTH]) - index2length = int(propertiesCodeValue[CODE_INDEX2LENGTH]) - - nprocessedDataSets = 0 - for s in samplestatisticslist: - print "\nContent in XML file:\n", s - print "Connection to openBIS:" - - # Prepare link between XML and openBIS w.r.t to indexes in Barcode (XML): - indexes = s.Barcode.split(BARCODE_SPLIT_CHAR) - if len(indexes) == 1: # only first part in Barcode - index1search = indexes[0].upper() - index2search = INDEX_EMPTY - elif len(indexes) == 2: # both parts in Barcode - index1search = indexes[0].upper() - index2search = indexes[1].upper() - else: - index1search = INDEX_EMPTY - index2search = INDEX_EMPTY - - # Set link between XML and openBIS w.r.t to indexes in DataSet (openBIS): - if index1search == INDEX_EMPTY or index1search == INDEX_UNKNOWN: - index1 = INDEX_NO - else: # Hint: just two cases were known about index1length, that is 8 or 6 - if index1length > 7: - index1 = [ index1 for index1 in index1list if index1search == index1 ] - else: # for smaller indexlength, the index is by 1 shorter in XML-file than in openBIS - index1 = [ index1 for index1 in index1list if index1search == index1[:index1length] ] - try: - index1 = index1[0] - except: - print '\nOCCURRED EXCEPTION: First index \"' + index1search + '\" of Barcode in XML file has no corresponding DataSet in openBIS!' - index1 = 'MISSING' - if index2search == INDEX_EMPTY or index2search == INDEX_UNKNOWN: - index2 = INDEX_NO - else: # Hint: just one case was known about index2length, that is 8 - if index2length > 7: # second and larger index must be reversed and complemented in contrast to first or smaller index - index2 = [ index2 for index2 in index2list if reversecomplement(index2search) == index2 ] - else: # second and smaller index is unknown how to handle - index2 = [ index2 for index2 in index2list if reversecomplement(index2search) == index2 ] - try: - index2 = index2[0] - except: - print '\nOCCURRED EXCEPTION: Second index \"' + index2search + '\" of Barcode in XML file has no corresponding DataSet in openBIS!' - index2 = 'MISSING' - - # Get DataSet of openBIS corresponding to Project/Sample/Barcode of XML file: - correspondingDataSet = searchDataSetsOfSample(codeSampleFlowLane, index1, index2) - try: - assert correspondingDataSet.size() == 1 - except AssertionError: - print ('\nOCCURRED EXCEPTION: ' + str(correspondingDataSet.size()) + ' DataSets found which Sample match the criteria index1 \"' + str(index1) + '\" and index2 \"' + str(index2) + '\" and code \"' + codeSampleFlowLane + '\" and type \"' + TYPE_DATASET + '\".') - continue - - # Modify Properties of corresponding DataSet: - # (method setPropertyValue requires Strings as Input, but Number format must fit to Properties already defined in openBIS) - ds = transaction.getDataSetForUpdate(correspondingDataSet[0].getDataSetCode()) - ds.setPropertyValue('YIELD_MBASES', str(int(s.Mega_PfYield))) - ds.setPropertyValue('RAW_YIELD_MBASES', str(int(s.Mega_RawYield))) - ds.setPropertyValue('PERCENTAGE_PASSED_FILTERING',str(s.Percentage_PfClusterCount_RawClusterCount)) - ds.setPropertyValue('PF_READS_SUM',str(int(s.Sum_PfClusterCount))) # convert first to Integer, then to String - ds.setPropertyValue('RAW_READS_SUM',str(int(s.Sum_RawClusterCount))) # convert first to Integer, then to String - ds.setPropertyValue('PERCENTAGE_RAW_CLUSTERS_PER_LANE', str(s.Percentage_RawClusterCount_AllRawClusterCounts)) - ds.setPropertyValue('PFYIELDQ30PERCENTAGE', str(s.Percentage_PfYieldQ30_PfYield)) - ds.setPropertyValue('PFMEANQUALITYSCORE', str(s.Fraction_PfQualityScoreSum_PfYield)) - print "Properties in DataSet \"" + correspondingDataSet[0].getDataSetCode() + "\" are modified." - nprocessedDataSets += 1 - - print "\n", nprocessedDataSets, " openBIS-DataSets were processed." - print len(samplestatisticslist), " XML-Projects/-Samples/-Barcodes were processed." - print("PROCESS DONE "+time.ctime()) diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/2/dss/drop-boxes/read-demultiplex-stats-nextseq/read_demultiplex_stats.java b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/2/dss/drop-boxes/read-demultiplex-stats-nextseq/read_demultiplex_stats.java deleted file mode 100644 index e10a38ce32fc6da382a7ce584d7818bfd493202d..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/2/dss/drop-boxes/read-demultiplex-stats-nextseq/read_demultiplex_stats.java +++ /dev/null @@ -1,727 +0,0 @@ -/* -@copyright: 2015 ETH Zuerich, CISD - -@license: -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. - -@author: Fabian Gemperle -@autor: Manuel Kohler - -@note: This Class is in Jython importable as Java-Library after compiling it. - In compilation 4 Class files arise: - - read_demultiplex_stats.class - - read_demultiplex_stats$SampleItem.class - - read_demultiplex_stats$Sample.class - - read_demultiplex_stats$Statistics.class - */ - -import java.io.FileInputStream; -import java.io.FileNotFoundException; -import java.io.InputStream; -import java.util.ArrayList; -import java.util.List; - -import javax.xml.stream.XMLInputFactory; -import javax.xml.stream.XMLStreamConstants; -import javax.xml.stream.XMLStreamException; -import javax.xml.stream.XMLStreamReader; - -//########################################################## - -public final class read_demultiplex_stats -{ - - public List<Statistics> importXMLdata_and_calculateStatistics(String XMLfile) - { - - ArrayList<Statistics> samplestatisticslist = new ArrayList<Statistics>(); - - /*Parse corresponding XML file, put all values into a memory structure, calculate statistics overall samples. - Output: samplestatisticslist (list of Sample-Statistics-Objects) - Input: XMLfile having structure of file ConversionStats.xml (Example of 1.10.2014): - <?xml version="1.0" encoding="utf-8"?> => Assumptions about XML structure: - <Stats> => Element is singlechild - <Flowcell flowcell-id="H0YVKBGXX"> => Element is singlechild - <Project name="BSSE_QGF_23096_H0YVKBGXX_1"> => Element is one of many children, additionally there is summary-element with attribute name="all" - <Sample name="BSSE_QGF_23096_H0YVKBGXX_1_PZ27_PZ33_CelSEQ_"> => Element is singlechild except second summary-element with attribute name="all" - <Barcode name="unknown"> => Element is singlechild except second summary-element with attribute name="all" - <Lane number="1"> => Element is one of several children - <Tile number="11101"> => Element is one of many children - <Raw> => Element is singlechild - <ClusterCount>328653</ClusterCount> => Element is singlechild - <Read number="1"> => Element is one of several children - <Yield>24977628</Yield> => Element is singlechild - <YieldQ30>16162292</YieldQ30> => Element is singlechild - <QualityScoreSum>703070796</QualityScoreSum> => Element is singlechild - </Read> - <Read number="2"> => Element is one of several children - <Yield>24977628</Yield> => Element is singlechild - <YieldQ30>16233173</YieldQ30> => Element is singlechild - <QualityScoreSum>699507245</QualityScoreSum> => Element is singlechild - </Read> - </Raw> - <Pf> => Element is singlechild - <ClusterCount>302121</ClusterCount> => Element is singlechild - <Read number="1"> => Element is one of several children - <Yield>22961196</Yield> => Element is singlechild - <YieldQ30>15842531</YieldQ30> => Element is singlechild - <QualityScoreSum>686898532</QualityScoreSum> => Element is singlechild - </Read> - <Read number="2"> => Element is one of several children - <Yield>22961196</Yield> => Element is singlechild - <YieldQ30>16233173</YieldQ30> => Element is singlechild - <QualityScoreSum>699507245</QualityScoreSum> => Element is singlechild - </Read> - </Pf> - </Tile> - <Tile number="11102"> - [...] - */ - - try - { - - // temporary variables (frequently changing during XML-read-in): - String errormessage = ""; - int event = 0; - int skip = 0; - String curflowcellname = ""; - String curprojectname = ""; - String cursamplename = ""; - String curbarcodename = ""; - double curlanenumber = Double.NaN; // obvious double, but could be turned into int - double curtilenumber = Double.NaN; // obvious double, but could be turned into int - Sample cursample = null; - Statistics curstatistics = null; - SampleItem currawitem = null; - SampleItem curpfitem = null; - - InputStream xmlfile = new FileInputStream(XMLfile); - XMLInputFactory xmlfactory = XMLInputFactory.newInstance(); - XMLStreamReader xmlparser = xmlfactory.createXMLStreamReader(xmlfile); - - // Start-Tag "Stats": - event = xmlparser.nextTag(); // Assumption: just white space or comments are aside explicit start-tag - if (event != XMLStreamConstants.START_ELEMENT || !xmlparser.getLocalName().equals("Stats")) - { - errormessage = - "STRANGE ERROR IN METHOD importXMLdata_and_calculateStatistics WHEN READING IN XMLFILE. => CHECK CODE AND XMLFILE-STRUCTURE! Got " + event; - throw new Exception(errormessage); - } - //System.out.println("\nStart-Element with tag " + xmlparser.getLocalName() + " with " + xmlparser.getAttributeCount() + " attributes with first attribute: " + xmlparser.getAttributeLocalName(0) +" = " + xmlparser.getAttributeValue(0)); - - // Loop over potential Tags "Flowcell": - event = xmlparser.nextTag(); // Assumption: just white spaces or comments are aside start- or end-tag - // List<Statistics> samplestatistics = new ArrayList<Statistics>(); - boolean doimport = true; - while (doimport) - { - // concerning tag Flowcell: - if (event == XMLStreamConstants.START_ELEMENT && xmlparser.getLocalName().equals("Flowcell")) - { - //System.out.println("\nStart-Element with tag " + xmlparser.getLocalName() + " with " + xmlparser.getAttributeCount() + " attributes with first attribute: " + xmlparser.getAttributeLocalName(0) +" = " + xmlparser.getAttributeValue(0)); - curflowcellname = xmlparser.getAttributeValue(0); // Assumption: Flowcell-attribute flowcell-id is just string - event = xmlparser.nextTag(); - } else if (event == XMLStreamConstants.END_ELEMENT && xmlparser.getLocalName().equals("Flowcell")) - { - curflowcellname = ""; - event = xmlparser.nextTag(); - - // concerning tag Project: - } else if (event == XMLStreamConstants.START_ELEMENT && xmlparser.getLocalName().equals("Project")) - { - //System.out.println("\nStart-Element with tag " + xmlparser.getLocalName() + " with " + xmlparser.getAttributeCount() + " attributes with first attribute: " + xmlparser.getAttributeLocalName(0) +" = " + xmlparser.getAttributeValue(0)); - if (xmlparser.getAttributeValue(0).equals("all")) - { - // skip the current XML element and all of its following subelements: - skip = 1; - while (skip > 0) - { - event = xmlparser.next(); - switch (event) - { - case XMLStreamConstants.END_ELEMENT: - skip -= 1; - break; - case XMLStreamConstants.START_ELEMENT: - skip += 1; - break; - default: - skip += 0; // text elements, spaces, ... - break; - } - } - } else - { - curprojectname = xmlparser.getAttributeValue(0); // Assumption: Project-attribute name is just string - } - event = xmlparser.nextTag(); - } else if (event == XMLStreamConstants.END_ELEMENT && xmlparser.getLocalName().equals("Project")) - { - curprojectname = ""; - event = xmlparser.nextTag(); - - // concerning tag Sample: - } else if (event == XMLStreamConstants.START_ELEMENT && xmlparser.getLocalName().equals("Sample")) - { - //System.out.println("\nStart-Element with tag " + xmlparser.getLocalName() + " with " + xmlparser.getAttributeCount() + " attributes with first attribute: " + xmlparser.getAttributeLocalName(0) +" = " + xmlparser.getAttributeValue(0)); - if (xmlparser.getAttributeValue(0).equals("all")) - { - // skip the current XML element and all of its following subelements: - skip = 1; - while (skip > 0) - { - event = xmlparser.next(); - switch (event) - { - case XMLStreamConstants.END_ELEMENT: - skip -= 1; - break; // break-command after each case is necessary in switch-statement - case XMLStreamConstants.START_ELEMENT: - skip += 1; - break; // break-command after each case is necessary in switch-statement - default: - skip += 0; // text elements, spaces, ... - break; // break-command after each case is necessary in switch-statement - } - } - } else - { - cursamplename = xmlparser.getAttributeValue(0); // Assumption: Sample-attribute name is just string - } - event = xmlparser.nextTag(); - } else if (event == XMLStreamConstants.END_ELEMENT && xmlparser.getLocalName().equals("Sample")) - { - cursamplename = ""; - event = xmlparser.nextTag(); - - // concerning tag Barcode (which is as well the start/end of Project-/Sample-Entry): - } else if (event == XMLStreamConstants.START_ELEMENT && xmlparser.getLocalName().equals("Barcode")) - { - //System.out.println("\nStart-Element with tag " + xmlparser.getLocalName() + " with " + xmlparser.getAttributeCount() + " attributes with first attribute: " + xmlparser.getAttributeLocalName(0) +" = " + xmlparser.getAttributeValue(0)); - if (xmlparser.getAttributeValue(0).equals("all")) - { - // skip the current XML element and all of its following subelements: - skip = 1; - while (skip > 0) - { - event = xmlparser.next(); - switch (event) - { - case XMLStreamConstants.END_ELEMENT: - skip -= 1; - break; // break-command after each case is necessary in switch-statement - case XMLStreamConstants.START_ELEMENT: - skip += 1; - break; // break-command after each case is necessary in switch-statement - default: - skip += 0; // text elements, spaces, ... - break; // break-command after each case is necessary in switch-statement - } - } - } else - { - curbarcodename = xmlparser.getAttributeValue(0); // Assumption: Barcode-attribute name is just string - cursample = new Sample(); - cursample.Flowcell = curflowcellname; - cursample.Project = curprojectname; - cursample.Sample = cursamplename; - cursample.Barcode = curbarcodename; - } - event = xmlparser.nextTag(); - } else if (event == XMLStreamConstants.END_ELEMENT && xmlparser.getLocalName().equals("Barcode")) - { - // Statistics 1st step: calculate individual statistics per sample: - curstatistics = new Statistics(cursample); - samplestatisticslist.add(curstatistics); - cursample = null; - curstatistics = null; - curbarcodename = ""; - event = xmlparser.nextTag(); - - // concerning Lane: - } else if (event == XMLStreamConstants.START_ELEMENT && xmlparser.getLocalName().equals("Lane")) - { - //System.out.println("\nStart-Element with tag " + xmlparser.getLocalName() + " with " + xmlparser.getAttributeCount() + " attributes with first attribute: " + xmlparser.getAttributeLocalName(0) +" = " + xmlparser.getAttributeValue(0)); - curlanenumber = Double.parseDouble(xmlparser.getAttributeValue(0)); // Assumption:Lane-attribute number is always numeric - event = xmlparser.nextTag(); - } else if (event == XMLStreamConstants.END_ELEMENT && xmlparser.getLocalName().equals("Lane")) - { - curlanenumber = Double.NaN; - event = xmlparser.nextTag(); - - // concerning Tile with all its sub-elements: - } else if (event == XMLStreamConstants.START_ELEMENT && xmlparser.getLocalName().equals("Tile")) - { - //System.out.println("\nStart-Element with tag " + xmlparser.getLocalName() + " with " + xmlparser.getAttributeCount() + " attributes with first attribute: " + xmlparser.getAttributeLocalName(0) +" = " + xmlparser.getAttributeValue(0)); - curtilenumber = Double.parseDouble(xmlparser.getAttributeValue(0)); // Assumption: Tile-attribute number is always numeric - // concerning Raw with Assumption: Raw-element is singlechild: - xmlparser.nextTag(); - //System.out.println("\nStart-Element with tag " + xmlparser.getLocalName()); - currawitem = new SampleItem(); - currawitem.Type = "Raw"; - currawitem.Lane = curlanenumber; - currawitem.Tile = curtilenumber; - xmlparser.nextTag(); - currawitem.ClusterCount = Double.parseDouble(xmlparser.getElementText()); // Assumption: ClusterCount-element is numeric singlechild - //System.out.println("\nValue: ClusterCount=" + currawitem.ClusterCount); - xmlparser.nextTag(); - while (event == XMLStreamConstants.START_ELEMENT && xmlparser.getLocalName().equals("Read")) - { // Assumption: at least or more than 1 Read-element - //System.out.println("\nStart-Element with tag " + xmlparser.getLocalName() + " with " + xmlparser.getAttributeCount() + " attributes with first attribute: " + xmlparser.getAttributeLocalName(0) +" = " + xmlparser.getAttributeValue(0)); - xmlparser.nextTag(); - currawitem.YieldList.add(Double.parseDouble(xmlparser.getElementText())); // Assumption: Yield-element is numeric singlechild - xmlparser.nextTag(); - currawitem.YieldQ30List.add(Double.parseDouble(xmlparser.getElementText())); // Assumption: YieldQ30List-element is numeric singlechild - xmlparser.nextTag(); - currawitem.QualityScoreSumList.add(Double.parseDouble(xmlparser.getElementText())); // Assumption: QualityScoreSumList-element is numeric singlechild - xmlparser.nextTag(); - xmlparser.nextTag(); - //System.out.println("Values in Read: Yield=" + currawitem.YieldList.get(currawitem.YieldList.size()-1) + ", YieldQ30=" + currawitem.YieldQ30List.get(currawitem.YieldQ30List.size()-1) + ", QualityScoreSum=" + currawitem.QualityScoreSumList.get(currawitem.QualityScoreSumList.size()-1)); - } - //System.out.println("\nRaw-SampleItem " + currawitem); - cursample.RawList.add(currawitem); - currawitem = null; - // concerning Pf with Assumption that entire Pf-element is structured same as Raw: - xmlparser.nextTag(); - //System.out.println("\nStart-Element with tag " + xmlparser.getLocalName()); - curpfitem = new SampleItem(); - curpfitem.Type = "Pf"; - curpfitem.Lane = curlanenumber; - curpfitem.Tile = curtilenumber; - xmlparser.nextTag(); - curpfitem.ClusterCount = Double.parseDouble(xmlparser.getElementText()); - //System.out.println("\nValue: ClusterCount=" + curpfitem.ClusterCount); - xmlparser.nextTag(); - while (event == XMLStreamConstants.START_ELEMENT && xmlparser.getLocalName().equals("Read")) - { - //System.out.println("\nStart-Element with tag " + xmlparser.getLocalName() + " with " + xmlparser.getAttributeCount() + " attributes with first attribute: " + xmlparser.getAttributeLocalName(0) +" = " + xmlparser.getAttributeValue(0)); - xmlparser.nextTag(); - curpfitem.YieldList.add(Double.parseDouble(xmlparser.getElementText())); - xmlparser.nextTag(); - curpfitem.YieldQ30List.add(Double.parseDouble(xmlparser.getElementText())); - xmlparser.nextTag(); - curpfitem.QualityScoreSumList.add(Double.parseDouble(xmlparser.getElementText())); - xmlparser.nextTag(); - xmlparser.nextTag(); - //System.out.println("Values in Read: Yield=" + curpfitem.YieldList.get(curpfitem.YieldList.size()-1) + ", YieldQ30=" + curpfitem.YieldQ30List.get(curpfitem.YieldQ30List.size()-1) + ", QualityScoreSum=" + curpfitem.QualityScoreSumList.get(curpfitem.QualityScoreSumList.size()-1)); - } - //System.out.println("\nPf-SampleItem " + curpfitem); - cursample.PfList.add(curpfitem); - curpfitem = null; - // attain end of current Tile and afterwards continue in next Tile/Lane/Barcode/Sample/Project: - event = xmlparser.nextTag(); - } else if (event == XMLStreamConstants.END_ELEMENT && xmlparser.getLocalName().equals("Tile")) - { - curtilenumber = Double.NaN; - event = xmlparser.nextTag(); - - // concerning finish of reading in XML or hit upon error due XML content: - } else if (event == XMLStreamConstants.END_ELEMENT && xmlparser.getLocalName().equals("Stats")) - { - // this final part of while loop is just for analyzing potential errors, but - // could be removed and changed in: while xmlparser.getLocalName() != 'Stats' - doimport = false; - } else - { - doimport = false; - System.out.println("Warning: Different XML structure than expectet. Got event: " + event); - } - } - xmlparser.close(); - - } catch (FileNotFoundException | XMLStreamException e) - { - System.out.println("OCCURRED EXCEPTION " + e.toString()); - e.printStackTrace(); - } catch (IllegalArgumentException e) - { - System.out.println("OCCURRED EXCEPTION " + e.toString()); - e.printStackTrace(); - } catch (Exception e) - { // catch any other exception - System.out.println("OCCURRED EXCEPTION " + e.toString()); - e.printStackTrace(); - } finally - { // anyway adapt statistics and return output (It would be empty list due to constructor of this object) - // Statistics 2nd step: adapt single sample's statistics including entire list of samples - for (Statistics s : samplestatisticslist) - s.adaptStatisticsWithRespectToAllSamples(samplestatisticslist); - } - return samplestatisticslist; - - } - - public LaneStatistics calculateTotalLaneStatistics(ArrayList<Statistics> samplestatisticslist) - { - LaneStatistics laneStats = new LaneStatistics(samplestatisticslist); - laneStats.calculateOverallStats(); - return laneStats; - } - - // ########################################################## - - public class SampleItem - { - /* - * Object of an item in sample including - the corresponding type Raw or Pf - the index of corresponding Lane, Tile - measured value of - * ClusterCount and values in Lists (w.r.t. Read) of Yield, YieldQ30, QualityScoreSum - */ - - public String Type = ""; - - // Define unknown numerical value. Type double could be exchanged with int, but double is necessary to initialize NaN-value. - public double Lane = Double.NaN; - - public double Tile = Double.NaN; - - public double ClusterCount = Double.NaN; - - // Define unknown ArrayList of numerical values with changeable List size. Type Double(object) instead of double(primitive) is necessary in - // Lists. - public List<Double> YieldList = new ArrayList<Double>(); - - public List<Double> YieldQ30List = new ArrayList<Double>(); - - public List<Double> QualityScoreSumList = new ArrayList<Double>(); - - public String toString() - { - return "Type: " + this.Type + ", Lane: " + (long) this.Lane + ", Tile: " + (long) this.Tile - + ", ClusterCount: " + (long) this.ClusterCount + ", YieldList: " + this.YieldList - + ", YieldQ30List: " + this.YieldQ30List + ", QualityScoreSumList: " + this.QualityScoreSumList; - } - - } - - // ########################################################## - - public class Sample - { - /* - * Object of an entire sample including - the name of Flowcell, Project, Sample, Barcode - the list of Raw and Pf SampleItem-Objects - */ - - public String Flowcell = ""; - - public String Project = ""; - - public String Sample = ""; - - public String Barcode = ""; - - // Define unknown ArrayList of SampleItems: - public List<SampleItem> RawList = new ArrayList<SampleItem>(); - - public List<SampleItem> PfList = new ArrayList<SampleItem>(); - - public String toString() - { - return "Flowcell: " + this.Flowcell + ", Project: " + this.Project + ", Sample: " + this.Sample + ", Barcode: " + this.Barcode - + ", RawList: " + this.RawList + ", PfList: " + this.PfList; - } - - } - - // ########################################################## - - public class Statistics extends Sample - { - /* - * Object of Statistics within one single sample inherited from Sample-Object - */ - - public double Sum_RawClusterCount = Double.NaN; // obvious double, but could be turned into int - - public double Sum_PfClusterCount = Double.NaN; // obvious double, but could be turned into int - - public double Sum_RawYield = Double.NaN; - - public double Sum_PfYield = Double.NaN; - - public double Sum_RawYieldQ30 = Double.NaN; - - public double Sum_PfYieldQ30 = Double.NaN; - - public double Sum_RawQualityScoreSum = Double.NaN; - - public double Sum_PfQualityScoreSum = Double.NaN; - - public double Mega_RawYield = Double.NaN; // obvious double, but could be turned into int - - public double Mega_PfYield = Double.NaN; // obvious double, but could be turned into int - - public double Percentage_PfYield_RawYield = Double.NaN; - - public double Percentage_PfYieldQ30_PfYield = Double.NaN; - - public double Fraction_PfQualityScoreSum_PfYield = Double.NaN; - - public double Percentage_PfClusterCount_RawClusterCount = Double.NaN; - - public double Percentage_RawClusterCount_AllRawClusterCounts = Double.NaN; - - public Statistics(Sample sample) - { - /* - * Constructor of derived class Initialization: Already initialized Sample-Object is necessary argument. - */ - - super(); - Flowcell = sample.Flowcell; - Project = sample.Project; - Sample = sample.Sample; - Barcode = sample.Barcode; - RawList = sample.RawList; - PfList = sample.PfList; - - if (RawList.size() > 0) - Sum_RawClusterCount = 0; - for (SampleItem s : RawList) - Sum_RawClusterCount += s.ClusterCount; - if (PfList.size() > 0) - Sum_PfClusterCount = 0; - for (SampleItem s : PfList) - Sum_PfClusterCount += s.ClusterCount; - if (RawList.size() > 0) - Sum_RawYield = 0; - for (SampleItem s : RawList) - for (double d : s.YieldList) - Sum_RawYield += d; - if (PfList.size() > 0) - Sum_PfYield = 0; - for (SampleItem s : PfList) - for (double d : s.YieldList) - Sum_PfYield += d; - if (RawList.size() > 0) - Sum_RawYieldQ30 = 0; - for (SampleItem s : RawList) - for (double d : s.YieldQ30List) - Sum_RawYieldQ30 += d; - if (PfList.size() > 0) - Sum_PfYieldQ30 = 0; - for (SampleItem s : PfList) - for (double d : s.YieldQ30List) - Sum_PfYieldQ30 += d; - if (RawList.size() > 0) - Sum_RawQualityScoreSum = 0; - for (SampleItem s : RawList) - for (double d : s.QualityScoreSumList) - Sum_RawQualityScoreSum += d; - if (PfList.size() > 0) - Sum_PfQualityScoreSum = 0; - for (SampleItem s : PfList) - for (double d : s.QualityScoreSumList) - Sum_PfQualityScoreSum += d; - // Mega_RawYield = calculate_MegaUnit(Sum_RawYield); - // Mega_PfYield = calculate_MegaUnit(Sum_PfYield); - - Mega_RawYield = Sum_RawYield; - Mega_PfYield = Sum_PfYield; - - Percentage_PfYield_RawYield = calculate_Percentage(Sum_PfYield, Sum_RawYield); - Percentage_PfYieldQ30_PfYield = calculate_Percentage(Sum_PfYieldQ30, Sum_PfYield); - Fraction_PfQualityScoreSum_PfYield = calculate_Fraction(Sum_PfQualityScoreSum, Sum_PfYield); - Percentage_PfClusterCount_RawClusterCount = calculate_Percentage(Sum_PfClusterCount, Sum_RawClusterCount); - // Calculation of attribute "Percentage_RawClusterCount_AllRawClusterCounts" needs statistics of all other included samples. => After - // initializing this object, apply method: adaptStatisticsWithRespectToAllSamples(statisticslist) - } - - public String toString() - { - return "Flowcell: " + this.Flowcell + ", Project: " + this.Project + ", Sample: " + this.Sample + ", Barcode: " + this.Barcode - + ", Raw Clusters: " + (long) this.Sum_RawClusterCount + ", Mbases Raw Yield: " + this.Mega_RawYield - + ", % Raw Clusters overall: " + this.Percentage_RawClusterCount_AllRawClusterCounts - + ", Pf Clusters: " + (long) this.Sum_PfClusterCount + ", Mbases Pf Yield: " + this.Mega_PfYield - + ", % PfYield/RawYield: " + this.Percentage_PfYield_RawYield - + ", % PfYieldQ30/PfYield: " + this.Percentage_PfYieldQ30_PfYield - + ", Mean Pf Quality Score: " + this.Fraction_PfQualityScoreSum_PfYield - + ", % Passes Filtering: " + this.Percentage_PfClusterCount_RawClusterCount; - } - - public void adaptStatisticsWithRespectToAllSamples(List<Statistics> statisticslist) - { - /* - * This Statistics-Object (corresponding to one sample) is adapted by employing a list of Statistics-Objects corresponding to all samples - * influencing the statistics of single sample. Input: statisticslist contains all Statistics-Objects - */ - if (statisticslist.size() == 0) - { // here it additionally should be checked, if calling object is included ... - Percentage_RawClusterCount_AllRawClusterCounts = Double.NaN; - String errormessage = - "INPUT ARGUMENT statisticslist MUST BE LIST OF Statistics OBJECTS INCLUDING THE CALLING OBJECT IN METHOD adaptStatisticsWithRespectToAllSamples!"; - // System.out.println(errormessage); - throw new IllegalArgumentException(errormessage); // Exception reasonable since otherwise wrong results. - } else - { - double sum_allrawclustercounts = 0; - for (Statistics s : statisticslist) - sum_allrawclustercounts += s.Sum_RawClusterCount; - Percentage_RawClusterCount_AllRawClusterCounts = calculate_Percentage(Sum_RawClusterCount, sum_allrawclustercounts); - } - } - - public double calculate_MegaUnit(double x) - { - double z; - if (x == Double.POSITIVE_INFINITY || x == Double.NEGATIVE_INFINITY || Double.isNaN(x)) - { - z = Double.NaN; - String errormessage = - "INPUT ARGUMENT WAS UNREASONABLE IN METHOD calculate_MegaUnit! x = " + x + " (Values were in Sample " + Sample + ")"; - // System.out.println(errormessage); - // throw new IllegalArgumentException(errormessage); - } else - { - z = x / 1000000; - } - return z; - } - - public double calculate_Percentage(double x, double y) - { - double z = x / y; - if (z == Double.POSITIVE_INFINITY || z == Double.NEGATIVE_INFINITY || Double.isNaN(z)) - { - z = Double.NaN; - String errormessage = - "INPUT ARGUMENT WAS UNREASONABLE IN METHOD calculate_Percentage! x = " + x + ", y = " + y + " (Values were in Sample " - + Sample + ")"; - // System.out.println(errormessage); - // throw new IllegalArgumentException(errormessage); - } else - { - z = 100 * z; - } - return z; - } - - public double calculate_Fraction(double x, double y) - { - double z = x / y; - if (z == Double.POSITIVE_INFINITY || z == Double.NEGATIVE_INFINITY || Double.isNaN(z)) - { - z = Double.NaN; - String errormessage = - "INPUT ARGUMENT WAS UNREASONABLE IN METHOD calculate_Fraction! x = " + x + ", y = " + y + " (Values were in Sample " - + Sample + ")"; - // System.out.println(errormessage); - // throw new IllegalArgumentException(errormessage); - } - return z; - } - - public double roundspecific(double x, int places) - { - double z; - if (places < 0 || places > 13 || x == Double.POSITIVE_INFINITY || x == Double.NEGATIVE_INFINITY || Double.isNaN(x)) - { - z = Double.NaN; - String errormessage = - "INPUT ARGUMENT WAS UNREASONABLE IN METHOD roundspecific! x = " + x + ", places = " + places + " (Values were in Sample " - + Sample + ")"; - // System.out.println(errormessage); - // throw new IllegalArgumentException(errormessage); - } else - { - double factor = Math.pow(10, places); - z = Math.round(x * factor); - z = z / factor; - } - return z; - } - - } - - public class LaneStatistics - { - /* - * Total Lane Statistics - */ - public ArrayList<Statistics> statisticsList; - - public double Sum_RawClusterCount = 0.0; - - public double Sum_PfClusterCount = 0.0; - - public double Sum_RawYield = 0.0; - - public double Sum_PfYield = 0.0; - - public double Sum_RawYieldQ30 = 0.0; - - public double Sum_PfYieldQ30 = 0.0; - - public double Sum_RawQualityScoreSum = 0.0; - - public double Sum_PfQualityScoreSum = 0.0; - - public double Percentage_PfYield_RawYield = 0.0; - - public double Percentage_PfYieldQ30_PfYield = 0.0; - - public double Fraction_PfQualityScoreSum_PfYield = 0.0; - - public double Percentage_PfClusterCount_RawClusterCount = 0.0; - - public double Percentage_RawClusterCount_AllRawClusterCounts = 0.0; - - public double Clusters_PfWithoutNoindex = 0.0; - - public LaneStatistics(ArrayList<Statistics> statisticsList) - { - this.statisticsList = statisticsList; - } - - public void calculateOverallStats() - { - - int sampleNumber = statisticsList.size(); - - for (Statistics s : statisticsList) - { - if (!s.Barcode.equals("unknown")) - { - System.out.println("BARCODE " + s.Barcode); - this.Clusters_PfWithoutNoindex += s.Sum_PfClusterCount; - System.out.println(s.Sum_PfClusterCount); - } - - this.Sum_RawClusterCount += s.Sum_RawClusterCount; - this.Sum_PfClusterCount += s.Sum_PfClusterCount; - this.Sum_RawYield += s.Sum_RawYield; - this.Sum_PfYield += s.Sum_PfYield; - this.Sum_RawYieldQ30 += s.Sum_RawYieldQ30; - this.Sum_PfYieldQ30 += s.Sum_PfYieldQ30; - this.Sum_RawQualityScoreSum += s.Sum_RawQualityScoreSum; - this.Sum_PfQualityScoreSum += s.Sum_PfQualityScoreSum; - this.Percentage_PfYield_RawYield += s.Percentage_PfYield_RawYield; - this.Percentage_PfYieldQ30_PfYield += s.Percentage_PfYieldQ30_PfYield; - this.Percentage_PfClusterCount_RawClusterCount += s.Percentage_PfClusterCount_RawClusterCount; - this.Fraction_PfQualityScoreSum_PfYield += s.Fraction_PfQualityScoreSum_PfYield; - } - this.Sum_RawQualityScoreSum = this.Sum_RawQualityScoreSum / sampleNumber; - this.Sum_PfQualityScoreSum = this.Sum_PfQualityScoreSum / sampleNumber; - this.Percentage_PfYield_RawYield = this.Percentage_PfYield_RawYield / sampleNumber; - this.Percentage_PfYieldQ30_PfYield = this.Percentage_PfYieldQ30_PfYield / (double) sampleNumber; - this.Percentage_PfClusterCount_RawClusterCount = this.Percentage_PfClusterCount_RawClusterCount / (double) sampleNumber; - this.Fraction_PfQualityScoreSum_PfYield = this.Fraction_PfQualityScoreSum_PfYield / (double) sampleNumber; - } - - public String toString() - { - return "Sum_RawClusterCount " + this.Sum_RawClusterCount + " Sum_PfClusterCount" + this.Sum_PfClusterCount + - " Percentage_PfYieldQ30_PfYield " + this.Percentage_PfYieldQ30_PfYield; - } - } -} \ No newline at end of file diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/2/dss/drop-boxes/read-demultiplex-stats-nextseq/read_demultiplex_statsTest.java b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/2/dss/drop-boxes/read-demultiplex-stats-nextseq/read_demultiplex_statsTest.java deleted file mode 100644 index bc409770abff681616c7b2fd983db4769ca8d21a..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/2/dss/drop-boxes/read-demultiplex-stats-nextseq/read_demultiplex_statsTest.java +++ /dev/null @@ -1,64 +0,0 @@ -import java.util.ArrayList; -import java.util.HashMap; - -import static org.testng.AssertJUnit.assertEquals; - -public class read_demultiplex_statsTest { - - private String XMLfile = - "/Users/kohleman/Documents/workspace/datastore_server/targets/read-demultiplex-stats-nextseq/" + - "150724_J00121_0017_AH2VYMBBXX.sv/ConversionStats.xml"; - - - @org.testng.annotations.BeforeMethod - public void setUp() throws Exception { - } - - @org.testng.annotations.AfterMethod - public void tearDown() throws Exception { - - } - - @org.testng.annotations.Test - public void testImportXmlAndCalculateStatistics() throws Exception { - ArrayList<read_demultiplex_stats.Statistics> stat = read_demultiplex_stats.importXmlAndCalculateStatistics(XMLfile); - assertEquals(stat.size(), 39); - read_demultiplex_stats.Statistics eigth_element = stat.get(8); - assertEquals(eigth_element.Flowcell, "H2VYMBBXX"); - assertEquals(eigth_element.Barcode, "GCCAATA"); - assertEquals(eigth_element.Sum_RawClusterCount.intValue(), 27850973); - assertEquals(eigth_element.Sum_RawYield, 8.410993846E9); - assertEquals(eigth_element.Percentage_PfYieldQ30_PfYield, 87.6792784423112); - assertEquals(eigth_element.Fraction_PfQualityScoreSum_PfYield, 37.40267477898711); - assertEquals(eigth_element.Percentage_RawClusterCount_AllRawClusterCounts, 5.770060255141701); - } - - @org.testng.annotations.Test - public void testImportXmlAndCalculateStatistics_overall() throws Exception { - ArrayList<read_demultiplex_stats.Statistics> stat = read_demultiplex_stats.importXmlAndCalculateStatistics(XMLfile); - - Double percentage = 0.0; - for (read_demultiplex_stats.Statistics element : stat) { - if (element.Lane.equals(6)) { - percentage += element.Percentage_RawClusterCount_AllRawClusterCounts; - } - } - assertEquals(100.0, (double)Math.round(percentage * 1000) / 1000); - - } - - @org.testng.annotations.Test - public void testCalculateTotalLaneStatistics() throws Exception { - ArrayList<read_demultiplex_stats.Statistics> stat = - read_demultiplex_stats.importXmlAndCalculateStatistics(XMLfile); - - HashMap<Integer, read_demultiplex_stats.LaneStatistics> lanesStatistics = - read_demultiplex_stats.calculateTotalLaneStatistics(stat); - - read_demultiplex_stats.LaneStatistics lane2 = lanesStatistics.get(2); - assertEquals(lane2.Sum_RawClusterCount, 4.826808E8); - assertEquals(lane2.Sum_PfClusterCount.intValue(), 332293484); - assertEquals(lane2.Percentage_PfYieldQ30_PfYield, 86.14969791102051); - assertEquals(lane2.Percentage_PfClusterCount_RawClusterCount, 92.63902299583091); - } -} \ No newline at end of file diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/2/dss/drop-boxes/read-demultiplex-stats-nextseq/start_read_demultiplex_stats.java b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/2/dss/drop-boxes/read-demultiplex-stats-nextseq/start_read_demultiplex_stats.java deleted file mode 100644 index be097bcc3ede0eb484e8078c129b98bf08b9f9c8..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/2/dss/drop-boxes/read-demultiplex-stats-nextseq/start_read_demultiplex_stats.java +++ /dev/null @@ -1,21 +0,0 @@ -import java.util.ArrayList; -import java.util.HashMap; - -public class start_read_demultiplex_stats { - - public static void main(String[] args) { - - String XMLfile = - "/Users/kohleman/Documents/workspace/datastore_server/targets/read-demultiplex-stats-nextseq/" + - "150724_J00121_0017_AH2VYMBBXX.sv/ConversionStats.xml"; - ArrayList<read_demultiplex_stats.Statistics> stat = null; - try { - stat = read_demultiplex_stats.importXmlAndCalculateStatistics(XMLfile); - } catch (Exception e) { - e.printStackTrace(); - } - HashMap<Integer, read_demultiplex_stats.LaneStatistics> ls = read_demultiplex_stats.calculateTotalLaneStatistics(stat); -// System.out.println(stat); -// System.out.println(ls); - } -} diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/2/dss/drop-boxes/read-json/plugin.properties b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/2/dss/drop-boxes/read-json/plugin.properties deleted file mode 100644 index 98a7c8ff001686f2346f11fef2462c8402f626d6..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/2/dss/drop-boxes/read-json/plugin.properties +++ /dev/null @@ -1,6 +0,0 @@ -incoming-dir = ${incoming-root-dir}/read-json -incoming-data-completeness-condition = marker-file -top-level-data-set-handler = ch.systemsx.cisd.etlserver.registrator.api.v2.JythonTopLevelDataSetHandlerV2 -script-path = read-json.py -storage-processor = ch.systemsx.cisd.etlserver.DefaultStorageProcessor -jython-version=2.7 diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/2/dss/drop-boxes/read-json/read-json.py b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/2/dss/drop-boxes/read-json/read-json.py deleted file mode 100644 index dac56d3206ca1ec371e8371ecccdf5cd0fd34a4c..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/2/dss/drop-boxes/read-json/read-json.py +++ /dev/null @@ -1,96 +0,0 @@ -''' -@copyright: -2016 ETH Zuerich, SIS - -@license: -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - -http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. - -@author: -Manuel Kohler -''' - -import re -import glob -import os -from itertools import islice -from ch.systemsx.cisd.openbis.generic.shared.api.v1.dto import SearchCriteria - -# The following module is located in the path defined in the datastore_server.conf -# Look for: -Dpython.path} -from gfb_utils import * - -import json - - -def get_json_from_file(file): - with open(file, 'r') as f: - read_json = f.read() - return json.loads(read_json)[0] - -def get_lane_count(json_string): - return int(json_string['lanecount']) - - -def get_flowcell_id(json_string): - return json_string['name'] - - -def register_in_openbis(transaction, json_string): - lane_count = get_lane_count(json_string) - flowcell_id = get_flowcell_id(json_string) - - found_flow_cell = search_unique_sample(transaction, flowcell_id) - search_service = transaction.getSearchService() - - flowcell = found_flow_cell[0] - - get_flowcell_with_contained_samples = search_service.getSample(flowcell.getSampleIdentifier()) - flowlanes = get_flowcell_with_contained_samples.getContainedSamples() - for lane in flowlanes: - mutable_lane = transaction.getSampleForUpdate(lane.getSampleIdentifier()) - lane_number = lane.getCode().split(":")[-1] - - try: - aligned_mean = json_string['cluster_lane_dict'][str(lane_number)]['aligned'][0]['mean'] - except KeyError: - print ("Problem occurred with aligned value for PhiX") - aligned_mean = -1 - - try: - cluster_density_mean = json_string['cluster_lane_dict'][str(lane_number)]['clusterDensity'][0]['mean'] - except KeyError: - print ("Problem occurred with cluster density") - cluster_density_mean = -1 - - try: - error_rate_mean = json_string['error_metrics'][str(lane_number)]['mean'] - except KeyError: - print ("Problem occurred with error rate") - error_rate_mean = -1 - - mutable_lane.setPropertyValue("PERC_PHIX_ALIGNED", str(aligned_mean)) - mutable_lane.setPropertyValue("CLUSTER_DENSITY", str(cluster_density_mean)) - mutable_lane.setPropertyValue("ERROR_RATE", str(error_rate_mean)) - - -def process(transaction): - incoming = transaction.getIncoming() - incoming_path = incoming.getAbsolutePath() - - json_file = glob.glob(os.path.join(incoming_path, "*.json")) - - if json_file: - json_string = get_json_from_file(json_file[0]) - register_in_openbis(transaction, json_string) - else: - print("No json file found!") \ No newline at end of file diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/2/dss/drop-boxes/read-rta-timestamp/plugin.properties b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/2/dss/drop-boxes/read-rta-timestamp/plugin.properties deleted file mode 100644 index 2c8f40225a20a6f5d644035354094806260e4a52..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/2/dss/drop-boxes/read-rta-timestamp/plugin.properties +++ /dev/null @@ -1,12 +0,0 @@ -# -# Drop box for registering a flow cell output as a data set -# -# Variables: -# incoming-root-dir -# Path to the directory which contains incoming directories for drop boxes. -incoming-dir = ${incoming-root-dir}/read-rta-timestamp -incoming-data-completeness-condition = marker-file -top-level-data-set-handler = ch.systemsx.cisd.etlserver.registrator.api.v2.JythonTopLevelDataSetHandlerV2 -script-path = read-rta-timestamp.py -storage-processor = ch.systemsx.cisd.etlserver.DefaultStorageProcessor -jython-version=2.7 \ No newline at end of file diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/2/dss/drop-boxes/read-rta-timestamp/read-rta-timestamp.py b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/2/dss/drop-boxes/read-rta-timestamp/read-rta-timestamp.py deleted file mode 100644 index 88851e92cc5e11d69455944a44814141fff18fda..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/2/dss/drop-boxes/read-rta-timestamp/read-rta-timestamp.py +++ /dev/null @@ -1,67 +0,0 @@ -''' -@copyright: -2015 ETH Zuerich, SIS - -@license: -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - -http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. - -@description: -Reads out the timestamp of the RTAComplete.txt file to register the timestamp in openBIS - -@note: -print statements go to: <openBIS_HOME>/datastore_server/log/startup_log.txt - -@author: -Manuel Kohler -''' - -import os -import sys -import shutil -from time import * -from datetime import * -from ch.systemsx.cisd.openbis.generic.shared.api.v1.dto import SearchCriteria -from os.path import basename - -# The following module is located in the path defined in the datastore_server.conf -# Look for: -Dpython.path} -from gfb_utils import * - -MARKER_RUN_COMPLETE = 'RTAComplete.txt' - -def process(transaction): - - print "HELLO PATH: " + str(sys.path) - - incoming = transaction.getIncoming() - incoming_path = incoming.getAbsolutePath() - run_id = incoming.getName() - model = get_model(run_id) - - thread_property_dict = get_thread_properties(transaction) - absolutePath = os.path.dirname(os.path.realpath(thread_property_dict['script-path'])) - print(basename(absolutePath) + ": Auto-detected Illumina model: " + model) - - run_date, sequencer_id, running_number, tray_and_fcId = run_id.split("_") - tray = tray_and_fcId[0] - if model in [Sequencers.MISEQ]: - fc_id = tray_and_fcId - else: - fc_id = tray_and_fcId[1:] - - marker_file = os.path.join(incoming_path, MARKER_RUN_COMPLETE) - - found_samples = search_unique_sample(transaction, fc_id) - - sa = transaction.getSampleForUpdate(found_samples[0].getSampleIdentifier()) - sa.setPropertyValue("SEQUENCER_FINISHED", create_openbis_timestamp(marker_file)) diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/2/dss/drop-boxes/register-fastqc/plugin.properties b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/2/dss/drop-boxes/register-fastqc/plugin.properties deleted file mode 100644 index 86752d6d27de0fee48902c1930b01d8cd83f71b6..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/2/dss/drop-boxes/register-fastqc/plugin.properties +++ /dev/null @@ -1,6 +0,0 @@ -incoming-dir = ${incoming-root-dir}/register-fastqc -incoming-data-completeness-condition = marker-file -top-level-data-set-handler = ch.systemsx.cisd.etlserver.registrator.api.v2.JythonTopLevelDataSetHandlerV2 -script-path = register-fastqc.py -storage-processor = ch.systemsx.cisd.etlserver.DefaultStorageProcessor -jython-version=2.7 \ No newline at end of file diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/2/dss/drop-boxes/register-fastqc/register-fastqc.py b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/2/dss/drop-boxes/register-fastqc/register-fastqc.py deleted file mode 100644 index 7efc89630a5d8bfa32a77e2f8c7b7bd090c10650..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/2/dss/drop-boxes/register-fastqc/register-fastqc.py +++ /dev/null @@ -1,54 +0,0 @@ -''' -@copyright: -2015 ETH Zuerich, SIS - -@license: -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - -http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. - -@note -print statements go to: <openBIS_HOME>/datastore_server/log/startup_log.txt - -@author: -Manuel Kohler -''' - -# The following module is located in the path defined in the datastore_server.conf -# Look for: -Dpython.path} -from gfb_utils import * - - -def process(transaction): - - incomingPath = transaction.getIncoming().getPath() - incomingFolder = transaction.getIncoming().getName() - - split = incomingFolder.split("_") - - if (len(split) == 2): - flow_cell, flow_lane = incomingFolder.split("_") - elif (len(split) == 3): - flow_cell = "-".join([split[0], split[1]]) - flow_lane = split[-1] - - connected_sample_code = ":".join([flow_cell, flow_lane]) - connected_sample = search_unique_sample(transaction, connected_sample_code) - - dataSet = transaction.createNewDataSet("FASTQC") - dataSet.setMeasuredData(False) - - dataSet.setSample(connected_sample[0]) - - sa = transaction.getSampleForUpdate(connected_sample[0].getSampleIdentifier()) - sa.setPropertyValue("DATA_TRANSFERRED", create_openbis_timestamp_now()) - - transaction.moveFile(incomingPath, dataSet) diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/2/dss/drop-boxes/register-flowcell/plugin.properties b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/2/dss/drop-boxes/register-flowcell/plugin.properties deleted file mode 100644 index 82d34c7fd9fa6be9a84252b453ee480fd32a41fa..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/2/dss/drop-boxes/register-flowcell/plugin.properties +++ /dev/null @@ -1,6 +0,0 @@ -incoming-dir = ${incoming-root-dir}/register-flowcell -incoming-data-completeness-condition = marker-file -top-level-data-set-handler = ch.systemsx.cisd.etlserver.registrator.api.v2.JythonTopLevelDataSetHandlerV2 -script-path = register-flowcell.py -storage-processor = ch.systemsx.cisd.etlserver.DefaultStorageProcessor -jython-version=2.7 diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/2/dss/drop-boxes/register-flowcell/register-flowcell.py b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/2/dss/drop-boxes/register-flowcell/register-flowcell.py deleted file mode 100644 index 65ccad87004229cc29eabe603226061e2bd80f2e..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/2/dss/drop-boxes/register-flowcell/register-flowcell.py +++ /dev/null @@ -1,107 +0,0 @@ -''' -@copyright: -2015 ETH Zuerich, SIS - -@license: -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - -http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. - -@description: -Registers an incoming directory as a data set in openBIS. The name of the directory is used to -search for the matching sample. - -@note: -print statements go to: <openBIS_HOME>/datastore_server/log/startup_log.txt - -@author: -Manuel Kohler -''' - -import re -import glob -import os -from itertools import islice -from ch.systemsx.cisd.openbis.generic.shared.api.v1.dto import SearchCriteria - -# The following module is located in the path defined in the datastore_server.conf -# Look for: -Dpython.path} -from gfb_utils import * - -ILLUMINA_HISEQ_OUTPUT_DS_TYPE = "ILLUMINA_HISEQ_OUTPUT" -ILLUMINA_MISEQ_OUTPUT_DS_TYPE = "ILLUMINA_MISEQ_OUTPUT" -ILLUMINA_NEXTSEQ_OUTPUT_DS_TYPE = "ILLUMINA_NEXTSEQ_OUTPUT" - - -def get_bcl_version(file): - pattern = re.compile("bcl2fastq") - matching_line_list = [] - bcl_version = "Not specified" - number_of_lines_to_read = 3 - - if file: - with open(file[0]) as nohup: - head = list(islice(nohup, number_of_lines_to_read)) - for line in head: - if re.search(pattern, line): - matching_line_list.append(line) - else: - print("File " + str(file) + " not found!") - - if matching_line_list: - bcl_version = matching_line_list[0].strip() - print("GOT BCL2FASTQ Version: " + bcl_version) - return bcl_version - - -def process(transaction): - incoming = transaction.getIncoming() - incoming_path = incoming.getAbsolutePath() - run_id = incoming.getName() - model = get_model(run_id) - - if model in HISEQ_LIST: - DATASET_TYPE = ILLUMINA_HISEQ_OUTPUT_DS_TYPE - elif model in [Sequencers.NEXTSEQ_500]: - DATASET_TYPE = ILLUMINA_NEXTSEQ_OUTPUT_DS_TYPE - elif model in [Sequencers.MISEQ]: - DATASET_TYPE = ILLUMINA_MISEQ_OUTPUT_DS_TYPE - else: - print("Could set a data set type for flowcell data!") - - thread_property_dict = get_thread_properties(transaction) - absolutePath = os.path.dirname(os.path.realpath(thread_property_dict['script-path'])) - print(os.path.basename(absolutePath) + ": Auto-detected Illumina model: " + model) - - run_date, sequencer_id, running_number, tray_and_fcId = run_id.split("_") - tray = tray_and_fcId[0] - if model in [Sequencers.MISEQ]: - fc_id = tray_and_fcId - else: - fc_id = tray_and_fcId[1:] - - file = glob.glob(os.path.join(incoming_path, "nohup*")) - bcl_version = get_bcl_version(file) - - found_flow_cell = search_unique_sample(transaction, fc_id) - - search_service = transaction.getSearchService() - get_flowcell_with_contained_samples = search_service.getSample(found_flow_cell[0].getSampleIdentifier()) - flowlanes = get_flowcell_with_contained_samples.getContainedSamples() - - for lane in flowlanes: - mutable_lane = transaction.getSampleForUpdate(lane.getSampleIdentifier()) - mutable_lane.setPropertyValue("BCL_VERSION", bcl_version) - - dataSet = transaction.createNewDataSet(DATASET_TYPE) - dataSet.setMeasuredData(False) - transaction.moveFile(incoming_path, dataSet) - dataSet.setSample(found_flow_cell[0]) diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/2/dss/drop-boxes/register-flowlane/lib/a.out b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/2/dss/drop-boxes/register-flowlane/lib/a.out deleted file mode 100755 index c08fdbaeb8d8411a5ef60e9659dc30f12e6b5ff8..0000000000000000000000000000000000000000 Binary files a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/2/dss/drop-boxes/register-flowlane/lib/a.out and /dev/null differ diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/2/dss/drop-boxes/register-flowlane/lib/crc32 b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/2/dss/drop-boxes/register-flowlane/lib/crc32 deleted file mode 100755 index 7959ca94a1fa61e47c2e4df815bb35fceb7bd809..0000000000000000000000000000000000000000 Binary files a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/2/dss/drop-boxes/register-flowlane/lib/crc32 and /dev/null differ diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/2/dss/drop-boxes/register-flowlane/lib/crc32.sv b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/2/dss/drop-boxes/register-flowlane/lib/crc32.sv deleted file mode 100755 index 7959ca94a1fa61e47c2e4df815bb35fceb7bd809..0000000000000000000000000000000000000000 Binary files a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/2/dss/drop-boxes/register-flowlane/lib/crc32.sv and /dev/null differ diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/2/dss/drop-boxes/register-flowlane/lib/crc32_v2.c b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/2/dss/drop-boxes/register-flowlane/lib/crc32_v2.c deleted file mode 100644 index b38d22d40f641254661994d4cc01492bb7c8d35a..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/2/dss/drop-boxes/register-flowlane/lib/crc32_v2.c +++ /dev/null @@ -1,206 +0,0 @@ -/*----------------------------------------------------------------------------*\ - * CRC-32 version 2.0.0 by Craig Bruce, 2006-04-29. - * - * This program generates the CRC-32 values for the files named in the - * command-line arguments. These are the same CRC-32 values used by GZIP, - * PKZIP, and ZMODEM. The Crc32_ComputeBuf() can also be detached and - * used independently. - * - * THIS PROGRAM IS PUBLIC-DOMAIN SOFTWARE. - * - * Based on the byte-oriented implementation "File Verification Using CRC" - * by Mark R. Nelson in Dr. Dobb's Journal, May 1992, pp. 64-67. - * - * v1.0.0: original release. - * v1.0.1: fixed printf formats. - * v1.0.2: fixed something else. - * v1.0.3: replaced CRC constant table by generator function. - * v1.0.4: reformatted code, made ANSI C. 1994-12-05. - * v2.0.0: rewrote to use memory buffer & static table, 2006-04-29. -\*----------------------------------------------------------------------------*/ - -#include <stdio.h> -#include <stdlib.h> - -/*----------------------------------------------------------------------------*\ - * Local functions -\*----------------------------------------------------------------------------*/ - -static int Crc32_ComputeFile( FILE *file, unsigned long *outCrc32 ); - -static unsigned long Crc32_ComputeBuf( unsigned long inCrc32, const void *buf, - size_t bufLen ); - -/*----------------------------------------------------------------------------*\ - * NAME: - * main() - main function for CRC-32 generation - * DESCRIPTION: - * Computes the CRC-32 value for the set of files named in the command- - * line arguments. - * ARGUMENTS: - * argc - command-line-argument count - * argv - command-line-argument strings - * RETURNS: - * err - 0 on success or executes exit(1) on error - * ERRORS: - * - file errors -\*----------------------------------------------------------------------------*/ - -int main( int argc, const char *argv[] ) -{ - FILE *file = NULL; - const char *filename; - unsigned long argIdx; - unsigned long crc32; - int err; - - /** compute crcs **/ - if (argc < 2) { - /** read from 'stdin' if no arguments given **/ - err = Crc32_ComputeFile( stdin, &crc32 ); - if (err == -1) goto ERR_EXIT; - printf("crc32 = 0x%08lX for (stdin)\n", crc32 ); - } else { - /** report named files in sequence **/ - for (argIdx=1; argIdx < argc; argIdx++) { - filename = argv[argIdx]; - file = fopen( filename, "rb" ); - if (file == NULL) { - fprintf( stderr, "error opening file \"%s\"!\n", filename ); - goto ERR_EXIT; - } - err = Crc32_ComputeFile( file, &crc32 ); - if (err == -1) goto ERR_EXIT; - /*printf("crc32 = 0x%08lX for \"%s\"\n", crc32, filename );*/ - printf("%08lX", crc32); - err = fclose( file ); - file = NULL; - if (err == EOF) { - fprintf( stderr, "error closing file \"%s\"!\n", filename ); - goto ERR_EXIT; - } - } - } - return( 0 ); - - /** error exit **/ -ERR_EXIT: - if (file != NULL) fclose( file ); - exit( 1 ); -} - -/*----------------------------------------------------------------------------*\ - * NAME: - * Crc32_ComputeFile() - compute CRC-32 value for a file - * DESCRIPTION: - * Computes the CRC-32 value for an opened file. - * ARGUMENTS: - * file - file pointer - * outCrc32 - (out) result CRC-32 value - * RETURNS: - * err - 0 on success or -1 on error - * ERRORS: - * - file errors -\*----------------------------------------------------------------------------*/ - -static int Crc32_ComputeFile( FILE *file, unsigned long *outCrc32 ) -{ -# define CRC_BUFFER_SIZE 8192 - unsigned char buf[CRC_BUFFER_SIZE]; - size_t bufLen; - - /** accumulate crc32 from file **/ - *outCrc32 = 0; - while (1) { - bufLen = fread( buf, 1, CRC_BUFFER_SIZE, file ); - if (bufLen == 0) { - if (ferror(file)) { - fprintf( stderr, "error reading file\n" ); - goto ERR_EXIT; - } - break; - } - *outCrc32 = Crc32_ComputeBuf( *outCrc32, buf, bufLen ); - } - return( 0 ); - - /** error exit **/ -ERR_EXIT: - return( -1 ); -} - -/*----------------------------------------------------------------------------*\ - * NAME: - * Crc32_ComputeBuf() - computes the CRC-32 value of a memory buffer - * DESCRIPTION: - * Computes or accumulates the CRC-32 value for a memory buffer. - * The 'inCrc32' gives a previously accumulated CRC-32 value to allow - * a CRC to be generated for multiple sequential buffer-fuls of data. - * The 'inCrc32' for the first buffer must be zero. - * ARGUMENTS: - * inCrc32 - accumulated CRC-32 value, must be 0 on first call - * buf - buffer to compute CRC-32 value for - * bufLen - number of bytes in buffer - * RETURNS: - * crc32 - computed CRC-32 value - * ERRORS: - * (no errors are possible) -\*----------------------------------------------------------------------------*/ - -static unsigned long Crc32_ComputeBuf( unsigned long inCrc32, const void *buf, - size_t bufLen ) -{ - static const unsigned long crcTable[256] = { - 0x00000000,0x77073096,0xEE0E612C,0x990951BA,0x076DC419,0x706AF48F,0xE963A535, - 0x9E6495A3,0x0EDB8832,0x79DCB8A4,0xE0D5E91E,0x97D2D988,0x09B64C2B,0x7EB17CBD, - 0xE7B82D07,0x90BF1D91,0x1DB71064,0x6AB020F2,0xF3B97148,0x84BE41DE,0x1ADAD47D, - 0x6DDDE4EB,0xF4D4B551,0x83D385C7,0x136C9856,0x646BA8C0,0xFD62F97A,0x8A65C9EC, - 0x14015C4F,0x63066CD9,0xFA0F3D63,0x8D080DF5,0x3B6E20C8,0x4C69105E,0xD56041E4, - 0xA2677172,0x3C03E4D1,0x4B04D447,0xD20D85FD,0xA50AB56B,0x35B5A8FA,0x42B2986C, - 0xDBBBC9D6,0xACBCF940,0x32D86CE3,0x45DF5C75,0xDCD60DCF,0xABD13D59,0x26D930AC, - 0x51DE003A,0xC8D75180,0xBFD06116,0x21B4F4B5,0x56B3C423,0xCFBA9599,0xB8BDA50F, - 0x2802B89E,0x5F058808,0xC60CD9B2,0xB10BE924,0x2F6F7C87,0x58684C11,0xC1611DAB, - 0xB6662D3D,0x76DC4190,0x01DB7106,0x98D220BC,0xEFD5102A,0x71B18589,0x06B6B51F, - 0x9FBFE4A5,0xE8B8D433,0x7807C9A2,0x0F00F934,0x9609A88E,0xE10E9818,0x7F6A0DBB, - 0x086D3D2D,0x91646C97,0xE6635C01,0x6B6B51F4,0x1C6C6162,0x856530D8,0xF262004E, - 0x6C0695ED,0x1B01A57B,0x8208F4C1,0xF50FC457,0x65B0D9C6,0x12B7E950,0x8BBEB8EA, - 0xFCB9887C,0x62DD1DDF,0x15DA2D49,0x8CD37CF3,0xFBD44C65,0x4DB26158,0x3AB551CE, - 0xA3BC0074,0xD4BB30E2,0x4ADFA541,0x3DD895D7,0xA4D1C46D,0xD3D6F4FB,0x4369E96A, - 0x346ED9FC,0xAD678846,0xDA60B8D0,0x44042D73,0x33031DE5,0xAA0A4C5F,0xDD0D7CC9, - 0x5005713C,0x270241AA,0xBE0B1010,0xC90C2086,0x5768B525,0x206F85B3,0xB966D409, - 0xCE61E49F,0x5EDEF90E,0x29D9C998,0xB0D09822,0xC7D7A8B4,0x59B33D17,0x2EB40D81, - 0xB7BD5C3B,0xC0BA6CAD,0xEDB88320,0x9ABFB3B6,0x03B6E20C,0x74B1D29A,0xEAD54739, - 0x9DD277AF,0x04DB2615,0x73DC1683,0xE3630B12,0x94643B84,0x0D6D6A3E,0x7A6A5AA8, - 0xE40ECF0B,0x9309FF9D,0x0A00AE27,0x7D079EB1,0xF00F9344,0x8708A3D2,0x1E01F268, - 0x6906C2FE,0xF762575D,0x806567CB,0x196C3671,0x6E6B06E7,0xFED41B76,0x89D32BE0, - 0x10DA7A5A,0x67DD4ACC,0xF9B9DF6F,0x8EBEEFF9,0x17B7BE43,0x60B08ED5,0xD6D6A3E8, - 0xA1D1937E,0x38D8C2C4,0x4FDFF252,0xD1BB67F1,0xA6BC5767,0x3FB506DD,0x48B2364B, - 0xD80D2BDA,0xAF0A1B4C,0x36034AF6,0x41047A60,0xDF60EFC3,0xA867DF55,0x316E8EEF, - 0x4669BE79,0xCB61B38C,0xBC66831A,0x256FD2A0,0x5268E236,0xCC0C7795,0xBB0B4703, - 0x220216B9,0x5505262F,0xC5BA3BBE,0xB2BD0B28,0x2BB45A92,0x5CB36A04,0xC2D7FFA7, - 0xB5D0CF31,0x2CD99E8B,0x5BDEAE1D,0x9B64C2B0,0xEC63F226,0x756AA39C,0x026D930A, - 0x9C0906A9,0xEB0E363F,0x72076785,0x05005713,0x95BF4A82,0xE2B87A14,0x7BB12BAE, - 0x0CB61B38,0x92D28E9B,0xE5D5BE0D,0x7CDCEFB7,0x0BDBDF21,0x86D3D2D4,0xF1D4E242, - 0x68DDB3F8,0x1FDA836E,0x81BE16CD,0xF6B9265B,0x6FB077E1,0x18B74777,0x88085AE6, - 0xFF0F6A70,0x66063BCA,0x11010B5C,0x8F659EFF,0xF862AE69,0x616BFFD3,0x166CCF45, - 0xA00AE278,0xD70DD2EE,0x4E048354,0x3903B3C2,0xA7672661,0xD06016F7,0x4969474D, - 0x3E6E77DB,0xAED16A4A,0xD9D65ADC,0x40DF0B66,0x37D83BF0,0xA9BCAE53,0xDEBB9EC5, - 0x47B2CF7F,0x30B5FFE9,0xBDBDF21C,0xCABAC28A,0x53B39330,0x24B4A3A6,0xBAD03605, - 0xCDD70693,0x54DE5729,0x23D967BF,0xB3667A2E,0xC4614AB8,0x5D681B02,0x2A6F2B94, - 0xB40BBE37,0xC30C8EA1,0x5A05DF1B,0x2D02EF8D }; - unsigned long crc32; - unsigned char *byteBuf; - size_t i; - - /** accumulate crc32 for buffer **/ - crc32 = inCrc32 ^ 0xFFFFFFFF; - byteBuf = (unsigned char*) buf; - for (i=0; i < bufLen; i++) { - crc32 = (crc32 >> 8) ^ crcTable[ (crc32 ^ byteBuf[i]) & 0xFF ]; - } - return( crc32 ^ 0xFFFFFFFF ); -} - -/*----------------------------------------------------------------------------*\ - * END OF MODULE: crc32.c -\*----------------------------------------------------------------------------*/ diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/2/dss/drop-boxes/register-flowlane/plugin.properties b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/2/dss/drop-boxes/register-flowlane/plugin.properties deleted file mode 100644 index 8f519c1de0b7c03a12454965c0d2de47e8184a0e..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/2/dss/drop-boxes/register-flowlane/plugin.properties +++ /dev/null @@ -1,6 +0,0 @@ -incoming-dir = ${incoming-root-dir}/register-flowlane -incoming-data-completeness-condition = marker-file -top-level-data-set-handler = ch.systemsx.cisd.etlserver.registrator.api.v2.JythonTopLevelDataSetHandlerV2 -script-path = register-flowlane.py -storage-processor = ch.systemsx.cisd.etlserver.DefaultStorageProcessor -jython-version=2.7 \ No newline at end of file diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/2/dss/drop-boxes/register-flowlane/register-flowlane.py b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/2/dss/drop-boxes/register-flowlane/register-flowlane.py deleted file mode 100644 index 501a3ee66a3d9d5a124d283a84366b23536c20b9..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/2/dss/drop-boxes/register-flowlane/register-flowlane.py +++ /dev/null @@ -1,477 +0,0 @@ -''' -@copyright: -2016 ETH Zuerich, SIS - -@license: -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - -http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. - -@note: -print statements go to: <openBIS_HOME>/datastore_server/log/startup_log.txt - -@author: -Manuel Kohler -''' - - -import os -import shutil -import re -import sys -import subprocess -import glob -from itertools import islice -from collections import OrderedDict -from ch.systemsx.cisd.openbis.generic.shared.api.v1.dto import SearchCriteria -from java.lang import System; -# The following module is located in the path defined in the datastore_server.conf -# Look for: -Dpython.path} -from gfb_utils import * - -from __builtin__ import file - -FASTQ_GZ_PATTERN = "*.fastq.gz" -METADATA_FILE_SUFFIX = "_metadata.tsv" -INDEX1='BARCODE' -INDEX2='INDEX2' -EXTERNAL_SAMPLE_NAME='EXTERNAL_SAMPLE_NAME' -FASTQ_SAMPLE_CODE = 'FASTQ_SAMPLE_CODE' -INDEXREAD1='INDEXREAD' -INDEXREAD2='INDEXREAD2' -MISMATCH_IN_INDEX='MISMATCH_IN_INDEX' -BCL_VERSION='BCL_VERSION' -SAMPLE_TYPE = 'SAMPLE_TYPE' -SAMPLE_CODE = 'SAMPLE_CODE' -NCBI_ORGANISM_TAXONOMY='NCBI_ORGANISM_TAXONOMY' -PHIX_TAXONOMY_ID='10847' -DEFAULT_INDEX='NoIndex' -CRC32_PATH='lib/crc32' -if System.getProperty('os.name') == 'Mac OS X': - CRC32_PATH='lib/a.out' -NOHUP_REGEX = 'nohup*.txt' -CHECKSUMS_REGEX = 'checksums.txt' -COMMAND_LINE_INVOCATION = 'Command-line invocation' -MISMATCH_REGEX = r'(barcode-mismatches) ([0-9])' -mismatch_dict = {0: 'NONE', 1:'ONE', 2:'TWO'} -MISMATCH_ABREVIATION = "_MM_" - -def get_mismatches(file): - - command_line_regex = re.compile(COMMAND_LINE_INVOCATION) - mismatch_regex = re.compile(MISMATCH_REGEX) - command_line_list = [] - mismatches = 0 - number_of_lines_to_read = 5 - - if file: - with open(file[0]) as nohup: - head = list(islice(nohup, number_of_lines_to_read)) - for line in head: - if re.search(command_line_regex, line): - command_line_list.append(line) - rr = re.search(mismatch_regex, line) - mismatches = int(rr.group().split()[1]) - else: - print("File " + str(file) + " not found!") - return command_line_list, mismatches - - -def mismatch_string_builder (mismatches, file_part_name): - - if mismatches > 0: - mismatch_string = MISMATCH_ABREVIATION + str(mismatches) - else: - mismatch_string = "" - meta_data_file_name = file_part_name + mismatch_string + METADATA_FILE_SUFFIX - return meta_data_file_name - - -def checkOnFileSize(file): - return os.stat(file).st_size == 0 - - -def CRC32_from_file(filename, transaction): - - if checkOnFileSize(filename): - raise Exception("FILE " + filename + " IS EMPTY!") - - threadPropertyDict = get_thread_properties(transaction) - absolutePath = os.path.dirname(os.path.realpath(threadPropertyDict['script-path'])) - fullPathCrc32 = (os.path.join(absolutePath, CRC32_PATH)) - if os.path.exists(fullPathCrc32): - args = [fullPathCrc32, filename] - p = subprocess.Popen(args, stdout=subprocess.PIPE) - cksum = (p.communicate()[0]) - print("Calculated crc32 checksum for: "+ os.path.basename(filename) + " " + cksum) - else: - cksum = 0 & 0xFFFFFFFF - return cksum - - -def writeMetadataFile(transaction, folder_name, meta_data_file_name, sequencing_sample_properties_dict, - fcMetaDataDict, experiment, sample_space, fastqFileList, flowLane, dataSet, flow_lane_sample): - ''' - Writes a file of meta data related to one sample - ''' - - incoming_path = transaction.getIncoming().getAbsolutePath() - - sequencing_sample_properties_list = sequencing_sample_properties_dict.keys() - sequencing_sample_properties_list.sort() - - expId = experiment.getIdentifier() - try: - - - meta_data_file = open(meta_data_file_name,'w') - for propertyType in sequencing_sample_properties_list: - if (propertyType in [u'FLOW_CELL_PROPERTIES']): - continue - if propertyType in [SAMPLE_TYPE] or propertyType in [SAMPLE_CODE]: - meta_data_file.write(propertyType.encode('utf-8') + "\t" + - str(sequencing_sample_properties_dict[propertyType])+ "\n") - else: - meta_data_file.write(propertyType.encode('utf-8') + "\t" + - sequencing_sample_properties_dict[propertyType].encode('utf-8').replace('\n',',') + "\n") - - meta_data_file.write("EXPERIMENT\t" + expId + "\n".encode('utf-8')) - meta_data_file.write("\nFLOWCELL PROPERTIES\n".encode('utf-8')) - fcMetaDataDict["LANE_NUMBER"] = flowLane - keys = fcMetaDataDict.keys() - keys.sort() - - sequencer_vocabulary_description = get_vocabulary_descriptions(transaction, 'SEQUENCER') - meta_data_file.write('SEQUENCER_MODEL' + "\t" + - sequencer_vocabulary_description[fcMetaDataDict['SEQUENCER']].encode('utf-8') + "\n") - - for k in keys: - meta_data_file.write(k.encode('utf-8') + "\t" + fcMetaDataDict[k].encode('utf-8') + "\n") - - meta_data_file.write("\nFASTQ_FILES\n".encode('utf-8')) - - checksums_file = get_file_names(incoming_path, CHECKSUMS_REGEX) - if checksums_file: - with open(checksums_file[0]) as checksums: - for line in checksums: - # Ugly hack :-( - if line.starts_with("Undetermined"): - line = fcMetaDataDict['CODE'] + "_" + line - meta_data_file.write(line) - else: - print("File " + str(checksums_file) + " not found!") - - # Use slow fall back solution - for file in fastqFileList: - print("Using fall back solution for creation of CRC32 checksums") - meta_data_file.write(os.path.basename(file) + "\t" + str(CRC32_from_file(file, transaction)) + "\n") - - meta_data_file.write("\nDATASET PROPERTIES\n".encode('utf-8')) - # Data Set Property: - if fastqFileList: - - meta_data_file.write((MISMATCH_IN_INDEX + "\t" + dataSet.getPropertyValue(MISMATCH_IN_INDEX) + "\n").encode('utf-8')) - meta_data_file.write((BCL_VERSION + "\t" + flow_lane_sample.getPropertyValue(BCL_VERSION)).encode('utf-8')) - except IOError: - print ('File error, could not write '+ file) - finally: - meta_data_file.close() - - destinationFolder = folder_name - extraCopySciCore (transaction, sample_space, meta_data_file_name, destinationFolder) - - -def extraCopySciCore (transaction, sample_space, filePath, destinationFolder=""): - ''' - Handles the extra copies of the data for transfer with datamover for SCICORE - ''' - - dropBoxFolder = '/links/shared/dsu/dss/customers/biozentrum_scicore/drop-box' - if System.getProperty('os.name') == 'Mac OS X': - dropBoxFolder = '/Users/kohleman/tmp/scicore' - - # if a sample is part of this space list then it will be transferred to sciCore - SPACE_WHITELIST = ["DUW_SALZBURGER", "BIOZENTRUM_HANDSCHIN", "BIOZENTRUM_ZAVOLAN", - "BIOZENTRUM_KELLER", "BIOZENTRUM_NIMWEGEN", "BSSE_DBM_BIOZENTRUM_NEUROSTEMX", - "UNI_BASEL_STPH_UTZINGER", "UNI_BASEL_STPH_GAGNEUX", - "BIOZENTRUM_PAPASSOTIROPOULOS_BEERENWINKEL", "BIOZENTRUM_SPANG", - "BIOZENTRUM_JENAL", "UNI_BASEL_CHEMIE_CREUS","UKBB_WELLMANN" - ] - DBM_SPACE_PREFIX = "DBM_" - - basename = os.path.basename(filePath) - - if (sample_space in SPACE_WHITELIST) or sample_space.startswith(DBM_SPACE_PREFIX): - dirname = os.path.join(dropBoxFolder, destinationFolder) - if not os.path.exists(dirname): - os.mkdir(dirname) - print("COPYING " + filePath + " TO SCICORE FOLDER " + dirname) - shutil.copy(filePath, dirname) - #os.chmod(os.path.join(dirname, basename), 0774) - else: - print(sample_space + " not in SPACE_WHITELIST. Sample will not be copied to sciCORE.\n") - - -def get_sample_properties (transaction, sample): - - sample_properties_dict = {} - # returns Map<String, String> - sample_properties = sample.getSample().getProperties() - sequencing_sample_type = sample.getSampleType() - sequencing_sample_code = sample.getCode() - sample_properties_dict[SAMPLE_TYPE] = sequencing_sample_type - sample_properties_dict[SAMPLE_CODE] = sequencing_sample_code - - for property in sample_properties: - code = property.getPropertyType().getSimpleCode() - sample_properties_dict[code] = property.tryGetAsString() - - ordered_sample_properties_dict = OrderedDict(sorted(sample_properties_dict.items(), key=lambda t: t[0])) - return ordered_sample_properties_dict - - -def searchParents (search_service, parents): - - sc = SearchCriteria() - # set the Search Criteria to an OR condition, default is AND - sc.setOperator(SearchCriteria.SearchOperator.MATCH_ANY_CLAUSES) - # Get the codes for all parents - for parent in parents: - parentSubCode = parent.getSubCode() - sc.addMatchClause(SearchCriteria.MatchClause.createAttributeMatch(SearchCriteria.MatchClauseAttribute.CODE, parentSubCode)); - # all parents of the flow lane - foundParents = search_service.searchForSamples(sc) - return foundParents - - -def renameFiles (fastq_files, undetermined, flow_cell_id, mismatches): - - newFastqFileList = [] - for file in fastq_files: - folder = os.path.dirname(file) - fileName = os.path.basename(file) - filepart, suffix = fileName.split('.',1) - if undetermined: - if mismatches > 0: - new_file = folder + "/" + flow_cell_id + '_' + filepart + MISMATCH_ABREVIATION + str(mismatches) + "." + suffix - else: - new_file = folder + "/" + flow_cell_id + '_' + filepart + "." + suffix - print ("Renaming file " + file + " to " + new_file) - os.rename(file, new_file) - else: - if mismatches > 0: - new_file = folder + "/" + filepart + MISMATCH_ABREVIATION + str(mismatches) + "." + suffix - print ("Renaming file " + file + " to " + new_file) - os.rename(file, new_file) - else: - new_file = file - newFastqFileList.append(new_file) - return newFastqFileList - - -def put_files_to_dataset (transaction, dataSet, fastq_files, folder_name, sample_space): - - for file in fastq_files: - print("SAMPLE_SPACE:" + sample_space) - extraCopySciCore (transaction, sample_space, file, folder_name) - transaction.moveFile(file, dataSet, folder_name) - -# ------------------------------------------------------------------------------- - -def split_incoming_folder_name (name): - split=name.split("_") - - # expected incoming Name, e.g.: BSSE_QGF_22266_H0W8YBGXX_1 - if (len(split) == 5): - sample_code = '-'.join([split[0], split[1], split[2]]) - flowCellId = split[3] - flowLane = split[-1] - undetermined = False - - # expected Undetermined_H0W8YBGX_1 - elif (len(split) == 3): - sample_code = '' - flowCellId = split[-2] - flowLane = split[-1] - undetermined = True - - # MiSeq BSSE_QGF_36097_000000000_AH4PH_1 - elif (len(split) == 6): - sample_code = '-'.join([split[0], split[1], split[2]]) - flowCellId = '-'.join([split[3],split[4]]) - flowLane = split[-1] - undetermined = False - - #MiSeq Undetermined_000000000_AH4PH_1 - elif (len(split) == 4): - sample_code = '' - flowCellId = '-'.join([split[1], split[2]]) - flowLane = split[-1] - undetermined = True - else: - print("Expected different naming schema!") - - incoming_sample = flowCellId + ':' + flowLane - return sample_code, flowCellId, flowLane, incoming_sample, undetermined - -# ------------------------------------------------------------------------------- - -def get_vocabulary_descriptions (transaction, vocabulary_name): - vocabulary_descriptions_dict = {} - vocabulary = transaction.getVocabulary(vocabulary_name) - vocabulary_terms = vocabulary.getTerms() - for term in vocabulary_terms: - vocabulary_descriptions_dict[term.getCode()] = term.getDescription() - return vocabulary_descriptions_dict - -# ------------------------------------------------------------------------------- - - -def process_regular_samples(transaction, name, sample_code, flowCellId, flowLane, fastq_files, first_fastq_file, - search_unique_sample, fcMetaDataDict, dataSet, flow_lane_sample, mismatches): - - newFastqFiles = renameFiles(fastq_files, False, flowCellId, mismatches) - - foundSample = search_unique_sample(transaction, sample_code) - sequencing_sample = foundSample[0].getSample() - experiment = sequencing_sample.getExperiment() - sequencing_sample_code = sequencing_sample.getCode() - print "sequencing_sample_code: " + sequencing_sample_code - sequencing_sample_properties_dict = get_sample_properties(transaction, foundSample[0]) - if (INDEX1 in sequencing_sample_properties_dict) and (fcMetaDataDict[INDEXREAD1] > 0): - #print(sequencing_sample_properties_dict[INDEX1]) - dataSet.setPropertyValue(INDEX1, sequencing_sample_properties_dict[INDEX1]) - if (INDEX2 in sequencing_sample_properties_dict) and (fcMetaDataDict[INDEXREAD2] > 0): - dataSet.setPropertyValue(INDEX2, sequencing_sample_properties_dict[INDEX2]) - dataSet.setPropertyValue(EXTERNAL_SAMPLE_NAME, sequencing_sample_properties_dict[EXTERNAL_SAMPLE_NAME]) - dataSet.setPropertyValue(FASTQ_SAMPLE_CODE, sequencing_sample_code.replace('-','_')) - - sample_space = foundSample[0].getSpace() - filepart, suffix = first_fastq_file.split('.', 1) - - meta_data_file_name = mismatch_string_builder(mismatches, filepart.rsplit('_', 2)[0]) - - # get a file from the IDataSetRegistrationTransaction so it is automatically part of the data set - meta_data_file_path = transaction.createNewFile(dataSet, name, meta_data_file_name) - writeMetadataFile(transaction, name, meta_data_file_path, sequencing_sample_properties_dict, fcMetaDataDict, - experiment, sample_space, newFastqFiles, flowLane, dataSet, flow_lane_sample) - - return newFastqFiles, sample_space - - -def process_undetermined(transaction, undetermined, name, flowCellId, flowLane, fastq_files, first_fastq_file, - search_service, fcMetaDataDict, parents, dataSet, flow_lane_sample, mismatches): - sample_space = "" - newFastqFiles = [] - sample_space_list = [] - lane_parents = searchParents(search_service, parents) - print "Found " + str(lane_parents.size()) + " parents" - newFastqFiles = renameFiles(fastq_files, undetermined, flowCellId, mismatches) - for parent in lane_parents: - sequencing_sample_properties_dict = get_sample_properties(transaction, parent) - parent_sample = parent.getSample() - sample_code = parent_sample.getCode() - experiment = parent_sample.getExperiment() - sample_space = parent.getSpace() - sample_space_list.append(sample_space) - - # Special Sample Types without index (e.g. ILLUMINA_SEQUENCING_NEUROSTEMX_SINGLECELL) are caught here. - # as those samples do not have a NCBI ORGANISM TAXONOMY - if NCBI_ORGANISM_TAXONOMY not in sequencing_sample_properties_dict: - print sample_code + ": Processing Sample without NCBI ORGANISM TAXONOMY: ILLUMINA_SEQUENCING_NEUROSTEMX_SINGLECELL" - meta_data_file_name = mismatch_string_builder(mismatches, sample_code + '_' + flowCellId + '_' + first_fastq_file.split('.')[0]) - meta_data_file_path = transaction.createNewFile(dataSet, name, meta_data_file_name) - writeMetadataFile(transaction, name, meta_data_file_path, sequencing_sample_properties_dict, fcMetaDataDict, - experiment, sample_space, newFastqFiles, flowLane, dataSet, flow_lane_sample) - - elif (INDEX1 not in sequencing_sample_properties_dict or sequencing_sample_properties_dict[INDEX1] == 'NOINDEX') and \ - (INDEX2 not in sequencing_sample_properties_dict or sequencing_sample_properties_dict[INDEX2] == 'NOINDEX') and \ - (sequencing_sample_properties_dict[NCBI_ORGANISM_TAXONOMY] != PHIX_TAXONOMY_ID): - print 'NONINDEXED sample and Taxonomy id is NOT ' + PHIX_TAXONOMY_ID + ', probably a pool: ' + sample_code - meta_data_file_name = mismatch_string_builder(mismatches, sample_code + '_' + flowCellId + '_' + first_fastq_file.split('.')[0]) - meta_data_file_path = transaction.createNewFile(dataSet, name, meta_data_file_name) - writeMetadataFile(transaction, name, meta_data_file_path, sequencing_sample_properties_dict, fcMetaDataDict, - experiment, sample_space, newFastqFiles, flowLane, dataSet, flow_lane_sample) - - else: - print sample_code + ": Create parent meta data file" - meta_data_file_name = mismatch_string_builder(mismatches, 'PARENT_' + sample_code + '_' + flowCellId) - meta_data_file_path = transaction.createNewFile(dataSet, name, meta_data_file_name) - writeMetadataFile(transaction, name, meta_data_file_path, sequencing_sample_properties_dict, fcMetaDataDict, - experiment, sample_space, [], flowLane, dataSet, flow_lane_sample) - - sample_space_set = set(sample_space_list) - try: - sample_space_set.remove("PHIX") - except: - print("No Phix on this lane...") - sample_space = sample_space_set.pop() - return newFastqFiles, sample_space - -def process(transaction): - - undetermined = False - mismatches = 0 - print("\n" + str(datetime.now())) - - incoming_path = transaction.getIncoming().getAbsolutePath() - name = transaction.getIncoming().getName() - - sample_code, flowCellId, flowLane, incoming_sample, undetermined = split_incoming_folder_name (name) - - nohup_file = glob.glob(os.path.join(incoming_path, NOHUP_REGEX)) - if nohup_file: - command_line_list, mismatches = get_mismatches(nohup_file) - - - # get all fastqs - fastq_files = get_file_names(incoming_path, FASTQ_GZ_PATTERN) - - # BSSE-QGF-22266-H0W8YBGXX-1-654-BC3-TTAGGC_S1_L001_R1_001.fastq.gz - # BSSE-QGF-22051-H0T25AGXX-1-1-1-TAAGGCGA-CTCTCTAT_S46_L001_R1_001.fastq.gz - first_fastq_file = os.path.basename(fastq_files[0]) - - search_service = transaction.getSearchService() - - flowcell_sample_immutable = search_unique_sample (transaction, flowCellId) - fcMetaDataDict = get_sample_properties(transaction, flowcell_sample_immutable[0]) - flow_lane_immutable = search_unique_sample (transaction, incoming_sample) - - sample = flow_lane_immutable[0].getSample() - parents = sample.getParents() - - dataSet = transaction.createNewDataSet("FASTQ_GZ") - dataSet.setMeasuredData(False) - dataSet.setPropertyValue(INDEX1, DEFAULT_INDEX) - dataSet.setPropertyValue(INDEX2, DEFAULT_INDEX) - dataSet.setPropertyValue(MISMATCH_IN_INDEX, mismatch_dict[mismatches]) - dataSet.setPropertyValue(BCL_VERSION, flow_lane_immutable[0].getPropertyValue(BCL_VERSION)) - - if mismatches > 0: - name += MISMATCH_ABREVIATION + str(mismatches) - dirName = transaction.createNewDirectory(dataSet,name) - - if undetermined: - fastq_files, sample_space = process_undetermined(transaction, undetermined, name, flowCellId, flowLane, - fastq_files, first_fastq_file, search_service, fcMetaDataDict, parents, dataSet, - flow_lane_immutable[0], mismatches) - else: - fastq_files, sample_space = process_regular_samples(transaction, name, sample_code, flowCellId, flowLane, - fastq_files, first_fastq_file, search_unique_sample, fcMetaDataDict, dataSet, - flow_lane_immutable[0], mismatches) - - put_files_to_dataset (transaction, dataSet, fastq_files, name, sample_space) - - sa = transaction.getSampleForUpdate(flow_lane_immutable[0].getSampleIdentifier()) - # Deactivated as this creates for each sample a new history entry, eventually moved to the registration of Basecall- Stats - #sa.setPropertyValue("DATA_TRANSFERRED", create_openbis_timestamp_now()) - dataSet.setSample(flow_lane_immutable[0]) - diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/2/dss/drop-boxes/register-undetermined/plugin.properties b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/2/dss/drop-boxes/register-undetermined/plugin.properties deleted file mode 100644 index 6c92aaded2123656f3e06121cc3263776a587aa7..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/2/dss/drop-boxes/register-undetermined/plugin.properties +++ /dev/null @@ -1,6 +0,0 @@ -incoming-dir = ${incoming-root-dir}/register-undetermined -incoming-data-completeness-condition = marker-file -top-level-data-set-handler = ch.systemsx.cisd.etlserver.registrator.api.v2.JythonTopLevelDataSetHandlerV2 -script-path = register-undetermined.py -storage-processor = ch.systemsx.cisd.etlserver.DefaultStorageProcessor -jython-version=2.7 \ No newline at end of file diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/2/dss/drop-boxes/register-undetermined/register-undetermined.py b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/2/dss/drop-boxes/register-undetermined/register-undetermined.py deleted file mode 100644 index c2f37ad6127846a074d45d91291d1a01b9a2936a..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/2/dss/drop-boxes/register-undetermined/register-undetermined.py +++ /dev/null @@ -1,51 +0,0 @@ -''' -@copyright: -2015 ETH Zuerich, SIS - -@license: -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - -http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. - -@author: -Manuel Kohler -''' - -import os -import shutil -from ch.systemsx.cisd.openbis.generic.shared.api.v1.dto import SearchCriteria -from ch.systemsx.cisd.openbis.generic.shared.api.v1.dto import SearchSubCriteria - -# The following module is located in the path defined in the datastore_server.conf -# Look for: -Dpython.path} -from gfb_utils import * - - -def process(transaction): - - incomingPath = transaction.getIncoming().getPath() - incomingFolder = transaction.getIncoming().getName() - - split = incomingFolder.split("_") - - if (len(split) == 2): - flow_cell, flow_lane = incomingFolder.split("_") - elif (len(split) == 3): - flow_cell = "-".join([split[0], split[1]]) - flow_lane = split[-1] - - connected_sample_code = ":".join([flow_cell, flow_lane]) - connected_sample = search_unique_sample(transaction, connected_sample_code) - - dataSet = transaction.createNewDataSet("UNDETERMINED_READS_DISTRIBUTION") - dataSet.setMeasuredData(False) - dataSet.setSample(connected_sample[0]) - transaction.moveFile(transaction.getIncoming().getPath(), dataSet) diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/2/dss/drop-boxes/v2_register-demuliplex-stats/plugin.properties b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/2/dss/drop-boxes/v2_register-demuliplex-stats/plugin.properties deleted file mode 100644 index bed822d96bbd2838622813cc0ca42714cf60517d..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/2/dss/drop-boxes/v2_register-demuliplex-stats/plugin.properties +++ /dev/null @@ -1,6 +0,0 @@ -incoming-dir = ${incoming-root-dir}/v2_register-demuliplex-stats -incoming-data-completeness-condition = marker-file -top-level-data-set-handler = ch.systemsx.cisd.etlserver.registrator.api.v2.JythonTopLevelDataSetHandlerV2 -script-path = register-demuliplex-stats.py -storage-processor = ch.systemsx.cisd.etlserver.DefaultStorageProcessor -jython-version=2.7 diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/2/dss/drop-boxes/v2_register-demuliplex-stats/register-demuliplex-stats.py b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/2/dss/drop-boxes/v2_register-demuliplex-stats/register-demuliplex-stats.py deleted file mode 100644 index bd26425284a938a70322af2fd7cd76659ba1152c..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/2/dss/drop-boxes/v2_register-demuliplex-stats/register-demuliplex-stats.py +++ /dev/null @@ -1,78 +0,0 @@ -''' -@copyright: -2015 ETH Zuerich, SIS - -@license: -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - -http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. - -@description: -Registers an incoming directory as a data set in openBIS. The name of the directory is used to -search for the matching sample. - -@note: -print statements go to: <openBIS_HOME>/datastore_server/log/startup_log.txt - -@author: -Manuel Kohler -''' - -import re -import glob -import os -from itertools import islice -from ch.systemsx.cisd.openbis.generic.shared.api.v1.dto import SearchCriteria - -# The following module is located in the path defined in the datastore_server.conf -# Look for: -Dpython.path} -from gfb_utils import * - -BCL2FASTQ_BASECALLSTATS_TYPE = "BCL2FASTQ_BASECALLSTATS" -AGGREGATED_BASECALL_STATS_TYPE = "AGGREGATED_BASECALL_STATS" - -def process(transaction): - aggregated_run = False - incoming = transaction.getIncoming() - incoming_path = incoming.getAbsolutePath() - run_id = incoming.getName() - - thread_property_dict = get_thread_properties(transaction) - absolutePath = os.path.dirname(os.path.realpath(thread_property_dict['script-path'])) - - try: - run_date, sequencer_id, running_number, tray_and_fcId, lane = run_id.split("_") - dataSet = transaction.createNewDataSet(BCL2FASTQ_BASECALLSTATS_TYPE) - model = get_model(run_id.rsplit("_",1)[:-1][0]) - except: - run_date, sequencer_id, running_number, tray_and_fcId = run_id.split("_") - dataSet = transaction.createNewDataSet(AGGREGATED_BASECALL_STATS_TYPE) - aggregated_run = True - model = get_model(run_id) - - print(os.path.basename(absolutePath) + ": Auto-detected Illumina model: " + model) - - tray = tray_and_fcId[0] - if model in [Sequencers.MISEQ]: - fc_id = tray_and_fcId - else: - fc_id = tray_and_fcId[1:] - - if aggregated_run: - sample_code = fc_id - else: - sample_code = fc_id + ":" + lane - found_sample = search_unique_sample(transaction, sample_code) - search_service = transaction.getSearchService() - - dataSet.setMeasuredData(False) - transaction.moveFile(incoming_path, dataSet) - dataSet.setSample(found_sample[0]) diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/2/dss/drop-boxes/v2_register-trimming/plugin.properties b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/2/dss/drop-boxes/v2_register-trimming/plugin.properties deleted file mode 100644 index e72bf886b62a40531b86be6a68592356cd8dc1ee..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/2/dss/drop-boxes/v2_register-trimming/plugin.properties +++ /dev/null @@ -1,6 +0,0 @@ -incoming-dir = ${incoming-root-dir}/v2_register-trimming -incoming-data-completeness-condition = marker-file -top-level-data-set-handler = ch.systemsx.cisd.etlserver.registrator.api.v2.JythonTopLevelDataSetHandlerV2 -script-path = register-trimming.py -storage-processor = ch.systemsx.cisd.etlserver.DefaultStorageProcessor -jython-version=2.7 diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/2/dss/drop-boxes/v2_register-trimming/register-trimming.py b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/2/dss/drop-boxes/v2_register-trimming/register-trimming.py deleted file mode 100644 index cabc8d9dea06b47711278fcad56390526c09e921..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/2/dss/drop-boxes/v2_register-trimming/register-trimming.py +++ /dev/null @@ -1,50 +0,0 @@ -''' -@copyright: -2015 ETH Zuerich, SIS - -@license: -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - -http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. - -@note -print statements go to: <openBIS_HOME>/datastore_server/log/startup_log.txt - -@author: -Manuel Kohler -''' - -# The following module is located in the path defined in the datastore_server.conf -# Look for: -Dpython.path} -from gfb_utils import * - - -def process(transaction): - - incomingPath = transaction.getIncoming().getPath() - incomingFolder = transaction.getIncoming().getName() - - split = incomingFolder.split("_") - - if (len(split) == 2): - flow_cell, flow_lane = incomingFolder.split("_") - elif (len(split) == 3): - flow_cell = "-".join([split[0], split[1]]) - flow_lane = split[-1] - - connected_sample_code = ":".join([flow_cell, flow_lane]) - connected_sample = search_unique_sample(transaction, connected_sample_code) - - dataSet = transaction.createNewDataSet("TRIMMING") - dataSet.setMeasuredData(False) - - dataSet.setSample(connected_sample[0]) - transaction.moveFile(incomingPath, dataSet) diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/2/jython-lib/gfb_utils.py b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/2/jython-lib/gfb_utils.py deleted file mode 100644 index 481b30152ea78a03f5396d07daa95045ffb1878e..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/2/jython-lib/gfb_utils.py +++ /dev/null @@ -1,123 +0,0 @@ -import os -import time -import fnmatch -from time import * -from datetime import * -from ch.systemsx.cisd.openbis.generic.shared.api.v1.dto import SearchCriteria - -# HISEQ_DICT = {'HISEQ_4000': 'Illumina HiSeq 4000', -# 'HISEQ_3000': 'Illumina HiSeq 3000', -# 'HISEQ_2500': 'Illumina HiSeq 2500', -# 'HISEQ_2000': 'Illumina HiSeq 2000', -# 'HISEQ_X': 'Illumina HiSeq X' -# } -# NEXTSEQ_DICT = {'NEXTSEQ_500': 'Illumina NextSeq 500'} -# MISEQ_DICT = {'MISEQ': 'Illumina MiSeq'} -# UNIDENTIFIED_DICT = {'UNIDENTIFIED': 'Unidentified'} - -# Instead of using Enum: -class Sequencers: - HISEQ_4000, HISEQ_3000, HISEQ_2500, HISEQ_2000, HISEQ_X, NEXTSEQ_500, MISEQ , UNIDENTIFIED= \ - ('Illumina HiSeq 4000','Illumina HiSeq 3000','Illumina HiSeq 2500','Illumina HiSeq 2000', - 'Illumina HiSeq X', 'Illumina NextSeq 500', 'Illumina MiSeq', 'Unidentified') - -HISEQ_LIST = [Sequencers.HISEQ_2000, Sequencers.HISEQ_2500, Sequencers.HISEQ_3000, Sequencers.HISEQ_4000, Sequencers.HISEQ_X] - - -def get_model(run_id): - """ - Guesses the sequencer model from the run folder name - - Current Naming schema for Illumina run folders, as far as I know, - no documentation found on this, Illumina introduced a field called - <InstrumentID> on the NextSeq runParameters.xml. That might be an - option for the future. Alternatively a combination of the fields - <ApplicationName> and <ApplicationVersion>. - - MiSeq: 150130_M01761_0114_000000000-ACUR0 - NextSeq: 150202_NS500318_0047_AH3KLMBGXX - HiSeq 2000: 130919_SN792_0281_BD2CHRACXX - HiSeq 2500: 150203_D00535_0052_AC66RWANXX - HiSeq 3000: 150724_J00121_0017_AH2VYMBBXX - HiSeq 4000: 150210_K00111_0013_AH2372BBXX - HiSeq X: 141121_ST-E00107_0356_AH00C3CCXX - """ - date, machine_id, run_number, fc_string = os.path.basename(run_id).split("_") - - if machine_id.startswith("NS"): - model = Sequencers.NEXTSEQ_500 - elif machine_id.startswith("M"): - model = Sequencers.MISEQ - elif machine_id.startswith("D"): - model = Sequencers.HISEQ_2500 - elif machine_id.startswith("SN"): - model = Sequencers.HISEQ_2000 - elif machine_id.startswith("J"): - model = Sequencers.HISEQ_3000 - elif machine_id.startswith("K"): - model = Sequencers.HISEQ_4000 - elif machine_id.startswith("ST"): - model = Sequencers.HISEQ_X - else: - model = Sequencers.UNIDENTIFIED - return model - - -def get_thread_properties(transaction): - threadPropertyDict = {} - threadProperties = transaction.getGlobalState().getThreadParameters().getThreadProperties() - for key in threadProperties: - try: - threadPropertyDict[key] = threadProperties.getProperty(key) - except: - pass - return threadPropertyDict - - -def create_openbis_timestamp(file): - ''' - Creates a openBIS compatible time stamp of a file time stamp - ''' - mtime = os.path.getmtime(file) - lt = localtime(mtime) - tz = localtime().tm_hour - gmtime().tm_hour - # doing a modulo 12, as GMT has not more than 12 zones - # Needed if we are around midnight - tz %= 12 - return (strftime("%Y-%m-%d %H:%M:%S GMT" + "%+.2d" % tz + ":00", lt)) - - -def create_openbis_timestamp_now(): - ''' - Create an openBIS conform timestamp - ''' - tz=localtime()[3]-gmtime()[3] - d=datetime.now() - return d.strftime("%Y-%m-%d %H:%M:%S GMT"+"%+.2d" % tz+":00") - - -def search_unique_sample(transaction, sample_code): - - search_service = transaction.getSearchService() - sc = SearchCriteria() - sc.addMatchClause(SearchCriteria.MatchClause.createAttributeMatch(SearchCriteria.MatchClauseAttribute.CODE, sample_code)); - found_sample = search_service.searchForSamples(sc) - try: - assert found_sample.size() == 1 - except AssertionError: - print (str(found_sample.size()) + ' samples found which match the criterias: '+ sample_code) - return found_sample - - -def get_file_names(path, pattern): - ''' - Gets all files matching a PATTERN in a path recursively - and returns the result as a list - ''' - matches = [] - for root, dirnames, filenames in os.walk(path): - for filename in fnmatch.filter(filenames, pattern): - matches.append(os.path.join(root, filename)) - matches.sort() - return(matches) - diff --git a/deep_sequencing_unit/sourceTest/java/ch/ethz/bsse/cisd/dsu/DependencyCheckingTest.java b/deep_sequencing_unit/sourceTest/java/ch/ethz/bsse/cisd/dsu/DependencyCheckingTest.java deleted file mode 100644 index 4bce330ab7d7388fb46bdcbcbf13d97711570c29..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/sourceTest/java/ch/ethz/bsse/cisd/dsu/DependencyCheckingTest.java +++ /dev/null @@ -1,25 +0,0 @@ -/* - * Copyright 2011 ETH Zuerich, CISD - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package ch.ethz.bsse.cisd.dsu; - -/** - * @author Franz-Josef Elmer - */ -public class DependencyCheckingTest extends ch.systemsx.cisd.common.test.DependencyCheckingTest -{ - -} diff --git a/deep_sequencing_unit/sourceTest/java/ch/ethz/bsse/cisd/dsu/dss/DataSetInfoExtractorTest.java b/deep_sequencing_unit/sourceTest/java/ch/ethz/bsse/cisd/dsu/dss/DataSetInfoExtractorTest.java deleted file mode 100644 index c14e1ec10f32f5b99a804086673c2bc4d9aaa6b3..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/sourceTest/java/ch/ethz/bsse/cisd/dsu/dss/DataSetInfoExtractorTest.java +++ /dev/null @@ -1,112 +0,0 @@ -/* - * Copyright 2009 ETH Zuerich, CISD - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package ch.ethz.bsse.cisd.dsu.dss; - -import java.io.File; -import java.util.List; -import java.util.Properties; - -import org.testng.annotations.BeforeMethod; -import org.testng.annotations.Test; - -import ch.systemsx.cisd.base.tests.AbstractFileSystemTestCase; -import ch.systemsx.cisd.common.filesystem.FileUtilities; -import ch.systemsx.cisd.common.logging.BufferedAppender; -import ch.systemsx.cisd.common.logging.LogInitializer; -import ch.systemsx.cisd.openbis.dss.generic.shared.dto.DataSetInformation; -import ch.systemsx.cisd.openbis.generic.shared.dto.NewProperty; - -/** - * @author Franz-Josef Elmer - */ -public class DataSetInfoExtractorTest extends AbstractFileSystemTestCase -{ - private BufferedAppender appender; - - @BeforeMethod - public final void beforeMethod() - { - LogInitializer.init(); - appender = new BufferedAppender(); - appender.resetLogContent(); - } - - @Test - public void testWithSingleQuotes() - { - DataSetInfoExtractor extractor = new DataSetInfoExtractor(new Properties()); - File configFile = new File(workingDirectory, DataSetInfoExtractor.DEFAULT_PATH_TO_CONFIG_FILE); - configFile.getParentFile().mkdirs(); - FileUtilities.writeToFile(configFile, "<abc>\n <Software Name='RTA' Version='1.4.15.0'/>\n</abc>\n"); - - DataSetInformation info = extractor.getDataSetInformation(workingDirectory, null); - - List<NewProperty> properties = info.getDataSetProperties(); - assertEquals(1, properties.size()); - assertEquals(DataSetInfoExtractor.VERSION_KEY, properties.get(0).getPropertyCode()); - assertEquals("1.4.15.0", properties.get(0).getValue()); - // checks delegation to DefaultDataSetInfoExtractor - assertEquals("DataSetInfoExtractorTest", info.getSampleCode()); - } - - @Test - public void testWithDoubleQuotes() - { - DataSetInfoExtractor extractor = new DataSetInfoExtractor(new Properties()); - File configFile = new File(workingDirectory, DataSetInfoExtractor.DEFAULT_PATH_TO_CONFIG_FILE); - configFile.getParentFile().mkdirs(); - FileUtilities.writeToFile(configFile, "<abc>\n <Software Name=\"RTA\" Version=\"1.4.15.0\"/>\n</abc>\n"); - - DataSetInformation info = extractor.getDataSetInformation(workingDirectory, null); - - List<NewProperty> properties = info.getDataSetProperties(); - assertEquals(1, properties.size()); - assertEquals(DataSetInfoExtractor.VERSION_KEY, properties.get(0).getPropertyCode()); - assertEquals("1.4.15.0", properties.get(0).getValue()); - } - - @Test - public void testWithMissingVersion() - { - DataSetInfoExtractor extractor = new DataSetInfoExtractor(new Properties()); - File configFile = new File(workingDirectory, DataSetInfoExtractor.DEFAULT_PATH_TO_CONFIG_FILE); - configFile.getParentFile().mkdirs(); - FileUtilities.writeToFile(configFile, "<abc>\n </abc>\n"); - - DataSetInformation info = extractor.getDataSetInformation(workingDirectory, null); - - List<NewProperty> properties = info.getDataSetProperties(); - assertEquals(0, properties.size()); - String logContent = appender.getLogContent(); - assertEquals("No version found in config file 'Data/Intensities/config.xml'.", logContent); - } - - @Test - public void testWithMissingConfigFile() - { - DataSetInfoExtractor extractor = new DataSetInfoExtractor(new Properties()); - - DataSetInformation info = extractor.getDataSetInformation(workingDirectory, null); - - List<NewProperty> properties = info.getDataSetProperties(); - assertEquals(0, properties.size()); - String logContent = appender.getLogContent(); - assertEquals( - "Config file 'Data/Intensities/config.xml' does not exists or is a directory.", - logContent); - } -} diff --git a/deep_sequencing_unit/sourceTest/java/ch/ethz/bsse/cisd/dsu/dss/FlowLaneFeederTest.java b/deep_sequencing_unit/sourceTest/java/ch/ethz/bsse/cisd/dsu/dss/FlowLaneFeederTest.java deleted file mode 100644 index 7a94f578262cbe734c2f02a9622d9d5f9c12a749..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/sourceTest/java/ch/ethz/bsse/cisd/dsu/dss/FlowLaneFeederTest.java +++ /dev/null @@ -1,735 +0,0 @@ -/* - * Copyright 2009 ETH Zuerich, CISD - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package ch.ethz.bsse.cisd.dsu.dss; - -import static ch.ethz.bsse.cisd.dsu.dss.FlowLaneDataSetInfoExtractor.FLOW_LANE_NUMBER_SEPARATOR; - -import java.io.File; -import java.util.Arrays; -import java.util.List; -import java.util.Properties; - -import org.hamcrest.BaseMatcher; -import org.hamcrest.Description; -import org.jmock.Expectations; -import org.jmock.Mockery; -import org.testng.annotations.AfterMethod; -import org.testng.annotations.BeforeMethod; -import org.testng.annotations.Test; - -import ch.systemsx.cisd.base.exceptions.CheckedExceptionTunnel; -import ch.systemsx.cisd.base.tests.AbstractFileSystemTestCase; -import ch.systemsx.cisd.base.utilities.OSUtilities; -import ch.systemsx.cisd.common.exceptions.ConfigurationFailureException; -import ch.systemsx.cisd.common.exceptions.EnvironmentFailureException; -import ch.systemsx.cisd.common.exceptions.UserFailureException; -import ch.systemsx.cisd.common.filesystem.FileConstants; -import ch.systemsx.cisd.common.filesystem.FileUtilities; -import ch.systemsx.cisd.common.logging.LogInitializer; -import ch.systemsx.cisd.common.test.AssertionUtil; -import ch.systemsx.cisd.openbis.dss.generic.shared.IEncapsulatedOpenBISService; -import ch.systemsx.cisd.openbis.dss.generic.shared.dto.DataSetInformation; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.GenericEntityProperty; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.IEntityProperty; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ListSampleCriteria; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Person; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.PropertyType; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Sample; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.SampleType; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.SampleTypePropertyType; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Space; -import ch.systemsx.cisd.openbis.generic.shared.dto.SampleUpdatesDTO; -import ch.systemsx.cisd.openbis.generic.shared.dto.identifier.SampleIdentifier; -import ch.systemsx.cisd.openbis.generic.shared.dto.identifier.SampleIdentifierFactory; - -/** - * @author Franz-Josef Elmer - */ -public class FlowLaneFeederTest extends AbstractFileSystemTestCase -{ - private static final String META_DATA_PREFIX = "meta-"; - - private static final String AFFILIATION = "fmi"; - - private static final String EXTERNAL_SAMPLE_NAME = "ext23"; - - private static final String TRANSFER_DROP_BOX = "transfer-drop-box"; - - private static final Sample EXAMPLE_FLOW_CELL_SAMPLE = createFlowCellSample(); - - private static final DataSetInformation EXAMPLE_DATA_SET_INFO = createDataSetInfo(); - - private static final String FLOW_LANE = "ILLUMINA_FLOW_LANE"; - - private static final String SAMPLE_CODE = "fc"; - - private static final String DROP_BOX_PREFIX = "drop-box-"; - - private static DataSetInformation createDataSetInfo() - { - DataSetInformation dataSetInfo = new DataSetInformation(); - dataSetInfo.setSampleCode(SAMPLE_CODE); - return dataSetInfo; - } - - private static Sample createFlowCellSample() - { - Sample sample = new Sample(); - sample.setId(42L); - sample.setCode(SAMPLE_CODE); - return sample; - } - - private FlowLaneFeeder flowLaneFeeder; - - private Mockery context; - - private IEncapsulatedOpenBISService service; - - private File dropBox1; - - private File dropBox2; - - private File transferDropBox; - - private File srfInfo; - - @BeforeMethod - public void beforeMethod() throws Exception - { - super.setUp(); - LogInitializer.init(); - context = new Mockery(); - service = context.mock(IEncapsulatedOpenBISService.class); - FileUtilities.deleteRecursively(workingDirectory); - dropBox1 = new File(workingDirectory, DROP_BOX_PREFIX + "1"); - assertEquals(true, dropBox1.mkdirs()); - dropBox2 = new File(workingDirectory, DROP_BOX_PREFIX + "2"); - assertEquals(true, dropBox2.mkdirs()); - transferDropBox = new File(workingDirectory, TRANSFER_DROP_BOX); - assertEquals(true, transferDropBox.mkdirs()); - srfInfo = new File(workingDirectory, "srfInfo"); - flowLaneFeeder = createFeeder(null); - } - - @AfterMethod - public void tearDown() - { - // To following line of code should also be called at the end of each test method. - // Otherwise one does not known which test failed. - context.assertIsSatisfied(); - } - - @Test - public void testMissingProperty() - { - try - { - new FlowLaneFeeder(new Properties(), service); - fail("ConfigurationFailureException expected"); - } catch (ConfigurationFailureException ex) - { - assertEquals("Given key '" + FlowLaneFeeder.FLOW_LANE_DROP_BOX_TEMPLATE - + "' not found in properties '[]'", ex.getMessage()); - } - - context.assertIsSatisfied(); - } - - @Test - void testUnkownFlowLaneSample() - { - File flowCell = new File(workingDirectory, SAMPLE_CODE); - assertEquals(true, flowCell.mkdir()); - FileUtilities.writeToFile(new File(flowCell, "s_3.srf"), "hello flow lane 3"); - prepareLoadFlowCellSample(EXAMPLE_FLOW_CELL_SAMPLE); - prepareListFlowLanes(EXAMPLE_FLOW_CELL_SAMPLE, Arrays.<Sample> asList()); - - try - { - flowLaneFeeder.handle(flowCell, EXAMPLE_DATA_SET_INFO, null); - fail("UserFailureException expected"); - } catch (UserFailureException ex) - { - assertEquals("No flow lane sample for flow lane 3 found.", ex.getMessage()); - } - - context.assertIsSatisfied(); - } - - @Test - void testMissingDropBox() - { - File flowCell = new File(workingDirectory, SAMPLE_CODE); - assertEquals(true, flowCell.mkdir()); - FileUtilities.writeToFile(new File(flowCell, "s_3.srf"), "hello flow lane 3"); - prepareLoadFlowCellSample(EXAMPLE_FLOW_CELL_SAMPLE); - Sample fl = createFlowLaneSample(3); - prepareListFlowLanes(EXAMPLE_FLOW_CELL_SAMPLE, Arrays.<Sample> asList(fl)); - - try - { - flowLaneFeeder.handle(flowCell, EXAMPLE_DATA_SET_INFO, null); - fail("ConfigurationFailureException expected"); - } catch (ConfigurationFailureException ex) - { - AssertionUtil.assertContains(DROP_BOX_PREFIX + "3", ex.getMessage()); - } - - context.assertIsSatisfied(); - } - - @Test - public void testUnkownFlowCell() - { - File flowCell = new File(workingDirectory, SAMPLE_CODE); - prepareLoadFlowCellSample(null); - - try - { - flowLaneFeeder.handle(flowCell, EXAMPLE_DATA_SET_INFO, null); - fail("UserFailureException expected"); - } catch (UserFailureException ex) - { - assertEquals("Unkown flow cell sample: " + EXAMPLE_DATA_SET_INFO.getSampleIdentifier(), - ex.getMessage()); - } - - context.assertIsSatisfied(); - } - - @Test - public void testNotEnoughFlowLaneFiles() - { - File flowCell = new File(workingDirectory, SAMPLE_CODE); - assertEquals(true, flowCell.mkdir()); - File logs = new File(flowCell, "logs"); - assertEquals(true, logs.mkdir()); - FileUtilities.writeToFile(new File(logs, "basic.log"), "hello log"); - File srfFolder = new File(flowCell, "SRF"); - assertEquals(true, srfFolder.mkdir()); - File originalFlowLane1 = new File(srfFolder, "s_1.srf"); - FileUtilities.writeToFile(originalFlowLane1, "hello flow lane 1"); - prepareLoadFlowCellSample(EXAMPLE_FLOW_CELL_SAMPLE); - - Sample fl1 = createFlowLaneSample(1); - Sample fl2 = createFlowLaneSample(2); - prepareListFlowLanes(EXAMPLE_FLOW_CELL_SAMPLE, Arrays.asList(fl1, fl2)); - - try - { - flowLaneFeeder.handle(flowCell, EXAMPLE_DATA_SET_INFO, null); - fail("EnvironmentFailureException expected"); - } catch (EnvironmentFailureException ex) - { - assertEquals("Only 1 flow lane files found instead of 2.", ex.getMessage()); - } - - context.assertIsSatisfied(); - } - - @Test - public void testFlowLaneTwice() - { - flowLaneFeeder.setUpdateDataTransferredProperty(false); - File flowCell = new File(workingDirectory, SAMPLE_CODE); - assertEquals(true, flowCell.mkdir()); - File logs = new File(flowCell, "logs"); - assertEquals(true, logs.mkdir()); - FileUtilities.writeToFile(new File(logs, "basic.log"), "hello log"); - File srfFolder = new File(flowCell, "SRF"); - assertEquals(true, srfFolder.mkdir()); - File originalFlowLane1 = new File(srfFolder, "s_1.srf"); - FileUtilities.writeToFile(originalFlowLane1, "hello flow lane 1"); - File originalFlowLane2 = new File(srfFolder, "1.srf"); - FileUtilities.writeToFile(originalFlowLane2, "hello second flow lane 1"); - prepareLoadFlowCellSample(EXAMPLE_FLOW_CELL_SAMPLE); - Sample fl1 = createFlowLaneSample(1); - Sample fl2 = createFlowLaneSample(1); - prepareListFlowLanes(EXAMPLE_FLOW_CELL_SAMPLE, Arrays.asList(fl1, fl2)); - prepareGetProperties(Arrays.asList(fl1)); - - try - { - flowLaneFeeder.handle(flowCell, EXAMPLE_DATA_SET_INFO, null); - fail("UserFailureException expected"); - } catch (UserFailureException ex) - { - assertEquals("Flow lane 1 already registered.", ex.getMessage()); - } - - context.assertIsSatisfied(); - } - - @Test - public void testHappyCase() - { - flowLaneFeeder.setUpdateDataTransferredProperty(true); - File flowCell = new File(workingDirectory, SAMPLE_CODE); - assertEquals(true, flowCell.mkdir()); - File logs = new File(flowCell, "logs"); - assertEquals(true, logs.mkdir()); - FileUtilities.writeToFile(new File(logs, "basic.log"), "hello log"); - File srfFolder = new File(flowCell, "SRF"); - assertEquals(true, srfFolder.mkdir()); - File originalFlowLane1 = new File(srfFolder, "s_1.srf"); - FileUtilities.writeToFile(originalFlowLane1, "hello flow lane 1"); - File originalFlowLane2 = new File(srfFolder, "2.srf"); - FileUtilities.writeToFile(originalFlowLane2, "hello flow lane 2"); - File srf_info_file = new File(srfFolder, "srf_info.txt"); - FileUtilities.writeToFile(srf_info_file, - "Reading archive ETHZ_BSSE_100602_61VVHAAXX_1.srf.\n" - + "Reading srf null index block\n" + "Reads: GOOD : 20712959\n" - + "Reads: BAD : 7270034\n" + "Reads: TOTAL : 27982993"); - prepareLoadFlowCellSample(EXAMPLE_FLOW_CELL_SAMPLE); - - SampleTypePropertyType p1 = createPropertyType("P1"); - SampleTypePropertyType p2 = createPropertyType("P2"); - SampleTypePropertyType p3 = createPropertyType("DATA_TRANSFERRED"); - IEntityProperty fl1p1v = new GenericEntityProperty(); - fl1p1v.setPropertyType(p1.getPropertyType()); - fl1p1v.setValue("v1"); - IEntityProperty fl2p2v = new GenericEntityProperty(); - fl2p2v.setPropertyType(p2.getPropertyType()); - fl2p2v.setValue("v2"); - - Sample fl1 = createFlowLaneSample(1, fl1p1v); - Sample fl2 = createFlowLaneSample(2, fl2p2v); - prepareListFlowLanes(EXAMPLE_FLOW_CELL_SAMPLE, Arrays.asList(fl1, fl2)); - prepareGetProperties(Arrays.asList(fl1, fl2)); - - prepareGetSampleType(FLOW_LANE, p1, p2, p3); - prepareUpdateSamples(fl1, fl2); - - flowLaneFeeder.handle(flowCell, EXAMPLE_DATA_SET_INFO, null); - - checkFlowLaneDataSet(originalFlowLane1, "1"); - checkFlowLaneDataSet(originalFlowLane2, "2"); - - File[] transferedFiles = transferDropBox.listFiles(); - Arrays.sort(transferedFiles); - assertEquals(2, transferedFiles.length); - assertEquals("2.srf", transferedFiles[0].getName()); - File metaFile = transferedFiles[1]; - assertEquals(META_DATA_PREFIX + SAMPLE_CODE + "_2" + FlowLaneFeeder.META_DATA_FILE_TYPE, - metaFile.getName()); - assertHardLinkOnSameFile(originalFlowLane2, transferedFiles[0]); - - context.assertIsSatisfied(); - } - - private void prepareUpdateSamples(final Sample... samples) - { - context.checking(new Expectations() - { - { - allowing(service).updateSample(with(new BaseMatcher<SampleUpdatesDTO>() - { - @Override - public boolean matches(Object item) - { - if (item instanceof SampleUpdatesDTO) - { - SampleUpdatesDTO sampleUpdate = (SampleUpdatesDTO) item; - Long updateId = sampleUpdate.getSampleIdOrNull().getId(); - boolean found = false; - for (Sample s : samples) - { - if (s.getId().equals(updateId)) - { - found = true; - assertEquals(s.getId(), sampleUpdate - .getSampleIdOrNull().getId()); - assertEquals(0, sampleUpdate.getAttachments().size()); - assertEquals(null, - sampleUpdate.getContainerIdentifierOrNull()); - assertEquals(null, - sampleUpdate.getExperimentIdentifierOrNull()); - assertEquals(s.getIdentifier(), sampleUpdate - .getSampleIdentifier().toString()); - List<IEntityProperty> properties = - sampleUpdate.getProperties(); - assertEquals(s.getProperties().size() + 1, - properties.size()); - assertEquals("DATA_TRANSFERRED", - properties.get(properties.size() - 1) - .getPropertyType().getCode()); - break; - } - } - if (found == false) - { - fail("Didn't expect update of sample with id " + updateId); - } - return true; - } - return false; - } - - @Override - public void describeTo(Description description) - { - } - })); - } - }); - } - - private void prepareGetSampleType(final String sampleTypeCode, - final SampleTypePropertyType... sampleTypePropertyTypes) - { - context.checking(new Expectations() - { - { - allowing(service).getSampleType(sampleTypeCode); - SampleType sampleType = new SampleType(); - sampleType.setCode(sampleTypeCode); - sampleType.setSampleTypePropertyTypes(Arrays.asList(sampleTypePropertyTypes)); - will(returnValue(sampleType)); - } - }); - } - - private static SampleTypePropertyType createPropertyType(String key) - { - SampleTypePropertyType stpt = new SampleTypePropertyType(); - stpt.setMandatory(false); - PropertyType propertyType = new PropertyType(); - propertyType.setCode(key); - stpt.setPropertyType(propertyType); - return stpt; - } - - @Test - public void testHappyCaseWithSRFInfo() - { - flowLaneFeeder = createFeeder("echo option: $1\necho file: $2"); - flowLaneFeeder.setUpdateDataTransferredProperty(false); - - File flowCell = new File(workingDirectory, SAMPLE_CODE); - assertEquals(true, flowCell.mkdir()); - File logs = new File(flowCell, "logs"); - assertEquals(true, logs.mkdir()); - FileUtilities.writeToFile(new File(logs, "basic.log"), "hello log"); - File srfFolder = new File(flowCell, "SRF"); - assertEquals(true, srfFolder.mkdir()); - File originalFlowLane1 = new File(srfFolder, "s_1.srf"); - FileUtilities.writeToFile(originalFlowLane1, "hello flow lane 1"); - File originalFlowLane2 = new File(srfFolder, "2.srf"); - FileUtilities.writeToFile(originalFlowLane2, "hello flow lane 2"); - File srf_info_file = new File(srfFolder, "srf_info.txt"); - FileUtilities.writeToFile(srf_info_file, - "Reading archive ETHZ_BSSE_100602_61VVHAAXX_1.srf.\n" - + "Reading srf null index block\n" + "Reads: GOOD : 20712959\n" - + "Reads: BAD : 7270034\n" + "Reads: TOTAL : 27982993"); - prepareLoadFlowCellSample(EXAMPLE_FLOW_CELL_SAMPLE); - - Sample fl1 = createFlowLaneSample(1); - Sample fl2 = createFlowLaneSample(2); - prepareListFlowLanes(EXAMPLE_FLOW_CELL_SAMPLE, Arrays.asList(fl1, fl2)); - prepareGetProperties(Arrays.asList(fl1, fl2)); - - flowLaneFeeder.handle(flowCell, EXAMPLE_DATA_SET_INFO, null); - - checkFlowLaneDataSet(originalFlowLane1, "1"); - checkFlowLaneDataSet(originalFlowLane2, "2"); - - File[] transferedFiles = transferDropBox.listFiles(); - Arrays.sort(transferedFiles); - assertEquals(2, transferedFiles.length); - assertEquals("2.srf", transferedFiles[0].getName()); - File metaFile = transferedFiles[1]; - assertEquals(META_DATA_PREFIX + SAMPLE_CODE + "_2" + FlowLaneFeeder.META_DATA_FILE_TYPE, - metaFile.getName()); - List<String> metaData = FileUtilities.loadToStringList(metaFile); - String lastLine = metaData.remove(metaData.size() - 1); - assertEquals("[Parent\tnull, Code\tfc:2, Contact Person Email\tab@c.de, " - + "AFFILIATION\tfmi, EXTERNAL_SAMPLE_NAME\text23, , " - + "==== SRF Info ====\t, option: -l1\t]", metaData.toString()); - AssertionUtil.assertContains("file: ", lastLine); - assertEquals(8, metaData.size()); - assertHardLinkOnSameFile(originalFlowLane2, transferedFiles[0]); - - context.assertIsSatisfied(); - } - - @Test - public void testHappyCaseWithAdditionalFiles() - { - flowLaneFeeder.setUpdateDataTransferredProperty(false); - File flowCell = new File(workingDirectory, SAMPLE_CODE); - assertEquals(true, flowCell.mkdir()); - File logs = new File(flowCell, "logs"); - assertEquals(true, logs.mkdir()); - FileUtilities.writeToFile(new File(logs, "basic.log"), "hello log"); - File srfFolder = new File(flowCell, "SRF"); - assertEquals(true, srfFolder.mkdir()); - File originalFlowLane1 = new File(srfFolder, "s_1.srf"); - File originalFlowLane1Fastq = new File(srfFolder, "s_1.fastq"); - FileUtilities.writeToFile(originalFlowLane1, "hello flow lane 1"); - FileUtilities.writeToFile(originalFlowLane1Fastq, "fastq"); - File originalFlowLane2 = new File(srfFolder, "2.srf"); - File originalFlowLane2Fasta = new File(srfFolder, "2.fasta"); - File originalFlowLane2Pdf = new File(srfFolder, "2_boxplot.pdf"); - File originalFlowLane2Xxx = new File(srfFolder, "2abc.xxx"); - FileUtilities.writeToFile(originalFlowLane2, "hello flow lane 2"); - FileUtilities.writeToFile(originalFlowLane2Fasta, "fasta"); - FileUtilities.writeToFile(originalFlowLane2Pdf, "pdf"); - FileUtilities.writeToFile(originalFlowLane2Xxx, "xxx"); - File originalFlowLane2Dir = new File(srfFolder, "2dir"); - assertEquals(true, originalFlowLane2Dir.mkdir()); - File internalDirFile1 = new File(originalFlowLane2Dir, "file1"); - File internalDirFile2 = new File(originalFlowLane2Dir, "file2"); - FileUtilities.writeToFile(internalDirFile1, "internal 1"); - FileUtilities.writeToFile(internalDirFile2, "internal 2"); - File srf_info_file = new File(srfFolder, "srf_info.txt"); - FileUtilities.writeToFile(srf_info_file, - "Reading archive ETHZ_BSSE_100602_61VVHAAXX_1.srf.\n" - + "Reading srf null index block\n" + "Reads: GOOD : 20712959\n" - + "Reads: BAD : 7270034\n" + "Reads: TOTAL : 27982993"); - prepareLoadFlowCellSample(EXAMPLE_FLOW_CELL_SAMPLE); - - Sample fl1 = createFlowLaneSample(1); - Sample fl2 = createFlowLaneSample(2); - prepareListFlowLanes(EXAMPLE_FLOW_CELL_SAMPLE, Arrays.asList(fl1, fl2)); - prepareGetProperties(Arrays.asList(fl1, fl2)); - - flowLaneFeeder.handle(flowCell, EXAMPLE_DATA_SET_INFO, null); - - checkFlowLaneDataSet(originalFlowLane1, "1"); - checkFlowLaneDataSet(originalFlowLane2, "2"); - - File[] transferedFiles = transferDropBox.listFiles(); - Arrays.sort(transferedFiles); - assertEquals(2, transferedFiles.length); - assertEquals("2.srf", transferedFiles[0].getName()); - File metaFile = transferedFiles[1]; - assertEquals(META_DATA_PREFIX + SAMPLE_CODE + "_2" + FlowLaneFeeder.META_DATA_FILE_TYPE, - metaFile.getName()); - assertHardLinkOnSameFile(originalFlowLane2, transferedFiles[0]); - - context.assertIsSatisfied(); - } - - @Test - public void testInvalidSRFFile() - { - flowLaneFeeder = createFeeder("exit 1"); - flowLaneFeeder.setUpdateDataTransferredProperty(false); - File flowCell = new File(workingDirectory, SAMPLE_CODE); - assertEquals(true, flowCell.mkdir()); - File originalFlowLane1 = new File(flowCell, "s_1.srf"); - FileUtilities.writeToFile(originalFlowLane1, "hello flow lane 1"); - prepareLoadFlowCellSample(EXAMPLE_FLOW_CELL_SAMPLE); - - Sample fl1 = createFlowLaneSample(1); - prepareListFlowLanes(EXAMPLE_FLOW_CELL_SAMPLE, Arrays.asList(fl1)); - - try - { - flowLaneFeeder.handle(flowCell, EXAMPLE_DATA_SET_INFO, null); - fail("UserFailureException expected"); - } catch (UserFailureException ex) - { - AssertionUtil.assertContains("Invalid SRF file", ex.getMessage()); - AssertionUtil.assertContains("s_1.srf", ex.getMessage()); - } - - context.assertIsSatisfied(); - } - - @Test - public void testUndoLastOperation() - { - testHappyCase(); - assertEquals(2, dropBox1.list().length); - assertEquals(2, dropBox2.list().length); - assertEquals(2, transferDropBox.list().length); - - flowLaneFeeder.undoLastOperation(); - - assertEquals(0, dropBox1.list().length); - assertEquals(0, dropBox2.list().length); - assertEquals(0, transferDropBox.list().length); - } - - private void prepareLoadFlowCellSample(final Sample flowCellSample) - { - context.checking(new Expectations() - { - { - one(service).tryGetSampleWithExperiment( - EXAMPLE_DATA_SET_INFO.getSampleIdentifier()); - will(returnValue(flowCellSample)); - } - }); - } - - private void prepareListFlowLanes(final Sample flowCellSample, - final List<Sample> flowLaneSamples) - { - context.checking(new Expectations() - { - { - one(service).listSamples(with(new BaseMatcher<ListSampleCriteria>() - { - - @Override - public boolean matches(Object item) - { - if (item instanceof ListSampleCriteria) - { - ListSampleCriteria criteria = (ListSampleCriteria) item; - return criteria.getContainerSampleIds().iterator().next() - .equals(flowCellSample.getId()); - } - return false; - } - - @Override - public void describeTo(Description description) - { - description.appendText("Flow cell with ID " - + flowCellSample.getId()); - } - })); - will(returnValue(flowLaneSamples)); - } - }); - } - - private void prepareGetProperties(final List<Sample> flowLaneSamples) - { - context.checking(new Expectations() - { - { - for (Sample sample : flowLaneSamples) - { - SampleIdentifier identifier = - SampleIdentifierFactory.parse(sample.getIdentifier()); - one(service).tryGetPropertiesOfTopSample(identifier); - if (sample.getSubCode().equals("2")) - { - GenericEntityProperty p1 = - createProperty(FlowLaneFeeder.AFFILIATION_KEY, AFFILIATION); - GenericEntityProperty p2 = - createProperty(FlowLaneFeeder.EXTERNAL_SAMPLE_NAME_KEY, - EXTERNAL_SAMPLE_NAME); - will(returnValue(new GenericEntityProperty[] - { p1, p2 })); - } - } - } - - private GenericEntityProperty createProperty(String key, String value) - { - GenericEntityProperty p = new GenericEntityProperty(); - p.setValue(FlowLaneFeeder.escapeSampleCode(value)); - PropertyType propertyType = new PropertyType(); - propertyType.setCode(FlowLaneFeeder.escapeSampleCode(key)); - propertyType.setLabel(FlowLaneFeeder.escapeSampleCode(key).toLowerCase()); - p.setPropertyType(propertyType); - return p; - } - }); - } - - private void checkFlowLaneDataSet(File originalFlowLane, String flowLaneNumber) - { - File dropBox = - new File(workingDirectory, DROP_BOX_PREFIX - + FlowLaneFeeder.escapeSampleCode(flowLaneNumber)); - String fileName = - "G" + FlowLaneFeeder.escapeSampleCode(flowLaneNumber) - + FlowLaneFeeder.DEFAULT_ENTITY_SEPARATOR + SAMPLE_CODE - + FLOW_LANE_NUMBER_SEPARATOR - + FlowLaneFeeder.escapeSampleCode(flowLaneNumber); - File ds = new File(dropBox, FlowLaneFeeder.escapeSampleCode(fileName)); - assertEquals(true, ds.isDirectory()); - - File flowLane = new File(ds, originalFlowLane.getName()); - assertEquals(true, flowLane.isFile()); - assertEquals(FileUtilities.loadToString(originalFlowLane), - FileUtilities.loadToString(flowLane)); - assertHardLinkOnSameFile(originalFlowLane, flowLane); - String metaDataFileName = - META_DATA_PREFIX - + (SAMPLE_CODE + "_" + FlowLaneFeeder.escapeSampleCode(flowLaneNumber)) - + FlowLaneFeeder.META_DATA_FILE_TYPE; - assertEquals(true, new File(ds, FlowLaneFeeder.escapeSampleCode(metaDataFileName)).exists()); - assertEquals( - true, - new File(dropBox, FileConstants.IS_FINISHED_PREFIX - + FlowLaneFeeder.escapeSampleCode(fileName)).exists()); - } - - private void assertHardLinkOnSameFile(File file1, File file2) - { - // check hard-link copy by changing last-modified date of one file should change - // last-modified date of the other file. - file1.setLastModified(4711000); - assertEquals(4711000, file2.lastModified()); - } - - private Sample createFlowLaneSample(int flowLaneNumber, IEntityProperty... properties) - { - Sample sample = new Sample(); - sample.setId((long) flowLaneNumber); - sample.setCode(SAMPLE_CODE + ":" + flowLaneNumber); - Space space = new Space(); - space.setCode("G" + flowLaneNumber); - sample.setSpace(space); - sample.setSubCode(Integer.toString(flowLaneNumber)); - sample.setGeneratedFrom(EXAMPLE_FLOW_CELL_SAMPLE); - Person registrator = new Person(); - registrator.setEmail("ab@c.de"); - sample.setRegistrator(registrator); - sample.setIdentifier(SAMPLE_CODE + ":" + flowLaneNumber); - SampleType type = new SampleType(); - type.setCode(FLOW_LANE); - sample.setSampleType(type); - sample.setProperties(Arrays.asList(properties)); - return sample; - } - - private FlowLaneFeeder createFeeder(String srfInfoScriptOrNull) - { - Properties properties = new Properties(); - properties.setProperty(FlowLaneFeeder.FLOW_LANE_DROP_BOX_TEMPLATE, new File( - workingDirectory, DROP_BOX_PREFIX).getAbsolutePath() + "{0}"); - properties.setProperty(FlowLaneFeeder.META_DATA_FILE_PREFIX, META_DATA_PREFIX); - properties.setProperty(FlowLaneFeeder.TRANSFER_PREFIX + AFFILIATION, - transferDropBox.getAbsolutePath()); - if (srfInfoScriptOrNull != null) - { - properties.setProperty(FlowLaneFeeder.SRF_INFO_PATH, srfInfo.getAbsolutePath()); - FileUtilities.writeToFile(srfInfo, srfInfoScriptOrNull); - File chmod = OSUtilities.findExecutable("chmod"); - assertNotNull(chmod); - try - { - String cmd = chmod.getAbsolutePath() + " +x " + srfInfo.getAbsolutePath(); - Runtime.getRuntime().exec(cmd).waitFor(); - } catch (Exception ex) - { - throw CheckedExceptionTunnel.wrapIfNecessary(ex); - } - } - return new FlowLaneFeeder(properties, service); - } - -} diff --git a/deep_sequencing_unit/sourceTest/java/ch/ethz/bsse/cisd/dsu/dss/plugins/.gitignore b/deep_sequencing_unit/sourceTest/java/ch/ethz/bsse/cisd/dsu/dss/plugins/.gitignore deleted file mode 100644 index c08e0e25cf3435f7585bf9cd40e2971117c24f33..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/sourceTest/java/ch/ethz/bsse/cisd/dsu/dss/plugins/.gitignore +++ /dev/null @@ -1 +0,0 @@ -/IlluminaSummaryXMLLoaderTestSpeed.java diff --git a/deep_sequencing_unit/sourceTest/java/ch/ethz/bsse/cisd/dsu/dss/plugins/DataSetToSOFTTest.java b/deep_sequencing_unit/sourceTest/java/ch/ethz/bsse/cisd/dsu/dss/plugins/DataSetToSOFTTest.java deleted file mode 100644 index 7967dde169c77747fbd8971c3c5b1cfb05122283..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/sourceTest/java/ch/ethz/bsse/cisd/dsu/dss/plugins/DataSetToSOFTTest.java +++ /dev/null @@ -1,277 +0,0 @@ -/* - * Copyright 2010 ETH Zuerich, CISD - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package ch.ethz.bsse.cisd.dsu.dss.plugins; - -import java.io.File; -import java.io.IOException; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.HashMap; -import java.util.List; -import java.util.Properties; - -import javax.activation.DataHandler; -import javax.activation.DataSource; - -import org.apache.commons.io.IOUtils; -import org.apache.log4j.Level; -import org.hamcrest.core.IsNull; -import org.jmock.Expectations; -import org.jmock.Mockery; -import org.testng.annotations.AfterMethod; -import org.testng.annotations.BeforeMethod; -import org.testng.annotations.Test; - -import ch.rinn.restrictions.Friend; -import ch.systemsx.cisd.base.tests.AbstractFileSystemTestCase; -import ch.systemsx.cisd.common.filesystem.FileUtilities; -import ch.systemsx.cisd.common.logging.BufferedAppender; -import ch.systemsx.cisd.common.mail.EMailAddress; -import ch.systemsx.cisd.common.mail.IMailClient; -import ch.systemsx.cisd.common.string.Template; -import ch.systemsx.cisd.common.test.RecordingMatcher; -import ch.systemsx.cisd.openbis.dss.generic.server.plugins.standard.MockDataSetDirectoryProvider; -import ch.systemsx.cisd.openbis.dss.generic.shared.DataSetProcessingContext; -import ch.systemsx.cisd.openbis.dss.generic.shared.IEncapsulatedOpenBISService; -import ch.systemsx.cisd.openbis.dss.generic.shared.IProcessingPluginTask; -import ch.systemsx.cisd.openbis.dss.generic.shared.ProcessingStatus; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.PhysicalDataSet; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.EntityProperty; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.IEntityProperty; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ListSampleCriteria; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.PropertyType; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Sample; -import ch.systemsx.cisd.openbis.generic.shared.dto.DatasetDescription; -import ch.systemsx.cisd.openbis.generic.shared.dto.identifier.SampleIdentifierFactory; - -/** - * @author Franz-Josef Elmer - * @param <workingDirectory> - */ -@Friend(toClasses = DataSetToSOFT.class) -public class DataSetToSOFTTest<workingDirectory> extends AbstractFileSystemTestCase -{ - private static final String SHARE_ID = "42"; - - private static final String USER_EMAIL = "user@ho.me"; - - private static final String USER_ID = "test-user"; - - private static final String SRF_FILE_NAME = "sample.srf"; - - private static final String SRF_FILE_CONTENT = "hello world!"; - - private static final String DATASET_CODE = "ds-1"; - - private static final String FLOW_LANE_SAMPLE_CODE = "flow-lane:1"; - - private BufferedAppender logRecorder; - - private Mockery context; - - private IEncapsulatedOpenBISService service; - - private IMailClient mailClient; - - private DataSetProcessingContext dataSetProcessingContext; - - private IProcessingPluginTask processingPlugin; - - @BeforeMethod - public void beforeMethod() - { - logRecorder = new BufferedAppender("%-5p %c - %m%n", Level.DEBUG); - context = new Mockery(); - service = context.mock(IEncapsulatedOpenBISService.class); - mailClient = context.mock(IMailClient.class); - dataSetProcessingContext = - new DataSetProcessingContext(null, new MockDataSetDirectoryProvider( - workingDirectory, SHARE_ID), new HashMap<String, String>(), mailClient, - USER_ID, USER_EMAIL); - File testFolder = new File(new File(workingDirectory, SHARE_ID), "test"); - testFolder.mkdirs(); - File sampleSrfFile = new File(testFolder, SRF_FILE_NAME); - FileUtilities.writeToFile(sampleSrfFile, SRF_FILE_CONTENT); - processingPlugin = createProcessingPlugin(workingDirectory, service); - } - - private static IProcessingPluginTask createProcessingPlugin(File workingDirectory, - IEncapsulatedOpenBISService service) - { - DataSetToSOFT plugin = new DataSetToSOFT(new Properties(), workingDirectory); - plugin.setService(service); - return plugin; - } - - @AfterMethod - public void afterMethod() - { - logRecorder.reset(); - // To following line of code should also be called at the end of each test method. - // Otherwise one do not known which test failed. - context.assertIsSatisfied(); - } - - @Test - public void test() throws IOException - { - DatasetDescription datasetDescription = new DatasetDescription(); - datasetDescription.setDataSetCode(DATASET_CODE); - datasetDescription.setDataSetLocation("."); - List<DatasetDescription> dataSets = Arrays.asList(datasetDescription); - final Sample flowLaneSample = sample(42, FLOW_LANE_SAMPLE_CODE); - flowLaneSample.setCode(FLOW_LANE_SAMPLE_CODE); - prepareGetDataSet(DATASET_CODE, flowLaneSample); - Sample flowCellSample = sample(43, "flow-cell"); - addProperty(flowCellSample, "GENOME_ANALYZER", "my-analyzer"); - final Sample sequencingSample = sample(44, "sequencing"); - addProperty(sequencingSample, DataSetToSOFT.EXTERNAL_SAMPLE_NAME_PROPERTY, "my sample"); - addProperty(sequencingSample, "SAMPLE_SOURCE_NAME", "source"); - addProperty(sequencingSample, "NCBI_ORGANISM_TAXONOMY", "organism"); - addProperty(sequencingSample, "CONTACT_PERSON_NAME", "person"); - addProperty(sequencingSample, "SAMPLE_MOLECULE", "total_rna"); - addProperty(sequencingSample, "SEQUENCING_APPLICATION", "application"); - addProperty(sequencingSample, "SAMPLE_EXTRACT_PROTOCOL", "protocol"); - addProperty(sequencingSample, "SAMPLE_DATA_PROCESSING", "processing"); - addProperty(sequencingSample, "SAMPLE_LIBRARY_SELECTION", "cDNA"); - addProperty(sequencingSample, "SAMPLE_LIBRARY_STRATEGY", "RNA-Seq"); - addProperty(sequencingSample, "SAMPLE_KIND", "CHIP"); - flowLaneSample.setContainer(flowCellSample); - prepareGetSample(flowLaneSample); - prepareGetSample(flowCellSample); - final RecordingMatcher<ListSampleCriteria> listSampleCriteriaMatcher = - new RecordingMatcher<ListSampleCriteria>(); - final RecordingMatcher<String> subjectMatcher = new RecordingMatcher<String>(); - final RecordingMatcher<String> contentMatcher = new RecordingMatcher<String>(); - final RecordingMatcher<String> fileNameMatcher = new RecordingMatcher<String>(); - final RecordingMatcher<DataHandler> attachmentMatcher = new RecordingMatcher<DataHandler>(); - final RecordingMatcher<EMailAddress[]> addressesMatcher = - new RecordingMatcher<EMailAddress[]>(); - context.checking(new Expectations() - { - { - one(service).listSamples(with(listSampleCriteriaMatcher)); - will(returnValue(Arrays.asList(sequencingSample))); - - one(mailClient).sendEmailMessageWithAttachment(with(subjectMatcher), - with(contentMatcher), with(fileNameMatcher), with(attachmentMatcher), - with(new IsNull<EMailAddress>()), with(new IsNull<EMailAddress>()), - with(addressesMatcher)); - } - }); - - ProcessingStatus status = processingPlugin.process(dataSets, dataSetProcessingContext); - - assertEquals(0, status.getErrorStatuses().size()); - assertEquals(flowLaneSample.getId(), listSampleCriteriaMatcher.recordedObject() - .getChildSampleId().getId()); - Template template = initTemplate(DataSetToSOFT.E_MAIL_SUBJECT_TEMPLATE); - assertEquals(template.createText(), subjectMatcher.recordedObject()); - Template content = initTemplate(DataSetToSOFT.E_MAIL_CONTENT_TEMPLATE); - content.bind("flow-lane", flowLaneSample.getCode()); - content.bind("data-set", DATASET_CODE); - assertEquals(content.createText(), contentMatcher.recordedObject()); - Template fileNameTemplate = DataSetToSOFT.SOFT_FILE_NAME_TEMPLATE.createFreshCopy(); - fileNameTemplate.bind("external-sample-name", "my_sample"); - fileNameTemplate.bind("flow-lane", flowLaneSample.getCode().replace(':', '-')); - assertEquals(fileNameTemplate.createText(), fileNameMatcher.recordedObject()); - assertEquals(USER_EMAIL, addressesMatcher.recordedObject()[0].tryGetEmailAddress()); - DataSource dataSource = attachmentMatcher.recordedObject().getDataSource(); - String attachmentContent = getContent(dataSource); - assertEquals("^SAMPLE = my sample\n" + "!Sample_type = SRA\n" - + "!Sample_title = my sample\n" + "!Sample_source_name = source\n" - + "!Sample_organism = organism\n" - + "!Sample_characteristics = <<<NEED_TO_BE_FILLED>>>\n" - + "!Sample_biomaterial_provider = person\n" + "!Sample_molecule = total_rna\n" - + "!Sample_extract_protocol = protocol\n" - + "!Sample_data_processing = processing\n" + "!Sample_library_strategy = RNA-Seq\n" - + "!Sample_library_source = genomic\n" + "!Sample_library_selection = cDNA\n" - + "!Sample_instrument_model = my-analyzer\n" + "!Sample_raw_file_1 = sample.srf\n" - + "!Sample_raw_file_type_1 = srf\n" - + "!Sample_file_checksum_1 = fc3ff98e8c6a0d3087d515c0473f8677\n", attachmentContent); - context.assertIsSatisfied(); - } - - String getContent(DataSource dataSource) throws IOException - { - StringBuilder builder = new StringBuilder(); - @SuppressWarnings("rawtypes") - List fileLines = IOUtils.readLines(dataSource.getInputStream()); - for (Object object : fileLines) - { - builder.append(object).append('\n'); - } - return builder.toString(); - } - - Template initTemplate(Template originalTemplate) - { - Template template = originalTemplate.createFreshCopy(); - template.bind("external-sample-name", "my sample"); - return template; - } - - private void prepareGetDataSet(final String dataSetCode, final Sample flowLaneSample) - { - context.checking(new Expectations() - { - { - one(service).tryGetDataSet(dataSetCode); - PhysicalDataSet dataSet = new PhysicalDataSet(); - dataSet.setCode(dataSetCode); - dataSet.setSample(flowLaneSample); - will(returnValue(dataSet)); - } - }); - } - - private void prepareGetSample(final Sample sample) - { - context.checking(new Expectations() - { - { - one(service).tryGetSampleWithExperiment( - SampleIdentifierFactory.parse(sample.getIdentifier())); - will(returnValue(sample)); - } - }); - } - - private void addProperty(Sample sample, String propertyTypeCode, String value) - { - List<IEntityProperty> properties = sample.getProperties(); - if (properties == null) - { - properties = new ArrayList<IEntityProperty>(); - sample.setProperties(properties); - } - EntityProperty property = new EntityProperty(); - PropertyType propertyType = new PropertyType(); - propertyType.setCode(propertyTypeCode); - property.setPropertyType(propertyType); - property.setValue(value); - properties.add(property); - } - - private Sample sample(long id, String identifier) - { - Sample sample = new Sample(); - sample.setId(id); - sample.setIdentifier(identifier); - return sample; - } -} diff --git a/deep_sequencing_unit/sourceTest/java/ch/ethz/bsse/cisd/dsu/dss/plugins/IlluminaSummaryXMLLoaderTest.java b/deep_sequencing_unit/sourceTest/java/ch/ethz/bsse/cisd/dsu/dss/plugins/IlluminaSummaryXMLLoaderTest.java deleted file mode 100644 index 7624171f0a9db1d8dc3232fd291dd33af38a785d..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/sourceTest/java/ch/ethz/bsse/cisd/dsu/dss/plugins/IlluminaSummaryXMLLoaderTest.java +++ /dev/null @@ -1,200 +0,0 @@ -/* - * Copyright 2009 ETH Zuerich, CISD - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package ch.ethz.bsse.cisd.dsu.dss.plugins; - -import java.io.File; - -import org.testng.annotations.Test; - -import ch.systemsx.cisd.base.tests.AbstractFileSystemTestCase; -import ch.systemsx.cisd.common.filesystem.FileUtilities; - -/** - * @author Franz-Josef Elmer - */ -public class IlluminaSummaryXMLLoaderTest extends AbstractFileSystemTestCase -{ - @Test - public void test() - { - File file = new File(workingDirectory, "test.xml"); - FileUtilities.writeToFile(file, EXAMPLE); - IlluminaSummary summary = - IlluminaSummaryReportingPlugin.IlluminaSummaryXMLLoader.readSummaryXML(file); - - ChipResultsSummary chipResultsSummary = summary.getChipResultsSummary(); - LaneResultsSummary laneResultsSummary = summary.getLaneResultsSummary(); - assertEquals(Long.valueOf(98792458L), chipResultsSummary.getClusterCountPF()); - assertEquals(Long.valueOf(158466917L), chipResultsSummary.getClusterCountRaw()); - assertEquals(Long.valueOf(3556528488L), chipResultsSummary.getYield()); - // if not there yhen take the init value - assertEquals(Double.valueOf(0.0), chipResultsSummary.getDensityRatio()); - - assertEquals(Long.valueOf(381287L), laneResultsSummary.getRead().getLanes().get(0) - .getClusterCountRaw().getMean()); - assertEquals(Long.valueOf(277736L), laneResultsSummary.getRead().getLanes().get(0) - .getClusterCountPF().getMean()); - assertEquals(Long.valueOf(1199819L), laneResultsSummary.getRead().getLanes().get(0) - .getLaneYield()); - assertEquals(Double.valueOf(79.37), laneResultsSummary.getRead().getLanes().get(0) - .getPercentUniquelyAlignedPF().getMean()); - - if (summary.getSoftware() == "") - { - assertEquals("", summary.getSoftware()); - } else - { - assertEquals("CASAVA-1.6.0", summary.getSoftware()); - } - } - - /** - * - */ - protected static final String EXAMPLE = "<?xml version='1.0' ?>\n " - + "<?xml-stylesheet type='text/xsl' href='Summary.xsl' ?>\n " - + "<Summary> " - + " <ChipResultsSummary> " - + " <clusterCountPF>98792458</clusterCountPF> " - + " <clusterCountRaw>158466917</clusterCountRaw> " - + " <yield>3556528488</yield> " - + " </ChipResultsSummary> " - + " <ChipSummary> " - + " <ChipID>unknown</ChipID> " - + " <Machine>HWI-EAS264</Machine> " - + " <RunFolder>090916_42R0CAAXX</RunFolder> " - + " </ChipSummary> " - + " <Date>Tue Oct 20 18:15:43 2009</Date> " - + " <ExpandedLaneSummary> " - + " <Read> " - + " <readNumber>1</readNumber> " - + " <Lane> " - + " <laneNumber>1</laneNumber> " - + " <clusterCountRaw> " - + " <mean>381286.80</mean> " - + " <stdev>28613.35</stdev> " - + " <sumsq>98246880000.00</sumsq> " - + " </clusterCountRaw> " - + " <errorPF> " - + " <mean>0.72</mean> " - + " <stdev>0.49</stdev> " - + " <sumsq>90.37</sumsq> " - + " </errorPF> " - + " <errorRaw> " - + " <mean>0.83</mean> " - + " <stdev>0.48</stdev> " - + " <sumsq>110.63</sumsq> " - + " </errorRaw> " - + " <infoContentPF> " - + " <mean>213494</mean> " - + " <stdev>9929</stdev> " - + " <sumsq>5481321756576</sumsq> " - + " </infoContentPF> " - + " <infoContentRaw> " - + " <mean>229532</mean> " - + " <stdev>11786</stdev> " - + " <sumsq>6338734406410</sumsq> " - + " </infoContentRaw> " - + " <percentClustersPF> " - + " <mean>73.03</mean> " - + " <stdev>2.72</stdev> " - + " <sumsq>890.49</sumsq> " - + " </percentClustersPF> " - + " <percentUniquelyAlignedPF> " - + " <mean>79.37</mean> " - + " <stdev>0.86</stdev> " - + " <sumsq>755955.73</sumsq> " - + " </percentUniquelyAlignedPF> " - + " <phasingApplied>0.8203</phasingApplied> " - + " <prephasingApplied>0.3881</prephasingApplied> " - + " <signalAverage1to3> " - + " <mean>526.07</mean> " - + " <stdev>43.17</stdev> " - + " <sumsq>223675.10</sumsq> " - + " </signalAverage1to3> " - + " <signalAverage2to4> " - + " <mean>519.91</mean> " - + " <stdev>41.72</stdev> " - + " <sumsq>208871.60</sumsq> " - + " </signalAverage2to4> " - + " <signalLoss10to20> " - + " <mean>1.01</mean> " - + " <stdev>0.40</stdev> " - + " <sumsq>19.25</sumsq> " - + " </signalLoss10to20> " - + " <signalLoss2to10> " - + " <mean>0.45</mean> " - + " <stdev>0.53</stdev> " - + " <sumsq>33.94</sumsq> " - + " </signalLoss2to10> " - + " </Lane> " - + " </Read> " - + " </ExpandedLaneSummary> " - + " <LaneParameterSummary/> " - + " <LaneResultsSummary> " - + " <Read> " - + " <readNumber>1</readNumber> " - + " <Lane> " - + " <laneNumber>1</laneNumber> " - + " <averageAlignScorePF> " - + " <mean>94.25</mean> " - + " <stdev>3.64</stdev> " - + " <sumsq>1067460.47</sumsq> " - + " </averageAlignScorePF> " - + " <clusterCountPF> " - + " <mean>277736</mean> " - + " <stdev>11981</stdev> " - + " <sumsq>17224950000</sumsq> " - + " </clusterCountPF> " - + " <clusterCountRaw> " - + " <mean>381287</mean> " - + " <stdev>28613</stdev> " - + " <sumsq>98246880000</sumsq> " - + " </clusterCountRaw> " - + "<errorPF> " - + "<mean>0.72</mean> " - + "<stdev>0.49</stdev> " - + "<sumsq>90.37</sumsq> " - + "</errorPF> " - + "<laneYield>1199819</laneYield> " - + "<oneSig> " - + "<mean>536</mean> " - + "<stdev>46</stdev> " - + "<sumsq>256164</sumsq> " - + "</oneSig> " - + "<percentClustersPF> " - + "<mean>73.03</mean> " - + "<stdev>2.72</stdev> " - + "<sumsq>890.49</sumsq> " - + "</percentClustersPF> " - + "<percentUniquelyAlignedPF> " - + "<mean>79.37</mean> " - + "<stdev>0.86</stdev> " - + "<sumsq>755955.73</sumsq> " - + "</percentUniquelyAlignedPF> " - + "<signal20AsPctOf1> " - + "<mean>82.19</mean> " - + "<stdev>5.09</stdev> " - + "<sumsq>3103.16</sumsq> " - + "</signal20AsPctOf1> " - + " </Lane> " - + " </Read> " - + " </LaneResultsSummary> " - + " <TileErrorsByLane/> " - + " <Software>CASAVA-1.6.0</Software> " - + "</Summary>"; -} diff --git a/deep_sequencing_unit/sourceTest/java/ch/ethz/bsse/cisd/dsu/dss/systemtests/DSUDropboxSystemTest.java b/deep_sequencing_unit/sourceTest/java/ch/ethz/bsse/cisd/dsu/dss/systemtests/DSUDropboxSystemTest.java deleted file mode 100644 index 93acd2960e2cb9f07095ba786fa840de69e2b54f..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/sourceTest/java/ch/ethz/bsse/cisd/dsu/dss/systemtests/DSUDropboxSystemTest.java +++ /dev/null @@ -1,73 +0,0 @@ -/* - * Copyright 2014 ETH Zuerich, CISD - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package ch.ethz.bsse.cisd.dsu.dss.systemtests; - -import org.testng.annotations.BeforeSuite; - -import ch.systemsx.cisd.openbis.datastoreserver.systemtests.GenericDropboxSystemTest; -import ch.systemsx.cisd.openbis.generic.shared.ICommonServer; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DataType; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DataTypeCode; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.EntityKind; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.NewETPTAssignment; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.PropertyType; - -/** - * @author pkupczyk - */ -public abstract class DSUDropboxSystemTest extends GenericDropboxSystemTest -{ - - @Override - @BeforeSuite - public void beforeSuite() throws Exception - { - initializePythonImportPath(); - DSUTestInitializer.init(); - super.beforeSuite(); - initializeMasterData(); - } - - @Override - protected String getDropboxIncomingDirectoryName() - { - return getDropboxName(); - } - - private void initializePythonImportPath() - { - System.setProperty("python.path", "sourceTest/core-plugins/illumina-qgf/1/jython-lib"); - } - - private void initializeMasterData() - { - String sessionToken = getGeneralInformationService().tryToAuthenticateForAllServices("kohleman", "password"); - ICommonServer commonServer = getBean("common-server"); - PropertyType propertyType = new PropertyType(); - propertyType.setCode("CONTROL_SOFTWARE_VERSION"); - propertyType.setDataType(new DataType(DataTypeCode.VARCHAR)); - propertyType.setLabel("Control Software Version"); - propertyType.setDescription(propertyType.getLabel()); - NewETPTAssignment assignment = new NewETPTAssignment(); - assignment.setPropertyTypeCode(propertyType.getCode()); - assignment.setEntityTypeCode("ILLUMINA_FLOW_CELL"); - assignment.setEntityKind(EntityKind.SAMPLE); - assignment.setOrdinal(1000L); - commonServer.registerAndAssignPropertyType(sessionToken, propertyType, assignment); - } - -} diff --git a/deep_sequencing_unit/sourceTest/java/ch/ethz/bsse/cisd/dsu/dss/systemtests/DSUSystemTest.java b/deep_sequencing_unit/sourceTest/java/ch/ethz/bsse/cisd/dsu/dss/systemtests/DSUSystemTest.java deleted file mode 100644 index b3a7fad8fc74cfc8e97dd6cade4b48703393bb14..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/sourceTest/java/ch/ethz/bsse/cisd/dsu/dss/systemtests/DSUSystemTest.java +++ /dev/null @@ -1,37 +0,0 @@ -/* - * Copyright 2014 ETH Zuerich, CISD - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package ch.ethz.bsse.cisd.dsu.dss.systemtests; - -import org.testng.annotations.BeforeSuite; - -import ch.systemsx.cisd.openbis.datastoreserver.systemtests.GenericSystemTest; - -/** - * @author pkupczyk - */ -public abstract class DSUSystemTest extends GenericSystemTest -{ - - @Override - @BeforeSuite - public void beforeSuite() throws Exception - { - DSUTestInitializer.init(); - super.beforeSuite(); - } - -} diff --git a/deep_sequencing_unit/sourceTest/java/ch/ethz/bsse/cisd/dsu/dss/systemtests/DSUTestInitializer.java b/deep_sequencing_unit/sourceTest/java/ch/ethz/bsse/cisd/dsu/dss/systemtests/DSUTestInitializer.java deleted file mode 100644 index 169b95dc6e0d304547895d3f69122cd3000f21ce..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/sourceTest/java/ch/ethz/bsse/cisd/dsu/dss/systemtests/DSUTestInitializer.java +++ /dev/null @@ -1,72 +0,0 @@ -/* - * Copyright 2014 ETH Zuerich, CISD - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package ch.ethz.bsse.cisd.dsu.dss.systemtests; - -import java.io.File; - -import ch.systemsx.cisd.openbis.generic.server.util.TestInitializer; -import ch.systemsx.cisd.openbis.test.server.TestDatabase; - -/** - * @author pkupczyk - */ -public class DSUTestInitializer -{ - - private static String dbKind = "test_qgf"; - - public static void setDbKind(String dbKind) - { - DSUTestInitializer.dbKind = dbKind; - } - - private static String getDBKind() - { - return dbKind; - } - - private static String getDBName() - { - return "openbis_" + getDBKind(); - } - - public static void init() - { - File sqlDumpFile = new File("resource/test-db/" + getDBName() + ".sql"); - File binaryDumpFile = new File("resource/test-db/" + getDBName() + ".dmp"); - - File dumpFile = null; - if (sqlDumpFile.exists()) - { - dumpFile = sqlDumpFile; - } else if (binaryDumpFile.exists()) - { - dumpFile = binaryDumpFile; - } else - { - throw new IllegalArgumentException("No dump file found."); - } - - TestDatabase.restoreDump(dumpFile, getDBName()); - - TestInitializer.setScriptFolderForEmptyDB("../openbis/source"); - TestInitializer.setScriptFolderForTestDB("../openbis/source"); - TestInitializer.setDBKind(getDBKind()); - TestInitializer.setCreateDBFromScratch(false); - } - -} diff --git a/deep_sequencing_unit/sourceTest/java/ch/ethz/bsse/cisd/dsu/dss/systemtests/DemoDropboxTest.java b/deep_sequencing_unit/sourceTest/java/ch/ethz/bsse/cisd/dsu/dss/systemtests/DemoDropboxTest.java deleted file mode 100644 index a2ef1fc3307598f7b9eef51037ba71e78d0af433..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/sourceTest/java/ch/ethz/bsse/cisd/dsu/dss/systemtests/DemoDropboxTest.java +++ /dev/null @@ -1,64 +0,0 @@ -/* - * Copyright 2014 ETH Zuerich, CISD - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package ch.ethz.bsse.cisd.dsu.dss.systemtests; - -import java.util.List; - -import org.testng.Assert; -import org.testng.annotations.Test; - -import ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.Experiment; -import ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.SearchCriteria; -import ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.SearchCriteria.MatchClause; -import ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.SearchCriteria.MatchClauseAttribute; - -/** - * @author pkupczyk - */ -public class DemoDropboxTest extends DSUDropboxSystemTest -{ - - @Override - protected String getDropboxName() - { - return "demo-dropbox"; - } - - @Override - protected String getDropboxIncomingDirectoryName() - { - return "incoming-demo-dropbox"; - } - - @Test - public void testDropbox() throws Exception - { - importData("demo-data"); - waitUntilDataImported(); - waitUntilIndexUpdaterIsIdle(); - - String sessionToken = getGeneralInformationService().tryToAuthenticateForAllServices("kohleman", "password"); - - // check that the new created experiments are there - SearchCriteria criteria = new SearchCriteria(); - criteria.addMatchClause(MatchClause.createAttributeMatch(MatchClauseAttribute.CODE, "DEMO-EXPERIMENT*")); - - List<Experiment> experiments = getGeneralInformationService().searchForExperiments(sessionToken, criteria); - Assert.assertEquals(experiments.size(), 2); - } - -} \ No newline at end of file diff --git a/deep_sequencing_unit/sourceTest/java/ch/ethz/bsse/cisd/dsu/tracking/main/FileBasedTrackingDAOTest.java b/deep_sequencing_unit/sourceTest/java/ch/ethz/bsse/cisd/dsu/tracking/main/FileBasedTrackingDAOTest.java deleted file mode 100644 index a6d3851332a0ca42dcd1a29510088b69001ab134..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/sourceTest/java/ch/ethz/bsse/cisd/dsu/tracking/main/FileBasedTrackingDAOTest.java +++ /dev/null @@ -1,212 +0,0 @@ -/* - * Copyright 2009 ETH Zuerich, CISD - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package ch.ethz.bsse.cisd.dsu.tracking.main; - -import java.io.File; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.TreeMap; -import java.util.TreeSet; - -import org.apache.commons.lang3.StringUtils; -import org.testng.annotations.BeforeMethod; -import org.testng.annotations.Test; - -import ch.ethz.bsse.cisd.dsu.tracking.dto.TrackedEntities; -import ch.ethz.bsse.cisd.dsu.tracking.dto.TrackingStateDTO; -import ch.ethz.bsse.cisd.dsu.tracking.main.TrackingBO.TrackingStateUpdateHelper; -import ch.systemsx.cisd.base.tests.AbstractFileSystemTestCase; -import ch.systemsx.cisd.common.filesystem.FileUtilities; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.AbstractExternalData; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.PhysicalDataSet; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Sample; - -/** - * @author Piotr Buczek - * @author Manuel Kohler - */ -public class FileBasedTrackingDAOTest extends AbstractFileSystemTestCase -{ - private static final String DATABASE_FILE = "tracking-local-database"; - - private static final String DATABASE_FILE_DATA_SETS = "tracking-sample-database"; - - private TreeMap<String, Long> changedTrackingMap = new TreeMap<String, Long>(); - - @BeforeMethod - public void beforeMethod() throws Exception - { - super.setUp(); - FileUtilities.deleteRecursively(workingDirectory); - } - - @Test - public void testGetTrackingState() - { - changedTrackingMap.put("20150213144812415-60450886", 29877L); - changedTrackingMap.put("20150226134806587-60452073", 30293L); - String toBeProcessed = "1 2 3 4 5"; - String processed = "1 2 3"; - prepareDatabaseFile(changedTrackingMap, toBeProcessed, processed); - - ITrackingDAO trackingDAO = new FileBasedTrackingDAO(DATABASE_FILE, DATABASE_FILE_DATA_SETS); - TrackingStateDTO state = trackingDAO.getTrackingState(); - assertEquals(changedTrackingMap, state.getLastSeenDataSetIdMap()); - assertEquals(toBeProcessed, StringUtils.join(state - .getAlreadyTrackedSampleIdsToBeProcessed(), " ")); - assertEquals(processed, StringUtils.join(state.getAlreadyTrackedSampleIdsProcessed(), " ")); - } - - @Test - public void testCalcNewTrackingState() - { - TreeMap<String, Long> changedTrackingMap = new TreeMap<String, Long>(); - changedTrackingMap.put("20150213144812415-60450886", 29877L); - changedTrackingMap.put("20150226134806587-60452073", 30293L); - String toBeProcessed = "1 2 3 4 5"; - String processed = "1 2 3"; - prepareDatabaseFile(changedTrackingMap, toBeProcessed, processed); - ITrackingDAO trackingDAO = new FileBasedTrackingDAO(DATABASE_FILE, DATABASE_FILE_DATA_SETS); - TrackingStateDTO state = trackingDAO.getTrackingState(); - - HashMap<String, ArrayList<Long>> tmpTrackingMap = new HashMap<String, ArrayList<Long>>(); - ArrayList<Long> techIds = new ArrayList<Long>(); - techIds.add(32000L); - techIds.add(33000L); - techIds.add(29877L); - tmpTrackingMap.put("20150213144812415-60450886", techIds); - - techIds = new ArrayList<Long>(); - techIds.add(32001L); - techIds.add(33001L); - tmpTrackingMap.put("20150226134806587-60452073", techIds); - - techIds = new ArrayList<Long>(); - techIds.add(31000L); - techIds.add(34000L); - tmpTrackingMap.put("20150226134806587-90000000", techIds); - - TrackedEntities changedEntities = - new TrackedEntities(createSamplesWithIds(6, 7), createSamplesWithIds(4), - createDataSetsWithIds(33000L), tmpTrackingMap); - TrackingStateDTO newState = - TrackingStateUpdateHelper.calcNewTrackingState(state, changedEntities); - - TreeMap<String, Long> expectedTrackingMap = new TreeMap<String, Long>(); - - expectedTrackingMap.put("20150213144812415-60450886", 33000L); - expectedTrackingMap.put("20150226134806587-60452073", 33001L); - expectedTrackingMap.put("20150226134806587-90000000", 34000L); - - assertEquals(expectedTrackingMap, newState.getLastSeenDataSetIdMap()); - - assertEquals("1 2 3 4 5 6 7", StringUtils.join(newState - .getAlreadyTrackedSampleIdsToBeProcessed(), " ")); - assertEquals("1 2 3 4", StringUtils.join(newState.getAlreadyTrackedSampleIdsProcessed(), - " ")); - } - - @Test - public void testSaveTrackingState() - { - changedTrackingMap.put("20150213144812415-60450886", 29877L); - changedTrackingMap.put("20150226134806587-60452073", 30293L); - String toBeProcessed = "1 2"; - String processed = "1"; - prepareDatabaseFile(changedTrackingMap, toBeProcessed, processed); - - ITrackingDAO trackingDAO = new FileBasedTrackingDAO(DATABASE_FILE, DATABASE_FILE_DATA_SETS); - TrackingStateDTO newState = new TrackingStateDTO(); - - changedTrackingMap.put("20150226134806587-60452099", 31296L); - newState.setLastSeenDataSetIdMap(changedTrackingMap); - newState.setAlreadyTrackedSampleIdsToBeProcessed(new TreeSet<Long>(Arrays.asList(new Long[] - { 1L, 2L, 3L, 4L }))); - newState.setAlreadyTrackedSampleIdsProcessed(new TreeSet<Long>(Arrays.asList(new Long[] - { 1L, 2L, 3L }))); - trackingDAO.saveTrackingState(newState); - - TrackingStateDTO loadesState = trackingDAO.getTrackingState(); - assertEquals(changedTrackingMap, loadesState.getLastSeenDataSetIdMap()); - assertEquals("1 2 3 4", StringUtils.join(loadesState - .getAlreadyTrackedSampleIdsToBeProcessed(), " ")); - assertEquals("1 2 3", StringUtils.join(loadesState.getAlreadyTrackedSampleIdsProcessed(), - " ")); - } - - private static List<Sample> createSamplesWithIds(long... ids) - { - List<Sample> result = new ArrayList<Sample>(); - for (long id : ids) - { - result.add(createSampleWithId(id)); - } - return result; - } - - private static Sample createSampleWithId(long id) - { - Sample result = new Sample(); - result.setId(id); - return result; - } - - private static List<AbstractExternalData> createDataSetsWithIds(long... ids) - { - List<AbstractExternalData> result = new ArrayList<AbstractExternalData>(); - for (long id : ids) - { - result.add(createDataSetWithId(id)); - } - return result; - } - - private static PhysicalDataSet createDataSetWithId(long id) - { - PhysicalDataSet result = new PhysicalDataSet(); - result.setId(id); - return result; - } - - private void prepareDatabaseFile(TreeMap<String, Long> changedTrackingMap, String samplesToBeProcessed, - String processedSamples) - { - StringBuilder sb = new StringBuilder(); - - for (Map.Entry<String, Long> entry : changedTrackingMap.entrySet()) - { - sb.append(entry.getKey() + FileBasedTrackingDAO.EQUAL + entry.getValue() + "\n"); - } - System.out.println(sb.toString()); - FileUtilities.writeToFile(new File(DATABASE_FILE_DATA_SETS), sb.toString()); - - sb = new StringBuilder(); - sb.append(FileBasedTrackingDAO.TO_BE_PROCESSED); - sb.append(FileBasedTrackingDAO.SEPARATOR); - sb.append(samplesToBeProcessed); - sb.append("\n"); - sb.append(FileBasedTrackingDAO.PROCESSED); - sb.append(FileBasedTrackingDAO.SEPARATOR); - sb.append(processedSamples); - sb.append("\n"); - - FileUtilities.writeToFile(new File(DATABASE_FILE), sb.toString()); - } -} diff --git a/deep_sequencing_unit/sourceTest/java/tests.xml b/deep_sequencing_unit/sourceTest/java/tests.xml deleted file mode 100644 index 26e13dd48d94aba4e16c6f3471826c8055aaa875..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/sourceTest/java/tests.xml +++ /dev/null @@ -1,14 +0,0 @@ -<!DOCTYPE suite SYSTEM "http://beust.com/testng/testng-1.0.dtd" > - -<suite name="All" verbose="1"> - <test name="All"> - <groups> - <run> - <exclude name="broken" /> - </run> - </groups> - <packages> - <package name="ch.ethz.bsse.cisd.dsu.*" /> - </packages> - </test> -</suite> diff --git a/deep_sequencing_unit/tracking/dist/etc/email-template.txt b/deep_sequencing_unit/tracking/dist/etc/email-template.txt deleted file mode 100644 index f105bff09d4da6fd434650c1255916876775cbc4..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/tracking/dist/etc/email-template.txt +++ /dev/null @@ -1,10 +0,0 @@ -Dear Mrs./Mr. -This email has been sent to you automatically by the openBIS system because -you have been registered as a contact person or principal investigator. - -There is progress considering your sequencing order. Below you will find all the details. - -{generated-content} - -Kind regards, -Quantitative Genomics Facility Team \ No newline at end of file diff --git a/deep_sequencing_unit/tracking/dist/etc/log.xml b/deep_sequencing_unit/tracking/dist/etc/log.xml deleted file mode 100644 index 25581b0f2e293c5f127d4080f064a759de8ce1b7..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/tracking/dist/etc/log.xml +++ /dev/null @@ -1,56 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" ?> -<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd"> - -<log4j:configuration xmlns:log4j='http://jakarta.apache.org/log4j/'> - - <appender name="DEFAULT" class="org.apache.log4j.DailyRollingFileAppender"> - - <param name="File" value="log/tracking_log.txt"/> - <param name="DatePattern" value="'.'yyyy-MM-dd"/> - - <layout class="org.apache.log4j.PatternLayout"> - <param name="ConversionPattern" value="%d %-5p [%t] %c - %m%n"/> - </layout> - - </appender> - - <appender name="STDOUT" class="org.apache.log4j.ConsoleAppender"> - <layout class="org.apache.log4j.PatternLayout"> - <param name="ConversionPattern" value="%d %-5p [%t] %c - %m%n"/> - </layout> - </appender> - - <appender name="NULL" class="org.apache.log4j.varia.NullAppender" /> - - <appender name="EMAIL" class="org.apache.log4j.net.SMTPAppender"> - - <param name="BufferSize" value="512" /> - <param name="SMTPHost" value="localhost" /> - <param name="From" value="dsu@localhost" /> - <param name="To" value="root@localhost" /> - <param name="Subject" value="ATTENTION: DSU Progress Tracking" /> - <param name="EvaluatorClass" value="ch.systemsx.cisd.common.logging.AlwaysTrueTriggeringEventEvaluator" /> - - <layout class="org.apache.log4j.PatternLayout"> - <param name="ConversionPattern" value="%d %-5p [%t] %c - %m%n"/> - </layout> - - <!--filter class="org.apache.log4j.varia.LevelRangeFilter"> - <param name="LevelMin" value="ERROR"/> - <param name="LevelMax" value="FATAL"/> - </filter--> - - </appender> - - <category name="NOTIFY"> - <priority value="info" /> - <appender-ref ref="DEFAULT" /> - <appender-ref ref="EMAIL" /> - </category> - - <root> - <priority value="info" /> - <appender-ref ref="DEFAULT" /> - </root> - -</log4j:configuration> diff --git a/deep_sequencing_unit/tracking/dist/etc/service.properties b/deep_sequencing_unit/tracking/dist/etc/service.properties deleted file mode 100644 index a8639434a5347a331edb94c540d7a5ac145adbfe..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/tracking/dist/etc/service.properties +++ /dev/null @@ -1,57 +0,0 @@ -openbis-user=<login> -openbis-password=<password> -openbis-server-url = https://<openbis-server-url>:8443/openbis/openbis -permlink-url = https://<openbis-server-url>:8443/openbis - -# SMTP properties. -# To test the system and save emails as files instead of sending them, -# set the smtp host to file://path-to-directory -mail.smtp.host = smtp0.ethz.ch -mail.smtp.user = -mail.smtp.password = - -# all emails will be sent from this address -mail.from = openbis-noreply@bsse.ethz.ch -# all emails will have this address in the reply-to field -notification-email-reply-to = manuel.kohler@bsse.ethz.ch -# subject of all the notification emails -notification-email-subject = BSSE DSU: Status report of your deep sequencing order - -# if the tracking client fails an email will be sent out to these recipients -tracking-admin-email = kohleman@ethz.ch, gpawel@ethz.ch - -# Recipients that will receive notifications when entity connected with sequencing sample -# with certain AFFILIATION value. Property key should contain affiliation vocabulary term code -# with '-affiliation-notification-email-contact' suffix, e.g. for 'FMI' affiliation: -FMI-affiliation-notification-email-contact = - -jython-version=2.7 - -# if a sample is part of this space list then it will be transferred to an extra folder -space-whitelist = SPACE1, SPACE2 - -# All DBM spaces start with this string and will be copied to an extra folder -dbm-space-prefix = DBM_ - -# boolean flag used to make a developer life easier -debug = true - -# go back up to this number when searching for older data sets, used to speed up the request. -# The lower this number the faster, but you might miss older data sets -old-data-set-backlog-number = 1000 - -# List of DataSet Types which should be copied into an extra folder -dataset-type-list = FASTQ_GZ, FASTQC - -# folder where the data should be copied to -FASTQ_GZ-destination-folder = /Users/kohleman/dest/fastq_gz -FASTQC-destination-folder = /Users/kohleman/dest/fastqc - -# rsync binary -rsync-binary = /opt/local/bin/rsync - -# rsync flags -rsync-flags = -v - -# DSS root -dss-root-dir = /dss-root-dir \ No newline at end of file diff --git a/deep_sequencing_unit/tracking/dist/etc/tracking-local-database b/deep_sequencing_unit/tracking/dist/etc/tracking-local-database deleted file mode 100644 index cf0c217beb4b2c060055a9959f3df8a40e548f9c..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/tracking/dist/etc/tracking-local-database +++ /dev/null @@ -1,2 +0,0 @@ -trackedSamplesToBeProcessed -trackedSamplesProcessedSuccessfully \ No newline at end of file diff --git a/deep_sequencing_unit/tracking/dist/etc/tracking-sample-database b/deep_sequencing_unit/tracking/dist/etc/tracking-sample-database deleted file mode 100644 index 2fa072094d7a6125d8015bf8fa4ecb812d380b29..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/tracking/dist/etc/tracking-sample-database +++ /dev/null @@ -1,2511 +0,0 @@ -20090901100144407-102 = 192 -20090901100217527-106 = 190 -20091027093052413-400 = 24 -20091027093128193-401 = 22 -20091027093856950-403 = 26 -20091027093953542-404 = 28 -20091027094025001-405 = 29 -20091027094057471-406 = 25 -20091027094142512-407 = 23 -20091030173345738-419 = 37 -20091030173359059-420 = 33 -20091030173412170-421 = 38 -20091030173629007-422 = 32 -20091030173758779-423 = 35 -20091030173812208-424 = 39 -20091030173821889-425 = 36 -20091030173929101-426 = 34 -20091106124300586-474 = 47 -20091106124329764-475 = 42 -20091106124715426-476 = 46 -20091106125151081-477 = 43 -20091106125206291-478 = 45 -20091106125226353-479 = 48 -20091106125241093-480 = 44 -20091106125314193-481 = 41 -20091106141205669-490 = 56 -20091106141507158-492 = 55 -20091106141519899-493 = 57 -20091106141533859-494 = 52 -20091106141609081-495 = 54 -20091106141925253-496 = 50 -20091106141943652-497 = 53 -20091106141956163-498 = 51 -20091117170701771-551 = 62 -20091120175945615-578 = 69 -20091125111543169-606 = 89 -20091125111614749-607 = 87 -20091126153258774-618 = 77 -20091126153355153-619 = 82 -20091126153400307-620 = 83 -20091126153406591-621 = 84 -20091126153414760-622 = 80 -20091126153420414-623 = 78 -20091126153426200-624 = 81 -20091126153517520-625 = 79 -20091201173404712-670 = 101 -20091201173416814-671 = 97 -20091201173424109-672 = 100 -20091201173433419-673 = 96 -20091201173457607-674 = 95 -20091201173530550-675 = 102 -20091201173541572-676 = 98 -20091201173548422-677 = 99 -20091202163914008-686 = 106 -20091202163923548-687 = 111 -20091202163932761-688 = 108 -20091202163941188-689 = 109 -20091202164005130-690 = 104 -20091202164042639-691 = 107 -20091202164056909-692 = 105 -20091202164105920-693 = 110 -20091211135800080-746 = 366 -20091211135810349-747 = 370 -20091211135821139-748 = 371 -20091211135829933-749 = 373 -20091211135844754-750 = 367 -20091211135939945-751 = 369 -20091211154447334-763 = 125 -20091211155300296-768 = 123 -20091211155346575-769 = 124 -20091211155355043-770 = 128 -20091217160108986-815 = 134 -20091217160121027-816 = 141 -20091217160131947-817 = 136 -20091217160140856-818 = 137 -20091217160158137-819 = 135 -20091217160208497-820 = 138 -20091217160217679-821 = 133 -20091217160249608-822 = 140 -20100104141359261-851 = 146 -20100104141934510-852 = 145 -20100104141943538-853 = 142 -20100104141951799-854 = 143 -20100104142117972-855 = 147 -20100104142129577-856 = 150 -20100104142139257-857 = 148 -20100104142258199-858 = 144 -20100104150210283-868 = 155 -20100104150219889-869 = 152 -20100104150229391-870 = 153 -20100104150239401-871 = 154 -20100104150251770-872 = 157 -20100104150300874-873 = 156 -20100104150307950-874 = 159 -20100104150437301-875 = 151 -20100115162144587-984 = 174 -20100115162158927-985 = 172 -20100115162209499-986 = 171 -20100115162230528-987 = 169 -20100115162240790-988 = 176 -20100115162251887-989 = 170 -20100115162257999-990 = 175 -20100115162920255-992 = 168 -20100119174708577-1055 = 222 -20100119174715737-1056 = 224 -20100119174725169-1057 = 228 -20100119174735848-1058 = 221 -20100119174759150-1059 = 223 -20100119174810691-1060 = 227 -20100119174818898-1061 = 226 -20100119174930379-1062 = 225 -20100121160330216-1087 = 238 -20100121160346656-1088 = 234 -20100121160354685-1089 = 232 -20100121160431666-1090 = 231 -20100121160449219-1091 = 237 -20100121160522918-1093 = 239 -20100121160538448-1094 = 236 -20100121160728938-1095 = 233 -20100129163141498-1168 = 293 -20100129163151377-1169 = 299 -20100129163200946-1170 = 296 -20100129163210811-1171 = 295 -20100129163221077-1172 = 294 -20100129163229167-1173 = 298 -20100129163238850-1174 = 300 -20100129163343935-1175 = 297 -20100208181210213-1185 = 249 -20100208181221310-1186 = 257 -20100208181232443-1187 = 251 -20100208181241387-1188 = 256 -20100208181253995-1189 = 252 -20100208181305496-1190 = 253 -20100208181314316-1191 = 250 -20100208181418721-1192 = 255 -20100209093213783-1209 = 246 -20100209093223865-1210 = 241 -20100209093326782-1211 = 248 -20100210162255901-1238 = 340 -20100210162310327-1239 = 345 -20100210164455879-1253 = 347 -20100210164548000-1254 = 339 -20100217155418927-1330 = 331 -20100217155431380-1331 = 332 -20100217155440044-1332 = 336 -20100217155450929-1333 = 334 -20100217155510362-1334 = 328 -20100217155520621-1335 = 330 -20100217155550413-1336 = 333 -20100217155711716-1337 = 329 -20100223160428841-1361 = 351 -20100223160535294-1362 = 348 -20100223160552432-1364 = 349 -20100223160605401-1365 = 353 -20100223160620757-1366 = 356 -20100223160649269-1367 = 354 -20100223160808647-1368 = 350 -20100325110248757-1445 = 376 -20100325110330448-1446 = 380 -20100331150601755-1457 = 387 -20100331150610446-1458 = 388 -20100331150621576-1459 = 392 -20100331150636095-1460 = 390 -20100331150656717-1461 = 386 -20100331150756870-1462 = 389 -20100331150843166-1463 = 384 -20100331151007916-1465 = 385 -20100414165531241-1489 = 404 -20100414165541421-1490 = 408 -20100414165551276-1491 = 407 -20100414165604896-1492 = 406 -20100414165621711-1493 = 403 -20100414165629893-1494 = 405 -20100414165636217-1495 = 402 -20100414165740555-1496 = 410 -20100415095708958-1508 = 395 -20100415095721854-1509 = 398 -20100415095815657-1510 = 399 -20100415095838144-1511 = 401 -20100415095925208-1512 = 397 -20100415100107678-1514 = 393 -20100415100126104-1515 = 394 -20100420115836518-1559 = 413 -20100426124153251-1614 = 426 -20100428172740332-1623 = 430 -20100428172749470-1624 = 437 -20100428172800370-1625 = 433 -20100428172807501-1626 = 434 -20100428172822397-1627 = 431 -20100428172832020-1628 = 432 -20100428172841926-1629 = 429 -20100428172929820-1630 = 435 -20100505171018192-1659 = 439 -20100505171053482-1660 = 443 -20100505171109861-1661 = 444 -20100505171123152-1662 = 446 -20100505171437816-1663 = 442 -20100518180146300-1712 = 450 -20100518180156496-1713 = 454 -20100518180318645-1714 = 453 -20100518180330251-1715 = 452 -20100518180421992-1716 = 456 -20100518180620583-1718 = 451 -20100521173324880-1767 = 459 -20100521173337260-1768 = 462 -20100521173344869-1769 = 463 -20100521173355340-1770 = 465 -20100521173405794-1771 = 460 -20100521173412150-1772 = 457 -20100521173420493-1773 = 458 -20100521173504043-1774 = 461 -20100603142651278-1796 = 473 -20100603142804268-1797 = 472 -20100603142819793-1798 = 471 -20100603143248696-1799 = 468 -20100610095251052-1819 = 483 -20100610095351558-1820 = 476 -20100610095407343-1821 = 477 -20100610095416347-1822 = 478 -20100610095525224-1823 = 475 -20100610095853430-1827 = 479 -20100610095942262-1828 = 480 -20100622150006599-1858 = 490 -20100622150148840-1860 = 484 -20100706181515832-1912 = 495 -20100706181527377-1913 = 499 -20100706181537637-1914 = 498 -20100706181550267-1915 = 497 -20100706181605078-1916 = 494 -20100706181648289-1917 = 501 -20100706181846733-1920 = 493 -20100720173022595-1939 = 509 -20100720173033148-1940 = 506 -20100720173041895-1941 = 508 -20100720173051383-1942 = 503 -20100720173101132-1943 = 507 -20100720173108446-1944 = 510 -20100720173116612-1945 = 504 -20100720173632374-1947 = 505 -20100726124125003-1978 = 519 -20100729105913994-1994 = 526 -20100729105932276-1995 = 520 -20100729105944744-1996 = 523 -20100729110245137-2001 = 521 -20100730162022569-2017 = 529 -20100730162040004-2018 = 537 -20100730162155775-2021 = 535 -20100803171705868-2037 = 541 -20100803171716976-2038 = 542 -20100803171724636-2039 = 546 -20100803171732418-2040 = 544 -20100803171740431-2041 = 540 -20100803171750576-2042 = 538 -20100803171757602-2043 = 539 -20100803171837890-2044 = 543 -20100806144225552-2080 = 547 -20100811173558229-2100 = 558 -20100811173606359-2101 = 561 -20100811173614622-2102 = 562 -20100811173623435-2103 = 564 -20100811173748044-2104 = 560 -20100811173926469-2106 = 556 -20100811173938671-2107 = 557 -20100817180139608-2133 = 571 -20100817180707390-2135 = 566 -20100817180718131-2136 = 568 -20100902095427172-2168 = 587 -20100902095438108-2169 = 586 -20100902095626618-2171 = 589 -20100902095709387-2172 = 591 -20100902095722518-2173 = 594 -20100902095730764-2174 = 590 -20100910152208286-2231 = 601 -20100910152230447-2232 = 595 -20100910152246998-2233 = 598 -20100910152300691-2234 = 597 -20100910153859252-2235 = 596 -20100910154000986-2236 = 600 -20100910154015044-2237 = 599 -20100910154028448-2238 = 603 -20100916173443063-2275 = 607 -20100916173454336-2276 = 608 -20100916173503882-2277 = 612 -20100916173513256-2278 = 610 -20100916173521915-2279 = 606 -20100916173536668-2280 = 604 -20100916173544330-2281 = 605 -20100916173634754-2282 = 609 -20100922172618682-2314 = 621 -20100922172628495-2315 = 613 -20100922172637236-2316 = 616 -20100922172646098-2317 = 615 -20100922172726141-2318 = 614 -20100922172922512-2321 = 618 -20101006142458732-2343 = 624 -20101006142512761-2344 = 626 -20101006142522402-2345 = 630 -20101006142531789-2346 = 628 -20101006142552071-2347 = 623 -20101006142601230-2348 = 622 -20101006142705813-2349 = 627 -20101015202054777-2367 = 650 -20101015202204705-2368 = 651 -20101102140357156-2386 = 636 -20101102142525628-2390 = 633 -20101102142728963-2392 = 637 -20101102142743734-2393 = 639 -20101102142755621-2394 = 635 -20101108145638659-2419 = 644 -20101108145729493-2420 = 642 -20101116111121742-2457 = 652 -20101116111125257-2458 = 654 -20101116111130325-2459 = 653 -20101116111132822-2460 = 655 -20101116122432170-2472 = 656 -20101118165547913-2478 = 657 -20101119101026821-2483 = 658 -20101129145554042-2502 = 661 -20101129145610758-2503 = 664 -20101129145815342-2506 = 663 -20101129150122953-2509 = 660 -20101208180442780-2538 = 669 -20101208180512642-2539 = 673 -20101208180524877-2540 = 674 -20101208180535858-2541 = 676 -20101208180618449-2542 = 672 -20101208180741451-2544 = 670 -20101208180754738-2545 = 668 -20101208180802950-2546 = 671 -20101216160104564-2573 = 683 -20101216161556607-2574 = 679 -20101216161706668-2575 = 678 -20101216161842951-2576 = 682 -20101223131915300-2596 = 689 -20101223131934864-2597 = 693 -20101223131958575-2598 = 692 -20101223142020038-2599 = 691 -20101223142044320-2600 = 688 -20101223142137484-2601 = 695 -20101223145935775-2602 = 690 -20101223150112169-2603 = 687 -20110106172426022-2628 = 702 -20110106172623134-2631 = 696 -20110111133728698-2648 = 735 -20110111133741184-2649 = 731 -20110111133750259-2650 = 730 -20110111133800463-2651 = 729 -20110111133819858-2652 = 734 -20110111133833232-2653 = 737 -20110111133925478-2654 = 733 -20110111134512151-2656 = 732 -20110119144810858-2677 = 720 -20110119144824649-2678 = 715 -20110119144840280-2679 = 716 -20110119144908074-2680 = 722 -20110119144922057-2681 = 718 -20110119144932489-2682 = 719 -20110119145030224-2683 = 714 -20110119172858214-2684 = 717 -20110124165223963-2717 = 744 -20110124165239005-2718 = 738 -20110124165249350-2719 = 741 -20110124165300845-2720 = 740 -20110124165309809-2721 = 743 -20110124165319690-2722 = 742 -20110124165330021-2723 = 746 -20110124165417938-2724 = 739 -20110126170744784-2739 = 753 -20110126170757586-2740 = 748 -20110126170812874-2741 = 752 -20110126170904496-2742 = 749 -20110126170913781-2743 = 750 -20110126170924920-2744 = 755 -20110126170934940-2745 = 751 -20110126171017427-2746 = 747 -20110128173910875-2771 = 757 -20110128173948892-2772 = 761 -20110128174054442-2773 = 760 -20110128174102935-2774 = 764 -20110204175731219-2802 = 771 -20110204180026381-2806 = 1007 -20110204180111411-2807 = 768 -20110204180203891-2808 = 765 -20110216170951405-2835 = 776 -20110216171003565-2836 = 780 -20110216171016533-2837 = 774 -20110216171109597-2838 = 779 -20110216171119442-2839 = 778 -20110216171131158-2840 = 775 -20110216171139752-2841 = 777 -20110216171245854-2842 = 782 -20110225153927329-2861 = 787 -20110225153937373-2862 = 786 -20110225154229367-2868 = 785 -20110304161341497-2909 = 798 -20110304161354616-2910 = 793 -20110304161404678-2911 = 794 -20110304161416425-2912 = 795 -20110304161511996-2913 = 792 -20110304161558708-2914 = 800 -20110304161610219-2915 = 796 -20110304161619017-2916 = 797 -20110308152354091-2935 = 802 -20110308164745004-2936 = 806 -20110308165016533-2937 = 807 -20110308165031895-2938 = 809 -20110308165046032-2939 = 803 -20110308165058859-2940 = 801 -20110308165111155-2941 = 804 -20110308165207411-2942 = 805 -20110311165541070-2955 = 811 -20110311165618997-2956 = 815 -20110311165627903-2957 = 816 -20110311165641847-2958 = 818 -20110311165652155-2959 = 812 -20110311165702497-2960 = 810 -20110311165710565-2961 = 813 -20110311165751597-2962 = 814 -20110322174735590-2987 = 819 -20110322174744276-2988 = 827 -20110322174752176-2989 = 823 -20110322174804928-2990 = 824 -20110322174816513-2991 = 820 -20110322174854810-2992 = 825 -20110322174930179-2993 = 822 -20110328173520192-3005 = 832 -20110330172304098-3062 = 837 -20110330172320609-3063 = 845 -20110330172353996-3064 = 841 -20110330172449014-3065 = 842 -20110330172532594-3066 = 843 -20110401123647447-3086 = 854 -20110401123747747-3087 = 846 -20110401123756497-3088 = 849 -20110401123837379-3089 = 848 -20110408161507733-3144 = 861 -20110408161603628-3145 = 857 -20110408161613018-3146 = 856 -20110408161710832-3147 = 859 -20110415145206837-3162 = 868 -20110415145224958-3163 = 869 -20110415145234625-3164 = 873 -20110415145243947-3165 = 871 -20110415145254052-3166 = 867 -20110415145300442-3167 = 865 -20110415145310779-3168 = 866 -20110415145352673-3169 = 870 -20110429193420576-3201 = 1008 -20110429193512326-3202 = 878 -20110429193619818-3203 = 882 -20110429193631236-3204 = 880 -20110429193710132-3205 = 879 -20110506112228291-3238 = 884 -20110506112238037-3239 = 889 -20110506112345088-3240 = 888 -20110506112906454-3241 = 887 -20110506112928768-3242 = 883 -20110506112939522-3243 = 886 -20110506113034807-3244 = 885 -20110506113120272-3245 = 891 -20110518171554996-3334 = 907 -20110530100049402-3380 = 909 -20110530104418529-3390 = 981 -20110530104435608-3391 = 980 -20110530104445594-3392 = 982 -20110530104454302-3393 = 983 -20110530104536396-3394 = 984 -20110530104553755-3395 = 985 -20110530104610535-3396 = 986 -20110530105258256-3398 = 935 -20110530110700441-3400 = 950 -20110530110748437-3401 = 948 -20110530110854700-3402 = 946 -20110530111114947-3404 = 989 -20110530111156037-3405 = 987 -20110530111206334-3406 = 949 -20110530111309468-3407 = 988 -20110530111723730-3408 = 1091 -20110531163103070-3423 = 923 -20110603163952299-3444 = 932 -20110603164002251-3445 = 928 -20110603164236760-3448 = 929 -20110614115224929-3492 = 955 -20110614115236209-3493 = 958 -20110614115244123-3494 = 959 -20110614115252407-3495 = 961 -20110614115335826-3496 = 957 -20110614115427900-3497 = 956 -20110614115444550-3498 = 953 -20110614115453404-3499 = 954 -20110614120857985-3502 = 970 -20110614120908780-3503 = 966 -20110614120917006-3504 = 967 -20110614120930409-3505 = 968 -20110614120939524-3506 = 971 -20110614120951782-3507 = 969 -20110614121000380-3508 = 973 -20110614121044764-3509 = 965 -20110623171800595-3593 = 992 -20110623171809317-3594 = 997 -20110623171816627-3595 = 996 -20110623171824682-3596 = 995 -20110623171908093-3597 = 999 -20110623171942736-3598 = 991 -20110623171950035-3599 = 994 -20110627163827291-3645 = 1014 -20110627163834920-3646 = 1012 -20110627163843782-3647 = 1009 -20110627163851583-3648 = 1010 -20110627163900854-3649 = 1015 -20110627163911662-3650 = 1017 -20110627163920227-3651 = 1013 -20110627163959498-3652 = 1011 -20110701124735783-3673 = 1022 -20110701124840475-3674 = 1026 -20110701124911387-3675 = 1023 -20110701124925097-3676 = 1021 -20110701124940206-3677 = 1024 -20110701124949784-3678 = 1020 -20110701125048746-3679 = 1025 -20110701125848642-3681 = 1028 -20110712162052068-3727 = 1116 -20110712162142262-3728 = 1114 -20110712162158337-3729 = 1109 -20110712162959239-3732 = 1112 -20110712163802950-3734 = 1111 -20110712163816557-3735 = 1113 -20110722150931082-3778 = 1092 -20110722151001724-3779 = 1102 -20110722151015036-3780 = 1095 -20110722151027357-3781 = 1094 -20110722151053225-3782 = 1093 -20110722151107789-3783 = 1103 -20110722151255593-3784 = 1104 -20110802113225135-3837 = 1101 -20110812164104243-3922 = 1118 -20110812164124334-3923 = 1119 -20110812164140933-3924 = 1120 -20110812164618385-3926 = 1122 -20110816140502278-3937 = 1164 -20110816140513770-3938 = 1162 -20110816140523061-3939 = 1159 -20110816140534466-3940 = 1158 -20110816140548634-3941 = 1165 -20110816140557507-3942 = 1160 -20110816140834271-3943 = 1163 -20110816140956071-3944 = 1161 -20110819114620176-3981 = 1172 -20110819115408426-3985 = 1429 -20110826150921259-4275 = 1356 -20110826150933501-4276 = 1355 -20110826151344944-4279 = 1368 -20110826151422790-4280 = 1428 -20110907162319805-4569 = 1761 -20110907162516619-4570 = 1768 -20110907162826858-4573 = 1701 -20110907162839829-4574 = 1702 -20110907162852467-4575 = 1700 -20110907162902139-4576 = 1699 -20110916123944405-4954 = 1520 -20110916123958887-4955 = 1517 -20110916124033126-4956 = 1515 -20110916124043200-4957 = 1514 -20110916124118500-4958 = 1521 -20110916124128257-4959 = 1516 -20110916124138311-4960 = 1518 -20110916124224567-4961 = 1519 -20110916150155542-4971 = 1697 -20110916150203159-4972 = 1695 -20110916150216306-4973 = 1692 -20110916150307781-4974 = 1704 -20110916150353166-4975 = 1696 -20110916150448111-4976 = 2484 -20110916150456853-4977 = 2483 -20110916150557692-4978 = 1694 -20110922125513940-5037 = 1734 -20110922125513952-5038 = 1729 -20110922125513958-5039 = 1730 -20110922125513963-5040 = 1731 -20110922125513968-5041 = 1727 -20110922125513975-5042 = 1591 -20110922125513980-5043 = 1732 -20110922125513986-5044 = 1728 -20110926171509059-5128 = 1739 -20110926171509067-5129 = 1742 -20110926171509073-5130 = 1736 -20110926171509079-5131 = 1737 -20110926171509084-5132 = 1740 -20110926171509089-5133 = 1738 -20110926171509094-5134 = 1735 -20110926171509099-5135 = 1741 -20110930173048771-5200 = 1679 -20110930173048780-5201 = 1628 -20110930173048787-5202 = 1682 -20110930173048794-5203 = 1686 -20110930173048799-5204 = 1627 -20110930173048805-5205 = 1684 -20110930173048811-5206 = 1668 -20110930173048817-5207 = 1656 -20111013113013967-5332 = 1723 -20111013113013976-5333 = 1721 -20111013113013982-5334 = 1724 -20111013113013987-5335 = 1725 -20111013113013991-5336 = 1719 -20111013113013997-5337 = 1722 -20111013113014001-5338 = 2486 -20111013113014005-5339 = 2485 -20111027100116548-30919 = 1862 -20111027100116554-30920 = 1858 -20111027100116559-30921 = 1845 -20111027100116564-30922 = 1840 -20111027100116570-30923 = 1859 -20111027100116576-30924 = 1870 -20111027100116583-30925 = 1876 -20111027100116588-30926 = 1853 -20111031152022276-6886845 = 1888 -20111031152022283-6886846 = 1886 -20111031152022288-6886847 = 1881 -20111031152022294-6886848 = 1883 -20111031152022299-6886849 = 2339 -20111031152022305-6886850 = 1887 -20111031152022310-6886851 = 1884 -20111031152022316-6886852 = 1905 -20111109124517141-8007681 = 1918 -20111109124528501-8007682 = 1919 -20111109124538202-8007683 = 1912 -20111109124547350-8007684 = 1917 -20111109124556811-8007685 = 1915 -20111109124700955-8007686 = 1914 -20111115152506714-19519160 = 2149 -20111116170443345-19519187 = 2151 -20111116170649427-19519188 = 2152 -20111116170836661-19519189 = 2096 -20111116170949414-19519190 = 1966 -20111116171035686-19519191 = 2148 -20111116171044764-19519192 = 2147 -20111116171054225-19519193 = 2150 -20111124093717346-30845008 = 2161 -20111124093753125-30845009 = 2159 -20111124093805945-30845010 = 2156 -20111124093823893-30845011 = 2155 -20111124093838453-30845012 = 2162 -20111124093849455-30845013 = 2157 -20111124093859676-30845014 = 2158 -20111124093949998-30845015 = 2160 -20111125162630368-31094263 = 2172 -20111125162639758-31094264 = 2170 -20111125162648132-31094265 = 2165 -20111125162659163-31094266 = 2166 -20111125162708561-31094267 = 2171 -20111125162717330-31094268 = 2167 -20111125162728600-31094269 = 2169 -20111125162820338-31094270 = 2168 -20111202165037320-31094311 = 2194 -20111202165037329-31094312 = 2196 -20111202165037338-31094313 = 2199 -20111202165037345-31094314 = 2200 -20111202165037352-31094315 = 2195 -20111202165037360-31094316 = 2193 -20111202165037368-31094317 = 2198 -20111202165037375-31094318 = 2197 -20111202173036363-31094324 = 2280 -20111206153216085-32933074 = 2275 -20111206153216090-32933075 = 2272 -20111206153216095-32933076 = 2268 -20111206153216100-32933077 = 2269 -20111206153216105-32933078 = 2271 -20111206153216109-32933079 = 2274 -20111206153216113-32933080 = 2270 -20111206153216121-32933082 = 2273 -20111213153012524-46581714 = 2298 -20111213153012529-46581715 = 2301 -20111213153012534-46581716 = 2291 -20111213153012538-46581717 = 2292 -20111213153012545-46581719 = 2299 -20111213153012548-46581720 = 2297 -20111213153012553-46581721 = 2290 -20111213153012557-46581722 = 2300 -20111213162012966-46680667 = 2389 -20111213162012971-46680668 = 2388 -20111213162012977-46680669 = 2385 -20111213162012984-46680671 = 2386 -20111213162012989-46680672 = 2387 -20111220163023723-56006597 = 2405 -20111220163023731-56006598 = 2402 -20111220163023738-56006599 = 2406 -20111220163023744-56006600 = 2407 -20111220163023751-56006601 = 2401 -20111220163023757-56006602 = 2404 -20111220163023762-56006603 = 2408 -20111220163023768-56006604 = 2403 -20111220170021890-56006606 = 2421 -20111220170021896-56006607 = 2418 -20111220170021902-56006608 = 2424 -20111220170021907-56006609 = 2423 -20111220170021912-56006610 = 2420 -20111220170021918-56006611 = 2422 -20111220170021924-56006612 = 2425 -20111220170021931-56006613 = 2419 -20120105163504805-56010550 = 3041 -20120105163504811-56010551 = 3036 -20120105163504817-56010552 = 3039 -20120105163504822-56010553 = 3040 -20120105163504830-56010554 = 3035 -20120105163504838-56010555 = 3016 -20120105163504843-56010556 = 3038 -20120105163504848-56010557 = 3037 -20120105170038905-56010559 = 3076 -20120105170038912-56010560 = 3078 -20120105170038919-56010561 = 3075 -20120105170038925-56010562 = 3074 -20120105170038931-56010563 = 3080 -20120105170038937-56010564 = 3077 -20120105170038943-56010565 = 3073 -20120105170038948-56010566 = 3079 -20120113102828303-58395829 = 3006 -20120113102840860-58395830 = 3003 -20120113102852873-58395831 = 2999 -20120113102902474-58395832 = 3000 -20120113102915043-58395833 = 3005 -20120113102926653-58395834 = 3001 -20120113103050906-58395835 = 3004 -20120113103136726-58395836 = 3002 -20120113174211710-58395888 = 3102 -20120113174211716-58395889 = 3104 -20120113174211721-58395890 = 3099 -20120113174211726-58395891 = 3100 -20120113174211731-58395892 = 3103 -20120113174211736-58395893 = 3101 -20120113174211742-58395894 = 3098 -20120113174211747-58395895 = 3105 -20120113175144487-58395897 = 3007 -20120113175144498-58395898 = 3010 -20120113175144505-58395899 = 3014 -20120113175144510-58395900 = 3013 -20120113175144517-58395901 = 3011 -20120113175144524-58395902 = 3008 -20120113175144529-58395903 = 3012 -20120113175144534-58395904 = 3009 -20120119144309285-60397187 = 2591 -20120119144309292-60397188 = 2588 -20120119144309297-60397189 = 2594 -20120119144309304-60397190 = 2593 -20120119144309310-60397191 = 2529 -20120119144309315-60397192 = 2592 -20120119144309321-60397193 = 2595 -20120119144309326-60397194 = 2589 -20120126112933908-60397756 = 3126 -20120126112933915-60397757 = 3129 -20120126112933921-60397758 = 3131 -20120126112933926-60397759 = 3132 -20120126112933932-60397760 = 3127 -20120126112933938-60397761 = 3125 -20120126112933945-60397762 = 3130 -20120126112933950-60397763 = 3128 -20120127152728774-60397877 = 3148 -20120127152743722-60397878 = 3146 -20120127152814026-60397879 = 3143 -20120127152826763-60397880 = 3142 -20120127152857313-60397881 = 3149 -20120127152907513-60397882 = 3144 -20120127153027663-60397883 = 3145 -20120127153114700-60397884 = 3147 -20120209155957200-60398012 = 3245 -20120209155957206-60398013 = 3242 -20120209155957211-60398014 = 3238 -20120209155957217-60398015 = 3239 -20120209155957223-60398016 = 3241 -20120209155957228-60398017 = 3244 -20120209155957236-60398018 = 3240 -20120209155957242-60398019 = 3243 -20120215144011662-60398118 = 3268 -20120215144011670-60398119 = 3265 -20120215144011677-60398120 = 3271 -20120215144011684-60398121 = 3274 -20120215144011690-60398122 = 3267 -20120215144011698-60398123 = 3269 -20120215144011705-60398124 = 3273 -20120215144011712-60398125 = 3266 -20120217124053431-60398146 = 3257 -20120217124113643-60398147 = 3259 -20120217124124306-60398148 = 3262 -20120217124136020-60398149 = 3263 -20120217124145802-60398150 = 3256 -20120217124154317-60398151 = 3261 -20120217124201986-60398152 = 3260 -20120217124245321-60398153 = 3258 -20120224150007051-60398208 = 3457 -20120224150007061-60398209 = 3382 -20120224150007080-60398211 = 3276 -20120224150007087-60398212 = 3329 -20120224150007093-60398213 = 3431 -20120224150007100-60398214 = 3456 -20120224150007106-60398215 = 3378 -20120306152009283-60398636 = 3495 -20120306152009289-60398637 = 3492 -20120306152009296-60398638 = 3488 -20120306152009302-60398639 = 3489 -20120306152009308-60398640 = 3491 -20120306152009314-60398641 = 3494 -20120306152009319-60398642 = 3490 -20120306152009324-60398643 = 3493 -20120306162009227-60398645 = 3522 -20120306162009234-60398646 = 3524 -20120306162009241-60398647 = 3521 -20120306162009247-60398648 = 3520 -20120306162009253-60398649 = 3526 -20120306162009259-60398650 = 3523 -20120306162009265-60398651 = 3805 -20120306162009271-60398652 = 3525 -20120313123229824-60398842 = 3666 -20120313123347844-60398843 = 3669 -20120313123400417-60398844 = 3663 -20120313123504856-60398845 = 3664 -20120313123549079-60398846 = 3667 -20120313123655509-60398847 = 3665 -20120313123706173-60398848 = 3662 -20120313123813502-60398849 = 3668 -20120315155009442-60398967 = 3728 -20120315155009450-60398968 = 3725 -20120315155009458-60398969 = 3721 -20120315155009465-60398970 = 3722 -20120315155009472-60398971 = 3724 -20120315155009479-60398972 = 3727 -20120315155009486-60398973 = 3723 -20120315155009495-60398974 = 3726 -20120327111019853-60399075 = 3749 -20120327111019860-60399076 = 3754 -20120327111019866-60399077 = 3764 -20120327111019872-60399078 = 3769 -20120327111019878-60399079 = 3750 -20120327111019885-60399080 = 3760 -20120327111019891-60399081 = 3771 -20120327111019897-60399082 = 3744 -20120404143842979-60399184 = 3799 -20120404143857664-60399185 = 3796 -20120404143908551-60399186 = 3802 -20120404143924639-60399187 = 3801 -20120404144043061-60399188 = 3800 -20120404144226270-60399189 = 3803 -20120404144237325-60399190 = 3797 -20120404144344378-60399191 = 3798 -20120412124011430-60399233 = 3896 -20120412124011435-60399234 = 3898 -20120412124011440-60399235 = 3897 -20120412124011445-60399236 = 4292 -20120412124011449-60399237 = 3895 -20120412124011453-60399238 = 3899 -20120412124011458-60399239 = 3893 -20120412124011462-60399240 = 3894 -20120416140613669-60399279 = 3836 -20120416140613677-60399280 = 3834 -20120416140613683-60399281 = 3833 -20120416140613689-60399282 = 3835 -20120416140613695-60399283 = 3837 -20120416140613700-60399284 = 3839 -20120416140613706-60399285 = 3838 -20120416140613711-60399286 = 3840 -20120420104805614-60399425 = 3965 -20120420104805619-60399426 = 3962 -20120420104805624-60399427 = 3960 -20120420104805631-60399428 = 3959 -20120420104805636-60399429 = 3964 -20120420104805643-60399430 = 4010 -20120420104805648-60399431 = 3961 -20120420104805654-60399432 = 3963 -20120427125614128-60399646 = 4280 -20120427125614134-60399647 = 4277 -20120427125614141-60399648 = 4281 -20120427125614146-60399649 = 4278 -20120427125614153-60399650 = 4274 -20120427125614158-60399651 = 4275 -20120427125614164-60399652 = 4276 -20120427125614170-60399653 = 4279 -20120504110615536-60399799 = 4104 -20120504110615544-60399800 = 4106 -20120504110615551-60399801 = 4111 -20120504110615558-60399802 = 4110 -20120504110615564-60399803 = 4108 -20120504110615570-60399804 = 4105 -20120504110615576-60399805 = 4109 -20120504110615582-60399806 = 4107 -20120511113620386-60399887 = 4136 -20120511113620396-60399888 = 4138 -20120511113620405-60399889 = 4135 -20120511113620414-60399890 = 4134 -20120511113620423-60399891 = 4140 -20120511113620430-60399892 = 4137 -20120511113620437-60399893 = 4133 -20120511113620444-60399894 = 4139 -20120525114328674-60400382 = 4403 -20120525114328682-60400383 = 4401 -20120525114328691-60400384 = 4404 -20120525114328699-60400385 = 4405 -20120525114328706-60400386 = 4399 -20120525114328714-60400387 = 4402 -20120525114328723-60400388 = 4406 -20120525114328731-60400389 = 4400 -20120525114423248-60400391 = 4415 -20120525114423257-60400392 = 4319 -20120525114423264-60400393 = 4433 -20120525114423271-60400394 = 4435 -20120525114423279-60400395 = 4429 -20120525114423289-60400396 = 4427 -20120525114423300-60400397 = 4436 -20120525114423307-60400398 = 4431 -20120606115418775-60400564 = 4479 -20120606115418783-60400565 = 4477 -20120606115418789-60400566 = 4473 -20120606115418795-60400567 = 4474 -20120606115418801-60400568 = 4475 -20120606115418808-60400569 = 4478 -20120606115418815-60400570 = 4465 -20120606115418821-60400571 = 4476 -20120606120812962-60400573 = 4537 -20120606120812967-60400574 = 4539 -20120606120812972-60400575 = 4540 -20120606120812977-60400576 = 4534 -20120606120812983-60400577 = 4538 -20120606120812988-60400578 = 4535 -20120606120812992-60400579 = 4536 -20120606120812997-60400580 = 4541 -20120612103612900-60400700 = 4606 -20120612103612908-60400701 = 4622 -20120612103612916-60400702 = 4624 -20120612103612923-60400703 = 4608 -20120612103612931-60400704 = 4605 -20120612103612939-60400705 = 4607 -20120612103612948-60400706 = 4610 -20120612103612956-60400707 = 4604 -20120618162411407-60401924 = 4692 -20120618162411414-60401925 = 4694 -20120618162411419-60401926 = 4697 -20120618162411425-60401927 = 4698 -20120618162411431-60401928 = 4693 -20120618162411437-60401929 = 4691 -20120618162411443-60401930 = 4696 -20120618162411448-60401931 = 4695 -20120625112207079-60401997 = 4649 -20120625112207088-60401998 = 4652 -20120625112207095-60401999 = 4648 -20120625112207102-60402000 = 4647 -20120625112207110-60402001 = 4653 -20120625112207117-60402002 = 4650 -20120625112207125-60402003 = 4646 -20120625112207132-60402004 = 4651 -20120702153422414-60402091 = 4940 -20120702153422422-60402092 = 4942 -20120702153422429-60402093 = 4937 -20120702153422436-60402094 = 4938 -20120702153422445-60402095 = 4941 -20120702153422453-60402096 = 5159 -20120702153422461-60402097 = 4936 -20120702153422468-60402098 = 4943 -20120705111214714-60402221 = 4847 -20120705111214721-60402222 = 4849 -20120705111214727-60402223 = 4853 -20120705111214733-60402224 = 4852 -20120705111214739-60402225 = 4850 -20120705111214746-60402226 = 4848 -20120705111214752-60402227 = 4851 -20120705111214758-60402228 = 4840 -20120710111010138-60402391 = 4993 -20120710111010144-60402392 = 4990 -20120710111010150-60402393 = 4988 -20120710111010155-60402394 = 4987 -20120710111010161-60402395 = 4992 -20120710111010167-60402396 = 4994 -20120710111010172-60402397 = 4989 -20120710111010177-60402398 = 4991 -20120717115016575-60402508 = 5023 -20120717115016583-60402509 = 5018 -20120717115016591-60402510 = 5015 -20120717115016598-60402511 = 5021 -20120717115016606-60402512 = 5020 -20120717115016613-60402513 = 5024 -20120717115016621-60402514 = 5022 -20120717115016628-60402515 = 5019 -20120717124611961-60402517 = 5041 -20120717124611969-60402518 = 5045 -20120717124611978-60402519 = 5044 -20120717124611985-60402520 = 5035 -20120717124611992-60402521 = 5046 -20120717124612001-60402522 = 5047 -20120717124612009-60402523 = 5043 -20120717124612017-60402524 = 5039 -20120725144841917-60402818 = 5659 -20120727113414183-60402832 = 5217 -20120727113414191-60402833 = 5219 -20120727113414198-60402834 = 5222 -20120727113414206-60402835 = 5223 -20120727113414212-60402836 = 5218 -20120727113414219-60402837 = 5216 -20120727113414229-60402838 = 5221 -20120727113414236-60402839 = 5220 -20120727122030657-60402842 = 5654 -20120727122030666-60402843 = 5653 -20120727122030675-60402844 = 5650 -20120727122030683-60402845 = 5649 -20120727122030693-60402846 = 5657 -20120727122030702-60402847 = 5655 -20120727122030711-60402848 = 5651 -20120727122030718-60402849 = 5652 -20120808095418813-60403532 = 5712 -20120808095418821-60403533 = 5715 -20120808095418830-60403534 = 5709 -20120808095418837-60403535 = 5710 -20120808095418845-60403536 = 5713 -20120808095418852-60403537 = 5711 -20120808095418860-60403538 = 5708 -20120808095418868-60403539 = 5714 -20120817123015190-60403697 = 5753 -20120817123015196-60403698 = 5750 -20120817123015202-60403699 = 5756 -20120817123015206-60403700 = 5755 -20120817123015211-60403701 = 5752 -20120817123015216-60403702 = 5754 -20120817123015221-60403703 = 5757 -20120817123015226-60403704 = 5751 -20120821111407265-60403749 = 5815 -20120821111407270-60403750 = 5812 -20120821111407277-60403751 = 5808 -20120821111407284-60403752 = 5809 -20120821111407290-60403753 = 5811 -20120821111407296-60403754 = 5814 -20120821111407302-60403755 = 5810 -20120821111407308-60403756 = 5813 -20120827152950859-60403941 = 5940 -20120830123814716-60403947 = 5932 -20120830123814724-60403948 = 5935 -20120830123814732-60403949 = 5939 -20120830123814740-60403950 = 5938 -20120830123814750-60403951 = 5936 -20120830123814758-60403952 = 5933 -20120830123814766-60403953 = 5937 -20120830123814773-60403954 = 5934 -20120911102013785-60404194 = 6085 -20120911102013792-60404195 = 6088 -20120911102013799-60404196 = 6090 -20120911102013806-60404197 = 6091 -20120911102013813-60404198 = 6086 -20120911102013821-60404199 = 6084 -20120911102013828-60404200 = 6089 -20120911102013836-60404201 = 6087 -20120917113811498-60404914 = 6095 -20120917113811506-60404915 = 6098 -20120917113811517-60404916 = 6094 -20120917113811524-60404917 = 26929 -20120917113811530-60404918 = 6099 -20120917113811538-60404919 = 6096 -20120917113811546-60404920 = 6092 -20120917113811552-60404921 = 6097 -20120925172436757-60405088 = 6614 -20120925172436766-60405089 = 6611 -20120925172436774-60405090 = 6636 -20120925172436783-60405091 = 6616 -20120925172436791-60405092 = 6610 -20120925172436799-60405093 = 6613 -20120925172436808-60405094 = 6635 -20120925172436816-60405095 = 6612 -20120928114612853-60405097 = 6169 -20120928114612859-60405098 = 6167 -20120928114612866-60405099 = 6178 -20120928114612873-60405100 = 6171 -20120928114612881-60405101 = 6168 -20120928114612889-60405102 = 6170 -20120928114612897-60405103 = 6173 -20120928114612904-60405104 = 6166 -20121003114009009-60405221 = 7181 -20121003114009017-60405222 = 7182 -20121003114009023-60405223 = 7187 -20121003114009029-60405224 = 7186 -20121003114009035-60405225 = 7184 -20121003114009041-60405226 = 7185 -20121003114009047-60405227 = 7188 -20121003114009053-60405228 = 7183 -20121013120615890-60405286 = 6632 -20121013120615900-60405287 = 6630 -20121013120615907-60405288 = 6627 -20121013120615913-60405289 = 6626 -20121013120615921-60405290 = 6631 -20121013120615928-60405291 = 6633 -20121013120615936-60405292 = 6628 -20121013120615942-60405293 = 6629 -20121019102214857-60405797 = 6700 -20121019102214865-60405798 = 6697 -20121019102214872-60405799 = 6703 -20121019102214878-60405800 = 6702 -20121019102214884-60405801 = 6716 -20121019102214891-60405802 = 6701 -20121019102214896-60405803 = 6704 -20121019102214903-60405804 = 6698 -20121026142410765-60406542 = 7544 -20121026142410773-60406543 = 7545 -20121026142410780-60406544 = 7546 -20121026142410785-60406545 = 7547 -20121026142410791-60406546 = 8103 -20121026142410798-60406547 = 7549 -20121026142410806-60406548 = 7550 -20121026142410811-60406549 = 7551 -20121029181607907-60406587 = 7255 -20121029181607912-60406588 = 7253 -20121029181607919-60406589 = 7251 -20121029181607924-60406590 = 7250 -20121029181607929-60406591 = 7254 -20121029181607936-60406592 = 7256 -20121029181607942-60406593 = 7252 -20121029181607947-60406594 = 7298 -20121030115624887-60406607 = 7208 -20121030115631586-60406608 = 7207 -20121102154200905-60407020 = 7724 -20121102154204647-60407021 = 7869 -20121103091208986-60407047 = 7581 -20121103091208994-60407048 = 7579 -20121103091209001-60407049 = 7576 -20121103091209008-60407050 = 7575 -20121103091209015-60407051 = 7580 -20121103091209022-60407052 = 7582 -20121103091209030-60407053 = 7577 -20121103091209037-60407054 = 7578 -20121113111609476-60407345 = 7740 -20121113111609484-60407346 = 7736 -20121113111609491-60407347 = 7737 -20121113111609498-60407348 = 7734 -20121113111609505-60407349 = 7739 -20121113111609511-60407350 = 7738 -20121113111609518-60407351 = 7733 -20121113111609523-60407352 = 7735 -20121113130406843-60407354 = 7713 -20121113130406850-60407355 = 7710 -20121113130406856-60407356 = 7708 -20121113130406862-60407357 = 7707 -20121113130406868-60407358 = 7712 -20121113130406875-60407359 = 7714 -20121113130406883-60407360 = 7709 -20121113130406889-60407361 = 7711 -20121120105624562-60407557 = 7804 -20121120105624571-60407558 = 7802 -20121120105624578-60407559 = 7809 -20121120105624585-60407560 = 7808 -20121120105624593-60407561 = 7803 -20121120105624600-60407562 = 7806 -20121120105624607-60407563 = 7805 -20121120105624614-60407564 = 7807 -20121123122418416-60407651 = 8122 -20121123122418422-60407652 = 8128 -20121123122418428-60407653 = 8123 -20121123122418434-60407654 = 8124 -20121123122418439-60407655 = 8126 -20121123122418446-60407656 = 8129 -20121123122418452-60407657 = 8125 -20121123122418457-60407658 = 8127 -20121127112813823-60407720 = 8046 -20121127112813830-60407721 = 8043 -20121127112813837-60407722 = 8047 -20121127112813844-60407723 = 8757 -20121127112813851-60407724 = 8042 -20121127112813857-60407725 = 8766 -20121127112813864-60407726 = 8774 -20121127112813869-60407727 = 8784 -20121129112014286-60407868 = 8368 -20121129112014292-60407869 = 8365 -20121129112014297-60407870 = 8369 -20121129112014304-60407871 = 8370 -20121129112014309-60407872 = 8364 -20121129112014315-60407873 = 8367 -20121129112014319-60407874 = 8371 -20121129112014325-60407875 = 8366 -20121130160813307-60408030 = 8177 -20121130160813315-60408031 = 8182 -20121130160813322-60408032 = 8180 -20121130160813327-60408033 = 8179 -20121130160813332-60408034 = 8184 -20121130160813338-60408035 = 8181 -20121130160813344-60408036 = 8178 -20121130160813351-60408037 = 8183 -20121207170558909-60408468 = 8378 -20121207170558924-60408469 = 8375 -20121207170558939-60408470 = 8373 -20121207170558953-60408471 = 8372 -20121207170558966-60408472 = 8377 -20121207170558988-60408473 = 8746 -20121207170559006-60408474 = 8374 -20121207170559019-60408475 = 8376 -20121212111609369-60408661 = 8421 -20121212111609377-60408662 = 8423 -20121212111609383-60408663 = 8419 -20121212111609390-60408664 = 8424 -20121212111609396-60408665 = 8425 -20121212111609402-60408666 = 8422 -20121212111609409-60408667 = 8420 -20121212111609415-60408668 = 8426 -20121218104202329-60408793 = 8478 -20121218110412741-60408795 = 8462 -20121218110412760-60408796 = 8465 -20121218110412767-60408797 = 8460 -20121218110412774-60408798 = 8467 -20121218110412781-60408799 = 8463 -20121218110412787-60408800 = 8464 -20121218110412794-60408801 = 8461 -20121218110412800-60408802 = 8466 -20130104112813769-60409072 = 8522 -20130104112813778-60409073 = 8524 -20130104112813786-60409074 = 8519 -20130104112813794-60409075 = 8520 -20130104112813802-60409076 = 8523 -20130104112813808-60409077 = 8521 -20130104112813815-60409078 = 8518 -20130104112813821-60409079 = 8525 -20130111133549473-60409201 = 8586 -20130115102816314-60409230 = 8682 -20130115112412967-60409238 = 8576 -20130115112412973-60409239 = 8578 -20130115112412980-60409240 = 8573 -20130115112412987-60409241 = 8574 -20130115112412994-60409242 = 8577 -20130115112413002-60409243 = 8575 -20130115112413008-60409244 = 8572 -20130115112413014-60409245 = 8579 -20130118105206318-60409278 = 8967 -20130118105206324-60409279 = 8965 -20130118105206331-60409280 = 8960 -20130118105206337-60409281 = 8961 -20130118105206342-60409282 = 8963 -20130118105206347-60409283 = 8966 -20130118105206354-60409284 = 8962 -20130118105206360-60409285 = 8964 -20130118110405781-60409287 = 8732 -20130118110405799-60409288 = 8735 -20130118110405806-60409289 = 8739 -20130118110405814-60409290 = 8738 -20130118110405820-60409291 = 8736 -20130118110405827-60409292 = 8733 -20130118110405834-60409293 = 8737 -20130118110405840-60409294 = 8734 -20130124104010537-60409594 = 8837 -20130124104010545-60409595 = 8817 -20130124104010552-60409596 = 8801 -20130124104010559-60409597 = 8808 -20130124104010566-60409598 = 8843 -20130124104010573-60409599 = 8840 -20130124104010579-60409600 = 8842 -20130124104010586-60409601 = 8841 -20130201104415424-60409857 = 9054 -20130201104415432-60409858 = 9051 -20130201104415438-60409859 = 9055 -20130201104415444-60409860 = 9056 -20130201104415450-60409861 = 9050 -20130201104415458-60409862 = 9053 -20130201104415464-60409863 = 9057 -20130201104415471-60409864 = 9052 -20130206162625876-60409974 = 9070 -20130206162713329-60409975 = 9079 -20130208122012573-60410015 = 9141 -20130208122012670-60410016 = 9143 -20130208122012678-60410017 = 9140 -20130208122012686-60410018 = 9139 -20130208122012693-60410019 = 9145 -20130208122012701-60410020 = 9142 -20130208122012708-60410021 = 9138 -20130208122012717-60410022 = 9144 -20130208153209913-60410024 = 9241 -20130208153209922-60410025 = 9238 -20130208153209929-60410026 = 9244 -20130208153209935-60410027 = 9243 -20130208153209941-60410028 = 9317 -20130208153209948-60410029 = 9242 -20130208153209954-60410030 = 9245 -20130208153209961-60410031 = 9239 -20130214105609636-60410104 = 9180 -20130214105609642-60410105 = 9182 -20130214105609647-60410106 = 9185 -20130214105609652-60410107 = 9186 -20130214105609659-60410108 = 9181 -20130214105609668-60410109 = 9179 -20130214105609675-60410110 = 9184 -20130214105609682-60410111 = 9183 -20130220121112375-60410143 = 9157 -20130220121209377-60410144 = 9148 -20130221110411926-60410212 = 9314 -20130221110411935-60410213 = 9312 -20130221110411943-60410214 = 9309 -20130221110411950-60410215 = 9308 -20130221110411959-60410216 = 9313 -20130221110411968-60410217 = 9315 -20130221110411976-60410218 = 9310 -20130221110411984-60410219 = 9311 -20130227114414125-60410375 = 9417 -20130227114414137-60410376 = 9420 -20130227114414149-60410377 = 9422 -20130227114414162-60410378 = 9423 -20130227114414177-60410379 = 9418 -20130227114414194-60410380 = 9424 -20130227114414206-60410381 = 9425 -20130227114414216-60410382 = 9426 -20130227115613221-60410384 = 9375 -20130227115613232-60410385 = 9377 -20130227115613243-60410386 = 9380 -20130227115613252-60410387 = 9381 -20130227115613262-60410388 = 9376 -20130227115613274-60410389 = 9374 -20130227115613284-60410390 = 9379 -20130227115613295-60410391 = 9378 -20130304141030443-60410476 = 9393 -20130312093624504-60410573 = 9438 -20130312100010331-60410586 = 9522 -20130312100010342-60410587 = 9520 -20130312100010353-60410588 = 9523 -20130312100010363-60410589 = 9524 -20130312100010373-60410590 = 9518 -20130312100010383-60410591 = 9521 -20130312100010393-60410592 = 9525 -20130312100010403-60410593 = 9529 -20130315123609176-60410776 = 9541 -20130315123609184-60410777 = 9543 -20130315123609191-60410778 = 9542 -20130315123609198-60410779 = 9547 -20130315123609206-60410780 = 9622 -20130315123609213-60410781 = 9540 -20130315123609219-60410782 = 9545 -20130315123609225-60410783 = 9544 -20130315125932485-60410785 = 9579 -20130315125932502-60410786 = 9601 -20130315125932515-60410787 = 9570 -20130315125932526-60410788 = 9564 -20130315125932542-60410789 = 9602 -20130315125932561-60410790 = 9583 -20130315125932581-60410791 = 9558 -20130315125932600-60410792 = 9592 -20130321104037354-60410985 = 9739 -20130321110812651-60410993 = 9914 -20130321110812681-60410994 = 9912 -20130321110812688-60410995 = 9909 -20130321110812696-60410996 = 9908 -20130321110812703-60410997 = 9913 -20130321110812710-60410998 = 9915 -20130321110812718-60410999 = 9910 -20130321110812726-60411000 = 9911 -20130321112012637-60411002 = 9880 -20130321112012661-60411003 = 9882 -20130321112012669-60411004 = 10085 -20130321112012675-60411005 = 9874 -20130321112012683-60411006 = 9892 -20130321112012694-60411007 = 9881 -20130321112012703-60411008 = 9873 -20130321112012712-60411009 = 9885 -20130322095006903-60411140 = 9751 -20130328104007833-60411427 = 10034 -20130328104007843-60411428 = 10037 -20130328104007852-60411429 = 10031 -20130328104007861-60411430 = 10032 -20130328104007871-60411431 = 10035 -20130328104007880-60411432 = 10033 -20130328104007888-60411433 = 10030 -20130328104007898-60411434 = 10036 -20130404103207720-60411581 = 10129 -20130404103207729-60411582 = 10131 -20130404103207738-60411583 = 10136 -20130404103207747-60411584 = 10135 -20130404103207756-60411585 = 10133 -20130404103207765-60411586 = 10130 -20130404103207773-60411587 = 10134 -20130404103207782-60411588 = 10132 -20130416105209833-60411715 = 10179 -20130416105209840-60411716 = 10182 -20130416105209849-60411717 = 10178 -20130416105209857-60411718 = 10177 -20130416105209865-60411719 = 10183 -20130416105209872-60411720 = 10180 -20130416105209881-60411721 = 10176 -20130416105209890-60411722 = 10181 -20130418110019695-60411749 = 10203 -20130418110019708-60411750 = 10206 -20130418110019721-60411751 = 10208 -20130418110019733-60411752 = 10209 -20130418110019746-60411753 = 10204 -20130418110019757-60411754 = 10202 -20130418110019769-60411755 = 10207 -20130418110019780-60411756 = 10205 -20130424110814698-60411984 = 10355 -20130424110814710-60411985 = 10353 -20130424110814721-60411986 = 10350 -20130424110814732-60411987 = 10349 -20130424110814742-60411988 = 10354 -20130424110814760-60411989 = 10356 -20130424110814773-60411990 = 10351 -20130424110814783-60411991 = 10352 -20130424115104435-60411993 = 10268 -20130424115104445-60411994 = 10270 -20130424115104456-60411995 = 10273 -20130424115104466-60411996 = 10274 -20130424115104476-60411997 = 10269 -20130424115104486-60411998 = 10267 -20130424115104496-60411999 = 10272 -20130424115104507-60412000 = 10271 -20130501110813877-60412150 = 10411 -20130501110813887-60412151 = 10409 -20130501110813896-60412152 = 10414 -20130501110813905-60412153 = 10413 -20130501110813913-60412154 = 10410 -20130501110813921-60412155 = 10412 -20130501110813930-60412156 = 10415 -20130501110813940-60412157 = 10408 -20130508143446619-60412282 = 10423 -20130514121214397-60412340 = 10451 -20130516112808409-60412347 = 10557 -20130516112808418-60412348 = 10555 -20130516112808428-60412349 = 10560 -20130516112808437-60412350 = 10559 -20130516112808446-60412351 = 10556 -20130516112808455-60412352 = 10558 -20130516112808464-60412353 = 10561 -20130516112808474-60412354 = 10554 -20130516114008448-60412358 = 10562 -20130516114008457-60412359 = 10565 -20130516114008467-60412360 = 10569 -20130516114008481-60412361 = 10568 -20130516114008496-60412362 = 10566 -20130516114008505-60412363 = 10563 -20130516114008513-60412364 = 10567 -20130516114008521-60412365 = 10658 -20130522154211227-60412585 = 10581 -20130524120807629-60412745 = 10858 -20130524120807637-60412746 = 10860 -20130524120807648-60412747 = 10855 -20130524120807657-60412748 = 10856 -20130524120807668-60412749 = 10859 -20130524120807677-60412750 = 10857 -20130524120807689-60412751 = 10854 -20130524120807699-60412752 = 10861 -20130524122006836-60412754 = 10657 -20130524122006844-60412755 = 10654 -20130524122006851-60412756 = 10650 -20130524122006858-60412757 = 10651 -20130524122006871-60412758 = 10653 -20130524122006879-60412759 = 10656 -20130524122006887-60412760 = 10652 -20130524122006898-60412761 = 10655 -20130530161331750-60412888 = 10853 -20130606125208381-60413194 = 10901 -20130606161207286-60413217 = 10951 -20130606161207305-60413218 = 10954 -20130606161207320-60413219 = 10958 -20130606161207338-60413220 = 10957 -20130606161207355-60413221 = 10964 -20130606161207375-60413222 = 10952 -20130606161207393-60413223 = 10956 -20130606161207411-60413224 = 10953 -20130611112823059-60413342 = 10976 -20130613114014501-60413396 = 11237 -20130613114014517-60413397 = 11239 -20130613114014532-60413398 = 11242 -20130613114014547-60413399 = 11243 -20130613114014559-60413400 = 11238 -20130613114014569-60413401 = 11236 -20130613114014580-60413402 = 11241 -20130613114014592-60413403 = 11240 -20130613115213549-60413405 = 11034 -20130613115213564-60413406 = 11036 -20130613115213579-60413407 = 11041 -20130613115213596-60413408 = 11040 -20130613115213612-60413409 = 11038 -20130613115213628-60413410 = 11035 -20130613115213641-60413411 = 11039 -20130613115213653-60413412 = 11037 -20130614112909080-60413417 = 11043 -20130618174007738-60413554 = 11119 -20130618174007750-60413555 = 11116 -20130618174007761-60413556 = 11120 -20130618174007775-60413557 = 11121 -20130618174007789-60413558 = 11115 -20130618174007803-60413559 = 11118 -20130618174007814-60413560 = 11122 -20130618174007825-60413561 = 11117 -20130620110018465-60413603 = 11154 -20130624120616760-60414290 = 11287 -20130625104414308-60414400 = 11651 -20130625104414323-60414401 = 11649 -20130625104414340-60414402 = 11647 -20130625104414353-60414403 = 11646 -20130625104414363-60414404 = 11650 -20130625104414376-60414405 = 11652 -20130625104414388-60414406 = 11648 -20130625141901291-60414449 = 11670 -20130625141916731-60414450 = 11669 -20130625142000668-60414451 = 11671 -20130626102411175-60414476 = 11360 -20130626102411186-60414477 = 11358 -20130626102411196-60414478 = 11353 -20130626102411207-60414479 = 11354 -20130626102411220-60414480 = 11356 -20130626102411231-60414481 = 11359 -20130626102411242-60414482 = 11355 -20130626102411254-60414483 = 11357 -20130626105611184-60414485 = 11308 -20130628174412428-60414617 = 11376 -20130701110607663-60414725 = 11428 -20130701113214336-60414727 = 11477 -20130701113214354-60414728 = 11474 -20130701113214370-60414729 = 11478 -20130701113214383-60414730 = 11479 -20130701113214394-60414731 = 11473 -20130701113214409-60414732 = 11476 -20130701113214422-60414733 = 11480 -20130701113214437-60414734 = 11475 -20130705112414430-60414934 = 11730 -20130705112414449-60414935 = 11727 -20130705112414466-60414936 = 11725 -20130705112414483-60414937 = 11724 -20130705112414497-60414938 = 11729 -20130705112414512-60414939 = 11731 -20130705112414523-60414940 = 11726 -20130705112414532-60414941 = 11728 -20130708103257720-60415116 = 11763 -20130708103327927-60415117 = 11663 -20130710113610200-60415209 = 11852 -20130710113610226-60415210 = 11854 -20130710113610248-60415211 = 11851 -20130710113610263-60415212 = 11850 -20130710113610280-60415213 = 11856 -20130710113610305-60415214 = 11853 -20130710113610325-60415215 = 11849 -20130710113610341-60415216 = 11855 -20130710123609070-60415218 = 11864 -20130710123609085-60415219 = 11861 -20130710123609100-60415220 = 11857 -20130710123609114-60415221 = 11858 -20130710123609124-60415222 = 11860 -20130710123609137-60415223 = 11863 -20130710123609147-60415224 = 11859 -20130710123609159-60415225 = 11862 -20130710154612100-60415305 = 12147 -20130715094805853-60415443 = 11889 -20130715094805859-60415444 = 11893 -20130715094805865-60415445 = 11969 -20130715094805871-60415446 = 11881 -20130715094805877-60415447 = 11894 -20130715094805882-60415448 = 11899 -20130715094805888-60415449 = 11905 -20130715094805894-60415450 = 11902 -20130717104808501-60415560 = 12114 -20130717104808507-60415561 = 12116 -20130717104808513-60415562 = 12121 -20130717104808518-60415563 = 12120 -20130717104808524-60415564 = 12157 -20130717104808530-60415565 = 12166 -20130717104808535-60415566 = 12119 -20130717104808540-60415567 = 12117 -20130718112408108-60415658 = 11961 -20130718112408114-60415659 = 11963 -20130718112408120-60415660 = 11968 -20130718112408124-60415661 = 11967 -20130718112408128-60415662 = 11965 -20130718112408133-60415663 = 11962 -20130718112408138-60415664 = 11966 -20130718112408143-60415665 = 11964 -20130724161609584-60415760 = 12039 -20130724161609588-60415761 = 12037 -20130724161609593-60415762 = 12032 -20130724161609598-60415763 = 12033 -20130724161609604-60415764 = 12035 -20130724161609610-60415765 = 12038 -20130724161609614-60415766 = 12034 -20130724161609619-60415767 = 12036 -20130725154017379-60415771 = 11989 -20130805124221737-60416105 = 12203 -20130807112811862-60416132 = 12378 -20130807112811870-60416133 = 12381 -20130807112811878-60416134 = 12383 -20130807112811887-60416135 = 12384 -20130807112811895-60416136 = 12379 -20130807112811903-60416137 = 12377 -20130807112811911-60416138 = 12382 -20130807112811919-60416139 = 12380 -20130807113441652-60416141 = 12372 -20130807113441657-60416142 = 13150 -20130807113441662-60416143 = 12375 -20130807113441667-60416144 = 12374 -20130807113441672-60416145 = 12371 -20130807113441677-60416146 = 12373 -20130807113441682-60416147 = 12376 -20130807113441688-60416148 = 12369 -20130807142813334-60416167 = 12210 -20130813161813287-60416441 = 12392 -20130814120813041-60416443 = 12525 -20130814120813048-60416444 = 12531 -20130814120813055-60416445 = 12526 -20130814120813063-60416446 = 12527 -20130814120813071-60416447 = 12529 -20130814120813078-60416448 = 12524 -20130814120813086-60416449 = 12528 -20130814120813094-60416450 = 12530 -20130814123211938-60416452 = 12519 -20130814123211944-60416453 = 12522 -20130814123211948-60416454 = 12518 -20130814123211954-60416455 = 12517 -20130814123211958-60416456 = 12523 -20130814123211963-60416457 = 12520 -20130814123211968-60416458 = 12516 -20130814123211973-60416459 = 12521 -20130821162606120-60416725 = 12817 -20130821163607577-60416727 = 12637 -20130821163607585-60416728 = 12634 -20130821163607593-60416729 = 12630 -20130821163607601-60416730 = 12631 -20130821163607608-60416731 = 12633 -20130821163607616-60416732 = 12636 -20130821163607623-60416733 = 12632 -20130821163607630-60416734 = 12635 -20130821164806568-60416736 = 12699 -20130821164806574-60416737 = 12697 -20130821164806579-60416738 = 12694 -20130821164806584-60416739 = 12693 -20130821164806590-60416740 = 12698 -20130821164806595-60416741 = 12700 -20130821164806600-60416742 = 12662 -20130821164806606-60416743 = 12661 -20130823175205935-60416760 = 12656 -20130826173805228-60416906 = 12712 -20130827144845643-60416944 = 13062 -20130827144845649-60416945 = 13065 -20130827144845662-60416947 = 13060 -20130827144845668-60416948 = 13066 -20130827144845674-60416949 = 13063 -20130827144845680-60416950 = 13059 -20130827144845686-60416951 = 13064 -20130829134413141-60417057 = 12788 -20130829134413150-60417058 = 12791 -20130829134413158-60417059 = 12787 -20130829134413166-60417060 = 12786 -20130829134413174-60417061 = 12792 -20130829134413181-60417062 = 12789 -20130829134413189-60417063 = 12785 -20130829134413197-60417064 = 12790 -20130830121406372-60417117 = 12815 -20130902143517608-60417285 = 12799 -20130902143537949-60417286 = 12816 -20130902160940923-60417294 = 12834 -20130904104807932-60417326 = 12879 -20130904104807938-60417327 = 12882 -20130904104807944-60417328 = 12886 -20130904104807950-60417329 = 12885 -20130904104807956-60417330 = 12883 -20130904104807961-60417331 = 12880 -20130904104807966-60417332 = 12884 -20130904104807972-60417333 = 12881 -20130904134409267-60417335 = 12841 -20130906090602099-60417387 = 13141 -20130906090620484-60417388 = 13132 -20130906115405137-60417401 = 12914 -20130912174135997-60417716 = 13139 -20130913152721165-60417727 = 13125 -20130913152721173-60417728 = 13123 -20130913152721181-60417729 = 13128 -20130913152721189-60417730 = 13127 -20130913152721197-60417731 = 13124 -20130913152721205-60417732 = 13126 -20130913152721212-60417733 = 13129 -20130913152721220-60417734 = 13122 -20130918145007903-60417846 = 13178 -20130919112811629-60417858 = 13219 -20130919112811637-60417859 = 13221 -20130919112811646-60417860 = 13224 -20130919112811654-60417861 = 13225 -20130919112811662-60417862 = 13220 -20130919112811670-60417863 = 13218 -20130919112811678-60417864 = 13223 -20130919112811686-60417865 = 13222 -20130920172618898-60417901 = 13253 -20130927104812194-60418051 = 13311 -20130927104812195-60418052 = 13308 -20130927104812208-60418053 = 13319 -20130927104812209-60418054 = 13305 -20130927104812210-60418055 = 13310 -20130927104812211-60418056 = 13318 -20130927104812223-60418057 = 13307 -20130927104812224-60418058 = 13309 -20130927134811435-60418067 = 13265 -20131002120013797-60418202 = 13348 -20131004110009724-60418246 = 13411 -20131004110009725-60418247 = 13412 -20131004110009730-60418248 = 13413 -20131004110009731-60418249 = 13415 -20131004110009731-60418250 = 13414 -20131004110009731-60418251 = 13416 -20131004110009737-60418252 = 13418 -20131004110009737-60418253 = 13417 -20131004111008726-60418261 = 13363 -20131007162010426-60418383 = 13442 -20131011114017120-60418474 = 13497 -20131011114017120-60418475 = 13496 -20131011114017127-60418476 = 13498 -20131011114017128-60418477 = 13499 -20131011114017128-60418478 = 13500 -20131011114017128-60418479 = 13501 -20131011114017136-60418480 = 13601 -20131011114017137-60418481 = 13602 -20131011130006700-60418489 = 13519 -20131015110007223-60418674 = 13591 -20131015110007224-60418675 = 13593 -20131015110007230-60418676 = 13592 -20131015110007230-60418677 = 13594 -20131015110007230-60418678 = 13595 -20131015110007231-60418679 = 13597 -20131015110007237-60418680 = 13596 -20131015110007237-60418681 = 13598 -20131015172009634-60418706 = 13537 -20131018165212760-60418842 = 13649 -20131018165212761-60418843 = 13651 -20131018165212761-60418844 = 13650 -20131018165212762-60418845 = 13652 -20131018165212768-60418846 = 13656 -20131018165212768-60418847 = 13657 -20131023102405433-60418950 = 13894 -20131023102405433-60418951 = 13895 -20131023102405439-60418952 = 13896 -20131023102405440-60418953 = 13897 -20131023102405440-60418954 = 13898 -20131023102405440-60418955 = 13899 -20131023102405446-60418956 = 13900 -20131023102405447-60418957 = 13901 -20131025095203804-60419085 = 13768 -20131025095203805-60419086 = 13769 -20131025095203810-60419087 = 13770 -20131025095203811-60419088 = 13772 -20131025095203811-60419089 = 13771 -20131025095203812-60419090 = 13773 -20131025095203817-60419091 = 13774 -20131025095203817-60419092 = 13775 -20131025202837639-60419119 = 13776 -20131101165406593-60419352 = 13792 -20131105142030566-60419529 = 13061 -20131105142100973-60419530 = 13017 -20131108142030412-60419588 = 14162 -20131108142104759-60419589 = 14003 -20131111155008335-60419637 = 13969 -20131114110010184-60419739 = 14130 -20131114110010185-60419740 = 14129 -20131114110010192-60419741 = 14131 -20131114110010192-60419742 = 14133 -20131114110010192-60419743 = 14132 -20131114110010193-60419744 = 14134 -20131114110010199-60419745 = 14135 -20131114110010199-60419746 = 14136 -20131114111210300-60419754 = 14268 -20131114111210301-60419755 = 14274 -20131114111210310-60419756 = 14101 -20131114111210311-60419757 = 14102 -20131114111210312-60419758 = 14104 -20131114111210313-60419759 = 14109 -20131114111210324-60419760 = 14114 -20131114111210325-60419761 = 14115 -20131115163412618-60419839 = 14021 -20131118164008350-60420015 = 14415 -20131119121606842-60420018 = 14265 -20131119121606843-60420019 = 14266 -20131119121606852-60420020 = 14267 -20131119121606853-60420021 = 14270 -20131119121606854-60420022 = 14269 -20131119121606854-60420023 = 14271 -20131119121606873-60420024 = 14272 -20131119121606873-60420025 = 14273 -20131121114413383-60420074 = 14794 -20131121114413384-60420075 = 14791 -20131121114413395-60420076 = 14789 -20131121114413396-60420077 = 14788 -20131121114413397-60420078 = 14793 -20131121114413398-60420079 = 14795 -20131121114413411-60420080 = 14790 -20131121114413412-60420081 = 14792 -20131121163507727-60420154 = 14182 -20131122142806949-60420313 = 14327 -20131122142806949-60420314 = 14328 -20131122142806966-60420315 = 14329 -20131122142806968-60420316 = 14330 -20131122142806969-60420317 = 14331 -20131122142806971-60420318 = 14332 -20131122142806989-60420319 = 14333 -20131122142806990-60420320 = 14334 -20131122162206517-60420328 = 14295 -20131126140408758-60420451 = 14408 -20131126140408758-60420452 = 14409 -20131126140408769-60420453 = 14410 -20131126140408770-60420454 = 14411 -20131126140408770-60420455 = 15089 -20131126140408771-60420456 = 14412 -20131126140408781-60420457 = 14413 -20131126140408782-60420458 = 14414 -20131202092013861-60420547 = 14391 -20131202154006378-60420696 = 14518 -20131202154006379-60420697 = 14519 -20131202154006385-60420698 = 14520 -20131202154006386-60420699 = 14521 -20131202154006386-60420700 = 14522 -20131202154006386-60420701 = 14523 -20131202154006392-60420702 = 14524 -20131202154006392-60420703 = 14525 -20131204171005384-60420763 = 14536 -20131206125614455-60420950 = 14621 -20131206125614456-60420951 = 14623 -20131206125614463-60420952 = 14622 -20131206125614463-60420953 = 14624 -20131206125614464-60420954 = 15076 -20131206125614464-60420955 = 14626 -20131206125614470-60420956 = 14627 -20131206125614471-60420957 = 14628 -20131212112413284-60421230 = 14947 -20131212112413284-60421231 = 14948 -20131212112413290-60421232 = 14949 -20131212112413290-60421233 = 14950 -20131212112413291-60421234 = 14951 -20131212112413291-60421235 = 14952 -20131212112413296-60421236 = 14953 -20131212112413296-60421237 = 14954 -20131212113603087-60421245 = 14939 -20131212113603087-60421246 = 14940 -20131212113603093-60421247 = 14941 -20131212113603093-60421248 = 14942 -20131212113603093-60421249 = 14943 -20131212113603094-60421250 = 14944 -20131212113603099-60421251 = 14945 -20131212113603100-60421252 = 14946 -20131220120710186-60421442 = 14818 -20140110142404260-60422610 = 15078 -20140110142404467-60422611 = 15079 -20140110142404468-60422612 = 15080 -20140110142404468-60422613 = 15082 -20140110142404468-60422614 = 15081 -20140110142404475-60422615 = 15083 -20140110142404475-60422616 = 15084 -20140110142404475-60422617 = 15087 -20140110142803884-60422625 = 15330 -20140110142803884-60422626 = 15331 -20140110142803894-60422627 = 15332 -20140110142803894-60422628 = 15333 -20140110142803894-60422629 = 15334 -20140110142803894-60422630 = 15335 -20140110142803902-60422631 = 15336 -20140110142803902-60422632 = 15337 -20140110151504471-60422670 = 14987 -20140114144409179-60422847 = 15153 -20140114144409179-60422848 = 15154 -20140114144409184-60422849 = 15155 -20140114144409185-60422850 = 15157 -20140114144409185-60422851 = 15156 -20140114144409185-60422852 = 15158 -20140114144409190-60422853 = 15159 -20140114144409191-60422854 = 15160 -20140117162308688-60423026 = 15171 -20140120143606073-60423047 = 15394 -20140120143606074-60423048 = 15395 -20140120143606079-60423049 = 15396 -20140120143606079-60423050 = 15407 -20140120143606080-60423051 = 15398 -20140120143606080-60423052 = 15408 -20140120143606085-60423053 = 15697 -20140120143606085-60423054 = 15400 -20140120170306862-60423064 = 15353 -20140124114016050-60423426 = 15487 -20140124114016050-60423427 = 15488 -20140124114016056-60423428 = 15489 -20140124114016056-60423429 = 15499 -20140124114016057-60423430 = 15491 -20140124114016057-60423431 = 15493 -20140124114016069-60423432 = 15492 -20140124114016069-60423433 = 15494 -20140124152112477-60423441 = 15425 -20140127131612178-60423555 = 15521 -20140127131612179-60423556 = 15522 -20140127131612183-60423557 = 15524 -20140127131612184-60423558 = 15523 -20140127131612184-60423559 = 15525 -20140127131612184-60423560 = 15526 -20140127131612189-60423561 = 15528 -20140127131612190-60423562 = 15527 -20140129104028864-60423588 = 15680 -20140129104028865-60423589 = 15681 -20140129104028873-60423590 = 15682 -20140129104028873-60423591 = 15683 -20140129104028874-60423592 = 15684 -20140129104028874-60423593 = 15685 -20140129104028883-60423594 = 15686 -20140129104028883-60423595 = 15687 -20140205135610551-60423658 = 15860 -20140205135610639-60423659 = 15861 -20140205135610639-60423660 = 15862 -20140205135610640-60423661 = 15863 -20140205135610640-60423662 = 16019 -20140205135610646-60423663 = 15865 -20140205135610646-60423664 = 15866 -20140205135610647-60423665 = 15867 -20140213142813006-60424044 = 15772 -20140213142813006-60424045 = 15773 -20140213142813013-60424046 = 15774 -20140213142813014-60424047 = 15775 -20140213142813014-60424048 = 15776 -20140213142813014-60424049 = 15777 -20140213142813021-60424050 = 15778 -20140213142813021-60424051 = 15779 -20140217145510801-60424219 = 15893 -20140218103205245-60424329 = 16009 -20140218103205246-60424330 = 16010 -20140218103205261-60424331 = 16011 -20140218103205261-60424332 = 16012 -20140218103205262-60424333 = 16013 -20140218103205263-60424334 = 16014 -20140218103205273-60424335 = 16015 -20140218103205274-60424336 = 16016 -20140219111604836-60424374 = 15942 -20140219111604837-60424375 = 15943 -20140219111604845-60424376 = 15944 -20140219111604846-60424377 = 15945 -20140219111604846-60424378 = 15946 -20140219111604847-60424379 = 15947 -20140219111604855-60424380 = 15948 -20140219111604856-60424381 = 15949 -20140219141510503-60424393 = 15917 -20140221170112019-60424409 = 15929 -20140227141608673-60424469 = 16210 -20140227141608673-60424470 = 16211 -20140227141608682-60424471 = 16212 -20140227141608682-60424472 = 16482 -20140227141608683-60424473 = 16214 -20140227141608683-60424474 = 16215 -20140227141608691-60424475 = 16216 -20140227141608691-60424476 = 16484 -20140304150510853-60424623 = 16036 -20140305145210354-60424625 = 16438 -20140305145210355-60424626 = 16439 -20140305145210362-60424627 = 16440 -20140305145210362-60424628 = 16441 -20140305145210362-60424629 = 16442 -20140305145210363-60424630 = 16443 -20140305145210370-60424631 = 16444 -20140305145210370-60424632 = 16445 -20140306115512333-60424664 = 16437 -20140313145211262-60425055 = 16327 -20140313145211263-60425056 = 16326 -20140313145211278-60425057 = 16328 -20140313145211279-60425058 = 16329 -20140313145211280-60425059 = 16330 -20140313145211281-60425060 = 16333 -20140313145211290-60425061 = 16331 -20140313145211291-60425062 = 16332 -20140314161519895-60425087 = 16436 -20140321174107914-60425292 = 16565 -20140328111212420-60425552 = 16751 -20140328111212421-60425553 = 16752 -20140328111212428-60425554 = 16753 -20140328111212429-60425555 = 16754 -20140328111212429-60425556 = 16763 -20140328111212430-60425557 = 16759 -20140328111212438-60425558 = 16760 -20140328111212439-60425559 = 16761 -20140328113731678-60425570 = 16581 -20140402112012490-60425661 = 16648 -20140402112012933-60425662 = 16649 -20140402112012934-60425663 = 16650 -20140402112012934-60425664 = 16651 -20140402112012935-60425665 = 16652 -20140402112012947-60425666 = 16653 -20140402112012948-60425667 = 16654 -20140402112012948-60425668 = 16655 -20140415105212228-60426262 = 17052 -20140415105212229-60426263 = 17069 -20140415105212239-60426264 = 17035 -20140415105212240-60426265 = 17018 -20140415105212241-60426266 = 16890 -20140415105212241-60426267 = 16870 -20140415105212254-60426268 = 16871 -20140415105212255-60426269 = 16872 -20140416172503952-60426283 = 16779 -20140422143708070-60426516 = 17000 -20140422155048794-60426528 = 16983 -20140422155048795-60426529 = 16984 -20140424104805884-60426824 = 17327 -20140424104805885-60426825 = 17328 -20140424104805893-60426826 = 17329 -20140424104805894-60426827 = 17388 -20140424104805895-60426828 = 17390 -20140424104805895-60426829 = 17392 -20140424104805904-60426830 = 17333 -20140424104805905-60426831 = 17334 -20140424110005802-60426839 = 17153 -20140424110005802-60426840 = 17154 -20140424110005810-60426841 = 17351 -20140424110005810-60426842 = 17368 -20140424110005811-60426843 = 17156 -20140424110005812-60426844 = 17158 -20140424110005821-60426845 = 17159 -20140424110005821-60426846 = 17160 -20140430110109414-60427134 = 17177 -20140430150410645-60427139 = 17230 -20140430150410645-60427140 = 17231 -20140430150410649-60427141 = 17232 -20140430150410649-60427142 = 17233 -20140430150410649-60427143 = 17234 -20140430150410650-60427144 = 17235 -20140430150410654-60427145 = 17321 -20140430150410654-60427146 = 17237 -20140506110609691-60427435 = 17386 -20140509113005970-60427555 = 17468 -20140509113005971-60427556 = 17469 -20140509113005978-60427557 = 17470 -20140509113005978-60427558 = 17471 -20140509113005979-60427559 = 17472 -20140509113005979-60427560 = 17473 -20140509113005987-60427561 = 17474 -20140509113005987-60427562 = 17475 -20140509113606735-60427571 = 17467 -20140512175108185-60427796 = 17490 -20140513111008692-60427850 = 17596 -20140513111008692-60427851 = 17675 -20140513111008700-60427852 = 17681 -20140513111008700-60427853 = 17669 -20140513111008701-60427854 = 17699 -20140513111008701-60427855 = 17717 -20140513111008708-60427856 = 17740 -20140513111008709-60427857 = 17763 -20140514144611529-60427884 = 17507 -20140516132112391-60427905 = 17523 -20140523172009416-60428050 = 17829 -20140523172009417-60428051 = 17830 -20140523172009422-60428052 = 17831 -20140523172009422-60428053 = 17832 -20140523172009422-60428054 = 17870 -20140523172009423-60428055 = 17852 -20140523172009427-60428056 = 17867 -20140523172009428-60428057 = 17836 -20140529135113917-60428571 = 17883 -20140605105012665-60428619 = 17972 -20140605105012764-60428620 = 17993 -20140605105012764-60428621 = 17974 -20140605105012765-60428622 = 17975 -20140605105012766-60428623 = 17976 -20140605105012775-60428624 = 17977 -20140605105012776-60428625 = 17978 -20140605105012777-60428626 = 18011 -20140613104007999-60428953 = 18104 -20140613104007999-60428954 = 18105 -20140613104008007-60428955 = 18106 -20140613104008007-60428956 = 18107 -20140613104008008-60428957 = 18108 -20140613104008008-60428958 = 18109 -20140613104008016-60428959 = 18110 -20140613104008016-60428960 = 18111 -20140620143018384-60429220 = 18164 -20140620143018384-60429221 = 18174 -20140620143018392-60429222 = 18184 -20140620143018393-60429223 = 18194 -20140620143018393-60429224 = 18197 -20140620143018394-60429225 = 18209 -20140620143018402-60429226 = 18217 -20140620143018403-60429227 = 18225 -20140620143106333-60429235 = 18143 -20140624143606562-60429292 = 18236 -20140624151006324-60429295 = 18769 -20140624151006324-60429296 = 18770 -20140624151006329-60429297 = 18771 -20140624151006329-60429298 = 18772 -20140624151006329-60429299 = 18773 -20140624151006330-60429300 = 18774 -20140624151006336-60429301 = 18775 -20140624151006336-60429302 = 18776 -20140627132335012-60429440 = 18324 -20140627132335012-60429441 = 18325 -20140627132335018-60429442 = 18326 -20140627132335018-60429443 = 18327 -20140627132335018-60429444 = 18328 -20140627132335019-60429445 = 18329 -20140627132335024-60429446 = 18330 -20140627132335024-60429447 = 18331 -20140627155108193-60429559 = 18246 -20140630141602041-60429677 = 18342 -20140702125014596-60429692 = 18474 -20140702125014644-60429693 = 18475 -20140702125014645-60429694 = 18625 -20140702125014645-60429695 = 18626 -20140702125014645-60429696 = 18627 -20140702125014651-60429697 = 18628 -20140702125014651-60429698 = 18629 -20140702125014651-60429699 = 18630 -20140704100601563-60430085 = 18786 -20140707165557451-60430698 = 18796 -20140708114017423-60430701 = 18861 -20140708114017424-60430702 = 18862 -20140708114017431-60430703 = 18863 -20140708114017432-60430704 = 18864 -20140708114017432-60430705 = 18865 -20140708114017433-60430706 = 18866 -20140708114017440-60430707 = 18867 -20140708114017441-60430708 = 18868 -20140710145057605-60430747 = 18885 -20140714141548837-60430876 = 18896 -20140717174541634-60430895 = 18915 -20140718104020398-60430905 = 19086 -20140718104020399-60430906 = 19093 -20140718104020407-60430907 = 19094 -20140718104020407-60430908 = 19095 -20140718104020407-60430909 = 19096 -20140718104020408-60430910 = 19102 -20140718104020417-60430911 = 19105 -20140718104020418-60430912 = 19106 -20140718104023349-60430920 = 18993 -20140718104023349-60430921 = 19045 -20140718104023356-60430922 = 19001 -20140718104023357-60430923 = 19040 -20140718104023357-60430924 = 19009 -20140718104023358-60430925 = 19017 -20140718104023365-60430926 = 19025 -20140718104023366-60430927 = 19039 -20140721160556661-60431065 = 19193 -20140724160558620-60431314 = 19194 -20140729175550270-60431401 = 19299 -20140729175550270-60431402 = 19301 -20140730154007668-60431471 = 19458 -20140730154007668-60431472 = 19460 -20140730154007674-60431473 = 19517 -20140730154007674-60431474 = 19544 -20140730154007674-60431475 = 19547 -20140730154007675-60431476 = 19550 -20140730154007680-60431477 = 19554 -20140730154007681-60431478 = 19556 -20140730154010407-60431486 = 19392 -20140730154010408-60431487 = 19393 -20140730154010418-60431488 = 19394 -20140730154010419-60431489 = 19395 -20140730154010420-60431490 = 19396 -20140730154010420-60431491 = 19397 -20140730154010429-60431492 = 19398 -20140730154010429-60431493 = 19399 -20140730160819590-60431501 = 20014 -20140731111600088-60431657 = 19305 -20140805155555874-60431970 = 19410 -20140807132014902-60431981 = 19545 -20140807132014903-60431982 = 19546 -20140807132014911-60431983 = 19548 -20140807132014911-60431984 = 19549 -20140807132014912-60431985 = 19551 -20140807132014912-60431986 = 19552 -20140807132014919-60431987 = 19553 -20140807132014920-60431988 = 19555 -20140808152414016-60432007 = 19688 -20140808152414017-60432008 = 19689 -20140808152414029-60432009 = 19690 -20140808152414030-60432010 = 19691 -20140808152414031-60432011 = 19692 -20140808152414032-60432012 = 19693 -20140808152414037-60432013 = 19812 -20140808152414038-60432014 = 19695 -20140811164056097-60432513 = 19724 -20140811191926392-60432519 = 19950 -20140812171543248-60432577 = 19803 -20140814104008736-60432583 = 20582 -20140814104008736-60432584 = 20619 -20140814104009043-60432585 = 20633 -20140814104009043-60432586 = 20635 -20140814104009044-60432587 = 20636 -20140814104009045-60432588 = 20638 -20140814104009063-60432589 = 20640 -20140814104009064-60432590 = 20643 -20140814104013004-60432598 = 20634 -20140814104013004-60432599 = 20637 -20140814104013033-60432600 = 20639 -20140814104013034-60432601 = 20641 -20140814104013034-60432602 = 20642 -20140814104013034-60432603 = 20644 -20140814104013049-60432604 = 20645 -20140814104013050-60432605 = 20646 -20140814141847739-60432623 = 19932 -20140818162702633-60432764 = 20223 -20140818162702633-60432765 = 20224 -20140818162702638-60432766 = 20225 -20140818162702639-60432767 = 20226 -20140818162702639-60432768 = 20227 -20140818162702640-60432769 = 20228 -20140818162702647-60432770 = 20292 -20140818162702647-60432771 = 20293 -20140819111555148-60432826 = 19962 -20140819143650772-60432831 = 19882 -20140819143650773-60432832 = 19883 -20140819143650782-60432833 = 19884 -20140819143650782-60432834 = 19885 -20140819143650783-60432835 = 19886 -20140819143650783-60432836 = 19887 -20140819143650793-60432837 = 20817 -20140819143650793-60432838 = 19890 -20140819143651000-60432846 = 19902 -20140822160653006-60433231 = 20239 -20140825142452246-60433514 = 20494 -20140827122044098-60434216 = 20769 -20140827145435986-60434219 = 20748 -20140903140639280-60434380 = 20773 -20140904140042238-60434387 = 20777 -20140919182158742-60434432 = 20812 -20140923113013853-60434782 = 21629 -20140923113013853-60434783 = 21630 -20140923113013858-60434784 = 21631 -20140923113013858-60434785 = 21632 -20140923113013858-60434786 = 21633 -20140923113013858-60434787 = 21634 -20140923113013863-60434788 = 21635 -20140923113013863-60434789 = 21636 -20140923135616632-60434801 = 21341 -20140923135616633-60434802 = 21342 -20140923135616638-60434803 = 21343 -20140923135616638-60434804 = 21344 -20140923135616639-60434805 = 21345 -20140923135616639-60434806 = 21346 -20140923135616645-60434807 = 21347 -20140923135616645-60434808 = 21348 -20140923143646999-60434816 = 21017 -20140923171102253-60434829 = 20856 -20140924142512654-60435113 = 21051 -20140925102442861-60435390 = 21151 -20140926131051939-60435801 = 21453 -20140926155612679-60435881 = 21425 -20140926155612679-60435882 = 21438 -20140926155612685-60435883 = 21427 -20140926155612685-60435884 = 21428 -20140926155612685-60435885 = 21429 -20140926155612686-60435886 = 21430 -20140926155612692-60435887 = 21431 -20140926155612693-60435888 = 21432 -20140926190040148-60435900 = 21401 -20140929171059197-60436286 = 21463 -20141002134330903-60436331 = 21475 -20141002141112392-60436333 = 21485 -20141006120222313-60436368 = 21628 -20141009160009792-60436577 = 21728 -20141009160009792-60436578 = 21729 -20141009160009797-60436579 = 21730 -20141009160009798-60436580 = 21731 -20141009160009798-60436581 = 21732 -20141009160009799-60436582 = 21733 -20141009160009804-60436583 = 21734 -20141009160009805-60436584 = 21735 -20141010155651744-60436599 = 21649 -20141010164013595-60436601 = 21774 -20141010164013596-60436602 = 21775 -20141010164013602-60436603 = 21776 -20141010164013602-60436604 = 21777 -20141010164013603-60436605 = 21778 -20141010164013604-60436606 = 21779 -20141010164013611-60436607 = 21780 -20141010164013612-60436608 = 21781 -20141015151047371-60436916 = 21818 -20141016180637883-60437256 = 21806 -20141017134839107-60437290 = 21830 -20141017141607122-60437293 = 22196 -20141017141607122-60437294 = 22199 -20141017151042654-60437297 = 22047 -20141020152457176-60437348 = 22093 -20141027110822794-60437421 = 22707 -20141027110822795-60437422 = 22799 -20141027110822801-60437423 = 22709 -20141027110822801-60437424 = 22711 -20141027110822802-60437425 = 22712 -20141027110822803-60437426 = 22714 -20141027110822809-60437427 = 22715 -20141027110822809-60437428 = 22717 -20141027110826201-60437436 = 22706 -20141027110826201-60437437 = 22710 -20141027110826206-60437438 = 22713 -20141027110826206-60437439 = 22716 -20141027110826206-60437440 = 22718 -20141027110826207-60437441 = 22719 -20141027110826212-60437442 = 22720 -20141027110826212-60437443 = 22789 -20141027111048941-60437451 = 21992 -20141027111048942-60437452 = 22094 -20141027111048948-60437453 = 22194 -20141027111048949-60437454 = 22195 -20141027111048949-60437455 = 22197 -20141027111048950-60437456 = 22198 -20141027111048961-60437457 = 22200 -20141027111048962-60437458 = 22201 -20141027111159189-60437466 = 22827 -20141027124728791-60437491 = 22840 -20141028170150992-60438459 = 22790 -20141029161045722-60438957 = 22855 -20141030161047748-60439004 = 22880 -20141031110527749-60439022 = 22901 -20141031110527749-60439023 = 22902 -20141031110527756-60439024 = 22903 -20141031110527757-60439025 = 24628 -20141031110527757-60439026 = 22904 -20141031110527758-60439027 = 24629 -20141031110527764-60439028 = 22905 -20141031110527765-60439029 = 22906 -20141031164811019-60439037 = 23195 -20141031164811020-60439038 = 23196 -20141031164811026-60439039 = 23197 -20141031164811027-60439040 = 23198 -20141031164811028-60439041 = 23199 -20141031164811029-60439042 = 23200 -20141031164811037-60439043 = 23201 -20141031164811037-60439044 = 23202 -20141104171047374-60439240 = 25953 -20141104172015021-60439243 = 23007 -20141106102020238-60439280 = 24107 -20141106102020239-60439281 = 24108 -20141106102020245-60439282 = 24109 -20141106102020245-60439283 = 24110 -20141106102020246-60439284 = 24111 -20141106102020246-60439285 = 24127 -20141106102020254-60439286 = 24128 -20141106102020254-60439287 = 24129 -20141106165613994-60439423 = 23423 -20141106165613994-60439424 = 23424 -20141110160637787-60439802 = 23890 -20141112092310133-60440551 = 23943 -20141114141838916-60440819 = 24130 -20141118144815685-60441078 = 24442 -20141118144815686-60441079 = 24434 -20141118144815703-60441080 = 24456 -20141118144815703-60441081 = 24470 -20141118144815704-60441082 = 24484 -20141118144815705-60441083 = 24498 -20141118144815717-60441084 = 24508 -20141118144815719-60441085 = 24518 -20141118174858623-60441167 = 24630 -20141125162445037-60441623 = 24587 -20141127171042300-60441668 = 24627 -20141128174815756-60441671 = 24919 -20141128174815756-60441672 = 24920 -20141128174815764-60441673 = 24921 -20141128174815765-60441674 = 24971 -20141128174815766-60441675 = 24923 -20141128174815766-60441676 = 24924 -20141128174815775-60441677 = 24925 -20141128174815776-60441678 = 24926 -20141201151036410-60441746 = 24947 -20141204122958560-60442407 = 25006 -20141204123057780-60442408 = 25005 -20141204123124315-60442409 = 25004 -20141204123237308-60442410 = 25003 -20141204123308629-60442411 = 25002 -20141204144842975-60442474 = 25202 -20141204153227792-60442477 = 25303 -20141204153227793-60442478 = 25327 -20141204153227801-60442479 = 25328 -20141204153227801-60442480 = 25329 -20141204153227802-60442481 = 25495 -20141204153227803-60442482 = 25331 -20141204153227809-60442483 = 25332 -20141204153227810-60442484 = 25496 -20141205132533103-60442949 = 25434 -20141208153049627-60443223 = 25442 -20141209141052407-60443243 = 27141 -20141209154907816-60443246 = 25508 -20141210165321840-60443373 = 25547 -20141212080302177-60443593 = 26042 -20141212093855654-60443611 = 25558 -20141212094000169-60443612 = 27253 -20141212094034526-60443613 = 25560 -20141212140006907-60443652 = 25814 -20141212140006907-60443653 = 25864 -20141212140006911-60443654 = 25890 -20141212140006911-60443655 = 25892 -20141212140006912-60443656 = 25894 -20141212140006912-60443657 = 25897 -20141212140006916-60443658 = 25899 -20141212140006916-60443659 = 25901 -20141212140008327-60443667 = 25891 -20141212140008328-60443668 = 25893 -20141212140008332-60443669 = 25895 -20141212140008333-60443670 = 25896 -20141212140008333-60443671 = 25898 -20141212140008333-60443672 = 25900 -20141212140008337-60443673 = 25902 -20141212140008337-60443674 = 25903 -20141212141037031-60443682 = 25927 -20141217140043269-60444854 = 26419 -20141217150011795-60444860 = 26572 -20141217150011795-60444861 = 26573 -20141217150011800-60444862 = 26574 -20141217150011800-60444863 = 26871 -20141217150011801-60444864 = 26576 -20141217150011805-60444866 = 26577 -20141217150011806-60444867 = 26578 -20141217153213800-60444875 = 26770 -20141217153213800-60444876 = 26771 -20141217153213807-60444877 = 26772 -20141217153213808-60444878 = 26773 -20141217153213808-60444879 = 26774 -20141217153213809-60444880 = 26775 -20141219111057430-60445308 = 26471 -20141219134243854-60445311 = 26446 -20150106122936809-60445847 = 26908 -20150106123145774-60445848 = 26907 -20150107142414241-60446074 = 27130 -20150107142414343-60446075 = 27134 -20150107151040832-60446082 = 27216 -20150109182612046-60446614 = 27218 -20150112164844156-60446694 = 27217 -20150113135059402-60446720 = 27254 -20150113181038196-60446726 = 27255 -20150114145610761-60446773 = 27709 -20150114145610761-60446774 = 27710 -20150114145610769-60446775 = 27711 -20150114145610770-60446776 = 27712 -20150114145610771-60446777 = 27713 -20150114145610771-60446778 = 27714 -20150114145610779-60446779 = 27715 -20150114145610780-60446780 = 27716 -20150114151040461-60446788 = 27576 -20150114174841821-60446851 = 27548 -20150115151611369-60447576 = 27733 -20150115161035851-60447578 = 27762 -20150116155430381-60447855 = 27775 -20150119154846406-60447872 = 28069 -20150120114859703-60448169 = 28084 -20150120140809720-60448171 = 28223 -20150120140809721-60448172 = 28224 -20150120140809728-60448173 = 28225 -20150120140809729-60448174 = 28226 -20150120140809729-60448175 = 28227 -20150120140809730-60448176 = 28228 -20150120140809734-60448177 = 28229 -20150120140809734-60448178 = 28230 -20150120141040639-60448186 = 28275 -20150121183648199-60448463 = 28246 -20150122132017672-60448496 = 28272 -20150123112101211-60448526 = 28256 -20150123112316771-60448528 = 28253 -20150123144814364-60448533 = 28515 -20150123144814365-60448534 = 28541 -20150123144814372-60448535 = 28599 -20150123144814373-60448536 = 28558 -20150123144814373-60448537 = 28560 -20150123144814374-60448538 = 28577 -20150123144814380-60448539 = 28578 -20150123144814380-60448540 = 28580 -20150123144818261-60448548 = 28579 -20150123144818262-60448549 = 28581 -20150123144818266-60448550 = 28582 -20150123144818266-60448551 = 28583 -20150123144818267-60448552 = 28584 -20150123144818267-60448553 = 28585 -20150123144818271-60448554 = 28586 -20150123144818271-60448555 = 28587 -20150129162423877-60449146 = 29009 -20150129162423878-60449147 = 29010 -20150129162435864-60449149 = 29029 -20150129162435864-60449150 = 29031 -20150130141816705-60449255 = 29033 -20150130164611981-60449290 = 28809 -20150202161247001-60449982 = 29115 -20150203153205865-60450067 = 29277 -20150203153205866-60450068 = 29278 -20150203153205871-60450069 = 29279 -20150203153205872-60450070 = 29280 -20150203153205873-60450071 = 29281 -20150203153205873-60450072 = 29282 -20150203153205880-60450073 = 29283 -20150203153205884-60450074 = 29284 -20150203153208776-60450082 = 29612 -20150203153208776-60450083 = 29613 -20150203153208782-60450084 = 29614 -20150203153208782-60450085 = 29615 -20150203153208783-60450086 = 29616 -20150203153208783-60450087 = 29617 -20150203153208791-60450088 = 29618 -20150203153208792-60450089 = 29619 -20150204174817644-60450130 = 29126 -20150205174243591-60450346 = 29300 -20150206143332727-60450366 = 29317 -20150209152943307-60450432 = 29399 -20150210144011059-60450516 = 29534 -20150210144011060-60450517 = 29535 -20150210144011075-60450518 = 29536 -20150210144011075-60450519 = 29537 -20150210144011076-60450520 = 29538 -20150210144011077-60450521 = 29539 -20150210144011087-60450522 = 29540 -20150210144011088-60450523 = 29541 -20150210161843154-60450531 = 29416 -20150213144812415-60450886 = 29937 -20150213144812416-60450887 = 29938 -20150213144812426-60450888 = 29939 -20150213144812426-60450889 = 29940 -20150213144812427-60450890 = 29941 -20150213144812428-60450891 = 29942 -20150213144812435-60450892 = 29943 -20150213144812435-60450893 = 29944 -20150213144815962-60450901 = 29973 -20150213144815962-60450902 = 29974 -20150213144815970-60450903 = 29975 -20150213144815972-60450904 = 29976 -20150213144815973-60450905 = 29977 -20150213144815973-60450906 = 29978 -20150213144815983-60450907 = 29979 -20150213144815984-60450908 = 29980 -20150216174841182-60450950 = 29630 -20150217142446922-60451046 = 29715 -20150218154906604-60451332 = 30004 -20150219121044340-60451481 = 30188 -20150219140019875-60451484 = 30136 -20150219140019876-60451485 = 30137 -20150219140019890-60451486 = 30138 -20150219140019891-60451487 = 30139 -20150219140019892-60451488 = 30140 -20150219140019892-60451489 = 30141 -20150219140019900-60451490 = 30142 -20150219140019901-60451491 = 30143 -20150219164548240-60451552 = 30035 -20150220171839966-60451594 = 30064 -20150224140541688-60451942 = 30246 -20150224161618336-60451945 = 30216 -20150225132544491-60452020 = 30284 diff --git a/deep_sequencing_unit/tracking/dist/tracking.sh b/deep_sequencing_unit/tracking/dist/tracking.sh deleted file mode 100755 index cc3e81f70ee0fe03c0456c858ea954ab6f2a0dc5..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/tracking/dist/tracking.sh +++ /dev/null @@ -1,29 +0,0 @@ -#!/bin/bash -# -# Launch script for CISD openBIS Tracking system for Deep Sequencing Unit. -# Runs on Unix / Linux systems. -# ------------------------------------------------------------------------- - -JAR_FILE=lib/openbis-tracking-qgf-client.jar - -# -# change to installation directory -# -bin=$0 -if [ -L $bin ]; then - bin=`dirname $bin`/`readlink $bin` -fi -WD=`dirname $bin` -cd $WD -SCRIPT=./`basename $0` - -[[ -d log ]] || mkdir log - -if [ "$JAVA_HOME" != "" ]; then - JAVA_BIN="$JAVA_HOME/bin/java" -else - JAVA_BIN="java" -fi - -ALL_JAVA_OPTS="-Djavax.net.ssl.trustStore=etc/openBIS.keystore $JAVA_OPTS" -${JAVA_BIN} ${ALL_JAVA_OPTS} -jar $JAR_FILE "$@" \ No newline at end of file diff --git a/deep_sequencing_unit/tracking/etc/email-template.txt b/deep_sequencing_unit/tracking/etc/email-template.txt deleted file mode 100644 index 38ead1310b95e5bd8ad9b2047d011964453b600d..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/tracking/etc/email-template.txt +++ /dev/null @@ -1,26 +0,0 @@ -Dear Mrs./Mr. -This email has been sent to you automatically by the openBIS system because -you have been registered as a contact person or principal investigator. - -There is progress considering your sequencing order. Below you will find all -the details. - -Alternatively for an easier download of FASTQ files use this little webapp: -https://openbis-dsu.ethz.ch/openbis/webapp/downloader/ - -For batch downloading FASTQ file via SFTP please have a look at the -documentation here: -https://wiki-bsse.ethz.ch/x/MBEkBg#InstallationandAdministratorsGuideoftheopenBISDataStoreServer-ExampleFTPSclientconfiguration - -Some documentation about FASTQ and openBIS is available here: -https://wiki-bsse.ethz.ch/display/DBSSEQGF/Home -http://www.bsse.ethz.ch/qgf/faq - -Kind regards, -Quantitative Genomics Facility Team -http://www.bsse.ethz.ch/qgf/ - -{generated-content} - -------------------------------------------------------------------------------- -http://www.bsse.ethz.ch/qgf/ \ No newline at end of file diff --git a/deep_sequencing_unit/tracking/etc/log.xml b/deep_sequencing_unit/tracking/etc/log.xml deleted file mode 100644 index 5cee0a68436a19a6c4ec4b14b580e6d9f75bf84f..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/tracking/etc/log.xml +++ /dev/null @@ -1,19 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" ?> -<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd"> - -<log4j:configuration xmlns:log4j='http://jakarta.apache.org/log4j/'> - - <appender name="STDOUT" class="org.apache.log4j.ConsoleAppender"> - <layout class="org.apache.log4j.PatternLayout"> - <param name="ConversionPattern" value="%d %-5p [%t] %c - %m%n"/> - </layout> - </appender> - - <appender name="NULL" class="org.apache.log4j.varia.NullAppender" /> - - <root> - <priority value ="info" /> - <appender-ref ref="STDOUT" /> - </root> - -</log4j:configuration> diff --git a/deep_sequencing_unit/tracking/etc/openBIS.keystore b/deep_sequencing_unit/tracking/etc/openBIS.keystore deleted file mode 100644 index 28d6c1945533908c76f28785953cbed4004c4555..0000000000000000000000000000000000000000 Binary files a/deep_sequencing_unit/tracking/etc/openBIS.keystore and /dev/null differ diff --git a/deep_sequencing_unit/tracking/etc/service.properties b/deep_sequencing_unit/tracking/etc/service.properties deleted file mode 100644 index 6a5b0497ed85c397351f7587dbc8b1284537044a..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/tracking/etc/service.properties +++ /dev/null @@ -1,21 +0,0 @@ -openbis-user=tracker -openbis-password=jadfs8r3jahu12 -openbis-server-url = http://openbis-dsu.bsse.ethz.ch:8080/openbis/openbis -permlink-url = https://openbis-dsu.bsse.ethz.ch/openbis - -mail.smtp.host = file://../targets/playground -mail.smtp.user = -mail.smtp.password = - -FMI-affiliation-notification-email-contact = fmi@bsse.ethz.ch - -# all emails will be sent from this address -mail.from = openbis-noreply@bsse.ethz.ch -# all emails will have this address in the reply-to field -notification-email-reply-to = manuel.kohler@bsse.ethz.ch -# subject of all the notification emails -notification-email-subject = BSSE DSU (LOCAL TEST): Status report of your deep sequencing order - -# if the tracking client fails an email will be sent out to these recipients -tracking-admin-email = kohleman@ethz.ch, gpawel@ethz.ch -jython-version=2.7 diff --git a/deep_sequencing_unit/tracking/etc/tracking-local-database b/deep_sequencing_unit/tracking/etc/tracking-local-database deleted file mode 100644 index af910cae04a252efd15b263014782c6389a828dd..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/tracking/etc/tracking-local-database +++ /dev/null @@ -1,2 +0,0 @@ -trackedSamplesToBeProcessed 1 2 3 4 5 -trackedSamplesProcessedSuccessfully 1 2 3 diff --git a/deep_sequencing_unit/tracking/etc/tracking-sample-database b/deep_sequencing_unit/tracking/etc/tracking-sample-database deleted file mode 100644 index dac98d90e944bc053977acfcbba340491d3570e8..0000000000000000000000000000000000000000 --- a/deep_sequencing_unit/tracking/etc/tracking-sample-database +++ /dev/null @@ -1 +0,0 @@ -20090901100144407-102 = 192 \ No newline at end of file diff --git a/gradle/build.gradle b/gradle/build.gradle index 1d1474dfa1804c00ab4bd44b7740c90bc2aae6ea..049eac5fa73551c99e3cd4e82d2dab29d15ef4db 100644 --- a/gradle/build.gradle +++ b/gradle/build.gradle @@ -7,7 +7,6 @@ evaluationDependsOn(':dbmigration') evaluationDependsOn(':openbis') evaluationDependsOn(':datastore_server') evaluationDependsOn(':screening') -evaluationDependsOn(':deep_sequencing_unit') evaluationDependsOn(':openbis_standard_technologies') evaluationDependsOn(':installation') evaluationDependsOn(':ui-test') diff --git a/gradle/settings.gradle b/gradle/settings.gradle index 3635441b12147113c55ca18542a1a4ae24ac8326..d29899caeb4c71b923643d854aab75f12db6efb7 100644 --- a/gradle/settings.gradle +++ b/gradle/settings.gradle @@ -1,5 +1,5 @@ includeFlat 'commonbase', 'common', 'openbis_api', 'openbis-common', 'authentication', 'dbmigration', 'openbis', - 'datastore_server', 'screening', 'deep_sequencing_unit', + 'datastore_server', 'screening', 'openbis_standard_technologies', 'installation', 'image_readers', 'ui-test', 'js-test', 'datamover', 'big_data_link_server', 'openbis_ng_ui', 'microservice_server_template', 'openbis_statistics_server', 'openbis_benchmark' \ No newline at end of file diff --git a/installation/build.gradle b/installation/build.gradle index beb60bdc40fae05c000302768228a7a9271f34ac..4396fa02cc44d06128268bd95636246d2af6964d 100644 --- a/installation/build.gradle +++ b/installation/build.gradle @@ -7,7 +7,6 @@ evaluationDependsOn(':dbmigration') evaluationDependsOn(':openbis') evaluationDependsOn(':datastore_server') evaluationDependsOn(':screening') -evaluationDependsOn(':deep_sequencing_unit') evaluationDependsOn(':openbis_standard_technologies') apply from: '../gradle/javaproject.gradle' diff --git a/installation/settings.gradle b/installation/settings.gradle index 69a2bcdd162a412be70a85467014e645d508281d..e16c48dae4543967355a65a4b9b60a27d7615f8d 100644 --- a/installation/settings.gradle +++ b/installation/settings.gradle @@ -1,4 +1,4 @@ includeFlat 'commonbase', 'common', 'openbis_api', 'openbis-common', 'authentication', 'dbmigration', 'openbis', - 'datastore_server', 'screening', 'deep_sequencing_unit', - 'openbis_standard_technologies', 'big_data_link_server', 'openbis_ng_ui', 'microservice_server_template' + 'datastore_server', 'screening', 'openbis_standard_technologies', 'big_data_link_server', + 'openbis_ng_ui', 'microservice_server_template' diff --git a/js-test/settings.gradle b/js-test/settings.gradle index 4895536be0b007b9c1f2d8923f70d076112d33c2..5da3f86d633195a8fab6ed8fa438e885389f3466 100644 --- a/js-test/settings.gradle +++ b/js-test/settings.gradle @@ -1,3 +1,3 @@ includeFlat 'commonbase', 'common', 'openbis_api', 'openbis-common', 'authentication', 'dbmigration', 'openbis', - 'datastore_server', 'screening', 'deep_sequencing_unit', 'openbis_standard_technologies', + 'datastore_server', 'screening', 'openbis_standard_technologies', 'ui-test','screening' diff --git a/openbis_all/build/build.xml b/openbis_all/build/build.xml index c8cad33497a3b2169375272369e3283ab0679396..ef36ef8af76f44f24f780bb1ee820accd6baa936 100644 --- a/openbis_all/build/build.xml +++ b/openbis_all/build/build.xml @@ -16,10 +16,6 @@ <param name="project" value="datastore_server" /> <param name="pattern" value="*"/> </antcall> - <antcall target="_dist"> - <param name="project" value="deep_sequencing_unit" /> - <param name="pattern" value="*"/> - </antcall> <antcall target="_dist"> <param name="project" value="screening" /> <param name="pattern" value="*"/> @@ -76,9 +72,6 @@ <antcall target="_clean"> <param name="project" value="datastore_server"/> </antcall> - <antcall target="_clean"> - <param name="project" value="deep_sequencing_unit"/> - </antcall> <antcall target="_clean"> <param name="project" value="screening"/> </antcall> diff --git a/openbis_all/source/bash/build/branch.sh b/openbis_all/source/bash/build/branch.sh index 019ae645e4e53ec34727edc3c3af7617d96f065f..faacce162b59e8670e95e22c17701901363751f6 100755 --- a/openbis_all/source/bash/build/branch.sh +++ b/openbis_all/source/bash/build/branch.sh @@ -31,7 +31,6 @@ common \ datamover \ datastore_server \ dbmigration \ -deep_sequencing_unit \ installation \ js-test \ openbis \ diff --git a/openbis_contrib/.classpath b/openbis_contrib/.classpath deleted file mode 100644 index 78c5c4b761a0b6e0b3027cc27e6c20cc886449cc..0000000000000000000000000000000000000000 --- a/openbis_contrib/.classpath +++ /dev/null @@ -1,20 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<classpath> - <classpathentry kind="src" path="source/java"/> - <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/J2SE-1.5"/> - <classpathentry kind="lib" path="/libraries/eodsql/eodsql.jar"/> - <classpathentry kind="lib" path="/libraries/postgresql/postgresql.jar"/> - <classpathentry kind="lib" path="/libraries/testng/testng-jdk15.jar"/> - <classpathentry combineaccessrules="false" kind="src" path="/common"/> - <classpathentry combineaccessrules="false" kind="src" path="/datastore_server"/> - <classpathentry kind="lib" path="/libraries/cisd-base/cisd-base.jar" sourcepath="/libraries/cisd-base/cisd-base-src.zip"/> - <classpathentry kind="lib" path="/libraries/commons-codec/commons-codec.jar" sourcepath="/libraries/commons-codec/src.zip"/> - <classpathentry kind="lib" path="/libraries/commons-httpclient/commons-httpclient.jar" sourcepath="/libraries/commons-httpclient/src.zip"/> - <classpathentry kind="lib" path="/libraries/commons-io/commons-io.jar" sourcepath="/libraries/commons-io/src.zip"/> - <classpathentry kind="lib" path="/libraries/commons-logging/commons-logging.jar" sourcepath="/libraries/commons-logging/src.zip"/> - <classpathentry kind="lib" path="/libraries/jline/jline.jar" sourcepath="/libraries/jline/src.zip"/> - <classpathentry kind="lib" path="/libraries/log4j/log4j.jar" sourcepath="/libraries/log4j/src.zip"/> - <classpathentry kind="lib" path="/libraries/spring/spring.jar" sourcepath="/libraries/spring/src.jar"/> - <classpathentry kind="lib" path="/libraries/spring/third-party/stream-supporting-httpinvoker.jar" sourcepath="/libraries/spring/third-party/stream-supporting-httpinvoker-src.zip"/> - <classpathentry kind="output" path="targets/classes"/> -</classpath> diff --git a/openbis_contrib/.project b/openbis_contrib/.project deleted file mode 100644 index 19c52fa17a7fe67b6767818fbe35a162ed99985d..0000000000000000000000000000000000000000 --- a/openbis_contrib/.project +++ /dev/null @@ -1,17 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<projectDescription> - <name>openbis_contrib</name> - <comment></comment> - <projects> - </projects> - <buildSpec> - <buildCommand> - <name>org.eclipse.jdt.core.javabuilder</name> - <arguments> - </arguments> - </buildCommand> - </buildSpec> - <natures> - <nature>org.eclipse.jdt.core.javanature</nature> - </natures> -</projectDescription> diff --git a/openbis_contrib/.settings/org.eclipse.jdt.core.prefs b/openbis_contrib/.settings/org.eclipse.jdt.core.prefs deleted file mode 100644 index db8ce66004c8e4ed14d0a409c7d0ec0de4f7ac95..0000000000000000000000000000000000000000 --- a/openbis_contrib/.settings/org.eclipse.jdt.core.prefs +++ /dev/null @@ -1,12 +0,0 @@ -#Tue Jul 27 16:10:00 CEST 2010 -eclipse.preferences.version=1 -org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled -org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.5 -org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve -org.eclipse.jdt.core.compiler.compliance=1.5 -org.eclipse.jdt.core.compiler.debug.lineNumber=generate -org.eclipse.jdt.core.compiler.debug.localVariable=generate -org.eclipse.jdt.core.compiler.debug.sourceFile=generate -org.eclipse.jdt.core.compiler.problem.assertIdentifier=error -org.eclipse.jdt.core.compiler.problem.enumIdentifier=error -org.eclipse.jdt.core.compiler.source=1.5 diff --git a/openbis_contrib/build/build.xml b/openbis_contrib/build/build.xml deleted file mode 100644 index f582ea8cb19ba1c7875de4a9a7127b3f9065be50..0000000000000000000000000000000000000000 --- a/openbis_contrib/build/build.xml +++ /dev/null @@ -1,72 +0,0 @@ -<project name="GetSampleProperties" default="GetSampleProperties-jar" basedir=".."> - <import file="../../datastore_server/build/build.xml" /> - <project-classpath name="ecp" classes="${classes}" /> - - <property name="original.dist" value="dist" /> - <property name="mainfolder" value="GetSampleProperties" /> - - <property name="dist.properties" value="${dist}/properties" /> - <property name="dist.properties.lib" value="${dist.properties}/lib" /> - <property name="properties-jar.file" value="${dist.properties.lib}/openbis-properties-client.jar" /> - <property name="properties.original.dist" value="properties/dist" /> - - <target name="compile" depends="build-common.compile, clean" /> - - <target name="run-tests"> - <antcall target="build-common.run-tests"> - <param name="test.suite" value="tests.xml" /> - </antcall> - </target> - - <target name="GetSampleProperties-jar" depends="compile"> - <mkdir dir="${dist.properties.lib}" /> - <recursive-jar destfile="${properties-jar.file}"> - <fileset dir="${classes}"> - <include name="ch/ethz/bsse/cisd/dsu/properties/*.class" /> - <include name="${build.info.filename}" /> - </fileset> - <manifest> - <attribute name="Main-Class" value="ch.ethz.bsse.cisd.dsu.properties.GetSampleProperties" /> - <attribute name="Class-Path" value="cisd-base.jar log4j.jar activation.jar mail.jar gwt-isserializable.jar - commons-io.jar commons-lang.jar commons-logging.jar commons-httpclient.jar commons-codec.jar - spring.jar stream-supporting-httpinvoker.jar" /> - </manifest> - </recursive-jar> - </target> - - <target name="properties-dist" depends="GetSampleProperties-jar"> - <copy file="${properties-jar.file}" todir="${dist.properties.lib}" /> - <copy file="${lib}/cisd-base/cisd-base.jar" todir="${dist.properties.lib}" /> - <copy file="${lib}/activation/activation.jar" todir="${dist.properties.lib}" /> - <copy file="${lib}/mail/mail.jar" todir="${dist.properties.lib}" /> - <copy file="${lib}/log4j/log4j.jar" todir="${dist.properties.lib}" /> - <copy file="${lib}/gwt2.4/gwt-isserializable.jar" todir="${dist.properties.lib}" /> - <copy file="${lib}/commons-logging/commons-logging.jar" todir="${dist.properties.lib}" /> - <copy file="${lib}/commons-io/commons-io.jar" todir="${dist.properties.lib}" /> - <copy file="${lib}/commons-lang/commons-lang.jar" todir="${dist.properties.lib}" /> - <copy file="${lib}/commons-httpclient/commons-httpclient.jar" todir="${dist.properties.lib}" /> - <copy file="${lib}/commons-codec/commons-codec.jar" todir="${dist.properties.lib}" /> - <copy file="${lib}/spring/spring.jar" todir="${dist.properties.lib}" /> - <copy file="${lib}/spring/third-party/stream-supporting-httpinvoker.jar" todir="${dist.properties.lib}" /> - - <property name="properties-dist.file" value="openbis-properties-client.zip" /> - <mkdir dir="${dist.properties}" /> - <zip basedir="${dist.properties}" destfile="${dist.properties}/${properties-dist.file}" excludes="*.zip *.jar"> - <zipfileset dir="${properties.original.dist}" excludes="**/*.sh"/> - <zipfileset file="${properties.original.dist}/properties.sh" filemode="755" /> - </zip> - - </target> - - <!-- - // Task for creating distributions - --> - <target name="dist" depends="datastore_server.make-dist, properties-dist" /> - - <!-- - // Task for continuous integration server. - --> - <target name="ci" depends="build-common.ci, dist, check-dependencies" /> - - -</project> \ No newline at end of file diff --git a/openbis_contrib/dist/.gitignore b/openbis_contrib/dist/.gitignore deleted file mode 100644 index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..0000000000000000000000000000000000000000 diff --git a/openbis_contrib/etc/log.xml b/openbis_contrib/etc/log.xml deleted file mode 100644 index 5cee0a68436a19a6c4ec4b14b580e6d9f75bf84f..0000000000000000000000000000000000000000 --- a/openbis_contrib/etc/log.xml +++ /dev/null @@ -1,19 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" ?> -<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd"> - -<log4j:configuration xmlns:log4j='http://jakarta.apache.org/log4j/'> - - <appender name="STDOUT" class="org.apache.log4j.ConsoleAppender"> - <layout class="org.apache.log4j.PatternLayout"> - <param name="ConversionPattern" value="%d %-5p [%t] %c - %m%n"/> - </layout> - </appender> - - <appender name="NULL" class="org.apache.log4j.varia.NullAppender" /> - - <root> - <priority value ="info" /> - <appender-ref ref="STDOUT" /> - </root> - -</log4j:configuration> diff --git a/openbis_contrib/etc/service.properties b/openbis_contrib/etc/service.properties deleted file mode 100644 index 24f46a4097b3cd9d14ed2602cd3be2cb77a0991d..0000000000000000000000000000000000000000 --- a/openbis_contrib/etc/service.properties +++ /dev/null @@ -1,22 +0,0 @@ -# The username to use when contacting the openBIS server -username = etlserver_bsse -# The password to use when contacting the openBIS server -password = twcTEe9j -# default flow cell space: -default_flow_cell_space = CISD:/BSSE_FLOWCELLS/ - -eland_config_file = config.txt - -bowtie_config_file = bowtie.txt - -bcl2fastq_config_file = SampleSheet.csv - -bcl2fastq_separator = , - -phix_name = phiX - -operator = ETHZ_BSSE_DSU - -mail = manuel.kohler@bsse.ethz.ch - -header = FCID,Lane,SampleID,SampleRef,Index,Description,Control,Recipe,Operator,SampleProject diff --git a/openbis_contrib/properties/dist/properties.sh b/openbis_contrib/properties/dist/properties.sh deleted file mode 100644 index 00b56389c8b58dfec91cbaac749e4df7813a4e15..0000000000000000000000000000000000000000 --- a/openbis_contrib/properties/dist/properties.sh +++ /dev/null @@ -1,27 +0,0 @@ -#!/bin/bash -# -# Runs on Unix / Linux systems. -# ------------------------------------------------------------------------- - -JAR_FILE=lib/openbis-properties-client.jar - -# -# change to installation directory -# -bin=$0 -if [ -L $bin ]; then - bin=`dirname $bin`/`readlink $bin` -fi -WD=`dirname $bin` -cd $WD -SCRIPT=./`basename $0` - -if [ "$JAVA_HOME" != "" ]; then - JAVA_BIN="$JAVA_HOME/bin/java" -else - JAVA_BIN="java" -fi - -ALL_JAVA_OPTS="-Djavax.net.ssl.trustStore=etc/openBIS.keystore $JAVA_OPTS" -echo "Starting..." -${JAVA_BIN} ${ALL_JAVA_OPTS} -jar $JAR_FILE "$@" diff --git a/openbis_contrib/source/java/ch/ethz/bsse/cisd/DbDataTypeComparison/ControlledVocabulariesDTO.java b/openbis_contrib/source/java/ch/ethz/bsse/cisd/DbDataTypeComparison/ControlledVocabulariesDTO.java deleted file mode 100644 index 88adfcc8175b095bb7a7777c7f9648818169a689..0000000000000000000000000000000000000000 --- a/openbis_contrib/source/java/ch/ethz/bsse/cisd/DbDataTypeComparison/ControlledVocabulariesDTO.java +++ /dev/null @@ -1,36 +0,0 @@ -package ch.ethz.bsse.cisd.DbDataTypeComparison; - -import net.lemnik.eodsql.ResultColumn; -import ch.systemsx.cisd.common.utilities.AbstractHashable; - -/** - * @author Manuel Kohler - */ - -class ControlledVocabulariesDTO extends AbstractHashable -{ - @ResultColumn("controlledVocabularies") - private String controlledVocabularies; - - ControlledVocabulariesDTO() - { - // All Data-Object classes must have a default constructor. - } - - public ControlledVocabulariesDTO(String controlledVocabularies) - { - super(); - this.controlledVocabularies = controlledVocabularies; - } - - public String getControlledVocabularies() - { - return controlledVocabularies; - } - - public void setControlledVocabularies(String controlledVocabularies) - { - this.controlledVocabularies = controlledVocabularies; - } - -} diff --git a/openbis_contrib/source/java/ch/ethz/bsse/cisd/DbDataTypeComparison/DataSetPropertyAssignmentsDTO.java b/openbis_contrib/source/java/ch/ethz/bsse/cisd/DbDataTypeComparison/DataSetPropertyAssignmentsDTO.java deleted file mode 100644 index 03881291f6ef3b1b4e2e2638797d5e08dd285ed6..0000000000000000000000000000000000000000 --- a/openbis_contrib/source/java/ch/ethz/bsse/cisd/DbDataTypeComparison/DataSetPropertyAssignmentsDTO.java +++ /dev/null @@ -1,50 +0,0 @@ -package ch.ethz.bsse.cisd.DbDataTypeComparison; - -import net.lemnik.eodsql.ResultColumn; -import ch.systemsx.cisd.common.utilities.AbstractHashable; - -/** - * @author Manuel Kohler - */ - -class DataSetPropertyAssignmentsDTO extends AbstractHashable -{ - @ResultColumn("dataSet") - private String dataSet; - - @ResultColumn("propertyType") - private String propertyType; - - DataSetPropertyAssignmentsDTO() - { - // All Data-Object classes must have a default constructor. - } - - public DataSetPropertyAssignmentsDTO(String dataSet, String propertyType) - { - super(); - this.dataSet = dataSet; - this.propertyType = propertyType; - } - - public String getDataSet() - { - return dataSet; - } - - public void setDataSet(String dataSet) - { - this.dataSet = dataSet; - } - - public String getPropertyType() - { - return propertyType; - } - - public void setPropertyType(String propertyType) - { - this.propertyType = propertyType; - } - -} diff --git a/openbis_contrib/source/java/ch/ethz/bsse/cisd/DbDataTypeComparison/DbDataTypeComparison.java b/openbis_contrib/source/java/ch/ethz/bsse/cisd/DbDataTypeComparison/DbDataTypeComparison.java deleted file mode 100644 index 73763f4ce138363f5223c1c0f0648596ec038d42..0000000000000000000000000000000000000000 --- a/openbis_contrib/source/java/ch/ethz/bsse/cisd/DbDataTypeComparison/DbDataTypeComparison.java +++ /dev/null @@ -1,172 +0,0 @@ -/* - * Copyright 2009 ETH Zuerich, CISD - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package ch.ethz.bsse.cisd.DbDataTypeComparison; - -/** - * @author Manuel Kohler - */ - -import java.sql.Connection; -import java.sql.Driver; -import java.sql.DriverManager; -import java.sql.SQLException; -import java.util.Arrays; -import java.util.HashSet; -import java.util.List; -import java.util.Properties; -import java.util.Set; - -import net.lemnik.eodsql.QueryTool; - -public class DbDataTypeComparison -{ - private static final String DRY_RUN_FLAG = "--dry-run"; - - private static Connection connect(String jdbcURL) throws ClassNotFoundException, SQLException - { - Class.forName("org.postgresql.Driver"); - final Driver driver = DriverManager.getDriver(jdbcURL); - final Properties props = new Properties(); - props.put("user", System.getProperty("user.name")); - props.put("password", ""); - return driver.connect(jdbcURL, props); - } - - public static void main(String[] args) throws Exception - { - if (args.length < 3) - { - String programName = getProgramName(); - System.err.println("Usage: java -jar " + programName - + " <source_db_jdbc_string> <target_db_jdbc_string> <user_ID> [" + DRY_RUN_FLAG - + "]"); - System.exit(1); - } - - String source_db_jdbc_string = args[0]; - String target_db_jdbc_string = args[1]; - - System.out.println("Used Source: " + source_db_jdbc_string); - System.out.println("Used Target: " + target_db_jdbc_string); - - final Connection sourceconn = connect(source_db_jdbc_string); - final Connection targetconn = connect(target_db_jdbc_string); - - DbDataTypeComparisonDAO dbSourceDao = - QueryTool.getQuery(sourceconn, DbDataTypeComparisonDAO.class); - DbDataTypeComparisonDAO dbTargetDao = - QueryTool.getQuery(targetconn, DbDataTypeComparisonDAO.class); - - Set<String> dataSetTypeCodes = - queryStringLists(Arrays.asList(dbSourceDao.listDataSetTypeCodes()), - Arrays.asList(dbTargetDao.listDataSetTypeCodes())); - - Set<String> experimentTypeCodes = - queryStringLists(Arrays.asList(dbSourceDao.listExperimentTypeCodes()), - Arrays.asList(dbTargetDao.listExperimentTypeCodes())); - - Set<String> materialTypeCodes = - queryStringLists(Arrays.asList(dbSourceDao.listMaterialTypeCodes()), - Arrays.asList(dbTargetDao.listMaterialTypeCodes())); - - Set<String> propertyTypeCodes = - queryStringLists(Arrays.asList(dbSourceDao.listPropertyTypeCodes()), - Arrays.asList(dbTargetDao.listPropertyTypeCodes())); - - Set<String> sampleTypeCodes = - queryStringLists(Arrays.asList(dbSourceDao.listSampleTypeCodes()), - Arrays.asList(dbTargetDao.listSampleTypeCodes())); - - Set<PropertyTypeAndDataTypeDTO> PropertyTypeAndDataType = - queryStringLists(dbSourceDao.getPropertyTypeAndDataType(), - dbTargetDao.getPropertyTypeAndDataType()); - - // Assignments - Set<SamplePropertyAssignmentsDTO> SamplePropertyAssignments = - queryStringLists(dbSourceDao.getSamplePropertyAssignments(), - dbTargetDao.getSamplePropertyAssignments()); - - Set<DataSetPropertyAssignmentsDTO> DataSetPropertyAssignments = - queryStringLists(dbSourceDao.getDataSetPropertyAssignments(), - dbTargetDao.getDataSetPropertyAssignments()); - - Set<ExperimentPropertyAssignmentsDTO> ExperimentPropertyAssignments = - queryStringLists(dbSourceDao.getExperimentPropertyAssignments(), - dbTargetDao.getExperimentPropertyAssignments()); - - Set<MaterialPropertyAssignmentDTO> MaterialPropertyAssignment = - queryStringLists(dbSourceDao.getMaterialPropertyAssignment(), - dbTargetDao.getMaterialPropertyAssignment()); - - Set<ControlledVocabulariesDTO> ControlledVocabularies = - queryStringLists(dbSourceDao.getControlledVocabularies(), - dbTargetDao.getControlledVocabularies()); - - Set<TermsOfControlledVocabulariesDTO> TermsOfControlledVocabularies = - queryStringLists(dbSourceDao.getTermsOfControlledVocabularies(), - dbTargetDao.getTermsOfControlledVocabularies()); - - System.out.println("Differences:"); - System.out.println("dataSetTypeCodes: " + dataSetTypeCodes); - System.out.println("experimentTypeCodes: " + experimentTypeCodes); - System.out.println("materialTypeCodes: " + materialTypeCodes); - System.out.println("propertyTypeCodes: " + propertyTypeCodes); - System.out.println("sampleTypeCodes: " + sampleTypeCodes); - - System.out.println("===================="); - - System.out.println("PropertyTypeAndDataType: " + PropertyTypeAndDataType); - System.out.println("SamplePropertyAssignments: " + SamplePropertyAssignments); - System.out.println("DataSetPropertyAssignments: " + DataSetPropertyAssignments); - System.out.println("ExperimentPropertyAssignments: " + ExperimentPropertyAssignments); - System.out.println("MaterialPropertyAssignment: " + MaterialPropertyAssignment); - System.out.println("ControlledVocabularies: " + ControlledVocabularies); - System.out.println("TermsOfControlledVocabularies: " + TermsOfControlledVocabularies); - - sourceconn.close(); - targetconn.close(); - } - - private static <T> Set<T> queryStringLists(List<T> sourceList, List<T> targetList) - { - Set<T> intersect = new HashSet<T>(targetList); - intersect.retainAll(sourceList); - System.out.println("Number of common objects: " + intersect.size()); - // System.out.println(intersect); - - Set<T> diff = new HashSet<T>(targetList); - diff.removeAll(sourceList); - System.out.println("Number of differential objects: " + diff.size()); - // System.out.println(diff); - - return diff; - } - - private static String getProgramName() - { - StackTraceElement[] stack = Thread.currentThread().getStackTrace(); - StackTraceElement main = stack[stack.length - 1]; - String mainClass = main.getClassName(); - - // workaround, because the split does not work with a '.' - mainClass = mainClass.replace(".", " "); - String[] tokens = mainClass.split(" "); - - String jarName = tokens[tokens.length - 1] + ".jar"; - return jarName; - } -} \ No newline at end of file diff --git a/openbis_contrib/source/java/ch/ethz/bsse/cisd/DbDataTypeComparison/DbDataTypeComparisonQueryDAO.java b/openbis_contrib/source/java/ch/ethz/bsse/cisd/DbDataTypeComparison/DbDataTypeComparisonQueryDAO.java deleted file mode 100644 index 0bc30a8a1e99089db03339e4f8009acf1067a818..0000000000000000000000000000000000000000 --- a/openbis_contrib/source/java/ch/ethz/bsse/cisd/DbDataTypeComparison/DbDataTypeComparisonQueryDAO.java +++ /dev/null @@ -1,71 +0,0 @@ -package ch.ethz.bsse.cisd.DbDataTypeComparison; - -/** - * @author Manuel Kohler - */ - -import java.util.List; - -import net.lemnik.eodsql.Select; -import net.lemnik.eodsql.TransactionQuery; - -interface DbDataTypeComparisonDAO extends TransactionQuery -{ - public static final int FETCH_SIZE = 1000; - - // types: - @Select("select code as sample_types from sample_types order by code") - public String[] listSampleTypeCodes(); - - @Select("select code as data_set_types from data_set_types order by code") - public String[] listDataSetTypeCodes(); - - @Select("select code as experiment_types from experiment_types order by code") - public String[] listExperimentTypeCodes(); - - @Select("select code as material_types from material_types order by code") - public String[] listMaterialTypeCodes(); - - @Select("select code as property_types from property_types order by code;") - public String[] listPropertyTypeCodes(); - - // which data_type for a property_type? - @Select("select pt.code as ptCode, dt.code as dtCode from property_types pt join data_types dt on pt.daty_id=dt.id order by pt.code;") - public List<PropertyTypeAndDataTypeDTO> getPropertyTypeAndDataType(); - - // property assignments: - // samples - @Select("select st.code as sampleType, pt.code as propertyType from property_types pt" - + " join sample_type_property_types stpt on pt.id = stpt.prty_id" - + " join sample_types st on stpt.saty_id=st.id order by st.code;") - public List<SamplePropertyAssignmentsDTO> getSamplePropertyAssignments(); - - // data sets - @Select("select dst.code as dataSet, pt.code as propertyType from property_types pt" - + " join data_set_type_property_types dstpt on pt.id = dstpt.prty_id" - + " join data_set_types dst on dstpt.dsty_id=dst.id order by dst.code;") - public List<DataSetPropertyAssignmentsDTO> getDataSetPropertyAssignments(); - - // experiments - @Select("select ep.code as experimentType, pt.code as propertyType from property_types pt" - + " join experiment_type_property_types etpt on pt.id=etpt.exty_id" - + " join experiment_types ep on etpt.exty_id=ep.id order by ep.code;") - public List<ExperimentPropertyAssignmentsDTO> getExperimentPropertyAssignments(); - - // materials - @Select("select mt.code as materialType, pt.code as propertyType from property_types pt" - + " join material_type_property_types mtpt on pt.id=mtpt.prty_id" - + " join material_types mt on mt.id = mtpt.maty_id order by mt.code;") - public List<MaterialPropertyAssignmentDTO> getMaterialPropertyAssignment(); - - // controlled vocabularies - @Select("select code as controlledVocabularies from controlled_vocabularies;") - public List<ControlledVocabulariesDTO> getControlledVocabularies(); - - // controlled vocabularies with terms - @Select("select cv.code as controlledVocabularies, cvt.code as controlledVocabulariesTerms" - + " from controlled_vocabularies cv join controlled_vocabulary_terms cvt" - + " on cv.id=cvt.covo_id order by cv.code;") - public List<TermsOfControlledVocabulariesDTO> getTermsOfControlledVocabularies(); - -} \ No newline at end of file diff --git a/openbis_contrib/source/java/ch/ethz/bsse/cisd/DbDataTypeComparison/ExperimentPropertyAssignmentsDTO.java b/openbis_contrib/source/java/ch/ethz/bsse/cisd/DbDataTypeComparison/ExperimentPropertyAssignmentsDTO.java deleted file mode 100644 index 6ffd352fcadba26eaa81e3cf66ce38fe1672ca3a..0000000000000000000000000000000000000000 --- a/openbis_contrib/source/java/ch/ethz/bsse/cisd/DbDataTypeComparison/ExperimentPropertyAssignmentsDTO.java +++ /dev/null @@ -1,50 +0,0 @@ -package ch.ethz.bsse.cisd.DbDataTypeComparison; - -import net.lemnik.eodsql.ResultColumn; -import ch.systemsx.cisd.common.utilities.AbstractHashable; - -/** - * @author Manuel Kohler - */ - -class ExperimentPropertyAssignmentsDTO extends AbstractHashable -{ - @ResultColumn("experimentType") - private String experimentType; - - @ResultColumn("propertyType") - private String propertyType; - - ExperimentPropertyAssignmentsDTO() - { - // All Data-Object classes must have a default constructor. - } - - public ExperimentPropertyAssignmentsDTO(String experimentType, String propertyType) - { - super(); - this.experimentType = experimentType; - this.propertyType = propertyType; - } - - public String getExperimentType() - { - return experimentType; - } - - public void setExperimentType(String experimentType) - { - this.experimentType = experimentType; - } - - public String getPropertyType() - { - return propertyType; - } - - public void setPropertyType(String propertyType) - { - this.propertyType = propertyType; - } - -} diff --git a/openbis_contrib/source/java/ch/ethz/bsse/cisd/DbDataTypeComparison/MaterialPropertyAssignmentDTO.java b/openbis_contrib/source/java/ch/ethz/bsse/cisd/DbDataTypeComparison/MaterialPropertyAssignmentDTO.java deleted file mode 100644 index d1033a0718f455d106112c3ea881357ce102f1f7..0000000000000000000000000000000000000000 --- a/openbis_contrib/source/java/ch/ethz/bsse/cisd/DbDataTypeComparison/MaterialPropertyAssignmentDTO.java +++ /dev/null @@ -1,50 +0,0 @@ -package ch.ethz.bsse.cisd.DbDataTypeComparison; - -import net.lemnik.eodsql.ResultColumn; -import ch.systemsx.cisd.common.utilities.AbstractHashable; - -/** - * @author Manuel Kohler - */ - -class MaterialPropertyAssignmentDTO extends AbstractHashable -{ - - @ResultColumn("materialType") - private String materialType; - - @ResultColumn("propertyType") - private String propertyType; - - MaterialPropertyAssignmentDTO() - { - // All Data-Object classes must have a default constructor. - } - - public MaterialPropertyAssignmentDTO(String materialType, String propertyType) - { - super(); - this.materialType = materialType; - this.propertyType = propertyType; - } - - public String getMaterialType() - { - return materialType; - } - - public void setMaterialType(String materialType) - { - this.materialType = materialType; - } - - public String getPropertyType() - { - return propertyType; - } - - public void setPropertyType(String propertyType) - { - this.propertyType = propertyType; - } -} diff --git a/openbis_contrib/source/java/ch/ethz/bsse/cisd/DbDataTypeComparison/PropertyTypeAndDataTypeDTO.java b/openbis_contrib/source/java/ch/ethz/bsse/cisd/DbDataTypeComparison/PropertyTypeAndDataTypeDTO.java deleted file mode 100644 index 448d93eead3c5f68c5b4d4fa7aac11da3774b0e1..0000000000000000000000000000000000000000 --- a/openbis_contrib/source/java/ch/ethz/bsse/cisd/DbDataTypeComparison/PropertyTypeAndDataTypeDTO.java +++ /dev/null @@ -1,68 +0,0 @@ -package ch.ethz.bsse.cisd.DbDataTypeComparison; - -import net.lemnik.eodsql.AutoGeneratedKeys; -import net.lemnik.eodsql.ResultColumn; -import ch.systemsx.cisd.common.utilities.AbstractHashable; - -/** - * @author Manuel Kohler - */ - -class PropertyTypeAndDataTypeDTO extends AbstractHashable -{ - @AutoGeneratedKeys - private long id; - - @ResultColumn("ptCode") - private String ptCode; - - @ResultColumn("dtCode") - private String dtCode; - - PropertyTypeAndDataTypeDTO() - { - // All Data-Object classes must have a default constructor. - } - - public int compareTo(PropertyTypeAndDataTypeDTO P) - { - return ptCode.compareTo(P.getPtCode()); - } - - public PropertyTypeAndDataTypeDTO(String ptCode, String dtCode) - { - this.ptCode = ptCode; - this.dtCode = dtCode; - } - - public long getId() - { - return id; - } - - public void setId(long id) - { - this.id = id; - } - - public String getPtCode() - { - return ptCode; - } - - public void setPtCode(String ptCode) - { - this.ptCode = ptCode; - } - - public String getDtCode() - { - return dtCode; - } - - public void setDtCode(String dtCode) - { - this.dtCode = dtCode; - } - -} \ No newline at end of file diff --git a/openbis_contrib/source/java/ch/ethz/bsse/cisd/DbDataTypeComparison/SamplePropertyAssignmentsDTO.java b/openbis_contrib/source/java/ch/ethz/bsse/cisd/DbDataTypeComparison/SamplePropertyAssignmentsDTO.java deleted file mode 100644 index b502f213178985a49c4472635e68937a40bc7599..0000000000000000000000000000000000000000 --- a/openbis_contrib/source/java/ch/ethz/bsse/cisd/DbDataTypeComparison/SamplePropertyAssignmentsDTO.java +++ /dev/null @@ -1,49 +0,0 @@ -package ch.ethz.bsse.cisd.DbDataTypeComparison; - -import net.lemnik.eodsql.ResultColumn; -import ch.systemsx.cisd.common.utilities.AbstractHashable; - -/** - * @author Manuel Kohler - */ -class SamplePropertyAssignmentsDTO extends AbstractHashable -{ - @ResultColumn("sampleType") - private String sampleType; - - @ResultColumn("propertyType") - private String propertyType; - - SamplePropertyAssignmentsDTO() - { - // All Data-Object classes must have a default constructor. - } - - public SamplePropertyAssignmentsDTO(String sampleType, String propertyType) - { - super(); - this.sampleType = sampleType; - this.propertyType = propertyType; - } - - public String getSampleType() - { - return sampleType; - } - - public void setSampleType(String sampleType) - { - this.sampleType = sampleType; - } - - public String getPropertyType() - { - return propertyType; - } - - public void setPropertyType(String propertyType) - { - this.propertyType = propertyType; - } - -} diff --git a/openbis_contrib/source/java/ch/ethz/bsse/cisd/DbDataTypeComparison/TermsOfControlledVocabulariesDTO.java b/openbis_contrib/source/java/ch/ethz/bsse/cisd/DbDataTypeComparison/TermsOfControlledVocabulariesDTO.java deleted file mode 100644 index 9d0231e3ad18ab1e59ec2797c7c3d8d816f60f37..0000000000000000000000000000000000000000 --- a/openbis_contrib/source/java/ch/ethz/bsse/cisd/DbDataTypeComparison/TermsOfControlledVocabulariesDTO.java +++ /dev/null @@ -1,50 +0,0 @@ -package ch.ethz.bsse.cisd.DbDataTypeComparison; - -import net.lemnik.eodsql.ResultColumn; -import ch.systemsx.cisd.common.utilities.AbstractHashable; - -/** - * @author Manuel Kohler - */ -class TermsOfControlledVocabulariesDTO extends AbstractHashable -{ - - @ResultColumn("controlledVocabularies") - private String controlledVocabularies; - - @ResultColumn("controlledVocabulariesTerms") - private String controlledVocabulariesTerms; - - TermsOfControlledVocabulariesDTO() - { - // All Data-Object classes must have a default constructor. - } - - public TermsOfControlledVocabulariesDTO(String controlledVocabularies, - String controlledVocabulariesTerms) - { - super(); - this.controlledVocabularies = controlledVocabularies; - this.controlledVocabulariesTerms = controlledVocabulariesTerms; - } - - public String getControlledVocabularies() - { - return controlledVocabularies; - } - - public void setControlledVocabularies(String controlledVocabularies) - { - this.controlledVocabularies = controlledVocabularies; - } - - public String getControlledVocabulariesTerms() - { - return controlledVocabulariesTerms; - } - - public void setControlledVocabulariesTerms(String controlledVocabulariesTerms) - { - this.controlledVocabulariesTerms = controlledVocabulariesTerms; - } -} diff --git a/openbis_contrib/source/java/ch/ethz/bsse/cisd/dsu/properties/GenomeMap.java b/openbis_contrib/source/java/ch/ethz/bsse/cisd/dsu/properties/GenomeMap.java deleted file mode 100644 index 0ee7464c4865cc8afd3dd34fd319f66e3319db6c..0000000000000000000000000000000000000000 --- a/openbis_contrib/source/java/ch/ethz/bsse/cisd/dsu/properties/GenomeMap.java +++ /dev/null @@ -1,84 +0,0 @@ -package ch.ethz.bsse.cisd.dsu.properties; - -import java.util.HashMap; - -/* - * Copyright 2010 ETH Zuerich, CISD - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/** - * @author Manuel Kohler - */ - -public class GenomeMap -{ - - private static String PATH_TO_GENOMES = "/array0/Genomes/"; - - private static HashMap<String, String> genomePaths = new HashMap<String, String>(); - static - { - genomePaths.put("10847", PATH_TO_GENOMES + "PhiX"); - genomePaths.put("10090", PATH_TO_GENOMES + "MusMus/Originals"); - genomePaths.put("9606", PATH_TO_GENOMES + "HomSap/Release36.50"); - genomePaths.put("7227", PATH_TO_GENOMES + "DrosMel/Release5"); - genomePaths.put("6239", PATH_TO_GENOMES + "Celegans/Release112708"); - genomePaths.put("562", PATH_TO_GENOMES + "EColi"); - genomePaths.put("10116", PATH_TO_GENOMES + ""); - } - - public static String getGenomePath(String genome) - { - return genomePaths.get(genome); - } - - private static HashMap<String, String> endType = new HashMap<String, String>(); - static - { - endType.put("SINGLE_READ", "eland_extended"); - endType.put("PAIRED_END", "eland_pair"); - } - - public static String getEndType(String openbisEndType) - { - return endType.get(openbisEndType); - } - - private static HashMap<String, String> bowtieIndex = new HashMap<String, String>(); - static - { - bowtieIndex.put("10847", "phiX"); - bowtieIndex.put("10090", "ncbi37_mm9"); - bowtieIndex.put("9606", "h_sapiens_37_asm"); - bowtieIndex.put("7227", "d_melanogaster_fb5_22"); - } - - public static String getBowtieIndex(String genome) - { - return bowtieIndex.get(genome); - } - - private static HashMap<Integer, String> numberOfCycles = new HashMap<Integer, String>(); - static - { - numberOfCycles.put(58, "51+7"); - } - - public static String getNumberOfCycles(int i) - { - return numberOfCycles.get(i); - } - -} diff --git a/openbis_contrib/source/java/ch/ethz/bsse/cisd/dsu/properties/GetSampleProperties.java b/openbis_contrib/source/java/ch/ethz/bsse/cisd/dsu/properties/GetSampleProperties.java deleted file mode 100644 index 37fe577773a68550a3b7ce257b35bff0c34b2f90..0000000000000000000000000000000000000000 --- a/openbis_contrib/source/java/ch/ethz/bsse/cisd/dsu/properties/GetSampleProperties.java +++ /dev/null @@ -1,454 +0,0 @@ -package ch.ethz.bsse.cisd.dsu.properties; - -/* - - * Copyright 2010 ETH Zuerich, CISD - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import java.io.FileWriter; -import java.io.IOException; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Map.Entry; -import java.util.Properties; -import java.util.TreeMap; - -import org.apache.log4j.Logger; - -import ch.systemsx.cisd.common.logging.LogCategory; -import ch.systemsx.cisd.common.logging.LogFactory; -import ch.systemsx.cisd.common.spring.HttpInvokerUtils; -import ch.systemsx.cisd.common.utilities.PropertyUtils; -import ch.systemsx.cisd.openbis.generic.shared.IETLLIMSService; -import ch.systemsx.cisd.openbis.generic.shared.basic.TechId; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.IEntityProperty; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ListSampleCriteria; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Sample; -import ch.systemsx.cisd.openbis.generic.shared.dto.identifier.SampleIdentifierFactory; - -/** - * @author Franz-Josef Elmer - * @author Manuel Kohler - */ -public class GetSampleProperties -{ - private static String INDEX_SEPARATOR = "-"; - - private static final String SERVICE_PROPERTIES = "etc/service.properties"; - - private static final String ELAND_CONFIG_FILE = "eland_config_file"; - - private static final String BOWTIE_CONFIG_FILE = "bowtie_config_file"; - - private static final String BCL2FASTQ_CONFIG_FILE = "bcl2fastq_config_file"; - - private static final String DEFAULT_FLOW_CELL_SPACE = "default_flow_cell_space"; - - private static final String USERNAME = "username"; - - private static final String PASSWORD = "password"; - - private static final String BCL2FASTQ_SEPARATOR = "bcl2fastq_separator"; - - private static final String PHIX_NAME = "phix_name"; - - private static final String OPERATOR = "operator"; - - private static final String MAIL = "mail"; - - private static final String HEADER = "header"; - - // Flow Cell properties read out - private static final String END_TYPE = "END_TYPE"; - - private static final String CYCLES = "CYCLES_REQUESTED_BY_CUSTOMER"; - - // Biological Sample properties read out ? - private static final String ORGANISM_PROPERTY = "NCBI_ORGANISM_TAXONOMY"; - - private static final String BARCODE_PROPERTY = "BARCODE"; - - private static final String INDEX2 = "INDEX2"; - - private static final String EXTERNAL_SAMPLE_NAME = "EXTERNAL_SAMPLE_NAME"; - - private enum sampleProperties - { - ORGANISM_PROPERTY1, BARCODE_PROPERTY1, BARCODE_PROPERTY2, ISPHIX, EXTERNAL_SAMPLE_NAME1, - CYCLES1 - } - - protected static final Logger operationLog = LogFactory.getLogger(LogCategory.OPERATION, - GetSampleProperties.class); - - public static void main(String[] args) throws IOException - { - Properties prop = PropertyUtils.loadProperties(SERVICE_PROPERTIES); - - // get all values from service.properties - FileWriter elandWriter = new FileWriter(prop.getProperty(ELAND_CONFIG_FILE)); - FileWriter bowtieWriter = new FileWriter(prop.getProperty(BOWTIE_CONFIG_FILE)); - FileWriter bcl2fastqWriter = new FileWriter(prop.getProperty(BCL2FASTQ_CONFIG_FILE)); - String user = prop.getProperty(USERNAME); - String password = prop.getProperty(PASSWORD); - String default_flow_cell_space = prop.getProperty(DEFAULT_FLOW_CELL_SPACE); - String bcl2fastqSeparator = prop.getProperty(BCL2FASTQ_SEPARATOR); - String phixName = prop.getProperty(PHIX_NAME); - String operator = prop.getProperty(OPERATOR); - String mail = prop.getProperty(MAIL); - String header = prop.getProperty(HEADER); - - Long techId = 0L; - ArrayList<String> bcl2fastqList = new ArrayList<String>(); - List<ArrayList<String>> fullList = new ArrayList<ArrayList<String>>(); - String endType = ""; - String cycles = ""; - - if (args.length < 2) - { - String programName = getProgramName(); - System.err.println("Usage: java -jar " + programName + " <server> <FlowCell>"); - System.exit(1); - } - - String serverURL = args[0]; - String sampleIdendtifier = default_flow_cell_space + args[1]; - - IETLLIMSService service = - HttpInvokerUtils.createServiceStub(IETLLIMSService.class, serverURL + "/rmi-etl", - 5000); - - String sessionToken = service.tryToAuthenticate(user, password).getSessionToken(); - - Sample sample = - service.tryGetSampleWithExperiment(sessionToken, - SampleIdentifierFactory.parse(sampleIdendtifier)); - try - { - techId = sample.getId(); - - } catch (Exception ex) - { - System.err.println("Unknown FlowCell " + sampleIdendtifier); - System.exit(1); - } - - operationLog.info("Found Sample " + sample.getCode() + " with Id " + sample.getId()); - String flowCellId = extractFlowCellId(sample.getCode()); - - // which end type: single read or paired end? - List<IEntityProperty> p = sample.getProperties(); - for (IEntityProperty property : p) - { - if (property.getPropertyType().getCode().equals(END_TYPE)) - { - endType = GenomeMap.getEndType(property.tryGetAsString()); - } - if (property.getPropertyType().getCode().equals(CYCLES)) - { - cycles = GenomeMap.getNumberOfCycles(Integer.parseInt(property.tryGetAsString())); - } - - } - - List<Sample> flowLaneSample = - service.listSamples(sessionToken, - ListSampleCriteria.createForContainer(new TechId(techId))); - - Map<Integer, List<Sample>> parentSamples = new TreeMap<Integer, List<Sample>>(); - - for (Sample fl : flowLaneSample) - { - // Just extract the lane number - - Integer ii = Integer.parseInt(fl.getIdentifier().split(":")[1]); - parentSamples.put( - ii, - service.listSamples(sessionToken, - ListSampleCriteria.createForChild(new TechId(fl.getId())))); - - for (Map.Entry<Integer, List<Sample>> entry : parentSamples.entrySet()) - { - - // System.out.println(entry.getKey() + " " + entry.getValue()); - // System.out.println(entry.getValue().size()); - - for (int j = 0; j <= entry.getValue().size() - 1; ++j) - { - // System.out.println(entry.getValue().get(0).getParents()); - Long s = entry.getValue().get(j).getId(); - // System.out.println(s); - List<Sample> setParents = - service.listSamples(sessionToken, - ListSampleCriteria.createForChild(new TechId(s))); - // System.out.println(setParents); - } - // System.out.println(service.listSamples(sessionToken, - // ListSampleCriteria.createForChild(new TechId(entry.getKey())))); - - } - - } - - for (Entry<Integer, List<Sample>> entry : parentSamples.entrySet()) - { - Integer laneNumber = entry.getKey(); - String propertyString = ""; - String pathToGenome = ""; - String bowtieIndexName = ""; - List<Sample> samples = entry.getValue(); - - // get the properties of the first parent - List<IEntityProperty> properties = samples.get(0).getProperties(); - - for (int i = 0; i < samples.size(); i++) - { - - List<IEntityProperty> properties1 = samples.get(i).getProperties(); - String sampleCode = samples.get(i).getCode(); - HashMap<sampleProperties, String> propertiesPerSample = - new HashMap<sampleProperties, String>(); - - for (IEntityProperty property : properties1) - { - if (property.getPropertyType().getCode().equals(ORGANISM_PROPERTY)) - { - propertyString = property.tryGetAsString(); - bowtieIndexName = GenomeMap.getBowtieIndex(propertyString); - if (bowtieIndexName != null) - { - propertiesPerSample.put(sampleProperties.ORGANISM_PROPERTY1, - bowtieIndexName); - if (bowtieIndexName.equals(phixName)) - { - propertiesPerSample.put(sampleProperties.ISPHIX, "Y"); - } else - { - propertiesPerSample.put(sampleProperties.ISPHIX, "N"); - } - } else - { - propertiesPerSample.put(sampleProperties.ORGANISM_PROPERTY1, - "NO_REFERENCE_GENOME_AVAILABLE"); - propertiesPerSample.put(sampleProperties.ORGANISM_PROPERTY1, - bowtieIndexName); - propertiesPerSample.put(sampleProperties.ISPHIX, "N"); - - } - - } - - if (property.getPropertyType().getCode().equals(EXTERNAL_SAMPLE_NAME)) - { - propertiesPerSample.put(sampleProperties.EXTERNAL_SAMPLE_NAME1, - property.tryGetAsString()); - } - - if (property.getPropertyType().getCode().equals(BARCODE_PROPERTY)) - { - // only take the first six nucleotides of the barcode - String barcode = property.tryGetAsString(); - String strippedBarcode = barcode.substring(0, barcode.length() - 1); - propertiesPerSample - .put(sampleProperties.BARCODE_PROPERTY1, strippedBarcode); - } - - if (property.getPropertyType().getCode().equals(INDEX2)) - { - String index2 = property.tryGetAsString(); - if (index2 == null || index2.equals("NOINDEX")) - { - index2 = ""; - INDEX_SEPARATOR = ""; - - } - propertiesPerSample.put(sampleProperties.BARCODE_PROPERTY2, index2); - - } - - } - - // not indexed - if (propertiesPerSample.get(sampleProperties.BARCODE_PROPERTY1) == null) - { - // when it is a single sample in a single lane - if (samples.size() < 2) - { - bcl2fastqList.add(flowCellId - + bcl2fastqSeparator - + laneNumber - + bcl2fastqSeparator - + sampleCode - + "_" - + flowCellId - + bcl2fastqSeparator - + propertiesPerSample.get(sampleProperties.ORGANISM_PROPERTY1) - + bcl2fastqSeparator - + bcl2fastqSeparator - + cleanString(propertiesPerSample - .get(sampleProperties.EXTERNAL_SAMPLE_NAME1)) - + bcl2fastqSeparator - + propertiesPerSample.get(sampleProperties.ISPHIX) - + bcl2fastqSeparator + cycles + bcl2fastqSeparator + operator - + bcl2fastqSeparator + sample.getCode() + "_" + laneNumber + "\n"); - } - // single indexed - } else if (propertiesPerSample.get(sampleProperties.BARCODE_PROPERTY2) == null) - - { - bcl2fastqList.add(flowCellId - + bcl2fastqSeparator - + laneNumber - + bcl2fastqSeparator - + sampleCode - + "_" - + flowCellId - + bcl2fastqSeparator - + propertiesPerSample.get(sampleProperties.ORGANISM_PROPERTY1) - + bcl2fastqSeparator - + propertiesPerSample.get(sampleProperties.BARCODE_PROPERTY1) - + bcl2fastqSeparator - + cleanString(propertiesPerSample - .get(sampleProperties.EXTERNAL_SAMPLE_NAME1)) - + bcl2fastqSeparator + propertiesPerSample.get(sampleProperties.ISPHIX) - + bcl2fastqSeparator + cycles + bcl2fastqSeparator + operator - + bcl2fastqSeparator + sample.getCode() + "_" + laneNumber + "\n"); - } - // Dual indexed - else - { - bcl2fastqList.add(flowCellId - + bcl2fastqSeparator - + laneNumber - + bcl2fastqSeparator - + sampleCode - + "_" - + flowCellId - + bcl2fastqSeparator - + propertiesPerSample.get(sampleProperties.ORGANISM_PROPERTY1) - + bcl2fastqSeparator - + propertiesPerSample.get(sampleProperties.BARCODE_PROPERTY1) - + INDEX_SEPARATOR - + propertiesPerSample.get(sampleProperties.BARCODE_PROPERTY2) - + bcl2fastqSeparator - + cleanString(propertiesPerSample - .get(sampleProperties.EXTERNAL_SAMPLE_NAME1)) - + bcl2fastqSeparator + propertiesPerSample.get(sampleProperties.ISPHIX) - + bcl2fastqSeparator + cycles + bcl2fastqSeparator + operator - + bcl2fastqSeparator + sample.getCode() + "_" + laneNumber + "\n"); - } - } - fullList.add(bcl2fastqList); - bcl2fastqList = new ArrayList<String>(); - - for (IEntityProperty property : properties) - { - if (property.getPropertyType().getCode().equals(BARCODE_PROPERTY)) - { - propertyString = property.tryGetAsString(); - } - - if (property.getPropertyType().getCode().equals(ORGANISM_PROPERTY)) - { - try - { - propertyString = property.tryGetAsString(); - pathToGenome = GenomeMap.getGenomePath(propertyString); - bowtieIndexName = GenomeMap.getBowtieIndex(propertyString); - if (pathToGenome != null) - // TODO: if null then handle properly - { - elandWriter.write(laneNumber + ":ELAND_GENOME " + pathToGenome + "\n"); - elandWriter.write(laneNumber + ":ANALYSIS " + endType + "\n"); - bowtieWriter.write(bowtieIndexName + "\n"); - } - - } catch (IOException ex) - { - ex.printStackTrace(); - } - } - } - } - elandWriter.write("ELAND_FASTQ_FILES_PER_PROCESS 8\n" + "EMAIL_LIST " + mail); - elandWriter.close(); - bowtieWriter.close(); - writebcl2fastqList(bcl2fastqWriter, fullList, header); - operationLog.info("Writing " + prop.getProperty(BCL2FASTQ_CONFIG_FILE) - + " for BCL to FASTQ conversion"); - operationLog - .info("Writing " + prop.getProperty(ELAND_CONFIG_FILE) + " for Eland Alignment"); - operationLog.info("Writing " + prop.getProperty(BOWTIE_CONFIG_FILE) - + " for Bowtie Alignment"); - service.logout(sessionToken); - } - - private static void writebcl2fastqList(FileWriter bcl2fastqWriter, - List<ArrayList<String>> fullList, String header) throws IOException - { - bcl2fastqWriter.write(header + "\n"); - - for (List<String> element : fullList) - { - for (String e : element) - { - operationLog.debug(e); - bcl2fastqWriter.write(e); - } - } - bcl2fastqWriter.close(); - } - - private static String getProgramName() - { - StackTraceElement[] stack = Thread.currentThread().getStackTrace(); - StackTraceElement main = stack[stack.length - 1]; - String mainClass = main.getClassName(); - - // workaround, because the split does not work with a '.' - mainClass = mainClass.replace(".", " "); - String[] tokens = mainClass.split(" "); - - String jarName = tokens[tokens.length - 1] + ".jar"; - return jarName; - } - - private static String extractFlowCellId(String flowCellName) - { - String flowCell[] = flowCellName.split("_"); - // this is a GA - if (flowCell.length == 2) - { - return (flowCell[flowCell.length - 1]); - } else - { - // substring removes the A or B which is the Flow Cell tray in the HiSeq - return (flowCell[flowCell.length - 1].substring(1)); - } - } - - public static String cleanString(String dirtyString) - /* - * Replace all (Unicode) characters that are neither letters nor numbers with a "_" - */ - { - String cleanString = dirtyString.replaceAll("[^\\p{L}\\p{N}]", "_"); - return cleanString; - - } - -} \ No newline at end of file diff --git a/openbis_contrib/source/java/ch/ethz/bsse/cisd/dynamix/categoryoracle/CategoryOracle.java b/openbis_contrib/source/java/ch/ethz/bsse/cisd/dynamix/categoryoracle/CategoryOracle.java deleted file mode 100644 index 0c5f6d8a1adc08ae0ca3a63e186592665f7a9689..0000000000000000000000000000000000000000 --- a/openbis_contrib/source/java/ch/ethz/bsse/cisd/dynamix/categoryoracle/CategoryOracle.java +++ /dev/null @@ -1,84 +0,0 @@ -/* - * Copyright 2010 ETH Zuerich, CISD - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package ch.ethz.bsse.cisd.dynamix.categoryoracle; - -/** - * @author Izabela Adamczyk - */ -class CategoryOracle -{ - private static final String DISCARD = "Discard"; - - private static final String UP = "up"; - - private static final String YES = "yes"; - - private static final String NO = "no"; - - private static final String CONSTANT = "Constant"; - - private static final String GOOD = "Good"; - - private enum Category - { - OTHER, DISCARDED_CHAMBER, GOOD_CHAMBER_INTENSITY_AND_LOCALIZATION_CHANGE, - GOOD_CHAMBER_LOCALIZATION_CHANGE, GOOD_CHAMBER_INTENSITY_UP, GOOD_CHAMBER_NO_CHANGE; - } - - public static String calculateCategory(InputRow in) - { - String quality = in.getQuality(); - String intensityChange = in.getIntensityChange(); - String localizationChange = in.getLocalizationChange(); - return calculateCategory(quality, intensityChange, localizationChange).toString(); - } - - private static Category calculateCategory(String quality, String intensityChange, - String localizationChange) - { - if (eq(quality, GOOD) && eq(intensityChange, CONSTANT) && eq(localizationChange, NO)) - { - return Category.GOOD_CHAMBER_NO_CHANGE; - } else if (eq(quality, GOOD) && eq(intensityChange, UP) && eq(localizationChange, NO)) - { - return Category.GOOD_CHAMBER_INTENSITY_UP; - } else if (eq(quality, GOOD) && eq(intensityChange, NO) && eq(localizationChange, YES)) - { - return Category.GOOD_CHAMBER_LOCALIZATION_CHANGE; - } else if (eq(quality, GOOD) && eq(intensityChange, CONSTANT) - && eq(localizationChange, YES)) - { - return Category.GOOD_CHAMBER_INTENSITY_AND_LOCALIZATION_CHANGE; - } else if (eq(quality, DISCARD)) - { - return Category.DISCARDED_CHAMBER; - } else - { - return Category.OTHER; - } - } - - private static boolean eq(String property, String value) - { - return equalsIgnoreCase(property, value); - } - - private static boolean equalsIgnoreCase(String str1, String str2) - { - return str1 == null ? str2 == null : str1.equalsIgnoreCase(str2); - } -} diff --git a/openbis_contrib/source/java/ch/ethz/bsse/cisd/dynamix/categoryoracle/FeatureVectorConverter.java b/openbis_contrib/source/java/ch/ethz/bsse/cisd/dynamix/categoryoracle/FeatureVectorConverter.java deleted file mode 100644 index 9fd80590b4d4c70bf217c85d6580047f7bc131d8..0000000000000000000000000000000000000000 --- a/openbis_contrib/source/java/ch/ethz/bsse/cisd/dynamix/categoryoracle/FeatureVectorConverter.java +++ /dev/null @@ -1,69 +0,0 @@ -/* - * Copyright 2010 ETH Zuerich, CISD - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package ch.ethz.bsse.cisd.dynamix.categoryoracle; - -import java.io.File; -import java.io.IOException; -import java.util.Collections; -import java.util.List; -import java.util.Map; - -import org.apache.commons.io.FileUtils; - -import ch.systemsx.cisd.common.filesystem.FileUtilities; -import ch.systemsx.cisd.common.parser.IParserObjectFactory; -import ch.systemsx.cisd.common.parser.IParserObjectFactoryFactory; -import ch.systemsx.cisd.common.parser.IPropertyMapper; -import ch.systemsx.cisd.common.parser.ParserException; -import ch.systemsx.cisd.common.parser.ParsingException; -import ch.systemsx.cisd.openbis.generic.shared.parser.BisTabFileLoader; - -/** - * @author Izabela Adamczyk - */ -public class FeatureVectorConverter -{ - - public static void main(String[] args) throws ParserException, ParsingException, - IllegalArgumentException, IOException - { - String in = args[0]; - IParserObjectFactoryFactory<InputRow> parser = new IParserObjectFactoryFactory<InputRow>() - { - public IParserObjectFactory<InputRow> createFactory(IPropertyMapper propertyMapper) - throws ParserException - { - return new InputRowFactory(InputRow.class, propertyMapper); - } - }; - BisTabFileLoader<InputRow> loader = new BisTabFileLoader<InputRow>(parser, false); - File inFile = new File(in); - Map<String, String> defaults = Collections.emptyMap(); - List<InputRow> list = loader.load(FileUtils.openInputStream(inFile), defaults); - List<InputRowsNamedCollection> experiments = InputRowsHelper.extract(list); - for (InputRowsNamedCollection e : experiments) - { - String outName = e.getName() + ".csv"; - File outFile = - FileUtilities.createNextNumberedFile(new File(inFile.getParent(), outName), - null); - FileUtils.writeLines(outFile, InputRowsHelper.toTsv(e.getRows())); - System.out.println(outFile.getPath()); - } - } - -} diff --git a/openbis_contrib/source/java/ch/ethz/bsse/cisd/dynamix/categoryoracle/Features.java b/openbis_contrib/source/java/ch/ethz/bsse/cisd/dynamix/categoryoracle/Features.java deleted file mode 100644 index b57d920284347bf11bc6b96d4d1414e4ee39ce98..0000000000000000000000000000000000000000 --- a/openbis_contrib/source/java/ch/ethz/bsse/cisd/dynamix/categoryoracle/Features.java +++ /dev/null @@ -1,176 +0,0 @@ -/* - * Copyright 2010 ETH Zuerich, CISD - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package ch.ethz.bsse.cisd.dynamix.categoryoracle; - -import java.util.Arrays; -import java.util.List; - -import ch.systemsx.cisd.common.annotation.BeanProperty; - -/** - * @author Izabela Adamczyk - */ -public class Features -{ - - private static final String POSITION = "position"; - - private static final String SIDE = "side"; - - private static final String QUALITY = "quality"; - - private static final String QUALITY_DESC = "quality_desc"; - - private static final String INTENSITY_CHANGE = "intensity_change"; - - private static final String LOCALIZATION_CHANGE = "localization_change"; - - private static final String END_LOCALIZATION = "end_localization"; - - private static final String INITIAL_LOCALIZATION = "initial_localization"; - - private String position; - - private String side; - - private String quality; - - private String qualityDesc; - - private String intensityChange; - - private String localizationChange; - - private String initialLocalization; - - private String endLocalization; - - public Features() - { - } - - public String getPosition() - { - return position; - } - - @BeanProperty(label = POSITION) - public void setPosition(String position) - { - this.position = position; - } - - public String getSide() - { - return side; - } - - @BeanProperty(label = SIDE) - public void setSide(String side) - { - this.side = side; - } - - public String getQuality() - { - return quality; - } - - @BeanProperty(label = QUALITY) - public void setQuality(String quality) - { - this.quality = quality; - } - - public String getQualityDesc() - { - return qualityDesc; - } - - @BeanProperty(label = QUALITY_DESC) - public void setQualityDesc(String qualityDesc) - { - this.qualityDesc = qualityDesc; - } - - public String getIntensityChange() - { - return intensityChange; - } - - @BeanProperty(label = INTENSITY_CHANGE) - public void setIntensityChange(String intensityChange) - { - this.intensityChange = intensityChange; - } - - public String getLocalizationChange() - { - return localizationChange; - } - - @BeanProperty(label = LOCALIZATION_CHANGE) - public void setLocalizationChange(String localizationChange) - { - this.localizationChange = localizationChange; - } - - public String getInitialLocalization() - { - return initialLocalization; - } - - @BeanProperty(label = INITIAL_LOCALIZATION) - public void setInitialLocalization(String initialLocalization) - { - this.initialLocalization = initialLocalization; - } - - public String getEndLocalization() - { - return endLocalization; - } - - @BeanProperty(label = END_LOCALIZATION) - public void setEndLocalization(String endLocalization) - { - this.endLocalization = endLocalization; - } - - /** NOTE: Order strictly connected with {@link #getColumns()} */ - public static List<String> getHeaderColumns() - { - return Arrays.asList(asHeader(END_LOCALIZATION, "End Localization"), - asHeader(INITIAL_LOCALIZATION, "Initial Localization"), - asHeader(INTENSITY_CHANGE, "Intensity Change"), - asHeader(LOCALIZATION_CHANGE, "Localization Change"), asHeader(POSITION, "Position"), - asHeader(QUALITY, "Quality"), asHeader(QUALITY_DESC, "Quality Description"), - asHeader(SIDE, "Side")); - } - - static String asHeader(String code, String label) - { - return "<" + code + "> " + label; - } - - /** NOTE: Order strictly connected with {@link #getHeaderColumns()} */ - public List<String> getColumns() - { - return Arrays.asList(getEndLocalization(), getInitialLocalization(), getIntensityChange(), - getLocalizationChange(), getPosition(), getQuality(), getQualityDesc(), getSide()); - } -} \ No newline at end of file diff --git a/openbis_contrib/source/java/ch/ethz/bsse/cisd/dynamix/categoryoracle/InputRow.java b/openbis_contrib/source/java/ch/ethz/bsse/cisd/dynamix/categoryoracle/InputRow.java deleted file mode 100644 index cf8b599317f5d4086e2524a3772f5cc1910471ef..0000000000000000000000000000000000000000 --- a/openbis_contrib/source/java/ch/ethz/bsse/cisd/dynamix/categoryoracle/InputRow.java +++ /dev/null @@ -1,75 +0,0 @@ -/* - * Copyright 2010 ETH Zuerich, CISD - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package ch.ethz.bsse.cisd.dynamix.categoryoracle; - -import ch.systemsx.cisd.common.annotation.BeanProperty; - -/** - * @author Izabela Adamczyk - */ -public final class InputRow extends Features -{ - private static final String IDENTIFIER = "identifier"; - - private static final String CONTAINER = "container"; - - private static final String YORF = "yorf"; - - private String yorf; - - private String container; - - private String identifier; - - public InputRow() - { - } - - public String getContainer() - { - return container; - } - - @BeanProperty(label = CONTAINER) - public void setContainer(String container) - { - this.container = container; - } - - public String getIdentifier() - { - return identifier; - } - - @BeanProperty(label = IDENTIFIER) - public void setIdentifier(String identifier) - { - this.identifier = identifier; - } - - public String getYorf() - { - return yorf; - } - - @BeanProperty(label = YORF) - public void setYorf(String yorf) - { - this.yorf = yorf; - } - -} \ No newline at end of file diff --git a/openbis_contrib/source/java/ch/ethz/bsse/cisd/dynamix/categoryoracle/InputRowFactory.java b/openbis_contrib/source/java/ch/ethz/bsse/cisd/dynamix/categoryoracle/InputRowFactory.java deleted file mode 100644 index 9716d2cf0848364279f15fedba8ab306874a09ce..0000000000000000000000000000000000000000 --- a/openbis_contrib/source/java/ch/ethz/bsse/cisd/dynamix/categoryoracle/InputRowFactory.java +++ /dev/null @@ -1,33 +0,0 @@ -/* - * Copyright 2010 ETH Zuerich, CISD - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package ch.ethz.bsse.cisd.dynamix.categoryoracle; - -import ch.systemsx.cisd.common.parser.AbstractParserObjectFactory; -import ch.systemsx.cisd.common.parser.IPropertyMapper; - -/** - * @author Izabela Adamczyk - */ -final class InputRowFactory extends AbstractParserObjectFactory<InputRow> -{ - - protected InputRowFactory(Class<InputRow> beanClass, IPropertyMapper propertyMapper) - { - super(beanClass, propertyMapper); - } - -} \ No newline at end of file diff --git a/openbis_contrib/source/java/ch/ethz/bsse/cisd/dynamix/categoryoracle/InputRowsHelper.java b/openbis_contrib/source/java/ch/ethz/bsse/cisd/dynamix/categoryoracle/InputRowsHelper.java deleted file mode 100644 index 471bcdfea907ee917db7b55ccb8af22090a60025..0000000000000000000000000000000000000000 --- a/openbis_contrib/source/java/ch/ethz/bsse/cisd/dynamix/categoryoracle/InputRowsHelper.java +++ /dev/null @@ -1,76 +0,0 @@ -/* - * Copyright 2010 ETH Zuerich, CISD - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package ch.ethz.bsse.cisd.dynamix.categoryoracle; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -import ch.systemsx.cisd.common.utilities.BeanUtils; - -/** - * @author Izabela Adamczyk - */ -class InputRowsHelper -{ - - public static List<InputRowsNamedCollection> extract(List<InputRow> list) - { - Map<String, List<InputRow>> map = new HashMap<String, List<InputRow>>(); - for (InputRow r : list) - { - String name = r.getContainer(); - if (map.get(name) == null) - { - map.put(name, new ArrayList<InputRow>()); - } - map.get(name).add(r); - } - ArrayList<InputRowsNamedCollection> result = new ArrayList<InputRowsNamedCollection>(); - for (String key : map.keySet()) - { - InputRowsNamedCollection exp = new InputRowsNamedCollection(); - exp.setName(key); - exp.setRows(map.get(key)); - result.add(exp); - } - return result; - } - - public static List<String> toTsv(List<InputRow> list) - { - ArrayList<String> result = new ArrayList<String>(); - result.add(new TsvBuilder(OutputRow.getHeaderColumns()).toString()); - for (InputRow r : list) - { - result.add(new TsvBuilder(convert(r).getColumns()).toString()); - } - return result; - } - - private static OutputRow convert(InputRow in) - { - OutputRow outputRow = new OutputRow(); - BeanUtils.fillBean(OutputRow.class, outputRow, in); - outputRow.setWellName(in.getIdentifier().split(":")[1]); - String category = CategoryOracle.calculateCategory(in); - outputRow.setCategory(category); - return outputRow; - } - -} diff --git a/openbis_contrib/source/java/ch/ethz/bsse/cisd/dynamix/categoryoracle/InputRowsNamedCollection.java b/openbis_contrib/source/java/ch/ethz/bsse/cisd/dynamix/categoryoracle/InputRowsNamedCollection.java deleted file mode 100644 index 7ffc9d82556250ed724246775d6173c12c3884a9..0000000000000000000000000000000000000000 --- a/openbis_contrib/source/java/ch/ethz/bsse/cisd/dynamix/categoryoracle/InputRowsNamedCollection.java +++ /dev/null @@ -1,50 +0,0 @@ -/* - * Copyright 2010 ETH Zuerich, CISD - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package ch.ethz.bsse.cisd.dynamix.categoryoracle; - -import java.util.List; - -/** - * @author Izabela Adamczyk - */ -class InputRowsNamedCollection -{ - String name; - - List<InputRow> rows; - - public String getName() - { - return name; - } - - public void setName(String name) - { - this.name = name; - } - - public List<InputRow> getRows() - { - return rows; - } - - public void setRows(List<InputRow> rows) - { - this.rows = rows; - } - -} diff --git a/openbis_contrib/source/java/ch/ethz/bsse/cisd/dynamix/categoryoracle/OutputRow.java b/openbis_contrib/source/java/ch/ethz/bsse/cisd/dynamix/categoryoracle/OutputRow.java deleted file mode 100644 index 57f4018edaacd6ecc7009d8d003006bb8ac6e972..0000000000000000000000000000000000000000 --- a/openbis_contrib/source/java/ch/ethz/bsse/cisd/dynamix/categoryoracle/OutputRow.java +++ /dev/null @@ -1,81 +0,0 @@ -/* - * Copyright 2010 ETH Zuerich, CISD - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package ch.ethz.bsse.cisd.dynamix.categoryoracle; - -import java.util.ArrayList; -import java.util.List; - -import ch.systemsx.cisd.common.annotation.BeanProperty; - -/** - * @author Izabela Adamczyk - */ -final class OutputRow extends Features -{ - - private static final String CATEGORY = "category"; - - private static final String WELL_NAME = "WellName"; - - private String wellName; - - private String category; - - public String getWellName() - { - return wellName; - } - - @BeanProperty(label = WELL_NAME) - public void setWellName(String wellName) - { - this.wellName = wellName; - } - - public String getCategory() - { - return category; - } - - @BeanProperty(label = CATEGORY) - public void setCategory(String category) - { - this.category = category; - } - - /** NOTE: Order strictly connected with {@link #getColumns()} */ - public static List<String> getHeaderColumns() - { - ArrayList<String> list = new ArrayList<String>(); - list.add(WELL_NAME); - list.add(Features.asHeader(CATEGORY, "Category")); - list.addAll(Features/* super class */.getHeaderColumns()); - return list; - } - - /** NOTE: Order strictly connected with {@link #getHeaderColumns()} */ - @Override - public List<String> getColumns() - { - ArrayList<String> list = new ArrayList<String>(); - list.add(getWellName()); - list.add(getCategory()); - list.addAll(super.getColumns()); - return list; - } - -} \ No newline at end of file diff --git a/openbis_contrib/source/java/ch/ethz/bsse/cisd/dynamix/categoryoracle/TsvBuilder.java b/openbis_contrib/source/java/ch/ethz/bsse/cisd/dynamix/categoryoracle/TsvBuilder.java deleted file mode 100644 index 5fc49229f79537dbc114aa87bf1e522e48d35725..0000000000000000000000000000000000000000 --- a/openbis_contrib/source/java/ch/ethz/bsse/cisd/dynamix/categoryoracle/TsvBuilder.java +++ /dev/null @@ -1,62 +0,0 @@ -/* - * Copyright 2010 ETH Zuerich, CISD - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package ch.ethz.bsse.cisd.dynamix.categoryoracle; - -import java.util.List; - -/** - * @author Izabela Adamczyk - */ -public class TsvBuilder -{ - static final String TSV_SEPARATOR = ";"; - - StringBuilder builder = new StringBuilder(); - - boolean empty = true; - - public TsvBuilder() - { - } - - public TsvBuilder(List<String> columns) - { - addColumns(columns.toArray(new String[0])); - } - - public void addColumns(String... columns) - { - for (String c : columns) - { - if (empty) - { - empty = false; - } else - { - builder.append(TsvBuilder.TSV_SEPARATOR); - } - builder.append(c); - } - } - - @Override - public String toString() - { - return builder.toString(); - } - -} diff --git a/openbis_contrib/source/java/log.xml b/openbis_contrib/source/java/log.xml deleted file mode 100644 index 5cee0a68436a19a6c4ec4b14b580e6d9f75bf84f..0000000000000000000000000000000000000000 --- a/openbis_contrib/source/java/log.xml +++ /dev/null @@ -1,19 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" ?> -<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd"> - -<log4j:configuration xmlns:log4j='http://jakarta.apache.org/log4j/'> - - <appender name="STDOUT" class="org.apache.log4j.ConsoleAppender"> - <layout class="org.apache.log4j.PatternLayout"> - <param name="ConversionPattern" value="%d %-5p [%t] %c - %m%n"/> - </layout> - </appender> - - <appender name="NULL" class="org.apache.log4j.varia.NullAppender" /> - - <root> - <priority value ="info" /> - <appender-ref ref="STDOUT" /> - </root> - -</log4j:configuration> diff --git a/openbis_contrib/source/java/log4j.properties b/openbis_contrib/source/java/log4j.properties deleted file mode 100644 index 50010acd53ea6f9e850fc8c547b4aa6145c6e1b9..0000000000000000000000000000000000000000 --- a/openbis_contrib/source/java/log4j.properties +++ /dev/null @@ -1,11 +0,0 @@ -# Default Logging Configuration - -log4j.rootLogger=INFO, stdout -#to increase logging level -#log4j.logger.org.dcm4cheri=DEBUG -#to decrease logging level -#log4j.logger.org.dcm4cheri=ERROR - -log4j.appender.stdout=org.apache.log4j.ConsoleAppender -log4j.appender.stdout.layout=org.apache.log4j.PatternLayout -log4j.appender.stdout.layout.ConversionPattern=%d{ABSOLUTE} %-5p %x - %m\n diff --git a/openbis_standard_technologies/build.gradle b/openbis_standard_technologies/build.gradle index e7b48dad3c781bfde4c46454a43c81a0a3a73142..177a7947f03c769ecf9f537478d9cdb816d2bcee 100644 --- a/openbis_standard_technologies/build.gradle +++ b/openbis_standard_technologies/build.gradle @@ -37,7 +37,6 @@ evaluationDependsOn(':dbmigration') evaluationDependsOn(':openbis') evaluationDependsOn(':datastore_server') evaluationDependsOn(':screening') -evaluationDependsOn(':deep_sequencing_unit') evaluationDependsOn(':big_data_link_server') evaluationDependsOn(':openbis_ng_ui') @@ -79,8 +78,7 @@ dependencies { zipping "eclipse:jetty-distribution:${jettyVersion}@zip" - datastore_server project(':deep_sequencing_unit'), - project(':screening'), + datastore_server project(':screening'), 'bioformats:bioformats:6.5.1', 'imagej:ij:1.43u', 'cisd:cisd-openbis-knime-server:13.6.0.r29301', @@ -341,7 +339,6 @@ task zipCorePlugins(type: SymZip) { downloadCorePlugin('https://github.com/aarpon/obit_microscopy_core_technology/archive/release/20.x.zip', 'microscopy') downloadCorePlugin('https://github.com/aarpon/obit_shared_core_technology/archive/release/20.x.zip', 'shared') from project(':screening').fileTree(dir: 'source/core-plugins', includes:['screening/**', 'screening-optional/**'], excludes:['**/package-to-dist']) - from project(':deep_sequencing_unit').fileTree(dir: 'source/core-plugins', includes:['illumina-ngs/**'], excludes:['**/package-to-dist']) from fileTree(dir: 'targets/downloads/obit_flow_core_technology-release-20.x/core-plugins', includes:['flow/**']) from fileTree(dir: 'targets/downloads/obit_microscopy_core_technology-release-20.x/core-plugins', includes:['microscopy/**']) from fileTree(dir: 'targets/downloads/obit_shared_core_technology-release-20.x/core-plugins', includes:['shared/**']) diff --git a/openbis_standard_technologies/settings.gradle b/openbis_standard_technologies/settings.gradle index 3965356da9a99f33793627eb84a74d3494fc4913..6a63d12efca7964001343bbbb3a1d8c86d1287b1 100644 --- a/openbis_standard_technologies/settings.gradle +++ b/openbis_standard_technologies/settings.gradle @@ -1,3 +1,3 @@ includeFlat 'commonbase', 'common', 'openbis_api', 'openbis-common', 'authentication', 'dbmigration', 'openbis', - 'datastore_server', 'screening', 'deep_sequencing_unit', 'big_data_link_server', + 'datastore_server', 'screening', 'big_data_link_server', 'openbis_ng_ui', 'microservice_server_template' diff --git a/ui-test/settings.gradle b/ui-test/settings.gradle index 461cbd212e231aec2b8a648afafe0ecfe8efd6f1..40136a17f7fee23e62477f6f04fa1341e8422770 100644 --- a/ui-test/settings.gradle +++ b/ui-test/settings.gradle @@ -1,2 +1,2 @@ includeFlat 'commonbase', 'common', 'openbis_api', 'openbis-common', 'authentication', 'dbmigration', 'openbis', - 'datastore_server', 'screening', 'deep_sequencing_unit', 'openbis_standard_technologies' + 'datastore_server', 'screening', 'openbis_standard_technologies'