Exemple #1
0
 def refine_box_with_selected(self, selection=None):
     if (selection is None):
         selections = self.xray_structure.all_selection()
     ph_box = self.pdb_hierarchy.select(selection)
     ph_box.atoms().reset_i_seq()
     box = mmtbx.utils.extract_box_around_model_and_map(
         xray_structure=self.xray_structure.select(selection),
         map_data=self.map,
         box_cushion=self.atom_radius)
     ph_box.adopt_xray_structure(box.xray_structure_box)
     group_adp_sel = []
     for rg in ph_box.residue_groups():
         group_adp_sel.append(rg.atoms().extract_i_seq())
     f_obs_box_complex = box.box_map_coefficients(d_min=self.d_min)
     f_obs_box = abs(f_obs_box_complex)
     #
     xrs = box.xray_structure_box.deep_copy_scatterers().set_b_iso(value=0)
     assert approx_equal(flex.mean(xrs.extract_u_iso_or_u_equiv()), 0.)
     f_calc = f_obs_box.structure_factors_from_scatterers(
         xray_structure=xrs).f_calc()
     # Get overall B estimate
     o = bulk_solvent.complex_f_kb_scaled(
         f1=f_obs_box_complex.data(),
         f2=f_calc.data(),
         b_range=flex.double(range(5, 505, 5)),
         ss=1. / flex.pow2(f_calc.d_spacings().data()) / 4.)
     #
     xrs = xrs.set_b_iso(value=o.b())
     f_calc = f_obs_box.structure_factors_from_scatterers(
         xray_structure=xrs).f_calc()
     k_isotropic = flex.double(f_calc.data().size(), o.k())
     fmodel = mmtbx.f_model.manager(f_obs=f_obs_box, xray_structure=xrs)
     fmodel.update_core(k_isotropic=k_isotropic)
     fmodel.update(target_name="ls_wunit_k1")  # Risky?
     #
     fmodel.update_all_scales(update_f_part1=False,
                              apply_back_trace=True,
                              remove_outliers=False)
     #
     if (self.nproc > 1): log = None
     else: log = self.log
     group_b_manager = mmtbx.refinement.group.manager(
         fmodel=fmodel,
         selections=group_adp_sel,
         convergence_test=False,
         max_number_of_iterations=50,
         number_of_macro_cycles=3,
         run_finite_differences_test=False,
         use_restraints=self.use_adp_restraints,
         refine_adp=True,
         log=log)
     return fmodel.xray_structure.extract_u_iso_or_u_equiv(
     ) * adptbx.u_as_b(1.)
Exemple #2
0
def map_and_model_to_fmodel(map_data,
                            xray_structure,
                            atom_radius,
                            d_min,
                            reset_adp=True):
    box = mmtbx.utils.extract_box_around_model_and_map(
        xray_structure=xray_structure,
        map_data=map_data,
        box_cushion=atom_radius)
    box.apply_mask_inplace(atom_radius=atom_radius)
    f_obs_complex = box.box_map_coefficients(d_min=d_min)
    f_obs = abs(f_obs_complex)
    if (flex.mean(f_obs.data()) < 1.e-6): return None
    xrs = box.xray_structure_box.deep_copy_scatterers()
    if (reset_adp):
        vals_init = xrs.extract_u_iso_or_u_equiv()
        xrs = xrs.set_b_iso(value=0)
        assert approx_equal(flex.mean(xrs.extract_u_iso_or_u_equiv()), 0.)
        f_calc = f_obs.structure_factors_from_scatterers(
            xray_structure=xrs).f_calc()
        sc = flex.sum(abs(f_obs).data()*abs(f_calc).data())/ \
             flex.sum(abs(f_calc).data()*abs(f_calc).data())
        f_calc = f_calc.array(data=f_calc.data() * sc)
        o = bulk_solvent.complex_f_kb_scaled(
            f1=f_obs_complex.data(),
            f2=f_calc.data(),
            b_range=flex.double(range(5, 505, 5)),
            ss=1. / flex.pow2(f_calc.d_spacings().data()) / 4.)
        xrs = xrs.set_b_iso(value=o.b())
        k_isotropic = flex.double(f_calc.data().size(), o.k())
        if (o.k() < 1.e-6):
            k_isotropic = flex.double(f_calc.data().size(), 1)
            xrs.set_u_iso(values=vals_init)
    fmodel = mmtbx.f_model.manager(f_obs=f_obs, xray_structure=xrs)
    if (reset_adp):
        fmodel.update_core(k_isotropic=k_isotropic)
    fmodel.update(target_name="ls_wunit_k1")
    fmodel.update_all_scales(update_f_part1=False,
                             apply_back_trace=True,
                             remove_outliers=False)
    return fmodel