Index: trunk/Ohana/src/addstar/doc/notes.txt
===================================================================
--- trunk/Ohana/src/addstar/doc/notes.txt	(revision 20583)
+++ trunk/Ohana/src/addstar/doc/notes.txt	(revision 20652)
@@ -1,2 +1,21 @@
+
+2008.10.11
+
+  updating addstar / dvo to deal better with mosaic / image relationships
+
+  * fix imageID sequencing (DONE)
+  * define imageID -> image lookup
+  * add parentID (for mosaic relationship)
+  * add external ID
+  * add supplied filename (different from 'filename')
+
+  there are two issues involved in mosaic astrometry:  1) we need to
+  have links in the Image table between the chip-level images and
+  their associated mosaic images.  this is provided by the parentID
+  field.  2) the coord transformation functions use a local static
+  variable to supply the associated mosaic coords structure.  this is
+  a weak implementation, but the method for now.
+
+  
 
 2008.02.23
Index: trunk/Ohana/src/gophot/src/gophot.c
===================================================================
--- trunk/Ohana/src/gophot/src/gophot.c	(revision 20583)
+++ trunk/Ohana/src/gophot/src/gophot.c	(revision 20652)
@@ -25,5 +25,5 @@
   }
   /* convert to float, set up noise array and axes */
-  gfits_convert_format (&header, &matrix, -32, 1.0, 0.0, 0);
+  gfits_convert_format (&header, &matrix, -32, 1.0, 0.0, 0xffff, 0);
   ALLOCATE (noise, float, matrix.size);
   big = (float *) matrix.buffer;
Index: trunk/Ohana/src/libfits/include/gfitsio.h
===================================================================
--- trunk/Ohana/src/libfits/include/gfitsio.h	(revision 20583)
+++ trunk/Ohana/src/libfits/include/gfitsio.h	(revision 20652)
@@ -138,5 +138,5 @@
 
 void   	gfits_add_matrix_value         PROTO((Matrix *matrix, int x, int y, double value)); 
-int    	gfits_convert_format           PROTO((Header *header, Matrix *matrix, int outBitpix, double outScale, double outZero, int outUnsign));
+int    	gfits_convert_format           PROTO((Header *header, Matrix *matrix, int outBitpix, double outScale, double outZero, int inBlank, int outUnsign));
 int     gfits_copy_matrix              PROTO((Matrix *in, Matrix *out)); 
 int     gfits_create_matrix            PROTO((Header *header, Matrix *matrix)); 
@@ -157,5 +157,5 @@
 int     gfits_uncompress_image 	       PROTO((Header *header, Matrix *matrix, FTable *ftable));
 int     gfits_uncompress_data  	       PROTO((char *zdata, int Nzdata, char *cmptype, char **optname, char **optvalue, int Nopt, char *outdata, int *Nout, int out_pixsize));
-int     gfits_distribute_data  	       PROTO((Matrix *matrix, int bitpix, char *data, int Ndata, int *otile, int *ztile, float zscale, float zzero));
+int     gfits_distribute_data  	       PROTO((Matrix *matrix, int bitpix, char *data, int Ndata, int *otile, int oblank, int *ztile, int zblank, float zscale, float zzero));
 int     gfits_byteswap_zdata   	       PROTO((char *zdata, int Nzdata, int bitpix));
 int     gfits_extension_is_compressed  PROTO((Header *header));
Index: trunk/Ohana/src/libfits/matrix/F_compress_M.c
===================================================================
--- trunk/Ohana/src/libfits/matrix/F_compress_M.c	(revision 20583)
+++ trunk/Ohana/src/libfits/matrix/F_compress_M.c	(revision 20652)
@@ -34,5 +34,5 @@
   char cmptype[80];
   char zaxis[10], naxis[10], key[10], word[81], exttype[81], checksum[81], datasum[81];
-  int Noptions, NOPTIONS;
+  int Noptions, NOPTIONS, zblank, oblank;
   VarLengthColumn zdef;
   float zscale, zzero;
@@ -177,4 +177,10 @@
   gfits_scan (header, "ZSCALE", "%lf", 1, &zscale);
 
+  zblank = 32767;
+  gfits_scan (header, "ZBLANK", "%d", 1, &zblank);
+
+  oblank = 32767;
+  gfits_scan (header, "BLANK", "%d", 1, &oblank);
+
   zzero = 0;
   gfits_scan (header, "ZZERO", "%lf", 1, &zzero);
@@ -248,5 +254,5 @@
 
     // copy the uncompressed pixels into their correct locations 	    
-    if (!gfits_distribute_data (matrix, odata_pixsize, out, Nout, otile, ztile, zscale, zzero)) return (FALSE);
+    if (!gfits_distribute_data (matrix, odata_pixsize, out, Nout, otile, oblank, ztile, zblank, zscale, zzero)) return (FALSE);
 
     // update the tile counters, carrying to the next dimension if needed
@@ -289,5 +295,5 @@
 
 // bitpix is the input data size/type
-int gfits_distribute_data (Matrix *matrix, int bitpix, char *data, int Ndata, int *otile, int *ztile, float zscale, float zzero) {
+int gfits_distribute_data (Matrix *matrix, int bitpix, char *data, int Ndata, int *otile, int oblank, int *ztile, int zblank, float zscale, float zzero) {
 
   int i, j, start, offset, coord, Nline;
@@ -331,6 +337,9 @@
     TYPE *Optr = (TYPE *) &matrix->buffer[SIZE*(offset + start)]; \
     for (j = 0; j < Ztile[0]; j++, Iptr++, Optr++) { \
-      *Optr = *Iptr * zscale + zzero; \
-    } }
+      if (*Iptr == zblank) { \
+	  *Optr = oblank;    \
+      } else { \
+	  *Optr = *Iptr * zscale + zzero;	\
+      } } }
 
   // this macro sets up the outer switch and calls above macro with all output bitpix options
