def test_CheckSubjectMatchesFilter(): restParser = RestParser() if cmu_test_project_uuid: project = cmu_test_project_uuid else: projects = restParser.run(BRAIN_VOL_FILES, '/projects') project = projects[0] subjects = restParser.run(BRAIN_VOL_FILES, '/projects/{}/subjects'.format(project)) subject = subjects['uuid'][0] derivatives = Query.GetDerivativesDataForSubject(BRAIN_VOL_FILES, project, subject) for skey in derivatives: for vkey in derivatives[skey]['values']: dt = vkey val = derivatives[skey]['values'][vkey]['value'] if (dt and val): break # find an actual stat and build a matching filter to make sure our matcher passes it filter = "derivatives.{} eq {}".format(dt, val) assert Query.CheckSubjectMatchesFilter(BRAIN_VOL_FILES, project, subject, filter) instruments = Query.GetParticipantInstrumentData(BRAIN_VOL_FILES, project, subject) for (i, inst) in instruments.items(): if 'AGE_AT_SCAN' in inst: age = inst['AGE_AT_SCAN'] older = str(float(age) + 1) younger = str(float(age) - 1) assert Query.CheckSubjectMatchesFilter( BRAIN_VOL_FILES, project, subject, "instruments.AGE_AT_SCAN eq {}".format(str(age))) assert (Query.CheckSubjectMatchesFilter( BRAIN_VOL_FILES, project, subject, "instruments.AGE_AT_SCAN lt {}".format(younger)) == False) assert (Query.CheckSubjectMatchesFilter( BRAIN_VOL_FILES, project, subject, "instruments.AGE_AT_SCAN gt {}".format(younger)) == True) assert Query.CheckSubjectMatchesFilter( BRAIN_VOL_FILES, project, subject, "instruments.AGE_AT_SCAN lt {}".format(older)) assert (Query.CheckSubjectMatchesFilter( BRAIN_VOL_FILES, project, subject, "instruments.AGE_AT_SCAN gt {}".format(older)) == False) eq__format = "instruments.{} eq '{}'".format('WISC_IV_VOCAB_SCALED', 'nan') assert Query.CheckSubjectMatchesFilter(BRAIN_VOL_FILES, project, subject, eq__format) eq__format = "instruments.{} eq '{}'".format('WISC_IV_VOCAB_SCALED', 'not a match') assert (Query.CheckSubjectMatchesFilter(BRAIN_VOL_FILES, project, subject, eq__format) == False)
def derivativesList(self): result = [] match = re.match(r"^/?projects/([^/]+)/subjects/([^/]+)", self.command) self.restLog( "Returning derivatives in subject {}".format(match.group(2)), 2) derivatives = Query.GetDerivativesDataForSubject( self.nidm_files, match.group(1), match.group(2)) for s in derivatives: result.append(s) return self.format(result)
def derivativeSummary(self): match = re.match( r"^/?projects/([^/]+)/subjects/([^/]+)/derivatives/([^/]+)", self.command) uri = match.group(3) self.restLog( "Returning stat {} in subject {}".format(uri, match.group(2)), 2) derivatives = Query.GetDerivativesDataForSubject( self.nidm_files, match.group(1), match.group(2)) single_derivative = {uri: derivatives[uri]} self.restLog("Formatting single derivative", 5) return self.formatDerivatives(single_derivative)
def test_brain_vols(): restParser = RestParser() if cmu_test_project_uuid: project = cmu_test_project_uuid else: project = (restParser.run(BRAIN_VOL_FILES, '/projects'))[0] subjects = restParser.run(BRAIN_VOL_FILES, '/projects/{}/subjects'.format(project)) subject = subjects['uuid'][0] data = Query.GetDerivativesDataForSubject(BRAIN_VOL_FILES, None, subject) assert (len(data) > 0) for key in data: assert ('StatCollectionType' in data[key]) assert ('URI' in data[key]) assert ('values' in data[key])
def addFieldStats(self, result, project, subjects, field, type): ''' Geneerates basic stats on a group of subjects and adds it to the result :param result: :param subjects: :param field: :return: ''' values = [] for s in subjects: if type == self.STAT_TYPE_INSTRUMENTS: data = Query.GetParticipantInstrumentData( tuple(self.nidm_files), project, s) for i in data: if field in data[i]: values.append(float(data[i][field])) # derivatives are of the form [UUID]['values'][URI]{datumType, label, values, units} if type == self.STAT_TYPE_DERIVATIVES: data = Query.GetDerivativesDataForSubject( tuple(self.nidm_files), project, s) for deriv in data: for URI in data[deriv]['values']: measures = data[deriv]['values'][URI] if field == measures[ 'label'] or field == self.getTailOfURI(URI): values.append(float(measures['value'])) if len(values) > 0: med = median(values) avg = mean(values) st = std(values) mn = min(values) mx = max(values) else: med = avg = st = mn = mx = None result[field] = { "max": mx, "min": mn, "median": med, "mean": avg, "standard_deviation": st }
def restParser(nidm_files, command, verbosity_level=0): restLog("parsing command " + command, 1, verbosity_level) restLog("Files to read:" + str(nidm_files), 1, verbosity_level) restLog("Using {} as the graph cache directory".format(gettempdir()), 1, verbosity_level) filter = "" if str(command).find('?') != -1: (command, query) = str(command).split('?') for q in query.split('&'): if len(q.split('=')) == 2: left, right = q.split('=')[0], q.split('=')[1] if left == 'filter': filter = right result = [] if re.match(r"^/?projects/?$", command): restLog("Returning all projects", 2, verbosity_level) projects = Query.GetProjectsUUID(nidm_files) for uuid in projects: result.append(str(uuid).replace(Constants.NIIRI, "")) elif re.match(r"^/?projects/[^/]+$", command): restLog("Returing metadata ", 2, verbosity_level) match = re.match(r"^/?projects/([^/]+)$", command) id = parse.unquote(str(match.group(1))) restLog("computing metadata", 5, verbosity_level) projects = Query.GetProjectsComputedMetadata(nidm_files) for pid in projects['projects'].keys(): restLog("comparng " + str(pid) + " with " + str(id), 5, verbosity_level) restLog("comparng " + str(pid) + " with " + Constants.NIIRI + id, 5, verbosity_level) restLog("comparng " + str(pid) + " with niiri:" + id, 5, verbosity_level) if pid == id or pid == Constants.NIIRI + id or pid == "niiri:" + id: result = projects['projects'][pid] elif re.match(r"^/?projects/[^/]+/subjects/?$", command): match = re.match(r"^/?projects/([^/]+)/subjects/?$", command) project = match.group((1)) restLog( "Returning all agents matching filter '{}' for project {}".format( filter, project), 2, verbosity_level) result = Query.GetParticipantUUIDsForProject(nidm_files, project, filter, None) elif re.match(r"^/?projects/[^/]+/subjects/[^/]+/?$", command): match = re.match(r"^/?projects/([^/]+)/subjects/([^/]+)/?$", command) restLog("Returning info about subject {}".format(match.group(2)), 2, verbosity_level) result = Query.GetParticipantDetails(nidm_files, match.group(1), match.group(2)) elif re.match(r"^/?projects/[^/]+/subjects/[^/]+/instruments/?$", command): match = re.match(r"^/?projects/([^/]+)/subjects/([^/]+)", command) restLog("Returning instruments in subject {}".format(match.group(2)), 2, verbosity_level) instruments = Query.GetParticipantInstrumentData( nidm_files, match.group(1), match.group(2)) for i in instruments: result.append(i) elif re.match(r"^/?projects/[^/]+/subjects/[^/]+/instruments/[^/]+/?$", command): match = re.match( r"^/?projects/([^/]+)/subjects/([^/]+)/instruments/([^/]+)", command) restLog( "Returning instrument {} in subject {}".format( match.group(3), match.group(2)), 2, verbosity_level) instruments = Query.GetParticipantInstrumentData( nidm_files, match.group(1), match.group(2)) result = instruments[match.group(3)] elif re.match(r"^/?projects/[^/]+/subjects/[^/]+/derivatives/?$", command): match = re.match(r"^/?projects/([^/]+)/subjects/([^/]+)", command) restLog("Returning derivatives in subject {}".format(match.group(2)), 2, verbosity_level) derivatives = Query.GetDerivativesDataForSubject( nidm_files, match.group(1), match.group(2)) for s in derivatives: result.append(s) elif re.match(r"^/?projects/[^/]+/subjects/[^/]+/derivatives/[^/]+/?$", command): match = re.match( r"^/?projects/([^/]+)/subjects/([^/]+)/derivatives/([^/]+)", command) restLog( "Returning stat {} in subject {}".format(match.group(3), match.group(2)), 2, verbosity_level) derivatives = Query.GetDerivativesDataForSubject( nidm_files, match.group(1), match.group(2)) result = derivatives[match.group(3)] else: restLog("NO MATCH!", 2, verbosity_level) return result