All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.jcamp.parser.JCAMPNTuple Maven / Gradle / Ivy

package org.jcamp.parser;

import java.util.Vector;
/**
 * class for reading a NTUPLE table.
 * @author Thomas Weber
 */
public class JCAMPNTuple {
    private int pageStart;
    private JCAMPDataRecord startLDR; // ##NTUPLES=
    private JCAMPDataRecord endLDR; // ##ENDNTUPLES=
    private JCAMPBlock containingBlock;
    private JCAMPDataRecord[] headers;
    private JCAMPNTuplePage[] pages;
    private JCAMPVariable[] vars;
    private int numHeaders;
    private int firstIndex;
    private int lastIndex;
    /**
     * JCAMPNTuple constructor comment.
     */
    JCAMPNTuple(JCAMPBlock block, JCAMPDataRecord startLDR, JCAMPDataRecord endLDR) throws JCAMPException {
        super();
        this.containingBlock = block;
        this.startLDR = startLDR;
        this.endLDR = endLDR;
        initialize();
    }
    /**
     * gets containing block.
     * @return JCAMPBlock
     */
    public JCAMPBlock getBlock() {
        return this.containingBlock;
    }
    /**
     * gets a header LDR.
     * 
     * @return JCAMPDataRecord
     * @param key java.lang.String
     */
    public JCAMPDataRecord getHeader(String key) {
        if (headers != null)
            for (int i = 0; i < headers.length; i++) {
                if (key.equals(headers[i].getKey()))
                    return headers[i];
            }
        return null;
    }
    /**
     * gets array of NTUPLE headers.
     * 
     * @return JCAMPDataRecord[]
     */
    public JCAMPDataRecord[] getHeaders() {
        return this.headers;
    }
    /**
     * gets containing JCAMP
     * 
     * @return java.lang.String
     */
    public String getJCAMP() {
        return containingBlock.getJCAMP();
    }
    /**
     * gets NTUPLE page number index.
     * 
     * @return com.labcontrol.jcamp.reader.JCAMPNTuplePage
     * @param index int
     */
    public JCAMPNTuplePage getPage(int index) {
        if (this.pages != null)
            return this.pages[index];
        return null;
    }
    /**
     * gets array of NTUPLE pages.
     * 
     * @return JCAMPNTuplePage[]
     */
    public JCAMPNTuplePage[] getPages() {
        return this.pages;
    }
    /**
     * gets the variable by symbol symbol.
     * @param String symbol
     * @return com.creon.chem.jcamp.JCAMPVariable
     */
    public JCAMPVariable getVariable(String symbol) {
        symbol = symbol.toUpperCase();
        for (int i = 0; i < vars.length; i++) {
            if (symbol.equals(vars[i].getSymbol()))
                return vars[i];
        }
        return null;
    }
    /**
     * gets variable by name.
     * 
     * @return com.creon.chem.jcamp.JCAMPVariable
     * @param name java.lang.String
     */
    public JCAMPVariable getVariableByName(String name) {
        name = name.toUpperCase();
        for (int i = 0; i < vars.length; i++) {
            if (name.equals(vars[i].getName()))
                return vars[i];
        }
        return null;
    }
    /**
     * gets array of variables defined in NTUPLE.
     * 
     * @return com.creon.chem.jcamp.JCAMPVariable[]
     */
    public JCAMPVariable[] getVariables() {
        return vars;
    }
    /**
     * get variable value array in page dimension.
     * 
     * @return java.lang.String[]
     * @param ldrKey java.lang.String
     * @param v JCAMPVariable
     */
    public String[] getVariableValues(String ldrKey, JCAMPVariable v) {
        String[] values = new String[numPages()];
        for (int i = 0; i < numPages(); i++) {
            JCAMPDataRecord ldr = pages[i].getDataRecord(ldrKey);
            if (ldr == null) {
                if (v != null) {
                    values[i] = pages[i].getPageVariableValue(v.getSymbol());
                } else
                    values[i] = null;
            } else {
                values[i] = ldr.getContent();
            }
        }
        return values;
    }
    /**
     * initialize headers.
     * 
     */
    private void initHeaders() {
        JCAMPDataRecord[] blockLDR = containingBlock.getAllDataRecords();
        numHeaders = 0;
        for (int i = firstIndex; i <= lastIndex; i++) {
            if (blockLDR[i].getKey().equals("PAGE")) {
                break;
            }
            numHeaders++;
        }
        headers = new JCAMPDataRecord[numHeaders];
        System.arraycopy(blockLDR, firstIndex, headers, 0, numHeaders);
    }
    /**
     * collect header LDRs
     * 
     */
    private void initialize() throws JCAMPException {
        JCAMPDataRecord[] blockLDR = containingBlock.getAllDataRecords();
        firstIndex = startLDR.getBlockIndex() + 1;
        lastIndex = endLDR.getBlockIndex() - 1;
        if (firstIndex > lastIndex)
            return;
        initHeaders();
        initVariables();
        initPages();
    }
    /**
     * initialize pages.
     * 
     */
    private void initPages() throws JCAMPException {
        JCAMPDataRecord[] blockLDR = containingBlock.getAllDataRecords();
        JCAMPDataRecord page1 = blockLDR[firstIndex + numHeaders];
        JCAMPDataRecord page2 = null;
        Vector tmp = new Vector();
        for (int i = firstIndex + numHeaders + 1; i < lastIndex; i++) {
            if (blockLDR[i].getKey().equals("PAGE")) {
                page2 = blockLDR[i - 1];
                JCAMPNTuplePage ntuplePage = new JCAMPNTuplePage(this, page1, page2);
                tmp.addElement(ntuplePage);
                page1 = blockLDR[i];
            }
        }
        if (page1 != null) {
            JCAMPNTuplePage ntuplePage = new JCAMPNTuplePage(this, page1, blockLDR[lastIndex]);
            tmp.addElement(ntuplePage);
        }
        pages = new JCAMPNTuplePage[tmp.size()];
        for (int i = 0; i < pages.length; i++)
            pages[i] = (JCAMPNTuplePage) tmp.elementAt(i);
    }
    /**
     * init variables for NTUPLE block.
     * 
     * @exception com.creon.chem.jcamp.JCAMPException incorrect variable declarations.
     */
    private void initVariables() throws JCAMPException {
        JCAMPDataRecord ldr = getHeader("SYMBOL");
        if (ldr == null)
            throw new JCAMPException("missing variable declaration in NTUPLES");
        String[] symbols = Utils.splitStringCSV(ldr.getContent());
        vars = new JCAMPVariable[symbols.length];
        for (int i = 0; i < vars.length; i++) {
            vars[i] = new JCAMPVariable(symbols[i].toUpperCase());
        }

        ldr = getHeader("VARNAME");
        if (ldr != null) {
            String[] labels = Utils.splitStringCSV(ldr.getContent());
            if (labels.length != vars.length)
                throw new JCAMPException("bad ##VARNAME=: number of name entries != number of variables");
            for (int i = 0; i < vars.length; i++) {
                vars[i].setLabel(labels[i]);
                vars[i].setName(Utils.normalizeLabel(labels[i]));
            }
        }
        ldr = getHeader("VARTYPE");
        if (ldr != null) {
            String[] types = Utils.splitStringCSV(ldr.getContent());
            if (types.length != vars.length)
                throw new JCAMPException("bad ##VARTYPE=: number of type entries != number of variables");
            for (int i = 0; i < vars.length; i++) {
                if (types[i].equalsIgnoreCase("INDEPENDENT"))
                    vars[i].setType(JCAMPVariable.Type.INDEPENDENT);
                else if (types[i].equalsIgnoreCase("DEPENDENT"))
                    vars[i].setType(JCAMPVariable.Type.DEPENDENT);
                else if (types[i].equalsIgnoreCase("PAGE"))
                    vars[i].setType(JCAMPVariable.Type.PAGE);
            }
        }
        ldr = getHeader("VARFORM");
        if (ldr != null) {
            String[] forms = Utils.splitStringCSV(ldr.getContent());
            if (forms.length != vars.length)
                throw new JCAMPException("bad ##VARFORM=: number of varform entries != number of variables");
            for (int i = 0; i < vars.length; i++) {
                if ("AFFN".equalsIgnoreCase(forms[i]))
                    vars[i].setFormat(JCAMPVariable.Format.AFFN);
                else if ("ASDF".equalsIgnoreCase(forms[i]))
                    vars[i].setFormat(JCAMPVariable.Format.ASDF);
                else if ("STRING".equalsIgnoreCase(forms[i]))
                    vars[i].setFormat(JCAMPVariable.Format.STRING);
                else
                    vars[i].setFormat(JCAMPVariable.Format.TEXT);
            }
        }
        ldr = getHeader("VARDIM");
        if (ldr != null) {
            String[] dims = Utils.splitStringCSV(ldr.getContent());
            if (dims.length != vars.length)
                throw new JCAMPException("bad ##VARDIM=: number of dimension entries != number of variables");
            for (int i = 0; i < vars.length; i++) {
                vars[i].setDimension(Integer.parseInt(dims[i]));
            }
        }
        ldr = getHeader("FIRST");
        if (ldr != null) {
            String[] firsts = Utils.splitStringCSV(ldr.getContent());
            if (firsts.length != vars.length)
                throw new JCAMPException("bad ##FIRST=: number of first values != number of variables");
            for (int i = 0; i < vars.length; i++) {
                vars[i].setFirst(new Double(firsts[i]));
            }
        }
        ldr = getHeader("LAST");
        if (ldr != null) {
            String[] lasts = Utils.splitStringCSV(ldr.getContent());
            if (lasts.length != vars.length)
                throw new JCAMPException("bad ##LAST=: number of last values != number of variables");
            for (int i = 0; i < vars.length; i++) {
                vars[i].setLast(new Double(lasts[i]));
            }
        }

        ldr = getHeader("MIN");
        if (ldr != null) {
            String[] mins = Utils.splitStringCSV(ldr.getContent());
            if (mins.length != vars.length)
                throw new JCAMPException("bad ##MIN=: number of min values != number of variables");
            for (int i = 0; i < vars.length; i++) {
                vars[i].setMin(new Double(mins[i]));
            }
        }

        ldr = getHeader("MAX");
        if (ldr != null) {
            String[] maxs = Utils.splitStringCSV(ldr.getContent());
            if (maxs.length != vars.length)
                throw new JCAMPException("bad ##MAX=: number of max values != number of variables");
            for (int i = 0; i < vars.length; i++) {
                vars[i].setMax(new Double(maxs[i]));
            }
        }
        ldr = getHeader("FACTOR");
        if (ldr != null) {
            String[] factors = Utils.splitStringCSV(ldr.getContent());
            if (factors.length != vars.length)
                throw new JCAMPException("bad ##FACTOR=: number of factor values != number of variables");
            for (int i = 0; i < vars.length; i++) {
                vars[i].setFactor(new Double(factors[i]));
            }
        }
        ldr = getHeader("UNITS");
        if (ldr != null) {
            String[] units = Utils.splitStringCSV(ldr.getContent());
            if (units.length != vars.length)
                throw new JCAMPException("bad ##UNITS=: number of unit entries != number of variables");
            for (int i = 0; i < units.length; i++) {
                vars[i].setUnit(units[i]);
            }
        }

    }
    /**
     * gets number of header LDRs.
     * 
     * @return int
     */
    public int numHeaders() {
        return numHeaders;
    }
    /**
     * gets number of pages.
     * 
     * @return int
     */
    public int numPages() {
        if (pages == null)
            return 0;
        return pages.length;
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy