Reading SEG-Y files
This section documents how SEG-Y files are read using SegyMAT.
ReadSegy
ReadSegy.m can be used to read SEG-Y formatted files :
[Data,SegyTraceHeaders,SegyHeader]=ReadSegy('data.segy');
wiggle(Data,[],SegyHeader.time,[SegyTraceHeaders.cdp],'VA')
imagesc([SegyTraceHeaders.cdp],[SegyHeader.time],Data)
This will read data.segy using the revision and data sample format
specified in the binary header (SegyHeader), and plot the data using
the wiggle plotting function.
Data is a 2D variable containing the seismic data of size
[Nsamples x Ntraces].
SegyTraceHeaders is a [1 x Ntraces] structure containing all the
header values from the traces. Typing SegyTraceHeaders will list the
header information. SegyTraceHeaders(9) lists all header names and
values of trace number 9.
>> SegyTraceHeaders(9)
ans =
SegyMAT_TraceStart: 91952
TraceSequenceLine: 0
TraceSequenceFile: 9
FieldRecord: 0
TraceNumber: 9
EnergySourcePoint: 0
cdp: 0
cdpTrace: 0
TraceIdenitifactionCode: 0
NSummedTraces: 0
NStackedTraces: 0
DataUse: 0
offset: 400
...
SourceEnergyDirectionMantissa: 0
SourceEnergyDirectionExponent: 0
SourceMeasurementMantissa: 0
SourceMeasurementExponent: 0
SourceMeasurementUnit: 0
UnassignedInt1: 0
UnassignedInt2: 0
SegyMAT_TraceDataStart: 92192
To access an array of trace header values simply use square brackets as :
cdp=[SegyTraceHeaders.cdp];
offset=[SegyTraceHeaders.offset];
...
SegyHeader is a structure containing all the Segyheader values.
Typing SegyHeader will list the names and values of all header
values.
>> SegyHeader
SegyHeader =
Rev: [1x2 struct]
TextualFileHeader: [3200x1 double]
Job: 0
Line: 0
Reel: 0
DataTracePerEnsemble: 0
AuxiliaryTracePerEnsemble: 0
dt: 1000
dtOrig: 0
ns: 2701
nsOrig: 0
DataSampleFormat: 5
EnsembleFold: 0
TraceSorting: 0
VerticalSumCode: 0
SweepFrequencyStart: 0
SweepFrequencyEnd: 0
SweepLength: 0
SweepType: 0
SweepChannel: 0
SweepTaperlengthStart: 0
SweepTaperLengthEnd: 0
TaperType: 0
CorrelatedDataTraces: 0
BinaryGain: 0
AmplitudeRecoveryMethod: 0
MeasurementSystem: 1
ImpulseSignalPolarity: 0
VibratoryPolarityCode: 0
Unassigned1: [120x1 double]
SegyFormatRevisionNumber: 100
FixedLengthTraceFlag: 1
NumberOfExtTextualHeaders: 0
Unassigned2: [47x1 double]
time: [1x2701 double]
A number of arguments can be given to ReadSegy, controlling what
type of and which part of the data to read.
Read specific trace numbers
To read traces 100, 201 and 320 use e.g.
>> [Data,SegyTraceHeaders,SegyHeader]=ReadSegy(filename,'traces',[100 201 320]);
Use for example ReadSegyTraceHeadervalue.m and ‘find’ to find a list of trace ids (this is equivalent to using the ‘minmax’ option)
>> cdp=ReadSegyTraceHeaderValue(filename,'key','cdp');
>> traces = find(cdp>100 & cdp<200)
>> [Data,SegyTraceHeaders,SegyHeader]=ReadSegy(filename,'traces',[100 201 320]);
Read only every 5th trace
>> [Data,SegyTraceHeaders,SegyHeader]=ReadSegy(filename,'jump',5);
To read time slice 0.5 < t < 5
>> [Data,SegyTraceHeaders,SegyHeader]=ReadSegy(filename,'trange',.5,3);
Read data in a CDP header range (5000 < cdp < 5800)
[Data,SegyTraceHeaders,SegyHeader]=ReadSegy(filename,'minmax','cdp',5000,5800);
### Read only header values
In some cases it can be desirable only to read the header information (the SegyHeader and SegyTraceHeaders). This will return an empty `Data` variable.
[Data,SegyTraceHeaders,SegyHeader]=
ReadSegy(filename,'SkipData',1);
### SEG-Y format revision
SEG-Y format revision number can be '0' (1975) or '1' (2002). By default
the SEG-Y format revision number is read in the binary header, but this
can be overruled using :
[Data,SegyTraceHeaders,SegyHeader]=
ReadSegy(filename,'revision',0);
### A specific Data Sample Format
One can overrule the Data Sample Format listed in the binary header,
using the `dsf` argument. See [Data Sample Formats](format.html#DataSampleFormatSupport) for a list
of valid and supported values.
% Rev 0, IBM FLOATING POINT [Data,SegyTraceHeaders,SegyHeader]=
ReadSegy(filename,'revision',0,'dsf',1); % Rev 1, IEEE FLOATING
POINT [Data,SegyTraceHeaders,SegyHeader]=
ReadSegy(filename,'revision',1,'dsf',5);
If `dsf` is set to 5 and `revision` to 0, a warning message will occur,
since data sample format 5 is only defined in revision 1. The revision
is then automatically set to 1.
### Force the use of a specific SegyHeader
[Data,SegyTraceHeaders,SegyHeader]=
ReadSegy(filename,'SegyHeader',SegyHeader);
## ReadSegyFast {#ReadSegyFast}
`ReadSegyFast.m` is a faster implementation of [ReadSegy.m](#ReadSegy)
since no trace header values are read. Thus this function will just
return the seismic data and the SegyHeader. e.g. :
[Data,SegyHeader]=ReadSegyFast('data.segy'); imagesc(Data)
If `ReadSegy` is called with only one output argument, `ReadSegyFast` will be used instead of `ReadSegy`.
### ReadSegyFast options
Most of the same options that works for [ReadSegy.m](#ReadSegy) will also work for [ReadSegyFast.m](#ReadSegyFast). The data sample format can be chosen using the 'revision' and 'dsf'
tags. Also a 'SegyHeader' can be specified.
[ReadSegyFast.m](#ReadSegyFast) is currently optimized only for reading
the whole SEGY-Y file, but the options 'jump' and 'trange' can be used (but
will currently not result in faster read times).
Since the trace header values are not read, the '[minmax](#minmax)' option is not
supported.
## ReadSegyHeader {#ReadSegyHeader}
`ReadSegyHeader.m` reads the Binary Segy Header only. It can be called
with the same options as [ReadSegy.m](#ReadSegy)
### Force using little endian :
SegyHeader=ReadSegyHeader(filename,'endian','l');
## ReadSegyTraceHeaderValue {#ReadSegyTraceHeaderValue}
`ReadSegyTraceHeaderValue.m` reads one trace header value into an array. This approach is much faster than to read the whole file
### using a keyword
To read a trace header value by its trace header key. See the definition of all the [Trace Header names](format.html#TraceHeaderDef) to use the correct key:
cdp=ReadSegyTraceHeaderValue(filename,’key’,’cdp’); SourceX=ReadSegyTraceHeaderValue(filename,’key’,’SourceX’); SourceY=ReadSegyTraceHeaderValue(filename,’key’,’SourceY’); plot(SourceX,SourceY)
### using location+type
To read a trace header by its position in the trace header using a
specific data sample format, use:
SourceX=ReadSegyTraceHeaderValue(filename,’pos’,70,’precision’,’int32’);
## ReadSegyConstantTraceLength {#ReadSegyConstantTraceLength}
Assuming a constant trace length (which is much more common than not) allows much faster reading of parts of large file. For example to read trace number 2030, the whole SEG-Y file must be sequentially read, assuming variable trace length. Assuming constant trace length the trace can be directly (and fast) located in the data cube.
To read trace 2030 use
[Data,SegyTraceHeader,SegyHeader]=ReadSegyConstantTraceLength(filename,’trace’,2030);
To read traces 1-2000 and 2020-2040 use
[Data,SegyTraceHeader,SegyHeader]=ReadSegyConstantTraceLength(filename,’trace’,[1:2000,2020:2040]);
### using keywords
Several keywords can be used to efficiently read parts of larger files.
To read only the part of a file with SourceX between 1000-2000 and
SourceY between 4000-5000 use :
[Data,SegyTraceHeader,SegyHeader]=ReadSegyConstantTraceLength(filename,’minmax’,’SourceX’,1000,2000,’minmax’,’SourceY’,4000,5000]);
## ReadSu {#ReadSu}
`ReadSu.m` works similar to [ReadSegy.m](#ReadSegy) and the same input parameters can be used. A `SuHeader` can optionally be returned, but as there is no (SEG-Y)-Header information in a SU file it is mostly empty.
[Data,SuTraceHeaders,SuHeader]=ReadSu(filename); \`\`\`