Exemple #1
0
 def test_very_anisotropic(self):
     """ Made to find error in very anisotropic case close to upper layer
     """
     set_up_parameters = {
         'sigma_1': [1.0, 1.0, 1.0], # Below electrode
         'sigma_2': [0.1, 0.1, 1.0], # Tissue
         'sigma_3': [0.0, 0.0, 0.0], # Saline
         'slice_thickness': 0.2,
         'steps' : 2}
     Moi = MoI(set_up_parameters = set_up_parameters)
     imem = 1.2
     a = set_up_parameters['slice_thickness']/2.
     high_position = [.09, 0, 0]
     low_position = [-a + 0.01, 0, 0]
     z_array = np.linspace(-0.2,0.2,41)
     y_array = np.linspace(-0.1,0.1,21)
     values_high = []
     values_low = []
     for y in y_array:
         for z in z_array:
             values_high.append([z,y, Moi.anisotropic_moi(\
                 charge_pos = high_position, elec_pos = [-0.1,y,z])])
             values_low.append([z,y, Moi.anisotropic_moi(\
                 charge_pos = low_position, elec_pos = [-0.1,y,z])])
     values_high = np.array(values_high)
     values_low = np.array(values_low)
     pl.subplot(211)
     pl.scatter(values_high[:,0], values_high[:,1], c = values_high[:,2])
     pl.axis('equal')
     pl.colorbar()
     pl.subplot(212)
     pl.scatter(values_low[:,0], values_low[:,1], c = values_low[:,2])
     pl.colorbar()
     pl.axis('equal')
     pl.show()
Exemple #2
0
    def test_if_anisotropic(self):
        """ Test if it can handle anisotropies
        """
        set_up_parameters = {
            'sigma_G': [1.0, 1.0, 1.0],  # Below electrode
            'sigma_T': [0.1, 0.1, 1.0],  # Tissue
            'sigma_S': [0.0, 0.0, 0.0],  # Saline
            'slice_thickness': 200,
            'steps': 2
        }
        Moi = MoI(set_up_parameters=set_up_parameters)
        self.assertTrue(Moi.is_anisotropic)

        set_up_parameters = {
            'sigma_G': [1.0],  # Below electrode
            'sigma_T': [1.0],  # Tissue
            'sigma_S': [0.0],  # Saline
            'slice_thickness': 200,
            'steps': 2
        }
        with self.assertRaises(RuntimeError):
            Moi = MoI(set_up_parameters=set_up_parameters)

        set_up_parameters = {
            'sigma_G': [1.0, 2.0, 3.0],  # Below electrode
            'sigma_T': 1.0,  # Tissue
            'sigma_S': 0.0,  # Saline
            'slice_thickness': 200,
            'steps': 2
        }
        with self.assertRaises(RuntimeError):
            Moi = MoI(set_up_parameters=set_up_parameters)
Exemple #3
0
 def atest_very_anisotropic(self):
     """ Made to find error in very anisotropic case close to upper layer
     """
     set_up_parameters = {
         "sigma_G": [1.0, 1.0, 1.0],  # Below electrode
         "sigma_T": [0.1, 0.1, 1.0],  # Tissue
         "sigma_S": [0.0, 0.0, 0.0],  # Saline
         "slice_thickness": 200,
         "steps": 2,
     }
     Moi = MoI(set_up_parameters=set_up_parameters)
     imem = 1.2
     a = set_up_parameters["slice_thickness"] / 2.0
     high_position = [0, 0, 90]
     low_position = [0, 0, -a + 10]
     x_array = np.linspace(-200, 200, 41)
     y_array = np.linspace(-100, 100, 21)
     values_high = []
     values_low = []
     for y in y_array:
         for x in x_array:
             values_high.append([x, y, Moi.ad_hoc_anisotropic(charge_pos=high_position, elec_pos=[x, y, -100])])
             values_low.append([x, y, Moi.ad_hoc_anisotropic(charge_pos=low_position, elec_pos=[x, y, -100])])
     values_high = np.array(values_high)
     values_low = np.array(values_low)
     pl.subplot(211)
     pl.scatter(values_high[:, 0], values_high[:, 1], c=values_high[:, 2])
     pl.axis("equal")
     pl.colorbar()
     pl.subplot(212)
     pl.scatter(values_low[:, 0], values_low[:, 1], c=values_low[:, 2])
     pl.colorbar()
     pl.axis("equal")
     pl.show()
Exemple #4
0
    def atest_moi_line_source(self):
        """ Testing infinite isotropic moi line source formula"""
        set_up_parameters = {
            'sigma_1': 0.0, # Below electrode
            'sigma_2': 0.3, # Tissue
            'sigma_3': 3.0, # Saline
            'slice_thickness': 0.2,
            'steps' : 20}
        a = set_up_parameters['slice_thickness']/2.
        Moi = MoI(set_up_parameters = set_up_parameters)

        comp_start = [.09, -.1, -.05]
        comp_end = [-0.09, .1, .01]
        comp_mid = (np.array(comp_end) + np.array(comp_start))/2
        comp_length = np.sqrt( np.sum((np.array(comp_end) - np.array(comp_start))**2))
        elec_y = np.linspace(-0.15, 0.15, 5)
        elec_z = np.linspace(-0.15, 0.15, 5)
        phi_LS = []
        phi_PS = []
        phi_PSi = []
        y = []
        z = []
        points = 3
        s = np.array(comp_end) - np.array(comp_start)
        ds = s / (points)
        
        for z_pos in xrange(len(elec_z)):
            for y_pos in xrange(len(elec_y)):
                phi_LS.append(Moi.line_source_moi(comp_start, comp_end, \
                                           comp_length, [-0.1, elec_y[y_pos], elec_z[z_pos]], imem=1))
                phi_PS.append(Moi.isotropic_moi(comp_mid, [-0.1, elec_y[y_pos], elec_z[z_pos]]))
                delta = 0
                for step in xrange(points+1):
                    pos = comp_start + ds*step
                    delta += Moi.isotropic_moi(\
                        pos, [-0.1, elec_y[y_pos], elec_z[z_pos]], imem = 1./(points+1))
                phi_PSi.append(delta)
                                       
                z.append(elec_z[z_pos])
                y.append(elec_y[y_pos])
        import pylab as pl
        pl.subplot(411)
        pl.scatter(z,y, c=phi_LS, s=2, edgecolors='none')
        pl.axis('equal')
        pl.colorbar()
        pl.subplot(412)
        pl.scatter(z,y, c=phi_PS, s=2, edgecolors='none')
        pl.axis('equal')
        pl.colorbar()
        pl.subplot(413)
        pl.scatter(z,y, c=phi_PSi, s=2, edgecolors='none')
        pl.axis('equal')
        pl.colorbar()

        
        pl.subplot(414)       
        pl.scatter(z,y, c=(np.array(phi_LS) - np.array(phi_PSi)), s=1, edgecolors='none')
        pl.axis('equal')
        pl.colorbar()       
        pl.savefig('line_source_test2.png')
