Ejemplo n.º 1
0
    def test_read_tiff(self):
        """Test of TIFFReaderWriter reading"""
        srw = em2d.SpiderImageReaderWriter()
        trw = em2d.TIFFImageReaderWriter()
        fn_tif_img = self.get_input_file_name("lena-256x256.tif")
        tif_img=em2d.Image(fn_tif_img,trw)
        fn_spider_img = self.get_input_file_name("lena-256x256.spi")
        spider_img=em2d.Image(fn_spider_img,srw)
        rows =int( tif_img.get_header().get_number_of_rows())
        cols = int(tif_img.get_header().get_number_of_columns())

        self.assertEqual(spider_img.get_header().get_number_of_rows(),rows)
        self.assertEqual(spider_img.get_header().get_number_of_columns(),cols)
        ccc=em2d.get_cross_correlation_coefficient(tif_img.get_data(),
                                                  spider_img.get_data())
        self.assertAlmostEqual(ccc,1,delta=0.01,msg="ccc ins not 1")
Ejemplo n.º 2
0
    def test_read_tiff(self):
        """Test of TIFFReaderWriter reading"""
        srw = em2d.SpiderImageReaderWriter()
        trw = em2d.TIFFImageReaderWriter()
        fn_tif_img = self.get_input_file_name("lena-256x256.tif")
        tif_img = em2d.Image(fn_tif_img, trw)
        fn_spider_img = self.get_input_file_name("lena-256x256.spi")
        spider_img = em2d.Image(fn_spider_img, srw)
        rows = int(tif_img.get_header().get_number_of_rows())
        cols = int(tif_img.get_header().get_number_of_columns())

        self.assertEqual(spider_img.get_header().get_number_of_rows(), rows)
        self.assertEqual(spider_img.get_header().get_number_of_columns(), cols)
        ccc = em2d.get_cross_correlation_coefficient(tif_img.get_data(),
                                                     spider_img.get_data())
        self.assertAlmostEqual(ccc, 1, delta=0.01, msg="ccc ins not 1")
Ejemplo n.º 3
0
 def test_write_jpg(self):
     """Test of JPGReaderWriter writing"""
     jrw = em2d.JPGImageReaderWriter()
     fn_img1 = self.get_input_file_name("lena-256x256.jpg")
     img1=em2d.Image(fn_img1,jrw)
     fn_img2 = self.get_input_file_name("temp.jpg")
     img1.write(fn_img2,jrw)
     img2 = em2d.Image(fn_img2,jrw)
     # Use the ccc for testing instead of the pixel values. The matrix
     # in img2 is transformed from floats to ints son it can be written.
     # Values can change, but the ccc has to be very close to 1.
     ccc= em2d.get_cross_correlation_coefficient(img1.get_data(),
                                        img2.get_data())
     self.assertAlmostEqual(ccc,1,delta=0.05,
     msg="Written JPG image is not equal to read ")
     os.remove(fn_img2)
Ejemplo n.º 4
0
 def test_write_jpg(self):
     """Test of JPGReaderWriter writing"""
     jrw = em2d.JPGImageReaderWriter()
     fn_img1 = self.get_input_file_name("lena-256x256.jpg")
     img1 = em2d.Image(fn_img1, jrw)
     fn_img2 = "temp.jpg"
     img1.write(fn_img2, jrw)
     img2 = em2d.Image(fn_img2, jrw)
     # Use the ccc for testing instead of the pixel values. The matrix
     # in img2 is transformed from floats to ints son it can be written.
     # Values can change, but the ccc has to be very close to 1.
     ccc = em2d.get_cross_correlation_coefficient(img1.get_data(),
                                                  img2.get_data())
     self.assertAlmostEqual(ccc, 1, delta=0.05,
                            msg="Written JPG image is not equal to read ")
     os.remove(fn_img2)
