def __init__(self,
                 MAX_PARA_CORE=6,
                 SaveTrainingSampleFolder=None,
                 allowed_label_list=None,
                 random_relation_path=None):
        # only test on areas with expert labels
        self.TestRange = 'Partial'  # or 'All'
        # Parallel
        self.QTloader = QTdb.QTloader()
        self.mdl = None
        self.MAX_PARA_CORE = MAX_PARA_CORE
        # maximum samples for bucket testing
        self.MaxTestSample = 200
        # save training samples folder
        if SaveTrainingSampleFolder is None:
            ResultFolder = projhomepath
            ResultFolder_conf = conf['ResultFolder_Relative']
            for folder in ResultFolder_conf:
                ResultFolder = os.path.join(ResultFolder, folder)
            self.SaveTrainingSampleFolder = ResultFolder
        else:
            self.SaveTrainingSampleFolder = SaveTrainingSampleFolder

        # Allowed positive labels
        if allowed_label_list is None:
            allowed_label_list = [
                'T', 'Tonset', 'Toffset', 'R', 'Ronset', 'Roffset', 'P',
                'Ponset', 'Poffset'
            ]
        self.allowed_label_list = allowed_label_list
        self.random_relation_path = random_relation_path
Beispiel #2
0
def checkWT():
    sel1213 = conf['sel1213']
    QTloader = QTdb.QTloader()
    wtfobj = wtf.WTfeature()

    for recname in sel1213:
        sig = QTloader.load(recname)
        wtfobj.plot_wtcoefs(\
                sig['sig'],\
                waveletobj = wtfobj.gswt_wavelet(),\
                figureID = 2)
    def __init__(self,fResultList):
        # result list:
        # ((recname,record result)...)
        # 
        # record result:
        # ((pos,label)...)

        self.fResultList = fResultList
        self.QTloader = QTdb.QTloader()
        self.pErr = None
        self.pFN = None
        self.pFP = None
Beispiel #4
0
    def result_refiner(Reslist):
        #
        # Multiple prediction point -> single point output
        ## filter output for evaluation results
        #
        # parameters
        #
        #
        # the number of the group must be greater than:
        #
        group_min_thres = 1
        QTloader = QTdb.QTloader()

        fRes = []
        for recname,recres in Reslist:
            sig = QTloader.load(recname)
            posgroup_withAmp = []
            # in var
            prev_label = None
            posGroup = []
            #----------------------
            # [pos,label] in recres
            #----------------------
            for pos,label in recres:
                if prev_label is not None:
                    if label != prev_label:
                        posgroup_withAmp.append((prev_label,posGroup))
                        posGroup = []
                    
                prev_label = label
                posGroup.append((pos,sig['sig'][pos]))
            
            # last one
            if len(posGroup)>0:
                posgroup_withAmp.append((prev_label,posGroup))
            # ======================
            # [(label,posGroup),...]
            # ======================
            posgroup_withAmp = [x for x in posgroup_withAmp if len(x[1]) > group_min_thres]
            # ----------------------
            # earth line algorithm
            # ----------------------
            fposGroup= map(ECGrf.Group_Horizon,posgroup_withAmp)

            # mean position 
            fposGroup = [(int(np.mean(x[1])),x[0]) for x in fposGroup ]
            fRes.append((recname,fposGroup ))
                
        return fRes
    def CollectRecFeature(self, recname):
        log.info('Collecting feature for %s', recname)

        # Load signal.
        QTloader = QTdb.QTloader()
        sig = QTloader.load(recname)
        if valid_signal_value(sig['sig']) == False:
            return [[], []]
        tX, ty = ECGrf.collectfeaturesforsig(
            sig,
            SaveTrainingSampleFolder=self.SaveTrainingSampleFolder,
            blankrangelist=None,
            recID=recname,
            allowed_label_list=self.allowed_label_list,
            random_relation_path=self.random_relation_path)
        return (tX, ty)
Beispiel #6
0
def disp_rec(recname = 'sel103'):
    QTloader = QTdb.QTloader()
    sig = QTloader.load(recname)
    pdb.set_trace()

    plt.figure(1)
    #plt.subplot(211)
    #mark_ind = [sig['time'][x] for x in sig['marks']['T']]
    #mark_amp= [sig['sig'][x] for x in sig['marks']['T']]

    plt.plot(sig['sig'],'g')
    plt.plot(sig['sig2'],'r')
    #plt.plot(sig['time'],sig['sig'],'g')
    #plt.plot(sig['time'],sig['sig2'],'r')
    plt.title('QT rec: '+recname)
    #plt.xlim(mark_ind[0],mark_ind[-1])
    plt.show()
