{"templateId":"markdown","sharedDataIds":{"sidebar":"sidebar-guides/sidebars.yaml"},"props":{"metadata":{"markdoc":{"tagList":["tabs","tab"]},"type":"markdown"},"seo":{"title":"Read Trace Headers","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":"read-trace-headers","__idx":0},"children":["Read Trace Headers"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["This tutorial demonstrates how trace headers can be retrieved from the reader. The logic is based on ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["MemoryReader"]},", but can be used with any other reader."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"create-a-reader","__idx":1},"children":[{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"#/Seismic/Readers/TraceHeader/traceHeader#Reader"},"children":["#"]}," Create a Reader"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["In this example, the memory reader is used. It has several callbacks to provide trace samples \"getTraceData\", trace headers \"getTraceHeader\", trace headers fields \"getTraceHeaderFields\" with information about available headers, and data statistics. The code below creates memory reader and fills traces and headers by request."]},{"$$mdtype":"Tag","name":"Tabs","attributes":{"size":"medium"},"children":[]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"read-trace-headers-1","__idx":2},"children":[{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"#/Seismic/Readers/TraceHeader/traceHeader#Source"},"children":["#"]}," Read trace headers"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["The code below gets values for the first traces and displays them in the a table trace by trace as rows. First, the method ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["select"]}," of the reader is called. It returns traces as a parameter of callback. Second, in the loop retrieves each trace with method ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["getTrace"]}," and requests trace headers values using method ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["getHeader"]}," of the trace."]},{"$$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 { Group } from \"@int/geotoolkit/scene/Group.ts\";\nimport { CssLayout } from \"@int/geotoolkit/layout/CssLayout.ts\";\nimport { DataSheet } from \"@int/geotoolkit/widgets/datasheet/DataSheet.ts\";\nimport { MemoryReader } from \"@int/geotoolkit/seismic/data/MemoryReader.ts\";\nimport { FieldDesc } from \"@int/geotoolkit/seismic/data/FieldDesc.ts\";\nimport { Plot } from \"@int/geotoolkit/plot/Plot.ts\";\nimport { DataTable } from \"@int/geotoolkit/data/DataTable.ts\";\nconst createReader = () => {\n  const sampleRate = 1;\n  const sampleCount = 600;\n  const traceCount = 500;\n  const inlineMin = 1;\n  const xlineMin = 1;\n  const inlineCount = 50;\n  const xlineCount = 10;\n  return new MemoryReader({\n    \"numberoftraces\": traceCount,\n    \"numberofsamples\": sampleCount,\n    \"samplerate\": sampleRate\n  }).setTraceProcessor({\n    \"getTraceData\": function(reader, samples, traceId) {\n      for (let i = 0; i < sampleCount; i++) {\n        samples[i] = Math.sin((i / 10 + traceId / 4) * Math.PI);\n      }\n    },\n    \"getTraceHeaderFields\": function() {\n      return [\n        new FieldDesc(0, \"TraceNumber\"),\n        new FieldDesc(1, \"INLINE\"),\n        new FieldDesc(2, \"XLINE\")\n      ];\n    },\n    \"getTraceHeader\": function(reader, header, headerData, traceId) {\n      headerData[0] = traceId;\n      headerData[1] = inlineMin + Math.round(traceId / xlineCount) * xlineCount;\n      headerData[2] = xlineMin + traceId % inlineCount;\n    },\n    \"getDataStatistics\": function() {\n      return {\n        \"average\": 0,\n        \"min\": -1,\n        \"max\": 1,\n        \"rms\": Math.sqrt(2) / 2\n      };\n    }\n  });\n};\nfunction createScene(canvas) {\n  const rootContainer = new Group().setAutoModelLimitsMode(true).setLayout(new CssLayout());\n  const plot = new Plot({\n    \"canvaselement\": canvas,\n    \"root\": rootContainer\n  });\n  const reader = createReader();\n  reader.select({\n    \"from\": 0,\n    \"to\": 9\n  }, (result) => {\n    const traceFields = reader.getTraceHeaderFields();\n    const headerInlineIndex = traceFields.findIndex((item) => item.getName() === \"INLINE\");\n    const headerXlineIndex = traceFields.findIndex((item) => item.getName() === \"XLINE\");\n    const datatable = new DataTable({\n      cols: [\n        { name: \"Trace\", type: \"number\" },\n        { name: \"Inline\", type: \"number\" },\n        { name: \"Xline\", type: \"number\" }\n      ]\n    });\n    for (let i = 0; i < 10; i++) {\n      const trace = result.getTrace(i);\n      const inline = trace.getHeader(headerInlineIndex);\n      const xline = trace.getHeader(headerXlineIndex);\n      datatable.addRow([i + 1, inline, xline]);\n    }\n    const dataSheet = new DataSheet({\n      \"header\": {\n        \"headerdata\": [\"Trace\", \"INLINE\", \"XLINE\"]\n      },\n      \"data\": datatable,\n      \"mincolumnwidth\": 100,\n      \"indexvisible\": false,\n      \"horizontalscroll\": false,\n      \"verticalscroll\": false\n    });\n    dataSheet.getToolByName(\"TableViewSplitter\").setEnabled(false);\n    rootContainer.addChild([\n      dataSheet.setLayoutStyle({\n        \"top\": 0,\n        \"bottom\": 0,\n        \"left\": 0,\n        \"right\": 0\n      })\n    ]);\n  });\n  return plot;\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#/Seismic/Readers/TraceHeader/traceHeader?section=Source&extract=true","width":"100%","height":"438.5px","style":{"border":"none"}},"children":[]}]},"headings":[{"value":"Read Trace Headers","id":"read-trace-headers","depth":1},{"value":"Create a Reader","id":"create-a-reader","depth":3},{"value":"Read trace headers","id":"read-trace-headers-1","depth":3}],"frontmatter":{"title":"Read Trace Headers","seo":{"title":"Read Trace Headers"}},"lastModified":"2026-02-11T19:54:32.000Z","pagePropGetterError":{"message":"","name":""}},"slug":"/solutions/geotoolkit/tutorials/seismic/readers/trace-header","userData":{"isAuthenticated":false,"teams":["anonymous"]},"isPublic":true}