Esempio n. 1
0
def generate_spots(crystal_model,
                   detector,
                   beam,
                   goniometer=None,
                   scan=None,
                   sel_fraction=1.0):
    import math

    experiment = Experiment(beam=beam,
                            detector=detector,
                            goniometer=goniometer,
                            scan=scan,
                            crystal=crystal_model)

    # if we don't set the imageset then from_predictions uses the StillsReflectionPredictor :-(
    from dxtbx.imageset import NullReader, ImageSweep
    imageset = ImageSweep(NullReader,
                          indices=range(len(scan.get_epochs())),
                          beam=beam,
                          goniometer=goniometer,
                          detector=detector,
                          scan=scan)
    experiment.imageset = imageset

    predicted = flex.reflection_table.from_predictions(experiment)

    sel = flex.random_selection(len(predicted),
                                int(math.floor(sel_fraction * len(predicted))))
    predicted = predicted.select(sel)
    predicted['imageset_id'] = flex.size_t(len(predicted), 0)
    predicted['xyzobs.px.value'] = predicted['xyzcal.px']
    predicted['xyzobs.px.variance'] = flex.vec3_double(len(predicted),
                                                       (0.5, 0.5, 0.5))
    return predicted
Esempio n. 2
0
def generate_spots(crystal_model,
                   detector,
                   beam,
                   goniometer=None,
                   scan=None,
                   sel_fraction=1.0):

    experiment = Experiment(beam=beam,
                            detector=detector,
                            goniometer=goniometer,
                            scan=scan,
                            crystal=crystal_model)

    # if we don't set the imageset then from_predictions uses the StillsReflectionPredictor :-(
    filenames = [""] * len(scan)
    reader = Reader(filenames)
    masker = Masker(filenames)
    data = ImageSetData(reader, masker)
    imageset = ImageSweep(data, beam, detector, goniometer, scan)
    experiment.imageset = imageset

    predicted = flex.reflection_table.from_predictions(experiment)

    sel = flex.random_selection(len(predicted),
                                int(math.floor(sel_fraction * len(predicted))))
    predicted = predicted.select(sel)
    predicted['imageset_id'] = flex.size_t(len(predicted), 0)
    predicted['xyzobs.px.value'] = predicted['xyzcal.px']
    predicted['xyzobs.px.variance'] = flex.vec3_double(len(predicted),
                                                       (0.5, 0.5, 0.5))
    return predicted
Esempio n. 3
0
    def as_explist(self):
        """
    return experiment list for simulated image
    """
        exp = Experiment()
        exp.crystal = self.crystal
        exp.beam = self.beam
        exp.detector = self.detector
        exp.imageset = self.imageset
        explist = ExperimentList()
        explist.append(exp)

        return explist
Esempio n. 4
0
    def as_explist(self, fname=None, toggle_conventions=False):
        """
    return experiment list for simulated image
    """
        C = self.crystal
        if toggle_conventions:
            # switch to DIALS convention before writing CBF
            # also change basis of crystal
            CURRENT_CONV = self.beamcenter_convention
            FSO = sqr(self.fdet_vector + self.sdet_vector +
                      self.pix0_vector_mm)
            self.beamcenter_convention = DIALS
            FSO2 = sqr(self.fdet_vector + self.sdet_vector +
                       self.dials_origin_mm)
            xtal_transform = FSO.inverse() * FSO2

            # transform the crystal vectors
            a, b, c = map(lambda x: xtal_transform * col(x),
                          C.get_real_space_vectors())
            Cdict = C.to_dict()
            Cdict['real_space_a'] = a
            Cdict['real_space_b'] = b
            Cdict['real_space_b'] = c
            C = CrystalFactory.from_dict(Cdict)

        exp = Experiment()
        exp.crystal = C
        exp.beam = self.beam
        exp.detector = self.detector
        exp.imageset = self.imageset
        explist = ExperimentList()
        explist.append(exp)
        if fname is not None:
            explist.as_file(fname)
        if toggle_conventions:
            self.beamcenter_convention = CURRENT_CONV

        return explist
