Working with Units

When you work with numbers, you often need to know the unit of the quantity expressed. INTViewer has a simple unit system to retrieve units and convert numbers expressed in different units.

Retrieving the vertical unit of a dataset

If a dataset (implementing com.interactive.intviewerapi.data.IData) has time or depth unit information, this dataset implements the com.interactive.intviewerapi.units.IZUnitProvider interface. The only method of that interface is getZUnit().

At this time, only com.interactive.intviewerapi.data.seismic.ISeismicData and com.interactive.intviewerapi.data.well.IWellData implement the IZUnitProvider interface.

ISeismicData seismicData = ...
IUnit unit = seismicData.getZUnit();
System.out.println(unit.getSymbol()); // example: "s"
System.out.println(unit.getName()); // example: "Seconds"

Finding out whether a dataset is in time or depth

ISeismicData seismicData = ...
IUnit unit = seismicData.getZUnit();
if (unit.getSIUnit().getSymbol().equals(IUnit.SECONDS_SYMBOL)) {
    System.out.println("Dataset is in time");
} else if (unit.getSIUnit().getSymbol().equals(IUnit.METERS_SYMBOL)) {
    System.out.println("Dataset is in depth");
}

Converting quantities

ISeismicData seismicData = ...
IUnit fromUnit = seismicData.getZUnit();
double sampleRate = seismicData.getDataStatistics().getSampleRate();
IUnit millisecondsUnit = IUnit.Factory.getUnit(IUnit.MILLISECONDS_SYMBOL);
double sampleRateInMilliseconds = fromUnit.convert(quantity, millisecondsUnit);

You can convert multiple quantities at a time using the convert(double[] quantities, IUnit unit) method.

Registering your own unit

To create your own unit, create a class extending com.interactive.intviewerapi.units.AbstractUnit.

TIMEINMILLISECONDSUNIT.JAVA

package com.interactive.intviewer.units;
import com.interactive.intviewerapi.units.AbstractUnit;
import com.interactive.intviewerapi.units.IUnit;
public class TimeInMillisecondsUnit extends AbstractUnit {
    public TimeInMillisecondsUnit() {
        super("Milliseconds", IUnit.MILLISECONDS_SYMBOL);
    }
    @Override
    public double convertToSIUnit(double timeInMilliseconds) {
        return timeInMilliseconds / 1000;
    }
    @Override
    public double convertFromSIUnit(double timeInSeconds) {
        return timeInSeconds * 1000;
    }
    
    @Override
    public IUnit getSIUnit() {
        return IUnit.Factory.getUnit(IUnit.SECONDS_SYMBOL);
    }
}

Then register that class in the layer.xml file:

LAYER.XML

    <folder name="Units">
        <file name="com-interactive-intviewer-units-TimeInMillisecondsUnit.instance"/>
    </folder>