package org.autoplot.idlsupport; import com.jmatio.io.MatFileWriter; import com.jmatio.types.MLArray; import com.jmatio.types.MLDouble; import java.io.File; import java.util.ArrayList; import java.util.List; import org.das2.datum.Units; import org.das2.datum.UnitsConverter; import org.das2.datum.UnitsUtil; import org.das2.util.monitor.ProgressMonitor; import org.das2.qds.QDataSet; import org.das2.qds.SemanticOps; import org.autoplot.datasource.AbstractDataSourceFormat; import org.das2.qds.DataSetUtil; import org.das2.qds.ops.Ops; /** * Export to .mat file for easy import into Matlab. rank 1 datasets, rank 2 datasets, rank 3 datasets, and rank 2 bundles are supported. * jmatio library is used to format the files: https://github.com/gradusnikov/jmatio/ copied on 2018-07-28. * @author jbf */ public class MatDataSourceFormat extends AbstractDataSourceFormat { private MLArray formatRank1( QDataSet data, String guessName ) { String su= getParam( "tunits", "t1970" ); QDataSet wds= Ops.valid(data); double[] dd= new double[data.length()]; for ( int i=0; i formatRank2Bundle( String uri, QDataSet data ) throws Exception { setUri(uri); List stage= new ArrayList<>(); for ( int i=0; i stage= new ArrayList<>(); QDataSet dep0= (QDataSet) data.property(QDataSet.DEPEND_0); if ( dep0!=null ) { stage.add( formatRank1( dep0, "dep0" ) ); } if ( SemanticOps.isBundle(data) ) { stage.addAll( formatRank2Bundle( uri, data ) ); } else { switch (data.rank()) { case 2: stage.add( formatRank2( data, "data") ); break; case 1: stage.add( formatRank1( data, "data") ); break; default: throw new IllegalArgumentException("unsupported rank: "+data.rank()); } } QDataSet dep1= (QDataSet) data.property(QDataSet.DEPEND_1); if ( dep1!=null ) { if ( dep1.rank()==2 ) { stage.add( formatRank2( dep1, "dep1" ) ); } else { stage.add( formatRank1( dep1, "dep1" ) ) ; } } setUri(uri); File f= new File( getResourceURI().toURL().getFile() ); MatFileWriter w= new MatFileWriter(); w.write(f, stage); } @Override public boolean canFormat(QDataSet ds) { return DataSetUtil.isQube(ds) && ( ds.rank()==1 || ds.rank()==2 ); } @Override public String getDescription() { return "Matlab .mat file"; } }