Exemplo n.º 1
0
    def testH5Output(self):
        """ Test that data, params and misc are present in hdf5 output file. """

        # Ensure proper cleanup.
        sample_file = TestUtilities.generateTestFilePath('2nip.pdb')
        self.__dirs_to_remove.append(os.path.abspath('diffr'))
        self.__files_to_remove.append(os.path.abspath('diffr.h5'))

        # Set up parameters.
        parameters = SingFELPhotonDiffractorParameters(
            sample=sample_file,
            uniform_rotation=False,
            calculate_Compton=False,
            slice_interval=100,
            number_of_slices=3,
            pmi_start_ID=1,
            pmi_stop_ID=1,
            number_of_diffraction_patterns=2,
            beam_parameters=self.beam,
            detector_geometry=self.detector_geometry,
            forced_mpi_command='mpirun -np 2',
        )

        # Construct the object.
        diffractor = SingFELPhotonDiffractor(parameters=parameters)

        # Run and save.
        diffractor.backengine()
        diffractor.saveH5()

        # Examine content of results hdf.
        with h5py.File(diffractor.output_path, 'r') as h5:
            # Datagroups in /"
            self.assertIn("data", h5.keys())
            self.assertIn("params", h5.keys())
            self.assertIn("misc", h5.keys())

            # Data.
            data = h5["data"]
            self.assertIn("0000001", data.keys())

            # Parameters
            params = h5["params"]
            self.assertIn("beam", params.keys())
            self.assertIn("geom", params.keys())

            # Beam
            beam = h5["params/beam"]
            self.assertIn("focusArea", beam.keys())
            self.assertIn("photonEnergy", beam.keys())

            # Geometry
            geom = h5["params/geom"]
            self.assertIn("detectorDist", geom.keys())
            self.assertIn("mask", geom.keys())
            self.assertIn("pixelHeight", geom.keys())
            self.assertIn("pixelWidth", geom.keys())
Exemplo n.º 2
0
    def testNoRotation(self):
        """ Test that we can run singfel with no-rotation option."""

        diffraction_parameters = SingFELPhotonDiffractorParameters(
            uniform_rotation=None,
            calculate_Compton=False,
            slice_interval=100,
            number_of_slices=3,
            pmi_start_ID=1,
            pmi_stop_ID=1,
            number_of_diffraction_patterns=2,
            detector_geometry=self.detector_geometry,
            forced_mpi_command='mpirun -np 2',
        )

        photon_diffractor = SingFELPhotonDiffractor(
            parameters=diffraction_parameters,
            input_path=TestUtilities.generateTestFilePath('pmi_out'),
            output_path='diffr_newstyle')

        # Cleanup.
        #self.__dirs_to_remove.append(photon_diffractor.output_path)

        # Run backengine and convert files.
        # Ensure removal of directory.
        self.__dirs_to_remove.append(photon_diffractor.output_path)

        photon_diffractor.backengine()
        photon_diffractor.saveH5()

        # Cleanup new style files.
        # Ensure removal of linked hdf.
        self.__files_to_remove.append(photon_diffractor.output_path)

        with h5py.File(photon_diffractor.output_path) as handle:
            pattern = handle['data/0000001/diffr'].value

        # 2nd run.
        photon_diffractor = SingFELPhotonDiffractor(
            parameters=diffraction_parameters,
            input_path=TestUtilities.generateTestFilePath('pmi_out'),
            output_path='diffr_newstyle')

        # Run backengine and convert files.
        photon_diffractor.backengine()
        photon_diffractor.saveH5()

        with h5py.File(photon_diffractor.output_path) as handle:
            new_pattern = handle['data/0000001/diffr'].value

        self.assertAlmostEqual(numpy.linalg.norm(pattern - new_pattern), 0.0,
                               5)
