320 lines
10 KiB
Cython
320 lines
10 KiB
Cython
|
#
|
||
|
# Author: Joshua Cohen
|
||
|
# Copyright 2016
|
||
|
#
|
||
|
|
||
|
from libc.stdint cimport uint64_t
|
||
|
from libcpp cimport bool
|
||
|
|
||
|
|
||
|
cdef extern from "Ampcor.h":
|
||
|
cdef cppclass Ampcor:
|
||
|
uint64_t imgAccessor1, imgAccessor2, offImgAccessor, offQualImgAccessor
|
||
|
float snrThresh, covThresh, xScaleFactor, yScaleFactor
|
||
|
int imgDatatypes[2]
|
||
|
int imgWidths[2]
|
||
|
int imgBands[2]
|
||
|
int isMag[2]
|
||
|
int firstRow, lastRow, rowSkip, firstCol, lastCol, colSkip, refChipWidth, refChipHeight
|
||
|
int schMarginX, schMarginY, nLookAcross, nLookDown, osampFact, zoomWinSize
|
||
|
int acrossGrossOff, downGrossOff, numRowTable
|
||
|
bool corr_debug, corr_display, usr_enable_gpu
|
||
|
|
||
|
Ampcor() except +
|
||
|
void ampcor()
|
||
|
int getLocationAcrossAt(int)
|
||
|
int getLocationDownAt(int)
|
||
|
float getLocationAcrossOffsetAt(int)
|
||
|
float getLocationDownOffsetAt(int)
|
||
|
float getSnrAt(int)
|
||
|
float getCov1At(int)
|
||
|
float getCov2At(int)
|
||
|
float getCov3At(int)
|
||
|
|
||
|
|
||
|
cdef class PyAmpcor:
|
||
|
cdef Ampcor c_ampcor
|
||
|
|
||
|
def __cinit__(self):
|
||
|
return
|
||
|
|
||
|
@property
|
||
|
def imageBand1(self):
|
||
|
return self.c_ampcor.imgBands[0]
|
||
|
@imageBand1.setter
|
||
|
def imageBand1(self, int a):
|
||
|
self.c_ampcor.imgBands[0] = a
|
||
|
@property
|
||
|
def imageBand2(self):
|
||
|
return self.c_ampcor.imgBands[1]
|
||
|
@imageBand2.setter
|
||
|
def imageBand2(self, int a):
|
||
|
self.c_ampcor.imgBands[1] = a
|
||
|
@property
|
||
|
def imageAccessor1(self):
|
||
|
return self.c_ampcor.imgAccessor1
|
||
|
@imageAccessor1.setter
|
||
|
def imageAccessor1(self, uint64_t a):
|
||
|
self.c_ampcor.imgAccessor1 = a
|
||
|
@property
|
||
|
def imageAccessor2(self):
|
||
|
return self.c_ampcor.imgAccessor2
|
||
|
@imageAccessor2.setter
|
||
|
def imageAccessor2(self, uint64_t a):
|
||
|
self.c_ampcor.imgAccessor2 = a
|
||
|
@property
|
||
|
def offsetImageAccessor(self):
|
||
|
return self.c_ampcor.offImgAccessor
|
||
|
@offsetImageAccessor.setter
|
||
|
def offsetImageAccessor(self, uint64_t a):
|
||
|
self.c_ampcor.offImgAccessor = a
|
||
|
@property
|
||
|
def offsetQualImageAccessor(self):
|
||
|
return self.c_ampcor.offQualImgAccessor
|
||
|
@offsetQualImageAccessor.setter
|
||
|
def offsetQualImageAccessor(self, uint64_t a):
|
||
|
self.c_ampcor.offQualImgAccessor = a
|
||
|
@property
|
||
|
def thresholdSNR(self):
|
||
|
return self.c_ampcor.snrThresh
|
||
|
@thresholdSNR.setter
|
||
|
def thresholdSNR(self, float a):
|
||
|
self.c_ampcor.snrThresh = a
|
||
|
@property
|
||
|
def thresholdCov(self):
|
||
|
return self.c_ampcor.covThresh
|
||
|
@thresholdCov.setter
|
||
|
def thresholdCov(self, float a):
|
||
|
self.c_ampcor.covThresh = a
|
||
|
@property
|
||
|
def scaleFactorX(self):
|
||
|
return self.c_ampcor.xScaleFactor
|
||
|
@scaleFactorX.setter
|
||
|
def scaleFactorX(self, float a):
|
||
|
self.c_ampcor.xScaleFactor = a
|
||
|
@property
|
||
|
def scaleFactorY(self):
|
||
|
return self.c_ampcor.yScaleFactor
|
||
|
@scaleFactorY.setter
|
||
|
def scaleFactorY(self, float a):
|
||
|
self.c_ampcor.yScaleFactor = a
|
||
|
@property
|
||
|
def datatype1(self):
|
||
|
dt = self.c_ampcor.imgDatatypes[0]
|
||
|
mg = self.c_ampcor.isMag[0]
|
||
|
if (dt + mg == 0):
|
||
|
return 'real'
|
||
|
elif (dt + mg == 1):
|
||
|
return 'complex'
|
||
|
else: # dt + mg == 2
|
||
|
return 'mag'
|
||
|
@datatype1.setter
|
||
|
def datatype1(self, str a):
|
||
|
if (a[0].lower() == 'r'):
|
||
|
self.c_ampcor.isMag[0] = 0
|
||
|
self.c_ampcor.imgDatatypes[0] = 0
|
||
|
elif (a[0].lower() == 'c'):
|
||
|
self.c_ampcor.isMag[0] = 0
|
||
|
self.c_ampcor.imgDatatypes[0] = 1
|
||
|
elif (a[0].lower() == 'm'):
|
||
|
self.c_ampcor.isMag[0] = 1
|
||
|
self.c_ampcor.imgDatatypes[0] = 1
|
||
|
else:
|
||
|
print("Error: Unrecognized datatype. Expected 'complex', 'real', or 'mag'.")
|
||
|
@property
|
||
|
def datatype2(self):
|
||
|
dt = self.c_ampcor.imgDatatypes[1]
|
||
|
mg = self.c_ampcor.isMag[1]
|
||
|
if (dt + mg == 0):
|
||
|
return 'real'
|
||
|
elif (dt + mg == 1):
|
||
|
return 'complex'
|
||
|
else: # dt + mg == 2
|
||
|
return 'mag'
|
||
|
@datatype2.setter
|
||
|
def datatype2(self, str a):
|
||
|
if (a[0].lower() == 'r'):
|
||
|
self.c_ampcor.isMag[1] = 0
|
||
|
self.c_ampcor.imgDatatypes[1] = 0
|
||
|
elif (a[0].lower() == 'c'):
|
||
|
self.c_ampcor.isMag[1] = 0
|
||
|
self.c_ampcor.imgDatatypes[1] = 1
|
||
|
elif (a[0].lower() == 'm'):
|
||
|
self.c_ampcor.isMag[1] = 1
|
||
|
self.c_ampcor.imgDatatypes[1] = 1
|
||
|
else:
|
||
|
print("Error: Unrecognized datatype. Expected 'complex', 'real', or 'mag'.")
|
||
|
@property
|
||
|
def lineLength1(self):
|
||
|
return self.c_ampcor.imgWidths[0]
|
||
|
@lineLength1.setter
|
||
|
def lineLength1(self, int a):
|
||
|
self.c_ampcor.imgWidths[0] = a
|
||
|
@property
|
||
|
def lineLength2(self):
|
||
|
return self.c_ampcor.imgWidths[1]
|
||
|
@lineLength2.setter
|
||
|
def lineLength2(self, int a):
|
||
|
self.c_ampcor.imgWidths[1] = a
|
||
|
@property
|
||
|
def firstSampleDown(self):
|
||
|
return self.c_ampcor.firstRow
|
||
|
@firstSampleDown.setter
|
||
|
def firstSampleDown(self, int a):
|
||
|
self.c_ampcor.firstRow = a
|
||
|
@property
|
||
|
def lastSampleDown(self):
|
||
|
return self.c_ampcor.lastRow
|
||
|
@lastSampleDown.setter
|
||
|
def lastSampleDown(self, int a):
|
||
|
self.c_ampcor.lastRow = a
|
||
|
@property
|
||
|
def skipSampleDown(self):
|
||
|
return self.c_ampcor.rowSkip
|
||
|
@skipSampleDown.setter
|
||
|
def skipSampleDown(self, int a):
|
||
|
self.c_ampcor.rowSkip = a
|
||
|
@property
|
||
|
def firstSampleAcross(self):
|
||
|
return self.c_ampcor.firstCol
|
||
|
@firstSampleAcross.setter
|
||
|
def firstSampleAcross(self, int a):
|
||
|
self.c_ampcor.firstCol = a
|
||
|
@property
|
||
|
def lastSampleAcross(self):
|
||
|
return self.c_ampcor.lastCol
|
||
|
@lastSampleAcross.setter
|
||
|
def lastSampleAcross(self, int a):
|
||
|
self.c_ampcor.lastCol = a
|
||
|
@property
|
||
|
def skipSampleAcross(self):
|
||
|
return self.c_ampcor.colSkip
|
||
|
@skipSampleAcross.setter
|
||
|
def skipSampleAcross(self, int a):
|
||
|
self.c_ampcor.colSkip = a
|
||
|
@property
|
||
|
def windowSizeWidth(self):
|
||
|
return self.c_ampcor.refChipWidth
|
||
|
@windowSizeWidth.setter
|
||
|
def windowSizeWidth(self, int a):
|
||
|
self.c_ampcor.refChipWidth = a
|
||
|
@property
|
||
|
def windowSizeHeight(self):
|
||
|
return self.c_ampcor.refChipHeight
|
||
|
@windowSizeHeight.setter
|
||
|
def windowSizeHeight(self, int a):
|
||
|
self.c_ampcor.refChipHeight = a
|
||
|
@property
|
||
|
def searchWindowSizeWidth(self):
|
||
|
return self.c_ampcor.schMarginX
|
||
|
@searchWindowSizeWidth.setter
|
||
|
def searchWindowSizeWidth(self, int a):
|
||
|
self.c_ampcor.schMarginX = a
|
||
|
@property
|
||
|
def searchWindowSizeHeight(self):
|
||
|
return self.c_ampcor.schMarginY
|
||
|
@searchWindowSizeHeight.setter
|
||
|
def searchWindowSizeHeight(self, int a):
|
||
|
self.c_ampcor.schMarginY = a
|
||
|
@property
|
||
|
def acrossLooks(self):
|
||
|
return self.c_ampcor.nLookAcross
|
||
|
@acrossLooks.setter
|
||
|
def acrossLooks(self, int a):
|
||
|
self.c_ampcor.nLookAcross = a
|
||
|
@property
|
||
|
def downLooks(self):
|
||
|
return self.c_ampcor.nLookDown
|
||
|
@downLooks.setter
|
||
|
def downLooks(self, int a):
|
||
|
self.c_ampcor.nLookDown = a
|
||
|
@property
|
||
|
def oversamplingFactor(self):
|
||
|
return self.c_ampcor.osampFact
|
||
|
@oversamplingFactor.setter
|
||
|
def oversamplingFactor(self, int a):
|
||
|
self.c_ampcor.osampFact = a
|
||
|
@property
|
||
|
def zoomWindowSize(self):
|
||
|
return self.c_ampcor.zoomWinSize
|
||
|
@zoomWindowSize.setter
|
||
|
def zoomWindowSize(self, int a):
|
||
|
self.c_ampcor.zoomWinSize = a
|
||
|
@property
|
||
|
def acrossGrossOffset(self):
|
||
|
return self.c_ampcor.acrossGrossOff
|
||
|
@acrossGrossOffset.setter
|
||
|
def acrossGrossOffset(self, int a):
|
||
|
self.c_ampcor.acrossGrossOff = a
|
||
|
@property
|
||
|
def downGrossOffset(self):
|
||
|
return self.c_ampcor.downGrossOff
|
||
|
@downGrossOffset.setter
|
||
|
def downGrossOffset(self, int a):
|
||
|
self.c_ampcor.downGrossOff = a
|
||
|
@property
|
||
|
def debugFlag(self):
|
||
|
return self.c_ampcor.corr_debug
|
||
|
@debugFlag.setter
|
||
|
def debugFlag(self, bool a):
|
||
|
self.c_ampcor.corr_debug = a
|
||
|
@property
|
||
|
def displayFlag(self):
|
||
|
return self.c_ampcor.corr_display
|
||
|
@displayFlag.setter
|
||
|
def displayFlag(self, bool a):
|
||
|
self.c_ampcor.corr_display = a
|
||
|
@property
|
||
|
def usr_enable_gpu(self):
|
||
|
return self.c_ampcor.usr_enable_gpu
|
||
|
@usr_enable_gpu.setter
|
||
|
def usr_enable_gpu(self, bool a):
|
||
|
self.c_ampcor.usr_enable_gpu = a
|
||
|
@property
|
||
|
def numElem(self):
|
||
|
return self.c_ampcor.numRowTable
|
||
|
|
||
|
def runAmpcor(self):
|
||
|
self.c_ampcor.ampcor()
|
||
|
def getLocationAcrossAt(self, int idx):
|
||
|
if (idx >= self.numElem):
|
||
|
print("Error: Invalid element number ("+str(self.numElem)+" elements available).")
|
||
|
else:
|
||
|
return self.c_ampcor.getLocationAcrossAt(idx)
|
||
|
def getLocationDownAt(self, int idx):
|
||
|
if (idx >= self.numElem):
|
||
|
print("Error: Invalid element number ("+str(self.numElem)+" elements available).")
|
||
|
else:
|
||
|
return self.c_ampcor.getLocationDownAt(idx)
|
||
|
def getLocationAcrossOffsetAt(self, int idx):
|
||
|
if (idx >= self.numElem):
|
||
|
print("Error: Invalid element number ("+str(self.numElem)+" elements available).")
|
||
|
else:
|
||
|
return self.c_ampcor.getLocationAcrossOffsetAt(idx)
|
||
|
def getLocationDownOffsetAt(self, int idx):
|
||
|
if (idx >= self.numElem):
|
||
|
print("Error: Invalid element number ("+str(self.numElem)+" elements available).")
|
||
|
else:
|
||
|
return self.c_ampcor.getLocationDownOffsetAt(idx)
|
||
|
def getSNRAt(self, int idx):
|
||
|
if (idx >= self.numElem):
|
||
|
print("Error: Invalid element number ("+str(self.numElem)+" elements available).")
|
||
|
else:
|
||
|
return self.c_ampcor.getSnrAt(idx)
|
||
|
def getCov1At(self, int idx):
|
||
|
if (idx >= self.numElem):
|
||
|
print("Error: Invalid element number ("+str(self.numElem)+" elements available).")
|
||
|
else:
|
||
|
return self.c_ampcor.getCov1At(idx)
|
||
|
def getCov2At(self, int idx):
|
||
|
if (idx >= self.numElem):
|
||
|
print("Error: Invalid element number ("+str(self.numElem)+" elements available).")
|
||
|
else:
|
||
|
return self.c_ampcor.getCov2At(idx)
|
||
|
def getCov3At(self, int idx):
|
||
|
if (idx >= self.numElem):
|
||
|
print("Error: Invalid element number ("+str(self.numElem)+" elements available).")
|
||
|
else:
|
||
|
return self.c_ampcor.getCov3At(idx)
|
||
|
|