diff --git a/lisainstrument/containers.py b/lisainstrument/containers.py index 2c794d550ce24fcb811c808149a6d4cfa1c6e1f7..7d1e29da3a5d0cf22205f8a1776c1395537783c0 100644 --- a/lisainstrument/containers.py +++ b/lisainstrument/containers.py @@ -209,14 +209,14 @@ class ForEachSC(ForEachObject): return ['1', '2', '3'] @staticmethod - def distant_left(sc): + def distant_left_sc(sc): """Return index of distant rleftspacecraft.""" if sc not in ForEachSC.indices(): raise ValueError(f"invalid spacecraft index '{sc}'") return f'{int(sc) % 3 + 1}' @staticmethod - def distant_right(sc): + def distant_right_sc(sc): """Return index of distant right spacecraft.""" if sc not in ForEachSC.indices(): raise ValueError(f"invalid spacecraft index '{sc}'") @@ -227,14 +227,18 @@ class ForEachSC(ForEachObject): """Return index of left MOSA.""" if sc not in ForEachSC.indices(): raise ValueError(f"invalid spacecraft index '{sc}'") - return f'{sc}{ForEachSC.distant_left(sc)}' + return f'{sc}{ForEachSC.distant_left_sc(sc)}' @staticmethod def right_mosa(sc): """Return index of right MOSA.""" if sc not in ForEachSC.indices(): raise ValueError(f"invalid spacecraft index '{sc}'") - return f'{sc}{ForEachSC.distant_right(sc)}' + return f'{sc}{ForEachSC.distant_right_sc(sc)}' + + def for_each_mosa(self): + """Return a ForEachMOSA instance by sharing the spacecraft values on both MOSAs.""" + return ForEachMOSA(lambda mosa: self[ForEachMOSA.sc(mosa)]) class ForEachMOSA(ForEachObject): @@ -244,20 +248,13 @@ class ForEachMOSA(ForEachObject): def indices(cls): return ['12', '23', '31', '13', '32', '21'] - def __init__(self, values): - """Initialize from a `ForEachSC` instance or rely on super's implementation.""" - if isinstance(values, ForEachSC): - super().__init__(lambda mosa: values[ForEachMOSA.sc(mosa)]) - else: - super().__init__(values) - @staticmethod def sc(mosa): """Return index of spacecraft hosting MOSA.""" return f'{mosa[0]}' @staticmethod - def distant(mosa): + def distant_mosa(mosa): """Return index of distant MOSA. In practive, we invert the indices to swap emitter and receiver. @@ -267,7 +264,7 @@ class ForEachMOSA(ForEachObject): return f'{mosa[1]}{mosa[0]}' @staticmethod - def adjacent(mosa): + def adjacent_mosa(mosa): """Return index of adjacent MOSA. In practice, we replace the second index by the only unused spacecraft index. @@ -278,3 +275,11 @@ class ForEachMOSA(ForEachObject): if len(unused) != 1: raise RuntimeError(f"cannot find adjacent MOSA for '{mosa}'") return f'{mosa[0]}{unused[0]}' + + def distant(self): + """Return a ForEachMOSA instance for distant MOSAs.""" + return ForEachMOSA(lambda mosa: self[ForEachMOSA.distant_mosa(mosa)]) + + def adjacent(self): + """Return a ForEachMOSA instance for adjacent MOSAs.""" + return ForEachMOSA(lambda mosa: self[ForEachMOSA.adjacent_mosa(mosa)]) diff --git a/tests/test_containers.py b/tests/test_containers.py index e9878ce8aaf12668b11af165757c746c6217150c..42ea21b28df316ad5bb2de33b709eb90180a6a23 100644 --- a/tests/test_containers.py +++ b/tests/test_containers.py @@ -307,13 +307,13 @@ def test_sc_indices(): assert ForEachSC.indices() == ['1', '2', '3'] - assert ForEachSC.distant_left('1') == '2' - assert ForEachSC.distant_left('2') == '3' - assert ForEachSC.distant_left('3') == '1' + assert ForEachSC.distant_left_sc('1') == '2' + assert ForEachSC.distant_left_sc('2') == '3' + assert ForEachSC.distant_left_sc('3') == '1' - assert ForEachSC.distant_right('1') == '3' - assert ForEachSC.distant_right('2') == '1' - assert ForEachSC.distant_right('3') == '2' + assert ForEachSC.distant_right_sc('1') == '3' + assert ForEachSC.distant_right_sc('2') == '1' + assert ForEachSC.distant_right_sc('3') == '2' assert ForEachSC.left_mosa('1') == '12' assert ForEachSC.left_mosa('2') == '23' @@ -336,32 +336,73 @@ def test_mosa_indices(): assert ForEachMOSA.sc('32') == '3' assert ForEachMOSA.sc('21') == '2' - assert ForEachMOSA.distant('12') == '21' - assert ForEachMOSA.distant('23') == '32' - assert ForEachMOSA.distant('31') == '13' - assert ForEachMOSA.distant('13') == '31' - assert ForEachMOSA.distant('32') == '23' - assert ForEachMOSA.distant('21') == '12' + assert ForEachMOSA.distant_mosa('12') == '21' + assert ForEachMOSA.distant_mosa('23') == '32' + assert ForEachMOSA.distant_mosa('31') == '13' + assert ForEachMOSA.distant_mosa('13') == '31' + assert ForEachMOSA.distant_mosa('32') == '23' + assert ForEachMOSA.distant_mosa('21') == '12' - assert ForEachMOSA.adjacent('12') == '13' - assert ForEachMOSA.adjacent('23') == '21' - assert ForEachMOSA.adjacent('31') == '32' - assert ForEachMOSA.adjacent('13') == '12' - assert ForEachMOSA.adjacent('32') == '31' - assert ForEachMOSA.adjacent('21') == '23' + assert ForEachMOSA.adjacent_mosa('12') == '13' + assert ForEachMOSA.adjacent_mosa('23') == '21' + assert ForEachMOSA.adjacent_mosa('31') == '32' + assert ForEachMOSA.adjacent_mosa('13') == '12' + assert ForEachMOSA.adjacent_mosa('32') == '31' + assert ForEachMOSA.adjacent_mosa('21') == '23' -def test_init_mosa_with_sc(): - """Test one can initialize ForEachMOSA from ForEachSC.""" + +def test_foreachsc_to_foreachmosa(): + """Test that one can turn a ForEachSC instance to a ForEachMOSA instance.""" my_sc = ForEachSC(lambda sc: 10 * int(sc)) assert my_sc['1'] == 10 assert my_sc['2'] == 20 assert my_sc['3'] == 30 - my_mosa = ForEachMOSA(my_sc) + my_mosa = my_sc.for_each_mosa() assert my_mosa['12'] == 10 assert my_mosa['13'] == 10 assert my_mosa['21'] == 20 assert my_mosa['23'] == 20 assert my_mosa['31'] == 30 assert my_mosa['32'] == 30 + + +def test_foreachmosa_distant(): + """Test that one can generate a ForEachMOSA instant for distant MOSAs.""" + + my_mosa = ForEachMOSA(int) + assert my_mosa['12'] == 12 + assert my_mosa['13'] == 13 + assert my_mosa['21'] == 21 + assert my_mosa['23'] == 23 + assert my_mosa['31'] == 31 + assert my_mosa['32'] == 32 + + distant_mosa = my_mosa.distant() + assert distant_mosa['12'] == 21 + assert distant_mosa['13'] == 31 + assert distant_mosa['21'] == 12 + assert distant_mosa['23'] == 32 + assert distant_mosa['31'] == 13 + assert distant_mosa['32'] == 23 + + +def test_foreachmosa_adjacent(): + """Test that one can generate a ForEachMOSA instant for adjacent MOSAs.""" + + my_mosa = ForEachMOSA(int) + assert my_mosa['12'] == 12 + assert my_mosa['13'] == 13 + assert my_mosa['21'] == 21 + assert my_mosa['23'] == 23 + assert my_mosa['31'] == 31 + assert my_mosa['32'] == 32 + + adjacent_mosa = my_mosa.adjacent() + assert adjacent_mosa['12'] == 13 + assert adjacent_mosa['13'] == 12 + assert adjacent_mosa['21'] == 23 + assert adjacent_mosa['23'] == 21 + assert adjacent_mosa['31'] == 32 + assert adjacent_mosa['32'] == 31