Example #1
0
def get_custom_data():
    from subprocess import Popen, PIPE, STDOUT
    if not auth.user :
        res = {"redirect" : URL('default', 'user', args='login', scheme=True, host=True)} #TODO _next
        return gluon.contrib.simplejson.dumps(res, separators=(',',':'))

    error = ""

    samples = []

    if not "custom" in request.vars :
        error += "no file selected, "
    else:
        samples = request.vars['custom'] if type(request.vars['custom']) is not str else [request.vars['custom']]
        if not samples:
            error += "incorrect query, need at least one sample"
        else:
            for id in samples:
                log.debug("id = '%s'" % str(id))
                sequence_file_id = db.results_file[id].sequence_file_id
                sample_set_id = db((db.sample_set_membership.sequence_file_id == sequence_file_id)
                ).select(db.sample_set_membership.sample_set_id).first().sample_set_id
                if not auth.can_view_sample_set(sample_set_id):
                    error += "you do not have permission to consult this element ("+str(sample_set_id)+")"
            
    if error == "" :
        try:
            data = custom_fuse(samples)
        except IOError, error:
            return error_message(str(error))
        
        generic_info = "Compare samples" if len(samples) > 1 else "Sample %s" % samples[0]
        data["sample_name"] = generic_info
        data["dataFileName"] = generic_info
        data["info"] = generic_info
        data["samples"]["original_names"] = []
        data["samples"]["timestamp"] = []
        data["samples"]["info"] = []
        data["samples"]["commandline"] = []
        
        for id in samples:
            sequence_file_id = db.results_file[id].sequence_file_id
            sample_set = db((db.sequence_file.id == sequence_file_id)
                            & (db.sample_set_membership.sequence_file_id == db.sequence_file.id)
                            & (db.sample_set.id == db.sample_set_membership.sample_set_id)
                            & (db.sample_set.sample_type.belongs([defs.SET_TYPE_PATIENT, defs.SET_TYPE_RUN, defs.SET_TYPE_GENERIC]))
                            ).select(db.sample_set.id, db.sample_set.sample_type).first()

            patient_run = db(db[sample_set.sample_type].sample_set_id == sample_set.id).select().first()
            config_id = db.results_file[id].config_id
            name = vidjil_utils.anon_ids([patient_run.id])[0] if sample_set.sample_type == defs.SET_TYPE_PATIENT else patient_run.name
            filename = db.sequence_file[sequence_file_id].filename
            data["samples"]["original_names"].append(name + "_" + filename)
            data["samples"]["timestamp"].append(str(db.sequence_file[sequence_file_id].sampling_date))
            data["samples"]["info"].append(db.sequence_file[sequence_file_id].info)
            data["samples"]["commandline"].append(db.config[config_id].command)

        log.info("load custom data #TODO log db")

        return gluon.contrib.simplejson.dumps(data, separators=(',',':'))
Example #2
0
    def get_names(self):
        '''Returns the names of all the sample sets.

        The function returns a dictionary whose keys are sample set
        IDs and value is the name.

        The number of queries is constant (which is true only if
        permissions have been cached: anon_ids checks for permission)
        '''

        results = {}

        for stype in self.sample_types:
            stype_ids = self.get_sample_type_ids(stype)
            if stype == defs.SET_TYPE_PATIENT:
                patient_ids = db(
                    db[stype].sample_set_id.belongs(stype_ids)).select(
                        db[stype].id, db[stype].sample_set_id)
                names = vidjil_utils.anon_ids([p.id for p in patient_ids])
                for i, p_id in enumerate(patient_ids):
                    results[p_id.sample_set_id] = names[i]
            else:
                set_names = db(
                    db[stype].sample_set_id.belongs(stype_ids)).select(
                        db[stype].sample_set_id, db[stype].name)
                for s in set_names:
                    results[s.sample_set_id] = s.name

        return results
