예제 #1
0
    def generate_predictions(self, N):
        """Generate some reflections."""
        from dials.algorithms import filtering
        from dials.algorithms.profile_model.gaussian_rs import MaskCalculator3D
        from dials.algorithms.profile_model.gaussian_rs import Model as ProfileModel
        from dials.algorithms.shoebox import MaskCode
        from dials.util.command_line import Command

        # Set the profile model
        self.experiment.profile = ProfileModel(None, self.n_sigma,
                                               self.sigma_b, self.sigma_m)

        # Generate a list of reflections
        refl = flex.reflection_table.from_predictions(self.experiment)
        refl["id"] = flex.int(len(refl), 0)

        # Filter by zeta
        zeta = 0.05
        Command.start(f"Filtering by zeta >= {zeta:f}")
        mask = filtering.by_zeta(self.experiment.goniometer,
                                 self.experiment.beam, refl["s1"], zeta)
        refl.del_selected(~mask)
        Command.end(f"Filtered {len(refl)} reflections by zeta >= {zeta:f}")

        # Compute the bounding box
        refl.compute_bbox([self.experiment])
        index = []
        image_size = self.experiment.detector[0].get_image_size()
        array_range = self.experiment.scan.get_array_range()
        bbox = refl["bbox"]
        for i in range(len(refl)):
            x0, x1, y0, y1, z0, z1 = bbox[i]
            if (x0 < 0 or x1 > image_size[0] or y0 < 0 or y1 > image_size[1]
                    or z0 < array_range[0] or z1 > array_range[1]):
                index.append(i)
        refl.del_selected(flex.size_t(index))

        # Sample if specified
        index = random.sample(range(len(refl)), N)
        refl = refl.select(flex.size_t(index))

        # Compute the bounding box
        # Create a load of shoeboxes
        Command.start(f"Creating shoeboxes for {len(refl)} reflections")
        refl["shoebox"] = flex.shoebox(refl["panel"], refl["bbox"])
        refl["shoebox"].allocate_with_value(MaskCode.Valid)
        Command.end(f"Created shoeboxes for {len(refl)} reflections")

        # Get the function object to mask the foreground
        Command.start(f"Masking Foreground for {len(refl)} reflections")
        mask_foreground = MaskCalculator3D(
            self.experiment.beam,
            self.experiment.detector,
            self.experiment.goniometer,
            self.experiment.scan,
            self.n_sigma * self.sigma_b,
            self.n_sigma * self.sigma_m,
        )

        # Mask the foreground
        mask_foreground(refl["shoebox"], refl["s1"],
                        refl["xyzcal.px"].parts()[2], refl["panel"])
        Command.end(f"Masked foreground for {len(refl)} reflections")

        # Return the reflections
        return refl
예제 #2
0
class Test(object):
    def __init__(self):
        from os.path import join, isfile
        import libtbx.load_env
        try:
            dials_regression = libtbx.env.dist_path('dials_regression')
        except KeyError, e:
            print 'SKIP: dials_regression not configured'
            exit(0)

        # The base path
        path = join(dials_regression, 'integration_test_data', 'simulated')

        # Set the experiment filename
        expr_filename = join(path, 'experiments.json')

        # The reference spots filesname
        reference_filename = join(path, 'simulated_n10000_i10000_b0.pickle')

        # The paths to the reflection files
        self.refl_filenames = [
            #join(path, 'simulated_n10000_i0_b10.pickle'),
            #join(path, 'simulated_n10000_i0_b100.pickle'),
            #join(path, 'simulated_n10000_i0_b1000.pickle'),
            #join(path, 'simulated_r_n10000_i0_b1000.pickle'),

            #join(path, 'simulated_n10000_i10_b0.pickle'),
            #join(path, 'simulated_n10000_i100_b0.pickle'),
            #join(path, 'simulated_n10000_i1000_b0.pickle'),
            #join(path, 'simulated_r_n10000_i10000_b0.pickle'),
            join(path, 'simulated_n10000_i10_b10.pickle'),
            join(path, 'simulated_n10000_i100_b10.pickle'),
            join(path, 'simulated_n10000_i1000_b10.pickle'),
            join(path, 'simulated_n10000_i10000_b10.pickle'),
            join(path, 'simulated_r_n10000_i10000_b10.pickle'),
            join(path, 'simulated_n10000_i10_b100.pickle'),
            join(path, 'simulated_n10000_i100_b100.pickle'),
            join(path, 'simulated_n10000_i1000_b100.pickle'),
            join(path, 'simulated_n10000_i10000_b100.pickle'),
            join(path, 'simulated_r_n10000_i10000_b100.pickle'),
        ]

        # Check the files exist
        for filename in self.refl_filenames:
            if not isfile(filename):
                print 'SKIP: simulated test data does not exist'
                print 'Generate by running the following commands:'
                print ' cd dials_regression/integration_test_data/simulated'
                print ' ./simulate'
                exit(0)

        # Load the experiments
        from dxtbx.model.experiment.experiment_list import ExperimentListFactory
        experiments = ExperimentListFactory.from_json_file(expr_filename,
                                                           check_format=False)
        assert (len(experiments) == 1)
        self.experiments = experiments

        from dials.algorithms.profile_model.gaussian_rs import Model as ProfileModel
        from dials.algorithms.profile_model.factory import phil_scope
        from libtbx.phil import parse
        params = phil_scope.fetch(parse('')).extract()
        self.experiments[0].profile = ProfileModel(params.profile,
                                                   sigma_b=0.024,
                                                   sigma_m=0.044,
                                                   n_sigma=3,
                                                   deg=True)

        # Load the reference spots
        from dials.array_family import flex
        self.reference = flex.reflection_table.from_pickle(reference_filename)
        self.reference.compute_partiality(self.experiments)
        mask = flex.bool(len(self.reference), True)
        value = self.reference.flags.reference_spot
        self.reference.set_flags(mask, value)
        self.reference.set_flags(mask, self.reference.flags.integrated_sum)