Hi,
the best approach is to define the PPS explicitly, in the script, like so:
Ge_projector_shift = PseudoPotentialProjectorShift(
s_orbital_shift=14.55*eV,
p_orbital_shift=0.23*eV,
d_orbital_shift=-2.1674*eV
)
basis_set = BasisGGASG15.Germanium_Medium(projector_shift=Ge_projector_shift)
and
Si_projector_shift = PseudoPotentialProjectorShift(
s_orbital_shift=21.33*eV,
p_orbital_shift=-1.43*eV
)
basis_set = BasisGGASG15.Silicon_Medium(projector_shift=Si_projector_shift)
The reason for this is, that the values for the s,p,d shifts must always be optimized for the material at hand, and also for the pseudopotential used, and perhaps also depending on if you use PBE, revPBE, or LDA, to ensure they provide the best possible values for the band gaps and notably, the lattice parameters (if you also want to use the PPS basis set for geometry optimizations). Just like +U parameters, really.
The built-in basis sets referenced in the tutorial have pre-optimized values that I have quoted above, but these are actually a compromise, to give the best combination of band gaps and lattice parameters. They are only defined for SG15, and only for PBE (notably, the Ge lattice constant comes out a lot better with PBEsol). If you are not going to optimize the structure, you can actually get better band gaps with slightly different parameters.
And of course, the PPS approach is not limited to Si and Ge, so for any new material, the code above shows how to create a PPS basis set for a general case.