Example #3
0
    def get_names(self):
        '''Returns the names of all the sample sets.

        The function returns a dictionary whose keys are sample set
        IDs and value is the name.

        The number of queries is constant (which is true only if
        permissions have been cached: anon_ids checks for permission)
        '''

        results = {}

        for stype in self.sample_types:
            stype_ids = self.get_sample_type_ids(stype)
            if stype == defs.SET_TYPE_PATIENT:
                patient_ids = db(db[stype].sample_set_id.belongs(stype_ids)).select(db[stype].id, db[stype].sample_set_id)
                names = vidjil_utils.anon_ids([p.id for p in patient_ids])
                for i, p_id in enumerate(patient_ids):
                    results[p_id.sample_set_id] = names[i]
            else:
                set_names = db(db[stype].sample_set_id.belongs(stype_ids)).select(db[stype].sample_set_id, db[stype].name)
                for s in set_names:
                    results[s.sample_set_id] = s.name

        return results
Example #4
0
def get_custom_data():
    from subprocess import Popen, PIPE, STDOUT
    if not auth.user :
        res = {"redirect" : URL('default', 'user', args='login', scheme=True, host=True)} #TODO _next
        return gluon.contrib.simplejson.dumps(res, separators=(',',':'))

    error = ""

    if not "custom" in request.vars :
        error += "no file selected, "
    else:
        if type(request.vars['custom']) is not list or len(request.vars['custom']) < 2:
            error += "you must select several files."
        else:
            for id in request.vars["custom"] :
                log.debug("id = '%s'" % str(id))
                sequence_file_id = db.results_file[id].sequence_file_id
                patient_id = db((db.sample_set_membership.sequence_file_id == sequence_file_id)
                            & (db.patient.sample_set_id == db.sample_set_membership.sample_set_id)
                ).select(db.patient.id).first()
                if not auth.can_view_patient(patient_id):
                    error += "you do not have permission to consult this patient ("+str(patient_id)+")"
            
    if error == "" :
        try:
            data = custom_fuse(request.vars["custom"])
        except IOError, error:
            return error_message(str(error))
        
        data["dataFileName"] = "Compare patients"
        data["info"] = "Compare patients"
        data["samples"]["original_names"] = []
        data["samples"]["timestamp"] = []
        data["samples"]["info"] = []
        data["samples"]["commandline"] = []
        
        for id in request.vars["custom"] :
            sequence_file_id = db.results_file[id].sequence_file_id
            sample_set = db((db.sequence_file.id == sequence_file_id)
                            & (db.sample_set_membership.sequence_file_id == db.sequence_file.id)
                            & (db.sample_set.id == db.sample_set_membership.sample_set_id)
                            & (db.sample_set.sample_type.belongs(['patient', 'run']))
                            ).select(db.sample_set.id, db.sample_set.sample_type).first()

            patient_run = db(db[sample_set.sample_type].sample_set_id == sample_set.id).select().first()
            config_id = db.results_file[id].config_id
            name = vidjil_utils.anon_ids(patient_run.id) if sample_set.sample_type == 'patient' else patient_run.name
            filename = db.sequence_file[sequence_file_id].filename
            data["samples"]["original_names"].append(name + "_" + filename)
            data["samples"]["timestamp"].append(str(db.sequence_file[sequence_file_id].sampling_date))
            data["samples"]["info"].append(db.sequence_file[sequence_file_id].info)
            data["samples"]["commandline"].append(db.config[config_id].command)

        return gluon.contrib.simplejson.dumps(data, separators=(',',':'))
