CIFPARSE-OBJ
Usage Example: V7-0-25
----------------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