1313 from segy .transforms import Transform , TransformPipeline , ByteSwapTransform , IbmFloatTransform
1414 from numpy .typing import NDArray
1515
16-
17- class HeaderRawTransformedAccessor :
18- """Utility class to access both raw and transformed header data with single filesystem read.
19-
20- This class works as a consumer of SegyFile objects without modifying the package.
21- It achieves the goal by:
22- 1. Reading raw data from filesystem once
23- 2. Applying transforms to get transformed data
24- 3. Keeping both versions available
25-
26- The transforms used in SEG-Y processing are reversible:
27- - ByteSwapTransform: Self-inverse (swapping twice returns to original)
28- - IbmFloatTransform: Can be reversed by swapping direction
29- """
30-
31- def __init__ (self , segy_file : SegyFile ):
32- """Initialize with a SegyFile instance.
33-
34- Args:
35- segy_file: The SegyFile instance to work with
36- """
37- self .segy_file = segy_file
38- self .transform_pipeline = self .segy_file .header .transform_pipeline
39-
40- def _reverse_transforms (self , transformed_data : NDArray ) -> NDArray :
41- """Reverse the transform pipeline to get raw data from transformed data.
42-
43- Args:
44- transformed_data: Data that has been processed through the transform pipeline
45-
46- Returns:
47- Raw data equivalent to what was read directly from filesystem
48- """
49- # Start with the transformed data
50- raw_data = transformed_data .copy () if hasattr (transformed_data , 'copy' ) else transformed_data
51-
52-
53- # Apply transforms in reverse order with reversed operations
54- for i , transform in enumerate (reversed (self .transform_pipeline .transforms )):
55- raw_data = _reverse_single_transform (raw_data , transform )
56-
57- return raw_data
58-
59- @profile
6016def _reverse_single_transform (data : NDArray , transform : Transform ) -> NDArray :
6117 """Reverse a single transform operation.
6218
@@ -98,11 +54,10 @@ def _reverse_single_transform(data: NDArray, transform: Transform) -> NDArray:
9854 # This maintains compatibility if new transforms are added
9955 return data
10056
101-
10257def get_header_raw_and_transformed (
10358 segy_file : SegyFile ,
10459 indices : int | list [int ] | np .ndarray | slice
105- ) -> tuple [NDArray , NDArray ]:
60+ ) -> tuple [NDArray , NDArray , NDArray ]:
10661 """Convenience function to get both raw and transformed header data.
10762
10863 This is a drop-in replacement that provides the functionality you requested
@@ -127,38 +82,17 @@ def get_header_raw_and_transformed(
12782 # Slice of headers
12883 raw_hdrs, transformed_hdrs = get_header_raw_and_transformed(segy_file, slice(0, 10))
12984 """
130- return _get_header_raw_optimized (segy_file , indices )
131-
132- @profile
133- def _get_header_raw_optimized (
134- segy_file : SegyFile ,
135- indices : int | list [int ] | np .ndarray | slice
136- ) -> tuple [NDArray , NDArray ]:
137- """Ultra-optimized function that eliminates double disk reads entirely.
13885
139- This function:
140- 1. Gets transformed headers using the normal API (single disk read)
141- 2. Reverses the transforms on the already-loaded data (no second disk read)
142- 3. Returns both raw and transformed headers
86+ traces = segy_file .trace [indices ]
14387
144- Args:
145- segy_file: The SegyFile instance
146- indices: Which headers to retrieve
147-
148- Returns:
149- Tuple of (raw_headers, transformed_headers) where transformed_headers
150- is the same as what segy_file.header[indices] would return
151- """
152- # Get transformed headers using the normal API (single disk read)
153- transformed_headers = segy_file .header [indices ]
88+ transformed_headers = traces .header
15489
15590 # Reverse the transforms on the already-loaded transformed data
15691 # This eliminates the second disk read entirely!
15792 raw_headers = _reverse_transforms (transformed_headers , segy_file .header .transform_pipeline )
15893
159- return raw_headers , transformed_headers
94+ return raw_headers , transformed_headers , traces
16095
161- @profile
16296def _reverse_transforms (transformed_data : NDArray , transform_pipeline ) -> NDArray :
16397 """Reverse the transform pipeline to get raw data from transformed data.
16498
0 commit comments