Author: clopes
Date: 2012-07-24 09:32:05 -0700 (Tue, 24 Jul 2012)
New Revision: 29973

Modified:
   csplugins/trunk/toronto/clopes/mcode/pom.xml
   
csplugins/trunk/toronto/clopes/mcode/src/main/java/org/cytoscape/mcode/internal/CyActivator.java
   
csplugins/trunk/toronto/clopes/mcode/src/main/java/org/cytoscape/mcode/internal/MCODEAnalyzeAction.java
Log:
These changes allow MCODE to analyze the same network again with the same 
parameters if that network is changed (nodes/edges added or removed).

Modified: csplugins/trunk/toronto/clopes/mcode/pom.xml
===================================================================
--- csplugins/trunk/toronto/clopes/mcode/pom.xml        2012-07-24 06:06:45 UTC 
(rev 29972)
+++ csplugins/trunk/toronto/clopes/mcode/pom.xml        2012-07-24 16:32:05 UTC 
(rev 29973)
@@ -169,6 +169,16 @@
                </dependency>
                <dependency>
                        <groupId>org.cytoscape</groupId>
+                       <artifactId>model-api</artifactId>
+                       <version>${cytoscape.api.version}</version>
+               </dependency>
+               <dependency>
+                       <groupId>org.cytoscape</groupId>
+                       <artifactId>viewmodel-api</artifactId>
+                       <version>${cytoscape.api.version}</version>
+               </dependency>
+               <dependency>
+                       <groupId>org.cytoscape</groupId>
                        <artifactId>swing-application-api</artifactId>
                        <version>${cytoscape.api.version}</version>
                </dependency>

Modified: 
csplugins/trunk/toronto/clopes/mcode/src/main/java/org/cytoscape/mcode/internal/CyActivator.java
===================================================================
--- 
csplugins/trunk/toronto/clopes/mcode/src/main/java/org/cytoscape/mcode/internal/CyActivator.java
    2012-07-24 06:06:45 UTC (rev 29972)
+++ 
csplugins/trunk/toronto/clopes/mcode/src/main/java/org/cytoscape/mcode/internal/CyActivator.java
    2012-07-24 16:32:05 UTC (rev 29973)
@@ -3,7 +3,6 @@
 import java.util.Properties;
 
 import org.cytoscape.application.CyApplicationManager;
-import org.cytoscape.application.events.SetCurrentNetworkListener;
 import org.cytoscape.application.swing.CyAction;
 import org.cytoscape.application.swing.CySwingApplication;
 import 
org.cytoscape.application.swing.events.CytoPanelComponentSelectedListener;
@@ -74,7 +73,7 @@
                registerService(bc, closeAction, 
NetworkAboutToBeDestroyedListener.class, new Properties());
                registerService(bc, helpAction, CyAction.class, new 
Properties());
                registerService(bc, aboutAction, CyAction.class, new 
Properties());
-               registerService(bc, analyzeAction, 
SetCurrentNetworkListener.class, new Properties());
+               registerAllServices(bc, analyzeAction, new Properties());
                registerService(bc, visualStyleAction, CyAction.class, new 
Properties());
                registerService(bc, visualStyleAction, 
CytoPanelComponentSelectedListener.class, new Properties());
        }

Modified: 
csplugins/trunk/toronto/clopes/mcode/src/main/java/org/cytoscape/mcode/internal/MCODEAnalyzeAction.java
===================================================================
--- 
csplugins/trunk/toronto/clopes/mcode/src/main/java/org/cytoscape/mcode/internal/MCODEAnalyzeAction.java
     2012-07-24 06:06:45 UTC (rev 29972)
+++ 
csplugins/trunk/toronto/clopes/mcode/src/main/java/org/cytoscape/mcode/internal/MCODEAnalyzeAction.java
     2012-07-24 16:32:05 UTC (rev 29973)
@@ -2,7 +2,9 @@
 
 import java.awt.event.ActionEvent;
 import java.util.ArrayList;
+import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
 import java.util.Properties;
 
 import javax.swing.JOptionPane;
@@ -24,6 +26,14 @@
 import org.cytoscape.mcode.internal.view.MCODEResultsPanel;
 import org.cytoscape.model.CyNetwork;
 import org.cytoscape.model.CyNode;
+import org.cytoscape.model.events.AddedEdgesEvent;
+import org.cytoscape.model.events.AddedEdgesListener;
+import org.cytoscape.model.events.AddedNodesEvent;
+import org.cytoscape.model.events.AddedNodesListener;
+import org.cytoscape.model.events.RemovedEdgesEvent;
+import org.cytoscape.model.events.RemovedEdgesListener;
+import org.cytoscape.model.events.RemovedNodesEvent;
+import org.cytoscape.model.events.RemovedNodesListener;
 import org.cytoscape.service.util.CyServiceRegistrar;
 import org.cytoscape.view.model.CyNetworkView;
 import org.cytoscape.view.model.CyNetworkViewManager;
@@ -70,7 +80,8 @@
 /**
  * Simple score and find action for MCODE. This should be the default for 
general users.
  */
-public class MCODEAnalyzeAction extends AbstractMCODEAction implements 
SetCurrentNetworkListener {
+public class MCODEAnalyzeAction extends AbstractMCODEAction implements 
SetCurrentNetworkListener, AddedNodesListener,
+               AddedEdgesListener, RemovedNodesListener, RemovedEdgesListener {
 
        private static final long serialVersionUID = 87924889404093104L;
 
@@ -85,6 +96,8 @@
 
        int analyze = FIRST_TIME;
        
+       private Map<Long/*network_suid*/, Boolean> dirtyNetworks;
+       
        private static final Logger logger = 
LoggerFactory.getLogger(MCODEAnalyzeAction.class);
 
        public MCODEAnalyzeAction(final String title,
@@ -98,6 +111,7 @@
                this.registrar = registrar;
                this.taskManager = taskManager;
                this.mcodeUtil = mcodeUtil;
+               dirtyNetworks = new HashMap<Long, Boolean>();
        }
 
        /**
@@ -106,7 +120,7 @@
         * @param event Click of the analyzeButton on the MCODEMainPanel.
         */
        @Override
-       public void actionPerformed(ActionEvent event) {
+       public void actionPerformed(final ActionEvent event) {
                String interruptedMessage = "";
                // Get the selected network
                final CyNetwork network = 
applicationManager.getCurrentNetwork();
@@ -162,30 +176,19 @@
                }
 
                final int resultId = mcodeUtil.getCurrentResultId();
-
+               
                // These statements determine which portion of the algorithm 
needs to be conducted by
                // testing which parameters have been modified compared to the 
last saved parameters.
                // Here we ensure that only relevant parameters are looked at.  
For example, fluff density
                // parameter is irrelevant if fluff is not used in the current 
parameters.  Also, none of
                // the clustering parameters are relevant if the optimization 
is used
-               if (currentParamsCopy.isIncludeLoops() != 
savedParamsCopy.isIncludeLoops() ||
-                       currentParamsCopy.getDegreeCutoff() != 
savedParamsCopy.getDegreeCutoff() || analyze == FIRST_TIME) {
+               if (analyze == FIRST_TIME || isDirty(network)
+                               || currentParamsCopy.isIncludeLoops() != 
savedParamsCopy.isIncludeLoops()
+                               || currentParamsCopy.getDegreeCutoff() != 
savedParamsCopy.getDegreeCutoff()) {
                        analyze = RESCORE;
                        logger.debug("Analysis: score network, find clusters");
                        
mcodeUtil.getCurrentParameters().setParams(currentParamsCopy, resultId, 
network.getSUID());
-               } else if 
(!currentParamsCopy.getScope().equals(savedParamsCopy.getScope()) ||
-                                  
(!currentParamsCopy.getScope().equals(MCODEParameterSet.NETWORK) && 
currentParamsCopy
-                                                  .getSelectedNodes() != 
savedParamsCopy.getSelectedNodes()) ||
-                                  currentParamsCopy.isOptimize() != 
savedParamsCopy.isOptimize() ||
-                                  (!currentParamsCopy.isOptimize() && 
(currentParamsCopy.getKCore() != savedParamsCopy.getKCore() ||
-                                                                               
                                currentParamsCopy.getMaxDepthFromStart() != 
savedParamsCopy
-                                                                               
                                                .getMaxDepthFromStart() ||
-                                                                               
                                currentParamsCopy.isHaircut() != 
savedParamsCopy.isHaircut() ||
-                                                                               
                                currentParamsCopy.getNodeScoreCutoff() != 
savedParamsCopy
-                                                                               
                                                .getNodeScoreCutoff() ||
-                                                                               
                                currentParamsCopy.isFluff() != 
savedParamsCopy.isFluff() || (currentParamsCopy
-                                                  .isFluff() && 
currentParamsCopy.getFluffNodeDensityCutoff() != savedParamsCopy
-                                                  
.getFluffNodeDensityCutoff())))) {
+               } else if (parametersChanged(savedParamsCopy, 
currentParamsCopy)) {
                        analyze = REFIND;
                        logger.debug("Analysis: find clusters");
                        
mcodeUtil.getCurrentParameters().setParams(currentParamsCopy, resultId, 
network.getSUID());
@@ -218,6 +221,7 @@
                                public void handleEvent(final 
AnalysisCompletedEvent e) {
                                        MCODEResultsPanel resultsPanel = null;
                                        boolean resultFound = false;
+                                       setDirty(network, false);
 
                                        // Display clusters in a new modal 
dialog box
                                        if (e.isSuccessful()) {
@@ -273,4 +277,59 @@
        public void handleEvent(SetCurrentNetworkEvent e) {
                updateEnableState();
        }
+
+       @Override
+       public void handleEvent(RemovedEdgesEvent e) {
+               setDirty(e.getSource(), true);
+       }
+
+       @Override
+       public void handleEvent(RemovedNodesEvent e) {
+               setDirty(e.getSource(), true);
+       }
+
+       @Override
+       public void handleEvent(AddedEdgesEvent e) {
+               setDirty(e.getSource(), true);
+       }
+
+       @Override
+       public void handleEvent(AddedNodesEvent e) {
+               setDirty(e.getSource(), true);
+       }
+
+       /**
+        * @param p1 previous parameters set
+        * @param p2 current parameters set
+        * @return
+        */
+       private boolean parametersChanged(final MCODEParameterSet p1, final 
MCODEParameterSet p2) {
+               boolean b = !p2.getScope().equals(p1.getScope());
+               b = b || (!p2.getScope().equals(MCODEParameterSet.NETWORK) && 
p2.getSelectedNodes() != p1.getSelectedNodes());
+               b = b || (p2.isOptimize() != p1.isOptimize());
+               b = b || (!p2.isOptimize() && (p2.getKCore() != p1.getKCore() ||
+                                                                               
p2.getMaxDepthFromStart() != p1.getMaxDepthFromStart() ||
+                                                                               
p2.isHaircut() != p1.isHaircut() ||
+                                                                               
p2.getNodeScoreCutoff() != p1.getNodeScoreCutoff() ||
+                                                                               
p2.isFluff() != p1.isFluff() || 
+                                                                               
(p2.isFluff() && p2.getFluffNodeDensityCutoff() != 
p1.getFluffNodeDensityCutoff())));
+               return b;
+       }
+       
+       private void setDirty(final CyNetwork net, final boolean dirty) {
+               if (mcodeUtil.containsNetworkAlgorithm(net.getSUID())) {
+                       if (dirty)
+                               dirtyNetworks.put(net.getSUID(), dirty);
+                       else
+                               dirtyNetworks.remove(net.getSUID());
+               }
+       }
+       
+       /**
+        * @param net
+        * @return true if the network has been modified after the last 
analysis.
+        */
+       private boolean isDirty(final CyNetwork net) {
+               return Boolean.TRUE.equals(dirtyNetworks.get(net.getSUID()));
+       }
 }

-- 
You received this message because you are subscribed to the Google Groups 
"cytoscape-cvs" group.
To post to this group, send email to [email protected].
To unsubscribe from this group, send email to 
[email protected].
For more options, visit this group at 
http://groups.google.com/group/cytoscape-cvs?hl=en.

Reply via email to