def test_McStasMetaData_add_info_title(self): """ Test that title can be set """ meta_data = McStasMetaData() meta_data.set_title("title_test") self.assertEqual(meta_data.title, "title_test")
def set_dummy_MetaData_2d(name): meta_data = McStasMetaData() meta_data.component_name = name meta_data.dimension = [50, 100] meta_data.filename = name + ".dat" return meta_data
def test_McStasMetaData_add_info_ylabel(self): """ Test that ylabel can be set """ meta_data = McStasMetaData() meta_data.set_ylabel("ylabel test") self.assertEqual(meta_data.ylabel, "ylabel test")
def test_McStasMetaData_add_info_len(self): """ Test that info can be added to McStasMetaData """ meta_data = McStasMetaData() meta_data.add_info("test", 3) self.assertEqual(len(meta_data.info), 1)
def test_McStasMetaData_add_info(self): """ Test that info can be read from McStasMetaData """ meta_data = McStasMetaData() meta_data.add_info("test", 3) self.assertEqual(meta_data.info["test"], 3)
def set_dummy_MetaDataBinned_1d(): """ Sets up simple McStasMetaData object with dimension, 1d case """ meta_data = McStasMetaData() meta_data.component_name = "component for 1d" meta_data.dimension = 50 return meta_data
def set_dummy_MetaDataBinned_2d(): """ Sets up simple McStasMetaData object with dimensions, 2d case """ meta_data = McStasMetaData() meta_data.component_name = "test a component" meta_data.dimension = [50, 100] return meta_data
def set_dummy_MetaData_2d(name): """ Sets up a dummy MetaData object for a 2d dataset Parameters ---------- name : str base for filename, .dat will be appended """ meta_data = McStasMetaData() meta_data.component_name = name meta_data.dimension = [50, 100] meta_data.filename = name + ".dat" return meta_data
def get_dummy_MetaData_2d(): meta_data = McStasMetaData() meta_data.component_name = "test a component" meta_data.dimension = [5, 4] meta_data.limits = [0.1, 1.1, 2.0, 4.0] meta_data.title = "test" meta_data.xlabel = "test x" meta_data.ylabel = "test y" return meta_data
def get_dummy_MetaData_1d(): meta_data = McStasMetaData() meta_data.component_name = "component for 1d" meta_data.dimension = 50 meta_data.limits = [0.1, 1.1] meta_data.title = "test" meta_data.xlabel = "test x" meta_data.ylabel = "test y" return meta_data
def set_dummy_MetaDataBinned_1d(): """ Sets up simple McStasMetaData object with dimension, 1d case """ meta_data = McStasMetaData() meta_data.component_name = "component for 1d" meta_data.dimension = 50 meta_data.limits = [0, 1] meta_data.xlabel = "" meta_data.ylabel = "" meta_data.title = "" meta_data.filename = "dummy" return meta_data
def set_dummy_MetaDataBinned_2d(): """ Sets up simple McStasMetaData object with dimensions, 2d case """ meta_data = McStasMetaData() meta_data.component_name = "test a component" meta_data.dimension = [5, 4] meta_data.limits = [0, 1, 0, 1] meta_data.xlabel = "" meta_data.ylabel = "" meta_data.title = "" meta_data.filename = "dummy" return meta_data
def set_dummy_MetaDataBinned_1d(): """ Sets up simple McStasMetaData object with dimension, 1d case """ meta_data = McStasMetaData() meta_data.component_name = "component for 1d" meta_data.filename = "data.dat" meta_data.dimension = 50 meta_data.info = {"Ncount": 40} return meta_data
def load_metadata(data_folder_name): """ Function that loads metadata from a mcstas simulation Returns list of metadata objects corresponding to each monitor, all information is taken from mccode.sim file. Parameters ---------- first argument : str path to folder from which metadata should be loaded """ if not os.path.isdir(data_folder_name): raise NameError("Given data directory does not exist.") # Find all data files in generated folder files_in_folder = os.listdir(data_folder_name) # Raise an error if mccode.sim is not available if "mccode.sim" not in files_in_folder: raise NameError("No mccode.sim in data folder.") instrument_parameters = {} # Open mccode to read metadata for all datasets written to disk with open(os.path.join(data_folder_name, "mccode.sim"), "r") as f: # Loop that reads mccode.sim sections metadata_list = [] current_object = None in_data = False in_sim = False for lines in f: # Could read other details about run if lines == "end data\n": # No more data for this metadata object # Add parameter information current_object.add_info("Parameters", instrument_parameters) # Extract the information current_object.extract_info() # Add to metadata list if current_object.filename != "": metadata_list.append(current_object) # Stop reading data in_data = False if in_sim: if "Param" in lines: parm_lst = lines.split(':')[1].split('=') try: value = float(parm_lst[1].strip()) except ValueError: value = parm_lst[1].strip() instrument_parameters[parm_lst[0].strip()] = value if in_data: # This line contains info to be added to metadata colon_index = lines.index(":") key = lines[2:colon_index] value = lines[colon_index + 2:].strip() current_object.add_info(key, value) if lines == "begin data\n": # Found data section, create new metadata object current_object = McStasMetaData() # Start recording data to metadata object in_data = True if 'begin simulation:' in lines: in_sim = True if 'end simulation:' in lines: in_sim = False # Close mccode.sim f.close() # Create a list for McStasData instances to return results = [] # Load datasets described in metadata list individually for metadata in metadata_list: # Load data with numpy data = np.loadtxt(data_folder_name + "/" + metadata.filename.rstrip()) # Split data into intensity, error and ncount if type(metadata.dimension) == int: xaxis = data.T[0, :] Intensity = data.T[1, :] Error = data.T[2, :] Ncount = data.T[3, :] elif len(metadata.dimension) == 2: xaxis = [] # Assume evenly binned in 2d data_lines = metadata.dimension[1] Intensity = data.T[:, 0:data_lines - 1] Error = data.T[:, data_lines:2 * data_lines - 1] Ncount = data.T[:, 2 * data_lines:3 * data_lines - 1] return metadata_list
def set_dummy_MetaData_1d(): meta_data = McStasMetaData() meta_data.component_name = "component for 1d" meta_data.dimension = 50 return meta_data
def set_dummy_MetaData_2d(): meta_data = McStasMetaData() meta_data.component_name = "test a component" meta_data.dimension = [50, 100] return meta_data
def load_results(data_folder_name): """ Function for loading data from a mcstas simulation Loads data on all monitors in a McStas data folder, and returns these as a list of McStasData objects. Parameters ---------- first argument : str path to folder from which data should be loaded """ if not os.path.isdir(data_folder_name): raise NameError("Given data directory does not exist.") # Find all data files in generated folder files_in_folder = os.listdir(data_folder_name) # Raise an error if mccode.sim is not available if "mccode.sim" not in files_in_folder: raise NameError("No mccode.sim in data folder.") # Open mccode to read metadata for all datasets written to disk with open(os.path.join(data_folder_name, "mccode.sim"), "r") as f: # Loop that reads mccode.sim sections metadata_list = [] current_object = None in_data = False for lines in f: # Could read other details about run if lines == "end data\n": # No more data for this metadata object # Extract the information current_object.extract_info() # Add to metadata list if current_object.filename != "": metadata_list.append(current_object) # Stop reading data in_data = False if in_data: # This line contains info to be added to metadata colon_index = lines.index(":") key = lines[2:colon_index] value = lines[colon_index + 2:] current_object.add_info(key, value) if lines == "begin data\n": # Found data section, create new metadata object current_object = McStasMetaData() # Start recording data to metadata object in_data = True # Create a list for McStasData instances to return results = [] # Load datasets described in metadata list individually for metadata in metadata_list: # Load data with numpy data = np.loadtxt( os.path.join(data_folder_name, metadata.filename.rstrip())) # Split data into intensity, error and ncount if type(metadata.dimension) == int: xaxis = data.T[0, :] Intensity = data.T[1, :] Error = data.T[2, :] Ncount = data.T[3, :] elif len(metadata.dimension) == 2: xaxis = [] # Assume evenly binned in 2d data_lines = metadata.dimension[1] Intensity = data[0:data_lines, :] Error = data[data_lines:2 * data_lines, :] Ncount = data[2 * data_lines:3 * data_lines, :] else: raise NameError("Dimension not read correctly in data set " + "connected to monitor named " + metadata.component_name) # The data is saved as a McStasData object result = McStasData(metadata, Intensity, Error, Ncount, xaxis=xaxis) # Add this result to the results list results.append(result) # Return list of McStasData objects return results
def test_McStasMetaData_return_type(self): """ Test that newly created McStasMetaData has correct type """ meta_data = McStasMetaData() self.assertIsInstance(meta_data, McStasMetaData)
def test_McStasMetaData_long_read_2d(self): """ Test that extract_info can read appropriate info, 2d case """ meta_data = McStasMetaData() meta_data.add_info("type", "array_2d(500, 12)") meta_data.add_info("component", "test_A_COMP") meta_data.add_info("filename", "test_A_name") meta_data.add_info("xlimits", "-2.4 5.99 0.92 3.68") meta_data.add_info("xlabel", "test A xlabel") meta_data.add_info("ylabel", "test A ylabel") meta_data.add_info("title", "test A title") meta_data.extract_info() # Converts info to attributes self.assertEqual(len(meta_data.dimension), 2) self.assertEqual(meta_data.dimension[0], 500) self.assertEqual(meta_data.dimension[1], 12) self.assertIs(meta_data.component_name, "test_A_COMP") self.assertIs(meta_data.filename, "test_A_name") self.assertEqual(len(meta_data.limits), 4) self.assertEqual(meta_data.limits[0], -2.4) self.assertEqual(meta_data.limits[1], 5.99) self.assertEqual(meta_data.limits[2], 0.92) self.assertEqual(meta_data.limits[3], 3.68) self.assertIs(meta_data.xlabel, "test A xlabel") self.assertIs(meta_data.ylabel, "test A ylabel") self.assertIs(meta_data.title, "test A title")
def test_McStasMetaData_long_read_1d(self): """ Test that extract_info can read appropriate info, 1d case """ meta_data = McStasMetaData() meta_data.add_info("type", "array_1d(500)") meta_data.add_info("component", "test_A COMP") meta_data.add_info("filename", "test_A name") meta_data.add_info("xlimits", " 0.92 3.68") meta_data.add_info("xlabel", "test A xlabel") meta_data.add_info("ylabel", "test A ylabel") meta_data.add_info("title", "test A title") meta_data.extract_info() # Converts info to attributes self.assertIsInstance(meta_data.dimension, int) self.assertEqual(meta_data.dimension, 500) self.assertIs(meta_data.component_name, "test_A COMP") self.assertIs(meta_data.filename, "test_A name") self.assertEqual(len(meta_data.limits), 2) self.assertEqual(meta_data.limits[0], 0.92) self.assertEqual(meta_data.limits[1], 3.68) self.assertIs(meta_data.xlabel, "test A xlabel") self.assertIs(meta_data.ylabel, "test A ylabel") self.assertIs(meta_data.title, "test A title")
def test_McStasMetaData_init(self): """ Test that newly created McStasMetaData has no content """ meta_data = McStasMetaData() self.assertEqual(len(meta_data.info), 0)