I added an allowApCorr flag to SingleFrameMeasurementTask.run (which defaults to True) to support SdssCalibrateTask, because it calls measurement.run several times, an ap corr data is only available for the final call. I did the same for ForcedMeasurementTask for symmetry. SdssCalibrateTask used to work without this until I made failure to apply aperture correction an exception. This new argument adds a bit of duplication with the config parameter doApplyApCorr, but I suggest we live with it. The duplication is mostly evident when calling initialMeasurement in [Sdss]CalibrateTask, because the corresponding doApplyApCorr parameter is ignored (initialMeasurement never has ap corr data); I set the parameter to "no" in setDefaults to avoid confusing configs, but it's not necessary.
Another possible approach is an argument doAllowApCorr that overrides the config parameter if not None. That would be more flexible, but I have rejected it for now because it is easier to explain why the flag is needed than a full override. We have no use case for a full override and I'm uncomfortable with too many ways to do something. Also, as a minor point, it is potentially a pain to validate the argument, since it is a keyword (though pex_config ChoiceField has a private method _validateValue(value) that would work, and it could be made public if we have enough need).