def testBackengineDefaultPaths(self):
        """ Test that we can start a calculation with default paths given. """

        # Prepare input.
        shutil.copytree( TestUtilities.generateTestFilePath( 'pmi_out' ), os.path.abspath( 'pmi' ) )

        # Ensure proper cleanup.
        self.__dirs_to_remove.append( os.path.abspath( 'pmi') )
        self.__dirs_to_remove.append( os.path.abspath( 'diffr' ) )

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

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

        # Call backengine.
        status = diffractor.backengine()

        # Check successful completion.
        self.assertEqual(status, 0)

        # Check expected files exist.
        self.assertTrue( os.path.isdir( os.path.abspath( 'diffr' ) ) )
        self.assertIn( 'diffr_out_0000001.h5', os.listdir( os.path.abspath( 'diffr' ) ) )
        self.assertIn( 'diffr_out_0000002.h5', os.listdir( os.path.abspath( 'diffr' ) ) )
    def testBackengineInputDir(self):
        """ Test that we can start a test calculation if the input path is a directory. """

        # Cleanup.
        self.__dirs_to_remove.append('diffr')

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

        # Construct the object.
        diffractor = SingFELPhotonDiffractor(parameters=parameters, input_path=TestUtilities.generateTestFilePath('pmi_out'), output_path='diffr')

        # Call backengine.
        status = diffractor.backengine()

        # Check successful completion.
        self.assertEqual(status, 0)
    def testBackengineNoBeam(self):
        """ Test that we can start a test calculation with no explicit beam parameters. """

        # Cleanup.
        self.__dirs_to_remove.append('diffr')

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

        # Construct the object.
        diffractor = SingFELPhotonDiffractor(parameters=parameters,
                                             input_path=self.input_h5,
                                             output_path='diffr')

        # Call backengine.
        status = diffractor.backengine()

        # Check successful completion.
        self.assertEqual(status, 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_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() )
Ejemplo n.º 5
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()

        # 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(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()))
Ejemplo n.º 6
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=1,
            detector_geometry=self.detector_geometry)

        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)

        pattern = h5py.File(
            photon_diffractor.output_path)['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()

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

        self.assertAlmostEqual(numpy.linalg.norm(pattern - new_pattern), 0.0,
                               10)
Ejemplo n.º 7
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())
Ejemplo n.º 8
0
    def reference2NIP(self):
        """ Testing that diffraction intensities with 9fs 5keV pulses through SPB-SFX KB beamline are of the order of Yoon 2016. """

        source_file = "/data/netapp/grotec/datadump/5keV_9fs_2015_slice12_fromYoon2016.h5"
        #source_file = TestUtilities.generateTestFilePath("FELsource_out.h5")

        # Propagate
        propagator = XFELPhotonPropagator(parameters=None,
                                          input_path=source_file,
                                          output_path="prop_out.h5")
        propagator.backengine()
        propagator.saveH5()

        pmi = XMDYNDemoPhotonMatterInteractor(
            parameters=None,
            input_path=propagator.output_path,
            output_path="pmi",
            sample_path=TestUtilities.generateTestFilePath("sample.h5"))
        pmi.backengine()

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

        diffractor = SingFELPhotonDiffractor(parameters=diffraction_parameters,
                                             input_path=pmi.output_path,
                                             output_path="diffr_out.h5")
        diffractor.backengine()
Ejemplo n.º 9
0
    def testBug53(self):
        """ Tests a script that was found to raise if run in parallel mode. """

        self.__dirs_to_remove.append('diffr')

        diffraction_parameters = SingFELPhotonDiffractorParameters(
            uniform_rotation=True,
            calculate_Compton=True,
            slice_interval=100,
            number_of_slices=2,
            pmi_start_ID=1,
            pmi_stop_ID=9,
            number_of_diffraction_patterns=1,
            detector_geometry=self.detector_geometry,
        )

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

        photon_diffractor.backengine()
    def testBug53(self):
        """ Tests a script that was found to raise if run in parallel mode. """

        self.__dirs_to_remove.append('diffr')

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

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

        photon_diffractor.backengine()
Ejemplo n.º 11
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()
Ejemplo n.º 12
0
    def testBackengineWithSample(self):
        """ Test that we can start a test calculation if the sample was given via the parameters . """

        # Cleanup.
        sample_file = TestUtilities.generateTestFilePath('2nip.pdb')
        self.__dirs_to_remove.append('diffr')

        # Make sure sample file does not exist.
        if sample_file in os.listdir(os.getcwd()):
            os.remove(sample_file)

        parameters = SingFELPhotonDiffractorParameters(
            sample=sample_file,
            uniform_rotation=False,
            calculate_Compton=False,
            number_of_diffraction_patterns=2,
            beam_parameters=self.beam,
            detector_geometry=self.detector_geometry,
            forced_mpi_command='mpirun -np 2 -x OMP_NUM_THREADS=2',
        )

        # Construct the object.
        diffractor = SingFELPhotonDiffractor(parameters=parameters,
                                             input_path=None,
                                             output_path='diffr')

        # Call backengine.
        status = diffractor.backengine()

        # Check successful completion.
        self.assertEqual(status, 0)

        # Check expected files exist.
        self.assertTrue(os.path.isdir(os.path.abspath('diffr')))
        self.assertIn('diffr_out_0000001.h5',
                      os.listdir(diffractor.output_path))
        self.assertIn('diffr_out_0000002.h5',
                      os.listdir(diffractor.output_path))
