source: trunk/grails-app/controllers/nl/tno/massSequencing/StudyController.groovy @ 59

Last change on this file since 59 was 59, checked in by robert@…, 8 years ago
  • Improved speed by using ajax calls in pagination
  • Importing taxonomy files now works by adding it to sequenceData objects
File size: 3.5 KB
Line 
1package nl.tno.massSequencing
2
3import java.util.List;
4
5class StudyController {
6        def synchronizationService
7        def gscfService
8        def fileService
9        def trashService
10        def fastaService
11        def sampleExcelService
12       
13        def index = {
14                // Clean the upload directory
15                fileService.cleanDirectory();
16               
17                // Clean the trash if needed
18                trashService.cleanTrash();
19               
20                // Filter studies for the ones the user is allowed to see
21                def studies = Study.list();
22                [studies: studies.findAll { it.canRead( session.user ) }, 
23                        gscfAddUrl: gscfService.urlAddStudy(), 
24                        lastSynchronized: synchronizationService.lastFullSynchronization ] 
25        }
26       
27        def sequenceLengthHistogram = {
28                redirect( controller: "assaySample", action: "sequenceLengthHistogramForStudy", id: params.id );
29        }
30
31        /**
32         * Exports data about one or more studies in fasta format
33         */
34        def exportAsFasta = {
35                def assaySamples = getAssaySamples( params );
36                def name
37
38                if( assaySamples == null ) {
39                        return
40                } else if( assaySamples*.assay*.study.unique().size() == 1 ) {
41                        name = "Study_" + assaySamples[0].assay.study.name?.replace( ' ', '_' );
42                } else {
43                        name = "studies";
44                }
45
46                // Export the sequences and quality scores
47                response.setHeader "Content-disposition", "attachment; filename=" + name.trim() + ".zip"
48                try {
49                        fastaService.export( assaySamples.unique(), response.getOutputStream() );
50                        response.outputStream.flush();
51                } catch( Exception e ) {
52                        log.error( "Exception occurred during export of sequences. Probably the user has cancelled the download." );
53                        e.printStackTrace();
54                }
55        }
56
57        /**
58         * Export metadata of one or more studies in excel format
59         */
60        def exportMetaData = {
61                def assaySamples = getAssaySamples( params );
62                def name
63
64                if( assaySamples == null ) {
65                        return
66                } else if( assaySamples*.assay*.study.unique().size() == 1 ) {
67                        name = "Study_" + assaySamples[0].assay.study.name?.replace( ' ', '_' );
68                } else {
69                        name = "studies";
70                }
71
72                // Export the metadata
73                response.setHeader "Content-disposition", "attachment; filename=${name}.xls"
74                try {
75                        // The export functionality needs a assaySample-tag list, but it
76                        // should be empty when only exporting metadata
77                        def tags = [];
78                        assaySamples.unique().each { assaySample ->
79                                tags << [assaySampleId: assaySample.id, sampleName: assaySample.sample.name, assayName: assaySample.assay.name, studyName: assaySample.assay.study.name, tag: "-"]
80                        }
81                        sampleExcelService.exportExcelSampleData( assaySamples.unique(), tags, response.getOutputStream() );
82                        response.outputStream.flush();
83                } catch( Exception e ) {
84                        log.error( "Exception occurred during export of metadata. Probably the user has cancelled the download." );
85                        e.printStackTrace();
86                }
87        }
88
89        /**
90         * Parse the given parameters and try to extract studies using ids and tokens
91         * @param params
92         * @return
93         */
94        protected List getAssaySamples( params ) {
95                def tokens = params.list( 'tokens' );
96                def ids = params.list( 'ids' );
97                def name;
98
99                ids = ids.findAll { it.isLong() }.collect { Long.parseLong( it ) }
100
101                if( !tokens && !ids ) {
102                        def message = "No assay tokens or ids given"
103                        flash.error = message
104                        redirect( action: "index" );
105                        return;
106                }
107
108                def assaySamples = [];
109
110                // Determine which assaySamples to export
111                def study;
112                tokens.each { token ->
113                        study = Study.findByStudyToken( token );
114                        if( study && study.canRead( session.user ) )
115                                assaySamples += study.assays*.assaySamples.flatten();
116                }
117                ids.each { id ->
118                        study = Study.get( id );
119                        if( study && study.canRead( session.user ) )
120                                assaySamples += study.assays*.assaySamples.flatten();
121                }
122
123                return assaySamples;
124        }
125
126}
Note: See TracBrowser for help on using the repository browser.