Base driver circuit?
Sure. No reply, so this is what you get from me:







simulate this circuit &ndash; Schematic created using CircuitLab

That will do slightly more than \$\pm 20\:\textrm{mA}\$ from a \$\pm 10\:\textrm{V}\$ DAC control voltage (since \$R_{10}=470\:\Omega\$ instead of \$500\:\Omega\$), into a load of up to \$2.5\:\textrm{k}\Omega\$ (\$50\:\textrm{V}\$ compliance.) It also requires \$\pm 20\:\textrm{mA}\$ from your DAC, too.

You should use beta matched BJT pairs for \$Q_3\$, \$Q_5\$, \$Q_4\$, and \$Q_6\$ -- such as the BCM61 and BCM62. (I didn't add beta-mismatch compensation to the circuit.) Cheaper (and somewhat riskier) would be the BCV61 and BCV62, as those aren't beta-matched. But all of those are at least thermally connected so their \$V_{BE}\$ should track well. The resistor values for \$R_1\$, \$R_3\$, \$R_2\$ and \$R_4\$ should be matched as precisely as you care to provide. Accuracy for them isn't as critical, as \$R_{10}\$ sets the conversion of voltage to current. Make \$R_{10}\$ as accurate as you want. The other resistors are less critical, though \$R_5\$ and \$R_6\$ need to be adjusted per the opamp being used.

There is no possible way this is going to give you anything like 24 bits of linearity, precision, or accuracy (no one can provide that kind of accuracy.) But you are just using this for driving a base current, I gather. It should be okay for BJT parameter extraction and curve tracing.