Ejemplo n.º 13
0
    def testBackengineDefaultPaths(self):
        """ Test that we can start a calculation with default paths given. """

        # Prepare input.
        shutil.copytree(TestUtilities.generateTestFilePath('pmi_out'),
                        os.path.abspath('pmi'))

        # Ensure proper cleanup.
        self.__dirs_to_remove.append(os.path.abspath('pmi'))
        self.__dirs_to_remove.append(os.path.abspath('diffr'))

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

        # Construct the object.
        diffractor = SingFELPhotonDiffractor(parameters=parameters,
                                             input_path='pmi')

        # Call backengine.
        status = diffractor.backengine()

        # Check successful completion.
        self.assertEqual(status, 0)

        # Check expected files exist.
        self.assertTrue(os.path.isdir(os.path.abspath('diffr')))
        self.assertIn('diffr_out_0000001.h5',
                      os.listdir(os.path.abspath('diffr')))
Ejemplo n.º 14
0
    def testReference(self, debug=False):
        """ Check that singfel reproduces a given set of reference data. """

        self.__dirs_to_remove.append('diffr')

        beam_file = TestUtilities.generateTestFilePath('s2e.beam')
        geom_file = TestUtilities.generateTestFilePath('s2e.geom')
        # Setup diffraction parameters (no rotation because reference test).
        parameters = SingFELPhotonDiffractorParameters(
                                                       uniform_rotation=False,
                                                       calculate_Compton=True,
                                                       slice_interval=100,
                                                       number_of_slices=100,
                                                       pmi_start_ID=1,
                                                       pmi_stop_ID =1,
                                                       number_of_diffraction_patterns=1,
                                                       beam_parameter_file=beam_file,
                                                       beam_geometry_file=geom_file,
                                                       number_of_MPI_processes=2,
                                                        )

        # Setup diffraction calculator.
        diffractor = SingFELPhotonDiffractor(
                parameters=parameters,
                input_path=TestUtilities.generateTestFilePath('pmi_out'),
                output_path='diffr'
                )

        # Run (reads input and write output, as well).
        diffractor.backengine()

        # Open results file.
        h5_handle = h5py.File(os.path.join(diffractor.output_path,'diffr_out_0000001.h5'),'r')

        # Get data (copy).
        diffraction_data = h5_handle['/data/diffr'].value

        h5_handle.close()

        # Get total intensity.
        intensity = diffraction_data.sum()

        # Get hash of the data.
        this_hash = hash( diffraction_data.tostring() )

        if debug:
            print "%15.14e" % (intensity)

            # Save wavefront data for reference.
            #########################################################################################
            ## ATTENTION: Overwrites reference data, use only if you're sure you want to do this. ###
            #########################################################################################
            #with open(TestUtilities.generateTestFilePath("singfel_reference.hash.txt"), 'w') as hashfile:
                #hashfile.write(str(this_hash))
                #hashfile.close()
            #########################################################################################

            self.assertEqual(math.pi, 22./7.)

        # Load reference hash.
        with open( TestUtilities.generateTestFilePath("singfel_reference.hash.txt"), 'r') as hashfile:
            ref_hash = hashfile.readline()
            hashfile.close()

        # Weak test.
        reference_intensity = '5.18647193908691e+01'
        self.assertEqual( "%15.14e" % (intensity), reference_intensity)

        # Strong test.
        self.assertEqual( ref_hash, str(this_hash) )
Ejemplo n.º 15
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()
Ejemplo n.º 16
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()
Ejemplo n.º 17
0
geom = "s2e.geom"  # e.g. s2e.geom

parameters = SingFELPhotonDiffractorParameters(
    uniform_rotation=True,  # Uniform sampling of rotation space.
    calculate_Compton=False,  # Do not calculate Compton scattering
    slice_interval=100,  # Take interval of 100 pmi snapshots
    number_of_slices=2,  # Take two snapshots from this interval
    pmi_start_ID=1,  # Start with this pmi file ID.
    pmi_stop_ID=1,  # Stop after this pmi file ID.
    number_of_diffraction_patterns=
    100,  # Calculate 100 patterns from each trajectory.
    beam_parameter_file=beam,  # Beam file.
    beam_geometry_file=geom,  # Geometry file (detector).
    cpus_per_task=
    1,  # Use one CPU per MPI process. Number of processes is guessed from machine parameters.
)

# Construct the object.
diffractor = SingFELPhotonDiffractor(parameters=parameters,
                                     input_path=pmi_path,
                                     output_path='diffr')

# Call backengine.
status = diffractor.backengine()

if status != 0:
    print("Diffraction calculation failed, check output.")
    sys.exit()

print("Diffraction calculation succeeded.")