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() )
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()))
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)
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 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 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 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()
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 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 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()
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()
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.")