package pl.edu.fuw.fid.signalanalysis.ica; import java.awt.BorderLayout; import java.awt.Dimension; import javax.swing.JList; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.event.ListSelectionEvent; import javax.swing.event.ListSelectionListener; import org.apache.commons.math.linear.RealMatrix; import org.signalml.app.view.montage.visualreference.VisualReferenceModel; import org.signalml.domain.montage.Montage; import pl.edu.fuw.fid.signalanalysis.SignalAnalysisTools; /** * Panel showing list of components with preview of their distribution * across EEG channels. * * @author ptr@mimuw.edu.pl */ public class DescribeComponentsPanel extends JPanel { private final VisualReferenceModel intensityModel; private final VisualIntensityDisplay intensityDisplay; private final JScrollPane intensityPane; private final JList<String> channelDisplay; public DescribeComponentsPanel(final Montage montage, final RealMatrix data) { super(new BorderLayout()); intensityModel = new VisualReferenceModel(); intensityModel.setMontage(montage); intensityDisplay = new VisualIntensityDisplay(intensityModel); intensityPane = new JScrollPane(intensityDisplay, JScrollPane.VERTICAL_SCROLLBAR_NEVER, JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED); intensityPane.setPreferredSize(new Dimension(500, 400)); intensityDisplay.setViewport(intensityPane.getViewport()); final int componentCount = data.getRowDimension(); final int sourceChannelCount = data.getColumnDimension(); final String[] componentNames = SignalAnalysisTools.generateIcaComponentNames(componentCount); final float[][] components = new float[componentCount][sourceChannelCount]; for (int i=0; i<componentCount; ++i) { for (int j=0; j<sourceChannelCount; ++j) { components[i][j] = (float) data.getEntry(i, j); } } channelDisplay = new JList<String>(componentNames); channelDisplay.setSelectionMode(javax.swing.ListSelectionModel.SINGLE_SELECTION); channelDisplay.getSelectionModel().addListSelectionListener(new ListSelectionListener() { @Override public void valueChanged(ListSelectionEvent e) { int component = channelDisplay.getSelectedIndex(); if (component >= 0) { float[] intensities = components[component]; if (intensities != null) { intensityDisplay.setIntensities(intensities); } } } }); channelDisplay.setPreferredSize(new Dimension(50, 400)); add(intensityPane, BorderLayout.CENTER); add(channelDisplay, BorderLayout.EAST); } }