Ejemplo n.º 1
0
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;
}
Ejemplo n.º 2
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;
}
Ejemplo n.º 3
0
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;
}