Ejemplo n.º 5
0
 def test_write_tiff(self):
     """Test of TIFFReaderWriter writing"""
     trw = em2d.TIFFImageReaderWriter()
     srw = em2d.SpiderImageReaderWriter()
     fn_img1 = self.get_input_file_name("lena-256x256.tif")
     img1=em2d.Image(fn_img1,trw)
     fn_img2 = "temp.tif"
     img1.write(fn_img2,trw)
     img2 = em2d.Image(fn_img2,trw)
     # Use the ccc for testing instead of the pixel values. The matrix
     # in img2 is transformed from floats to ints son it can be written.
     # Values can change, but the ccc has to be very close to 1.
     ccc= em2d.get_cross_correlation_coefficient(img1.get_data(),
                                        img2.get_data())
     print ccc
     self.assertAlmostEqual(ccc,1,delta=0.01,
     msg="Written TIFF image is not equal to read ")
     os.remove(fn_img2)
Ejemplo n.º 6
0
    def test_noisy_projections(self):
        """ Test the generation of noisy projections"""
        smodel = IMP.kernel.Model()
        ssel = IMP.atom.ATOMPDBSelector()
        fn_model = self.get_input_file_name("1e6v.pdb")
        prot = IMP.atom.read_pdb(fn_model, smodel, ssel)
        particles = IMP.core.get_leaves(prot)
        n_projections = 16
        rows = 100
        cols = 100
        resolution = 1
        apix = 1.5
        noise_SNR = 0.5
        # read the stored noisy images
        stored_names = []
        srw = em2d.SpiderImageReaderWriter()
        for i in range(0, n_projections):
            fn_subject = "1e6v-subject-%d-set-%d-%s-apix" \
                "-%s-SNR.spi" % (i, n_projections, str(apix), str(noise_SNR))
            stored_names.append(self.get_input_file_name(fn_subject))
        stored_images = em2d.read_images(stored_names, srw)

        # Read registration parameters and generate new images
        fn_regs = self.get_input_file_name('1e6v-subjects-0.5.params')
        Regs = em2d.read_registration_results(fn_regs)
        options = em2d.ProjectingOptions(apix, resolution)
        projections = em2d.get_projections(particles, Regs, rows, cols,
                                           options)
        # Add noise
        for i in range(0, n_projections):
            em2d.do_normalize(projections[i], True)
            em2d.add_noise(projections[i], 0.0, 1. / (noise_SNR**0.5),
                           "gaussian", 3)
        # theoretical ccc for same images at a level of noise
        theoretical_ccc = noise_SNR / (noise_SNR + 1)
        for n in range(0, n_projections):
            ccc = em2d.get_cross_correlation_coefficient(
                projections[n], stored_images[n])
            # allow 3% difference in cross-correlation
            self.assertAlmostEqual(
                theoretical_ccc,
                ccc,
                delta=0.03,
                msg="Noisy projections generated and stored are different")
Ejemplo n.º 7
0
    def test_noisy_projections(self):
        """ Test the generation of noisy projections"""
        smodel = IMP.kernel.Model()
        ssel = IMP.atom.ATOMPDBSelector()
        fn_model = self.get_input_file_name("1e6v.pdb")
        prot = IMP.atom.read_pdb(fn_model, smodel, ssel)
        particles = IMP.core.get_leaves(prot)
        n_projections = 16
        rows = 100
        cols = 100
        resolution = 1
        apix = 1.5
        noise_SNR = 0.5
        # read the stored noisy images
        stored_names = []
        srw = em2d.SpiderImageReaderWriter()
        for i in range(0, n_projections):
            fn_subject = "1e6v-subject-%d-set-%d-%s-apix" \
                "-%s-SNR.spi" % (i, n_projections, str(apix), str(noise_SNR))
            stored_names.append(self.get_input_file_name(fn_subject))
        stored_images = em2d.read_images(stored_names, srw)

        # Read registration parameters and generate new images
        fn_regs = self.get_input_file_name('1e6v-subjects-0.5.params')
        Regs = em2d.read_registration_results(fn_regs)
        options = em2d.ProjectingOptions(apix, resolution)
        projections = em2d.get_projections(particles, Regs,
                                           rows, cols, options)
        # Add noise
        for i in range(0, n_projections):
            em2d.do_normalize(projections[i], True)
            em2d.add_noise(projections[i],
                           0.0, 1. / (noise_SNR ** 0.5), "gaussian", 3)
        # theoretical ccc for same images at a level of noise
        theoretical_ccc = noise_SNR / (noise_SNR + 1)
        for n in range(0, n_projections):
            ccc = em2d.get_cross_correlation_coefficient(projections[n],
                                                         stored_images[n])
             # allow 3% difference in cross-correlation
            self.assertAlmostEqual(theoretical_ccc, ccc, delta=0.03,
                                   msg="Noisy projections generated and stored are different")
