/* * To change this template, choose Tools | Templates * and open the template in the editor. */ package org.das2.qds; /** * Wraps rank N qube dataset to present a dataset with the same rank that is a subset of * wrapped dataset. * * Note this was used before trim() was a native operator for datasets, and it * should be used when the zeroth dimension is trimmed with stride==1. * @author jbf */ public class TrimStrideWrapper extends AbstractDataSet { QDataSet ds; int[] offset; int[] len; int[] stride; int[] qube; /** * construct a wrapper with no trimming by default. setTrim is * called to trim a dimension. * * @param ds the source dataset backing up the trimmed one. */ public TrimStrideWrapper( QDataSet ds ) { this.ds= ds; len= DataSetUtil.qubeDims(ds); qube= DataSetUtil.qubeDims(ds); offset= new int[ds.rank()]; stride= new int[ds.rank()]; for ( int i=0; iqube[dim] ) { throw new IndexOutOfBoundsException("stop is greater than qube dimension: "+stop + ">" + qube[dim]); } if ( sstop<0 ) sstop= qube[dim] + sstop; // danger if ( sstart<0 ) sstart= qube[dim] + sstart; this.offset[dim]= sstart; this.len[dim]= (int)Math.ceil ( 1.*( sstop - sstart ) / this.stride[dim] ); QDataSet dep= (QDataSet) ds.property("DEPEND_"+dim); if ( dep!=null && dep.rank()==1 ) { TrimStrideWrapper depw= new TrimStrideWrapper( dep ); depw.setTrim( 0, start, stop, stride ); putProperty( "DEPEND_"+dim, depw ); } else if ( dep!=null && dep.rank()==2 ) { if ( dim==0 ) { TrimStrideWrapper depw= new TrimStrideWrapper( dep ); depw.setTrim( 0, start, stop, stride ); putProperty( "DEPEND_"+dim, depw ); } else { TrimStrideWrapper depw= new TrimStrideWrapper( dep ); //TODO: verify this. depw.setTrim( 1, start, stop, stride ); putProperty( "DEPEND_"+dim, depw ); } } for ( int i=0; i