Ignore:
Timestamp:
Mar 23, 2011, 1:24:24 PM (9 years ago)
Author:
robert@…
Message:

Improved export of fasta files and added properties to assaysamples

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/grails-app/services/nl/tno/metagenomics/FastaService.groovy

    r13 r24  
    405405         * @return
    406406         */
    407         public def export( List assaySamples, OutputStream outStream, String name ) {
     407        public def export( List assaySamples, OutputStream outStream, String name = null ) {
    408408                if( !assaySamples || assaySamples.size() == 0 )
    409409                        return false;
     410               
     411                // Retrieve the filename from configuration, if none is given
     412                if( !name )
     413                        name = ConfigurationHolder.config.metagenomics.exportFilename
    410414
    411415                // Determine the directory the uploaded files are stored in
     
    421425                // Determine new tag length. Since we can use 4 characters per
    422426                // 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 ) ) );
    424430                int tagNumber = 0;
    425431
     
    430436
    431437                                // 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                                ];
    433443                        }
    434444                }
     
    441451                // file and part of the qual files mixed. We have to write the full sequence file first.
    442452                try {
    443                         zipFile.putNextEntry( new ZipEntry( name + ".fasta" ) );
     453                        zipFile.putNextEntry( new ZipEntry( name + ".fna" ) );
    444454                       
    445455                        assaySamples.each { assaySample ->
     
    484494               
    485495                // Export a tab delimited file with tags
    486                 zipFile.putNextEntry( new ZipEntry( name + "_sample-tag.tab" ) );
    487                 exportSampleTagFile( tags, zipWriter );
     496                zipFile.putNextEntry( new ZipEntry( name + ".tab" ) );
     497                exportTabDelimitedSampleTagFile( tags, zipWriter );
    488498                zipWriter.flush();
    489499                zipFile.closeEntry();
    490500
     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               
    491507                // Export an excel file with information about the samples
    492508                zipFile.putNextEntry( new ZipEntry( name + ".xls" ) );
     
    498514       
    499515        /**
    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
    501520         * @param tags          Map with newly created tags
    502521         * @param zipWriter     Writer to write the data to
    503522         */
    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" ) }
    506532               
    507533                // Check whether the sample names are unique. If they aren't, the assay and study names
     
    519545               
    520546                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       
    525578        /**
    526579         * Creates a unique tag for the given number
     
    541594                        int currentChar = tagNumber % numChars
    542595
    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 ];
    544600
    545601                        tagNumber = Math.floor( tagNumber / numChars );
    546602                }
    547603
    548                 return tag
     604                return tag;
    549605        }
    550606
Note: See TracChangeset for help on using the changeset viewer.