📄 readsegytraceheadervalue.m
字号:
% ReadSegyTraceHeaderValue : Read a spedicifc trace header value
%
% Call:
% % By Name
% cdp=ReadSegyTraceHeaderValue(filename,'key','cdp');
% SourceX=ReadSegyTraceHeaderValue(filename,'key','SourceX');
% SourceY=ReadSegyTraceHeaderValue(filename,'key','SourceY');
%
% % By location in Trace Header
% SourceX=ReadSegyTraceHeaderValue(filename,'pos',70,'precision','int32');
%
%
function hval=ReadSegyTraceHeaderValue(filename,varargin);%pos,type)
pos=0;
precision='int32';
ninput=nargin;
% TRANSFORM VARARGING INTO PARAMETERS
cargin=1;
while (cargin<ninput)
% ENDIAN FORMAT
endian='ieee-be'; % Big Endian is default
if strcmp(varargin{cargin},'endian')
cargin=cargin+1;
eval(['endian_tight=varargin{cargin};'])
if endian_tight=='l',
disp(['USING LITTLE ENDIAN TYPE'])
endian='ieee-le';
else
disp(['USING BIG ENDIAN TYPE'])
end
end
if strcmp(varargin{cargin},'pos')
cargin=cargin+1;
eval(['pos=',num2str(varargin{cargin}),';']);
disp(['Reading at header postision : pos=',num2str(pos)])
end
if strcmp(varargin{cargin},'precision')
cargin=cargin+1;
eval(['precision=''',varargin{cargin},''';']);
disp(['precision : ',precision])
end
if strcmp(varargin{cargin},'key')
cargin=cargin+1;
eval(['key=''',varargin{cargin},''';']);
if strcmp(key,'TraceSequenceLine'),
pos=0; precision='int32';
elseif strcmp(key,'TraceSequenceFile'),
pos=4; precision='int32';
elseif strcmp(key,'cdp'),
pos=20; precision='int32';
elseif strcmp(key,'SourceX'),
pos=72; precision='int32';
elseif strcmp(key,'SourceY'),
pos=76; precision='int32';
else
disp(sprintf('Trace Header Value %s not defined',key))
pos=0; precision='int32';
hval=[];
return
end
disp(sprintf('key=%s, pos=%d, precision=%s ',key,pos,precision))
end
cargin=cargin+1;
end
if nargin<2
pos=0;
end
if nargin<3
type='int32';
end
if exist('endian')==1,
segyid = fopen(filename,'r',endian);
else
segyid = fopen(filename,'r','ieee-be'); % ALL DISK FILES ARE IN BIG
end % ENDIAN FORMAT, ACCORDING TO
[SegyHeader]=ReadSegyHeader(filename);
Revision=SegyHeader.SegyFormatRevisionNumber;
if Revision>0, Revision=1; end
if (SegyHeader.DataSampleFormat>length(SegyHeader.Rev(Revision+1).DataSampleFormat));
SegymatVerbose([mfilename,' : WARNING : YOU HAVE SELECTED (OR THE FILE IS FORMATTED SUCH THAT) A DATASAMPLE FORMAT THAT IS NOT DEFINED. \nREMEBER IEEE IS NOT SPECIFIED IN THE SEGY REV0 STANDARD !'])
if (Revision==0)
SegymatVerbose([mfilename,' : TRYING TO USE REVISION 1 AS OPPOSED TO REVISION 0'])
Revision=1;
if (SegyHeader.DataSampleFormat>length(SegyHeader.Rev(Revision+1).DataSampleFormat));
SegymatVerbose([mfilename,' : FATAL ERROR : STILL THE DATASAMPLE FORMAT IS NOT SUPPRTED - EXITING (Report error to tmh@gfy.ku.dk)'])
else
SegymatVerbose([mfilename,' : APPARENT SUCCES CHANING FROM Revision 0 to 1 - Continuing'])
SegyHeader.SegyFormatRevisionNumber=1; % FORCING REVISION TO BE 1 !!!
end
end
end
FormatName=SegyHeader.Rev(Revision+1).DataSampleFormat(SegyHeader.DataSampleFormat).name;
Format=SegyHeader.Rev(Revision+1).DataSampleFormat(SegyHeader.DataSampleFormat).format;
BPS=SegyHeader.Rev(Revision+1).DataSampleFormat(SegyHeader.DataSampleFormat).bps;
txt=['SegyRevision ',sprintf('%0.4g',Revision),', ',FormatName,'(',num2str(SegyHeader.DataSampleFormat),')'];
%Revision=SegyHeader.SegyFormatRevisionNumber;
%if Revision>0, Revision=1; end
%FormatName=SegyHeader.Rev(Revision+1).DataSampleFormat(SegyHeader.DataSampleFormat).name;
%Format=SegyHeader.Rev(Revision+1).DataSampleFormat(SegyHeader.DataSampleFormat).format;
%BPS=SegyHeader.Rev(Revision+1).DataSampleFormat(SegyHeader.DataSampleFormat).bps;
%txt=['SegyRevision ',sprintf('%0.4g',Revision),',
%',FormatName,'(',num2str(SegyHeader.DataSampleFormat),')'];%
fseek(segyid,0,'eof'); DataEnd=ftell(segyid);
DataStart=3600+3200*SegyHeader.NumberOfExtTextualHeaders;
fseek(segyid,DataStart,'bof'); % Go to the beginning of the file
ntraces=(DataEnd-DataStart)./(240+(SegyHeader.ns)*(BPS/8));
hval=zeros(1,ntraces);
for itrace=1:ntraces
if ((itrace/1000)==round(itrace/1000))
progress_txt(itrace,ntraces,'Trace #')
end
%GOTO START OF TRACE HEADER
skip=DataStart+(itrace-1)*(240+(BPS/8)*SegyHeader.ns);
fseek(segyid,skip,'bof');
fseek(segyid,pos,'cof');
hval(itrace)=fread(segyid,1,precision);
end
fclose(segyid);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -