/** Split objects into normal and disease components */ private void splitObjects() { normalIds = new HashSet<Long>(); diseaseIds = new HashSet<Long>(); RenderablePathway diagram = (RenderablePathway) getRenderable(); if (pathway == null || diagram.getReactomeDiagramId() == null) return; try { GKInstance pdInst = adaptor.fetchInstance(diagram.getReactomeDiagramId()); // Get the disease pathway instance List<GKInstance> pathways = pdInst.getAttributeValuesList(ReactomeJavaConstants.representedPathway); GKInstance diseasePathway = null; GKInstance normalPathway = null; GKInstance disease = (GKInstance) pathway.getAttributeValue(ReactomeJavaConstants.disease); if (disease == null && contains(pathway, pathways)) { normalPathway = pathway; } else { diseasePathway = pathway; // There should be a normal pathway contained by a disease pathway List<?> subPathways = diseasePathway.getAttributeValuesList(ReactomeJavaConstants.hasEvent); for (Object obj : subPathways) { GKInstance subPathway = (GKInstance) obj; disease = (GKInstance) subPathway.getAttributeValue(ReactomeJavaConstants.disease); if (disease == null && contains(subPathway, pathways)) { normalPathway = subPathway; break; } } } if (normalPathway != null) { // Get all disease related objects Set<GKInstance> normalEvents = InstanceUtilities.grepPathwayEventComponents(normalPathway); for (GKInstance inst : normalEvents) normalIds.add(inst.getDBID()); Set<GKInstance> normalEntities = InstanceUtilities.grepPathwayParticipants(normalPathway); for (GKInstance inst : normalEntities) normalIds.add(inst.getDBID()); if (diseasePathway != null) { Set<GKInstance> allEvents = InstanceUtilities.grepPathwayEventComponents(diseasePathway); allEvents.removeAll(normalEvents); for (GKInstance inst : allEvents) { diseaseIds.add(inst.getDBID()); // Want to make sure disease pathways are connected to objects if (inst.getSchemClass().isa(ReactomeJavaConstants.ReactionlikeEvent)) { Set<GKInstance> rxtEntities = InstanceUtilities.getReactionParticipants(inst); for (GKInstance rxtEntity : rxtEntities) { diseaseIds.add(rxtEntity.getDBID()); } } } // Set<GKInstance> allEntities = // InstanceUtilities.grepPathwayParticipants(diseasePathway); // allEntities.removeAll(normalEntities); // for (GKInstance inst : allEntities) // diseaseIds.add(inst.getDBID()); } } splitComponents(); } catch (Exception e) { e.printStackTrace(); } }
/** * Overlay a single disease reaction onto a normal reaction. * * @param normalReaction * @param diseaseReaction * @param overlaidObjects */ private void overlayDiseaseReaction(HyperEdge normalReaction, GKInstance diseaseReaction) throws Exception { // Make a copy of the HyperEdge for future process that is related to Vertex and JSON generation HyperEdge reactionCopy = normalReaction.shallowCopy(); reactionCopy.setReactomeId(diseaseReaction.getDBID()); reactionCopy.setDisplayName(diseaseReaction.getDisplayName()); reactionCopy.setLineColor(DefaultRenderConstants.DEFAULT_DISEASE_BACKGROUND); displayedObject.addComponent(reactionCopy); overlaidObjects.add(reactionCopy); // Want to handle inputs, outputs and catalysts since regulators can // be ignored List<Node> nodes = new ArrayList<Node>(); nodes.addAll(normalReaction.getInputNodes()); nodes.addAll(normalReaction.getOutputNodes()); nodes.addAll(normalReaction.getHelperNodes()); // List objects not listed in the disease reaction as crossed objects Set<GKInstance> participants = InstanceUtilities.getReactionParticipants(diseaseReaction); Set<Long> diseaseIds = new HashSet<Long>(); for (GKInstance participant : participants) { diseaseIds.add(participant.getDBID()); if (participant.getSchemClass().isValidAttribute(ReactomeJavaConstants.hasMember)) { List<GKInstance> list = participant.getAttributeValuesList(ReactomeJavaConstants.hasMember); if (list != null && list.size() > 0) { for (GKInstance inst : list) diseaseIds.add(inst.getDBID()); } } if (participant.getSchemClass().isValidAttribute(ReactomeJavaConstants.hasCandidate)) { List<GKInstance> list = participant.getAttributeValuesList(ReactomeJavaConstants.hasCandidate); if (list != null && list.size() > 0) { for (GKInstance inst : list) diseaseIds.add(inst.getDBID()); } } } Set<GKInstance> lofInstances = new HashSet<GKInstance>(); Map<Node, GKInstance> normalToDiseaseEntity = mapMutatedToNormalNodes(diseaseReaction, normalReaction, nodes, lofInstances); for (Node node : nodes) { if (!diseaseIds.contains(node.getReactomeId())) { // Check if it should be mapped to a normal entity GKInstance diseaseEntity = normalToDiseaseEntity.get(node); if (diseaseEntity == null) crossedObjects.add(node); // Just crossed out else { Node diseaseNode = replaceNormalNode(node, diseaseEntity, contains(diseaseEntity, lofInstances)); if (diseaseNode == null) continue; // Just in case // Re-link to diseaseNode ConnectInfo connectInfo = reactionCopy.getConnectInfo(); List<?> widgets = connectInfo.getConnectWidgets(); for (Object obj : widgets) { ConnectWidget widget = (ConnectWidget) obj; if (widget.getConnectedNode() == node) widget.replaceConnectedNode(diseaseNode); } } } else overlaidObjects.add(node); } }
private void clearDeleteRecord() { if (deleteList != null) { java.util.List list = deleteList.getSelection(); if (list.size() > 0) { try { java.util.List dbIDs = new ArrayList(list.size()); for (Iterator it = list.iterator(); it.hasNext(); ) { GKInstance instance = (GKInstance) it.next(); dbIDs.add(instance.getDBID()); } fileAdaptor.clearDeleteRecord(dbIDs); } catch (IOException e) { System.err.println("SynchronizationDialog.clearDeleteRecord(): " + e); e.printStackTrace(); } deleteList.deleteInstances(list); // Check if deleteList needs to be removed if (deleteList.getDisplayedInstances().size() == 0) { centerPane.remove(deleteList); centerPane.validate(); centerPane.repaint(); } } } }
public void randomlyMapDiseaseNodesToNormalNodes( Map<Node, GKInstance> normalToDiseaseEntity, Collection<GKInstance> mapped, List<GKInstance> diseaseInputs, List<Node> normalNodes) { if (diseaseInputs != null && diseaseInputs.size() > 0) { normalNodes.removeAll(normalToDiseaseEntity.keySet()); if (normalNodes.size() > 0) { for (GKInstance input : diseaseInputs) { // if (mapped.contains(input)) if (contains(input, mapped)) continue; // it has been mapped already // Check if it has been used based on DB_ID Node matched = null; for (Node node : normalNodes) { if (node.getReactomeId().equals(input.getDBID())) { matched = node; break; } } if (matched == null) // Just pick up the first node matched = normalNodes.get(0); normalToDiseaseEntity.put(matched, input); normalNodes.remove(matched); if (normalNodes.size() == 0) break; } } } }
/** * Some of disease reactions may not be drawn in the pathway diagram (e.g. LoF or GoF reactions). * These reactions should be overlaid onto their normalReaction counterparts, which are encoded by * their normalReaction attributes. * * @param diseaseIds */ private void overlayDiseaseReactions(Set<Long> diseaseIds) { // Get the list of all drawing objects for checking Map<Long, Renderable> idToObject = new HashMap<Long, Renderable>(); List<Renderable> components = displayedObject.getComponents(); if (components == null || components.size() == 0) return; for (Renderable r : components) { if (r.getReactomeId() == null) continue; idToObject.put(r.getReactomeId(), r); } try { normalToDiseaseNode = new HashMap<Node, Node>(); for (Long diseaseId : diseaseIds) { if (idToObject.containsKey(diseaseId)) continue; // Have to copy the normal reactions to draw GKInstance inst = adaptor.fetchInstance(diseaseId); if (inst.getSchemClass().isa(ReactomeJavaConstants.ReactionlikeEvent)) { List<GKInstance> normalReactions = inst.getAttributeValuesList(ReactomeJavaConstants.normalReaction); if (normalReactions != null && normalReactions.size() > 0) { for (GKInstance normalRxt : normalReactions) { Renderable r = idToObject.get(normalRxt.getDBID()); if (r instanceof HyperEdge) overlayDiseaseReaction((HyperEdge) r, inst); } } } } return; } catch (Exception e) { e.printStackTrace(); } }
private Node replaceNormalNode( Node normalNode, GKInstance diseaseEntity, Boolean needDashedBorder) { Node diseaseNode = normalToDiseaseNode.get(normalNode); if (diseaseNode != null) return diseaseNode; try { // If a node exists already, it should use for (Renderable r : diseaseComps) { if (diseaseEntity.getDBID().equals(r.getReactomeId()) && r instanceof Node) { // This is rather arbitrary: if two nodes are very close, // use the existing one. int dx = Math.abs(r.getPosition().x - normalNode.getPosition().x); int dy = Math.abs(r.getPosition().y - normalNode.getPosition().y); if (dx < 10 && dy < 10) { // We don't need to create a new Node if it exists already normalToDiseaseNode.put(normalNode, (Node) r); overlaidObjects.add(r); // Add it to overlaid object to cover edges return (Node) r; } } } diseaseNode = normalNode.getClass().newInstance(); RenderUtility.copyRenderInfo(normalNode, diseaseNode); // The following should NOT be called since NodeAttachment is // related to disease entity only. // TODO: Need to support this. Currently it is not supported!!! See example // in PI3/AKT cancer pathway. // diseaseNode.setNodeAttachmentsLocally(node.getNodeAttachments()); diseaseNode.setDisplayName(diseaseEntity.getDisplayName()); diseaseNode.setReactomeId(diseaseEntity.getDBID()); diseaseNode.invalidateBounds(); diseaseNode.setRenderer(normalNode.getRenderer()); diseaseNode.setLineColor(DefaultRenderConstants.DEFAULT_DISEASE_BACKGROUND); diseaseNode.setNeedDashedBorder(needDashedBorder); RenderUtility.hideCompartmentInNodeName(diseaseNode); overlaidObjects.add(diseaseNode); displayedObject.addComponent(diseaseNode); normalToDiseaseNode.put(normalNode, diseaseNode); return diseaseNode; } catch (Exception e) { e.printStackTrace(); } return null; }
private void convertReactomeToGPML(GKInstance pathway, String outputFileName) throws Exception { Long dbID = pathway.getDBID(); System.out.println("converting pathway #" + dbID + " " + pathway.getDisplayName() + "..."); Document doc = r2gConverter.convertPathway(pathway); XMLOutputter outputter = new XMLOutputter(Format.getPrettyFormat()); outputter.output(doc, new FileOutputStream(outputFileName)); /* // Test loading using JDOM and validation SAXBuilder builder = new SAXBuilder(true); builder.setFeature("http://apache.org/xml/features/validation/schema", true); builder.setProperty("http://apache.org/xml/properties/schema/external-schemaLocation", "http://genmapp.org/GPML/2008a http://svn.bigcat.unimaas.nl/pathvisio/trunk/GPML2008a.xsd"); doc = builder.build(new File(outputFileName)); */ }
/** * This method is used to dump all human pathway diagrams into a specified directory. * * @param dir * @throws Exception */ public void dumpHumanPathwayDiagrams(File dir) throws Exception { Collection<?> diagrams = adaptor.fetchInstancesByClass(ReactomeJavaConstants.PathwayDiagram); SchemaClass cls = adaptor.fetchSchema().getClassByName(ReactomeJavaConstants.PathwayDiagram); SchemaAttribute att = cls.getAttribute(ReactomeJavaConstants.representedPathway); adaptor.loadInstanceAttributeValues(diagrams, att); // Group all human pathways for (Iterator<?> it = diagrams.iterator(); it.hasNext(); ) { GKInstance diagram = (GKInstance) it.next(); GKInstance pathway = (GKInstance) diagram.getAttributeValue(ReactomeJavaConstants.representedPathway); GKInstance species = (GKInstance) pathway.getAttributeValue(ReactomeJavaConstants.species); if (species == null) continue; if (species.getDBID().equals(48887L)) { String fileName = getFileName(pathway); File file = new File(dir, fileName); convertReactomeToGPML(pathway, file.getAbsolutePath()); } } }
public boolean shouldEscape(GKInstance inst) { if (!needEscapePermissioin) return false; if (needEscape && escapedDbIds.contains(inst.getDBID())) { if (cutoffDate != null) { try { // Check if the latest IEs is later than the cutoff date GKInstance latestIE = InstanceUtilities.getLatestIEFromInstance(inst); // Just in case if (latestIE == null) return true; String ieDateValue = (String) latestIE.getAttributeValue(ReactomeJavaConstants.dateTime); // Have to make sure default date instance is used! DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.S"); Date ieDate = df.parse(ieDateValue); return !ieDate.after(cutoffDate); } catch (Exception e) { // Don't want to show a GUI here. Just generate error message silently. System.err.println("QAEscapeHelper.shouldEscape(): " + e); e.printStackTrace(); return false; } } else return true; } return false; }
private void showComparison() { // Find the instance that can be used for comparision. This instance // should be chosen from changedList or localHasUnexpInstance GKInstance instance = null; if (changedList != null) { // Check changedList first List selection = changedList.getSelection(); if (selection.size() > 0) instance = (GKInstance) selection.get(0); } if (instance == null && localHasMoreIEList != null) { List selection = localHasMoreIEList.getSelection(); if (selection.size() > 0) instance = (GKInstance) selection.get(0); } if (instance == null) return; final InstanceComparisonPane comparisonPane = new InstanceComparisonPane(); // Fine tune comparison pane for making comparisons with // database comparisonPane.setSaveDialogHideUnusedButtons(true); comparisonPane.setSaveDialogSaveAsNewBtnFirst(false); comparisonPane.setSaveDialogSaveAsNewBtnTitle( "Create new local instance and put merge into that"); comparisonPane.setSaveDialogReplaceFirstBtnTitle( "Overwrite existing instance with merge (recommended)"); comparisonPane.setCloseAfterSaving(true); try { String clsName = instance.getSchemClass().getName(); Long instanceId = instance.getDBID(); final GKInstance localCopy = fileAdaptor.fetchInstance(clsName, instanceId); dbAdaptor.setUseCache(false); // final GKInstance dbCopy = dbAdaptor.fetchInstance(clsName, instanceId); // The class type might be changed locally or remotely. So not clsName should be used // to fetch database instance. Otherwise, null exception will be thrown. The same thing // is done also in creating synchronization result. final GKInstance dbCopy = dbAdaptor.fetchInstance(instanceId); dbAdaptor.setUseCache(true); comparisonPane.setInstances(localCopy, dbCopy); String title = "Comparing Instances \"" + instance.getDisplayName() + "\" in the local and DB repositories"; JDialog parentDialog = (JDialog) SwingUtilities.getAncestorOfClass(JDialog.class, centerPane); final JDialog dialog = new JDialog(parentDialog, title); // Try to update the list automatically dialog.addWindowListener( new WindowAdapter() { public void windowClosed(WindowEvent e) { handleMergeResult(localCopy, dbCopy, comparisonPane); // To prevent double calling. It is called again when parentDialog is closed. dialog.removeWindowListener(this); } }); dialog.getContentPane().add(comparisonPane, BorderLayout.CENTER); dialog.setModal(true); dialog.setSize(800, 600); GKApplicationUtilities.center(dialog); dialog.setVisible(true); // Update synchronization dialog panels depending on user // choice. if (comparisonPane.getSaveMergeOption() == InstanceComparisonPane.SAVE_AS_NEW) { GKInstance merged = comparisonPane.getMerged(); if (newList == null) { List list = new ArrayList(); list.add(merged); newList = initInstanceListPane(list, "Instances created locally: " + list.size()); } else newList.addInstance(merged); } else if (comparisonPane.getSaveMergeOption() == InstanceComparisonPane.OVERWRITE_FIRST) { dbAdaptor.setUseCache(false); GKInstance remoteCopy = dbAdaptor.fetchInstance(instance.getDBID()); dbAdaptor.setUseCache(true); if (remoteCopy != null) { InstanceComparer comparer = new InstanceComparer(); int reply = comparer.compare(instance, remoteCopy); if (reply == InstanceComparer.LOCAL_HAS_MORE_IE) { if (localHasMoreIEList == null) { List list = new ArrayList(); list.add(instance); localHasMoreIEList = initInstanceListPane( list, "Local instances having unexpected InstanceEdits: " + list.size()); } else localHasMoreIEList.addInstance(instance); } else if (reply == InstanceComparer.IS_IDENTICAL) { // Merge has made local and database copies // identical - don't need to check in anymore changedList.deleteInstance(instance); } else if (reply != InstanceComparer.NEW_CHANGE_IN_LOCAL) { // Merge has produced a conflict typeMap.put(mapCompareResultToString(reply), instance); } else // The user should now be allowed to commit this // instance, because it will now have changed. commitToDBAction.setEnabled(true); JOptionPane.showMessageDialog( parentDialog, "Merge successful, you will need to check the merged instance into the database.\n\n", "Merge OK", JOptionPane.INFORMATION_MESSAGE); } } } catch (Exception e1) { System.err.println("Synchronization.createDisplayMapPane(): " + e1); e1.printStackTrace(); JOptionPane.showMessageDialog( this, "Error in comparing: " + instance.toString(), "Error in Comparing", JOptionPane.ERROR_MESSAGE); } }
private void updateFromDB() { InstanceListPane touchedList = null; // Find out which instances have been selected in all relevant lists // Update the attribute values for changed list. try { if (changedList != null) { java.util.List list = new ArrayList(changedList.getSelection()); // To support it.remove() // Use a new ArrayList. if (list != null && list.size() > 0) { for (Iterator it = list.iterator(); it.hasNext(); ) { GKInstance instance = (GKInstance) it.next(); // Fetch GKInstance based on its DB_ID since SchemaClass might be changed. GKInstance localCopy = fileAdaptor.fetchInstance(instance.getDBID()); dbAdaptor.setUseCache(false); GKInstance dbCopy = dbAdaptor.fetchInstance(instance.getDBID()); dbAdaptor.setUseCache(true); if (SynchronizationManager.getManager().updateFromDB(localCopy, dbCopy, this)) { AttributeEditManager.getManager().attributeEdit(localCopy); fileAdaptor.removeDirtyFlag(localCopy); } else it.remove(); // Remove from the list } // Remove all selected instances changedList.deleteInstances(list); touchedList = changedList; } } if (localHasMoreIEList != null && localHasMoreIEList.getSelection().size() > 0) { List list = new ArrayList(localHasMoreIEList.getSelection()); for (Iterator it = list.iterator(); it.hasNext(); ) { GKInstance localCopy = (GKInstance) it.next(); dbAdaptor.setUseCache(false); GKInstance dbCopy = dbAdaptor.fetchInstance(localCopy.getDBID()); dbAdaptor.setUseCache(true); if (SynchronizationManager.getManager().updateFromDB(localCopy, dbCopy, this)) { AttributeEditManager.getManager().attributeEdit(localCopy); fileAdaptor.removeDirtyFlag(localCopy); } else it.remove(); // Remove from the list, if it it cancelled by the user. } localHasMoreIEList.deleteInstances(list); touchedList = localHasMoreIEList; } // Delete the local copy for deleteInDBList. if (deleteInDBList != null) { java.util.List list = deleteInDBList.getSelection(); if (list != null && list.size() > 0) { for (Iterator it = list.iterator(); it.hasNext(); ) { GKInstance instance = (GKInstance) it.next(); fileAdaptor.deleteInstance(instance); } } deleteInDBList.deleteInstances(list); touchedList = deleteInDBList; } // Get another copy for the local repository if (deleteList != null) { java.util.List<?> list = deleteList.getSelection(); if (list != null && list.size() > 0) { Map<SchemaClass, Set<GKInstance>> checkOutMap = new HashMap<SchemaClass, Set<GKInstance>>(); // All checked out Instances for (Iterator<?> it = list.iterator(); it.hasNext(); ) { GKInstance instance = (GKInstance) it.next(); Map<SchemaClass, List<GKInstance>> schemaMap = InstanceUtilities.listDownloadableInstances(instance); // Have to merge schemaMap to checkOutMap for (SchemaClass key : schemaMap.keySet()) { List<GKInstance> list1 = schemaMap.get(key); if (list1 != null && list1.size() > 0) { Set<GKInstance> list2 = checkOutMap.get(key); if (list2 == null) { list2 = new HashSet<GKInstance>(); checkOutMap.put(key, list2); } // Remove first to avoid any duplication list2.addAll(list1); } } } fileAdaptor.store(checkOutMap); InstanceUtilities.clearShellFlags(checkOutMap); // There are maybe more than selected instances after checking out List<GKInstance> checkedOut = new ArrayList<GKInstance>(); for (Set<GKInstance> set : checkOutMap.values()) { checkedOut.addAll(set); } deleteList.deleteInstances(checkedOut); // deleteList.deleteInstances(list); // Need to clear out these deletion records List<Long> dbIds = new ArrayList<Long>(); for (GKInstance inst : checkedOut) dbIds.add(inst.getDBID()); fileAdaptor.clearDeleteRecord(dbIds); touchedList = deleteList; } } } catch (Exception e) { System.err.println("SynchronizationDialog.updateFromDB(): " + e); e.printStackTrace(); } updateInstanceList(touchedList); }
/** * In case where MySQLAdaptor cache is turned off, GKInstances having the same DB_IDs from the * database are different during different queries. Using this helper method to check if a * GKInstance is contained in a Collection<GKInstance> created in different time point. * * @param inst * @param c * @return */ private boolean contains(GKInstance inst, Collection<GKInstance> c) { for (GKInstance inst1 : c) { if (inst1.getDBID().equals(inst.getDBID())) return true; } return false; }