Exemple #5
0
    def test_cython_LS_without_electrode(self):
        """ Test if cython extentions works as expected """

        set_up_parameters = {
            "sigma_G": 0.0,  # Below electrode
            "sigma_T": 0.3,  # Tissue
            "sigma_S": 0.3,  # Saline
            "slice_thickness": 200,
            "steps": 20,
        }

        xstart = np.array([100, 0, -100, -110.0])
        xend = np.array([100, 0, -100, -110]) + 100.0

        ystart = np.array([100, 0, -100, 200.0])
        yend = np.array([100, 0, -100, 200.0]) + 100

        zstart = np.array([10, 0, -10, -50.0])
        zend = np.array([10, 0, -10, -50.0]) + 10

        elec_x = (np.arange(3) - 1) * 50.0
        elec_y = (np.arange(3) - 1) * 50.0

        elec_z = -set_up_parameters["slice_thickness"] / 2.0

        ext_sim_dict = {
            "elec_x": elec_x,
            "elec_y": elec_y,
            "elec_z": elec_z,
            "include_elec": False,
            "use_line_source": True,
            "moi_steps": set_up_parameters["steps"],
        }
        moi = MoI(set_up_parameters=set_up_parameters)
        t0 = time.time()
        mapping = LS_without_elec_mapping(
            set_up_parameters["sigma_T"],
            set_up_parameters["sigma_S"],
            elec_z,
            set_up_parameters["steps"],
            elec_x,
            elec_y,
            xstart,
            ystart,
            zstart,
            xend,
            yend,
            zend,
        )
        t_cy = time.time() - t0
        t0 = time.time()
        mapping2 = moi.make_mapping_standalone(
            ext_sim_dict, xstart=xstart, ystart=ystart, zstart=zstart, xend=xend, yend=yend, zend=zend
        )
        t_py = time.time() - t0
        rel_error = np.abs((mapping - mapping2) / mapping)
        print "\nLS no electrode cython speed-up: ", t_py / t_cy
        self.assertLessEqual(np.max(rel_error), 0.001)
Exemple #6
0
    def test_cython_PS_with_electrode(self):
        """ Test if cython extentions works as expected """

        set_up_parameters = {
            "sigma_G": 0.0,  # Below electrode
            "sigma_T": 0.3,  # Tissue
            "sigma_S": 0.3,  # Saline
            "slice_thickness": 200,
            "steps": 20,
        }

        xmid = 1000 * np.array([0.1, 0, -0.1])
        ymid = 1000 * np.array([0.1, 0, -0.1])
        zmid = 1000 * np.array([0.01, 0, -0.01])

        elec_x = (np.arange(3) - 1) * 50.0
        elec_y = (np.arange(3) - 1) * 50.0
        elec_z = -set_up_parameters["slice_thickness"] / 2.0
        elec_r = 1
        n_avrg_points = 100
        ext_sim_dict = {
            "elec_x": elec_x,
            "elec_y": elec_y,
            "elec_z": elec_z,
            "include_elec": True,
            "use_line_source": False,
            "elec_radius": elec_r,
            "moi_steps": set_up_parameters["steps"],
            "n_avrg_points": n_avrg_points,
        }
        moi = MoI(set_up_parameters=set_up_parameters)

        t0 = time.time()
        mapping = PS_with_elec_mapping(
            set_up_parameters["sigma_T"],
            set_up_parameters["sigma_S"],
            elec_z,
            set_up_parameters["steps"],
            n_avrg_points,
            elec_r,
            elec_x,
            elec_y,
            xmid,
            ymid,
            zmid,
        )
        t_cy = time.time() - t0
        t0 = time.time()
        mapping2 = moi.make_mapping_standalone(ext_sim_dict, xmid, ymid, zmid)
        t_py = time.time() - t0
        print "\nPS with electrode cython speed-up: ", t_py / t_cy
        rel_error = np.abs((mapping - mapping2) / mapping)
        # print mapping
        # print mapping2
        # print mapping- mapping2
        self.assertLessEqual(np.max(rel_error), 0.001)
Exemple #7
0
    def test_cython_LS_without_electrode(self):
        """ Test if cython extentions works as expected """

        set_up_parameters = {
            'sigma_G': 0.0,  # Below electrode
            'sigma_T': 0.3,  # Tissue
            'sigma_S': 0.3,  # Saline
            'slice_thickness': 200,
            'steps': 20
        }

        xstart = np.array([100, 0, -100, -110.])
        xend = np.array([100, 0, -100, -110]) + 100.

        ystart = np.array([100, 0, -100, 200.])
        yend = np.array([100, 0, -100, 200.]) + 100

        zstart = np.array([10, 0, -10, -50.])
        zend = np.array([10, 0, -10, -50.]) + 10

        elec_x = (np.arange(3) - 1) * 50.
        elec_y = (np.arange(3) - 1) * 50.

        elec_z = -set_up_parameters['slice_thickness'] / 2.

        ext_sim_dict = {
            'elec_x': elec_x,
            'elec_y': elec_y,
            'elec_z': elec_z,
            'include_elec': False,
            'use_line_source': True,
            'moi_steps': set_up_parameters['steps'],
        }
        moi = MoI(set_up_parameters=set_up_parameters)
        t0 = time.time()
        mapping = LS_without_elec_mapping(set_up_parameters['sigma_T'],
                                          set_up_parameters['sigma_S'], elec_z,
                                          set_up_parameters['steps'], elec_x,
                                          elec_y, xstart, ystart, zstart, xend,
                                          yend, zend)
        t_cy = time.time() - t0
        t0 = time.time()
        mapping2 = moi.make_mapping_standalone(ext_sim_dict,
                                               xstart=xstart,
                                               ystart=ystart,
                                               zstart=zstart,
                                               xend=xend,
                                               yend=yend,
                                               zend=zend)
        t_py = time.time() - t0
        rel_error = np.abs((mapping - mapping2) / mapping)
        print "\nLS no electrode cython speed-up: ", t_py / t_cy
        self.assertLessEqual(np.max(rel_error), 0.001)
