diff --git a/openmc/filter.py b/openmc/filter.py index dbdaf2e19e..52ff8638ef 100644 --- a/openmc/filter.py +++ b/openmc/filter.py @@ -32,7 +32,8 @@ _CURRENT_NAMES = ( 'z-min out', 'z-min in', 'z-max out', 'z-max in' ) -_PARTICLE_IDS = {'neutron': 1, 'photon': 2, 'electron': 3, 'positron': 4} +_PARTICLES = {'neutron', 'photon', 'electron', 'positron'} + class FilterMeta(ABCMeta): def __new__(cls, name, bases, namespace, **kwargs): @@ -547,10 +548,9 @@ class ParticleFilter(Filter): Parameters ---------- - bins : str, int, or iterable of Integral - The Particles to tally. Either str with particle type or their - ID numbers can be used ('neutron' = 1, 'photon' = 2, 'electron' = 3, - 'positron' = 4). + bins : str, or iterable of str + The particles to tally represented as strings ('neutron', 'photon', + 'electron', 'positron'). filter_id : int Unique identifier for the filter @@ -571,16 +571,26 @@ class ParticleFilter(Filter): @bins.setter def bins(self, bins): bins = np.atleast_1d(bins) - cv.check_iterable_type('filter bins', bins, (Integral, str)) + cv.check_iterable_type('filter bins', bins, str) for edge in bins: - if isinstance(edge, Integral): - cv.check_value('filter bin', edge, _PARTICLE_IDS.values()) - else: - cv.check_value('filter bin', edge, _PARTICLE_IDS.keys()) - bins = np.atleast_1d([b if isinstance(b, Integral) else _PARTICLE_IDS[b] - for b in bins]) + cv.check_value('filter bin', edge, _PARTICLES) self._bins = bins + @classmethod + def from_hdf5(cls, group, **kwargs): + if group['type'][()].decode() != cls.short_name.lower(): + raise ValueError("Expected HDF5 data for filter type '" + + cls.short_name.lower() + "' but got '" + + group['type'][()].decode() + " instead") + + if 'meshes' not in kwargs: + raise ValueError(cls.__name__ + " requires a 'meshes' keyword " + "argument.") + + particles = [b.decode() for b in group['bins'][()]] + filter_id = int(group.name.split('/')[-1].lstrip('filter ')) + return cls(particles, filter_id=filter_id) + class MeshFilter(Filter): """Bins tally event locations onto a regular, rectangular mesh. diff --git a/src/tallies/filter_particle.cpp b/src/tallies/filter_particle.cpp index de142489ff..eb419fec9a 100644 --- a/src/tallies/filter_particle.cpp +++ b/src/tallies/filter_particle.cpp @@ -7,12 +7,20 @@ namespace openmc { void ParticleFilter::from_xml(pugi::xml_node node) { - auto particles = get_node_array(node, "bins"); + auto particles = get_node_array(node, "bins"); // Convert to vector of Particle::Type std::vector types; for (auto& p : particles) { - types.push_back(static_cast(p - 1)); + if (p == "neutron") { + types.push_back(Particle::Type::neutron); + } else if (p == "photon") { + types.push_back(Particle::Type::photon); + } else if (p == "electron") { + types.push_back(Particle::Type::electron); + } else if (p == "positron") { + types.push_back(Particle::Type::positron); + } } this->set_particles(types); } @@ -47,9 +55,22 @@ void ParticleFilter::to_statepoint(hid_t filter_group) const { Filter::to_statepoint(filter_group); - std::vector particles; + std::vector particles; for (auto p : particles_) { - particles.push_back(static_cast(p) + 1); + switch (p) { + case Particle::Type::neutron: + particles.push_back("neutron"); + break; + case Particle::Type::photon: + particles.push_back("photon"); + break; + case Particle::Type::electron: + particles.push_back("electron"); + break; + case Particle::Type::positron: + particles.push_back("positron"); + break; + } } write_dataset(filter_group, "bins", particles); } diff --git a/tests/regression_tests/photon_production/inputs_true.dat b/tests/regression_tests/photon_production/inputs_true.dat index f82b4a6a78..1821bea92f 100644 --- a/tests/regression_tests/photon_production/inputs_true.dat +++ b/tests/regression_tests/photon_production/inputs_true.dat @@ -41,7 +41,7 @@ 9 - 2 + photon 1 2 diff --git a/tests/regression_tests/photon_source/inputs_true.dat b/tests/regression_tests/photon_source/inputs_true.dat index 425738a479..89f4de0e0c 100644 --- a/tests/regression_tests/photon_source/inputs_true.dat +++ b/tests/regression_tests/photon_source/inputs_true.dat @@ -36,7 +36,7 @@ - 2 + photon 1