def parser_mesh(self, nxdata, scan): '''data parser for 2-D mesh and hklmesh''' # 2-D parser: http://www.certif.com/spec_help/mesh.html # mesh motor1 start1 end1 intervals1 motor2 start2 end2 intervals2 time # 2-D parser: http://www.certif.com/spec_help/hklmesh.html # hklmesh Q1 start1 end1 intervals1 Q2 start2 end2 intervals2 time # mesh: nexpy/examples/33id_spec.dat scan 22 # hklmesh: nexpy/examples/33bm_spec.dat scan 17 from spec2nexus import utils label1, start1, end1, intervals1, label2, start2, end2, intervals2, time = scan.scanCmd.split()[1:] if label1 not in scan.data: label1 = scan.L[0] # mnemonic v. name if label2 not in scan.data: label2 = scan.L[1] # mnemonic v. name axis1 = scan.data.get(label1) axis2 = scan.data.get(label2) intervals1, intervals2 = map(int, (intervals1, intervals2)) start1, end1, start2, end2, time = map(float, (start1, end1, start2, end2, time)) if len(axis1) < intervals1: # stopped scan before second row started self.parser_1D_columns(nxdata, scan) # fallback support else: axis1 = axis1[0:intervals1+1] axis2 = [axis2[row] for row in range(len(axis2)) if row % (intervals1+1) == 0] column_labels = scan.L column_labels.remove(label1) # special handling column_labels.remove(label2) # special handling if scan.scanCmd.startswith('hkl'): # find the reciprocal space axis held constant label3 = [key for key in ('H', 'K', 'L') if key not in (label1, label2)][0] axis3 = scan.data.get(label3)[0] nxdata[label3] = NXfield(axis3) column_labels.remove(label3) # already handled nxdata[label1] = NXfield(axis1) # 1-D array nxdata[label2] = NXfield(axis2) # 1-D array # build 2-D data objects (do not build label1, label2, [or label3] as 2-D objects) data_shape = [len(axis2), len(axis1)] for label in column_labels: axis = np.array( scan.data.get(label) ) clean_name = utils.sanitize_name(nxdata, label) nxdata[clean_name] = NXfield(utils.reshape_data(axis, data_shape)) nxdata[clean_name].original_name = label signal_axis_label = utils.sanitize_name(nxdata, scan.column_last) nxdata.nxsignal = nxdata[signal_axis_label] nxdata.nxaxes = [nxdata[label2], nxdata[label1]] if '_mca_' in scan.data: # 3-D array # TODO: ?merge with parser_mca_spectra()? num_channels = len(scan.data['_mca_'][0]) data_shape.append(num_channels) mca = np.array(scan.data['_mca_']) nxdata.mca__spectrum_ = NXfield(utils.reshape_data(mca, data_shape)) nxdata.mca__spectrum_channel = NXfield(range(1, num_channels+1)) nxdata.mca__spectrum_channel.units = 'channel' axes = (label1, label2, 'mca__spectrum_channel') nxdata.mca__spectrum_.axes = ':'.join( axes )
def parser_1D_columns(self, nxdata, scan): '''generic data parser for 1-D column data''' from spec2nexus import utils for column in scan.L: clean_name = utils.sanitize_name(nxdata, column) nxdata[clean_name] = NXfield(scan.data[column]) nxdata[clean_name].original_name = column signal = utils.sanitize_name(nxdata, scan.column_last) # primary Y axis axis = utils.sanitize_name(nxdata, scan.column_first) # primary X axis nxdata.nxsignal = nxdata[signal] nxdata.nxaxes = nxdata[axis] self.parser_mca_spectra(nxdata, scan, axis)
def parser_1D_columns(self, nxdata, scan): '''generic data parser for 1-D column data''' from spec2nexus import utils for column in scan.L: if column in scan.data: clean_name = utils.sanitize_name(nxdata, column) nxdata[clean_name] = NXfield(scan.data[column]) nxdata[clean_name].original_name = column signal = utils.sanitize_name(nxdata, scan.column_last) # primary Y axis axis = utils.sanitize_name(nxdata, scan.column_first) # primary X axis nxdata.nxsignal = nxdata[signal] nxdata.nxaxes = nxdata[axis] self.parser_mca_spectra(nxdata, scan, axis)
def metadata_NXlog(self, spec_metadata, description): """Return the specific metadata in an NXlog object.""" from spec2nexus import utils nxlog = NXlog() nxlog.attrs['description'] = description for subkey, value in spec_metadata.items(): clean_name = utils.sanitize_name(nxlog, subkey) nxlog[clean_name] = NXfield(value) nxlog[clean_name].original_name = subkey return nxlog
def metadata_NXlog(self, spec_metadata, description): ''' return the specific metadata in an NXlog object ''' from spec2nexus import utils nxlog = NXlog() nxlog.attrs['description'] = description for subkey, value in spec_metadata.items(): clean_name = utils.sanitize_name(nxlog, subkey) nxlog[clean_name] = NXfield(value) nxlog[clean_name].original_name = subkey return nxlog
def parser_mesh(self, nxdata, scan): '''data parser for 2-D mesh and hklmesh''' # 2-D parser: http://www.certif.com/spec_help/mesh.html # mesh motor1 start1 end1 intervals1 motor2 start2 end2 intervals2 time # 2-D parser: http://www.certif.com/spec_help/hklmesh.html # hklmesh Q1 start1 end1 intervals1 Q2 start2 end2 intervals2 time # mesh: nexpy/examples/33id_spec.dat scan 22 (also has MCA, thus 3-D data) # hklmesh: nexpy/examples/33bm_spec.dat scan 17 (no MCA data) from spec2nexus import utils label1, start1, end1, intervals1, label2, start2, end2, intervals2, time = scan.scanCmd.split( )[1:] if label1 not in scan.data: label1 = scan.L[0] # mnemonic v. name if label2 not in scan.data: label2 = scan.L[1] # mnemonic v. name axis1 = scan.data.get(label1) axis2 = scan.data.get(label2) intervals1, intervals2 = int(intervals1), int(intervals2) start1, end1 = float(start1), float(end1) start2, end2 = float(start2), float(end2) time = float(time) if len(axis1) < intervals1: # stopped scan before second row started self.parser_1D_columns(nxdata, scan) # fallback support # TODO: what about the MCA data in this case? else: axis1 = axis1[0:intervals1 + 1] axis2 = [ axis2[row] for row in range(len(axis2)) if row % (intervals1 + 1) == 0 ] column_labels = scan.L column_labels.remove(label1) # special handling column_labels.remove(label2) # special handling if scan.scanCmd.startswith('hkl'): # find the reciprocal space axis held constant label3 = [ key for key in ('H', 'K', 'L') if key not in (label1, label2) ][0] axis3 = scan.data.get(label3)[0] nxdata[label3] = NXfield(axis3) column_labels.remove(label3) # already handled nxdata[label1] = NXfield(axis1) # 1-D array nxdata[label2] = NXfield(axis2) # 1-D array # build 2-D data objects (do not build label1, label2, [or label3] as 2-D objects) data_shape = [len(axis2), len(axis1)] for label in column_labels: axis = np.array(scan.data.get(label)) clean_name = utils.sanitize_name(nxdata, label) nxdata[clean_name] = NXfield( utils.reshape_data(axis, data_shape)) nxdata[clean_name].original_name = label signal_axis_label = utils.sanitize_name(nxdata, scan.column_last) nxdata.nxsignal = nxdata[signal_axis_label] nxdata.nxaxes = [nxdata[label2], nxdata[label1]] if '_mca_' in scan.data: # 3-D array # TODO: ?merge with parser_mca_spectra()? for mca_key, mca_data in scan.data['_mca_'].items(): key = "__" + mca_key spectra_lengths = list(map(len, mca_data)) num_channels = max(spectra_lengths) if num_channels != min(spectra_lengths): msg = 'MCA spectra have different lengths' msg += ' in scan #' + str(scan.scanNum) msg += ' in file ' + str(scan.specFile) raise ValueError(msg) data_shape += [ num_channels, ] mca = np.array(mca_data) nxdata[key] = NXfield(utils.reshape_data(mca, data_shape)) nxdata[key].units = "counts" try: # use MCA channel numbers as known at time of scan chan1 = scan.MCA['first_saved'] chanN = scan.MCA['last_saved'] channel_range = range(chan1, chanN + 1) except: # basic indices channel_range = range(1, num_channels + 1) ch_key = key + "_channel" nxdata[ch_key] = NXfield(channel_range) nxdata[ch_key].units = 'channel' axes = (label1, label2, ch_key) nxdata[key].axes = ':'.join(axes)
def parser_mesh(self, nxdata, scan): """data parser for 2-D mesh and hklmesh""" # 2-D parser: http://www.certif.com/spec_help/mesh.html # mesh motor1 start1 end1 intervals1 motor2 start2 end2 intervals2 time # 2-D parser: http://www.certif.com/spec_help/hklmesh.html # hklmesh Q1 start1 end1 intervals1 Q2 start2 end2 intervals2 time # mesh: nexpy/examples/33id_spec.dat scan 22 (also has MCA, thus 3-D data) # hklmesh: nexpy/examples/33bm_spec.dat scan 17 (no MCA data) from spec2nexus import utils label1, start1, end1, intervals1, label2, start2, end2, intervals2, time = scan.scanCmd.split()[1:] if label1 not in scan.data: label1 = scan.L[0] # mnemonic v. name if label2 not in scan.data: label2 = scan.L[1] # mnemonic v. name axis1 = scan.data.get(label1) axis2 = scan.data.get(label2) intervals1, intervals2 = map(int, (intervals1, intervals2)) start1, end1, start2, end2, time = map(float, (start1, end1, start2, end2, time)) if len(axis1) < intervals1: # stopped scan before second row started self.parser_1D_columns(nxdata, scan) # fallback support # TODO: what about the MCA data in this case? else: axis1 = axis1[0 : intervals1 + 1] axis2 = [axis2[row] for row in range(len(axis2)) if row % (intervals1 + 1) == 0] column_labels = scan.L column_labels.remove(label1) # special handling column_labels.remove(label2) # special handling if scan.scanCmd.startswith("hkl"): # find the reciprocal space axis held constant label3 = [key for key in ("H", "K", "L") if key not in (label1, label2)][0] axis3 = scan.data.get(label3)[0] nxdata[label3] = NXfield(axis3) column_labels.remove(label3) # already handled nxdata[label1] = NXfield(axis1) # 1-D array nxdata[label2] = NXfield(axis2) # 1-D array # build 2-D data objects (do not build label1, label2, [or label3] as 2-D objects) data_shape = [len(axis2), len(axis1)] for label in column_labels: axis = np.array(scan.data.get(label)) clean_name = utils.sanitize_name(nxdata, label) nxdata[clean_name] = NXfield(utils.reshape_data(axis, data_shape)) nxdata[clean_name].original_name = label signal_axis_label = utils.sanitize_name(nxdata, scan.column_last) nxdata.nxsignal = nxdata[signal_axis_label] nxdata.nxaxes = [nxdata[label2], nxdata[label1]] if "_mca_" in scan.data: # 3-D array # TODO: ?merge with parser_mca_spectra()? _num_spectra = len(scan.data["_mca_"]) spectra_lengths = map(len, scan.data["_mca_"]) num_channels = max(spectra_lengths) if num_channels != min(spectra_lengths): msg = "MCA spectra have different lengths" msg += " in scan #" + str(scan.scanNum) msg += " in file " + str(scan.specFile) raise ValueError(msg) data_shape += [num_channels] mca = np.array(scan.data["_mca_"]) nxdata.mca__spectrum_ = NXfield(utils.reshape_data(mca, data_shape)) try: # use MCA channel numbers as known at time of scan chan1 = scan.MCA["first_saved"] chanN = scan.MCA["last_saved"] channel_range = range(chan1, chanN + 1) except: # basic indices channel_range = range(1, num_channels + 1) nxdata.mca__spectrum_channel = NXfield(channel_range) nxdata.mca__spectrum_channel.units = "channel" axes = (label1, label2, "mca__spectrum_channel") nxdata.mca__spectrum_.axes = ":".join(axes)
def parser_mesh(self, nxdata, scan): '''data parser for 2-D mesh and hklmesh''' # 2-D parser: http://www.certif.com/spec_help/mesh.html # mesh motor1 start1 end1 intervals1 motor2 start2 end2 intervals2 time # 2-D parser: http://www.certif.com/spec_help/hklmesh.html # hklmesh Q1 start1 end1 intervals1 Q2 start2 end2 intervals2 time # mesh: nexpy/examples/33id_spec.dat scan 22 (also has MCA, thus 3-D data) # hklmesh: nexpy/examples/33bm_spec.dat scan 17 (no MCA data) from spec2nexus import utils label1, start1, end1, intervals1, label2, start2, end2, intervals2, time = scan.scanCmd.split()[1:] if label1 not in scan.data: label1 = scan.L[0] # mnemonic v. name if label2 not in scan.data: label2 = scan.L[1] # mnemonic v. name axis1 = scan.data.get(label1) axis2 = scan.data.get(label2) intervals1, intervals2 = int(intervals1), int(intervals2) start1, end1 = float(start1), float(end1) start2, end2 = float(start2), float(end2) time = float(time) if len(axis1) < intervals1: # stopped scan before second row started self.parser_1D_columns(nxdata, scan) # fallback support # TODO: what about the MCA data in this case? else: axis1 = axis1[0:intervals1+1] axis2 = [axis2[row] for row in range(len(axis2)) if row % (intervals1+1) == 0] column_labels = scan.L column_labels.remove(label1) # special handling column_labels.remove(label2) # special handling if scan.scanCmd.startswith('hkl'): # find the reciprocal space axis held constant label3 = [key for key in ('H', 'K', 'L') if key not in (label1, label2)][0] axis3 = scan.data.get(label3)[0] nxdata[label3] = NXfield(axis3) column_labels.remove(label3) # already handled nxdata[label1] = NXfield(axis1) # 1-D array nxdata[label2] = NXfield(axis2) # 1-D array # build 2-D data objects (do not build label1, label2, [or label3] as 2-D objects) data_shape = [len(axis2), len(axis1)] for label in column_labels: axis = np.array( scan.data.get(label) ) clean_name = utils.sanitize_name(nxdata, label) nxdata[clean_name] = NXfield(utils.reshape_data(axis, data_shape)) nxdata[clean_name].original_name = label signal_axis_label = utils.sanitize_name(nxdata, scan.column_last) nxdata.nxsignal = nxdata[signal_axis_label] nxdata.nxaxes = [nxdata[label2], nxdata[label1]] if '_mca_' in scan.data: # 3-D array # TODO: ?merge with parser_mca_spectra()? for mca_key, mca_data in scan.data['_mca_'].items(): key = "__" + mca_key spectra_lengths = list(map(len, mca_data)) num_channels = max(spectra_lengths) if num_channels != min(spectra_lengths): msg = 'MCA spectra have different lengths' msg += ' in scan #' + str(scan.scanNum) msg += ' in file ' + str(scan.specFile) raise ValueError(msg) data_shape += [num_channels, ] mca = np.array(mca_data) nxdata[key] = NXfield(utils.reshape_data(mca, data_shape)) nxdata[key].units = "counts" try: # use MCA channel numbers as known at time of scan chan1 = scan.MCA['first_saved'] chanN = scan.MCA['last_saved'] channel_range = range(chan1, chanN+1) except: # basic indices channel_range = range(1, num_channels+1) ch_key = key + "_channel" nxdata[ch_key] = NXfield(channel_range) nxdata[ch_key].units = 'channel' axes = (label1, label2, ch_key) nxdata[key].axes = ':'.join( axes )
def test_sanitize_name(self): # legacy support only expected = "_0_is_not_a_good_name" spec = utils.sanitize_name(None, "0 is not a good name") self.assertEqual(spec, expected)