Exemple #8
0
 def test_big_average(self):
     """ Testing average over electrode with many values"""
     set_up_parameters = {
         'sigma_1': 0.0, # Below electrode
         'sigma_2': 0.3, # Tissue
         'sigma_3': 3.0, # Saline
         'slice_thickness': 0.2,
         'steps' : 20}
     a = set_up_parameters['slice_thickness']/2.
     Moi = MoI(set_up_parameters = set_up_parameters)
     r = 0.03
     charge_pos = [0, 0, 0]
     elec_pos = [-a, 0,0]
     phi = Moi.potential_at_elec_big_average(charge_pos, elec_pos, r)
Exemple #9
0
    def test_cython_PS_with_electrode(self):
        """ Test if cython extentions works as expected """

        set_up_parameters = {
            'sigma_G': 0.0,  # Below electrode
            'sigma_T': 0.3,  # Tissue
            'sigma_S': 0.3,  # Saline
            'slice_thickness': 200,
            'steps': 20
        }

        xmid = 1000 * np.array([0.1, 0, -0.1])
        ymid = 1000 * np.array([0.1, 0, -0.1])
        zmid = 1000 * np.array([0.01, 0, -0.01])

        elec_x = (np.arange(3) - 1) * 50.
        elec_y = (np.arange(3) - 1) * 50.
        elec_z = -set_up_parameters['slice_thickness'] / 2.
        elec_r = 1
        n_avrg_points = 100
        ext_sim_dict = {
            'elec_x': elec_x,
            'elec_y': elec_y,
            'elec_z': elec_z,
            'include_elec': True,
            'use_line_source': False,
            'elec_radius': elec_r,
            'moi_steps': set_up_parameters['steps'],
            'n_avrg_points': n_avrg_points,
        }
        moi = MoI(set_up_parameters=set_up_parameters)

        t0 = time.time()
        mapping = PS_with_elec_mapping(set_up_parameters['sigma_T'],
                                       set_up_parameters['sigma_S'], elec_z,
                                       set_up_parameters['steps'],
                                       n_avrg_points, elec_r, elec_x, elec_y,
                                       xmid, ymid, zmid)
        t_cy = time.time() - t0
        t0 = time.time()
        mapping2 = moi.make_mapping_standalone(ext_sim_dict, xmid, ymid, zmid)
        t_py = time.time() - t0
        print "\nPS with electrode cython speed-up: ", t_py / t_cy
        rel_error = np.abs((mapping - mapping2) / mapping)
        #print mapping
        #print mapping2
        #print mapping- mapping2
        self.assertLessEqual(np.max(rel_error), 0.001)
Exemple #10
0
 def test_big_average(self):
     """ Testing average over electrode with many values"""
     set_up_parameters = {
         "sigma_G": 0.0,  # Below electrode
         "sigma_T": 0.3,  # Tissue
         "sigma_S": 3.0,  # Saline
         "slice_thickness": 200,
         "steps": 20,
     }
     a = set_up_parameters["slice_thickness"] / 2.0
     Moi = MoI(set_up_parameters=set_up_parameters)
     r = 30
     charge_pos = [0, 0, 0]
     elec_pos = [0, 0, -a]
     n_avrg_points = 100
     phi = Moi.potential_at_elec_big_average(elec_pos, r, n_avrg_points, Moi.point_source_moi_at_elec, [charge_pos])
Exemple #11
0
 def test_charge_closer(self):
     """ If charge is closer to electrode, the potential should
     be greater"""
     set_up_parameters = {
         'sigma_1': 0.0, # Below electrode
         'sigma_2': 0.3, # Tissue
         'sigma_3': 3.0, # Saline
         'slice_thickness': 0.2,
         'steps' : 20}
     Moi = MoI(set_up_parameters = set_up_parameters)
     imem = 1.2
     charge_pos_1 = [0,0,0]
     charge_pos_2 = [-set_up_parameters['slice_thickness']/4, 0,0]
     elec_pos = [-set_up_parameters['slice_thickness']/2, 0, 0]
     returned_ans_1 = Moi.isotropic_moi(charge_pos_1, elec_pos, imem)
     returned_ans_2 = Moi.isotropic_moi(charge_pos_2, elec_pos, imem)
     self.assertGreater(returned_ans_2, returned_ans_1)
Exemple #12
0
 def test_homogeneous(self):
     """If saline and tissue has same conductivity, MoI formula
     should return 2*(inf homogeneous point source)."""
     set_up_parameters = {
         "sigma_G": 0.0,  # Below electrode
         "sigma_T": 0.3,  # Tissue
         "sigma_S": 0.3,  # Saline
         "slice_thickness": 200,
         "steps": 20,
     }
     Moi = MoI(set_up_parameters=set_up_parameters)
     imem = 1.2
     charge_pos = [0, 0, 0]
     elec_pos = [0, 0, -set_up_parameters["slice_thickness"] / 2]
     dist = np.sqrt(np.sum(np.array(charge_pos) - np.array(elec_pos)) ** 2)
     expected_ans = 2 / (4 * np.pi * set_up_parameters["sigma_T"]) * imem / (dist)
     returned_ans = Moi.isotropic_moi(charge_pos, elec_pos, imem)
     self.assertAlmostEqual(expected_ans, returned_ans, 6)
Exemple #13
0
 def test_homogeneous(self):
     """If saline and tissue has same conductivity, MoI formula
     should return 2*(inf homogeneous point source)."""
     set_up_parameters = {
         'sigma_1': 0.0, # Below electrode
         'sigma_2': 0.3, # Tissue
         'sigma_3': 0.3, # Saline
         'slice_thickness': 0.2,
         'steps' : 20}
     Moi = MoI(set_up_parameters = set_up_parameters)
     imem = 1.2
     charge_pos = [0,0,0]
     elec_pos = [-set_up_parameters['slice_thickness']/2, 0, 0]
     dist = np.sqrt( np.sum(np.array(charge_pos) - np.array(elec_pos))**2)
     expected_ans = 2/(4*np.pi*set_up_parameters['sigma_2'])\
                    * imem/(dist)
     returned_ans = Moi.isotropic_moi(charge_pos, elec_pos, imem)
     self.assertAlmostEqual(expected_ans, returned_ans, 6)
