AIGC标识 FCS文本段关键Key含义与解析说明

FCS 文件 TEXT(文本)段关键 Key 含义与解析说明

以 FCS 3.2(2020,现行版) 为主,旧版本差异集中列在第 10、12 节。
用途:写 FCS 读文件 / 导入模块时的中文速查。描述已做简化,细节以原标准为准。
文中 ♦ 代表分隔符(delimiter),实际是 TEXT 段的第一个字节。


1. 一句话理解

DATA 段里只有一串数字,没有列名、没有类型、没有长度信息。
"怎么读这串数字、每个通道是什么、样本和仪器信息"全部放在 TEXT 段的 关键字♦值♦ 键值对里。

一个数据集包含 HEADER(必选、固定在最前)、TEXT(主段必选,补充段可选)、DATA(必选)、ANALYSIS(3.0 起可选)。


2. TEXT 段怎么定位(HEADER 偏移)

HEADER 前 58 字节是固定格式,每个偏移量占 8 字节、ASCII 数字右对齐、左侧补空格:

字节位置 内容
00–05 版本标识:FCS2.0 / FCS3.0 / FCS3.1 / FCS3.2(无空格)
06–09 4 个空格
10–17 主 TEXT 段首字节偏移
18–25 主 TEXT 段末字节偏移
26–33 / 34–41 DATA 首 / 末偏移
42–49 / 50–57 ANALYSIS 首 / 末偏移(无该段时填 0 或留空格)
58– 用户自定义段偏移对(可选,可多组)

解析要点:

  • 偏移是含端点的首/末字节,段长 = 末 - 首 + 1。例:TEXT 256~1545 → 1290 字节。
  • 偏移相对当前数据集首字节,不是文件绝对位置;多数据集用 $NEXTDATA 串联(3.1 起不推荐多数据集)。
  • 超过 99,999,999 字节的段:HEADER 里对应偏移写 0,真实值只放在 TEXT 的 $BEGINDATA / $ENDDATA / $BEGINANALYSIS / $ENDANALYSIS 里。
  • 主 TEXT 必须整体落在前 99,999,999 字节内,但不要求紧跟 HEADER,也不要求在 DATA 之前。
  • HEADER 结束到下一段之间用空格(ASCII 32)填充;HEADER 内不能有回车换行。
  • 补充 TEXT 段可放在 HEADER 之后任意位置,由 $BEGINSTEXT / $ENDSTEXT 定位,且只能放可选和自定义 key,不能与主 TEXT 重复。
  • 2.0 的 ANALYSIS 段是必选段;3.0 起改为可选。

HEADER 实例(* 表示空格):

FCS3.2*********256****1545****1792**202455*******0*******0

3. TEXT 段通用解析规则(实现必读)

# 规则 简化说明
1 分隔符 TEXT 段第一个字节就是分隔符,取值 ASCII 1~126 的单字节(3.2 推荐换行 LF=10)。同一数据集的 ANALYSIS 段、补充 TEXT 段必须用同一个分隔符。
2 结构 字节流形如 ♦KEY1♦V1♦KEY2♦V2♦…。跳过首字节后,按分隔符交替读出 key、value。
3 转义 key 或 value 里出现分隔符时,必须写成两个连续分隔符,解析时还原成一个。因 key/value 不允许为空,两个连续分隔符不会出现在「值与下一个 key 之间」,所以没有歧义。
4 编码 key 用 ASCII 32~126 单字节;value 用 UTF-8(3.1/3.2)。3.0 默认 ASCII,靠 $UNICODE 指定哪些 key 用双字节码页。
5 数值 ASCII 英文数字,不带空格、不带千分位逗号,可以有前导 0;整数为十进制;浮点可带 + -、小数点或 E/e 科学计数法。字符串型 value 里可以出现中文。
6 大小写 key 不敏感($tot = $TOT,读时统一转大写);value 敏感。特例:判断时间通道的 $PnN 值建议大小写不敏感匹配 Time。
7 唯一/非空 同一数据集内 key 不得重复;key 和 value 都不能为空;任何 key 都没有默认值,缺失就是未知,不要自行猜测。
8 命名 标准 key 以 $ 开头且不得重新定义;厂商自定义 key 不得以 $ 开头,读取时忽略不认识的非 $ key。
9 禁用字符 TEXT 段内不得有 CR/LF 等不可打印字符(ASCII 0~31、127),除非它是分隔符本身或位于 value 内部。
10 带 n 的 key $PnX 的 n 从 1 连续编到 $PAR,与 DATA 段中列的顺序一一对应,不加前导零。$P 是历史命名(旧称 parameter,3.2 改称 measurement/通道)。$RnI / $RnW 的 n 是门区域号。