Example #5
0
def get_data():
    from subprocess import Popen, PIPE, STDOUT
    if not auth.user :
        res = {"redirect" : URL('default', 'user', args='login', scheme=True, host=True,
                            vars=dict(_next=URL('default', 'get_data', scheme=True, host=True,
                                                vars=dict(sample_set_id = request.vars["sample_set_id"],
                                                          config =request.vars["config"]))
                                      )
                            )}
        return gluon.contrib.simplejson.dumps(res, separators=(',',':'))

    error = ""
    
    if "patient" in request.vars :
        request.vars["sample_set_id"] = db.patient[request.vars["patient"]].sample_set_id

    download = False
    if "filename" in request.vars:
        download = True

    if "run" in request.vars :
        request.vars["sample_set_id"] = db.run[request.vars["run"]].sample_set_id
    
    if not "sample_set_id" in request.vars or request.vars['sample_set_id'] is None:
        error += "id sampleset file needed, "
    else : 
        if not auth.can_view_sample_set(request.vars["sample_set_id"]):
            error += "you do not have permission to consult this sample_set ("+str(request.vars["sample_set_id"])+")"
    if not "config" in request.vars:
        error += "id config needed, "


    sample_set = db.sample_set[request.vars["sample_set_id"]]
    
    query = db( ( db.fused_file.sample_set_id == request.vars["sample_set_id"])
               & ( db.fused_file.config_id == request.vars["config"] )
               ).select(db.fused_file.ALL).first()
    if query is not None:
        fused_file = defs.DIR_RESULTS+'/'+query.fused_file
        sequence_file_list = query.sequence_file_list

    if not 'fused_file' in locals():
        error += "file not found"

    if error == "" :

        f = open(fused_file, "r")
        data = gluon.contrib.simplejson.loads(f.read())
        f.close()
        
        patient_name = ""
        run_name = ""
        config_name = db.config[request.vars["config"]].name
        command = db.config[request.vars["config"]].command

        log_reference_id = request.vars["sample_set_id"]

        if (sample_set.sample_type == defs.SET_TYPE_GENERIC) :
            for row in db( db.generic.sample_set_id == request.vars["sample_set_id"] ).select() :
                log_reference_id = row.id
                generic_name = db.generic[row.id].name
                data["dataFileName"] = generic_name + " (" + config_name + ")"
                data["info"] = db.generic[row.id].info
                data["generic_id"] = row.id
                data["sample_name"] = generic_name
                data["group_id"] = get_set_group(row.sample_set_id)

        if (sample_set.sample_type == defs.SET_TYPE_PATIENT):
            for row in db( db.patient.sample_set_id == request.vars["sample_set_id"] ).select() :
                log_reference_id = row.id
                patient_name = vidjil_utils.anon_ids([row.id])[0]
                data["dataFileName"] = patient_name + " (" + config_name + ")"
                data["info"] = db.patient[row.id].info
                data["patient_id"] = row.id
                data["sample_name"] = patient_name
                data["group_id"] = get_set_group(row.sample_set_id)

        if (sample_set.sample_type == defs.SET_TYPE_RUN) :
            for row in db( db.run.sample_set_id == request.vars["sample_set_id"] ).select() :
                log_reference_id = row.id
                run_name = db.run[row.id].name
                data["dataFileName"] = run_name + " (" + config_name + ")"
                data["info"] = db.run[row.id].info
                data["run_id"] = row.id
                data["sample_name"] = run_name
                data["group_id"] = get_set_group(row.sample_set_id)

        log_query = db(  ( db.user_log.record_id == log_reference_id )
                       & ( db.user_log.table_name == sample_set.sample_type )
                      ).select(db.user_log.ALL, orderby=db.user_log.created)

        data["logs"] = []
        for row in log_query:
            data["logs"].append({'message': row.msg, 'created': str(row.created)})

        ## récupération des infos stockées sur la base de données
        query = db(  ( db.sample_set.id == request.vars["sample_set_id"] )
                   & ( db.sample_set.id == db.sample_set_membership.sample_set_id )
                   & ( db.sequence_file.id == db.sample_set_membership.sequence_file_id)
                   & ( db.results_file.sequence_file_id == db.sequence_file.id )
                   & ( db.results_file.config_id == request.vars["config"]  )
                   ).select(db.sequence_file.ALL,db.results_file.ALL, db.sample_set.id, orderby=db.sequence_file.id|~db.results_file.run_date)

        query2 = {}
        sequence_file_id = 0
        for row in query : 
            if row.sequence_file.id != sequence_file_id :
                query2[row.sequence_file.data_file]=row
                sequence_file_id = row.sequence_file.id
        
        data["sample_set_id"] = sample_set.id

        data["config_name"] = config_name
        data["samples"]["info"] = []
        data["samples"]["timestamp"] = []
        data["samples"]["sequence_file_id"] = []
        data["samples"]["results_file_id"] = []
        data["samples"]["config_id"] = []
        data["samples"]["names"] = []
        data["samples"]["db_key"] = []
        data["samples"]["id"] = []
        data["samples"]["patient_id"] = []
        data["samples"]["sample_name"] = []
        data["samples"]["run_id"] = []
        for i in range(len(data["samples"]["original_names"])) :
            o_n = data["samples"]["original_names"][i].split('/')[-1]
            data["samples"]["original_names"][i] = data["samples"]["original_names"][i].split('/')[-1]
            data["samples"]["config_id"].append(request.vars['config'])
            data["samples"]["db_key"].append('')
            data["samples"]["commandline"].append(command)
            if o_n in query2:
                row = query2[o_n]
                data["samples"]["info"].append(row.sequence_file.info)
                data["samples"]["timestamp"].append(str(row.sequence_file.sampling_date))
                data["samples"]["sequence_file_id"].append(row.sequence_file.id)
                data["samples"]["results_file_id"].append(row.results_file.id)
                data["samples"]["names"].append(row.sequence_file.filename.split('.')[0])
                data["samples"]["id"].append(row.sequence_file.id)
                data["samples"]["patient_id"].append(get_patient_id(row.sequence_file.id))
                data["samples"]["sample_name"].append(row.sequence_file.id)
                data["samples"]["run_id"].append(row.sequence_file.id)
            else :
                data["samples"]["info"].append("this file has been deleted from the database, info relative to this sample are no longer available")
                data["samples"]["timestamp"].append("None")
                data["samples"]["sequence_file_id"].append("")
                data["samples"]["results_file_id"].append("")
                data["samples"]["names"].append("deleted")
                data["samples"]["id"].append("")

        log.debug("get_data (%s) c%s -> %s (%s)" % (request.vars["sample_set_id"], request.vars["config"], fused_file, "downloaded" if download else "streamed"))
        log.info("load sample", extra={'user_id': auth.user.id, 'record_id': request.vars['sample_set_id'], 'table_name': 'sample_set'})

        dumped_json = gluon.contrib.simplejson.dumps(data, separators=(',',':'))

        if download:
             return response.stream(StringIO.StringIO(dumped_json), attachment = True, filename = request.vars['filename'])

        return dumped_json
    else :
        res = {"success" : "false",
               "message" : "get_data (%s) c%s : %s " % (request.vars["sample_set_id"], request.vars["config"], error)}
        log.error(res)
        return gluon.contrib.simplejson.dumps(res, separators=(',',':'))