Index: trunk/Ohana/src/libfits/matrix/F_convert_format.c
===================================================================
--- trunk/Ohana/src/libfits/matrix/F_convert_format.c	(revision 20583)
+++ trunk/Ohana/src/libfits/matrix/F_convert_format.c	(revision 20652)
@@ -2,32 +2,93 @@
 # include <gfitsio.h>
 
-# define CONVERTDOWN \
-  inMode  *in; \
-  outMode *out; \
-  out = (outMode *) matrix[0].buffer; \
-  in  = (inMode  *) matrix[0].buffer; \
-  for (i = 0; i < Npixels; i++, out++, in++) \
-    *out = *in*A + B; \
+# ifndef NAN
+# ifndef BYTE_SWAP
+#  define __nan_bytes           { 0x7f, 0xc0, 0, 0 }
+# else
+#  define __nan_bytes           { 0, 0, 0xc0, 0x7f }
+# endif
+static union { unsigned char __c[4]; float __d; } __nan_union
+__attribute_used__ = { __nan_bytes };
+# define NAN    (__nan_union.__d)
+# endif
+
+# define CONVERTDOWN(MY_NAN)				\
+  inMode  *in;						\
+  outMode *out;						\
+  out = (outMode *) matrix[0].buffer;			\
+  in  = (inMode  *) matrix[0].buffer;			\
+  for (i = 0; i < Npixels; i++, out++, in++)		\
+    if (*in == inBlank) {				\
+      *out = (MY_NAN);					\
+    } else {						\
+      *out = *in*A + B;					\
+    }							\
   REALLOCATE (matrix[0].buffer, char, matrix[0].size); 
 
-# define CONVERTSAME \
-  inMode  *in; \
-  outMode *out; \
-  out = (outMode *) matrix[0].buffer; \
-  in  = (inMode  *) matrix[0].buffer; \
-  for (i = 0; i < Npixels; i++, out++, in++) \
-    *out = *in*A + B; 
-
-# define CONVERTUP \
-  inMode  *in; \
-  outMode *out; \
-  REALLOCATE (matrix[0].buffer, char, matrix[0].size); \
-  out = (outMode *)matrix[0].buffer + Npixels - 1; \
-  in  = (inMode  *)matrix[0].buffer + Npixels - 1; \
-  for (i = 0; i < Npixels; i++, out--, in--) \
-    *out = *in*A + B;
+# define CONVERTSAME(MY_NAN)			\
+  inMode  *in;					\
+  outMode *out;					\
+  out = (outMode *) matrix[0].buffer;		\
+  in  = (inMode  *) matrix[0].buffer;		\
+  for (i = 0; i < Npixels; i++, out++, in++)	\
+    if (*in == inBlank) {			\
+      *out = (MY_NAN);				\
+    } else {					\
+      *out = *in*A + B;				\
+    }
+
+# define CONVERTUP(MY_NAN)				\
+  inMode  *in;						\
+  outMode *out;						\
+  REALLOCATE (matrix[0].buffer, char, matrix[0].size);	\
+  out = (outMode *)matrix[0].buffer + Npixels - 1;	\
+  in  = (inMode  *)matrix[0].buffer + Npixels - 1;	\
+  for (i = 0; i < Npixels; i++, out--, in--)		\
+    if (*in == inBlank) {				\
+      *out = (MY_NAN);					\
+    } else {						\
+      *out = *in*A + B;					\
+    }
+
+# define CONVERTDOWN_FF(MY_NAN)				\
+  inMode  *in;						\
+  outMode *out;						\
+  out = (outMode *) matrix[0].buffer;			\
+  in  = (inMode  *) matrix[0].buffer;			\
+  for (i = 0; i < Npixels; i++, out++, in++)		\
+    if (isnan(*in) || isinf(*in)) {			\
+      *out = (MY_NAN);					\
+    } else {						\
+      *out = *in*A + B;					\
+    }							\
+  REALLOCATE (matrix[0].buffer, char, matrix[0].size); 
+
+# define CONVERTSAME_FF(MY_NAN)			\
+  inMode  *in;					\
+  outMode *out;					\
+  out = (outMode *) matrix[0].buffer;		\
+  in  = (inMode  *) matrix[0].buffer;		\
+  for (i = 0; i < Npixels; i++, out++, in++)	\
+    if (isnan(*in) || isinf(*in)) {			\
+      *out = (MY_NAN);				\
+    } else {					\
+      *out = *in*A + B;				\
+    }
+
+# define CONVERTUP_FF(MY_NAN)				\
+  inMode  *in;						\
+  outMode *out;						\
+  REALLOCATE (matrix[0].buffer, char, matrix[0].size);	\
+  out = (outMode *)matrix[0].buffer + Npixels - 1;	\
+  in  = (inMode  *)matrix[0].buffer + Npixels - 1;	\
+  for (i = 0; i < Npixels; i++, out--, in--)		\
+    if (isnan(*in) || isinf(*in)) {			\
+      *out = (MY_NAN);					\
+    } else {						\
+      *out = *in*A + B;					\
+    }
 
 /*********************** fits convert format ***********************************/
