Changeset 1731


Ignore:
Timestamp:
Apr 8, 2011, 1:17:27 PM (12 years ago)
Author:
robert@…
Message:

Bugfix with the order of samples in the assay exporter

File:
1 edited

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
Note: See TracChangeset for help on using the changeset viewer.