Field3D
|
Provides writing of .f3d (internally, hdf5) files. More...
#include <Field3DFile.h>
Public Types | |
enum | CreateMode { OverwriteMode, FailOnExisting } |
Public Member Functions | |
bool | create (const std::string &filename, CreateMode cm=OverwriteMode) |
Creates a .f3d file on disk. | |
template<class Data_T > | |
File::Partition::Ptr | createNewPartition (const std::string &partitionName, const std::string &layerName, typename Field< Data_T >::Ptr field) |
create newPartition given the input config | |
std::string | incrementPartitionName (std::string &pname) |
increment the partition or make it zero if there's not an integer suffix | |
bool | writeGlobalMetadata () |
This routine is call if you want to write out global metadata to disk. | |
bool | writeGroupMembership () |
This routine is called just before closing to write out any group membership to disk. | |
Constructors & destructor | |
Field3DOutputFile () | |
virtual | ~Field3DOutputFile () |
Writing layer to disk | |
template<class Data_T > | |
bool | writeScalarLayer (const std::string &layerName, typename Field< Data_T >::Ptr layer) |
Writes a scalar layer to the "Default" partition. | |
template<class Data_T > | |
bool | writeVectorLayer (const std::string &layerName, typename Field< FIELD3D_VEC3_T< Data_T > >::Ptr layer) |
Writes a vector layer to the "Default" partition. | |
template<class Data_T > | |
bool | writeScalarLayer (const std::string &partitionName, const std::string &layerName, typename Field< Data_T >::Ptr layer) |
Writes a layer to a specific partition. The partition will be created if not specified. | |
template<class Data_T > | |
bool | writeScalarLayer (typename Field< Data_T >::Ptr layer) |
Writes a layer to a specific partition. The field name and attribute name are used for partition and layer, respectively. | |
template<class Data_T > | |
bool | writeVectorLayer (const std::string &partitionName, const std::string &layerName, typename Field< FIELD3D_VEC3_T< Data_T > >::Ptr layer) |
Writes a layer to a specific partition. The partition will be created if not specified. | |
template<class Data_T > | |
bool | writeVectorLayer (typename Field< FIELD3D_VEC3_T< Data_T > >::Ptr layer) |
Writes a layer to a specific partition. The field name and attribute name are used for partition and layer, respectively. | |
Private Member Functions | |
template<class Data_T > | |
bool | writeLayer (const std::string &partitionName, const std::string &layerName, bool isVectorLayer, typename Field< Data_T >::Ptr layer) |
Performs the actual writing of the layer to disk. | |
bool | writeMapping (hid_t partitionLocation, FieldMapping::Ptr mapping) |
Writes the mapping to the given hdf5 node. Mappings are assumed to be light-weight enough to be stored as plain attributes under a group. | |
bool | writeMetadata (hid_t metadataGroup, FieldBase::Ptr layer) |
Writes metadata for this layer. | |
bool | writeMetadata (hid_t metadataGroup) |
Writes metadata for this file. |
Provides writing of .f3d (internally, hdf5) files.
Refer to using_files for examples of how to use this in your code.
Definition at line 626 of file Field3DFile.h.
Definition at line 632 of file Field3DFile.h.
{ OverwriteMode, FailOnExisting };
Field3DOutputFile::Field3DOutputFile | ( | ) |
Definition at line 1199 of file Field3DFile.cpp.
{
// Empty
}
Field3DOutputFile::~Field3DOutputFile | ( | ) | [virtual] |
Definition at line 1206 of file Field3DFile.cpp.
{ }
bool Field3DOutputFile::writeScalarLayer | ( | const std::string & | layerName, |
typename Field< Data_T >::Ptr | layer | ||
) | [inline] |
Writes a scalar layer to the "Default" partition.
Definition at line 654 of file Field3DFile.h.
{ return writeScalarLayer<Data_T>(layerName, std::string("default"), layer); }
bool Field3DOutputFile::writeVectorLayer | ( | const std::string & | layerName, |
typename Field< FIELD3D_VEC3_T< Data_T > >::Ptr | layer | ||
) | [inline] |
Writes a vector layer to the "Default" partition.
Definition at line 660 of file Field3DFile.h.
{ return writeVectorLayer<Data_T>(layerName, std::string("default"), layer); }
bool Field3DOutputFile::writeScalarLayer | ( | const std::string & | partitionName, |
const std::string & | layerName, | ||
typename Field< Data_T >::Ptr | layer | ||
) |
Writes a layer to a specific partition. The partition will be created if not specified.
Definition at line 1511 of file Field3DFile.h.
{ return writeLayer<Data_T>(partitionName, layerName, false, field); }
bool Field3DOutputFile::writeScalarLayer | ( | typename Field< Data_T >::Ptr | layer | ) |
Writes a layer to a specific partition. The field name and attribute name are used for partition and layer, respectively.
Definition at line 1522 of file Field3DFile.h.
References FieldBase::attribute, FieldBase::name, Msg::print(), and Msg::SevWarning.
{ if (layer->name.size() == 0) { Msg::print(Msg::SevWarning, "Field3DOutputFile::writeScalarLayer: " "Tried to write a scalar layer with no name"); return false; } if (layer->attribute.size() == 0) { Msg::print(Msg::SevWarning, "Field3DOutputFile::writeScalarLayer: " "Tried to write a scalar layer with no attribute name"); return false; } return writeScalarLayer<Data_T>(layer->name, layer->attribute, layer); }
bool Field3DOutputFile::writeVectorLayer | ( | const std::string & | partitionName, |
const std::string & | layerName, | ||
typename Field< FIELD3D_VEC3_T< Data_T > >::Ptr | layer | ||
) |
Writes a layer to a specific partition. The partition will be created if not specified.
Definition at line 1542 of file Field3DFile.h.
{ return writeLayer<FIELD3D_VEC3_T<Data_T> >(partitionName, layerName, true, field); }
bool Field3DOutputFile::writeVectorLayer | ( | typename Field< FIELD3D_VEC3_T< Data_T > >::Ptr | layer | ) |
Writes a layer to a specific partition. The field name and attribute name are used for partition and layer, respectively.
Definition at line 1555 of file Field3DFile.h.
References Msg::print(), and Msg::SevWarning.
{ if (layer->name.size() == 0) { Msg::print(Msg::SevWarning, "Field3DOutputFile::writeVectorLayer: " "Tried to write a vector layer with no name"); return false; } if (layer->attribute.size() == 0) { Msg::print(Msg::SevWarning, "Field3DOutputFile::writeVectorLayer: " "Tried to write a vector layer with no attribute name"); return false; } return writeVectorLayer<Data_T>(layer->name, layer->attribute, layer); }
bool Field3DOutputFile::create | ( | const std::string & | filename, |
CreateMode | cm = OverwriteMode |
||
) |
Creates a .f3d file on disk.
bool Field3DOutputFile::writeGlobalMetadata | ( | ) |
This routine is call if you want to write out global metadata to disk.
Definition at line 1455 of file Field3DFile.cpp.
References Hdf5Util::H5Base::id(), Field3DFileBase::m_file, Msg::print(), and Msg::SevWarning.
{ // Add metadata group and write it out H5ScopedGcreate metadataGroup(m_file, "field3d_global_metadata"); if (metadataGroup.id() < 0) { Msg::print(Msg::SevWarning, "Error creating group: file metadata"); return false; } if (!writeMetadata(metadataGroup.id())) { Msg::print(Msg::SevWarning, "Error writing file metadata."); return false; } return true; }
bool Field3DOutputFile::writeGroupMembership | ( | ) |
This routine is called just before closing to write out any group membership to disk.
Definition at line 1475 of file Field3DFile.cpp.
References Field3DFileBase::m_file, Field3DFileBase::m_groupMembership, Msg::print(), Msg::SevWarning, and Hdf5Util::writeAttribute().
{ using namespace std; using namespace Hdf5Util; if (!m_groupMembership.size()) return true; H5ScopedGcreate group(m_file, "field3d_group_membership"); if (group < 0) { Msg::print(Msg::SevWarning, "Error creating field3d_group_membership group."); return false; } if (!writeAttribute(group, "is_field3d_group_membership", "1")) { Msg::print(Msg::SevWarning, "Failed to write field3d_group_membership attribute."); return false; } std::map<std::string, std::string>::const_iterator iter = m_groupMembership.begin(); std::map<std::string, std::string>::const_iterator iEnd = m_groupMembership.end(); for (; iter != iEnd; ++iter) { if (!writeAttribute(group, iter->first, iter->second)) { Msg::print(Msg::SevWarning, "Failed to write groupMembership string: "+ iter->first); return false; } } return true; }
std::string Field3DOutputFile::incrementPartitionName | ( | std::string & | pname | ) |
increment the partition or make it zero if there's not an integer suffix
Definition at line 1515 of file Field3DFile.cpp.
References Field3DFileBase::m_partitionCount, Field3DFileBase::makeIntPartitionName(), and Field3DFileBase::removeUniqueId().
{ std::string myPartitionName = removeUniqueId(partitionName); int nextIdx = -1; if (m_partitionCount.find(myPartitionName) != m_partitionCount.end()) { nextIdx = ++m_partitionCount[myPartitionName]; } else { nextIdx = 0; m_partitionCount[myPartitionName] = 0; } return makeIntPartitionName(myPartitionName, nextIdx); }
File::Partition::Ptr Field3DOutputFile::createNewPartition | ( | const std::string & | partitionName, |
const std::string & | layerName, | ||
typename Field< Data_T >::Ptr | field | ||
) |
create newPartition given the input config
Definition at line 1317 of file Field3DFile.h.
References Field3DFileBase::m_file, Field3DFileBase::m_partitions, FieldRes::mapping(), Field3DFileBase::partition(), Msg::print(), Msg::SevWarning, and Hdf5Util::writeAttribute().
{ using namespace Hdf5Util; using namespace Exc; File::Partition::Ptr newPart(new File::Partition); newPart->name = partitionName; H5ScopedGcreate partGroup(m_file, newPart->name.c_str()); if (partGroup.id() < 0) { Msg::print(Msg::SevWarning, "Error creating partition: " + newPart->name); return File::Partition::Ptr(); } m_partitions.push_back(newPart); // Pick up new pointer File::Partition::Ptr part = partition(partitionName); // Add mapping group to the partition try { if (!writeMapping(partGroup.id(), field->mapping())) { Msg::print(Msg::SevWarning, "writeMapping returned false for an unknown reason "); return File::Partition::Ptr(); } } catch (WriteMappingException &e) { Msg::print(Msg::SevWarning, "Couldn't write mapping for partition: " + partitionName); return File::Partition::Ptr(); } catch (...) { Msg::print(Msg::SevWarning, "Unknown error when writing mapping for partition: " + partitionName); return File::Partition::Ptr(); } // Set the mapping of the partition. Since all layers share their // partition's mapping, we can just pick this first one. All subsequent // additions to the same partition are checked to have the same mapping part->mapping = field->mapping(); // Tag node as partition // Create a version attribute on the root node if (!writeAttribute(partGroup.id(), "is_field3d_partition", "1")) { Msg::print(Msg::SevWarning, "Adding partition string."); return File::Partition::Ptr(); } return part; }
bool Field3DOutputFile::writeMapping | ( | hid_t | partitionLocation, |
FieldMapping::Ptr | mapping | ||
) | [private] |
Writes the mapping to the given hdf5 node. Mappings are assumed to be light-weight enough to be stored as plain attributes under a group.
Definition at line 1271 of file Field3DFile.cpp.
References Hdf5Util::H5Base::id(), Msg::print(), Msg::SevWarning, and writeFieldMapping().
{ try { // Make a group under the partition to store the mapping data H5ScopedGcreate mappingGroup(partitionGroup, k_mappingStr); if (mappingGroup.id() < 0) throw CreateGroupException(k_mappingStr); // Let FieldMappingIO handle the rest if (!writeFieldMapping(mappingGroup.id(), mapping)) throw WriteMappingException(k_mappingStr); } catch (CreateGroupException &e) { Msg::print(Msg::SevWarning, "Couldn't create group: " + string(e.what()) ); throw WriteMappingException(k_mappingStr); } return true; }
bool Field3DOutputFile::writeLayer | ( | const std::string & | partitionName, |
const std::string & | layerName, | ||
bool | isVectorLayer, | ||
typename Field< Data_T >::Ptr | layer | ||
) | [private] |
Performs the actual writing of the layer to disk.
Definition at line 1381 of file Field3DFile.h.
References Field3DFileBase::intPartitionName(), Field3DFileBase::m_file, FieldRes::mapping(), File::Layer::name, Field3DFileBase::partition(), Msg::print(), Msg::SevWarning, Hdf5Util::writeAttribute(), and writeField().
{ using namespace std; using namespace Exc; using namespace Hdf5Util; if (!field) { Msg::print(Msg::SevWarning, "Called writeLayer with null pointer. Ignoring..."); return false; } if (m_file < 0) { Msg::print(Msg::SevWarning, "Attempting to write layer without opening file first. "); return false; } string partitionName = intPartitionName(userPartitionName, layerName, field); // See if the partition already exists or if we need to make it --- File::Partition::Ptr part = partition(partitionName); if (!part) { part = createNewPartition<Data_T>(partitionName,layerName,field); if (!part) return false; } else { if (!field->mapping()) { Msg::print(Msg::SevWarning, "Couldn't add layer \"" + layerName + "\" to partition \"" + partitionName + "\" because the layer's mapping is null."); return false; } // If the partition already existed, we need to make sure that the layer // doesn't also exist if (!isVectorLayer) { if (part->scalarLayer(layerName)) { //need to create a new partition and then add the layer to that std::string newPartitionName = incrementPartitionName(partitionName); part = createNewPartition<Data_T>(newPartitionName,layerName,field); if (!part) return false; } } else { if (part->vectorLayer(layerName)) { //need to create a new partition and then add the layer to that std::string newPartitionName = incrementPartitionName(partitionName); part = createNewPartition<Data_T>(newPartitionName,layerName,field); if (!part) return false; } } } if (!part->mapping) { Msg::print(Msg::SevWarning, "Severe error - partition mapping is null: " + partitionName); return false; } // Check that the mapping matches what's already in the Partition if (!field->mapping()->isIdentical(part->mapping)) { Msg::print(Msg::SevWarning, "Couldn't add layer \"" + layerName + "\" to partition \"" + partitionName + "\" because mapping doesn't match"); return false; } // Open the partition H5ScopedGopen partGroup(m_file, part->name.c_str(), H5P_DEFAULT); // Build a Layer object --- File::Layer layer; layer.name = layerName; layer.parent = partitionName; // Add Layer to file --- H5ScopedGcreate layerGroup(partGroup.id(), layerName.c_str(), H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); if (layerGroup.id() < 0) { Msg::print(Msg::SevWarning, "Error creating layer: " + layerName); return false; } // Tag as layer if (!writeAttribute(layerGroup.id(), "class_type", "field3d_layer")) { Msg::print(Msg::SevWarning, "Error adding layer string."); return false; } // Add metadata group and write it out H5ScopedGcreate metadataGroup(layerGroup.id(), "metadata"); if (metadataGroup.id() < 0) { Msg::print(Msg::SevWarning, "Error creating group: metadata"); return false; } if (!writeMetadata(metadataGroup.id(), field)) { Msg::print(Msg::SevWarning, "Error writing metadata."); return false; } if (!writeField(layerGroup.id(), field)) { Msg::print(Msg::SevWarning, "Error writing layer: " + layer.name); return false; } // Add layer to partition --- if (isVectorLayer) part->addVectorLayer(layer); else part->addScalarLayer(layer); return true; }
bool Field3DOutputFile::writeMetadata | ( | hid_t | metadataGroup, |
FieldBase::Ptr | layer | ||
) | [private] |
Writes metadata for this layer.
Definition at line 1292 of file Field3DFile.cpp.
References FieldMetadata< CallBack_T >::floatMetadata(), FieldMetadata< CallBack_T >::intMetadata(), Msg::print(), Msg::SevWarning, FieldMetadata< CallBack_T >::strMetadata(), FieldMetadata< CallBack_T >::vecFloatMetadata(), FieldMetadata< CallBack_T >::vecIntMetadata(), and Hdf5Util::writeAttribute().
{ using namespace Hdf5Util; { FieldMetadata<FieldBase>::StrMetadata::const_iterator i = field->metadata().strMetadata().begin(); FieldMetadata<FieldBase>::StrMetadata::const_iterator end = field->metadata().strMetadata().end(); for (; i != end; ++i) { if (!writeAttribute(metadataGroup, i->first, i->second)) { Msg::print(Msg::SevWarning, "Writing attribute " + i->first ); return false; } } } { FieldMetadata<FieldBase>::IntMetadata::const_iterator i = field->metadata().intMetadata().begin(); FieldMetadata<FieldBase>::IntMetadata::const_iterator end = field->metadata().intMetadata().end(); for (; i != end; ++i) { if (!writeAttribute(metadataGroup, i->first, 1, i->second)) { Msg::print(Msg::SevWarning, "Writing attribute " + i->first); return false; } } } { FieldMetadata<FieldBase>::FloatMetadata::const_iterator i = field->metadata().floatMetadata().begin(); FieldMetadata<FieldBase>::FloatMetadata::const_iterator end = field->metadata().floatMetadata().end(); for (; i != end; ++i) { if (!writeAttribute(metadataGroup, i->first, 1, i->second)) { Msg::print(Msg::SevWarning, "Writing attribute " + i->first); return false; } } } { FieldMetadata<FieldBase>::VecIntMetadata::const_iterator i = field->metadata().vecIntMetadata().begin(); FieldMetadata<FieldBase>::VecIntMetadata::const_iterator end = field->metadata().vecIntMetadata().end(); for (; i != end; ++i) { if (!writeAttribute(metadataGroup, i->first, 3, i->second.x)) { Msg::print(Msg::SevWarning, "Writing attribute " + i->first); return false; } } } { FieldMetadata<FieldBase>::VecFloatMetadata::const_iterator i = field->metadata().vecFloatMetadata().begin(); FieldMetadata<FieldBase>::VecFloatMetadata::const_iterator end = field->metadata().vecFloatMetadata().end(); for (; i != end; ++i) { if (!writeAttribute(metadataGroup, i->first, 3, i->second.x)) { Msg::print(Msg::SevWarning, "Writing attribute " + i->first); return false; } } } return true; }
bool Field3DOutputFile::writeMetadata | ( | hid_t | metadataGroup | ) | [private] |
Writes metadata for this file.
Definition at line 1373 of file Field3DFile.cpp.
References FieldMetadata< CallBack_T >::floatMetadata(), FieldMetadata< CallBack_T >::intMetadata(), Field3DFileBase::metadata(), Msg::print(), Msg::SevWarning, FieldMetadata< CallBack_T >::strMetadata(), FieldMetadata< CallBack_T >::vecFloatMetadata(), FieldMetadata< CallBack_T >::vecIntMetadata(), and Hdf5Util::writeAttribute().
{ using namespace Hdf5Util; { FieldMetadata<Field3DFileBase>::StrMetadata::const_iterator i = metadata().strMetadata().begin(); FieldMetadata<Field3DFileBase>::StrMetadata::const_iterator end = metadata().strMetadata().end(); for (; i != end; ++i) { if (!writeAttribute(metadataGroup, i->first, i->second)) { Msg::print(Msg::SevWarning, "Writing attribute " + i->first ); return false; } } } { FieldMetadata<Field3DFileBase>::IntMetadata::const_iterator i = metadata().intMetadata().begin(); FieldMetadata<Field3DFileBase>::IntMetadata::const_iterator end = metadata().intMetadata().end(); for (; i != end; ++i) { if (!writeAttribute(metadataGroup, i->first, 1, i->second)) { Msg::print(Msg::SevWarning, "Writing attribute " + i->first); return false; } } } { FieldMetadata<Field3DFileBase>::FloatMetadata::const_iterator i = metadata().floatMetadata().begin(); FieldMetadata<Field3DFileBase>::FloatMetadata::const_iterator end = metadata().floatMetadata().end(); for (; i != end; ++i) { if (!writeAttribute(metadataGroup, i->first, 1, i->second)) { Msg::print(Msg::SevWarning, "Writing attribute " + i->first); return false; } } } { FieldMetadata<Field3DFileBase>::VecIntMetadata::const_iterator i = metadata().vecIntMetadata().begin(); FieldMetadata<Field3DFileBase>::VecIntMetadata::const_iterator end = metadata().vecIntMetadata().end(); for (; i != end; ++i) { if (!writeAttribute(metadataGroup, i->first, 3, i->second.x)) { Msg::print(Msg::SevWarning, "Writing attribute " + i->first); return false; } } } { FieldMetadata<Field3DFileBase>::VecFloatMetadata::const_iterator i = metadata().vecFloatMetadata().begin(); FieldMetadata<Field3DFileBase>::VecFloatMetadata::const_iterator end = metadata().vecFloatMetadata().end(); for (; i != end; ++i) { if (!writeAttribute(metadataGroup, i->first, 3, i->second.x)) { Msg::print(Msg::SevWarning, "Writing attribute " + i->first); return false; } } } return true; }