def testBackengineAutoMPICommand(self): """ Test that we can start a test calculation. """ # 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=self.beam, detector_geometry=self.detector_geometry, ) # 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 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 = 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=TestUtilities.generateTestFilePath('pmi_out'), output_path='diffr') # Call backengine. status = diffractor.backengine() # Check successful completion. self.assertEqual(status, 0)
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 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': 1, 'number_of_diffraction_patterns': 2, 'beam_parameter_file': TestUtilities.generateTestFilePath('s2e.beam'), 'beam_geometry_file': TestUtilities.generateTestFilePath('s2e.geom'), } # Construct the object. diffractor = SingFELPhotonDiffractor(parameters=parameters, input_path=os.path.dirname( self.input_h5), output_path='diffr') # Call backengine. status = diffractor.backengine() # Check successful completion. self.assertEqual(status, 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={ '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 testDefaultConstructionLegacy(self): """ Testing the default construction of the class with MPI parameter. """ # 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')) # Set up parameters. 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_parameters': None, 'detector_geometry': self.detector_geometry, 'number_of_MPI_processes': 2, } # Construct the object. diffractor = SingFELPhotonDiffractor(parameters=parameters, input_path='pmi') # Check type. self.assertIsInstance(diffractor, SingFELPhotonDiffractor) # Check default output_path. self.assertEqual(diffractor.output_path, os.path.abspath('diffr'))
def testDefaultConstructionLegacy(self): """ Testing the default construction of the class with MPI parameter. """ # 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')) # Set up parameters. 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=2, beam_parameters=self.beam, detector_geometry=self.detector_geometry, forced_mpi_command='mpirun -np 2', ) # Construct the object. diffractor = SingFELPhotonDiffractor(parameters=parameters, input_path='pmi') # Check type. self.assertIsInstance(diffractor, SingFELPhotonDiffractor) # Check default output_path. self.assertEqual(diffractor.output_path, os.path.abspath('diffr'))
def testCheckInterfaceConsistency(self): """ Test if the check for interface consistency works correctly. """ # Setup a minimal experiment simulation. source_input = TestUtilities.generateTestFilePath('FELsource_out.h5') diffr_input = TestUtilities.generateTestFilePath('pmi_out_0000001.h5') pmi_input = TestUtilities.generateTestFilePath('prop_out.h5') photon_source = XFELPhotonSource(parameters=None, input_path=source_input, output_path='FELsource_out.h5') photon_propagator = XFELPhotonPropagator(parameters=None, input_path='FELsource_out.h5', output_path='prop_out.h5') pmi_parameters = { 'sample_path': TestUtilities.generateTestFilePath('sample.h5') } photon_interactor = XMDYNDemoPhotonMatterInteractor( parameters=None, input_path=pmi_input, output_path='pmi_out.h5', sample_path=self.__sample_path) diffraction_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, } photon_diffractor = SingFELPhotonDiffractor( parameters=diffraction_parameters, input_path=diffr_input, output_path='diffr_out.h5') photon_detector = IdealPhotonDetector(parameters=None, input_path='diffr_out.h5', output_path='detector_out.h5') photon_analyzer = S2EReconstruction(parameters=None, input_path='detector_out.h5', output_path='analyzer_out.h5') pxs = PhotonExperimentSimulation( photon_source=photon_source, photon_propagator=photon_propagator, photon_interactor=photon_interactor, photon_diffractor=photon_diffractor, photon_detector=photon_detector, photon_analyzer=photon_analyzer, ) interfaces_are_consistent = pxs._checkInterfaceConsistency() self.assertTrue(interfaces_are_consistent)
def testConstructionWithSample(self): """ Testing the construction with sample passed via parameters.""" # Ensure proper cleanup. sample_file = TestUtilities.generateTestFilePath('2nip.pdb') self.__dirs_to_remove.append(os.path.abspath('diffr')) # Set up parameters. parameters = SingFELPhotonDiffractorParameters( sample=sample_file, uniform_rotation=False, calculate_Compton=False, slice_interval=100, number_of_slices=5, pmi_start_ID=1, pmi_stop_ID=1, number_of_diffraction_patterns=1, beam_parameters=self.beam, detector_geometry=self.detector_geometry, forced_mpi_command='mpirun') # Construct the object. diffractor = SingFELPhotonDiffractor(parameters=parameters) self.assertIsInstance(diffractor, SingFELPhotonDiffractor) self.assertEqual(diffractor.input_path, os.path.abspath(sample_file)) self.assertEqual(diffractor.output_path, os.path.abspath('diffr'))
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() )
def testCalculatorQueries(self): """ Test that the calculator queries return the correct calculators. """ # Setup a minimal experiment simulation. source_input = TestUtilities.generateTestFilePath('FELsource_out.h5') diffr_input = TestUtilities.generateTestFilePath('pmi_out.h5') pmi_input = TestUtilities.generateTestFilePath('prop_out.h5') photon_source = XFELPhotonSource(parameters=None, input_path=source_input, output_path='FELsource_out.h5') photon_propagator = XFELPhotonPropagator(parameters=None, input_path='FELsource_out.h5', output_path='prop_out.h5') photon_interactor = FakePhotonMatterInteractor( parameters=None, input_path=pmi_input, output_path='pmi_out.h5') diffraction_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'), } photon_diffractor = SingFELPhotonDiffractor( parameters=diffraction_parameters, input_path=diffr_input, output_path='diffr_out.h5') photon_detector = PerfectPhotonDetector(parameters=None, input_path='diffr_out.h5', output_path='detector_out.h5') photon_analyzer = S2EReconstruction(parameters=None, input_path='detector_out.h5', output_path='analyzer_out.h5') pxs = PhotonExperimentSimulation( photon_source=photon_source, photon_propagator=photon_propagator, photon_interactor=photon_interactor, photon_diffractor=photon_diffractor, photon_detector=photon_detector, photon_analyzer=photon_analyzer, ) # Check queries. self.assertIs(pxs.photon_source, photon_source) self.assertIs(pxs.photon_propagator, photon_propagator) self.assertIs(pxs.photon_interactor, photon_interactor) self.assertIs(pxs.photon_diffractor, photon_diffractor) self.assertIs(pxs.photon_detector, photon_detector) self.assertIs(pxs.photon_analyzer, photon_analyzer)
def testConstruction(self): """ Test the default constructor of this class. """ # Setup a minimal experiment simulation. source_input = TestUtilities.generateTestFilePath('FELsource_out.h5') diffr_input = TestUtilities.generateTestFilePath('pmi_out_0000001.h5') pmi_input = TestUtilities.generateTestFilePath('prop_out.h5') photon_source = XFELPhotonSource(parameters=None, input_path=source_input, output_path='FELsource_out.h5') photon_propagator = XFELPhotonPropagator(parameters=None, input_path='FELsource_out.h5', output_path='prop_out.h5') photon_interactor = XMDYNDemoPhotonMatterInteractor( parameters=None, input_path=pmi_input, output_path='pmi_out.h5', sample_path=self.__sample_path) diffraction_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, } photon_diffractor = SingFELPhotonDiffractor( parameters=diffraction_parameters, input_path=diffr_input, output_path='diffr_out.h5') photon_detector = IdealPhotonDetector(parameters=None, input_path='diffr_out.h5', output_path='detector_out.h5') photon_analyzer = S2EReconstruction(parameters=None, input_path='detector_out.h5', output_path='analyzer_out.h5') pxs = PhotonExperimentSimulation( photon_source=photon_source, photon_propagator=photon_propagator, photon_interactor=photon_interactor, photon_diffractor=photon_diffractor, photon_detector=photon_detector, photon_analyzer=photon_analyzer, ) # Check instance. self.assertIsInstance(pxs, PhotonExperimentSimulation)
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()
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 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))
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()
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())
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')))
def testCheckInterfaceConsistency(self): """ Test if the check for interface consistency works correctly. """ # Setup a minimal experiment simulation. source_input = TestUtilities.generateTestFilePath('FELsource_out.h5') diffr_input = TestUtilities.generateTestFilePath('pmi_out_0000001.h5') pmi_input = TestUtilities.generateTestFilePath('prop_out.h5') photon_source = XFELPhotonSource(parameters=None, input_path=source_input, output_path='FELsource_out.h5') photon_propagator = XFELPhotonPropagator(parameters=None, input_path='FELsource_out.h5', output_path='prop_out.h5') pmi_parameters = { 'sample_path': TestUtilities.generateTestFilePath('sample.h5') } photon_interactor = XMDYNDemoPhotonMatterInteractor( parameters=None, input_path=pmi_input, output_path='pmi_out.h5', sample_path=self.__sample_path) diffraction_parameters = self.diffractorParam_1 photon_diffractor = SingFELPhotonDiffractor( parameters=diffraction_parameters, input_path=diffr_input, output_path='diffr_out.h5') photon_detector = IdealPhotonDetector(parameters=None, input_path='diffr_out.h5', output_path='detector_out.h5') photon_analyzer = S2EReconstruction(parameters=None, input_path='detector_out.h5', output_path='analyzer_out.h5') pxs = PhotonExperimentSimulation( photon_source=photon_source, photon_propagator=photon_propagator, photon_interactor=photon_interactor, photon_diffractor=photon_diffractor, photon_detector=photon_detector, photon_analyzer=photon_analyzer, ) interfaces_are_consistent = pxs._checkInterfaceConsistency() self.assertTrue(interfaces_are_consistent)
def testCalculatorQueries(self): """ Test that the calculator queries return the correct calculators. """ # Setup a minimal experiment simulation. source_input = TestUtilities.generateTestFilePath('FELsource_out.h5') diffr_input = TestUtilities.generateTestFilePath('pmi_out_0000001.h5') pmi_input = TestUtilities.generateTestFilePath('prop_out.h5') photon_source = XFELPhotonSource(parameters=None, input_path=source_input, output_path='FELsource_out.h5') photon_propagator = XFELPhotonPropagator(parameters=None, input_path='FELsource_out.h5', output_path='prop_out.h5') photon_interactor = XMDYNDemoPhotonMatterInteractor( parameters=None, input_path=pmi_input, output_path='pmi_out.h5', sample_path=self.__sample_path) diffraction_parameters = self.diffractorParam_2 photon_diffractor = SingFELPhotonDiffractor( parameters=diffraction_parameters, input_path=diffr_input, output_path='diffr_out.h5') photon_detector = IdealPhotonDetector(parameters=None, input_path='diffr_out.h5', output_path='detector_out.h5') photon_analyzer = S2EReconstruction(parameters=None, input_path='detector_out.h5', output_path='analyzer_out.h5') pxs = PhotonExperimentSimulation( photon_source=photon_source, photon_propagator=photon_propagator, photon_interactor=photon_interactor, photon_diffractor=photon_diffractor, photon_detector=photon_detector, photon_analyzer=photon_analyzer, ) # Check queries. self.assertIs(pxs.photon_source, photon_source) self.assertIs(pxs.photon_propagator, photon_propagator) self.assertIs(pxs.photon_interactor, photon_interactor) self.assertIs(pxs.photon_diffractor, photon_diffractor) self.assertIs(pxs.photon_detector, photon_detector) self.assertIs(pxs.photon_analyzer, photon_analyzer)
def testConstructionParameters(self): """ Check we can construct with a parameter object. """ 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=self.beam, detector_geometry=self.detector_geometry, ) diffractor = SingFELPhotonDiffractor(parameters=parameters, input_path=self.input_h5, output_path='diffr_out.h5') # Check instance. self.assertIsInstance(diffractor, SingFELPhotonDiffractor)
def testConstruction(self): """ Test the default constructor of this class. """ # Setup a minimal experiment simulation. source_input = TestUtilities.generateTestFilePath('FELsource_out.h5') diffr_input = TestUtilities.generateTestFilePath('pmi_out_0000001.h5') pmi_input = TestUtilities.generateTestFilePath('prop_out.h5') photon_source = XFELPhotonSource(parameters=None, input_path=source_input, output_path='FELsource_out.h5') photon_propagator = XFELPhotonPropagator(parameters=None, input_path='FELsource_out.h5', output_path='prop_out.h5') photon_interactor = XMDYNDemoPhotonMatterInteractor( parameters=None, input_path=pmi_input, output_path='pmi_out.h5', sample_path=self.__sample_path) diffraction_parameters = self.diffractorParam_1 photon_diffractor = SingFELPhotonDiffractor( parameters=diffraction_parameters, input_path=diffr_input, output_path='diffr_out.h5') photon_detector = IdealPhotonDetector(parameters=None, input_path='diffr_out.h5', output_path='detector_out.h5') photon_analyzer = S2EReconstruction(parameters=None, input_path='detector_out.h5', output_path='analyzer_out.h5') pxs = PhotonExperimentSimulation( photon_source=photon_source, photon_propagator=photon_propagator, photon_interactor=photon_interactor, photon_diffractor=photon_diffractor, photon_detector=photon_detector, photon_analyzer=photon_analyzer, ) # Check instance. self.assertIsInstance(pxs, PhotonExperimentSimulation)
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 testShapedConstructionDict(self): """ Testing the construction of the class with parameters given as a dict. """ 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_parameters': self.beam, 'detector_geometry': self.detector_geometry, } # Construct the object. diffractor = SingFELPhotonDiffractor(parameters=parameters, input_path=self.input_h5, output_path='diffr_out.h5') self.assertIsInstance(diffractor, SingFELPhotonDiffractor)
def testShapedConstructionDict(self): """ Testing the construction of the class with parameters given as a dict. """ 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=self.beam, detector_geometry=self.detector_geometry, ) # Construct the object. diffractor = SingFELPhotonDiffractor(parameters=parameters, input_path=self.input_h5, output_path='diffr_out.h5') self.assertIsInstance(diffractor, SingFELPhotonDiffractor)
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())
def testConstruction(self): """ Testing the default construction of the class. """ 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'), } # Construct the object. diffractor = SingFELPhotonDiffractor(parameters=parameters, input_path=self.input_h5, output_path='diffr_out.h5') self.assertIsInstance(diffractor, SingFELPhotonDiffractor)
def testConstructionExceptions(self): """ Check that proper exceptions are thrown if object is constructed incorrectly. """ # Parameter not a dict. self.assertRaises(TypeError, SingFELPhotonDiffractor, 1, self.input_h5, 'diffr.h5') # Setup parameters that are ok 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'), } # Check construction with sane parameters. singfel = SingFELPhotonDiffractor(parameters, self.input_h5, 'diffr.h5') self.assertIsInstance(singfel, SingFELPhotonDiffractor) # uniform_rotation not a bool. parameters['uniform_rotation'] = 1 self.assertRaises(TypeError, SingFELPhotonDiffractor, parameters, self.input_h5, 'diffr.h5') # Reset. parameters['uniform_rotation'] = True # calculate_Compton not a bool. parameters['calculate_Compton'] = 1 self.assertRaises(TypeError, SingFELPhotonDiffractor, parameters, self.input_h5, 'diffr.h5') # Reset. parameters['calculate_Compton'] = False # slice_interval not positive integer. parameters['slice_interval'] = -1 self.assertRaises(TypeError, SingFELPhotonDiffractor, parameters, self.input_h5, 'diffr.h5') # slice_interval not a number parameters['slice_interval'] = 'one' self.assertRaises(TypeError, SingFELPhotonDiffractor, parameters, self.input_h5, 'diffr.h5') # Reset. parameters['slice_interval'] = 1 # number_of_slices not positive integer. parameters['number_of_slices'] = -1 self.assertRaises(TypeError, SingFELPhotonDiffractor, parameters, self.input_h5, 'diffr.h5') # number_of_slices not a number parameters['number_of_slices'] = 'one' self.assertRaises(TypeError, SingFELPhotonDiffractor, parameters, self.input_h5, 'diffr.h5') # Reset. parameters['number_of_slices'] = 2 # number_of_diffraction_patterns not positive integer. parameters['number_of_diffraction_patterns'] = -1 self.assertRaises(TypeError, SingFELPhotonDiffractor, parameters, self.input_h5, 'diffr.h5') # number_of_diffraction_patterns not a number parameters['number_of_diffraction_patterns'] = 'one' self.assertRaises(TypeError, SingFELPhotonDiffractor, parameters, self.input_h5, 'diffr.h5') # Reset. parameters['number_of_diffraction_patterns'] = 2 # pmi_start_ID not positive integer. parameters['pmi_start_ID'] = -1 self.assertRaises(TypeError, SingFELPhotonDiffractor, parameters, self.input_h5, 'diffr.h5') # pmi_start_ID not a number parameters['pmi_start_ID'] = 'one' self.assertRaises(TypeError, SingFELPhotonDiffractor, parameters, self.input_h5, 'diffr.h5') # Reset. parameters['pmi_start_ID'] = 1 # pmi_stop_ID not positive integer. parameters['pmi_stop_ID'] = -1 self.assertRaises(TypeError, SingFELPhotonDiffractor, parameters, self.input_h5, 'diffr.h5') # pmi_stop_ID not a number parameters['pmi_stop_ID'] = 'one' self.assertRaises(TypeError, SingFELPhotonDiffractor, parameters, self.input_h5, 'diffr.h5') # Reset. parameters['pmi_stop_ID'] = 1 # beam_parameter_file not a string. parameters['beam_parameter_file'] = 1 self.assertRaises(TypeError, SingFELPhotonDiffractor, parameters, self.input_h5, 'diffr.h5') # beam_parameter_file not a file. parameters['beam_parameter_file'] = 's2e.beam' self.assertRaises(IOError, SingFELPhotonDiffractor, parameters, self.input_h5, 'diffr.h5') parameters['beam_parameter_file'] = TestUtilities.generateTestFilePath( 's2e.beam') # beam_geometry_file not a string. parameters['beam_geometry_file'] = 1 self.assertRaises(TypeError, SingFELPhotonDiffractor, parameters, self.input_h5, 'diffr.h5') # beam_geometry_file not a file. parameters['beam_geometry_file'] = 's2e.geom' self.assertRaises(IOError, SingFELPhotonDiffractor, parameters, self.input_h5, 'diffr.h5') parameters['beam_geometry_file'] = TestUtilities.generateTestFilePath( 's2e.geom'), # Unknown parameter name. parameters['number_of_nonexisting_parameter'] = 3 self.assertRaises(RuntimeError, SingFELPhotonDiffractor, parameters, self.input_h5, 'diffr.h5')
# Diffraction with parameters. diffraction_parameters = { 'uniform_rotation': 1, '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'), } photon_diffractor = SingFELPhotonDiffractor(parameters=diffraction_parameters, input_path='pmi', output_path='diffr') # Perfect detector. photon_detector = PerfectPhotonDetector(parameters=None, input_path='diffr', output_path='detector') # Reconstruction: EMC+DM emc_parameters = { 'initial_number_of_quaternions': 1, 'max_number_of_quaternions': 9, 'max_number_of_iterations': 100, 'min_error': 1.0e-8, 'beamstop': 1.0e-5, 'detailed_output': False
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) )
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()
def testSimS2EWorkflowSingleFile(self): """ Testing that a workflow akin to the simS2E example workflow works. Only one I/O file per calculator. """ # These directories and files are expected to be present after a successfull calculation. expected_dirs = [ 'pmi', 'diffr', ] expected_symlinks = ['detector'] expected_files = [ 'FELsource_out.h5', 'prop_out.h5', 'pmi/pmi_out_0000001.h5', 'diffr/diffr_out_0000001.h5', 'detector/diffr_out_0000001.h5', 'recon.h5', 'orient_out.h5', ] # Ensure proper cleanup. self.__files_to_remove = expected_files + expected_symlinks self.__files_to_remove.append('prepHDF5.py') self.__dirs_to_remove = expected_dirs # Location of the FEL source file. source_input = TestUtilities.generateTestFilePath( 'FELsource_out/FELsource_out_0000001.h5') # Photon source. photon_source = XFELPhotonSource(parameters=None, input_path=source_input, output_path='FELsource_out.h5') # Photon propagator, default parameters. photon_propagator = XFELPhotonPropagator(parameters=None, input_path='FELsource_out.h5', output_path='prop_out.h5') # Photon interactor with default parameters. photon_interactor = XMDYNDemoPhotonMatterInteractor( parameters=None, input_path='prop_out.h5', output_path='pmi', sample_path=TestUtilities.generateTestFilePath('sample.h5')) # Diffraction with parameters. diffraction_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': 1, 'beam_parameter_file': TestUtilities.generateTestFilePath('s2e.beam'), 'beam_geometry_file': TestUtilities.generateTestFilePath('s2e.geom'), } photon_diffractor = SingFELPhotonDiffractor( parameters=diffraction_parameters, input_path='pmi', output_path='diffr') # Perfect detector. photon_detector = PerfectPhotonDetector(parameters=None, input_path='diffr', output_path='detector') # Reconstruction: EMC+DM emc_parameters = { 'initial_number_of_quaternions': 1, 'max_number_of_quaternions': 9, 'max_number_of_iterations': 3, 'min_error': 1.0e-8, 'beamstop': 1.0e-5, 'detailed_output': False } dm_parameters = { 'number_of_trials': 5, 'number_of_iterations': 2, 'averaging_start': 15, 'leash': 0.2, 'number_of_shrink_cycles': 2, } reconstructor = S2EReconstruction(parameters={ 'EMC_Parameters': emc_parameters, 'DM_Parameters': dm_parameters }, input_path='detector', output_path='recon.h5') # Setup the photon experiment. pxs = PhotonExperimentSimulation( photon_source=photon_source, photon_propagator=photon_propagator, photon_interactor=photon_interactor, photon_diffractor=photon_diffractor, photon_detector=photon_detector, photon_analyzer=reconstructor, ) # Run the experiment. pxs.run() # Check that all output files and directories are present. for directory in expected_dirs + expected_symlinks: self.assertTrue(os.path.isdir(directory)) for f in expected_files: print f self.assertTrue(os.path.isfile(f))
def testSimS2EWorkflowDirectories(self): """ Testing that a workflow akin to the simS2E example workflow works. Two sources, two diffraction patterns.""" # Setup directories. working_directory = 'SPI' source_dir = os.path.join(working_directory, 'FELsource') prop_dir = os.path.join(working_directory, 'prop') pmi_dir = os.path.join(working_directory, 'pmi') diffr_dir = os.path.join(working_directory, 'diffr') detector_dir = os.path.join(working_directory, 'detector') recon_dir = os.path.join(working_directory, 'recon') # Make directories. os.mkdir(working_directory) os.mkdir(source_dir) os.mkdir(prop_dir) os.mkdir(pmi_dir) os.mkdir(diffr_dir) os.mkdir(detector_dir) os.mkdir(recon_dir) # Ensure proper cleanup. self.__dirs_to_remove.append(working_directory) # Location of the FEL source file. source_input = TestUtilities.generateTestFilePath('FELsource_out') # Photon source. photon_source = XFELPhotonSource(parameters=None, input_path=source_input, output_path=source_dir) # Photon propagator, default parameters. photon_propagator = XFELPhotonPropagator(parameters=None, input_path=source_dir, output_path=prop_dir) # Photon interactor with default parameters. photon_interactor = XMDYNDemoPhotonMatterInteractor( parameters=None, input_path=prop_dir, output_path=pmi_dir, sample_path=TestUtilities.generateTestFilePath('sample.h5')) # Diffraction with parameters. diffraction_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'), } photon_diffractor = SingFELPhotonDiffractor( parameters=diffraction_parameters, input_path=pmi_dir, output_path=diffr_dir) # Reconstruction: EMC+DM emc_parameters = { 'initial_number_of_quaternions': 1, 'max_number_of_quaternions': 9, 'max_number_of_iterations': 3, 'min_error': 1.0e-8, 'beamstop': 1.0e-5, 'detailed_output': False } dm_parameters = { 'number_of_trials': 5, 'number_of_iterations': 2, 'averaging_start': 15, 'leash': 0.2, 'number_of_shrink_cycles': 2, } reconstructor = S2EReconstruction(parameters={ 'EMC_Parameters': emc_parameters, 'DM_Parameters': dm_parameters }, input_path=diffr_dir, output_path=recon_dir) # Setup the photon experiment. pxs = PhotonExperimentSimulation( photon_source=photon_source, photon_propagator=photon_propagator, photon_interactor=photon_interactor, photon_diffractor=photon_diffractor, photon_detector=None, photon_analyzer=reconstructor, ) # Run the experiment. pxs.run()
def testConstructionExceptions(self): """ Test that the appropriate exceptions are thrown if the object is constructed incorrectly. """ # Setup a minimal experiment simulation. source_input = TestUtilities.generateTestFilePath('FELsource_out.h5') diffr_input = TestUtilities.generateTestFilePath('pmi_out.h5') pmi_input = TestUtilities.generateTestFilePath('prop_out.h5') photon_source = XFELPhotonSource(parameters=None, input_path=source_input, output_path='FELsource_out.h5') photon_propagator = XFELPhotonPropagator(parameters=None, input_path='FELsource_out.h5', output_path='prop_out.h5') photon_interactor = FakePhotonMatterInteractor( parameters=None, input_path=pmi_input, output_path='pmi_out.h5') diffraction_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'), } photon_diffractor = SingFELPhotonDiffractor( parameters=diffraction_parameters, input_path=diffr_input, output_path='diffr_out.h5') photon_detector = PerfectPhotonDetector(parameters=None, input_path='diffr_out.h5', output_path='detector_out.h5') photon_analyzer = S2EReconstruction(parameters=None, input_path='detector_out.h5', output_path='analyzer_out.h5') # Check wrong source. self.assertRaises( TypeError, PhotonExperimentSimulation, photon_source=None, photon_propagator=photon_propagator, photon_interactor=photon_interactor, photon_diffractor=photon_diffractor, photon_detector=photon_detector, photon_analyzer=photon_analyzer, ) self.assertRaises( TypeError, PhotonExperimentSimulation, photon_source=photon_propagator, photon_propagator=photon_propagator, photon_interactor=photon_interactor, photon_diffractor=photon_diffractor, photon_detector=photon_detector, photon_analyzer=photon_analyzer, ) # Check wrong propagator. self.assertRaises( TypeError, PhotonExperimentSimulation, photon_source=photon_source, photon_propagator=None, photon_interactor=photon_interactor, photon_diffractor=photon_diffractor, photon_detector=photon_detector, photon_analyzer=photon_analyzer, ) self.assertRaises( TypeError, PhotonExperimentSimulation, photon_source=photon_source, photon_propagator=photon_source, photon_interactor=photon_interactor, photon_diffractor=photon_diffractor, photon_detector=photon_detector, photon_analyzer=photon_analyzer, ) # Check wrong interactor. self.assertRaises( TypeError, PhotonExperimentSimulation, photon_source=photon_source, photon_propagator=photon_propagator, photon_interactor=None, photon_diffractor=photon_diffractor, photon_detector=photon_detector, photon_analyzer=photon_analyzer, ) self.assertRaises( TypeError, PhotonExperimentSimulation, photon_source=photon_source, photon_propagator=photon_propagator, photon_interactor=photon_source, photon_diffractor=photon_diffractor, photon_detector=photon_detector, photon_analyzer=photon_analyzer, ) # Check wrong diffractor. self.assertRaises( TypeError, PhotonExperimentSimulation, photon_source=photon_source, photon_propagator=photon_propagator, photon_interactor=photon_interactor, photon_diffractor=None, photon_detector=photon_detector, photon_analyzer=photon_analyzer, ) self.assertRaises( TypeError, PhotonExperimentSimulation, photon_source=photon_source, photon_propagator=photon_propagator, photon_interactor=photon_interactor, photon_diffractor=photon_source, photon_detector=photon_detector, photon_analyzer=photon_analyzer, ) # Check wrong analyzer. self.assertRaises( TypeError, PhotonExperimentSimulation, photon_source=photon_source, photon_propagator=photon_propagator, photon_interactor=photon_interactor, photon_diffractor=photon_diffractor, photon_detector=photon_detector, photon_analyzer=None, ) self.assertRaises( TypeError, PhotonExperimentSimulation, photon_source=photon_source, photon_propagator=photon_propagator, photon_interactor=photon_interactor, photon_diffractor=photon_diffractor, photon_detector=photon_detector, photon_analyzer=photon_diffractor, )