-int gfits_convert_format (Header *header, Matrix *matrix, int outBitpix, double outScale, double outZero, int outUnsign) {
+int gfits_convert_format (Header *header, Matrix *matrix, int outBitpix, double outScale, double outZero, int inBlank, int outUnsign) {
 
   unsigned long i, nbytes, Npixels;
@@ -63,300 +124,300 @@
   if ((!outUnsign) && (!inUnsign)) {  /** BLOCK 1 **/
     switch (inBitpix) {
-    case 8: 
-      { typedef unsigned char inMode;
+      case 8: 
+	{ typedef unsigned char inMode;
 	switch (outBitpix) {
-	case 8:   { typedef unsigned char  outMode; CONVERTSAME; break; }
-	case 16:  { typedef short          outMode; CONVERTUP;   break; }
-	case -16: { typedef unsigned short outMode; CONVERTUP;   break; }
-	case 32:  { typedef int            outMode; CONVERTUP;   break; }
-	case -32: { typedef float          outMode; CONVERTUP;   break; }
-	case -64: { typedef double         outMode; CONVERTUP;   break; }
-	}
-      }
-      break;  
-    case 16: 
-      { typedef short inMode;
-	switch (outBitpix) {
-	case 8:   { typedef unsigned char  outMode; CONVERTDOWN; break; }
-	case 16:  { typedef short          outMode; CONVERTSAME; break; }
-	case -16: { typedef unsigned short outMode; CONVERTSAME; break; }
-	case 32:  { typedef int            outMode; CONVERTUP;   break; }
-	case -32: { typedef float          outMode; CONVERTUP;   break; }
-	case -64: { typedef double         outMode; CONVERTUP;   break; }
-	}
-      }
-      break;  
-    case -16: 
-      { typedef unsigned short inMode;
-	switch (outBitpix) {
-	case 8:   { typedef unsigned char  outMode; CONVERTDOWN; break; }
-	case 16:  { typedef short          outMode; CONVERTSAME; break; }
-	case -16: { typedef unsigned short outMode; CONVERTSAME; break; }
-	case 32:  { typedef int            outMode; CONVERTUP;   break; }
-	case -32: { typedef float          outMode; CONVERTUP;   break; }
-	case -64: { typedef double         outMode; CONVERTUP;   break; }
-	}
-      }
-      break;  
-    case 32: 
-      { typedef int inMode;
-	switch (outBitpix) {
-	case 8:   { typedef unsigned char  outMode; CONVERTDOWN; break; }
-	case 16:  { typedef short          outMode; CONVERTDOWN; break; }
-	case -16: { typedef unsigned short outMode; CONVERTDOWN; break; }
-	case 32:  { typedef int            outMode; CONVERTSAME; break; }
-	case -32: { typedef float          outMode; CONVERTSAME; break; }
-	case -64: { typedef double         outMode; CONVERTUP;   break; }
-	}
-      }
-      break;
-    case -32: 
-      { typedef float inMode;
-	switch (outBitpix) {
-	case 8:   { typedef unsigned char  outMode; CONVERTDOWN; break; }
-	case 16:  { typedef short          outMode; CONVERTDOWN; break; }
-	case -16: { typedef unsigned short outMode; CONVERTDOWN; break; }
-	case 32:  { typedef int            outMode; CONVERTSAME; break; }
-	case -32: { typedef float          outMode; CONVERTSAME; break; }
-	case -64: { typedef double         outMode; CONVERTUP;   break; }
-	}
-      }
-      break;
-    case -64: 
-      { typedef double inMode;
-	switch (outBitpix) {
-	case 8:   { typedef unsigned char  outMode; CONVERTDOWN; break; }
-	case 16:  { typedef short          outMode; CONVERTDOWN; break; }
-	case -16: { typedef unsigned short outMode; CONVERTDOWN; break; }
-	case 32:  { typedef int            outMode; CONVERTDOWN; break; }
-	case -32: { typedef float          outMode; CONVERTDOWN; break; }
-	case -64: { typedef double         outMode; CONVERTSAME; break; }
-	}
-      }
+	  case 8:   { typedef unsigned char  outMode; CONVERTSAME(0); break; }
+	  case 16:  { typedef short          outMode; CONVERTUP(0);   break; }
+	  case -16: { typedef unsigned short outMode; CONVERTUP(0);   break; }
+	  case 32:  { typedef int            outMode; CONVERTUP(0);   break; }
+	  case -32: { typedef float          outMode; CONVERTUP(NAN);   break; }
+	  case -64: { typedef double         outMode; CONVERTUP(NAN);   break; }
+	}
+	}
+	break;  
+      case 16: 
+	{ typedef short inMode;
+	  switch (outBitpix) {
+	    case 8:   { typedef unsigned char  outMode; CONVERTDOWN(0); break; }
+	    case 16:  { typedef short          outMode; CONVERTSAME(0); break; }
+	    case -16: { typedef unsigned short outMode; CONVERTSAME(0); break; }
+	    case 32:  { typedef int            outMode; CONVERTUP(0);   break; }
+	    case -32: { typedef float          outMode; CONVERTUP(NAN);   break; }
+	    case -64: { typedef double         outMode; CONVERTUP(NAN);   break; }
+	  }
+	}
+	break;  
+      case -16: 
+	{ typedef unsigned short inMode;
+	  switch (outBitpix) {
+	    case 8:   { typedef unsigned char  outMode; CONVERTDOWN(0); break; }
+	    case 16:  { typedef short          outMode; CONVERTSAME(0); break; }
+	    case -16: { typedef unsigned short outMode; CONVERTSAME(0); break; }
+	    case 32:  { typedef int            outMode; CONVERTUP(0);   break; }
+	    case -32: { typedef float          outMode; CONVERTUP(NAN);   break; }
+	    case -64: { typedef double         outMode; CONVERTUP(NAN);   break; }
+	  }
+	}
+	break;  
+      case 32: 
+	{ typedef int inMode;
+	  switch (outBitpix) {
+	    case 8:   { typedef unsigned char  outMode; CONVERTDOWN(0); break; }
+	    case 16:  { typedef short          outMode; CONVERTDOWN(0); break; }
+	    case -16: { typedef unsigned short outMode; CONVERTDOWN(0); break; }
+	    case 32:  { typedef int            outMode; CONVERTSAME(0); break; }
+	    case -32: { typedef float          outMode; CONVERTSAME(NAN); break; }
+	    case -64: { typedef double         outMode; CONVERTUP(NAN);   break; }
+	  }
+	}
+	break;
+      case -32: 
+	{ typedef float inMode;
+	  switch (outBitpix) {
+	    case 8:   { typedef unsigned char  outMode; CONVERTDOWN_FF(0); break; }
+	    case 16:  { typedef short          outMode; CONVERTDOWN_FF(0); break; }
+	    case -16: { typedef unsigned short outMode; CONVERTDOWN_FF(0); break; }
+	    case 32:  { typedef int            outMode; CONVERTSAME_FF(0); break; }
+	    case -32: { typedef float          outMode; CONVERTSAME_FF(NAN); break; }
+	    case -64: { typedef double         outMode; CONVERTUP_FF(NAN);   break; }
+	  }
+	}
+	break;
+      case -64: 
+	{ typedef double inMode;
+	  switch (outBitpix) {
+	    case 8:   { typedef unsigned char  outMode; CONVERTDOWN_FF(0); break; }
+	    case 16:  { typedef short          outMode; CONVERTDOWN_FF(0); break; }
+	    case -16: { typedef unsigned short outMode; CONVERTDOWN_FF(0); break; }
+	    case 32:  { typedef int            outMode; CONVERTDOWN_FF(0); break; }
+	    case -32: { typedef float          outMode; CONVERTDOWN_FF(NAN); break; }
+	    case -64: { typedef double         outMode; CONVERTSAME_FF(NAN); break; }
+	  }
+	}
     }
   }
   if ((outUnsign) && (!inUnsign)) {  /** BLOCK 3 **/
     switch (inBitpix) {
-    case 8: 
-      { typedef unsigned char inMode;
+      case 8: 
+	{ typedef unsigned char inMode;
 	switch (outBitpix) {
-	case 8:   { typedef          char   outMode; CONVERTSAME; break; }
-	case 16:  { typedef unsigned short  outMode; CONVERTUP;   break; }
-	case -16: { typedef unsigned short  outMode; CONVERTUP;   break; }
-	case 32:  { typedef unsigned int    outMode; CONVERTUP;   break; }
-	case -32: { typedef          float  outMode; CONVERTUP;   break; }
-	case -64: { typedef          double outMode; CONVERTUP;   break; }
-	}
-      }
-      break;  
-    case 16: 
-      { typedef short inMode;
-	switch (outBitpix) {
-	case 8:   { typedef          char   outMode; CONVERTDOWN; break; }
-	case 16:  { typedef unsigned short  outMode; CONVERTSAME; break; }
-	case -16: { typedef unsigned short  outMode; CONVERTSAME; break; }
-	case 32:  { typedef unsigned int    outMode; CONVERTUP;   break; }
-	case -32: { typedef          float  outMode; CONVERTUP;   break; }
-	case -64: { typedef          double outMode; CONVERTUP;   break; }
-	}
-      }
-      break;  
-    case -16: 
-      { typedef unsigned short inMode;
-	switch (outBitpix) {
-	case 8:   { typedef          char   outMode; CONVERTDOWN; break; }
-	case 16:  { typedef unsigned short  outMode; CONVERTSAME; break; }
-	case -16: { typedef unsigned short  outMode; CONVERTSAME; break; }
-	case 32:  { typedef unsigned int    outMode; CONVERTUP;   break; }
-	case -32: { typedef          float  outMode; CONVERTUP;   break; }
-	case -64: { typedef          double outMode; CONVERTUP;   break; }
-	}
-      }
-      break;  
-    case 32: 
-      { typedef int inMode;
-	switch (outBitpix) {
-	case 8:   { typedef          char   outMode; CONVERTDOWN; break; }
-	case 16:  { typedef unsigned short  outMode; CONVERTDOWN; break; }
-	case -16: { typedef unsigned short  outMode; CONVERTDOWN; break; }
-	case 32:  { typedef unsigned int    outMode; CONVERTSAME; break; }
-	case -32: { typedef          float  outMode; CONVERTSAME; break; }
-	case -64: { typedef          double outMode; CONVERTUP;   break; }
-	}
-      }
-      break;
-    case -32: 
-      { typedef float inMode;
-	switch (outBitpix) {
-	case 8:   { typedef          char   outMode; CONVERTDOWN; break; }
-	case 16:  { typedef unsigned short  outMode; CONVERTDOWN; break; }
-	case -16: { typedef unsigned short  outMode; CONVERTDOWN; break; }
-	case 32:  { typedef unsigned int    outMode; CONVERTSAME; break; }
-	case -32: { typedef          float  outMode; CONVERTSAME; break; }
-	case -64: { typedef          double outMode; CONVERTUP;   break; }
-	}
-      }
-      break;
-    case -64: 
-      { typedef double inMode;
-	switch (outBitpix) {
-	case 8:   { typedef          char   outMode; CONVERTDOWN; break; }
-	case 16:  { typedef unsigned short  outMode; CONVERTDOWN; break; }
-	case -16: { typedef unsigned short  outMode; CONVERTDOWN; break; }
-	case 32:  { typedef unsigned int    outMode; CONVERTDOWN; break; }
-	case -32: { typedef          float  outMode; CONVERTDOWN; break; }
-	case -64: { typedef          double outMode; CONVERTSAME; break; }
-	}
-      }
+	  case 8:   { typedef          char   outMode; CONVERTSAME(0); break; }
+	  case 16:  { typedef unsigned short  outMode; CONVERTUP(0);   break; }
+	  case -16: { typedef unsigned short  outMode; CONVERTUP(0);   break; }
+	  case 32:  { typedef unsigned int    outMode; CONVERTUP(0);   break; }
+	  case -32: { typedef          float  outMode; CONVERTUP(NAN);   break; }
+	  case -64: { typedef          double outMode; CONVERTUP(NAN);   break; }
+	}
+	}
+	break;  
+      case 16: 
+	{ typedef short inMode;
+	  switch (outBitpix) {
+	    case 8:   { typedef          char   outMode; CONVERTDOWN(0); break; }
+	    case 16:  { typedef unsigned short  outMode; CONVERTSAME(0); break; }
+	    case -16: { typedef unsigned short  outMode; CONVERTSAME(0); break; }
+	    case 32:  { typedef unsigned int    outMode; CONVERTUP(0);   break; }
+	    case -32: { typedef          float  outMode; CONVERTUP(NAN);   break; }
+	    case -64: { typedef          double outMode; CONVERTUP(NAN);   break; }
+	  }
+	}
+	break;  
+      case -16: 
+	{ typedef unsigned short inMode;
+	  switch (outBitpix) {
+	    case 8:   { typedef          char   outMode; CONVERTDOWN(0); break; }
+	    case 16:  { typedef unsigned short  outMode; CONVERTSAME(0); break; }
+	    case -16: { typedef unsigned short  outMode; CONVERTSAME(0); break; }
+	    case 32:  { typedef unsigned int    outMode; CONVERTUP(0);   break; }
+	    case -32: { typedef          float  outMode; CONVERTUP(NAN);   break; }
+	    case -64: { typedef          double outMode; CONVERTUP(NAN);   break; }
+	  }
+	}
+	break;  
+      case 32: 
+	{ typedef int inMode;
+	  switch (outBitpix) {
+	    case 8:   { typedef          char   outMode; CONVERTDOWN(0); break; }
+	    case 16:  { typedef unsigned short  outMode; CONVERTDOWN(0); break; }
+	    case -16: { typedef unsigned short  outMode; CONVERTDOWN(0); break; }
+	    case 32:  { typedef unsigned int    outMode; CONVERTSAME(0); break; }
+	    case -32: { typedef          float  outMode; CONVERTSAME(NAN); break; }
+	    case -64: { typedef          double outMode; CONVERTUP(NAN);   break; }
+	  }
+	}
+	break;
+      case -32: 
+	{ typedef float inMode;
+	  switch (outBitpix) {
+	    case 8:   { typedef          char   outMode; CONVERTDOWN_FF(0); break; }
+	    case 16:  { typedef unsigned short  outMode; CONVERTDOWN_FF(0); break; }
+	    case -16: { typedef unsigned short  outMode; CONVERTDOWN_FF(0); break; }
+	    case 32:  { typedef unsigned int    outMode; CONVERTSAME_FF(0); break; }
+	    case -32: { typedef          float  outMode; CONVERTSAME_FF(NAN); break; }
+	    case -64: { typedef          double outMode; CONVERTUP_FF(NAN);   break; }
+	  }
+	}
+	break;
+      case -64: 
+	{ typedef double inMode;
+	  switch (outBitpix) {
+	    case 8:   { typedef          char   outMode; CONVERTDOWN_FF(0); break; }
+	    case 16:  { typedef unsigned short  outMode; CONVERTDOWN_FF(0); break; }
+	    case -16: { typedef unsigned short  outMode; CONVERTDOWN_FF(0); break; }
+	    case 32:  { typedef unsigned int    outMode; CONVERTDOWN_FF(0); break; }
+	    case -32: { typedef          float  outMode; CONVERTDOWN_FF(NAN); break; }
+	    case -64: { typedef          double outMode; CONVERTSAME_FF(NAN); break; }
+	  }
+	}
     }
   }
   if ((!outUnsign) && (inUnsign)) {  /** BLOCK 2 **/
     switch (inBitpix) {
-    case 8: 
-      { typedef unsigned char inMode;
+      case 8: 
+	{ typedef unsigned char inMode;
 	switch (outBitpix) {
-	case 8:   { typedef unsigned char  outMode; CONVERTSAME; break; }
-	case 16:  { typedef short          outMode; CONVERTUP;   break; }
-	case -16: { typedef unsigned short outMode; CONVERTUP;   break; }
-	case 32:  { typedef int            outMode; CONVERTUP;   break; }
-	case -32: { typedef float          outMode; CONVERTUP;   break; }
-	case -64: { typedef double         outMode; CONVERTUP;   break; }
-	}
-      }
-      break;  
-    case 16: 
-      { typedef unsigned short inMode;
-	switch (outBitpix) {
-	case 8:   { typedef unsigned char  outMode; CONVERTDOWN; break; }
-	case 16:  { typedef short          outMode; CONVERTSAME; break; }
-	case -16: { typedef unsigned short outMode; CONVERTSAME; break; }
-	case 32:  { typedef int            outMode; CONVERTUP;   break; }
-	case -32: { typedef float          outMode; CONVERTUP;   break; }
-	case -64: { typedef double         outMode; CONVERTUP;   break; }
-	}
-      }
-      break;  
-    case -16: 
-      { typedef unsigned short inMode;
-	switch (outBitpix) {
-	case 8:   { typedef unsigned char  outMode; CONVERTDOWN; break; }
-	case 16:  { typedef short          outMode; CONVERTSAME; break; }
-	case -16: { typedef unsigned short outMode; CONVERTSAME; break; }
-	case 32:  { typedef int            outMode; CONVERTUP;   break; }
-	case -32: { typedef float          outMode; CONVERTUP;   break; }
-	case -64: { typedef double         outMode; CONVERTUP;   break; }
-	}
-      }
-      break;  
-    case 32: 
-      { typedef unsigned int inMode;
-	switch (outBitpix) {
-	case 8:   { typedef unsigned char  outMode; CONVERTDOWN; break; }
-	case 16:  { typedef short          outMode; CONVERTDOWN; break; }
-	case -16: { typedef unsigned short outMode; CONVERTDOWN; break; }
-	case 32:  { typedef int            outMode; CONVERTSAME; break; }
-	case -32: { typedef float          outMode; CONVERTSAME; break; }
-	case -64: { typedef double         outMode; CONVERTUP;   break; }
-	}
-      }
-      break;
-    case -32: 
-      { typedef float inMode;
-	switch (outBitpix) {
-	case 8:   { typedef unsigned char  outMode; CONVERTDOWN; break; }
-	case 16:  { typedef short          outMode; CONVERTDOWN; break; }
-	case -16: { typedef unsigned short outMode; CONVERTDOWN; break; }
-	case 32:  { typedef int            outMode; CONVERTSAME; break; }
-	case -32: { typedef float          outMode; CONVERTSAME; break; }
-	case -64: { typedef double         outMode; CONVERTUP;   break; }
-	}
-      }
-      break;
-    case -64: 
-      { typedef double inMode;
-	switch (outBitpix) {
-	case 8:   { typedef unsigned char  outMode; CONVERTDOWN; break; }
-	case 16:  { typedef short          outMode; CONVERTDOWN; break; }
-	case -16: { typedef unsigned short outMode; CONVERTDOWN; break; }
-	case 32:  { typedef int            outMode; CONVERTDOWN; break; }
-	case -32: { typedef float          outMode; CONVERTDOWN; break; }
-	case -64: { typedef double         outMode; CONVERTSAME; break; }
-	}
-      }
+	  case 8:   { typedef unsigned char  outMode; CONVERTSAME(0); break; }
+	  case 16:  { typedef short          outMode; CONVERTUP(0);   break; }
+	  case -16: { typedef unsigned short outMode; CONVERTUP(0);   break; }
+	  case 32:  { typedef int            outMode; CONVERTUP(0);   break; }
+	  case -32: { typedef float          outMode; CONVERTUP(NAN);   break; }
+	  case -64: { typedef double         outMode; CONVERTUP(NAN);   break; }
+	}
+	}
+	break;  
+      case 16: 
+	{ typedef unsigned short inMode;
+	  switch (outBitpix) {
+	    case 8:   { typedef unsigned char  outMode; CONVERTDOWN(0); break; }
+	    case 16:  { typedef short          outMode; CONVERTSAME(0); break; }
+	    case -16: { typedef unsigned short outMode; CONVERTSAME(0); break; }
+	    case 32:  { typedef int            outMode; CONVERTUP(0);   break; }
+	    case -32: { typedef float          outMode; CONVERTUP(NAN);   break; }
+	    case -64: { typedef double         outMode; CONVERTUP(NAN);   break; }
+	  }
+	}
+	break;  
+      case -16: 
+	{ typedef unsigned short inMode;
+	  switch (outBitpix) {
+	    case 8:   { typedef unsigned char  outMode; CONVERTDOWN(0); break; }
+	    case 16:  { typedef short          outMode; CONVERTSAME(0); break; }
+	    case -16: { typedef unsigned short outMode; CONVERTSAME(0); break; }
+	    case 32:  { typedef int            outMode; CONVERTUP(0);   break; }
+	    case -32: { typedef float          outMode; CONVERTUP(NAN);   break; }
+	    case -64: { typedef double         outMode; CONVERTUP(NAN);   break; }
+	  }
+	}
+	break;  
+      case 32: 
+	{ typedef unsigned int inMode;
+	  switch (outBitpix) {
+	    case 8:   { typedef unsigned char  outMode; CONVERTDOWN(0); break; }
+	    case 16:  { typedef short          outMode; CONVERTDOWN(0); break; }
+	    case -16: { typedef unsigned short outMode; CONVERTDOWN(0); break; }
+	    case 32:  { typedef int            outMode; CONVERTSAME(0); break; }
+	    case -32: { typedef float          outMode; CONVERTSAME(NAN); break; }
+	    case -64: { typedef double         outMode; CONVERTUP(NAN);   break; }
+	  }
+	}
+	break;
+      case -32: 
+	{ typedef float inMode;
+	  switch (outBitpix) {
+	    case 8:   { typedef unsigned char  outMode; CONVERTDOWN_FF(0); break; }
+	    case 16:  { typedef short          outMode; CONVERTDOWN_FF(0); break; }
+	    case -16: { typedef unsigned short outMode; CONVERTDOWN_FF(0); break; }
+	    case 32:  { typedef int            outMode; CONVERTSAME_FF(0); break; }
+	    case -32: { typedef float          outMode; CONVERTSAME_FF(NAN); break; }
+	    case -64: { typedef double         outMode; CONVERTUP_FF(NAN);   break; }
+	  }
+	}
+	break;
+      case -64: 
+	{ typedef double inMode;
+	  switch (outBitpix) {
+	    case 8:   { typedef unsigned char  outMode; CONVERTDOWN_FF(0); break; }
+	    case 16:  { typedef short          outMode; CONVERTDOWN_FF(0); break; }
+	    case -16: { typedef unsigned short outMode; CONVERTDOWN_FF(0); break; }
+	    case 32:  { typedef int            outMode; CONVERTDOWN_FF(0); break; }
+	    case -32: { typedef float          outMode; CONVERTDOWN_FF(NAN); break; }
+	    case -64: { typedef double         outMode; CONVERTSAME_FF(NAN); break; }
+	  }
+	}
     }
   }
   if ((outUnsign) && (inUnsign)) {
     switch (inBitpix) {
-    case 8: 
-      { typedef char inMode;
+      case 8: 
+	{ typedef char inMode;
 	switch (outBitpix) {
-	case 8:   { typedef char            outMode; CONVERTSAME; break; }
-	case 16:  { typedef unsigned short  outMode; CONVERTUP;   break; }
-	case -16: { typedef unsigned short  outMode; CONVERTDOWN; break; }
-	case 32:  { typedef unsigned int    outMode; CONVERTUP;   break; }
-	case -32: { typedef          float  outMode; CONVERTUP;   break; }
-	case -64: { typedef          double outMode; CONVERTUP;   break; }
-	}
-      }
-      break;  
-    case 16: 
-      { typedef unsigned short inMode;
-	switch (outBitpix) {
-	case 8:   { typedef char            outMode; CONVERTDOWN; break; }
-	case 16:  { typedef unsigned short  outMode; CONVERTSAME; break; }
-	case -16: { typedef unsigned short  outMode; CONVERTDOWN; break; }
-	case 32:  { typedef unsigned int    outMode; CONVERTUP;   break; }
-	case -32: { typedef          float  outMode; CONVERTUP;   break; }
-	case -64: { typedef          double outMode; CONVERTUP;   break; }
-	}
-      }
-      break;  
-    case -16: 
-      { typedef unsigned short inMode;
-	switch (outBitpix) {
-	case 8:   { typedef char            outMode; CONVERTDOWN; break; }
-	case 16:  { typedef unsigned short  outMode; CONVERTSAME; break; }
-	case -16: { typedef unsigned short  outMode; CONVERTDOWN; break; }
-	case 32:  { typedef unsigned int    outMode; CONVERTUP;   break; }
-	case -32: { typedef          float  outMode; CONVERTUP;   break; }
-	case -64: { typedef          double outMode; CONVERTUP;   break; }
-	}
-      }
-      break;  
-    case 32: 
-      { typedef unsigned int inMode;
-	switch (outBitpix) {
-	case 8:   { typedef char            outMode; CONVERTDOWN; break; }
-	case 16:  { typedef unsigned short  outMode; CONVERTDOWN; break; }
-	case -16: { typedef unsigned short  outMode; CONVERTDOWN; break; }
-	case 32:  { typedef unsigned int    outMode; CONVERTSAME; break; }
-	case -32: { typedef          float  outMode; CONVERTSAME; break; }
-	case -64: { typedef          double outMode; CONVERTUP;   break; }
-	}				    
-      }					    
-      break;				    
-    case -32: 				    
-      { typedef float inMode;		    
-	switch (outBitpix) {		    
-	case 8:   { typedef char            outMode; CONVERTDOWN; break; }
-	case 16:  { typedef unsigned short  outMode; CONVERTDOWN; break; }
-	case -16: { typedef unsigned short  outMode; CONVERTDOWN; break; }
-	case 32:  { typedef unsigned int    outMode; CONVERTSAME; break; }
-	case -32: { typedef          float  outMode; CONVERTSAME; break; }
-	case -64: { typedef          double outMode; CONVERTUP;   break; }
-	}				    
-      }					    
-      break;				    
-    case -64: 				    
-      { typedef double inMode;		    
-	switch (outBitpix) {		    
-	case 8:   { typedef char            outMode; CONVERTDOWN; break; }
-	case 16:  { typedef unsigned short  outMode; CONVERTDOWN; break; }
-	case -16: { typedef unsigned short  outMode; CONVERTDOWN; break; }
-	case 32:  { typedef unsigned int    outMode; CONVERTDOWN; break; }
-	case -32: { typedef          float  outMode; CONVERTDOWN; break; }
-	case -64: { typedef          double outMode; CONVERTSAME; break; }
-	}
-      }
+	  case 8:   { typedef char            outMode; CONVERTSAME(0); break; }
+	  case 16:  { typedef unsigned short  outMode; CONVERTUP(0);   break; }
+	  case -16: { typedef unsigned short  outMode; CONVERTDOWN(0); break; }
+	  case 32:  { typedef unsigned int    outMode; CONVERTUP(0);   break; }
+	  case -32: { typedef          float  outMode; CONVERTUP(NAN);   break; }
+	  case -64: { typedef          double outMode; CONVERTUP(NAN);   break; }
+	}
+	}
+	break;  
+      case 16: 
+	{ typedef unsigned short inMode;
+	  switch (outBitpix) {
+	    case 8:   { typedef char            outMode; CONVERTDOWN(0); break; }
+	    case 16:  { typedef unsigned short  outMode; CONVERTSAME(0); break; }
+	    case -16: { typedef unsigned short  outMode; CONVERTDOWN(0); break; }
+	    case 32:  { typedef unsigned int    outMode; CONVERTUP(0);   break; }
+	    case -32: { typedef          float  outMode; CONVERTUP(NAN);   break; }
+	    case -64: { typedef          double outMode; CONVERTUP(NAN);   break; }
+	  }
+	}
+	break;  
+      case -16: 
+	{ typedef unsigned short inMode;
+	  switch (outBitpix) {
+	    case 8:   { typedef char            outMode; CONVERTDOWN(0); break; }
+	    case 16:  { typedef unsigned short  outMode; CONVERTSAME(0); break; }
+	    case -16: { typedef unsigned short  outMode; CONVERTDOWN(0); break; }
+	    case 32:  { typedef unsigned int    outMode; CONVERTUP(0);   break; }
+	    case -32: { typedef          float  outMode; CONVERTUP(NAN);   break; }
+	    case -64: { typedef          double outMode; CONVERTUP(NAN);   break; }
+	  }
+	}
+	break;  
+      case 32: 
+	{ typedef unsigned int inMode;
+	  switch (outBitpix) {
+	    case 8:   { typedef char            outMode; CONVERTDOWN(0); break; }
+	    case 16:  { typedef unsigned short  outMode; CONVERTDOWN(0); break; }
+	    case -16: { typedef unsigned short  outMode; CONVERTDOWN(0); break; }
+	    case 32:  { typedef unsigned int    outMode; CONVERTSAME(0); break; }
+	    case -32: { typedef          float  outMode; CONVERTSAME(NAN); break; }
+	    case -64: { typedef          double outMode; CONVERTUP(NAN);   break; }
+	  }				    
+	}					    
+	break;				    
+      case -32: 				    
+	{ typedef float inMode;		    
+	  switch (outBitpix) {		    
+	    case 8:   { typedef char            outMode; CONVERTDOWN_FF(0); break; }
+	    case 16:  { typedef unsigned short  outMode; CONVERTDOWN_FF(0); break; }
+	    case -16: { typedef unsigned short  outMode; CONVERTDOWN_FF(0); break; }
+	    case 32:  { typedef unsigned int    outMode; CONVERTSAME_FF(0); break; }
+	    case -32: { typedef          float  outMode; CONVERTSAME_FF(NAN); break; }
+	    case -64: { typedef          double outMode; CONVERTUP_FF(NAN);   break; }
+	  }				    
+	}					    
+	break;				    
+      case -64: 				    
+	{ typedef double inMode;		    
+	  switch (outBitpix) {		    
+	    case 8:   { typedef char            outMode; CONVERTDOWN_FF(0); break; }
+	    case 16:  { typedef unsigned short  outMode; CONVERTDOWN_FF(0); break; }
+	    case -16: { typedef unsigned short  outMode; CONVERTDOWN_FF(0); break; }
+	    case 32:  { typedef unsigned int    outMode; CONVERTDOWN_FF(0); break; }
+	    case -32: { typedef          float  outMode; CONVERTDOWN_FF(NAN); break; }
+	    case -64: { typedef          double outMode; CONVERTSAME_FF(NAN); break; }
+	  }
+	}
     }
   }
