/** Read the SBML model information to create the Cytoscape Graph.
* Additional information is stored as Node and Edge Attributes.*/
public void createCytoscapeGraphFromSBMLDocument(){
Model model = document.getModel();
networkName = getAvailableNetworkName(model.getId());
model.setId(networkName);
// Handle the node and edge information
CyAttributes nodeAttributes = Cytoscape.getNodeAttributes();
CyAttributes edgeAttributes = Cytoscape.getEdgeAttributes();
CyAttributes netAttributes = Cytoscape.getNetworkAttributes();
nodeIds = new ArrayList<Integer>();
edgeIds = new ArrayList<Integer>();
// Model
String id = networkName;
netAttributes.setAttribute(id, CySBMLConstants.ATT_ID, model.getId());
if (model.isSetName()){
netAttributes.setAttribute(id, CySBMLConstants.ATT_NAME, model.getName());
} else {
netAttributes.setAttribute(id, CySBMLConstants.ATT_NAME, model.getId());
}
if (model.isSetMetaId()){
netAttributes.setAttribute(id, CySBMLConstants.ATT_METAID, model.getMetaId());
}
if (model.isSetSBOTerm()){
netAttributes.setAttribute(id, CySBMLConstants.ATT_SBOTERM, model.getSBOTermID());
}
// Species
for (Species species : model.getListOfSpecies()) {
id = species.getId();
CyNode node = Cytoscape.getCyNode(id, true);
nodeAttributes.setAttribute(id, CySBMLConstants.ATT_ID, id);
nodeAttributes.setAttribute(id, CySBMLConstants.ATT_TYPE, CySBMLConstants.NODETYPE_SPECIES);
if (species.isSetName()){
nodeAttributes.setAttribute(id, CySBMLConstants.ATT_NAME, species.getName());
} else {
nodeAttributes.setAttribute(id, CySBMLConstants.ATT_NAME, id);
}
if (species.isSetInitialConcentration()){
nodeAttributes.setAttribute(id, CySBMLConstants.ATT_INITIAL_CONCENTRATION,
new Double(species.getInitialConcentration()));
}
if (species.isSetInitialAmount()){
nodeAttributes.setAttribute(id, CySBMLConstants.ATT_INITIAL_AMOUNT,
new Double(species.getInitialAmount()));
}
if (species.isSetSBOTerm()){
nodeAttributes.setAttribute(id, CySBMLConstants.ATT_SBOTERM,
species.getSBOTermID());
}
if (species.isSetCompartment()){
nodeAttributes.setAttribute(id,
CySBMLConstants.ATT_COMPARTMENT, species.getCompartment());
}
if (species.isSetBoundaryCondition()){
nodeAttributes.setAttribute(id, CySBMLConstants.ATT_BOUNDARY_CONDITION,
new Boolean(species.getBoundaryCondition()));
}
if (species.isSetConstant()){
nodeAttributes.setAttribute(id, CySBMLConstants.ATT_CONSTANT,
new Boolean(species.getConstant()));
}
if (species.isSetMetaId()){
nodeAttributes.setAttribute(id, CySBMLConstants.ATT_METAID, species.getMetaId());
}
if (species.isSetHasOnlySubstanceUnits()){
nodeAttributes.setAttribute(id, CySBMLConstants.ATT_HAS_ONLY_SUBSTANCE_UNITS,
new Boolean(species.getHasOnlySubstanceUnits()));
}
nodeIds.add(node.getRootGraphIndex());
}
// Reactions
String rid;
for (Reaction reaction : model.getListOfReactions()) {
rid = reaction.getId();
CyNode node = Cytoscape.getCyNode(rid, true);
nodeAttributes.setAttribute(rid, CySBMLConstants.ATT_TYPE, CySBMLConstants.NODETYPE_REACTION);
nodeAttributes.setAttribute(rid, CySBMLConstants.ATT_ID, reaction.getId());
if (reaction.isSetSBOTerm()){
nodeAttributes.setAttribute(rid, CySBMLConstants.ATT_SBOTERM, reaction.getSBOTermID());
}
if (reaction.isSetName()){
nodeAttributes.setAttribute(rid, CySBMLConstants.ATT_NAME, reaction.getName());
} else {
nodeAttributes.setAttribute(rid, CySBMLConstants.ATT_NAME, rid);
}
if (reaction.isSetCompartment()){
nodeAttributes.setAttribute(rid, CySBMLConstants.ATT_COMPARTMENT, reaction.getCompartment());
} else {
nodeAttributes.setAttribute(rid, CySBMLConstants.ATT_COMPARTMENT, "-");
}
// Reactions are reversible by default
if (reaction.isSetReversible()){
nodeAttributes.setAttribute(rid, CySBMLConstants.ATT_REVERSIBLE,
new Boolean(reaction.getReversible()));
} else {
nodeAttributes.setAttribute(rid, CySBMLConstants.ATT_REVERSIBLE,
new Boolean(true));
}
if (reaction.isSetMetaId()){
nodeAttributes.setAttribute(rid, CySBMLConstants.ATT_METAID, reaction.getMetaId());
}
nodeIds.add(node.getRootGraphIndex());
//products
Double stoichiometry;
for (SpeciesReference speciesRef : reaction.getListOfProducts()) {
CyNode product = Cytoscape.getCyNode(speciesRef.getSpecies(), false);
CyEdge edge = Cytoscape.getCyEdge(node, product, Semantics.INTERACTION,
CySBMLConstants.EDGETYPE_REACTION_PRODUCT, true);
if (speciesRef.isSetStoichiometry()){
stoichiometry = speciesRef.getStoichiometry();
} else {
stoichiometry = 1.0;
}
edgeAttributes.setAttribute(edge.getIdentifier(), CySBMLConstants.ATT_STOICHIOMETRY, stoichiometry);
if (speciesRef.isSetSBOTerm()){
edgeAttributes.setAttribute(edge.getIdentifier(), CySBMLConstants.ATT_SBOTERM, speciesRef.getSBOTermID());
}
if (speciesRef.isSetMetaId()){
edgeAttributes.setAttribute(edge.getIdentifier(), CySBMLConstants.ATT_METAID, speciesRef.getMetaId());
}
edgeIds.add(edge.getRootGraphIndex());
}
//reactants
for (SpeciesReference speciesRef : reaction.getListOfReactants()) {
CyNode reactant = Cytoscape.getCyNode(speciesRef.getSpecies(), false);
CyEdge edge = Cytoscape.getCyEdge(node, reactant, Semantics.INTERACTION,
CySBMLConstants.EDGETYPE_REACTION_REACTANT, true);
if (speciesRef.isSetStoichiometry()){
stoichiometry = speciesRef.getStoichiometry();
} else {
stoichiometry = 1.0;
}
edgeAttributes.setAttribute(edge.getIdentifier(), CySBMLConstants.ATT_STOICHIOMETRY, stoichiometry);
if (speciesRef.isSetSBOTerm()){
edgeAttributes.setAttribute(edge.getIdentifier(), CySBMLConstants.ATT_SBOTERM, speciesRef.getSBOTermID());
}
if (speciesRef.isSetMetaId()){
edgeAttributes.setAttribute(edge.getIdentifier(), CySBMLConstants.ATT_METAID, speciesRef.getMetaId());
}
edgeIds.add(edge.getRootGraphIndex());
}
//modifier
for (ModifierSpeciesReference msref : reaction.getListOfModifiers()) {
CyNode modifier = Cytoscape.getCyNode(msref.getSpecies(), false);
CyEdge edge = Cytoscape.getCyEdge(modifier, node, Semantics.INTERACTION,
CySBMLConstants.EDGETYPE_REACTION_MODIFIER, true);
stoichiometry = 1.0;
edgeAttributes.setAttribute(edge.getIdentifier(), CySBMLConstants.ATT_STOICHIOMETRY, stoichiometry);
if (msref.isSetSBOTerm()){
edgeAttributes.setAttribute(edge.getIdentifier(), CySBMLConstants.ATT_SBOTERM, msref.getSBOTermID());
}
if (msref.isSetMetaId()){
edgeAttributes.setAttribute(edge.getIdentifier(), CySBMLConstants.ATT_METAID, msref.getMetaId());
}
edgeIds.add(edge.getRootGraphIndex());
}
//parse the parameters from the kinetic laws
//TODO: better handling of the kinetic information
if (reaction.isSetKineticLaw()){
KineticLaw law = reaction.getKineticLaw();
if (law.isSetListOfLocalParameters()){
for (LocalParameter parameter: law.getListOfLocalParameters()){
String attName = "kineticLaw-" + parameter.getId();
String attUnitsName = "kineticLaw-" + parameter.getId() + "-units";
if (parameter.isSetValue()){
nodeAttributes.setAttribute(rid, attName, parameter.getValue());
}
if (parameter.isSetUnits()){
nodeAttributes.setAttribute(rid, attUnitsName, parameter.getValue());
}
}
}
}
}
////////////// QUALITATIVE SBML MODEL ////////////////////////////////////////////
//Must the network be generated again for the qual model ??
QualitativeModel qModel = (QualitativeModel) model.getExtension(QualConstant.namespaceURI);
if (qModel != null){
//QualSpecies
String qsid;
for (QualitativeSpecies qSpecies : qModel.getListOfQualitativeSpecies()){