Exemple #14
0
 def test_charge_closer(self):
     """ If charge is closer to electrode, the potential should
     be greater"""
     set_up_parameters = {
         'sigma_G': 0.0,  # Below electrode
         'sigma_T': 0.3,  # Tissue
         'sigma_S': 3.0,  # Saline
         'slice_thickness': 200,
         'steps': 20
     }
     Moi = MoI(set_up_parameters=set_up_parameters)
     imem = 1.2
     charge_pos_1 = [0, 0, 0]
     charge_pos_2 = [0, 0, -set_up_parameters['slice_thickness'] / 4]
     elec_pos = [0, 0, -set_up_parameters['slice_thickness'] / 2]
     returned_ans_1 = Moi.isotropic_moi(charge_pos_1, elec_pos, imem)
     returned_ans_2 = Moi.isotropic_moi(charge_pos_2, elec_pos, imem)
     self.assertGreater(returned_ans_2, returned_ans_1)
Exemple #15
0
 def test_saline_effect(self):
     """ If saline conductivity is bigger than tissue conductivity, the
     value of 2*(inf homogeneous point source) should be bigger
     than value returned from MoI"""
     set_up_parameters = {
         'sigma_1': 0.0, # Below electrode
         'sigma_2': 0.3, # Tissue
         'sigma_3': 3.0, # Saline
         'slice_thickness': 0.2,
         'steps' : 20}
     Moi = MoI(set_up_parameters = set_up_parameters)
     imem = 1.2
     charge_pos = [0,0,0]
     elec_pos = [-set_up_parameters['slice_thickness']/2, 0, 0]
     dist = np.sqrt( np.sum((np.array(charge_pos) - np.array(elec_pos))**2))
     expected_ans = 2/(4*np.pi*set_up_parameters['sigma_2']) * imem/dist
     returned_ans = Moi.isotropic_moi(charge_pos, elec_pos, imem)
     self.assertGreater(expected_ans, returned_ans)
Exemple #16
0
 def test_charge_closer(self):
     """ If charge is closer to electrode, the potential should
     be greater"""
     set_up_parameters = {
         "sigma_G": 0.0,  # Below electrode
         "sigma_T": 0.3,  # Tissue
         "sigma_S": 3.0,  # Saline
         "slice_thickness": 200,
         "steps": 20,
     }
     Moi = MoI(set_up_parameters=set_up_parameters)
     imem = 1.2
     charge_pos_1 = [0, 0, 0]
     charge_pos_2 = [0, 0, -set_up_parameters["slice_thickness"] / 4]
     elec_pos = [0, 0, -set_up_parameters["slice_thickness"] / 2]
     returned_ans_1 = Moi.isotropic_moi(charge_pos_1, elec_pos, imem)
     returned_ans_2 = Moi.isotropic_moi(charge_pos_2, elec_pos, imem)
     self.assertGreater(returned_ans_2, returned_ans_1)
Exemple #17
0
 def test_big_average(self):
     """ Testing average over electrode with many values"""
     set_up_parameters = {
         'sigma_G': 0.0,  # Below electrode
         'sigma_T': 0.3,  # Tissue
         'sigma_S': 3.0,  # Saline
         'slice_thickness': 200,
         'steps': 20
     }
     a = set_up_parameters['slice_thickness'] / 2.
     Moi = MoI(set_up_parameters=set_up_parameters)
     r = 30
     charge_pos = [0, 0, 0]
     elec_pos = [0, 0, -a]
     n_avrg_points = 100
     phi = Moi.potential_at_elec_big_average(elec_pos, r, n_avrg_points,
                                             Moi.point_source_moi_at_elec,
                                             [charge_pos])
Exemple #18
0
 def test_homogeneous(self):
     """If saline and tissue has same conductivity, MoI formula
     should return 2*(inf homogeneous point source)."""
     set_up_parameters = {
         'sigma_G': 0.0,  # Below electrode
         'sigma_T': 0.3,  # Tissue
         'sigma_S': 0.3,  # Saline
         'slice_thickness': 200,
         'steps': 20
     }
     Moi = MoI(set_up_parameters=set_up_parameters)
     imem = 1.2
     charge_pos = [0, 0, 0]
     elec_pos = [0, 0, -set_up_parameters['slice_thickness'] / 2]
     dist = np.sqrt(np.sum(np.array(charge_pos) - np.array(elec_pos))**2)
     expected_ans = 2/(4*np.pi*set_up_parameters['sigma_T'])\
                    * imem/(dist)
     returned_ans = Moi.isotropic_moi(charge_pos, elec_pos, imem)
     self.assertAlmostEqual(expected_ans, returned_ans, 6)
Exemple #19
0
    def test_cython_PS_without_electrode(self):
        """ Test if cython extentions works as expected """

        set_up_parameters = {
            'sigma_G': 0.0,  # Below electrode
            'sigma_T': 0.3,  # Tissue
            'sigma_S': 0.3,  # Saline
            'slice_thickness': 200,
            'steps': 2
        }

        xmid = np.array([100, 0, -100.])
        ymid = np.array([100, 0, -100.])
        zmid = np.array([10, 0, -10.])

        elec_x = (np.arange(3) - 1) * 50.
        elec_y = (np.arange(3) - 1) * 50.
        elec_z = -set_up_parameters['slice_thickness'] / 2.
        ext_sim_dict = {
            'elec_x': elec_x,
            'elec_y': elec_y,
            'elec_z': elec_z,
            'include_elec': False,
            'use_line_source': False,
            'moi_steps': set_up_parameters['steps']
        }
        moi = MoI(set_up_parameters=set_up_parameters)
        t0 = time.time()
        mapping = PS_without_elec_mapping(set_up_parameters['sigma_T'],
                                          set_up_parameters['sigma_S'], elec_z,
                                          set_up_parameters['steps'], elec_x,
                                          elec_y, xmid, ymid, zmid)
        t_cy = time.time() - t0
        t0 = time.time()
        mapping2 = moi.make_mapping_standalone(ext_sim_dict,
                                               xmid=xmid,
                                               ymid=ymid,
                                               zmid=zmid)
        t_py = time.time() - t0
        rel_error = np.abs((mapping - mapping2) / mapping)
        print "\nPS no electrode cython speed-up: ", t_py / t_cy
        self.assertAlmostEqual(np.max(rel_error), 0.0, 6)
