Hi Phil,
You are correct.
The units of ADSize are intended to be in unbinned detector pixels. The ADProsilica::setGeometry is a good example. Their API defines the readout region size in
binned pixels, so the driver sets it to ADSizeX/ADBinX. I can’t promise that all detector drivers have been written to follow this convention, but they should be.
Here is the code for the Prosilica driver.
asynStatus prosilica::setGeometry()
{
int status = asynSuccess;
int s;
int binX, binY, minY, minX, sizeX, sizeY, maxSizeX, maxSizeY;
static const char *functionName = "setGeometry";
/* Get all of the current geometry parameters from the parameter library */
status |= getIntegerParam(ADBinX, &binX);
if (binX < 1) binX = 1;
status |= getIntegerParam(ADBinY, &binY);
if (binY < 1) binY = 1;
status |= getIntegerParam(ADMinX, &minX);
status |= getIntegerParam(ADMinY, &minY);
status |= getIntegerParam(ADSizeX, &sizeX);
status |= getIntegerParam(ADSizeY, &sizeY);
status |= getIntegerParam(ADMaxSizeX, &maxSizeX);
status |= getIntegerParam(ADMaxSizeY, &maxSizeY);
if (minX + sizeX > maxSizeX) {
sizeX = maxSizeX - minX;
setIntegerParam(ADSizeX, sizeX);
}
if (minY + sizeY > maxSizeY) {
sizeY = maxSizeY - minY;
setIntegerParam(ADSizeY, sizeY);
}
/* CMOS cameras don't support binning, so ignore ePvErrNotFound errors */
s = PvAttrUint32Set(this->PvHandle, "BinningX", binX);
if (s != ePvErrNotFound) status |= s;
s = PvAttrUint32Set(this->PvHandle, "BinningY", binY);
if (s != ePvErrNotFound) status |= s;
if(!status){
status |= PvAttrUint32Set(this->PvHandle, "RegionX", minX/binX);
status |= PvAttrUint32Set(this->PvHandle, "RegionY", minY/binY);
status |= PvAttrUint32Set(this->PvHandle, "Width", sizeX/binX);
status |= PvAttrUint32Set(this->PvHandle, "Height", sizeY/binY);
}
if (status) asynPrint(this->pasynUserSelf, ASYN_TRACE_ERROR,
"%s:%s: error, status=%d\n",
driverName, functionName, status);
return((asynStatus)status);
}
Mark
As I understand it, the ADSize parameters are intended to determine the dimensions of the _physical_ region of the sensor that is read out. That's why the constraint imposed is
ADMin + ADSize <= ADMaxSize
This means that the output array from an areaDetector driver should have dimensions given approximately by ADSize/ADBin for each dimension.
Is this correct?
Thanks,
Phil Atkin
--
Pixel Analytics is a limited company registered in England. Company number: 7747526;
Registered office: 93A New Road, Haslingfield, Cambridge CB23 1LP