转义示例:

$SYS♦RSX-11♦♦M♦      → key=$SYS,        value=RSX-11♦M
Key♦♦M1♦56♦          → key=Key♦M1,      value=56

解析伪代码(不要直接 split(分隔符),会破坏转义):

delim = text[0]              # 按字节取
i = 1
while i < len(text):
    key   = read_token()     # 遇单个 delim 结束;遇 delim+delim 视为一个普通 delim 继续
    value = read_token()
    pairs[key.upper()] = utf8_decode(value)

补充提醒:按字节做状态机,UTF-8 解码放在取出 value 之后;不要把多字节字符当分隔符;复合值里逗号 , 常作字段分隔、分号 ; 用于 $RnW 顶点,而 $PnS 值内允许逗号、$PnN 值内禁止逗号。


4. 值格式记号与常用格式

记号 含义
n / n1,n2… ASCII 编码整数
f / f1,f2… ASCII 编码浮点数(支持 1.23 与 1.23E-2)
string 非空 UTF-8 字符串
c 单个字符
[…] 可选项
[REQUIRED] / [DEPRECATED] 3.2 原文标注的必选 / 弃用

时间日期:$BEGINDATETIME 等用 ISO 8601 yyyy-mm-ddThh:mm:ss[Z 或 ±hh:mm];旧 $DATE 用 dd-mmm-yyyy(月为 JAN…DEC);旧 $BTIM/$ETIM 用 hh:mm:ss[.cc](3.1 起 .cc 是 1/100 秒,3.0 是 1/60 秒);$LAST_MODIFIED 用 dd-mmm-yyyy hh:mm:ss[.cc]。


5. 必选 Key(FCS 3.2 共 12 个,缺一不可)

Key 中文含义(简化) 值 / 示例 解析方式
$BEGINDATA DATA 段首字节偏移 n,如 123456789 与 HEADER 重复;HEADER 为 0 时以此为准。$TOT=0 时该值无意义,忽略
$ENDDATA DATA 段末字节偏移 n 长度 = END - BEGIN + 1;同上
$NEXTDATA 下一数据集 HEADER 偏移 n,0 = 最后一个 相对当前数据集首字节;用于多数据集文件
$PAR 每个事件的通道(测量)数 n,如 12 决定 $P1…$Pn 组数,也决定每个事件有几列
$TOT 事件总数 n,如 1000000 可为 0(空数据集);校验 事件数 × 每事件字节数 = DATA 段长度
$DATATYPE 默认数据类型 I / F / D / A I=无符号二进制整数;F=IEEE754 单精度 32 位;D=双精度 64 位;A=ASCII 整数(3.2 弃用)。F/D 时所有 $PnB 必须为 32/64、所有 $PnE 必须为 0,0
$BYTEORD 字节序 1,2,3,4 或 4,3,2,1 小端 / 大端。3.1 起只允许这两种(3.0 还允许 3,4,1,2 等混合序)。即使位宽不是 32 位也要写
$CYT 仪器型号 string,如 FACScan 3.2 新升为必选;3.1 及以前是可选
$PnB 第 n 通道分配的位数 n,如 $P3B♦16♦ 决定读取位宽;F/D 时固定 32/64;配合 $PnR 做位掩码。3.2 起非 8 的倍数已弃用(老文件仍有位打包)
$PnR 第 n 通道数值范围 n,如 $P2R♦1024♦ I 型:通道值 0~R-1,并决定掩码(R 非 2 的幂时取下一个更高的 2 的幂算掩码)。F/D 型:只是期望范围,实际值可负、可超界,不加掩码
$PnE 放大类型(线性/对数) f1,f2,如 4,0.01 0,0=线性;f1>0=对数,f1=十进制跨度、f2=0 通道对应的线性值。二者必须同为 0 或同为正;f1,0 非法,建议按 f1,1 处理。浮点数据、时间通道强制 0,0
$PnN 第 n 通道短名 string,如 $P4N♦PE-A♦ 必须唯一、不含逗号;值为 Time 表示时间通道(读时大小写不敏感比对)

6. $Pn* 通道描述类 Key(可选,但读数据/显示时很常用)

Key 中文含义 值 / 示例 解析要点
$PnS 通道长名(常含染料/标记) string,如 CD161-PE 可含逗号、可不唯一,常用作坐标轴标签;染料建议取 ISAC Probe Tag Dictionary 的简称
$PnD 建议显示刻度 Linear,f1,f2 / Logarithmic,f1,f2 Linear:f1/f2 = 显示左右边界(刻度单位,非通道单位);Logarithmic:f1=显示十进制跨度数,f2=左边界刻度值。仅作显示默认值,软件可不采纳
$PnDATATYPE 逐通道覆盖 $DATATYPE I / F / D 3.2 新增。让 Time/Index 等整数通道在整体为浮点时仍用整数;不支持 A
$PnG 放大增益 f,如 10.0 仅整数数据可用;线性时刻度值 = 通道值 / g;不能与对数 $PnE 同用,时间/补偿通道不要给
$PnCALIBRATION 刻度值→标准单位 f1[,f2],string,如 1.234,100,MESF f1=斜率,f2=截距(3.2 新增,缺省 0),string=单位名;标定值 = 刻度值 × f1 + f2,在 $PnE/$PnG 换算之后做。3.1 只有 f,string 无截距
$PnF 滤光片 string,推荐 n1,n2 n1/n2 = 通过波长下限/上限(nm),如 515,545 即 530/30;老文件常见 530/30、520LP。补偿后通道不应给
$PnL 激发波长 n1[,n2,…],如 560,625 单位 nm;3.1 起支持多激光共用一通道。补偿后通道不应给
$PnO 激发功率 n1,如 200 单位 mW;补偿后通道不应给
$PnT 探测器型号 string,如 PMT9524 补偿后通道不应给
$PnV 探测器电压/控制量 f,如 445.5 非 PMT(如 APD)时表示其控制设定值;补偿后通道不应给
$PnDET 探测器名 string,如 FSC、FL1 3.2 新增,用于结构化区分"探测器"
$PnTAG 染料/同位素标签 string,如 AF633 3.2 新增;建议用 ISAC 词典简称;可沿用到补偿后通道
$PnANALYTE 靶标分子/过程 string,如 CD4 3.2 新增;与 $PnTAG 配套
$PnTYPE 测量类型 string 3.2 新增。推荐取值:Forward Scatter、Side Scatter、Raw Fluorescence、Unmixed Fluorescence、Mass、Time、Electronic Volume、Classification、Index
$PnFEATURE 信号特征 string 3.2 新增;适用时取 Area / Height / Width
$PnP 收集光比例(%) n1,如 50 3.2 已弃用,老文件可能仍有

3.2 引入 $PnDET/$PnTAG/$PnANALYTE/$PnTYPE/$PnFEATURE,就是为了不再靠猜 $PnN/$PnS 里混在一起的探测器、染料、靶标、信号特征。新写文件建议优先用这 5 个。


7. 段偏移 / 结构类可选 Key