Exemple #20
0
 def test_saline_effect(self):
     """ If saline conductivity is bigger than tissue conductivity, the
     value of 2*(inf homogeneous point source) should be bigger
     than value returned from MoI"""
     set_up_parameters = {
         'sigma_G': 0.0,  # Below electrode
         'sigma_T': 0.3,  # Tissue
         'sigma_S': 3.0,  # Saline
         'slice_thickness': 200,
         'steps': 20
     }
     Moi = MoI(set_up_parameters=set_up_parameters)
     imem = 1.2
     charge_pos = [0, 0, 0]
     elec_pos = [0, 0, -set_up_parameters['slice_thickness'] / 2]
     dist = np.sqrt(np.sum((np.array(charge_pos) - np.array(elec_pos))**2))
     expected_ans = 2 / (4 * np.pi *
                         set_up_parameters['sigma_T']) * imem / dist
     returned_ans = Moi.isotropic_moi(charge_pos, elec_pos, imem)
     self.assertGreater(expected_ans, returned_ans)
Exemple #21
0
 def test_within_domain_check(self):
     """ Test if unvalid electrode or charge position raises RuntimeError.
     """
     set_up_parameters = {
         'sigma_1': 0.0, # Below electrode
         'sigma_2': 0.3, # Tissue
         'sigma_3': 3.0, # Saline
         'slice_thickness': 0.2,
         'steps' : 20}
     Moi = MoI(set_up_parameters = set_up_parameters)
     imem = 1.2
     a = set_up_parameters['slice_thickness']/2
     invalid_positions = [[-a - 0.12,0,0],
                         [+a + 0.12,0,0]]
     valid_position = [0,0,0]
     kwargs = {'imem': imem}
     with self.assertRaises(RuntimeError):
         Moi.isotropic_moi(valid_position, valid_position)
     for pos in invalid_positions:
         with self.assertRaises(RuntimeError):
             Moi.isotropic_moi(valid_position, pos)
             Moi.isotropic_moi(pos, valid_position)
Exemple #22
0
 def atest_very_anisotropic(self):
     """ Made to find error in very anisotropic case close to upper layer
     """
     set_up_parameters = {
         'sigma_G': [1.0, 1.0, 1.0],  # Below electrode
         'sigma_T': [0.1, 0.1, 1.0],  # Tissue
         'sigma_S': [0.0, 0.0, 0.0],  # Saline
         'slice_thickness': 200,
         'steps': 2
     }
     Moi = MoI(set_up_parameters=set_up_parameters)
     imem = 1.2
     a = set_up_parameters['slice_thickness'] / 2.
     high_position = [0, 0, 90]
     low_position = [0, 0, -a + 10]
     x_array = np.linspace(-200, 200, 41)
     y_array = np.linspace(-100, 100, 21)
     values_high = []
     values_low = []
     for y in y_array:
         for x in x_array:
             values_high.append([x,y, Moi.ad_hoc_anisotropic(\
                 charge_pos = high_position, elec_pos = [x,y,-100])])
             values_low.append([x,y, Moi.ad_hoc_anisotropic(\
                 charge_pos = low_position, elec_pos = [x,y,-100])])
     values_high = np.array(values_high)
     values_low = np.array(values_low)
     pl.subplot(211)
     pl.scatter(values_high[:, 0], values_high[:, 1], c=values_high[:, 2])
     pl.axis('equal')
     pl.colorbar()
     pl.subplot(212)
     pl.scatter(values_low[:, 0], values_low[:, 1], c=values_low[:, 2])
     pl.colorbar()
     pl.axis('equal')
     pl.show()
Exemple #23
0
    def compute_electrodecoeffs(self):
        '''
        compute for each cell their corresponding mapping of compartment
        membrane currents to each electrode contact point
        '''
        coefffile = os.path.join(self.savefolder, 'electrodecoeffs.h5')
        
        moi = MoI(self.paramsMoI)

        coeffs = []

        if os.path.isfile(coefffile):
            if MASTER_MODE:
                print 'loading electrode mappings from file %s' % coefffile                
                f = h5py.File(coefffile, 'r')
                allcoeffs = {}
                for cellindex in range(self.POPULATION_SIZE):
                    allcoeffs.update({
                        cellindex : f['cell%.3i' % cellindex].value
                        })
                f.close()
            else:
                allcoeffs = None
            return COMM.bcast(allcoeffs, root=0)
        else:       
            for cellindex in range(self.POPULATION_SIZE):
                if divmod(cellindex, SIZE)[1] == RANK:
                    cell = self.cellsim(cellindex, return_just_cell=True)
    
                    mapping = moi.make_mapping_cython(self.paramsMapping,
                                                    xmid=cell.xmid,
                                                    ymid=cell.ymid,
                                                    zmid=cell.zmid,
                                                    xstart=cell.xstart,
                                                    ystart=cell.ystart,
                                                    zstart=cell.zstart,
                                                    xend=cell.xend,
                                                    yend=cell.yend,
                                                    zend=cell.zend,
                                                    morphology=cell.morphology)
                    coeffs.append({cellindex : mapping})
            
            #sync MPI threads, communicate coefficients between ranks
            COMM.Barrier()
            coeffs = COMM.gather(coeffs, root=0)
            if RANK == 0:
                allcoeffs = {}
                for i in range(SIZE):
                    for item in coeffs[i]:
                        allcoeffs.update(item)
                
                #write mappings to HDF5
                print 'writing electrode mappings to file %s' % coefffile
                f = h5py.File(coefffile, 'a', compression='gzip')
                for cellindex in range(self.POPULATION_SIZE):
                    f['cell%.3i' % cellindex] = allcoeffs[cellindex]
                f.close()            
            else:
                allcoeffs = None
            
            return COMM.bcast(allcoeffs, root=0)
