import numpy as np
import napari
import os
from qtpy.QtCore import QTimer
import skimage.transform
from tifffile import imread, imwrite
[docs]
class image_visualizer():
    """
       This class generates visualizations of highres segmentation results.
       """
[docs]
    def __init__(self):
        """
        Initialize data folders and start Napari
        """
        self.rawdatafolder = "rawdatafolder"
        self.segmentationfolder = "segmenteddatafolder"
        self.visualizedfolder = "outputfolder"
        self.region = "high_stack_001"
        self.establish_param = 0
        self.viewer = napari.Viewer() 
[docs]
    def load_images(self, vis_param):
        """"
        Load images from folder and render them according Visualization parameters specified.
        :param vis_param: Python dictionary of visulization paramters, e.g. vis_param['camera_angle1']
        """
        #get all timepoints from folder
        dir_list = os.listdir(self.rawdatafolder)
        timepointlist = []
        for path in dir_list:
            if path.startswith('t'):
                timepointlist.append(path)
        timepointlist.sort()
        print(timepointlist)
        #if you establish parameters, only open first timepoint
        if self.establish_param==1:
            timepointlist = ["t00002"]
            i_time="t00001"
        iter_vascular =0
        for i_time in timepointlist:
            self.viewer = napari.Viewer()
            #generate filepaths and folders
            rawimagepath_macrophages = os.path.join(self.rawdatafolder, i_time, self.region, vis_param['imagename_macrophage'])
            rawimagepath_cancer = os.path.join(self.rawdatafolder, i_time, self.region, vis_param['imagename_cancer'])
            rawimagepath_vasculature = os.path.join(self.rawdatafolder, i_time, self.region, vis_param['imagename_vasculature'])
            print(rawimagepath_macrophages)
            visualization_folder1 = os.path.join(self.visualizedfolder, self.region, "angle_1a")
            visualization_folder2 = os.path.join(self.visualizedfolder, self.region, "angle_2a")
            try:
                os.makedirs(visualization_folder1)
            except OSError as error:
                pass
            try:
                os.makedirs(visualization_folder2)
            except OSError as error:
                pass
            visualized_file = os.path.join(visualization_folder1,  i_time + ".tif")
            visualized_file2 = os.path.join(visualization_folder2, i_time + ".tif")
            #open images
            macrophage_image = imread(rawimagepath_macrophages)
            cancer_image= imread(rawimagepath_cancer)
            vasculature_image= imread(rawimagepath_vasculature)
            vasculargamma = vis_param['raw_gamma_vasculature'] - 0.07/50*iter_vascular
            iter_vascular = iter_vascular +1
            #add images as layers
            cancer_layer = self.viewer.add_image(cancer_image,
                                                 gamma=vis_param['raw_gamma_cancer'],
                                                 opacity=vis_param['opacity_cancer'],
                                                 contrast_limits=vis_param['raw_contrast_limits_cancer'],
                                                 colormap=vis_param['cancer_colormap'],
                                                 blending='translucent_no_depth')
            vasculature_layer = self.viewer.add_image(vasculature_image,
                                                      gamma=vis_param['raw_gamma_vasculature'],
                                                      opacity=vis_param['opacity_vasculature'],
                                                      contrast_limits=vis_param['raw_contrast_limits_vasculature'],
                                                      colormap=vis_param['vasculature_colormap'],
                                                      blending='additive')
            macrophage_layer = self.viewer.add_image(macrophage_image,
                                                     gamma=vis_param['raw_gamma_macrophages'],
                                                     opacity=vis_param['opacity_macrophage'],
                                                     contrast_limits=vis_param['raw_contrast_limits_macrophages'],
                                                     colormap=vis_param['macrophage_colormap'],
                                                     blending='additive')
            #set rendering to 3D and set camera zoom parameters
            self.viewer.dims.ndisplay = vis_param['rendering_dimension']
            self.viewer.camera.zoom = vis_param['camera_zoom']
            #rescale 3D data to be correct dimensions
            self.viewer.layers['macrophage_image'].scale = vis_param['raw_rescale_factor']
            self.viewer.layers['cancer_image'].scale = vis_param['raw_rescale_factor']
            self.viewer.layers['vasculature_image'].scale = vis_param['raw_rescale_factor']
            #interpolation to cubic
            self.viewer.layers['macrophage_image'].interpolation3d ='cubic'
            self.viewer.layers['cancer_image'].interpolation3d ='cubic'
            self.viewer.layers['vasculature_image'].interpolation3d ='cubic'
            #self.viewer.layers['label_image_rescaled'].scale = vis_param['label_rescale_factor']
            #save a first camera position
            self.viewer.camera.angles = vis_param['camera_angle1']
            imagereturn = self.viewer.screenshot(canvas_only=True, scale=vis_param['scale_to_save'])
            imwrite(visualized_file, imagereturn)
            #save without vasculature
            #get angle from napari by entering: viewer.camera.angles in console
            self.viewer.camera.angles = vis_param['camera_angle2']
            #self.viewer.layers.remove('cancer_image')
            imagereturn2 = self.viewer.screenshot(canvas_only=True, scale=vis_param['scale_to_save'])
            imwrite(visualized_file2, imagereturn2)
            #if you establish the parameters, run napari, otherwise delete the layers for next timepoint
            if self.establish_param == 1:
                napari.run()
            else:
                with napari.gui_qt() as app:
                    viewer = self.viewer
                    time_in_msc = 1000
                    QTimer.singleShot(time_in_msc, app.quit)
                self.viewer.close() 
 
                # self.viewer.layers.remove('macrophage_image')
                # self.viewer.layers.remove('cancer_image')
                # self.viewer.layers.remove('vasculature_image')
