示例#1
0
    def testDeSerialize(self):
        """ Test deserialization (i.e. construction from a file/string). """

        # Setup geometry.
        geometry = DetectorGeometry(panels=[self.__panel0, self.__panel1])

        # Serialize
        stream = io.StringIO()
        geometry.serialize(stream=stream)
        serialized_panel = stream.getvalue()
        stream.close()

        # Deserialize
        deserialized_geometry = _detectorGeometryFromString(serialized_panel)

        # Compare.
        for i, panel in enumerate(geometry.panels):
            self.assertAlmostEqual(panel.ranges,
                                   deserialized_geometry.panels[i].ranges)
            self.assertAlmostEqual(panel.corners,
                                   deserialized_geometry.panels[i].corners)
            self.assertEqual(panel.fast_scan_xyz,
                             deserialized_geometry.panels[i].fast_scan_xyz)
            self.assertEqual(panel.slow_scan_xyz,
                             deserialized_geometry.panels[i].slow_scan_xyz)
            self.assertAlmostEqual(
                panel.pixel_size.magnitude,
                deserialized_geometry.panels[i].pixel_size.magnitude)
            self.assertAlmostEqual(
                panel.distance_from_interaction_plane.magnitude,
                deserialized_geometry.panels[i].
                distance_from_interaction_plane.magnitude)
示例#2
0
    def testDeSerializeOnlyCommonBlock(self):
        """ Test deserialization when only a common block is present in the file. """

        # Read in the file.
        with open(TestUtilities.generateTestFilePath(
                "one_panel.geom")) as geom_file_handle:
            geom_string = "".join(geom_file_handle.readlines())

        # Setup geometry.
        geometry = _detectorGeometryFromString(geom_string)

        # Check parameters from common block
        self.assertEqual(len(geometry.panels), 1)
        self.assertEqual(geometry.panels[0].energy_response,
                         1.25e-4 / electronvolt)
示例#3
0
    def testDeSerializeCommonBlockWithOverwrite(self):
        """ Test deserialization when a common block is present but one panel overwrites a parameter."""

        # Read in the file.
        with open(TestUtilities.generateTestFilePath(
                "common_overwrite.geom")) as geom_file_handle:
            geom_string = "".join(geom_file_handle.readlines())

        # Setup geometry.
        geometry = _detectorGeometryFromString(geom_string)

        # Check parameters from common block
        self.assertEqual(len(geometry.panels), 2)
        self.assertEqual(geometry.panels[0].energy_response,
                         1.0 / electronvolt)
        self.assertEqual(geometry.panels[1].energy_response,
                         2.0 / electronvolt)
示例#4
0
    def testDeSerializeWithCommonBlock(self):
        """ Test deserialization when a common block is present in the file. """

        # Read in the file.
        with open(TestUtilities.generateTestFilePath(
                "simple.geom")) as geom_file_handle:
            geom_string = "".join(geom_file_handle.readlines())

        # Setup geometry.
        geometry = _detectorGeometryFromString(geom_string)

        # Check parameters from common block
        self.assertEqual(geometry.panels[0].energy_response,
                         1.0 / electronvolt)
        self.assertEqual(geometry.panels[1].energy_response,
                         1.0 / electronvolt)

        # Check parameters from individual blocks
        self.assertNotEqual(geometry.panels[0].ranges,
                            geometry.panels[1].ranges)
示例#5
0
    def testDeSerializeFromFile(self):
        geom_file_path = TestUtilities.generateTestFilePath("simple.geom")
        with open(geom_file_path, 'r') as geom_file_handle:
            geom_string = ''.join(geom_file_handle.readlines())

        geom_instance = _detectorGeometryFromString(geom_string)
    def _run(self):
        """ Perform the actual calls to pattern_sim. """

        # Setup directory structure as needed.
        if not os.path.isdir(self.output_path):
            os.makedirs(self.output_path)

        output_file_base = os.path.join(self.output_path, "diffr_out")

        if self.parameters.number_of_diffraction_patterns == 1:
            output_file_base += "_0000001.h5"

        # Serialize geometry if necessary.
        if isinstance(self.parameters.detector_geometry,
                      str) and os.path.isfile(
                          self.parameters.detector_geometry):
            with open(self.parameters.detector_geometry) as tmp_geom_file:
                geom_string = "\n".join(tmp_geom_file.readlines())

            self.parameters.detector_geometry = _detectorGeometryFromString(
                geom_string)

        geom_file = tempfile.NamedTemporaryFile(suffix=".geom", delete=True)
        geom_filename = geom_file.name
        self.parameters.detector_geometry.serialize(stream=geom_filename,
                                                    caller=self.parameters)

        # Setup command, minimum set first.
        # Distribute patterns over available processes in round-robin.
        command_sequence = [
            'pattern_sim',
            '-p%s' % self.parameters.sample,
            '--geometry=%s' % geom_filename,
            '--output=%s' % (output_file_base),
            '--number=%d' % (self.parameters.number_of_diffraction_patterns)
        ]
        # Handle random rotation as requested.
        if self.parameters.uniform_rotation is True:
            command_sequence.append('--random-orientation')
            command_sequence.append('--really-random')

        if self.parameters.beam_parameters is not None:
            command_sequence.append(
                '--photon-energy=%f' %
                (self.parameters.beam_parameters.photon_energy.m_as(
                    electronvolt)))
            command_sequence.append('--beam-bandwidth=%f' %
                                    (self.parameters.beam_parameters.
                                     photon_energy_relative_bandwidth))
            nphotons = self.parameters.beam_parameters.pulse_energy / self.parameters.beam_parameters.photon_energy
            command_sequence.append('--nphotons=%e' % (nphotons))
            command_sequence.append(
                '--beam-radius=%e' %
                (self.parameters.beam_parameters.beam_diameter_fwhm.m_as(meter)
                 / 2.))
            command_sequence.append('--spectrum=%s' %
                                    (self.parameters.beam_parameters.
                                     photon_energy_spectrum_type.lower()))
            if self.parameters.beam_parameters.photon_energy_spectrum_type.lower(
            ) == "sase":
                command_sequence.append('--sample-spectrum=512')

        # Handle intensities list if present.
        if self.parameters.intensities_file is not None:
            command_sequence.append('--intensities=%s' %
                                    (self.parameters.intensities_file))

        # Handle powder if present.
        if self.parameters.powder is True:
            command_sequence.append(
                '--powder=%s' % (os.path.join(self.output_path, "powder.h5")))

        # Handle size range if present.
        if self.parameters.crystal_size_min is not None:
            command_sequence.append(
                '--min-size=%f' %
                (self.parameters.crystal_size_min.m_as(1e-9 * meter)))
        if self.parameters.crystal_size_max is not None:
            command_sequence.append(
                '--max-size=%f' %
                (self.parameters.crystal_size_max.m_as(1e-9 * meter)))

        # Handle gpu acceleration.
        if self.parameters.gpus_per_task > 0:
            # Check if crystfel was built with opencv support.
            # Get pattern_sim's path.
            pattern_sim_path = subprocess.check_output(
                shlex.split("which pattern_sim"))[:-1].decode('utf-8')
            # Get list of dynamic dependencies.
            ldd = subprocess.check_output(
                shlex.split("ldd " + pattern_sim_path)).decode('utf-8')
            if "libOpenCL.so.1" in ldd:
                command_sequence.append('--gpu')

        if 'SIMEX_VERBOSE' in os.environ:
            print("Pattern_sim call: " + " ".join(command_sequence))

        # Run the backengine command.
        proc = subprocess.Popen(command_sequence)
        proc.wait()

        return proc.returncode