Exemplo n.º 3
0
    def testSingleFile(self):
        """ Test that saveH5() generates only one linked hdf. """

        parameters = SingFELPhotonDiffractorParameters(
            sample=None,
            uniform_rotation=False,
            calculate_Compton=False,
            slice_interval=100,
            number_of_slices=3,
            pmi_start_ID=1,
            pmi_stop_ID=1,
            number_of_diffraction_patterns=8,
            beam_parameters=self.beam,
            detector_geometry=self.detector_geometry,
            forced_mpi_command='mpirun -np 8',
        )

        photon_diffractor = SingFELPhotonDiffractor(
            parameters=parameters,
            input_path=TestUtilities.generateTestFilePath('pmi_out'),
            output_path='diffr_newstyle')

        # Cleanup.
        self.__dirs_to_remove.append(photon_diffractor.output_path)

        # Run backengine and convert files.
        photon_diffractor.backengine()
        photon_diffractor.saveH5()

        linked_h5 = photon_diffractor.output_path + '.h5'

        # Cleanup new style files.
        self.__files_to_remove.append(linked_h5)

        # Check that only one file was generated.
        self.assertTrue(os.path.isfile(linked_h5))

        # Open the file for reading.
        h5_filehandle = h5py.File(linked_h5, 'r')

        # Count groups under /data.
        number_of_patterns = len(list(h5_filehandle['data'].keys()))

        self.assertEqual(number_of_patterns, 8)

        # Assert global metadata is present.
        self.assertIn("params", list(h5_filehandle.keys()))
        self.assertIn("version", list(h5_filehandle.keys()))
        self.assertIn("info", list(h5_filehandle.keys()))
    def testSingleFile(self):
        """ Test that saveH5() generates only one linked hdf. """


        diffraction_parameters={ 'uniform_rotation': True,
                     'calculate_Compton' : True,
                     'slice_interval' : 100,
                     'number_of_slices' : 2,
                     'pmi_start_ID' : 1,
                     'pmi_stop_ID'  : 4,
                     'number_of_diffraction_patterns' : 2,
                     'beam_parameter_file': TestUtilities.generateTestFilePath('s2e.beam'),
                     'beam_geometry_file' : TestUtilities.generateTestFilePath('s2e.geom'),
                     'number_of_MPI_processes' : 8,
                   }

        photon_diffractor = SingFELPhotonDiffractor(
                parameters=diffraction_parameters,
                input_path=TestUtilities.generateTestFilePath('pmi_out'),
                output_path='diffr_newstyle')

        # Cleanup.
        self.__dirs_to_remove.append(photon_diffractor.output_path)

        # Run backengine and convert files.
        photon_diffractor.backengine()
        photon_diffractor.saveH5()

        # Cleanup new style files.
        self.__files_to_remove.append(photon_diffractor.output_path)

        # Check that only one file was generated.
        self.assertTrue( os.path.isfile( photon_diffractor.output_path ))

        # Open the file for reading.
        h5_filehandle = h5py.File( photon_diffractor.output_path, 'r')

        # Count groups under /data.
        number_of_patterns = len(h5_filehandle.keys()) - 3

        self.assertEqual( number_of_patterns, 8 )

        # Assert global metadata is present.
        self.assertIn("params", h5_filehandle.keys() )
        self.assertIn("version", h5_filehandle.keys() )
        self.assertIn("info", h5_filehandle.keys() )
        self.assertIn("geom", h5_filehandle["params"].keys() )
Exemplo n.º 5
0
    def testSingleFile(self):
        """ Test that saveH5() generates only one linked hdf. """

        diffraction_parameters = {
            'uniform_rotation': True,
            'calculate_Compton': True,
            'slice_interval': 100,
            'number_of_slices': 2,
            'pmi_start_ID': 1,
            'pmi_stop_ID': 4,
            'number_of_diffraction_patterns': 2,
            'beam_parameters': None,
            'detector_geometry': self.detector_geometry,
            'number_of_MPI_processes': 8,
        }

        photon_diffractor = SingFELPhotonDiffractor(
            parameters=diffraction_parameters,
            input_path=TestUtilities.generateTestFilePath('pmi_out'),
            output_path='diffr_newstyle')

        # Cleanup.
        self.__dirs_to_remove.append(photon_diffractor.output_path)

        # Run backengine and convert files.
        photon_diffractor.backengine()
        photon_diffractor.saveH5()

        # Cleanup new style files.
        self.__files_to_remove.append(photon_diffractor.output_path)

        # Check that only one file was generated.
        self.assertTrue(os.path.isfile(photon_diffractor.output_path))

        # Open the file for reading.
        h5_filehandle = h5py.File(photon_diffractor.output_path, 'r')

        # Count groups under /data.
        number_of_patterns = len(h5_filehandle['data'].keys())

        self.assertEqual(number_of_patterns, 8)

        # Assert global metadata is present.
        self.assertIn("params", h5_filehandle.keys())
        self.assertIn("version", h5_filehandle.keys())
        self.assertIn("info", h5_filehandle.keys())
