/* * ColumnwiseTupleField.java * * Created on November 1, 2002, 12:41 PM */ package hep.io.hbook; import java.util.StringTokenizer; /** A column in a ColumnwiseTuple * @author tonyj * @version $Id: ColumnwiseTupleColumn.java 8584 2006-08-10 23:06:37Z duns $ */ public class ColumnwiseTupleColumn extends TupleColumn { ColumnwiseTupleColumn(ColumnwiseTuple parent, String name, String full, String block, int column, int nsub, int type, int size, int elem) { super(parent, name); this.min = 0; this.max = 0; this.column = column; this.full = full; this.nsub = nsub; this.size = size; this.elem = elem; this.block = parent.getBlock(block); this.offset = this.block.allocSpace(this,size*elem); this.fixed = 1; this.type = type; // Parse apart the full name to find the array indexes if (nsub > 0) { dimension = new int[nsub]; StringTokenizer t = new StringTokenizer(full,"[]",false); t.nextToken(); // skip first token (variable name) for (int i=0; i<nsub; i++) { String token = t.nextToken(); if (token == null) throw new RuntimeException("Paw columnwise tuple parse failure "+full); try { dimension[i] = Integer.parseInt(token); fixed *= dimension[i]; } catch (NumberFormatException x) { // ColumnwiseTuple tuple = (ColumnwiseTuple) getParent(); ColumnwiseTupleColumn field = (ColumnwiseTupleColumn) parent.getChild(token); if (field == null) throw new RuntimeException("Paw columnwise tuple parse failure "+full); dimension[i] = -field.column; index = field; } } } } public String toString() { String result = "CW Tuple Field: ("+getColumnClass().getName()+") "+full; if (minMaxKnown) result += " (min="+min+" max="+max+")"; return result; } /** Get the value of this column as a double */ public double getDouble() { if (type == 2 || type == 3) return getInt(); else if (type != 1) throw new RuntimeException("getDouble called for non-float data: "+getName()); if (elem > 1) throw new RuntimeException("getDouble called for array data: "+getName()); if (!isMapped) block.map(this); return Hbook.getCWDataDouble(block.getBuffer(),offset,size); } /** Get the value of this column as an int */ public int getInt() { if (type != 2 && type != 3) throw new RuntimeException("getInt called for non-integer data: "+getName()); if (elem > 1) throw new RuntimeException("getInt called for array data: "+getName()); if (!isMapped) block.map(this); return Hbook.getCWDataInt(block.getBuffer(),offset,size); } /** Get the value of this column as a boolean */ public boolean getBoolean() { if (type != 4) throw new RuntimeException("getBoolean called for non-boolean data: "+getName()); if (elem > 1) throw new RuntimeException("getBoolean called for array data: "+getName()); if (!isMapped) block.map(this); return Hbook.getCWDataBoolean(block.getBuffer(),offset,size); } /** Get the value of this column as a String */ public String getString() { if (type != 5) throw new RuntimeException("getString called for non-string data: "+getName()); if (elem > 1) throw new RuntimeException("getString called for array data: "+getName()); if (!isMapped) block.map(this); return Hbook.getCWDataString(block.getBuffer(),offset,size); } /** Get the value of this column as an PawArray */ public PawArray getObject() { if (array == null) { if (type == 1) array = new DoubleArray(); else if (type == 4) array = new BooleanArray(); else if (type == 5) array = new StringArray(); else array = new IntegerArray(); } return array; } /** Get the type of this column * @return The java class representing the column type */ public Class getColumnClass() { if (elem > 1) return arrayClasses[type]; else return classes[type]; } /** The minimum value for this column */ public double getMin() { if (!minMaxKnown) getMinMax(); return min; } /** The maximum value for this column */ public double getMax() { if (!minMaxKnown) getMinMax(); return max; } private void getMinMax() { ColumnwiseTuple parent = (ColumnwiseTuple) getParent(); int id = parent.getID(); block.map(this); double[] mm = Hbook.CWgetMinMax(id,block.getBuffer(),offset,type,size,fixed,index != null ? index.offset : -1); min = mm[0]; max = mm[1]; minMaxKnown = true; } private PawArray array; private String full; private ColumnwiseBlock block; private int nsub; private int size; private int elem; int offset; private int[] dimension; private int column; private int fixed; ColumnwiseTupleColumn index; private double min; private double max; private boolean minMaxKnown = false; boolean isMapped = false; private static final Class[] classes = {null,Double.TYPE,Integer.TYPE, Integer.TYPE, Boolean.TYPE, String.class}; private static final Class[] arrayClasses = {null,hep.io.hbook.PawDoubleArray.class,hep.io.hbook.PawIntegerArray.class, hep.io.hbook.PawIntegerArray.class, hep.io.hbook.PawBooleanArray.class, hep.io.hbook.PawStringArray.class}; private class Array implements PawArray { public int getNDimensions() { return nsub; } public int getDimension(int x) { int n = dimension[x]; if (n < 0) n = index.getInt(); return n; } int calcOffset(int i) { int[] ii = {i}; return calcOffset(ii); } int calcOffset(int i, int j) { int[] ii = {i,j}; return calcOffset(ii); } int calcOffset(int i, int j, int k) { int[] ii = {i,j,k}; return calcOffset(ii); } int calcOffset(int[] i) { if (nsub != i.length) throw new RuntimeException("Wrong number of subscripts for PawArray: "+getName()); int off = offset; int siz = size; for (int j=0; j<nsub; j++) { int index = i[j]; int d = getDimension(j); if (index < 1 || index > d) throw new RuntimeException("PawArray index out of range: "+getName()+" index="+index); off += (index-1)*siz; siz *= d; } return off; } int calcSize() { int siz = 1; for (int j=0; j<nsub; j++) { siz *= getDimension(j); } return siz; } } private class DoubleArray extends Array implements PawDoubleArray { public double getDouble(int i) { if (!isMapped) block.map(ColumnwiseTupleColumn.this); return Hbook.getCWDataDouble(block.getBuffer(),calcOffset(i),size); } public double getDouble(int i, int j) { if (!isMapped) block.map(ColumnwiseTupleColumn.this); return Hbook.getCWDataDouble(block.getBuffer(),calcOffset(i,j),size); } public double getDouble(int i, int j, int k) { if (!isMapped) block.map(ColumnwiseTupleColumn.this); return Hbook.getCWDataDouble(block.getBuffer(),calcOffset(i,j,k),size); } public double getDouble(int[] i) { if (!isMapped) block.map(ColumnwiseTupleColumn.this); return Hbook.getCWDataDouble(block.getBuffer(),calcOffset(i),size); } public double[] getAsJavaArray() { double[] result = new double[calcSize()]; if (!isMapped) block.map(ColumnwiseTupleColumn.this); int off = offset; for (int i=0; i<result.length; i++) { result[i] = Hbook.getCWDataDouble(block.getBuffer(),off,size); off += size; } return result; } } private class IntegerArray extends Array implements PawIntegerArray { public int getInt(int i) { if (!isMapped) block.map(ColumnwiseTupleColumn.this); return Hbook.getCWDataInt(block.getBuffer(),calcOffset(i),size); } public int getInt(int i, int j) { if (!isMapped) block.map(ColumnwiseTupleColumn.this); return Hbook.getCWDataInt(block.getBuffer(),calcOffset(i,j),size); } public int getInt(int i, int j, int k) { if (!isMapped) block.map(ColumnwiseTupleColumn.this); return Hbook.getCWDataInt(block.getBuffer(),calcOffset(i,j,k),size); } public int getInt(int[] i) { if (!isMapped) block.map(ColumnwiseTupleColumn.this); return Hbook.getCWDataInt(block.getBuffer(),calcOffset(i),size); } public int[] getAsJavaArray() { int[] result = new int[calcSize()]; if (!isMapped) block.map(ColumnwiseTupleColumn.this); int off = offset; for (int i=0; i<result.length; i++) { result[i] = Hbook.getCWDataInt(block.getBuffer(),off,size); off += size; } return result; } } private class StringArray extends Array implements PawStringArray { public String getString(int i) { if (!isMapped) block.map(ColumnwiseTupleColumn.this); return Hbook.getCWDataString(block.getBuffer(),calcOffset(i),size); } public String getString(int i, int j) { if (!isMapped) block.map(ColumnwiseTupleColumn.this); return Hbook.getCWDataString(block.getBuffer(),calcOffset(i,j),size); } public String getString(int i, int j, int k) { if (!isMapped) block.map(ColumnwiseTupleColumn.this); return Hbook.getCWDataString(block.getBuffer(),calcOffset(i,j,k),size); } public String getString(int[] i) { if (!isMapped) block.map(ColumnwiseTupleColumn.this); return Hbook.getCWDataString(block.getBuffer(),calcOffset(i),size); } public String[] getAsJavaArray() { String[] result = new String[calcSize()]; if (!isMapped) block.map(ColumnwiseTupleColumn.this); int off = offset; for (int i=0; i<result.length; i++) { result[i] = Hbook.getCWDataString(block.getBuffer(),off,size); off += size; } return result; } } private class BooleanArray extends Array implements PawBooleanArray { public boolean getBoolean(int i) { if (!isMapped) block.map(ColumnwiseTupleColumn.this); return Hbook.getCWDataBoolean(block.getBuffer(),calcOffset(i),size); } public boolean getBoolean(int i, int j) { if (!isMapped) block.map(ColumnwiseTupleColumn.this); return Hbook.getCWDataBoolean(block.getBuffer(),calcOffset(i,j),size); } public boolean getBoolean(int i, int j, int k) { if (!isMapped) block.map(ColumnwiseTupleColumn.this); return Hbook.getCWDataBoolean(block.getBuffer(),calcOffset(i,j,k),size); } public boolean getBoolean(int[] i) { if (!isMapped) block.map(ColumnwiseTupleColumn.this); return Hbook.getCWDataBoolean(block.getBuffer(),calcOffset(i),size); } public boolean[] getAsJavaArray() { boolean[] result = new boolean[calcSize()]; if (!isMapped) block.map(ColumnwiseTupleColumn.this); int off = offset; for (int i=0; i<result.length; i++) { result[i] = Hbook.getCWDataBoolean(block.getBuffer(),off,size); off += size; } return result; } } }