Program that renames all SIds that also have names specified. The new identifiers will be derived from the name, with all invalid characters removed.
#include <iostream>
#include <sstream>
#include <vector>
#include <string>
using namespace std;
LIBSBML_CPP_NAMESPACE_USE
class NameIdTransformer : public IdentifierTransformer
{
public:
NameIdTransformer(const vector<string> &ids)
: IdentifierTransformer()
, existingIds(ids)
{
}
int transform(
SBase* element)
{
string newId = getValidIdForName(element->
getName());
existingIds.push_back(newId);
}
private:
std::string nameToSbmlId(const std::string & name)
{
std::ostringstream IdStream;
std::string::const_iterator it = name.begin();
std::string::const_iterator end = name.end();
if ('0' <= *it && *it <= '9')
{
IdStream << '_';
}
for (; it != end; ++it)
{
if (0x80 == (*it & 0xc0))
{
continue;
}
if (('0' <= *it && *it <= '9') ||
('a' <= *it && *it <= 'z') ||
('A' <= *it && *it <= 'Z'))
{
IdStream << *it;
}
else
{
IdStream << '_';
}
}
std::string Id = IdStream.str();
if (Id[Id.length() - 1] != '_')
{
return Id;
}
return Id.substr(0, Id.length() - 1);
}
string getValidIdForName(const string& name)
{
string base = nameToSbmlId(name);
string id(base);
int count = 1;
while (containsId(id))
{
std::ostringstream idStream;
idStream << base << "_" << count;
id = idStream.str();
++count;
}
return id;
}
bool containsId(string &id)
{
vector<string>::const_iterator it = existingIds.begin();
while(it != existingIds.end())
{
if ((*it) == id) return true;
++it;
}
return false;
}
vector<string> existingIds;
};
vector<string> getAllIds(
List* allElements)
{
vector<string> result;
if (allElements == NULL || allElements->
getSize() == 0)
return result;
for (
unsigned long int i = 0; i < allElements->
getSize(); ++i)
{
const SBase* current =
static_cast<const SBase*
>(allElements->
get(i));
{
result.push_back(current->
getId());
}
}
return result;
}
int
main (int argc, char* argv[])
{
if (argc != 3)
{
cout << endl << "Usage: setIdFromNames filename output" << endl << endl;
return 1;
}
const char* filename = argv[1];
const char* output = argv[2];
#ifdef __BORLANDC__
unsigned long start, stop;
#else
unsigned long long start, stop;
#endif
start = getCurrentMillis();
stop = getCurrentMillis();
cout << endl;
cout << " filename: " << filename << endl;
cout << " read time (ms): " << stop - start << endl;
if (errors > 0)
{
cout << " error(s): " << errors << endl;
delete document;
return errors;
}
start = stop;
const vector<string>& allIds = getAllIds(allElements);
NameIdTransformer trans(allIds);
document->
getModel()->renameIDs(allElements, &trans);
stop = getCurrentMillis();
cout << " rename time (ms): " << stop - start << endl;
start = stop;
stop = getCurrentMillis();
cout << " write time (ms): " << stop - start << endl;
cout << endl;
delete allElements;
delete document;
return errors;
}
@ SBML_LOCAL_PARAMETER
Definition: SBMLTypeCodes.h:94
Include all SBML types in a single header file.
int writeSBMLToFile(const SBMLDocument_t *d, const char *filename)
Writes the given SBML document d to the file filename.
@ LIBSBML_SEV_ERROR
Definition: XMLError.h:534
void * get(unsigned int n) const
Get the nth item in this List.
Definition: List.cpp:219
unsigned int getSize() const
Get the number of items in this List.
Definition: List.cpp:347
Definition: SBMLDocument.h:351
unsigned int getNumErrors() const
Returns the number of errors or warnings encountered during parsing, consistency checking,...
Definition: SBMLDocument.cpp:1169
void printErrors(std::ostream &stream=std::cerr) const
Prints all the errors or warnings encountered trying to parse, check, or translate this SBML document...
Definition: SBMLDocument.cpp:1192
const Model * getModel() const
Returns the Model object stored in this SBMLDocument.
Definition: SBMLDocument.cpp:350
virtual List * getAllElements(ElementFilter *filter=NULL)
Returns a List of all child SBase objects, including those nested to an arbitrary depth.
Definition: SBMLDocument.cpp:432
Definition: SBMLReader.h:343
SBMLDocument * readSBML(const std::string &filename)
Reads an SBML document from the given file.
Definition: SBMLReader.cpp:112
virtual const std::string & getId() const
Returns the value of the "id" attribute of this SBML object, if it has one, or the "variable" attribu...
Definition: SBase.cpp:713
virtual int getTypeCode() const
Returns the libSBML type code for this object.
Definition: SBase.cpp:3500
virtual bool isSetName() const
Predicate returning true if this object's "name" attribute is set.
Definition: SBase.cpp:1125
virtual bool isSetId() const
Predicate returning true if a call to getId() returns a non-empty string.
Definition: SBase.cpp:1112
virtual const std::string & getName() const
Returns the value of the "name" attribute of this SBML object.
Definition: SBase.cpp:731
virtual int setId(const std::string &sid)
Sets the value of the "id" attribute of this SBML object.
Definition: SBase.cpp:1233
Definitions of LIBSBML_EXTERN and related things.
#define BEGIN_C_DECLS
Definition: extern.h:110
#define END_C_DECLS
Definition: extern.h:111
Enumeration of values returned by operations within libSBML.
@ LIBSBML_OPERATION_SUCCESS
Definition: operationReturnValues.h:61