Exemple #1
0
def get_holder_from_file_name(file):
    holder_search = 'holder\-<>'
    return std.metadata_from_file_name(holder_search,
                                       file,
                                       is_numeric=True,
                                       delimeter='',
                                       abs_path=True)
def period_from_file_name( file, base_unit = 'ns' ):
    """
    Retrieve pulse period from file name.

    :param file: File name to extract data from.
    :param base_unit: Base unit of time. [Default: 'ns']
    :returns: period in units of base_unit.
    """
    period_search = 'period(\d+[nu]s)'
    match = std.metadata_from_file_name( period_search, file )
    
    # convert to correct base
    val = float( match[ :-2 ] )
    unit = match[ -2: ]
    if unit == base_unit:
        # base unit and extracted unit match, no change needed.
        return val

    if unit == 'ns':
        if base_unit == 'us':
            return val* 1e3

    elif unit == 'us':
        if base_unit == 'ns':
            return val* 1e-3

    raise ValueError( 'Could not convert time unit to base unit.' )
def get_program_from_file_name( file ):
    program_search = '(\d+)'
    return std.metadata_from_file_name(
        program_search,
        file,
        is_numeric = True,
        delimeter = '_'
    )
def get_metadata_values(file, metadata):
    """
    Gets metadata values from a file path
    
    :param file: The file path to search
    :param metadata: Metadata from the file name is turned into MultiIndex columns
        + If list, use standard keywords to include in index [ 'sample', 'power', 'wavelength', 'time' ]
        + If Dictionary, keys indicate level name, value is pattern to match
            or another dictionary with 'search' key being the pattern to match, and additional
            entries matching arguments passed to standard_functions#metadata_from_filename.
            + Reseserved key 'standard' can be provided with a list value to get standard metadata
    :returns: A list of metadata values
    """

    if isinstance(metadata, list):
        # use standard metadata
        return get_standard_metadata_values(file, metadata)

    if isinstance(metadata, dict):
        # use custom metadata
        # key is name, value is regexp pattern or dictionary with pattern and arguments

        header_names = list(metadata.keys())

        # get number of values
        val_len = len(header_names)
        if 'standard' in header_names:
            val_len += len(metadata['standard']) - 1

        vals = header_names.copy()
        for name, search in metadata.items():
            index = header_names.index(name)

            if name == 'standard':
                # insert standard keys
                vals[index] = get_standard_metadata_values(file, search)

            else:
                # custom key
                if isinstance(search, dict):
                    pattern = search['search']
                    kwargs = search.copy()
                    del kwargs['search']

                else:
                    pattern = search
                    kwargs = {}

                vals[index] = std.metadata_from_file_name(
                    pattern, file, **kwargs)

        # fllatten standard keys
        if 'standard' in header_names:
            index = header_names.index('standard')
            vals = vals[:index] + vals[index] + vals[index + 1:]

        return vals
def center_wavelength_from_file_name( file ):
    """
    Extract center wavelength from file name.

    :param file: File name.
    :returns: Center wavelength.
    """
    center_search = 'em<>nm'
    center = std.metadata_from_file_name( center_search, file, is_numeric = True )
    return center
Exemple #6
0
def get_channel_from_file_name(file, prefix='C'):
    """
    :param prefix: The prefix of the channel. [Default: 'C']
    """
    channel_search = '{}<>'.format(prefix)
    return std.metadata_from_file_name(channel_search,
                                       file,
                                       is_numeric=True,
                                       delimeter='',
                                       abs_path=True)
def bandwidth_from_file_name( file ):
    """
    Extract bandwidth from file name.

    :parma file: File name.
    :returns: Bandwidth.
    """ 
    bandwidth_search = 'bandwidth<>nm'
    bandwidth = std.metadata_from_file_name( bandwidth_search, file, is_numeric = True )
    return bandwidth
def import_mpp_cycle_datum_channel(folder,
                                   cycle_pattern='cycle-<>',
                                   channel_pattern='ch-<>'):
    """
    Imports MPP tracking data from an MPP with JV program, broken in to cycles.

    :param folder: Folder path containing cycles.
    :param cycle_pattern: Pattern for cycle folders. [Default: 'cycle-<>']
    :param channel_pattern: Pattern for channel folders. [Default: 'ch-<>']
    :returns: Tuple of ( voc, jv, mpp ) Pandas DataFrames by cycle.
    """
    # get scan folders
    cycles = os.listdir(folder)

    # get data for each scan
    vocs = []
    jvs = []
    mpps = []

    for cycle in cycles:
        cycle_path = os.path.join(folder, cycle)

        dfs = (voc, jv,
               mpp) = import_mpp_datum_channel(cycle_path)  # import scan data

        # add scan index
        cycle_id = int(
            std.metadata_from_file_name(cycle_pattern,
                                        cycle_path,
                                        full_path=True,
                                        is_numeric=True))

        for df in dfs:
            # channel already in headers
            std.insert_index_levels(df, cycle_id, 'cycle', key_level=1)

        vocs.append(voc)
        jvs.append(jv)
        mpps.append(mpp)

    vocs = std.common_reindex(vocs)
    jvs = std.common_reindex(jvs)
    mpps = std.common_reindex(mpps)

    vocs = pd.concat(vocs, axis=1).sort_index(axis=1)
    jvs = pd.concat(jvs, axis=1).sort_index(axis=1)
    mpps = pd.concat(mpps, axis=1).sort_index(axis=1)

    return (vocs, jvs, mpps)
