use of cbit.vcell.model.ReactionStep in project vcell by virtualcell.
the class BioCartoonTool method pasteReactionSteps0.
/**
* pasteReactionSteps0 : does the actual pasting. First called with a cloned model, to track issues. If user still wants to proceed, the paste
* is performed on the original model.
*
* Insert the method's description here.
* Creation date: (5/10/2003 3:55:25 PM)
* @param pasteToModel cbit.vcell.model.Model
* @param pasteToStructure cbit.vcell.model.Structure
* @param bNew boolean
*/
private static final PasteHelper pasteReactionSteps0(HashMap<String, HashMap<ReactionParticipant, Structure>> rxPartMapStructure, Component parent, IssueContext issueContext, ReactionStep[] copyFromRxSteps, Model pasteToModel, Structure pasteToStructure, boolean bNew, /*boolean bUseDBSpecies,*/
UserResolvedRxElements userResolvedRxElements) throws Exception {
HashMap<BioModelEntityObject, BioModelEntityObject> reactionsAndSpeciesContexts = new HashMap<>();
if (copyFromRxSteps == null || copyFromRxSteps.length == 0 || pasteToModel == null || pasteToStructure == null) {
throw new IllegalArgumentException("CartoonTool.pasteReactionSteps Error " + (copyFromRxSteps == null || copyFromRxSteps.length == 0 ? "reactionStepsArr empty " : "") + (pasteToModel == null ? "model is null " : "") + (pasteToStructure == null ? "struct is null " : ""));
}
if (!pasteToModel.contains(pasteToStructure)) {
throw new IllegalArgumentException("CartoonTool.pasteReactionSteps model " + pasteToModel.getName() + " does not contain structure " + pasteToStructure.getName());
}
// Check PasteToModel has preferred targets if set
if (userResolvedRxElements != null) {
for (int i = 0; i < userResolvedRxElements.toSpeciesArr.length; i++) {
if (userResolvedRxElements.toSpeciesArr[i] != null) {
// Structure toNewStruct = userResolvedRxElements.toStructureArr[i];
// SpeciesContext[] toNewSC = pasteToModel.getSpeciesContexts(toNewStruct);
// SpeciesContext[] usersSC = userResolvedRxElements.fromSpeciesContextArr;
// boolean bFound = false;
// for (int j = 0; j < toNewSC.length; j++) {
// boolean structeql = toNewSC[j].getStructure().getName().equals(usersSC[i].getStructure().getName());
// boolean specieseql = toNewSC[j].getSpecies().getCommonName().equals(usersSC[i].getSpecies().getCommonName());
// System.out.println(toNewSC[j]+" "+structeql+" "+usersSC[i]+" "+specieseql);
// if(structeql && specieseql) {
// bFound = true;
// break;
// }
// }
// if(!bFound) {
// throw new Exception("Expecting speciesContext '"+usersSC[i].getSpecies().getCommonName()+"' to exist already in structure "+toNewStruct.getName());
// }
//
// // if(!pasteToModel.contains(userResolvedRxElements.toSpeciesArr[i])){
// // throw new RuntimeException("PasteToModel does not contain preferred Species "+userResolvedRxElements.toSpeciesArr[i]);
// // }
}
// }
if (userResolvedRxElements.toStructureArr[i] != null) {
if (!pasteToModel.contains(userResolvedRxElements.toStructureArr[i])) {
throw new RuntimeException("PasteToModel does not contain preferred Structure " + userResolvedRxElements.toStructureArr[i]);
}
}
}
}
int counter = 0;
Structure currentStruct = pasteToStructure;
String copiedStructName = copyFromRxSteps[counter].getStructure().getName();
StructureTopology structTopology = (copyFromRxSteps[counter].getModel() == null ? pasteToModel.getStructureTopology() : copyFromRxSteps[counter].getModel().getStructureTopology());
IdentityHashMap<Species, Species> speciesHash = new IdentityHashMap<Species, Species>();
IdentityHashMap<SpeciesContext, SpeciesContext> speciesContextHash = new IdentityHashMap<SpeciesContext, SpeciesContext>();
Vector<Issue> issueVector = new Vector<Issue>();
do {
// create a new reaction, instead of cloning the old one; set struc
ReactionStep copyFromReactionStep = copyFromRxSteps[counter];
String newName = copyFromReactionStep.getName();
while (pasteToModel.getReactionStep(newName) != null) {
newName = org.vcell.util.TokenMangler.getNextEnumeratedToken(newName);
}
ReactionStep newReactionStep = null;
if (copyFromReactionStep instanceof SimpleReaction) {
newReactionStep = new SimpleReaction(pasteToModel, currentStruct, newName, copyFromReactionStep.isReversible());
} else if (copyFromReactionStep instanceof FluxReaction && currentStruct instanceof Membrane) {
newReactionStep = new FluxReaction(pasteToModel, (Membrane) currentStruct, null, newName, copyFromReactionStep.isReversible());
}
pasteToModel.addReactionStep(newReactionStep);
reactionsAndSpeciesContexts.put(newReactionStep, copyFromReactionStep);
Structure toRxnStruct = newReactionStep.getStructure();
Structure fromRxnStruct = copyFromReactionStep.getStructure();
if (!fromRxnStruct.getClass().equals(pasteToStructure.getClass())) {
throw new Exception("Cannot copy reaction from " + fromRxnStruct.getTypeName() + " to " + pasteToStructure.getTypeName() + ".");
}
// add appropriate reactionParticipants to newReactionStep.
StructureTopology toStructureTopology = pasteToModel.getStructureTopology();
ReactionParticipant[] copyFromRxParticipantArr = copyFromReactionStep.getReactionParticipants();
if (rxPartMapStructure == null) {
// null during 'issues' trial
rxPartMapStructure = new HashMap<String, HashMap<ReactionParticipant, Structure>>();
}
// }
for (int i = 0; i < copyFromRxParticipantArr.length; i += 1) {
Structure pasteToStruct = currentStruct;
// if(toRxnStruct instanceof Membrane){
pasteToStruct = rxPartMapStructure.get(copyFromReactionStep.getName()).get(copyFromRxParticipantArr[i]);
// if(pasteToStruct == null){
// for(ReactionParticipant myRXPart:rxPartMapStructure.get(copyFromReactionStep.getName()).keySet()){
// if(myRXPart.getSpeciesContext().getName().equals(copyFromRxParticipantArr[i].getSpeciesContext().getName())){
// pasteToStruct = rxPartMapStructure.get(copyFromReactionStep.getName()).get(myRXPart);
// break;
// }
// }
// }
// }
// this adds the speciesContexts and species (if any) to the model)
SpeciesContext newSc = null;
for (int j = 0; j < userResolvedRxElements.fromSpeciesContextArr.length; j++) {
String forceName = userResolvedRxElements.finalNames.get(j).getText();
if (userResolvedRxElements.fromSpeciesContextArr[j] == copyFromRxParticipantArr[i].getSpeciesContext()) {
if (userResolvedRxElements.toSpeciesArr[j] == null) {
newSc = pasteSpecies(parent, copyFromRxParticipantArr[i].getSpecies(), null, pasteToModel, pasteToStruct, bNew, /*bUseDBSpecies,*/
speciesHash, UserResolvedRxElements.getPreferredReactionElement(userResolvedRxElements, copyFromRxParticipantArr[i]));
changeName(userResolvedRxElements, newSc, j, pasteToModel, forceName);
reactionsAndSpeciesContexts.put(newSc, copyFromRxParticipantArr[i].getSpeciesContext());
} else {
if (forceName != null && forceName.length() > 0 && pasteToModel.getSpeciesContext(forceName) != null) {
if (pasteToModel.getSpeciesContext(forceName).getStructure().getName() == userResolvedRxElements.toStructureArr[j].getName()) {
throw new Exception("Paste custom name error:\nSpeciesContext name '" + forceName + "' in structure '" + userResolvedRxElements.toStructureArr[j].getName() + "' already used");
}
}
newSc = pasteToModel.getSpeciesContext(userResolvedRxElements.toSpeciesArr[j], userResolvedRxElements.toStructureArr[j]);
if (newSc == null) {
newSc = pasteSpecies(parent, copyFromRxParticipantArr[i].getSpecies(), null, pasteToModel, pasteToStruct, bNew, /*bUseDBSpecies,*/
speciesHash, UserResolvedRxElements.getPreferredReactionElement(userResolvedRxElements, copyFromRxParticipantArr[i]));
changeName(userResolvedRxElements, newSc, j, pasteToModel, forceName);
} else if (forceName != null && forceName.length() > 0) {
throw new Exception("Paste custom name error:\nCan't rename existing speciesContext '" + newSc.getName() + "' in structure '" + newSc.getStructure().getName() + "' to '" + forceName + "'");
}
reactionsAndSpeciesContexts.put(newSc, copyFromRxParticipantArr[i].getSpeciesContext());
// String rootSC = ReactionCartoonTool.speciesContextRootFinder(copyFromRxParticipantArr[i].getSpeciesContext());
// SpeciesContext[] matchSC = pasteToModel.getSpeciesContexts();
// for(int k=0;matchSC != null && k<matchSC.length;k++){
// String matchRoot = ReactionCartoonTool.speciesContextRootFinder(matchSC[k]);
// if(matchRoot != null && matchRoot.equals(rootSC) && matchSC[k].getStructure().getName().equals(pasteToStruct.getName())){
// newSc = matchSC[k];
// reactionsAndSpeciesContexts.put(newSc, matchSC[k]);
// break;
// }
// }
}
if (newSc == null) {
throw new Exception("Couldn't assign speciesContext='" + copyFromRxParticipantArr[i].getSpeciesContext().getName() + "' to species='" + userResolvedRxElements.toSpeciesArr[j].getCommonName() + "' in structure='" + userResolvedRxElements.toStructureArr[j].getName() + "', species/structure not exist");
}
}
}
// String rootSC = ReactionCartoonTool.speciesContextRootFinder(copyFromRxParticipantArr[i].getSpeciesContext());
// SpeciesContext newSc = null;
// // if(!bNew) {
// SpeciesContext[] matchSC = pasteToModel.getSpeciesContexts();
// for(int j=0;matchSC != null && j<matchSC.length;j++){
// String matchRoot = ReactionCartoonTool.speciesContextRootFinder(matchSC[j]);
// if(matchRoot != null && matchRoot.equals(rootSC) && matchSC[j].getStructure().getName().equals(pasteToStruct.getName())){
// newSc = matchSC[j];
// reactionsAndSpeciesContexts.put(newSc, matchSC[j]);
// break;
// }
// }
// // }
//
// if(newSc == null){
// newSc = pasteSpecies(parent, copyFromRxParticipantArr[i].getSpecies(),rootSC,pasteToModel,pasteToStruct,bNew, /*bUseDBSpecies,*/speciesHash,
// UserResolvedRxElements.getPreferredReactionElement(userResolvedRxElements,copyFromRxParticipantArr[i]));
// reactionsAndSpeciesContexts.put(newSc,copyFromRxParticipantArr[i].getSpeciesContext());
// }
// record the old-new speciesContexts (reactionparticipants) in the IdHashMap, this is useful, esp for 'Paste new', while replacing proxyparams.
SpeciesContext oldSc = copyFromRxParticipantArr[i].getSpeciesContext();
if (speciesContextHash.get(oldSc) == null) {
speciesContextHash.put(oldSc, newSc);
}
if (copyFromRxParticipantArr[i] instanceof Reactant) {
newReactionStep.addReactionParticipant(new Reactant(null, newReactionStep, newSc, copyFromRxParticipantArr[i].getStoichiometry()));
} else if (copyFromRxParticipantArr[i] instanceof Product) {
newReactionStep.addReactionParticipant(new Product(null, newReactionStep, newSc, copyFromRxParticipantArr[i].getStoichiometry()));
} else if (copyFromRxParticipantArr[i] instanceof Catalyst) {
newReactionStep.addCatalyst(newSc);
}
}
// // If 'newReactionStep' is a fluxRxn, set its fluxCarrier
// if (newReactionStep instanceof FluxReaction) {
// if (fluxCarrierSp != null) {
// ((FluxReaction)newReactionStep).setFluxCarrier(fluxCarrierSp, pasteToModel);
// } else {
// throw new RuntimeException("Could not set FluxCarrier species for the flux reaction to be pasted");
// }
// }
// For each kinetic parameter expression for new kinetics, replace the proxyParams from old kinetics with proxyParams in new kinetics
// i.e., if the proxyParams are speciesContexts, replace with corresponding speciesContext in newReactionStep;
// if the proxyParams are structureSizes or MembraneVoltages, replace with corresponding structure quantity in newReactionStep
Kinetics oldKinetics = copyFromReactionStep.getKinetics();
KineticsParameter[] oldKps = oldKinetics.getKineticsParameters();
KineticsProxyParameter[] oldKprps = oldKinetics.getProxyParameters();
Hashtable<String, Expression> paramExprHash = new Hashtable<String, Expression>();
for (int i = 0; oldKps != null && i < oldKps.length; i++) {
Expression newExpression = new Expression(oldKps[i].getExpression());
for (int j = 0; oldKprps != null && j < oldKprps.length; j++) {
// check if kinetic proxy parameter is in kinetic parameter expression
if (newExpression.hasSymbol(oldKprps[j].getName())) {
SymbolTableEntry ste = oldKprps[j].getTarget();
Model pasteFromModel = copyFromReactionStep.getModel();
if (ste instanceof SpeciesContext) {
// if newRxnStruct is a feature/membrane, get matching spContexts from old reaction and replace them in new rate expr.
SpeciesContext oldSC = (SpeciesContext) ste;
SpeciesContext newSC = speciesContextHash.get(oldSC);
if (newSC == null) {
// check if oldSc is present in paste-model; if not, add it.
if (!pasteToModel.equals(pasteFromModel)) {
if (pasteToModel.getSpeciesContext(oldSC.getName()) == null) {
// if paste-model has oldSc struct, paste it there,
Structure newSCStruct = pasteToModel.getStructure(oldSC.getStructure().getName());
if (newSCStruct != null) {
newSC = pasteSpecies(parent, oldSC.getSpecies(), null, pasteToModel, newSCStruct, bNew, /*bUseDBSpecies,*/
speciesHash, UserResolvedRxElements.getPreferredReactionElement(userResolvedRxElements, oldSC));
speciesContextHash.put(oldSC, newSC);
} else {
// oldStruct wasn't found in paste-model, paste it in newRxnStruct and add warning to issues list
newSC = pasteSpecies(parent, oldSC.getSpecies(), null, pasteToModel, toRxnStruct, bNew, /*bUseDBSpecies,*/
speciesHash, UserResolvedRxElements.getPreferredReactionElement(userResolvedRxElements, oldSC));
speciesContextHash.put(oldSC, newSC);
Issue issue = new Issue(oldSC, issueContext, IssueCategory.CopyPaste, "SpeciesContext '" + oldSC.getSpecies().getCommonName() + "' was not found in compartment '" + oldSC.getStructure().getName() + "' in the model; the species was added to the compartment '" + toRxnStruct.getName() + "' where the reaction was pasted.", Issue.SEVERITY_WARNING);
issueVector.add(issue);
}
}
}
// if models are the same and newSc is null, then oldSc is not a rxnParticipant. Leave it as is in the expr.
}
if (newSC != null) {
reactionsAndSpeciesContexts.put(newSC, oldSC);
newExpression.substituteInPlace(new Expression(ste.getName()), new Expression(newSC.getName()));
}
// SpeciesContext sc = null;
// Species newSp = model.getSpecies(oldSc.getSpecies().getCommonName());
// if (oldSc.getStructure() == (oldRxnStruct)) {
// sc = model.getSpeciesContext(newSp, newRxnStruct);
// } else {
// if (newRxnStruct instanceof Membrane) {
// // for a membrane, we need to make sure that inside-outside spContexts used are appropriately replaced.
// if (oldSc.getStructure() == ((Membrane)oldRxnStruct).getOutsideFeature()) {
// // old speciesContext is outside (old) membrane, new spContext should be outside new membrane
// sc = model.getSpeciesContext(newSp, ((Membrane)newRxnStruct).getOutsideFeature());
// } else if (oldSc.getStructure() == ((Membrane)oldRxnStruct).getInsideFeature()) {
// // old speciesContext is inside (old) membrane, new spContext should be inside new membrane
// sc = model.getSpeciesContext(newSp, ((Membrane)newRxnStruct).getInsideFeature());
// }
// }
// }
// if (sc != null) {
// newExpression.substituteInPlace(new Expression(ste.getName()), new Expression(sc.getName()));
// }
} else if (ste instanceof StructureSize) {
Structure str = ((StructureSize) ste).getStructure();
// if the structure size used is same as the structure in which the reaction is present, change the structSize to appropriate new struct
if (str.compareEqual(fromRxnStruct)) {
newExpression.substituteInPlace(new Expression(ste.getName()), new Expression(toRxnStruct.getStructureSize().getName()));
} else {
if (fromRxnStruct instanceof Membrane) {
if (str.equals(structTopology.getOutsideFeature((Membrane) fromRxnStruct))) {
newExpression.substituteInPlace(new Expression(ste.getName()), new Expression(structTopology.getOutsideFeature((Membrane) toRxnStruct).getStructureSize().getName()));
} else if (str.equals(structTopology.getInsideFeature((Membrane) fromRxnStruct))) {
newExpression.substituteInPlace(new Expression(ste.getName()), new Expression(structTopology.getInsideFeature((Membrane) toRxnStruct).getStructureSize().getName()));
}
}
}
} else if (ste instanceof MembraneVoltage) {
Membrane membr = ((MembraneVoltage) ste).getMembrane();
// if the MembraneVoltage used is same as that of the membrane in which the reaction is present, change the MemVoltage
if ((fromRxnStruct instanceof Membrane) && (membr.compareEqual(fromRxnStruct))) {
newExpression.substituteInPlace(new Expression(ste.getName()), new Expression(((Membrane) toRxnStruct).getMembraneVoltage().getName()));
}
} else if (ste instanceof ModelParameter) {
// see if model has this global parameter (if rxn is being pasted into another model, it won't)
if (!pasteToModel.equals(pasteFromModel)) {
ModelParameter oldMp = (ModelParameter) ste;
ModelParameter mp = pasteToModel.getModelParameter(oldMp.getName());
boolean bNonNumeric = false;
String newMpName = oldMp.getName();
if (mp != null) {
// new model has a model parameter with same name - are they the same param?
if (!mp.getExpression().equals(oldMp.getExpression())) {
// no, they are not the same param, so mangle the 'ste' name and add as global in the other model
while (pasteToModel.getModelParameter(newMpName) != null) {
newMpName = TokenMangler.getNextEnumeratedToken(newMpName);
}
// if expression if numeric, add it as such. If not, set it to 0.0 and add it as global
Expression exp = oldMp.getExpression();
if (!exp.flatten().isNumeric()) {
exp = new Expression(0.0);
bNonNumeric = true;
}
ModelParameter newMp = pasteToModel.new ModelParameter(newMpName, exp, Model.ROLE_UserDefined, oldMp.getUnitDefinition());
String annotation = "Copied from model : " + pasteFromModel.getNameScope();
newMp.setModelParameterAnnotation(annotation);
pasteToModel.addModelParameter(newMp);
// if global param name had to be changed, make sure newExpr is updated as well.
if (!newMpName.equals(oldMp.getName())) {
newExpression.substituteInPlace(new Expression(oldMp.getName()), new Expression(newMpName));
}
}
} else {
// no global param with same name was found in other model, so add it to other model.
// if expression if numeric, add it as such. If not, set it to 0.0 and add it as global
Expression exp = oldMp.getExpression();
if (!exp.flatten().isNumeric()) {
exp = new Expression(0.0);
bNonNumeric = true;
}
ModelParameter newMp = pasteToModel.new ModelParameter(newMpName, exp, Model.ROLE_UserDefined, oldMp.getUnitDefinition());
String annotation = "Copied from model : " + pasteFromModel.getNameScope();
newMp.setModelParameterAnnotation(annotation);
pasteToModel.addModelParameter(newMp);
}
// if a non-numeric parameter was encountered in the old model, it was added as a numeric (0.0), warn user of change.
if (bNonNumeric) {
Issue issue = new Issue(oldMp, issueContext, IssueCategory.CopyPaste, "Global parameter '" + oldMp.getName() + "' was non-numeric; it has been added " + "as global parameter '" + newMpName + "' in the new model with value = 0.0. " + "Please update its value, if required, before using it.", Issue.SEVERITY_WARNING);
issueVector.add(issue);
}
}
}
}
// end - if newExpr.hasSymbol(ProxyParam)
}
// now if store <param names, new expression> in hashTable
if (paramExprHash.get(oldKps[i].getName()) == null) {
paramExprHash.put(oldKps[i].getName(), newExpression);
}
}
// end for - oldKps (old kinetic parameters)
// use this new expression to generate 'vcml' for the (new) kinetics (easier way to transfer all kinetic parameters)
String newKineticsStr = oldKinetics.writeTokensWithReplacingProxyParams(paramExprHash);
// convert the kinetics 'vcml' to tokens.
CommentStringTokenizer kineticsTokens = new CommentStringTokenizer(newKineticsStr);
// skip the first token;
kineticsTokens.nextToken();
// second token is the kinetic type; use this to create a dummy kinetics
String kineticType = kineticsTokens.nextToken();
Kinetics newkinetics = KineticsDescription.fromVCMLKineticsName(kineticType).createKinetics(newReactionStep);
// use the remaining tokens to construct the new kinetics
newkinetics.fromTokens(newKineticsStr);
// bind newkinetics to newReactionStep and add it to newReactionStep
newkinetics.bind(newReactionStep);
newReactionStep.setKinetics(newkinetics);
counter += 1;
if (counter == copyFromRxSteps.length) {
break;
}
if (!copiedStructName.equals(fromRxnStruct.getName())) {
if (currentStruct instanceof Feature) {
currentStruct = structTopology.getMembrane((Feature) currentStruct);
} else if (currentStruct instanceof Membrane) {
currentStruct = structTopology.getInsideFeature((Membrane) currentStruct);
}
}
copiedStructName = fromRxnStruct.getName();
} while (true);
return new PasteHelper(issueVector, rxPartMapStructure, reactionsAndSpeciesContexts);
}
use of cbit.vcell.model.ReactionStep in project vcell by virtualcell.
the class ReactionCartoonTool method menuAction.
@Override
protected void menuAction(Shape shape, String menuAction) {
if (shape == null) {
return;
}
if (menuAction.equals(CartoonToolMiscActions.Properties.MENU_ACTION)) {
if (shape instanceof FluxReactionShape) {
// showFluxReactionPropertiesDialog((FluxReactionShape) shape);
} else if (shape instanceof SimpleReactionShape) {
// showSimpleReactionPropertiesDialog((SimpleReactionShape) shape);
} else if (shape instanceof ReactantShape) {
// Point locationOnScreen = shape.getSpaceManager().getAbsLoc();
// Point graphPaneLocation = getGraphPane().getLocationOnScreen();
// locationOnScreen.translate(graphPaneLocation.x,
// graphPaneLocation.y);
// showReactantPropertiesDialog((ReactantShape) shape,
// locationOnScreen);
} else if (shape instanceof ProductShape) {
// Point locationOnScreen = shape.getSpaceManager().getAbsLoc();
// Point graphPaneLocation = getGraphPane().getLocationOnScreen();
// locationOnScreen.translate(graphPaneLocation.x,
// graphPaneLocation.y);
// showProductPropertiesDialog((ProductShape) shape,
// locationOnScreen);
} else if (shape instanceof SpeciesContextShape) {
// showEditSpeciesDialog(getGraphPane(), getReactionCartoon()
// .getModel(), ((SpeciesContextShape) shape)
// .getSpeciesContext());
} else if (shape instanceof ReactionContainerShape) {
// ReactionContainerShape rcs = (ReactionContainerShape) shape;
// if (rcs.getStructure() instanceof Feature) {
// //
// // showFeaturePropertyDialog is invoked in two modes:
// //
// // 1) parent!=null and child==null
// // upon ok, it adds a new feature to the supplied parent.
// //
// // 2) parent==null and child!=null
// // upon ok, edits the feature name
// //
// showFeaturePropertiesDialog(getGraphPane(),
// (getReactionCartoon().getModel() == null ? null
// : getReactionCartoon().getModel()), null,
// (Feature) rcs.getStructure());
// } else if (rcs.getStructure() instanceof Membrane) {
// showMembranePropertiesDialog(getGraphPane(), (Membrane) rcs
// .getStructure());
// }
}
} else if (menuAction.equals(CartoonToolMiscActions.AddSpecies.MENU_ACTION)) {
if (shape instanceof ReactionContainerShape) {
getGraphModel().deselectShape(shape);
// showCreateSpeciesContextDialog(getGraphPane(),
// getReactionCartoon().getModel(),
// ((ReactionContainerShape) shape).getStructure(), null);
SpeciesContext speciesContext = getReactionCartoon().getModel().createSpeciesContext(((ReactionContainerShape) shape).getStructure());
getGraphModel().select(speciesContext);
}
} else if (menuAction.equals(CartoonToolEditActions.Copy.MENU_ACTION)) {
if (shape instanceof SpeciesContextShape || shape instanceof ReactionStepShape || // rule participants whose rule is not selected won't
shape instanceof RuleParticipantSignatureDiagramShape || // be copied since standalone they are meaningless
shape instanceof ReactionRuleDiagramShape) {
SpeciesContext[] spArray = getSelectedSpeciesContextArray();
ReactionStep[] rsArray = getSelectedReactionStepArray();
ReactionRule[] rrArray = getSelectedReactionRuleArray();
MolecularType[] mtArray = getSelectedMolecularTypeArray(rrArray, rsArray, spArray);
Structure[] structArray = getSelectedStructuresArray(rrArray, rsArray, spArray, mtArray);
Structure fromStruct = null;
ReactionContainerShape rcs = null;
Shape parentShape = shape.getParent();
if (parentShape instanceof ReactionContainerShape) {
rcs = (ReactionContainerShape) parentShape;
fromStruct = rcs.getStructure();
}
ReactionSpeciesCopy reactionSpeciesCopy = new ReactionSpeciesCopy(spArray, rsArray, rrArray, mtArray, fromStruct, structArray);
VCellTransferable.sendToClipboard(reactionSpeciesCopy);
}
} else if (/*menuAction.equals(CartoonToolEditActions.Paste.MENU_ACTION)
|| */
menuAction.equals(CartoonToolEditActions.PasteNew.MENU_ACTION)) {
if (shape instanceof ReactionContainerShape) {
pasteReactionsAndSpecies(getGraphPane().getRootPane(), ((ReactionContainerShape) shape).getStructure());
}
} else if (menuAction.equals(CartoonToolEditActions.Delete.MENU_ACTION)) {
try {
if (getGraphModel().getSelectedShape() instanceof ReactionContainerShape && menuAction.equals(CartoonToolEditActions.Delete.MENU_ACTION)) {
getModel().removeStructure(((ReactionContainerShape) getGraphModel().getSelectedShape()).getStructure());
return;
}
if (getSelectedReactionStepArray() != null || getSelectedSpeciesContextArray() != null) {
deleteReactionsAndSpecies(getGraphPane(), getSelectedReactionStepArray(), getSelectedSpeciesContextArray());
}
if (getSelectedReactionParticipantArray() != null && menuAction.equals(CartoonToolEditActions.Delete.MENU_ACTION)) {
ReactionParticipant[] reactionParticipantArr = getSelectedReactionParticipantArray();
if (ReactionCartoonTool.checkAllCatalyst(reactionParticipantArr)) {
DialogUtils.showWarningDialog(getGraphPane(), "Catalysts are determined automatically from the reaction kinetic expression.");
return;
}
String response = DialogUtils.showWarningDialog(getGraphPane(), "Delete " + reactionParticipantArr.length + " Reaction Stoichiometries", new String[] { RXSPECIES_DELETE, RXSPECIES_CANCEL }, RXSPECIES_CANCEL);
if (response != null && response.equals(RXSPECIES_DELETE)) {
for (int i = 0; i < reactionParticipantArr.length; i++) {
if (reactionParticipantArr[i] instanceof Catalyst) {
// Catalysts may only be deleted by editing kynetic / proxy parameters
continue;
}
ReactionStep reactionStep = reactionParticipantArr[i].getReactionStep();
reactionStep.removeReactionParticipant(reactionParticipantArr[i]);
}
}
}
} catch (UserCancelException uce) {
return;
} catch (PropertyVetoException e) {
DialogUtils.showErrorDialog(getGraphPane(), e.getMessage());
} catch (Exception e) {
DialogUtils.showErrorDialog(getGraphPane(), e.getMessage(), e);
}
} else if (menuAction.equals(CartoonToolMiscActions.SearchReactions.MENU_ACTION)) {
try {
if (shape instanceof ReactionContainerShape) {
showReactionBrowserDialog(((ReactionContainerShape) shape).getStructure(), null);
}
} catch (Exception e) {
DialogUtils.showErrorDialog(getGraphPane(), e.getMessage(), e);
}
} else if (menuAction.equals(CartoonToolSaveAsImageActions.MenuAction.MENU_ACTION)) {
try {
String resType = null;
if (shape instanceof ReactionContainerShape) {
showSaveReactionImageDialog();
}
} catch (Exception e) {
e.printStackTrace();
DialogUtils.showErrorDialog(getGraphPane(), e.getMessage(), e);
}
} else if (menuAction.equals(CartoonToolMiscActions.Annotate.MENU_ACTION)) {
if (shape instanceof ReactionStepShape) {
// MIRIAMHelper.showMIRIAMAnnotationDialog(((SimpleReactionShape)shape).getReactionStep());
// System.out.println("Menu action annotate activated...");
ReactionStep rs = ((ReactionStepShape) shape).getReactionStep();
VCMetaData vcMetaData = rs.getModel().getVcMetaData();
try {
String newAnnotation = DialogUtils.showAnnotationDialog(getGraphPane(), vcMetaData.getFreeTextAnnotation(rs));
vcMetaData.setFreeTextAnnotation(rs, newAnnotation);
} catch (UtilCancelException e) {
// Do Nothing
} catch (Throwable exc) {
exc.printStackTrace(System.out);
DialogUtils.showErrorDialog(getGraphPane(), "Failed to edit annotation!\n" + exc.getMessage(), exc);
}
}
} else {
// default action is to ignore
}
}
use of cbit.vcell.model.ReactionStep in project vcell by virtualcell.
the class ReactionCartoonTool method lineAction.
private void lineAction(SpeciesContext speciesContextStart, Structure endStructure) throws PropertyVetoException, Exception {
Point startPos = edgeShape.getStart();
Point endPos = edgeShape.getEnd();
Model model = getModel();
StructureTopology structTopology = model.getStructureTopology();
Structure startStructure = speciesContextStart.getStructure();
ReactionStep reaction = null;
Structure reactionStructure = null;
if (endStructure != startStructure) {
if (startStructure instanceof Feature && endStructure instanceof Feature) {
// FeatureStart-speciesContext ==> FeatureEnd with NO membrane in between : create lumped reaction in FeatureStart and pdt in FeatureEnd
reactionStructure = startStructure;
reaction = model.createSimpleReaction(reactionStructure);
reaction.addReactant(speciesContextStart, 1);
SpeciesContext endSpeciesContext = model.createSpeciesContext(endStructure);
reaction.addProduct(endSpeciesContext, 1);
reaction.setKinetics(new GeneralLumpedKinetics(reaction));
positionShapeForObject(endStructure, endSpeciesContext, endPos);
} else if (startStructure instanceof Feature && endStructure instanceof Membrane) {
// Feature-speciesContext ==> Membrane : create lumped reaction in membrane, pdt in membrane
reactionStructure = endStructure;
reaction = model.createSimpleReaction(reactionStructure);
reaction.addReactant(speciesContextStart, 1);
SpeciesContext endSpeciesContext = model.createSpeciesContext(endStructure);
reaction.addProduct(endSpeciesContext, 1);
reaction.setKinetics(new GeneralLumpedKinetics(reaction));
positionShapeForObject(endStructure, endSpeciesContext, endPos);
} else if (startStructure instanceof Membrane && endStructure instanceof Feature) {
// Membrane-speciesContext ==> Feature : create reaction in Membrane, pdt in Feature
reactionStructure = startStructure;
reaction = model.createSimpleReaction(reactionStructure);
reaction.addReactant(speciesContextStart, 1);
SpeciesContext endSpeciesContext = model.createSpeciesContext(endStructure);
reaction.addProduct(endSpeciesContext, 1);
positionShapeForObject(endStructure, endSpeciesContext, endPos);
} else if (startStructure instanceof Membrane && endStructure instanceof Membrane) {
// MembraneStart-speciescontext ==> MembraneEnd : create lumped reaction in MembraneStart, pdt in MembraneEnd.
reactionStructure = startStructure;
reaction = model.createSimpleReaction(reactionStructure);
reaction.addReactant(speciesContextStart, 1);
SpeciesContext endSpeciesContext = model.createSpeciesContext(endStructure);
reaction.addProduct(endSpeciesContext, 1);
reaction.setKinetics(new GeneralLumpedKinetics(reaction));
positionShapeForObject(endStructure, endSpeciesContext, endPos);
}
} else {
// startStructure and endStructure are the same
// Feature1 ==> Feature1 OR Membrane1 ==> Membrane1
reaction = model.createSimpleReaction(startStructure);
reaction.addReactant(speciesContextStart, 1);
}
positionShapeForObject(reactionStructure, reaction, new Point(((8 * startPos.x + 2 * endPos.x) / 10), (8 * startPos.y + 2 * endPos.y) / 10));
getReactionCartoon().notifyChangeEvent();
getGraphModel().clearSelection();
getGraphModel().select(reaction);
}
use of cbit.vcell.model.ReactionStep in project vcell by virtualcell.
the class ModelProcessSpecsPanel method initConnections.
/**
* Initializes connections
* @exception java.lang.Exception The exception description.
*/
/* WARNING: THIS METHOD WILL BE REGENERATED. */
private void initConnections() throws java.lang.Exception {
// user code begin {1}
// user code end
this.addPropertyChangeListener(ivjEventHandler);
getScrollPaneTable().setModel(getModelProcessSpecsTableModel());
getScrollPaneTable().setDefaultRenderer(ModelProcess.class, new DefaultScrollTableCellRenderer() {
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
defaultToolTipText = null;
if (value instanceof ModelProcess) {
setText(((ModelProcess) value).getName());
defaultToolTipText = getText();
setToolTipText(defaultToolTipText);
}
TableModel tableModel = table.getModel();
if (tableModel instanceof SortTableModel) {
DefaultScrollTableCellRenderer.issueRenderer(this, defaultToolTipText, table, row, column, (SortTableModel) tableModel);
}
return this;
}
});
DefaultScrollTableCellRenderer rbmReactionShapeDepictionCellRenderer = new DefaultScrollTableCellRenderer() {
List<SpeciesPatternSmallShape> spssList = new ArrayList<SpeciesPatternSmallShape>();
SpeciesPatternSmallShape spss = null;
@Override
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
if (table.getModel() instanceof VCellSortTableModel<?>) {
Object selectedObject = null;
if (table.getModel() == ivjModelProcessSpecsTableModel) {
selectedObject = ivjModelProcessSpecsTableModel.getValueAt(row);
}
if (selectedObject != null) {
if (selectedObject instanceof ModelProcessSpec) {
ModelProcessSpec mps = (ModelProcessSpec) selectedObject;
ModelProcess mp = (ModelProcess) mps.getModelProcess();
if (mp instanceof ReactionRule) {
ReactionRule rr = (ReactionRule) mp;
Graphics panelContext = table.getGraphics();
spssList.clear();
List<ReactantPattern> rpList = rr.getReactantPatterns();
int xPos = 4;
for (int i = 0; i < rpList.size(); i++) {
SpeciesPattern sp = rr.getReactantPattern(i).getSpeciesPattern();
spss = new SpeciesPatternSmallShape(xPos, 2, sp, shapeManager, panelContext, rr, isSelected, issueManager);
if (i < rpList.size() - 1) {
spss.addEndText("+");
} else {
if (rr.isReversible()) {
spss.addEndText("<->");
xPos += 7;
} else {
spss.addEndText("->");
}
}
xPos += spss.getWidth() + 15;
spssList.add(spss);
}
List<ProductPattern> ppList = rr.getProductPatterns();
xPos += 7;
for (int i = 0; i < ppList.size(); i++) {
SpeciesPattern sp = rr.getProductPattern(i).getSpeciesPattern();
spss = new SpeciesPatternSmallShape(xPos, 2, sp, shapeManager, panelContext, rr, isSelected, issueManager);
if (i < ppList.size() - 1) {
spss.addEndText("+");
}
xPos += spss.getWidth() + 15;
spssList.add(spss);
}
} else {
ReactionStep rs = (ReactionStep) mp;
Graphics panelContext = table.getGraphics();
spssList.clear();
int xPos = 4;
int extraSpace = 0;
for (int i = 0; i < rs.getNumReactants(); i++) {
SpeciesPattern sp = rs.getReactant(i).getSpeciesContext().getSpeciesPattern();
spss = new SpeciesPatternSmallShape(xPos, 2, sp, shapeManager, panelContext, rs, isSelected, issueManager);
if (i < rs.getNumReactants() - 1) {
spss.addEndText("+");
} else {
if (rs.isReversible()) {
spss.addEndText("<->");
extraSpace += 7;
} else {
spss.addEndText("->");
}
}
int offset = sp == null ? 17 : 15;
offset += extraSpace;
int w = spss.getWidth();
xPos += w + offset;
spssList.add(spss);
}
xPos += 8;
for (int i = 0; i < rs.getNumProducts(); i++) {
SpeciesPattern sp = rs.getProduct(i).getSpeciesContext().getSpeciesPattern();
if (i == 0 && rs.getNumReactants() == 0) {
xPos += 14;
}
spss = new SpeciesPatternSmallShape(xPos, 2, sp, shapeManager, panelContext, rs, isSelected, issueManager);
if (i == 0 && rs.getNumReactants() == 0) {
spss.addStartText("->");
}
if (i < rs.getNumProducts() - 1) {
spss.addEndText("+");
}
int offset = sp == null ? 17 : 15;
int w = spss.getWidth();
xPos += w + offset;
spssList.add(spss);
}
}
}
} else {
spssList.clear();
}
}
setText("");
return this;
}
@Override
public void paintComponent(Graphics g) {
super.paintComponent(g);
for (SpeciesPatternSmallShape spss : spssList) {
if (spss == null) {
continue;
}
spss.paintSelf(g);
}
}
};
getScrollPaneTable().setDefaultRenderer(SpeciesPattern.class, rbmReactionShapeDepictionCellRenderer);
// ivjScrollPaneTable.getColumnModel().getColumn(ModelProcessSpecsTableModel.ColumnType.COLUMN_DEPICTION.ordinal()).setCellRenderer(rbmReactionShapeDepictionCellRenderer);
// ivjScrollPaneTable.getColumnModel().getColumn(ModelProcessSpecsTableModel.ColumnType.COLUMN_DEPICTION.ordinal()).setPreferredWidth(180);
getScrollPaneTable().getSelectionModel().addListSelectionListener(ivjEventHandler);
}
use of cbit.vcell.model.ReactionStep in project vcell by virtualcell.
the class BioModelEditorModelPanel method deleteButtonPressed.
private void deleteButtonPressed() {
try {
ArrayList<Object> deleteList = new ArrayList<Object>();
int selectedIndex = tabbedPane.getSelectedIndex();
if (selectedIndex == ModelPanelTabID.reaction_diagram.ordinal()) {
deleteList.addAll(Arrays.asList(reactionCartoonEditorPanel.getReactionCartoon().getSelectedObjects()));
// } else if (selectedIndex == ModelPanelTabID.structure_diagram.ordinal()) {
// deleteList.addAll(Arrays.asList(cartoonEditorPanel.getStructureCartoon().getSelectedObjects()));
} else {
computeCurrentSelectedTable();
int[] rows = currentSelectedTable.getSelectedRows();
if (rows == null || rows.length == 0) {
return;
}
if (currentSelectedTable == speciesTable) {
for (int r : rows) {
if (r < speciesTableModel.getRowCount()) {
SpeciesContext speciesContext = speciesTableModel.getValueAt(r);
if (speciesContext != null) {
deleteList.add(speciesContext);
}
}
}
} else if (currentSelectedTable == molecularTypeTable) {
// TODO: delete stuff
for (int r : rows) {
if (r < molecularTypeTableModel.getRowCount()) {
MolecularType mt = molecularTypeTableModel.getValueAt(r);
if (mt != null) {
deleteList.add(mt);
}
}
}
} else if (currentSelectedTable == observablesTable) {
for (int r : rows) {
if (r < observableTableModel.getRowCount()) {
RbmObservable o = observableTableModel.getValueAt(r);
if (o != null) {
deleteList.add(o);
}
}
}
} else if (currentSelectedTable == structuresTable) {
for (int r : rows) {
if (r < structureTableModel.getRowCount()) {
Structure rowValue = structureTableModel.getValueAt(r);
if (rowValue instanceof Feature || rowValue instanceof Membrane) {
deleteList.add(rowValue);
}
}
}
} else if (currentSelectedTable == reactionsTable) {
for (int r : rows) {
if (r < reactionTableModel.getRowCount()) {
ModelProcess reaction = reactionTableModel.getValueAt(r);
if (reaction != null) {
deleteList.add(reaction);
}
}
}
}
}
if (deleteList.size() == 0) {
return;
}
StringBuilder deleteListText = new StringBuilder();
for (Object object : deleteList) {
if (object instanceof SpeciesContext) {
deleteListText.append("Species\t'" + ((SpeciesContext) object).getName() + "'\n");
} else if (object instanceof MolecularType) {
deleteListText.append(((MolecularType) object).getDisplayType() + "\t'" + ((MolecularType) object).getDisplayName() + "'\n");
} else if (object instanceof RbmObservable) {
deleteListText.append("Observable\t'" + ((RbmObservable) object).getName() + "'\n");
} else if (object instanceof ReactionStep) {
deleteListText.append("Reaction\t'" + ((ReactionStep) object).getName() + "'\n");
} else if (object instanceof ReactionRule) {
deleteListText.append("Reaction rule\t'" + ((ReactionRule) object).getName() + "'\n");
} else if (object instanceof Structure) {
deleteListText.append("Structure\t'" + ((Structure) object).getName() + "'\n");
}
}
// TODO: once we display reaction rules in the carton editor panel we'll have to change the way we delete reaction rules
if (deleteList.get(0) instanceof SpeciesContext || deleteList.get(0) instanceof ReactionStep) {
try {
ArrayList<SpeciesContext> speciesContextArrList = new ArrayList<SpeciesContext>();
ArrayList<ReactionStep> reactionStepArrList = new ArrayList<ReactionStep>();
for (Object obj : deleteList) {
if (obj instanceof SpeciesContext) {
speciesContextArrList.add((SpeciesContext) obj);
} else if (obj instanceof ReactionStep) {
reactionStepArrList.add((ReactionStep) obj);
} else {
throw new Exception("Unexpected delete object " + obj.getClass().getName());
}
}
ReactionCartoonTool.deleteReactionsAndSpecies(reactionCartoonEditorPanel, reactionStepArrList.toArray(new ReactionStep[0]), speciesContextArrList.toArray(new SpeciesContext[0]));
} catch (UserCancelException uce) {
return;
}
return;
} else {
String confirm = DialogUtils.showOKCancelWarningDialog(this, "Deleting", "You are going to delete the following:\n\n" + deleteListText + "\n Continue?");
if (confirm.equals(UserMessage.OPTION_CANCEL)) {
return;
}
for (Object object : deleteList) {
if (object instanceof ReactionRule) {
ReactionRule rr = (ReactionRule) object;
bioModel.getModel().getRbmModelContainer().removeReactionRule(rr);
} else if (object instanceof MolecularType) {
Map<String, Pair<Displayable, SpeciesPattern>> usedHere = new LinkedHashMap<String, Pair<Displayable, SpeciesPattern>>();
MolecularType mt = (MolecularType) object;
if (!bioModel.getModel().getRbmModelContainer().isDeleteAllowed(mt, usedHere)) {
String errMsg = mt.getDisplayType() + " <b>'" + mt + "'</b> cannot be deleted because it's already being used by:<br>";
final int MaxListSize = 7;
int count = 0;
for (String key : usedHere.keySet()) {
System.out.println(key);
if (count >= MaxListSize) {
errMsg += "<br> ... and more.";
break;
}
Pair<Displayable, SpeciesPattern> o = usedHere.get(key);
Displayable e = o.one;
SpeciesPattern sp = o.two;
errMsg += "<br> - " + e.getDisplayType().toLowerCase() + " <b>" + e.getDisplayName() + "</b>";
errMsg += ", " + sp.getDisplayType().toLowerCase() + " " + " <b>" + sp.getDisplayName() + "</b>";
count++;
}
errMsg = "<html>" + errMsg + "</html>";
throw new RuntimeException(errMsg);
}
bioModel.getModel().getRbmModelContainer().removeMolecularType(mt);
} else if (object instanceof RbmObservable) {
RbmObservable o = (RbmObservable) object;
bioModel.getModel().getRbmModelContainer().removeObservable(o);
} else {
bioModel.getModel().removeObject(object);
}
}
}
} catch (Exception ex) {
ex.printStackTrace();
DialogUtils.showErrorDialog(this, ex.getMessage());
}
}
Aggregations