|  |   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. Therefore, the second
    // argument ("virtual"), which would normally indicate the name of the
    // serialized binary file, is not used at all.
    CifFile cifFile(VIRTUAL_MODE, "virtual");
    // 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. Therefore, the second
    // argument ("virtual"), which would normally indicate the name of the
    // serialized binary file, is not used at all.
    CifFile cifFile(VIRTUAL_MODE, "virtual");
    // 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