ViewInfo::ViewInfo(spImgInfo_t img) { aipDprint(DEBUGBIT_0,"ViewInfo()\n"); imgInfo = img; rotation = WinRotation::calcRotation(img->getDataInfo()); rebinnedData.data = NULL; rebinnedData.width = 0; rebinnedData.height = 0; histogram = NULL; cm_off[0]=0; cm_off[1]=0; cm_off[2]=0; pixstx_off=0; pixsty_off=0; }
/* STATIC */ string WriteData::writePortableData(spImgInfo_t img, const char *path) { int bits; // Bits per word int bitpix; // The FITS BITPIX value char buf[81]; const int buflen = sizeof(buf) - 1; int i; if (img == nullImg) { return ""; } // Initialize various parameters bitpix = bits = (int)getReal("aipWriteFmtBits", 32); if((bits != 8) && (bits != 16) && (bits != 32)) { fprintf(stderr,"Please go to Image->Settings and set Data Output bits\n"); Werrprintf("%s","Please go to Image->Settings and set Data Output bits\n"); return ""; } if (getReal("aipWriteFmtFloat", 1) != 0) { bitpix *= -1; } spDataInfo_t di = img->getDataInfo(); int nx, ny, nz; double len[3]; nx = di->getFast(); ny = di->getMedium(); nz = di->getSlow(); di->getSpatialSpan(len); if (nx == 0 || ny == 0){ fprintf(stderr,"A spatial dimension is zero.\n"); return ""; } // Find min and max data values for header int datawords = nx * ny; float *fdata = di->getData(); float *edata = fdata + datawords; double datamin = *fdata++; double datamax = datamin; for ( ; fdata<edata; fdata++){ if (*fdata < datamin){ datamin = *fdata; }else if (*fdata > datamax){ datamax = *fdata; } } // Set the scaling parameters double max_d = img->getVsMax(); double min_d = img->getVsMin(); double vscale; // Set below for each case double voffset; // Convert to the desired data type. int databytes = datawords * bits / 8; unsigned char *databuf = new unsigned char[databytes]; char *pdata; short *b16; int *b32; float *f32; switch (bitpix){ case 8: vscale = 0xff / (max_d - min_d); voffset = - (0xff * min_d) / (max_d - min_d); datamin = datamin * vscale + voffset; datamax = datamax * vscale + voffset; if (datamin < 0) datamin = 0; if (datamax > 0xff) datamax = 0xff; convertData(di->getData(), databuf, datawords, vscale, voffset); pdata = (char *)databuf; break; case 16: vscale = 0x7fff / (max_d - min_d); voffset = - (0x7fff * min_d) / (max_d - min_d); datamin = datamin * vscale + voffset; datamax = datamax * vscale + voffset; if (datamin < -0x7fff) datamin = -0x7fff; if (datamax > 0x7fff) datamax = 0x7fff; convertData(di->getData(), (short*)databuf, datawords, vscale, voffset); #ifdef LINUX b16 = (short *) databuf; for (int cnt = 0; cnt < datawords; cnt++) { ByteSwap5(*b16); b16++; } #endif pdata = (char *)databuf; break; case 32: vscale = 0x7fffffff / (max_d - min_d); voffset = - (0x7fffffff * min_d) / (max_d - min_d); datamin = datamin * vscale + voffset; datamax = datamax * vscale + voffset; if (datamin < -0x7fffffff) datamin = -0x7fffffff; if (datamax > 0x7fffffff) datamax = 0x7fffffff; convertData(di->getData(), (int *)databuf, datawords, vscale, voffset); #ifdef LINUX b32 = (int *) databuf; for (int cnt = 0; cnt < datawords; cnt++) { ByteSwap5(*b32); b32++; } #endif pdata = (char *)databuf; break; case -32: #ifdef LINUX f32 = (float *)di->getData(); for (int cnt = 0; cnt < datawords; cnt++) { ByteSwap5(*f32); f32++; } pdata = (char *)f32; #else pdata = (char *)di->getData(); #endif break; default: if (bitpix < 0) { fprintf(stderr,"Illegal data type (float) for size (%d)\n", bits); } else { fprintf(stderr,"Illegal data type (integer) for size (%d)\n", bits); } delete[] databuf; return ""; } // Write data to tmp file in FITS format char *tmppath = new char [strlen(path) + 5]; sprintf(tmppath,"%s.tmp", path); int fd = open(tmppath, O_RDWR | O_CREAT, 0664); // Write the header i=0; sprintf(buf,"%-8s=%21s%50s", "SIMPLE", "T", ""); write(fd, buf, buflen); i++; sprintf(buf,"%-8s=%21d%50s", "BITPIX", bitpix, ""); write(fd, buf, buflen); i++; sprintf(buf,"%-8s=%21d%50s", "NAXIS", 2, ""); write(fd, buf, buflen); i++; sprintf(buf,"%-8s=%21d%50s", "NAXIS1", nx, ""); write(fd, buf, buflen); i++; sprintf(buf,"%-8s=%21d%50s", "NAXIS2", ny, ""); write(fd, buf, buflen); i++; sprintf(buf,"%-8s= '%-8.8s'%60s", "CTYPE1", "CM", ""); write(fd, buf, buflen); i++; sprintf(buf,"%-8s= '%-8.8s'%60s", "CTYPE2", "CM", ""); write(fd, buf, buflen); i++; sprintf(buf,"%-8s=%21G%50s", "CDELT1", len[0] / nx, ""); write(fd, buf, buflen); i++; sprintf(buf,"%-8s=%21G%50s", "CDELT2", len[1] / ny, ""); write(fd, buf, buflen); i++; sprintf(buf,"%-8s=%21G%50s", "DATAMIN", datamin, ""); write(fd, buf, buflen); i++; sprintf(buf,"%-8s=%21G%50s", "DATAMAX", datamax, ""); write(fd, buf, buflen); i++; sprintf(buf,"%-8s%-72s", "HISTORY", "Created by VnmrJ"); write(fd, buf, buflen); i++; sprintf(buf,"%-80s", "END"); write(fd, buf, buflen); i++; sprintf(buf,"%80s", ""); for ( ; i<36; i++){ write(fd, buf, buflen); } // Write the data write(fd, pdata, databytes); delete[] databuf; // Pad out the file to multiple of 2880 bytes int npad = 2880 - (databytes % 2880); if (npad != 2880){ char *padbuf = new char[npad]; memset(padbuf, 0, npad); write(fd, padbuf, npad); delete[] padbuf; } close(fd); char outpath[1024]; system(getScript(tmppath, path, outpath)); unlink(tmppath); delete[] tmppath; return outpath; }
string WriteData::writeFdfData(spImgInfo_t img, const char *filename) { if (img == nullImg) { return ""; } // Perhaps append ".fdf" to the filename char *newname = (char *)malloc(strlen(filename) + 5); const char *tail = filename + strlen(filename) - 4; if (strcasecmp(tail, ".fdf") != 0) { sprintf(newname,"%s.fdf", filename); } else { strcpy(newname, filename); } spDataInfo_t di = img->getDataInfo(); DDLSymbolTable *cp = (DDLSymbolTable *)di->st->CloneList(); int outbits = (int)getReal("aipWriteFmtBits", 32); if((outbits != 8) && (outbits != 16) && (outbits != 32)) { fprintf(stderr,"Please go to Image->Settings and set Data Output bits\n"); Werrprintf("%s","Please go to Image->Settings and set Data Output bits\n"); free(newname); return ""; } const char *storage = "integer"; if (getReal("aipWriteFmtFloat", 1) != 0) { storage = "float"; } // Set the scaling parameters double max_d = img->getVsMax(); double min_d = img->getVsMin(); double vscale; // Set below for each case double voffset = 0; int inbits; cp->GetValue("bits", inbits); cp->SetValue("storage", storage); cp->SetValue("bits", outbits); cp->SetValue("filename", newname); int datawords = cp->DataLength() / (inbits/8); if (strcasecmp(storage, "integer") == 0){ switch (outbits){ case 8: { unsigned char* dataptr = new unsigned char[datawords]; vscale = 0xff / (max_d - min_d); voffset = - (0xff * min_d) / (max_d - min_d); convertData(cp->GetData(), dataptr, datawords, vscale, voffset); cp->SetData((float *)dataptr, (outbits/8) * datawords); cp->SaveSymbolsAndData(newname); delete[] dataptr; break; } case 16: { unsigned short* dataptr = new unsigned short[datawords]; vscale = 0x7fff / (max_d - min_d); voffset = - (0x7fff * min_d) / (max_d - min_d); convertData((float *)cp->GetData(), dataptr, datawords, vscale, voffset); cp->SetData((float *)dataptr, (outbits/8) * datawords); cp->SaveSymbolsAndData(newname); delete[] dataptr; break; } case 32: { int* dataptr = new int[datawords]; vscale = 0x7fffffff / (max_d - min_d); voffset = - (0x7fffffff * min_d) / (max_d - min_d); convertData((float *)cp->GetData(), dataptr, datawords, vscale, voffset); cp->SetData((float *)dataptr, (outbits/8) * datawords); cp->SaveSymbolsAndData(newname); delete[] dataptr; break; } default: fprintf(stderr,"Illegal data size for integer FDF data: %d\n", outbits); break; } } else if (strcasecmp(storage, "float") == 0) { switch (outbits) { case 32: { cp->SaveSymbolsAndData(newname); break; } default: fprintf(stderr,"Illegal data size for float FDF data: %d\n", outbits); break; } } else { fprintf(stderr,"Illegal data type: %s\n", storage); } cp->Delete(); return newname; }