Beispiel #7
0
def disp_recID(recID = 1):
    if isinstance(recID,int) == False:
        raise Exception('recID input must be integer!')
    QTloader = QTdb.QTloader()
    reclist = QTloader.getQTrecnamelist()
    sig = QTloader.load(reclist[recID])

    plt.figure(1)
    #plt.subplot(211)
    #mark_ind = [sig['time'][x] for x in sig['marks']['T']]
    #mark_amp= [sig['sig'][x] for x in sig['marks']['T']]

    plt.plot(sig['sig'],'k')
    #plt.plot(sig['time'],sig['sig'],'k',mark_ind,mark_amp,'ro')
    plt.title('ECG signal')
    #plt.xlim(mark_ind[0],mark_ind[-1])
    plt.show()
Beispiel #8
0
 def __init__(self, MAX_PARA_CORE=6, SaveTrainingSampleFolder=None):
     # only test on areas with expert labels
     self.TestRange = 'Partial'  # or 'All'
     # Parallel
     self.QTloader = QTdb.QTloader()
     self.mdl = None
     self.MAX_PARA_CORE = MAX_PARA_CORE
     # maximum samples for bucket testing
     self.MaxTestSample = 200
     # Save training samples folder.
     if SaveTrainingSampleFolder is None:
         ResultFolder = projhomepath
         ResultFolder_conf = conf['ResultFolder_Relative']
         for folder in ResultFolder_conf:
             ResultFolder = os.path.join(ResultFolder, folder)
         self.SaveTrainingSampleFolder = ResultFolder
     else:
         self.SaveTrainingSampleFolder = SaveTrainingSampleFolder
Beispiel #9
0
def Parallel_CollectRecFeature(recname):
    print 'Parallel Collect RecFeature from {}'.format(recname)
    # load blank area list
    blkArea = conf['labelblankrange']
    ## debug log:
    debugLogger.dump('collecting feature for {}\n'.format(recname))
    # load sig
    QTloader = QTdb.QTloader()
    sig = QTloader.load(recname)
    if valid_signal_value(sig['sig']) == False:
        return [[],[]]
    # blank list
    blklist = None
    if recname in blkArea:
        print recname,'in blank Area list.'
        blklist = blkArea[recname]
    tX,ty = ECGrf.collectfeaturesforsig(sig,SaveTrainingSampleFolder,blankrangelist = blklist,recID = recname)
    return (tX,ty)
Beispiel #10
0
def TEST1():
    '''Test case 1.'''
    # load signal from QTdb
    loader = QTdb.QTloader()
    sig_struct = loader.load('sel100')
    sig_segment = sig_struct['sig'][100:]

    # model path
    model_path = os.path.join(projhomepath, 'result', 'swt-paper-8')
    result = Testing(sig_segment, model_path, adapt_frequency=360.0)

    # length check:
    print 'length of signal: ', len(sig_segment)
    print 'length of result: ', len(result)
    # plot result
    target_label = 'P'
    plt.figure(1)
    plt.plot(sig_segment, label='signal')
    pos_list = [x[0] for x in result if x[1] == target_label]
    amp_list = [sig_segment[x] for x in pos_list]
    plt.plot(pos_list, amp_list, 'r^', label=target_label)
    plt.legend()
    plt.show()
Beispiel #11
0
if __name__ == '__main__':

    # exit
    RFfolder = os.path.join(\
           projhomepath,\
           'TestResult',\
           'pc',\
           'r5')
    TargetRecordList = ['sel38', 'sel42', 'result_sel821', 'result_sel14046']
    # ==========================
    # plot prediction result
    # ==========================
    reslist = glob.glob(os.path.join(\
           RFfolder,'*'))
    qtdb = QTdb.QTloader()
    non_result_extensions = ['out', 'json', 'log']
    for fi, fname in enumerate(reslist):
        # block *.out
        file_extension = fname.split('.')[-1]
        if file_extension in non_result_extensions:
            continue
        print 'file name:', fname
        currecname = os.path.split(fname)[-1]
        print currecname
        #if currecname == 'result_sel820':
        #pdb.set_trace()
        if currecname not in TargetRecordList:
            pass
            #continue
        # load signal and reslist
