Program that renames all SIds that also have names specified.
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
@sbmlpackage{core}
Definition: List.h:174
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
@sbmlpackage{core}
Definition: SBMLDocument.h:349
unsigned int getNumErrors() const
Returns the number of errors or warnings encountered during parsing, consistency checking,...
Definition: SBMLDocument.cpp:1153
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:1176
const Model * getModel() const
Returns the Model object stored in this SBMLDocument.
Definition: SBMLDocument.cpp:346
virtual List * getAllElements(ElementFilter *filter=NULL)
Returns a List of all child SBase objects, including those nested to an arbitrary depth.
Definition: SBMLDocument.cpp:428
@sbmlpackage{core}
Definition: SBMLReader.h:343
SBMLDocument * readSBML(const std::string &filename)
Definition: SBMLReader.cpp:112
@sbmlpackage{core}
Definition: SBase.h:191
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:712
virtual int getTypeCode() const
Returns the libSBML type code for this object.
Definition: SBase.cpp:3315
virtual bool isSetName() const
Predicate returning true if this object's "name" attribute is set.
Definition: SBase.cpp:1099
virtual bool isSetId() const
Predicate returning true if a call to getId() returns a non-empty string.
Definition: SBase.cpp:1086
virtual const std::string & getName() const
Returns the value of the "name" attribute of this SBML object.
Definition: SBase.cpp:730
virtual int setId(const std::string &sid)
Sets the value of the "id" attribute of this SBML object.
Definition: SBase.cpp:1191
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