예제 #1
0
//----------------------------------------------------------------------------
nexus::PathObject get_base(const hdf5::file::File &file,
                           const nexus::Path &path)
{
  nexus::PathObjectList objects;

  // check if the path references the root group
  if(path.size()==1 &&  !nexus::has_attribute_section(path))
  {
    return file.root();
  }

  try
  {
    nexus::Path file_root;
    file_root.filename(path.filename());
    file_root.push_back({"/","NXroot"});
    nexus::Path search_path = nexus::make_relative(file_root,path);
    search_path.attribute(path.attribute());

    objects = nexus::get_objects(file.root(),search_path);

  }
  catch(pni::core::key_error &error)
  {
    std::cerr<<error<<std::endl;
    std::cerr<<"The path entered does not exist!"<<std::endl;
    std::exit(1);
  }
  catch(std::runtime_error &error)
  {
    std::cerr<<error.what()<<std::endl;
    std::exit(1);
  }

  if(objects.size()!=1)
  {
    std::stringstream ss;

    if(objects.size()>1)
      ss<<"The path ["<<path<<"] is not unique - cannot identify base object!";
    else if(objects.size()==0)
      ss<<"Could not find base with ["<<path<<"]!";

    throw std::runtime_error(ss.str());
  }

  return objects.front();
}
예제 #2
0
//----------------------------------------------------------------------------
void read_data(const nexus::Path &path)
{
    typedef dynamic_array<float64> array_type;

    hdf5::file::File file = nexus::open_file(path.filename());
    nexus::DatasetList fields = nexus::get_objects(file.root(),path);
    
    auto data = array_type::create(hdf5::dataspace::Simple(fields[0].dataspace()).current_dimensions());
    
    fields[0].read(data);
}
예제 #3
0
//----------------------------------------------------------------------------
hdf5::file::File get_file(const nexus::Path &path)
{
  if(path.filename().empty())
  {
    std::cerr<<"Please provide a filename!"<<std::endl;
    std::exit(1);
  }

  hdf5::file::File file;
  try
  {
    file = hdf5::file::open(path.filename(),hdf5::file::AccessFlags::READONLY);
  }
  catch(...)
  {
    std::cerr<<"Error opening Nexus file!"<<std::endl;
    std::exit(1);
  }

  return file;
}