搜索
查看: 1952|回复: 1

Python3解决FlowJo软件识别LMD文件出现的问题

[复制链接]

2

主题

14

帖子

579

积分

高级会员

Rank: 4

积分
579
发表于 2018-6-26 09:17:46 | 显示全部楼层 |阅读模式
本帖最后由 海底钢琴 于 2018-6-27 23:20 编辑

本文已在微信公众号发布,特再次分享给大家。

发现问题:

有一批流式数据需要分析,数据是贝克曼流式细胞仪产生的.LMD文件。打算使用比较流行的分析软FlowJo_V10分析。但是在使用过程,发现FlowJo软件不能提取LMD文件中抗体使用的参数,只能手动输入每一个通道的抗体。

分析问题:

先使用记事本打开LMD文件,文件开头就记录了本次实验的相关参数。抗体的使用也在其中。以类似 “&P3S\CD146-FITC\&P3R\1024\&P3B\16\”的规则记录,每一个参数以"&"开头“\”作为分隔符,CD146-FITC就是标记的抗体。

使用FlowJo软打开LMD文件后,相关参数为空。将工作台保存生成一个.WSP文件,数据是以XML格式保存。以浏览器查看WSP文件,找到类似P3S这样的参数确实为空。这可能是FlowJo软件在兼容不同流式数据时的一个Bug。


解决问题:

既然是部分参数不能提取,我们可以手动提取LMD文件中的信息,补充到FlowJo软件工作台的文件WSP中。使用正则表达式就可以完成文件内容提取、替换操作。使用Python内置xml模块修改XML可能更好。

修改前:

修改后:
python3的代码如下
[Python] 纯文本查看 复制代码
'''
使用Flowjo流式软件打开贝克曼流式数据.LMD文件,发现参数提取不完整P3S、P4S等参数为空。
此脚本应将.LMD文件、Flowjo软件保存工作台后生成的.WSP文件以及Python脚本文件放在一个文件夹内。
本地运行LMD2WSP.py文件,生成一个新的transform.WSP文件。Flowjo软件使用新生成的.WSP文件,
就可以显示完整参数。
'''
__date__ = '2018-06-22'
import re,glob,copy,os

print(os.getcwd())
#获取FlowJO软件生成的WSP文件的所有内容。
def get_WSP_data():
    with open(glob.glob("*.wsp")[0], "rb") as f:
        wps = f.read().decode()
    return wps
#提取原始数据.LMD文件中的参数
def get_LMD_file_value():
    file_LMD = glob.glob("*.LMD")
    file_number = len(file_LMD)
    file_value = dict()#收集结果
    value_re = re.compile(r"\\\$P[0-9]S\\.*?\\|\\\$FIL\\.*?\\", re.I)#提取所有参数以及参数值。
    #file_name = re.compile(r"\\\$FIL\\.*?\\", re.I)#提取所有参数以及参数值。

    def split(str):
        str_split = re.split(r"\\", str)
        str_split = str_split[1:3]
        return tuple(str_split)

    for file1 in file_LMD:
        with open(file1, "rb") as f:
            file_line = f.readline()
        file_line1 = file_line.decode("utf-8", errors="ignore")#ignore参数避免特殊字符转换失败报错
        value_finded = value_re.findall(file_line1)

        #将参数以及参数值放入字典中。
        value_split = [split(x) for x in value_finded]
        #file_name_split = [split(x) for x in file]
        value_dict = dict(value_split)
        file_value[value_dict["$FIL"]] = value_dict

    return file_value, file_number
#根据LMD文件,提取WSP文件的Keyword,替换数据后将将新的内容替换到旧的内容中。
def tansfor(file_value, wps):
    n = 0
    total_file = re.findall(r'<Keyword name="\$FIL"  value=".*?" />',wps,re.S)
    total_number = len(total_file)
    for key, item in file_value.items():
        keyword = re.compile(r'<Keyword name="\$FIL"  value="%s" />.*?<Keyword name="\$P8S"  value="" />' % (key), re.S)
        #print(key)
        #print(keyword.findall(wps))
        print(item)
        old_value = list(keyword.findall(wps))[0]
        print("value length:%d"%len(old_value))#避免部分参数缺失,查找范围过度。
        #print(old_value)
        new_value = copy.deepcopy(old_value)
        for ps, value in item.items():
            sub_value = '<Keyword name="%s"  value="%s" />' % (ps, value)
            value_find = re.compile(r'<Keyword name="\%s"  value=".*?" />' % (ps), re.S)
            new_value = value_find.sub(sub_value, new_value)
        print(new_value)
        print("*"*70)
        wps = wps.replace(old_value, new_value,1)
        n +=1
    # else:
    #    print(wps)
    return wps,n,total_number
#将修改后的内容,以二进制格式写入文件内。
def write():
    file_name = glob.glob("*.LMD")[0]
    file_name = file_name.split(" ")[0]
    file_value,file_number = get_LMD_file_value()
    print("total *.LMD file %d"%file_number)
    wps = get_WSP_data()
    #print(wps)
    transform_wps,n,total_number = tansfor(file_value, wps)
    print("There are %d files in the *.wsp document"%total_number)
    print("total *.LMD files is %d"%file_number)
    print("change %d files value"%n)
    with open(file_name+"_tansform"+".wsp","wb") as f:
        f.write(transform_wps.encode())
        print("转换成功")

if __name__ == "__main__":
    write()






本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x



上一篇:安装完miniconda报错
下一篇:医世象 华人之光 张泽民:T细胞图谱第一人!
回复

使用道具 举报

2

主题

14

帖子

579

积分

高级会员

Rank: 4

积分
579
 楼主| 发表于 2019-1-26 17:24:58 | 显示全部楼层
这个bug只出现在Flowjo v10.0.7版本中,其他版本就这个没有问题。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|生信技能树 ( 粤ICP备15016384号  

GMT+8, 2019-9-22 06:22 , Processed in 0.061987 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.