[13] | 1 | package nl.tno.metagenomics |
---|
| 2 | |
---|
[14] | 3 | import java.util.List; |
---|
| 4 | |
---|
[13] | 5 | import org.codehaus.groovy.grails.commons.ConfigurationHolder |
---|
| 6 | |
---|
| 7 | class SampleController { |
---|
| 8 | def fastaService |
---|
[14] | 9 | def sampleExcelService |
---|
[13] | 10 | |
---|
| 11 | def index = { |
---|
| 12 | redirect( controller: 'study' ); |
---|
| 13 | } |
---|
[14] | 14 | |
---|
| 15 | /** |
---|
| 16 | * Exports data about one or more studies in fasta format |
---|
| 17 | */ |
---|
| 18 | def exportAsFasta = { |
---|
| 19 | def assaySamples = getAssaySamples( params ); |
---|
| 20 | def name |
---|
| 21 | |
---|
| 22 | if( assaySamples == null ) { |
---|
| 23 | return |
---|
| 24 | } else if( assaySamples*.sample.unique().size() == 1 ) { |
---|
| 25 | name = "Sample_" + assaySamples[0].sample.name?.replace( ' ', '_' ); |
---|
| 26 | } else { |
---|
| 27 | name = "samples"; |
---|
| 28 | } |
---|
| 29 | |
---|
| 30 | // Export the sequences and quality scores |
---|
| 31 | response.setHeader "Content-disposition", "attachment; filename=" + name.trim() + ".zip" |
---|
| 32 | try { |
---|
| 33 | fastaService.export( assaySamples.unique(), response.getOutputStream(), name ); |
---|
| 34 | response.outputStream.flush(); |
---|
| 35 | } catch( Exception e ) { |
---|
| 36 | log.error( "Exception occurred during export of sequences. Probably the user has cancelled the download." ); |
---|
| 37 | } |
---|
| 38 | } |
---|
| 39 | |
---|
| 40 | /** |
---|
| 41 | * Export metadata of one or more studies in excel format |
---|
| 42 | */ |
---|
| 43 | def exportMetaData = { |
---|
| 44 | def assaySamples = getAssaySamples( params ); |
---|
| 45 | def name |
---|
| 46 | |
---|
| 47 | if( assaySamples == null ) { |
---|
| 48 | return |
---|
| 49 | } else if( assaySamples*.sample.unique().size() == 1 ) { |
---|
| 50 | name = "Sample_" + assaySamples[0].sample.name?.replace( ' ', '_' ); |
---|
| 51 | } else { |
---|
| 52 | name = "samples"; |
---|
| 53 | } |
---|
| 54 | |
---|
| 55 | // Export the metadata |
---|
| 56 | response.setHeader "Content-disposition", "attachment; filename=${name}.xls" |
---|
| 57 | try { |
---|
| 58 | // The export functionality needs a assaySample-tag list, but it |
---|
| 59 | // should be empty when only exporting metadata |
---|
| 60 | def tags = []; |
---|
| 61 | assaySamples.unique().each { assaySample -> |
---|
| 62 | tags << [assaySampleId: assaySample.id, sampleName: assaySample.sample.name, assayName: assaySample.assay.name, studyName: assaySample.assay.study.name, tag: "-"] |
---|
| 63 | } |
---|
| 64 | sampleExcelService.exportExcelSampleData( assaySamples.unique(), tags, response.getOutputStream() ); |
---|
| 65 | response.outputStream.flush(); |
---|
| 66 | } catch( Exception e ) { |
---|
| 67 | log.error( "Exception occurred during export of metadata. Probably the user has cancelled the download." ); |
---|
| 68 | e.printStackTrace(); |
---|
| 69 | } |
---|
| 70 | } |
---|
| 71 | |
---|
[13] | 72 | |
---|
[14] | 73 | |
---|
| 74 | |
---|
[13] | 75 | /** |
---|
[14] | 76 | * Parse the given parameters and try to extract assaysamples using ids and tokens of samples |
---|
| 77 | * @param params |
---|
| 78 | * @return |
---|
[13] | 79 | */ |
---|
[14] | 80 | protected List getAssaySamples( params ) { |
---|
[13] | 81 | def tokens = params.list( 'tokens' ); |
---|
| 82 | def ids = params.list( 'ids' ); |
---|
[14] | 83 | def name; |
---|
| 84 | |
---|
[13] | 85 | ids = ids.findAll { it.isLong() }.collect { Long.parseLong( it ) } |
---|
[14] | 86 | |
---|
[13] | 87 | if( !tokens && !ids ) { |
---|
| 88 | def message = "No sample tokens or ids given" |
---|
[14] | 89 | flash.error = message |
---|
| 90 | redirect( action: "index" ); |
---|
[13] | 91 | return; |
---|
| 92 | } |
---|
[14] | 93 | |
---|
[13] | 94 | def assaySamples = []; |
---|
[14] | 95 | |
---|
[13] | 96 | // Determine which assaySamples to export |
---|
[14] | 97 | def sample; |
---|
[13] | 98 | tokens.each { token -> |
---|
[14] | 99 | sample = Sample.findBySampleToken( token ); |
---|
| 100 | if( sample.study.canRead( session.user ) ) { |
---|
| 101 | if( sample && sample.assaySamples ) |
---|
| 102 | assaySamples += sample.assaySamples; |
---|
| 103 | } |
---|
[13] | 104 | } |
---|
| 105 | ids.each { id -> |
---|
[14] | 106 | sample = Sample.get( id ); |
---|
| 107 | if( sample.study.canRead( session.user ) ) { |
---|
| 108 | if( sample && sample.assaySamples ) |
---|
| 109 | assaySamples += sample.assaySamples; |
---|
| 110 | } |
---|
[13] | 111 | } |
---|
[14] | 112 | |
---|
| 113 | return assaySamples; |
---|
[13] | 114 | } |
---|
[14] | 115 | |
---|
| 116 | |
---|
[13] | 117 | } |
---|