Changeset 24
- Timestamp:
- Mar 23, 2011, 1:24:24 PM (13 years ago)
- Location:
- trunk
- Files:
-
- 19 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/grails-app/conf/Config.groovy
r13 r24 55 55 metagenomics.fileDir = "fileuploads/permanent" 56 56 57 // Filename of the (.fna, .qual and .oligos) files that are exported 58 // Only the part before the extension is mentioned. If you enter "sequences", the exported files will be 59 // sequences.fna, sequences.qual and sequences.oligos 60 metagenomics.exportFilename = "1.TCA.454Reads" 61 57 62 // Path in GSCF that is used after baseURL for adding a new study 58 gscf.addStudyPath = "/s tudyWizard/index?jump=create"63 gscf.addStudyPath = "/simpleWizard" 59 64 60 65 grails.project.groupId = appName // change this to alter the default package name and Maven publishing destination -
trunk/grails-app/conf/config-dbnptest.properties
r16 r24 25 25 metagenomics.fileUploadDir=/tmp/metagenomics/temp 26 26 metagenomics.fileDir=/tmp/metagenomics/permanent 27 28 # Filename of the (.fna, .qual and .oligos) files that are exported 29 metagenomics.exportFilename=1.TCA.454Reads -
trunk/grails-app/conf/config-development.properties
r16 r24 25 25 metagenomics.fileUploadDir=fileuploads/temp 26 26 metagenomics.fileDir=fileuploads/permanent 27 28 # Filename of the (.fna, .qual and .oligos) files that are exported 29 metagenomics.exportFilename=1.TCA.454Reads -
trunk/grails-app/controllers/nl/tno/metagenomics/AssayController.groovy
r14 r24 209 209 210 210 if( assaySampleParams ) { 211 assaySample.tagName = assaySampleParams.tagName 212 assaySample.oligoNumber = assaySampleParams.oligoNumber 213 assaySample.tagSequence = assaySampleParams.tagSequence 214 211 sampleExcelService.variableFields.each { k, v -> 212 assaySample[ k ] = assaySampleParams[ k ]; 213 } 214 assaySample.save() 215 215 216 try { 216 217 assaySample.run = Run.get( assaySampleParams.run as Long ); … … 331 332 response.setHeader "Content-disposition", "attachment; filename=" + name.trim() + ".zip" 332 333 try { 333 fastaService.export( assaySamples.unique(), response.getOutputStream() , name);334 fastaService.export( assaySamples.unique(), response.getOutputStream() ); 334 335 response.outputStream.flush(); 335 336 } catch( Exception e ) { -
trunk/grails-app/controllers/nl/tno/metagenomics/RunController.groovy
r19 r24 269 269 // Make it only possible to update samples writable by the user 270 270 def assaySamples = run.assaySamples.findAll { it.assay.study.canWrite( session.user ) } 271 272 println "Matchcolumns: " + matchColumns273 println "Possible fields: " + session.possibleFields274 println "Assay samples: " + assaySamples.sample.name275 271 276 272 def excelData = sampleExcelService.updateTagsByExcel( matchColumns, session.possibleFields, file, assaySamples ); … … 315 311 def assaySampleParams = sampleParams.get( assaySample.id as String ); 316 312 if( assaySampleParams ) { 317 assaySample.tagName = assaySampleParams.tagName 318 assaySample.oligoNumber = assaySampleParams.oligoNumber 319 assaySample.tagSequence = assaySampleParams.tagSequence 320 313 sampleExcelService.variableFields.each { k, v -> 314 assaySample[ k ] = assaySampleParams[ k ]; 315 } 321 316 assaySample.save() 322 317 } … … 514 509 response.setHeader "Content-disposition", "attachment; filename=${name}.zip" 515 510 try { 516 fastaService.export( assaySamples.unique(), response.getOutputStream() , name);511 fastaService.export( assaySamples.unique(), response.getOutputStream() ); 517 512 response.outputStream.flush(); 518 513 } catch( Exception e ) { -
trunk/grails-app/controllers/nl/tno/metagenomics/SampleController.groovy
r14 r24 31 31 response.setHeader "Content-disposition", "attachment; filename=" + name.trim() + ".zip" 32 32 try { 33 fastaService.export( assaySamples.unique(), response.getOutputStream() , name);33 fastaService.export( assaySamples.unique(), response.getOutputStream() ); 34 34 response.outputStream.flush(); 35 35 } catch( Exception e ) { -
trunk/grails-app/controllers/nl/tno/metagenomics/StudyController.groovy
r14 r24 44 44 response.setHeader "Content-disposition", "attachment; filename=" + name.trim() + ".zip" 45 45 try { 46 fastaService.export( assaySamples.unique(), response.getOutputStream() , name);46 fastaService.export( assaySamples.unique(), response.getOutputStream() ); 47 47 response.outputStream.flush(); 48 48 } catch( Exception e ) { -
trunk/grails-app/domain/nl/tno/metagenomics/AssaySample.groovy
r20 r24 15 15 Integer numUniqueSequences // Number of unique sequences / OTUs. Is only available after preprocessing 16 16 17 String oligoNumber // Oligonumber used to identify the sample 18 String tagSequence // Tag originally used to identify the sample 19 String tagName // Tag name 17 String fwOligo 18 String fwMidName 19 String fwTotalSeq 20 String fwMidSeq 21 String fwPrimerSeq 22 23 String revOligo 24 String revMidName 25 String revTotalSeq 26 String revMidSeq 27 String revPrimerSeq 20 28 21 29 static belongsTo = [ assay: Assay, sample: Sample, run: Run ] … … 24 32 static constraints = { 25 33 numUniqueSequences(nullable: true) 26 oligoNumber(nullable: true) 27 28 /* 29 , validator: { value, obj, errors -> 30 // When one oligoNumber is used in different assaysamples, 31 // they must also have the same tagSequences and tagNames 32 33 // Check whether this oligoNumber exists in the database 34 def otherAssaySamples = AssaySample.findAllByOligoNumber( value ) 35 if( !otherAssaySamples || otherAssaySamples.size() == 0 ) { 36 return true; 37 } 38 39 // Loop through the other assaysamples with this oligonumber 40 otherAssaySamples.each { otherAS -> 41 // Only check other objects, don't compare with itself (because that 42 // way it wouldn't be possible anymore to edit an object) 43 if( otherAS.id != obj.id ) { 44 if( otherAS.tagSequence != obj.tagSequence || otherAS.tagName != obj.tagName ) { 45 return false; 46 } 47 } 48 } 49 50 return true 51 } 52 */ 53 tagSequence(nullable: true) 54 tagName(nullable:true) 34 fwOligo(nullable: true) 35 fwMidName(nullable: true) 36 fwTotalSeq(nullable:true) 37 fwMidSeq(nullable:true) 38 fwPrimerSeq(nullable:true) 39 revOligo(nullable: true) 40 revMidName(nullable: true) 41 revTotalSeq(nullable:true) 42 revMidSeq(nullable:true) 43 revPrimerSeq(nullable:true) 55 44 run(nullable: true); 56 45 } … … 201 190 */ 202 191 public boolean containsData() { 203 return tagSequence || tagName || oligoNumber || numFiles() > 0; 192 return fwOligo || fwMidName || fwTotalSeq || fwMidSeq || fwPrimerSeq || 193 revOligo || revMidName || revTotalSeq || revMidSeq || revPrimerSeq || 194 numFiles() > 0; 204 195 } 205 196 … … 213 204 public void moveValuableDataTo( AssaySample otherAssaySample ) { 214 205 // Copy properties 215 otherAssaySample.tagSequence = tagSequence; 216 otherAssaySample.oligoNumber = oligoNumber; 217 otherAssaySample.tagName = tagName; 206 otherAssaySample.fwOligo = fwOligo; 207 otherAssaySample.fwMidName = fwMidName; 208 otherAssaySample.fwTotalSeq = fwTotalSeq; 209 otherAssaySample.fwMidSeq = fwMidSeq; 210 otherAssaySample.fwPrimerSeq = fwPrimerSeq; 218 211 212 otherAssaySample.revOligo = revOligo; 213 otherAssaySample.revMidName = revMidName; 214 otherAssaySample.revTotalSeq = revTotalSeq; 215 otherAssaySample.revMidSeq = revMidSeq; 216 otherAssaySample.revPrimerSeq = revPrimerSeq; 217 219 218 // Move attached data 220 219 def dataList = [] + sequenceData?.toList() -
trunk/grails-app/services/nl/tno/metagenomics/FastaService.groovy
r13 r24 405 405 * @return 406 406 */ 407 public def export( List assaySamples, OutputStream outStream, String name ) {407 public def export( List assaySamples, OutputStream outStream, String name = null ) { 408 408 if( !assaySamples || assaySamples.size() == 0 ) 409 409 return false; 410 411 // Retrieve the filename from configuration, if none is given 412 if( !name ) 413 name = ConfigurationHolder.config.metagenomics.exportFilename 410 414 411 415 // Determine the directory the uploaded files are stored in … … 421 425 // Determine new tag length. Since we can use 4 characters per 422 426 // tag position, we only have to use 4log( #samples) 423 int tagLength = Math.ceil( Math.log( assaySamples.size() ) / Math.log( 4 ) ) 427 // The minimum number of characters used is 10, to ensure the correct working of the other 428 // programs. 429 int tagLength = Math.max( 10, Math.ceil( Math.log( assaySamples.size() ) / Math.log( 4 ) ) ); 424 430 int tagNumber = 0; 425 431 … … 430 436 431 437 // Save the tag for exporting 432 tags << [assaySampleId: assaySample.id, sampleName: assaySample.sample.name, assayName: assaySample.assay.name, studyName: assaySample.assay.study.name, tag: tag] 438 tags << [ assaySampleId: assaySample.id, sampleName: assaySample.sample.name, 439 assayName: assaySample.assay.name, studyName: assaySample.assay.study.name, 440 forwardPrimer: assaySample.fwPrimerSeq, reversePrimer: assaySample.revPrimerSeq, 441 tag: tag 442 ]; 433 443 } 434 444 } … … 441 451 // file and part of the qual files mixed. We have to write the full sequence file first. 442 452 try { 443 zipFile.putNextEntry( new ZipEntry( name + ".f asta" ) );453 zipFile.putNextEntry( new ZipEntry( name + ".fna" ) ); 444 454 445 455 assaySamples.each { assaySample -> … … 484 494 485 495 // Export a tab delimited file with tags 486 zipFile.putNextEntry( new ZipEntry( name + " _sample-tag.tab" ) );487 export SampleTagFile( tags, zipWriter );496 zipFile.putNextEntry( new ZipEntry( name + ".tab" ) ); 497 exportTabDelimitedSampleTagFile( tags, zipWriter ); 488 498 zipWriter.flush(); 489 499 zipFile.closeEntry(); 490 500 501 // Export a mothur file with tags 502 zipFile.putNextEntry( new ZipEntry( name + ".oligos" ) ); 503 exportMothurSampleTagFile( tags, zipWriter ); 504 zipWriter.flush(); 505 zipFile.closeEntry(); 506 491 507 // Export an excel file with information about the samples 492 508 zipFile.putNextEntry( new ZipEntry( name + ".xls" ) ); … … 498 514 499 515 /** 500 * Creates a tab delimited file with two columns and column headers "Sequence" and "Samplename" 516 * Creates an oligos file for Mothur that represents the connection between samples 517 * and the artificial tags. 518 * 519 * @see http://www.mothur.org/wiki/Trim.seqs#allfiles 501 520 * @param tags Map with newly created tags 502 521 * @param zipWriter Writer to write the data to 503 522 */ 504 protected void exportSampleTagFile( List tags, Writer zipWriter ) { 505 zipWriter.write( "Sequence" + "\t" + "Samplename" + "\n" ); 523 protected void exportMothurSampleTagFile( List tags, Writer zipWriter ) { 524 // Add the forward and reverse primers, as found in the assaysamples 525 // The primers are already cut off, so they are not relevant anymore 526 // For that reason, a '#' is prepended to each line. 527 def fwPrimers = tags.collect { it.forwardPrimer }.findAll { it }.unique(); 528 def revPrimers = tags.collect { it.reversePrimer }.findAll { it }.unique(); 529 530 fwPrimers.each { zipWriter.write( "#forward\t" + it + "\n" ) } 531 revPrimers.each { zipWriter.write( "#reverse\t" + it + "\n" ) } 506 532 507 533 // Check whether the sample names are unique. If they aren't, the assay and study names … … 519 545 520 546 tags.each { 521 zipWriter.write( it.tag + "\t" + it.uniqueName + "\n" ); 522 } 523 } 524 547 zipWriter.write( "barcode\t" + it.tag + "\t" + it.uniqueName + "\n" ); 548 } 549 } 550 551 /** 552 * Creates a tab delimited file with two columns and column headers "Sequence" and "Samplename" 553 * @param tags Map with newly created tags 554 * @param zipWriter Writer to write the data to 555 */ 556 protected void exportTabDelimitedSampleTagFile( List tags, Writer zipWriter ) { 557 zipWriter.write( "Sequence" + "\t" + "Samplename" + "\n" ); 558 559 // Check whether the sample names are unique. If they aren't, the assay and study names 560 // are appended to the sample name 561 def sampleNames = tags*.sampleNames; 562 if( sampleNames.unique().size() < sampleNames.size() ) { 563 tags.each { 564 it.uniqueName = it.sampleName + " (" + it.assayName + " / " + it.studyName + ")"; 565 } 566 } else { 567 tags.each { 568 it.uniqueName = it.sampleName; 569 } 570 } 571 572 tags.each { 573 zipWriter.write( it.tag + "\t" + it.uniqueName + "\n" ); 574 } 575 } 576 577 525 578 /** 526 579 * Creates a unique tag for the given number … … 541 594 int currentChar = tagNumber % numChars 542 595 543 tag = chars[ currentChar ] + tag; 596 // Append the new character to the end of the tag, to ensure that the first part of the tag is 597 // the most volatile. This way it is easy to find the end of the tag and the beginning of the real 598 // sequence on first sight. 599 tag = tag + chars[ currentChar ]; 544 600 545 601 tagNumber = Math.floor( tagNumber / numChars ); 546 602 } 547 603 548 return tag 604 return tag; 549 605 } 550 606 -
trunk/grails-app/services/nl/tno/metagenomics/SampleExcelService.groovy
r21 r24 11 11 12 12 // Fields to be edited using excel file and manually 13 def variableFields = [ 14 'fwOligo': 'Forward oligo number', 15 'fwMidName': 'Forward mid name', 16 'fwTotalSeq': 'Total forward sequence', 17 'fwMidSeq': 'Forward mid sequence', 18 'fwPrimerSeq': 'Forward primer sequence', 19 'revOligo': 'Reverse oligo number', 20 'revMidName': 'Reverse mid name', 21 'revTotalSeq': 'Total reverse sequence', 22 'revMidSeq': 'Reverse mid sequence', 23 'revPrimerSeq': 'Reverse primer sequence', 24 25 ] 26 13 27 def sampleNameName = "Sample name" 14 28 def runName = "Run" 15 def tagNameName = "Tag name" 16 def tagSequenceName = "Tag sequence" 17 def oligoNumberName = "Oligo number" 18 def possibleFields = [sampleNameName, runName, tagNameName, tagSequenceName, oligoNumberName] 29 def possibleFields = [sampleNameName, runName] + variableFields.keySet().toList(); 30 def possibleFieldNames = [sampleNameName, runName ] + variableFields.values(); 19 31 20 32 /** … … 35 47 def wb = excelService.create(); 36 48 37 def fields = possibleField s49 def fields = possibleFieldNames 38 50 if( !includeRun ) 39 51 fields = fields - runName … … 49 61 rowData << assaySample.run?.name 50 62 51 rowData << assaySample.tagName 52 rowData << assaySample.tagSequence 53 rowData << assaySample.oligoNumber 63 variableFields.each { k, v -> 64 rowData << assaySample[ k ]; 65 } 66 54 67 data << rowData; 55 68 } … … 57 70 58 71 // Auto resize columns 59 excelService.autoSizeColumns( wb, sheetIndex, 0.. 2)72 excelService.autoSizeColumns( wb, sheetIndex, 0..fields.size()) 60 73 61 74 return wb; … … 82 95 // Try to guess best matches between the excel file and the column names 83 96 def bestMatches = [:] 84 def fields = possibleField s97 def fields = possibleFieldNames 85 98 if( !includeRun ) 86 99 fields = fields - runName 87 88 100 89 101 // Do matching using fuzzy search. The 0.8 treshold makes sure that no match if chosen if 90 102 // there is actually no match at all. 91 def matches = fuzzySearchService.mostSimilarUnique( headers, possibleFields, 0.8 );103 def matches = fuzzySearchService.mostSimilarUnique( headers, fields, 0.8 ); 92 104 93 105 headers.eachWithIndex { header, idx -> … … 121 133 def columns = [:] 122 134 def dataMatches = false; 123 possibleField s.each { columnName ->135 possibleFieldNames.each { columnName -> 124 136 def foundColumn = matchColumns.find { it.value == columnName }; 125 137 … … 130 142 } 131 143 132 println columns133 134 144 // A column to match the sample name must be present 135 145 if( columns[ sampleNameName ] == -1 ) { … … 188 198 columns.each { 189 199 if( it.value > -1 ) { 190 switch( it.key ) { 191 case tagNameName: assaySample.tagName = rowData[ it.value ]; break 192 case tagSequenceName: assaySample.tagSequence = rowData[ it.value ]; break 193 case oligoNumberName: assaySample.oligoNumber = rowData[ it.value ]; break 194 case runName: assaySample.run = Run.findByName( rowData[ it.value ] ); break 200 if( it.key == runName ) { 201 assaySample.run = Run.findByName( rowData[ it.value ] ); 202 } else { 203 def field = variableFields.find { variableField -> variableField.value == it.key }; 204 if( field ) { 205 assaySample[ field.key ] = rowData[ it.value ]; 206 } 195 207 } 196 208 } … … 245 257 def subjectFields = [] 246 258 def eventFields = [] 247 def moduleFields = [ "Sample name", "Assay name", "Study name", "Run name", "# sequences", "Artificial tag sequence" , "Original tag sequence", "Tag name", "Oligo number" ]259 def moduleFields = [ "Sample name", "Assay name", "Study name", "Run name", "# sequences", "Artificial tag sequence" ] + variableFields.values(); 248 260 gscfData.each { sample -> 249 261 sample.each { key, value -> … … 281 293 assaySample.numSequences(), 282 294 currentTag?.tag, 283 assaySample.tagName,284 assaySample.tagSequence,285 assaySample.oligoNumber286 295 ] 296 297 // Add the variable fields for all assaysamples 298 variableFields.each { k, v -> 299 row << assaySample[ k ]; 300 } 287 301 288 302 // Afterwards add the gscfData including subject and event data … … 322 336 excelService.writeData( wb, data, sheetIndex, 0 ); 323 337 324 // Auto resize columns 325 excelService.autoSizeColumns( wb, sheetIndex, 0.. fields[ "names" ][ "all" ].size()-1)338 // Auto resize columns (# columns = # samples + 1) 339 excelService.autoSizeColumns( wb, sheetIndex, 0..assaySamples?.size()) 326 340 327 341 // Write the data to the output stream -
trunk/grails-app/services/nl/tno/metagenomics/files/ExcelService.groovy
r20 r24 185 185 * @return 186 186 */ 187 public Workbook autoSizeColumns( Workbook book, int sheetIndex = 0, def columns = 0 ) {187 public Workbook autoSizeColumns( Workbook book, int sheetIndex = 0, def columns = 0 ) { 188 188 if( book == null ) 189 189 throw new Exception( "No workbook given." ); -
trunk/grails-app/services/nl/tno/metagenomics/integration/SynchronizationService.groovy
r16 r24 634 634 // Update the sample object if necessary 635 635 sampleFound.name = gscfSample.name 636 sampleFound.subject = gscfSample.subject.toString() 637 sampleFound.event = gscfSample.event.toString() + ( gscfSample.startTime ? " (" + gscfSample.startTime + ")" : "" ) 636 setSubjectAndEventFromGSCF( sampleFound, gscfSample ); 638 637 sampleFound.save(); 639 638 } else { … … 648 647 // Update the sample object if necessary 649 648 sampleFound.name = gscfSample.name 650 sampleFound.subject = gscfSample.subject.toString() 651 sampleFound.event = gscfSample.event.toString() + ( gscfSample.startTime ? " (" + gscfSample.startTime + ")" : "" ) 649 setSubjectAndEventFromGSCF( sampleFound, gscfSample ); 652 650 sampleFound.save(); 653 651 } else { … … 656 654 // If it doesn't exist, create a new object 657 655 sampleFound = new Sample( sampleToken: gscfSample.sampleToken, name: gscfSample.name, study: assay.study ); 658 sampleFound.subject = gscfSample.subject.toString() 659 sampleFound.event = gscfSample.event.toString() + ( gscfSample.startTime ? " (" + gscfSample.startTime + ")" : "" ) 656 setSubjectAndEventFromGSCF( sampleFound, gscfSample ); 660 657 assay.study.addToSamples( sampleFound ); 661 658 sampleFound.save(); … … 673 670 } 674 671 } 672 } 673 674 /** 675 * Copies the subject and event properties from the gscf sample to the local sample 676 * @param sample Sample object to update 677 * @param gscfSample Map with properties about the gscf sample ('subject', 'event' and 'startTime' are used) 678 */ 679 private void setSubjectAndEventFromGSCF( sample, gscfSample ) { 680 sample.subject = gscfSample.subject && gscfSample.subject != "null" ? gscfSample.subject.toString() : "" 681 682 sample.event = gscfSample.event && gscfSample.event != "null" ? gscfSample.event.toString() : "" 683 684 if( gscfSample.startTime && gscfSample.startTime != "null" ) 685 sample.event += " (" + gscfSample.startTime + ")"; 675 686 } 676 687 -
trunk/grails-app/views/assay/_enterTagsDialog.gsp
r9 r24 16 16 <th>Sample</th> 17 17 <th>Run</th> 18 <th>Tag name</th> 19 <th>Tag sequence</th> 18 <th></th> 20 19 <th>Oligo number</th> 20 <th>Mid name</th> 21 <th>Total sequence</th> 22 <th>Mid sequence</th> 23 <th>Primer sequence</th> 21 24 </tr> 22 25 </thead> … … 25 28 <td>${assaySample.sample?.name}</td> 26 29 <td><g:select name="assaySample.${assaySample.id}.run" from="${assaySample.assay.runs}" value="${assaySample.run?.id}" optionKey="id" optionValue="name" /></td> 27 <td><g:textField name="assaySample.${assaySample.id}.tagName" value="${assaySample.tagName}" /></td> 28 <td><g:textField name="assaySample.${assaySample.id}.tagSequence" value="${assaySample.tagSequence}" /></td> 29 <td><g:textField name="assaySample.${assaySample.id}.oligoNumber" value="${assaySample.oligoNumber}" /></td> 30 <td>fw</td> 31 <td><g:textField name="assaySample.${assaySample.id}.fwOligo" value="${assaySample.fwOligo}" /></td> 32 <td><g:textField name="assaySample.${assaySample.id}.fwMidName" value="${assaySample.fwMidName}" /></td> 33 <td><g:textField name="assaySample.${assaySample.id}.fwTotalSeq" value="${assaySample.fwTotalSeq}" /></td> 34 <td><g:textField name="assaySample.${assaySample.id}.fwMidSeq" value="${assaySample.fwMidSeq}" /></td> 35 <td><g:textField name="assaySample.${assaySample.id}.fwPrimerSeq" value="${assaySample.fwPrimerSeq}" /></td> 30 36 </tr> 37 <tr> 38 <td></td> 39 <td></td> 40 <td>rev</td> 41 <td><g:textField name="assaySample.${assaySample.id}.revOligo" value="${assaySample.revOligo}" /></td> 42 <td><g:textField name="assaySample.${assaySample.id}.revMidName" value="${assaySample.revMidName}" /></td> 43 <td><g:textField name="assaySample.${assaySample.id}.revTotalSeq" value="${assaySample.revTotalSeq}" /></td> 44 <td><g:textField name="assaySample.${assaySample.id}.revMidSeq" value="${assaySample.revMidSeq}" /></td> 45 <td><g:textField name="assaySample.${assaySample.id}.revPrimerSeq" value="${assaySample.revPrimerSeq}" /></td> 46 </tr> 31 47 </g:each> 32 48 </table> -
trunk/grails-app/views/assay/show.gsp
r21 r24 67 67 <th nowrap>name</th> 68 68 <th nowrap>run</th> 69 <th nowrap>tag name</th> 70 <th nowrap>tag sequence</th> 69 <th nowrap>forward mid</th> 71 70 <th nowrap># sequences</th> 72 71 <th nowrap># qual</th> … … 79 78 <td><a href="#" onClick="showSample(${assaySample.id}, 'assay'); return false;">${assaySample.sample.name}</a></td> 80 79 <td>${assaySample.run?.name}</td> 81 <td>${assaySample.tagName}</td> 82 <td>${assaySample.tagSequence}</td> 80 <td>${assaySample.fwMidName}</td> 83 81 <td> 84 82 <g:if test="${assaySample.numSequenceFiles() > 0}"> -
trunk/grails-app/views/assaySample/show.gsp
r9 r24 11 11 12 12 <h2>Details</h2> 13 <ul class="assaySampleDetails"> 14 <li class="title"> 15 <label> </label> 16 <span class="value">forward</span> 17 <span class="value">reverse</span> 18 </li> 19 <li> 20 <label>Oligo number</label> 21 <span class="value">${assaySample.fwOligo}</span> 22 <span class="value">${assaySample.revOligo}</span> 23 </li> 24 <li> 25 <label>Mid name</label> 26 <span class="value">${assaySample.fwMidName}</span> 27 <span class="value">${assaySample.revMidName}</span> 28 </li> 29 <li> 30 <label>Total sequence</label> 31 <span class="value">${assaySample.fwTotalSeq}</span> 32 <span class="value">${assaySample.revTotalSeq}</span> 33 </li> 34 <li> 35 <label>Mid sequence</label> 36 <span class="value">${assaySample.fwMidSeq}</span> 37 <span class="value">${assaySample.revMidSeq}</span> 38 </li> 39 <li> 40 <label>Primer sequence</label> 41 <span class="value">${assaySample.fwPrimerSeq}</span> 42 <span class="value">${assaySample.revPrimerSeq}</span> 43 </li> 44 </ul> 13 45 46 <h2>Statistics</h2> 14 47 <ul> 15 <li><label>Tag name</label><span class="value">${assaySample.tagName}</span></li>16 <li><label>Tag sequence</label><span class="value">${assaySample.tagSequence}</span></li>17 <li><label>Oligo number</label><span class="value">${assaySample.oligoNumber}</span></li>18 48 <li><label># sequences</label><span class="value">${assaySample.numSequences() ?: '-'}</span></li> 19 49 <li><label># unique sequences</label><span class="value">${assaySample.numUniqueSequences ?: '-'}</span></li> -
trunk/grails-app/views/run/_enterTagsDialog.gsp
r9 r24 15 15 <tr> 16 16 <th>Sample</th> 17 <th>Tag name</th> 18 <th>Tag sequence</th> 17 <th></th> 19 18 <th>Oligo number</th> 19 <th>Mid name</th> 20 <th>Total sequence</th> 21 <th>Mid sequence</th> 22 <th>Primer sequence</th> 20 23 </tr> 21 24 </thead> … … 23 26 <tr> 24 27 <td>${assaySample.sample?.name}</td> 25 <td><g:textField name="assaySample.${assaySample.id}.tagName" value="${assaySample.tagName}" /></td> 26 <td><g:textField name="assaySample.${assaySample.id}.tagSequence" value="${assaySample.tagSequence}" /></td> 27 <td><g:textField name="assaySample.${assaySample.id}.oligoNumber" value="${assaySample.oligoNumber}" /></td> 28 <td>fw</td> 29 <td><g:textField name="assaySample.${assaySample.id}.fwOligo" value="${assaySample.fwOligo}" /></td> 30 <td><g:textField name="assaySample.${assaySample.id}.fwMidName" value="${assaySample.fwMidName}" /></td> 31 <td><g:textField name="assaySample.${assaySample.id}.fwTotalSeq" value="${assaySample.fwTotalSeq}" /></td> 32 <td><g:textField name="assaySample.${assaySample.id}.fwMidSeq" value="${assaySample.fwMidSeq}" /></td> 33 <td><g:textField name="assaySample.${assaySample.id}.fwPrimerSeq" value="${assaySample.fwPrimerSeq}" /></td> 34 </tr> 35 <tr> 36 <td></td> 37 <td>rev</td> 38 <td><g:textField name="assaySample.${assaySample.id}.revOligo" value="${assaySample.revOligo}" /></td> 39 <td><g:textField name="assaySample.${assaySample.id}.revMidName" value="${assaySample.revMidName}" /></td> 40 <td><g:textField name="assaySample.${assaySample.id}.revTotalSeq" value="${assaySample.revTotalSeq}" /></td> 41 <td><g:textField name="assaySample.${assaySample.id}.revMidSeq" value="${assaySample.revMidSeq}" /></td> 42 <td><g:textField name="assaySample.${assaySample.id}.revPrimerSeq" value="${assaySample.revPrimerSeq}" /></td> 28 43 </tr> 29 44 </g:each> -
trunk/grails-app/views/run/show.gsp
r21 r24 96 96 <th nowrap>study</th> 97 97 <th nowrap>assay</th> 98 <th nowrap>tag name</th> 99 <th nowrap>tag sequence</th> 98 <th nowrap>Forward mid</th> 100 99 <th nowrap># sequences</th> 101 100 <th nowrap># qual</th> … … 109 108 <td>${assaySample.assay.study.name}</td> 110 109 <td>${assaySample.assay.name}</td> 111 <td>${assaySample.tagName}</td> 112 <td>${assaySample.tagSequence}</td> 110 <td>${assaySample.fwMidName}</td> 113 111 <td> 114 112 <g:if test="${assaySample.numSequenceFiles() > 0}"> -
trunk/web-app/css/metagenomics.css
r15 r24 490 490 } 491 491 492 .ui-dialog .assaySampleDetails li.title { border-bottom: 1px solid #666; } 493 #showSampleDialog ul.assaySampleDetails li { padding: 0 3px; margin: 0; } 494 .ui-dialog .assaySampleDetails li label, .ui-dialog .assaySampleDetails li span { padding: 3px 0; } 495 .ui-dialog .assaySampleDetails label { border-right: 1px solid #666; } 496 .ui-dialog .assaySampleDetails span.value { width: 150px; display: inline-block; *display: inline; zoom: 1; } 497 492 498 /* Makes sure the filenames in the dialog don't exceed 200px */ 493 499 .dataTables_wrapper .uploadedFile { display: inline-block; zoom: 1; *display: inline; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; width: 190px; height: 15px; } -
trunk/web-app/js/enterTagsDialog.js
r21 r24 2 2 $( "#enterTagsDialog" ).tabbedDialog({ 3 3 height: 450, 4 width: 750,4 width: 960, 5 5 modal: true, 6 6 autoOpen: false,
Note: See TracChangeset
for help on using the changeset viewer.