Example #1
0
def getRiMappedImage(case_id, index_1, index_2):
    #if username is in session then the call is web call, so use that username
    if 'username' in session and len(session['username']) > 0:
        username = session['username']
    elif 'key' not in request.args or len(request.args['key']) == 0:
        abort(403)
        return ""
    else:
        auth_result = Auth.checkKeyValidity(request.args['key'])
        if not auth_result['valid']:
            abort(403)
            return ""
        username = auth_result['username']

    if not PatientCases.userHasAuthentication(case_id, username):
        abort(403)
        return ""

    #TODO get the ri-buffer from a controller module and send it to the Response

    #for testing only
    f = PatientCases.findImage(case_id, index_1, index_2)
    if f == None:
        abort(404)
    buffer = Conversions(f['disk_filename']).dicomToRIColoredImage()
    return Response(buffer, mimetype='image/jpeg')
Example #2
0
def analysisImage(case_id, index_1, index_2, analysis_id):
    res = AnalysisResult.find(analysis_id, case_id, index_1, index_2)
    if res == None:
        return abort(404)

    res.pop('_id', None)

    f = PatientCases.findImage(case_id, index_1, index_2)
    if f == None:
        return abort(404)

    filename = f['disk_filename']
    boxes = []
    for infected_area in res['infected_areas']:
        coordinate = infected_area['coordinate']
        tumor_size = (infected_area['box_height'], infected_area['box_width'])
        points = infected_area['points']
        rgb = (random.randint(0, 255), random.randint(0, 255),
               random.randint(0, 255))
        boxes.append((coordinate, tumor_size, rgb, [(150, 150), [150, 151]]))
    buffer = Segment(filename, boxes).drawBox()
    return Response(buffer, mimetype='image/jpeg')
Example #3
0
 def getDataSet(cls):
     mlData = AnalysisResult.getMLData()
     res = []
     for case in mlData:
         case.pop('_id')
         i = 0
         case_id = case['case_id']
         index_1 = case['index_1']
         index_2 = case['index_2']
         case.pop('case_id')
         case.pop('index_1')
         case.pop('index_2')
         image = PatientCases.findImage(case_id, index_1,
                                        index_2)['disk_filename']
         pix = Converter(DicomDecoder(UPLOAD_DIR,
                                      image)).convertToPixelList()
         for infected_area in case['infected_areas']:
             infected_area.pop('points')
             infected_area.pop('detected_result')
             infected_area['average_chemical_composition'] = infected_area[
                 'average_chemical_composition']['y']
             #infected_area['image'] = pix
             if 'actual_result' in infected_area:
                 res.append(infected_area)
Example #4
0
def analyseSingleImage(case_id, index_1, index_2):
    result = {'error': {'error': False}}
    #if username is in session then the call is web call, so use that username
    if 'username' in session and len(session['username']) > 0:
        username = session['username']
    elif 'key' not in request.args or len(request.args['key']) == 0:
        abort(403)
        return ""
    else:
        auth_result = Auth.checkKeyValidity(request.args['key'])
        if not auth_result['valid']:
            abort(403)
            return ""
        username = auth_result['username']

    if not PatientCases.userHasAuthentication(case_id, username):
        abort(403)
        return ""

    f = PatientCases.findImage(case_id, index_1, index_2)
    if f == None:
        return abort(404)

    result['error']['error'] = False

    if 're_analysis' not in request.args or request.args[
            're_analysis'] == 'false':
        analysis = AnalysisResult.findByCase(case_id, index_1, index_2)
        if analysis == None:
            flag = True
        else:
            analysis['error'] = result['error']
            analysis['analysis_image'] = BASE_URL + url_for(
                'patient_cases_api.analysisImage',
                case_id=case_id,
                index_1=index_1,
                index_2=index_2,
                analysis_id=str(analysis['_id']))

            #pop fields that are not required as response to api
            analysis_index = 0
            for infected_area in analysis['infected_areas']:
                #pop fields that are not required as response to api
                infected_area.pop('points')
                infected_area.pop('box_width')
                infected_area.pop('box_height')
                #add the update url
                infected_area['update_actual_result_url'] = BASE_URL + url_for(
                    'patient_cases_api.uploadAnlysis',
                    case_id=case_id,
                    index_1=index_1,
                    index_2=index_2,
                    analysis_id=str(analysis['_id']),
                    analysis_index=analysis_index)
                analysis_index += 1
            #pop fields that are not required as response to api
            analysis.pop('_id')
            analysis.pop('case_id')
            analysis.pop('index_1')
            analysis.pop('index_2')
            return jsonify(analysis)
    else:
        flag = True

    if flag:
        dicom = Conversions(f['disk_filename'])
        cluster = SingleClusterer(dicom)

        result['infected_areas'] = []
        infected_areas = []

        AnalysisResult.delete(case_id, index_1, index_2)

        for _disease_key in cluster.diseases.keys():
            disease_clusters = cluster.diseases_clusters[_disease_key]
            if len(disease_clusters.keys()) > 0:
                for disease_cluster_key in disease_clusters.keys():
                    c = disease_clusters[disease_cluster_key]
                    c.compute()
                    #c.searchForDiseases()
                    i_area = {}
                    i_area['detected_result'] = _disease_key
                    i_area['coordinate'] = c.p1
                    i_area['area'] = c.getTightArea()
                    i_area['tumor_width'] = c.tumorwidth
                    i_area['tumor_height'] = c.tumorheight
                    i_area['average_chemical_composition'] = {
                        'x': (0, 0.5, 0.8, 1.3, 1.4, 1.5, 1.6, 1.8, 2, 2.4,
                              2.6, 2.8, 3, 3.2, 3.4, 3.6, 3.7, 3.9, 4, 4.4),
                        'y':
                        c.getAverageChemicalComposition(),
                        'labels':
                        ('', '', 'LIP', '', 'LAC', '', '', '', 'NAA', 'GLM',
                         '', '', 'CR', '', 'CHO', '', 'MI', '', 'CR2', '')
                    }
                    infected_areas.append(
                        InfectedAreas((c.p1[0], c.p1[1]), c.getWidth(),
                                      c.getHeight(), c.tumorwidth,
                                      c.tumorheight,
                                      i_area['average_chemical_composition'],
                                      c.getArea(), _disease_key, c.elements))

                    result['infected_areas'].append(i_area)

                #result['diseases'].append(disease)

        if len(infected_areas) != 0:
            analysisResult = AnalysisResult(case_id, index_1, index_2,
                                            infected_areas)
            analysis_id = analysisResult.save()
            result['analysis_image'] = BASE_URL + url_for(
                'patient_cases_api.analysisImage',
                case_id=case_id,
                index_1=index_1,
                index_2=index_2,
                analysis_id=analysis_id)

    analysis_index = 0
    for infected_area in result['infected_areas']:
        infected_area['update_actual_result_url'] = BASE_URL + url_for(
            'patient_cases_api.uploadAnlysis',
            case_id=case_id,
            index_1=index_1,
            index_2=index_2,
            analysis_id=analysis_id,
            analysis_index=analysis_index)
        analysis_index += 1

    return jsonify(result)