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
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:3521
virtual bool isSetName() const
Predicate returning true if this object's "name" attribute is set.
Definition SBase.cpp:1136
virtual bool isSetId() const
Predicate returning true if a call to getId() returns a non-empty string.
Definition SBase.cpp:1123
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:1244
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