diff --git a/src/damaris/data/ADC_Result.py b/src/damaris/data/ADC_Result.py index 97bbd50..a709729 100644 --- a/src/damaris/data/ADC_Result.py +++ b/src/damaris/data/ADC_Result.py @@ -98,6 +98,7 @@ class ADC_Result(Resultable, Drawable, DamarisFFT, Signalpath): self.y.append(numpy.zeros((samples,), dtype="int16")) self.x = numpy.zeros((samples,), dtype="float32") + self.nChannels = channels self.index.append((0, samples-1)) self.cont_data = True @@ -231,6 +232,8 @@ class ADC_Result(Resultable, Drawable, DamarisFFT, Signalpath): job_id=self.job_id, job_date=self.job_date, ) + r.nChannels = self.nChannels + r.is_clipped = self.is_clipped finally: self.lock.release() @@ -274,6 +277,8 @@ class ADC_Result(Resultable, Drawable, DamarisFFT, Signalpath): tmp_y.append(self.y[i][start:end+1].copy()) r = ADC_Result(x = tmp_x, y = tmp_y, index = [(0,len(tmp_y[0])-1)], sampl_freq = self.sampling_rate, desc = self.description.copy() if self.description is not None else None, job_id = self.job_id, job_date = self.job_date) + r.nChannels = self.nChannels + r.is_clipped = self.is_clipped self.lock.release() return r diff --git a/src/damaris/data/Accumulation.py b/src/damaris/data/Accumulation.py index 15a7787..f9ee5f0 100644 --- a/src/damaris/data/Accumulation.py +++ b/src/damaris/data/Accumulation.py @@ -111,21 +111,22 @@ class Accumulation(Errorable, Drawable, DamarisFFT, Signalpath): self.lock.release() raise - tmp_x = self.x[start:end+1] + tmp_x = self.x[start:end+1].copy() tmp_y = [] for i in range(self.get_number_of_channels()): - tmp_y.append(self.y[i][start:end+1]) + tmp_y.append(self.y[i][start:end+1].copy()) - r = Accumulation(x = tmp_x, y = tmp_y, n = self.n, index = [(0,len(tmp_y[0])-1)], sampl_freq = self.sampling_rate, error = self.use_error) + r = Accumulation(x = tmp_x, y = tmp_y, n = self.n, index = [(0,len(tmp_y[0])-1)], sampl_freq = self.sampling_rate, error = self.use_error) if self.uses_statistics(): r.y_square = [] for i in range(self.get_number_of_channels()): - r.y_square.append(self.y_square[i][start:end+1]) + r.y_square.append(self.y_square[i][start:end+1].copy()) if self.common_descriptions is not None: r.common_descriptions = self.common_descriptions.copy() r.time_period = self.time_period[:] r.job_ids = self.job_ids.copy() + r.is_clipped = self.is_clipped self.lock.release() return r diff --git a/src/damaris/gui/ResultReader.py b/src/damaris/gui/ResultReader.py index 4f2d884..3bed988 100644 --- a/src/damaris/gui/ResultReader.py +++ b/src/damaris/gui/ResultReader.py @@ -231,7 +231,6 @@ class ResultReader: for i in range(nChannels): # split interleaved data self.result.y[i][tmp_index:tmp_index+tmp_size] = tmp_part[i::nChannels] - self.result.y[i][tmp_index:tmp_index+tmp_size] = tmp_part[i::nChannels] if self.result.index != []: self.result.index.append((tmp_index, tmp_index+tmp_size-1)) diff --git a/tests/test_ADC_Result.py b/tests/test_ADC_Result.py index d6b54e3..ead41e3 100644 --- a/tests/test_ADC_Result.py +++ b/tests/test_ADC_Result.py @@ -64,6 +64,7 @@ class TestADCResult(unittest.TestCase): self.assertTrue(np.array_equal(adc.x, np.zeros(3, dtype="float32"))) self.assertTrue(np.array_equal(adc.y[0], np.zeros(3, dtype="int16"))) self.assertEqual(adc.index, [(0, 2)]) + self.assertEqual(adc.nChannels, 2) def test_add_sample_space(self): """Test adding sample space.""" @@ -90,6 +91,33 @@ class TestADCResult(unittest.TestCase): self.assertEqual(sub_result.description, {"key": "value"}) self.assertEqual(sub_result.job_id, 42) + def test_get_result_by_index_copies_nChannels_and_is_clipped(self): + """Test that get_result_by_index properly copies nChannels and is_clipped.""" + adc = self.create_adc_result() + adc.index = [(0, 1), (1, 2)] + adc.set_nChannels(2) + adc.is_clipped = True + + sub_result = adc.get_result_by_index(1) + + self.assertEqual(sub_result.nChannels, 2) + self.assertEqual(sub_result.is_clipped, True) + + def test_get_result_by_index_data_independence(self): + """Test that get_result_by_index returns independent data (not shared views).""" + adc = self.create_adc_result() + adc.index = [(0, 1), (1, 2)] + original_x = adc.x.copy() + original_data = adc.y[0].copy() + + sub_result = adc.get_result_by_index(1) + sub_result.y[0][0] = 9999 + sub_result.x[0] = 999.0 + + self.assertEqual(sub_result.y[0][0], 9999) + self.assertTrue(np.array_equal(adc.y[0], original_data)) + self.assertTrue(np.array_equal(adc.x, original_x)) + def test_set_sampling_rate(self): """Test updating the sampling rate.""" adc = ADC_Result() diff --git a/tests/test_Accumulation.py b/tests/test_Accumulation.py index 84d6927..e0b3330 100644 --- a/tests/test_Accumulation.py +++ b/tests/test_Accumulation.py @@ -107,6 +107,35 @@ class TestAccumulation(unittest.TestCase): self.assertEqual(sub_result.index, [(0, 1)]) self.assertEqual(sub_result.common_descriptions, {"key": "value"}) + def test_get_accu_by_index_copies_is_clipped(self): + """Test that get_accu_by_index properly copies is_clipped.""" + adc = self.create_adc_result() + adc.index = [(0, 1), (1, 2)] + accu = Accumulation() + accu += adc + accu.is_clipped = True + + sub_result = accu.get_accu_by_index(1) + + self.assertEqual(sub_result.is_clipped, True) + + def test_get_accu_by_index_data_independence(self): + """Test that get_accu_by_index returns independent data (not shared views).""" + adc = self.create_adc_result() + adc.index = [(0, 1), (1, 2)] + accu = Accumulation() + accu += adc + original_y0 = accu.y[0].copy() + + sub_result = accu.get_accu_by_index(1) + sub_result.y[0][0] = 9999 + sub_result.x[0] = 999.0 + + self.assertEqual(sub_result.y[0][0], 9999) + self.assertTrue(np.array_equal(accu.y[0], original_y0)) + # x array should also be independent + self.assertEqual(accu.x[1], 1.0) + def test_write_to_csv_without_error(self): """Test the functionality of writing to CSV.""" from io import StringIO