/// <summary> /// Sets the Parameter Start Value of a given Parameter to the given Math Formula. /// </summary> protected internal void SetPSV(ASTNode math, IParameter parameter, string containerName) { if (parameter == null) { CreateErrorMsg(); return; } var formula = _astHandler.Parse(math, parameter.Name, false, _sbmlProject, _sbmlInformation); if (formula == null) { return; } var psvbb = GetMainParameterStartValuesBuildingBlock(); if (psvbb == null) { return; } psvbb.AddFormula(formula); foreach (var declaredPSV in psvbb.Where(declaredPSV => declaredPSV.Name == parameter.Name)) { if (string.IsNullOrEmpty(containerName)) { declaredPSV.Formula = formula; return; } if (!declaredPSV.Path.Contains(containerName)) { continue; } declaredPSV.Formula = formula; return; } var psv = ObjectBaseFactory.Create <IParameterStartValue>() .WithName(parameter.Name) .WithFormula(formula) .WithDimension(parameter.Dimension); psvbb.Add(psv); }
/// <summary> /// Creates the Kinetic Formula for a passive Transport. /// </summary> private void CreateKinetic(Reaction sbmlReaction, ITransportBuilder passiveTransport) { _astHandler.NeedAbsolutePath = true; var formula = sbmlReaction.getKineticLaw() == null ? ObjectBaseFactory.Create <ExplicitFormula>().WithFormulaString(String.Empty) : _astHandler.Parse(sbmlReaction.getKineticLaw().getMath(), sbmlReaction.getId(), _sbmlProject, _sbmlInformation); if (formula == null) { passiveTransport.Formula = ObjectBaseFactory.Create <ExplicitFormula>() .WithFormulaString(String.Empty) .WithName(SBMLConstants.DEFAULT_FORMULA_NAME); } else { passiveTransport.Formula = formula; _passiveTransportBuildingBlock.FormulaCache.Add(formula); } }
/// <summary> /// Creates the MoBi Reaction Formula by the given SBML Kinetic Law. /// </summary> private void CreateKineticLaw(KineticLaw kineticLaw, IReactionBuilder reactionBuilder, bool needAbsolutePath) { if (needAbsolutePath) { _astHandler.NeedAbsolutePath = true; } var formula = kineticLaw == null?ObjectBaseFactory.Create <ExplicitFormula>().WithFormulaString(String.Empty).WithName(SBMLConstants.DEFAULT_FORMULA_NAME) : _astHandler.Parse(kineticLaw.getMath(), reactionBuilder, _sbmlProject, _sbmlInformation); if (formula == null) { reactionBuilder.Formula = ObjectBaseFactory.Create <ExplicitFormula>() .WithFormulaString(String.Empty) .WithName(SBMLConstants.DEFAULT_FORMULA_NAME); } else { reactionBuilder.Formula = formula; _reactionBuildingBlock.FormulaCache.Add(formula); } }
/// <summary> /// Creates a MoBi Parameter from a given SBML Parameter. /// </summary> public IFormulaUsable CreateParameter(Parameter sbmlParameter) { var value = 0.0; if (sbmlParameter.isSetValue()) { value = sbmlParameter.getValue(); } if (!sbmlParameter.isSetUnits()) { return(ObjectBaseFactory.Create <IParameter>() .WithName(sbmlParameter.getId()) .WithFormula(ObjectBaseFactory.Create <ConstantFormula>().WithValue(value))); } var sbmlUnit = sbmlParameter.getUnits(); var baseValue = _unitDefinitionImporter.ToMobiBaseUnit(sbmlUnit, value); return(ObjectBaseFactory.Create <IParameter>() .WithName(sbmlParameter.getId()) .WithFormula(_formulaFactory.ConstantFormula(baseValue.value, baseValue.dimension)) .WithDimension(baseValue.dimension)); }
/// <summary> /// Imports a SBML Reaction by creating a passive Transport. /// </summary> private void CreatePassiveTransport(Reaction sbmlReaction, Model model) { var reactant = sbmlReaction.getReactant(0).getSpecies(); var product = sbmlReaction.getProduct(0).getSpecies(); var reactantSpecies = GetSpeciesById(reactant, model); var productSpecies = GetSpeciesById(product, model); if (_sbmlInformation.MoleculeInformation.All(info => info.SpeciesIds.TrueForAll(s => s != reactant))) { return; } if (_sbmlInformation.MoleculeInformation.All(info => info.SpeciesIds.TrueForAll(s => s != product))) { return; } var molInfoReactant = _sbmlInformation.MoleculeInformation.FirstOrDefault(info => info.SpeciesIds.Contains(reactant)); var molInfoProduct = _sbmlInformation.MoleculeInformation.FirstOrDefault(info => info.SpeciesIds.Contains(product)); if (molInfoProduct == null) { return; } if (molInfoReactant == null) { return; } //must be the same Molecule if (molInfoReactant.GetMoleculeBuilder() != molInfoProduct.GetMoleculeBuilder()) { CreateErrorMessage(); } var passiveTransport = ObjectBaseFactory.Create <ITransportBuilder>().WithName(sbmlReaction.getId()); passiveTransport.ForAll = false; if (molInfoReactant.GetMoleculeBuilderName() == null) { return; } passiveTransport.MoleculeList.AddMoleculeName(molInfoReactant.GetMoleculeBuilderName()); var reactantCompartment = GetContainerFromCompartment_(molInfoReactant.GetCompartment(reactantSpecies)); var productCompartment = GetContainerFromCompartment_(molInfoProduct.GetCompartment(productSpecies)); if (reactantCompartment != null && productCompartment != null) { var reactantMatchTag = new MatchTagCondition(reactantCompartment.Name); var productMatchTag = new MatchTagCondition(productCompartment.Name); passiveTransport.SourceCriteria.Add(reactantMatchTag); passiveTransport.TargetCriteria.Add(productMatchTag); } var parameters = CreateLocalParameters(sbmlReaction); if (parameters != null) { parameters.ForEach(passiveTransport.AddParameter); } CreateKinetic(sbmlReaction, passiveTransport); AddNeighbourhood(reactantCompartment, productCompartment, model); _passiveTransportBuildingBlock.Add(passiveTransport); }
/// <summary> /// Creates for each compartment of the SBML Reaction one "Ghostreaction" to import multicompartment reactions. /// </summary> private void CreateGhostReactions(Reaction sbmlReaction, Dictionary <string, List <SpeciesReference> > eductCompartmentMoleculeDictionary, Dictionary <string, List <SpeciesReference> > productCompartmentMoleculeDictionary, Model model) { var usedProducts = new List <string>(); foreach (var keyValuePair in eductCompartmentMoleculeDictionary) { var reactionBuilder = ObjectBaseFactory.Create <IReactionBuilder>() .WithName(sbmlReaction.getId() + "_" + keyValuePair.Key + "_ghostReaction") .WithDescription(sbmlReaction.getNotesString()); CreateModifiers(sbmlReaction, reactionBuilder, keyValuePair.Key, model); var parameters = CreateLocalParameters(sbmlReaction); if (parameters != null) { parameters.ForEach(reactionBuilder.AddParameter); } CreateKineticLaw(sbmlReaction.getKineticLaw(), reactionBuilder, true); var compartmentName = keyValuePair.Key; if (!_sbmlInformation.DummyNameContainerDictionary.ContainsValue(compartmentName)) { return; } var dummyMolecule = _sbmlInformation.DummyNameContainerDictionary.FirstOrDefault(x => x.Value == compartmentName).Key; reactionBuilder.AddModifier(dummyMolecule); foreach (var species in keyValuePair.Value) { var reactionPartner = CreateReactionPartner(species, model); if (reactionPartner != null) { reactionBuilder.AddEduct(reactionPartner); } } if (productCompartmentMoleculeDictionary.ContainsKey(keyValuePair.Key)) { usedProducts.Add(keyValuePair.Key); var productsInThisCompartment = productCompartmentMoleculeDictionary[keyValuePair.Key]; foreach (var product in productsInThisCompartment) { var reactionPartner = CreateReactionPartner(product, model); if (reactionPartner != null) { reactionBuilder.AddProduct(reactionPartner); } } } ReactionBuilderList.Add(reactionBuilder); } foreach (var keyValuePair in productCompartmentMoleculeDictionary) { if (usedProducts.Contains(keyValuePair.Key)) { continue; } var reactionBuilder = ObjectBaseFactory.Create <IReactionBuilder>() .WithName(sbmlReaction.getId() + "_" + keyValuePair.Key + "_ghostReaction") .WithDescription(sbmlReaction.getNotesString()); CreateModifiers(sbmlReaction, reactionBuilder, keyValuePair.Key, model); var parameters = CreateLocalParameters(sbmlReaction); if (parameters != null) { parameters.ForEach(reactionBuilder.AddParameter); } CreateKineticLaw(sbmlReaction.getKineticLaw(), reactionBuilder, true); var compartmentName = keyValuePair.Key; if (!_sbmlInformation.DummyNameContainerDictionary.ContainsValue(compartmentName)) { return; } var dummyMolecule = _sbmlInformation.DummyNameContainerDictionary.FirstOrDefault(x => x.Value == compartmentName).Key; reactionBuilder.AddModifier(dummyMolecule); foreach (var species in keyValuePair.Value) { var reactionPartner = CreateReactionPartner(species, model); if (reactionPartner != null) { reactionBuilder.AddProduct(reactionPartner); } } ReactionBuilderList.Add(reactionBuilder); } }
/// <summary> /// Creates the Molecule - and the Molecule Start Values Building Block. /// </summary> internal void CreateMoleculeBuildingBlock() { MoleculeBuildingBlock = ObjectBaseFactory.Create <IMoleculeBuildingBlock>() .WithName(SBMLConstants.SBML_SPECIES_BB); }