{"templateId":"markdown","sharedDataIds":{"sidebar":"sidebar-guides/sidebars.yaml"},"props":{"metadata":{"markdoc":{"tagList":["tabs","tab"]},"type":"markdown"},"seo":{"title":"Depth Shifting","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":"depth-shifting","__idx":0},"children":["Depth Shifting"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["The Depth Shifting tool is a specialized manipulator used to edit the curve depth shifting points."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"simple-depth-shifting","__idx":1},"children":[{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"#/WellLog/AdditionalFunctionality/DepthShifting/depthShifting#editDepthShifting"},"children":["#"]}," Simple Depth Shifting"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["This example displays all the functionalities of the Curve Depth Mapping tool. The left curve is a regular curve and the right curve is a curve with Depth Mapping.",{"$$mdtype":"Tag","name":"br","attributes":{},"children":[]},"Both curves has exactly the same Data Source instance."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["The Depth Mapping toolbar buttons enable/disable the three editing modes:"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Edit Mode"]}," - Allows dragging the selected depth-mapping marker along the track, changing related depth range transformation"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Insert Mode"]}," - Allows inserting a depth-mapping marker into the log curve at the depth at which the click occurred on the track. While dragging the mouse along the track, a host marker will be drawn across to show the corresponding depth."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Delete Mode"]}," - Allows deleting the selected depth-mapping marker by clicking."]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Depth Mapping tool is active at the begining but you need to add at least one shift point to start."]},{"$$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 { EventDispatcher } from \"@int/geotoolkit/util/EventDispatcher.ts\";\nimport { Plot } from \"@int/geotoolkit/plot/Plot.ts\";\nimport { KnownColors } from \"@int/geotoolkit/util/ColorUtil.ts\";\nimport { LogCurve } from \"@int/geotoolkit/welllog/LogCurve.ts\";\nimport { HeaderType as LogAxisVisualHeaderHeaderType } from \"@int/geotoolkit/welllog/header/LogAxisVisualHeader.ts\";\nimport { TrackType as WellLogTrackType } from \"@int/geotoolkit/welllog/TrackType.ts\";\nimport { Layer } from \"@int/geotoolkit/scene/Layer.ts\";\nimport { LogCurveDataSource } from \"@int/geotoolkit/welllog/data/LogCurveDataSource.ts\";\nimport { NumericalDataSeries } from \"@int/geotoolkit/data/NumericalDataSeries.ts\";\nimport { DataTable } from \"@int/geotoolkit/data/DataTable.ts\";\nimport { CSVWriter } from \"@int/geotoolkit/data/CSVWriter.ts\";\nimport { TextStream } from \"@int/geotoolkit/util/stream/TextStream.ts\";\nimport { DepthShiftingTool } from \"@int/geotoolkit/welllog/widgets/tools/DepthShiftingTool.ts\";\nimport { Events as EditorEvents } from \"@int/geotoolkit/controls/editing/Events.ts\";\nimport { from } from \"@int/geotoolkit/selection/from.ts\";\nimport { Events as ToolEvents } from \"@int/geotoolkit/controls/tools/AbstractTool.ts\";\nimport { LogData } from \"@int/geotoolkit/welllog/data/LogData.ts\";\nimport { HoldTitle } from \"@int/geotoolkit/welllog/header/HoldTitle.ts\";\nimport { Elements } from \"@int/geotoolkit/welllog/header/AdaptiveLogCurveVisualHeader.ts\";\nimport { Sections } from \"@int/geotoolkit/welllog/header/AdaptiveLogVisualHeader.ts\";\nimport { LasWriter } from \"/src/code/WellLog/utils/lasWriter.ts\";\nimport { createWellLogWidget } from \"/src/code/WellLog/utils/common.ts\";\nimport { curveData } from \"/src/code/WellLog/utils/curveData.ts\";\nexport class DepthShifting extends EventDispatcher {\n  constructor(canvas) {\n    super();\n    this._widget = this.initializeWidget();\n    this._plot = this.addWidgetToCanvas(canvas, this._widget);\n    const logCurve = from(this._widget).where((node) => node instanceof LogCurve).selectFirst();\n    this._depthShiftingTool = this.createDepthShiftingTool(this._widget).setHandleStyles({ \"ghostlinestyle\": \"blue\" }).setShape(logCurve);\n    const curves = from(this._widget.getTrack(3)).where((node) => node instanceof LogCurve).where((curve) => curve.getParent() instanceof Layer).selectToArray();\n    const synchronize = () => {\n      const depths = this.getShiftedDepths();\n      if (depths == null) {\n        return;\n      }\n      for (let i = 0; i < curves.length; i++) {\n        const curve = curves[i];\n        const logDataSource = new LogCurveDataSource().setData({\n          depths,\n          values: curve.getDataSource().getValues()\n        }).setName(curve.getName());\n        curve.setData(logDataSource);\n      }\n    };\n    const restore = () => {\n      for (let i = 0; i < curves.length; i++) {\n        const curve = curves[i];\n        const originalCurve = curve.getProperty(\"original\");\n        const logDataSource = new LogCurveDataSource().setData({\n          depths: originalCurve.getDataSource().getDepths(),\n          values: curve.getDataSource().getValues()\n        }).setName(curve.getName());\n        curve.setData(logDataSource);\n      }\n    };\n    synchronize();\n    this._depthShiftingTool.on(EditorEvents.Insert, synchronize).on(EditorEvents.Delete, synchronize).on(EditorEvents.Dragging, synchronize).on(EditorEvents.DragEnd, synchronize).on(EditorEvents.Clear, restore);\n  }\n  dispose() {\n    if (this._widget != null) {\n      this._widget.dispose();\n      this._widget = null;\n    }\n    if (this._plot != null) {\n      this._plot.dispose();\n      this._plot = null;\n    }\n  }\n  customizeCurveHeader(widget) {\n    const headerProvider = widget.getHeaderContainer().getHeaderProvider();\n    const header = headerProvider.getHeaderProvider(LogCurve.getClassName());\n    const customHeder = header.clone();\n    customHeder.setElement({\n      [Elements.ScaleFrom]: {\n        \"section\": Sections.Top\n      },\n      [Elements.ScaleTo]: {\n        \"section\": Sections.Top\n      },\n      [Elements.Line]: {\n        \"section\": Sections.Top\n      }\n    });\n    customHeder.setSection({\n      [Sections.Top]: {\n        \"paddingstyle\": \"5px 5px 5px\"\n      },\n      [Sections.Middle]: {\n        \"visible\": false,\n        \"size\": 0\n      },\n      [Sections.Bottom]: {\n        \"visible\": false,\n        \"size\": 0\n      }\n    });\n    headerProvider.registerHeaderProvider(LogCurve.getClassName(), customHeder);\n  }\n  initializeWidget() {\n    const widget = createWellLogWidget({\n      \"track\": {\n        \"header\": {\n          \"titlefirst\": false,\n          \"firsttolast\": true,\n          \"toptobottom\": false,\n          \"holdtitle\": HoldTitle.Top\n        }\n      }\n    }).setAxisHeaderType(LogAxisVisualHeaderHeaderType.Simple);\n    this.customizeCurveHeader(widget);\n    widget.addTrack(WellLogTrackType.IndexTrack);\n    widget.addTrack(WellLogTrackType.LinearTrack).addChild([\n      this.createCurve(\"CALI\").setName(\"CALI - orig\").setLineStyle({ \"pattern\": [2, 2] }, true)\n    ]);\n    widget.addTrack(WellLogTrackType.AnnotationTrack).setWidth(40);\n    const shiftCurves = [\n      this.createCurve(\"RHOB\").setLineStyle(\"#404B97\"),\n      this.createCurve(\"DLT\").setLineStyle(\"#76EAE8\"),\n      this.createCurve(\"SP\").setLineStyle(\"#8EE48D\"),\n      this.createCurve(\"CALI\").setLineStyle(\"#7E5381\")\n    ];\n    widget.addTrack(WellLogTrackType.LinearTrack).addChild(shiftCurves.map(\n      (curve) => curve.setLineStyle({ \"pattern\": [2, 2] }, true).setOpacity(0.5)\n    )).addChild(\n      new Layer().addChild(shiftCurves.map(\n        (curve) => curve.clone().setProperty(\"original\", curve).setLineStyle({ \"pattern\": null }, true).setOpacity(1)\n      ))\n    );\n    widget.addTrack(WellLogTrackType.IndexTrack);\n    const logCurve = from(widget).where((node) => node instanceof LogCurve).selectFirst();\n    widget.setDepthLimits(logCurve.getModelLimits().getTop(), logCurve.getModelLimits().getBottom());\n    return widget;\n  }\n  getEditMode() {\n    return this._depthShiftingTool != null ? this._depthShiftingTool.getMode() : null;\n  }\n  addWidgetToCanvas(canvas, widget) {\n    const plot = new Plot({\n      \"canvaselement\": canvas,\n      \"root\": widget\n    });\n    widget.setVisibleDepthLimits(1e4, 12e3);\n    widget.setHeaderHeight(\"auto\");\n    return plot;\n  }\n  createDepthShiftingTool(widget) {\n    const manipulatorLayer = new Layer({\n      id: \"curves.manipulator.layer\"\n    });\n    widget.getTrackManipulatorLayer().addChild(manipulatorLayer);\n    const depthShiftingTool = new DepthShiftingTool({\n      \"layer\": manipulatorLayer,\n      \"handlestyles\": {\n        \"activelinestyle\": {\n          \"color\": \"blue\"\n        },\n        \"ghostlinestyle\": {\n          \"color\": \"red\"\n        },\n        \"depthlabelfillstyle\": \"#D8F2D7\",\n        \"depthlabelpaddingstyle\": \"5px 8px 2px\"\n      }\n    });\n    const tools = widget.getTool();\n    const toolTip = tools.getToolByName(\"tooltip\");\n    depthShiftingTool.on(ToolEvents.onStateChanged, (event, tool) => {\n      this.notify(ToolEvents.onStateChanged, this);\n      toolTip.setEnabled(tool.isActive() === false);\n    });\n    tools.getToolByName(\"cross-hair\").getParentTool().add(depthShiftingTool);\n    return depthShiftingTool;\n  }\n  createTestData(dataMnemonic, from2, step) {\n    from2 = from2 || 4500;\n    step = step || 10;\n    const depths = [];\n    const values = [];\n    const curveDat = curveData[dataMnemonic];\n    const amountOfPoints = curveDat.length;\n    for (let i = 0; i < amountOfPoints; i++) {\n      depths.push(i * step + from2);\n      values.push(curveDat[i]);\n    }\n    return new LogData({\n      \"name\": dataMnemonic,\n      \"depths\": depths,\n      \"values\": values\n    });\n  }\n  createCurve(dataSource) {\n    if (typeof dataSource === \"string\") {\n      dataSource = this.createTestData(dataSource);\n    }\n    return new LogCurve(dataSource, true).setId(dataSource.getName()).setName(dataSource.getName()).setLineStyle({\n      \"color\": KnownColors[\"Blue\"],\n      \"width\": 2\n    });\n  }\n  getShiftedDepths() {\n    const logCurve = this._depthShiftingTool.getShape();\n    if (logCurve == null) {\n      return null;\n    }\n    const originalDepths = logCurve.getDataSource().getDepths();\n    const depthLimits = this._depthShiftingTool.getRange();\n    const mapping = this._depthShiftingTool.getDepthMappings();\n    return DepthShiftingTool.mapDepths(depthLimits, mapping, originalDepths);\n  }\n  getDataSourcesToExport() {\n    const originalCurves = from(this._widget.getTrack(3)).where((node) => node instanceof LogCurve).where((curve) => curve.getParent() instanceof Layer === false).selectToArray();\n    return originalCurves.map((curve) => curve.getDataSource());\n  }\n  getExportDataTable() {\n    const depths = this.getShiftedDepths();\n    if (depths == null) {\n      return null;\n    }\n    const depthSeries = new NumericalDataSeries({\n      id: \"depths\",\n      name: \"depths\",\n      unit: \"ft\",\n      data: depths\n    });\n    const columns = [depthSeries];\n    this.getDataSourcesToExport().forEach((data) => {\n      const valueSeries = new NumericalDataSeries({\n        id: data.getName(),\n        name: data.getName(),\n        unit: data.getValueUnit(),\n        data: data.getValues()\n      });\n      columns.push(valueSeries);\n    });\n    return new DataTable({\n      \"cols\": columns,\n      \"meta\": {\n        \"index\": 0\n      }\n    });\n  }\n  saveToLAS() {\n    const table = this.getExportDataTable();\n    if (table == null) {\n      return;\n    }\n    new LasWriter().save(table, \"example.las\");\n  }\n  exportToCSV() {\n    const table = this.getExportDataTable();\n    if (table == null) {\n      return;\n    }\n    new CSVWriter({\n      \"stream\": new TextStream({\n        \"filename\": \"csvfile.csv\",\n        \"type\": \"text/csv\",\n        \"save\": true\n      })\n    }).writeTable(table, {\n      \"includeheaders\": true\n    }).close();\n  }\n  setMode(mode) {\n    this._depthShiftingTool.setMode(mode);\n    return this;\n  }\n  setEnable(enable) {\n    this._depthShiftingTool.setEnabled(enable);\n    if (enable) {\n      const logCurve = from(this._widget).where((node) => node instanceof LogCurve).selectFirst();\n      this._depthShiftingTool.setShape(logCurve);\n    } else {\n      this._depthShiftingTool.setShape(null);\n      this._depthShiftingTool.clearDepthMapping();\n    }\n    return this;\n  }\n}\nfunction createScene(canvas) {\n  return new DepthShifting(canvas);\n}\nexport { createScene };\n\ncreateScene(document.querySelector('[ref=\"plot\"]'));\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#/WellLog/AdditionalFunctionality/DepthShifting/depthShifting?section=editDepthShifting&extract=true","width":"100%","height":"748.5px","style":{"border":"none"}},"children":[]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"advanced-depth-shifting","__idx":2},"children":[{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"#/WellLog/AdditionalFunctionality/DepthShifting/depthShifting#advancedDepthShifting"},"children":["#"]}," Advanced Depth Shifting"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Depth Mapping tool is activated at second LogTrack."]},{"$$mdtype":"Tag","name":"Tabs","attributes":{"size":"medium"},"children":[]},{"$$mdtype":"Tag","name":"iframe","attributes":{"src":"https://dc2-documentation.s3.amazonaws.com/documentation/slb-docs-test/5.0/examples/vue/tutorials/index.html#/WellLog/AdditionalFunctionality/DepthShifting/depthShifting?section=advancedDepthShifting&extract=true","width":"100%","height":"739.5px","style":{"border":"none"}},"children":[]}]},"headings":[{"value":"Depth Shifting","id":"depth-shifting","depth":1},{"value":"Simple Depth Shifting","id":"simple-depth-shifting","depth":3},{"value":"Advanced Depth Shifting","id":"advanced-depth-shifting","depth":3}],"frontmatter":{"title":"Depth Shifting","seo":{"title":"Depth Shifting"}},"lastModified":"2026-02-11T19:54:32.000Z","pagePropGetterError":{"message":"","name":""}},"slug":"/solutions/geotoolkit/tutorials/well-log/additional-functionality/depth-shifting","userData":{"isAuthenticated":false,"teams":["anonymous"]},"isPublic":true}