code: def process_tomography_programs(process, qubits=None,
                                  pre_rotation_generator=tomography.default_rotations,
                                  post_rotation_generator=tomography.default_rotations):
      
      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
docs: 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