# -*- coding: utf-8 -*- """ Created on Wed Sep 11 11:57:30 2024 永辉现场试验输出数据的 1:1 性能评估 适用于202410前数据保存版本的,需调用 OneToOneCompare.txt @author: ym """ import os import numpy as np import matplotlib.pyplot as plt def read_one2one_data(filepath): simiList = [] with open(filepath, 'r', encoding='utf-8') as f: lines = f.readlines() split_flag = False simi_dict = {} for i, line in enumerate(lines): line = line.strip() if not line: if len(simi_dict): simiList.append(simi_dict) simi_dict = {} continue label = line.split(':')[0].strip() value = line.split(':')[1].strip() if label.find("SeqDir") >= 0: simi_dict["SeqDir"] = value if label.isdigit() and len(label) >= 8: simi_max, simi_min = value.strip(',').split('.') simi_dict["barcode"] = label simi_dict["simi_max"] = float(simi_max) / 1000 simi_dict["simi_min"] = float(simi_min) / 1000 if len(simi_dict): simiList.append(simi_dict) return simiList def plot_pr_curve(matrix): simimax, simimean = [], [] need_analysis = [] for simidict in matrix: simimax.append(simidict["simi_max"]) simimean.append(simidict["simi_min"]) if simidict["simi_max"]>0.6: need_analysis.append(simidict) simimax = np.array(simimax) simimean = np.array(simimean) TPFN_max = len(simimax) TPFN_mean = len(simimean) fig, axs = plt.subplots(2, 1) axs[0].hist(simimax, bins=60, edgecolor='black') axs[0].set_xlim([-0.2, 1]) axs[0].set_title(f'Same Barcode, Num: {TPFN_max}') axs[1].hist(simimean, bins=60, edgecolor='black') axs[1].set_xlim([-0.2, 1]) axs[1].set_title(f'Cross Barcode, Num: {TPFN_mean}') # plt.savefig(f'./result/{file}_hist.png') # svg, png, pdf Recall_Neg = [] Thresh = np.linspace(-0.2, 1, 100) for th in Thresh: TN = np.sum(simimax < th) Recall_Neg.append(TN/TPFN_max) fig, ax = plt.subplots() ax.plot(Thresh, Recall_Neg, 'b', label='Recall_Pos: TP/TPFN') ax.set_xlim([0, 1]) ax.set_ylim([0, 1]) ax.grid(True) ax.set_title('Positive recall') ax.set_xlabel(f"Num: {TPFN_max}") ax.legend() plt.show() # plt.savefig(f'./result/{file}_pr.png') # svg, png, pdf print("Have done!") pass def main(): filepaths = [r"\\192.168.1.28\share\测试_202406\0913_扫A放B\0913_1\OneToOneCompare.txt", r"\\192.168.1.28\share\测试_202406\0913_扫A放B\0913_2\OneToOneCompare.txt", r"\\192.168.1.28\share\测试_202406\0914_扫A放B\0914_1\OneToOneCompare.txt", r"\\192.168.1.28\share\测试_202406\0914_扫A放B\0914_2\OneToOneCompare.txt" ] simiList = [] for fp in filepaths: slist = read_one2one_data(fp) simiList.extend(slist) plot_pr_curve(simiList) if __name__ == "__main__": main()