/** * Equivalent to (mol.x, mol.y, mol.z) * You have to free *x, *y, *z! */ int get_coordinates(PyObject *mol, float **x, float **y, float **z) { int nx, ny, nz; *x = get_float_array(mol, "x", &nx); *y = get_float_array(mol, "y", &ny); *z = get_float_array(mol, "z", &nz); // These coordinate arrays should all be the same length if(!(nx == ny && ny == nz)) { fprintf(stderr, "Error: Coordinate arrays are not the same size.\n"); return -1; } return nx; }
PyObject* compression_decompressData(PyObject* self, PyObject* args) { int status; int nUcTiles = 0; int* inDataLen = 0; int naxis; int numzVals; int* numUncompressedVals = 0; int cn_zblank; int cn_zscale; int cn_zzero; int cn_uncompressed; int bitpix; int datatype; int firstelem; int anynul; long nelem; long* naxes = 0; long* tileSize = 0; long* zval = 0; double nulval; double* bscale; double* bzero; double quantize_level; double hcomp_scale; long* nullDVals; unsigned char** inData = 0; void** uncompressedData = 0; int i; int ii; char* compressTypeStr = ""; PyObject* inDataObj; PyObject* naxesObj; PyObject* tileSizeObj; PyObject* uncompressedDataObj; PyObject* zvalObj; FITSfile fileParms; fitsfile theFile; PyArrayObject* bscaleArray; PyArrayObject* bzeroArray; PyArrayObject* nullDvalsArray; PyArrayObject* decompDataArray; PyArrayObject* bscaleArray1 = 0; PyArrayObject* bzeroArray1 = 0; PyArrayObject* nullDvalsArray1 = 0; /* Get Python arguments */ if (!PyArg_ParseTuple(args, "OiOOO!iO!iO!iOiddOsiildO!:compression.decompressData", &inDataObj, &naxis, &naxesObj, &tileSizeObj, &PyArray_Type, &bscaleArray, &cn_zscale, &PyArray_Type, &bzeroArray, &cn_zzero, &PyArray_Type, &nullDvalsArray, &cn_zblank, &uncompressedDataObj, &cn_uncompressed, &quantize_level, &hcomp_scale, &zvalObj, &compressTypeStr, &bitpix, &firstelem, &nelem, &nulval, &PyArray_Type, &decompDataArray)) { PyErr_SetString(PyExc_TypeError,"Couldn't parse arguments"); return NULL; } /* Convert the input lists into C type arrays */ inData = get_char_array(inDataObj, "Compressed Data", NULL, &inDataLen); if (!inData) { goto error; } naxes = get_long_array(naxesObj, "ZNAXISn", NULL); if (!naxes) { goto error; } tileSize = get_long_array(tileSizeObj, "ZTILEn", NULL); if (!tileSize) { goto error; } if (cn_zzero != 1) { bzero = (double*)bzeroArray->data; } else { bzeroArray1 = (PyArrayObject*)PyArray_ContiguousFromObject( (PyObject*)bzeroArray, PyArray_DOUBLE, 1, 1); bzero = (double*)bzeroArray1->data; } if (cn_zscale != 1) { bscale = (double*)bscaleArray->data; } else { bscaleArray1 = (PyArrayObject*)PyArray_ContiguousFromObject( (PyObject*)bscaleArray, PyArray_DOUBLE, 1, 1); bscale = (double*)bscaleArray1->data; } if (cn_zblank != 1) { nullDVals = (long*)nullDvalsArray->data; } else { nullDvalsArray1 = (PyArrayObject*)PyArray_ContiguousFromObject( (PyObject*)nullDvalsArray, PyArray_LONG, 1, 1); nullDVals = (long*)nullDvalsArray1->data; } zval = get_long_array(zvalObj, "ZVALn", &numzVals); if (!zval) { goto error; } switch (bitpix) { case BYTE_IMG: datatype = TBYTE; break; case SHORT_IMG: datatype = TSHORT; break; case LONG_IMG: datatype = TINT; break; case LONGLONG_IMG: datatype = TLONGLONG; break; case FLOAT_IMG: datatype = TFLOAT; if (cn_uncompressed == 1) { nUcTiles = PyList_Size(uncompressedDataObj); uncompressedData = (void**) PyMem_Malloc(nUcTiles*sizeof(float*)); if (!uncompressedData) { goto error; } numUncompressedVals = PyMem_Malloc(nUcTiles*sizeof(int)); if (!numUncompressedVals) { goto error; } for (i = 0; i < nUcTiles; i++) { uncompressedData[i] = get_float_array(PyList_GetItem(uncompressedDataObj, i), "Uncompressed Data", &numUncompressedVals[i]); if (!uncompressedData[i]) { goto error; } } } break; case DOUBLE_IMG: datatype = TDOUBLE; if (cn_uncompressed == 1) { nUcTiles = PyList_Size(uncompressedDataObj); uncompressedData = (void**) PyMem_Malloc(nUcTiles*sizeof(double*)); if (!uncompressedData) { goto error; } numUncompressedVals = PyMem_Malloc(nUcTiles*sizeof(int)); if (!numUncompressedVals) { goto error; } for (i = 0; i < nUcTiles; i++) { uncompressedData[i] = get_double_array(PyList_GetItem(uncompressedDataObj, i), "Uncompressed Data", &numUncompressedVals[i]); if (!uncompressedData[i]) { goto error; } } } break; default: PyErr_SetString(PyExc_ValueError,"Invalid value for BITPIX"); return NULL; } /* Set up the fitsfile object */ theFile.Fptr = &fileParms; (theFile.Fptr)->rice_blocksize = 32; (theFile.Fptr)->hcomp_smooth = 0; (theFile.Fptr)->rice_bytepix = 4; if (strcmp(compressTypeStr, "RICE_1") == 0) { (theFile.Fptr)->compress_type = RICE_1; if (numzVals > 0) { (theFile.Fptr)->rice_blocksize = zval[0]; if (numzVals > 1) { (theFile.Fptr)->rice_bytepix = zval[1]; } } } else if (strcmp(compressTypeStr, "GZIP_1") == 0) { (theFile.Fptr)->compress_type = GZIP_1; } else if (strcmp(compressTypeStr, "HCOMPRESS_1") == 0) { (theFile.Fptr)->compress_type = HCOMPRESS_1; if (numzVals > 0) { (theFile.Fptr)->hcomp_smooth = zval[1]; } } else if (strcmp(compressTypeStr, "PLIO_1") == 0) { (theFile.Fptr)->compress_type = PLIO_1; } else { (theFile.Fptr)->compress_type = 0; } (theFile.Fptr)->zndim = naxis; (theFile.Fptr)->maxtilelen = 1; (theFile.Fptr)->zbitpix = bitpix; (theFile.Fptr)->data = inData; (theFile.Fptr)->dataLen = inDataLen; (theFile.Fptr)->bscale = bscale; (theFile.Fptr)->cn_zscale = cn_zscale; (theFile.Fptr)->quantize_level = quantize_level; (theFile.Fptr)->hcomp_scale = hcomp_scale; if (cn_zscale == -1) { (theFile.Fptr)->zscale = bscale[0]; (theFile.Fptr)->cn_bscale = bscale[0]; } else { (theFile.Fptr)->zscale = 1.0; (theFile.Fptr)->cn_bscale = 1.0; } (theFile.Fptr)->bzero = bzero; (theFile.Fptr)->cn_zzero = cn_zzero; if (cn_zzero == -1) { (theFile.Fptr)->zzero = bzero[0]; (theFile.Fptr)->cn_bzero = bzero[0]; } else { (theFile.Fptr)->zzero = 0.0; (theFile.Fptr)->cn_bzero = 0.0; } (theFile.Fptr)->blank = nullDVals; (theFile.Fptr)->cn_zblank = cn_zblank; if (cn_zblank == -1) { (theFile.Fptr)->zblank = nullDVals[0]; } else { (theFile.Fptr)->zblank = 0; } /* Initialize arrays */ for (ii = 0; ii < MAX_COMPRESS_DIM; ii++) { ((theFile.Fptr)->tilesize)[ii] = 1; ((theFile.Fptr)->znaxis)[ii] = 1; } for (ii = 0; ii < naxis; ii++) { ((theFile.Fptr)->znaxis)[ii] = naxes[ii]; ((theFile.Fptr)->tilesize)[ii] = tileSize[ii]; (theFile.Fptr)->maxtilelen *= tileSize[ii]; } (theFile.Fptr)->cn_uncompressed = cn_uncompressed; if (cn_uncompressed == 1) { (theFile.Fptr)->ucData = uncompressedData; (theFile.Fptr)->ucDataLen = numUncompressedVals; } /* Call the C function */ status = 0; status = _astropy_fits_read_img(&theFile, datatype, firstelem, nelem, &nulval, decompDataArray->data, &anynul, &status); if (status != 0) { processStatusErr(status); } error: PyMem_Free(inData); PyMem_Free(inDataLen); PyMem_Free(naxes); PyMem_Free(tileSize); PyMem_Free(zval); if (cn_uncompressed == 1) { for (i = 0; i < nUcTiles; i++) { PyMem_Free(uncompressedData[i]); } PyMem_Free(uncompressedData); PyMem_Free(numUncompressedVals); } if (bscaleArray1 != 0) { Py_DECREF(bscaleArray1); } if (bzeroArray1 != 0) { Py_DECREF(bzeroArray1); } if (nullDvalsArray1 != 0) { Py_DECREF(nullDvalsArray1); } if (status != 0) { return NULL; } else { return Py_BuildValue("i",status); } }