if __name__ == '__main__':
    visualization_param = dict(
        camera_angle1=(175.91550321834603, -30.46543415587574, 107.30480864818219),
        camera_angle2=(3.821579590379483, -21.150275706301922, -98.1205019728386),
        camera_zoom=0.27,
        #raw_contrast_limits=(126,482),
        raw_contrast_limits_macrophages=(105, 167),
        raw_contrast_limits_cancer=(102, 1529),
        raw_contrast_limits_vasculature=(114, 1540),
        #raw_gamma=0.67,
        raw_gamma_macrophages=0.45,
        raw_gamma_cancer=0.59,
        raw_gamma_vasculature=0.56,
        macrophage_colormap ='magenta',
        cancer_colormap='green',
        vasculature_colormap='cyan',
        opacity_cancer=1,
        opacity_macrophage=0.24,
        opacity_vasculature=0.66,
        opacity_label=1,
        rendering_dimension=3,
        label_blending='additive',
        # raw_rescale_factor =[9.210526, 1, 1],
        # label_rescale_factor = [9.210526, 1, 1],
        raw_rescale_factor =[3.418, 1, 1],
        label_rescale_factor =[3.418, 1, 1],
        #raw_rescale_factor=[1, 1, 1],
        #label_rescale_factor=[1, 1, 1],
        establish_param=0,
        set_label_colormap='default',
        scale_to_save=5,
        display_rawcancersignal=0,
        imagename_macrophage="1_CH488_000000.tif",
        imagename_vasculature="1_CH594_000000.tif",
        imagename_cancer="1_CH552_000000.tif"
    )
    visualization_param = dict(
        camera_angle1=(175.91550321834603, -30.46543415587574, 107.30480864818219),
        camera_angle2=(3.821579590379483, -21.150275706301922, -98.1205019728386),
        camera_zoom=0.27,
        # raw_contrast_limits=(126,482),
        raw_contrast_limits_macrophages=(105, 167),
        raw_contrast_limits_cancer=(284, 2930),
        raw_contrast_limits_vasculature=(114, 1540),
        # raw_gamma=0.67,
        raw_gamma_macrophages=0.69,
        raw_gamma_cancer=0.86,
        raw_gamma_vasculature=0.55,
        macrophage_colormap='magenta',
        cancer_colormap='green',
        vasculature_colormap='cyan',
        opacity_cancer=1,
        opacity_macrophage=0.34,
        opacity_vasculature=0.82,
        opacity_label=1,
        rendering_dimension=3,
        label_blending='additive',
        # raw_rescale_factor =[9.210526, 1, 1],
        # label_rescale_factor = [9.210526, 1, 1],
        raw_rescale_factor=[3.418, 1, 1],
        label_rescale_factor=[3.418, 1, 1],
        # raw_rescale_factor=[1, 1, 1],
        # label_rescale_factor=[1, 1, 1],
        establish_param=0,
        set_label_colormap='default',
        scale_to_save=5,
        display_rawcancersignal=0,
        imagename_macrophage="1_CH488_000000.tif",
        imagename_vasculature="1_CH594_000000.tif",
        imagename_cancer="1_CH552_000000.tif"
    )
    imagevisu = image_visualizer()
    imagevisu.rawdatafolder = "/archive/bioinformatics/Danuser_lab/Fiolka/LabMembers/Stephan/multiscale_data/xenograft_experiments/U2OS_WT/20220729_Daetwyler_U2OS/Experiment0001"
    experimentfolder_result = imagevisu.rawdatafolder + "_highres_visualized"
    imagevisu.segmentationfolder = os.path.join(experimentfolder_result, 'high_stack_002')
    imagevisu.visualizedfolder = os.path.join(experimentfolder_result, 'visualized_bright9')
    imagevisu.region = 'high_stack_002'
    imagevisu.establish_param = 0
    imagevisu.load_images(visualization_param)
    # #adapt image
    # pathfile = os.path.join(experimentfolder_result, "visualized_bright4", "angle_1a.tif")
    # finalimage = imread(pathfile)
    #
    # # make boundingbox and bound image
    # binarybox = np.zeros(finalimage.shape)
    # binarybox[:, 812:2151, 348:3076,:] = 1
    #
    # pathfile_save = os.path.join(experimentfolder_result, "binarybox.tif")
    # imwrite(pathfile_save, np.uint8(binarybox))
    #
    #
    #
    # finalimage[np.logical_and(finalimage==0, np.logical_not(binarybox))]=202
    #
    # print("test")
    #
    #
    #
    # selectedimage = finalimage + binarybox
    #
    # anotherstack_indices = np.where(selectedimage == 0)
    # anotherstack_indices2 = np.where(finalimage == 0)
    #
    # finalimage[anotherstack_indices] = 202
    #
    # print("start file writing")
    # pathfile_save = os.path.join(experimentfolder_result, "angle_1aV2.tif")
    # imwrite(pathfile_save, np.uint8(finalimage))