def gen_all_voltages_for_injections(self, injections_raw):
        """For a given set of current injections AB, generate all possible
        unique potential measurements.

        After Noel and Xu, 1991, for N electrodes, the number of possible
        voltage dipoles for a given current dipole is :math:`(N - 2)(N - 3) /
        2`. This includes normal and reciprocal measurements.

        If current dipoles are generated with
        ConfigManager.gen_all_current_dipoles(), then :math:`N \cdot (N - 1) /
        2` current dipoles are generated. Thus, this function will produce
        :math:`(N - 1)(N - 2)(N - 3) / 4` four-point configurations ABMN, half
        of which are reciprocals (Noel and Xu, 1991).

        All generated measurements are added to the instance.

        Use ConfigManager.split_into_normal_and_reciprocal() to split the
        configurations into normal and reciprocal measurements.

        Parameters
        ----------
        injections: numpy.ndarray
            Kx2 array holding K current injection dipoles A-B

        Returns
        -------
        configs: numpy.ndarray
            Nax4 array holding all possible measurement configurations

        """
        injections = injections_raw.astype(int)

        N = self.nr_electrodes
        all_quadpoles = []
        for idipole in injections:
            # sort current electrodes and convert to array indices
            Icurrent = np.sort(idipole) - 1

            # voltage electrodes
            velecs = list(range(1, N + 1))

            # remove current electrodes
            del(velecs[Icurrent[1]])
            del(velecs[Icurrent[0]])

            # permutate remaining
            voltages = itertools.permutations(velecs, 2)
            for voltage in voltages:
                all_quadpoles.append(
                    (idipole[0], idipole[1], voltage[0], voltage[1])
                )
        configs_unsorted = np.array(all_quadpoles)
        # sort AB and MN
        configs_sorted = np.hstack((
            np.sort(configs_unsorted[:, 0:2], axis=1),
            np.sort(configs_unsorted[:, 2:4], axis=1),
        ))
        configs = self.remove_duplicates(configs_sorted)

        self.add_to_configs(configs)
        self.remove_duplicates()
        return configs
For a given set of current injections AB, generate all possible
        unique potential measurements.

        After Noel and Xu, 1991, for N electrodes, the number of possible
        voltage dipoles for a given current dipole is :math:`(N - 2)(N - 3) /
        2`. This includes normal and reciprocal measurements.

        If current dipoles are generated with
        ConfigManager.gen_all_current_dipoles(), then :math:`N \cdot (N - 1) /
        2` current dipoles are generated. Thus, this function will produce
        :math:`(N - 1)(N - 2)(N - 3) / 4` four-point configurations ABMN, half
        of which are reciprocals (Noel and Xu, 1991).

        All generated measurements are added to the instance.

        Use ConfigManager.split_into_normal_and_reciprocal() to split the
        configurations into normal and reciprocal measurements.

        Parameters
        ----------
        injections: numpy.ndarray
            Kx2 array holding K current injection dipoles A-B

        Returns
        -------
        configs: numpy.ndarray
            Nax4 array holding all possible measurement configurations