Exemplo n.º 6
0
    def testH5OutputThrice(self):
        """ Test whether the backengine behaves normally after multiple calculation"""

        # Ensure proper cleanup.
        sample_file = TestUtilities.generateTestFilePath('2nip.pdb')

        # Set up parameters.
        parameters = SingFELPhotonDiffractorParameters(
            sample=sample_file,
            uniform_rotation=False,
            calculate_Compton=False,
            slice_interval=100,
            number_of_slices=3,
            pmi_start_ID=1,
            pmi_stop_ID=1,
            number_of_diffraction_patterns=2,
            beam_parameters=self.beam,
            detector_geometry=self.detector_geometry,
            forced_mpi_command='mpirun -np 2',
        )

        # Construct the object.
        diffractor = SingFELPhotonDiffractor(parameters=parameters,
                                             output_path='tmp/diffr')

        # Run and save.
        diffractor.backengine()
        diffractor.saveH5()
        self.__dirs_to_remove.append(os.path.abspath('tmp'))
        self.__files_to_remove.append(
            os.path.abspath(diffractor.output_path + '.h5'))

        os.remove('tmp/diffr.h5')
        shutil.rmtree('tmp/diffr')

        diffractor.backengine()
        diffractor.saveH5()

        try:
            os.remove('tmp/diffr.h5')
            shutil.rmtree('tmp/diffr')
        except IsADirectoryError:
            shutil.rmtree('tmp')
            print(sys.exc_info()[0])
            raise

        diffractor.backengine()
        diffractor.saveH5()
Exemplo n.º 7
0
    def plot_diffr_vs_detector(self):
        """ Compare patterns before and after detector sim. """

        # Cleanup.
        #self.__files_to_remove.append('5mzd.pdb')
        #self.__files_to_remove.append('diffr.h5')
        #self.__dirs_to_remove.append('diffr')

        # Avoid crash due to multiple instances of G4RunManager
        del self._detector

        # Setup detector geometry.
        detector_panel = DetectorPanel(
            ranges={
                'fast_scan_min': 0,
                'fast_scan_max': 511,
                'slow_scan_min': 0,
                'slow_scan_max': 511
            },
            pixel_size=2.2e-4 * Units.meter,
            photon_response=1.0,
            distance_from_interaction_plane=0.13 * Units.meter,
            corners={
                'x': -256,
                'y': -256
            },
        )

        detector_geometry = DetectorGeometry(panels=[detector_panel])

        # Setup photon beam.
        beam = PhotonBeamParameters(
            photon_energy=4.96e3 * Units.electronvolt,
            beam_diameter_fwhm=1.0e-6 * Units.meter,
            pulse_energy=1.0e-3 * Units.joule,
            photon_energy_relative_bandwidth=0.001,
            divergence=1e-3 * Units.radian,
            photon_energy_spectrum_type="SASE",
        )

        # Setup and run the diffraction sim.
        diffraction_parameters = SingFELPhotonDiffractorParameters(
            uniform_rotation=None,
            calculate_Compton=False,
            number_of_diffraction_patterns=1,
            detector_geometry=detector_geometry,
            beam_parameters=beam,
            sample="5mzd.pdb",
            forced_mpi_command='mpirun -np 1',
        )

        photon_diffractor = SingFELPhotonDiffractor(
            parameters=diffraction_parameters,
            output_path='diffr',
        )

        photon_diffractor.backengine()
        photon_diffractor.saveH5()

        analysis1 = DiffractionAnalysis(photon_diffractor.output_path,
                                        pattern_indices=[1],
                                        poissonize=True)
        analysis1.plotPattern(
            operation=None,
            logscale=False,
        )

        parameters = XCSITPhotonDetectorParameters(
            detector_type="AGIPDSPB",
            patterns=[0],
        )

        detector = XCSITPhotonDetector(
            parameters=parameters,
            input_path="diffr.h5",
            output_path="detector_out.h5",
        )

        detector._readH5()
        detector.backengine()
        detector.saveH5()

        # Weak test Check we have photons in the signal.
        pattern = h5py.File("detector_out.h5", 'r')['data/0000001/data'].value

        analysis2 = DiffractionAnalysis(detector.output_path,
                                        pattern_indices=[1],
                                        poissonize=True)
        analysis2.plotPattern(
            operation=None,
            logscale=False,
        )

        mpl.pyplot.show()
Exemplo n.º 8
0
    beam_diameter_fwhm=226.0e-9 * meter,  #sqrt(250*160/pi)*2
    pulse_energy=4.0e-3 * joule,
)

diffraction_parameters = SingFELPhotonDiffractorParameters(
    uniform_rotation=True,
    calculate_Compton=False,
    number_of_diffraction_patterns=36,
    detector_geometry=detector_geometry,
    beam_parameters=beam,
    forced_mpi_command='mpirun -np 36')

out_path = "diffr"

cleanUp(out_path)

diffractor = SingFELPhotonDiffractor(parameters=diffraction_parameters,
                                     input_path='./4V7V.pdb',
                                     output_path=out_path)

from timeit import default_timer as timer
start = timer()

diffractor.backengine()

end = timer()
print(end - start, 's')  # Time in seconds

# Link the .h5 output generated from mpirun together
diffractor.saveH5()