تتم استضافة الوثائق الرسمية على readthedocs.
Segyio هي مكتبة C صغيرة مرخصة من LGPL لسهولة التفاعل مع البيانات الزلزالية بتنسيق SEG-Y وSeismic Unix، مع روابط لغة لـ Python وMatlab. Segyio هي محاولة لإنشاء مكتبة سهلة الاستخدام وقابلة للتضمين وموجهة للمجتمع للتطبيقات الزلزالية. تتم إضافة الميزات حسب الحاجة إليها؛ الاقتراحات والمساهمات من جميع الأنواع هي موضع ترحيب كبير.
لمتابعة أحدث التطورات والميزات، راجع سجل التغيير. لكتابة رمز إثبات مستقبلي، راجع التغييرات العاجلة المخطط لها.
عندما يتم إنشاء وتثبيت segyio، تكون جاهزًا لبدء البرمجة! تحقق من البرنامج التعليمي والأمثلة والبرامج النموذجية ودفاتر الملاحظات النموذجية. للحصول على مرجع تقني يحتوي على أمثلة ووصفات صغيرة، اقرأ المستندات. تتوفر أيضًا مستندات API مع pydoc - ابدأ تشغيل مترجم Python المفضل لديك واكتب help(segyio)
، والذي يجب أن يتكامل بشكل جيد مع IDLE وpycharm وأدوات Python الأخرى.
import segyio
import numpy as np
with segyio . open ( 'file.sgy' ) as f :
for trace in f . trace :
filtered = trace [ np . where ( trace < 1e-2 )]
انظر الأمثلة للمزيد.
تتوفر نسخة من segyio كثنائيات معدة مسبقًا وكود مصدر:
apt install python3-segyio
pip install segyio
git clone https://github.com/statoil/segyio
لبناء segyio تحتاج إلى:
لبناء الوثائق، تحتاج أيضًا إلى أبو الهول
لإنشاء وتثبيت segyio، قم بتنفيذ الإجراءات التالية في وحدة التحكم الخاصة بك:
git clone https://github.com/equinor/segyio
mkdir segyio/build
cd segyio/build
cmake .. -DCMAKE_BUILD_TYPE=Release -DBUILD_SHARED_LIBS=ON
make
make install
يجب إجراء make install
كجذر لتثبيت النظام؛ إذا كنت تريد التثبيت في الدليل الرئيسي لديك، أضف -DCMAKE_INSTALL_PREFIX=~/
أو أي دليل مناسب آخر، أو make DESTDIR=~/ install
. يرجى التأكد من أن بيئتك تلتقط مواقع التثبيت غير القياسية (PYTHONPATH، وLD_LIBRARY_PATH، وPATH).
إذا كان لديك العديد من عمليات تثبيت Python، أو كنت ترغب في استخدام مترجم بديل، فيمكنك المساعدة في العثور على المترجم الصحيح عن طريق تمرير -DPYTHON_EXECUTABLE=/opt/python/binary
مع بادئة التثبيت ونوع البناء.
لإنشاء روابط matlab، قم باستدعاء CMake باستخدام الخيار -DBUILD_MEX=ON
. في بعض البيئات تكون ثنائيات Matlab في موقع غير قياسي، وفي هذه الحالة تحتاج إلى مساعدة CMake في العثور على ثنائيات Matlab عن طريق تمرير -DMATLAB_ROOT=/path/to/matlab
.
من المستحسن البناء في وضع التصحيح للحصول على المزيد من التحذيرات ولدمج رموز التصحيح في الكائنات. يعد استبدال Debug
Release
في CMAKE_BUILD_TYPE
أمرًا كثيرًا.
توجد الاختبارات في أدلة اللغة/الاختبارات، ويوصى بشدة أن يتم توضيح الميزات الجديدة المضافة للتأكد من صحتها وعقدها عن طريق إضافة اختبار. يمكن إجراء كافة الاختبارات عن طريق استدعاء ctest
. لا تتردد في استخدام الاختبارات المكتوبة بالفعل كدليل.
بعد إنشاء segyio، يمكنك إجراء الاختبارات باستخدام ctest
، والتي يتم تنفيذها من دليل البناء.
يرجى ملاحظة أنه لتشغيل أمثلة بايثون، يجب عليك السماح لبيئتك بمعرفة مكان العثور على مكتبة بايثون. يمكن تثبيته كمستخدم، أو عند إضافة مكتبة segyio/build/python إلى pythonpath الخاص بك.
تفترض جميع التعليمات البرمجية الموجودة في هذا البرنامج التعليمي أن segyio مستورد، وأن numpy متاح بتنسيق np.
import segyio
import numpy as np
يفترض هذا البرنامج التعليمي أنك على دراية بـ Python وnumpy. للتحديث، راجع البرنامج التعليمي لبايثون والبدء السريع numpy
يتم فتح ملف للقراءة باستخدام الدالة segyio.open
، ويتم استخدامه اصطلاحيًا مع مديري السياق. باستخدام عبارة with
، يتم إغلاق الملفات بشكل صحيح حتى في حالة الاستثناءات. بشكل افتراضي، يتم فتح الملفات للقراءة فقط.
with segyio . open ( filename ) as f :
...
يقبل Open عدة خيارات (للحصول على مرجع أكثر شمولاً، تحقق من سلسلة المستندات الخاصة بالدالة المفتوحة باستخدام help(segyio.open)
. الخيار الأكثر أهمية هو الوسيط الموضعي الثاني (الاختياري). لفتح ملف للكتابة، قم بـ segyio.open(filename, 'r+')
من الدالة C fopen
.
يمكن فتح الملفات في الوضع غير المنظم ، إما عن طريق تمرير segyio.open
الوسيطات الاختيارية strict=False
، وفي هذه الحالة لا يعد عدم إنشاء البنية (الأرقام المضمنة، والأرقام المتقاطعة وما إلى ذلك) خطأ، و ignore_geometry=True
، وفي هذه الحالة segyio لن يحاول حتى تعيين هذه السمات الداخلية.
يحتوي كائن الملف segy على عدة سمات عامة تصف هذه البنية:
f.ilines
الأرقام المضمنة المستنتجةf.xlines
أرقام الخطوط المتقاطعة المستنتجةf.offsets
أرقام الإزاحات المستنتجةf.samples
إزاحات العينة المستنتجة (التردد وتأخير وقت التسجيل)f.unstructured
صحيح إذا كان غير منظم، وخطأ إذا كان منظمًاf.ext_headers
عدد الرؤوس النصية الممتدة إذا تم فتح الملف بشكل غير منظم ، فستكون جميع خصائص السطر None
.
في segyio، يتم استرداد البيانات وكتابتها من خلال ما يسمى بالأوضاع . الأوضاع عبارة عن صفائف مجردة، أو أنظمة عنونة، وتغير ما تعنيه الأسماء والمؤشرات. جميع الأوضاع هي خصائص في كائن مقبض الملف، وتدعم وظيفة len
، وتتم القراءة والكتابة من خلال f.mode[]
. تتم الكتابة مع المهمة. تدعم الأوضاع تقطيع المصفوفة المستوحاة من numpy. الأوضاع التالية متاحة:
trace
يوفر وضع التتبع معالجة أولية للآثار كما هي موضحة في الملف. هذا، إلى جانب header
، هو الوضع الوحيد المتاح للملفات غير المنظمة. يتم تعداد الآثار 0..len(f.trace)
.
قراءة أثر ينتج عنها ndarray
numpy، وقراءة آثار متعددة تنتج مولد ndarray
s. يتم استخدام دلالات المولد وإعادة استخدام نفس الكائن، لذلك إذا كنت تريد تخزين بيانات التتبع مؤقتًا أو معالجتها لاحقًا، فيجب عليك نسخها بشكل صريح.
> >> f . trace [ 10 ]
> >> f . trace [ - 2 ]
> >> f . trace [ 15 : 45 ]
> >> f . trace [: 45 : 3 ]
header
من خلال سلوك العنونة المشابه trace
، فإن الوصول إلى العناصر يؤدي إلى كائنات الرأس بدلاً من numpy ndarray
s. الرؤوس هي كائنات تشبه الإملاء، حيث تكون المفاتيح عبارة عن أعداد صحيحة، ومفاتيح على نمط يونكس زلزالي (في وحدة segyio.su) وتعدادات segyio (segyio.TraceField).
يمكن تحديث قيم الرأس عن طريق تعيين أمر يشبه الإملاء، والمفاتيح غير الموجودة على الجانب الأيمن من المهمة غير معدلة .
> >> f . header [ 5 ] = { segyio . su . tracl : 10 }
> >> f . header [ 5 ]. items ()
> >> f . header [ 5 ][ 25 , 37 ] # read multiple values at once
iline
، xline
ستؤدي هذه الأوضاع إلى ظهور خطأ إذا كان الملف غير منظم. إنهم يعتبرون حجج []
كمفاتيح للأسطر المعنية. تتزايد أرقام الأسطر دائمًا، ولكن يمكن أن تحتوي على مسافات عشوائية وغير متساوية. يمكن العثور على الأسماء الصالحة في خصائص ilines
و xlines
.
كما هو الحال مع الآثار، الحصول على سطر واحد ينتج عنه ndarray
، وشريحة من الخطوط تنتج مولد ndarray
s. عند استخدام شرائح ذات خطوة، قد يتم تخطي بعض العناصر الوسيطة إذا لم تكن متطابقة مع الخطوة، على سبيل المثال إجراء f.line[1:10:3]
على ملف به أسطر [1,2,3,4,5]
يعادل البحث عن 1, 4, 7
والعثور على [1,4]
.
عند العمل مع ملف رباعي الأبعاد مسبق التكديس، تتم قراءة الإزاحة الأولى ضمنيًا. للوصول إلى نطاق مختلف أو من الإزاحات، استخدم مؤشرات أو نطاقات مفصولة بفواصل، مثل: f.iline[120, 4]
.
fast
، slow
هذه أسماء مستعارة لـ iline
و xline
، ويتم تحديدها من خلال كيفية وضع الآثار. بالنسبة للملفات التي تم فرزها في السطر، فإن fast
سيؤدي إلى iline
.
depth_slice
شريحة العمق عبارة عن قطع أفقي على مستوى الملف بعمق. القيم الناتجة هي ndarray
s ومولدات المصفوفات.
gather
gather
هو تقاطع خط مضمّن وخط متقاطع، وهو عمود رأسي للمسح، وما لم يتم تحديد إزاحة واحدة، يتم إرجاع إزاحة x عينات ndarray
. في حالة وجود النطاقات، فإنه يُرجع مولدًا لمثل هذه ndarray
s.
text
وضع text
عبارة عن مصفوفة من الرؤوس النصية، حيث text[0]
هو الرأس النصي القياسي، و 1..n
هي الرؤوس الموسعة الاختيارية.
يتم إرجاع رؤوس النص على شكل نقط بحجم 3200 بايت تشبه البايت كما هي في الملف. يمكن للوظيفة segyio.tools.wrap
إنشاء نسخة موجهة نحو الخط من هذه السلسلة.
bin
قيم الرأس الثنائي على مستوى الملف مع واجهة تشبه الإملاء. يتصرف مثل وضع header
، ولكن بدون الفهرسة.
> >> for line in f . iline [: 2430 ]:
... print ( np . average ( line ))
> >> for line in f . xline [ 2 : 10 ]:
... print ( line )
> >> for line in f . fast [:: 2 ]:
... print ( np . min ( line ))
> >> for factor , offset in enumerate ( f . iline [ 10 , :]):
... offset *= factor
print ( offset )
> >> f . gather [ 200 , 241 , :]. shape
> >> text = f . text [ 0 ]
> >> type( text )
< type 'bytes' >
> >> f . trace [ 10 ] = np . zeros ( len ( f . samples ))
يمكن العثور على المزيد من الأمثلة والوصفات في تعليمات سلاسل المستندات help(segyio)
وقسم الأمثلة.
لا يحاول Segyio بالضرورة أن يكون نهاية تفاعلات SEG-Y؛ بل نهدف إلى تقليل حاجز التفاعل مع ملفات SEG-Y للتضمين أو التطبيقات الجديدة أو البرامج القائمة بذاتها.
بالإضافة إلى ذلك، فإن الهدف ليس دعم المعيار الكامل أو جميع الملفات ذات التنسيق الغريب (ولكن المتوافق مع المعيار) المتوفرة. وقد تم وضع بعض الافتراضات، مثل:
حاليا، يدعم segyio:
تهدف وظيفة الكتابة في segyio إلى حد كبير إلى تعديل الملفات أو تكييفها. الملف الذي تم إنشاؤه من البداية ليس بالضرورة ملف SEG-Y حسب المواصفات، لأننا نكتب بالضرورة حقول الرأس التي يحتاجها segyio لفهم الشكل الهندسي. لا يزال يوصى بشدة بصيانة ملفات SEG-Y وكتابتها وفقًا للمواصفات، لكن segyio لا يفرض ذلك.
يمكن لـ Segyio التعامل مع الكثير من الملفات التي تشبه SEG-Y، أي أن segyio يتعامل مع الملفات التي لا تتوافق بشكل صارم مع معيار SEG-Y. لا يقوم Segyio أيضًا بالتمييز بين المراجعات، ولكنه بدلاً من ذلك يحاول استخدام المعلومات المتوفرة في الملف. للحصول على مرجع فعلي للمعايير، يرجى الاطلاع على المنشورات الصادرة عن SEG:
نحن نرحب بجميع أنواع المساهمات. يرجى الاطلاع على CONTRIBUTING.md.
xarray
لقد كتب آلان ريتشاردسون أداة صغيرة رائعة لاستخدام xarray مع ملفات segy، والتي يعرضها في هذا الدفتر
يتم تضمين الملفات الصغيرة بتنسيق SEG-Y في المستودع لأغراض الاختبار. البيانات غير حساسة وتم تصميمها بحيث يمكن التنبؤ بها، ويمكن تكرارها باستخدام segyio. يوجد ملف الاختبارات في دليل بيانات الاختبار. لإعادة إنتاج ملف البيانات، أنشئ segyio وقم بتشغيل برنامج الاختبار make-file.py
و make-ps-file.py
و make-rotated-copies.py
على هذا النحو:
python examples / make - file . py small . sgy 50 1 6 20 25
python examples / make - ps - file . py small - ps . sgy 10 1 5 1 4 1 3
python examples / make - rotated - copies . py small . sgy
تم إنشاء الملف Small-lsb.sgy عن طريق تشغيل برنامج flip-endianness. تم تضمين هذا البرنامج في شجرة مصدر segyio، ولكنه ليس جزءًا من الحزمة، وليس مخصصًا للتوزيع والتثبيت، فقط لإعادة إنتاج ملفات الاختبار.
تم إنشاء ملف unix الزلزالي Small.su وsmall-lsb.su بواسطة الأوامر التالية:
segyread tape=small.sgy ns=50 remap=tracr,cdp byte=189l,193l conv=1 format=1
> small-lsb.su
suswapbytes < small.su > small-lsb.su
إذا كان لديك ملفات بيانات صغيرة بترخيص مجاني، فلا تتردد في إرسالها إلى المشروع!
استيراد المكتبات المفيدة:
import segyio
import numpy as np
from shutil import copyfile
افتح ملف سيجي وتفحصه:
filename = 'name_of_your_file.sgy'
with segyio . open ( filename ) as segyfile :
# Memory map file for faster reading (especially if file is big...)
segyfile . mmap ()
# Print binary header info
print ( segyfile . bin )
print ( segyfile . bin [ segyio . BinField . Traces ])
# Read headerword inline for trace 10
print ( segyfile . header [ 10 ][ segyio . TraceField . INLINE_3D ])
# Print inline and crossline axis
print ( segyfile . xlines )
print ( segyfile . ilines )
قراءة مكعب بيانات ما بعد المكدس الموجود في ملف segy:
# Read data along first xline
data = segyfile . xline [ segyfile . xlines [ 1 ]]
# Read data along last iline
data = segyfile . iline [ segyfile . ilines [ - 1 ]]
# Read data along 100th time slice
data = segyfile . depth_slice [ 100 ]
# Read data cube
data = segyio . tools . cube ( filename )
قراءة مكعب البيانات المسبق الموجود في ملف segy:
filename = 'name_of_your_prestack_file.sgy'
with segyio . open ( filename ) as segyfile :
# Print offsets
print ( segyfile . offset )
# Read data along first iline and offset 100: data [nxl x nt]
data = segyfile . iline [ 0 , 100 ]
# Read data along first iline and all offsets gath: data [noff x nxl x nt]
data = np . asarray ([ np . copy ( x ) for x in segyfile . iline [ 0 : 1 , :]])
# Read data along first 5 ilines and all offsets gath: data [noff nil x nxl x nt]
data = np . asarray ([ np . copy ( x ) for x in segyfile . iline [ 0 : 5 , :]])
# Read data along first xline and all offsets gath: data [noff x nil x nt]
data = np . asarray ([ np . copy ( x ) for x in segyfile . xline [ 0 : 1 , :]])
قراءة وفهم البيانات "غير المنظمة" إلى حد ما (على سبيل المثال، البيانات التي تم فرزها في مجموعات مشتركة):
filename = 'name_of_your_prestack_file.sgy'
with segyio . open ( filename , ignore_geometry = True ) as segyfile :
segyfile . mmap ()
# Extract header word for all traces
sourceX = segyfile . attributes ( segyio . TraceField . SourceX )[:]
# Scatter plot sources and receivers color-coded on their number
plt . figure ()
sourceY = segyfile . attributes ( segyio . TraceField . SourceY )[:]
nsum = segyfile . attributes ( segyio . TraceField . NSummedTraces )[:]
plt . scatter ( sourceX , sourceY , c = nsum , edgecolor = 'none' )
groupX = segyfile . attributes ( segyio . TraceField . GroupX )[:]
groupY = segyfile . attributes ( segyio . TraceField . GroupY )[:]
nstack = segyfile . attributes ( segyio . TraceField . NStackedTraces )[:]
plt . scatter ( groupX , groupY , c = nstack , edgecolor = 'none' )
اكتب ملف segy باستخدام نفس رأس ملف آخر ولكن اضرب البيانات في *2
input_file = 'name_of_your_input_file.sgy'
output_file = 'name_of_your_output_file.sgy'
copyfile ( input_file , output_file )
with segyio . open ( output_file , "r+" ) as src :
# multiply data by 2
for i in src . ilines :
src . iline [ i ] = 2 * src . iline [ i ]
إنشاء ملف سيجي من سكراتش
filename='name_of_your_file.sgy'
% Inspect segy
Segy_struct=SegySpec(filename,189,193,1);
% Read headerword inline for each trace
Segy.get_header(filename,'Inline3D')
%Read data along first xline
data= Segy.readCrossLine(Segy_struct,Segy_struct.crossline_indexes(1));
%Read cube
data=Segy.get_cube(Segy_struct);
%Write segy, use same header but multiply data by *2
input_file='input_file.sgy';
output_file='output_file.sgy';
copyfile(input_file,output_file)
data = Segy.get_traces(input_file);
data1 = 2*data;
Segy.put_traces(output_file, data1);
في كثير من الأحيان تظهر المشكلات حيث يواجه شخص ما صعوبة في أداء segyio، خاصة عند إنشاء ملفات جديدة. غالبًا ما يكون الجاني هو هذا الرمز:
with segyio.create('new.sgy', spec) as dst:
dst.header = headers
الكود نفسه جيد تمامًا، ولكن له سلوك خفي في بعض الأنظمة عندما يتم إنشاء الملف حديثًا: فهو يقوم بالعديد من عمليات الكتابة المتفرقة إلى ملف متفرق. يمكن أن يكون هذا سريعًا أو بطيئًا، اعتمادًا إلى حد كبير على نظام الملفات.
أعد كتابة الحلقة للكتابة إلى الملف بشكل متجاور:
with segyio.create('new.sgy', spec) as dst:
for i in range(spec.tracecount):
dst.header[i] = headers[i]
dst.trace[i] = traces[i]
إذا كان الملف عبارة عن نسخة معدلة من ملف آخر، دون تغيير أطوال التتبع، فغالبًا ما يكون من الأسرع (والأسهل!) نسخ الملف أولاً دون segyio، ثم استخدام segyio لتعديل النسخة في مكانها:
shutil.copyfile(srcfile, dstfile)
with segyio.open(dstfile) as f:
f.header = headers
يظهر هذا الخطأ عندما يتعذر على المُحمل العثور على مكتبة segyio الأساسية. إذا قمت بتعيين بادئة التثبيت بشكل صريح (باستخدام -DCMAKE_INSTALL_PREFIX
) فيجب عليك تكوين برنامج التحميل الخاص بك ليبحث أيضًا في هذه البادئة، إما باستخدام ملف ld.conf.d
أو المتغير LD_LIBRARY_PATH
.
إذا لم تقم بتعيين CMAKE_INSTALL_PREFIX
، فسيتم تثبيت cmake افتراضيًا على /usr/local
، وهو ما يعرفه المُحمل عادةً. في الأنظمة المستندة إلى دبيان، غالبًا ما يتم تثبيت المكتبة على /usr/local/lib
، وهو ما قد لا يعرفه المُحمل. راجع العدد رقم 239.
sudo ldconfig
غالبًا ما يقوم بالخدعة)-DCMAKE_INSTALL_LIBDIR=lib64
يظهر هذا الاستثناء عندما يحاول segyio فتح الملف في الوضع الصارم، على افتراض أن الملف عبارة عن مجلد ثلاثي الأبعاد عادي ومفرز. إذا كان الملف مجرد مجموعة من التتبعات بترتيب عشوائي، فسيفشل هذا.
تحقق مما إذا كانت معلمات الإدخال segyio.open iline
و xline
صحيحة للملف الحالي. يدعم Segyio الملفات التي هي مجرد مجموعة من الآثار أيضًا، ولكن يجب إخباره أنه لا بأس في القيام بذلك. تمرير strict = False
أو ignore_geometry = True
لـ segyio.open
للسماح بالوضع غير المنظم أو فرضه على التوالي. يرجى ملاحظة أن f.iline
والميزات المشابهة معطلة الآن وستؤدي إلى حدوث أخطاء.
تمت كتابة Segyio في البداية وتتم صيانته بواسطة Equinor ASA كوسيلة مجانية وبسيطة وسهلة الاستخدام للتفاعل مع البيانات الزلزالية التي يمكن تصميمها وفقًا لاحتياجاتنا، وكمساهمة في مجتمع البرمجيات الحرة.