Key 中文含义 解析要点
$BEGINANALYSIS / $ENDANALYSIS ANALYSIS 段首/末偏移 无该段时省略或写 0;HEADER 对应值为 0 时要靠这两个判断是否存在。3.2 起由必选降为可选
$BEGINSTEXT / $ENDSTEXT 补充 TEXT 段首/末偏移 必须写在主 TEXT 段里;无补充段时省略或写 0。3.2 起由必选降为可选
$MODE 数据模式 3.2 只允许 L(list mode),直方图模式已移除;3.2 已弃用(表 4 仍列在可选里、正文标注弃用,属于标准内部不一致,读时按"存在即 L"处理)

8. 时间 / 实验 / 样本 / 载体 / 统计类可选 Key

Key 中文含义 值 / 解析要点
$BEGINDATETIME / $ENDDATETIME 采集开始 / 结束时间 3.2 新增,ISO 8601;时区可省(本地时间)、Z(UTC)或 ±hh:mm
$DATE / $BTIM / $ETIM 旧版日期 / 开始 / 结束时刻 3.2 弃用,改用上面两个;若与新版同时存在,值应一致
$EXP 实验发起人 字符串
$OP 仪器操作员 字符串
$INST 采集机构 / 实验室 字符串
$PROJ 实验(项目)名称 字符串;3.2 明确为"实验名"
$FIL 原始文件名 字符串,可含路径
$SYS 采集用计算机与操作系统 字符串;标准里演示分隔符转义的例子就是它
$CYTSN 仪器序列号 字符串
$CELLS 被测对象(细胞/微球) 字符串,也可用于校准微球
$SRC 样本来源 字符串,可能含患者信息,读取时注意隐私合规
$SMNO 样本 / 管 / 孔编号 字符串
$COM 备注 字符串,不要拿它替代标准 key
$CARRIERID / $CARRIERTYPE / $LOCATIONID 载具 ID / 载具类型 / 样本在载具上的位置 3.2 新增,替代 $PLATEID/$PLATENAME/$WELLID;后者 3.2 弃用
$FLOWRATE 进样流速档位名 3.2 新增,字符串(如 high),不是体积/时间的实际流速
$VOL 采集消耗样本体积 浮点,单位 nL
$ORIGINALITY 数据集是否被改过 取值 Original / NonDataModified / Appended / DataModified
$LAST_MODIFIED / $LAST_MODIFIER 最后修改时间 / 修改人 注意实际 key 用下划线(标准表格里写成 $LAST MODIFIED 是排版问题);仅当 $ORIGINALITY 非 Original 时可出现
$ABRT 电子学限制丢失的事件数 整数,含义随仪器而定,需查厂商文档
$LOST 计算机忙丢失的事件数 整数,与 $ABRT 区分

9. 数据语义 / 补偿 / 触发类可选 Key

Key 中文含义 值 / 解析要点
$TR 触发通道与阈值 string,f,如 FSC-H,54.5;string 必须等于某个 $PnN 值;信号超过阈值才记录事件。3.0 用 string,n
$TIMESTEP 时间通道每单位对应秒数 浮点,如 0.01;时间通道 = $PnN 值为 Time 的通道,必须 $PnE=0,0 且不给 $PnG;实际秒数 = 通道值 × $TIMESTEP。3.2 要求有时间通道就必须给此 key
$SPILLOVER 荧光溢出(补偿)矩阵 n,名称1,…,名称n,S11,…,Snn,逗号分隔,元素总数 = 1+n+n×n;名称必须与 $PnN 完全一致;矩阵按行存放,补偿 = 原始行向量 × S⁻¹(列向量则先转置)。3.2 明确规定:含光谱数据的数据集不得使用此 key
$UNSTAINEDCENTERS 未染色对照群体的中心值向量 3.2 新增。m,名称1,…,名称m,f1,…,fm;可作为背景/自发荧光偏移,但注意它定义在原始测量空间,不能直接加到补偿结果上
$UNSTAINEDINFO 上述向量的来源与统计方式 3.2 新增,字符串说明
$GATING / $RnI / $RnW 门区域组合 / 区域对应通道 / 区域窗口 3.2 弃用。$RnI = Pi[,Pj];$RnW 一维为 下界,上界,二维为 x1,y1;x2,y2;… 多边形顶点;$GATING 用 AND/OR/NOT 与括号组合区域

