def test_change_of_basis_ops_to_minimum_cell_mpro(): input_ucs = [ (46.023, 55.001, 64.452, 64.744, 78.659, 89.824), (44.747, 53.916, 62.554, 114.985, 99.610, 90.736), ] # Setup the input experiments and reflection tables expts = ExperimentList() for uc in input_ucs: uc = uctbx.unit_cell(uc) sg = sgtbx.space_group_info("P1").group() B = scitbx.matrix.sqr(uc.fractionalization_matrix()).transpose() expts.append( Experiment(crystal=Crystal(B, space_group=sg, reciprocal=True))) # Actually run the method we are testing cb_ops = change_of_basis_ops_to_minimum_cell( expts, max_delta=5, relative_length_tolerance=0.05, absolute_angle_tolerance=2) expts.change_basis(cb_ops, in_place=True) assert symmetry.unit_cells_are_similar_to( expts, median_unit_cell(expts), relative_length_tolerance=0.05, absolute_angle_tolerance=2, )
def from_dials_data_files(cls, params, experiments, reflection_table): """Initialise the class from an experiment list and reflection table. Args: params: A damage-analysis phil params object experiments: An ExperimentList reflection_table: A reflection table. """ reflection_table = filter_reflection_table( reflection_table, intensity_choice=["scale"], partiality_threshold=0.4 ) # get scaled intensities intensities = miller.array( miller.set( crystal.symmetry( unit_cell=median_unit_cell(experiments), space_group=experiments[0].crystal.get_space_group(), ), indices=reflection_table["miller_index"], anomalous_flag=params.anomalous, ), data=reflection_table["intensity.scale.value"], sigmas=flex.sqrt(reflection_table["intensity.scale.variance"]), ) intensities.set_observation_type_xray_intensity() doses = flex.double() start_doses, doses_per_image = interpret_images_to_doses_options( experiments, params.dose.experiments.dose_per_image, params.dose.experiments.starting_doses, params.dose.experiments.shared_crystal, ) logger.info( "Interpreting data using:\n starting_doses=%s\n dose_per_image=%s", ", ".join("%s" % i for i in start_doses) if len(set(start_doses)) > 1 else " all %s" % str(start_doses[0]), ", ".join("%s" % i for i in doses_per_image) if len(set(doses_per_image)) > 1 else " all %s" % str(doses_per_image[0]), ) for expt, starting_dose, dose_per_img in zip( experiments, start_doses, doses_per_image ): refls = reflection_table.select(expt) imgno = flex.ceil(refls["xyzobs.px.value"].parts()[2]) dose = (imgno * dose_per_img) + starting_dose doses.extend(dose) doses = doses.iround() return cls(intensities, doses, params)
def test_change_of_basis_ops_to_minimum_cell_with_outlier(): symmetries = [ crystal.symmetry(unit_cell=uc, space_group="P1") for uc in ( (52.8868, 52.8868, 333.522, 90, 90, 120), (52.6503, 53.0292, 333.783, 89.9872, 89.2247, 60.8078), (52.9571, 53.0005, 334.255, 90.0493, 90.0042, 119.893), ( 54.4465, 56.5677, 355.775, 93.4376, 90.0999, 118.256, ), # This is an outlier (52.9235, 52.9235, 335.296, 90, 90, 120), (53.4531, 53.4531, 322.909, 90, 90, 120), ) ] # Setup the input experiments and reflection tables expts = ExperimentList() for cs in symmetries: B = scitbx.matrix.sqr( cs.unit_cell().fractionalization_matrix()).transpose() expts.append( Experiment(crystal=Crystal( B, space_group=cs.space_group(), reciprocal=True))) # Actually run the method we are testing cb_ops = change_of_basis_ops_to_minimum_cell( expts, max_delta=5, relative_length_tolerance=0.05, absolute_angle_tolerance=2) assert cb_ops.count(None) == 1 assert cb_ops[3] is None expts = ExperimentList( [expt for expt, cb_op in zip(expts, cb_ops) if cb_op]) cb_ops = [cb_op for cb_op in cb_ops if cb_op] expts.change_basis(cb_ops, in_place=True) assert symmetry.unit_cells_are_similar_to( expts, median_unit_cell(expts), relative_length_tolerance=0.05, absolute_angle_tolerance=2, )
def test_median_cell(): unit_cells = [ uctbx.unit_cell(uc) for uc in [ (10, 11, 11.9, 90, 85, 90), (10.1, 11.2, 12, 90, 85.5, 90), (10.2, 11.1, 12, 90, 84.7, 90), ] ] expts = ExperimentList() for uc in unit_cells: sg = sgtbx.space_group_info("P1").group() B = scitbx.matrix.sqr(uc.fractionalization_matrix()).transpose() expts.append( Experiment(crystal=Crystal(B, space_group=sg, reciprocal=True))) median = median_unit_cell(expts) assert median.parameters() == pytest.approx((10.1, 11.1, 12, 90, 85, 90))