何榮帥,白立新,成云輝
(北京市地震局,北京 100080)
北京市強震動觀測臺網(wǎng)于“十五”項目期間購置了22臺瑞士GEOSIG公司生產(chǎn)的GSR-18型數(shù)字強震動記錄儀。迄今為止,該儀器在北京市強震動臺網(wǎng)一直處于正常運行狀態(tài),并多次獲得地震事件數(shù)據(jù)記錄。由于廠商提供儀器文檔中未提供事件數(shù)據(jù)格式說明,工作人員在獲取地震記錄后,需通過GEOSIG公司提供的格式轉(zhuǎn)換軟件進行轉(zhuǎn)換,然后才能進行后續(xù)數(shù)據(jù)處理,使用上存在諸多不便。為減少工作人員的工作強度,作者根據(jù)GEOSIG公司提供的GSR-24強震動記錄儀頭文件說明和SEISAN地震處理軟件作為參考,對GSR-18型強震動記錄儀事件數(shù)據(jù)格式進行了解析,以便工作人員能夠順利編寫讀取該設(shè)備事件數(shù)據(jù)、處理數(shù)據(jù)軟件和科研工作。
GSR-18型數(shù)字強震動記錄儀記錄事件數(shù)據(jù)文件有兩種格式,一種為文件名擴展名為GSR,另一種文件擴展名為GBR文件格式。以GSR為擴展名的文件是由GBR為擴展名的文件解壓而得到的,兩種文件均為二進制文件。采用GEOSIG公司自帶的軟件從強震動觀測臺站遠程下載后獲得的記錄文件以GSR為文件擴展名,而由中國地震局工程力學研究所組織開發(fā)的InHand QuakeSense數(shù)字強震動臺網(wǎng)監(jiān)控系統(tǒng)軟件平臺獲得的記錄事件數(shù)據(jù)文件則以GBR為擴展名。GSR-18型數(shù)字強震動記錄儀記錄事件由頭段和數(shù)據(jù)段構(gòu)成,本文對這兩種數(shù)據(jù)格式分別進行了分析。
GSR-18型數(shù)字強震動記錄儀的事件數(shù)據(jù)頭段分為四個部分,分別為事件信息、時間信息、儀器狀態(tài)信息和通道信息部分。由于文件頭段項目較多,因文章篇幅限制,并結(jié)合強震動觀測處理數(shù)據(jù)的實際需求,本文僅對文件頭段主要字段進行了分析(表1)。
事件信息部分包括記錄事件的事前、事后事件、觸發(fā)方式和總采樣數(shù)等。時間信息部分主要包括觸發(fā)時間,同步時間等。儀器狀態(tài)信息部分主要包括儀器生產(chǎn)廠商、儀器名稱、儀器序列號、固件版本號、儀器分辨率、臺站經(jīng)緯度和儀器狀態(tài)信息等。通道信息主要包括通道名稱、通道單位、通道方向、傳感器類型和通道峰值等。
GBR和GSR文件在頭段文件格中各字段位置差別不大,主要區(qū)別表現(xiàn)在:GBR頭段文件中對整型數(shù)據(jù)讀取需采用大字節(jié)序讀取,而GSR文件則需采用小字節(jié)序讀取。另外GBR文件群延遲字段從第129個字節(jié)位置讀取,而GSR文件則需從第128個字節(jié)位置讀取。
從事件數(shù)據(jù)讀取事件起始時間一直是令人困惑的問題,在SEISAN8.1版本之前,這個問題一直沒有解決[1],原因可能與廠商一直沒有提供具體的GSR-18型數(shù)字強震動記錄儀事件格式說明有關(guān)。參考GSR-24型強震動記錄儀事件數(shù)據(jù)頭文件說明和SEISAN源程序,GSR-24型強震動記錄儀事件觸發(fā)時間采用BCD編碼方式。通過對GSR-18型數(shù)字強震動記錄儀文件頭段分析表明,頭段中事件觸發(fā)時間采用的也是BCD編碼方式。GSR-18型數(shù)字強震動記錄儀事件記錄起始時間與觸發(fā)時間、千分位觸發(fā)時間和群延遲有關(guān),獲取記錄事件的起始時間=觸發(fā)時間+千分位觸發(fā)時間/1000-群延遲/1000-事前時間。
另外,從文件頭段上可以看出,臺站編碼由兩個字段相加組成,第一個字段起始于第270個字節(jié),由3個字符組成,第二個字段起始于第280個字節(jié),由2個字符組成。這可能為適應(yīng)與我國“十五”強震動臺站建設(shè)規(guī)范而做出的修改有關(guān)。
表1 GSR-18型數(shù)字強震動記錄儀事件數(shù)據(jù)文件頭內(nèi)容
圖1 GBR和GSR數(shù)據(jù)段數(shù)據(jù)存儲
GBR和GSR文件在數(shù)據(jù)段上存在較大差別,這可能與GBR文件采取壓縮方式存儲,而GSR文件采取非壓縮方式存儲有關(guān)。分析表明,GBR和GSR數(shù)據(jù)段起始位置不同,GBR有效數(shù)據(jù)段起始于第1 027個字節(jié)位置,而GSR有效數(shù)據(jù)段起始于第1 024個字節(jié)位置。GBR數(shù)據(jù)段由大小為504個字節(jié)的數(shù)據(jù)塊,數(shù)據(jù)塊間隔8個字節(jié)。每個數(shù)據(jù)塊由56個字段組成,每個字段占9個字節(jié),每個字段存儲了3個通道的數(shù)據(jù),分布為x,y,z通道。每個通道占3個字節(jié),由3個字節(jié)構(gòu)成一個有符號整數(shù),數(shù)據(jù)記錄為count值。GSR數(shù)據(jù)段由大小為12個字節(jié)的數(shù)據(jù)塊,數(shù)據(jù)塊間隔4個字節(jié),每個數(shù)據(jù)塊由1個字段組成,每個字段存儲了3個通道的數(shù)據(jù),分布為x,y,z通道。每個通道占4個字節(jié),由4個字節(jié)構(gòu)成一個有符號整數(shù),數(shù)據(jù)記錄為count值。
本文采用Python語言編寫的程序?qū)崿F(xiàn)了對北京市強震動觀測臺網(wǎng)GSR-18型數(shù)字強震動記錄儀的事件數(shù)據(jù)的讀取。Python是一種面向?qū)ο?、解釋型計算機程序設(shè)計語言,由Python語言編寫的程序,基本不經(jīng)修改即可跨平臺使用。Python語言提供的struct模塊能夠構(gòu)造并解析打包的二進制數(shù)據(jù),可用于處理諸如將二進制數(shù)據(jù)從文件中讀取的操作。
本程序主要僅顯示了如何讀取GBR事件記錄的采樣數(shù)、起始時間和數(shù)據(jù)塊等內(nèi)容,如需要讀取GSR文件或其他字段,通過表1所給各字段字節(jié)位置,采取類似的方式即可讀取。
class GbrFile:
def __init__(self,filename):
self.filename=filename
def __bcd_code(self,a):
a=(0x0F&(a>>4))*10+(0x0F & a)
return a
#signal process data
def __to_int(self,chunk):
data_fmt="<3b"
number = struct.unpack(data_fmt,chunk)
return number[0]<<16 | (number[1]<<8 & 0x0FF00) | (number[2]&0x000FF)
def get_evt_info(self):
gbr_evt=open(self.filename,"rb")
gbr_evt.seek(16)
data_fmt="
data_str=struct.unpack(data_fmt,gbr_evt.read(struct.calcsize(data_fmt)))
self.pre_time=int(data_str[0])
gbr_evt.seek(32)
data_fmt="<4B" #TriggerTime
data_str=struct.unpack(data_fmt,gbr_evt.read(struct.calcsize(data_fmt)))
hour=int(self.__bcd_code(data_str[0]))
minute=int(self.__bcd_code(data_str[1]))
second=int(self.__bcd_code(data_str[2]))
milli_second=int(self.__bcd_code(data_str[3]))*1000
data_fmt="<4B" #TriggerDate
data_str=struct.unpack(data_fmt,gbr_evt.read(struct.calcsize(data_fmt)))
day=int(self.__bcd_code(data_str[0]))
month=int(self.__bcd_code(data_str[1]))
year1=int(self.__bcd_code(data_str[2]))
year2=int(self.__bcd_code(data_str[3]))
data_fmt="
data_str=struct.unpack(data_fmt,gbr_evt.read(struct.calcsize(data_fmt)))
#print "TriggerThousands=",data_str
trigger_thousands=int(data_str[0])*1000
gbr_evt.seek(128)
data_fmt="<2B" #Group delay
data_str=struct.unpack(data_fmt,gbr_evt.read(struct.calcsize(data_fmt)))
print "Group delay=",data_str
group_delay=int(data_str[1])*1000
year=year1*100+year2
microsecond=milli_second*10+trigger_thousands
trigger_time=datetime(year,month,day,hour,minute,second,microsecond)
self.trigger_time=trigger_time-timedelta(microseconds=group_delay)
self.start_time=self.trigger_time-timedelta(seconds=self.pre_time)
#read signal data
gbr_evt.seek(1027)
data=gbr_evt.read(9)
i=1
j=1
self.x_data=[]
self.y_data=[]
self.z_data=[]
while len(data)==9:
data_str1=data[:3]
self.x_data.append(self.__to_int(data_str1)*GRAVITY*self.lsb)
data_str2=data[3:6]
self.y_data.append(self.__to_int(data_str2)*GRAVITY*self.lsb)
data_str3=data[6:9]
self.z_data.append(self.__to_int(data_str3)*GRAVITY*self.lsb)
j+=1
if i%56==0:
position=gbr_evt.tell()
gbr_evt.seek(position+8)
i=1
data=gbr_evt.read(9)
else:
i+=1
data=gbr_evt.read(9)
gbr_evt.close()
圖2 圖1 GSR-18事件(a)和功能測試文件(b)讀取示意圖
本文通過對北京市強震動臺網(wǎng)GSR-18型數(shù)字強震動記錄儀事件數(shù)據(jù)格式的分析,為該類型儀器記錄的數(shù)據(jù)格式快速轉(zhuǎn)換提供了便利手段,減少工作人員在處理此類儀器的事件記錄工作中花費的時間和精力,提高了工作效率。另外,本文對擁有同型號儀器的強震動觀測臺網(wǎng)在數(shù)據(jù)分析處理時也具有一定的參考價值,同時建議在臺網(wǎng)建設(shè)時應(yīng)盡可能的要求儀器供貨商提供更加完備的技術(shù)資料。