<SYSTEM_TASK:>
Solve the following problem using Python, implementing the functions described below, one line at a time
<END_TASK>
<USER_TASK:>
Description:
 def process_tomography_programs(process, qubits=None, pre_rotation_generator=tomography.default_rotations, post_rotation_generator=tomography.default_rotations):
 """ Generator that yields tomographic sequences that wrap a process encoded by a QUIL program `proc` in tomographic rotations on the specified `qubits`. If `qubits is None`, it assumes all qubits in the program should be tomographically rotated. :param Program process: A Quil program :param list|NoneType qubits: The specific qubits for which to generate the tomographic sequences :param pre_rotation_generator: A generator that yields tomographic pre-rotations to perform. :param post_rotation_generator: A generator that yields tomographic post-rotations to perform. :return: Program for process tomography. :rtype: Program """

    if qubits is None:
        qubits = process.get_qubits()
    for tomographic_pre_rotation in pre_rotation_generator(*qubits):
        for tomography_post_rotation in post_rotation_generator(*qubits):
            process_tomography_program = Program(Pragma("PRESERVE_BLOCK"))
            process_tomography_program.inst(tomographic_pre_rotation)
            process_tomography_program.inst(process)
            process_tomography_program.inst(tomography_post_rotation)
            process_tomography_program.inst(Pragma("END_PRESERVE_BLOCK"))

            yield process_tomography_program