?? gsegyformatwizard.c
字號:
/* * GSEGYLIB - Library for accessing files in SEG-Y format * * Copyright (C) 2005-2006 Vladimir Bashkardin * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more av. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. * * Author: Vladimir Bashkardin <vovizmus@users.sourceforge.net> */#include "gsegyformatwizard.h"G_DEFINE_TYPE (GSEGYFormatWizard, g_segy_format_wizard, G_TYPE_OBJECT)#define G_SEGY_FORMAT_WIZARD_GET_PRIVATE(obj) (G_TYPE_INSTANCE_GET_PRIVATE((obj), G_SEGY_TYPE_FORMAT_WIZARD, GSEGYFormatWizardPrivate))typedef enum { G_SEGY_HEADER_FIELD_UINT8 = 0, G_SEGY_HEADER_FIELD_INT8 = 1, G_SEGY_HEADER_FIELD_UINT16 = 2, G_SEGY_HEADER_FIELD_INT16 = 3, G_SEGY_HEADER_FIELD_UINT32 = 4, G_SEGY_HEADER_FIELD_INT32 = 5, G_SEGY_HEADER_FIELD_IEEE_FLOAT = 6, G_SEGY_HEADER_FIELD_IBM_FLOAT = 7, G_SEGY_HEADER_FIELD_GAIN_CODE = 8, G_SEGY_HEADER_FIELD_ARRAY_OF_UINT8 = 9, G_SEGY_HEADER_FIELD_ARRAY_OF_INT8 = 10, G_SEGY_HEADER_FIELD_ARRAY_OF_UINT16 = 11, G_SEGY_HEADER_FIELD_ARRAY_OF_INT16 = 12, G_SEGY_HEADER_FIELD_ARRAY_OF_UINT32 = 13, G_SEGY_HEADER_FIELD_ARRAY_OF_INT32 = 14, G_SEGY_HEADER_FIELD_ARRAY_OF_IEEE_FLOAT = 15, G_SEGY_HEADER_FIELD_ARRAY_OF_IBM_FLOAT = 16, G_SEGY_HEADER_FIELD_ARRAY_OF_GAIN_CODE = 17, G_SEGY_HEADER_FIELD_ARRAY_OF_CHAR = 18, G_SEGY_HEADER_FIELD_UNASSIGNED = 19,} GSEGYHeaderFieldType;typedef struct _GSEGYBinaryHeaderField GSEGYBinaryHeaderField;struct _GSEGYBinaryHeaderField { const gchar *title; guint16 size; guint16 offset; GSEGYHeaderFieldType type;};typedef struct _GSEGYTraceHeaderField GSEGYTraceHeaderField;struct _GSEGYTraceHeaderField { const gchar *title; const gchar *short_title; gboolean useable_for_sorting; guint16 size; guint16 offset; GSEGYHeaderFieldType type;};typedef struct _GSEGYSortingField GSEGYSortingField;struct _GSEGYSortingField { GSEGYTraceHeaderField *field_desc; guint16 offset;};typedef struct _GSEGYFormatWizardPrivate GSEGYFormatWizardPrivate;struct _GSEGYFormatWizardPrivate { GSEGYEndianess *endianess; const gchar *format_name; const gchar *short_format_name; const gchar *files_name; GPtrArray *files_extensions; guint16 ebcdic_header_size; guint16 binary_header_size; guint16 trace_header_size; guint16 bin_sample_interval; guint16 bin_number_of_samples; guint16 bin_sample_format; guint8 default_sample_id; guint8 default_sample_size; guint16 trc_sample_interval; guint16 trc_number_of_samples; guint16 trc_first_sample_value; GPtrArray *binary_header_desc; GPtrArray *trace_header_desc; GPtrArray *sorting_fields_names; GPtrArray *bin_fields_desc; GPtrArray *fields_names; GPtrArray *fields_desc; GPtrArray *sorting_fields_desc; guint16 sorting_desc_size; gboolean free_ptr_arrays;};static GSEGYBinaryHeaderField segy_rev1_binary_header[29] = { { "Job identification number", 4, 0, G_SEGY_HEADER_FIELD_UINT32 }, { "Line number", 4, 0, G_SEGY_HEADER_FIELD_UINT32 }, { "Reel number", 4, 0, G_SEGY_HEADER_FIELD_UINT32 }, { "Number of data traces per record", 2, 0, G_SEGY_HEADER_FIELD_UINT16 }, { "Number of auxillary traces per record", 2, 0, G_SEGY_HEADER_FIELD_UINT16 }, { "Sample interval of this reel's data in microseconds", 2, 0, G_SEGY_HEADER_FIELD_UINT16 }, { "Sample interval of original field recording in microseconds", 2, 0, G_SEGY_HEADER_FIELD_UINT16 }, { "Number of samples per trace for this reel's data", 2, 0, G_SEGY_HEADER_FIELD_UINT16 }, { "Number of samples per trace in original field recording", 2, 0, G_SEGY_HEADER_FIELD_UINT16 }, { "Data sample format code", 2, 0, G_SEGY_HEADER_FIELD_UINT16 }, { "CDP fold", 2, 0, G_SEGY_HEADER_FIELD_UINT16 }, { "Trace sorting code (1 - as recorded, 2 - CDP, 3 - fold profile, 4 - hor. stacked)", 2, 0, G_SEGY_HEADER_FIELD_UINT16 }, { "Vertical sum code", 2, 0, G_SEGY_HEADER_FIELD_UINT16 }, { "Sweep frequency at start", 2, 0, G_SEGY_HEADER_FIELD_UINT16 }, { "Sweep frequency at end", 2, 0, G_SEGY_HEADER_FIELD_UINT16 }, { "Sweep length in ms", 2, 0, G_SEGY_HEADER_FIELD_UINT16 }, { "Sweep type code (1 - linear, 2 - parabolic, 3 - exponential, 4 - other)", 2, 0, G_SEGY_HEADER_FIELD_UINT16 }, { "Trace number of sweep channel", 2, 0, G_SEGY_HEADER_FIELD_UINT16 }, { "Sweep trace taper length at start in ms", 2, 0, G_SEGY_HEADER_FIELD_UINT16 }, { "Sweep trace taper length at end in ms", 2, 0, G_SEGY_HEADER_FIELD_UINT16 }, { "Taper type (1 - linear, 2 - cosine squared, 3 - other)", 2, 0, G_SEGY_HEADER_FIELD_UINT16 }, { "Corellated data traces (1 - no, 2 - yes)", 2, 0, G_SEGY_HEADER_FIELD_UINT16 }, { "Binary gain recovered (1 - yes, 2 - no)", 2, 0, G_SEGY_HEADER_FIELD_UINT16 }, { "Amplitude recovery method (1 - one, 2 - sph. diverg., 3 - AGC, 4 - other)", 2, 0, G_SEGY_HEADER_FIELD_UINT16 }, { "Measurement system (1 - meters, 2 - feet)", 2, 0, G_SEGY_HEADER_FIELD_UINT16 }, { "Impulse signal polarity", 2, 0, G_SEGY_HEADER_FIELD_UINT16 }, { "Vibratory polarity code", 2, 0, G_SEGY_HEADER_FIELD_UINT16 }, { "Unassigned", 340, 0, G_SEGY_HEADER_FIELD_UNASSIGNED }, { NULL, 0, 0, G_SEGY_HEADER_FIELD_UNASSIGNED }};static GSEGYTraceHeaderField segy_rev1_trace_header[75] = { { "Trace sequence number withing line", "TraceSeqLine", TRUE, 4, 0, G_SEGY_HEADER_FIELD_UINT32 }, { "Trace sequence number withing reel", "TraceSeqReel", TRUE, 4, 0, G_SEGY_HEADER_FIELD_UINT32 }, { "Original field record number", "FFID", TRUE, 4, 0, G_SEGY_HEADER_FIELD_UINT32 }, { "Trace sequence number withing field record", "TraceSeqFFID", TRUE, 4, 0, G_SEGY_HEADER_FIELD_UINT32 }, { "Energy source point number", "", FALSE, 4, 0, G_SEGY_HEADER_FIELD_UINT32 }, { "CDP ensemble number", "CDP", TRUE, 4, 0, G_SEGY_HEADER_FIELD_UINT32 }, { "Trace sequence number within CDP ensemble", "TraceSeqCDP", TRUE, 4, 0, G_SEGY_HEADER_FIELD_UINT32 }, { "Trace identification code", "", FALSE, 2, 0, G_SEGY_HEADER_FIELD_UINT16 }, { "Number of vertically summed traces", "", FALSE, 2, 0, G_SEGY_HEADER_FIELD_UINT16 }, { "Number of horizontally stacked traces", "", FALSE, 2, 0, G_SEGY_HEADER_FIELD_UINT16 }, { "Data use (1 - production, 2 - test)", "", FALSE, 2, 0, G_SEGY_HEADER_FIELD_UINT16 }, { "Distance from source point to receiver group", "Offset", TRUE, 4, 0, G_SEGY_HEADER_FIELD_INT32 }, { "Receiver group elevation", "", FALSE, 4, 0, G_SEGY_HEADER_FIELD_INT32 }, { "Surface elevation at source", "", FALSE, 4, 0, G_SEGY_HEADER_FIELD_INT32 }, { "Surface depth below source", "", FALSE, 4, 0, G_SEGY_HEADER_FIELD_INT32 }, { "Datum elevation at reciever group", "", FALSE, 4, 0, G_SEGY_HEADER_FIELD_INT32 }, { "Datum elevation at source", "", FALSE, 4, 0, G_SEGY_HEADER_FIELD_INT32 }, { "Water depth at source", "", FALSE, 4, 0, G_SEGY_HEADER_FIELD_INT32 }, { "Water depth at reciever group", "", FALSE, 4, 0, G_SEGY_HEADER_FIELD_INT32 }, { "Scalar to for elevations and depths", "", FALSE, 2, 0, G_SEGY_HEADER_FIELD_INT16 }, { "Scalar to for coordinates", "", FALSE, 2, 0, G_SEGY_HEADER_FIELD_INT16 }, { "X source coordinate", "SourceX", TRUE, 4, 0, G_SEGY_HEADER_FIELD_INT32 }, { "Y source coordinate", "SourceY", TRUE, 4, 0, G_SEGY_HEADER_FIELD_INT32 }, { "X reciever group coordinate", "RecieverX", TRUE, 4, 0, G_SEGY_HEADER_FIELD_INT32 }, { "Y reciever group coordinate", "RecieverY", TRUE, 4, 0, G_SEGY_HEADER_FIELD_INT32 }, { "Coordinate units (1 - meters or feet 2 - arc seconds)", "", FALSE, 2, 0, G_SEGY_HEADER_FIELD_UINT16 }, { "Weathering velocity", "", FALSE, 2, 0, G_SEGY_HEADER_FIELD_UINT16 }, { "Subweathering velocity", "", FALSE, 2, 0, G_SEGY_HEADER_FIELD_UINT16 }, { "Uphole time at source", "", FALSE, 2, 0, G_SEGY_HEADER_FIELD_UINT16 }, { "Uphole time at reciever group", "", FALSE, 2, 0, G_SEGY_HEADER_FIELD_UINT16 }, { "Source static correction", "", FALSE, 2, 0, G_SEGY_HEADER_FIELD_INT16 }, { "Reciever group static correction", "", FALSE, 2, 0, G_SEGY_HEADER_FIELD_INT16 }, { "Total static applied", "", FALSE, 2, 0, G_SEGY_HEADER_FIELD_INT16 }, { "Lag time between end of header and time break in ms", "", FALSE, 2, 0, G_SEGY_HEADER_FIELD_INT16 }, { "Lag time between time break and shot in ms", "", FALSE, 2, 0, G_SEGY_HEADER_FIELD_INT16 }, { "Lag time between shot and recording start in ms", "", FALSE, 2, 0, G_SEGY_HEADER_FIELD_INT16 }, { "Start of mute time", "", FALSE, 2, 0, G_SEGY_HEADER_FIELD_UINT16 }, { "End of mute time", "", FALSE, 2, 0, G_SEGY_HEADER_FIELD_UINT16 }, { "Number of samples in this trace", "", FALSE, 2, 0, G_SEGY_HEADER_FIELD_UINT16 }, { "Sample interval of this trace in microseconds", "", FALSE, 2, 0, G_SEGY_HEADER_FIELD_UINT16 }, { "Field instrument gain type code", "", FALSE, 2, 0, G_SEGY_HEADER_FIELD_INT16 }, { "Insrument gain constant", "", FALSE, 2, 0, G_SEGY_HEADER_FIELD_INT16 }, { "Insrument gain early gain in dB", "", FALSE, 2, 0, G_SEGY_HEADER_FIELD_INT16 }, { "Corellated (1 - no / 2 - yes)", "", FALSE, 2, 0, G_SEGY_HEADER_FIELD_UINT16 }, { "Sweep frequency at start", "", FALSE, 2, 0, G_SEGY_HEADER_FIELD_UINT16 }, { "Sweep frequency at end", "", FALSE, 2, 0, G_SEGY_HEADER_FIELD_UINT16 }, { "Sweep length in ms", "", FALSE, 2, 0, G_SEGY_HEADER_FIELD_UINT16 }, { "Sweep type code (1 - linear, 2 - parabolic, 2 - exponential, 4 - ohter)", "", FALSE, 2, 0, G_SEGY_HEADER_FIELD_UINT16 }, { "Sweep trace taper length at start in ms", "", FALSE, 2, 0, G_SEGY_HEADER_FIELD_UINT16 }, { "Sweep trace taper length at end in ms", "", FALSE, 2, 0, G_SEGY_HEADER_FIELD_UINT16 }, { "Taper type code (1 - linear, 2 - cosine squared, 3 - other)", "", FALSE, 2, 0, G_SEGY_HEADER_FIELD_UINT16 }, { "Alias filter frequency", "", FALSE, 2, 0, G_SEGY_HEADER_FIELD_UINT16 }, { "Alias filter slope", "", FALSE, 2, 0, G_SEGY_HEADER_FIELD_UINT16 }, { "Notch filter frequency", "", FALSE, 2, 0, G_SEGY_HEADER_FIELD_UINT16 }, { "Notch filter slope", "", FALSE, 2, G_SEGY_HEADER_FIELD_UINT16 }, { "Low cut frequency", "", FALSE, 2, 0, G_SEGY_HEADER_FIELD_UINT16 }, { "High cut frequency", "", FALSE, 2, 0, G_SEGY_HEADER_FIELD_UINT16 }, { "Low cut slope", "", FALSE, 2, 0, G_SEGY_HEADER_FIELD_UINT16 }, { "High cut slope", "", FALSE, 2, 0, G_SEGY_HEADER_FIELD_UINT16 }, { "Year data recorded", "", FALSE, 2, 0, G_SEGY_HEADER_FIELD_UINT16 }, { "Day of year", "", FALSE, 2, 0, G_SEGY_HEADER_FIELD_UINT16 }, { "Hour of day", "", FALSE, 2, 0, G_SEGY_HEADER_FIELD_UINT16 }, { "Minute of hour", "", FALSE, 2, 0, G_SEGY_HEADER_FIELD_UINT16 }, { "Second of minute", "", FALSE, 2, 0, G_SEGY_HEADER_FIELD_UINT16 }, { "Time basis code (1 - local, 2 - GMT, 3 - other)", "", FALSE, 2, 0, G_SEGY_HEADER_FIELD_UINT16 }, { "Trace weighting factor for fixed-point format data", "", FALSE, 2, 0, G_SEGY_HEADER_FIELD_INT16 }, { "Geophone group number of roll switch position one", "", FALSE, 2, 0, G_SEGY_HEADER_FIELD_UINT16 }, { "Geophone group number of first trace of original field record", "", FALSE, 2, 0, G_SEGY_HEADER_FIELD_UINT16 }, { "Geophone group number of last trace of original field record", "", FALSE, 2, 0, G_SEGY_HEADER_FIELD_UINT16 }, { "Gap size (total number of groups dropped)", "", FALSE, 2, 0, G_SEGY_HEADER_FIELD_UINT16 }, { "Overtravel associated with taper (1 - down/behind, 2 - up/ahead)", "", FALSE, 2, 0, G_SEGY_HEADER_FIELD_UINT16 }, { "Inline number (only for 3D data)", "Inline", TRUE, 4, 0, G_SEGY_HEADER_FIELD_INT32 }, { "Xline number (only for 3D data)", "Xline", TRUE, 4, 0, G_SEGY_HEADER_FIELD_INT32 }, { "Unassigned", "", FALSE, 52, 0, G_SEGY_HEADER_FIELD_UNASSIGNED }, { NULL, 0, 0, G_SEGY_HEADER_FIELD_UNASSIGNED }};static void g_segy_format_wizard_setup (GSEGYFormatWizard* self) { GSEGYFormatWizardPrivate *private = G_SEGY_FORMAT_WIZARD_GET_PRIVATE (self); GSEGYSortingField *sort_field; guint16 i = 0; guint16 offset = 0; private->format_name = g_strdup ("Standard SEG-Y Revision 1 draft 6"); private->short_format_name = g_strdup ("SEG-Y rev1"); private->files_name = g_strdup ("SEG-Y files"); g_ptr_array_add (private->files_extensions, (gpointer)g_strdup ("*.sgy")); g_ptr_array_add (private->files_extensions, (gpointer)g_strdup ("*.segy")); g_ptr_array_add (private->files_extensions, (gpointer)g_strdup ("*.SGY")); g_ptr_array_add (private->files_extensions, (gpointer)g_strdup ("*.SEGY")); private->ebcdic_header_size = 3200; private->binary_header_size = 0; private->trace_header_size = 0; while (segy_rev1_binary_header[i].title) { segy_rev1_binary_header[i].offset = offset; g_ptr_array_add (private->binary_header_desc, (gpointer)&segy_rev1_binary_header[i]); private->binary_header_size += segy_rev1_binary_header[i].size; offset += segy_rev1_binary_header[i].size; if (segy_rev1_binary_header[i].type < G_SEGY_HEADER_FIELD_ARRAY_OF_UINT8) g_ptr_array_add (private->bin_fields_desc, (gpointer)segy_rev1_binary_header[i].title); i++; } g_ptr_array_add (private->bin_fields_desc, NULL); private->bin_sample_interval = 5; private->bin_number_of_samples = 7; private->bin_sample_format = 9; private->default_sample_id = G_SEGY_HEADER_FIELD_IEEE_FLOAT; private->default_sample_size = 4; private->sorting_desc_size = 0; i = 0; offset = 0; while (segy_rev1_trace_header[i].title) { segy_rev1_trace_header[i].offset = offset; g_ptr_array_add (private->trace_header_desc, (gpointer)&segy_rev1_trace_header[i]); private->trace_header_size += segy_rev1_trace_header[i].size; offset += segy_rev1_trace_header[i].size; if (segy_rev1_trace_header[i].useable_for_sorting) { g_ptr_array_add (private->sorting_fields_names, (gpointer)segy_rev1_trace_header[i].short_title); sort_field = (GSEGYSortingField*)g_malloc (sizeof (GSEGYSortingField)); sort_field->field_desc = &segy_rev1_trace_header[i]; sort_field->offset = private->sorting_desc_size; private->sorting_desc_size += segy_rev1_trace_header[i].size; g_ptr_array_add (private->sorting_fields_desc, (gpointer)sort_field); } if (segy_rev1_trace_header[i].type < G_SEGY_HEADER_FIELD_ARRAY_OF_UINT8) { g_ptr_array_add (private->fields_desc, (gpointer)segy_rev1_trace_header[i].title); g_ptr_array_add (private->fields_names, (gpointer)segy_rev1_trace_header[i].short_title); } i++; } g_ptr_array_add (private->fields_names, NULL); g_ptr_array_add (private->fields_desc, NULL); g_ptr_array_add (private->sorting_fields_names, NULL); g_ptr_array_add (private->sorting_fields_desc, NULL); private->trc_first_sample_value = 35; private->trc_number_of_samples = 38; private->trc_sample_interval = 39; private->free_ptr_arrays = FALSE;#ifdef DEBUG g_print ("Format wizard initialized for %s:\n", private->format_name); g_print ("EBCDIC header size: %d\n", private->ebcdic_header_size); g_print ("Binary header size: %d\n", private->binary_header_size); g_print ("Trace header size: %d\n", private->trace_header_size);#endif}GSEGYFormatWizard* g_segy_format_wizard_new (GSEGYEndianess *endianess) { return (g_object_new (G_SEGY_TYPE_FORMAT_WIZARD, "endianess", endianess, NULL));}const gchar* g_segy_format_wizard_get_name (GSEGYFormatWizard *self) {
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -