source: trunk/grails-app/controllers/nl/tno/massSequencing/SampleController.groovy @ 55

Last change on this file since 55 was 55, checked in by robert@…, 8 years ago

Adjusted artificial tag creation in order to avoid homopolymers (#37)

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