Example #6
0
def get_data():
    from subprocess import Popen, PIPE, STDOUT
    if not auth.user :
        res = {"redirect" : URL('default', 'user', args='login', scheme=True, host=True,
                            vars=dict(_next=URL('default', 'get_data', scheme=True, host=True,
                                                vars=dict(sample_set_id = request.vars["sample_set_id"],
                                                          config =request.vars["config"]))
                                      )
                            )}
        return gluon.contrib.simplejson.dumps(res, separators=(',',':'))

    error = ""
    
    if "patient" in request.vars :
        request.vars["sample_set_id"] = db.patient[request.vars["patient"]].sample_set_id

    download = False
    if "filename" in request.vars:
        download = True

    if "run" in request.vars :
        request.vars["sample_set_id"] = db.run[request.vars["run"]].sample_set_id
    
    if not "sample_set_id" in request.vars or request.vars['sample_set_id'] is None:
        error += "id sampleset file needed, "
    else : 
        if not auth.can_view_sample_set(request.vars["sample_set_id"]):
            error += "you do not have permission to consult this sample_set ("+str(request.vars["sample_set_id"])+")"
    if not "config" in request.vars:
        error += "id config needed, "


    sample_set = db.sample_set[request.vars["sample_set_id"]]
    
    query = db( ( db.fused_file.sample_set_id == request.vars["sample_set_id"])
               & ( db.fused_file.config_id == request.vars["config"] )
               ).select(db.fused_file.ALL).first()
    if query is not None:
        fused_file = defs.DIR_RESULTS+'/'+query.fused_file
        sequence_file_list = query.sequence_file_list

    if not 'fused_file' in locals():
        error += "file not found"

    if error == "" :

        f = open(fused_file, "r")
        data = gluon.contrib.simplejson.loads(f.read())
        f.close()
        
        patient_name = ""
        run_name = ""
        config_name = db.config[request.vars["config"]].name
        command = db.config[request.vars["config"]].command

        log_reference_id = request.vars["sample_set_id"]

        if (sample_set.sample_type == defs.SET_TYPE_GENERIC) :
            for row in db( db.generic.sample_set_id == request.vars["sample_set_id"] ).select() :
                log_reference_id = row.id
                generic_name = db.generic[row.id].name
                data["dataFileName"] = generic_name + " (" + config_name + ")"
                data["info"] = db.generic[row.id].info
                data["generic_id"] = row.id
                data["sample_name"] = generic_name
                data["group_id"] = get_set_group(row.sample_set_id)

        if (sample_set.sample_type == defs.SET_TYPE_PATIENT):
            for row in db( db.patient.sample_set_id == request.vars["sample_set_id"] ).select() :
                log_reference_id = row.id
                patient_name = vidjil_utils.anon_ids([row.id])[0]
                data["dataFileName"] = patient_name + " (" + config_name + ")"
                data["info"] = db.patient[row.id].info
                data["patient_id"] = row.id
                data["sample_name"] = patient_name
                data["group_id"] = get_set_group(row.sample_set_id)

        if (sample_set.sample_type == defs.SET_TYPE_RUN) :
            for row in db( db.run.sample_set_id == request.vars["sample_set_id"] ).select() :
                log_reference_id = row.id
                run_name = db.run[row.id].name
                data["dataFileName"] = run_name + " (" + config_name + ")"
                data["info"] = db.run[row.id].info
                data["run_id"] = row.id
                data["sample_name"] = run_name
                data["group_id"] = get_set_group(row.sample_set_id)

        log_query = db(  ( db.user_log.record_id == log_reference_id )
                       & ( db.user_log.table_name == sample_set.sample_type )
                      ).select(db.user_log.ALL, orderby=db.user_log.created)

        data["logs"] = []
        for row in log_query:
            data["logs"].append({'message': row.msg, 'created': str(row.created)})

        ## récupération des infos stockées sur la base de données
        query = db(  ( db.sample_set.id == request.vars["sample_set_id"] )
                   & ( db.sample_set.id == db.sample_set_membership.sample_set_id )
                   & ( db.sequence_file.id == db.sample_set_membership.sequence_file_id)
                   & ( db.results_file.sequence_file_id == db.sequence_file.id )
                   & ( db.results_file.config_id == request.vars["config"]  )
                   ).select(db.sequence_file.ALL,db.results_file.ALL, db.sample_set.id, orderby=db.sequence_file.id|~db.results_file.run_date)

        query2 = {}
        sequence_file_id = 0
        for row in query : 
            if row.sequence_file.id != sequence_file_id :
                query2[row.sequence_file.data_file]=row
                sequence_file_id = row.sequence_file.id
        
        data["sample_set_id"] = sample_set.id

        data["config_name"] = config_name
        data["samples"]["info"] = []
        data["samples"]["timestamp"] = []
        data["samples"]["sequence_file_id"] = []
        data["samples"]["results_file_id"] = []
        data["samples"]["config_id"] = []
        data["samples"]["names"] = []
        data["samples"]["db_key"] = []
        data["samples"]["id"] = []
        data["samples"]["patient_id"] = []
        data["samples"]["sample_name"] = []
        data["samples"]["run_id"] = []
        for i in range(len(data["samples"]["original_names"])) :
            o_n = data["samples"]["original_names"][i].split('/')[-1]
            data["samples"]["original_names"][i] = data["samples"]["original_names"][i].split('/')[-1]
            data["samples"]["config_id"].append(request.vars['config'])
            data["samples"]["db_key"].append('')
            data["samples"]["commandline"].append(command)
            if o_n in query2:
                row = query2[o_n]
                data["samples"]["info"].append(row.sequence_file.info)
                data["samples"]["timestamp"].append(str(row.sequence_file.sampling_date))
                data["samples"]["sequence_file_id"].append(row.sequence_file.id)
                data["samples"]["results_file_id"].append(row.results_file.id)
                data["samples"]["names"].append(row.sequence_file.filename.split('.')[0])
                data["samples"]["id"].append(row.sequence_file.id)
                data["samples"]["patient_id"].append(get_patient_id(row.sequence_file.id))
                data["samples"]["sample_name"].append(row.sequence_file.id)
                data["samples"]["run_id"].append(row.sequence_file.id)
            else :
                data["samples"]["info"].append("this file has been deleted from the database, info relative to this sample are no longer available")
                data["samples"]["timestamp"].append("None")
                data["samples"]["sequence_file_id"].append("")
                data["samples"]["results_file_id"].append("")
                data["samples"]["names"].append("deleted")
                data["samples"]["id"].append("")

        log.debug("get_data (%s) c%s -> %s (%s)" % (request.vars["sample_set_id"], request.vars["config"], fused_file, "downloaded" if download else "streamed"))
        log.info("load sample", extra={'user_id': auth.user.id, 'record_id': request.vars['sample_set_id'], 'table_name': 'sample_set'})

        dumped_json = gluon.contrib.simplejson.dumps(data, separators=(',',':'))

        if download:
             return response.stream(StringIO.StringIO(dumped_json), attachment = True, filename = request.vars['filename'])

        return dumped_json
    else :
        res = {"success" : "false",
               "message" : "get_data (%s) c%s : %s " % (request.vars["sample_set_id"], request.vars["config"], error)}
        log.error(res)
        return gluon.contrib.simplejson.dumps(res, separators=(',',':'))
