Changeset 1731

Show
Ignore:
Timestamp:
08-04-11 13:17:27 (3 years ago)
Author:
robert@…
Message:

Bugfix with the order of samples in the assay exporter

Files:
1 modified

Legend:

Unmodified
Added
Removed
  • trunk/grails-app/services/dbnp/studycapturing/AssayService.groovy

    r1730 r1731  
    158158        } 
    159159 
    160         def samples = assay.samples 
     160        // Find samples and sort by name 
     161                def samples = assay.samples.toList().sort { it.name } 
    161162 
    162163        def eventFieldMap = [:] 
     
    176177            'Sample Data' :             getFieldValues(samples, fieldMap['Sample Data']*.name), 
    177178            'Event Group' :             eventFieldMap, 
    178             'Module Measurement Data':  measurementTokens*.name ? requestModuleMeasurements(assay, measurementTokens) : [:] 
     179            'Module Measurement Data':  measurementTokens*.name ? requestModuleMeasurements(assay, measurementTokens, samples) : [:] 
    179180        ] 
    180181    } 
     
    202203     * Retrieves module measurement data through a rest call to the module 
    203204     * 
    204      * @param consumer the url of the module 
    205      * @param path path of the rest call to the module 
     205     * @param assay             Assay for which the module measurements should be retrieved 
     206     * @param fields    List with the names of the fields to be retrieved. Format: [ [ name: 'measurementName1' ], [ name: 'measurementName2' ] ] 
     207     * @param samples   Samples for which the module  
    206208     * @return 
    207209     */ 
    208     def requestModuleMeasurements(assay, fields) { 
     210    def requestModuleMeasurements(assay, fields, samples) { 
    209211 
    210212        def moduleUrl = assay.module.url 
     
    222224        if (!sampleTokens?.size()) return [] 
    223225 
    224         def lastDataIndex   = moduleData.size() - 1 
    225         def stepSize        = sampleTokens.size() + 1 
    226                  
    227226                // Convert the three different maps into a map like:  
    228227                // 
     
    230229                //   "measurement 2": [ value4, value5, value6 ] ] 
    231230                // 
     231                // The returned values should be in the same order as the given samples-list 
    232232                def map = [:] 
    233                 def numSamples = sampleTokens.size(); 
    234                 def idx = 0; 
     233                def numSampleTokens = sampleTokens.size(); 
    235234                 
    236                 // Loop through all measurementtokens, and get the right slice from the measurement list 
    237                 measurementTokens.each { measurementToken -> 
    238                         def startIndex = idx++ * numSamples; 
    239                         def stopIndex = startIndex + numSamples - 1; 
    240                         map[ measurementToken.toString() ] = moduleData[ startIndex..stopIndex ].collect { it.toString() } 
     235                measurementTokens.eachWithIndex { measurementToken, measurementIndex -> 
     236                        def measurements = []; 
     237                        samples.each { sample -> 
     238 
     239                                // Do measurements for this sample exist? If not, a null value is returned 
     240                                // for this sample. Otherwise, the measurement is looked up in the list with 
     241                                // measurements, based on the sample token 
     242                                if( sampleTokens.collect{ it.toString() }.contains( sample.giveUUID() ) ) { 
     243                                        def tokenIndex = sampleTokens.indexOf( sample.giveUUID() ); 
     244                                        def valueIndex = measurementIndex * numSampleTokens + tokenIndex; 
     245                                         
     246                                        // If the module data is in the wrong format, show an error in the log file 
     247                                        // and return a null value for this measurement. 
     248                                        if( valueIndex >= moduleData.size() ) { 
     249                                                log.error "Module measurements given by module " + assay.module.name + " are not in the right format: " + measurementTokens?.size() + " measurements, " + sampleTokens?.size() + " samples, " + moduleData?.size() + " values" 
     250                                                measurements << null 
     251                                        }  else { 
     252                                                measurements << moduleData[ valueIndex ].toString(); 
     253                                        } 
     254                                } else { 
     255                                        measurements << null 
     256                                } 
     257                        } 
     258                        map[ measurementToken.toString() ] = measurements 
    241259                } 
    242260