Exemple #24
0
    def atest_moi_line_source(self):
        """ Testing infinite isotropic moi line source formula"""
        set_up_parameters = {
            "sigma_G": 0.0,  # Below electrode
            "sigma_T": 0.3,  # Tissue
            "sigma_S": 3.0,  # Saline
            "slice_thickness": 200,
            "steps": 20,
        }
        a = set_up_parameters["slice_thickness"] / 2.0
        Moi = MoI(set_up_parameters=set_up_parameters)

        comp_start = [-50, -100, 90]
        comp_end = [10, 100, -90]
        comp_mid = (np.array(comp_end) + np.array(comp_start)) / 2
        comp_length = np.sqrt(np.sum((np.array(comp_end) - np.array(comp_start)) ** 2))
        elec_y = np.linspace(-150, 150, 50)
        elec_x = np.linspace(-150, 150, 50)
        phi_LS = []
        phi_PS = []
        phi_PSi = []
        y = []
        x = []
        points = 200
        s = np.array(comp_end) - np.array(comp_start)
        ds = s / (points - 1)

        for x_pos in xrange(len(elec_x)):
            for y_pos in xrange(len(elec_y)):
                phi_PS.append(Moi.isotropic_moi(comp_mid, [elec_x[x_pos], elec_y[y_pos], -100]))
                delta = 0
                for step in xrange(points):
                    pos = comp_start + ds * (step)
                    delta += Moi.isotropic_moi(pos, [elec_x[x_pos], elec_y[y_pos], -100], imem=1.0 / (points + 1))
                phi_PSi.append(delta)

                x.append(elec_x[x_pos])
                y.append(elec_y[y_pos])
        x = np.array(x)
        y = np.array(y)
        cyth = LS_without_elec_mapping(
            set_up_parameters["sigma_T"],
            set_up_parameters["sigma_S"],
            -100,
            set_up_parameters["steps"],
            x,
            y,
            np.array([comp_start[0]]),
            np.array([comp_start[1]]),
            np.array([comp_start[2]]),
            np.array([comp_end[0]]),
            np.array([comp_end[1]]),
            np.array([comp_end[2]]),
        )
        import pylab as pl

        pl.subplot(411)

        pl.scatter(x, y, c=cyth[:, 0], s=2, edgecolors="none")
        pl.axis("equal")
        pl.colorbar()
        pl.subplot(412)
        pl.scatter(x, y, c=phi_PS, s=2, edgecolors="none")
        pl.axis("equal")
        pl.colorbar()
        pl.subplot(413)
        pl.scatter(x, y, c=phi_PSi, s=2, edgecolors="none")
        pl.axis("equal")
        pl.colorbar()

        pl.subplot(414)
        pl.scatter(x, y, c=(np.array(cyth[:, 0]) - np.array(phi_PSi)), s=1, edgecolors="none")
        pl.axis("equal")
        pl.colorbar()
        pl.savefig("line_source_test_cython.png")
Exemple #25
0
    def test_within_domain_check(self):
        """ Test if unvalid electrode or charge position raises RuntimeError.
        """
        set_up_parameters = {
            'sigma_G': 0.0,  # Below electrode
            'sigma_T': 0.3,  # Tissue
            'sigma_S': 3.0,  # Saline
            'slice_thickness': 200,
            'steps': 20
        }
        Moi = MoI(set_up_parameters=set_up_parameters)
        imem = 1.2
        a = set_up_parameters['slice_thickness'] / 2
        invalid_positions = [[0, 0, -a - 120], [0, 0, +a + 120]]
        valid_position = [0, 0, 0]

        with self.assertRaises(RuntimeError):
            Moi.in_domain(valid_position, [1, 0, 0])

        with self.assertRaises(RuntimeError):
            Moi.isotropic_moi(valid_position, valid_position)
            for pos in invalid_positions:
                with self.assertRaises(RuntimeError):
                    Moi.isotropic_moi(valid_position, pos)
                    Moi.isotropic_moi(pos, valid_position)

        xstart = np.array([100., 0, -100., -110])
        xend = np.array([100., 0, -100., -110]) + 100.

        ystart = np.array([100., 0, -100, 200.])
        yend = np.array([100., 0, -100, 200]) + 100.

        zstart = np.array([10, 0, -10, -50.])
        zend = np.array([10, 0, -10, -50]) + 10.

        xmid = np.array([100, 0, -100.])
        ymid = np.array([100, 0, -100.])
        zmid = np.array([10, 0, -10.])

        elec_x = (np.arange(3) - 1) * 50.
        elec_y = (np.arange(3) - 1) * 50.
        elec_z = -1
        n_avrg_points = 1
        elec_r = 1
        with self.assertRaises(RuntimeError):
            mapping = LS_with_elec_mapping(set_up_parameters['sigma_T'],
                                           set_up_parameters['sigma_S'],
                                           elec_z, set_up_parameters['steps'],
                                           n_avrg_points, elec_r, elec_x,
                                           elec_y, xstart, ystart, zstart,
                                           xend, yend, zend)
        with self.assertRaises(RuntimeError):
            mapping = LS_without_elec_mapping(set_up_parameters['sigma_T'],
                                              set_up_parameters['sigma_S'],
                                              elec_z,
                                              set_up_parameters['steps'],
                                              elec_x, elec_y, xstart, ystart,
                                              zstart, xend, yend, zend)

        with self.assertRaises(RuntimeError):
            mapping = PS_without_elec_mapping(set_up_parameters['sigma_T'],
                                              set_up_parameters['sigma_S'],
                                              elec_z,
                                              set_up_parameters['steps'],
                                              elec_x, elec_y, xmid, ymid, zmid)

        with self.assertRaises(RuntimeError):
            mapping = PS_with_elec_mapping(set_up_parameters['sigma_T'],
                                           set_up_parameters['sigma_S'],
                                           elec_z, set_up_parameters['steps'],
                                           n_avrg_points, elec_r, elec_x,
                                           elec_y, xmid, ymid, zmid)

        elec_z = -100
        zmid += 150
        zstart += 150
        zend += 150
        with self.assertRaises(RuntimeError):
            mapping = LS_with_elec_mapping(set_up_parameters['sigma_T'],
                                           set_up_parameters['sigma_S'],
                                           elec_z, set_up_parameters['steps'],
                                           n_avrg_points, elec_r, elec_x,
                                           elec_y, xstart, ystart, zstart,
                                           xend, yend, zend)
        with self.assertRaises(RuntimeError):
            mapping = LS_without_elec_mapping(set_up_parameters['sigma_T'],
                                              set_up_parameters['sigma_S'],
                                              elec_z,
                                              set_up_parameters['steps'],
                                              elec_x, elec_y, xstart, ystart,
                                              zstart, xend, yend, zend)

        with self.assertRaises(RuntimeError):
            mapping = PS_without_elec_mapping(set_up_parameters['sigma_T'],
                                              set_up_parameters['sigma_S'],
                                              elec_z,
                                              set_up_parameters['steps'],
                                              elec_x, elec_y, xmid, ymid, zmid)

        with self.assertRaises(RuntimeError):
            mapping = PS_with_elec_mapping(set_up_parameters['sigma_T'],
                                           set_up_parameters['sigma_S'],
                                           elec_z, set_up_parameters['steps'],
                                           n_avrg_points, elec_r, elec_x,
                                           elec_y, xmid, ymid, zmid)