Example #7
0
def get_custom_data():
    from subprocess import Popen, PIPE, STDOUT
    if not auth.user:
        res = {
            "redirect":
            URL('default', 'user', args='login', scheme=True, host=True)
        }  #TODO _next
        return gluon.contrib.simplejson.dumps(res, separators=(',', ':'))

    error = ""

    if not "custom" in request.vars:
        error += "no file selected, "
    else:
        if type(request.vars['custom']) is not list or len(
                request.vars['custom']) < 2:
            error += "you must select several files."
        else:
            for id in request.vars["custom"]:
                log.debug("id = '%s'" % str(id))
                sequence_file_id = db.results_file[id].sequence_file_id
                patient_id = db(
                    (db.sample_set_membership.sequence_file_id ==
                     sequence_file_id)
                    & (db.patient.sample_set_id ==
                       db.sample_set_membership.sample_set_id)).select(
                           db.patient.id).first()
                if not auth.can_view_patient(patient_id):
                    error += "you do not have permission to consult this patient (" + str(
                        patient_id) + ")"

    if error == "":
        try:
            data = custom_fuse(request.vars["custom"])
        except IOError, error:
            return error_message(str(error))

        generic_info = "Compare sample sets"
        data["sample_name"] = generic_info
        data["dataFileName"] = generic_info
        data["info"] = generic_info
        data["samples"]["original_names"] = []
        data["samples"]["timestamp"] = []
        data["samples"]["info"] = []
        data["samples"]["commandline"] = []

        for id in request.vars["custom"]:
            sequence_file_id = db.results_file[id].sequence_file_id
            sample_set = db(
                (db.sequence_file.id == sequence_file_id)
                & (db.sample_set_membership.sequence_file_id ==
                   db.sequence_file.id)
                & (db.sample_set.id == db.sample_set_membership.sample_set_id)
                & (db.sample_set.sample_type.belongs(['patient', 'run']))
            ).select(db.sample_set.id, db.sample_set.sample_type).first()

            patient_run = db(db[sample_set.sample_type].sample_set_id ==
                             sample_set.id).select().first()
            config_id = db.results_file[id].config_id
            name = vidjil_utils.anon_ids(
                patient_run.id
            ) if sample_set.sample_type == 'patient' else patient_run.name
            filename = db.sequence_file[sequence_file_id].filename
            data["samples"]["original_names"].append(name + "_" + filename)
            data["samples"]["timestamp"].append(
                str(db.sequence_file[sequence_file_id].sampling_date))
            data["samples"]["info"].append(
                db.sequence_file[sequence_file_id].info)
            data["samples"]["commandline"].append(db.config[config_id].command)

        return gluon.contrib.simplejson.dumps(data, separators=(',', ':'))