{"templateId":"markdown","sharedDataIds":{"sidebar":"sidebar-guides/sidebars.yaml"},"props":{"metadata":{"markdoc":{"tagList":["tabs","tab"]},"type":"markdown"},"seo":{"title":"Variable Trace Spacing","description":"Accelerate E&P application development and protect your innovation by consuming our Data and Domain APIs / Platform APIs.","lang":"en-US","meta":[{"name":"robots","content":"noindex"}],"llmstxt":{"hide":true,"excludeFiles":[]}},"dynamicMarkdocComponents":[],"compilationErrors":[],"ast":{"$$mdtype":"Tag","name":"article","attributes":{},"children":[{"$$mdtype":"Tag","name":"Heading","attributes":{"level":1,"id":"variable-trace-spacing","__idx":0},"children":["Variable Trace Spacing"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["This Seismic Variable Trace Spacing tutorial demonstrates how to integrate variable trace spacing into the ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"#/Seismic/Pipeline/seismicPipeline"},"children":["Seismic Pipeline."]},{"$$mdtype":"Tag","name":"br","attributes":{},"children":[]},"The first step is to initialize the ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"#/Seismic/gettingStarted"},"children":["Seismic Widget."]}," In the example below, variable trace spacing is checked."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"create-a-trace-mapping","__idx":1},"children":[{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"#/Seismic/variableTraceSpacing#TraceMapping"},"children":["#"]}," Create a Trace Mapping"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["To visualize variable trace spacing, the data series with the position of each trace in the model coordinates of the pipeline must be passed. The data series should be passed to the pipeline via the ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["setOptions"]}," or",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["setTraceMapping"]}," method after initialization. If trace spacing is enabled, trace decimation is automatically disabled."]},{"$$mdtype":"Tag","name":"Tabs","attributes":{"size":"medium"},"children":[]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"result","__idx":2},"children":[{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"#/Seismic/variableTraceSpacing#General"},"children":["#"]}," Result"]},{"$$mdtype":"Tag","name":"Tabs","attributes":{"size":"medium"},"children":[{"$$mdtype":"Tag","name":"div","attributes":{"label":"main","disable":false},"children":[{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"ts","header":{"controls":{"copy":{}}},"source":"import { AnnotationLocation } from \"@int/geotoolkit/layout/AnnotationLocation.ts\";\nimport { DisplayValueType } from \"@int/geotoolkit/seismic/axis/IndexTickGenerator.ts\";\nimport { ManipulatorType } from \"@int/geotoolkit/seismic/widgets/SeismicViewWidget.ts\";\nimport { SeismicWidget } from \"@int/geotoolkit/seismic/widgets/SeismicWidget.ts\";\nimport { InterpolationEdge } from \"@int/geotoolkit/seismic/pipeline/InterpolationEdge.ts\";\nimport { InterpolationType } from \"@int/geotoolkit/seismic/pipeline/InterpolationType.ts\";\nimport { NormalizationType } from \"@int/geotoolkit/seismic/pipeline/NormalizationType.ts\";\nimport { SeismicColors } from \"@int/geotoolkit/seismic/util/SeismicColors.ts\";\nimport { VSTraceMapping } from \"@int/geotoolkit/seismic/data/VSTraceMapping.ts\";\nimport { NumericalDataSeries } from \"@int/geotoolkit/data/NumericalDataSeries.ts\";\nimport { SeismicPipeline } from \"@int/geotoolkit/seismic/pipeline/SeismicPipeline.ts\";\nimport { MemoryReader } from \"@int/geotoolkit/seismic/data/MemoryReader.ts\";\nimport { Plot } from \"@int/geotoolkit/plot/Plot.ts\";\nimport { Events as RubberBandEvents } from \"@int/geotoolkit/controls/tools/RubberBand.ts\";\nconst traceCount = 500;\nlet mapping;\nconst createReader = function() {\n  const sampleRate = 1;\n  const sampleCount = 600;\n  const reader = new MemoryReader({\n    \"numberoftraces\": traceCount,\n    \"numberofsamples\": sampleCount,\n    \"samplerate\": sampleRate\n  }).setTraceProcessor({\n    \"getTraceData\": function(reader2, trace, traceId) {\n      for (let i = 0; i < sampleCount; i++) {\n        trace[i] = Math.sin((i / 10 + traceId / 4) * Math.PI) * 0.5;\n      }\n    },\n    \"getDataStatistics\": function() {\n      return {\n        \"average\": 0,\n        \"min\": -0.5,\n        \"max\": 0.5,\n        \"rms\": Math.sqrt(2) / 2\n      };\n    }\n  });\n  return reader;\n};\nconst createPipeline = function(reader) {\n  const pipeline = new SeismicPipeline({\n    \"name\": \"MemorySeismic\",\n    \"reader\": reader,\n    \"statistics\": reader.getStatistics()\n  });\n  const positions = new NumericalDataSeries();\n  let pos = 15;\n  for (let i = 0; i < traceCount; i++) {\n    positions.addValue(pos);\n    if (i !== 0 && i % 10 === 0) {\n      pos += 5.5;\n    } else {\n      pos += 1.1;\n    }\n    pos = Math.round(pos * 10) / 10;\n  }\n  mapping = new VSTraceMapping(pipeline, positions, 0.4);\n  const colorProvider = SeismicColors.getDefault();\n  pipeline.setOptions({\n    \"colors\": {\n      \"colormap\": colorProvider.createNamedColorMap(\"RedWhiteBlack\")\n    },\n    \"normalization\": {\n      \"scale\": 1,\n      \"type\": NormalizationType.Limits,\n      \"limits\": {\n        \"min\": -0.5,\n        \"max\": 0.5\n      }\n    },\n    \"plot\": {\n      \"type\": {\n        \"wiggle\": true,\n        \"negativecolorfill\": false,\n        \"positivecolorfill\": false,\n        \"interpolateddensity\": true,\n        \"simpledensity\": false\n      },\n      \"decimationspacing\": 1\n    },\n    \"tracemapping\": mapping,\n    \"traceoffset\": 10,\n    \"interpolation\": {\n      \"samples\": {\n        \"type\": InterpolationType.Quadratic,\n        \"edge\": InterpolationEdge.Duplicate\n      },\n      \"traces\": {\n        \"type\": InterpolationType.Quadratic,\n        \"edge\": InterpolationEdge.Duplicate\n      }\n    }\n  });\n  return pipeline;\n};\nfunction createWidget(pipeline) {\n  const widget = new SeismicWidget({\n    \"pipeline\": pipeline,\n    \"colorbar\": {\n      \"axis\": {\n        \"tickgenerator\": {\n          \"edge\": {\n            \"tickvisible\": false,\n            \"labelvisible\": false\n          }\n        }\n      }\n    },\n    \"layouttype\": \"inside\",\n    \"statusbar\": {\n      \"visible\": true\n    }\n  }).setScaleOptions({\n    \"tracescale\": 3,\n    \"samplescale\": 30,\n    \"deviceunit\": \"in\",\n    \"sampleunit\": \"ms\"\n  });\n  return widget;\n}\nfunction setVariableTraceMappingEnabled(plot, enable) {\n  const widget = plot.getRoot();\n  const modelLimits = widget.getSeismicModelLimits();\n  const visibleModelLimits = widget.getVisibleSeismicModelLimits();\n  const pipeline = widget.getPipeline();\n  pipeline.setTraceMapping(enable ? mapping : null);\n  if (modelLimits.getLeft() === visibleModelLimits.getLeft()) {\n    const adjustLimits = widget.getVisibleSeismicModelLimits().clone().setX(widget.getSeismicModelLimits().getLeft());\n    widget.setVisibleSeismicModelLimits(adjustLimits);\n  }\n}\nfunction setDistanceInsteadNumberEnabled(plot, enable) {\n  const widget = plot.getRoot();\n  const axisInfo = widget.getTraceHeaderAxis(\"TraceNumber\");\n  if (axisInfo == null)\n    return;\n  if (enable) {\n    axisInfo[\"axis\"].getTickGenerator().setDisplayValueType(DisplayValueType.Mapped);\n    axisInfo[\"label\"].setText(\"Distance\");\n  } else {\n    axisInfo[\"axis\"].getTickGenerator().setDisplayValueType(DisplayValueType.Original);\n    axisInfo[\"label\"].setText(\"Trace #\");\n  }\n  axisInfo[\"axis\"].invalidate();\n}\nfunction setTracePositionsOnlyEnabled(plot, enable) {\n  const widget = plot.getRoot();\n  widget.getPipeline().setOptions({\n    \"normalization\": {\n      \"scale\": enable ? 0 : 1\n    }\n  });\n  widget.setOptions({\n    \"colorbar\": {\n      \"visible\": !enable\n    },\n    \"annotationssizes\": {\n      \"west\": enable ? widget.getAnnotation(AnnotationLocation.West).getBounds().getWidth() : \"auto\"\n    }\n  });\n}\nfunction activateRubberBandZoom(plot) {\n  const widget = plot.getRoot();\n  widget.setManipulatorType(ManipulatorType.RubberBand);\n}\nfunction resetRubberBandZoom(plot) {\n  const widget = plot.getRoot();\n  widget.resetZoom();\n  widget.setScaleOptions({\n    \"tracescale\": 3,\n    \"samplescale\": 30,\n    \"deviceunit\": \"in\",\n    \"sampleunit\": \"ms\"\n  });\n  widget.setManipulatorType(ManipulatorType.Panning);\n}\nfunction createScene(canvas, cb) {\n  const reader = createReader();\n  const pipeline = createPipeline(reader);\n  const widget = createWidget(pipeline);\n  widget.getToolByName(\"rubberband\").on(RubberBandEvents.onZoomEnd, cb);\n  if (widget.getTraceHeaderAxis(\"TraceNumber\") != null) {\n    widget.getTraceHeaderAxis(\"TraceNumber\")[\"axis\"].getTickGenerator().setMinimumSpan(30);\n  }\n  return new Plot({\n    \"canvaselement\": canvas,\n    \"root\": widget\n  });\n}\nexport {\n  activateRubberBandZoom,\n  createScene,\n  resetRubberBandZoom,\n  setDistanceInsteadNumberEnabled,\n  setTracePositionsOnlyEnabled,\n  setVariableTraceMappingEnabled\n};\n\ncreateScene(document.querySelector('[ref=\"plot\"]'), () => {\n            this.setRubberBandEnabled(false);\n        });\n\n","lang":"ts"},"children":[]}]},{"$$mdtype":"Tag","name":"div","attributes":{"label":"css","disable":false},"children":[{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"css","header":{"controls":{"copy":{}}},"source":"\n.cg-tooltip-holder {\n  position: relative;\n}\n\n.cg-tooltip {\n  position: absolute;\n  display: block;\n  padding: 2px 12px 3px 7px;\n  overflow: visible !important;\n  font-family: Roboto, Helvetica, Arial, sans-serif;\n  font-size: 13px;\n  background: white !important;\n  opacity: 0.9;\n  color: #333333;\n  border: solid 1px gray;\n  border-radius: 5px;\n  text-align: left;\n  box-shadow: 0 4px 8px 0 rgba(0, 0, 0, 0.2), 0 6px 20px 0 rgba(0, 0, 0, 0.19);\n  border-radius: 5px;\n  margin: 0 !important;\n  z-index: 10000;\n  max-width: 400px;\n  text-wrap: normal !important;\n  white-space: normal !important;\n}\n/* Default setting for tooltip */\n.cg-tooltip-container {\n  position: absolute;\n  display: block;\n  overflow: visible !important;\n  font-family: Roboto, Helvetica, Arial, sans-serif;\n  font-size: 12px;\n  padding: 3px 7px;\n  background: #f7f7f7;\n  color: #333333;\n  border: 1px solid #938e8e;\n  opacity: 0.8;\n  text-align: left;\n  box-shadow: 3px 3px 10px #888;\n  margin: 0 !important;\n  z-index: 10000;\n  max-width: 400px;\n  text-wrap: normal !important;\n  white-space: normal !important;\n  user-select: none;\n}\n@media screen and (-ms-high-contrast: active), (-ms-high-contrast: none) {\n  .cg-tooltip-container {\n    border-radius: 0;\n  }\n}\n/* Default left arrow for tooltip */\n.cg-tooltip-arrow-left::before {\n  content: '';\n  position: absolute;\n  display: block;\n  width: 0px;\n  left: 0;\n  top: 50%;\n  border: 5px solid transparent;\n  border-left: 0;\n  border-right: 5px solid  #938e8e;\n  transform: translate(calc(-100%), -50%);\n}\n.cg-tooltip-arrow-left::after {\n  content: '';\n  position: absolute;\n  display: block;\n  width: 0px;\n  left: 0;\n  top: 50%;\n  border: 4px solid transparent;\n  border-left: 0;\n  border-right: 4px solid #f7f7f7;\n  transform: translate(calc(-100%), -50%);\n}\n/* Default top arrow for tooltip */\n.cg-tooltip-arrow-top::before {\n  content: '';\n  position: absolute;\n  display: block;\n  width: 0px;\n  left: 50%;\n  top: 0;\n  border: 5px solid transparent;\n  border-top: 0;\n  border-bottom: 5px solid #938e8e;\n  transform: translate(-50%, -100%);\n}\n.cg-tooltip-arrow-top::after {\n  content: '';\n  position: absolute;\n  display: block;\n  width: 0px;\n  left: 50%;\n  top: 0;\n  border: 4px solid transparent;\n  border-top: 0;\n  border-bottom: 4px solid #f7f7f7;\n  transform: translate(-50%, -100%);\n}\n/* Default right arrow for tooltip */\n.cg-tooltip-arrow-right::before {\n  content: '';\n  position: absolute;\n  display: block;\n  width: 0px;\n  right: 0;\n  top: 50%;\n  border: 5px solid transparent;\n  border-right: 0;\n  border-left: 5px solid #938e8e;\n  transform: translate(100%, -50%);\n}\n.cg-tooltip-arrow-right::after {\n  content: '';\n  position: absolute;\n  display: block;\n  width: 0px;\n  right: 0;\n  top: 50%;\n  border: 4px solid transparent;\n  border-right: 0;\n  border-left: 4px solid #f7f7f7;\n  transform: translate(100%, -50%);\n}\n/* Default bottom arrow for tooltip */\n.cg-tooltip-arrow-bottom::before {\n  content: '';\n  position: absolute;\n  display: block;\n  width: 0px;\n  left: 50%;\n  bottom: 0px;\n  border: 5px solid transparent;\n  border-bottom: 0;\n  border-top: 5px solid #938e8e;\n  transform: translate(-50%, 100%);\n  z-index: 10000;\n}\n.cg-tooltip-arrow-bottom::after {\n  content: '';\n  position: absolute;\n  display: block;\n  width: 0px;\n  left: 50%;\n  bottom: 0;\n  border: 4px solid transparent;\n  border-bottom: 0;\n  border-top: 4px solid #f7f7f7;\n  transform: translate(-50%, 100%);\n  z-index: 10000;\n}\n/* Tooltip item name */\n/* Tooltip item value */\n/* .cg-tooltip-item-value */\n/* Tooltip item value */\n.cg-tooltip-item-unit {\n  text-transform: none;\n}\n\n.cg-tooltip-item-name {\n    text-transform: capitalize;\n    white-space: nowrap;\n    vertical-align: middle;\n    font-size: 13px;\n}\n.cg-tooltip-row {\n  display: flex;\n  flex-direction: row;\n  align-items: center;\n  white-space: pre-wrap;\n  font-size: 12px;\n  line-height: 100%;\n  margin: 1px 0;\n}\n.cg-tooltip-title {\n  font-size: 13px;\n  height: 14px;\n  text-transform: capitalize;\n}\n.cg-tooltip-title .cg-tooltip-symbol {\n  margin-right: 0 !important;\n}\n.cg-tooltip-title-name {\n  vertical-align: middle;\n}\n.cg-tooltip-row + .cg-tooltip-row {\n  margin-top: 4px;\n}\n.cg-tooltip-row.cg-tooltip-title + .cg-tooltip-row {\n  margin-top: 5px;\n}\n.cg-tooltip-item-value + .cg-tooltip-item-unit {\n    margin-left: 1px;\n}\n/* Tooltip symbol */\n.cg-tooltip-symbol-cell {\n  display: inline-flex;\n  min-width: 13px; /* 10px size + 3px margin */\n}\n.cg-tooltip-symbol {\n  margin-right: 3px;\n  background-color: transparent;\n  display: block;\n}\n.cg-tooltip-symbol > img {\n  display: block;\n}\n.cg-tooltip-list-cell {\n  display: inline-flex;\n}\n.cg-tooltip-list-symbol {\n  display: block;\n  margin-right: 3px;\n  width: 6px;\n  height: 6px;\n  vertical-align: middle;\n  border-radius: 50%;\n  border: 1px solid rgba(0,0,0,.4);\n}\n.cg-tooltip-symbol-legacy {\n  border-radius: 4px;\n  margin-right: 5px;\n  height: 8px;\n  width: 8px;\n  display: inline-block;\n}\n.cg-tooltip-title-legacy {\n  font-weight: 900;\n}\n\n/* Tooltip symbol circle */\n.cg-tooltip-symbol.circle {\n  height: 10px;\n  width: 10px;\n  display: inline-block;\n  border-radius: 50%;\n  border: 1px solid rgba(0,0,0,.4);\n}\n/* Tooltip symbol line */\n.cg-tooltip-symbol.line {\n    height: 10px;\n    width: 10px;\n    display: inline-block;\n    transform: scale(1.2, 0.2);\n}\n/* Tooltip symbol diamond */\n.cg-tooltip-symbol.diamond {\n    height: 10px;\n    width: 10px;\n    display: inline-block;\n    transform: rotate(45deg);\n    border-radius: 0px;\n}\n/* Tooltip symbol square */\n.cg-tooltip-symbol.square {\n    height: 10px;\n    width: 10px;\n    display: inline-block;\n    border-radius: 0px;\n    border: 1px solid rgba(0,0,0,.4);\n}\n\n","lang":"css"},"children":[]}]}]},{"$$mdtype":"Tag","name":"iframe","attributes":{"src":"https://dc2-documentation.s3.amazonaws.com/documentation/slb-docs-test/5.0/examples/vue/tutorials/index.html#/Seismic/variableTraceSpacing?section=General&extract=true","width":"100%","height":"548.5px","style":{"border":"none"}},"children":[]}]},"headings":[{"value":"Variable Trace Spacing","id":"variable-trace-spacing","depth":1},{"value":"Create a Trace Mapping","id":"create-a-trace-mapping","depth":3},{"value":"Result","id":"result","depth":3}],"frontmatter":{"title":"Variable Trace Spacing","seo":{"title":"Variable Trace Spacing"}},"lastModified":"2026-02-11T19:54:32.000Z","pagePropGetterError":{"message":"","name":""}},"slug":"/solutions/geotoolkit/tutorials/seismic/variable-trace-spacing","userData":{"isAuthenticated":false,"teams":["anonymous"]},"isPublic":true}