Index: trunk/Ohana/src/opihi/cmd.data/rd.c
===================================================================
--- trunk/Ohana/src/opihi/cmd.data/rd.c	(revision 20583)
+++ trunk/Ohana/src/opihi/cmd.data/rd.c	(revision 20652)
@@ -4,5 +4,5 @@
 int rd (int argc, char **argv) {
   
-  int i, N, status, plane, Nplane, extend, Nextend, Nskip, JustHead;
+  int i, N, status, plane, Nplane, extend, Nextend, Nskip, JustHead, blank;
   int ccdsel, done, Nword, IsCompressed;
   char region[512], *ccdid, *filename;
@@ -221,10 +221,14 @@
   buf[0].bzero  = buf[0].header.bzero;     /* store the original values */
   buf[0].unsign = buf[0].header.unsign;
+
   gprint (GP_LOG, "read %d bytes from %s into buffer %s\n", 
 	   buf[0].header.size + buf[0].matrix.size, argv[2], argv[1]);
 
+  blank = 0xffff;
+  gfits_scan (&buf[0].header, "BLANK", "%d", 1, &blank);
+
   /** now - convert the matrix values to floats for internal use **/
-  gfits_convert_format (&buf[0].header, &buf[0].matrix, -32, 1.0, 0.0, gfits_get_unsign_mode());
-  
+  gfits_convert_format (&buf[0].header, &buf[0].matrix, -32, 1.0, 0.0, blank, gfits_get_unsign_mode());
+
   return (TRUE);
 }
