diff --git a/modules/mmcif/pyext/src/restraint.py b/modules/mmcif/pyext/src/restraint.py index d04d07035d..6cfe18c233 100644 --- a/modules/mmcif/pyext/src/restraint.py +++ b/modules/mmcif/pyext/src/restraint.py @@ -296,21 +296,29 @@ def handle(self, r, model, modeled_assembly): return r +def _get_restraint_assembly(imp_restraint, components): + """Get the assembly corresponding to all input particles for + the restraint""" + asym_map = _AsymMapper(imp_restraint.get_model(), components, + ignore_non_structural=True) + asyms = frozenset( + asym_map[p] + for p in IMP.get_input_particles(imp_restraint.get_inputs())) + asyms = sorted((a for a in asyms if a is not None), + key=operator.attrgetter('id')) + return asyms + + def _make_gaussian_em_restraint(imp_restraint, info, components): yield _EM3DRestraint(imp_restraint, info, components) class _EM3DRestraint(ihm.restraint.EM3DRestraint): def __init__(self, imp_restraint, info, components): - asym_map = _AsymMapper(imp_restraint.get_model(), components, - ignore_non_structural=True) # If a subunit contains any density, add the entire subunit to # this restraint's assembly - asyms = frozenset( - asym_map[p] - for p in IMP.get_input_particles(imp_restraint.get_inputs())) - asyms = sorted((a for a in asyms if a is not None), - key=operator.attrgetter('id')) + asyms = _get_restraint_assembly(imp_restraint, components) + assembly = ihm.Assembly( asyms, name="EM subassembly", description="All components that fit the EM map") @@ -334,10 +342,66 @@ def add_model_fit(self, imp_restraint, model): cross_correlation_coefficient=info['cross correlation']) +def _make_em2d_restraint(imp_restraint, info, components): + for i in range(len(info['image files'])): + yield _NewEM2DRestraint(imp_restraint, info, components, i) + + +class _NewEM2DRestraint(ihm.restraint.EM2DRestraint): + def __init__(self, imp_restraint, info, components, image_number): + asyms = _get_restraint_assembly(imp_restraint, components) + + assembly = ihm.Assembly( + asyms, name="2D EM subassembly", + description="All components that fit the EM images") + + self._image_number = image_number + self._filename = info['image files'][image_number] + self._asyms = tuple(asyms) + + loc = ihm.location.InputFileLocation( + self._filename, + details="Electron microscopy class average") + dataset = ihm.dataset.EM2DClassDataset(loc) + + super(_NewEM2DRestraint, self).__init__( + dataset=dataset, assembly=assembly, + segment=False, + number_raw_micrographs=info['micrographs number'] or None, + pixel_size_width=info['pixel size'], + pixel_size_height=info['pixel size'], + image_resolution=info['resolution'], + number_of_projections=info['projection number']) + + def _get_signature(self): + return ("EM2DRestraint", self._filename, self._asyms, + self.number_raw_micrographs, self.pixel_size_width, + self.pixel_size_height, self.image_resolution, + self.number_of_projections) + + def add_model_fit(self, imp_restraint, model): + info = _parse_restraint_info(imp_restraint.get_dynamic_info()) + ccc = info['cross correlation'][self._image_number] + transform = self._get_transformation(model, info, self._image_number) + rot = transform.get_rotation() + rm = [[e for e in rot.get_rotation_matrix_row(i)] for i in range(3)] + self.fits[model] = ihm.restraint.EM2DRestraintFit( + cross_correlation_coefficient=ccc, rot_matrix=rm, + tr_vector=transform.get_translation()) + + def _get_transformation(self, model, info, nimage): + """Get the transformation that places the model on image nimage""" + r = info['rotation'][nimage * 4: nimage * 4 + 4] + t = info['translation'][nimage * 3: nimage * 3 + 3] + return IMP.algebra.Transformation3D(IMP.algebra.Rotation3D(*r), + IMP.algebra.Vector3D(*t)) + + class _AllRestraints(object): """Map IMP restraints to mmCIF objects""" _typemap = { - "IMP.isd.GaussianEMRestraint": _make_gaussian_em_restraint} + "IMP.isd.GaussianEMRestraint": _make_gaussian_em_restraint, + "IMP.em2d.PCAFitRestraint": _make_em2d_restraint} def __init__(self, system, components): self._system = system diff --git a/modules/mmcif/test/input/image_1.pgm b/modules/mmcif/test/input/image_1.pgm new file mode 100644 index 0000000000..31c0bd6fc4 --- /dev/null +++ b/modules/mmcif/test/input/image_1.pgm @@ -0,0 +1,1103 @@ +P2 +110 110 +255 +85 89 93 93 89 93 89 85 89 85 85 85 89 +89 89 85 81 81 81 85 89 89 89 85 85 +85 89 89 85 89 93 93 89 89 93 93 93 +89 85 85 85 89 89 89 85 85 89 89 89 +93 97 97 93 89 93 97 97 93 89 85 85 +85 81 81 81 85 85 81 85 89 89 97 97 +93 93 85 89 93 89 89 85 85 89 93 89 +85 81 85 85 85 85 85 89 89 85 89 93 +93 93 89 89 85 81 85 89 89 93 93 89 +85 +85 89 89 81 81 81 81 85 89 93 93 93 93 +85 89 85 81 77 77 81 81 85 85 89 89 +93 89 93 97 93 93 93 89 93 93 89 89 +89 85 85 85 93 93 89 85 89 89 89 93 +93 93 93 93 89 93 97 93 89 85 81 85 +85 81 81 85 85 85 85 85 93 93 101 101 +97 97 89 89 89 89 81 81 81 85 85 85 +85 81 81 81 85 85 85 81 85 89 89 89 +93 97 93 93 93 93 89 97 93 93 93 89 +85 +85 85 89 85 85 81 81 81 81 89 89 93 89 +85 85 81 85 85 85 85 89 89 93 93 85 +85 89 93 97 93 93 89 93 93 97 89 93 +93 89 89 89 93 93 93 93 93 93 97 101 +97 93 93 85 85 85 93 93 89 89 89 89 +89 85 85 81 85 85 85 89 89 93 93 93 +93 93 89 89 85 85 81 81 85 85 89 89 +89 85 85 85 89 85 81 81 85 89 89 89 +89 89 89 93 93 89 93 93 93 93 93 89 +85 +85 85 85 89 89 85 85 81 81 81 85 85 85 +85 85 85 89 89 85 85 89 93 89 89 85 +85 85 85 89 85 85 89 89 97 101 93 89 +93 93 93 93 97 93 93 97 97 93 97 97 +97 89 89 85 81 85 89 89 89 89 89 89 +89 85 85 89 85 89 89 93 93 85 85 89 +93 93 89 85 89 81 77 81 81 81 85 89 +89 89 89 93 93 93 89 81 85 85 81 85 +85 85 85 89 89 85 89 93 97 93 97 93 +89 +89 85 85 81 85 89 81 81 81 81 81 81 81 +85 85 89 93 93 93 93 93 89 89 89 89 +85 81 81 85 89 89 93 97 97 97 93 89 +89 89 89 89 89 93 93 97 101 97 93 97 +97 89 89 85 81 85 81 85 85 89 93 89 +89 85 89 89 85 85 89 93 93 85 81 85 +89 89 89 85 81 77 77 77 81 77 85 85 +89 89 93 97 97 97 93 89 85 85 85 85 +81 81 85 89 85 85 85 89 97 97 97 93 +85 +89 85 81 81 81 85 81 81 85 85 85 81 89 +89 89 93 93 93 93 97 97 97 93 93 89 +85 81 81 85 89 93 101 101 97 93 93 93 +89 89 85 89 89 89 93 93 97 97 97 93 +93 89 89 81 81 85 81 81 85 85 89 85 +85 85 89 89 89 85 85 85 85 85 81 85 +85 89 89 89 85 81 77 81 77 85 85 85 +89 89 93 97 97 101 101 93 89 85 89 89 +85 85 89 89 85 85 85 89 93 97 97 93 +85 +89 89 85 85 81 85 85 81 85 81 85 85 89 +89 89 97 93 97 97 101 97 97 97 93 89 +85 85 85 89 93 93 101 101 97 97 97 93 +89 89 85 85 89 93 97 93 97 97 97 97 +93 89 85 85 81 85 85 81 81 85 89 85 +85 85 85 89 89 89 85 81 77 85 85 89 +89 89 89 85 85 81 85 81 81 89 89 89 +85 93 93 93 93 97 97 97 93 89 85 89 +89 85 85 85 85 81 81 85 89 93 97 93 +89 +85 85 85 85 85 85 89 85 81 85 85 85 85 +89 93 97 97 97 101 101 97 101 101 97 89 +89 89 89 93 97 97 101 105 101 97 97 93 +89 85 85 81 85 89 93 93 93 93 89 89 +89 85 85 81 81 85 81 77 81 85 89 85 +85 89 85 81 85 85 81 77 81 85 89 89 +89 89 89 89 89 85 85 85 85 89 93 93 +89 93 97 101 101 101 97 97 93 89 89 89 +89 85 85 89 85 85 89 89 85 89 93 89 +85 +85 85 81 85 89 85 85 85 81 81 81 85 85 +89 89 93 97 93 97 97 101 97 97 93 97 +93 89 93 97 97 97 97 105 105 97 93 89 +85 81 77 77 81 85 89 89 93 93 85 85 +81 81 81 81 81 81 77 81 85 89 85 85 +85 85 85 85 85 81 77 81 89 89 89 85 +89 89 89 89 85 81 85 85 85 85 89 97 +97 97 101 101 101 101 101 93 93 93 93 93 +89 89 85 85 85 85 89 89 85 89 93 89 +89 +85 85 85 85 85 85 85 85 81 85 85 85 85 +85 85 89 89 93 97 97 101 101 93 93 93 +89 89 93 93 93 97 97 101 97 93 89 93 +89 81 77 73 77 85 89 93 89 85 81 81 +81 81 81 81 77 77 77 81 85 85 85 85 +81 81 85 89 85 85 77 81 89 93 93 89 +89 89 89 89 85 85 85 85 85 85 93 93 +97 97 97 93 97 101 97 93 93 93 97 97 +89 85 85 85 85 85 85 85 89 93 93 89 +89 +85 85 85 85 85 81 85 81 85 89 85 81 77 +77 85 93 97 93 97 97 97 97 93 93 93 +89 89 93 89 89 93 101 101 97 97 89 85 +81 77 73 69 73 77 81 85 85 81 81 85 +85 81 85 85 81 77 77 81 85 77 85 81 +81 77 77 85 85 81 77 77 89 97 97 97 +97 93 93 93 89 89 85 89 85 85 85 93 +93 93 93 93 93 97 93 93 93 89 93 93 +85 85 85 85 85 81 89 89 85 93 97 89 +89 +85 85 85 85 85 81 81 81 85 85 85 81 77 +81 85 89 97 97 97 97 97 89 89 89 93 +89 89 89 93 85 89 93 97 93 89 85 77 +73 69 65 69 69 73 73 77 85 85 85 89 +85 85 89 89 85 81 81 89 89 81 81 81 +81 77 81 81 85 81 77 77 85 93 93 97 +97 93 93 97 93 89 89 89 89 89 85 89 +93 93 89 93 97 93 93 93 93 89 89 93 +89 89 85 85 85 85 93 89 89 89 93 85 +85 +85 85 85 85 85 81 81 81 85 85 85 81 77 +85 89 89 93 97 97 101 97 93 89 89 89 +89 89 89 89 85 81 89 93 89 81 77 73 +73 69 65 65 65 65 73 73 81 85 85 85 +85 89 89 89 81 85 85 85 85 81 81 81 +81 81 81 85 89 85 81 77 85 93 97 97 +93 93 93 93 89 93 97 93 85 85 85 85 +89 93 89 93 97 93 89 89 93 85 85 89 +89 93 89 89 89 89 93 93 93 89 89 85 +85 +89 89 89 85 85 85 81 85 89 89 81 81 81 +89 89 89 93 93 93 97 97 93 89 85 85 +89 89 85 85 85 85 81 85 81 77 73 73 +73 73 69 69 65 69 73 77 85 89 89 85 +85 89 89 85 85 85 85 81 81 77 77 81 +77 85 89 89 89 85 81 81 85 93 97 101 +97 97 93 93 89 93 97 93 85 89 85 85 +89 89 89 89 89 93 89 89 89 85 85 89 +93 93 93 89 89 89 89 89 89 89 93 89 +89 +89 89 93 89 85 85 85 81 85 89 89 85 81 +85 85 81 85 89 89 89 93 89 81 81 85 +89 89 85 85 85 85 81 85 81 77 81 77 +73 73 73 73 73 77 81 85 85 89 93 89 +85 89 85 85 85 81 85 85 81 77 73 77 +81 85 89 93 89 85 89 85 85 93 97 97 +97 97 97 93 93 93 93 93 89 89 89 81 +85 89 89 85 85 89 89 85 85 85 85 85 +89 89 89 89 85 89 89 89 89 85 89 85 +93 +89 89 89 89 89 89 89 89 89 89 89 85 81 +77 81 85 85 85 89 89 89 89 85 81 85 +85 81 77 77 81 81 81 81 81 77 81 77 +77 77 77 81 81 81 81 85 89 89 89 93 +85 85 85 89 89 85 81 85 81 77 77 81 +89 89 89 89 89 89 89 85 85 85 89 97 +97 97 101 97 93 93 93 93 89 85 85 85 +85 81 85 85 81 85 89 85 81 85 85 85 +85 89 89 89 89 85 85 85 85 85 85 81 +89 +89 89 89 89 89 93 93 93 93 89 89 89 81 +81 85 81 85 85 85 89 89 89 85 85 81 +77 77 73 77 77 77 81 81 77 77 77 73 +73 73 77 81 85 85 89 89 89 89 89 89 +89 89 89 89 89 81 81 85 81 81 81 81 +89 85 89 89 89 89 93 85 85 85 89 93 +93 93 93 93 93 93 89 89 89 89 89 85 +81 81 85 85 81 81 85 85 81 81 85 85 +85 85 85 85 89 85 85 85 85 85 85 85 +93 +93 93 89 89 89 93 89 93 93 93 89 89 85 +85 85 85 85 85 85 85 93 93 85 85 81 +77 73 69 73 73 73 81 77 77 77 81 77 +77 73 77 85 89 89 85 85 89 89 89 89 +89 93 89 85 85 85 85 85 85 81 85 85 +85 85 81 85 89 89 89 89 85 85 89 93 +89 89 93 93 93 89 89 85 89 89 89 85 +81 81 85 85 81 81 81 85 85 81 81 85 +81 85 85 85 89 85 85 85 89 89 85 85 +93 +89 93 93 93 89 89 93 93 97 93 93 93 89 +89 89 85 85 85 85 85 93 89 85 81 81 +77 73 69 73 73 73 77 81 77 77 77 77 +77 77 81 85 85 85 89 89 89 89 89 89 +89 89 89 85 89 89 85 81 81 81 81 81 +81 85 89 85 85 89 89 85 81 85 89 89 +89 89 93 93 93 89 85 85 89 85 85 85 +81 81 85 85 85 85 89 89 85 81 81 81 +85 81 85 85 89 89 85 89 89 85 81 85 +89 +89 93 97 97 93 93 93 97 93 89 93 89 89 +93 89 93 89 89 85 85 85 89 85 85 81 +73 77 73 81 81 77 77 77 77 81 77 81 +81 81 85 85 85 85 85 89 93 89 89 89 +85 85 85 85 85 85 81 77 81 81 77 77 +77 85 85 85 85 89 89 85 85 85 85 89 +93 93 93 93 89 85 85 85 89 89 89 85 +81 85 85 85 85 89 93 93 89 81 81 81 +89 89 89 89 93 89 85 85 93 89 85 89 +89 +93 93 97 97 93 93 97 97 93 93 93 93 89 +93 93 93 93 89 85 85 85 89 89 85 85 +81 77 81 85 85 81 81 81 81 77 77 81 +81 81 85 85 89 85 85 89 89 85 85 85 +81 81 81 81 81 85 85 81 77 73 77 77 +77 81 81 85 85 89 89 93 89 85 85 89 +93 93 93 93 93 93 89 89 85 85 89 81 +81 81 81 85 89 85 89 89 89 89 85 85 +85 89 89 89 93 89 89 85 89 89 85 89 +89 +93 93 97 93 93 93 101 93 93 93 97 93 89 +93 97 97 93 89 85 85 89 89 89 85 89 +89 85 89 85 85 81 81 85 85 85 85 81 +85 81 81 81 85 85 85 85 85 81 81 85 +81 81 81 85 85 81 81 81 73 73 73 73 +77 81 81 85 89 89 89 89 85 85 85 89 +93 89 89 89 97 93 89 85 85 85 85 81 +81 77 77 89 93 93 93 93 89 89 89 89 +93 93 93 93 93 89 89 89 89 93 89 93 +89 +93 89 89 93 93 93 97 93 93 89 89 93 89 +89 93 89 89 85 85 85 89 93 89 85 85 +85 85 89 89 89 81 85 85 89 89 93 85 +81 89 89 85 81 81 81 81 85 81 81 81 +81 77 81 81 81 85 85 81 77 73 77 77 +77 77 81 85 89 89 89 85 85 81 85 89 +89 93 89 89 93 89 85 85 81 85 81 81 +81 81 81 89 93 97 97 93 89 89 89 93 +89 97 101 93 89 85 85 89 89 89 85 93 +89 +89 89 89 89 89 89 93 93 89 85 89 89 89 +89 89 89 89 89 85 85 85 89 85 85 89 +89 85 89 93 93 89 89 89 89 89 89 85 +85 85 85 85 85 77 77 77 81 81 77 81 +77 77 77 77 81 89 85 81 73 73 77 77 +77 81 81 85 89 89 89 85 77 77 77 81 +81 85 89 85 85 85 81 85 85 85 81 81 +81 85 89 85 93 97 93 89 89 89 93 93 +89 93 93 89 89 89 85 85 93 89 85 89 +85 +85 85 85 89 89 89 89 89 89 85 85 85 85 +89 89 89 89 89 85 85 85 81 85 89 89 +89 85 89 93 93 93 93 93 89 89 85 85 +81 81 85 85 81 77 73 77 73 73 73 73 +73 77 81 81 81 85 85 81 77 73 73 77 +77 77 73 77 81 81 77 73 69 73 73 69 +73 77 77 77 73 73 73 77 77 81 81 81 +85 85 85 89 93 93 85 85 85 89 93 89 +89 89 89 89 93 93 89 89 93 93 89 89 +81 +81 81 85 85 85 85 85 89 85 89 89 85 89 +89 93 89 85 85 85 85 85 81 81 81 81 +85 85 89 93 89 93 89 89 89 85 85 85 +85 85 85 85 81 73 73 77 73 69 69 73 +77 81 81 81 81 85 81 81 77 73 73 73 +73 73 69 65 69 69 65 60 56 60 60 60 +65 69 65 65 65 65 65 69 69 73 77 81 +85 85 85 85 89 85 85 77 77 85 93 89 +89 85 89 89 89 89 93 93 97 93 85 85 +81 +81 81 81 85 81 81 85 85 81 85 85 85 89 +85 89 89 85 81 81 81 81 77 81 81 81 +81 85 89 89 85 85 89 89 85 85 89 85 +89 85 81 81 81 77 77 77 73 77 77 77 +81 81 77 77 81 81 81 81 73 65 65 69 +65 60 65 60 56 52 48 48 48 44 48 48 +52 56 52 52 56 56 56 60 60 65 73 81 +81 81 81 85 85 81 81 77 77 85 89 85 +85 85 85 81 89 93 97 97 93 89 85 85 +85 +81 81 81 81 81 81 81 81 81 81 81 85 85 +85 85 85 85 85 81 85 81 81 81 85 85 +81 85 85 85 85 85 89 89 89 89 89 85 +89 85 85 77 77 77 77 77 81 81 81 77 +77 81 81 81 85 81 73 73 65 60 56 60 +56 56 52 44 44 44 36 40 36 40 40 40 +44 44 44 48 48 48 48 56 56 60 65 73 +73 73 77 85 81 81 77 81 77 81 85 85 +85 81 81 81 89 93 93 97 93 93 89 89 +89 +81 85 81 81 85 81 85 85 85 85 85 89 85 +85 85 85 81 81 85 85 89 85 85 89 89 +89 89 89 85 85 85 89 93 89 89 89 89 +89 85 85 77 77 77 81 81 85 85 85 81 +81 85 77 81 81 73 69 60 60 60 52 48 +48 48 44 32 36 36 32 32 32 32 36 36 +40 40 44 48 48 44 48 52 52 56 60 65 +65 69 73 81 77 81 81 77 77 77 81 81 +81 81 81 81 85 89 93 97 97 93 93 93 +85 +85 89 81 81 85 77 85 89 89 85 89 93 89 +89 85 81 81 81 81 85 89 89 89 89 93 +93 89 93 93 89 85 89 89 89 89 89 93 +89 89 81 73 73 77 81 81 85 85 85 85 +85 81 77 73 69 60 52 56 52 52 48 52 +48 44 44 36 32 36 36 32 28 28 36 44 +44 48 52 56 52 48 52 52 52 52 56 56 +60 65 69 81 77 77 77 77 77 73 73 73 +77 81 81 85 81 89 89 93 93 89 93 89 +85 +85 85 81 81 77 81 85 89 89 89 89 85 89 +89 85 85 85 85 81 85 85 85 89 93 93 +89 89 93 101 93 85 81 85 85 85 89 89 +89 85 81 77 77 81 85 85 85 85 81 81 +81 81 69 65 56 48 44 44 44 48 48 52 +48 44 44 48 40 44 40 36 32 36 44 52 +56 60 60 65 65 56 56 56 48 48 48 52 +52 56 65 73 73 73 77 73 69 73 73 69 +73 77 85 85 85 85 89 89 89 89 89 85 +85 +89 89 89 85 85 85 85 89 85 85 85 85 89 +89 85 85 85 85 85 89 85 85 89 89 93 +89 89 93 93 89 85 81 85 81 77 81 85 +89 85 85 85 85 85 85 81 81 81 77 73 +73 69 60 52 48 40 40 44 44 44 56 60 +52 52 52 52 56 56 52 44 48 56 60 69 +73 77 77 77 77 73 65 56 52 52 44 48 +48 52 60 69 77 73 73 73 73 69 69 73 +73 77 89 89 89 89 89 93 89 89 85 81 +89 +89 89 89 85 81 85 85 85 85 89 89 85 85 +85 81 81 85 85 85 93 93 85 85 89 89 +89 85 85 85 81 77 77 77 73 73 77 81 +85 85 85 85 85 89 89 85 81 77 73 65 +65 65 52 48 44 40 36 40 40 48 60 65 +69 69 73 77 81 77 73 69 73 77 81 85 +93 97 97 97 93 89 81 73 65 56 52 48 +48 48 56 65 69 77 73 77 77 73 73 77 +81 85 85 89 89 89 89 93 93 89 85 81 +85 +85 85 85 85 89 89 89 89 93 93 93 85 85 +81 81 81 81 81 85 85 89 85 85 89 89 +89 85 81 77 77 69 65 65 69 73 77 81 +85 81 81 81 85 89 85 85 77 73 69 56 +52 52 48 44 44 40 40 44 48 52 65 81 +89 93 101 105 105 101 101 97 97 97 105 113 +113 117 117 117 117 109 97 89 73 65 56 52 +48 48 56 60 65 69 73 73 77 77 77 81 +89 89 89 89 89 89 93 89 93 93 93 85 +85 +85 85 85 89 89 89 89 93 97 93 93 89 85 +81 81 77 77 81 77 81 85 85 85 85 85 +85 81 81 81 73 65 56 56 65 65 69 77 +77 81 77 81 81 85 81 81 69 69 65 56 +48 48 44 40 40 40 44 48 56 69 81 97 +109 121 125 130 134 130 125 130 125 125 125 130 +138 146 146 142 138 125 113 101 85 73 60 56 +56 52 48 56 60 73 77 81 85 81 81 85 +89 93 93 93 93 93 93 93 89 93 93 85 +81 +89 89 89 89 93 89 93 93 97 93 89 85 85 +81 77 77 77 73 73 81 89 89 85 85 85 +85 81 85 77 73 65 65 65 60 65 65 73 +73 77 81 77 81 85 81 73 65 60 60 52 +48 40 40 36 40 44 48 56 69 85 101 117 +134 142 150 158 162 166 162 162 154 146 150 154 +162 174 174 170 162 146 130 109 93 77 65 56 +52 48 48 52 60 73 81 81 89 89 89 89 +97 101 97 97 101 97 97 97 89 89 93 89 +85 +93 93 93 93 97 93 97 93 97 93 89 85 85 +81 81 77 81 81 81 81 89 89 89 85 85 +85 85 81 77 77 69 65 65 65 65 69 69 +77 81 81 77 81 81 77 69 60 56 48 48 +44 40 36 40 44 48 56 69 85 101 121 138 +154 166 174 178 195 195 190 186 182 170 170 174 +182 195 195 190 178 158 142 121 101 85 69 60 +48 44 44 52 60 77 85 89 89 93 89 89 +97 101 101 97 97 97 97 97 93 93 89 89 +85 +93 93 93 97 97 93 93 93 97 93 85 85 85 +85 85 81 81 81 81 85 85 89 93 93 93 +93 89 85 81 77 73 69 69 69 65 69 73 +77 85 81 81 85 81 69 65 56 48 44 40 +40 40 40 44 52 56 69 81 97 117 138 154 +170 186 195 207 219 219 215 211 203 190 186 190 +203 211 211 207 195 174 154 134 109 89 73 60 +48 44 44 52 60 73 85 93 97 93 89 93 +93 97 101 97 97 97 93 93 93 89 89 89 +89 +93 93 93 97 97 97 93 89 93 89 85 89 89 +85 85 81 77 77 77 77 85 89 93 97 93 +89 89 85 85 81 77 73 73 73 69 69 73 +77 85 85 81 81 77 65 56 52 48 36 40 +40 44 48 52 60 73 85 101 109 125 146 166 +186 199 215 223 231 235 231 223 219 203 199 203 +211 223 223 219 207 186 166 138 117 93 73 56 +44 40 44 44 56 69 81 93 97 93 93 93 +93 93 97 101 97 93 93 93 89 85 89 89 +97 +97 93 89 93 97 97 97 89 89 85 85 89 93 +85 81 81 77 77 73 73 81 89 93 97 93 +85 85 85 85 85 81 77 77 73 69 73 77 +81 89 85 81 77 69 60 52 52 44 36 36 +36 48 56 60 73 85 101 113 125 138 158 174 +190 207 223 231 235 231 235 231 223 211 203 207 +219 227 231 227 215 195 170 146 117 93 73 56 +40 36 40 40 52 65 81 93 97 97 93 97 +97 93 93 101 97 89 93 93 85 85 89 89 +93 +89 93 93 93 89 93 97 89 89 85 89 93 93 +89 85 85 81 77 77 77 81 85 89 93 93 +85 85 81 81 81 81 81 77 77 69 73 77 +81 85 85 81 73 65 56 48 44 40 32 36 +44 56 65 77 85 101 117 130 138 150 162 178 +186 207 215 223 223 223 227 223 223 215 203 203 +215 223 231 231 219 199 174 146 125 101 73 52 +40 32 32 40 52 65 77 93 97 97 97 97 +93 89 93 97 93 89 89 85 85 85 85 89 +89 +85 89 89 93 89 89 93 93 85 81 89 89 93 +93 89 89 89 81 81 81 81 85 85 89 89 +85 81 77 81 81 81 81 77 77 73 77 81 +81 81 81 73 69 65 52 40 40 32 32 40 +48 65 81 93 109 121 138 146 150 158 166 174 +182 195 203 211 211 215 215 215 211 207 203 203 +207 219 227 227 219 195 174 146 117 97 73 48 +36 28 32 44 52 69 85 93 93 93 97 93 +89 89 89 93 93 89 85 85 89 81 85 89 +93 +85 85 89 93 89 85 85 85 81 85 85 89 89 +93 93 93 93 89 85 81 81 81 81 81 81 +81 81 81 77 77 77 77 73 73 77 81 77 +77 77 73 65 56 48 40 28 28 24 24 36 +52 73 89 109 125 142 154 162 162 162 162 166 +170 178 190 195 199 199 199 203 203 203 203 203 +207 215 223 219 207 190 170 142 117 93 69 48 +36 36 32 44 52 69 85 85 85 89 93 89 +85 85 89 89 85 85 85 89 93 93 89 89 +89 +85 85 85 89 89 85 85 85 81 81 85 93 93 +93 93 97 93 89 85 81 77 77 77 77 77 +81 81 81 77 77 77 81 81 77 81 81 77 +73 73 65 56 48 40 28 24 20 20 24 36 +56 73 97 117 138 154 166 166 166 162 154 158 +158 166 174 178 182 186 186 190 195 199 203 207 +211 215 215 211 195 178 162 138 113 85 65 48 +40 36 36 48 60 69 81 85 81 81 85 81 +81 81 85 85 81 85 85 89 93 89 89 89 +89 +85 85 85 81 81 81 85 81 81 81 89 97 97 +97 93 97 97 85 85 81 77 77 77 77 77 +77 77 77 77 73 77 77 77 77 73 73 69 +65 65 60 48 40 32 20 16 12 12 20 32 +52 77 101 125 150 166 174 174 170 162 154 150 +154 154 158 162 166 170 182 190 195 199 203 203 +207 207 207 195 182 170 150 125 101 81 60 48 +40 36 40 52 65 73 81 77 77 77 77 81 +77 81 85 85 85 85 85 89 85 89 85 89 +93 +85 81 85 81 81 77 77 77 81 85 89 97 101 +97 101 97 93 89 85 81 81 81 77 73 73 +77 77 77 77 77 77 77 77 73 69 65 56 +52 52 48 40 32 28 16 12 12 12 20 32 +52 73 97 125 150 166 178 178 170 162 150 146 +142 142 142 146 154 162 174 186 190 199 203 203 +199 199 195 186 170 154 130 109 93 73 56 48 +36 40 40 52 65 77 81 77 77 77 73 77 +81 81 85 85 85 85 85 85 89 85 85 89 +89 +89 85 85 81 77 77 81 77 81 89 89 93 101 +101 97 93 93 89 85 85 85 81 77 73 77 +77 77 77 77 77 73 73 73 69 65 56 48 +44 44 36 32 28 24 16 12 12 12 20 36 +52 73 101 125 150 170 178 178 166 158 150 138 +130 130 130 138 146 154 170 182 186 195 199 199 +199 190 178 166 154 138 117 101 81 65 48 44 +40 40 44 56 69 77 81 81 77 73 73 73 +77 77 81 81 81 81 81 85 85 85 89 89 +89 +89 85 85 85 81 81 81 81 85 89 89 97 101 +101 97 93 93 89 89 85 85 81 77 77 77 +77 77 77 77 77 73 73 69 65 56 44 40 +36 36 32 24 28 24 20 16 16 20 24 40 +60 77 101 130 150 166 174 170 162 150 142 130 +121 121 125 134 142 150 166 178 186 190 199 195 +190 178 162 146 134 117 101 85 69 56 48 44 +44 48 56 65 73 77 81 81 81 77 73 73 +73 77 81 81 81 81 81 85 85 85 85 89 +89 +89 85 81 85 85 85 81 85 89 93 93 97 97 +97 97 93 93 89 89 85 85 81 73 73 77 +77 77 77 73 77 77 69 60 52 44 36 36 +28 32 32 32 32 28 28 24 28 32 40 56 +69 89 109 130 150 158 166 166 158 150 142 130 +121 121 125 134 142 154 166 178 186 186 186 178 +174 162 142 125 109 97 89 77 65 56 48 44 +52 56 65 77 77 77 81 81 77 81 77 73 +77 81 85 85 85 89 89 93 89 85 89 93 +89 +89 85 85 85 85 85 85 85 89 93 97 97 97 +93 93 93 89 85 85 85 81 77 73 69 77 +77 77 77 73 73 69 60 56 48 40 32 32 +32 36 36 40 44 44 48 44 48 56 60 69 +77 93 113 130 142 154 158 158 154 150 142 130 +125 125 130 142 146 158 174 182 182 182 174 166 +154 138 117 97 89 81 73 60 52 48 48 52 +56 60 73 81 81 85 85 81 81 77 77 77 +81 81 85 85 89 89 97 97 93 93 93 93 +89 +89 89 85 89 89 85 85 89 93 97 97 93 93 +93 89 89 85 85 85 85 85 81 77 73 73 +73 73 73 73 69 65 56 56 48 36 32 32 +36 40 44 52 60 65 69 69 69 77 81 85 +93 101 113 125 138 146 150 150 154 150 142 138 +134 134 138 146 154 166 174 182 178 174 162 150 +134 113 93 77 65 60 52 48 48 48 52 60 +69 77 81 85 85 89 89 81 77 77 77 81 +81 85 85 85 85 89 93 93 97 97 93 93 +89 +93 97 89 89 89 89 89 93 93 93 93 93 93 +93 89 85 85 85 85 85 81 77 77 77 73 +73 69 69 73 69 60 56 48 44 36 32 32 +36 48 60 73 85 89 97 101 105 105 105 105 +109 113 117 125 134 146 150 154 154 150 146 142 +138 146 150 158 170 178 182 186 178 166 150 134 +109 93 73 56 48 44 40 40 44 48 52 65 +77 85 85 85 85 89 85 85 81 81 77 81 +89 89 89 89 89 89 89 93 93 93 93 93 +89 +101 101 93 89 89 89 93 93 93 89 93 93 89 +93 89 85 89 89 85 81 77 77 73 73 73 +77 77 73 73 69 60 52 44 40 36 36 36 +48 65 81 97 109 125 134 138 138 134 130 130 +130 130 130 130 134 142 146 146 146 146 146 146 +142 150 158 170 182 186 186 186 174 158 138 113 +89 69 52 40 36 32 32 36 40 48 56 60 +69 81 89 89 89 89 81 81 81 81 85 89 +85 89 89 89 89 93 93 89 89 93 89 93 +93 +101 101 93 89 85 89 89 93 93 93 89 93 89 +89 85 89 85 81 81 77 77 73 73 73 77 +77 77 81 77 69 65 56 48 44 40 44 48 +60 77 97 113 138 154 162 170 170 166 158 154 +146 142 138 138 134 134 138 142 146 142 146 146 +146 150 162 174 182 182 178 178 166 146 125 97 +77 52 36 28 24 24 24 36 40 48 56 65 +73 85 89 89 89 85 85 81 77 81 81 85 +89 93 93 89 93 93 93 89 85 89 89 89 +93 +97 97 97 89 85 85 85 89 89 89 89 89 93 +89 89 85 81 81 77 77 77 69 73 77 77 +73 77 77 77 69 60 56 48 44 44 48 60 +73 93 113 142 162 178 190 199 195 190 186 174 +162 154 146 142 138 134 138 138 134 134 138 138 +142 146 158 174 178 178 170 166 154 130 109 89 +69 44 28 20 24 20 28 32 44 52 69 77 +85 85 89 93 89 89 85 77 73 77 81 81 +85 89 89 89 97 93 93 93 85 81 85 89 +93 +97 97 97 89 81 81 85 85 89 93 89 89 89 +89 89 89 81 77 77 77 77 69 73 73 73 +77 77 77 81 69 60 56 48 48 48 56 69 +89 105 130 162 182 203 215 219 215 207 203 190 +174 158 146 142 142 134 134 134 130 130 130 130 +134 138 154 162 162 162 154 146 138 117 93 73 +56 40 28 20 24 24 32 40 48 56 73 81 +89 93 89 89 85 85 85 77 77 77 77 81 +89 89 85 89 93 93 93 93 89 85 85 89 +93 +93 97 97 85 77 77 85 85 85 89 93 89 89 +89 89 85 81 81 77 77 73 69 69 69 73 +73 81 81 77 69 60 52 48 52 52 60 77 +97 121 150 182 207 223 235 231 227 223 215 199 +178 162 150 142 142 134 130 125 121 117 117 117 +121 130 138 142 146 142 134 125 113 97 77 60 +48 36 32 24 28 32 40 48 56 60 77 81 +89 93 89 85 81 81 81 77 73 77 81 85 +89 89 85 81 85 89 89 89 89 89 85 89 +97 +93 93 97 85 77 77 81 81 85 93 93 89 85 +85 89 85 81 81 77 77 73 69 69 69 73 +77 81 81 77 69 60 52 48 52 56 69 85 +109 138 166 195 223 235 247 247 239 231 215 203 +182 166 150 146 138 134 125 121 117 109 105 105 +105 109 109 113 117 125 113 105 97 81 69 56 +44 36 28 24 28 40 48 56 65 69 81 89 +93 93 85 81 81 81 77 77 73 77 81 85 +89 85 81 81 81 85 89 93 93 89 93 97 +97 +93 93 89 85 81 77 81 89 93 97 97 93 81 +81 81 81 81 81 81 77 73 69 69 69 77 +77 81 77 73 69 60 48 48 56 69 81 97 +121 150 178 203 231 243 251 251 243 227 215 199 +182 170 158 150 142 134 125 113 105 97 89 89 +85 81 85 85 93 101 97 89 81 69 52 44 +40 36 32 32 36 44 56 69 73 77 85 93 +93 93 89 85 77 77 81 77 77 77 81 85 +85 85 81 81 81 81 85 89 93 89 93 93 +97 +93 97 89 85 81 81 85 89 97 97 97 93 85 +81 77 81 81 81 81 81 73 69 69 69 73 +77 73 73 69 65 60 48 52 60 77 93 109 +138 162 182 203 231 251 255 251 239 223 207 190 +182 178 170 158 146 134 121 109 97 85 73 69 +60 60 65 60 69 77 77 69 65 56 44 40 +36 36 36 36 44 52 65 73 77 85 85 93 +89 85 89 89 85 73 77 77 81 77 81 81 +81 85 81 81 81 81 85 89 93 93 97 97 +97 +93 93 89 85 85 85 89 85 93 97 97 93 85 +81 81 77 81 81 81 81 73 73 73 73 73 +69 69 69 60 60 56 52 56 65 81 101 121 +142 166 186 207 231 247 251 247 239 219 203 186 +186 182 178 166 150 134 121 105 89 73 56 48 +44 36 40 44 48 52 56 56 56 48 44 36 +40 36 36 44 52 60 73 77 81 85 89 89 +89 81 81 81 81 77 77 77 81 81 81 81 +85 81 81 85 81 81 85 85 89 89 93 97 +97 +93 89 85 81 81 89 93 89 93 97 97 97 89 +85 85 81 81 81 81 85 81 81 81 77 73 +73 65 65 56 56 60 56 60 73 89 105 125 +150 170 195 215 231 239 243 243 231 215 203 186 +182 186 186 170 154 146 125 105 85 65 44 36 +32 24 24 28 32 36 40 44 44 40 40 40 +40 40 44 52 56 65 77 77 81 85 89 89 +85 81 77 81 81 77 77 81 81 81 81 81 +85 85 85 85 81 81 85 85 85 89 89 97 +97 +89 85 85 81 81 89 89 93 97 97 97 93 89 +93 89 81 81 81 85 85 81 81 77 77 77 +73 69 65 56 56 56 60 65 73 89 109 134 +158 178 195 215 231 239 239 235 227 215 203 190 +190 190 190 178 166 150 134 105 89 60 40 32 +24 16 12 12 16 24 32 36 44 44 40 40 +48 48 52 60 65 69 73 77 81 81 85 89 +81 81 81 81 81 81 85 81 85 85 81 81 +85 85 85 85 85 85 81 81 85 85 85 89 +93 +85 85 85 81 81 85 85 89 93 89 89 89 93 +93 85 85 85 85 85 81 81 77 77 73 73 +69 65 60 52 48 48 52 65 77 93 117 142 +162 186 203 223 235 239 239 235 227 219 207 199 +195 199 195 186 174 162 142 113 89 60 40 24 +12 4 0 0 8 16 28 36 44 44 44 48 +60 60 60 69 73 77 77 77 77 81 85 89 +85 81 85 85 85 85 85 85 85 85 85 85 +89 89 89 89 89 85 85 89 85 85 85 89 +89 +93 89 81 85 85 81 81 85 85 89 85 85 85 +85 85 81 85 81 81 77 77 77 73 69 69 +65 60 56 48 48 48 56 65 81 101 125 154 +174 199 219 231 239 239 235 235 227 223 215 211 +207 207 207 203 186 170 146 121 93 65 44 24 +12 0 0 0 8 12 24 36 48 52 52 56 +65 69 69 77 81 77 77 77 77 81 77 81 +81 81 81 85 85 89 81 85 89 89 89 89 +93 93 93 93 89 93 93 89 89 93 89 89 +93 +93 85 85 85 89 81 81 81 81 81 85 85 85 +81 81 81 81 77 77 73 73 73 73 69 69 +65 60 52 48 48 52 56 65 85 105 130 158 +186 211 231 243 247 243 235 231 231 227 227 223 +223 223 219 211 195 174 150 121 93 65 40 24 +12 4 0 8 16 20 36 44 52 56 60 60 +69 73 73 77 77 77 73 73 73 77 77 77 +77 77 81 81 85 85 85 85 89 89 93 93 +93 93 89 93 89 97 97 93 89 89 93 93 +93 +93 89 85 85 81 81 81 77 81 85 81 85 81 +81 77 73 73 77 77 73 73 73 69 69 69 +65 56 48 44 44 48 52 65 85 109 138 166 +190 215 235 247 247 243 235 231 231 227 235 235 +235 231 227 215 199 178 150 121 93 65 44 28 +20 8 8 16 24 36 48 56 56 65 69 69 +73 77 81 81 81 77 73 73 73 77 77 77 +81 81 81 81 85 85 85 85 85 89 93 97 +97 93 89 89 89 89 93 93 89 85 89 89 +93 +89 89 89 81 77 77 81 81 81 85 81 81 81 +81 77 73 73 73 73 69 65 69 69 60 60 +60 52 48 44 44 44 56 69 85 113 142 174 +199 219 239 247 247 243 239 239 235 235 239 239 +239 235 227 211 190 170 146 117 93 65 44 28 +24 16 16 28 36 48 60 65 69 73 77 77 +77 77 81 81 77 77 73 73 73 77 77 85 +85 85 81 81 85 89 89 85 85 89 93 93 +93 93 89 89 89 89 89 93 89 89 89 85 +89 +89 89 89 77 77 81 81 81 81 85 85 81 85 +85 81 73 73 73 73 69 69 69 69 60 60 +56 48 48 40 40 40 52 69 89 113 142 174 +203 227 239 247 251 247 239 239 235 235 239 239 +239 231 215 203 178 154 130 105 85 56 40 28 +28 24 28 40 56 69 73 77 81 85 77 77 +81 77 77 77 77 73 73 73 73 77 73 77 +81 85 81 81 81 89 89 85 89 89 93 93 +93 97 93 93 93 89 89 93 93 93 89 93 +93 +85 89 85 81 81 81 81 81 85 85 85 81 85 +81 77 77 77 73 73 73 69 69 69 65 60 +52 44 40 36 32 40 52 69 85 109 138 174 +203 223 239 247 251 247 243 239 239 239 235 235 +231 219 207 186 166 142 113 89 69 48 36 32 +28 28 36 52 69 77 85 85 89 89 85 77 +81 81 77 77 77 73 73 69 73 73 73 73 +81 81 85 81 85 85 81 85 93 93 89 93 +93 97 97 97 93 89 89 93 93 93 89 89 +89 +89 89 89 85 81 81 85 89 85 89 85 81 85 +85 81 81 77 77 77 73 69 65 65 60 56 +52 44 36 32 28 32 48 65 81 105 134 166 +199 219 239 247 251 247 243 239 235 235 235 231 +219 203 190 166 146 121 97 73 56 40 32 32 +32 36 48 60 73 81 89 93 89 89 85 81 +77 77 77 77 73 73 73 73 73 69 73 77 +77 81 85 89 89 85 81 85 89 93 93 93 +93 93 97 97 93 93 89 93 93 89 89 89 +89 +89 85 89 85 85 85 89 89 89 93 89 85 85 +85 89 89 81 81 77 73 69 69 65 65 60 +52 48 40 28 24 28 40 60 77 101 125 154 +186 215 239 247 251 251 247 239 235 231 227 215 +207 190 170 146 125 105 81 56 40 32 28 32 +32 40 52 60 77 85 89 93 89 85 81 77 +77 81 77 77 77 77 77 77 77 69 73 73 +73 73 85 89 85 81 81 85 89 93 97 93 +93 89 93 97 93 93 93 93 93 89 93 93 +93 +85 85 89 85 89 85 89 89 89 93 89 89 89 +89 89 89 89 81 77 73 73 73 69 65 65 +60 52 44 32 24 28 40 56 69 89 113 142 +174 203 227 243 247 247 243 235 231 231 219 203 +190 174 150 125 109 85 60 44 32 24 24 24 +32 40 52 60 77 85 85 85 85 85 81 81 +81 81 81 81 81 77 81 77 77 73 77 77 +73 77 81 85 85 85 81 81 85 89 93 93 +89 89 97 101 97 97 93 93 93 89 93 93 +85 +85 85 85 89 93 93 89 89 93 93 93 93 93 +93 93 97 93 85 77 73 73 77 73 73 73 +69 60 48 32 24 24 36 48 65 81 101 125 +158 190 211 227 235 239 235 235 227 219 207 186 +174 158 134 113 93 65 44 32 24 20 24 28 +32 36 52 60 73 81 81 81 81 77 81 85 +81 85 85 85 85 81 81 77 77 77 81 77 +81 85 85 89 89 85 89 85 89 89 93 89 +93 93 97 93 93 97 93 93 93 89 93 93 +85 +85 85 89 89 93 93 89 89 93 89 93 97 97 +89 89 93 93 85 81 77 73 73 69 73 77 +73 65 52 40 28 28 28 40 52 69 89 117 +142 174 190 211 223 231 231 227 219 207 195 174 +154 138 117 97 77 48 28 16 12 12 20 28 +32 44 56 65 73 81 81 81 77 77 81 85 +85 85 89 85 81 81 81 81 77 77 81 77 +81 85 85 89 89 89 89 89 89 85 89 89 +89 93 93 93 93 93 93 93 89 93 93 93 +85 +85 85 85 89 89 89 85 85 93 93 97 93 93 +89 85 89 89 85 81 81 73 73 73 77 81 +81 73 60 48 36 32 28 28 36 56 73 101 +125 150 170 190 203 215 211 207 203 195 174 158 +138 117 97 81 56 36 20 16 12 12 20 28 +36 52 60 69 77 81 85 81 81 77 77 81 +77 81 85 89 81 81 81 81 81 73 77 77 +81 81 89 89 93 89 89 93 89 85 89 89 +89 89 89 89 89 89 93 93 89 93 93 89 +89 +85 85 85 89 89 93 89 85 93 93 93 89 89 +89 85 81 81 81 77 77 73 73 77 81 85 +85 77 69 56 40 32 28 20 28 44 56 77 +101 125 150 166 182 190 190 186 182 174 158 142 +121 105 85 65 48 28 20 16 12 12 24 32 +44 56 69 73 77 81 77 77 77 77 77 77 +77 77 81 85 85 77 81 81 81 77 77 81 +81 81 89 89 93 89 89 93 89 89 89 89 +93 97 93 93 93 93 89 93 93 97 97 93 +85 +85 89 85 89 89 89 89 85 89 89 89 89 89 +85 85 77 77 77 73 77 73 77 77 81 85 +85 81 73 60 48 36 28 20 24 32 44 56 +81 105 125 146 162 170 170 166 158 150 142 130 +113 97 77 60 44 28 24 20 20 24 32 40 +48 65 73 73 77 77 77 73 73 73 73 73 +77 81 81 85 81 77 77 81 81 81 77 77 +77 77 85 85 89 89 89 89 89 89 89 93 +93 97 93 93 97 93 89 89 93 97 97 93 +89 +85 89 89 89 89 85 85 81 85 81 81 81 85 +81 81 81 77 77 73 77 77 77 77 85 85 +81 81 81 69 52 40 28 20 20 24 32 44 +65 81 105 121 134 146 146 142 134 125 117 113 +101 85 69 52 44 36 32 28 32 36 48 52 +60 73 81 81 73 77 73 73 69 69 73 73 +77 77 81 85 85 77 77 77 81 81 81 73 +73 77 81 81 85 89 85 89 85 85 89 93 +93 93 93 89 93 93 89 85 93 93 93 93 +93 +85 85 93 93 89 85 89 85 81 81 81 85 81 +77 77 77 77 81 81 81 81 77 73 81 85 +85 85 81 73 56 44 28 20 20 20 24 36 +52 73 85 101 109 113 117 117 113 105 101 93 +81 69 56 44 44 40 36 40 44 48 56 65 +69 77 81 77 73 73 73 69 65 60 69 69 +73 77 81 81 85 77 77 77 77 81 81 81 +81 81 81 81 85 85 85 89 89 89 89 89 +89 89 89 89 89 93 89 85 89 97 93 89 +89 +85 85 93 89 89 89 85 85 85 81 81 81 81 +77 77 73 77 85 85 85 81 77 77 81 85 +89 85 81 77 60 48 36 24 24 24 20 28 +44 56 69 81 89 97 97 93 89 89 89 81 +69 56 52 44 40 40 40 48 56 65 69 73 +73 77 81 77 73 73 73 73 65 65 65 69 +77 81 81 81 77 77 77 77 77 77 81 81 +81 81 85 81 85 89 89 89 89 85 89 89 +93 85 89 89 89 89 85 85 89 97 93 89 +89 +89 85 89 89 89 85 85 85 85 85 85 81 81 +77 77 81 81 85 89 85 81 85 85 85 81 +85 85 85 77 65 52 44 36 28 24 24 28 +40 52 60 65 73 81 81 77 73 77 77 73 +56 52 48 44 44 44 48 52 65 73 77 77 +77 73 81 81 73 73 73 69 69 65 65 69 +77 77 81 81 77 77 73 73 73 73 77 77 +81 81 85 81 85 89 89 89 85 85 85 85 +85 85 85 85 89 85 85 89 93 97 93 93 +89 +85 85 89 85 89 85 81 85 89 89 85 85 85 +85 81 81 81 85 85 85 85 85 89 85 85 +93 89 89 81 69 60 52 40 32 32 28 32 +40 48 56 56 56 60 60 65 60 60 60 56 +52 48 44 44 48 48 56 60 69 73 77 81 +81 77 81 81 77 73 73 69 69 65 65 69 +73 73 81 81 81 77 73 73 73 77 77 77 +77 81 85 81 85 89 85 85 89 85 81 81 +81 81 85 89 89 89 89 93 93 93 89 89 +89 +85 81 81 85 89 89 85 85 89 89 89 85 85 +89 85 85 85 89 89 89 93 89 89 89 89 +93 89 89 81 77 69 60 52 48 44 40 40 +44 48 52 48 44 48 48 48 48 52 48 48 +44 44 44 48 52 56 60 65 73 77 77 81 +77 77 81 81 81 77 77 73 73 69 65 65 +73 77 77 81 81 81 81 77 77 81 81 85 +81 81 85 85 89 89 85 85 85 85 81 81 +81 81 81 89 89 97 93 93 89 89 85 85 +85 +85 85 89 89 93 93 89 89 89 93 89 85 85 +85 89 93 93 93 93 89 93 93 93 97 93 +93 89 89 81 73 73 69 65 60 56 48 48 +48 48 52 44 40 44 44 40 40 40 40 40 +40 44 48 52 60 65 65 69 73 73 77 81 +81 85 81 81 81 77 77 77 77 73 73 77 +81 81 77 77 81 81 81 81 81 81 89 89 +85 85 89 89 89 89 89 85 85 81 85 85 +81 85 85 85 85 97 93 93 85 85 85 85 +85 +85 85 89 93 93 93 89 89 93 93 97 89 85 +85 89 93 97 93 93 89 89 93 93 89 89 +89 85 81 77 73 73 73 69 69 65 60 52 +52 56 52 48 44 44 44 40 36 40 36 40 +40 48 56 60 65 69 69 69 69 73 77 77 +81 85 81 81 77 81 77 81 81 77 77 77 +77 81 81 77 81 81 85 85 85 85 93 93 +93 89 89 93 93 89 89 89 85 81 85 85 +85 85 89 89 89 93 93 89 85 89 89 89 +85 +89 85 89 93 93 89 89 89 93 93 93 89 89 +85 89 89 97 97 93 93 93 93 93 89 85 +81 77 77 81 81 81 81 77 77 73 69 65 +65 60 60 56 48 44 44 44 40 40 40 40 +44 52 60 65 69 69 69 73 69 77 77 81 +89 85 85 85 85 85 81 85 81 77 81 77 +81 81 81 81 81 85 89 85 89 93 97 97 +97 93 89 93 93 93 89 89 89 85 89 85 +85 85 89 93 93 93 97 93 89 89 89 85 +85 +89 85 89 89 89 89 89 93 89 89 93 89 85 +85 89 89 97 97 97 93 93 93 93 89 81 +77 77 81 85 81 81 81 85 85 81 77 73 +69 69 69 60 52 48 52 52 48 48 48 48 +48 60 65 69 69 69 73 73 73 77 77 85 +89 89 89 85 85 85 81 81 81 77 81 81 +81 81 85 85 85 93 89 89 89 93 101 101 +97 97 93 93 93 93 89 89 89 89 89 89 +89 89 89 93 89 93 97 93 93 93 93 93 +89 +85 85 89 89 89 89 85 85 89 89 85 89 85 +89 89 89 93 97 97 93 89 89 89 81 81 +77 77 85 85 81 85 89 89 89 89 85 81 +77 73 73 69 60 56 60 60 56 56 56 56 +60 65 69 73 73 73 73 73 73 73 77 81 +85 89 89 85 85 85 81 81 85 81 81 81 +81 81 81 85 89 93 89 89 89 97 97 97 +97 97 97 97 89 89 93 93 93 93 89 93 +89 89 89 93 93 97 97 97 93 89 93 93 +89 +89 85 89 89 93 93 85 85 89 89 85 85 89 +89 85 85 89 93 97 93 89 89 85 81 81 +73 77 85 85 85 89 93 93 89 89 85 85 +81 81 77 73 69 60 65 69 65 69 65 65 +73 77 81 85 77 73 69 73 73 69 73 77 +85 89 85 89 85 85 81 85 85 81 81 81 +77 81 81 85 89 89 89 89 89 93 93 93 +93 97 97 97 93 89 93 93 97 93 93 89 +89 89 89 89 93 93 97 97 93 89 85 89 +89 +89 89 89 89 93 93 85 81 85 81 77 85 85 +89 85 81 85 89 93 93 93 89 85 81 81 +81 81 85 85 85 85 93 93 93 89 81 85 +85 81 81 73 73 69 69 69 73 77 73 77 +81 85 85 81 77 73 73 73 73 73 77 85 +89 89 93 93 89 85 85 85 77 77 85 81 +81 81 81 89 89 89 85 85 89 89 93 93 +93 97 93 93 93 93 93 97 93 93 93 89 +89 85 89 89 89 93 93 93 89 89 89 89 +89 +85 85 85 89 93 93 85 85 85 81 81 81 85 +85 85 85 89 89 85 89 89 89 85 81 81 +85 89 89 85 85 85 89 93 93 89 81 85 +85 85 81 81 77 77 73 73 77 81 81 85 +85 85 85 81 77 73 73 69 73 77 85 85 +89 93 97 97 93 89 89 85 77 81 85 81 +77 81 81 85 93 93 89 89 89 89 93 93 +89 93 93 93 93 93 93 97 93 93 93 89 +89 89 89 89 93 93 97 93 93 93 89 89 +85 +85 85 85 89 93 89 85 85 85 81 81 85 85 +85 89 89 89 85 85 85 85 85 81 85 85 +85 89 89 89 89 89 93 93 89 85 77 81 +81 81 81 77 77 77 77 77 77 81 85 89 +89 89 85 81 81 77 73 73 73 77 85 89 +89 97 101 97 93 89 93 85 81 81 81 81 +81 85 81 85 89 93 93 93 93 89 89 89 +89 93 93 93 93 93 89 89 93 97 93 89 +85 93 93 89 93 97 93 93 93 89 89 89 +85 +85 81 81 89 93 89 93 89 85 81 89 89 85 +85 93 89 89 89 85 85 89 89 89 85 85 +85 89 85 85 89 89 89 89 89 81 77 73 +77 81 77 73 73 77 77 81 81 85 89 93 +93 93 85 85 85 81 77 77 73 81 85 89 +97 101 101 97 97 93 93 89 85 85 85 81 +85 85 81 85 89 89 93 93 89 89 85 89 +89 93 93 93 93 89 85 89 89 93 93 93 +93 89 89 89 89 93 93 93 89 89 89 89 +85 +85 81 85 89 93 89 93 89 89 85 85 85 85 +85 85 89 89 93 89 89 89 89 93 89 85 +85 85 85 85 85 85 85 85 85 81 77 69 +73 77 73 73 77 77 81 81 85 89 93 93 +93 89 85 89 85 81 81 81 77 85 89 93 +97 97 97 97 101 93 93 85 85 81 81 85 +85 89 85 85 89 93 93 89 89 89 85 93 +93 89 85 89 89 85 89 89 89 89 93 97 +93 89 89 93 89 93 93 89 81 85 85 85 +85 +89 85 85 85 89 97 93 93 89 85 85 89 89 +89 89 89 85 89 89 85 89 93 93 89 89 +85 85 89 89 85 89 89 85 81 77 73 73 +73 73 73 77 77 77 77 81 85 93 93 93 +93 93 89 89 89 81 85 81 81 85 93 93 +93 93 93 97 97 93 89 85 81 81 81 85 +89 85 89 89 89 93 93 93 89 85 89 93 +89 89 85 89 89 89 93 93 93 93 97 97 +93 89 89 93 89 93 93 85 81 85 85 81 +85 +93 85 85 89 93 97 97 97 97 93 93 89 89 +93 89 85 85 85 85 89 89 89 93 93 89 +89 89 89 93 89 89 93 89 85 81 77 81 +77 73 73 77 77 77 81 85 89 93 93 89 +93 93 89 85 85 85 85 81 81 81 89 93 +93 89 93 93 93 85 85 81 81 81 85 85 +89 93 89 85 89 89 93 89 89 85 85 93 +89 85 85 85 89 89 93 97 93 97 97 93 +93 85 85 89 89 93 85 81 77 77 81 85 +89 +89 89 89 89 89 93 101 105 97 97 97 97 93 +93 89 85 81 85 85 89 89 89 89 89 89 +89 89 89 93 89 85 89 89 85 85 81 85 +81 77 77 77 81 81 85 85 93 97 97 89 +93 89 89 89 85 81 81 81 81 81 85 89 +89 89 89 89 89 81 81 77 77 85 85 85 +93 93 89 85 89 93 89 89 89 85 85 89 +89 85 85 85 89 93 93 97 93 93 93 97 +97 93 89 89 89 89 81 81 81 81 77 81 +85 +89 89 93 93 89 97 101 105 101 101 101 97 93 +89 89 85 81 81 81 81 89 89 89 89 85 +89 85 89 93 89 89 89 89 89 85 81 81 +77 77 77 81 85 85 89 89 97 97 93 89 +89 89 89 85 85 81 81 81 81 85 81 85 +89 85 85 85 81 85 81 77 81 89 89 89 +93 93 93 93 93 89 89 89 85 85 85 85 +85 85 85 85 89 97 97 97 93 89 93 97 +101 97 93 93 89 89 81 81 85 85 77 81 +81 +93 93 93 93 93 97 105 105 105 101 101 101 93 +89 89 89 85 85 81 81 85 85 85 85 85 +85 89 93 97 93 93 93 89 85 85 81 81 +77 77 81 85 89 93 93 97 97 93 93 89 +89 89 85 85 81 81 81 81 81 81 81 81 +89 85 81 81 81 81 81 85 89 89 93 97 +97 97 97 97 97 89 89 93 89 85 85 89 +89 85 85 85 89 97 97 93 93 93 93 93 +97 97 93 89 85 85 89 89 89 85 81 85 +85 +93 93 89 89 89 101 105 105 101 101 101 97 97 +93 93 93 89 85 89 81 81 89 85 85 89 +89 93 93 97 97 93 97 93 85 85 81 85 +85 81 85 85 89 89 93 93 93 89 85 85 +85 85 85 81 81 85 85 81 85 81 81 81 +81 85 81 81 81 81 81 81 89 93 93 97 +101 97 97 97 97 93 93 93 93 89 89 89 +89 85 85 85 89 89 89 89 89 93 89 89 +89 89 89 93 85 89 89 85 85 85 85 85 +85 +85 89 85 85 85 97 101 101 101 97 97 97 97 +97 93 89 89 85 85 85 81 85 85 85 89 +89 93 93 97 97 97 97 93 93 89 85 85 +89 93 89 89 93 93 97 93 89 89 85 85 +85 81 81 77 77 81 85 85 85 81 81 81 +81 81 85 81 77 81 81 81 85 93 93 97 +97 97 97 97 97 97 97 93 89 85 85 85 +81 85 85 85 89 89 89 89 89 93 89 89 +89 85 89 89 85 85 81 85 85 89 89 89 +85 +89 93 85 85 85 97 97 97 101 101 101 97 93 +93 89 85 85 85 85 85 85 85 81 77 85 +89 93 93 97 97 97 93 93 93 89 89 85 +89 89 89 89 89 89 89 89 85 89 85 85 +85 89 81 77 77 81 85 85 85 81 81 81 +81 85 85 89 81 77 77 77 81 89 93 97 +97 101 101 101 101 97 93 89 89 89 85 81 +81 85 85 85 89 89 85 89 85 85 89 85 +89 89 89 85 85 85 81 85 89 89 89 93 +89 +89 89 89 85 85 93 93 93 97 97 97 93 89 +89 85 85 89 85 81 81 81 81 85 81 85 +89 89 93 93 89 89 89 89 89 89 85 85 +89 89 93 93 89 85 85 85 85 85 81 85 +89 85 77 81 81 81 81 85 85 85 81 85 +81 81 81 81 81 73 73 77 77 85 93 97 +97 101 101 97 97 93 93 89 85 85 85 85 +85 85 85 85 85 85 85 89 89 89 89 89 +89 93 89 85 89 89 89 93 93 89 89 93 +93 +85 85 85 85 81 93 93 93 93 97 97 93 89 +89 85 85 89 85 81 81 81 81 81 81 85 +89 89 89 89 89 89 85 85 85 89 85 85 +85 89 93 89 89 89 85 85 85 85 81 85 +89 85 85 81 85 85 85 85 85 85 85 85 +85 81 81 85 81 81 77 81 85 85 93 97 +97 93 97 93 89 93 93 89 89 89 89 89 +89 85 81 85 85 85 85 85 89 93 93 89 +85 89 85 89 89 89 89 93 89 89 89 93 +89 +85 85 89 85 81 89 89 89 89 93 97 97 89 +85 85 89 93 89 85 85 85 85 85 89 89 +89 85 89 89 85 85 85 89 85 85 89 85 +85 89 89 89 85 85 85 85 85 85 81 81 +85 89 89 89 89 89 85 81 85 85 85 85 +85 85 85 85 81 81 85 93 89 89 89 93 +93 97 93 97 93 93 89 89 89 93 93 93 +85 85 81 85 85 85 81 81 85 89 93 89 +89 85 85 89 93 89 93 93 89 93 93 93 +93 +85 81 85 85 85 89 89 89 89 93 93 93 89 +89 89 89 89 89 89 85 85 85 85 85 85 +85 85 85 85 89 85 85 85 89 85 89 89 +89 89 93 89 85 85 85 85 81 81 77 85 +89 89 93 93 89 89 85 81 85 81 81 85 +85 89 89 85 85 85 85 93 93 93 93 93 +89 93 93 93 89 89 85 85 85 89 93 89 +85 85 85 89 85 85 81 81 81 85 89 89 +85 85 85 85 89 89 93 89 89 89 93 93 +93 +85 81 85 85 85 85 89 89 89 93 89 89 89 +89 89 89 89 89 85 85 89 89 85 85 85 +85 89 85 81 85 89 89 85 89 93 93 97 +93 85 89 89 89 89 89 85 85 89 85 89 +89 85 85 85 89 89 89 85 89 89 85 85 +85 89 85 85 81 81 85 93 89 93 93 97 +97 89 89 93 93 89 89 85 89 93 93 89 +85 81 81 85 85 85 81 85 85 85 85 89 +85 89 89 85 85 85 85 85 85 89 89 89 +89 +85 85 85 93 93 89 89 85 89 89 85 85 81 +89 89 85 85 89 89 89 89 89 89 93 89 +85 85 89 85 85 93 93 85 85 89 89 89 +85 81 85 89 85 85 85 85 85 89 93 93 +89 85 89 89 89 93 97 97 93 89 85 85 +85 85 85 85 81 77 85 89 89 93 97 101 +97 93 89 89 89 89 93 89 93 93 93 93 +89 85 85 85 89 89 89 89 85 85 85 89 +93 89 89 85 85 85 85 89 89 93 89 89 +89 +89 85 93 93 89 93 89 85 89 89 85 85 89 +93 89 89 85 85 85 85 89 89 85 89 85 +85 85 85 85 89 93 93 89 89 89 89 89 +85 81 85 85 89 85 85 85 89 89 89 89 +89 93 93 93 89 93 97 97 93 85 85 89 +85 81 81 81 81 81 85 85 85 93 97 97 +93 89 85 89 89 93 93 93 93 89 93 89 +89 85 85 85 85 85 89 89 85 89 89 89 +89 89 89 85 85 81 85 85 89 89 85 85 +85 diff --git a/modules/mmcif/test/test_restraints.py b/modules/mmcif/test/test_restraints.py index 42eb880731..611b558f48 100644 --- a/modules/mmcif/test/test_restraints.py +++ b/modules/mmcif/test/test_restraints.py @@ -122,8 +122,8 @@ def get_static_info(self): class MockPCAFitRestraint(IMP.Restraint): - def __init__(self, m, image_filename): - self.image_filename = image_filename + def __init__(self, m, image_filenames): + self.image_filenames = image_filenames IMP.Restraint.__init__(self, m, "MockRestraint %1%") def unprotected_evaluate(self, accum): return 0. @@ -137,7 +137,7 @@ def do_get_inputs(self): def get_static_info(self): i = IMP.RestraintInfo() i.add_string("type", "IMP.em2d.PCAFitRestraint") - i.add_filenames("image files", [self.image_filename]) + i.add_filenames("image files", self.image_filenames) i.add_float("pixel size", 2.2) i.add_float("resolution", 20.) i.add_int("projection number", 20) @@ -146,9 +146,11 @@ def get_static_info(self): def get_dynamic_info(self): i = IMP.RestraintInfo() - i.add_floats("cross correlation", [0.4]) - i.add_floats("rotation", [0., 0., 1., 0.]) - i.add_floats("translation", [241.8, 17.4, 0.0]) + i.add_floats("cross correlation", [0.4, 0.3]) + i.add_floats("rotation", [0., 0., 1., 0., + 0., 0., 1., 0.]) + i.add_floats("translation", [241.8, 17.4, 0.0, + 90.0, 80.0, 70.0]) return i @@ -269,7 +271,7 @@ def test_restraint_mapper_em2d_restraint(self): s = IMP.mmcif.System() m = IMP.Model() image_filename = self.get_input_file_name('image_2.pgm') - r = MockPCAFitRestraint(m, image_filename) + r = MockPCAFitRestraint(m, [image_filename]) r.set_was_used(True) rm = IMP.mmcif.restraint._RestraintMapper(s) frame = None @@ -294,6 +296,31 @@ def test_all_restraints_gaussian_em(self): self.assertAlmostEqual( wr.fits["model1"].cross_correlation_coefficient, 0.4, delta=1e-3) + def test_all_restraints_em2d_restraint(self): + """Test _AllRestraints with IMP.em2d.PCAFitRestraint""" + s = ihm.System() + comps = IMP.mmcif.data._ComponentMapper(s) + m = IMP.Model() + image1 = self.get_input_file_name('image_1.pgm') + image2 = self.get_input_file_name('image_2.pgm') + r = MockPCAFitRestraint(m, [image1, image2]) + rm = IMP.mmcif.restraint._AllRestraints(s, comps) + # Each image should map to a separate IHM restraint + wr1, wr2 = list(rm.handle(r, ["model0", "model1"])) + self.assertEqual(type(wr1), IMP.mmcif.restraint._NewEM2DRestraint) + self.assertEqual(type(wr1.dataset), ihm.dataset.EM2DClassDataset) + self.assertAlmostEqual( + wr1.fits["model0"].cross_correlation_coefficient, 0.4, delta=1e-3) + self.assertEqual(len(wr1.fits["model0"].rot_matrix), 3) + self.assertEqual(len(wr1.fits["model0"].tr_vector), 3) + + self.assertEqual(type(wr2), IMP.mmcif.restraint._NewEM2DRestraint) + self.assertEqual(type(wr2.dataset), ihm.dataset.EM2DClassDataset) + self.assertAlmostEqual( + wr2.fits["model0"].cross_correlation_coefficient, 0.3, delta=1e-3) + self.assertEqual(len(wr2.fits["model0"].rot_matrix), 3) + self.assertEqual(len(wr2.fits["model0"].tr_vector), 3) + if __name__ == '__main__': IMP.test.main()