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.)
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