Exemple #26
0
    def test_within_domain_check(self):
        """ Test if unvalid electrode or charge position raises RuntimeError.
        """
        set_up_parameters = {
            "sigma_G": 0.0,  # Below electrode
            "sigma_T": 0.3,  # Tissue
            "sigma_S": 3.0,  # Saline
            "slice_thickness": 200,
            "steps": 20,
        }
        Moi = MoI(set_up_parameters=set_up_parameters)
        imem = 1.2
        a = set_up_parameters["slice_thickness"] / 2
        invalid_positions = [[0, 0, -a - 120], [0, 0, +a + 120]]
        valid_position = [0, 0, 0]

        with self.assertRaises(RuntimeError):
            Moi.in_domain(valid_position, [1, 0, 0])

        with self.assertRaises(RuntimeError):
            Moi.isotropic_moi(valid_position, valid_position)
            for pos in invalid_positions:
                with self.assertRaises(RuntimeError):
                    Moi.isotropic_moi(valid_position, pos)
                    Moi.isotropic_moi(pos, valid_position)

        xstart = np.array([100.0, 0, -100.0, -110])
        xend = np.array([100.0, 0, -100.0, -110]) + 100.0

        ystart = np.array([100.0, 0, -100, 200.0])
        yend = np.array([100.0, 0, -100, 200]) + 100.0

        zstart = np.array([10, 0, -10, -50.0])
        zend = np.array([10, 0, -10, -50]) + 10.0

        xmid = np.array([100, 0, -100.0])
        ymid = np.array([100, 0, -100.0])
        zmid = np.array([10, 0, -10.0])

        elec_x = (np.arange(3) - 1) * 50.0
        elec_y = (np.arange(3) - 1) * 50.0
        elec_z = -1
        n_avrg_points = 1
        elec_r = 1
        with self.assertRaises(RuntimeError):
            mapping = LS_with_elec_mapping(
                set_up_parameters["sigma_T"],
                set_up_parameters["sigma_S"],
                elec_z,
                set_up_parameters["steps"],
                n_avrg_points,
                elec_r,
                elec_x,
                elec_y,
                xstart,
                ystart,
                zstart,
                xend,
                yend,
                zend,
            )
        with self.assertRaises(RuntimeError):
            mapping = LS_without_elec_mapping(
                set_up_parameters["sigma_T"],
                set_up_parameters["sigma_S"],
                elec_z,
                set_up_parameters["steps"],
                elec_x,
                elec_y,
                xstart,
                ystart,
                zstart,
                xend,
                yend,
                zend,
            )

        with self.assertRaises(RuntimeError):
            mapping = PS_without_elec_mapping(
                set_up_parameters["sigma_T"],
                set_up_parameters["sigma_S"],
                elec_z,
                set_up_parameters["steps"],
                elec_x,
                elec_y,
                xmid,
                ymid,
                zmid,
            )

        with self.assertRaises(RuntimeError):
            mapping = PS_with_elec_mapping(
                set_up_parameters["sigma_T"],
                set_up_parameters["sigma_S"],
                elec_z,
                set_up_parameters["steps"],
                n_avrg_points,
                elec_r,
                elec_x,
                elec_y,
                xmid,
                ymid,
                zmid,
            )

        elec_z = -100
        zmid += 150
        zstart += 150
        zend += 150
        with self.assertRaises(RuntimeError):
            mapping = LS_with_elec_mapping(
                set_up_parameters["sigma_T"],
                set_up_parameters["sigma_S"],
                elec_z,
                set_up_parameters["steps"],
                n_avrg_points,
                elec_r,
                elec_x,
                elec_y,
                xstart,
                ystart,
                zstart,
                xend,
                yend,
                zend,
            )
        with self.assertRaises(RuntimeError):
            mapping = LS_without_elec_mapping(
                set_up_parameters["sigma_T"],
                set_up_parameters["sigma_S"],
                elec_z,
                set_up_parameters["steps"],
                elec_x,
                elec_y,
                xstart,
                ystart,
                zstart,
                xend,
                yend,
                zend,
            )

        with self.assertRaises(RuntimeError):
            mapping = PS_without_elec_mapping(
                set_up_parameters["sigma_T"],
                set_up_parameters["sigma_S"],
                elec_z,
                set_up_parameters["steps"],
                elec_x,
                elec_y,
                xmid,
                ymid,
                zmid,
            )

        with self.assertRaises(RuntimeError):
            mapping = PS_with_elec_mapping(
                set_up_parameters["sigma_T"],
                set_up_parameters["sigma_S"],
                elec_z,
                set_up_parameters["steps"],
                n_avrg_points,
                elec_r,
                elec_x,
                elec_y,
                xmid,
                ymid,
                zmid,
            )