10. 已弃用 / 旧版本专有 Key(读老文件时会遇到)

10.1 FCS 3.2 弃用清单

$BTIM、$DATE、$ETIM、$MODE、$GATING、$RnI、$RnW、$PnP、$PLATEID、$PLATENAME、$WELLID,以及 $DATATYPE=A、$PnB 非 8 倍数的位宽。
替代关系:日期时刻 → $BEGINDATETIME/$ENDDATETIME;板/孔 → $CARRIERID/$CARRIERTYPE/$LOCATIONID。

10.2 3.2 已删除(3.0/3.1 老文件里可能有)

$COMP、$UNICODE、$CSMODE、$CSVBITS、$CSVnFLAG、$GATE、$GnE/$GnF/$GnN/$GnP/$GnR/$GnS/$GnT/$GnV、$PKn、$PKNn,以及直方图模式相关 key。

旧 Key 出自 含义与解析
$COMP 2.0/3.0 旧补偿矩阵 n,f1,f2,…,n×n 个浮点数按行存;负值表示减法补偿,元素是"从 FLi 中减去的 FLj 百分比"。3.1 起被 $SPILLOVER 取代
$UNICODE 3.0 n,key1,key2,…,n=UNICODE 码页号,其后列出哪些 key 的 value 用双字节编码;不出现时全按 ASCII。3.1 起取消,统一 UTF-8
$DFCiTOj 2.0 电子补偿百分比,如 $DFC1TO3♦5♦ 表示从参数 1 向参数 3 补偿 5%
$GATE / $Gm* 2.0/3.0 门参数个数 / 门参数描述(类比 $PAR / $Pn*);3.2 删除
$PKn / $PKNn 2.0/3.0 一维直方图峰位通道号 / 峰位计数;随直方图模式一起删除
$RjI / $RjW 2.0 门区域定义,2.0 中值是参数号(如 $R1I♦2,3♦),3.1 起改为 Pi,Pj 形式(如 $R3I♦P2,P4♦),解析老文件时注意区分

10.3 各版本必选 Key 数量变化

版本 必选 Key 与上一版的变化
2.0 $DATATYPE、$PAR、$MODE、$PnB、$PnR、$BYTEORD、$NEXTDATA(7) TEXT/ANALYSIS 均为必选段;支持直方图;$PnN 是可选
3.0 15 个 新增 $BEGINDATA/$ENDDATA/$BEGINANALYSIS/$ENDANALYSIS/$BEGINSTEXT/$ENDSTEXT 等偏移类;$TOT、$PnE 升为必选;$CYT 仍可选;引入 >99,999,999 字节文件与补充 TEXT 段
3.1 16 个 $PnN 升为必选;$BEGINSTEXT/$ENDSTEXT、$BEGINANALYSIS/$ENDANALYSIS 必选;$MODE 必选
3.2 12 个 $CYT 升为必选;4 个 ST/ANALYSIS 偏移 key 与 $MODE 降为可选/弃用

11. 组合解析:从 TEXT 到 DATA 里的数值

