def get_input(source, files, threads=4, readtype="1D",
              combine="simple", names=None, barcoded=False):
    proc_functions = {
        'fastq': ex.process_fastq_plain,
        'fasta': ex.process_fasta,
        'bam': ex.process_bam,
        'summary': ex.process_summary,
        'fastq_rich': ex.process_fastq_rich,
        'fastq_minimal': ex.process_fastq_minimal,
        'cram': ex.process_cram,
        'ubam': ex.process_ubam, }
    filethreads = min(len(files), threads)
    threadsleft = threads - filethreads
    with cfutures.ProcessPoolExecutor(max_workers=filethreads) as executor:
        extration_function = partial(proc_functions[source],
                                     threads=threadsleft,
                                     readtype=readtype,
                                     barcoded=barcoded)
        datadf = combine_dfs(
            dfs=[out for out in executor.map(extration_function, files)],
            names=names or files,
            method=combine)
    if "readIDs" in datadf and pd.isna(datadf["readIDs"]).any():
        datadf.drop("readIDs", axis='columns', inplace=True)
    datadf = calculate_start_time(datadf)
    logging.info("Nanoget: Gathered all metrics of {} reads".format(len(datadf)))
    if len(datadf) == 0:
        logging.critical("Nanoget: no reads retrieved.".format(len(datadf)))
        sys.exit("Fatal: No reads found in input.")
    else:
        return datadf