123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267 |
- from common import initialize_test_yml_list_measurement
- from view import VIEW
- import tifffile
- import pathlib as pl
- from nose.tools import raises
- class OverviewsGenerator(object):
- def __init__(self):
- self.test_yml, self.test_animal, self.test_measu = initialize_test_yml_list_measurement()
- self.view = VIEW()
- self.view.update_flags_from_ymlfile(self.test_yml)
- self.view.update_flags(get_default_overview_flags_hack())
- def generate(self, flags_to_update, suffix):
- self.view.update_flags(flags_to_update)
- self.view.load_measurement_data(self.test_animal, self.test_measu)
- self.view.calculate_signals()
- frame_data2write, data_limits = self.view.generate_overview_for_output_for_current_measurement()
- test_folder = pl.Path(self.view.flags["STG_OdorReportPath"]) / "test_single_overviews"
- if not test_folder.is_dir():
- test_folder.mkdir()
- op_file_name = test_folder / f"{self.view.flags['STG_ReportTag']}_{self.view.p1.metadata.ex_name}{suffix}.tif"
- tifffile.imsave(op_file_name, data=frame_data2write, photometric="rgb")
- def get_default_overview_flags_hack():
- return {"SO_Method": 0, "CTV_Method": 22, "CTV_firstframe": 25, "CTV_lastframe": 35}
- def generate_overviews(flags_to_update, suffix):
- og = OverviewsGenerator()
- og.generate(flags_to_update, suffix)
- def test_defaults():
- generate_overviews(flags_to_update={}, suffix="_defaults")
- def test_no_colorbar():
- generate_overviews(flags_to_update={"CTV_scalebar": 0}, suffix="_no_scalebar")
- def test_rotate_flags():
- """
- Testing generating overview with different rotate flags
- """
- flags = {"SO_individualScale": 3, "SO_indiScale3factor": 0.25}
- for rot in range(1, 8):
- flags["SO_rotateImage"] = rot
- generate_overviews(flags, f"SO_rotateImage_{rot}")
- flags["SO_reverseIt"] = True
- generate_overviews(flags, "SO_reverseIt_True")
- def test_scale_flags():
- """
- Testing generating overviews with different scale flags
- """
- percentile_value = 20
- flags_with_percentile = {"SO_percentileScale": True, "SO_percentileValue": percentile_value}
- flags_without_percentile = {}
- cutborder = 5
- flags_with_cutborder = {"SO_cutborder": cutborder}
- flag_types = {f"_percentileValue{percentile_value}": flags_with_percentile,
- "": flags_without_percentile,
- f"_cutborder{cutborder}": flags_with_cutborder}
- for label, flags_to_copy in flag_types.items():
- for indiscale in [1, 2, 4, 5, 6,
- 11, 12, 14, 15, 16,
- 21, 22, 24, 25, 26]:
- flags = flags_to_copy.copy()
- flags["SO_individualScale"] = indiscale
- generate_overviews(flags, f"SO_individualScale{indiscale}{label}")
- for indiscale in [3, 13, 23]:
- flags = flags_to_copy.copy()
- flags["SO_individualScale"] = indiscale
- flags["SO_indiScale3factor"] = 0.25
- generate_overviews(flags, f"SO_individualScale{indiscale}_factor0p25{label}")
- flags = flags_to_copy.copy()
- flags["SO_individualScale"] = indiscale
- flags["SO_indiScale3factor"] = 0.4
- generate_overviews(flags, f"SO_individualScale{indiscale}_factor0p4{label}")
- flags = flags_to_copy.copy()
- flags["SO_individualScale"] = indiscale
- flags["SO_indiScale3factor"] = 0
- generate_overviews(flags, f"SO_individualScale{indiscale}_factor0{label}")
- @raises(ValueError)
- def test_large_bordercut():
- """
- Testing generation of overview when SO_cutborder is inappropriately large
- """
- generate_overviews({"SO_cutborder": 106}, "_impossible")
- def test_filters():
- """
- Testing generating overviews with spatial filters
- """
- generate_overviews({"Signal_Signal_FilterSpaceFlag": True, "Signal_Signal_FilterSpaceSize": 3, "SO_individualScale": 3,
- "SO_indiScale3factor": 0.25}, "space_filter_3")
- generate_overviews({"Signal_Signal_FilterSpaceFlag": True, "Signal_Signal_FilterSpaceSize": 3, "SO_withinArea": True},
- "space_filter_3_withinArea_true")
- def test_SO_withinArea():
- """
- Testing generating overviews with SO_withinArea set
- """
- generate_overviews({'SO_withinArea': True,
- 'SO_individualScale': 3,
- "SO_indiScale3factor": 0.25},
- "SO_within_area_True")
- generate_overviews({'SO_withinArea': True,
- 'SO_thresholdShowImage': "bgColor",
- 'SO_individualScale': 3,
- "SO_indiScale3factor": 0.25},
- "SO_within_area_True_Image_bgColor")
- generate_overviews({'SO_withinArea': True,
- 'SO_individualScale': 3,
- "SO_indiScale3factor": 0.25,
- "SO_cutborder": 5},
- "SO_within_area_True_cutBorder5")
- def test_thresholdOn():
- """
- Testing generating overviews with different values of SO_thresholdOn
- """
- for within_area in (True, False):
- threshold_on_vals = {"foto1": [("a1000", "a400"), ("r50", "r30")],
- "overview": [("a0.05","a-0.05"), ("r50", "r30")]}
- for threshold_on, threshold_vals in threshold_on_vals.items():
- for (threshold_pos, threshold_neg) in threshold_vals:
- generate_overviews({'SO_withinArea': within_area,
- 'SO_thresholdOn': threshold_on,
- 'SO_lowerThreshPositiveResps': threshold_pos,
- 'SO_upperThreshNegativeResps': threshold_neg,
- 'SO_individualScale': 3,
- "SO_indiScale3factor": 0.25},
- f"SO_thresholdOn_{threshold_on}"
- f"_vals_{threshold_pos}{threshold_neg}"
- f"_withinArea_{within_area}")
- def test_thresholdShowImage():
- """
- Testing generating overviews with different settings for SO_thresholdShowImage and SO_threshold_scale
- """
- for threshold_show_image in ["foto1", "bgColor"]:
- for threshold_scale in ["full", "onlyShown"]:
- generate_overviews({"SO_thresholdShowImage": threshold_show_image,
- "SO_thresholdScale": threshold_scale,
- 'SO_thresholdOn': "foto1",
- 'SO_thresholdOnValue': -1000,
- 'SO_individualScale': 3,
- "SO_indiScale3factor": 0.25
- },
- f"SO_thresholdOn_foto1_val_-1000_Image_"
- f"{threshold_show_image}_scale_{threshold_scale}")
- def test_bgColor():
- """
- Testing generating overviews with SO_bgColor set
- """
- generate_overviews({'SO_withinArea': True,
- 'SO_thresholdShowImage': "bgColor",
- 'SO_individualScale': 3,
- "SO_bgColor": 'g',
- "SO_indiScale3factor": 0.25},
- "SO_within_area_True_Image_bgColor_green")
- def test_bgColor_fgColor():
- """
- Testing generating overviews with SO_bgColor set
- """
- generate_overviews({
- "SO_bgColor": 'y',
- "SO_fgColor": 'r'
- },
- "_bgColor_yellow_fg_color_red")
- def test_scale_legend_factor():
- """
- Testing setting SO_scaleLegendFactor
- """
- for factor in (10, 100):
- generate_overviews({"SO_individualScale": 2,
- "SO_percentileScale": True,
- "SO_percentileValue": 20,
- "SO_scaleLegendFactor": factor},
- f"_scaleLegendFactor{factor}")
- def test_showROIs():
- """
- Testing overview generation with different types of perimeters
- """
- test_values = [10, 13, 14, 15, 20, 23, 24, 25]
- for test_value in test_values:
- print(f"Testing with SO_showROIs={test_value}")
- og = OverviewsGenerator()
- og.generate(flags_to_update={"SO_showROIs": test_value}, suffix=f"_showROI{test_value}")
- og = OverviewsGenerator()
- og.generate({"SO_showROIs": 15, "SO_cutborder": 5}, "showROIs15_cutborder5")
- # def test_fgColor():
- # """
- # Testing generating movies with SO_fgColor set
- # """
- #
- # generate_overviews({"SO_fgColor": "m"},
- # "SO_with_fgColor_magenta")
- if __name__ == '__main__':
- # test_defaults()
- # test_thresholdOn()
- # test_scale_flags()
- test_showROIs()
|