Changeset 2015

Show
Ignore:
Timestamp:
12-09-11 14:35:43 (3 years ago)
Author:
taco@…
Message:

VisualizeController?.groovy, improved infoMessage system.

Files:
1 modified

Legend:

Unmodified
Added
Removed
  • trunk/grails-app/controllers/dbnp/visualization/VisualizeController.groovy

    r2013 r2015  
    2323        def authenticationService 
    2424        def moduleCommunicationService 
    25     def infoMessage = "" 
     25    def infoMessage = [] 
     26    def infoMessageOfflineModules = [] 
    2627    final int CATEGORICALDATA = 0 
    2728    final int NUMERICALDATA = 1 
     
    5859        // Check to see if we have enough information 
    5960        if(input_object==null || input_object?.studyIds==null){ 
    60             infoMessage = "Please select a study." 
     61            setInfoMessage("Please select a study.") 
    6162            return sendInfoMessage() 
    6263        } else { 
     
    108109            } 
    109110 
     111            // Make sure any informational messages regarding offline modules are submitted to the client 
     112            setInfoMessageOfflineModules() 
     113 
    110114 
    111115            // TODO: Maybe we should add study's own fields 
     
    132136 
    133137        if(inputData.columnIds == null || inputData.columnIds == [] || inputData.columnIds[0] == null || inputData.columnIds[0] == ""){ 
    134             infoMessage = "Please select a data source for the x-axis." 
     138            setInfoMessage("Please select a data source for the x-axis.") 
    135139            return sendInfoMessage() 
    136140        } 
    137141        if(inputData.rowIds == null || inputData.rowIds == [] ||  inputData.rowIds[0] == null ||   inputData.rowIds[0] == ""){ 
    138             infoMessage = "Please select a data source for the y-axis." 
     142            setInfoMessage("Please select a data source for the y-axis.") 
    139143            return sendInfoMessage() 
    140144        } 
     
    184188        } catch(Exception e){ 
    185189            //returnError(404, "An error occured while trying to collect field data from a module. Most likely, this module is offline.") 
    186             infoMessage = "Unfortunately, "+assay.module.name+" could not be reached. As a result, we cannot at this time visualize data contained in this module." 
     190            infoMessageOfflineModules.add(assay.module.name) 
    187191            log.error("VisualizationController: getFields: "+e) 
    188192        } 
     
    620624   } 
    621625 
    622    /** 
    623    * Returns the objects within the given study that should be used with the given entity string 
    624    * 
    625    * For example: 
    626    *            What object should be consulted if the user asks for "samples" 
    627    *            Response: study.samples 
    628    * @return    List of domain objects that should be used with the given entity string 
    629    */ 
    630   protected def templateObjectCallback( String entity, Study study ) { 
    631           switch( entity ) { 
    632                   case "Study": 
    633                   case "studies": 
    634                           return study 
    635                   case "Subject": 
    636                   case "subjects": 
    637                           return study?.samples?.parentSubject 
    638                   case "Sample": 
    639                   case "samples": 
    640                           return study?.samples 
    641                   case "Event": 
    642                   case "events": 
    643                            return study?.samples?.parentEventGroup?.events?.flatten() 
    644                   case "SamplingEvent": 
    645                   case "samplingEvents": 
    646                           return study?.samples?.parentEvent 
    647                   case "Assay": 
    648                   case "assays": 
    649                                   return study?.assays 
    650           } 
    651   } 
     626    /** 
     627    * Returns the objects within the given study that should be used with the given entity string 
     628    * 
     629    * For example: 
     630    *           What object should be consulted if the user asks for "samples" 
     631    *           Response: study.samples 
     632    * @return   List of domain objects that should be used with the given entity string 
     633    */ 
     634    protected def templateObjectCallback( String entity, Study study ) { 
     635      switch( entity ) { 
     636          case "Study": 
     637          case "studies": 
     638              return study 
     639          case "Subject": 
     640          case "subjects": 
     641              return study?.samples?.parentSubject 
     642          case "Sample": 
     643          case "samples": 
     644              return study?.samples 
     645          case "Event": 
     646          case "events": 
     647               return study?.samples?.parentEventGroup?.events?.flatten() 
     648          case "SamplingEvent": 
     649          case "samplingEvents": 
     650              return study?.samples?.parentEvent 
     651          case "Assay": 
     652          case "assays": 
     653                  return study?.assays 
     654      } 
     655    } 
    652656         
    653657        /** 
     
    701705        * @return                       Standard error of the mean of the values or 0 if no values can be used. 
    702706        */ 
    703    protected def computeSEM( List values, def mean = null ) { 
    704            if( mean == null ) 
    705                         mean = computeMean( values ) 
    706             
    707            def sumOfDifferences = 0; 
    708            def sizeOfValues = 0; 
    709            values.each { value -> 
    710                    def num = getNumericValue( value ); 
    711                    if( num != null ) { 
    712                            sumOfDifferences += Math.pow( num - mean, 2 ); 
    713                            sizeOfValues++ 
    714                    } 
    715            } 
    716  
    717            if( sizeOfValues > 0 ) { 
    718                    def std = Math.sqrt( sumOfDifferences / sizeOfValues ); 
    719                    return std / Math.sqrt( sizeOfValues ); 
    720            } else { 
    721                    return 0; 
    722            } 
    723    } 
    724    Exception e 
     707    protected def computeSEM( List values, def mean = null ) { 
     708       if( mean == null ) 
     709            mean = computeMean( values ) 
     710 
     711       def sumOfDifferences = 0; 
     712       def sizeOfValues = 0; 
     713       values.each { value -> 
     714           def num = getNumericValue( value ); 
     715           if( num != null ) { 
     716               sumOfDifferences += Math.pow( num - mean, 2 ); 
     717               sizeOfValues++ 
     718           } 
     719       } 
     720 
     721       if( sizeOfValues > 0 ) { 
     722           def std = Math.sqrt( sumOfDifferences / sizeOfValues ); 
     723           return std / Math.sqrt( sizeOfValues ); 
     724       } else { 
     725           return 0; 
     726       } 
     727    } 
     728    Exception e 
    725729        /** 
    726730         * Return the numeric value of the given object, or null if no numeric value could be returned 
     
    902906    protected void sendResults(returnData){ 
    903907        def results = [:] 
    904         if(infoMessage!=""){ 
     908        if(infoMessage.size()!=0){ 
    905909            results.put("infoMessage", infoMessage) 
    906             infoMessage = "" 
     910            infoMessage = [] 
    907911        } 
    908912        results.put("returnData", returnData) 
     
    918922        def results = [:] 
    919923        results.put("infoMessage", infoMessage) 
    920         infoMessage = "" 
     924        infoMessage = [] 
    921925        render results as JSON 
     926    } 
     927 
     928    /** 
     929     * Adds a new message to the infoMessage 
     930     * @param message The information that needs to be added to the infoMessage 
     931     */ 
     932    protected void setInfoMessage(message){ 
     933        infoMessage.add([message]) 
     934        println "setInfoMessage: "+infoMessage 
     935    } 
     936 
     937    /** 
     938     * Adds a message to the infoMessage that gives the client information about offline modules 
     939     */ 
     940    protected void setInfoMessageOfflineModules(){ 
     941        if(infoMessageOfflineModules.size()>0){ 
     942            String message = "Unfortunately" 
     943            infoMessageOfflineModules.eachWithIndex{ it, index -> 
     944                if(index==(infoMessageOfflineModules.size()-2)){ 
     945                    message += ', the '+it+' and ' 
     946                } else { 
     947                    if(index==(infoMessageOfflineModules.size()-1)){ 
     948                        message += 'the '+it 
     949                    } else { 
     950                        message += ', the '+it 
     951                    } 
     952                } 
     953            } 
     954            message += " could not be reached. As a result, we cannot at this time visualize data contained in " 
     955            if(infoMessageOfflineModules.size()>1){ 
     956                message += "these modules." 
     957            } else { 
     958                message += "this module." 
     959            } 
     960            setInfoMessage(message) 
     961        } 
     962        infoMessageOfflineModules = [] 
    922963    } 
    923964