Issue #1261: ProfilePlot should fail more gracefully when used with particle fields (yt_analysis/yt)
New issue 1261: ProfilePlot should fail more gracefully when used with particle fields https://bitbucket.org/yt_analysis/yt/issues/1261/profileplot-should-fail-mor... Nathan Goldbaum: Right now ParticlePlot will fail when trying to plot particle fields: ``` import yt ds = yt.load('output_00080/info_00080.txt') yt.ProfilePlot(ds.all_data(), 'radius', 'particle_mass') ``` This produces a confusing error: ``` IndexError Traceback (most recent call last) /Users/goldbaum/Documents/yt-hg/yt/mods.pyc in <module>() ----> 1 yt.ProfilePlot(ds.all_data(), 'radius', 'particle_mass') /Users/goldbaum/Documents/yt-hg/yt/visualization/profile_plotter.pyc in __init__(self, data_source, x_field, y_fields, weight_field, n_bins, accumulation, fractional, label, plot_spec, x_log, y_log) 228 accumulation=accumulation, 229 fractional=fractional, --> 230 logs=logs)] 231 232 if plot_spec is None: /Users/goldbaum/Documents/yt-hg/yt/data_objects/profiles.pyc in create_profile(data_source, bin_fields, fields, n_bins, extrema, logs, units, weight_field, accumulation, fractional, deposition) 1017 setattr(obj, "fractional", fractional) 1018 if fields is not None: -> 1019 obj.add_fields([field for field in fields]) 1020 for field in fields: 1021 if fractional: /Users/goldbaum/Documents/yt-hg/yt/data_objects/profiles.pyc in add_fields(self, fields) 111 citer = self.data_source.chunks([], "io") 112 for chunk in parallel_objects(citer): --> 113 self._bin_chunk(chunk, fields, temp_storage) 114 self._finalize_storage(fields, temp_storage) 115 /Users/goldbaum/Documents/yt-hg/yt/data_objects/profiles.pyc in _bin_chunk(self, chunk, fields, storage) 427 428 def _bin_chunk(self, chunk, fields, storage): --> 429 rv = self._get_data(chunk, fields) 430 if rv is None: return 431 fdata, wdata, (bf_x,) = rv /Users/goldbaum/Documents/yt-hg/yt/data_objects/profiles.pyc in _get_data(self, chunk, fields) 239 for i, field in enumerate(fields): 240 units = chunk.ds.field_info[field].units --> 241 arr[:,i] = chunk[field][filter].in_units(units) 242 if self.weight_field is not None: 243 units = chunk.ds.field_info[self.weight_field].units /Users/goldbaum/Documents/yt-hg/yt/units/yt_array.pyc in __getitem__(self, item) 1159 1160 def __getitem__(self, item): -> 1161 ret = super(YTArray, self).__getitem__(item) 1162 if ret.shape == (): 1163 return YTQuantity(ret, self.units, bypass_validation=True) IndexError: index 94462 is out of bounds for axis 1 with size 94462 ``` In addition, even if I use particle fields for the bin and binned fields, I still get a similar error: ``` import yt ds = yt.load('output_00080/info_00080.txt') yt.ProfilePlot(ds.all_data(), 'particle_radius', 'particle_mass') ``` ``` IndexError Traceback (most recent call last) /Users/goldbaum/Documents/yt-hg/yt/mods.pyc in <module>() ----> 1 yt.ProfilePlot(ds.all_data(), 'particle_radius', 'particle_mass') /Users/goldbaum/Documents/yt-hg/yt/visualization/profile_plotter.pyc in __init__(self, data_source, x_field, y_fields, weight_field, n_bins, accumulation, fractional, label, plot_spec, x_log, y_log) 228 accumulation=accumulation, 229 fractional=fractional, --> 230 logs=logs)] 231 232 if plot_spec is None: /Users/goldbaum/Documents/yt-hg/yt/data_objects/profiles.pyc in create_profile(data_source, bin_fields, fields, n_bins, extrema, logs, units, weight_field, accumulation, fractional, deposition) 1017 setattr(obj, "fractional", fractional) 1018 if fields is not None: -> 1019 obj.add_fields([field for field in fields]) 1020 for field in fields: 1021 if fractional: /Users/goldbaum/Documents/yt-hg/yt/data_objects/profiles.pyc in add_fields(self, fields) 111 citer = self.data_source.chunks([], "io") 112 for chunk in parallel_objects(citer): --> 113 self._bin_chunk(chunk, fields, temp_storage) 114 self._finalize_storage(fields, temp_storage) 115 /Users/goldbaum/Documents/yt-hg/yt/data_objects/profiles.pyc in _bin_chunk(self, chunk, fields, storage) 427 428 def _bin_chunk(self, chunk, fields, storage): --> 429 rv = self._get_data(chunk, fields) 430 if rv is None: return 431 fdata, wdata, (bf_x,) = rv /Users/goldbaum/Documents/yt-hg/yt/data_objects/profiles.pyc in _get_data(self, chunk, fields) 245 else: 246 weight_data = np.ones(filter.size, dtype="float64") --> 247 weight_data = weight_data[filter] 248 # So that we can pass these into 249 return arr, weight_data, bin_fields /Users/goldbaum/Documents/yt-hg/yt/units/yt_array.pyc in __getitem__(self, item) 1159 1160 def __getitem__(self, item): -> 1161 ret = super(YTArray, self).__getitem__(item) 1162 if ret.shape == (): 1163 return YTQuantity(ret, self.units, bypass_validation=True) IndexError: index 191131 is out of bounds for axis 1 with size 191131 ``` I think the best route here is to fail with a nicer error message, suggesting to use ParticlePlot.
participants (1)
-
Nathan Goldbaum