Beispiel #12
0
    def collectfeaturesforsig(sig,SaveTrainingSampleFolder,blankrangelist = None,recID = None, training_target_labels = None):
        #
        # parameters:
        # blankrangelist : [[l,r],...]
        #
        # collect training features from sig
        #
        # init
        Extractor = extfeature.ECGfeatures(sig['sig'])
        negposlist = []
        posposlist = [] # positive position list
        labellist = [] # positive label list
        tarpos = []
        trainingX,trainingy = [],[]
        # get Expert labels
        QTloader = QTdb.QTloader()
        # =======================================================
        # modified negposlist inside function
        # =======================================================
        ExpertLabels = QTloader.getexpertlabeltuple(
                None, sigIN = sig,
                negposlist = negposlist
                )
        # Only train on target labels
        if training_target_labels is not None:
            ExpertLabels = filter(lambda x: x[1] in 
                    training_target_labels, 
                    ExpertLabels)
        if len(ExpertLabels) == 0:
            return [[],[]]
        posposlist, labellist = zip(*ExpertLabels)

        # ===============================
        # convert feature & append to X,y
        # Using Map build in function
        # ===============================
        FV = map(Extractor.frompos,posposlist)
        # append to trainging vector
        trainingX.extend(FV)
        trainingy.extend(labellist)
        
        # add neg samples
        pickneg = pickNegtiveSample()
        #negList = pickneg.getNegList4rec(recID)
        negList = pickneg.getRandomNegSamples(recID)

        # collect feature for negtive sample
        time_neg0 = time.time()
        negFv = map(Extractor.frompos,negList)
        trainingX.extend(negFv)
        trainingy.extend(['white']*len(negList))
        print '\nTime for collect negtive samples:{:.2f}s'.format(time.time() - time_neg0)
        # =========================================
        # Save sample list
        # =========================================
        ResultFolder = os.path.join(SaveTrainingSampleFolder,'TrainingSamples')
        # mkdir if not exists
        if os.path.exists(ResultFolder) == False:
            os.mkdir(ResultFolder)
        # -----
        # sample_list
        # [(pos,label),...]
        # -----
        sample_list = zip(negList,len(negList)*['white'])
        sample_list.extend(ExpertLabels)
        if recID is not None:
            # save recID sample list
            with open(os.path.join(ResultFolder,recID+'.json'),'w') as fout:
                json.dump(sample_list,fout,indent = 4,sort_keys = True)
        return (trainingX,trainingy) 
    def collectfeaturesforsig(sig,
                              SaveTrainingSampleFolder,
                              blankrangelist=None,
                              recID=None,
                              allowed_label_list=None,
                              random_relation_path=None):
        '''Label process & convert to feature.'''
        #
        # parameters:
        # blankrangelist : [[l,r],...]
        #
        # collect training features from sig
        #
        # init
        Extractor = extfeature.ECGfeatures(
            sig['sig'], random_relation_path=random_relation_path)
        negposlist = []
        posposlist = []  # positive position list
        labellist = []  # positive label list
        tarpos = []
        # Including positive samples & negtive samples.
        trainingX, trainingy = [], []
        # get Expert labels
        QTloader = QTdb.QTloader()
        # =======================================================
        # modified negposlist inside function
        # =======================================================
        ExpertLabels = QTloader.getexpertlabeltuple(None,
                                                    sigIN=sig,
                                                    negposlist=negposlist)

        # Filtering according to allowed labels
        if allowed_label_list is not None:
            allowed_expert_labels = filter(
                lambda x: x[1] in allowed_label_list, ExpertLabels)
        if len(allowed_expert_labels) == 0:
            return ([], [])
        posposlist, labellist = zip(*allowed_expert_labels)

        # ===============================
        # convert feature & append to X,y
        # Using Map build in function
        # ===============================
        FV = map(Extractor.frompos, posposlist)
        # append to trainging vector
        trainingX.extend(FV)
        trainingy.extend(labellist)

        # add neg samples
        Nneg = int(len(negposlist) * conf['negsampleratio'])

        # if Number of Neg>0 then add negtive samples
        if len(negposlist) == 0 or Nneg <= 0:
            print '[In function collect feature] Warning: negtive sample position list length is 0.'
        else:
            # collect negtive sample features
            #
            # leave blank for area without labels
            #
            negposset = set(negposlist)
            if blankrangelist is not None:
                blklist = []
                for pair in blankrangelist:
                    blklist.extend(range(pair[0], pair[1] + 1))
                blkset = set(blklist)
                negposset -= blkset

            selnegposlist = random.sample(negposset, Nneg)
            time_neg0 = time.time()
            negFv = map(Extractor.frompos, selnegposlist)
            trainingX.extend(negFv)
            trainingy.extend(['white'] * Nneg)
            print '\nTime for collect negtive samples:{:.2f}s'.format(
                time.time() - time_neg0)
        # =========================================
        # Save sample list
        # =========================================
        ResultFolder = os.path.join(SaveTrainingSampleFolder,
                                    'TrainingSamples')
        # mkdir if not exists
        if os.path.exists(ResultFolder) == False:
            os.mkdir(ResultFolder)
        # -----
        # sample_list
        # [(pos,label),...]
        # -----
        sample_list = zip(selnegposlist, len(selnegposlist) * ['white'])
        sample_list.extend(ExpertLabels)
        if recID is not None:
            # save recID sample list
            with open(os.path.join(ResultFolder, recID + '.pkl'), 'w') as fout:
                pickle.dump(sample_list, fout)
            save_mat_filename = os.path.join(ResultFolder, recID + '.mat')
            reslist_to_mat(sample_list, mat_filename=save_mat_filename)
        return (trainingX, trainingy)
Beispiel #14
0
def checkQTrec():
    sel1213 = conf['sel1213']
    QTloader = QTdb.QTloader()
    for recname in sel1213:
        QTloader.plotrec(recname)