搜索
查看: 3152|回复: 1

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

[复制链接]

2

主题

15

帖子

725

积分

高级会员

Rank: 4

积分
725
发表于 2018-6-26 09:17:46 | 显示全部楼层 |阅读模式
本帖最后由 海底钢琴 于 2020-4-12 13:44 编辑

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

发现问题:

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

分析问题:

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

QQ图片20180623181735.png

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

QQ截图20180623182853.png
QQ截图20180623183338.png

解决问题:

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

修改前:

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

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

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

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

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

  36.     return file_value, file_number
  37. #根据LMD文件,提取WSP文件的Keyword,替换数据后将将新的内容替换到旧的内容中。
  38. def tansfor(file_value, wps):
  39.     n = 0
  40.     total_file = re.findall(r'<Keyword name="\$FIL"  value=".*?" />',wps,re.S)
  41.     total_number = len(total_file)
  42.     for key, item in file_value.items():
  43.         keyword = re.compile(r'<Keyword name="\$FIL"  value="%s" />.*?<Keyword name="\$P8S"  value="" />' % (key), re.S)
  44.         #print(key)
  45.         #print(keyword.findall(wps))
  46.         print(item)
  47.         old_value = list(keyword.findall(wps))[0]
  48.         print("value length:%d"%len(old_value))#避免部分参数缺失,查找范围过度。
  49.         #print(old_value)
  50.         new_value = copy.deepcopy(old_value)
  51.         for ps, value in item.items():
  52.             sub_value = '<Keyword name="%s"  value="%s" />' % (ps, value)
  53.             value_find = re.compile(r'<Keyword name="\%s"  value=".*?" />' % (ps), re.S)
  54.             new_value = value_find.sub(sub_value, new_value)
  55.         print(new_value)
  56.         print("*"*70)
  57.         wps = wps.replace(old_value, new_value,1)
  58.         n +=1
  59.     # else:
  60.     #    print(wps)
  61.     return wps,n,total_number
  62. #将修改后的内容,以二进制格式写入文件内。
  63. def write():
  64.     file_name = glob.glob("*.LMD")[0]
  65.     file_name = file_name.split(" ")[0]
  66.     file_value,file_number = get_LMD_file_value()
  67.     print("total *.LMD file %d"%file_number)
  68.     wps = get_WSP_data()
  69.     #print(wps)
  70.     transform_wps,n,total_number = tansfor(file_value, wps)
  71.     print("There are %d files in the *.wsp document"%total_number)
  72.     print("total *.LMD files is %d"%file_number)
  73.     print("change %d files value"%n)
  74.     with open(file_name+"_tansform"+".wsp","wb") as f:
  75.         f.write(transform_wps.encode())
  76.         print("转换成功")

  77. if __name__ == "__main__":
  78.     write()
复制代码





回复

使用道具 举报

2

主题

15

帖子

725

积分

高级会员

Rank: 4

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2020-8-15 21:04 , Processed in 0.026137 second(s), 31 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.