Use properties of the physical signal field to set the following
        features: n_sig, sig_len.

        Parameters
        ----------
        do_dac : bool
            Whether to use the digital signal field to perform dac
            conversion to get the physical signal field beforehand.
        expanded : bool
            Whether to use the `e_p_signal` or `p_signal` field. If
            True, the `samps_per_frame` attribute is also required.

        Notes
        -----
        Regarding dac conversion:
          - fmt, gain, and baseline must all be set in order to perform
            dac.
          - Unlike with adc, there is no way to infer these fields.
          - Using the fmt, gain and baseline fields, dac is performed,
            and (e_)p_signal is set.

        *Developer note: Seems this function will be very infrequently used.
         The set_d_features function seems far more useful.

def set_p_features(self, do_dac=False, expanded=False):
        """
        Use properties of the physical signal field to set the following
        features: n_sig, sig_len.

        Parameters
        ----------
        do_dac : bool
            Whether to use the digital signal field to perform dac
            conversion to get the physical signal field beforehand.
        expanded : bool
            Whether to use the `e_p_signal` or `p_signal` field. If
            True, the `samps_per_frame` attribute is also required.

        Notes
        -----
        Regarding dac conversion:
          - fmt, gain, and baseline must all be set in order to perform
            dac.
          - Unlike with adc, there is no way to infer these fields.
          - Using the fmt, gain and baseline fields, dac is performed,
            and (e_)p_signal is set.

        *Developer note: Seems this function will be very infrequently used.
         The set_d_features function seems far more useful.

        """

        if expanded:
            if do_dac:
                self.check_field('e_d_signal')
                self.check_field('fmt', 'all')
                self.check_field('adc_gain', 'all')
                self.check_field('baseline', 'all')
                self.check_field('samps_per_frame', 'all')

                # All required fields are present and valid. Perform DAC
                self.e_p_signal = self.dac(expanded)

            # Use e_p_signal to set fields
            self.check_field('e_p_signal', channels = 'all')
            self.sig_len = int(len(self.e_p_signal[0])/self.samps_per_frame[0])
            self.n_sig = len(self.e_p_signal)
        else:
            if do_dac:
                self.check_field('d_signal')
                self.check_field('fmt', 'all')
                self.check_field('adc_gain', 'all')
                self.check_field('baseline', 'all')

                # All required fields are present and valid. Perform DAC
                self.p_signal = self.dac()

            # Use p_signal to set fields
            self.check_field('p_signal')
            self.sig_len = self.p_signal.shape[0]
            self.n_sig = self.p_signal.shape[1]