Ignore:
Timestamp:
Jan 12, 2011, 9:45:08 PM (9 years ago)
Author:
robert@…
Message:

Externalized configuration; improved assay view (detail views of runs and samples); implemented uploading and parsing of FASTA and QUAL files

Location:
trunk
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk

    • Property svn:ignore
      •  

        old new  
        44.classpath
        55.project
         6fileuploads
  • trunk/grails-app/controllers/nl/tno/metagenomics/AssayController.groovy

    r2 r3  
    99        def fileService
    1010        def excelService
    11         def fastaService
    1211
    1312        // Fields to be edited using excel file and manually
     
    494493        }
    495494
    496         /**************************************************************************
    497          *
    498          * Methods for handling uploaded sequence and quality files
    499          *
    500          *************************************************************************/
    501 
    502         /**
    503          * Processes uploaded files and tries to combine them with samples
    504          */
    505         def process = {
    506                 // load study with id specified by param.id
    507                 def assay = Assay.get(params.id as Long)
    508 
    509                 if (!assay) {
    510                         flash.message = "No assay found with id: $params.id"
    511                         redirect('action': 'errorPage')
    512                         return
    513                 }
    514 
    515                 // Check whether files are given
    516                 def names = params.sequencefiles
    517 
    518                 if( !names ) {
    519                         flash.message = "No files uploaded for processing"
    520                         redirect('action': 'show', 'id': params.id)
    521                         return
    522                 }
    523 
    524                 // If only 1 file is uploaded, it is given as String
    525                 ArrayList filenames = []
    526                 if( names instanceof String )
    527                         filenames << names
    528                 else
    529                         names.each { filenames << it }
    530 
    531                 /* Parses uploaded files, discards files we can not handle
    532                  *
    533                  * [
    534                  *              success: [
    535                  *                      [filename: 'abc.fasta', type: FASTA, numSequences: 190]
    536                  *                      [filename: 'cde.fasta', type: FASTA, numSequences: 140]
    537                  *                      [filename: 'abc.qual', type: QUAL, numSequences: 190, avgQuality: 38]
    538                  *                      [filename: 'cde.qual', type: QUAL, numSequences: 140, avgQuality: 29]
    539                  *              ],
    540                  *              failure: [
    541                  *                      [filename: 'testing.xls', message: 'Type not recognized']
    542                  *              ]
    543                  * ]
    544                  */
    545                 def parsedFiles = fastaService.parseFiles( filenames );
    546 
    547                 // Match files with samples in the database
    548                 def matchedFiles = fastaService.matchFiles( parsedFiles.success, assay.assaySamples );
    549 
    550                 // Sort files on filename
    551                 matchedFiles.sort { a,b -> a.fasta?.originalfilename <=> b.fasta?.originalfilename }
    552 
    553                 // Saved file matches in session to use them later on
    554                 session.processedFiles = [ parsed: parsedFiles, matched: matchedFiles ];
    555 
    556                 [assay: assay, parsedFiles: parsedFiles, matchedFiles: matchedFiles, selectedRun: params.selectedRun ]
    557         }
    558 
    559         /**
    560          * Saves processed files to the database, based on the selections made by the user
    561          */
    562         def saveProcessedFiles = {
    563                 // load study with id specified by param.id
    564                 def assay = Assay.get(params.id as Long)
    565 
    566                 if (!assay) {
    567                         flash.message = "No assay found with id: $params.id"
    568                         redirect('action': 'errorPage')
    569                         return
    570                 }
    571 
    572                 // Check whether files are given
    573                 def files = params.file
    574 
    575                 if( !files ) {
    576                         flash.message = "No files were selected."
    577                         redirect('action': 'show', 'id': params.id)
    578                         return
    579                 }
    580 
    581                 File permanentDir = fileService.absolutePath( ConfigurationHolder.config.metagenomics.fileDir )
    582                 int numSuccesful = 0;
    583                 def errors = [];
    584                
    585                 // Loop through all files Those are the numeric elements in the 'files' array
    586                 def digitRE = ~/^\d+$/;
    587                 files.findAll { it.key.matches( digitRE ) }.each { file ->
    588                         def filevalue = file.value;
    589                        
    590                         // Check if the file is selected
    591                         if( filevalue.include == "on" ) {
    592                                 if( fileService.fileExists( filevalue.fasta ) ) {
    593                                         try {
    594                                                 def permanent = fastaService.savePermanent( filevalue.fasta, filevalue.qual, session.processedFiles );
    595                                                
    596                                                 // Save the data into the database
    597                                                 SequenceData sd = new SequenceData();
    598                                                
    599                                                 sd.sequenceFile = permanent.fasta
    600                                                 sd.qualityFile = permanent.qual
    601                                                 sd.numSequences = permanent.numSequences
    602                                                 sd.averageQuality = permanent.avgQuality
    603                                                
    604                                                 // Couple the data to the right run and sample
    605                                                 def run = Run.get( filevalue.run )
    606                                                 if( run )
    607                                                         run.addToSequenceData( sd );
    608                                                        
    609                                                 def sample = AssaySample.get( filevalue.assaySample );
    610                                                 if( sample )
    611                                                         sample.addToSequenceData( sd );
    612                                                
    613                                                 if( !sd.validate() ) {
    614                                                         errors << "an error occurred while saving " + filevalue.fasta + ": validation of SequenceData failed.";
    615                                                 } else {
    616                                                         sd.save(flush:true);
    617                                                 }
    618                                                
    619                                                 numSuccesful++;
    620                                         } catch( Exception e ) {
    621                                                 errors << "an error occurred while saving " + filevalue.fasta + ": " + e.getMessage()
    622                                         }
    623                                 }
    624                         } else {
    625                                 // File doesn't need to be included in the system. Delete it also from disk
    626                                 fileService.delete( filevalue.fasta );
    627                         }
    628                 }
    629 
    630                 // Return a message to the user
    631                 if( numSuccesful == 0 ) {
    632                         flash.error = "None of the files were imported, because "
    633                        
    634                         if( errors.size() > 0 ) {
    635                                 errors.each {
    636                                         flash.error += "<br />- " + it
    637                                 }
    638                         } else {
    639                                 flash.error = "none of the files were selected for import."
    640                         }
    641                 } else {
    642                         flash.message = numSuccesful + " files have been added to the system. "
    643 
    644                         if( errors.size() > 0 ) {
    645                                 flash.error += errors.size() + " errors occurred during import: "
    646                                 errors.each {
    647                                         flash.error += "<br />- " + it
    648                                 }
    649                         }
    650                 }
    651                
    652                 redirect( action: "show", id: params.id )
    653         }
    654 
    655495}
Note: See TracChangeset for help on using the changeset viewer.