Index: trunk/Ohana/src/opihi/cmd.data/rdseg.c
===================================================================
--- trunk/Ohana/src/opihi/cmd.data/rdseg.c	(revision 20583)
+++ trunk/Ohana/src/opihi/cmd.data/rdseg.c	(revision 20652)
@@ -4,5 +4,5 @@
 int rdseg (int argc, char **argv) {
   
-  int x, y, nx, ny, status;
+  int x, y, nx, ny, status, blank;
   char region[512], *filename;
   FILE *f;
@@ -65,6 +65,8 @@
 	   buf[0].header.size + buf[0].matrix.size, argv[2], argv[1]);
 
+  gfits_scan (&buf[0].header, "BLANK", "%d", 1, &blank);
+
   /** now - convert the matrix values to floats for internal use **/
-  gfits_convert_format (&buf[0].header, &buf[0].matrix, -32, 1.0, 0.0, gfits_get_unsign_mode());
+  gfits_convert_format (&buf[0].header, &buf[0].matrix, -32, 1.0, 0.0, blank, gfits_get_unsign_mode());
   
   return (TRUE);
Index: trunk/Ohana/src/opihi/cmd.data/wd.c
===================================================================
--- trunk/Ohana/src/opihi/cmd.data/wd.c	(revision 20583)
+++ trunk/Ohana/src/opihi/cmd.data/wd.c	(revision 20652)
@@ -82,5 +82,6 @@
 
   if (temp_header.Naxes) {
-    gfits_convert_format (&temp_header, &temp_matrix, outBitpix, outScale, outZero, outUnsign);
+    // the inBlank value probably does not matter: temp_matrix is float, so nan is used
+    gfits_convert_format (&temp_header, &temp_matrix, outBitpix, outScale, outZero, 0xffff, outUnsign);
   } else {
     gfits_modify (&temp_header, "BITPIX", "%d", 1, outBitpix);
Index: trunk/Ohana/src/opihi/dimm/camera.c
===================================================================
--- trunk/Ohana/src/opihi/dimm/camera.c	(revision 20583)
+++ trunk/Ohana/src/opihi/dimm/camera.c	(revision 20652)
@@ -112,5 +112,5 @@
     ReadOut (x, y, dx, dy, 1, buf[0].matrix.buffer);
 
-    gfits_convert_format (&buf[0].header, &buf[0].matrix, -32, 1.0, 0.0, gfits_get_unsign_mode());
+    gfits_convert_format (&buf[0].header, &buf[0].matrix, -32, 1.0, 0.0, 0xffff, gfits_get_unsign_mode());
 
     EXIT_STATUS (TRUE);
Index: trunk/Ohana/src/tools/src/medianfilter.c
===================================================================
--- trunk/Ohana/src/tools/src/medianfilter.c	(revision 20583)
+++ trunk/Ohana/src/tools/src/medianfilter.c	(revision 20652)
@@ -51,5 +51,5 @@
   gfits_read_header (filename[0], &head);
   gfits_create_matrix (&head, &out);
-  gfits_convert_format (&head, &out, -32, 1.0, 0.0, FALSE);
+  gfits_convert_format (&head, &out, -32, 1.0, 0.0, 0xffff, FALSE);
 
   /* find size of temporary images */
@@ -90,5 +90,5 @@
       tmphead[i].Naxis[0] = 1;
       tmphead[i].Naxis[1] = Npixrd;
-      gfits_convert_format (&tmphead[i], &tmpmatr[i], -32, 1.0, 0.0, FALSE);
+      gfits_convert_format (&tmphead[i], &tmpmatr[i], -32, 1.0, 0.0, 0xffff, FALSE);
     }
     