def cycle_from_file_path(path, pattern='cycle-<>'):
    """
    Gets the cycle from the file path.

    :param path: File path.
    :param pattern: RegEx pattern describing teh channel pattern.
        Passed to standard_functions#metadata_from_file_name.
        [Default: 'cycle-<>']
    """
    cycle = std.metadata_from_file_name(pattern,
                                        path,
                                        is_numeric=True,
                                        full_path=True)

    return int(cycle)
def sample_from_file_name( file ):
    name_search  = '^(.*?)'  # use lazy search
    return std.metadata_from_file_name( name_search, file, delimeter = '--' )
def pressure_from_file_name(file):
    pressure_search = '<>hpa'
    return std.metadata_from_file_name(pressure_search,
                                       file,
                                       True,
                                       decimal='p')
def temperature_from_file_name(file):
    temperature_search = '<>'
    return std.metadata_from_file_name(temperature_search,
                                       file,
                                       True,
                                       decimal='k')
Exemple #13
0
def channel_from_file_name( file ):
    channel_search = '^Ch(\d+)'
    return std.metadata_from_file_name( channel_search, file, is_numeric = True, delimeter = '_' )
def power_from_file_name(file):
    power_search = '<>mw'
    return std.metadata_from_file_name(power_search, file, True)
def angle_from_file_name(file):
    angle_search = '<>deg'
    return std.metadata_from_file_name(angle_search, file, True)
def sample_from_file_name(file):
    name_search = '^(.*?)'  # use lazy matching
    return std.metadata_from_file_name(name_search, file)
Exemple #17
0
def sample_from_file_name( file ):
    name_search = '(.+?)'
    return std.metadata_from_file_name( name_search, file, delimeter = '_', group = 1 )
def time_from_file_name(file):
    time_search = '<>'
    return std.metadata_from_file_name(time_search, file, True, decimal='s')
Exemple #19
0
def get_metadata_values(md_map, file, metadata):
    """
    Gets metadata values from a file path.

    :param md_map: Dictionary of keys to callables to extract metadata.
        Callables should accept a single parameter which is the file name.
    :param file: The file path to search.
    :param metadata: Metadata from the file name is turned into MultiIndex columns.
        + If list, use standard keywords to include in index [ 'sample' ]
        + If Dictionary, keys indicate level name.
            Value can be a regex pattern to match or another dictionary.
            If a dictionary, key 'search' is a pattern to match
            passed to standard_functions#metadata_from_filename, and key-value pairs
            are keyword arguments of standard_functions#metadata_from_filename.
            + Reseserved key 'standard' can be provided with a list
                of standard metadata names.
            [See also standard_functions#metadata_from_filename]
    :returns: Tuple of metadata values.
    """
    if isinstance(metadata, list):
        # use standard metadata
        return get_standard_metadata_values(md_map, file, metadata)

    if isinstance(metadata, dict):
        # use custom metadata
        # key is name, value is regexp pattern or dictionary with pattern and arguments

        header_names = list(metadata.keys())

        # get number of values
        val_len = len(header_names)
        if 'standard' in header_names:
            val_len += len(metadata['standard']) - 1

        vals = header_names.copy()
        for name, search in metadata.items():
            index = header_names.index(name)

            if name == 'standard':
                # insert standard keys
                vals[index] = get_standard_metadata_values(
                    md_map, file, search)

            else:
                # custom key
                if isinstance(search, dict):
                    pattern = search['search']
                    kwargs = search.copy()
                    del kwargs['search']

                else:
                    pattern = search
                    kwargs = {}

                vals[index] = std.metadata_from_file_name(
                    pattern, file, **kwargs)

        # flatten standard keys
        if 'standard' in header_names:
            index = header_names.index('standard')
            vals = vals[:index] + list(vals[index]) + vals[index + 1:]

        return tuple(vals)
def wavelength_from_file_name(file):
    wavelength_search = '<>nm'
    return std.metadata_from_file_name(wavelength_search, file, True)