diff --git a/CMakeLists.txt b/CMakeLists.txt index 449982097ebda3488e5cf58528b08a0e43bfd3c6..f3a736695e86d458708f07d518be66d38eb70281 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -4,7 +4,7 @@ if(CCACHE_PROGRAM) set_property(GLOBAL PROPERTY RULE_LAUNCH_COMPILE "${CCACHE_PROGRAM}") endif() -project(OpenVDS VERSION 1.1.1) +project(OpenVDS VERSION 1.1.2) set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_CURRENT_SOURCE_DIR}/CMake") diff --git a/src/SEGYUtils/SEGYUtils/TraceDataManager.h b/src/SEGYUtils/SEGYUtils/TraceDataManager.h index 151170f4cd962d7022a4ab0c0f5d67a2d7aa4585..6679041f80a896e0024a9d52d3bc2f6a032de1e8 100644 --- a/src/SEGYUtils/SEGYUtils/TraceDataManager.h +++ b/src/SEGYUtils/SEGYUtils/TraceDataManager.h @@ -41,24 +41,36 @@ public: for (auto segment = lower; segment != upper; ++segment) { - // axis factors for guessing trace numbers - const auto - secondaryKeySpanTotal = static_cast(segment->m_binInfoStop.m_crosslineNumber - segment->m_binInfoStart.m_crosslineNumber); - const auto - secondaryStartSpan = requestSecondaryKeyStart - segment->m_binInfoStart.m_crosslineNumber, - secondaryStopSpan = requestSecondaryKeyEnd - segment->m_binInfoStart.m_crosslineNumber; - const double - traceStartFactor = secondaryStartSpan <= 0 ? 0.0 : secondaryStartSpan / secondaryKeySpanTotal, - traceStopFactor = secondaryStopSpan <= 0 ? 0.0 : secondaryStopSpan / secondaryKeySpanTotal; - - // calculate approximate start and end traces - const auto - traceCount = segment->m_traceStop - segment->m_traceStart + 1; - const auto - startTrace = static_cast(segment->m_traceStart + traceCount * traceStartFactor), - stopTrace = static_cast(segment->m_traceStart + traceCount * traceStopFactor); - - addTraceRequests(requests, startTrace, stopTrace); + // does this segment have traces within the request secondary key range? + if (requestSecondaryKeyEnd < segment->m_binInfoStart.m_crosslineNumber || requestSecondaryKeyStart > segment->m_binInfoStop.m_crosslineNumber) + continue; + + if (segment->m_traceStart == segment->m_traceStop) + { + // The segment is only one trace long, and that trace is in the request range, so add a request + addTraceRequests(requests, segment->m_traceStart, segment->m_traceStart); + } + else + { + // axis factors for guessing trace numbers + const auto + secondaryKeySpanTotal = static_cast(segment->m_binInfoStop.m_crosslineNumber - segment->m_binInfoStart.m_crosslineNumber); + const auto + secondaryStartSpan = requestSecondaryKeyStart - segment->m_binInfoStart.m_crosslineNumber, + secondaryStopSpan = segment->m_binInfoStop.m_crosslineNumber - requestSecondaryKeyEnd; + const double + traceStartFactor = secondaryStartSpan <= 0 ? 0.0 : secondaryStartSpan / secondaryKeySpanTotal, + traceStopFactor = secondaryStopSpan <= 0 ? 1.0 : 1.0 - secondaryStopSpan / secondaryKeySpanTotal; + + // calculate approximate start and end traces + const auto + traceDistance = segment->m_traceStop - segment->m_traceStart; + const auto + startTrace = static_cast(segment->m_traceStart + traceDistance * traceStartFactor), + stopTrace = static_cast(segment->m_traceStart + traceDistance * traceStopFactor); + + addTraceRequests(requests, startTrace, stopTrace); + } } m_dataViewManager.addDataRequests(requests); @@ -148,6 +160,8 @@ private: const auto traceCount = std::min(m_tracesPerPage, m_numTraces - pageTrace); + assert(traceCount > 0); + DataRequestInfo dataRequestInfo; dataRequestInfo.offset = SEGY::TextualFileHeaderSize + SEGY::BinaryFileHeaderSize + pageTrace * m_traceByteSize;