有了探针排布图像的基础,我们就可以更好地理解CDF文件了。假如每个探针的位置用一个坐标表示,以左上角为(0,0),那么整张芯片的坐标就如下图(行数n必须等于列数m,这里共有n*m个探针):

0,0

1,0

2,0

3,0

m,0

0,1

0,2

0,3

0,n

那么这些探针怎么根据坐标对应到探针组呢?我们来看CDF文件的格式:

[CDF]

Version=GC3.0

[Chip]

Name=HG-U133A_2

Rows=732

Cols=732

NumberOfUnits=22277

MaxUnit=23214

……

[Unit1000_Block1]

Name=1007_s_at

BlockNumber=1

NumAtoms=16

NumCells=32

StartPosition=0

StopPosition=15

CellHeader=X Y PROBE FEAT ……

Cell1=416 177 N control ……

Cell2=416 178 N control ……

Cell3=569 289 N control ……

……

Cell31=568 9 N control ……

Cell32=568 10 N control ……

……

HG-U133A_2是芯片型号,行数(Rows)和列数(Cols)都是732,探针组数目(NumberOfUnits)是22277。其中一个探针组名称为1007_s_at,它包含16对探针,32个Cell(一个Cell代表一个探针,一个特征)。我们已经知道,PM和MM是成对出现的,而且PM总是在与之对应的MM的上方,由此可判断出Cell1和Cell2是一对探针,因为它们的X坐标都是416,且Cell1的Y坐标比Cell2小1,Cell1是PM,Cell2是与之对应的MM。

我们也可以用R语言来获取1007_s_at探针组的PM/MM探针的位置:

library(affy)

rawData <- ReadAffy()

> pmindex(rawData,"1007_s_at") ## MM探针用mmindex(rawData,”1007_s_at”)

$`1007_s_at`

[1] 129981 212118 393384  84268 429999 425542 431862  72955 431473  99100

[11] 504441 441769 340582 205738 460599 7157

这样就能看到1007_s_at探针组的16个PM探针在阵列中的位置了。可以看到,这里的位置已经不是用坐标(X,Y)来表示了,而是用index=(X+Y*列数+1)来表示。如,Cell1是第一个PM,它的X=416,Y=177,那么129981就刚好等于416+177*732+1。相反,如果我们知道了位置,怎么反推出它的坐标?如位置index=129981,我们可以:Y=floor((index-1)/列数)=floor((129981-1)/732)=177,X=(index-1)-列数*Y=(129981-1)-732*177=416。

每种型号的芯片都有着对应的探针定位信息,所以用R语言做分析的时候会自动下载对应的CDF包(若未安装的话),如HG-U133A_2型号下载hgu133a2cdf包。HG-U133A_2是直接从CEL文件读取出来的型号名称,把HG-U133A_2的所有大写字母改成小写字母并去掉短横线(可以用R语言的cleancdfname方法实现),并且在末尾加上“cdf”就是对应的cdf包的名字。

05-26 15:20