END_TEST START_TEST ( test_KineticLaw_parent_add ) { KineticLaw* kl=new KineticLaw(2, 4); Reaction * r = new Reaction(2, 4); r->setKineticLaw(kl); fail_unless(r == r->getKineticLaw()->getParentSBMLObject()); delete r; }
/** * Save the gene network to an SBML file. If the argument is null, use the network id. * @param filename URL to the file describing the network to load * @throws IOException */ void GeneNetwork::writeSBML(const char *filename) { ofstream data_file(filename); if (!data_file.is_open()) { std::cerr << "Failed to open file " << filename << std::endl; exit(1); } data_file.close(); ::logging::log::emit<Info>() << "Writing file " << filename << ::logging::log::endl; SBMLDocument *sbmlDoc = new SBMLDocument(3, 1); Model *model = sbmlDoc->createModel(); model->setId(id_); //model.getNotes ().add (comment_); // save network description int size = getSize(); Compartment *comp = model->createCompartment(); comp->setId("cell"); comp->setSize(1); std::vector<Species*> all_sp; Species *sp; for (int s=0; s < size; s++) { // save gene as species // species[s] = new Species(nodeIds_.get(s), nodeIds_.get(s)); sp = model->createSpecies(); sp->setCompartment("cell"); sp->setId((nodes_.at(s)).getLabel()); all_sp.push_back(sp); //species[s].setInitialAmount(?); // maybe save the wild-type steady state? //model.addSpecies(species[s]); } // create the void species sp = model->createSpecies(); sp->setCompartment("cell"); sp->setId("_void_"); sp->setInitialAmount(0); sp->setBoundaryCondition(true); sp->setConstant(true); all_sp.push_back(sp); //model.addSpecies(species[size]); // SET SYNTHESIS AND DEGRADATION REACTIONS FOR EVERY GENE for (int i=0; i<size; i++) { //::logging::log::emit<Info>() << ::logging::log::dec << i << //::logging::log::endl; // the ID of gene i // String currentGeneID = nodeIds_.get(i); string currentGeneID = (nodes_.at(i)).getLabel(); // The modifiers (regulators) of gene i std::vector<std::string> inputGenes = (nodes_.at(i)).getInputGenes(); // SYNTHESIS REACTION std::string reactionId = currentGeneID + "_synthesis"; Reaction *reaction = model->createReaction(); KineticLaw *kineticLaw = reaction->createKineticLaw(); SpeciesReference *spr; ModifierSpeciesReference *msr; reaction->setId(reactionId); reaction->setReversible (false); spr = reaction->createReactant(); spr->setSpecies(sp->getId()); spr = reaction->createProduct(); spr->setSpecies((all_sp.at(i))->getId()); std::stringstream ss; ss << inputGenes.size(); //::logging::log::emit<Debug>() << "node = " << nodes_.at(i).getLabel().c_str() << " #inputs = " << ss.str().c_str() << ::logging::log::endl; for (unsigned int r=0; r<inputGenes.size(); r++) {// set gene modifiers // reaction.addModifier(species[inputIndexes.get(r)]); //log.log(Level.INFO, "i = " + size); msr = reaction->createModifier(); msr->setSpecies((all_sp.at(getIndexOfNode(inputGenes.at(r))))->getId()); } //std::vector<RegulatoryModule> modules = (nodes_.at(i)).getRegulatoryModules(); //log.log(Level.INFO, "size = " + modules.size()); std::map<std::string, double> *params = new std::map<std::string, double>(); (nodes_.at(i)).compileParameters(*params); //char buf[256]; //sprintf(buf, "%f", nodes_.at(i).getDelta()); //::logging::log::emit<Info>() << buf << ::logging::log::endl; //::logging::log::emit<Info>() << ::logging::log::dec << nodes_.at(i).getAlpha().size() << // ::logging::log::endl; Parameter *para; // save gene parameters (note, the first param is the degradation rate) std::map<std::string, double>::iterator p = params->begin(); //p++; for (; p!=params->end(); p++) { //if (p == params->begin()) { // p++; // continue; //} //::logging::log::emit<Info>() << p->first.c_str() << // ::logging::log::endl; if (p->first != "delta") { para = kineticLaw->createParameter(); para->setId(p->first); para->setValue(p->second); } } reaction->setKineticLaw(kineticLaw); model->addReaction(reaction); // DEGRADATION REACTION reaction = model->createReaction(); kineticLaw = reaction->createKineticLaw(); reactionId = currentGeneID + "_degradation"; reaction->setId(reactionId); reaction->setReversible(false); spr = reaction->createReactant(); spr->setSpecies((all_sp.at(i))->getId()); spr = reaction->createProduct(); spr->setSpecies(sp->getId()); para = kineticLaw->createParameter(); std::map<std::string,double>::iterator it = params->find("delta"); para->setId(it->first); para->setValue(it->second); reaction->setKineticLaw (kineticLaw); model->addReaction (reaction); } // PRINT FILE SBMLWriter sbmlWriter; sbmlWriter.writeSBML(sbmlDoc, filename); delete sbmlDoc; }