001    /**
002     * Created by IntelliJ IDEA.
003     * User: Wei Wang
004     * Date: May 17, 2003
005     * Time: 8:29:55 PM
006     */
007    
008    package EVolve.util.phasedetectors;
009    
010    import java.util.ArrayList;
011    import java.util.HashMap;
012    
013    import EVolve.Scene;
014    import EVolve.data.Entity;
015    import EVolve.data.Selection;
016    import EVolve.util.equators.UnorderedUnlimitedSet;
017    import EVolve.visualization.ReferenceDimension;
018    import EVolve.visualization.XYViz.ValRefViz.HotSpotViz.HotSpotVisualization;
019    
020    public class PhaseEntitySet {
021        private UnorderedUnlimitedSet trigger;
022        private int state[];
023        private final int setFound = 1;
024    
025        public PhaseEntitySet() {
026        }
027    
028        public ArrayList gatherTiggeredPhase(ArrayList data, int noiseTolerance, float threshold) {
029            ArrayList phase = new ArrayList();
030            Selection activeSelection = Scene.getFilter().getActiveSelection();
031    
032            if (activeSelection == null) {
033                Scene.showErrorMessage("No active selection.");
034                return phase;
035            }
036    
037            state = new int[data.size()];
038            for (int i=0; i<state.length; i++) {
039                state[i] = 0;
040            }
041    
042            HotSpotVisualization visual = (HotSpotVisualization)Scene.getVisualizationManager().getActiveVisualization();
043            HashMap entityName2Int = ((ReferenceDimension)visual.getDimension()[1]).getEntityName2IntMap();
044            trigger = new UnorderedUnlimitedSet();
045    
046            Entity[] entities = activeSelection.getSelected();
047            for (int i=0; i<entities.length; i++) {
048                int mappedId = ((Integer)entityName2Int.get(entities[i].getName())).intValue();
049                trigger.addElement(mappedId);
050            }
051    
052    
053            //float rates[] = new float[data.size()];
054            int previous = 0;
055            for (int i=0; i<data.size(); i++) {
056                UnorderedUnlimitedSet current = (UnorderedUnlimitedSet)data.get(i);
057                float rate = ((float)current.intersection(trigger).size())/(float)trigger.size();//((float)union.union(current).size());
058                if (rate >= threshold ) {
059                    state[i] = setFound;
060                } else {
061                    if (rate == 0) {
062                        state[i] = 0;
063                    } else {
064                        state[i] = previous;
065                    }
066                }
067                previous = state[i];
068            }
069    
070            previous = state[0];
071            int noise = 0;
072            for (int i=1; i<state.length; i++) {
073                if (state[i] != previous) {
074                    noise ++;
075                    if (noise > noiseTolerance) {
076                        if (previous == setFound)
077                            phase.add(new Integer(i-noise+1));
078                        previous = state[i];
079                        noise = 0;
080                    } else {
081                        if (state[i] == setFound) {
082                            phase.add(new Integer(i));
083                            previous = setFound;
084                            noise = 0;
085                        }
086                    }
087                } else {
088                    noise = 0;
089                }
090            }
091    
092            return phase;
093        }
094    }