generate_overviews_tests.py 8.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267
  1. from common import initialize_test_yml_list_measurement
  2. from view import VIEW
  3. import tifffile
  4. import pathlib as pl
  5. from nose.tools import raises
  6. class OverviewsGenerator(object):
  7. def __init__(self):
  8. self.test_yml, self.test_animal, self.test_measu = initialize_test_yml_list_measurement()
  9. self.view = VIEW()
  10. self.view.update_flags_from_ymlfile(self.test_yml)
  11. self.view.update_flags(get_default_overview_flags_hack())
  12. def generate(self, flags_to_update, suffix):
  13. self.view.update_flags(flags_to_update)
  14. self.view.load_measurement_data(self.test_animal, self.test_measu)
  15. self.view.calculate_signals()
  16. frame_data2write, data_limits = self.view.generate_overview_for_output_for_current_measurement()
  17. test_folder = pl.Path(self.view.flags["STG_OdorReportPath"]) / "test_single_overviews"
  18. if not test_folder.is_dir():
  19. test_folder.mkdir()
  20. op_file_name = test_folder / f"{self.view.flags['STG_ReportTag']}_{self.view.p1.metadata.ex_name}{suffix}.tif"
  21. tifffile.imsave(op_file_name, data=frame_data2write, photometric="rgb")
  22. def get_default_overview_flags_hack():
  23. return {"SO_Method": 0, "CTV_Method": 22, "CTV_firstframe": 25, "CTV_lastframe": 35}
  24. def generate_overviews(flags_to_update, suffix):
  25. og = OverviewsGenerator()
  26. og.generate(flags_to_update, suffix)
  27. def test_defaults():
  28. generate_overviews(flags_to_update={}, suffix="_defaults")
  29. def test_no_colorbar():
  30. generate_overviews(flags_to_update={"CTV_scalebar": 0}, suffix="_no_scalebar")
  31. def test_rotate_flags():
  32. """
  33. Testing generating overview with different rotate flags
  34. """
  35. flags = {"SO_individualScale": 3, "SO_indiScale3factor": 0.25}
  36. for rot in range(1, 8):
  37. flags["SO_rotateImage"] = rot
  38. generate_overviews(flags, f"SO_rotateImage_{rot}")
  39. flags["SO_reverseIt"] = True
  40. generate_overviews(flags, "SO_reverseIt_True")
  41. def test_scale_flags():
  42. """
  43. Testing generating overviews with different scale flags
  44. """
  45. percentile_value = 20
  46. flags_with_percentile = {"SO_percentileScale": True, "SO_percentileValue": percentile_value}
  47. flags_without_percentile = {}
  48. cutborder = 5
  49. flags_with_cutborder = {"SO_cutborder": cutborder}
  50. flag_types = {f"_percentileValue{percentile_value}": flags_with_percentile,
  51. "": flags_without_percentile,
  52. f"_cutborder{cutborder}": flags_with_cutborder}
  53. for label, flags_to_copy in flag_types.items():
  54. for indiscale in [1, 2, 4, 5, 6,
  55. 11, 12, 14, 15, 16,
  56. 21, 22, 24, 25, 26]:
  57. flags = flags_to_copy.copy()
  58. flags["SO_individualScale"] = indiscale
  59. generate_overviews(flags, f"SO_individualScale{indiscale}{label}")
  60. for indiscale in [3, 13, 23]:
  61. flags = flags_to_copy.copy()
  62. flags["SO_individualScale"] = indiscale
  63. flags["SO_indiScale3factor"] = 0.25
  64. generate_overviews(flags, f"SO_individualScale{indiscale}_factor0p25{label}")
  65. flags = flags_to_copy.copy()
  66. flags["SO_individualScale"] = indiscale
  67. flags["SO_indiScale3factor"] = 0.4
  68. generate_overviews(flags, f"SO_individualScale{indiscale}_factor0p4{label}")
  69. flags = flags_to_copy.copy()
  70. flags["SO_individualScale"] = indiscale
  71. flags["SO_indiScale3factor"] = 0
  72. generate_overviews(flags, f"SO_individualScale{indiscale}_factor0{label}")
  73. @raises(ValueError)
  74. def test_large_bordercut():
  75. """
  76. Testing generation of overview when SO_cutborder is inappropriately large
  77. """
  78. generate_overviews({"SO_cutborder": 106}, "_impossible")
  79. def test_filters():
  80. """
  81. Testing generating overviews with spatial filters
  82. """
  83. generate_overviews({"Signal_Signal_FilterSpaceFlag": True, "Signal_Signal_FilterSpaceSize": 3, "SO_individualScale": 3,
  84. "SO_indiScale3factor": 0.25}, "space_filter_3")
  85. generate_overviews({"Signal_Signal_FilterSpaceFlag": True, "Signal_Signal_FilterSpaceSize": 3, "SO_withinArea": True},
  86. "space_filter_3_withinArea_true")
  87. def test_SO_withinArea():
  88. """
  89. Testing generating overviews with SO_withinArea set
  90. """
  91. generate_overviews({'SO_withinArea': True,
  92. 'SO_individualScale': 3,
  93. "SO_indiScale3factor": 0.25},
  94. "SO_within_area_True")
  95. generate_overviews({'SO_withinArea': True,
  96. 'SO_thresholdShowImage': "bgColor",
  97. 'SO_individualScale': 3,
  98. "SO_indiScale3factor": 0.25},
  99. "SO_within_area_True_Image_bgColor")
  100. generate_overviews({'SO_withinArea': True,
  101. 'SO_individualScale': 3,
  102. "SO_indiScale3factor": 0.25,
  103. "SO_cutborder": 5},
  104. "SO_within_area_True_cutBorder5")
  105. def test_thresholdOn():
  106. """
  107. Testing generating overviews with different values of SO_thresholdOn
  108. """
  109. for within_area in (True, False):
  110. threshold_on_vals = {"foto1": [("a1000", "a400"), ("r50", "r30")],
  111. "overview": [("a0.05","a-0.05"), ("r50", "r30")]}
  112. for threshold_on, threshold_vals in threshold_on_vals.items():
  113. for (threshold_pos, threshold_neg) in threshold_vals:
  114. generate_overviews({'SO_withinArea': within_area,
  115. 'SO_thresholdOn': threshold_on,
  116. 'SO_lowerThreshPositiveResps': threshold_pos,
  117. 'SO_upperThreshNegativeResps': threshold_neg,
  118. 'SO_individualScale': 3,
  119. "SO_indiScale3factor": 0.25},
  120. f"SO_thresholdOn_{threshold_on}"
  121. f"_vals_{threshold_pos}{threshold_neg}"
  122. f"_withinArea_{within_area}")
  123. def test_thresholdShowImage():
  124. """
  125. Testing generating overviews with different settings for SO_thresholdShowImage and SO_threshold_scale
  126. """
  127. for threshold_show_image in ["foto1", "bgColor"]:
  128. for threshold_scale in ["full", "onlyShown"]:
  129. generate_overviews({"SO_thresholdShowImage": threshold_show_image,
  130. "SO_thresholdScale": threshold_scale,
  131. 'SO_thresholdOn': "foto1",
  132. 'SO_thresholdOnValue': -1000,
  133. 'SO_individualScale': 3,
  134. "SO_indiScale3factor": 0.25
  135. },
  136. f"SO_thresholdOn_foto1_val_-1000_Image_"
  137. f"{threshold_show_image}_scale_{threshold_scale}")
  138. def test_bgColor():
  139. """
  140. Testing generating overviews with SO_bgColor set
  141. """
  142. generate_overviews({'SO_withinArea': True,
  143. 'SO_thresholdShowImage': "bgColor",
  144. 'SO_individualScale': 3,
  145. "SO_bgColor": 'g',
  146. "SO_indiScale3factor": 0.25},
  147. "SO_within_area_True_Image_bgColor_green")
  148. def test_bgColor_fgColor():
  149. """
  150. Testing generating overviews with SO_bgColor set
  151. """
  152. generate_overviews({
  153. "SO_bgColor": 'y',
  154. "SO_fgColor": 'r'
  155. },
  156. "_bgColor_yellow_fg_color_red")
  157. def test_scale_legend_factor():
  158. """
  159. Testing setting SO_scaleLegendFactor
  160. """
  161. for factor in (10, 100):
  162. generate_overviews({"SO_individualScale": 2,
  163. "SO_percentileScale": True,
  164. "SO_percentileValue": 20,
  165. "SO_scaleLegendFactor": factor},
  166. f"_scaleLegendFactor{factor}")
  167. def test_showROIs():
  168. """
  169. Testing overview generation with different types of perimeters
  170. """
  171. test_values = [10, 13, 14, 15, 20, 23, 24, 25]
  172. for test_value in test_values:
  173. print(f"Testing with SO_showROIs={test_value}")
  174. og = OverviewsGenerator()
  175. og.generate(flags_to_update={"SO_showROIs": test_value}, suffix=f"_showROI{test_value}")
  176. og = OverviewsGenerator()
  177. og.generate({"SO_showROIs": 15, "SO_cutborder": 5}, "showROIs15_cutborder5")
  178. # def test_fgColor():
  179. # """
  180. # Testing generating movies with SO_fgColor set
  181. # """
  182. #
  183. # generate_overviews({"SO_fgColor": "m"},
  184. # "SO_with_fgColor_magenta")
  185. if __name__ == '__main__':
  186. # test_defaults()
  187. # test_thresholdOn()
  188. # test_scale_flags()
  189. test_showROIs()