@classmethod<EOL><INDENT>def find(cls, channels, start, end, frametype=None,<EOL>frametype_match=None, pad=None, scaled=None, dtype=None, nproc=<NUM_LIT:1>,<EOL>verbose=False, allow_tape=True, observatory=None, **readargs):<DEDENT>
start = to_gps(start)<EOL>end = to_gps(end)<EOL>if frametype is None:<EOL><INDENT>matched = io_datafind.find_best_frametype(<EOL>channels, start, end, frametype_match=frametype_match,<EOL>allow_tape=allow_tape)<EOL>frametypes = {}<EOL>for name, ftype in matched.items():<EOL><INDENT>try:<EOL><INDENT>frametypes[ftype].append(name)<EOL><DEDENT>except KeyError:<EOL><INDENT>frametypes[ftype] = [name]<EOL><DEDENT><DEDENT>if verbose and len(frametypes) > <NUM_LIT:1>:<EOL><INDENT>gprint("<STR_LIT>" % len(frametypes))<EOL><DEDENT>elif verbose:<EOL><INDENT>gprint("<STR_LIT>"<EOL>% list(frametypes.keys())[<NUM_LIT:0>])<EOL><DEDENT><DEDENT>else:<EOL><INDENT>frametypes = {frametype: channels}<EOL><DEDENT>out = cls()<EOL>for frametype, clist in frametypes.items():<EOL><INDENT>if verbose:<EOL><INDENT>verbose = "<STR_LIT>".format(frametype)<EOL><DEDENT>channellist = ChannelList.from_names(*clist)<EOL>names = [c.name for c in channellist]<EOL>if observatory is None:<EOL><INDENT>try:<EOL><INDENT>observatory = '<STR_LIT>'.join(<EOL>sorted(set(c.ifo[<NUM_LIT:0>] for c in channellist)))<EOL><DEDENT>except TypeError as exc:<EOL><INDENT>exc.args = "<STR_LIT>",<EOL>raise<EOL><DEDENT><DEDENT>cache = io_datafind.find_urls(observatory, frametype, start, end)<EOL>if not cache:<EOL><INDENT>raise RuntimeError("<STR_LIT>"<EOL>% (observatory, frametype, start, end))<EOL><DEDENT>readargs.setdefault('<STR_LIT>', '<STR_LIT>')<EOL>new = cls.read(cache, names, start=start, end=end, pad=pad,<EOL>scaled=scaled, dtype=dtype, nproc=nproc,<EOL>verbose=verbose, **readargs)<EOL>out.append(type(new)((key, new[chan]) for<EOL>(key, chan) in zip(clist, names)))<EOL><DEDENT>return out<EOL>
Find and read data from frames for a number of channels.

        Parameters
        ----------
        channels : `list`
            required data channels.

        start : `~gwpy.time.LIGOTimeGPS`, `float`, `str`
            GPS start time of required data,
            any input parseable by `~gwpy.time.to_gps` is fine

        end : `~gwpy.time.LIGOTimeGPS`, `float`, `str`, optional
            GPS end time of required data, defaults to end of data found;
            any input parseable by `~gwpy.time.to_gps` is fine

        frametype : `str`, optional
            name of frametype in which this channel is stored, by default
            will search for all required frame types

        frametype_match : `str`, optional
            regular expression to use for frametype matching

        pad : `float`, optional
            value with which to fill gaps in the source data, defaults to
            'don't fill gaps'

        scaled : `bool`, optional
            apply slope and bias calibration to ADC data, for non-ADC data
            this option has no effect.

        dtype : `numpy.dtype`, `str`, `type`, or `dict`
            numeric data type for returned data, e.g. `numpy.float`, or
            `dict` of (`channel`, `dtype`) pairs

        nproc : `int`, optional, default: `1`
            number of parallel processes to use, serial process by
            default.

        allow_tape : `bool`, optional, default: `True`
            allow reading from frame files on (slow) magnetic tape

        verbose : `bool`, optional
            print verbose output about read progress, if ``verbose``
            is specified as a string, this defines the prefix for the
            progress meter

        **readargs
            any other keyword arguments to be passed to `.read()`