|
|
/**
|
|
|
* @file SegdReader.h
|
|
|
* @brief SegD格式文件读取类
|
|
|
* @author
|
|
|
* @date 2011-11-15
|
|
|
*/
|
|
|
|
|
|
#pragma once
|
|
|
#include "SegDHeader.h"
|
|
|
#include "SeisLineData.h"
|
|
|
|
|
|
namespace NSegD
|
|
|
{
|
|
|
|
|
|
typedef struct stuSegDFileHeader
|
|
|
{
|
|
|
unsigned short ver; //版本号:1=版本1.0,2=版本2.0,3=版本3.0(目前不支持3.0版)
|
|
|
|
|
|
int fileNumber; //文件号
|
|
|
|
|
|
unsigned short formatCode; //格式代码
|
|
|
//时序
|
|
|
//0x0015 20 bit binary multiplexed
|
|
|
//0x0022 8 bit quaternary multiplexed
|
|
|
//0x0024 16 bit quaternary multiplexed
|
|
|
//0x0036 24 bit 2's compliment integer multiplexed
|
|
|
//0x0038 32 bit 2's compliment integer multiplexed
|
|
|
//0x0042 8 bit hexadecimal multiplexed
|
|
|
//0x0044 16 bit hexadecimal multiplexed
|
|
|
//0x0048 32 bit hexadecimal multiplexed
|
|
|
//0x0058 32 bit IEEE multiplexed
|
|
|
//道序
|
|
|
//0x8015 20 bit binary demultiplexed
|
|
|
//0x8022 8 bit quaternary demultiplexed
|
|
|
//0x8024 16 bit quaternary demultiplexed
|
|
|
//0x8036 24 bit 2's compliment integer demultiplexed
|
|
|
//0x8038 32 bit 2's compliment integer demultiplexed
|
|
|
//0x8042 8 bit hexadecimal demultiplexed
|
|
|
//0x8044 16 bit hexadecimal demultiplexed
|
|
|
//0x8048 32 bit hexadecimal demultiplexed
|
|
|
//0x8058 32 bit IEEE demultiplexed
|
|
|
//无效
|
|
|
//0200 Illegal, do not use
|
|
|
//0000 Illegal, do not use
|
|
|
|
|
|
unsigned short scanInterval; //采样间隔
|
|
|
int recordLength; //记录长度
|
|
|
|
|
|
//通常一次记录过程中的记录道数和采集参数是不变化的,所以通常仅有1个扫描类型
|
|
|
unsigned short scanTypesNum; //扫描类型个数
|
|
|
unsigned short channelNumPerScanType; //一个扫描类型内包含的道组数
|
|
|
int totalChannelsNumber; /* total number of channels */
|
|
|
|
|
|
unsigned short sampleSkewNum; //采样时偏头段个数
|
|
|
|
|
|
unsigned short trailerNum; /* 13-14 General trailer number */
|
|
|
|
|
|
unsigned short generalHeaderNum; /* 12 Number blocks in general header 头段块的个数(高四位)通用头段块个数,至少2个*/
|
|
|
unsigned short extendedHeaderNum; //扩展头段个数
|
|
|
int externalHeaderNum; //外部头个数
|
|
|
|
|
|
//头块长度
|
|
|
//( generalHeaderNum + scanTypesNum*(channelNumPerScanType+sampleSkewNum) + extendedHeaderNum + externalHeaderNum + 1 ) * 32
|
|
|
|
|
|
unsigned short year; //Year (0-99)
|
|
|
unsigned short day; //Day (1-366)
|
|
|
unsigned short hour; /* 14 Hour of day(0-23) */
|
|
|
unsigned short minute; /* 15 Minute of hour(0-59) */
|
|
|
unsigned short second; /* 16 Second of minute(0-59) */
|
|
|
|
|
|
//仅对时序保存方式有效////////////////////////////////////////////////
|
|
|
//每块的扫描个数为sb + 2^sbx
|
|
|
unsigned short sb; /* 25 Number of scans per block */
|
|
|
unsigned short sbx; /* 24 sb的指数,范围0-15 */
|
|
|
int scanBytes; //每个扫描字节数,仅时序
|
|
|
} SEGD_FILE_HEADER;
|
|
|
|
|
|
typedef struct stuSegDTraceHeader
|
|
|
{
|
|
|
int fileNumber; //文件号
|
|
|
unsigned short scanType; //扫描类型
|
|
|
unsigned short channelSetNum; //道集数
|
|
|
unsigned short traceNumber; /* 05-06 trace number 道号 */
|
|
|
unsigned short extendHeaderNum; /* 10 trace header extensions 扩展道头的个数 */
|
|
|
|
|
|
unsigned short sampleSkew; /* 11 sample skew of the first sample of the trace.
|
|
|
It is a part of the fractional part of the base scan interval.
|
|
|
Res :1/256 scan interval */
|
|
|
|
|
|
int samplesNumber; /* 每道采样点个数*/
|
|
|
|
|
|
} SEGD_TRACE_HEADER;
|
|
|
|
|
|
class AFX_EXT_CLASS CSegdReader
|
|
|
{
|
|
|
public:
|
|
|
CSegdReader(void);
|
|
|
~CSegdReader(void);
|
|
|
|
|
|
bool Read(LPCTSTR lpszFileName);
|
|
|
//包括充填CSegdFileHeader对象
|
|
|
bool ReadFileHeader(CFileSegy& fr); //读取文件头信息
|
|
|
|
|
|
bool ReadOneRecordBlock(CFileSegy& fr); //读取一个记录块
|
|
|
bool ReadTapeLabel(CFileSegy& fr); //读取版本2的磁带头信息,并设置版本号
|
|
|
bool ReadTraceHeader(CFileSegy& fr); //读取道头
|
|
|
bool ReadDataTrace(CFileSegy& fr, CSeisTraceData& td); //读取道数据
|
|
|
|
|
|
SEGD_FILE_HEADER& GetFileHeader() { return m_fileHeader; }
|
|
|
SEGD_TRACE_HEADER& GetTraceHeader() { return m_traceHeader; }
|
|
|
bool IsGain() { return m_bGain; }
|
|
|
|
|
|
protected:
|
|
|
bool InitializeTraceHeader(SEGD_DEMUX_TRACE_HEADER& traceHeader);
|
|
|
bool InitializeFileHeader(SEGD_GENERAL_HEADER_1& header1, SEGD_GENERAL_HEADER_2& header2);
|
|
|
bool InitializeFileHeader(SEGD_GENERAL_HEADER_1& header1);
|
|
|
|
|
|
CSeisLineData m_tracesData; //所有道数据
|
|
|
SEGD_FILE_HEADER m_fileHeader;
|
|
|
SEGD_TRACE_HEADER m_traceHeader;
|
|
|
bool m_bGain; /* flag for applying gain 是否使用增益*/
|
|
|
|
|
|
void ClearChannelHeader(void);
|
|
|
SEGD_CHANNEL_SET_HEADER* GetChannelSetHeader(int i, int j);
|
|
|
float* GetGain(int i, int j);
|
|
|
|
|
|
int GetBytesLength(int nSampleNum, int code);
|
|
|
|
|
|
private:
|
|
|
//文件头
|
|
|
SEGD_TAPE_LABEL m_stuTapeLabel; //版本2 格式的磁带标签定义
|
|
|
SEGD_GENERAL_HEADER_1 m_stuGHeader1; //头段块1
|
|
|
SEGD_GENERAL_HEADER_2 m_stuGHeader2; //头段块2
|
|
|
SEGD_GEN_HEAD_SN358 m_stuGHeaderSN358;
|
|
|
SEGD_GENERAL_HEADER_N m_stuGHeaderN; //扩展头段
|
|
|
SEGD_SAMPLE_SKEW m_stuSampleSkew; //采样时偏
|
|
|
SEGD_EXTENDED_HEADER m_stuExtendedHeader;//扩展头段
|
|
|
SEGD_EXTERNAL_HEADER m_stuExternalHeader;//外部头段
|
|
|
|
|
|
SEGD_CHANNEL_SET_HEADER* m_pChannelHeader; //扫描类型头段,array[scanTypesNum][channelNumPerScanType]
|
|
|
float* m_pGain; //增益,array[scanTypesNum][channelNumPerScanType] for escaling exponent
|
|
|
|
|
|
//道头
|
|
|
SEGD_DEMUX_TRACE_HEADER m_stuTraceHeader; //道头
|
|
|
SEGD_TRACE_HEADER_EXT m_stuTraceHeaderExt; //道头扩展
|
|
|
|
|
|
/* repair byte swap of MP gain */
|
|
|
int imp0;
|
|
|
int imp1;
|
|
|
int icvt2s; /* Sercel glitch flag */
|
|
|
|
|
|
protected:
|
|
|
bool Read(CFileSegy& fr, SEGD_GENERAL_HEADER_1& header1);
|
|
|
|
|
|
void F8015_to_float (char *from, float* to, int len, int cvt2s);
|
|
|
void F8022_to_float (char *from, float* to, int len, int cvt2s);
|
|
|
void F8024_to_float (char *from, float* to, int len, int cvt2s);
|
|
|
void F8036_to_float (unsigned char *from, float* to, int len);
|
|
|
void F8038_to_float (char *from, float* to, int len);
|
|
|
void F8042_to_float (char *from, float* to, int len);
|
|
|
void F8044_to_float (char *from, float* to, int len);
|
|
|
void F8048_to_float (char *from, float* to, int len);
|
|
|
void F8058_to_float (char *from, float* to, int len);
|
|
|
|
|
|
int BCD(unsigned char * ptr , int begin , int n);
|
|
|
short GET_S(char* from);
|
|
|
char GET_C(char *f);
|
|
|
unsigned int GET_UC(unsigned char *f) { return f[0]; }
|
|
|
unsigned short GET_US(unsigned char *f);
|
|
|
};
|
|
|
|
|
|
}//namespace
|