def _read_options(self, group): source = BytesIO(group.attrs['options']) element = etree.parse(source).getroot() reader = OptionsReader() reader.parse(element) return reader.get()
class TestOptionsReader(unittest.TestCase): def setUp(self): unittest.TestCase.setUp(self) self.reader = OptionsReader() etree.register_namespace('mc', 'http://pymontecarlo.sf.net') source = BytesIO(b'<mc:options xmlns:mc="http://pymontecarlo.sf.net" name="Test" uuid="51d62e0261f2449eb41a74e4cb4501e0" version="6"><programs><program>dummy</program></programs><beam><mc:pencilBeam aperture="0.0" energy="1234.0" particle="electron"><origin x="0.0" y="0.0" z="1.0" /><direction u="0.0" v="0.0" w="-1.0" /></mc:pencilBeam></beam><geometry><mc:substrate rotation="0.0" tilt="0.0"><materials><mc:material _index="1" density="19300.0" name="Gold"><composition><element weightFraction="1.0" z="79" /></composition></mc:material></materials><body material="1" /></mc:substrate></geometry><detectors><mc:backscatteredElectronEnergyDetector _key="bse"><channels>1000</channels><limits lower="0.0" upper="1234.0" /></mc:backscatteredElectronEnergyDetector></detectors><limits><mc:showersLimit showers="5678" /></limits><models><mc:model name="Rutherford" type="elastic cross section" /></models></mc:options>') self.element = etree.parse(source).getroot() def tearDown(self): unittest.TestCase.tearDown(self) def testcan_parse(self): self.assertTrue(self.reader.can_parse(self.element)) def testparse(self): self.reader.parse(self.element) obj = self.reader.get() self.assertEqual("Test", obj.name) self.assertEqual('51d62e0261f2449eb41a74e4cb4501e0', obj.uuid) self.assertEqual(1, len(obj.programs)) self.assertEqual('dummy', list(obj.programs.aliases())[0]) self.assertAlmostEqual(1234, obj.beam.energy_eV, 4) self.assertEqual(1, len(obj.detectors)) det = obj.detectors['bse'] self.assertAlmostEqual(0, det.limits_eV[0], 4) self.assertAlmostEqual(1234, det.limits_eV[1], 4) self.assertEqual(1000, det.channels) self.assertEqual(1, len(obj.limits)) limits = list(obj.limits.iterclass(ShowersLimit)) self.assertEqual(1, len(limits)) self.assertEqual(5678, limits[0].showers) self.assertEqual(1, len(obj.models)) models = list(obj.models.iterclass(ELASTIC_CROSS_SECTION)) self.assertEqual(1, len(models)) self.assertEqual(ELASTIC_CROSS_SECTION.rutherford, models[0])
def append(results, filepath): with FileLock(filepath), h5py.File(filepath, 'r+') as hdf5file: # Check UUID of base options source = BytesIO(hdf5file.attrs['options']) reader = OptionsReader() reader.read(source) options = reader.get() if options.uuid != results.options.uuid: raise ValueError('UUID of base options do not match: %s != %s' % \ (options.uuid, results.options.uuid)) # Save results identifiers = np.array(hdf5file.attrs['identifiers'], 'U').tolist() for container in results: identifier = container.options.uuid identifiers.append(identifier) group = hdf5file.create_group('result-' + identifier) # Save each result for key, result in container.items(): subgroup = group.create_group(key) handler = find_convert_handler('pymontecarlo.fileformat.results.result', result, subgroup) handler.convert(result, subgroup) # Save options writer = OptionsWriter() writer.convert(container.options) element = writer.get() group.attrs['options'] = etree.tostring(element) # Update identifiers del hdf5file.attrs['identifiers'] hdf5file.attrs.create('identifiers', identifiers, dtype=h5py.special_dtype(vlen=str))
def fromelement(cls, element): from pymontecarlo.fileformat.options.options import OptionsReader reader = OptionsReader() reader.parse(element) return reader.get()
def read(cls, source): from pymontecarlo.fileformat.options.options import OptionsReader reader = OptionsReader() reader.read(source) return reader.get()