Exemple #27
0
    def atest_moi_line_source(self):
        """ Testing infinite isotropic moi line source formula"""
        set_up_parameters = {
            'sigma_G': 0.0,  # Below electrode
            'sigma_T': 0.3,  # Tissue
            'sigma_S': 3.0,  # Saline
            'slice_thickness': 200,
            'steps': 20
        }
        a = set_up_parameters['slice_thickness'] / 2.
        Moi = MoI(set_up_parameters=set_up_parameters)

        comp_start = [-50, -100, 90]
        comp_end = [10, 100, -90]
        comp_mid = (np.array(comp_end) + np.array(comp_start)) / 2
        comp_length = np.sqrt(
            np.sum((np.array(comp_end) - np.array(comp_start))**2))
        elec_y = np.linspace(-150, 150, 50)
        elec_x = np.linspace(-150, 150, 50)
        phi_LS = []
        phi_PS = []
        phi_PSi = []
        y = []
        x = []
        points = 200
        s = np.array(comp_end) - np.array(comp_start)
        ds = s / (points - 1)

        for x_pos in xrange(len(elec_x)):
            for y_pos in xrange(len(elec_y)):
                phi_PS.append(
                    Moi.isotropic_moi(comp_mid,
                                      [elec_x[x_pos], elec_y[y_pos], -100]))
                delta = 0
                for step in xrange(points):
                    pos = comp_start + ds * (step)
                    delta += Moi.isotropic_moi(\
                        pos, [elec_x[x_pos], elec_y[y_pos], -100], imem = 1./(points+1))
                phi_PSi.append(delta)

                x.append(elec_x[x_pos])
                y.append(elec_y[y_pos])
        x = np.array(x)
        y = np.array(y)
        cyth = LS_without_elec_mapping(set_up_parameters['sigma_T'],
                                       set_up_parameters['sigma_S'], -100,
                                       set_up_parameters['steps'], x, y,
                                       np.array([comp_start[0]]),
                                       np.array([comp_start[1]]),
                                       np.array([comp_start[2]]),
                                       np.array([comp_end[0]]),
                                       np.array([comp_end[1]]),
                                       np.array([comp_end[2]]))
        import pylab as pl
        pl.subplot(411)

        pl.scatter(x, y, c=cyth[:, 0], s=2, edgecolors='none')
        pl.axis('equal')
        pl.colorbar()
        pl.subplot(412)
        pl.scatter(x, y, c=phi_PS, s=2, edgecolors='none')
        pl.axis('equal')
        pl.colorbar()
        pl.subplot(413)
        pl.scatter(x, y, c=phi_PSi, s=2, edgecolors='none')
        pl.axis('equal')
        pl.colorbar()

        pl.subplot(414)
        pl.scatter(x,
                   y,
                   c=(np.array(cyth[:, 0]) - np.array(phi_PSi)),
                   s=1,
                   edgecolors='none')
        pl.axis('equal')
        pl.colorbar()
        pl.savefig('line_source_test_cython.png')
Exemple #28
0
    def test_cython_mapping(self):

        set_up_parameters = {
            'sigma_G': 0.0,  # Below electrode
            'sigma_T': 0.3,  # Tissue
            'sigma_S': 0.3,  # Saline
            'slice_thickness': 200.,
            'steps': 20
        }

        xstart = np.array([100., 0, -100., -110])
        xend = np.array([100., 0, -100., -110]) + 100.

        ystart = np.array([100., 0, -100, 200.])
        yend = np.array([100., 0, -100, 200]) + 100.

        zstart = np.array([10, 0, -10, -50.])
        zend = np.array([10, 0, -10, -50]) + 10.

        xmid = xstart
        ymid = ystart
        zmid = zstart

        elec_x = (np.arange(3) - 1) * 50.
        elec_y = (np.arange(3) - 1) * 50.

        #elec_x = np.array([0.])
        #elec_y = np.array([0.])

        elec_z = -set_up_parameters['slice_thickness'] / 2.
        elec_r = 1
        n_avrg_points = 100

        ext_sim_dict = {
            'elec_x': elec_x,
            'elec_y': elec_y,
            'elec_z': elec_z,
            'include_elec': False,
            'use_line_source': False,
            'moi_steps': set_up_parameters['steps'],
            'n_avrg_points': n_avrg_points,
            'elec_radius': elec_r
        }
        moi = MoI(set_up_parameters=set_up_parameters)
        mapping = moi.make_mapping_standalone(ext_sim_dict,
                                              xstart=xstart,
                                              ystart=ystart,
                                              zstart=zstart,
                                              xend=xend,
                                              yend=yend,
                                              zend=zend,
                                              xmid=xmid,
                                              ymid=ymid,
                                              zmid=zmid)

        mapping2 = moi.make_mapping_cython(ext_sim_dict,
                                           xstart=xstart,
                                           ystart=ystart,
                                           zstart=zstart,
                                           xend=xend,
                                           yend=yend,
                                           zend=zend,
                                           xmid=xmid,
                                           ymid=ymid,
                                           zmid=zmid)

        error = np.abs((mapping - mapping2) / mapping2)

        self.assertLessEqual(np.max(error), 0.001)
Exemple #29
0
    def test_cython_mapping(self):

        set_up_parameters = {
            "sigma_G": 0.0,  # Below electrode
            "sigma_T": 0.3,  # Tissue
            "sigma_S": 0.3,  # Saline
            "slice_thickness": 200.0,
            "steps": 20,
        }

        xstart = np.array([100.0, 0, -100.0, -110])
        xend = np.array([100.0, 0, -100.0, -110]) + 100.0

        ystart = np.array([100.0, 0, -100, 200.0])
        yend = np.array([100.0, 0, -100, 200]) + 100.0

        zstart = np.array([10, 0, -10, -50.0])
        zend = np.array([10, 0, -10, -50]) + 10.0

        xmid = xstart
        ymid = ystart
        zmid = zstart

        elec_x = (np.arange(3) - 1) * 50.0
        elec_y = (np.arange(3) - 1) * 50.0

        # elec_x = np.array([0.])
        # elec_y = np.array([0.])

        elec_z = -set_up_parameters["slice_thickness"] / 2.0
        elec_r = 1
        n_avrg_points = 100

        ext_sim_dict = {
            "elec_x": elec_x,
            "elec_y": elec_y,
            "elec_z": elec_z,
            "include_elec": False,
            "use_line_source": False,
            "moi_steps": set_up_parameters["steps"],
            "n_avrg_points": n_avrg_points,
            "elec_radius": elec_r,
        }
        moi = MoI(set_up_parameters=set_up_parameters)
        mapping = moi.make_mapping_standalone(
            ext_sim_dict,
            xstart=xstart,
            ystart=ystart,
            zstart=zstart,
            xend=xend,
            yend=yend,
            zend=zend,
            xmid=xmid,
            ymid=ymid,
            zmid=zmid,
        )

        mapping2 = moi.make_mapping_cython(
            ext_sim_dict,
            xstart=xstart,
            ystart=ystart,
            zstart=zstart,
            xend=xend,
            yend=yend,
            zend=zend,
            xmid=xmid,
            ymid=ymid,
            zmid=zmid,
        )

        error = np.abs((mapping - mapping2) / mapping2)

        self.assertLessEqual(np.max(error), 0.001)