package org.signalml.app.method.ep.action; import static org.signalml.app.util.i18n.SvarogI18n._; import java.awt.Color; import java.awt.event.ActionEvent; import java.io.File; import java.io.IOException; import java.util.ArrayList; import java.util.List; import org.signalml.app.document.TagDocument; import org.signalml.app.method.ep.SelectTagGroupDialog; import org.signalml.app.method.ep.view.tags.TagStyleGroup; import org.signalml.app.model.signal.SignalExportDescriptor; import org.signalml.app.view.common.dialogs.OptionPane; import org.signalml.app.view.common.dialogs.errors.Dialogs; import org.signalml.app.view.workspace.ViewerFileChooser; import org.signalml.domain.signal.raw.RawSignalDescriptor; import org.signalml.domain.signal.raw.RawSignalDescriptorWriter; import org.signalml.domain.signal.raw.RawSignalWriter; import org.signalml.domain.signal.samplesource.DoubleArraySampleSource; import org.signalml.domain.tag.StyledTagSet; import org.signalml.plugin.export.SignalMLException; import org.signalml.plugin.export.signal.SignalSelectionType; import org.signalml.plugin.export.signal.Tag; import org.signalml.plugin.export.signal.TagStyle; import org.signalml.util.Util; /** * An action for saving evoked potentials to a a float file. * * @author Piotr Szachewicz */ public class ExportAllEPSamplesToFloatFileAction extends AbstractSaveAction { public ExportAllEPSamplesToFloatFileAction(ViewerFileChooser fileChooser) { super(fileChooser); setText(_("Save samples to file")); setToolTip(_("Save samples to file")); setIconPath("org/signalml/app/icon/filesave.png"); } @Override public void actionPerformed(ActionEvent event) { List<TagStyleGroup> averagedTagStyles = result.getData().getParameters().getAveragedTagStyles(); TagStyleGroup selectedGroup = averagedTagStyles.get(0); if (averagedTagStyles.size() > 1) selectedGroup = showTagStyleGroupSelection(); if (selectedGroup == null) return; //selected index int i; for (i = 0; i < averagedTagStyles.size(); i++) { if (averagedTagStyles.get(i).equals(selectedGroup)) break; } // file selection File file = showFileChooserDialog(); if (file == null) return; try { writeData(file, i); } catch (Exception e) { Dialogs.showExceptionDialog(e); logger.error("", e); return; } } protected TagStyleGroup showTagStyleGroupSelection() { SelectTagGroupDialog dialog = new SelectTagGroupDialog(); List<TagStyleGroup> averagedTagStyles = result.getData().getParameters().getAveragedTagStyles(); List<TagStyleGroup> selectedGroups = new ArrayList<TagStyleGroup>(); selectedGroups.addAll(averagedTagStyles); boolean okPressed = dialog.showDialog(selectedGroups); if (!okPressed) return null; return selectedGroups.get(0); } protected File showFileChooserDialog() { File file; boolean hasFile = false; do { file = fileChooser.chooseSamplesSaveAsTextFile(null); if (file == null) { return null; } String ext = Util.getFileExtension(file, false); if (ext == null) { file = new File(file.getAbsolutePath() + ".bin"); } hasFile = true; if (file.exists()) { int res = OptionPane.showFileAlreadyExists(null); if (res != OptionPane.OK_OPTION) { hasFile = false; } } } while (!hasFile); return file; } protected void writeData(File file, int groupIndex) throws IOException, SignalMLException { double[][] samples = result.getAverageSamples().get(groupIndex); int channelCount = samples.length; int sampleCount = samples[0].length; DoubleArraySampleSource sampleSource = new DoubleArraySampleSource(samples, channelCount, sampleCount); //signal RawSignalWriter rawSignalWriter = new RawSignalWriter(); SignalExportDescriptor signalExportDescriptor = new SignalExportDescriptor(); rawSignalWriter.writeSignal(file, sampleSource, signalExportDescriptor, null); //descriptor RawSignalDescriptorWriter descriptorWriter = new RawSignalDescriptorWriter(); RawSignalDescriptor descriptor = new RawSignalDescriptor(); descriptor.setSampleCount(sampleCount); descriptor.setChannelCount(channelCount); descriptor.setExportFileName(file.getName()); descriptor.setChannelLabels(result.getLabels()); File xmlFile = Util.changeOrAddFileExtension(file, "xml"); descriptorWriter.writeDocument(descriptor, xmlFile); //tag file File tagFile = Util.changeOrAddFileExtension(file, "tag"); TagDocument tagDocument = new TagDocument(); tagDocument.setBackingFile(tagFile); StyledTagSet tagSet = tagDocument.getTagSet(); TagStyle eventTagStyle = new TagStyle(SignalSelectionType.CHANNEL, "event", "", Color.red, Color.red, 0); eventTagStyle.setMarker(true); tagSet.addStyle(eventTagStyle); double eventPosition = -1 * result.getData().getParameters().getAveragingStartTime(); tagSet.addTag(new Tag(eventTagStyle, eventPosition, 0.0)); tagDocument.saveDocument(); tagDocument.closeDocument(); } @Override public void setEnabledAsNeeded() { setEnabled(result != null); } }