def whichframes(fn, FrameIndReq, kineticsec, ut1req, startUTC, firstRawInd, lastRawInd,
                BytesPerImage, BytesPerFrame, verbose):
    ext = Path(fn).suffix
# %% get file size
    fileSizeBytes = fn.stat().st_size

    if fileSizeBytes < BytesPerImage:
        raise ValueError(
            f'File size {fileSizeBytes} is smaller than a single image frame!')

    if ext == '.DMCdata' and fileSizeBytes % BytesPerFrame:
        logging.error(
            f"Looks like I am not reading this file correctly, with BPF: {BytesPerFrame:d}")

    if ext == '.DMCdata':
        nFrame = fileSizeBytes // BytesPerFrame
        print(f'{nFrame} frames, Bytes: {fileSizeBytes} in file {fn}')

        nFrameRaw = (lastRawInd - firstRawInd + 1)
        if nFrameRaw != nFrame:
            logging.warning(
                f'there may be missed frames: nFrameRaw {nFrameRaw}   nFrame {nFrame}')
    else:
        nFrame = lastRawInd - firstRawInd + 1

    allrawframe = arange(firstRawInd, lastRawInd + 1, 1, dtype=int64)
    print(f"first / last raw frame #'s: {firstRawInd}  / {lastRawInd} ")
# %% absolute time estimate
    ut1_unix_all = frame2ut1(startUTC, kineticsec, allrawframe)
# %% setup frame indices
    """
    if no requested frames were specified, read all frames. Otherwise, just
    return the requested frames
    Assignments have to be "int64", not just python "int".
    Windows python 2.7 64-bit on files >2.1GB, the bytes will wrap
    """
    FrameIndRel = ut12frame(ut1req,
                            arange(0, nFrame, 1, dtype=int64),
                            ut1_unix_all)

    # NOTE: no ut1req or problems with ut1req, canNOT use else, need to test len() in case index is [0] validly
    if FrameIndRel is None or len(FrameIndRel) == 0:
        FrameIndRel = req2frame(FrameIndReq, nFrame)

    badReqInd = (FrameIndRel > nFrame) | (FrameIndRel < 0)
# check if we requested frames beyond what the BigFN contains
    if badReqInd.any():
        # don't include frames in case of None
        raise ValueError(f'frames requested outside the times covered in {fn}')

    nFrameExtract = FrameIndRel.size  # to preallocate properly
    nBytesExtract = nFrameExtract * BytesPerFrame
    print(
        f'Extracted {nFrameExtract} frames from {fn} totaling {nBytesExtract/1e9:.2f} GB.')

    if nBytesExtract > 4e9:
        print(f'This will require {nBytesExtract/1e9:.2f} GB of RAM.')

    return FrameIndRel