按下面顺序处理,几乎所有读取错误都出在这几步:

  1. 每事件字节数
    • $DATATYPE=I:sum($PnB) / 8 字节(按位连续打包,老文件可能不是 8 的倍数);若某通道有 $PnDATATYPE,按该通道自己的类型算宽度。
    • $DATATYPE=F:4 × $PAR;D:8 × $PAR;A:各通道 $PnB 字节(字符数),* 表示变长并用空白/逗号分隔。
    • 校验:DATA 段字节数 == $TOT × 每事件字节数。
  2. 字节序:按 $BYTEORD 选小端/大端,再按各通道 $PnB 位宽读取。
  3. 整数通道掩码:I 型只保留能表示 0 ~ $PnR-1 的位;$PnR 不是 2 的幂时按下一个更高的 2 的幂取掩码。F/D 型不做掩码。
  4. 通道值 → 刻度值
    • 线性 + 增益(PnE=0,0、$PnG=g):刻度值 = 通道值 / g
    • 对数($PnR=r、$PnE=f1,f2):刻度值 = f2 × 10^(f1 × 通道值 / r),取值范围 f2 ~ f2×10^f1
    • 浮点数据:$PnE 全为 0,0、不用 $PnG,通道值即刻度值
  5. 标定:有 $PnCALIBRATION 时,结果 = 刻度值 × f1 + f2(单位取该 key 的 string 部分)。
  6. 时间:时间通道(PnN=Time)的值 × $TIMESTEP = 秒。
  7. 补偿:按 $SPILLOVER 构造矩阵 S,行向量 e × S⁻¹ 得补偿后值;仅适用于非光谱的传统荧光数据。
  8. 显示:按 $PnD 设置初始坐标范围(Linear 用上下界,Logarithmic 用跨度数与左边界),不要把它当数据变换。

12. 版本差异速查

项目 2.0 3.0 3.1 3.2
版本标识 FCS2.0 FCS3.0 FCS3.1 FCS3.2
分隔符 任意 ASCII 任意 ASCII 限 ASCII 1~126 同 3.1,推荐 LF
value 编码 ASCII ASCII + $UNICODE 码页 UTF-8 UTF-8
大文件(>99,999,999 B) 不支持 支持(HEADER 填 0,偏移进 TEXT) 支持 支持
补充 TEXT 段 无 有 有 有
$BYTEORD 多种组合 多种组合 仅 1,2,3,4 / 4,3,2,1 同 3.1
数据模式 L / U / C 直方图 同 2.0(直方图弃用) 直方图弃用 仅 L,$MODE 弃用
补偿 key $DFCiTOj $COMP $SPILLOVER $SPILLOVER(光谱数据禁用)
时间小数单位 无 1/60 秒 1/100 秒 ISO 8601 时间戳
通道命名 $PnN 可选 $PnN 可选 $PnN 必选;时间通道写作 TIME $PnN 必选;时间通道写作 Time(读时不区分大小写);另加 $PnDET/TAG/ANALYTE/TYPE/FEATURE 5 个描述 key
逐通道类型 无 无 无 $PnDATATYPE

13. 光谱流式项目落地提示

  • 不要用 $SPILLOVER 表达光谱解析矩阵。3.2 明确写了「含光谱数据的数据集不得使用 $SPILLOVER」。FCS 3.2 目前没有标准的"参比光谱矩阵 / 光谱拆解矩阵"字段,工程上有两条路:① 用非 $ 开头的自定义 key(如 SIBET_SPECTRA)存矩阵或矩阵文件引用;② 光谱矩阵随文件外的光谱库单独管理,FCS 内只存结果数据。写文件时务必保留 $ORIGINALITY 说明数据是否经过解析。
  • 原始与解析后数据用 $PnTYPE 区分:Raw Fluorescence(探测器原始光谱通道)与 Unmixed Fluorescence(解析后的染料通道)是 3.2 正式推荐的取值,比在 $PnN/$PnS 里拼字符串可靠。
  • 通道多、常为浮点:优先 $DATATYPE=F(或 D),对应 $PnB=32/64、$PnE=0,0、不给 $PnG、$PnR 只作期望范围且不加掩码;Time/Index 通道用 $PnDATATYPE=I 单独保留整数精度。
  • 探测器维度描述:$PnDET(探测器名)+ $PnL(激发波长,多激光可写多个)+ $PnF(滤光片通过波段)+ $PnTAG(染料)+ $PnFEATURE(Area/Height/Width)组合,比 $PnS 更适合光谱阵列通道。
  • 3.2 只支持 list mode,若下游需要传统补偿视图,应做数据转换生成派生文件,而不是往原文件里塞 $SPILLOVER。

14. 解析器自检清单

posted @ 2026-11-12 16:52  Lvwl-CN  阅读(2)  评论(0)    收藏  举报