# Create a Seismic Caching Reader
Create the caching reader as a proxy for another reader.
# Result
This tutorial demonstrates how to create a cache for traces. In this example, the CachingSeismicReader is the proxy for any SeismicReader. It saves traces in the inner cache at the first request and retrieves them from the cache at the following requests.
import { CachingReader } from "@int/geotoolkit/seismic/data/CachingReader.ts";
import { SeismicWidget } from "@int/geotoolkit/seismic/widgets/SeismicWidget.ts";
import { SeismicColors } from "@int/geotoolkit/seismic/util/SeismicColors.ts";
import { NormalizationType } from "@int/geotoolkit/seismic/pipeline/NormalizationType.ts";
import { SeismicPipeline } from "@int/geotoolkit/seismic/pipeline/SeismicPipeline.ts";
import { RemoteSeismicDataSource } from "@int/geotoolkit/seismic/data/RemoteSeismicDataSource.ts";
import { Plot } from "@int/geotoolkit/plot/Plot.ts";
const createSectionQuery = (position, key, oppositeKey) => {
const selectKeys = [];
selectKeys[0] = {
"name": key["key"],
"min": position,
"max": position,
"step": key["increment"],
"order": "asc"
};
selectKeys[1] = {
"name": oppositeKey["key"],
"min": oppositeKey["min"],
"max": oppositeKey["max"],
"step": oppositeKey["increment"],
"order": "asc"
};
return {
"keys": selectKeys,
"options": null,
"emptyTracesKey": {
"name": oppositeKey["key"],
"min": oppositeKey["min"],
"max": oppositeKey["max"]
}
};
};
const createReader = function(onready, onfailure) {
const host = "https://demo.int.com/INTGeoServer/json";
const data = new RemoteSeismicDataSource({
"host": host,
"file": "data/seismic/Gullfaks_Amplitude.xgy",
"version": 2
});
data.open(
() => {
const keys = data.getKeys();
const key = keys[0];
const oppositeKey = keys[1];
const query = createSectionQuery(key["min"], key, oppositeKey);
data.select(query, (reader) => {
onready(reader);
});
},
(err) => {
onfailure(err);
}
);
};
const createPipeline = function(reader) {
const pipeline = new SeismicPipeline({
"name": "Seismic",
"reader": reader,
"statistics": reader.getStatistics()
});
pipeline.setOptions({
"normalization": {
"type": NormalizationType.RMS,
"scale": 1
},
"plot": {
"type": {
"wiggle": false,
"interpolateddensity": true
},
"decimationspacing": 5
},
"colors": {
"colormap": SeismicColors.getDefault().createNamedColorMap("WhiteBlack", 32)
}
});
return pipeline;
};
const zoomIn = function(plot) {
const widget = plot.getRoot();
if (!(widget instanceof SeismicWidget)) {
return;
}
widget.zoomIn();
};
const zoomOut = function(plot) {
const widget = plot.getRoot();
if (!(widget instanceof SeismicWidget)) {
return;
}
widget.zoomOut();
};
function createScene(canvas, cb) {
const widget = new SeismicWidget({
"colorbar": {
"axis": {
"tickgenerator": {
"edge": {
"tickvisible": false,
"labelvisible": false
}
}
}
},
"layouttype": "inside",
"statusbar": {
"visible": false
},
"table": {
"size": 100,
"visible": false
}
});
createReader((reader) => {
const memoryLimit = 20;
const cachingReader = new CachingReader(reader, memoryLimit);
const pipeline = createPipeline(cachingReader);
widget.setPipeline(pipeline);
widget.setScaleOptions({
"tracescale": 20,
"samplescale": 200,
"deviceunit": "in",
"sampleunit": "ft"
});
const headerFields = pipeline.getReader().getTraceHeaderFields();
let headerInfo;
for (let i = 0; i < headerFields.length; i++) {
const header = headerFields[i];
if (header.getName() === "INLINE" || header.getName() === "XLINE") {
widget.setTraceHeaderVisible(header, true);
} else if (header.getName() === "TraceNumber") {
widget.setTraceHeaderVisible(header, false);
}
headerInfo = widget.getTraceHeaderAxis(header);
if (headerInfo) {
headerInfo["label"].getTextStyle().setColor("#6b6b6b");
}
}
}, (msg) => {
alert(msg);
});
return new Plot({
"canvaselement": canvas,
"root": widget
});
}
export { createScene, zoomIn, zoomOut };
createScene(document.querySelector('[ref="plot"]'));