Ejemplo n.º 8
0
    def test_registration(self):
        """Test the registration of 3 subjects from 1gyt.pdb at 0.5 SNR"""
        # Get model from PDB file
        smodel = IMP.Model()
        ssel = IMP.atom.ATOMPDBSelector()
        fn_model = self.get_input_file_name("1gyt.pdb")
        prot = IMP.atom.read_pdb(fn_model, smodel, ssel)
        particles = IMP.core.get_leaves(prot)
        # Read subject images
        srw = em2d.SpiderImageReaderWriter()
        selection_file = self.get_input_file_name("1gyt-subjects-0.5-SNR.sel")
        images_to_read_names = em2d.read_selection_file(selection_file)
        for i in range(0, len(images_to_read_names)):
            images_to_read_names[i] = self.get_input_file_name(
                images_to_read_names[i])
        subjects = em2d.read_images(images_to_read_names, srw)
        self.assertEqual(len(subjects), 3, "Problem reading subject images")

        # Generate 20 evenly distributed projections from the PDB file
        n_projections = 20
        proj_params = em2d.get_evenly_distributed_registration_results(
            n_projections)
        rows = 128
        cols = 128
        pixel_size = 1.5
        # for generating projections, use a very high resolution
        resolution = 8.5
        options = em2d.ProjectingOptions(pixel_size, resolution)
        projections = em2d.get_projections(particles, proj_params, rows, cols,
                                           options)
        self.assertEqual(len(projections), n_projections,
                         "Problem generating projections")
        # Prepare registration
        # IMP.set_log_level(IMP.VERBOSE)
        finder = em2d.ProjectionFinder()
        score_function = em2d.EM2DScore()

        params = em2d.Em2DRestraintParameters(pixel_size, resolution,
                                              n_projections)
        params.save_match_images = False
        params.coarse_registration_method = em2d.ALIGN2D_PREPROCESSING
        params.optimization_steps = 30
        params.simplex_initial_length = 0.1
        params.simplex_minimum_size = 0.01

        finder.setup(score_function, params)
        finder.set_model_particles(particles)
        finder.set_subjects(subjects)
        finder.set_projections(projections)
        finder.set_fast_mode(2)
        finder.get_complete_registration()
        # Recover the registration results:
        registration_parameters = finder.get_registration_results()
        fn_registration_results = "my_1gyt_registration.params"
        em2d.write_registration_results(fn_registration_results,
                                        registration_parameters)
        # Read the correct registration results:
        correct_parameters = em2d.read_registration_results(
            self.get_input_file_name("1gyt-subjects-0.5-SNR.params"))

        print("determined: ")
        for r in registration_parameters:
            print(r.get_rotation(), r.get_shift())
        print("correct: ")
        for r in correct_parameters:
            print(r.get_rotation(), r.get_shift())
        for i in range(0, len(registration_parameters)):
            # Generate the registered projection
            imgx = em2d.Image()
            imgx.set_size(rows, cols)
            em2d.get_projection(imgx, particles, registration_parameters[i],
                                options)
            ccc = em2d.get_cross_correlation_coefficient(
                subjects[i].get_data(), imgx.get_data())
            print(i, "ccc", ccc)
            snr = 0.5
            theoretical_ccc = (snr / (1. + snr))**.5
            self.assertAlmostEqual(
                ccc,
                theoretical_ccc,
                delta=0.02,
                msg="Error in registration of subject %d: ccc %8.3f "
                "theoretical_ccc %8.3f " % (i, ccc, theoretical_ccc))
        os.remove(fn_registration_results)
    def test_registration(self):
        """Test the registration of 3 subjects from 1gyt.pdb at 0.5 SNR"""
        # Get model from PDB file
        smodel = IMP.Model()
        ssel = IMP.atom.ATOMPDBSelector()
        fn_model = self.get_input_file_name("1gyt.pdb")
        prot = IMP.atom.read_pdb(fn_model, smodel, ssel)
        particles = IMP.core.get_leaves(prot)
        # Read subject images
        srw = em2d.SpiderImageReaderWriter()
        selection_file = self.get_input_file_name("1gyt-subjects-0.5-SNR.sel")
        images_to_read_names = em2d.read_selection_file(selection_file)
        for i in range(0, len(images_to_read_names)):
            images_to_read_names[i] = self.get_input_file_name(
                images_to_read_names[i])
        subjects = em2d.read_images(images_to_read_names, srw)
        self.assertEqual(len(subjects), 3, "Problem reading subject images")

        # Generate 20 evenly distributed projections from the PDB file
        n_projections = 20
        proj_params = em2d.get_evenly_distributed_registration_results(
            n_projections)
        rows = 128
        cols = 128
        pixel_size = 1.5
        # for generating projections, use a very high resolution
        resolution = 1
        options = em2d.ProjectingOptions(pixel_size, resolution)
        projections = em2d.get_projections(particles, proj_params,
                                           rows, cols, options)
        self.assertEqual(len(projections), n_projections,
                         "Problem generating projections")
        # Prepare registration
        # IMP.set_log_level(IMP.VERBOSE)
        finder = em2d.ProjectionFinder()
        score_function = em2d.EM2DScore()

        params = em2d.Em2DRestraintParameters(pixel_size,
                                              resolution, n_projections)
        params.save_match_images = False
        params.coarse_registration_method = em2d.ALIGN2D_PREPROCESSING
        params.optimization_steps = 30
        params.simplex_initial_length = 0.1
        params.simplex_minimum_size = 0.01

        finder.setup(score_function, params)
        finder.set_model_particles(particles)
        finder.set_subjects(subjects)
        finder.set_projections(projections)
        finder.set_fast_mode(2)
        finder.get_complete_registration()
        # Recover the registration results:
        registration_parameters = finder.get_registration_results()
        fn_registration_results = "my_1gyt_registration.params"
        em2d.write_registration_results(fn_registration_results,
                                        registration_parameters)
        # Read the correct registration results:
        correct_parameters = em2d.read_registration_results(
            self.get_input_file_name("1gyt-subjects-0.5-SNR.params"))

        print("determined: ")
        for r in registration_parameters:
            print(r.get_rotation(), r.get_shift())
        print("correct: ")
        for r in correct_parameters:
            print(r.get_rotation(), r.get_shift())
        for i in range(0, len(registration_parameters)):
            # Generate the registered projection
            imgx = em2d.Image()
            imgx.set_size(rows, cols)
            em2d.get_projection(imgx, particles,
                                registration_parameters[i], options)
            ccc = em2d.get_cross_correlation_coefficient(
                subjects[i].get_data(),
                imgx.get_data())
            print(i, "ccc", ccc)
            snr = 0.5
            theoretical_ccc = (snr / (1. + snr)) ** .5
            self.assertAlmostEqual(ccc, theoretical_ccc, delta=0.02,
                                   msg="Error in registration of subject %d: ccc %8.3f "
                                   "theoretical_ccc %8.3f " % (i, ccc, theoretical_ccc))
        os.remove(fn_registration_results)