05、解剖CEL文件各版本格式和读取方法(非R语言)
相比DAT文件,网络上更支持CEL级别的文件。CEL已经把DAT图像转换成数据了,而且CEL比DAT所占空间小得多。介绍一下CEL文件的格式,CEL文件有文本文件(TextCelFile,版本3)、BinaryCelFile(二进制文件,版本4)、GenericCelFile(普通文件,版本1)三种。
1)版本3
早期的CEL文件是版本3的,因为是文本文件,所以直接用记事本打开就可以看到里面的内容了,如下是GSM2899.CEL:
[CEL]
Version=3
[HEADER]
Cols=640
Rows=640
……
DatHeader=[5..46118] AFRGV01031201:CLS=4733 RWS=4733 XIN=3 YIN=3 VE=17 2.0 03/12/ 1 17:16:25 GridVerify=None HG_U95Av2.1sq 6
……
CellHeader=X Y MEAN STDV NPIXELS
0 0 278.0 95.3 25
1 0 22909.3 5244.4 20
2 0 390.0 121.0 25
3 0 22530.0 5102.5 25
……
638 639 20835.5 3531.1 20
639 639 292.0 85.2 25
可以看到Version=3,列数Cols和行数Rows都是640。可以发现DatHeader里有很多的 ,它起到了分割字符串的作用(这是我第一次在C语言源码里看到 这样的乱码),把“DatHeader=”后面的部分分割成若干部分,然后找出以“.1sq”结尾的那部分,即“HG_U95Av2.1sq”,再把“.1sq”去掉,就成功读取出芯片型号HG_U95Av2了。CellHeader=X Y MEAN STDV NPIXELS中的X和Y指的就是探针(特征)的X坐标和Y坐标,MEAN指探针的强度,STDV是方差,NPIXELS指用多少个像素来计算MEAN和STDV。每一行是一个探针(特征)的数据,这是一个640*640的阵列,所以X会从0变化到(640-1),以此循环640次,Y也从0变化到(640-1),不过每个数要重复640次。这样,就刚好有640*640行了。我们所要用到的数据只是MEAN那一列而已,不需要STDV和NPIXELS,而X和Y可以经过推算得出。这样,我们就可以理解为:坐标为(0,0)的探针强度为278.0,坐标为(1,0)的探针强度为22909.3,坐标为(2,0)的探针强度为390.0……
2)版本4
后来出现了版本4的CEL文件,它们是二进制文件,直接用记事本打开会看到很多的乱码。可以用CellFileConversionTool.exe工具进行版本3和版本4的格式转换。把版本3转换成版本4后,文件就小多了,因为已经去掉了X和Y这两列的数据。该版本采用了小端字节序,下面列举了不同数据类型的不同读取方法:
Integer:
若用Java读取整型数据:
如:FileInputStream fin=new FileInputStream("CEL文件的路径");
DataInputStream din=new DataInputStream(fin);
……
/*先读取出4个字节*/
int[] byteDataInt=new int[4];
for (int i=0;i<4;i++)
byteDataInt[i]=din.read();
/*移位,第(i-1)个字节右移i*8个字节*/
for (int i=0;i<4;i++)
byteDataInt[i]=byteDataInt[i]<<8*i;
/*再进行 | 运算*/
int result=byteDataInt[0]|byteDataInt[1]|byteDataInt[2]|byteDataInt[3];
……
若用C把完成以上的工作,就方便多了:
如:FILE *infile = fopen("CEL文件的路径", "rb")) ;
……
int result;
fread_int32(&result,1,infile);
……
这样,一个整型数据就被读取出来存放在result中了。
Short:
若用Java读取短整型数据:
int[] byteDataInt=new int[2];
for (int i=0;i<2;i++)
byteDataInt[i]=din.read();
for (int i=0;i<2;i++)
byteDataInt[i]=byteDataInt[i]<<8*i;
int result=byteDataInt[0] | byteDataInt[1];
用C语言:
fread_int16(&(result,1,infile);
Float:
若用Java读取浮点型数据:
int[] byteDataInt=new int[4];
for (int i=0;i<4;i++)
byteDataInt[i]=din.read();
int symbol=byteDataInt[3] & 8; //get the symbol
int power=(byteDataInt[3]<<1 | byteDataInt[2]>>7)-127; //get the power
int temp= byteDataInt[2] & 127; // let the 8th bit to be 0
int a=temp<<16 | byteDataInt[1]<<8 | byteDataInt[0];
float result=1;
for (int i=1;i<=23;i++)
{
int x=a&(int)(Math.pow(2, i-1)); //keep value of the i bite and make others bites to be 0
int xx=x>>(i-1); // move the i bite to the right end;
double addCount=xx*(Math.pow(2,-(23-(i-1)))); // computing the increment
result=result+addCount;
}
result=result*(int)(Math.pow(2, power));
if (symbol==1)
result=-result;
用C语言:
fread_float32(&(result,1,infile);
以上的3个例子可以看出,Java和C语言可以实现同样的功能,但是Java却麻烦得多,而且实验证明,Java花的时间会多得多。如版本4的探针强度是float型的,假如一张芯片的640*640个探针强度都用Java来读取,将会花费很长的时间,而用C语言不足1秒就可以完成。
3)版本1
版本1在版本3的基础上又去掉了STDV和NPIXELS这两列,并且出现了fread_be_int32、fread_be_uint16、fread_be_float32等C语言读取方法,这些方法都有着等效的Java实现方法,但是用Java来读取CEL文件总是很慢的。
05、解剖CEL文件各版本格式和读取方法(非R语言)的更多相关文章
- YAML/YML文件一直提示格式错误解决方法
第一次接触yml文件,各种格式报错,但是看了几次也没看出来.其实有一个好方法,那就是直接通过yml在线格式检查 可以将yml具体内容复制到以下网址进行查询.具体报错位置会更加详细 https://ww ...
- VC++实现获取文件占用空间大小的两种方法(非文件大小)
// GetFileSpaceSize.cpp : Defines the entry point for the console application. // /***************** ...
- R语言自动化报告格式——knitr
R语言自动化报告格式--knitr 相关文献: R语言自动化报告格式--knitr 资讯 | R Notebooks 即将发布 ------------------------------------ ...
- 【网络爬虫入门05】分布式文件存储数据库MongoDB的基本操作与爬虫应用
[网络爬虫入门05]分布式文件存储数据库MongoDB的基本操作与爬虫应用 广东职业技术学院 欧浩源 1.引言 网络爬虫往往需要将大量的数据存储到数据库中,常用的有MySQL.MongoDB和Red ...
- 让TinyXML保存文件为UTF-8格式
TinyXML是个好东西,这个不用我多说了,我用它做过好几个项目,但这几个项目都只是从xml文件中获取信息,没有涉及到写文件,最近需要生成xml的配置文件,才注意到这个问题,那就是TinyXML似乎不 ...
- 如何用DELPHI编程修改外部EXE文件的版本信
右击里面有修改 点开直接修改就可以了吧. DELPHI 里程序的版本信息怎么是灰色的,无法更改 耐心读以下说明,应该能解决你的问题,如果不能解决,请Hi我~ 如何给自己的dll文件添加版本信息呢? 首 ...
- [Script]EBS里查看模块的版本、文件的版本信息【Z】
系统版本信息 装了哪些模块,以及版本信息 select 'Current Application Release: '||ver||' ('||bug||')' "Description&q ...
- EF+LINQ事物处理 C# 使用NLog记录日志入门操作 ASP.NET MVC多语言 仿微软网站效果(转) 详解C#特性和反射(一) c# API接受图片文件以Base64格式上传图片 .NET读取json数据并绑定到对象
EF+LINQ事物处理 在使用EF的情况下,怎么进行事务的处理,来减少数据操作时的失误,比如重复插入数据等等这些问题,这都是经常会遇到的一些问题 但是如果是我有多个站点,然后存在同类型的角色去操作 ...
- 06、CEL文件与灰度图像
R语言里的image方法可以绘制CEL文件的灰度图像.我们先来讨论image这个的函数: 如:x <- c(0:2) y <- c(0:2) m <- matrix(c(1,5,10 ...
随机推荐
- Confluence备份,数据迁移
一.Confluence的备份.恢复1)Confluence的备份 管理员账号登录Confluence,点击右上角的"一般配置"-"每日备份管理",如下图(默认 ...
- RedisTemplate与zset
Redis 数据结构简介 Redis 可以存储键与5种不同数据结构类型之间的映射,这5种数据结构类型分别为String(字符串).List(列表).Set(集合).Hash(散列)和 Zset(有 ...
- C++入门经典-例2.4-使用scanf格式输入函数得到用户输入的数据
1:puts函数可以输出提示信息的字符串. 2:代码如下: // 2.4.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" int main( ...
- XML文件报错dubbo:XX解决方法
特别提示:本人博客部分有参考网络其他博客,但均是本人亲手编写过并验证通过.如发现博客有错误,请及时提出以免误导其他人,谢谢!欢迎转载,但记得标明文章出处:http://www.cnblogs.com/ ...
- 【转】Java操作CSV文件导入导出
特别提示:本人博客部分有参考网络其他博客,但均是本人亲手编写过并验证通过.如发现博客有错误,请及时提出以免误导其他人,谢谢!欢迎转载,但记得标明文章出处:http://www.cnblogs.com/ ...
- git设置mergetool可视化工具
可以设置BeyondCompare,DiffMerge等作为git的比较和合并的可视化工具,方便操作. 设置如下: 先下载并安装BeyondCompare,DiffMerge等. 设置git配置, ...
- php面向对象 练习
实例一:求一个圆环的面积,大圆半径:10 小圆半径:5 造一个圆的类: class Yuan { public $r; function __construct($r) //半径初始化 { $t ...
- P3956 棋盘
P3956 棋盘 题解 注释都在代码里了 这道题可以用DFS做,记忆化搜索,维护一个money[ ][ ] 表示到达当前节点的最小花费 不需要记录VIS,因为有一个最小值判断,如果走重复的话一定会得到 ...
- robotFramework——FOR循环语句
robotframework支持FOR循环语句,语法和Python的语法基本相同,但robotframework中,“FOR”关键字前面需要增加一个“:”,写成“:FOR”,其它与Python的语法相 ...
- 【HANA系列】SAP 一位SAP培训顾问的建议:SAP HANA应该如何学习?
公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[HANA系列]SAP 一位SAP培训顾问的建议 ...