我们拥有一系列科学仪器,这些仪器具有在Windows 7 / Vista平台上运行的专有图像分析软件。该软件以二进制格式保存一系列质量控制指标。一位积极进取的程序员编写了一个python库,用于从这些度量文件中提取和分类数据。我正在使用它,但有一个非常有趣的指标,我无法解密。在库代码中:
def parse_binary(self):
bs = self.bs
# Extraction Metrics (ExtractionMetricsOut.bin)
# Contains extraction metrics such as fwhm (full width at half maximum) scores and raw intensities
# Format:
# byte 0: file version number (2)
# byte 1: length of each record
# bytes (N * 38 + 2) - (N *38 + 39): record:
# 2 bytes: lane number (uint16)
# 2 bytes: tile number (uint16)
# 2 bytes: cycle number (uint16)
# 4 x 4 bytes: fwhm scores (float) for channel [A, C, G, T] respectively
# 2 x 4 bytes: intensities (uint16) for channel [A, C, G, T] respectively
#---->8 bytes: date/time of CIF creation --> 2 x 4 bytes for date and timestamp
# ...Where N is the record index
self.apparent_file_version = bs.read('uintle:8')
self.check_version(self.apparent_file_version)
recordlen = bs.read('uintle:8') # length of each record
for i in range(0,((bs.len) / (recordlen * 8))): # record length in bits
#OMITTED: obtain various data
#...
# 8 bytes: date/time of CIF creation
self.data['datetime'].append(bs.read('uintle:32'))
self.data['timestamp'].append(bs.read('uintle:32'))
self.df = pandas.DataFrame(self.data)
在python控制台中,当我检查数据时,'datetime'数据毫无意义。但时间戳数据更有趣:
>>> len(exmets.data['timestamp'])
226559
>>> len(exmets.data['datetime'])
226559
>>> exmets.data['datetime'][1:10]
[2861233716L, 2934210013L, 2764566050L, 2864234016L, 2767136307L, 2817880381L, 2936700262L, 2820490642L, 2769576551L, 2866944287L]
>>> exmets.data['datetime'][100000:100010]
[4093949428L, 4104309713L, 4090699103L, 4094859519L, 4094289462L, 4098919713L, 4104359713L, 4104359713L, 4132262259L, 4150663099L]
就像我说的,'datetime'很奇怪。但'时间戳'似乎更加规律:
>>>exmets.data['timestamp'][1:10]
[2295344086L, 2295344086L, 2295344086L, 2295344086L, 2295344086L, 2295344086L, 2295344086L, 2295344086L, 2295344086L]
>>>exmets.data['timestamp'][100000:100010]
[2295345531L, 2295345531L, 2295345531L, 2295345531L, 2295345531L, 2295345531L, 2295345531L, 2295345531L, 2295345531L, 2295345531L]
>>>exmets.data['timestamp'][226549:226559]
[2295347466L, 2295347466L, 2295347466L, 2295347466L, 2295347466L, 2295347466L, 2295347466L, 2295347466L, 2295347466L, 2295347466L]
所以从开始到结束都有一个规律的进展,但是如果你认为这些数字意味着几秒钟,则会有2296347466 - 2295344086 = 3380
的差异,相当于以秒为单位的不到一小时。假设这些秒是不正确的,因为机器生成了11天跨度的数据。
关于如何破译这个的任何想法?
答案 0 :(得分:2)
我写了那个图书馆! :)
重要更新
在联系Illumina之后,我被告知有两个启示:
我错误地解析了两个字段的日期和时间;它实际上是一个64位有符号整数。
这个64位有符号整数是一个C#DateTime,从公历1 AD开始计算100纳秒的增量(在python,datetime.datetime(1,1,1)中)。
旧答案如下 ...
你是如此接近答案。使用您提供的号码检查一下:
In [59]: 2296347466 - 2295344086
Out[59]: 1003380
In [65]: 1003380.0 / 24 / 60 / 60
Out[65]: 11.613194444444444
换句话说,它是在几秒钟内!
我仍然不太了解时间戳的格式,所以这不是一个完整的答案,但我想我至少会分享我目前所知的内容。
通过考虑序列发生器如何将数据输出到二进制文件,可以推断出部分神秘感。
Illumina序列发生器如何将数据输出到二进制文件
关于Illumina测序仪的一个重要事项是,二进制文件中出现的内容对我们这些愚蠢的人类来说有点非线性。通过按时间戳排序时,可以看到有关循环#2 /磁贴1101的信息出现在循环#1 /磁贴1103之前(例如)。
最可能的原因是序列发生器没有连续地将信息输送到文件,而是在缓冲区中存储了大量内容并一次性写入所有内容。
这与时间戳中看到的相匹配,即时间戳似乎表明缓冲区中的累积数据何时被写入磁盘,而不是有问题的磁贴成像的时刻。
试试这个:
print len(exmets.df.timestamp.unique())
print len(exmets.df.datetime.unique())
您会发现您拥有的唯一时间戳远远少于唯一的日期时间。此外,时间戳也可能具有非常规则的间隔。我工作的时间不是11天,最多只能工作36小时,因此我的数据间隔大约相隔5秒。 (我有兴趣知道你的数据是什么样的。)
所以我最好的猜测是这个时间戳是秒 - 自 - 纪元,除了我不知道它可能引用哪个纪元。我的第一个猜测是NTFS(自1601年1月1日1601 00:00:00 UTC以来100纳秒测量),但这根本没有用。