package uk.ac.diamond.scisoft.analysis.processing.operations.export; import java.io.File; import org.eclipse.dawnsci.analysis.api.io.ScanFileHolderException; import org.eclipse.dawnsci.analysis.api.processing.Atomic; import org.eclipse.dawnsci.analysis.api.processing.IExportOperation; import org.eclipse.dawnsci.analysis.api.processing.IOperation; import org.eclipse.dawnsci.analysis.api.processing.OperationData; import org.eclipse.dawnsci.analysis.api.processing.OperationException; import org.eclipse.dawnsci.analysis.api.processing.OperationRank; import org.eclipse.dawnsci.analysis.dataset.operations.AbstractOperation; import org.eclipse.dawnsci.analysis.dataset.slicer.SliceFromSeriesMetadata; import org.eclipse.january.DatasetException; import org.eclipse.january.IMonitor; import org.eclipse.january.dataset.DTypeUtils; import org.eclipse.january.dataset.DatasetUtils; import org.eclipse.january.dataset.IDataset; import org.eclipse.january.dataset.ILazyDataset; import org.eclipse.january.dataset.Slice; import uk.ac.diamond.scisoft.analysis.io.ASCIIDataWithHeadingSaver; import uk.ac.diamond.scisoft.analysis.io.DataHolder; import uk.ac.diamond.scisoft.analysis.processing.metadata.OperationMetadata; @Atomic public class ExportAsATSASOperation extends AbstractOperation<ExportAsATSASModel, OperationData> implements IExportOperation { private static final String EXPORT = "export"; private static final String DEFAULT_EXT = "dat"; private static final String FOLDER_EXT = "_atsas"; @Override public String getId() { return "uk.ac.diamond.scisoft.analysis.processing.operations.export.ExportAsATSASOperation"; } protected OperationData process(IDataset input, IMonitor monitor) throws OperationException { String fileName = getFilePath( model, input, this); ILazyDataset[] axes = getFirstAxes(input); ILazyDataset lx = axes != null ? axes[0] : null; IDataset outds = input.getSlice().clone(); outds.squeeze().setShape(outds.getShape()[0],1); if (lx != null) { IDataset x; try { x = lx.getSliceView().getSlice().squeeze(); } catch (DatasetException e) { throw new OperationException(this, e); } x.setShape(x.getShape()[0],1); int xtype = DTypeUtils.getDType(x); int ytype = DTypeUtils.getDType(outds); if (xtype != ytype) { if (xtype > ytype) { outds = DatasetUtils.cast(outds, xtype); } else { x = DatasetUtils.cast(x, ytype); } } outds = DatasetUtils.concatenate(new IDataset[]{x,outds}, 1); } ILazyDataset error = input.getErrors(); if (error != null) { IDataset e; try { e = error.getSlice(); } catch (Exception e1) { throw new OperationException(this, e1); } e.setShape(e.getShape()[0],1); int etype = DTypeUtils.getDType(e); int ytype = DTypeUtils.getDType(outds); if (etype != ytype) { if (etype > ytype) { outds = DatasetUtils.cast(outds, etype); } else { e = DatasetUtils.cast(e, ytype); } } outds = DatasetUtils.concatenate(new IDataset[]{outds,e}, 1); } ASCIIDataWithHeadingSaver saver = new ASCIIDataWithHeadingSaver(fileName); int posExt = fileName.lastIndexOf("_"); int posSlash = fileName.lastIndexOf("/") + 1; // No File Extension String runName = posExt == -1 ? fileName : fileName.substring(0, posExt); runName = posSlash == -1 ? runName : runName.substring(posSlash); // Default ATSAS header is four lines long... String fileHeader ; if (error != null) { fileHeader = "# Diamond Light Source Ltd.\n# Results Export File\n# Dataset name: " + runName + "\n# q(1/A)\tIntensity\tError"; } else { fileHeader = "# Diamond Light Source Ltd.\n# Results Export File\n# Dataset name: " + runName + "\n# q(1/A)\tIntensity"; } DataHolder dh = new DataHolder(); dh.addDataset("Export", outds); try { saver.setHeader(fileHeader); saver.saveFile(dh); } catch (ScanFileHolderException e) { throw new OperationException(this, "Error saving text file! (Do you have write access?)"); } return new OperationData(input); } @Override public OperationRank getInputRank() { return OperationRank.ONE; } @Override public OperationRank getOutputRank() { return OperationRank.ONE; } private static String getFileNameNoExtension(String fileName) { int posExt = fileName.lastIndexOf("."); // No File Extension return posExt == -1 ? fileName : fileName.substring(0, posExt); } public static String getFilePath(ExportAsATSASModel model, IDataset input, IOperation op) { String outputDirectory = null; if (model.getOutputDirectoryPath() != null && !model.getOutputDirectoryPath().isEmpty()) { outputDirectory = model.getOutputDirectoryPath(); } else { OperationMetadata omd = input.getFirstMetadata(OperationMetadata.class); if (omd.getOutputFilename() != null) { File f = new File(omd.getOutputFilename()); outputDirectory = f.getParent(); } } if (outputDirectory == null || outputDirectory.isEmpty()) throw new OperationException(op, "Output directory not set!"); SliceFromSeriesMetadata ssm = getSliceSeriesMetadata(input); String filename = EXPORT; String fn = ssm.getSourceInfo().getFilePath(); if (fn != null) { File f = new File(fn); filename = getFileNameNoExtension(f.getName()); } if (model.isMakeFolder()) { String innerDirName = File.separator + filename + FOLDER_EXT; outputDirectory += innerDirName; File f = new File(outputDirectory); if (!f.exists()) f.mkdir(); } String slice =""; String ext = DEFAULT_EXT; if (model.isIncludeSliceName()) { slice = Slice.createString(ssm.getSliceFromInput()); } int c = ssm.getSliceInfo().getSliceNumber(); String count = ""; if (model.getZeroPad() != null && model.getZeroPad() >= 1) { count = String.format("%0" + String.valueOf(model.getZeroPad()) + "d", c); } else { count =String.valueOf(c); } if (model.getExtension() != null) ext = model.getExtension(); String postfix = ""; if (model.getSuffix() != null) { postfix = model.getSuffix(); } StringBuilder sb = new StringBuilder(); sb.append(outputDirectory); sb.append(File.separator); sb.append(filename); sb.append("_"); if (!slice.isEmpty()) { sb.append("["); slice = slice.replace(":", ";"); sb.append(slice); sb.append("]"); sb.append("_"); } if (!postfix.isEmpty()) { sb.append(postfix); sb.append("_"); } sb.append(count); sb.append("."); sb.append(ext); return sb.toString(); } }