Esempio n. 5
0
        # update the background pixel selection with the expanded integration mask
        is_bg_pixel[i_panel, j1:j2,
                    i1:i2] = ~np.logical_or(~bg, expanded_integration_mask)

    # <><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><>
    #   RUN THE TILT PLANE HELPER FUNCTION
    # 1. Weighted fit of the background tilt plane
    # 2. Updates prediction reflection table with miller indices, and shoeboxes
    # 3. Updates prediction reflections with integrations and integration variances
    #    using Leslie 99
    # <><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><>
    exper = Experiment()
    exper.detector = DET
    exper.beam = BEAM
    exper.crystal = crystal
    exper.imageset = iset  # Exper.imageset

    if not args.oldway:
        refls_predict = TiltPlanes.prep_relfs_for_tiltalization(refls_predict,
                                                                exper=exper)

        tiltnation = TiltPlanes(panel_imgs=img_data,
                                panel_bg_masks=is_bg_pixel,
                                panel_badpix_masks=None)
        tiltnation.check_if_refls_are_formatted_for_this_class(refls_predict)
        tiltnation.make_quick_bad_pixel_proximity_checker(refls_predict)
        tiltnation.sigma_rdout = sigma_readout
        tiltnation.adu_per_photon = GAIN
        tiltnation.delta_Q = args.deltaq  #0.085
        tiltnation.zinger_zscore = args.Z
        detector_node = DET[
Esempio n. 6
0
    #    crystal=cryst_model,
    #    thresh=0,
    #    filter=scipy.ndimage.filters.gaussian_filter, sigma=1)

    # save the crystal models and other data for later use and debugging

    reflsA = refls_strong.select(
        flex.bool(np.logical_and(best == 0, d / .10992 < 5)))

    reflsB = refls_strong.select(
        flex.bool(np.logical_and(best == 1, d / .10992 < 5)))

    eA = Experiment()
    eA.beam = beamA
    eA.detector = detector
    eA.imageset = iset
    eA.crystal = cryst_model

    eB = Experiment()
    eB.beam = beamB
    eB.detector = detector
    eB.imageset = iset
    eB.crystal = cryst_model

    EL = ExperimentList()
    EL.append(eA)
    EL.append(eB)

    exp_json = os.path.join(out_dir, "expAB_%d.json" % idx)
    reflA_pkl = os.path.join(out_dir, "reflA_%d.pkl" % idx)
    reflB_pkl = os.path.join(out_dir, "reflB_%d.pkl" % idx)
    def split_for_scan_range(self, experiments, reference, scan_range):
        """ Update experiments when scan range is set. """
        from dxtbx.model.experiment_list import ExperimentList
        from dxtbx.model.experiment_list import Experiment

        # Only do anything is the scan range is set
        if scan_range is not None and len(scan_range) > 0:

            # Ensure that all experiments have the same imageset and scan
            iset = [e.imageset for e in experiments]
            scan = [e.scan for e in experiments]
            assert all(x == iset[0] for x in iset)
            assert all(x == scan[0] for x in scan)

            # Get the imageset and scan
            iset = experiments[0].imageset
            scan = experiments[0].scan

            # Get the array range
            if scan is not None:
                frames_start, frames_end = scan.get_array_range()
                assert scan.get_num_images() == len(iset)
            else:
                frames_start, frames_end = (0, len(iset))

            # Create the new lists
            new_experiments = ExperimentList()
            new_reference_all = reference.split_by_experiment_id()
            new_reference = flex.reflection_table()
            for i in range(len(new_reference_all) - len(experiments)):
                new_reference_all.append(flex.reflection_table())
            assert len(new_reference_all) == len(experiments)

            # Loop through all the scan ranges and create a new experiment list with
            # the requested scan ranges.
            for scan_start, scan_end in scan_range:
                # Validate the requested scan range
                if scan_end == scan_start:
                    raise Sorry(
                        "Scan range end must be higher than start; pass {},{} for single image"
                        .format(scan_start, scan_start + 1))
                if scan_end < scan_start:
                    raise Sorry("Scan range must be in ascending order")
                elif scan_start < frames_start or scan_end > frames_end:
                    raise Sorry(
                        "Scan range must be within image range {}..{}".format(
                            frames_start, frames_end))

                assert scan_end > scan_start
                assert scan_start >= frames_start
                assert scan_end <= frames_end

                index_start = scan_start - frames_start
                index_end = index_start + (scan_end - scan_start)
                assert index_start < index_end
                assert index_start >= 0
                assert index_end <= len(iset)
                new_iset = iset[index_start:index_end]
                if scan is None:
                    new_scan = None
                else:
                    new_scan = scan[index_start:index_end]
                for i, e1 in enumerate(experiments):
                    e2 = Experiment()
                    e2.beam = e1.beam
                    e2.detector = e1.detector
                    e2.goniometer = e1.goniometer
                    e2.crystal = e1.crystal
                    e2.profile = e1.profile
                    e2.imageset = new_iset
                    e2.scan = new_scan
                    new_reference_all[i]["id"] = flex.int(
                        len(new_reference_all[i]), len(new_experiments))
                    new_reference.extend(new_reference_all[i])
                    new_experiments.append(e2)
            experiments = new_experiments
            reference = new_reference

            # Print some information
            logger.info(
                "Modified experiment list to integrate over requested scan range"
            )
            for scan_start, scan_end in scan_range:
                logger.info(" scan_range = %d -> %d" % (scan_start, scan_end))
            logger.info("")

        # Return the experiments
        return experiments, reference
Esempio n. 8
0
    def split_for_scan_range(self, experiments, reference, scan_range):
        ''' Update experiments when scan range is set. '''
        from dxtbx.model.experiment_list import ExperimentList
        from dxtbx.model.experiment_list import Experiment
        from dials.array_family import flex

        # Only do anything is the scan range is set
        if scan_range is not None and len(scan_range) > 0:

            # Ensure that all experiments have the same imageset and scan
            iset = [e.imageset for e in experiments]
            scan = [e.scan for e in experiments]
            assert (all(x == iset[0] for x in iset))
            assert (all(x == scan[0] for x in scan))

            # Get the imageset and scan
            iset = experiments[0].imageset
            scan = experiments[0].scan

            # Get the array range
            if scan is not None:
                frame10, frame11 = scan.get_array_range()
                assert (scan.get_num_images() == len(iset))
            else:
                frame10, frame11 = (0, len(iset))

            # Create the new lists
            new_experiments = ExperimentList()
            new_reference_all = reference.split_by_experiment_id()
            new_reference = flex.reflection_table()
            for i in range(len(new_reference_all) - len(experiments)):
                new_reference_all.append(flex.reflection_table())
            assert (len(new_reference_all) == len(experiments))

            # Loop through all the scan ranges and create a new experiment list with
            # the requested scan ranges.
            for frame00, frame01 in scan_range:
                assert (frame01 > frame00)
                assert (frame00 >= frame10)
                assert (frame01 <= frame11)
                index0 = frame00 - frame10
                index1 = index0 + (frame01 - frame00)
                assert (index0 < index1)
                assert (index0 >= 0)
                assert (index1 <= len(iset))
                new_iset = iset[index0:index1]
                if scan is None:
                    new_scan = None
                else:
                    new_scan = scan[index0:index1]
                for i, e1 in enumerate(experiments):
                    e2 = Experiment()
                    e2.beam = e1.beam
                    e2.detector = e1.detector
                    e2.goniometer = e1.goniometer
                    e2.crystal = e1.crystal
                    e2.imageset = new_iset
                    e2.scan = new_scan
                    new_reference_all[i]['id'] = flex.int(
                        len(new_reference_all[i]), len(new_experiments))
                    new_reference.extend(new_reference_all[i])
                    new_experiments.append(e2)
            experiments = new_experiments
            reference = new_reference

            # Print some information
            logger.info(
                'Modified experiment list to integrate over requested scan range'
            )
            for frame00, frame01 in scan_range:
                logger.info(' scan_range = %d -> %d' % (frame00, frame01))
            logger.info('')

        # Return the experiments
        return experiments, reference
Esempio n. 9
0
        is_bg_pixel[i_panel, j1:j2, i1:i2] = ~np.logical_or(~bg, expanded_integration_mask)
    # At this point is_bg_pixel returns False for pixels that are inside the expanded strong spot mask
    # or the expanded integration mask

    # <><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><>
    #   RUN THE TILT PLANE HELPER FUNCTION
    # 1. Weighted fit of the background tilt plane
    # 2. Updates prediction reflection table with miller indices, and shoeboxes
    # 3. Updates prediction reflections with integrations and integration variances
    #    using Leslie 99
    # <><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><>
    exper = Experiment()
    exper.detector = DET
    exper.beam = BEAM
    exper.crystal = crystal
    exper.imageset = El[0].imageset
    results = tilt_fit(
        imgs=img_data, is_bg_pix=is_bg_pixel,
        delta_q=args.deltaq, photon_gain=GAIN, sigma_rdout=sigma_readout, zinger_zscore=args.Z,
        exper=exper, predicted_refls=refls_predict, sb_pad=args.sbpad)

    refls_predict, tilt_abc, error_in_tilt, I_Leslie99, varI_Leslie99 = results
    spot_snr = np.array(I_Leslie99) / np.sqrt(varI_Leslie99)
    shoeboxes = refls_predict['shoebox']
    bboxes = np.vstack([list(sb.bbox)[:4] for sb in shoeboxes])
    bbox_panel_ids = np.array(refls_predict['panel'])
    Hi = np.vstack(refls_predict['miller_index'])
    did_i_index = np.array(refls_predict['id'])
    boundary_spot = np.array(refls_predict['boundary'])

    # <><><><><><><><><><><><><><><>
Esempio n. 10
0
        except:
            pass
        continue
    print("####\n *_* IndexingWORKED %d *_* \n####" % idx)
    n_idx += 1
    indexed_shots.append(idx)
    try:
        np.savetxt(indexed_f, indexed_shots, fmt="%d")
    except:
        pass
    crystalAB = orientAB.refined_experiments.crystals()[0]
   
    E = Experiment()
    E.beam = BEAM
    E.detector = DET
    E.imageset = iset
    E.crystal = crystalAB
    EL = ExperimentList()
    EL.append(E)

    exp_json = os.path.join(out_dir, "exp_%d_%s.json" % (idx, tag) )
    refl_pkl = os.path.join(out_dir, "refl_%d_%s.pkl" % (idx, tag))
    orientAB.export_as_json( EL, exp_json)
    utils.save_flex(refls_strong, refl_pkl)

    t = loader.times[idx]  # event time
    sec, nsec, fid = t.seconds(), t.nanoseconds(), t.fiducial()
    t_num, _ = utils.make_event_time( sec, nsec, fid)

    dump = {"crystalAB": crystalAB,
             "event_time": t_num,