001    /**
002     * Created by IntelliJ IDEA.
003     * User: Wei Wang
004     * Date: Apr 24, 2003
005     * Time: 9:56:40 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 PhaseEntityTrigger {
021        private UnorderedUnlimitedSet trigger;
022        private int state[];
023        private final int triggerFound = 1;
024    
025        public PhaseEntityTrigger() {
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            for (int i=0; i<data.size(); i++) {
054                UnorderedUnlimitedSet current = (UnorderedUnlimitedSet)data.get(i);
055    
056                if (((float)current.intersection(trigger).size())/((float)trigger.size()) >= threshold ) {
057                    state[i] = triggerFound;
058                }
059            }
060    
061            int previous = state[0], noise = 0;
062            for (int i=1; i<state.length; i++) {
063                if (state[i] != previous) {
064                    noise ++;
065                    if (noise > noiseTolerance) {
066                        if (previous == triggerFound)
067                            phase.add(new Integer(i-noise));
068                        else
069                            phase.add(new Integer(i-noise+1));
070                        noise = 0;
071                        previous = state[i];
072                    }
073                } else {
074                    noise = 0;
075                }
076            }
077            /*int noise = 0;
078            for (int i=0; i<state.length; i++) {
079                if (state[i] == triggerFound) {
080                    noise ++;
081                    if (noise > noiseTolerance) {
082                        phase.add(new Integer(i-noise+1));
083                        noise = 0;
084                    }
085                } else {
086                    noise = 0;
087                }
088            }*/
089    
090            return phase;
091        }
092    }