|
An Information Portal to Biological Macromolecular Structures |
||
|
PDB Home |
Contact Us |
Software Tools Home | Dictionary Home | PDBML Home | CIFPARSE-OBJ Home | |
----------------CIF File/CIF Parser Usage Examples-------------
1. Reading the content of a CIF file and accessing its data.
2. Updating the content of a CIF file.
3. Creating a CIF file from scratch.
#include "CifFile.h"
#include "CifParserBase.h"
// The (absolute or relative) name of the CIF file should be
// stored in cifFileName
string cifFileName;
// Parsing diagnostics
string diags;
// The name of block
string blockName;
// The name of table
string tableName;
/*
** Example 1: How to read the content of a CIF file and
** access its data.
*/
// Create CIF file object.
// Note that this is only an in-memory object, which will not be
// serialized to its binary file equivalent.
CifFile cifFile();
// Create CIF parser object
cifParserP = new CifParser(&cifFile, cifFile.GetVerbose());
// Parse the CIF file
cifParserP->Parse(cifFileName, diags);
// Delete CIF parser object, as it is not needed any more.
delete(cifParserP);
// Display diagnostics, if any
if (!diags.empty())
{
cout << "Diagnostics: " << endl << diags << endl;
}
// Accessing the data in the CIF file object
// Get access to block
Block& block = cifFile.GetBlock(blockName);
// Get access to the table
ISTable* isTableP = block.GetTablePtr(tableName);
// Print out the table
cout << (*isTableP) << endl;
/*
** Accessing "entity_poly" category and printing out its items.
*/
// Get access to the "entity_poly" table
ISTable* entityPolyTableP = block.GetTablePtr("entity_poly");
vector<string> entityPolyItems;
entityPolyTableP->GetColumnNames(entityPolyItems);
vector<string> itemValues;
for (unsigned int itemI = 0; itemI < entityPolyItems.size(); ++itemI)
{
entityPolyTableP->GetColumn(itemValues, entityPolyItems[itemI]);
cout << "Values of " << entityPolyItems[itemI] << " item are: " <<
itemValues << endl;
}
/*
** Accessing atom_site category and storing x coordinate in a real numbers
** array.
*/
// Get access to the "atom_site" table
ISTable* atomSiteTableP = block.GetTablePtr("atom_site");
// String vector of values for "cartn_x" item
vector<string> cartnX;
atomSiteTableP->GetColumn(cartnX, "cartn_x");
// Real number vector of values for "cartn_x" item
vector<double> realCartnX;
for (unsigned int rowI = 0; rowI < cartnX.size(); ++rowI)
{
realCartnX.push_back(atof(cartnX[rowI].c_str()));
}
cout << "cartn_x values in atom_site table are: " << realCartnX << endl;
// Note that we can utilize realCartnX in mathematical expressions, etc.
/*
** Example 2: How to update the content of a CIF file.
*/
// Assume here that we modify the above table in some way (add new rows,
// columns, change data, etc.). See detailed examples in ISTable
// examples.
// Write the modified table to the block.
block.WriteTable(isTableP);
// Write out a CIF file with changed table.
cifFile.Write(cifFileName);
/*
** Example 3: How to create a CIF file from scratch.
*/
// The (absolute or relative) name of the CIF file should be
// stored in cifFileName
string cifFileName;
// Assume here that we have prepared the table to be written to the file
// and that isTableP points to that table.
// See other examples of how to create the table.
// NOTE: ISTables must be allocated from the heap, since their memory
// ownership is passed to the CifFile object.
// Create CIF file object.
// Note that this is only an in-memory object, which will not be
// serialized to its binary file equivalent.
CifFile cifFile();
// Add one block to the CIF file.
cifFile.AddBlock(blockName);
// Get the created block.
Block& block = cifFile.GetBlock(blockName);
// Write some table into this block of the CIF file.
block.WriteTable(isTableP);
// Repeat the above block/table creation as needed
// Write out the created CIF file object into the CIF file.
cifFile.Write(cifFileName);
// ISTable objects must not be destructed by the user code, since they
// will be destructed during cifFile object destruction